From 9828ca61a0374d789c130ac0a6fabd9e84d39687 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 14 Jun 2024 12:43:13 +0200 Subject: [PATCH 001/110] Fixes for compiling with DEBUGGING active --- apps/decoder.c | 2 +- apps/encoder.c | 2 +- apps/renderer.c | 2 +- lib_com/bits_alloc_fx.c | 1 + lib_rend/ivas_crend.c | 4 ++-- lib_rend/ivas_rotation.c | 2 +- lib_rend/lib_rend.c | 2 +- 7 files changed, 8 insertions(+), 7 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index abe1788de..dc1cc25b3 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -54,7 +54,7 @@ * Local constants *------------------------------------------------------------------------------------------*/ -#if !defined( WMOPS_FLT ) +#if !defined( DEBUGGING ) && !defined( WMOPS_FLT ) static #endif int32_t frame = 0; /* Counter of frames */ diff --git a/apps/encoder.c b/apps/encoder.c index c8e6f32d6..283f1626a 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -48,7 +48,7 @@ * Local constants, enums *------------------------------------------------------------------------------------------*/ -#if !defined( WMOPS ) +#if !defined( DEBUGGING ) && !defined( WMOPS ) static #endif int32_t frame = 0; /* Counter of frames */ diff --git a/apps/renderer.c b/apps/renderer.c index 5f39dc4e6..1cc4c1a32 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -67,7 +67,7 @@ #define IVAS_MIN16B_FLT ( -32768.0f ) #define IVAS_MAX16B_FX 32767 #define IVAS_MIN16B_FX ( -32768 ) -#if !defined( WMOPS ) +#if !defined( DEBUGGING ) && !defined( WMOPS ) static #endif int32_t frame = 0; diff --git a/lib_com/bits_alloc_fx.c b/lib_com/bits_alloc_fx.c index 514a9f894..c8d9fc7e2 100644 --- a/lib_com/bits_alloc_fx.c +++ b/lib_com/bits_alloc_fx.c @@ -615,6 +615,7 @@ ivas_error config_acelp1( Word32 core_brate_inpI = core_brate_inp; #ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) active_cnt; + (void) core_brate_inpI; #endif #endif ivas_error error; diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index b678a90f8..3f345bc5f 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -3161,7 +3161,7 @@ static ivas_error ivas_rend_crendConvolver( ivas_mdft_fx( pIn, pFreq_buf_re, pFreq_buf_im, subframe_length, subframe_length ); -#ifdef DEBUGGING +#ifdef DUMPS_ENABLED dbgwrite_txt( pFreq_buf_re, subframe_length, "Fixed_pFreq_buf_re_mdft.txt", NULL ); dbgwrite_txt( pFreq_buf_im, subframe_length, "Fixed_pFreq_buf_im_mdft.txt", NULL ); #endif @@ -3223,7 +3223,7 @@ static ivas_error ivas_rend_crendConvolver( ivas_imdft_fx( tmp_out_re, tmp_out_im, pOut, subframe_length ); -#ifdef DEBUGGING +#ifdef DUMPS_ENABLED dbgwrite_txt( pOut, subframe_length << 1, "Fixed_imdft_out.txt", NULL ); #endif pFreq_buf_re = &pcm_out[j][i_ts * subframe_length]; diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index be96d186f..23290c3de 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -1385,7 +1385,7 @@ void rotateFrame_shd_cldfb( /* calculate Ambisonics rotation matrix from the quaternion */ SHrotmatgen_fx( SHrotmat, Rmat, shd_rot_max_order ); -#ifdef DEBUGGING +#ifdef DUMPS_ENABLED dbgwrite_txt( SHrotmat, HEADROT_SHMAT_DIM * HEADROT_SHMAT_DIM, "Fixed_SHrotmat.txt", NULL ); #endif /* rotation by mtx multiplication */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 63c64149e..e0c8abd76 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -8775,7 +8775,7 @@ static ivas_error rotateFrameSba_fx( /* calculate ambisonics rotation matrices for the previous and current frames */ SHrotmatgen_fx( gains, Rmat, shd_rot_max_order ); -#ifdef DEBUGGING +#ifdef DUMPS_ENABLED dbgwrite_txt( gains, HEADROT_SHMAT_DIM * HEADROT_SHMAT_DIM, "Fixed_code_gains.txt", NULL ); dbgwrite_txt( Rmat, 3 * 3, "Fixed_code_Rmat.txt", NULL ); #endif -- GitLab From 81193b3ff044334857cc95f25a34bbef1d464f8d Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Tue, 25 Jun 2024 07:33:50 -0400 Subject: [PATCH 002/110] first proposal to fix GSC bit exact decoding --- lib_com/gs_bitallocation_ivas_fx.c | 95 ++++++++++++++++++++++++++---- lib_com/options.h | 3 + 2 files changed, 88 insertions(+), 10 deletions(-) diff --git a/lib_com/gs_bitallocation_ivas_fx.c b/lib_com/gs_bitallocation_ivas_fx.c index 48990d122..9beb5fb07 100644 --- a/lib_com/gs_bitallocation_ivas_fx.c +++ b/lib_com/gs_bitallocation_ivas_fx.c @@ -13,7 +13,9 @@ #include "stl.h" static void reajust_bits_fx( Word32 *bits_per_bands, const Word16 st_band, const Word16 end_band, const Word16 sum_bit_in, const Word16 bit_bdgt_in ); - +#ifdef FIX_802__NON_BE_DECODING +static Word32 Find_bit_frac( const Word16 nb_band, const Word16 remaining_bits ); +#endif /*==================================================================================*/ /* FUNCTION : void bands_and_bit_alloc_ivas_fx(); */ /*----------------------------------------------------------------------------------*/ @@ -460,8 +462,11 @@ void bands_and_bit_alloc_ivas_fx( set32_fx( bits_per_bands, 0, MBANDS_GN ); /*bit_fracf = (1.0f/nb_bands)*(SWB_bit_budget); */ +#ifdef FIX_802__NON_BE_DECODING + bit_fracf = Find_bit_frac( nb_bands, extract_l( SWB_bit_budget ) ); +#else bit_fracf = L_mult( div_s( 1, nb_bands ), shl( (Word16) SWB_bit_budget, 2 ) ); /* Q18 */ - +#endif nb_tot_bands = sub( nb_bands_max, 6 ); nb_tot_bands = s_min( nb_tot_bands, 16 ); @@ -642,7 +647,11 @@ void bands_and_bit_alloc_ivas_fx( ELSE #endif { +#ifdef FIX_802__NON_BE_DECODING + bit_fracf = Find_bit_frac( st_band, bit_tmp ); +#else bit_fracf = L_mult( div_s( 1, st_band ), shl( bit_tmp, 2 ) ); /* Q18 */ +#endif } /*------------------------------------------------------------------------ * Complete the bit allocation per frequency band @@ -968,43 +977,109 @@ static void reajust_bits_fx( Word16 bit_bdgt, sum_bit; incr = 1; - IF( end_band < st_band ) + move16(); + if( LT_16( end_band, st_band) ) { incr = -1; + move16(); } - IF( bit_bdgt_in < sum_bit_in ) + IF( LT_16( bit_bdgt_in, sum_bit_in ) ) { amount_to_add = -1; bit_bdgt = sum_bit_in; sum_bit = bit_bdgt_in; + move16(); + move16(); + move16(); } ELSE { bit_bdgt = bit_bdgt_in; sum_bit = sum_bit_in; amount_to_add = 1; + move16(); + move16(); + move16(); } i = st_band; - WHILE( bit_bdgt > sum_bit ) + move16(); + WHILE( GT_16( bit_bdgt, sum_bit ) ) { - // if (amount_to_add > 0 || (amount_to_add < 0 && bits_per_bands[i] > 1)) - IF( amount_to_add > 0 || ( amount_to_add < 0 && bits_per_bands[i] > 262144 ) ) + /* if (amount_to_add > 0 || (amount_to_add < 0 && bits_per_bands[i] > 1))*/ + test(); + test(); + IF( amount_to_add > 0 || ( amount_to_add < 0 && GT_32( bits_per_bands[i], 262144 ) ) ) { - // bits_per_bands[i] += amount_to_add; + /* bits_per_bands[i] += amount_to_add;*/ bits_per_bands[i] = L_add( bits_per_bands[i], L_shl( amount_to_add, Q18 ) ); + move32(); sum_bit = add( sum_bit, abs_s( amount_to_add ) ); } - i += incr; - IF( i == end_band ) + i = add( i, incr ); + IF( EQ_16( i, end_band ) ) { i = st_band; + move16(); } } return; } +#ifdef FIX_802__NON_BE_DECODING + +/*-------------------------------------------------------------------* + * Find_bit_frac() + * + * Computes the fraction of the remaining bit budget to allocate to the bands + *-------------------------------------------------------------------*/ + +static Word32 Find_bit_frac( + const Word16 nb_band, + const Word16 remaining_bits ) +{ + int16_t inv_bandQ15; + int32_t L_out; + + inv_bandQ15 = 6553; + move16(); + IF( nb_band == 7 ) + { + inv_bandQ15 = 4681; + move16(); + } + ELSE IF( nb_band == 3 ) + { + inv_bandQ15 = 10922; + move16(); + } + ELSE IF( nb_band == 4 ) + { + inv_bandQ15 = 8192; + move16(); + } + ELSE IF( nb_band == 5 ) + { + inv_bandQ15 = 6536; + move16(); + } + ELSE IF( nb_band == 10 ) + { + inv_bandQ15 = 3277; + move16(); + } + ELSE + { +#ifdef DEBUGGING + printf( "1/%d NOT DEFINED in Find_bit_frac\n", nb_band ); +#endif + } + L_out = L_mult( inv_bandQ15, shl( remaining_bits, 2 ) ); + + return ( L_out ); +} +#endif #endif diff --git a/lib_com/options.h b/lib_com/options.h index 54efb5ce1..1f4fd2e6b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -148,6 +148,9 @@ #define FIX_729_MISSING_RESCALING #define FIX_798_LSF_SECONDARY_CH_MISSING_CODE /* Adding the missing code to properly render the secondary channel of TD stereo*/ #define FIX_798_WRONG_CPY_OF_PITCH /* The copy of the pitch from primary to secondary channel was wrong AND safety check was really wrong */ + +#define FIX_802__NON_BE_DECODING /* Fix possible difference float and fixed point when computing the GSC bit allocation */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -- GitLab From c8504957b3c3784e35f70ec89360b7a7044575b6 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 26 Jun 2024 12:40:43 +0530 Subject: [PATCH 003/110] BASOP and instrumentation code addded for lib_rend files [x] BASOPs and instrumentation changes for following files: ivas_objectRenderer_vec.c ivas_omasa_ana.c ivas_orient_trk.c ivas_output_init.c ivas_output_init_fx.c --- lib_rend/ivas_objectRenderer_vec.c | 32 +++-- lib_rend/ivas_omasa_ana.c | 88 ++++++++++---- lib_rend/ivas_orient_trk.c | 183 ++++++++++++++++++++++++----- lib_rend/ivas_output_init.c | 46 ++++++-- lib_rend/ivas_output_init_fx.c | 1 + 5 files changed, 283 insertions(+), 67 deletions(-) diff --git a/lib_rend/ivas_objectRenderer_vec.c b/lib_rend/ivas_objectRenderer_vec.c index c1ade6725..714fdb299 100644 --- a/lib_rend/ivas_objectRenderer_vec.c +++ b/lib_rend/ivas_objectRenderer_vec.c @@ -152,21 +152,21 @@ void TDREND_SPATIAL_VecNormalize_fx( scaler_fx = ISqrt32( sqrd_sum, &exp ); VecNorm_p_fx[0] = Mpy_32_32( scaler_fx, Vec_p_fx[0] ); - move16(); + move32(); VecNorm_p_fx[1] = Mpy_32_32( scaler_fx, Vec_p_fx[1] ); - move16(); + move32(); VecNorm_p_fx[2] = Mpy_32_32( scaler_fx, Vec_p_fx[2] ); - move16(); + move32(); exp = add( exp, sub( 31, q ) ); // Since vector is normalised, all values will be <= 1. Hence making all values in Q30 shift = sub( exp, 1 ); VecNorm_p_fx[0] = L_shl( VecNorm_p_fx[0], shift ); - move16(); + move32(); VecNorm_p_fx[1] = L_shl( VecNorm_p_fx[1], shift ); - move16(); + move32(); VecNorm_p_fx[2] = L_shl( VecNorm_p_fx[2], shift ); - move16(); + move32(); return; } @@ -305,23 +305,37 @@ Word16 TDREND_SPATIAL_EvalOrthonormOrient_fx( /* Evaluate the orthonormal right vector */ /* through the cross product of the front and the up vectors */ RightVecON_p_fx[0] = L_shl_sat( L_sub( Mpy_32_32( FrontVecON_p_fx[1], UpVec_p_fx[2] ), Mpy_32_32( FrontVecON_p_fx[2], UpVec_p_fx[1] ) ), 1 ); + move32(); RightVecON_p_fx[1] = L_shl_sat( L_sub( Mpy_32_32( FrontVecON_p_fx[2], UpVec_p_fx[0] ), Mpy_32_32( FrontVecON_p_fx[0], UpVec_p_fx[2] ) ), 1 ); + move32(); RightVecON_p_fx[2] = L_shl_sat( L_sub( Mpy_32_32( FrontVecON_p_fx[0], UpVec_p_fx[1] ), Mpy_32_32( FrontVecON_p_fx[1], UpVec_p_fx[0] ) ), 1 ); + move32(); TDREND_SPATIAL_VecNormalize_fx( RightVecON_p_fx, orient_q, RightVecON_p_fx ); // RightVecON_p_fx -> Q30 /* Evaluate the orthonormal up vector */ /* through the cross product of the front and the right vectors */ UpVecON_p_fx[0] = L_shl_sat( L_sub( Mpy_32_32( RightVecON_p_fx[1], FrontVecON_p_fx[2] ), Mpy_32_32( RightVecON_p_fx[2], FrontVecON_p_fx[1] ) ), 1 ); + move32(); UpVecON_p_fx[1] = L_shl_sat( L_sub( Mpy_32_32( RightVecON_p_fx[2], FrontVecON_p_fx[0] ), Mpy_32_32( RightVecON_p_fx[0], FrontVecON_p_fx[2] ) ), 1 ); + move32(); UpVecON_p_fx[2] = L_shl_sat( L_sub( Mpy_32_32( RightVecON_p_fx[0], FrontVecON_p_fx[1] ), Mpy_32_32( RightVecON_p_fx[1], FrontVecON_p_fx[0] ) ), 1 ); + move32(); TDREND_SPATIAL_VecNormalize_fx( UpVecON_p_fx, orient_q, UpVecON_p_fx ); // UpVecON_p_fx -> Q30 /* Check if vectors have been changed */ - IF( NE_32( FrontVecON_p_fx[0], tmp_fx[0] ) || NE_32( FrontVecON_p_fx[1], tmp_fx[1] ) || NE_32( FrontVecON_p_fx[2], tmp_fx[2] ) || - NE_32( RightVecON_p_fx[0], tmp_fx[3] ) || NE_32( RightVecON_p_fx[1], tmp_fx[4] ) || NE_32( RightVecON_p_fx[2], tmp_fx[5] ) || - NE_32( UpVecON_p_fx[0], tmp_fx[6] ) || NE_32( UpVecON_p_fx[1], tmp_fx[7] ) || NE_32( UpVecON_p_fx[2], tmp_fx[8] ) ) + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + if ( NE_32( FrontVecON_p_fx[0], tmp_fx[0] ) || NE_32( FrontVecON_p_fx[1], tmp_fx[1] ) || NE_32( FrontVecON_p_fx[2], tmp_fx[2] ) || + NE_32( RightVecON_p_fx[0], tmp_fx[3] ) || NE_32( RightVecON_p_fx[1], tmp_fx[4] ) || NE_32( RightVecON_p_fx[2], tmp_fx[5] ) || + NE_32( UpVecON_p_fx[0], tmp_fx[6] ) || NE_32( UpVecON_p_fx[1], tmp_fx[7] ) || NE_32( UpVecON_p_fx[2], tmp_fx[8] ) ) { orientation_updated = TRUE; move16(); diff --git a/lib_rend/ivas_omasa_ana.c b/lib_rend/ivas_omasa_ana.c index 3db75a583..b83e6cb5e 100644 --- a/lib_rend/ivas_omasa_ana.c +++ b/lib_rend/ivas_omasa_ana.c @@ -107,6 +107,7 @@ ivas_error ivas_omasa_ana_open( Word16 scale; error = IVAS_ERR_OK; + move32(); IF( ( hOMasa = (OMASA_ANA_HANDLE) malloc( sizeof( OMASA_ANA_DATA ) ) ) == NULL ) { @@ -145,7 +146,7 @@ ivas_error ivas_omasa_ana_open( hOMasa->num_Cldfb_instances = numAnalysisChannels; FOR( i = 0; i < hOMasa->num_Cldfb_instances; i++ ) { - IF( ( error = openCldfb_ivas( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = openCldfb_ivas( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) { return error; } @@ -199,7 +200,9 @@ ivas_error ivas_omasa_ana_open( FOR( i = 0; i < input_frame; i++ ) { hOMasa->interpolator_fx[i] = BASOP_Util_Divide1616_Scale( i, input_frame, &scale ); + move16(); hOMasa->interpolator_fx[i] = shl( hOMasa->interpolator_fx[i], scale ); // Q15 + move16(); } hOMasa->index_buffer_intensity = 0; @@ -225,9 +228,6 @@ ivas_error ivas_omasa_ana_open( set_zero_fx( hOMasa->ism_azimuth_fx, MAX_NUM_OBJECTS ); set_zero_fx( hOMasa->ism_elevation_fx, MAX_NUM_OBJECTS ); -#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED -#endif - ( *hOMasaPtr ) = hOMasa; return error; @@ -373,6 +373,7 @@ void ivas_omasa_ana_close( { Word16 i, j; + test(); IF( hOMasa == NULL || *hOMasa == NULL ) { return; @@ -755,6 +756,7 @@ static void ivas_omasa_param_est_ana_fx( move16(); Word32 diffuseness_m_fx[MASA_FREQUENCY_BANDS]; Word16 diffuseness_m_q = 0; + move16(); Word32 renormalization_factor_diff_fx[MASA_FREQUENCY_BANDS]; Word16 renormalization_factor_diff_q = 0; move16(); @@ -765,9 +767,8 @@ static void ivas_omasa_param_est_ana_fx( Word16 dir_v_q, norm_tmp_q; Word16 foa_q; - int16_t band_m_idx, block_m_idx; + Word16 band_m_idx, block_m_idx; - // float norm_tmp; Word16 mrange[2]; Word16 brange[2]; @@ -775,7 +776,10 @@ static void ivas_omasa_param_est_ana_fx( move16(); num_freq_bands = hOMasa->nbands; move16(); - l_ts = input_frame / CLDFB_NO_COL_MAX; + + // l_ts = input_frame / CLDFB_NO_COL_MAX; + l_ts = shr( input_frame, 4 ); + move16(); Word16 intensity_q; Word16 direction_q, reference_power_q; @@ -796,10 +800,12 @@ static void ivas_omasa_param_est_ana_fx( tmp1 = mult( tmp1, EVS_PI_FX ); tmp1 = getCosWord16( tmp1 ); hOMasa->chnlToFoaMtx_fx[1][i] = shl( mult( tmp, tmp1 ), 1 ); // Q14 + Q15 - Q15 + Q1 -> Q15 + move16(); tmp = BASOP_Util_Divide3232_Scale( hOMasa->ism_elevation_fx[i], 754974720, &scale ); tmp = mult( tmp, EVS_PI_FX ); // Q13 + Q15 - Q15 --> Q13 hOMasa->chnlToFoaMtx_fx[2][i] = getSinWord16( tmp ); // Q15 + move16(); tmp = BASOP_Util_Divide3232_Scale( hOMasa->ism_azimuth_fx[i], 754974720, &scale ); tmp = mult( tmp, EVS_PI_FX ); // Q13 + Q15 - Q15 --> Q13 @@ -811,6 +817,7 @@ static void ivas_omasa_param_est_ana_fx( tmp1 = getCosWord16( tmp ); // Q14 hOMasa->chnlToFoaMtx_fx[3][i] = shl( mult( tmp, tmp1 ), 2 ); // Q14 + Q14 - Q15 + Q2-> Q13 + Q2 -> Q15 + move16(); } /* do processing over all CLDFB time slots */ @@ -845,12 +852,14 @@ static void ivas_omasa_param_est_ana_fx( in_q = data_f_q; move16(); - cldfbAnalysis_ts_fx( &( data_f_fx[i][l_ts * ts] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hOMasa->cldfbAnaEnc[i], &in_q ); + cldfbAnalysis_ts_fx( &( data_f_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hOMasa->cldfbAnaEnc[i], &in_q ); FOR( Word16 ind = 0; ind < CLDFB_NO_CHANNELS_MAX; ind++ ) { - Chnl_RealBuffer_fx[i][ind] = Chnl_RealBuffer_fx[i][ind] / ( 1 << 4 ); - Chnl_ImagBuffer_fx[i][ind] = Chnl_ImagBuffer_fx[i][ind] / ( 1 << 4 ); + Chnl_RealBuffer_fx[i][ind] = L_shr( Chnl_RealBuffer_fx[i][ind], 4 ); + move32(); + Chnl_ImagBuffer_fx[i][ind] = L_shr( Chnl_ImagBuffer_fx[i][ind], 4 ); + move32(); } Chnl_RealBuffer_q = sub( in_q, 4 ); @@ -872,7 +881,9 @@ static void ivas_omasa_param_est_ana_fx( L_tmp1 = Mpy_32_32( Chnl_RealBuffer_fx[i][j], Chnl_RealBuffer_fx[i][j] ); L_tmp2 = Mpy_32_32( Chnl_ImagBuffer_fx[i][j], Chnl_ImagBuffer_fx[i][j] ); hOMasa->energy_fx[block_m_idx][band_m_idx] = L_add( hOMasa->energy_fx[block_m_idx][band_m_idx], L_add( L_tmp1, L_tmp2 ) ); // Chnl_RealBuffer_q + Chnl_RealBuffer_q - 31 + move32(); hOMasa->energy_q = sub( add( Chnl_RealBuffer_q, Chnl_RealBuffer_q ), 31 ); + move16(); } } } @@ -926,7 +937,9 @@ static void ivas_omasa_param_est_ana_fx( FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) { Foa_RealBuffer_fx[i][j] = L_shr( Foa_RealBuffer_fx[i][j], 5 ); + move32(); Foa_ImagBuffer_fx[i][j] = L_shr( Foa_ImagBuffer_fx[i][j], 5 ); + move32(); } } foa_q = sub( Chnl_ImagBuffer_q, 5 ); @@ -942,18 +955,20 @@ static void ivas_omasa_param_est_ana_fx( reference_power_q = sub( shl( Chnl_ImagBuffer_q, 1 ), 30 ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ - hOMasa->index_buffer_intensity = ( hOMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ + hOMasa->index_buffer_intensity = add( ( hOMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ), 1 ); /* averaging_length = 32 */ + move16(); index = hOMasa->index_buffer_intensity; + move16(); FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { /* only real part needed */ - Copy32( intensity_real_fx[i], &( hOMasa->buffer_intensity_real_fx[i][index - 1][0] ), num_freq_bands ); + Copy32( intensity_real_fx[i], &( hOMasa->buffer_intensity_real_fx[i][sub( index, 1 )][0] ), num_freq_bands ); } - hOMasa->buffer_intensity_real_q[index - 1] = intensity_q; + hOMasa->buffer_intensity_real_q[sub( index, 1 )] = intensity_q; move16(); - Copy32( reference_power_fx, &( hOMasa->buffer_energy_fx[( index - 1 ) * num_freq_bands] ), num_freq_bands ); - hOMasa->buffer_energy_q[index - 1] = reference_power_q; + Copy32( reference_power_fx, &( hOMasa->buffer_energy_fx[i_mult( sub( index, 1 ), num_freq_bands )] ), num_freq_bands ); + hOMasa->buffer_energy_q[sub( index, 1 )] = reference_power_q; move16(); computeDiffuseness_fixed( hOMasa->buffer_intensity_real_fx, hOMasa->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, hOMasa->buffer_intensity_real_q, hOMasa->buffer_energy_q, &diffuseness_q ); @@ -964,16 +979,21 @@ static void ivas_omasa_param_est_ana_fx( norm_tmp_q = sub( add( reference_power_q, 30 ), 31 ); hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = L_add( hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], Mpy_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ) ); + move32(); hOMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = L_add( hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], Mpy_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ) ); + move32(); hOMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = L_add( hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], Mpy_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ) ); + move32(); hOMasa->direction_vector_m_q = sub( add( norm_tmp_q, direction_q ), 31 ); diffuseness_m_fx[band_m_idx] = L_add( diffuseness_m_fx[band_m_idx], Mpy_32_32( reference_power_fx[band_m_idx], diffuseness_vector_fx[band_m_idx] ) ); + move32(); diffuseness_m_q = sub( add( reference_power_q, diffuseness_q ), 31 ); renormalization_factor_diff_fx[band_m_idx] = L_add( renormalization_factor_diff_fx[band_m_idx], reference_power_fx[band_m_idx] ); + move32(); renormalization_factor_diff_q = reference_power_q; move16(); } @@ -987,10 +1007,12 @@ static void ivas_omasa_param_est_ana_fx( move32(); } dir_v_q = hOMasa->direction_vector_m_q; + move16(); FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { dir_v_fx[i] = L_shr( dir_v_fx[i], 1 ); + move32(); } dir_v_q = sub( dir_v_q, 1 ); @@ -1003,9 +1025,11 @@ static void ivas_omasa_param_est_ana_fx( IF( BASOP_Util_Cmp_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], sub( 31, renormalization_factor_diff_q ), L_deposit_h( EPSILON_FX ), 2 ) > 0 ) { diffuseness_m_fx[band_m_idx] = BASOP_Util_Divide3232_Scale( diffuseness_m_fx[band_m_idx], renormalization_factor_diff_fx[band_m_idx], &scale ); + move32(); scale = add( scale, sub( sub( 31, diffuseness_m_q ), sub( 31, renormalization_factor_diff_q ) ) ); diffuseness_m_fx[band_m_idx] = L_shr( diffuseness_m_fx[band_m_idx], sub( 31, add( scale, diffuseness_m_q ) ) ); + move32(); } ELSE { @@ -1013,6 +1037,7 @@ static void ivas_omasa_param_est_ana_fx( move32(); } energyRatio_fx[block_m_idx][band_m_idx] = L_sub( L_shl( 1, diffuseness_m_q ), diffuseness_m_fx[band_m_idx] ); + move32(); } /* Set coherences to zero, as this mode is used at lowest bit rates where the coherences are not transmitted */ @@ -1078,7 +1103,8 @@ static void ivas_omasa_dmx_fx( /* Downmix using the panning gains */ FOR( j = 0; j < nchan_transport; j++ ) { - IF( GT_32( L_abs( L_deposit_h( gains_fx[j] ) ), 0 ) || GT_32( L_abs( prev_gains_fx[i][j] ), 0 ) ) + test(); + IF( abs_s( gains_fx[j] ) > 0 || L_abs( prev_gains_fx[i][j] ) > 0 ) { FOR( k = 0; k < input_frame; k++ ) { @@ -1100,6 +1126,7 @@ static void ivas_omasa_dmx_fx( scale = add( scale, tmp_e ); data_out_f_fx[j][k] = BASOP_Util_Add_Mant32Exp( data_out_f_fx[j][k], data_e[j], L_tmp, scale, &in_e[k] ); + move32(); } } max_e = in_e[0]; @@ -1116,11 +1143,13 @@ static void ivas_omasa_dmx_fx( FOR( l = 0; l < L_FRAME48k; l++ ) { data_out_f_fx[j][l] = L_shr( data_out_f_fx[j][l], sub( max_e, in_e[l] ) ); + move32(); } data_e[j] = max_e; move16(); prev_gains_fx[i][j] = L_deposit_h( gains_fx[j] ); // Q31 + move32(); } } @@ -1128,7 +1157,7 @@ static void ivas_omasa_dmx_fx( move16(); FOR( i = 1; i < nchan_transport; i++ ) { - IF( LT_16( max_e, data_e[i] ) ) + if ( LT_16( max_e, data_e[i] ) ) { max_e = data_e[i]; move16(); @@ -1139,7 +1168,8 @@ static void ivas_omasa_dmx_fx( { FOR( j = 0; j < input_frame; j++ ) { - data_out_f_fx[i][j] = L_shr( data_out_f_fx[i][j], max_e - data_e[i] ); + data_out_f_fx[i][j] = L_shr( data_out_f_fx[i][j], sub( max_e, data_e[i] ) ); + move32(); } } @@ -1233,23 +1263,31 @@ void computeIntensityVector_ana_fx( Word32 real, img; Word16 brange[2]; - for ( i = 0; i < num_frequency_bands; i++ ) + FOR( i = 0; i < num_frequency_bands; i++ ) { brange[0] = band_grouping[i]; + move16(); brange[1] = band_grouping[i + 1]; + move16(); intensity_real[0][i] = 0; + move32(); intensity_real[1][i] = 0; + move32(); intensity_real[2][i] = 0; + move32(); - for ( j = brange[0]; j < brange[1]; j++ ) + FOR( j = brange[0]; j < brange[1]; j++ ) { real = Cldfb_RealBuffer[0][j]; img = Cldfb_ImagBuffer[0][j]; /* Intensity is XYZ order, audio is WYZX order. */ intensity_real[0][i] = L_add( intensity_real[0][i], L_add( Mpy_32_32( Cldfb_RealBuffer[3][j], real ), Mpy_32_32( Cldfb_ImagBuffer[3][j], img ) ) ); // output Q= 2* input_q -31 + move32(); intensity_real[1][i] = L_add( intensity_real[1][i], L_add( Mpy_32_32( Cldfb_RealBuffer[1][j], real ), Mpy_32_32( Cldfb_ImagBuffer[1][j], img ) ) ); // output Q= 2* input_q -31 + move32(); intensity_real[2][i] = L_add( intensity_real[2][i], L_add( Mpy_32_32( Cldfb_RealBuffer[2][j], real ), Mpy_32_32( Cldfb_ImagBuffer[2][j], img ) ) ); // output Q= 2* input_q -31 + move32(); } } @@ -1318,19 +1356,23 @@ void computeReferencePower_ana_fx( Word16 brange[2]; Word16 ch_idx, i, j; - for ( i = 0; i < num_freq_bands; i++ ) + FOR( i = 0; i < num_freq_bands; i++ ) { brange[0] = band_grouping[i]; + move16(); brange[1] = band_grouping[i + 1]; + move16(); reference_power[i] = 0; + move32(); - for ( ch_idx = 0; ch_idx < FOA_CHANNELS; ch_idx++ ) + FOR( ch_idx = 0; ch_idx < FOA_CHANNELS; ch_idx++ ) { /* abs()^2 */ - for ( j = brange[0]; j < brange[1]; j++ ) + FOR( j = brange[0]; j < brange[1]; j++ ) { // Q = 2*inputq - 31 reference_power[i] = L_add( L_add( Mpy_32_32( Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ), Mpy_32_32( Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ) ), reference_power[i] ); + move32(); } } } diff --git a/lib_rend/ivas_orient_trk.c b/lib_rend/ivas_orient_trk.c index 316a4a674..edea2f049 100644 --- a/lib_rend/ivas_orient_trk.c +++ b/lib_rend/ivas_orient_trk.c @@ -83,8 +83,13 @@ static IVAS_QUATERNION IdentityQuaternion_fx( IVAS_QUATERNION q; q.w_fx = ONE_IN_Q31; + move32(); q.x_fx = q.y_fx = q.z_fx = 0; + move32(); + move32(); + move32(); q.q_fact = Q31; + move16(); return q; } @@ -122,10 +127,15 @@ void QuaternionProduct_fx( // once verify// tmp.w_fx = L_sub( ( L_sub( Mpy_32_32( q1.w_fx, q2.w_fx ), Mpy_32_32( q1.x_fx, q2.x_fx ) ) ), ( L_add( Mpy_32_32( q1.y_fx, q2.y_fx ), Mpy_32_32( q1.z_fx, q2.z_fx ) ) ) ); + move32(); tmp.x_fx = L_add( ( L_add( Mpy_32_32( q1.w_fx, q2.x_fx ), Mpy_32_32( q1.x_fx, q2.w_fx ) ) ), ( L_sub( Mpy_32_32( q1.y_fx, q2.z_fx ), Mpy_32_32( q1.z_fx, q2.y_fx ) ) ) ); + move32(); tmp.y_fx = L_add( ( L_sub( Mpy_32_32( q1.w_fx, q2.y_fx ), Mpy_32_32( q1.x_fx, q2.z_fx ) ) ), ( L_add( Mpy_32_32( q1.y_fx, q2.w_fx ), Mpy_32_32( q1.z_fx, q2.x_fx ) ) ) ); + move32(); tmp.z_fx = L_sub( ( L_add( Mpy_32_32( q1.w_fx, q2.z_fx ), Mpy_32_32( q1.x_fx, q2.y_fx ) ) ), ( L_sub( Mpy_32_32( q1.y_fx, q2.x_fx ), Mpy_32_32( q1.z_fx, q2.w_fx ) ) ) ); + move32(); tmp.q_fact = sub( add( q1.q_fact, q2.q_fact ), 31 ); + move16(); *r = tmp; return; @@ -153,10 +163,12 @@ static Word32 QuaternionDotProduct_fx( { Word32 result = 0; + move32(); result = L_add( ( L_add( Mpy_32_32( q1.x_fx, q2.x_fx ), Mpy_32_32( q1.y_fx, q2.y_fx ) ) ), ( L_add( Mpy_32_32( q1.z_fx, q2.z_fx ), Mpy_32_32( q1.w_fx, q2.w_fx ) ) ) ); *q_fact = sub( add( q1.q_fact, q2.q_fact ), 31 ); + move16(); return result; } @@ -191,28 +203,37 @@ static void QuaternionDivision_fx( Word16 scale_e, result_e = 0, w_q, x_q, y_q, z_q, result_q; r->w_fx = BASOP_Util_Divide3232_Scale_cadence( ( q.w_fx ), d, &scale_e ); - result_e = scale_e + ( ( 31 - q.q_fact ) - den_e ); // e+e1-e2// - w_q = 31 - result_e; + move32(); + result_e = add( scale_e, sub( sub( Q31, q.q_fact ), den_e ) ); // e+e1-e2// + w_q = sub( Q31, result_e ); r->x_fx = BASOP_Util_Divide3232_Scale_cadence( ( q.x_fx ), d, &scale_e ); - result_e = scale_e + ( ( 31 - q.q_fact ) - den_e ); - x_q = 31 - result_e; + move32(); + result_e = add( scale_e, sub( sub( Q31, q.q_fact ), den_e ) ); + x_q = sub( Q31, result_e ); r->y_fx = BASOP_Util_Divide3232_Scale_cadence( ( q.y_fx ), d, &scale_e ); - result_e = scale_e + ( ( 31 - q.q_fact ) - den_e ); - y_q = 31 - result_e; + move32(); + result_e = add( scale_e, sub( sub( Q31, q.q_fact ), den_e ) ); + y_q = sub( Q31, result_e ); r->z_fx = BASOP_Util_Divide3232_Scale_cadence( ( q.z_fx ), d, &scale_e ); - result_e = scale_e + ( ( 31 - q.q_fact ) - den_e ); - z_q = 31 - result_e; + move32(); + result_e = add( scale_e, sub( sub( Q31, q.q_fact ), den_e ) ); + z_q = sub( Q31, result_e ); result_q = sub( s_min( s_min( w_q, x_q ), s_min( y_q, z_q ) ), 1 ); // gaurdbits// r->w_fx = L_shr( r->w_fx, sub( w_q, result_q ) ); + move32(); r->x_fx = L_shr( r->x_fx, sub( x_q, result_q ) ); + move32(); r->y_fx = L_shr( r->y_fx, sub( y_q, result_q ) ); + move32(); r->z_fx = L_shr( r->z_fx, sub( z_q, result_q ) ); + move32(); r->q_fact = result_q; + move16(); } #endif @@ -239,9 +260,10 @@ static void QuaternionNormalize_fx( IVAS_QUATERNION *const r_fx ) { Word16 q_dot, sqrt_e = 0; + move16(); Word32 sqrt_fx; Word32 dot_prod_fx = QuaternionDotProduct_fx( q_fx, q_fx, &q_dot ); - sqrt_e = 31 - q_dot; + sqrt_e = sub( Q31, q_dot ); sqrt_fx = Sqrt32( dot_prod_fx, &sqrt_e ); QuaternionDivision_fx( q_fx, sqrt_fx, r_fx, sqrt_e ); return; @@ -330,26 +352,41 @@ void QuaternionSlerp_fx( QuaternionNormalize_fx( q2_fx, &r2 ); Word16 q_dot = 0; + move16(); cosPhi = QuaternionDotProduct_fx( r1, r2, &q_dot ); q_min = s_min( r1.q_fact, r2.q_fact ); r1.w_fx = L_shr( r1.w_fx, sub( r1.q_fact, q_min ) ); + move32(); r1.x_fx = L_shr( r1.x_fx, sub( r1.q_fact, q_min ) ); + move32(); r1.y_fx = L_shr( r1.y_fx, sub( r1.q_fact, q_min ) ); + move32(); r1.z_fx = L_shr( r1.z_fx, sub( r1.q_fact, q_min ) ); + move32(); r2.w_fx = L_shr( r2.w_fx, sub( r2.q_fact, q_min ) ); + move32(); r2.x_fx = L_shr( r2.x_fx, sub( r2.q_fact, q_min ) ); + move32(); r2.y_fx = L_shr( r2.y_fx, sub( r2.q_fact, q_min ) ); + move32(); r2.z_fx = L_shr( r2.z_fx, sub( r2.q_fact, q_min ) ); + move32(); r1.q_fact = r2.q_fact = q_min; + move16(); + move16(); - IF( LT_32( cosPhi, 0 ) ) + IF( cosPhi < 0 ) { cosPhi = L_negate( cosPhi ); r2.w_fx = L_negate( r2.w_fx ); + move32(); r2.x_fx = L_negate( r2.x_fx ); + move32(); r2.y_fx = L_negate( r2.y_fx ); + move32(); r2.z_fx = L_negate( r2.z_fx ); + move32(); } @@ -357,16 +394,21 @@ void QuaternionSlerp_fx( IF( GE_32( cosPhi, L_shr( COS_ONE_TENTH_DEGREE_FX, sub( 31, q_dot ) ) ) ) { r_fx->w_fx = L_add( L_shr( r1.w_fx, 1 ), Mpy_32_32( L_sub( r2.w_fx, r1.w_fx ), t_fx ) ); // q_min-1 + move32(); r_fx->x_fx = L_add( L_shr( r1.x_fx, 1 ), Mpy_32_32( L_sub( r2.x_fx, r1.x_fx ), t_fx ) ); // q_min-1 + move32(); r_fx->y_fx = L_add( L_shr( r1.y_fx, 1 ), Mpy_32_32( L_sub( r2.y_fx, r1.y_fx ), t_fx ) ); // q_min-1 + move32(); r_fx->z_fx = L_add( L_shr( r1.z_fx, 1 ), Mpy_32_32( L_sub( r2.z_fx, r1.z_fx ), t_fx ) ); // q_min-1 + move32(); r_fx->q_fact = sub( q_min, 1 ); + move16(); } ELSE { temp_32 = L_sub( L_shr( ONE_IN_Q31, sub( 62, 2 * q_dot ) ), ( Mpy_32_32( cosPhi, cosPhi ) ) ); - sin_e = sub( 62, 2 * q_dot ); + sin_e = sub( 62, shl( q_dot, 1 ) ); sinPhi = Sqrt32( temp_32, &sin_e ); phi = BASOP_util_atan2( sinPhi, cosPhi, sub( sin_e, sub( 31, q_dot ) ) ); // Q13 @@ -381,10 +423,15 @@ void QuaternionSlerp_fx( s2 = getSineWord16R2( mult( temp_16, 20860 ) ); // Q15 tmp_quat.w_fx = L_add( Mpy_32_16_1( r1.w_fx, s1 ), Mpy_32_16_1( r2.w_fx, s2 ) ); // q_min + move32(); tmp_quat.x_fx = L_add( Mpy_32_16_1( r1.x_fx, s1 ), Mpy_32_16_1( r2.x_fx, s2 ) ); // q_min + move32(); tmp_quat.y_fx = L_add( Mpy_32_16_1( r1.y_fx, s1 ), Mpy_32_16_1( r2.y_fx, s2 ) ); // q_min + move32(); tmp_quat.z_fx = L_add( Mpy_32_16_1( r1.z_fx, s1 ), Mpy_32_16_1( r2.z_fx, s2 ) ); // q_min + move32(); tmp_quat.q_fact = q_min; + move16(); QuaternionDivision_fx( tmp_quat, sinPhi, r_fx, sin_e ); } @@ -418,10 +465,15 @@ static void QuaternionConjugate_fx( IVAS_QUATERNION *const r ) { r->w_fx = q.w_fx; + move32(); r->x_fx = L_negate( q.x_fx ); + move32(); r->y_fx = L_negate( q.y_fx ); + move32(); r->z_fx = L_negate( q.z_fx ); + move32(); r->q_fact = q.q_fact; + move16(); return; } @@ -458,32 +510,38 @@ static Word32 QuaternionAngle_fx( QuaternionConjugate_fx( q1, &q12 ); QuaternionProduct_fx( q12, q2, &q12 ); // q12:Q25, q2:Q29, q1: Q27// - IF( LT_32( q12.w_fx, 0 ) ) + IF( q12.w_fx < 0 ) { Word32 temp = 0; + move32(); Word16 q_dot, result_e = 0; + move16(); temp = q12.w_fx; + move32(); q12.w_fx = 0; + move32(); Word32 result = 0; + move32(); result = QuaternionDotProduct_fx( q12, q12, &q_dot ); result_e = sub( 31, q_dot ); result = Sqrt32( result, &result_e ); q12.w_fx = temp; + move32(); // Converting numerator to same Q as denominator// - IF( GT_32( 0, result_e ) ) + IF( 0 > result_e ) { - result = L_shr( L_shr( result, -1 * ( result_e ) ), sub( 31, q12.q_fact ) ); // Q25 + result = L_shr( L_shr( result, negate( result_e ) ), sub( 31, q12.q_fact ) ); // Q25 } ELSE { - IF( GT_32( result_e, ( 31 - q12.q_fact ) ) ) + IF( GT_32( result_e, sub( Q31, q12.q_fact ) ) ) { - result = L_shl( result, ( result_e - ( 31 - q12.q_fact ) ) ); + result = L_shl( result, sub( result_e, sub( Q31, q12.q_fact ) ) ); } ELSE { - result = L_shr( result, ( ( 31 - q12.q_fact ) - result_e ) ); + result = L_shr( result, sub( sub( Q31, q12.q_fact ), result_e ) ); } } IF( GT_32( q12.w_fx, result ) ) @@ -500,6 +558,7 @@ static Word32 QuaternionAngle_fx( ELSE { angle = PI_OVER_Q29; + move32(); } return angle; @@ -532,9 +591,10 @@ void QuaternionInverse_fx( { Word32 dot_product; Word16 dot_q = 0; + move16(); dot_product = QuaternionDotProduct_fx( q, q, &dot_q ); QuaternionConjugate_fx( q, r ); - QuaternionDivision_fx( *r, dot_product, r, ( 31 - dot_q ) ); + QuaternionDivision_fx( *r, dot_product, r, sub( Q31, dot_q ) ); return; } @@ -567,20 +627,28 @@ static IVAS_VECTOR3 VectorSubtract_fx( { IVAS_VECTOR3 result; Word16 e_result = 0, x_qfact, y_qfact, z_qfact, q_result; - result.x_fx = BASOP_Util_Add_Mant32Exp( p1.x_fx, ( 31 - p1.q_fact ), ( L_negate( p2.x_fx ) ), ( 31 - p2.q_fact ), &e_result ); + move16(); + result.x_fx = BASOP_Util_Add_Mant32Exp( p1.x_fx, sub( Q31, p1.q_fact ), ( L_negate( p2.x_fx ) ), sub( Q31, p2.q_fact ), &e_result ); + move32(); x_qfact = sub( 31, e_result ); - result.y_fx = BASOP_Util_Add_Mant32Exp( p1.y_fx, ( 31 - p1.q_fact ), ( L_negate( p2.y_fx ) ), ( 31 - p2.q_fact ), &e_result ); + result.y_fx = BASOP_Util_Add_Mant32Exp( p1.y_fx, sub( Q31, p1.q_fact ), ( L_negate( p2.y_fx ) ), sub( Q31, p2.q_fact ), &e_result ); + move32(); y_qfact = sub( 31, e_result ); - result.z_fx = BASOP_Util_Add_Mant32Exp( p1.z_fx, ( 31 - p1.q_fact ), ( L_negate( p2.z_fx ) ), ( 31 - p2.q_fact ), &e_result ); + result.z_fx = BASOP_Util_Add_Mant32Exp( p1.z_fx, sub( Q31, p1.q_fact ), ( L_negate( p2.z_fx ) ), sub( Q31, p2.q_fact ), &e_result ); + move32(); z_qfact = sub( 31, e_result ); q_result = sub( s_min( s_min( x_qfact, y_qfact ), z_qfact ), 1 ); // guardbit// result.x_fx = L_shr( result.x_fx, sub( x_qfact, q_result ) ); + move32(); result.y_fx = L_shr( result.y_fx, sub( y_qfact, q_result ) ); + move32(); result.z_fx = L_shr( result.z_fx, sub( z_qfact, q_result ) ); + move32(); result.q_fact = q_result; + move16(); return result; } @@ -613,9 +681,13 @@ static IVAS_VECTOR3 VectorCrossProduct_fx( IVAS_VECTOR3 result_fx; result_fx.x_fx = L_sub( Mpy_32_32( p1.y_fx, p2.z_fx ), Mpy_32_32( p1.z_fx, p2.y_fx ) ); + move32(); result_fx.y_fx = L_sub( Mpy_32_32( p1.z_fx, p2.x_fx ), Mpy_32_32( p1.x_fx, p2.z_fx ) ); + move32(); result_fx.z_fx = L_sub( Mpy_32_32( p1.x_fx, p2.y_fx ), Mpy_32_32( p1.y_fx, p2.x_fx ) ); + move32(); result_fx.q_fact = sub( add( p1.q_fact, p2.q_fact ), 31 ); + move16(); return result_fx; } @@ -641,9 +713,11 @@ static Word32 VectorDotProduct_fx( Word16 *q_fact ) { Word32 result_fx = 0; + move32(); result_fx = L_add( L_add( Mpy_32_32( p1.x_fx, p2.x_fx ), Mpy_32_32( p1.y_fx, p2.y_fx ) ), Mpy_32_32( p1.z_fx, p2.z_fx ) ); *q_fact = sub( add( p1.q_fact, p2.q_fact ), 31 ); + move16(); return result_fx; } @@ -667,9 +741,11 @@ static Word32 VectorLength_fx( Word16 *q_fact ) { Word32 result_fx = 0; + move32(); result_fx = L_add( L_add( Mpy_32_32( p.x_fx, p.x_fx ), Mpy_32_32( p.y_fx, p.y_fx ) ), Mpy_32_32( p.z_fx, p.z_fx ) ); *q_fact = sub( add( p.q_fact, p.q_fact ), 31 ); + move16(); return result_fx; } #endif @@ -701,22 +777,30 @@ static IVAS_VECTOR3 VectorNormalize_fx( IVAS_VECTOR3 result_fx; Word32 length_fx; Word16 q_len, scale = 0, x_qfact, y_qfact, z_qfact, q_result; + move16(); length_fx = VectorLength_fx( p, &q_len ); result_fx.x_fx = BASOP_Util_Divide3232_Scale_cadence( p.x_fx, length_fx, &scale ); - x_qfact = ( 31 - ( scale + ( q_len - p.q_fact ) ) ); // e+(e1-e2)// + move32(); + x_qfact = sub( Q31, add( scale, sub( q_len, p.q_fact ) ) ); // e+(e1-e2)// result_fx.y_fx = BASOP_Util_Divide3232_Scale_cadence( p.y_fx, length_fx, &scale ); - y_qfact = ( 31 - ( scale + ( q_len - p.q_fact ) ) ); + move32(); + y_qfact = sub( Q31, add( scale, sub( q_len, p.q_fact ) ) ); result_fx.z_fx = BASOP_Util_Divide3232_Scale_cadence( p.z_fx, length_fx, &scale ); - z_qfact = ( 31 - ( scale + ( q_len - p.q_fact ) ) ); + move32(); + z_qfact = sub( Q31, add( scale, sub( q_len, p.q_fact ) ) ); q_result = s_min( s_min( x_qfact, y_qfact ), z_qfact ); result_fx.x_fx = L_shr( result_fx.x_fx, sub( x_qfact, q_result ) ); + move32(); result_fx.y_fx = L_shr( result_fx.y_fx, sub( y_qfact, q_result ) ); + move32(); result_fx.z_fx = L_shr( result_fx.z_fx, sub( z_qfact, q_result ) ); + move32(); result_fx.q_fact = q_result; + move16(); return result_fx; } @@ -779,10 +863,13 @@ static void VectorRotationToQuaternion_fx( // dot & cross product are same q// Word32 comp_fx = -2147481472; //-0.999999f in Q31 + move32(); Word16 comp_e = 0, check_flag; - IF( GT_32( dot_product_fx, 0 ) ) + move16(); + IF( dot_product_fx > 0 ) { check_flag = 0; + move16(); } ELSE { @@ -791,25 +878,39 @@ static void VectorRotationToQuaternion_fx( IF( EQ_16( check_flag, 1 ) ) { r->w_fx = 0; + move32(); r->x_fx = 0; + move32(); r->y_fx = 0; + move32(); r->z_fx = ONE_IN_Q31; + move32(); r->q_fact = Q31; + move16(); } ELSE { /* all regular cases */ r->x_fx = cross_product_fx.x_fx; + move32(); r->y_fx = cross_product_fx.y_fx; + move32(); r->z_fx = cross_product_fx.z_fx; + move32(); r->w_fx = BASOP_Util_Add_Mant32Exp( dot_product_fx, sub( 31, q_dot ), ONE_IN_Q31, 0, &e_add ); + move32(); q_result = sub( s_min( sub( 31, e_add ), q_dot ), 1 ); // gaurd bits// r->x_fx = L_shr( r->x_fx, sub( q_dot, q_result ) ); + move32(); r->y_fx = L_shr( r->y_fx, sub( q_dot, q_result ) ); + move32(); r->z_fx = L_shr( r->z_fx, sub( q_dot, q_result ) ); + move32(); r->w_fx = L_shr( r->w_fx, sub( sub( 31, e_add ), q_result ) ); + move32(); r->q_fact = q_result; + move16(); } QuaternionNormalize_fx( *r, r ); @@ -870,6 +971,7 @@ ivas_error ivas_orient_trk_Init_fx( identity_fx.x_fx = identity_fx.y_fx = identity_fx.z_fx = 0; move32(); move32(); + move32(); identity_fx.q_fact = Q31; move16(); @@ -895,6 +997,8 @@ ivas_error ivas_orient_trk_Init_fx( // this part still float// /* set safe default tracking mode */ pOTR->orientation_tracking = IVAS_HEAD_ORIENT_TRK_NONE; + move16(); + return IVAS_ERR_OK; } #endif @@ -932,6 +1036,7 @@ ivas_error ivas_orient_trk_SetTrackingType_fx( } pOTR->orientation_tracking = orientation_tracking; + move16(); return IVAS_ERR_OK; } @@ -1029,6 +1134,7 @@ ivas_error ivas_orient_trk_GetMainOrientation_fx( IVAS_QUATERNION *pOrientation /* i/o: average/reference orientation */ ) { + test(); IF( pOTR == NULL || pOrientation == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -1177,17 +1283,27 @@ ivas_error ivas_orient_trk_SetReferenceVector_fx( case IVAS_HEAD_ORIENT_TRK_REF_VEC_LEV: /* ignore the height difference between listener position and reference position */ listenerPosLevel.z_fx = refPosLevel.z_fx = listenerPos.z_fx; + move32(); listenerPosLevel.x_fx = listenerPos.x_fx; + move32(); listenerPosLevel.y_fx = listenerPos.y_fx; + move32(); listenerPosLevel.q_fact = listenerPos.q_fact; + move16(); refPosLevel.x_fx = refPos.x_fx; + move32(); refPosLevel.y_fx = refPos.y_fx; + move32(); Word16 q_min = s_min( listenerPos.q_fact, refPos.q_fact ); refPosLevel.x_fx = L_shr( refPosLevel.x_fx, sub( refPos.q_fact, q_min ) ); + move32(); refPosLevel.y_fx = L_shr( refPosLevel.y_fx, sub( refPos.q_fact, q_min ) ); + move32(); refPosLevel.z_fx = L_shr( refPosLevel.z_fx, sub( refPos.q_fact, q_min ) ); + move32(); refPosLevel.q_fact = q_min; + move16(); acousticFrontVector = VectorSubtract_fx( listenerPosLevel, refPosLevel ); BREAK; @@ -1196,8 +1312,10 @@ ivas_error ivas_orient_trk_SetReferenceVector_fx( } Word16 accoustic_q = acousticFrontVector.q_fact; + move16(); acousticFrontVectorLength = VectorLength_fx( acousticFrontVector, &acousticFrontVector.q_fact ); acousticFrontVector.q_fact = accoustic_q; + move16(); /* if the length is zero, the user has entered insensible listener and reference positions */ IF( LE_32( acousticFrontVectorLength, 0 ) ) { @@ -1205,9 +1323,13 @@ ivas_error ivas_orient_trk_SetReferenceVector_fx( } ivasForwardVector.x_fx = L_negate( ONE_IN_Q31 ); + move32(); ivasForwardVector.y_fx = 0; + move32(); ivasForwardVector.z_fx = 0; + move32(); ivasForwardVector.q_fact = Q31; + move16(); VectorRotationToQuaternion_fx( ivasForwardVector, acousticFrontVector, &pOTR->refRot ); return IVAS_ERR_OK; @@ -1323,13 +1445,17 @@ ivas_error ivas_orient_trk_Process_fx( Word32 rateRange_fx; Word32 cutoffFrequency_fx, cutoff_prod; Word16 q_cutoff_prod = 0; + move16(); Word32 alpha_fx = L_shl( pOTR->alpha_fx, sub( Q30, pOTR->Q_alpha ) ); + + test(); IF( pOTR == NULL || pTrkRot == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } result = IVAS_ERR_OK; + move32(); SWITCH( pOTR->orientation_tracking ) { @@ -1371,6 +1497,7 @@ ivas_error ivas_orient_trk_Process_fx( relativeOrientationRate_fx = L_deposit_h( temp_result ); Word32 one_fx = 1073741824; move32(); + IF( GT_32( relativeOrientationRate_fx, one_fx ) ) { relativeOrientationRate_fx = 1; @@ -1380,7 +1507,7 @@ ivas_error ivas_orient_trk_Process_fx( /* Compute range of the adaptation rate between center = lower rate and off-center = higher rate */ rateRange_fx = L_sub( pOTR->offCenterAdaptationRate_fx, pOTR->centerAdaptationRate_fx ); /* 'if' assumed to perform comparison to 0 */ - IF( GT_32( 0, rateRange_fx ) ) + if ( 0 > rateRange_fx ) { rateRange_fx = 0; move32(); @@ -1403,11 +1530,13 @@ ivas_error ivas_orient_trk_Process_fx( /* Compute adaptivity cutoff frequency: interpolate between minimum (center) and maximum (off-center) values */ cutoffFrequency_fx = L_add( pOTR->centerAdaptationRate_fx, cutoff_prod ); cutoff_prod = Mpy_32_32( cutoffFrequency_fx, PI2_C_Q28 ); - q_cutoff_prod = sub( add( 31, 28 ), 31 ); + q_cutoff_prod = ( ( 31 + 28 ) - 31 ); temp_result = BASOP_Util_Divide3232_Scale( cutoff_prod, updateRate_fx, &result_e ); result_e = add( result_e, sub( 23, q_cutoff_prod ) ); pOTR->alpha_fx = L_deposit_h( temp_result ); + move32(); pOTR->Q_alpha = sub( Q31, result_e ); + move16(); BREAK; default: result = IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Non-supported orientation tracking adaptation type" ); diff --git a/lib_rend/ivas_output_init.c b/lib_rend/ivas_output_init.c index 861a0db0e..b224af672 100644 --- a/lib_rend/ivas_output_init.c +++ b/lib_rend/ivas_output_init.c @@ -222,15 +222,22 @@ void ivas_output_init( /* set general default values */ hOutSetup->output_config = output_config; + move16(); hOutSetup->is_loudspeaker_setup = 0; + move16(); hOutSetup->is_binaural_setup = 0; + move16(); hOutSetup->ambisonics_order = -1; + move16(); hOutSetup->separateChannelEnabled = 0; + move16(); hOutSetup->separateChannelIndex = 0; + move16(); IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { hOutSetup->is_loudspeaker_setup = 1; + move16(); /* set in ivas_init_decoder: */ /* hOutSetup->ls_azimuth */ /* hOutSetup->ls_elevation */ @@ -244,68 +251,96 @@ void ivas_output_init( hOutSetup->ls_azimuth_fx = NULL; hOutSetup->ls_elevation_fx = NULL; hOutSetup->num_lfe = 0; + move16(); hOutSetup->index_lfe[0] = -1; + move16(); hOutSetup->is_planar_setup = 0; + move16(); /* set output setup specific values */ SWITCH( output_config ) { case IVAS_AUDIO_CONFIG_MONO: hOutSetup->is_loudspeaker_setup = 1; + move16(); BREAK; case IVAS_AUDIO_CONFIG_STEREO: hOutSetup->is_loudspeaker_setup = 1; + move16(); hOutSetup->ls_azimuth_fx = ls_azimuth_CICP2_fx; hOutSetup->ls_elevation_fx = ls_elevation_CICP2_fx; BREAK; case IVAS_AUDIO_CONFIG_FOA: hOutSetup->ambisonics_order = SBA_FOA_ORDER; + move16(); BREAK; case IVAS_AUDIO_CONFIG_HOA2: hOutSetup->ambisonics_order = SBA_HOA2_ORDER; + move16(); BREAK; case IVAS_AUDIO_CONFIG_HOA3: hOutSetup->ambisonics_order = SBA_HOA3_ORDER; + move16(); BREAK; case IVAS_AUDIO_CONFIG_5_1: hOutSetup->num_lfe = 1; + move16(); hOutSetup->index_lfe[0] = 3; + move16(); hOutSetup->is_loudspeaker_setup = 1; + move16(); hOutSetup->ls_azimuth_fx = ls_azimuth_CICP6_fx; hOutSetup->ls_elevation_fx = ls_elevation_CICP6_fx; hOutSetup->is_planar_setup = 1; + move16(); BREAK; case IVAS_AUDIO_CONFIG_7_1: hOutSetup->num_lfe = 1; + move16(); hOutSetup->index_lfe[0] = 3; + move16(); hOutSetup->is_loudspeaker_setup = 1; + move16(); hOutSetup->ls_azimuth_fx = ls_azimuth_CICP12_fx; hOutSetup->ls_elevation_fx = ls_elevation_CICP12_fx; hOutSetup->is_planar_setup = 1; + move16(); BREAK; case IVAS_AUDIO_CONFIG_5_1_2: hOutSetup->num_lfe = 1; + move16(); hOutSetup->index_lfe[0] = 3; + move16(); hOutSetup->is_loudspeaker_setup = 1; + move16(); hOutSetup->ls_azimuth_fx = ls_azimuth_CICP14_fx; hOutSetup->ls_elevation_fx = ls_elevation_CICP14_fx; hOutSetup->is_planar_setup = 0; + move16(); BREAK; case IVAS_AUDIO_CONFIG_5_1_4: hOutSetup->num_lfe = 1; + move16(); hOutSetup->index_lfe[0] = 3; + move16(); hOutSetup->is_loudspeaker_setup = 1; + move16(); hOutSetup->ls_azimuth_fx = ls_azimuth_CICP16_fx; hOutSetup->ls_elevation_fx = ls_elevation_CICP16_fx; hOutSetup->is_planar_setup = 0; + move16(); BREAK; case IVAS_AUDIO_CONFIG_7_1_4: hOutSetup->num_lfe = 1; + move16(); hOutSetup->index_lfe[0] = 3; + move16(); hOutSetup->is_loudspeaker_setup = 1; + move16(); hOutSetup->ls_azimuth_fx = ls_azimuth_CICP19_fx; hOutSetup->ls_elevation_fx = ls_elevation_CICP19_fx; hOutSetup->is_planar_setup = 0; + move16(); BREAK; case IVAS_AUDIO_CONFIG_BINAURAL: case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: @@ -315,6 +350,7 @@ void ivas_output_init( case IVAS_AUDIO_CONFIG_ISM3: case IVAS_AUDIO_CONFIG_ISM4: hOutSetup->is_binaural_setup = 1; + move16(); case IVAS_AUDIO_CONFIG_EXTERNAL: /* Default values are used */ BREAK; @@ -323,10 +359,12 @@ void ivas_output_init( } } + test(); IF( NE_16( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) && NE_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { nchan_out = audioCfg2channels( output_config ); hOutSetup->nchan_out_woLFE = sub( nchan_out, hOutSetup->num_lfe ); + move16(); } return; @@ -531,11 +569,7 @@ Word16 ivas_get_nchan_buffers_dec( ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) { Word16 nchan_internal; -#ifndef IVAS_FLOAT_FIXED - nchan_internal = ivas_sba_get_nchan_metadata( sba_analysis_order, ivas_total_brate ); -#else nchan_internal = ivas_sba_get_nchan_metadata_fx( sba_analysis_order, ivas_total_brate ); -#endif nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; move16(); @@ -589,11 +623,7 @@ Word16 ivas_get_nchan_buffers_dec( ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { Word16 nchan_internal; -#ifndef IVAS_FLOAT_FIXED - nchan_internal = ivas_sba_get_nchan_metadata( sba_analysis_order, ivas_total_brate ); -#else nchan_internal = ivas_sba_get_nchan_metadata_fx( sba_analysis_order, ivas_total_brate ); -#endif nchan_out_buff = add( st_ivas->nchan_ism, st_ivas->nchan_transport ); IF( st_ivas->hMCT != NULL ) diff --git a/lib_rend/ivas_output_init_fx.c b/lib_rend/ivas_output_init_fx.c index 2dc4f75d6..e3a297cdf 100644 --- a/lib_rend/ivas_output_init_fx.c +++ b/lib_rend/ivas_output_init_fx.c @@ -21,6 +21,7 @@ Word16 ivas_get_nchan_buffers_dec_ivas_fx( IF( EQ_16( st_ivas->ivas_format, MONO_FORMAT ) ) { nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; + move16(); } ELSE IF( EQ_16( st_ivas->ivas_format, STEREO_FORMAT ) ) { -- GitLab From 5280ffb31bf1634ab6fe757c63dc2e81038d0536 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 26 Jun 2024 14:40:19 +0530 Subject: [PATCH 004/110] Fix for issue 784: BASOP decoder without JBM not BE to BASOP decoder with zero-delay profile [x] Fix for issue observed with BINAURAL_ROOM_REVERB output format. [x] Output buffer scaling was incorrect. This has been rectified in ivas_jbm_dec_render_fx rountine. --- lib_dec/ivas_jbm_dec.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 7891c7baa..2aae1ebfd 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -3039,6 +3039,16 @@ ivas_error ivas_jbm_dec_render_fx( { return error; } + + test(); + IF( st_ivas->hDecoderConfig->Opt_tsm && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV ) ) + { + FOR( i = 0; i < nchan_in; i++ ) + { + scale_sig32( p_tc_fx[i], *nSamplesRendered, -Q2 ); + } + } + ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_tc_fx, p_output_fx ); FOR( i = 0; i < nchan_in; i++ ) -- GitLab From c550cc5e200316937863caa84c7f75e85cc28bca Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 27 Jun 2024 12:10:03 +0200 Subject: [PATCH 005/110] Add manual job pytest-renderer --- .gitlab-ci.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fb5645e8c..5fcbfd366 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,6 +29,7 @@ variables: - 'pytest-saturation-smoke-test' - 'evs-26444' - 'sanitizer-stv' + - 'pytest-renderer' default: @@ -68,6 +69,9 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'sanitizer-stv' variables: IVAS_PIPELINE_NAME: 'Short testvectors sanitizers' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-renderer' + variables: + IVAS_PIPELINE_NAME: 'Renderer test: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'schedule' # Scheduled in any branch variables: IVAS_PIPELINE_NAME: 'Scheduled pipeline: $CI_COMMIT_BRANCH' @@ -678,6 +682,18 @@ be-2-evs-26444: junit: - report-junit.xml +ivas-pytest-renderer: + extends: + - .test-job-linux + rules: + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-renderer" + before_script: + - USE_LTV=0 + - TEST_SUITE="tests/renderer" + - LEVEL_SCALING=1.0 + <<: *ivas-pytest-anchor + + # job that sets up gitlab pages website pages: stage: deploy -- GitLab From 00c9db38b4d22c3803003a9b79056d684c091097 Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Thu, 27 Jun 2024 09:45:21 -0400 Subject: [PATCH 006/110] fix clang format --- lib_com/gs_bitallocation_ivas_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_com/gs_bitallocation_ivas_fx.c b/lib_com/gs_bitallocation_ivas_fx.c index 9beb5fb07..73cf88295 100644 --- a/lib_com/gs_bitallocation_ivas_fx.c +++ b/lib_com/gs_bitallocation_ivas_fx.c @@ -465,7 +465,7 @@ void bands_and_bit_alloc_ivas_fx( #ifdef FIX_802__NON_BE_DECODING bit_fracf = Find_bit_frac( nb_bands, extract_l( SWB_bit_budget ) ); #else - bit_fracf = L_mult( div_s( 1, nb_bands ), shl( (Word16) SWB_bit_budget, 2 ) ); /* Q18 */ + bit_fracf = L_mult( div_s( 1, nb_bands ), shl( (Word16) SWB_bit_budget, 2 ) ); /* Q18 */ #endif nb_tot_bands = sub( nb_bands_max, 6 ); nb_tot_bands = s_min( nb_tot_bands, 16 ); @@ -650,7 +650,7 @@ void bands_and_bit_alloc_ivas_fx( #ifdef FIX_802__NON_BE_DECODING bit_fracf = Find_bit_frac( st_band, bit_tmp ); #else - bit_fracf = L_mult( div_s( 1, st_band ), shl( bit_tmp, 2 ) ); /* Q18 */ + bit_fracf = L_mult( div_s( 1, st_band ), shl( bit_tmp, 2 ) ); /* Q18 */ #endif } /*------------------------------------------------------------------------ @@ -978,7 +978,7 @@ static void reajust_bits_fx( incr = 1; move16(); - if( LT_16( end_band, st_band) ) + if ( LT_16( end_band, st_band ) ) { incr = -1; move16(); -- GitLab From c4c98351cedc1b9d8ed29b59f01efb85d44baa37 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 28 Jun 2024 11:02:29 +0530 Subject: [PATCH 007/110] Fix for crash for stereo ltv stream occuring in stereo_dft_generate_comfort_noise_fx [x] The crash occurs due to overflow when accumulating and storing cngNoiseLevel values in lp_noise in stereo_dft_generate_comfort_noise_fx. Adjusted the q-factor of lp_noise which was not handled properly to fix the issue. --- lib_dec/ivas_stereo_cng_dec.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index 0c08c549f..0e77aa9e4 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -1174,7 +1174,7 @@ static void stereo_dft_generate_comfort_noise_fx( ptr_tmp--; *ptr_level = *( ptr_level + 1 ); move32(); - lp_noise = L_add( lp_noise, L_shl( *ptr_level--, add( 1, sub( Q6, sub( Q31, hFdCngCom->cngNoiseLevelExp ) ) ) ) ); + lp_noise = L_add( lp_noise, L_shl( *ptr_level--, 1 ) ); } } ELSE @@ -1266,8 +1266,8 @@ static void stereo_dft_generate_comfort_noise_fx( // log10(x) is computed as log2(x) * log10(2) // log_lp_noise at this stage is in Q25. where as the structure value is in Q23 // Hence the 16-bit constant log10(2) will be stored in Q13 - log_lp_noise = Mpy_32_16_1( log_lp_noise, (Word16) 0x09A2 ); - st1->lp_noise = L_add( Mpy_32_16_1( st1->lp_noise, (Word16) ( 0x7333 ) ), log_lp_noise ); + log_lp_noise = Mpy_32_16_1( log_lp_noise, 2466 /* log10(2) in Q13 */ ); + st1->lp_noise = L_add( Mpy_32_16_1( st1->lp_noise, 29491 /* 0.9f in Q15 */ ), log_lp_noise ); move32(); } ELSE IF( EQ_16( chan, 0 ) ) @@ -1278,8 +1278,8 @@ static void stereo_dft_generate_comfort_noise_fx( // log10(x) is computed as log2(x) * log10(2) // log_lp_noise at this stage is in Q25. where as the structure value is in Q23 // Hence the 16-bit constant log10(2) will be stored in Q13 - log_lp_noise = Mpy_32_16_1( log_lp_noise, (Word16) 0x09A2 ); - st->hFdCngDec->lp_noise = L_add( Mpy_32_16_1( st->hFdCngDec->lp_noise, (Word16) ( 0x7333 ) ), log_lp_noise ); + log_lp_noise = Mpy_32_16_1( log_lp_noise, 2466 /* log10(2) in Q13 */ ); + st->hFdCngDec->lp_noise = L_add( Mpy_32_16_1( st->hFdCngDec->lp_noise, 29491 /* 0.9f in Q15 */ ), log_lp_noise ); move32(); st->lp_noise = st->hFdCngDec->lp_noise; move32(); -- GitLab From fc107808fa90b569933c57283569f625d935ec4d Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 28 Jun 2024 12:12:13 +0530 Subject: [PATCH 008/110] Removed usage of division and used multiplication at points possible. --- lib_com/cnst.h | 3 +- lib_com/ivas_cnst.h | 2 + lib_com/ivas_dirac_com.c | 7 +- lib_com/ivas_ism_com.c | 13 ++-- lib_com/ivas_masa_com.c | 10 +-- lib_com/ivas_spar_com.c | 34 ++++------ lib_com/rom_com.c | 24 +++---- lib_dec/acelp_core_dec_ivas_fx.c | 9 ++- lib_dec/cng_dec_fx.c | 4 +- lib_dec/dec_tcx_fx.c | 6 +- lib_dec/er_dec_tcx_fx.c | 6 +- lib_dec/fd_cng_dec.c | 12 +--- lib_dec/hq_core_dec_fx.c | 4 +- lib_dec/ivas_ism_param_dec.c | 15 ++-- lib_dec/ivas_jbm_dec.c | 13 ++-- lib_dec/ivas_lfe_plc_fx.c | 14 ++-- lib_dec/ivas_masa_dec.c | 23 +++---- lib_dec/ivas_mct_dec.c | 8 +-- lib_dec/ivas_mct_dec_mct_fx.c | 4 +- lib_dec/ivas_omasa_dec.c | 4 +- lib_dec/ivas_sba_dec.c | 6 +- lib_dec/ivas_spar_md_dec.c | 11 ++- lib_dec/ivas_stereo_dft_dec_fx.c | 11 +-- lib_dec/ivas_stereo_switching_dec.c | 10 +-- lib_enc/init_enc.c | 9 ++- lib_enc/ivas_core_pre_proc_front.c | 4 +- lib_enc/ivas_stereo_dft_enc.c | 15 ++-- lib_enc/ivas_stereo_mdct_stereo_enc.c | 5 +- lib_rend/ivas_crend.c | 6 +- lib_rend/ivas_dirac_ana.c | 6 +- lib_rend/ivas_dirac_output_synthesis_dec.c | 4 +- lib_rend/ivas_dirac_rend.c | 79 +++++++++------------- lib_rend/ivas_efap.c | 21 +----- lib_rend/ivas_limiter.c | 7 +- lib_rend/ivas_objectRenderer.c | 5 +- lib_rend/ivas_omasa_ana.c | 10 ++- lib_rend/ivas_reverb.c | 51 +++++++------- lib_rend/ivas_rotation.c | 7 +- lib_rend/ivas_stat_rend.h | 6 +- lib_rend/ivas_vbap.c | 31 ++------- lib_rend/lib_rend.c | 6 +- 41 files changed, 216 insertions(+), 309 deletions(-) diff --git a/lib_com/cnst.h b/lib_com/cnst.h index a1ec42fb9..55eafef53 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -575,7 +575,7 @@ enum #define FRAMES_PER_SEC 50 #ifdef IVAS_FLOAT_FIXED #define MAX_PARAM_SPATIAL_SUB_FRAMES_PER_SEC 200 //(FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES) -#define ONE_BY_FRAMES_PER_SEC_Q31 ((Word32)(0x028F5C29)) +#define ONE_BY_FRAMES_PER_SEC_Q31 ( 42949673 ) #define FRAMES_PER_SEC_BY_2 (FRAMES_PER_SEC >> 1) #endif #define INV_FRAME_PER_SEC_Q15 656 @@ -607,6 +607,7 @@ enum #define N_WS2N_FRAMES 40 /* number of frames for attenuation during the band-width switching */ #define N_NS2W_FRAMES 20 /* number of frames for attenuation during the band-width switching */ +#define ONE_BY_N_NS2W_FRAMES_Q15 ( 1638 ) /*----------------------------------------------------------------------------------* * Coder types (only for ACELP core when not running in AMR-WB IO mode) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 1b6940be5..d82507787 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1681,6 +1681,8 @@ typedef enum #define DEG_360_IN_Q22 (360 << Q22) #define DEG_180_IN_Q22 (180 << Q22) #define DEG_90_IN_Q22 (90 << Q22) +#define ONE_BY_360_Q31 ( 5965232 ) +#define ONE_BY_180_Q31 ( 11930465 ) /* ----- Enums - TD Renderer ----- */ diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 8a37462d4..b87592d22 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -639,10 +639,9 @@ void ivas_get_dirac_sba_max_md_bits_fx( } ELSE { - //*bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); - Word16 tmp_exp = 0, tmp; - tmp = BASOP_Util_Divide3232_Scale( sba_total_brate, FRAMES_PER_SEC, &tmp_exp ); - *bits_frame_nominal = shr( tmp, 15 - tmp_exp ); + /* *bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); */ + *bits_frame_nominal = extract_l( Mpy_32_32( sba_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + move16(); *metadata_max_bits = MAX16B; /* no limit */ } Word32 var1 = L_mult0( *metadata_max_bits, nbands ); diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index 6f0b03286..aab90fab5 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -52,8 +52,11 @@ #define BITS_ISM_INACTIVE ( BRATE_ISM_INACTIVE / FRAMES_PER_SEC ) -#define BETA_ISM_LOW_IMP 0.6f -#define BETA_ISM_MEDIUM_IMP 0.8f +#define BETA_ISM_LOW_IMP 0.6f +#define BETA_ISM_LOW_IMP_Q31 ( 1288490189 ) +#define BETA_ISM_MEDIUM_IMP 0.8f +#define BETA_ISM_MEDIUM_IMP_Q31 ( 1717986918 ) +#define BETA_ISM_MEDIUM_IMP_BY_8_Q31 ( 214748365 ) #define MAX_BRATE_TCX_32k 48000 #define BITS_IVAS_512k ( IVAS_512k / FRAMES_PER_SEC ) @@ -585,15 +588,13 @@ ivas_error ivas_ism_config_fx( ELSE IF( EQ_16( ism_imp[ch], ISM_LOW_IMP ) ) { // tmp = (Word16) ( BETA_ISM_LOW_IMP * bits_CoreCoder[ch] ); - tmp1 = BASOP_Util_Divide1616_Scale( bits_CoreCoder[ch], 5, &exp ); - tmp = shr( mult( tmp1, 24576 ), ( 15 - exp + 13 ) - 15 ); + tmp = extract_l( Mpy_32_32( BETA_ISM_LOW_IMP_Q31, bits_CoreCoder[ch] ) ); tmp = s_max( limit, tmp ); } ELSE IF( EQ_16( ism_imp[ch], ISM_MEDIUM_IMP ) ) { // tmp = (Word16) ( BETA_ISM_MEDIUM_IMP * bits_CoreCoder[ch] ); - tmp1 = BASOP_Util_Divide1616_Scale( bits_CoreCoder[ch], 5, &exp ); - tmp = shr( mult( tmp1, 16384 ), ( 15 - exp + 12 ) - 15 ); + tmp = extract_l( Mpy_32_32( BETA_ISM_MEDIUM_IMP_BY_8_Q31, L_shl( bits_CoreCoder[ch], Q3 ) ) ); tmp = s_max( limit, tmp ); } ELSE /* ism_imp[ch] == ISM_HIGH_IMP */ diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c index bbfc3d69c..388dd6a60 100644 --- a/lib_com/ivas_masa_com.c +++ b/lib_com/ivas_masa_com.c @@ -179,7 +179,7 @@ void ivas_masa_set_elements_fx( const Word32 ism_total_brate /* i : initial ISM total bitrate */ ) { - Word16 tmp, tmp_e; + Word16 tmp; IF( EQ_16( nchan_transport, 2 ) ) { @@ -232,12 +232,12 @@ void ivas_masa_set_elements_fx( move16(); } } - tmp = BASOP_Util_Divide3216_Scale( ivas_total_brate, FRAMES_PER_SEC, &tmp_e ); - hQMetaData->bits_frame_nominal = shr( tmp, negate( add( 1, tmp_e ) ) ); // Q0 + /* hQMetaData->bits_frame_nominal = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ); */ + hQMetaData->bits_frame_nominal = extract_l( Mpy_32_32( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) && ( EQ_16( ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_16( ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) || EQ_16( ism_mode, ISM_MASA_MODE_DISC ) ) ) { - tmp = BASOP_Util_Divide3216_Scale( ism_total_brate, FRAMES_PER_SEC, &tmp_e ); - tmp = shr( tmp, negate( add( 1, tmp_e ) ) ); // Q0 + /* hQMetaData->bits_frame_nominal -= (int16_t) ( ism_total_brate / FRAMES_PER_SEC ); */ + tmp = extract_l( Mpy_32_32( ism_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); hQMetaData->bits_frame_nominal = sub( hQMetaData->bits_frame_nominal, tmp ); } } diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index aa762741c..0b4639a3e 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -6422,15 +6422,6 @@ void ivas_spar_set_bitrate_config( } #ifdef IVAS_FLOAT_FIXED -static Word32 ceil32_fx( Word32 var1, Word16 q ) -{ - Word32 ans, temp; - ans = L_shr( var1, q ); - temp = L_shl( ans, q ); - IF( GT_32( ans, temp ) ) - return ans; - ELSE return L_add( ans, 1 ); -} void ivas_spar_set_bitrate_config_fx( ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */ const Word16 table_idx, /* i : config. table index */ @@ -6482,16 +6473,16 @@ void ivas_spar_set_bitrate_config_fx( Word16 div1; FOR( i = 0; i < pSpar_md_cfg->nchan_transport; i++ ) { - div1 = BASOP_Util_Divide3232_Scale( ivas_spar_br_table_consts[table_idx].core_brs[i][0], FRAMES_PER_SEC, &temp ); - total_bits = add( total_bits, shr( div1, sub( 15, temp ) ) ); - div1 = BASOP_Util_Divide3232_Scale( ivas_spar_br_table_consts[table_idx].core_brs[i][1], FRAMES_PER_SEC, &temp ); - max_bits = add( max_bits, shr( div1, sub( 15, temp ) ) ); + /* total_bits += (int16_t) ( ivas_spar_br_table_consts[table_idx].core_brs[i][0] / FRAMES_PER_SEC ); */ + total_bits = add( total_bits, extract_l( Mpy_32_32( ivas_spar_br_table_consts[table_idx].core_brs[i][0], ONE_BY_FRAMES_PER_SEC_Q31 ) ) ); + /* max_bits += (int16_t) ( ivas_spar_br_table_consts[table_idx].core_brs[i][1] / FRAMES_PER_SEC ); */ + max_bits = add( max_bits, extract_l( Mpy_32_32( ivas_spar_br_table_consts[table_idx].core_brs[i][1], ONE_BY_FRAMES_PER_SEC_Q31 ) ) ); } - - div1 = BASOP_Util_Divide3232_Scale( ivas_total_brate, FRAMES_PER_SEC, &temp ); - pSpar_md_cfg->tgt_bits_per_blk = sub( shr( div1, sub( 15, temp ) ), add( add( add( add( add( IVAS_FORMAT_SIGNALING_NBITS_EXTENDED, SBA_PLANAR_BITS ), 0 ), SBA_ORDER_BITS ), length ), total_bits ) ); - pSpar_md_cfg->max_bits_per_blk = sub( shr( div1, sub( 15, temp ) ), add( add( add( add( add( IVAS_FORMAT_SIGNALING_NBITS_EXTENDED, SBA_PLANAR_BITS ), 0 ), SBA_ORDER_BITS ), length ), max_bits ) ); + /* (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) */ + div1 = extract_l( Mpy_32_32( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + pSpar_md_cfg->tgt_bits_per_blk = sub( div1, add( add( add( add( add( IVAS_FORMAT_SIGNALING_NBITS_EXTENDED, SBA_PLANAR_BITS ), 0 ), SBA_ORDER_BITS ), length ), total_bits ) ); + pSpar_md_cfg->max_bits_per_blk = sub( div1, add( add( add( add( add( IVAS_FORMAT_SIGNALING_NBITS_EXTENDED, SBA_PLANAR_BITS ), 0 ), SBA_ORDER_BITS ), length ), max_bits ) ); md_coding_bits_header = add( SPAR_NUM_CODING_STRAT_BITS, pSpar_md_cfg->quant_strat_bits ); @@ -6507,11 +6498,10 @@ void ivas_spar_set_bitrate_config_fx( bands_bw = 1; } - div1 = BASOP_Util_Divide3232_Scale( i_mult( pSpar_md_cfg->tgt_bits_per_blk, num_bands ), IVAS_MAX_NUM_BANDS, &temp ); - pSpar_md_cfg->tgt_bits_per_blk = (Word16) ceil32_fx( div1, 15 - temp ); - - div1 = BASOP_Util_Divide3232_Scale( i_mult( pSpar_md_cfg->max_bits_per_blk, num_bands ), IVAS_MAX_NUM_BANDS, &temp ); - pSpar_md_cfg->max_bits_per_blk = (Word16) ceil32_fx( div1, 15 - temp ); + /* pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->tgt_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); */ + pSpar_md_cfg->tgt_bits_per_blk = extract_l( Mpy_32_32( i_mult( pSpar_md_cfg->tgt_bits_per_blk, num_bands ), 178956971 /* 1 / IVAS_MAX_NUM_BANDS in Q31 */ ) ); + /* pSpar_md_cfg->max_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->max_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); */ + pSpar_md_cfg->max_bits_per_blk = extract_l( Mpy_32_32( i_mult( pSpar_md_cfg->max_bits_per_blk, num_bands ), 178956971 /* 1 / IVAS_MAX_NUM_BANDS in Q31 */ ) ); pSpar_md_cfg->tgt_bits_per_blk = add( pSpar_md_cfg->tgt_bits_per_blk, md_coding_bits_header ); pSpar_md_cfg->max_bits_per_blk = add( pSpar_md_cfg->max_bits_per_blk, md_coding_bits_header ); diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c index 9590726d1..22589b96f 100644 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -11007,22 +11007,22 @@ const SCALE_SETUP scaleTable_cn_only[SIZE_SCALE_TABLE_CN] = #endif const SCALE_SETUP scaleTable_cn_dirac[15] = { - { 0, 0, 13200, -3.0f, 16306/*0.9952622652 Q14*/ /*-3.0f*/, -24576 }, - { 0, 13200, 16400, -2.5f, 12751/*0.7782794237 Q14*/ /*-2.5f*/, -20480 }, - { 0, 16400, 24400, -2.0f, 9583/*0.5848932266 Q14*/ /*-2.0f*/, -16384 }, - { 0, 24400, 32000, -1.5f, 6759/*0.4125375748 Q14*/ /*-1.5f*/, -12288 }, + { 0, 0, 13200, -3.0f, 16306/*0.9952622652 Q14*/ /*-3.0f*/, 16306 }, + { 0, 13200, 16400, -2.5f, 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, + { 0, 16400, 24400, -2.0f, 9583/*0.5848932266 Q14*/ /*-2.0f*/, 9583 }, + { 0, 24400, 32000, -1.5f, 6759/*0.4125375748 Q14*/ /*-1.5f*/, 6759 }, { 0, 32000,512001, 0.0f, 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 }, - { 1, 0, 13200, -3.0f, 16306/*0.9952622652 Q14*/ /*-3.0f*/, -24576 }, - { 1, 13200, 16400, -2.5f, 12751/*0.7782794237 Q14*/ /*-2.5f*/, -20480 }, - { 1, 16400, 24400, -2.0f, 9583/*0.5848932266 Q14*/ /*-2.0f*/, -16384 }, - { 1, 24400, 32000, -1.5f, 6759/*0.4125375748 Q14*/ /*-1.5f*/, -12288 }, + { 1, 0, 13200, -3.0f, 16306/*0.9952622652 Q14*/ /*-3.0f*/, 16306 }, + { 1, 13200, 16400, -2.5f, 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, + { 1, 16400, 24400, -2.0f, 9583/*0.5848932266 Q14*/ /*-2.0f*/, 9583 }, + { 1, 24400, 32000, -1.5f, 6759/*0.4125375748 Q14*/ /*-1.5f*/, 6759 }, { 1, 32000,512001, 0.0f, 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 }, - { 2, 0, 13200, -3.0f, 16306/*0.9952622652 Q14*/ /*-3.0f*/, -24576 }, - { 2, 13200, 16400, -2.5f, 12751/*0.7782794237 Q14*/ /*-2.5f*/, -20480 }, - { 2, 16400, 24400, -2.0f, 9583/*0.5848932266 Q14*/ /*-2.0f*/, -16384 }, - { 2, 24400, 32000, -1.5f, 6759/*0.4125375748 Q14*/ /*-1.5f*/, -12288 }, + { 2, 0, 13200, -3.0f, 16306/*0.9952622652 Q14*/ /*-3.0f*/, 16306 }, + { 2, 13200, 16400, -2.5f, 12751/*0.7782794237 Q14*/ /*-2.5f*/, 12751 }, + { 2, 16400, 24400, -2.0f, 9583/*0.5848932266 Q14*/ /*-2.0f*/, 9583 }, + { 2, 24400, 32000, -1.5f, 6759/*0.4125375748 Q14*/ /*-1.5f*/, 6759 }, { 2, 32000,512001, 0.0f, 0/*0.0000000000 Q14*/ /* 0.0f*/, 0 } }; const float scaleTable_cn_only_amrwbio_flt[SIZE_SCALE_TABLE_CN_AMRWB][2] = diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index 905db1091..422d9c5c6 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -133,8 +133,6 @@ ivas_error acelp_core_dec_ivas_fx( Word16 *old_exc_s_fx; /* Start of last excitation frame */ Word16 *p_tdm_Pri_pitch_buf_fx; Word16 local_element_mode; - Word16 tmp_e = 0; - move16(); ivas_error error; Word32 bpf_error_signal_fx[L_FRAME16k]; @@ -158,9 +156,10 @@ ivas_error acelp_core_dec_ivas_fx( } push_wmops( "acelp_core_dec" ); - tmp = BASOP_Util_Divide3232_Scale( st->output_Fs, FRAMES_PER_SEC, &tmp_e ); - output_frame = shr( tmp, sub( 15, tmp_e ) ); - // output_frame = (int16_t) ( st->output_Fs / FRAMES_PER_SEC ); + + /* output_frame = (int16_t) ( st->output_Fs / FRAMES_PER_SEC ); */ + output_frame = extract_l( Mpy_32_32( st->output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + /*----------------------------------------------------------------* * stereo SID and CNG frames processing *----------------------------------------------------------------*/ diff --git a/lib_dec/cng_dec_fx.c b/lib_dec/cng_dec_fx.c index d6b5984a6..cfaf7af5e 100644 --- a/lib_dec/cng_dec_fx.c +++ b/lib_dec/cng_dec_fx.c @@ -1530,11 +1530,11 @@ void td_cng_dec_init_ivas_fx( { IF( NE_16( st->element_mode, EVS_MONO ) ) { - hTdCngDec->lsp_shb_prev_fx[i] = div_s( shr( add( i, 1 ), 1 ), LPC_SHB_ORDER + 1 ); + hTdCngDec->lsp_shb_prev_fx[i] = ivas_lsp_shb_prev_tbl_fx[i]; } ELSE { - hTdCngDec->lsp_shb_prev_fx[i] = div_s( shr( i, 1 ), LPC_SHB_ORDER ); + hTdCngDec->lsp_shb_prev_fx[i] = lsp_shb_prev_tbl_fx[i]; } hTdCngDec->lsp_shb_prev_prev_fx[i] = hTdCngDec->lsp_shb_prev_fx[i]; move16(); diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index cc2de5052..ca3f1dca6 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -1784,11 +1784,9 @@ void decoder_tcx_post_ivas_fx( Decoder_State *st_fx, } ELSE IF( GT_16( st_fx->nbLostCmpt, MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ) ) { - Word16 tmp, q_tmp; - tmp = BASOP_Util_Divide1616_Scale( sub( st_fx->nbLostCmpt, MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ), MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN, &q_tmp ); - q_tmp = sub( 15, q_tmp ); - gainCNG = extract_l( L_shr( L_mult0( gainCNG, sub( shl( 1, q_tmp ), tmp ) ), q_tmp ) ); // gainCNG *= 1.f - (float) sub( st_fx->nbLostCmpt, MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ) / MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN; + tmp32 = L_sub( ONE_IN_Q31, imult3216( 107374182 /* 1 / MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN in Q31*/, sub( st_fx->nbLostCmpt, MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ) ) ); /* Q31 */ + gainCNG = extract_l( Mpy_32_32( gainCNG, tmp32 ) ); } } } diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index 8849f7b63..c3cf2f0ab 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -1780,11 +1780,9 @@ void con_tcx_ivas_fx( } ELSE IF( GT_16( st->nbLostCmpt, MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ) ) { - Word16 tmp, q_tmp; - tmp = BASOP_Util_Divide1616_Scale( sub( st->nbLostCmpt, MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ), MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN, &q_tmp ); - q_tmp = sub( 15, q_tmp ); - gainCNG = extract_l( L_shr( L_mult0( gainCNG, sub( shl( 1, q_tmp ), tmp ) ), q_tmp ) ); // gainCNG *= 1.f - (float)(st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME) / MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN; + L_tmp = L_sub( ONE_IN_Q31, imult3216( 107374182 /* 1 / MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN in Q31*/, sub( st->nbLostCmpt, MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ) ) ); /* Q31 */ + gainCNG = extract_l( Mpy_32_32( gainCNG, L_tmp ) ); } } #endif diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index 063a91269..3eca9decd 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -2727,14 +2727,8 @@ void generate_masking_noise_lb_dirac_fx( } } - Word16 exp; - Word16 div1 = BASOP_Util_Divide1616_Scale( negate( scaleTable_cn_dirac[i].scale_ivas ), shl( 10, Q11 ), &exp ); - exp = add( exp, sub( sub( 15, 13 ), sub( 15, 11 ) ) ); - Word32 scale_temp = BASOP_util_Pow2( Mpy_32_16_1( LOG_10_BASE_2, div1 ), add( exp, 2 ), &exp ); - scale_temp = L_sub( scale_temp, L_shl( 1, sub( Q31, exp ) ) ); - scale = L_shl( scale_temp, sub( exp, Q1 ) ); // Q30 - - scale = Mpy_32_32( scale, hFdCngCom->likelihood_noisy_speech_32fx ); // Q30 + scale = L_deposit_h( scaleTable_cn_dirac[i].scale_ivas ); /* Q30 */ + scale = Mpy_32_32( scale, hFdCngCom->likelihood_noisy_speech_32fx ); /* Q30 */ } } @@ -2968,7 +2962,7 @@ void generate_masking_noise_dirac_ivas_fx( } } - scale_fx = L_sub( pow_10_q11[shr( negate( scaleTable_cn_dirac[i].scale_ivas ) / 10, 13 - 7 )], 2048 ); // Q11 + scale_fx = L_shr( scaleTable_cn_dirac[i].scale_ivas, Q3 ); /* Q11 */ scale_fx = Mpy_32_16_1( scale_fx, hFdCngCom->likelihood_noisy_speech ); } } diff --git a/lib_dec/hq_core_dec_fx.c b/lib_dec/hq_core_dec_fx.c index e13071294..20e198bb7 100644 --- a/lib_dec/hq_core_dec_fx.c +++ b/lib_dec/hq_core_dec_fx.c @@ -131,7 +131,7 @@ void hq_core_dec_fx( { hHQ_core->HqVoicing = 0; move16(); - IF( GT_32( st_fx->core_brate, MINIMUM_RATE_TO_ENCODE_VOICING_FLAG ) ) + IF ( GT_32( st_fx->core_brate, MINIMUM_RATE_TO_ENCODE_VOICING_FLAG ) ) { hHQ_core->HqVoicing = 1; move16(); @@ -865,7 +865,7 @@ void ivas_hq_core_dec_fx( } ELSE { - ener_match = div_s( st_fx->bws_cnt1, N_NS2W_FRAMES ); /*Q15*/ + ener_match = imult1616( st_fx->bws_cnt1, ONE_BY_N_NS2W_FRAMES_Q15 ); /*Q15*/ } IF( is_transient ) diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 1d3614c37..3124f80a5 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -115,7 +115,7 @@ static void ivas_param_ism_dec_dequant_powrat_fx( { FOR( slot_idx = 0; slot_idx < hParamIsm->nblocks[band_idx]; slot_idx++ ) { - hParamIsmDec->power_ratios_fx[band_idx][slot_idx][0] = add( shr( div_s( ( hParamIsm->power_ratios_idx[band_idx][slot_idx] ), ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 ) ), 1 ), 16384 ); + hParamIsmDec->power_ratios_fx[band_idx][slot_idx][0] = add( shr( imult1616( hParamIsm->power_ratios_idx[band_idx][slot_idx], 4681 /* ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 ) in Q15 */ ), 1 ), 16384 ); /* Q15 */ move16(); hParamIsmDec->power_ratios_fx[band_idx][slot_idx][1] = sub( 32767, hParamIsmDec->power_ratios_fx[band_idx][slot_idx][0] ); move16(); @@ -978,7 +978,7 @@ ivas_error ivas_param_ism_dec_open_fx( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { - Word16 i, scale, tmp; + Word16 i; PARAM_ISM_DEC_HANDLE hParamIsmDec; IVAS_OUTPUT_SETUP hOutSetup; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; @@ -1025,8 +1025,9 @@ ivas_error ivas_param_ism_dec_open_fx( * set input parameters *-----------------------------------------------------------------*/ - tmp = BASOP_Util_Divide3232_Scale( output_Fs, CLDFB_BANDWIDTH, &scale ); // FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); - hSpatParamRendCom->slot_size = shr( tmp, 15 - scale ); + /* hSpatParamRendCom->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); */ + hSpatParamRendCom->slot_size = extract_l( L_shr( Mpy_32_32( output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ), 4 ) ); + move16(); set_s( hSpatParamRendCom->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); set_s( hSpatParamRendCom->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); hSpatParamRendCom->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; @@ -1034,10 +1035,10 @@ ivas_error ivas_param_ism_dec_open_fx( move16(); hSpatParamRendCom->slots_rendered = 0; move16(); - hSpatParamRendCom->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; - tmp = BASOP_Util_Divide3232_Scale( output_Fs, CLDFB_BANDWIDTH, &scale ); - hSpatParamRendCom->num_freq_bands = shr( tmp, 15 - scale ); + /* hSpatParamRendCom->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); */ + hSpatParamRendCom->num_freq_bands = extract_l( Mpy_32_32( output_Fs, 2684355 /* INV_CLDFB_BANDWIDTH in Q31 */ ) ); + move16(); hParamIsmDec->hParamIsm->nbands = MAX_PARAM_ISM_NBANDS; diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 2aae1ebfd..85963d371 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -5465,8 +5465,8 @@ ivas_error ivas_jbm_dec_tc_buffer_open_fx( } ELSE { - tmp = BASOP_Util_Divide3232_Scale( st_ivas->hDecoderConfig->output_Fs, FRAMES_PER_SEC, &tmp_e ); - n_samp_full = shr( tmp, sub( 15, tmp_e ) ); // Q0 + /* n_samp_full = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); */ + n_samp_full = extract_l( Mpy_32_32( st_ivas->hDecoderConfig->output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); n_samp_residual = 0; move16(); } @@ -5936,19 +5936,18 @@ void ivas_jbm_dec_td_renderers_adapt_subframes( Word16 nMaxSlotsPerSubframe, nSlotsAvailable, tmp, exp, tmp1, tmp2, s1, s2; UWord16 nSlotsInLastSubframe, nSlotsInFirstSubframe; - // nMaxSlotsPerSubframe = (Word16) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity; - tmp = BASOP_Util_Divide3216_Scale( st_ivas->hDecoderConfig->output_Fs, FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES, &exp ); - tmp = shr( tmp, -1 - exp ); + /* nMaxSlotsPerSubframe = (Word16) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity; */ + tmp = extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, 10737418 /* 1 / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) in Q31 */ ) ); tmp = BASOP_Util_Divide1616_Scale( tmp, st_ivas->hTcBuffer->n_samples_granularity, &exp ); nMaxSlotsPerSubframe = shr( tmp, ( 15 - exp ) ); - // nSlotsAvailable = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; + /* nSlotsAvailable = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; */ tmp = BASOP_Util_Divide1616_Scale( st_ivas->hTcBuffer->n_samples_available, st_ivas->hTcBuffer->n_samples_granularity, &exp ); nSlotsAvailable = shr( tmp, ( 15 - exp ) ); st_ivas->hTcBuffer->num_slots = nSlotsAvailable; move16(); - // st_ivas->hTcBuffer->n_samples_available = nSlotsAvailable * st_ivas->hTcBuffer->n_samples_granularity; + /* st_ivas->hTcBuffer->n_samples_available = nSlotsAvailable * st_ivas->hTcBuffer->n_samples_granularity; */ st_ivas->hTcBuffer->n_samples_available = i_mult( nSlotsAvailable, st_ivas->hTcBuffer->n_samples_granularity ); nSlotsInFirstSubframe = sub( nMaxSlotsPerSubframe, st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1] ); st_ivas->hTcBuffer->nb_subframes = 0; diff --git a/lib_dec/ivas_lfe_plc_fx.c b/lib_dec/ivas_lfe_plc_fx.c index 7c1d59d5d..25a3444ec 100644 --- a/lib_dec/ivas_lfe_plc_fx.c +++ b/lib_dec/ivas_lfe_plc_fx.c @@ -930,7 +930,7 @@ void ivas_lfe_tdplc_fx( const Word32 *pWindow_coeffs_fx; Word32 output_Fs; Word16 i, fade_len, full_len, dct_len, zero_pad_len, plc_fdel, rec_frame_len; - Word16 fdel_dsf_ratio, prevsynth_q_fx, rec_frame_q, temp, temp_q, idx, exp; + Word16 prevsynth_q_fx, rec_frame_q, temp_q, idx, exp; output_Fs = L_mult0( output_frame, FRAMES_PER_SEC ); fade_len = hLFE->pWindow_state->fade_len; @@ -943,11 +943,10 @@ void ivas_lfe_tdplc_fx( move16(); pWindow_coeffs_fx = hLFE->pWindow_state->pWindow_coeffs_fx; - temp = BASOP_Util_Divide3232_Scale( Mpy_32_32( L_shl( LFE_PLC_FDEL, 22 ), L_shl( output_Fs, 9 ) ), 48000, &temp_q ); - plc_fdel = shr( temp, sub( 15, temp_q ) ); - - temp = BASOP_Util_Divide3232_Scale( output_Fs, 48000, &temp_q ); - rec_frame_len = shl( mult( LFE_PLC_RECLEN_48K, temp ), temp_q ); + /* plc_fdel = (int16_t) ( LFE_PLC_FDEL * output_Fs / 48000 ); */ + plc_fdel = extract_l( Mpy_32_32( output_Fs, 13421773 /* ( LFE_PLC_FDEL / 48000 ) in Q31 */ ) ); + /* rec_frame_len = (int16_t) ( LFE_PLC_RECLEN_48K * output_Fs / 48000 ); */ + rec_frame_len = extract_l( Mpy_32_32_r( output_Fs, 77846282 /* LFE_PLC_RECLEN_48K / 48000 in Q31 */ ) ); Copy32( prevsynth, prevsynth_fx, LFE_PLC_BUFLEN ); exp = L_norm_arr( prevsynth_fx, LFE_PLC_BUFLEN ); @@ -957,8 +956,7 @@ void ivas_lfe_tdplc_fx( recover_samples_fx( hLFE->bfi_count, prevsynth_fx, prevsynth_q_fx, rec_frame_fx, &rec_frame_q ); - fdel_dsf_ratio = shl( div_l( LFE_PLC_FDEL, LFE_PLC_DSF ), 1 ); - set_s( mem_fx, 0, shl( fdel_dsf_ratio, 1 ) ); + set16_fx( mem_fx, 0, 2 * LFE_PLC_FDEL / LFE_PLC_DSF ); Copy_Scale_sig_32_16( prevsynth_fx, prevsynth_16_fx, LFE_PLC_BUFLEN, -16 ); // Q5 = Q21 - Q16 Copy_Scale_sig_32_16( rec_frame_fx, rec_frame_16_fx, LFE_PLC_RECLEN, 0 ); // Q5 diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index a6f797e0a..9dff654ad 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -606,7 +606,7 @@ ivas_error ivas_masa_decode_fx( ivas_error error; Word16 obj; Word16 i, ch, ism_imp; - Word16 dirac_bs_md_write_idx; + Word16 dirac_bs_md_write_idx, tmp; Word32 masa_total_brate; dirac_bs_md_write_idx = 0; @@ -653,10 +653,8 @@ ivas_error ivas_masa_decode_fx( next_bit_pos_orig = st->next_bit_pos; move16(); - Word16 tmp, tmp_e; - tmp = BASOP_Util_Divide3232_Scale( masa_brate, FRAMES_PER_SEC, &tmp_e ); - tmp = shr( tmp, sub( 15, tmp_e ) ); - assert( masa_brate / FRAMES_PER_SEC == tmp ); + /* masa_brate / FRAMES_PER_SEC */ + tmp = extract_l( Mpy_32_32( masa_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); IF( EQ_32( masa_brate, IVAS_SID_5k2 ) ) { @@ -2312,12 +2310,11 @@ static ivas_error init_lfe_synth_data_fx( Word16 bufferSize; Word16 i; Word16 slot_size; - Word16 tmp, tmp_e; /* Ring buffer for the filterbank of the LFE synthesis. * The filterbank is using moving average lowpass filter with the crossover of 120 Hz. */ - tmp = BASOP_Util_Divide3232_Scale( output_Fs, FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES, &tmp_e ); - bufferSize = shr( tmp, sub( 15, tmp_e ) ); // Q0 + /* bufferSize = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES ); */ + bufferSize = extract_l( Mpy_32_32_r( output_Fs, 10737418 /* 1 / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) in Q31 */ ) ); IF( ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer_fx = (Word32 *) malloc( bufferSize * sizeof( Word32 ) ) ) == NULL ) { @@ -2376,8 +2373,8 @@ static ivas_error init_lfe_synth_data_fx( hMasa->hMasaLfeSynth->transportGainPrev_fx = MAX_WORD16; move16(); - tmp = BASOP_Util_Divide3232_Scale( output_Fs, FRAMES_PER_SEC * CLDFB_NO_COL_MAX, &tmp_e ); - slot_size = shr( tmp, sub( 15, tmp_e ) ); // Q0 + /* slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); */ + slot_size = extract_l( Mpy_32_32( output_Fs, 2684355 /* 1 / ( FRAMES_PER_SEC * CLDFB_NO_COL_MAX ) */ ) ); FOR( i = 0; i < slot_size; i++ ) { @@ -3042,8 +3039,7 @@ ivas_error ivas_masa_dec_reconfigure_fx( sts[0]->bit_stream = bit_stream + num_bits; // num_bits += (int16_t)(st_ivas->hSCE[sce_id]->element_brate / FRAMES_PER_SEC); - tmp = BASOP_Util_Divide3216_Scale( st_ivas->hSCE[sce_id]->element_brate, FRAMES_PER_SEC, &tmp_e ); - tmp = shr( tmp, negate( add( 1, tmp_e ) ) ); + tmp = extract_l( Mpy_32_32( st_ivas->hSCE[sce_id]->element_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); num_bits = add( num_bits, tmp ); test(); @@ -3086,8 +3082,7 @@ ivas_error ivas_masa_dec_reconfigure_fx( sts[0]->bit_stream = bit_stream + num_bits; // num_bits += (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC ); - tmp = BASOP_Util_Divide3216_Scale( st_ivas->hCPE[cpe_id]->element_brate, FRAMES_PER_SEC, &tmp_e ); - tmp = shr( tmp, negate( add( 1, tmp_e ) ) ); + tmp = extract_l( Mpy_32_32( st_ivas->hCPE[cpe_id]->element_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); num_bits = add( num_bits, tmp ); test(); diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 235543277..b8c544a57 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1059,8 +1059,8 @@ ivas_error mct_dec_reconfigure_fx( IF( NE_32( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { - tmp = BASOP_Util_Divide3232_Scale( st_ivas->hCPE[cpe_id]->element_brate, FRAMES_PER_SEC, &tmp_exp ); - st->bits_frame_nominal = shr( tmp, sub( 15, tmp_exp ) ); + /* st->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC ); */ + st->bits_frame_nominal = extract_l( Mpy_32_32( st_ivas->hCPE[cpe_id]->element_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); move16(); st->igf = getIgfPresent_fx( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_flag ); // no floating point so directly pluggable move16(); @@ -1074,8 +1074,8 @@ ivas_error mct_dec_reconfigure_fx( } /*Initialize MCT block data */ - tmp = BASOP_Util_Divide1616_Scale( hMCT->nchan_out_woLFE, CPE_CHANNELS, &tmp_exp ); - max_blocks = shr( tmp, sub( 15, tmp_exp ) ); + /* max_blocks = hMCT->nchan_out_woLFE / 2; */ + max_blocks = shr( hMCT->nchan_out_woLFE, 1 ); FOR( n = 0; n < max_blocks; n++ ) { diff --git a/lib_dec/ivas_mct_dec_mct_fx.c b/lib_dec/ivas_mct_dec_mct_fx.c index 9c3dced33..83c66b62e 100644 --- a/lib_dec/ivas_mct_dec_mct_fx.c +++ b/lib_dec/ivas_mct_dec_mct_fx.c @@ -197,8 +197,8 @@ static void applyGlobalILD_fx( { IF( hMCT->lowE_ch[ch] ) { - tmp = BASOP_Util_Divide3216_Scale( L_shl( hMCT->mc_global_ild[ch], Q26 ), SMDCT_ILD_RANGE, &tmp_e ); // Q26 - qratio = L_shr( (Word32) tmp, negate( add( 1, tmp_e ) ) ); + /* qratio = (float) hMCT->mc_global_ild[ch] / SMDCT_ILD_RANGE; */ + qratio = L_shl( hMCT->mc_global_ild[ch], Q26 - SMDCT_GLOBAL_ILD_BITS ); /* Q26 */ } ELSE { diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index d239baccc..01a1e4554 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -951,8 +951,8 @@ void ivas_set_surplus_brate_dec( ism_total_brate_ref = L_add( ism_total_brate_ref, st_ivas->hSCE[n]->element_brate ); } - bits_ism = BASOP_Util_Divide3216_Scale( ism_total_brate_ref, FRAMES_PER_SEC, &tmp ); - bits_ism = shr( bits_ism, negate( add( tmp, 1 ) ) ); // bring down to Q0. + /* bits_ism = (int16_t) ( ism_total_brate_ref / FRAMES_PER_SEC ); */ + bits_ism = extract_l( Mpy_32_32( ism_total_brate_ref, ONE_BY_FRAMES_PER_SEC_Q31 ) ); tmp = 0; move16(); diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 5dda982b8..2d985870b 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -1743,10 +1743,10 @@ void ivas_sba_dec_digest_tc_fx( Word32 *decorr_signal[BINAURAL_CHANNELS]; Word32 *p_tc[2 * BINAURAL_CHANNELS]; Word16 q_format = 14; - Word16 exp = 0; move16(); - default_frame = BASOP_Util_Divide3232_Scale( st_ivas->hDecoderConfig->output_Fs, FRAMES_PER_SEC, &exp ); - default_frame = shr( default_frame, sub( Q15, exp ) ); + + /* default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); */ + default_frame = extract_l( Mpy_32_32( st_ivas->hDecoderConfig->output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); nSamplesLeftForTD = nSamplesForRendering; move16(); diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 44a771249..0bc16f201 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -55,7 +55,7 @@ /* PLC constants */ static const int16_t ivas_spar_dec_plc_num_frames_keep = 9; -static const int16_t ivas_spar_dec_plc_num_frames_fade_out = 9; +// static const int16_t ivas_spar_dec_plc_num_frames_fade_out = 9; static const int16_t ivas_spar_dec_plc_per_frame_ramp_down_gain_dB = 3; static const int16_t ivas_spar_dec_plc_max_num_frames_ramp_down = 33; static const int16_t ivas_spar_dec_plc_spatial_target[IVAS_SPAR_MAX_CH] = { 1, 0, 0, 0, 0, 0, 0, 0 }; @@ -1752,10 +1752,9 @@ void ivas_spar_smooth_md_dtx_fx( Word16 j, k, b, dmx_ch; Word16 ramp_fx; Word32 tar_fx, prev_fx, new_val_fx; - Word16 tmp, tmp_e; - tmp = BASOP_Util_Divide1616_Scale( hMdDec->dtx_md_smoothing_cntr, IVAS_DEFAULT_DTX_CNG_RAMP, &tmp_e ); - ramp_fx = shl_sat( tmp, tmp_e ); /* Q15 */ + /* ramp = (float)hMdDec->dtx_md_smoothing_cntr / IVAS_DEFAULT_DTX_CNG_RAMP; */ + ramp_fx = i_mult_sat( hMdDec->dtx_md_smoothing_cntr, 4096 /* 1 / IVAS_DEFAULT_DTX_CNG_RAMP in Q15 */ ); /* Q15 */ FOR( b = 0; b < num_bands_out; b++ ) { @@ -4121,8 +4120,8 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix_fx( Q_gain = sub( 31, exp_gain ); FOR( i = 0; i < IVAS_SPAR_MAX_CH; i++ ) { - post_matrix_fx[i] = add( shl( 1, norm_nff ), mult( s_min( mult( shl( num_fade_frames, norm_nff ), div_s( 1, ivas_spar_dec_plc_num_frames_fade_out ) ), shl( 1, norm_nff ) ), shl( sub( ivas_spar_dec_plc_spatial_target[i], 1 ), 15 ) ) ); /*Q=norm_nff*/ - post_matrix_fx[i] = Mult_32_16( gain_fx, (Word16) post_matrix_fx[i] ); /*Q_gain+norm_nff-15*/ + post_matrix_fx[i] = add( shl( 1, norm_nff ), mult( s_min( mult( shl( num_fade_frames, norm_nff ), 3640 /* 1 / ivas_spar_dec_plc_num_frames_fade_out in Q15 */ ), shl( 1, norm_nff ) ), shl( sub( ivas_spar_dec_plc_spatial_target[i], 1 ), 15 ) ) ); /*Q=norm_nff*/ + post_matrix_fx[i] = Mult_32_16( gain_fx, (Word16) post_matrix_fx[i] ); /*Q_gain+norm_nff-15*/ } Q_post_matrix = sub( add( Q_gain, norm_nff ), 15 ); /* apply the post matrix */ diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 2238d768f..f319c2703 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -1273,13 +1273,8 @@ void stereo_dft_dec_res_fx( } ELSE { - Word16 q_div; /* For first good frame, ola memory contains extended ECU buffer -- need to crossfade instead of OLA */ - step = BASOP_Util_Divide3232_Scale( 1, STEREO_DFT_OVL_8k, &q_div ); - IF( NE_16( q_div, 0 ) ) - { - step = shl( step, q_div ); - } + step = 468; /* 1 / STEREO_DFT_OVL_8k in Q15 */ fac = 0; move16(); FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ ) @@ -3353,11 +3348,11 @@ void stereo_dft_dec_read_BS_fx( /* read number of bands in the bitstream - depends on the audio bandwidth and not to output_Fs */ IF( hStereoDft->frame_sid ) { - NFFT_inner = mult_r( inner_frame_tbl[bwidth], divide1616( STEREO_DFT32MS_N_MAX, L_FRAME48k ) ); + NFFT_inner = imult1616( inner_frame_tbl[bwidth], STEREO_DFT32MS_N_MAX / L_FRAME48k ); } ELSE { - NFFT_inner = mult_r( inner_frame_tbl[st->bwidth], divide1616( STEREO_DFT32MS_N_MAX, L_FRAME48k ) ); + NFFT_inner = imult1616( inner_frame_tbl[st->bwidth], STEREO_DFT32MS_N_MAX / L_FRAME48k ); } /* Use coarse band partition in inactive frames */ diff --git a/lib_dec/ivas_stereo_switching_dec.c b/lib_dec/ivas_stereo_switching_dec.c index f3253d728..514d5c520 100644 --- a/lib_dec/ivas_stereo_switching_dec.c +++ b/lib_dec/ivas_stereo_switching_dec.c @@ -579,7 +579,7 @@ static void cpy_tcx_ltp_data_fx( const int32_t output_Fs /* i : output sampling rate */ ) { - Word16 sz, e; + Word16 sz; hTcxLtpDecNew->tcxltp_pitch_int_post_prev = hTcxLtpDecOld->tcxltp_pitch_int_post_prev; move16(); hTcxLtpDecNew->tcxltp_pitch_fr_post_prev = hTcxLtpDecOld->tcxltp_pitch_fr_post_prev; @@ -588,12 +588,12 @@ static void cpy_tcx_ltp_data_fx( move16(); hTcxLtpDecNew->tcxltp_filt_idx_prev = hTcxLtpDecOld->tcxltp_filt_idx_prev; move16(); - sz = BASOP_Util_Divide3232_Scale( TCXLTP_MAX_DELAY * output_Fs, 48000, &e ); - sz = shr( sz, sub( 15, e ) ); + /* (int16_t) ( ( TCXLTP_MAX_DELAY * output_Fs ) / 48000 ) */ + sz = extract_l( Mpy_32_32_r( TCXLTP_MAX_DELAY * output_Fs, 44739 /* 1 / 48000 in Q31 */ ) ); mvs2s( hTcxLtpDecOld->tcxltp_mem_in, hTcxLtpDecNew->tcxltp_mem_in, sz ); // TODO: One of these will be removed later mvl2l( hTcxLtpDecOld->tcxltp_mem_in_32, hTcxLtpDecNew->tcxltp_mem_in_32, sz ); - sz = BASOP_Util_Divide3232_Scale( ( L_FRAME48k * output_Fs ), 48000, &e ); - sz = shr( sz, sub( 15, e ) ); + /* (int16_t) ( ( L_FRAME48k * output_Fs ) / 48000 ) */ + sz = extract_l( Mpy_32_32_r( L_FRAME48k * output_Fs, 44739 /* 1 / 48000 in Q31 */ ) ); mvs2s( hTcxLtpDecOld->tcxltp_mem_out, hTcxLtpDecNew->tcxltp_mem_out, sz ); // TODO: One of these will be removed later mvl2l( hTcxLtpDecOld->tcxltp_mem_out_32, hTcxLtpDecNew->tcxltp_mem_out_32, sz ); diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index c76392ff9..c5d5a39a5 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -1131,8 +1131,8 @@ ivas_error init_encoder_ivas_fx( st->input_buff_fx = st->hSignalBuf->input_buff; set16_fx( st->input_buff_fx, 0, add( L_FRAME48k, add( L_FRAME48k, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ) ) ); st->old_input_signal_fx = st->input_buff_fx; - Word16 temp; - Word16 frame_length = BASOP_Util_Divide3232_Scale( st->input_Fs, FRAMES_PER_SEC, &temp ); + /* st->input_Fs / FRAMES_PER_SEC */ + Word16 frame_length = extract_l( Mpy_32_32( st->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); IF( EQ_16( st->element_mode, EVS_MONO ) ) { @@ -1694,9 +1694,8 @@ ivas_error init_encoder_ivas_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Transient Detection\n" ) ); } - Word16 temp; - Word16 frame_length = BASOP_Util_Divide3232_Scale( st->input_Fs, FRAMES_PER_SEC, &temp ); - frame_length = shr( frame_length, sub( 15, temp ) ); + /* (int16_t) ( st->input_Fs / FRAMES_PER_SEC ) */ + Word16 frame_length = extract_l( Mpy_32_32( st->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); IF( GT_16( st->element_mode, EVS_MONO ) ) { diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index 25f6959b7..2dc9d607c 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -865,7 +865,7 @@ static void calculate_energy_buffer_fx( Word16 temp_q2 = norm_s( hCPE->hStereoDft->NFFT ); band_res_dft_fx = div_l( L_shl( input_Fs, temp_q1 ), shl( hCPE->hStereoDft->NFFT, temp_q2 ) ); - chan_width_f_fx = div_l( 24000, CLDFB_NO_CHANNELS_MAX ); + chan_width_f_fx = 24000 / CLDFB_NO_CHANNELS_MAX; chan_width_bins_fx = L_shl( (Word32) div_s( chan_width_f_fx, band_res_dft_fx ), ( sub( add( temp_q1, 1 ), temp_q2 ) ) ); // Q16 pDFT_DMX_fx = hCPE->hStereoDft->DFT_fx[0]; @@ -928,7 +928,7 @@ static void calculate_energy_buffer( Word16 temp_q2 = norm_s( hCPE->hStereoDft->NFFT ); band_res_dft_fx = div_l( L_shl( input_Fs, temp_q1 ), shl( hCPE->hStereoDft->NFFT, temp_q2 ) ); - chan_width_f_fx = div_l( 24000, CLDFB_NO_CHANNELS_MAX ); + chan_width_f_fx = 24000 / CLDFB_NO_CHANNELS_MAX; chan_width_bins_fx = L_shl( (Word32) div_s( chan_width_f_fx, band_res_dft_fx ), ( sub( add( temp_q1, 1 ), temp_q2 ) ) ); // Q16 pDFT_DMX = hCPE->hStereoDft->DFT[0]; // to be removed diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index 2d48fa86d..aebe83ca1 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -458,8 +458,8 @@ static void stereo_dft_enc_open_fx( Word16 win[STEREO_DFT_OVL_MAX]; /*Sizes*/ - Word16 div_e; - Word16 input_Fs_48k = BASOP_Util_Divide3232_Scale( input_Fs, 48000, &div_e ); + /* input_Fs / 48000 */ + Word16 input_Fs_48k = extract_l( Mpy_32_32( input_Fs, 44739 /* 1 / 48000 in Q31 */ ) ); // input_Fs_48k = shr(input_Fs_48k, sub(15, div_e)); @@ -475,8 +475,8 @@ static void stereo_dft_enc_open_fx( win[STEREO_DFT_OVL_MAX - 1 - i] = win_p[i].v.re; win[i] = win_p[i].v.im; } - hStereoDft->win_ana_energy_fx = sub( hStereoDft->N, hStereoDft->dft_ovl ); // e = div_e - hStereoDft->win_ana_energy_fx = shr( hStereoDft->win_ana_energy_fx, sub( 15, div_e ) ); // Q = 15 + hStereoDft->win_ana_energy_fx = sub( hStereoDft->N, hStereoDft->dft_ovl ); // e = div_e + hStereoDft->win_ana_energy_fx = shr( hStereoDft->win_ana_energy_fx, 15 ); // Q = 15 hStereoDft->win_ana_energy_fx = add( hStereoDft->win_ana_energy_fx, shl( sum_s( win, hStereoDft->dft_ovl ), 1 ) ); // Q = 15 hStereoDft->win_ana_energy_fx = shr( hStereoDft->win_ana_energy_fx, 15 ); @@ -534,11 +534,8 @@ static void stereo_dft_enc_open_fx( set_zero_fx( hStereoDft->output_mem_res_8k_fx, STEREO_DFT_OVL_8k ); /*Bands: find the number of bands, Nyquist freq. is not taken into account*/ - - Word16 inner_frame_tbl_L_frame = BASOP_Util_Divide1616_Scale( inner_frame_tbl[max_bwidth], L_FRAME48k, &div_e ); - inner_frame_tbl_L_frame = shr( inner_frame_tbl_L_frame, sub( 15, div_e ) ); - - NFFT_inner = i_mult( STEREO_DFT_N_MAX_ENC, inner_frame_tbl_L_frame ); + /* NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[max_bwidth] / L_FRAME48k; */ + NFFT_inner = imult1616( inner_frame_tbl[max_bwidth], STEREO_DFT_N_MAX_ENC / L_FRAME48k ); hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->hConfig->band_res, NFFT_inner, ENC ); hStereoDft->nbands_dmx = stereo_dft_band_config_fx( hStereoDft->band_limits_dmx, 1, NFFT_inner, ENC ); diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc.c b/lib_enc/ivas_stereo_mdct_stereo_enc.c index 62206ccc3..1c6aa5e86 100644 --- a/lib_enc/ivas_stereo_mdct_stereo_enc.c +++ b/lib_enc/ivas_stereo_mdct_stereo_enc.c @@ -115,9 +115,8 @@ static void dft_ana_init_fx( ) { Word16 div1; - Word16 div_e; - div1 = BASOP_Util_Divide3232_Scale( input_Fs, 48000, &div_e ); - div1 = shr( div1, sub( 15, div_e ) ); + /* input_Fs / 48000 */ + div1 = extract_l( Mpy_32_32_r( input_Fs, 44739 /* 1 / 48000 in Q31 */ ) ); hDft_ana->N = i_mult( STEREO_DFT_HOP_MAX_ENC, div1 ); hDft_ana->NFFT = i_mult( STEREO_DFT_N_MAX_ENC, div1 ); diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 3f345bc5f..c50a45f7b 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -3086,7 +3086,7 @@ static ivas_error ivas_rend_crendConvolver( Word16 subframe_length, idx_in; Word16 lfe_idx_in; Word16 offset, offset_in, offset_diffuse; - Word16 nchan_in, nchan_out, scale; + Word16 nchan_in, nchan_out; const Word32 *pIn; Word32 *pFreq_buf_re, *pFreq_buf_im; const Word32 *pFreq_filt_re, *pFreq_filt_im; @@ -3109,8 +3109,8 @@ static ivas_error ivas_rend_crendConvolver( return error; } - subframe_length = (Word16) BASOP_Util_Divide3232_Scale( output_Fs, FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES, &scale ); - subframe_length = shr( subframe_length, 15 - scale ); + /* subframe_length = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES; */ + subframe_length = extract_l( Mpy_32_32_r( output_Fs, 10737418 /* 1 / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) in Q31 */ ) ); lfe_idx_in = -1; move16(); diff --git a/lib_rend/ivas_dirac_ana.c b/lib_rend/ivas_dirac_ana.c index 19cbbfe59..8e52a997a 100644 --- a/lib_rend/ivas_dirac_ana.c +++ b/lib_rend/ivas_dirac_ana.c @@ -477,10 +477,8 @@ static void ivas_dirac_param_est_ana_fx( Word16 exp = 0, exp_div = 0; // Word16 exp2; num_freq_bands = hDirAC->nbands; - Word16 tmp_e; - Word16 tmp = BASOP_Util_Divide3216_Scale( input_frame, CLDFB_NO_COL_MAX, &tmp_e ); - tmp = shr( tmp, negate( add( 1, tmp_e ) ) ); - l_ts = tmp; + /* l_ts = input_frame / CLDFB_NO_COL_MAX; */ + l_ts = shr( input_frame, 4 ); numAnalysisChannels = FOA_CHANNELS; move16(); move16(); diff --git a/lib_rend/ivas_dirac_output_synthesis_dec.c b/lib_rend/ivas_dirac_output_synthesis_dec.c index 8ae785ac5..f999f8919 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec.c @@ -137,6 +137,7 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( uint16_t num_diffuse_responses; Word16 tmp_fx; Word16 temp_alpha_synthesis_fx[CLDFB_NO_CHANNELS_MAX]; + Word16 interpolator_tbl[JBM_CLDFB_SLOTS_IN_SUBFRAME] = { 8192, 16384, 24576, MAX16B }; /* idx / JBM_CLDFB_SLOTS_IN_SUBFRAME Q15 */ /* pointers to structs for allocation */ DIRAC_OUTPUT_SYNTHESIS_PARAMS *dirac_output_synthesis_params = &( hDirACRend->h_output_synthesis_psd_params ); @@ -337,7 +338,8 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( /* compute interpolator */ FOR( idx = 1; idx <= JBM_CLDFB_SLOTS_IN_SUBFRAME; ++idx ) { - dirac_output_synthesis_params->interpolator_fx[idx - 1] = div_s( idx, JBM_CLDFB_SLOTS_IN_SUBFRAME ); + dirac_output_synthesis_params->interpolator_fx[idx - 1] = interpolator_tbl[idx - 1]; /* Q15 */ + move16(); } /* prepare diffuse response function */ diff --git a/lib_rend/ivas_dirac_rend.c b/lib_rend/ivas_dirac_rend.c index 6cb2491d7..eadb0f81d 100644 --- a/lib_rend/ivas_dirac_rend.c +++ b/lib_rend/ivas_dirac_rend.c @@ -361,21 +361,11 @@ ivas_error ivas_spat_hSpatParamRendCom_config_fx( *hSpatParamRendCom_out = hSpatParamRendCom; } - Word16 tmp1, tmp2, var1, var2; - - Word16 exp_tmp1 = 0; - move16(); - tmp1 = BASOP_Util_Divide3232_Scale( output_Fs, FRAMES_PER_SEC, &exp_tmp1 ); - Word16 exp_tmp2 = 0; - move16(); - tmp2 = BASOP_Util_Divide1616_Scale( tmp1, CLDFB_NO_COL_MAX, &exp_tmp2 ); - exp_tmp2 = add( exp_tmp2, sub( exp_tmp1, 15 ) ); - Word16 exp_tmp3 = 0; - move16(); - IF( EQ_32( flag_config, DIRAC_OPEN ) ) { - hSpatParamRendCom->slot_size = shr( tmp2, 15 - exp_tmp2 ); // exp_tmp2 + /* hSpatParamRendCom->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); */ + hSpatParamRendCom->slot_size = extract_l( Mpy_32_32( output_Fs, 2684355 /* 1 / ( FRAMES_PER_SEC * CLDFB_NO_COL_MAX) in Q31 */ ) ); + move16(); set16_fx( hSpatParamRendCom->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); set16_fx( hSpatParamRendCom->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); hSpatParamRendCom->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; @@ -385,9 +375,9 @@ ivas_error ivas_spat_hSpatParamRendCom_config_fx( hSpatParamRendCom->slots_rendered = 0; move16(); hSpatParamRendCom->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; - var1 = BASOP_Util_Divide3232_Scale( output_Fs, CLDFB_BANDWIDTH, &exp_tmp3 ); - var2 = shl( 1, sub( 15, add( exp_tmp3, 1 ) ) ); - hSpatParamRendCom->num_freq_bands = shr( add( var1, var2 ), sub( 15, exp_tmp3 ) ); + /* hSpatParamRendCom->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); */ + hSpatParamRendCom->num_freq_bands = extract_l( Mpy_32_32( output_Fs, 2684355 /* INV_CLDFB_BANDWIDTH in Q31 */ ) ); + move16(); hSpatParamRendCom->numSimultaneousDirections = 0; move16(); hSpatParamRendCom->numParametricDirections = 0; @@ -2949,15 +2939,15 @@ void protoSignalComputation2_fx( { IF( EQ_16( stereo_type_detect->type_change_direction, MASA_STEREO_SPACED_MICS ) ) { - interpolatorSpaced_fx = BASOP_Util_Divide1616_Scale( stereo_type_detect->interpolator, MASA_STEREO_INTERPOLATION_SLOTS, &exp ); - interpolatorSpaced_fx = shl( interpolatorSpaced_fx, exp ); // Q15 - interpolatorDmx_fx = sub( MAX16B, interpolatorSpaced_fx ); // Q15 + /* interpolatorSpaced = ( (float) ( stereo_type_detect->interpolator ) ) / ( (float) MASA_STEREO_INTERPOLATION_SLOTS ); */ + interpolatorSpaced_fx = i_mult_sat( stereo_type_detect->interpolator, 2048 /* 1 / MASA_STEREO_INTERPOLATION_SLOTS in Q15 */ ); /* Q15 */ + interpolatorDmx_fx = sub( MAX16B, interpolatorSpaced_fx ); /* Q15 */ } ELSE { - interpolatorDmx_fx = BASOP_Util_Divide1616_Scale( stereo_type_detect->interpolator, MASA_STEREO_INTERPOLATION_SLOTS, &exp ); - interpolatorDmx_fx = shl( interpolatorDmx_fx, exp ); // Q15 - interpolatorSpaced_fx = sub( MAX16B, interpolatorDmx_fx ); // Q15 + /* interpolatorDmx = ( (float) ( stereo_type_detect->interpolator ) ) / ( (float) MASA_STEREO_INTERPOLATION_SLOTS ); */ + interpolatorDmx_fx = i_mult_sat( stereo_type_detect->interpolator, 2048 /* 1 / MASA_STEREO_INTERPOLATION_SLOTS in Q15 */ ); /* Q15 */ + interpolatorSpaced_fx = sub( MAX16B, interpolatorDmx_fx ); /* Q15 */ } } @@ -4533,7 +4523,6 @@ void ivas_masa_stereotype_detection_fx( Word32 min_sum_temp_fx; Word32 lr_total_bb_temp_fx; Word32 lr_total_hi_temp_fx; - Word16 exp; Word32 temp; lr_total_bb_ratio_db_fx = stereo_type_detect->lr_total_bb_ratio_db_fx; @@ -4544,26 +4533,25 @@ void ivas_masa_stereotype_detection_fx( move32(); subtract_target_ratio_db_fx = stereo_type_detect->subtract_target_ratio_db_fx; move32(); - exp = 0; - move16(); /* Determine if the determined features match the spaced mic type */ change_to_spaced_selection = 0; move16(); IF( LT_32( subtract_target_ratio_db_fx, -THREE_Q21 ) ) { + /* subtract_temp = ( -subtract_target_ratio_db - 3.0f ) / 3.0f; */ temp = L_sub( L_shr( -subtract_target_ratio_db_fx, 1 ), L_shr( THREE_Q21, 1 ) ); - subtract_temp_fx = BASOP_Util_Divide3232_Scale( temp, THREE_Q21, &exp ); - subtract_temp_fx = L_shl( subtract_temp_fx, add( exp, 1 ) ); // Q15 + subtract_temp_fx = Mpy_32_32( temp, 715827883 /* 1 / 3.0f in Q31 */ ); + subtract_temp_fx = L_shl( subtract_temp_fx, 1 ); /* Q21 */ - min_sum_temp_fx = BASOP_Util_Divide3232_Scale( -min_sum_total_ratio_db_fx, SIX_Q21, &exp ); - min_sum_temp_fx = L_shl( min_sum_temp_fx, exp ); // Q15 + /* min_sum_temp = max( -min_sum_total_ratio_db / 6.0f, 0.0f ); */ + min_sum_temp_fx = Mpy_32_32_r( -min_sum_total_ratio_db_fx, 357913941 /* 1 / 6.0f in Q31 */ ); /* Q21 */ min_sum_temp_fx = L_max( min_sum_temp_fx, 0 ); - lr_total_bb_temp_fx = BASOP_Util_Divide3232_Scale( lr_total_bb_ratio_db_fx, SIX_Q21, &exp ); - lr_total_bb_temp_fx = L_shl( lr_total_bb_temp_fx, exp ); // Q15 + /* lr_total_bb_temp = lr_total_bb_ratio_db / 6.0f; */ + lr_total_bb_temp_fx = Mpy_32_32_r( lr_total_bb_ratio_db_fx, 357913941 /* 1 / 6.0f in Q31 */ ); /* Q21 */ - change_to_spaced_fx = L_add( L_add( subtract_temp_fx, min_sum_temp_fx ), lr_total_bb_temp_fx ); // Q15 + change_to_spaced_fx = L_add( L_add( subtract_temp_fx, min_sum_temp_fx ), lr_total_bb_temp_fx ); /* Q21 */ IF( GE_32( change_to_spaced_fx, ONE_IN_Q15 ) ) { @@ -4577,16 +4565,16 @@ void ivas_masa_stereotype_detection_fx( move16(); IF( GT_32( subtract_target_ratio_db_fx, 0 ) ) { - subtract_temp_fx = BASOP_Util_Divide3232_Scale( subtract_target_ratio_db_fx, THREE_Q21, &exp ); - subtract_temp_fx = L_shl( subtract_temp_fx, exp ); // Q15 + /* subtract_temp = subtract_target_ratio_db / 3.0f; */ + subtract_temp_fx = Mpy_32_32( subtract_target_ratio_db_fx, 715827883 /* 1 / 3.0f in Q31 */ ); /* Q21 */ - min_sum_temp_fx = BASOP_Util_Divide3232_Scale( L_add( min_sum_total_ratio_db_fx, ONE_IN_Q21 ), SIX_Q21, &exp ); - min_sum_temp_fx = L_shl( min_sum_temp_fx, exp ); // Q15 + /* min_sum_temp = ( min_sum_total_ratio_db + 1.0f ) / 6.0f; */ + min_sum_temp_fx = Mpy_32_32_r( L_add( min_sum_total_ratio_db_fx, ONE_IN_Q21 ), 357913941 /* 1 / 6.0f in Q31 */ ); /* Q21 */ - lr_total_bb_temp_fx = BASOP_Util_Divide3232_Scale( -lr_total_bb_ratio_db_fx, SIX_Q21, &exp ); - lr_total_bb_temp_fx = L_shl( lr_total_bb_temp_fx, exp ); // Q15 + /* lr_total_bb_temp = -lr_total_bb_ratio_db / 6.0f; */ + lr_total_bb_temp_fx = Mpy_32_32_r( -lr_total_bb_ratio_db_fx, 357913941 /* 1 / 6.0f in Q31 */ ); /* Q21 */ - change_to_downmix_fx = L_add( L_add( subtract_temp_fx, min_sum_temp_fx ), lr_total_bb_temp_fx ); // Q15 + change_to_downmix_fx = L_add( L_add( subtract_temp_fx, min_sum_temp_fx ), lr_total_bb_temp_fx ); /* Q21 */ IF( GE_32( change_to_downmix_fx, ONE_IN_Q15 ) ) { @@ -4598,15 +4586,14 @@ void ivas_masa_stereotype_detection_fx( /* Determine if the determined features match the downmix type, according to another metric */ IF( LT_32( lr_total_hi_ratio_db_fx, -25165824 ) ) // 25165824 = 12.0 in Q21 { - // 8388608 = 4.0 in Q21 - subtract_temp_fx = BASOP_Util_Divide3232_Scale( L_add( subtract_target_ratio_db_fx, 8388608 ), THREE_Q21, &exp ); - subtract_temp_fx = L_shl( subtract_temp_fx, exp ); // Q15 + /* subtract_temp = ( subtract_target_ratio_db + 4.0f ) / 3.0f; */ + subtract_temp_fx = Mpy_32_32( L_add( subtract_target_ratio_db_fx, 8388608 /* 4.0 in Q21 */ ), 715827883 /* 1 / 3.0f in Q31 */ ); - min_sum_temp_fx = BASOP_Util_Divide3232_Scale( min_sum_total_ratio_db_fx, THREE_Q21, &exp ); - min_sum_temp_fx = L_shl( min_sum_temp_fx, exp ); // Q15 + /* min_sum_temp = min_sum_total_ratio_db / 6.0f; */ + min_sum_temp_fx = Mpy_32_32_r( min_sum_total_ratio_db_fx, 357913941 /* 1 / 6.0f in Q31 */ ); - lr_total_hi_temp_fx = BASOP_Util_Divide3232_Scale( L_sub( -lr_total_hi_ratio_db_fx, 25165824 ), THREE_Q21, &exp ); // 25165824 = 12.0 in Q21 - lr_total_hi_temp_fx = L_shl( lr_total_hi_temp_fx, exp ); // Q15 + /* lr_total_hi_temp = ( -lr_total_hi_ratio_db - 12.0f ) / 3.0f; */ + lr_total_hi_temp_fx = Mpy_32_32( L_sub( -lr_total_hi_ratio_db_fx, 25165824 /* 12.0 in Q21 */ ), 715827883 /* 1 / 3.0f in Q31 */ ); change_to_downmix2_fx = L_add( L_add( subtract_temp_fx, min_sum_temp_fx ), lr_total_hi_temp_fx ); // Q15 diff --git a/lib_rend/ivas_efap.c b/lib_rend/ivas_efap.c index 37be6a48a..3632adde4 100644 --- a/lib_rend/ivas_efap.c +++ b/lib_rend/ivas_efap.c @@ -4453,24 +4453,9 @@ static void sph2cart_fx( ) { Word16 azi_temp, ele_temp; - IF( GE_32( azi, 0 ) ) - { - azi_temp = div_l( L_shr( azi, Q6 ), 360 ); - } - ELSE - { - azi_temp = div_l( L_negate( L_shr( azi, Q6 ) ), 360 ); - azi_temp = negate( azi_temp ); - } - IF( GE_32( ele, 0 ) ) - { - ele_temp = div_l( L_shr( ele, Q6 ), 360 ); - } - ELSE - { - ele_temp = div_l( L_negate( L_shr( ele, Q6 ) ), 360 ); - ele_temp = negate( ele_temp ); - } + + azi_temp = extract_l( L_shr( Mpy_32_32( azi, ONE_BY_360_Q31 ), Q7 ) ); /* Q15 */ + ele_temp = extract_l( L_shr( Mpy_32_32( ele, ONE_BY_360_Q31 ), Q7 ) ); /* Q15 */ pos[0] = Mpy_32_16( getCosWord16R2( azi_temp ), 0, getCosWord16R2( ele_temp ) ); pos[1] = Mpy_32_16( getSineWord16R2( azi_temp ), 0, getCosWord16R2( ele_temp ) ); diff --git a/lib_rend/ivas_limiter.c b/lib_rend/ivas_limiter.c index e7b2153dc..4d42d645c 100644 --- a/lib_rend/ivas_limiter.c +++ b/lib_rend/ivas_limiter.c @@ -350,8 +350,7 @@ static Word16 detect_strong_saturations_fx( { IF( LT_32( *frame_gain, 322122547 ) ) // Q30 of 0.3 is compared { - //*frame_gain /= 3.0f; - *frame_gain = L_shl( divide3216( *frame_gain, 24576 ), 14 ); // Q30 + *frame_gain = Mpy_32_16_1( *frame_gain, 10923 /* 1/3 in Q15 */ ); // Q30 } ELSE { @@ -421,7 +420,7 @@ ivas_error ivas_limiter_open( assert( 0 ); } - hLimiter->attack_constant_fx = attack_cnst_fx; + hLimiter->attack_constant_fx = attack_cnst_fx; /* Q31 */ hLimiter->strong_saturation_count = 0; for ( i = 0; i < max_num_channels; ++i ) @@ -650,7 +649,7 @@ void limiter_process_fx( output = hLimiter->channel_ptrs_fx; num_channels = hLimiter->num_channels; // sampling_rate = hLimiter->sampling_rate; - attack_constant = hLimiter->attack_constant_fx; + attack_constant = hLimiter->attack_constant_fx; /* Q31 */ /*-----------------------------------------------------------------* * Find highest absolute peak sample value *-----------------------------------------------------------------*/ diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index e244107e8..70a9cad10 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -1045,10 +1045,9 @@ ivas_error TDREND_Update_object_positions_fx( IF( hIsmMetaData[nS]->non_diegetic_flag ) { - Word16 tmp, tmp_e; Pos_fx[0] = 0; - tmp = BASOP_Util_Divide3232_Scale( hIsmMetaData[nS]->azimuth_fx, 377487360 /* 90.f in Q22 */, &tmp_e ); - Pos_fx[1] = shr( tmp, sub( 6, tmp_e ) ); // Q25 + /* Pos[1] = hIsmMetaData[nS]->azimuth / 90.f; */ + Pos_fx[1] = L_shl( Mpy_32_32_r( hIsmMetaData[nS]->azimuth_fx, 23860929 /* 1 / 90.f in Q31 */ ), Q3 ); /* Q25 */ Pos_fx[2] = 0; IF( ( error = TDREND_MIX_SRC_SetPos_fx( hBinRendererTd, nS, Pos_fx ) ) != IVAS_ERR_OK ) diff --git a/lib_rend/ivas_omasa_ana.c b/lib_rend/ivas_omasa_ana.c index b83e6cb5e..f5aa07318 100644 --- a/lib_rend/ivas_omasa_ana.c +++ b/lib_rend/ivas_omasa_ana.c @@ -124,8 +124,8 @@ ivas_error ivas_omasa_ana_open( /* Determine band grouping */ mvs2s( MASA_band_grouping_24, hOMasa->band_grouping, 24 + 1 ); - maxBin = (Word16) BASOP_Util_Divide3232_Scale( input_Fs, 800, &scale ); - maxBin = shr( maxBin, sub( 15, scale ) ); + /* maxBin = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); */ + maxBin = extract_l( Mpy_32_32( input_Fs, 2684355 /* INV_CLDFB_BANDWIDTH in Q31 */ ) ); FOR( i = 1; i < hOMasa->nbands + 1; i++ ) { @@ -193,10 +193,8 @@ ivas_error ivas_omasa_ana_open( set32_fx( hOMasa->prev_object_dm_gains_fx[i], INV_SQRT_2_Q31, MASA_MAX_TRANSPORT_CHANNELS ); } - input_frame = BASOP_Util_Divide3232_Scale( input_Fs, FRAMES_PER_SEC, &scale ); - input_frame = shr( input_frame, sub( 15, scale ) ); - - + /* input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); */ + input_frame = extract_l( Mpy_32_32( input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); FOR( i = 0; i < input_frame; i++ ) { hOMasa->interpolator_fx[i] = BASOP_Util_Divide1616_Scale( i, input_frame, &scale ); diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 6b7afe97f..35752d092 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -396,8 +396,8 @@ static void ivas_binaural_reverb_setReverbTimes_fx( Word32 binCenterFreq_fx, diffuseFieldICC_fx, tmpVal_fx, attenuationFactorPerSample_fx, L_tmp; Word32 intendedEnergy_fx, actualizedEnergy_fx, energyBuildup_fx, currentEnergy_fx, attenuationFactorPerSampleSq_fx; - Word16 tmp, tmp_exp, diffuseFieldICC_exp, scale, tmpVal_exp, attenuationFactorPerSample_exp, attenuationFactorPerSampleSq_exp, energyBuildup_exp, currentEnergy_exp, intendedEnergy_exp, actualizedEnergy_exp; - Word16 sine_inp, norm, sub_res, sub_exp, div_exp1, div1, sine, binCenterFreq_exp; + Word16 tmp, tmp_exp, scale, tmpVal_exp, attenuationFactorPerSample_exp, attenuationFactorPerSampleSq_exp, energyBuildup_exp, currentEnergy_exp, intendedEnergy_exp, actualizedEnergy_exp; + Word16 sine_inp, norm, div_exp1, div1, sine, binCenterFreq_exp; Word16 reverb_exp = 0; move16(); @@ -417,36 +417,34 @@ static void ivas_binaural_reverb_setReverbTimes_fx( binCenterFreq_fx = L_shr( L_tmp, 1 ); // divide by 2 IF( EQ_16( bin, 0 ) ) { - diffuseFieldICC_fx = 1073741824; // 2 ^ 30, Q30 + diffuseFieldICC_fx = ONE_IN_Q31; move32(); - diffuseFieldICC_exp = 1; - move16(); } ELSE IF( BASOP_Util_Cmp_Mant32Exp( binCenterFreq_fx, binCenterFreq_exp, 2700, 31 ) == -1 ) { - tmp = BASOP_Util_Divide3232_Scale( binCenterFreq_fx, 550, &scale ); - exp = add( scale, sub( binCenterFreq_exp, 31 ) ); + /* binCenterFreq / 550.0f */ + L_tmp = Mpy_32_32( binCenterFreq_fx, 3904516 /* 1 / 550 in Q31 */ ); + norm = norm_l( L_tmp ); + tmp = extract_h( L_shl( L_tmp, norm ) ); tmp = add( mult( EVS_PI_FX, tmp ), EPSILLON_FX ); // to avoid divide by 0 issue - tmp_exp = add( exp, 2 ); + tmp_exp = sub( add( binCenterFreq_exp, 2 ), norm ); sine_inp = wrap_rad_fixed( L_shl( tmp, sub( tmp_exp, 2 ) ) ); sine = getSinWord16( sine_inp ); // Q15 div1 = BASOP_Util_Divide1616_Scale( sine, tmp, &scale ); div_exp1 = add( scale, sub( 0, tmp_exp ) ); + div1 = shl( div1, div_exp1 ); /* Q15 */ - tmp = BASOP_Util_Divide3232_Scale( binCenterFreq_fx, 2700, &scale ); - scale = add( scale, sub( binCenterFreq_exp, 31 ) ); - - L_tmp = L_sub( L_shl( 1, sub( 15, scale ) ), tmp ); + /* binCenterFreq / 2700.0f */ + L_tmp = Mpy_32_32( binCenterFreq_fx, 795364 /* 1 / 2700 in Q31 */ ); norm = norm_l( L_tmp ); + L_tmp = L_shl( L_tmp, norm ); /* Q31 */ - L_tmp = L_shl( L_tmp, norm ); - sub_res = extract_h( L_tmp ); - sub_exp = sub( scale, sub( norm, 16 ) ); + /* ( 1.0f - binCenterFreq / 2700.0f ) */ + L_tmp = L_sub( ONE_IN_Q31, L_tmp ); /* Q31 */ - diffuseFieldICC_fx = L_deposit_h( mult( sub_res, div1 ) ); - diffuseFieldICC_exp = add( div_exp1, sub_exp ); + diffuseFieldICC_fx = Mpy_32_16_1( L_tmp, div1 ); /* Q31 */ hReverb->highestBinauralCoherenceBin = bin; move16(); @@ -456,18 +454,20 @@ static void ivas_binaural_reverb_setReverbTimes_fx( diffuseFieldICC_fx = 0; move32(); - diffuseFieldICC_exp = 0; - move16(); } /* Mixing gains to generate a diffuse-binaural sound based on incoherent sound */ - + /* tmpVal = ( 1.0f - sqrtf( 1.0f - powf( diffuseFieldICC, 2.0 ) ) ) / 2.0f; */ L_tmp = Mpy_32_32( diffuseFieldICC_fx, diffuseFieldICC_fx ); // square - L_tmp = BASOP_Util_Add_Mant32Exp( 1073741824, 1, L_negate( L_tmp ), diffuseFieldICC_exp + diffuseFieldICC_exp, &scale ); + L_tmp = L_sub( ONE_IN_Q31, L_tmp ); + scale = 0; L_tmp = Sqrt32( L_tmp, &scale ); - tmpVal_fx = L_shr( BASOP_Util_Add_Mant32Exp( 1073741824, 1, L_negate( L_tmp ), scale, &tmpVal_exp ), 1 ); + L_tmp = L_shl( L_tmp, scale ); /* Q31 */ + tmpVal_fx = L_shr( L_sub( ONE_IN_Q31, L_tmp ), 1 ); + tmpVal_exp = 0; + move16(); - IF( BASOP_Util_Cmp_Mant32Exp( diffuseFieldICC_fx, diffuseFieldICC_exp, 0, 0 ) == 1 ) + IF( diffuseFieldICC_fx > 0 ) { exp = tmpVal_exp; L_tmp = Sqrt32( L_abs( tmpVal_fx ), &exp ); @@ -480,12 +480,13 @@ static void ivas_binaural_reverb_setReverbTimes_fx( hReverb->binauralCoherenceCrossmixGains_fx[bin] = L_negate( L_shl( L_tmp, exp ) ); // Q31 } + /* hReverb->binauralCoherenceDirectGains[bin] = sqrtf( 1.0f - fabsf( tmpVal ) ); */ exp = tmpVal_exp; - L_tmp = BASOP_Util_Add_Mant32Exp( 1073741824, 1, L_negate( L_abs( tmpVal_fx ) ), tmpVal_exp, &exp ); + L_tmp = L_sub( ONE_IN_Q31, L_abs( tmpVal_fx ) ); L_tmp = Sqrt32( L_abs( L_tmp ), &exp ); hReverb->binauralCoherenceDirectGains_fx[bin] = L_shl( L_tmp, exp ); // making as Q31 - /* Determine attenuation factor that generates the appropriate energy decay according to reverberation time */ + /* Determine attenuation factor that generates the appropriate energy decay according to reverberation time */ L_tmp = Mpy_32_32( 1677721600, revTimes_fx[bin] ); // e10 --> 800 * 2^21, + e0 tmp = BASOP_Util_Divide3232_Scale( 1073741824, L_tmp, &scale ); scale = add( scale, sub( 1, 10 ) ); diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 0f452810b..5290f0abb 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -2056,8 +2056,6 @@ ivas_error ivas_combined_orientation_open( { Word16 i; Word16 j; - Word16 tmp_e = 0, tmp; - move16(); IVAS_QUATERNION identity; IVAS_VECTOR3 origo; identity.w_fx = ONE_IN_Q31; @@ -2153,10 +2151,9 @@ ivas_error ivas_combined_orientation_open( ( *hCombinedOrientationData )->subframe_idx = 0; move16(); - tmp = BASOP_Util_Divide3232_Scale( fs, MAX_PARAM_SPATIAL_SUB_FRAMES_PER_SEC, &tmp_e ); - ( *hCombinedOrientationData )->subframe_size = shr( tmp, sub( 15, tmp_e ) ); + /* ( *hCombinedOrientationData )->subframe_size = (int16_t) ( fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ); */ + ( *hCombinedOrientationData )->subframe_size = extract_l( Mpy_32_32_r( fs, 10737418 /* 1 / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) in Q31 */ ) ); move16(); - // ( *hCombinedOrientationData )->subframe_size = (int16_t) ( fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ); ( *hCombinedOrientationData )->cur_subframe_samples_rendered = 0; move16(); diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 87b4f6d36..a44a5077a 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -2249,11 +2249,11 @@ typedef struct Word32 **channel_ptrs_fx; Word32 sampling_rate; // float gain; - Word32 gain_fx; + Word32 gain_fx; /* Q30 */ // float release_heuristic; - Word32 release_heuristic_fx; + Word32 release_heuristic_fx; /* Q30 */ // float attack_constant; - Word32 attack_constant_fx; + Word32 attack_constant_fx; /* Q31 */ Word16 strong_saturation_count; } IVAS_LIMITER, *IVAS_LIMITER_HANDLE; diff --git a/lib_rend/ivas_vbap.c b/lib_rend/ivas_vbap.c index 7a51c4aa8..a69c70609 100644 --- a/lib_rend/ivas_vbap.c +++ b/lib_rend/ivas_vbap.c @@ -1645,15 +1645,8 @@ static enum VirtualSpeakerNodeType check_need_of_virtual_speaker_node_fx( IF( EQ_16( Flag1, (Word16) -1 ) ) { Word16 azi_temp; - IF( GE_32( speaker_node_azi_deg_fx[ch], 0 ) ) - { - azi_temp = div_l( L_shr( speaker_node_azi_deg_fx[ch], Q7 ), 180 ); - } - ELSE - { - azi_temp = div_l( L_negate( L_shr( speaker_node_azi_deg_fx[ch], Q7 ) ), 180 ); - azi_temp = negate( azi_temp ); - } + + azi_temp = extract_l( L_shr( Mpy_32_32( speaker_node_azi_deg_fx[ch], ONE_BY_180_Q31 ), Q8 ) ); /* Q15 */ Word16 cos_res = getCosWord16R2( azi_temp ); // Q15 @@ -1834,15 +1827,7 @@ static void init_speaker_node_direction_data_fx( speaker_node_data[ch].azi_deg_fx = speaker_node_azi_deg_fx[ch]; move32(); - IF( GE_32( speaker_node_azi_deg_fx[ch], 0 ) ) - { - azi_rad_fx = div_l( L_shr( speaker_node_azi_deg_fx[ch], Q7 ), 180 ); - } - ELSE - { - azi_rad_fx = div_l( L_negate( L_shr( speaker_node_azi_deg_fx[ch], Q7 ) ), 180 ); - azi_rad_fx = negate( azi_rad_fx ); - } + azi_rad_fx = extract_l( L_shr( Mpy_32_32( speaker_node_azi_deg_fx[ch], ONE_BY_180_Q31 ), Q8 ) ); test(); IF( GE_32( L_shr( speaker_node_ele_deg_fx[ch], 22 ), -5 ) && LE_32( L_shr( speaker_node_ele_deg_fx[ch], 22 ), 5 ) ) { @@ -1858,15 +1843,7 @@ static void init_speaker_node_direction_data_fx( { speaker_node_data[ch].ele_deg_fx = speaker_node_ele_deg_fx[ch]; move32(); - IF( GE_32( speaker_node_ele_deg_fx[ch], 0 ) ) - { - ele_rad_fx = div_l( L_shr( speaker_node_ele_deg_fx[ch], Q7 ), 180 ); - } - ELSE - { - ele_rad_fx = div_l( L_negate( L_shr( speaker_node_ele_deg_fx[ch], Q7 ) ), 180 ); - ele_rad_fx = negate( ele_rad_fx ); - } + ele_rad_fx = extract_l( L_shr( Mpy_32_32( speaker_node_ele_deg_fx[ch], ONE_BY_180_Q31 ), Q8 ) ); IF( LT_16( ele_rad_fx, 0 ) ) { diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index a29613c09..88706683c 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -174,7 +174,7 @@ typedef struct OMASA_ANA_HANDLE hOMasa; uint16_t total_num_objects; #ifdef IVAS_FLOAT_FIXED - Word32 ism_metadata_delay_ms_fx; + Word32 ism_metadata_delay_ms_fx; /* Q0 */ #else float ism_metadata_delay_ms; #endif @@ -8955,7 +8955,7 @@ static ivas_error renderIsmToBinaural( Word16 exp = *outAudio.pq_fact; push_wmops( "renderIsmToBinaural" ); /* Metadata Delay to sync with audio delay converted from ms to 5ms (1000/50/4) subframe index */ - ism_md_subframe_update_ext = div_l( ismInput->ism_metadata_delay_ms_fx, ( 1000 / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ) ); + ism_md_subframe_update_ext = extract_l( Mpy_32_32( ismInput->ism_metadata_delay_ms_fx, 429496730 /* 1000 / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES in Q31 */ ) ); copyBufferTo2dArray_fx( ismInput->base.inputBuffer, tmpTDRendBuffer ); FOR( i = 0; i < MAX_OUTPUT_CHANNELS; ++i ) @@ -9412,7 +9412,7 @@ static ivas_error renderIsmToBinauralReverb( push_wmops( "renderIsmToBinauralRoom" ); /* Metadata Delay to sync with audio delay converted from ms to 5ms (1000/50/4) subframe index */ - ism_md_subframe_update_ext = div_l( ismInput->ism_metadata_delay_ms_fx, ( 1000 / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ) ); + ism_md_subframe_update_ext = extract_l( Mpy_32_32( ismInput->ism_metadata_delay_ms_fx, 429496730 /* 1000 / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES in Q31 */ ) ); copyBufferTo2dArray_fx( ismInput->base.inputBuffer, tmpRendBuffer_fx ); FOR( i = 0; i < MAX_OUTPUT_CHANNELS; ++i ) -- GitLab From 44acc3d27f5d76d7e47ccaef01910619b78d0313 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 28 Jun 2024 12:19:29 +0530 Subject: [PATCH 009/110] clang formatting changes --- lib_dec/hq_core_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/hq_core_dec_fx.c b/lib_dec/hq_core_dec_fx.c index 20e198bb7..1dc75f434 100644 --- a/lib_dec/hq_core_dec_fx.c +++ b/lib_dec/hq_core_dec_fx.c @@ -131,7 +131,7 @@ void hq_core_dec_fx( { hHQ_core->HqVoicing = 0; move16(); - IF ( GT_32( st_fx->core_brate, MINIMUM_RATE_TO_ENCODE_VOICING_FLAG ) ) + IF( GT_32( st_fx->core_brate, MINIMUM_RATE_TO_ENCODE_VOICING_FLAG ) ) { hHQ_core->HqVoicing = 1; move16(); -- GitLab From 314ec5ffc7635032e476089bffd351dedc45f4ff Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 28 Jun 2024 13:19:41 +0530 Subject: [PATCH 010/110] BASOP and instrumentation changes for stereo decoder and renderer files --- lib_dec/ivas_stereo_dft_dec_dmx.c | 100 ++-- lib_dec/ivas_stereo_dft_dec_fx.c | 662 ++++++++++++++++--------- lib_dec/ivas_stereo_dft_plc_fx.c | 114 +++-- lib_dec/ivas_stereo_eclvq_dec.c | 29 +- lib_dec/ivas_stereo_ica_dec.c | 44 +- lib_dec/ivas_stereo_icbwe_dec.c | 52 +- lib_dec/ivas_stereo_mdct_core_dec.c | 8 + lib_dec/ivas_stereo_mdct_core_dec_fx.c | 363 +++++++++++--- lib_rend/ivas_reflections.c | 163 +++--- lib_rend/ivas_render_config.c | 21 +- lib_rend/ivas_reverb.c | 289 +++++++---- lib_rend/ivas_reverb_delay_line.c | 15 +- lib_rend/ivas_reverb_fft_filter.c | 103 ++-- lib_rend/ivas_reverb_filter_design.c | 120 +++-- 14 files changed, 1443 insertions(+), 640 deletions(-) diff --git a/lib_dec/ivas_stereo_dft_dec_dmx.c b/lib_dec/ivas_stereo_dft_dec_dmx.c index 27ee4f817..0992568b5 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx.c @@ -184,7 +184,7 @@ void stereo_dft_unify_dmx_fx( pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); /* Stereo residual PLC */ - IF( GT_16( hStereoDft->res_cod_band_max, 0 ) ) + IF( hStereoDft->res_cod_band_max > 0 ) { IF( !st0->bfi ) { @@ -192,6 +192,7 @@ void stereo_dft_unify_dmx_fx( { Copy32( pDFT_RES, hStereoDft->res_mem_fx, shl( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ) ); hStereoDft->q_res_mem = hStereoDft->q_dft; + move16(); hStereoDft->time_offs = 0; move16(); } @@ -202,16 +203,20 @@ void stereo_dft_unify_dmx_fx( move16(); pPredGain = hStereoDft->res_pred_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); hStereoDft->past_DMX_pos = ( sub( add( hStereoDft->past_DMX_pos, STEREO_DFT_PAST_MAX ), 1 ) ) % STEREO_DFT_PAST_MAX; + move16(); stereo_dft_generate_res_pred_fx( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + k * STEREO_DFT32MS_N_MAX, &stop, st0->bfi ); stereo_dft_res_ecu_fx( hStereoDft, pDFT_RES, DFT_PRED_RES, k, output_frame, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem ); hStereoDft->q_res_cod_mem_fx = hStereoDft->q_dft; + move16(); } } /* Apply active DMX */ DFT_L[0] = pDFT_DMX[0]; + move32(); DFT_R[0] = pDFT_DMX[0]; + move32(); /* upmix residual part */ FOR( b = 0; b < hStereoDft->res_cod_band_max; b++ ) @@ -224,12 +229,16 @@ void stereo_dft_unify_dmx_fx( tmp = Madd_32_16( pDFT_RES[2 * i], pDFT_DMX[2 * i], g ); DFT_L[2 * i] = L_add( pDFT_DMX[2 * i], tmp ); + move32(); DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); + move32(); tmp = Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g ); DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); + move32(); DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); + move32(); } } @@ -243,15 +252,19 @@ void stereo_dft_unify_dmx_fx( Word16 exp_sum_nrg_l, exp_sum_nrg_R, exp_dot_prod_abs, exp_sum_nrg_Mid; Word32 sum_nrg_L_32, sum_nrg_R_32, dot_prod_real_32, dot_prod_img_32; Word64 sum_nrg_L = 0, sum_nrg_R = 0; + move64(); + move64(); Word64 dot_prod_real = 0, dot_prod_img = 0; + move64(); + move64(); FOR( j = hStereoDft->band_limits[b]; j < hStereoDft->band_limits[b + 1]; j++ ) { - sum_nrg_L = W_add( sum_nrg_L, W_add( W_mult_32_32( DFT_L[2 * j], DFT_L[2 * j] ), W_mult_32_32( DFT_L[2 * j + 1], DFT_L[2 * j + 1] ) ) ); - sum_nrg_R = W_add( sum_nrg_R, W_add( W_mult_32_32( DFT_R[2 * j], DFT_R[2 * j] ), W_mult_32_32( DFT_R[2 * j + 1], DFT_R[2 * j + 1] ) ) ); + sum_nrg_L = W_add( sum_nrg_L, W_add( W_mult_32_32( DFT_L[2 * j], DFT_L[2 * j] ), W_mult_32_32( DFT_L[add( shl( j, 1 ), 1 )], DFT_L[add( shl( j, 1 ), 1 )] ) ) ); + sum_nrg_R = W_add( sum_nrg_R, W_add( W_mult_32_32( DFT_R[2 * j], DFT_R[2 * j] ), W_mult_32_32( DFT_R[add( shl( j, 1 ), 1 )], DFT_R[add( shl( j, 1 ), 1 )] ) ) ); - dot_prod_real = W_add( dot_prod_real, W_add( W_mult_32_32( DFT_L[2 * j], DFT_R[2 * j] ), W_mult_32_32( DFT_L[2 * j + 1], DFT_R[2 * j + 1] ) ) ); - dot_prod_img = W_add( dot_prod_img, W_sub( W_mult_32_32( DFT_L[2 * j + 1], DFT_R[2 * j] ), W_mult_32_32( DFT_L[2 * j], DFT_R[2 * j + 1] ) ) ); + dot_prod_real = W_add( dot_prod_real, W_add( W_mult_32_32( DFT_L[2 * j], DFT_R[2 * j] ), W_mult_32_32( DFT_L[2 * j + 1], DFT_R[add( shl( j, 1 ), 1 )] ) ) ); + dot_prod_img = W_add( dot_prod_img, W_sub( W_mult_32_32( DFT_L[add( shl( j, 1 ), 1 )], DFT_R[2 * j] ), W_mult_32_32( DFT_L[2 * j], DFT_R[add( shl( j, 1 ), 1 )] ) ) ); } norm_sum_nrg_L = W_norm( sum_nrg_L ); @@ -280,28 +293,31 @@ void stereo_dft_unify_dmx_fx( Word32 tmp_nrg_L = Sqrt32( sum_nrg_L_32, &exp_sum_nrg_l ); Word32 tmp_nrg_R = Sqrt32( sum_nrg_R_32, &exp_sum_nrg_R ); Word16 exp_sum_abs = exp_sum_nrg_l; + move16(); - IF( GT_16( exp_sum_nrg_R, exp_sum_nrg_l ) ) + if( GT_16( exp_sum_nrg_R, exp_sum_nrg_l ) ) { exp_sum_abs = exp_sum_nrg_R; move16(); } exp_sum_abs = add( exp_sum_abs, 1 ); - sum_abs = L_add( L_shr( tmp_nrg_L, exp_sum_abs - exp_sum_nrg_l ), L_shr( tmp_nrg_R, exp_sum_abs - exp_sum_nrg_R ) ); + sum_abs = L_add( L_shr( tmp_nrg_L, sub(exp_sum_abs , exp_sum_nrg_l) ), L_shr( tmp_nrg_R, sub( exp_sum_abs, exp_sum_nrg_R ) ) ); dot_prod_abs = Sqrt32( L_add( Mpy_32_32( dot_prod_real_32, dot_prod_real_32 ), Mpy_32_32( dot_prod_img_32, dot_prod_img_32 ) ), &exp_dot_prod_abs ); - Word32 num = L_add( L_shr( L_add( sum_nrg_L_32, sum_nrg_R_32 ), 1 ), L_shr( dot_prod_abs, ( 31 - exp_dot_prod_abs ) - q_sum_nrg_L ) ); + Word32 num = L_add( L_shr( L_add( sum_nrg_L_32, sum_nrg_R_32 ), 1 ), L_shr( dot_prod_abs, sub( sub( 31, exp_dot_prod_abs ), q_sum_nrg_L ) ) ); Word16 E_num = sub( 31, q_sum_nrg_L ); Word32 num_sqrt = Sqrt32( num, &E_num ); Word16 exp_wR = exp_sum_abs; move16(); - IF( LT_16( exp_sum_abs, E_num ) ) + if( LT_16( exp_sum_abs, E_num ) ) { exp_wR = E_num; move16(); } Word16 wR_temp; - IF( EQ_32( num_sqrt, 0 ) && EQ_32( sum_abs, 0 ) ) + test(); + test(); + IF( num_sqrt == 0 && sum_abs == 0 ) { wR_temp = 6364; // 0.776887059 in Q13 move16(); @@ -313,19 +329,22 @@ void stereo_dft_unify_dmx_fx( } ELSE { - wR_temp = shr( divide3232( L_shr( num_sqrt, exp_wR - E_num ), L_shr( sum_abs, exp_wR - exp_sum_abs ) ), 2 ); + wR_temp = shr( divide3232( L_shr( num_sqrt, sub(exp_wR , E_num) ), L_shr( sum_abs, sub(exp_wR , exp_sum_abs) ) ), 2 ); } Word32 sum_nrg_Mid_sqrt = Sqrt32( sum_nrg_Mid, &exp_sum_nrg_Mid ); Word16 exp_wL = exp_sum_abs; - IF( LT_16( exp_sum_abs, exp_sum_nrg_Mid ) ) + move16(); + if( LT_16( exp_sum_abs, exp_sum_nrg_Mid ) ) { exp_wL = exp_sum_nrg_Mid; move16(); } Word16 wL_temp; - IF( EQ_32( sum_nrg_Mid_sqrt, 0 ) && EQ_32( sum_abs, 0 ) ) + test(); + test(); + IF( sum_nrg_Mid_sqrt == 0 && sum_abs == 0 ) { wL_temp = 6364; move16(); @@ -337,7 +356,7 @@ void stereo_dft_unify_dmx_fx( } ELSE { - wL_temp = shr( divide3232( L_shr( sum_nrg_Mid_sqrt, exp_wL - exp_sum_nrg_Mid ), L_shr( sum_abs, exp_wL - exp_sum_abs ) ), 1 ); + wL_temp = shr( divide3232( L_shr( sum_nrg_Mid_sqrt, sub( exp_wL, exp_sum_nrg_Mid ) ), L_shr( sum_abs, sub( exp_wL, exp_sum_abs ) ) ), 1 ); } wR = wR_temp; /* Q13 */ @@ -347,23 +366,29 @@ void stereo_dft_unify_dmx_fx( FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) { /*DMX Mapping*/ - pDFT_DMX[2 * i] = L_shl( Mpy_32_32( L_add( Mpy_32_16_1( DFT_L[2 * i], wL ), Mpy_32_16_1( DFT_R[2 * i], wR ) ), INV_SQRT_2_Q31 ), Q2 ); /* Q(hStereoDft->q_dft) */ + pDFT_DMX[2 * i] = L_shl( Mpy_32_32( L_add( Mpy_32_16_1( DFT_L[2 * i], wL ), Mpy_32_16_1( DFT_R[2 * i], wR ) ), INV_SQRT_2_Q31 ), Q2 ); /* Q(hStereoDft->q_dft) */ + move32(); pDFT_DMX[2 * i + 1] = L_shl( Mpy_32_32( L_add( Mpy_32_16_1( DFT_L[2 * i + 1], wL ), Mpy_32_16_1( DFT_R[2 * i + 1], wR ) ), INV_SQRT_2_Q31 ), Q2 ); /* Q(hStereoDft->q_dft) */ + move32(); } } Copy32( pDFT_DMX, DFT[0] + i_mult( k, STEREO_DFT32MS_N_MAX ), hStereoDft->NFFT ); /* Update DFT_past_DMX, needed for stereo filling used by stereo residual PLC */ hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; + move16(); Copy32( pDFT_DMX, hStereoDft->DFT_past_DMX_fx[hStereoDft->past_DMX_pos], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); hStereoDft->q_DFT_past_DMX_fx[hStereoDft->past_DMX_pos] = hStereoDft->q_dft; + test(); IF( st0->bfi && !prev_bfi ) { Word16 idx_k0, idx_k1; Word16 q_shift0; Word16 q_shift1; idx_k0 = ( add( hStereoDft->past_DMX_pos, 1 ) ) % STEREO_DFT_PAST_MAX; + move16(); idx_k1 = ( add( idx_k0, 1 ) ) % STEREO_DFT_PAST_MAX; + move16(); q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k0] ); q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k1] ); @@ -656,6 +681,7 @@ void add_HB_to_mono_dmx_fx( Word32 temp_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; Word32 winSlope_fx = 0; + move32(); Word32 alpha_fx; const Word16 *win_dft_fx; int32_t output_Fs; @@ -674,41 +700,51 @@ void add_HB_to_mono_dmx_fx( memTransitionHB_fx = hCPE->hStereoDftDmx->memTransitionHB_fx; memOffset = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); + move16(); - IF( EQ_16( hCPE->hCoreCoder[0]->core, ACELP_CORE ) && GT_32( hCPE->hCoreCoder[0]->extl_brate, 0 ) ) + test(); + IF( hCPE->hCoreCoder[0]->core == ACELP_CORE && GT_32( hCPE->hCoreCoder[0]->extl_brate, 0 ) ) { /* Resampled LB and HB offset */ - Copy32( outputHB, temp_fx + memOffset, output_frame - memOffset ); + Copy32( outputHB, temp_fx + memOffset, sub( output_frame, memOffset ) ); decoderDelay = NS2SA( output_Fs, IVAS_DEC_DELAY_NS ); + move16(); - IF( NE_16( last_core, ACELP_CORE ) ) + IF( last_core != ACELP_CORE ) { /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */ icbweOLASize = NS2SA( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); + move16(); FOR( i = 0; i < decoderDelay; i++ ) { temp_fx[i] = 0; + move32(); } assert( icbweOLASize > 0 ); - switch ( output_Fs ) + SWITCH( output_Fs ) { case 48000: winSlope_fx = 17895698; // Q30 - break; + move32(); + BREAK; case 32000: winSlope_fx = 26843546; - break; + move32(); + BREAK; case 16000: winSlope_fx = 53687092; - break; + move32(); + BREAK; } alpha_fx = winSlope_fx; // Q30 - FOR( ; i < decoderDelay + icbweOLASize; i++ ) + move32(); + FOR( ; i < add( decoderDelay, icbweOLASize ); i++ ) { temp_fx[i] = L_shl( Mpy_32_32( temp_fx[i], alpha_fx ), 1 ); + move32(); alpha_fx = L_add_sat( alpha_fx, winSlope_fx ); } } @@ -719,29 +755,35 @@ void add_HB_to_mono_dmx_fx( v_add_32( temp_fx, output, output, output_frame ); - Copy32( outputHB + output_frame - memOffset, memOutHB_fx, memOffset ); + Copy32( outputHB + sub( output_frame, memOffset ), memOutHB_fx, memOffset ); win_dft_fx = hCPE->hStereoDft->win32ms_fx; dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; + move16(); /* Preparing buffers in anticipation of an ACELP to TCX switch */ j = 0; + move16(); FOR( i = 0; i < memOffset; i++ ) { - memTransitionHB_fx[i] = Mpy_32_16_1( memOutHB_fx[i], win_dft_fx[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )] ); - j++; + memTransitionHB_fx[i] = Mpy_32_16_1( memOutHB_fx[i], win_dft_fx[i_mult( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) )] ); + move32(); + j = add( j, 1 ); } FOR( i = 0; j < dftOvlLen; i++ ) { - memTransitionHB_fx[memOffset + i] = Mpy_32_16_1( outputHB[output_frame - i - 1], win_dft_fx[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )] ); - j++; + memTransitionHB_fx[add( memOffset, i )] = Mpy_32_16_1( outputHB[sub( output_frame, i ) - 1], win_dft_fx[i_mult( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) )] ); + move32(); + j = add( j, 1 ); } } ELSE { - IF( EQ_16( last_core, ACELP_CORE ) ) + IF( last_core == ACELP_CORE ) { + test(); + test(); /* This is generated in the ACELP frame and windowed. This process is akin to GenTransition for IC-BWE */ IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) { diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index f319c2703..6f0775a9a 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -102,14 +102,14 @@ void stereo_dft_dec_reset_fx( #endif /*Configuration*/ - set_s( hStereoDft->prm_res, hStereoDft->hConfig->prm_res, STEREO_DFT_DEC_DFT_NB ); + set16_fx( hStereoDft->prm_res, hStereoDft->hConfig->prm_res, STEREO_DFT_DEC_DFT_NB ); /* SIDE_GAIN */ - set_s( hStereoDft->side_gain_index, 15, STEREO_DFT_BAND_MAX ); - set_s( hStereoDft->side_gain_index_previous, 15, STEREO_DFT_BAND_MAX ); + set16_fx( hStereoDft->side_gain_index, 15, STEREO_DFT_BAND_MAX ); + set16_fx( hStereoDft->side_gain_index_previous, 15, STEREO_DFT_BAND_MAX ); /*residual prediction*/ - set_s( hStereoDft->res_pred_mode, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_DEC_DFT_NB ); + set16_fx( hStereoDft->res_pred_mode, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_DEC_DFT_NB ); FOR( i = 0; i < STEREO_DFT_PAST_MAX; i++ ) { set32_fx( hStereoDft->DFT_past_DMX_fx[i], 0, STEREO_DFT32MS_N_32k ); @@ -121,7 +121,7 @@ void stereo_dft_dec_reset_fx( hStereoDft->past_DMX_pos = 0; move16(); - set_s( hStereoDft->res_pred_index_previous, 0, STEREO_DFT_BAND_MAX ); + set16_fx( hStereoDft->res_pred_index_previous, 0, STEREO_DFT_BAND_MAX ); FOR( i = 0; i < STEREO_DFT_BAND_MAX; i++ ) { @@ -132,7 +132,7 @@ void stereo_dft_dec_reset_fx( set32_fx( hStereoDft->res_gains_ind_fx[1], 0, STEREO_DFT_BAND_MAX ); /*residual coding*/ - set_s( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_DEC_DFT_NB ); + set16_fx( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_DEC_DFT_NB ); hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->hConfig->res_cod_mode]; set32_fx( hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k ); hStereoDft->q_res_cod_mem_fx = Q16; @@ -283,21 +283,24 @@ static void stereo_dft_dec_open_fx( ) { /*Sizes*/ - hStereoDft->N = extract_l( STEREO_DFT_HOP_MAX * output_Fs / 48000 ); + // hStereoDft->N = (Word16) ( STEREO_DFT_HOP_MAX * output_Fs / 48000 ); + hStereoDft->N = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT_HOP_MAX ), 44740 ) ); + move16(); /*Init. DFT sizes*/ - hStereoDft->NFFT = extract_l( STEREO_DFT32MS_N_MAX * output_Fs / 48000 ); + hStereoDft->NFFT = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_N_MAX ), 44740 ) ); + move16(); hStereoDft->dft_trigo_8k_fx = dft_trigo_32k_fx; hStereoDft->dft_trigo_12k8_fx = dft_trigo_12k8_fx; hStereoDft->dft_trigo_16k_fx = dft_trigo_32k_fx; - hStereoDft->dft32ms_ovl = extract_l( ( STEREO_DFT32MS_OVL_MAX * output_Fs ) / 48000 ); + hStereoDft->dft32ms_ovl = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 ) ); hStereoDft->win232ms_8k_fx = dft_win232ms_8k_fx; hStereoDft->win232ms_12k8_fx = dft_win232ms_12k8_fx; hStereoDft->win232ms_16k_fx = dft_win232ms_16k_fx; - hStereoDft->dft32ms_ovl2 = extract_l( ( STEREO_DFT32MS_OVL2_MAX * output_Fs ) / 48000 ); + hStereoDft->dft32ms_ovl2 = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL2_MAX ), 44740 ) ); hStereoDft->win32ms_8k_fx = dft_win232ms_8k_fx + 1; hStereoDft->win32ms_12k8_fx = dft_win232ms_12k8_fx + 1; hStereoDft->win32ms_16k_fx = dft_win232ms_16k_fx + 1; @@ -439,6 +442,7 @@ static void stereo_dft_dequantize_res_gains_fx( const Word16 N ) { Word16 i, index; + Word16 tmp; FOR( i = 0; i < N; i++ ) { @@ -447,10 +451,27 @@ static void stereo_dft_dequantize_res_gains_fx( move16(); ind2[i] = check_bounds_s( ind2[i], 0, 7 ); move16(); - index = add( shl( LE_16( ind1[i], 15 ) ? sub( 15, ind1[i] ) : sub( ind1[i], 15 ), 3 ), ind2[i] ); - move16(); - gout[i] = LE_16( ind1[i], 15 ) ? L_negate( dft_res_gains_q_fx[index][0] ) : dft_res_gains_q_fx[index][0]; - move16(); + IF( LE_16( ind1[i], 15 ) ) + { + tmp = sub( 15, ind1[i] ); + } + ELSE + { + tmp = sub( ind1[i], 15 ); + } + // index = add( shl( LE_16( ind1[i], 15 ) ? sub( 15, ind1[i] ) : sub( ind1[i], 15 ), 3 ), ind2[i] ); + index = add( shl( tmp, 3 ), ind2[i] ); + // gout[i] = LE_16( ind1[i], 15 ) ? L_negate( dft_res_gains_q_fx[index][0] ) : dft_res_gains_q_fx[index][0]; + IF( LE_16( ind1[i], 15 ) ) + { + gout[i] = L_negate( dft_res_gains_q_fx[index][0] ); + move16(); + } + ELSE + { + gout[i] = dft_res_gains_q_fx[index][0]; + move16(); + } rout[i] = dft_res_gains_q_fx[index][1]; move16(); } @@ -472,6 +493,7 @@ static void stereo_dft_dequantize_res_gains_f_fx( const Word16 N ) { Word16 i, i1, j1, sign, ji, ij; + Word32 L_tmp; Word32 fi, fj; FOR( i = 0; i < N; i++ ) @@ -483,22 +505,64 @@ static void stereo_dft_dequantize_res_gains_f_fx( move32(); /* compensate for the offset and extract/remove sign of first index */ - sign = LT_32( ind1[i], L_shl( 15, Q26 ) ) ? -1 : 1; - move16(); - i1 = extract_l( L_shr( ( LT_32( ind1[i], L_shl( 15, Q26 ) ) ? L_sub( L_shl( 15, Q26 ), ind1[i] ) : L_sub( ind1[i], L_shl( 15, Q26 ) ) ), Q26 ) ); - fi = L_sub( ( LT_32( ind1[i], L_shl( 15, Q26 ) ) ? L_sub( L_shl( 15, Q26 ), ind1[i] ) : L_sub( ind1[i], L_shl( 15, Q26 ) ) ), L_shl( i1, Q26 ) ); + // sign = LT_32( ind1[i], L_shl( 15, Q26 ) ) ? -1 : 1; + IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) ) + { + sign = -1; + move16(); + } + ELSE + { + sign = 1; + move16(); + } + IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) ) + { + L_tmp = L_sub( L_shl( 15, Q26 ), ind1[i] ); + } + ELSE + { + L_tmp = L_sub( ind1[i], L_shl( 15, Q26 ) ); + } + i1 = extract_l( L_shr( ( L_tmp ), Q26 ) ); + IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) ) + { + L_tmp = L_sub( L_shl( 15, Q26 ), ind1[i] ); + } + ELSE + { + L_tmp = L_sub( ind1[i], L_shl( 15, Q26 ) ); + } + fi = L_sub( ( L_tmp ), L_shl( i1, Q26 ) ); move16(); j1 = extract_l( L_shr( ind2[i], Q26 ) ); fj = L_sub( ind2[i], L_shl( j1, Q26 ) ); /* choose base indices for interpolation */ - ji = extract_l( L_min( fj < ONE_IN_Q25 ? j1 : j1 + 1, 7 ) ); - ij = extract_l( L_min( fi < ONE_IN_Q25 ? i1 : i1 + 1, 15 ) ); + // ji = extract_l( L_min( fj < ONE_IN_Q25 ? j1 : j1 + 1, 7 ) ); + IF( LT_32( fj, ONE_IN_Q25 ) ) + { + ji = extract_l( L_min( j1, 7 ) ); + } + ELSE + { + ji = extract_l( L_min( add( j1, 1 ), 7 ) ); + } + + // ij = extract_l( L_min( fi < ONE_IN_Q25 ? i1 : i1 + 1, 15 ) ); + IF( LT_32( fi, ONE_IN_Q25 ) ) + { + ij = extract_l( L_min( i1, 15 ) ); + } + ELSE + { + ij = extract_l( L_min( add( i1, 1 ), 15 ) ); + } /* interpolate values from table */ IF( LT_16( i1, 15 ) ) { - gout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fi, Q5 ) ), dft_res_gains_q_fx[( i1 << 3 ) + ji][0] ), dft_res_gains_q_fx[( ( i1 + 1 ) << 3 ) + ji][0], L_shl( fi, Q5 ) ); + gout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fi, Q5 ) ), dft_res_gains_q_fx[add( shl( i1, 3 ), ji )][0] ), dft_res_gains_q_fx[add( shl( add( i1, 1 ), 3 ), ji )][0], L_shl( fi, Q5 ) ); move32(); IF( EQ_16( sign, -1 ) ) { @@ -519,12 +583,12 @@ static void stereo_dft_dequantize_res_gains_f_fx( IF( LT_16( j1, 7 ) ) { - rout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fj, Q5 ) ), dft_res_gains_q_fx[( ij << 3 ) + j1][1] ), L_shl( fj, Q5 ), dft_res_gains_q_fx[( ij << 3 ) + j1 + 1][1] ); + rout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fj, Q5 ) ), dft_res_gains_q_fx[add( shl( ij, 3 ), j1 )][1] ), L_shl( fj, Q5 ), dft_res_gains_q_fx[add( add( shl( ij, 3 ), j1 ), 1 )][1] ); move32(); } ELSE { - rout[i] = dft_res_gains_q_fx[( ij << 3 ) + 7][1]; + rout[i] = dft_res_gains_q_fx[add( shl( ij, 3 ), 7 )][1]; move32(); } } @@ -579,10 +643,10 @@ void stereo_dft_dec_update_fx( } /* Load new configurations */ - set_s( hStereoDft->band_res + k_offset, hStereoDft->hConfig->band_res, STEREO_DFT_NBDIV ); - set_s( hStereoDft->prm_res + k_offset, hStereoDft->hConfig->prm_res, STEREO_DFT_NBDIV ); - set_s( hStereoDft->res_pred_mode + k_offset, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_NBDIV ); - set_s( hStereoDft->res_cod_mode + k_offset, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_NBDIV ); + set16_fx( hStereoDft->band_res + k_offset, hStereoDft->hConfig->band_res, STEREO_DFT_NBDIV ); + set16_fx( hStereoDft->prm_res + k_offset, hStereoDft->hConfig->prm_res, STEREO_DFT_NBDIV ); + set16_fx( hStereoDft->res_pred_mode + k_offset, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_NBDIV ); + set16_fx( hStereoDft->res_cod_mode + k_offset, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_NBDIV ); /*Update attack info*/ IF( hStereoDft->attackPresent ) @@ -679,7 +743,10 @@ void stereo_dft_dec_synthesize_fx( set_val_Word32( output, 0, NS2SA( outputFs, FRAME_SIZE_NS ) ); /* deactivating the spectrum scrambling on active speech */ - IF( ( EQ_16( chan, 0 ) && GT_16( hCPE->hCoreCoder[0]->last_coder_type, UNVOICED ) ) || EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) || LT_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) + test(); + test(); + test(); + if ( ( EQ_16( chan, 0 ) && GT_16( hCPE->hCoreCoder[0]->last_coder_type, UNVOICED ) ) || EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) || LT_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) { hCPE->stereo_switching_counter = 10; move16(); @@ -691,7 +758,7 @@ void stereo_dft_dec_synthesize_fx( Word16 tmp = extract_l( L_max( (Word16) 0xF333, L_min( (Word16) 0x3333, hCPE->lt_es_em_fx ) ) ); hCPE->NbFrameMod = extract_h( L_add( L_mult0( 12, tmp ), 0x0000D99A ) ); /* -0.1: -0.4 ; -0.1 -> 0, 0.4 -> 6*/ } - moffset = max( 0, 6 - hCPE->NbFrameMod ); + moffset = s_max( 0, sub( 6, hCPE->NbFrameMod ) ); /*-----------------------------------------------------------------* * Synthesis @@ -700,7 +767,7 @@ void stereo_dft_dec_synthesize_fx( trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); FOR( i = 0; i < shr( NFFT, 2 ); i++ ) { - trigo_dec[i] = hStereoDft->dft_trigo_fx[i * trigo_step]; + trigo_dec[i] = hStereoDft->dft_trigo_fx[i_mult( i, trigo_step )]; move16(); trigo_dec[sub( shr( NFFT, 1 ), i )] = hStereoDft->dft_trigo_fx[i * trigo_step]; move16(); @@ -711,11 +778,16 @@ void stereo_dft_dec_synthesize_fx( FOR( k = 0; k < STEREO_DFT_NBDIV; k++ ) { /* scrambling the spectrum */ + test(); + test(); + test(); + test(); + test(); IF( LE_16( hCPE->stereo_switching_counter, 6 ) && EQ_16( chan, 1 ) && ( GT_32( hCPE->lt_es_em_fx, (Word16) 0xCCCD ) || GT_16( hCPE->NbFrameMod, 4 ) ) ) { - FOR( i = 3; i < NFFT - moffset - 1; i++ ) + FOR( i = 3; i < sub( sub( NFFT, moffset ), 1 ); i++ ) { - p_DFT[i] = L_negate( p_DFT[i + moffset + 1] ); + p_DFT[i] = L_negate( p_DFT[add( add( i, moffset ), 1 )] ); move32(); } } @@ -723,19 +795,19 @@ void stereo_dft_dec_synthesize_fx( { FOR( i = sub( 16, hCPE->NbFrameMod ); i < sub( NFFT, add( moffset, 1 ) ); i++ ) { - p_DFT[i - 2] = L_negate( p_DFT[i + moffset + 1] ); + p_DFT[i - 2] = L_negate( p_DFT[add( add( i, moffset ), 1 )] ); move32(); } } /*IFFT*/ scale_dft = getScaleFactor32( p_DFT, NFFT ); - scale_dft = find_guarded_bits_fx( NFFT ) - scale_dft; + scale_dft = sub( find_guarded_bits_fx( NFFT ), scale_dft ); v_shr( p_DFT, scale_dft, p_DFT, NFFT ); - rfft_fx( p_DFT, trigo_dec, NFFT, +1 ); + rfft_fx( p_DFT, trigo_dec, NFFT, 1 ); v_shr( p_DFT, negate( scale_dft ), p_DFT, NFFT ); - IF( EQ_16( k, 0 ) ) + IF( k == 0 ) { offset = 0; move16(); @@ -743,19 +815,19 @@ void stereo_dft_dec_synthesize_fx( /* Left OLA - 3.125ms */ FOR( i = 0; i < ovl; i++ ) { - output[offset + i] = Madd_32_16( L_shr( hCPE->output_mem_fx[chan][i], sub( hCPE->q_output_mem_fx[chan], hCPE->hStereoDft->q_dft ) ), p_DFT[zp + i], win[STEREO_DFT32MS_STEP * i] ); + output[add( offset, i )] = Madd_32_16( L_shr( hCPE->output_mem_fx[chan][i], sub( hCPE->q_output_mem_fx[chan], hCPE->hStereoDft->q_dft ) ), p_DFT[add( zp, i )], win[STEREO_DFT32MS_STEP * i] ); move32(); } /* Flat Portion */ FOR( i = ovl; i < flat_portion_end; i++ ) { - output[offset + i] = p_DFT[zp + i]; + output[add( offset, i )] = p_DFT[add( zp, i )]; move32(); } /* Right OLA */ FOR( i = 0; i < ovl2; i++ ) { - ola_buff[i] = Mpy_32_16_1( p_DFT[NFFT - zp - ovl2 + i], win2[ovl2 - 1 - i] ); + ola_buff[i] = Mpy_32_16_1( p_DFT[add( sub( NFFT, add( zp, ovl2 ) ), i )], win2[sub( sub( ovl2, i ), 1 )] ); move32(); } } @@ -767,22 +839,23 @@ void stereo_dft_dec_synthesize_fx( /* Left OLA */ FOR( i = 0; i < ovl2; i++ ) { - output[offset + i] = Madd_32_16( ola_buff[i], p_DFT[zp + i], win2[i] ); + output[add( offset, i )] = Madd_32_16( ola_buff[i], p_DFT[add( zp, i )], win2[i] ); move32(); } /* Flat Portion */ - FOR( i = ovl2; i < NFFT - 2 * zp - ovl; i++ ) + FOR( i = ovl2; i < sub( NFFT, add( shl( zp, 1 ), ovl ) ); i++ ) { - output[offset + i] = p_DFT[zp + i]; + output[add( offset, i )] = p_DFT[add( zp, i )]; move32(); } /* Right OLA - 3.125ms */ FOR( i = 0; i < ovl; i++ ) { - hCPE->output_mem_fx[chan][i] = Mpy_32_16_1( p_DFT[NFFT - zp - ovl + i], win[STEREO_DFT32MS_STEP * ( ovl - 1 - i )] ); + hCPE->output_mem_fx[chan][i] = Mpy_32_16_1( p_DFT[add( sub( NFFT, add( zp, ovl ) ), i )], win[i_mult( STEREO_DFT32MS_STEP, ( sub( sub( ovl, i ), 1 ) ) )] ); move32(); } hCPE->q_output_mem_fx[chan] = hCPE->hStereoDft->q_dft; + move16(); } p_DFT += STEREO_DFT32MS_N_MAX; } @@ -819,12 +892,13 @@ void stereo_dft_dec_smooth_parameters_fx( k_offset = STEREO_DFT_OFFSET; move16(); + test(); IF( hStereoDft->frame_sid_nodata || prev_sid_nodata ) { k = 1; FOR( b = 0; b < hStereoDft->nbands; b++ ) { - *( hStereoDft->side_gain_fx + ( ( add( k, k_offset ) ) - 1 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->side_gain_fx + ( add( k, k_offset ) ) * STEREO_DFT_BAND_MAX + b ); + *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), 1 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ) ); move32(); } @@ -889,13 +963,15 @@ void stereo_dft_dec_smooth_parameters_fx( } /* xfade */ + test(); + test(); IF( NE_32( hStereoDft->ipd_xfade_prev_fx, hStereoDft->ipd_xfade_target_fx ) && LT_16( hStereoDft->ipd_xfade_counter, STEREO_DFT_ITD_CNG_XFADE ) && LE_32( hStereoDft->last_active_element_brate, 24400 ) ) { hStereoDft->gipd_fx[add( k, k_offset )] = L_add( hStereoDft->ipd_xfade_prev_fx, hStereoDft->ipd_xfade_step_fx ); move32(); hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[add( k, k_offset )]; move32(); - hStereoDft->ipd_xfade_counter++; + hStereoDft->ipd_xfade_counter = add( hStereoDft->ipd_xfade_counter, 1 ); } } ELSE @@ -914,7 +990,7 @@ void stereo_dft_dec_smooth_parameters_fx( FOR( k2 = 1; k2 < hStereoDft->prm_res[add( k, k_offset )]; k2++ ) { - hStereoDft->gipd_fx[( add( k, k_offset ) ) - k2] = hStereoDft->gipd_fx[add( k, k_offset )]; + hStereoDft->gipd_fx[sub( add( k, k_offset ), k2 )] = hStereoDft->gipd_fx[add( k, k_offset )]; move32(); } @@ -970,7 +1046,7 @@ void stereo_dft_dec_smooth_parameters_fx( } FOR( k2 = 1; k2 < hStereoDft->prm_res[add( k, k_offset )]; k2++ ) { - hStereoDft->itd_fx[( add( k, k_offset ) ) - k2] = hStereoDft->itd_fx[add( k, k_offset )]; + hStereoDft->itd_fx[sub( add( k, k_offset ), k2 )] = hStereoDft->itd_fx[add( k, k_offset )]; move32(); } @@ -1049,14 +1125,16 @@ void stereo_dft_dec_smooth_parameters_fx( move16(); tmps2 = (Word16) L_shr( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], Q26 ); move16(); - stereo_dft_dequantize_res_gains_fx( &tmps1, &tmps2, hStereoDft->side_gain_fx + ( add( k, k_offset ) ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( add( k, k_offset ) ) * STEREO_DFT_BAND_MAX + b, 1 ); + stereo_dft_dequantize_res_gains_fx( &tmps1, &tmps2, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); + test(); + test(); IF( hStereoDft->attackPresent ) { hStereoDft->res_gains_ind_fx[1][b] = Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x6666 ); move32(); } - ELSE IF( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] < ONE_IN_Q27 ) ) ) /* Assuming Maximum Q of res_gains_ind_fx is Q26 */ + ELSE IF( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( LT_32( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], ONE_IN_Q27 ) ) ) ) /* Assuming Maximum Q of res_gains_ind_fx is Q26 */ { hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x4CCD ), hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], (Word16) 0x3333 ); @@ -1070,12 +1148,14 @@ void stereo_dft_dec_smooth_parameters_fx( move32(); } - stereo_dft_dequantize_res_gains_f_fx( &hStereoDft->res_gains_ind_fx[0][b], &hStereoDft->res_gains_ind_fx[1][b], &tmp, hStereoDft->res_pred_gain_fx + ( add( k, k_offset ) ) * STEREO_DFT_BAND_MAX + b, 1 ); + stereo_dft_dequantize_res_gains_f_fx( &hStereoDft->res_gains_ind_fx[0][b], &hStereoDft->res_gains_ind_fx[1][b], &tmp, hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); } /* Smoothing of prediction gains between ftrames */ FOR( ; b < hStereoDft->nbands; b++ ) { + test(); + test(); IF( hStereoDft->attackPresent ) { hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; @@ -1128,7 +1208,7 @@ void stereo_dft_dec_smooth_parameters_fx( IF( !hStereoDft->recovery_flg ) { - stereo_dft_dequantize_res_gains_f_fx( &hStereoDft->res_gains_ind_fx[0][b], &hStereoDft->res_gains_ind_fx[1][b], hStereoDft->side_gain_fx + ( add( k, k_offset ) ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( add( k, k_offset ) ) * STEREO_DFT_BAND_MAX + b, 1 ); + stereo_dft_dequantize_res_gains_f_fx( &hStereoDft->res_gains_ind_fx[0][b], &hStereoDft->res_gains_ind_fx[1][b], hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); } } @@ -1138,10 +1218,12 @@ void stereo_dft_dec_smooth_parameters_fx( IF( LT_32( diff_ipd, -EVS_PI_FX_Q27 ) ) { pgIpd[0] = L_add( pgIpd[0], EVS_2PI_FX_Q27 ); + move32(); } ELSE IF( GT_32( diff_ipd, EVS_PI_FX_Q27 ) ) { pgIpd[0] = L_sub( pgIpd[0], EVS_2PI_FX_Q27 ); + move32(); } IF( !hStereoDft->attackPresent ) @@ -1149,23 +1231,23 @@ void stereo_dft_dec_smooth_parameters_fx( IF( hStereoDft->wasTransient ) { pgIpd[0] = L_add( Mpy_32_16_1( pgIpd[0], (Word16) 0x6666 ), Mpy_32_16_1( pgIpd[-hStereoDft->prm_res[add( k, k_offset )]], (Word16) ( 0x199A ) ) ); - move16(); + move32(); } ELSE { pgIpd[0] = L_add( L_shr( pgIpd[0], 1 ), L_shr( pgIpd[-hStereoDft->prm_res[add( k, k_offset )]], 1 ) ); - move16(); + move32(); } } IF( !hStereoDft->attackPresent ) { - pSideGain = hStereoDft->side_gain_fx + ( add( k, k_offset ) ) * STEREO_DFT_BAND_MAX; + pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); FOR( b = 0; b < hStereoDft->res_cod_band_max; b++ ) { pSideGain[b] = Madd_32_16( Mpy_32_16_1( pSideGain[b], dft_res_cod_alpha_fx[b] ), - pSideGain[b - hStereoDft->prm_res[add( k, k_offset )] * STEREO_DFT_BAND_MAX], + pSideGain[sub( b, i_mult( hStereoDft->prm_res[add( k, k_offset )], STEREO_DFT_BAND_MAX ) )], sub( (Word16) 0x7FFF, dft_res_cod_alpha_fx[b] ) ); move32(); } @@ -1183,27 +1265,31 @@ void stereo_dft_dec_smooth_parameters_fx( } ELSE { - *( pInterpol ) = *( hStereoDft->gipd_fx + ( add( k, k_offset ) - hStereoDft->prm_res[add( k, k_offset )] ) ); + *( pInterpol ) = *( hStereoDft->gipd_fx + sub( add( k, k_offset ), hStereoDft->prm_res[add( k, k_offset )] ) ); move32(); } FOR( b = 0; b < hStereoDft->nbands; b++ ) { - *( hStereoDft->res_pred_gain_fx + sub( add( k, k_offset ), k2 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->res_pred_gain_fx + ( add( k, k_offset ) - hStereoDft->prm_res[add( k, k_offset )] ) * STEREO_DFT_BAND_MAX + b ); + *( hStereoDft->res_pred_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->res_pred_gain_fx + add( i_mult( sub( add( k, k_offset ), hStereoDft->prm_res[add( k, k_offset )] ), STEREO_DFT_BAND_MAX ), b ) ); move32(); + test(); + test(); + test(); + test(); IF( b < hStereoDft->res_cod_band_max || hStereoDft->attackPresent || hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && LT_32( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], ONE_IN_Q27 ) ) ) { - *( hStereoDft->side_gain_fx + sub( add( k, k_offset ), k2 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->side_gain_fx + ( add( k, k_offset ) ) * STEREO_DFT_BAND_MAX + b ); + *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ) ); move32(); } ELSE { - *( hStereoDft->side_gain_fx + sub( add( k, k_offset ), k2 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->side_gain_fx + ( add( k, k_offset ) - hStereoDft->prm_res[add( k, k_offset )] ) * STEREO_DFT_BAND_MAX + b ); + *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), hStereoDft->prm_res[add( k, k_offset )] ), STEREO_DFT_BAND_MAX ), b ) ); move32(); } } - hStereoDft->itd_fx[( add( k, k_offset ) ) - k2] = hStereoDft->itd_fx[add( k, k_offset )]; + hStereoDft->itd_fx[sub( add( k, k_offset ), k2 )] = hStereoDft->itd_fx[add( k, k_offset )]; move32(); } /*end of interpolation*/ } @@ -1242,6 +1328,7 @@ void stereo_dft_dec_res_fx( { set_val_Word32( hCPE->hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k ); hCPE->hStereoDft->q_res_cod_mem_fx = Q16; + move16(); set_val_Word32( hCPE->input_mem_fx[1], 0, NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) ); set_val_Word16( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k ); hCPE->hStereoDft->hBpf->pst_mem_deemp_err_fx = 0; @@ -1256,7 +1343,6 @@ void stereo_dft_dec_res_fx( /*OLA*/ /*overlapping parts*/ Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q16 ); - move16(); FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ ) { win[i] = extract_h( L_add( hCPE->hStereoDft->res_cod_mem_fx[i], L_shl( L_mult( win[i], hCPE->hStereoDft->win_8k_fx[i] ), q_shift ) ) ); @@ -1264,7 +1350,7 @@ void stereo_dft_dec_res_fx( hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); move32(); } - IF( NE_16( q_shift, 0 ) ) + IF( q_shift != 0 ) { v_shr_16( &win[STEREO_DFT_OVL_8k], negate( q_shift ), &win[STEREO_DFT_OVL_8k], L_FRAME8k ); } @@ -1275,6 +1361,7 @@ void stereo_dft_dec_res_fx( { /* For first good frame, ola memory contains extended ECU buffer -- need to crossfade instead of OLA */ step = 468; /* 1 / STEREO_DFT_OVL_8k in Q15 */ + move16(); fac = 0; move16(); FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ ) @@ -1291,7 +1378,7 @@ void stereo_dft_dec_res_fx( Copy( win, out_16, L_FRAME8k ); - IF( EQ_16( hCPE->hCoreCoder[0]->core, ACELP_CORE ) ) + IF( hCPE->hCoreCoder[0]->core == ACELP_CORE ) { /* bass post-filter */ bass_psfilter_fx( hCPE->hStereoDft->hBpf, hCPE->hCoreCoder[0]->Opt_AMR_WB, out_16, L_FRAME8k, hCPE->hCoreCoder[0]->old_pitch_buf_16_fx + ( L_FRAME8k / STEREO_DFT_L_SUBFR_8k ), hCPE->hCoreCoder[0]->bpf_off, @@ -1318,7 +1405,7 @@ void stereo_dft_dec_res_fx( v_sub_32( output, bpf_error_signal_8k, output, L_FRAME8k ); } } - ELSE IF( EQ_16( hCPE->hCoreCoder[0]->last_core, ACELP_CORE ) ) + ELSE IF( hCPE->hCoreCoder[0]->last_core == ACELP_CORE ) { set_val_Word16( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k ); hCPE->hStereoDft->hBpf->pst_mem_deemp_err_fx = 0; @@ -1404,6 +1491,14 @@ void stereo_dft_dec_fx( stop = shr( STEREO_DFT32MS_N_32k, 1 ); /* Analyze nature of current frame */ + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); hStereoDft->trans = (Word16) ( ( EQ_16( st0->clas_dec, ONSET ) || EQ_16( st0->clas_dec, SIN_ONSET ) || EQ_16( st0->clas_dec, UNVOICED_CLAS ) || EQ_16( st0->clas_dec, UNVOICED_TRANSITION ) ) || LE_16( st0->stab_fac_fx, (Word16) 0x2000 ) ) || ( ( EQ_16( st0->core, TCX_20_CORE ) && ( EQ_16( st0->hTcxCfg->tcx_last_overlap_mode, MIN_OVERLAP ) || EQ_16( st0->hTcxCfg->tcx_last_overlap_mode, HALF_OVERLAP ) ) ) || EQ_16( st0->core, TCX_10_CORE ) ); move16(); @@ -1417,12 +1512,13 @@ void stereo_dft_dec_fx( The prev_old_bfi still holds the prev_bfi for the current frame. */ /* make sure number of bands corresponds to output bwidth in case it is lower than parameter bwidth */ move16(); - IF( LT_16( output_frame, inner_frame_tbl[st0->bwidth] ) && EQ_16( sba_dirac_stereo_flag, 0 ) ) + test(); + IF( LT_16( output_frame, inner_frame_tbl[st0->bwidth] ) && ( sba_dirac_stereo_flag == 0 ) ) { hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); } - IF( EQ_16( st0->bfi, 0 ) ) + IF( st0->bfi == 0 ) { /* Smoothing for the current frame */ IF( sba_dirac_stereo_flag ) @@ -1439,7 +1535,7 @@ void stereo_dft_dec_fx( move32(); IF( prev_bfi ) { - dmx_nrg = stereo_dft_dmx_swb_nrg_fx( DFT[0], DFT[0] + STEREO_DFT32MS_N_MAX, min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), 0, 0 ); + dmx_nrg = stereo_dft_dmx_swb_nrg_fx( DFT[0], DFT[0] + STEREO_DFT32MS_N_MAX, s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), 0, 0 ); } @@ -1489,6 +1585,7 @@ void stereo_dft_dec_fx( #endif /* Use coarse band partition in inactive frames */ + test(); IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { NFFT_inner = i_mult( ( STEREO_DFT32MS_N_MAX / L_FRAME48k ), inner_frame_tbl[st0->bwidth] ); @@ -1501,18 +1598,19 @@ void stereo_dft_dec_fx( hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX; } + test(); IF( !( sba_dirac_stereo_flag && GE_16( nchan_transport, 2 ) ) ) { - stereo_dft_generate_res_pred_fx( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + k * STEREO_DFT32MS_N_MAX, &stop, st0->bfi ); + stereo_dft_generate_res_pred_fx( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ), &stop, st0->bfi ); } - IF( GT_16( hStereoDft->res_cod_band_max, 0 ) ) + IF( hStereoDft->res_cod_band_max > 0 ) { IF( !st0->bfi ) { IF( EQ_16( k, 1 ) ) { - Copy32( pDFT_RES, hStereoDft->res_mem_fx, 2 * hStereoDft->band_limits[hStereoDft->res_cod_band_max] ); + Copy32( pDFT_RES, hStereoDft->res_mem_fx, shl( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ) ); hStereoDft->time_offs = 0; move16(); } @@ -1525,6 +1623,7 @@ void stereo_dft_dec_fx( /* Apply active DMX */ /* pDFT_RES is used for the second channel in inactive frames */ + test(); IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { DFT_L[0] = pDFT_DMX[0]; @@ -1540,7 +1639,8 @@ void stereo_dft_dec_fx( move32(); } - IF( hStereoDft->frame_sid_nodata || EQ_16( st0->VAD, 0 ) ) + test(); + if ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) ) { hFdCngDec->cna_nbands = 0; move16(); @@ -1550,6 +1650,7 @@ void stereo_dft_dec_fx( { g = extract_h( pSideGain[b] ); move16(); + test(); IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { g = hStereoDft->g_state_fx[b]; @@ -1557,7 +1658,9 @@ void stereo_dft_dec_fx( } /* store side gains from inactive frames for later use by the stereo CNA */ - IF( LT_16( hStereoDft->band_limits[b], L_FRAME16k ) && ( hStereoDft->frame_sid_nodata || EQ_16( st0->VAD, 0 ) ) ) + test(); + test(); + IF( LT_16( hStereoDft->band_limits[b], L_FRAME16k ) && ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) ) ) { hFdCngDec->cna_nbands = add( b, 1 ); move16(); @@ -1568,6 +1671,8 @@ void stereo_dft_dec_fx( } /* No residual coding in inactive frames, instead pDFT_RES is used for the second channel */ + test(); + test(); IF( GE_16( b, hStereoDft->res_cod_band_max ) && !hStereoDft->frame_sid_nodata && !( sba_dirac_stereo_flag && hMdDec ) ) { /*filter non-coded frequencies. It removes some MDCT frequency aliasing*/ @@ -1580,6 +1685,8 @@ void stereo_dft_dec_fx( } } + test(); + test(); IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { /* Low pass filter coherence */ @@ -1597,7 +1704,7 @@ void stereo_dft_dec_fx( gamma = BASOP_Util_Divide3232_Scale( gamma, sub( MAX_16, gamma ), &q_loc1 ); l_gamma = L_deposit_l( gamma ); op1 = L_add( l_gamma, L_shr( L_deposit_l( sub( MAX_16, mult( g, g ) ) ), q_loc1 ) ); - q_loc1 = Q16 + q_loc1; + q_loc1 = add( Q16, q_loc1 ); q_loc2 = q_loc1; op1 = Sqrt32( op1, &q_loc1 ); op2 = Sqrt32( l_gamma, &q_loc2 ); @@ -1623,9 +1730,9 @@ void stereo_dft_dec_fx( DFT_R[2 * i] = Msub_32_16( Msub_32_16( pDFT_DMX[2 * i], pDFT_DMX[2 * i], g ), pDFT_RES[2 * i], gamma ); move32(); - DFT_L[2 * i + 1] = Madd_32_16( Madd_32_16( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1], g ), pDFT_RES[2 * i + 1], gamma ); + DFT_L[add( shl( i, 1 ), 1 )] = Madd_32_16( Madd_32_16( pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )], g ), pDFT_RES[add( shl( i, 1 ), 1 )], gamma ); move32(); - DFT_R[2 * i + 1] = Msub_32_16( Msub_32_16( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1], g ), pDFT_RES[2 * i + 1], gamma ); + DFT_R[add( shl( i, 1 ), 1 )] = Msub_32_16( Msub_32_16( pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )], g ), pDFT_RES[add( shl( i, 1 ), 1 )], gamma ); move32(); } @@ -1652,6 +1759,7 @@ void stereo_dft_dec_fx( IF( EQ_16( c0, ONE_IN_Q14 ) ) { c0 = MAX_16; + move16(); } ELSE { @@ -1661,8 +1769,8 @@ void stereo_dft_dec_fx( FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) { /*rotate L*/ - tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[2 * i + 1], s0 ); - DFT_L[2 * i + 1] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[2 * i + 1], c0 ); + tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[add( shl( i, 1 ), 1 )], s0 ); + DFT_L[add( shl( i, 1 ), 1 )] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[add( shl( i, 1 ), 1 )], c0 ); move32(); DFT_L[2 * i] = tmp; move32(); @@ -1686,47 +1794,47 @@ void stereo_dft_dec_fx( move32(); DFT_R[2 * i] = 0; move32(); - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[add( shl( i, 1 ), 1 )] ); move32(); - DFT_L[2 * i + 1] = DFT_W; + DFT_L[add( shl( i, 1 ), 1 )] = DFT_W; move32(); - DFT_R[2 * i + 1] = 0; + DFT_R[add( shl( i, 1 ), 1 )] = 0; move32(); } FOR( i = hStereoDft->band_limits[b]; i < min( stop, hStereoDft->band_limits[b + 1] ); i++ ) { - DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ), - L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS], - L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS], - hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ), + DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ), + L_add( hStereoDft->mixer_mat_smooth_fx[0][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + L_add( hStereoDft->mixer_mat_smooth_fx[0][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + hStereoDft->mixer_mat_smooth_fx[0][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), DFT_PRED_RES[2 * i] ); DFT_L[2 * i] = DFT_W; move32(); DFT_R[2 * i] = 0; move32(); - DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ), - L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS], - L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS], - hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ), - DFT_PRED_RES[2 * i + 1] ); - DFT_L[2 * i + 1] = DFT_W; + DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ), + L_add( hStereoDft->mixer_mat_smooth_fx[0][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + L_add( hStereoDft->mixer_mat_smooth_fx[0][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + hStereoDft->mixer_mat_smooth_fx[0][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), + DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); + DFT_L[add( shl( i, 1 ), 1 )] = DFT_W; move32(); - DFT_R[2 * i + 1] = 0; + DFT_R[add( shl( i, 1 ), 1 )] = 0; move32(); } FOR( ; i < hStereoDft->band_limits[b + 1]; i++ ) { - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); DFT_L[2 * i] = DFT_W; move32(); DFT_R[2 * i] = 0; move32(); - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); - DFT_L[2 * i + 1] = DFT_W; + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); + DFT_L[add( shl( i, 1 ), 1 )] = DFT_W; move32(); - DFT_R[2 * i + 1] = 0; + DFT_R[add( shl( i, 1 ), 1 )] = 0; move32(); } } @@ -1736,16 +1844,16 @@ void stereo_dft_dec_fx( { i = 0; move16(); - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); - DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); + DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); move32(); DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); move32(); - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); - DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); + DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); move32(); @@ -1754,15 +1862,15 @@ void stereo_dft_dec_fx( } FOR( i = hStereoDft->band_limits[b]; i < min( stop, hStereoDft->band_limits[b + 1] ); i++ ) { - DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ), - L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS], - L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS], - hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ), + DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ), + L_add( hStereoDft->mixer_mat_smooth_fx[0][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + L_add( hStereoDft->mixer_mat_smooth_fx[0][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + hStereoDft->mixer_mat_smooth_fx[0][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), DFT_PRED_RES[2 * i] ); - DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ), - L_add( hStereoDft->mixer_mat_smooth_fx[1][1][b + k * IVAS_MAX_NUM_BANDS], - L_add( hStereoDft->mixer_mat_smooth_fx[1][2][b + k * IVAS_MAX_NUM_BANDS], - hStereoDft->mixer_mat_smooth_fx[1][3][b + k * IVAS_MAX_NUM_BANDS] ) ), + DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ), + L_add( hStereoDft->mixer_mat_smooth_fx[1][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + L_add( hStereoDft->mixer_mat_smooth_fx[1][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + hStereoDft->mixer_mat_smooth_fx[1][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), DFT_PRED_RES[2 * i] ); DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); @@ -1770,38 +1878,38 @@ void stereo_dft_dec_fx( DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); move32(); - DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ), - L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS], - L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS], - hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ), - DFT_PRED_RES[2 * i + 1] ); - DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ), - L_add( hStereoDft->mixer_mat_smooth_fx[1][1][b + k * IVAS_MAX_NUM_BANDS], - L_add( hStereoDft->mixer_mat_smooth_fx[1][2][b + k * IVAS_MAX_NUM_BANDS], - hStereoDft->mixer_mat_smooth_fx[1][3][b + k * IVAS_MAX_NUM_BANDS] ) ), - DFT_PRED_RES[2 * i + 1] ); - - DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); + DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ), + L_add( hStereoDft->mixer_mat_smooth_fx[0][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + L_add( hStereoDft->mixer_mat_smooth_fx[0][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + hStereoDft->mixer_mat_smooth_fx[0][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), + DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); + DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ), + L_add( hStereoDft->mixer_mat_smooth_fx[1][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + L_add( hStereoDft->mixer_mat_smooth_fx[1][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + hStereoDft->mixer_mat_smooth_fx[1][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), + DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); + + DFT_L[add( shl( i, 1 ), 1 )] = L_add( DFT_W, DFT_Y ); move32(); - DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); + DFT_R[add( shl( i, 1 ), 1 )] = L_sub( DFT_W, DFT_Y ); move32(); } FOR( ; i < hStereoDft->band_limits[b + 1]; i++ ) { - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); - DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); + DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); move32(); DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); move32(); - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); - DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); + DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); - DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); + DFT_L[add( shl( i, 1 ), 1 )] = L_add( DFT_W, DFT_Y ); move32(); - DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); + DFT_R[add( shl( i, 1 ), 1 )] = L_sub( DFT_W, DFT_Y ); move32(); } } @@ -1815,40 +1923,40 @@ void stereo_dft_dec_fx( DFT_W = pDFT_DMX[2 * i]; move32(); - DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); + DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); move32(); DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); move32(); - DFT_W = pDFT_DMX[2 * i + 1]; + DFT_W = pDFT_DMX[add( shl( i, 1 ), 1 )]; move32(); - DFT_Y = Madd_32_32( pDFT_DMX1[2 * i + 1], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); + DFT_Y = Madd_32_32( pDFT_DMX1[add( shl( i, 1 ), 1 )], hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); - DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); + DFT_L[add( shl( i, 1 ), 1 )] = L_add( DFT_W, DFT_Y ); move32(); - DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); + DFT_R[add( shl( i, 1 ), 1 )] = L_sub( DFT_W, DFT_Y ); move32(); } FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) { DFT_W = pDFT_DMX[2 * i]; move32(); - DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); + DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); move32(); DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); move32(); - DFT_W = pDFT_DMX[2 * i + 1]; + DFT_W = pDFT_DMX[add( shl( i, 1 ), 1 )]; move32(); - DFT_Y = Madd_32_32( pDFT_DMX1[2 * i + 1], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); + DFT_Y = Madd_32_32( pDFT_DMX1[add( shl( i, 1 ), 1 )], hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); - DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); + DFT_L[add( shl( i, 1 ), 1 )] = L_add( DFT_W, DFT_Y ); move32(); - DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); + DFT_R[add( shl( i, 1 ), 1 )] = L_sub( DFT_W, DFT_Y ); move32(); } } @@ -1868,11 +1976,11 @@ void stereo_dft_dec_fx( DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); move32(); - tmp = L_add( Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g ), DFT_PRED_RES[2 * i + 1] ); + tmp = L_add( Madd_32_16( pDFT_RES[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )], g ), DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); - DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); + DFT_L[add( shl( i, 1 ), 1 )] = L_add( pDFT_DMX[add( shl( i, 1 ), 1 )], tmp ); move32(); - DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); + DFT_R[add( shl( i, 1 ), 1 )] = L_sub( pDFT_DMX[add( shl( i, 1 ), 1 )], tmp ); move32(); } @@ -1887,16 +1995,17 @@ void stereo_dft_dec_fx( tmp = Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g ); - DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); + DFT_L[add( shl( i, 1 ), 1 )] = L_add( pDFT_DMX[add( shl( i, 1 ), 1 )], tmp ); move32(); - DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); + DFT_R[add( shl( i, 1 ), 1 )] = L_sub( pDFT_DMX[add( shl( i, 1 ), 1 )], tmp ); move32(); } /* Active Upmix */ - IF( NE_32( pgIpd[0], 0 ) ) + IF( pgIpd[0] != 0 ) { Word32 theta = pgIpd[0]; + move32(); WHILE( GT_32( theta, EVS_2PI_FX_Q27 ) ) { theta = L_sub( theta, EVS_2PI_FX_Q27 ); @@ -1917,6 +2026,7 @@ void stereo_dft_dec_fx( IF( EQ_16( c0, ONE_IN_Q14 ) ) { c0 = MAX_16; + move16(); } ELSE { @@ -1926,8 +2036,8 @@ void stereo_dft_dec_fx( FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) { /*rotate L*/ - tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[2 * i + 1], s0 ); - DFT_L[2 * i + 1] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[2 * i + 1], c0 ); + tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[add( shl( i, 1 ), 1 )], s0 ); + DFT_L[add( shl( i, 1 ), 1 )] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[add( shl( i, 1 ), 1 )], c0 ); move32(); DFT_L[2 * i] = tmp; move32(); @@ -1936,12 +2046,14 @@ void stereo_dft_dec_fx( } } - IF( hStereoDft->frame_sid_nodata || EQ_16( st0->VAD, 0 ) ) + test(); + if ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) ) { hFdCngDec->cna_band_limits[hFdCngDec->cna_nbands] = hStereoDft->band_limits[hFdCngDec->cna_nbands]; move16(); } + test(); IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { hStereoCng->first_SID = 0; @@ -2007,6 +2119,7 @@ void stereo_dft_dec_fx( IF( GT_16( hFdCngDec->cna_rescale_fact_fx, 0 ) ) { Word16 q_scale_fact0 = 0; + move16(); Word16 op = Sqrt16( shr( hFdCngDec->cna_rescale_fact_fx, 1 ), &q_scale_fact0 ); move16(); scale_fact0 = L_mult0( shr( output_frame, 1 ), op ); @@ -2034,22 +2147,25 @@ void stereo_dft_dec_fx( gamma = coh; move16(); gamma = BASOP_Util_Divide3232_Scale( gamma, sub( (Word16) 0x7FFF, gamma ), &q_gamma ); - IF( EQ_16( gamma, 0 ) ) + if ( gamma == 0 ) { q_gamma = 0; + move16(); } l_gamma = L_deposit_l( gamma ); op1 = L_add( l_gamma, L_shr( L_deposit_l( sub( MAX_16, mult( g, g ) ) ), q_gamma ) ); - q_loc2 = Q16 + q_gamma; + q_loc2 = add( Q16, q_gamma ); q_loc1 = q_loc2; + move16(); op1 = Sqrt32( op1, &q_loc1 ); op2 = Sqrt32( l_gamma, &q_loc2 ); - IF( NE_32( op2, 0 ) ) + IF( op2 != 0 ) { IF( NE_16( q_loc1, q_loc2 ) ) { op2 = L_shl( op2, sub( q_loc2, q_loc1 ) ); q_loc2 = q_loc1; + move16(); } gamma = extract_h( L_sub( op1, op2 ) ); gamma = shl( gamma, q_loc2 ); @@ -2062,6 +2178,7 @@ void stereo_dft_dec_fx( ELSE { gamma = 0; + move16(); } FOR( i = s_max( hFdCngDec->cna_band_limits[b], shr( hFdCngCom->startBand, 1 ) ); i < s_min( hFdCngDec->cna_band_limits[b + 1], ( L_FRAME16k ) >> 1 ); i++ ) @@ -2072,7 +2189,9 @@ void stereo_dft_dec_fx( lev2 = *ptr_per++; move32(); - IF( GT_32( lev1, 0 ) && GT_32( lev2, 0 ) && GT_32( Mpy_32_16_1( L_max( lev1, lev2 ), (Word16) 0x6AAB ), L_min( lev1, lev2 ) ) ) + test(); + test(); + IF( ( lev1 > 0 ) && ( lev2 > 0 ) && GT_32( Mpy_32_16_1( L_max( lev1, lev2 ), (Word16) 0x6AAB ), L_min( lev1, lev2 ) ) ) { /* take the minimum of two adjacent frequency bins */ cna_level = L_min( lev1, lev2 ); @@ -2127,9 +2246,11 @@ void stereo_dft_dec_fx( } /* Update memories */ - hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + 1 ) & ( STEREO_DFT_PAST_MAX - 1 ); + hStereoDft->past_DMX_pos = s_and( ( add( hStereoDft->past_DMX_pos, 1 ) ), ( STEREO_DFT_PAST_MAX - 1 ) ); + move16(); Copy32( pDFT_DMX, hStereoDft->DFT_past_DMX_fx[hStereoDft->past_DMX_pos], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); hStereoDft->q_DFT_past_DMX_fx[hStereoDft->past_DMX_pos] = hStereoDft->q_dft; + move16(); IF( pPredGain ) { stereo_dft_adapt_sf_delay_fx( hStereoDft, pPredGain ); @@ -2187,7 +2308,8 @@ static void stereo_dft_compute_td_stefi_params_fx( bres = hStereoDft->band_res[1]; move16(); - IF( NE_16( hStereoDft->core_hist[1], ACELP_CORE ) || hStereoDft->wasTransient ) + test(); + IF( ( hStereoDft->core_hist[1] != ACELP_CORE ) || hStereoDft->wasTransient ) { hStereoDft->td_gain_fx[0] = 0; move32(); @@ -2203,9 +2325,10 @@ static void stereo_dft_compute_td_stefi_params_fx( move16(); WHILE( GT_16( hStereoDft->band_limits[b], bin0 ) ) { - b--; + b = sub( b, 1 ); } band0 = b; + move16(); /* calculate averages over high bands */ pred_g = pred_gain_avg = 0; @@ -2215,7 +2338,7 @@ static void stereo_dft_compute_td_stefi_params_fx( move16(); wsum = 0; move32(); - shift_g = Q15 - norm_s( sub( hStereoDft->nbands, band0 ) ); + shift_g = sub( Q15, norm_s( sub( hStereoDft->nbands, band0 ) ) ); FOR( b = band0; b < hStereoDft->nbands; b++ ) { IF( LT_32( L_min( hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 1, pdmx_ind )][b], hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 2, pdmx_ind )][b] ), 0 ) ) @@ -2235,7 +2358,7 @@ static void stereo_dft_compute_td_stefi_params_fx( dft_res_pred_weights_fx[bres][b - band0] ), shift_g ) ); - nbands++; + nbands = add( nbands, 1 ); wsum = L_add( wsum, dft_res_pred_weights_fx[bres][b - band0] ); #ifdef DBG_TD_STEFI printf( "frame: %d\tband: %-2d\tpred_gain1: %f\tpred_gain2: %f\tppg1: %f\tppg2: %f\n", frame, b, hStereoDft->res_pred_gain[b + STEREO_DFT_BAND_MAX], hStereoDft->res_pred_gain[b + 2 * STEREO_DFT_BAND_MAX], hStereoDft->past_res_pred_gain[STEREO_DFT_TD_STEFI_SUBFR_DELAY - 2][b], hStereoDft->past_res_pred_gain[d_short - 1][b] ); @@ -2267,29 +2390,33 @@ static void stereo_dft_compute_td_stefi_params_fx( { pred_gain_avg = L_shl( pred_gain_avg, q_div ); q_pred_gain_avg = 15; + move16(); } ELSE { q_pred_gain_avg = sub( 15, q_div ); - ; } nrg_DMX = hStereoDft->hb_nrg_fx[0]; + move32(); nrg_pred_DMX = hStereoDft->hb_nrg_fx[1]; + move32(); op1 = BASOP_Util_Divide3232_Scale( L_add( EPSILON_FIX, nrg_DMX ), L_add( EPSILON_FIX, nrg_pred_DMX ), &q_div ); - q_sqrt = Q16 + q_div; + q_sqrt = add( Q16, q_div ); op1 = Sqrt32( op1, &q_sqrt ); g2 = Mpy_32_32( pred_g, op1 ); IF( LT_16( q_sqrt, 0 ) ) { g2 = L_shl( g2, q_sqrt ); q_sqrt = 0; + move16(); } - ELSE IF( NE_16( q_sqrt, 0 ) ) + ELSE IF( q_sqrt != 0 ) { IF( LT_32( L_shr( pred_gain_avg, q_sqrt ), g2 ) ) { g2 = pred_gain_avg; + move32(); } ELSE { @@ -2382,6 +2509,7 @@ void stereo_dft_generate_res_pred_fx( /* variables for enhanced stereo filling */ Word16 norm_fac, q_norm_fac = 0, lim_norm_fac; + move16(); Word16 q_sqrt; Word16 alpha; // gain_limit; @@ -2397,9 +2525,18 @@ void stereo_dft_generate_res_pred_fx( push_wmops( "gen_respred" ); /* smoothing and limiting parameters */ - alpha = hStereoDft->wasTransient ? 0 : (Word16) ( 0x199A ); /* no smoothing after transients */ + // alpha = hStereoDft->wasTransient ? 0 : (Word16) ( 0x199A ); /* no smoothing after transients */ + IF( hStereoDft->wasTransient ) + { + alpha = 0; + move16(); + } + ELSE + { + alpha = (Word16) ( 0x199A ); + move16(); + } // gain_limit = 0x7FFF; // 2.0 in Q14 - move16(); /* residual prediction only used up to 16 kHz (SWB) */ nbands_respred = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); @@ -2413,7 +2550,7 @@ void stereo_dft_generate_res_pred_fx( move16(); WHILE( GE_16( hStereoDft->band_limits[b], bin0 ) ) { - b--; + b = sub( b, 1 ); } band0 = b; move16(); @@ -2453,10 +2590,10 @@ void stereo_dft_generate_res_pred_fx( /* Saturating below calculations (to be rechecked?) */ dmx_nrg = L_add_sat( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), - pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ) ); + pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )] ) ); rev_nrg = L_add_sat( rev_nrg, Madd_32_32( Mpy_32_32( ap_filt_DMX[2 * i], ap_filt_DMX[2 * i] ), - ap_filt_DMX[2 * i + 1], ap_filt_DMX[2 * i + 1] ) ); + ap_filt_DMX[add( shl( i, 1 ), 1 )], ap_filt_DMX[add( shl( i, 1 ), 1 )] ) ); } IF( LT_16( hStereoDft->q_smoothed_nrg, hStereoDft->q_dft ) ) { @@ -2481,39 +2618,56 @@ void stereo_dft_generate_res_pred_fx( { norm_fac = BASOP_Util_Divide3232_Scale( hStereoDft->smooth_dmx_nrg_fx[b], hStereoDft->smooth_res_nrg_fx[b], &q_norm_fac ); norm_fac = Sqrt16( norm_fac, &q_norm_fac ); - IF( NE_16( norm_fac, 0 ) ) + IF( norm_fac != 0 ) { /* gain compressor */ - IF( LE_16( q_norm_fac, -Q1 ) || ( EQ_16( q_norm_fac, Q1 ) && GT_16( (Word16) 0x3333, norm_fac ) ) || ( EQ_16( q_norm_fac, 0 ) && GT_16( (Word16) 0x6666, norm_fac ) ) ) + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( LE_16( q_norm_fac, -Q1 ) || ( EQ_16( q_norm_fac, Q1 ) && GT_16( (Word16) 0x3333, norm_fac ) ) || ( ( q_norm_fac == 0 ) && GT_16( (Word16) 0x6666, norm_fac ) ) ) { lim_norm_fac = (Word16) 0x5000; + move16(); } - ELSE IF( GT_16( q_norm_fac, Q1 ) || ( EQ_16( q_norm_fac, Q1 ) && LT_16( (Word16) 0x5000, norm_fac ) ) || ( EQ_16( q_norm_fac, 0 ) && GT_16( (Word16) 0x6666, norm_fac ) ) ) + ELSE IF( GT_16( q_norm_fac, Q1 ) || ( EQ_16( q_norm_fac, Q1 ) && LT_16( (Word16) 0x5000, norm_fac ) ) || ( ( q_norm_fac == 0 ) && GT_16( (Word16) 0x6666, norm_fac ) ) ) { lim_norm_fac = (Word16) 0x3333; + move16(); } ELSE { lim_norm_fac = norm_fac; + move16(); } IF( EQ_16( lim_norm_fac, norm_fac ) ) { norm_fac = ONE_IN_Q14; + move16(); q_norm_fac = Q1; + move16(); } ELSE { norm_fac = extract_l( L_shr( L_mult0( norm_fac, lim_norm_fac ), Q15 ) ); q_norm_fac = add( q_norm_fac, 1 ); - IF( LT_16( q_norm_fac, 0 ) ) + test(); + IF( q_norm_fac < 0 ) { norm_fac = shl( norm_fac, q_norm_fac ); q_norm_fac = 0; + move16(); } ELSE IF( GT_16( q_norm_fac, 2 ) && LT_16( norm_s( norm_fac ), sub( q_norm_fac, Q1 ) ) ) { norm_fac = MAX_16; + move16(); q_norm_fac = Q1; + move16(); } } } @@ -2521,14 +2675,16 @@ void stereo_dft_generate_res_pred_fx( ELSE { norm_fac = MAX_16; + move16(); q_norm_fac = Q1; + move16(); } FOR( i = hStereoDft->band_limits[b]; i < s_min( hStereoDft->band_limits[b + 1], bin0 ); i++ ) { DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i] ), q_norm_fac ); move32(); - DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i + 1] ), q_norm_fac ); + DFT_PRED_RES[add( shl( i, 1 ), 1 )] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[add( shl( i, 1 ), 1 )] ), q_norm_fac ); move32(); } } @@ -2536,13 +2692,14 @@ void stereo_dft_generate_res_pred_fx( IF( GT_16( hStereoDft->q_smoothed_nrg, hStereoDft->q_dft ) ) { hStereoDft->q_smoothed_nrg = hStereoDft->q_dft; + move16(); } #endif } ELSE IF( EQ_16( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET], STEREO_DFT_RESPRED_STEFI ) ) { /* stefi in lowband */ - set_l( DFT_PRED_RES, 0, 2 * hStereoDft->band_limits[lb_stefi_start_band] ); + set32_fx( DFT_PRED_RES, 0, shl( hStereoDft->band_limits[lb_stefi_start_band], 1 ) ); FOR( b = lb_stefi_start_band; b <= band0; b++ ) { @@ -2552,7 +2709,7 @@ void stereo_dft_generate_res_pred_fx( move16(); /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/ - d_short_ind = max( d_short_ind, d_long_ind ); + d_short_ind = s_max( d_short_ind, d_long_ind ); move16(); /* Even number of window sliding (assymmetric OLA) */ @@ -2563,7 +2720,9 @@ void stereo_dft_generate_res_pred_fx( d_long = sub( STEREO_DFT_PAST_MAX, d_long_ind ); d_short_ind = add( add( d_short_ind, hStereoDft->past_DMX_pos ), 1 ) % STEREO_DFT_PAST_MAX; + move16(); d_long_ind = add( add( d_long_ind, hStereoDft->past_DMX_pos ), 1 ) % STEREO_DFT_PAST_MAX; + move16(); g_short = hStereoDft->stefi_short_gain_fx; move16(); @@ -2580,6 +2739,7 @@ void stereo_dft_generate_res_pred_fx( } /* Avoid transient components */ + test(); IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], EVS_LW_MIN ) && EQ_32( hStereoDft->past_res_pred_gain_fx[d_long_ind][b], EVS_LW_MIN ) ) { g_long = 0; @@ -2602,7 +2762,7 @@ void stereo_dft_generate_res_pred_fx( move16(); } - IF( GT_16( s_max( g_short, g_long ), 0 ) ) + IF( s_max( g_short, g_long ) > 0 ) { Word16 q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] ); Word16 q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_long_ind] ); @@ -2612,20 +2772,21 @@ void stereo_dft_generate_res_pred_fx( move32(); FOR( i = hStereoDft->band_limits[b]; i < min( bin0, hStereoDft->band_limits[b + 1] ); i++ ) { - dmx_nrg = Madd_32_32( Madd_32_32( dmx_nrg, pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ); + dmx_nrg = Madd_32_32( Madd_32_32( dmx_nrg, pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); DFT_PRED_RES[2 * i] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i], g_long ), q_shift1 ) ); move32(); - DFT_PRED_RES[2 * i + 1] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i + 1], g_long ), q_shift1 ) ); + DFT_PRED_RES[add( shl( i, 1 ), 1 )] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][add( shl( i, 1 ), 1 )], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][add( shl( i, 1 ), 1 )], g_long ), q_shift1 ) ); move32(); - past_dmx_nrg = Madd_32_32( Madd_32_32( past_dmx_nrg, DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[2 * i + 1], DFT_PRED_RES[2 * i + 1] ); + past_dmx_nrg = Madd_32_32( Madd_32_32( past_dmx_nrg, DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[add( shl( i, 1 ), 1 )], DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); } IF( !bfi || GE_16( b, hStereoDft->res_cod_band_max ) ) { Word16 q_div; Word16 op; - op = BASOP_Util_Divide3232_Scale( ( 1 + dmx_nrg ), ( 1 + past_dmx_nrg ), &q_div ); + op = BASOP_Util_Divide3232_Scale( L_add( 1, dmx_nrg ), L_add( 1, past_dmx_nrg ), &q_div ); q_sqrt = q_div; + move16(); norm_fac = Sqrt16( op, &q_sqrt ); g2 = Mpy_32_16_1( pPredGain[b], norm_fac ); IF( LE_32( q_sqrt, norm_l( g2 ) ) ) @@ -2638,6 +2799,7 @@ void stereo_dft_generate_res_pred_fx( Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( MAX_16, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ), g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); q_sqrt = 0; + move16(); } ELSE { @@ -2646,13 +2808,14 @@ void stereo_dft_generate_res_pred_fx( g2 = Madd_32_16( Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ), hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); q_sqrt = 0; + move16(); } FOR( i = hStereoDft->band_limits[b]; i < min( bin0, hStereoDft->band_limits[b + 1] ); i++ ) { DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[2 * i] ), q_sqrt ); move32(); - DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[2 * i + 1] ), q_sqrt ); + DFT_PRED_RES[add( shl( i, 1 ), 1 )] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[add( shl( i, 1 ), 1 )] ), q_sqrt ); move32(); } } @@ -2667,13 +2830,14 @@ void stereo_dft_generate_res_pred_fx( IF( GT_16( hStereoDft->band_limits[nbands_respred], bin0 ) ) { /* apply stereo filling in ACELP BWE region */ - IF( EQ_16( hStereoDft->core_hist[0], ACELP_CORE ) && EQ_16( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2], ACELP_CORE ) ) + test(); + IF( ( hStereoDft->core_hist[0] == ACELP_CORE ) && ( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2] == ACELP_CORE ) ) { /* ACELP -> ACELP: nothing to do */ *stop = bin0; move16(); } - ELSE IF( EQ_16( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2], ACELP_CORE ) ) + ELSE IF( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2] == ACELP_CORE ) { /* ACELP -> TCX/HQ core transition */ /* calculate high band energy only */ @@ -2681,57 +2845,73 @@ void stereo_dft_generate_res_pred_fx( move32(); FOR( i = bin0; i < shr( hStereoDft->NFFT, 1 ); i++ ) { - dmx_nrg = L_add( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ) ); + dmx_nrg = L_add( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )] ) ); } hStereoDft->hb_nrg_fx[0] = dmx_nrg, L_shr( hStereoDft->NFFT, 1 ); + move32(); *stop = bin0; move16(); } - ELSE IF( EQ_16( hStereoDft->core_hist[0], ACELP_CORE ) ) + ELSE IF( hStereoDft->core_hist[0] == ACELP_CORE ) { /* TCX/HQ core -> ACELP transition */ /* apply short delay only and blend to long/short gain */ dmx_nrg = hStereoDft->hb_nrg_subr_fx[k]; + move32(); d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_TD_STEFI_SUBFR_DELAY; + move16(); - d_short_ind = add( d_short_ind, add( hStereoDft->past_DMX_pos, 1 ) ) & ( STEREO_DFT_PAST_MAX - 1 ); + d_short_ind = s_and( add( d_short_ind, add( hStereoDft->past_DMX_pos, 1 ) ), ( STEREO_DFT_PAST_MAX - 1 ) ); /* calculate high band energy of past dmx */ // past_dmx_nrg = EPSILON_FIX; past_dmx_nrg = 0; + move32(); FOR( i = bin0; i < s_min( shr( hStereoDft->NFFT, 1 ), STEREO_DFT32MS_N_32k / 2 ); i++ ) { - past_dmx_nrg = L_add( past_dmx_nrg, Madd_32_32( Mpy_32_32( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i] ), hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1] ) ); + past_dmx_nrg = L_add( past_dmx_nrg, Madd_32_32( Mpy_32_32( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i] ), hStereoDft->DFT_past_DMX_fx[d_short_ind][add( shl( i, 1 ), 1 )], hStereoDft->DFT_past_DMX_fx[d_short_ind][add( shl( i, 1 ), 1 )] ) ); } past_dmx_nrg = L_shl( past_dmx_nrg, shl( sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] ), 1 ) ); - IF( EQ_32( past_dmx_nrg, 0 ) ) + IF( past_dmx_nrg == 0 ) { past_dmx_nrg = EPSILON_FX; + move32(); } FOR( b = band0; b < nbands_respred; b++ ) { - g_short = LT_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], 0 ) ? 0 : add( ONE_IN_Q14, shr( hStereoDft->stefi_short_gain_fx, 1 ) ); + // g_short = LT_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], 0 ) ? 0 : add( ONE_IN_Q14, shr( hStereoDft->stefi_short_gain_fx, 1 ) ); + IF( hStereoDft->past_res_pred_gain_fx[d_short_ind][b] < 0 ) + { + g_short = 0; + move16(); + } + ELSE + { + g_short = add( ONE_IN_Q14, shr( hStereoDft->stefi_short_gain_fx, 1 ) ); + } - IF( GT_16( g_short, 0 ) ) + IF( g_short > 0 ) { Word16 q_divide, q_shift; - Word32 op = BASOP_Util_Divide3232_Scale( ( EPSILON_FIX + dmx_nrg ), ( EPSILON_FIX + past_dmx_nrg ), &q_divide ); - q_norm_fac = Q16 + q_divide + hStereoDft->q_hb_nrg_subr; + Word32 op = BASOP_Util_Divide3232_Scale( L_add( EPSILON_FIX, dmx_nrg ), L_add( EPSILON_FIX, past_dmx_nrg ), &q_divide ); + q_norm_fac = add( add( Q16, q_divide ), hStereoDft->q_hb_nrg_subr ); op = Sqrt32( op, &q_norm_fac ); g2 = Mpy_32_32( pPredGain[b], op ); pred_gain_avg = Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ); - IF( LT_16( q_norm_fac, 0 ) ) + IF( q_norm_fac < 0 ) { g2 = L_shl( g2, q_norm_fac ); q_norm_fac = 0; + move16(); } - ELSE IF( NE_16( q_norm_fac, 0 ) ) + ELSE IF( q_norm_fac != 0 ) { IF( LT_32( L_shr( pred_gain_avg, q_norm_fac ), g2 ) ) { g2 = pred_gain_avg; + move32(); } ELSE { @@ -2753,7 +2933,7 @@ void stereo_dft_generate_res_pred_fx( { DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( g2, hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i] ), q_shift ); move32(); - DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( g2, hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1] ), q_shift ); + DFT_PRED_RES[add( shl( i, 1 ), 1 )] = L_shl( Mpy_32_32( g2, hStereoDft->DFT_past_DMX_fx[d_short_ind][add( shl( i, 1 ), 1 )] ), q_shift ); move32(); } } @@ -2763,7 +2943,7 @@ void stereo_dft_generate_res_pred_fx( move16(); end = min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); move16(); - set_l( DFT_PRED_RES + 2 * begin, 0, 2 * ( end - begin ) ); + set32_fx( DFT_PRED_RES + shl( begin, 1 ), 0, shl( sub( end, begin ), 1 ) ); } } } @@ -2857,17 +3037,18 @@ void stereo_dft_generate_res_pred_fx( move32(); FOR( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) { - dmx_nrg = L_add( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ) ); + dmx_nrg = L_add( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )] ) ); DFT_PRED_RES[2 * i] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i], g_long ), q_shift1 ) ); move32(); - DFT_PRED_RES[2 * i + 1] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i + 1], g_long ), q_shift1 ) ); + DFT_PRED_RES[add( shl( i, 1 ), 1 )] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][add( shl( i, 1 ), 1 )], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][add( shl( i, 1 ), 1 )], g_long ), q_shift1 ) ); move32(); past_dmx_nrg = L_add( past_dmx_nrg, Madd_32_32( Mpy_32_32( DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[2 * i + 1], DFT_PRED_RES[2 * i + 1] ) ); } op1 = L_deposit_h( BASOP_Util_Divide3232_Scale( ( EPSILON_FIX + dmx_nrg ), ( EPSILON_FIX + past_dmx_nrg ), &q_div ) ); q_norm_fac = q_div; + move16(); op1 = Sqrt32( op1, &q_norm_fac ); IF( GT_16( q_norm_fac, 16 ) ) { @@ -2885,7 +3066,7 @@ void stereo_dft_generate_res_pred_fx( { DFT_PRED_RES[2 * i] = Mpy_32_32( g2, DFT_PRED_RES[2 * i] ); move32(); - DFT_PRED_RES[2 * i + 1] = Mpy_32_32( g2, DFT_PRED_RES[2 * i + 1] ); + DFT_PRED_RES[add( shl( i, 1 ), 1 )] = Mpy_32_32( g2, DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); move32(); } } @@ -2893,7 +3074,7 @@ void stereo_dft_generate_res_pred_fx( { begin = s_max( hStereoDft->band_limits[b], bin0 ); end = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); - set_l( DFT_PRED_RES + 2 * begin, 0, 2 * ( end - begin ) ); + set32_fx( DFT_PRED_RES + shl( begin, 1 ), 0, shl( sub( end, begin ), 1 ) ); } } } @@ -2902,14 +3083,15 @@ void stereo_dft_generate_res_pred_fx( /* update buffers */ FOR( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ ) { + test(); IF( hStereoDft->attackPresent || hStereoDft->wasTransient ) { - hStereoDft->past_res_pred_gain_fx[( hStereoDft->past_DMX_pos + 1 ) & ( STEREO_DFT_PAST_MAX - 1 )][b] = MIN_32; + hStereoDft->past_res_pred_gain_fx[s_and( add( hStereoDft->past_DMX_pos, 1 ), ( STEREO_DFT_PAST_MAX - 1 ) )][b] = MIN_32; move32(); } ELSE { - hStereoDft->past_res_pred_gain_fx[( hStereoDft->past_DMX_pos + 1 ) & ( STEREO_DFT_PAST_MAX - 1 )][b] = pPredGain[b]; + hStereoDft->past_res_pred_gain_fx[s_and( add( hStereoDft->past_DMX_pos, 1 ), ( STEREO_DFT_PAST_MAX - 1 ) )][b] = pPredGain[b]; move32(); } } @@ -2961,13 +3143,15 @@ static void stereo_dft_adapt_sf_delay_fx( { hStereoDft->lt_pred_gain_fx = L_shr( hStereoDft->lt_pred_gain_fx, sub( q_guard, hStereoDft->q_lt_pred_gain ) ); hStereoDft->q_lt_pred_gain = q_guard; + move16(); } ELSE { sum_pg = L_shr( sum_pg, sub( hStereoDft->q_lt_pred_gain, q_guard ) ); q_guard = hStereoDft->q_lt_pred_gain; + move16(); } - IF( GT_32( sum_pg, 0 ) ) + IF( sum_pg > 0 ) { /* Calculate mean of the prediction gain */ hStereoDft->lt_pred_gain_fx = Madd_32_16( Mpy_32_16_1( sum_pg, STEREO_DFT_LT_PREDGAIN_UPD_FX ), hStereoDft->lt_pred_gain_fx, sub( MAX_16, STEREO_DFT_LT_PREDGAIN_UPD_FX ) ); @@ -2984,7 +3168,7 @@ static void stereo_dft_adapt_sf_delay_fx( IF( GT_32( hStereoDft->lt_pred_gain_fx, 0 ) ) { Word32 opr2 = L_deposit_h( BASOP_Util_Divide3232_Scale( hStereoDft->lt_pred_gain_variation_fx, hStereoDft->lt_pred_gain_fx, &q_div ) ); - IF( LT_16( q_div, 0 ) ) + IF( q_div < 0 ) { opr2 = L_shl( opr2, q_div ); q_div = 0; @@ -2993,6 +3177,7 @@ static void stereo_dft_adapt_sf_delay_fx( IF( LT_32( L_shr( STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2, q_div ), opr2 ) ) { var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2; + move32(); } ELSE { @@ -3044,16 +3229,20 @@ static void stereo_dft_adapt_sf_delay_fx( /* Adapt the stereo filling delay by interpolating between two delay taps, one at the shortest delay and one at the longest delay */ hStereoDft->stefi_short_gain_fx = extract_l( L_shr( L_sub( L_shl( STEREO_DFT_STEFFI_DELAY_LONG, Q15 ), target_delay ), 1 ) ); q_sqrt = 0; + move16(); IF( hStereoDft->stefi_short_gain_fx == MIN_16 ) { hStereoDft->stefi_short_gain_fx = MAX_16; + move16(); hStereoDft->stefi_long_gain_fx = 0; + move16(); } ELSE { op = hStereoDft->stefi_short_gain_fx; + move16(); hStereoDft->stefi_long_gain_fx = Sqrt16( sub( MAX_16, mult( op, op ) ), &q_sqrt ); - IF( NE_16( q_sqrt, 0 ) ) + IF( q_sqrt != 0 ) { hStereoDft->stefi_long_gain_fx = shl( hStereoDft->stefi_long_gain_fx, q_sqrt ); } @@ -3105,6 +3294,7 @@ void stereo_dft_dec_sid_coh_fx( } } alpha_fx = dft_cng_alpha_bits_fx[alpha_step][alpha_index]; /*Q-15*/ + move16(); } ELSE { @@ -3115,7 +3305,7 @@ void stereo_dft_dec_sid_coh_fx( FOR( i = *nb_bits; i < nr_of_sid_stereo_bits; i++ ) { get_next_indice_fx( st, 1 ); - ( *nb_bits )++; + ( *nb_bits ) = add( ( *nb_bits ), 1 ); } } @@ -3157,7 +3347,7 @@ void stereo_dft_dec_sid_coh_fx( cohBandq_fx[b] = 8192; move16(); } - ELSE IF( LT_16( cohBandq_fx[b], 0 ) ) + ELSE IF( cohBandq_fx[b] < 0 ) { cohBandq_fx[b] = 0; move16(); @@ -3172,7 +3362,7 @@ void stereo_dft_dec_sid_coh_fx( FOR( i = *nb_bits; i < nr_of_sid_stereo_bits; i++ ) { get_next_indice_fx( st, 1 ); - ( *nb_bits )++; + ( *nb_bits ) = add( ( *nb_bits ), 1 ); } return; } @@ -3335,14 +3525,16 @@ void stereo_dft_dec_read_BS_fx( ELSE { hStereoDft->attackPresent = get_next_indice_fx( st, 1 ); - ( *nb_bits )++; + ( *nb_bits ) = add( ( *nb_bits ), 1 ); } /* read res_cod_mode from bitstream */ + test(); IF( EQ_16( bwidth, WB ) && hStereoDft->hConfig->ada_wb_res_cod_mode ) { hStereoDft->res_cod_mode[k_offset] = get_next_indice_fx( st, 1 ); - ( *nb_bits )++; + move16(); + ( *nb_bits ) = add( ( *nb_bits ), 1 ); } /* read number of bands in the bitstream - depends on the audio bandwidth and not to output_Fs */ @@ -3380,16 +3572,19 @@ void stereo_dft_dec_read_BS_fx( hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]]; move16(); - hStereoDft->res_cod_line_max = (Word16) L_shr( ( ( 1 << Q13 ) /*0.5f Q-14*/ + L_shl( L_mult0( sub( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ), divide1616( shr( output_frame, 1 ), ( hStereoDft->NFFT ) ) ) /*Q-14*/, 1 ) ), Q14 ); + hStereoDft->res_cod_line_max = (Word16) L_shr( L_add( ( 1 << Q13 ) /*0.5f Q-14*/, L_shl( L_mult0( sub( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ), divide1616( shr( output_frame, 1 ), ( hStereoDft->NFFT ) ) ) /*Q-14*/, 1 ) ), Q14 ); + move16(); hStereoDft->res_cod_line_max = shl( shr( hStereoDft->res_cod_line_max, 3 ), 3 ); + move16(); hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); + move16(); /*Copy config. for all DFT frames*/ - set16_fx( hStereoDft->band_res + k_offset + 1, hStereoDft->band_res[k_offset], N_div - 1 ); - set16_fx( hStereoDft->prm_res + k_offset + 1, hStereoDft->prm_res[k_offset], N_div - 1 ); - set16_fx( hStereoDft->res_pred_mode + k_offset + 1, hStereoDft->res_pred_mode[k_offset], N_div - 1 ); - set16_fx( hStereoDft->res_cod_mode + k_offset + 1, hStereoDft->res_cod_mode[k_offset], N_div - 1 ); + set16_fx( hStereoDft->band_res + add( k_offset, 1 ), hStereoDft->band_res[k_offset], sub( N_div, 1 ) ); + set16_fx( hStereoDft->prm_res + add( k_offset, 1 ), hStereoDft->prm_res[k_offset], sub( N_div, 1 ) ); + set16_fx( hStereoDft->res_pred_mode + add( k_offset, 1 ), hStereoDft->res_pred_mode[k_offset], sub( N_div, 1 ) ); + set16_fx( hStereoDft->res_cod_mode + add( k_offset, 1 ), hStereoDft->res_cod_mode[k_offset], sub( N_div, 1 ) ); /*------------------------------------------------------------------* * Read DFT stereo parameters @@ -3399,11 +3594,12 @@ void stereo_dft_dec_read_BS_fx( FOR( k = hStereoDft->prm_res[k_offset] - 1; k < N_div; k += hStereoDft->prm_res[k + k_offset] ) { /* reset parameters */ - set_zero_fx( hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); + set_zero_fx( hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), STEREO_DFT_BAND_MAX ); hStereoDft->gipd_fx[k + k_offset] = 0; move32(); - set_zero_fx( hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); + set_zero_fx( hStereoDft->res_pred_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), STEREO_DFT_BAND_MAX ); + test(); IF( !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) ) { /*------------------------------------------------------------------* @@ -3422,7 +3618,7 @@ void stereo_dft_dec_read_BS_fx( n_bits = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->side_gain_flag_1 ); nb = add( nb, n_bits ); - IF( EQ_16( hStereoDft->side_gain_flag_1, 0 ) ) + IF( hStereoDft->side_gain_flag_1 == 0 ) { b = read_BS_adapt_GR_sg( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2, dft_maps_sg ); n_bits = add( n_bits, b ); @@ -3454,6 +3650,7 @@ void stereo_dft_dec_read_BS_fx( hStereoDft->side_gain_index_previous[b] = ind1[b]; move16(); hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX] = L_shl( ind1[b], 26 ); + move32(); } st->next_bit_pos = add( st->next_bit_pos, n_bits ); @@ -3474,7 +3671,7 @@ void stereo_dft_dec_read_BS_fx( IF( itd_mode ) { ( *nb_bits ) = add( ( *nb_bits ), read_itd( st, &I ) ); - stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + k + k_offset, st->output_Fs ); + stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + add( k, k_offset ), st->output_Fs ); } } ELSE IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 - SID_FORMAT_NBITS ) ) ) @@ -3482,7 +3679,7 @@ void stereo_dft_dec_read_BS_fx( itd_mode = get_next_indice_fx( st, STEREO_DFT_ITD_MODE_NBITS ); ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS ); /*ITD mode flag: 1bit*/ - hStereoDft->itd_fx[k + k_offset] = 0; + hStereoDft->itd_fx[add( k, k_offset )] = 0; move32(); IF( itd_mode ) { @@ -3491,7 +3688,7 @@ void stereo_dft_dec_read_BS_fx( ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_SID_ITD_NBITS + 1 ); I = shl( I, STEREO_DFT_SID_ITD_FAC ); I = add( I, shl( sign_flag, 8 ) ); - stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + k + k_offset, st->output_Fs ); + stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + add( k, k_offset ), st->output_Fs ); } } @@ -3511,12 +3708,13 @@ void stereo_dft_dec_read_BS_fx( move16(); nb = add( nb, 1 ); n_bits = add( n_bits, 1 ); - IF( EQ_16( hStereoDft->no_ipd_flag, 0 ) ) + IF( hStereoDft->no_ipd_flag == 0 ) { ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_GIPD_NBITS ); + move16(); nb = add( nb, STEREO_DFT_GIPD_NBITS ); n_bits = add( n_bits, STEREO_DFT_GIPD_NBITS ); - stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + ( k + k_offset ), 1, STEREO_DFT_GIPD_NBITS ); + stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + add( k, k_offset ), 1, STEREO_DFT_GIPD_NBITS ); } } ELSE IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS - SID_FORMAT_NBITS ) ) ) @@ -3526,12 +3724,13 @@ void stereo_dft_dec_read_BS_fx( move16(); nb = add( nb, 1 ); n_bits = add( n_bits, 1 ); - IF( EQ_16( hStereoDft->no_ipd_flag, 0 ) ) + IF( hStereoDft->no_ipd_flag == 0 ) { ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_SID_GIPD_NBITS ); + move16(); nb = add( nb, STEREO_DFT_SID_GIPD_NBITS ); n_bits = add( n_bits, STEREO_DFT_SID_GIPD_NBITS ); - stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + ( k + k_offset ), 1, STEREO_DFT_SID_GIPD_NBITS ); + stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + add( k, k_offset ), 1, STEREO_DFT_SID_GIPD_NBITS ); } } ELSE @@ -3556,7 +3755,8 @@ void stereo_dft_dec_read_BS_fx( /* Not used in inactive frames */ IF( !hStereoDft->frame_sid_nodata ) { - IF( hStereoDft->res_pred_mode[k + k_offset] && EQ_16( hStereoDft->attackPresent, 0 ) ) + test(); + IF( hStereoDft->res_pred_mode[add( k, k_offset )] && hStereoDft->attackPresent == 0 ) { nbands = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); @@ -3582,7 +3782,7 @@ void stereo_dft_dec_read_BS_fx( nb = add( nb, b ); n_bits = add( n_bits, b ); - IF( EQ_16( hStereoDft->res_pred_flag_0, 0 ) ) + IF( hStereoDft->res_pred_flag_0 == 0 ) { b = read_BS_adapt_GR_rpg( st->bit_stream, nb, ind1_pred, hStereoDft->res_pred_band_min, nbands, &hStereoDft->res_pred_flag_1 ); n_bits = add( n_bits, b ); @@ -3597,6 +3797,7 @@ void stereo_dft_dec_read_BS_fx( FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ ) { ind1_pred[b] = add( ind1_pred[b], hStereoDft->res_pred_index_previous[b] ); + move16(); } } ELSE @@ -3604,6 +3805,7 @@ void stereo_dft_dec_read_BS_fx( FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ ) { ind1_pred[b] = get_value( &st->bit_stream[nb], STEREO_DFT_RES_GAINS_BITS ); + move16(); nb = add( nb, STEREO_DFT_RES_GAINS_BITS ); n_bits = add( n_bits, STEREO_DFT_RES_GAINS_BITS ); } @@ -3614,7 +3816,7 @@ void stereo_dft_dec_read_BS_fx( { I = 0; move16(); - stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); hStereoDft->res_pred_index_previous[b] = I; move16(); hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; @@ -3625,19 +3827,21 @@ void stereo_dft_dec_read_BS_fx( { I = ind1_pred[b]; move16(); - stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); hStereoDft->res_pred_index_previous[b] = I; move16(); hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl( I, 26 ); + move32(); } FOR( ; b < hStereoDft->nbands; b++ ) { I = 0; move16(); - stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); move16(); hStereoDft->res_pred_index_previous[b] = I; + move16(); hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; move32(); } @@ -3648,10 +3852,11 @@ void stereo_dft_dec_read_BS_fx( { I = 0; move16(); - stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); hStereoDft->res_pred_index_previous[b] = I; move16(); hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl( I, 26 ); + move32(); } } @@ -3667,13 +3872,14 @@ void stereo_dft_dec_read_BS_fx( { I = 0; move16(); - stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); } } } } } + test(); IF( !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) ) { IF( NE_16( hStereoDft->side_gain_flag_1, 2 ) ) @@ -3731,6 +3937,7 @@ void stereo_dft_dec_read_BS_fx( FOR( Word16 c = 0; c < hStereoDft->res_cod_line_max; c++ ) { dec[c] = shl_sat( dec[c], 8 ); + move16(); } ECSQ_dequantize_vector_fx( dec, hStereoDft->res_global_gain_fx, hStereoDft->res_cod_line_max, res_buf_fx ); @@ -3753,11 +3960,14 @@ void stereo_dft_dec_read_BS_fx( pop_wmops(); } + test(); + test(); IF( hStereoDft->frame_sid && !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) ) { stereo_dft_dec_sid_coh_fx( st, hStereoDft->nbands, coh_fx, nb_bits ); } + test(); IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_16( ivas_format, MASA_FORMAT ) ) { *nb_bits = (Word16) Mult_32_16( L_sub( element_brate, SID_2k40 ), INV_FRAME_PER_SEC_Q15 ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40; */ diff --git a/lib_dec/ivas_stereo_dft_plc_fx.c b/lib_dec/ivas_stereo_dft_plc_fx.c index 3023b40e9..22d89ea8d 100644 --- a/lib_dec/ivas_stereo_dft_plc_fx.c +++ b/lib_dec/ivas_stereo_dft_plc_fx.c @@ -85,7 +85,7 @@ void stereo_dft_res_ecu_fx( Word16 trigo_step; Word16 q_fac; - set_l( pDFT_RES, 0, L_FRAME8k ); + set32_fx( pDFT_RES, 0, L_FRAME8k ); L_res = hStereoDft->band_limits[hStereoDft->res_cod_band_max]; move16(); @@ -93,7 +93,7 @@ void stereo_dft_res_ecu_fx( stereo_dft_res_subst_spec_fx( hStereoDft, pDFT_RES, DFT_PRED_RES, hStereoDft->time_offs, L_res, L_FRAME8k, k, num_plocs, plocs, plocsi, k == 0 ); fac = BASOP_Util_Divide3232_Scale( L_FRAME8k, hStereoDft->NFFT, &q_fac ); - IF( GT_16( q_fac, 0 ) ) + IF( q_fac > 0 ) { assert( 0 ); } @@ -102,7 +102,7 @@ void stereo_dft_res_ecu_fx( fac = shl( fac, q_fac ); } - IF( EQ_16( hStereoDft->core_hist[0], ACELP_CORE ) ) + IF( hStereoDft->core_hist[0] == ACELP_CORE ) { fac = extract_l( L_shr( L_mult0( fac, 0x2000 ), 15 ) ); } @@ -111,16 +111,16 @@ void stereo_dft_res_ecu_fx( move16(); FOR( i = 0; i < STEREO_DFT32MS_N_8k / 4; i++ ) { - trigo_dec[i] = hStereoDft->dft_trigo_8k_fx[i * trigo_step]; + trigo_dec[i] = hStereoDft->dft_trigo_8k_fx[i_mult(i , trigo_step)]; move16(); - trigo_dec[STEREO_DFT32MS_N_8k / 2 - i] = hStereoDft->dft_trigo_8k_fx[i * trigo_step]; + trigo_dec[STEREO_DFT32MS_N_8k / 2 - i] = hStereoDft->dft_trigo_8k_fx[i_mult(i , trigo_step)]; move16(); } - trigo_dec[STEREO_DFT32MS_N_8k / 4] = hStereoDft->dft_trigo_8k_fx[STEREO_DFT32MS_N_8k / 4 * trigo_step]; + trigo_dec[STEREO_DFT32MS_N_8k / 4] = hStereoDft->dft_trigo_8k_fx[i_mult(STEREO_DFT32MS_N_8k / 4 , trigo_step)]; move16(); /* estimation of res_cod_mem (ola part in imdct residual signal) and input_mem (memory for buffer in DFT analysis)*/ - IF( EQ_16( k, 0 ) ) + IF( k == 0 ) { Copy32( pDFT_RES, res_buf, L_FRAME8k ); stereo_dft_res_subst_spec_fx( hStereoDft, res_buf, DFT_PRED_RES, hStereoDft->time_offs + output_frame, L_res, L_FRAME8k, k, num_plocs, plocs, plocsi, FALSE ); @@ -130,6 +130,7 @@ void stereo_dft_res_ecu_fx( v_multc_fixed_16( res_buf, fac, res_buf, L_FRAME8k ); Copy32( res_buf + ( OFFSET8k - ZP8k ), &hStereoDft->res_cod_mem_fx[0], STEREO_DFT_OVL_8k ); hStereoDft->q_res_cod_mem_fx = hStereoDft->q_dft; + move16(); Copy32( res_buf + ZP8k, input_mem, NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) ); /* Store memory for cross-fade to next frame, in case of good frame */ hStereoDft->q_ip_mem = hStereoDft->q_dft; @@ -138,7 +139,8 @@ void stereo_dft_res_ecu_fx( ELSE { Word16 scale_fac = getScaleFactor32( res_buf, L_FRAME8k ); - Word16 q_shift = 8 - scale_fac; + Word16 q_shift = sub( 8, scale_fac ); + move16(); // Copy32( pDFT_RES, res_buf, L_FRAME8k ); v_shr_32( pDFT_RES, res_buf, L_FRAME8k, q_shift ); @@ -164,7 +166,7 @@ void stereo_dft_res_ecu_fx( hStereoDft->time_offs = add( hStereoDft->time_offs, L_FRAME8k ); } - set_l( DFT_PRED_RES, 0, 2 * L_res ); + set32_fx( DFT_PRED_RES, 0, shl( L_res, 1 ) ); IF( prev_bfi ) { @@ -200,7 +202,7 @@ Word32 imax_pos_fx( ftmp_den2 = L_shl( L_sub( L_sub( L_shl( y2, 1 ), y1 ), y3 ), 1 ); test(); - IF( EQ_32( ftmp_den2, 0 ) || EQ_32( ftmp_den1, 0 ) ) + IF( ( ftmp_den2 == 0 ) || ( ftmp_den1 == 0 ) ) { return ( 0 ); /* early exit with left-most value */ } @@ -219,7 +221,7 @@ Word32 imax_pos_fx( } /* their corresponding normalized locations */ posi = BASOP_Util_Divide3232_Scale( y3_y1, ( ftmp_den2 ), &q_div_posi ); - IF( NE_16( q_div_posi, 0 ) ) + IF( ( q_div_posi != 0 ) ) { posi = L_shl( posi, q_div_posi ); q_div_posi = 0; @@ -229,14 +231,33 @@ Word32 imax_pos_fx( test(); IF( GE_32( posi, L_shr( ONE_IN_Q15, q_div_posi ) ) || LE_32( posi, L_shr( MIN_16, q_div_posi ) ) ) { - posi = GT_32( y3, y1 ) ? ONE_IN_Q15 : MIN_16; - move16(); + // posi = GT_32( y3, y1 ) ? ONE_IN_Q15 : MIN_16; + IF( GT_32( y3, y1 ) ) + { + posi = ONE_IN_Q15; + move32(); + } + ELSE + { + posi = MIN_16; + move32(); + } } ELSE { IF( GE_32( L_shr( y1, q_div_2i ), y2i ) ) { - posi = GT_32( y1, y3 ) ? MIN_16 : ONE_IN_Q15; + // posi = GT_32( y1, y3 ) ? MIN_16 : ONE_IN_Q15; + IF( GT_32( y1, y3 ) ) + { + posi = MIN_16; + move32(); + } + ELSE + { + posi = ONE_IN_Q15; + move32(); + } move16(); } ELSE IF( GE_32( L_shr( y3, q_div_2i ), y2i ) ) @@ -262,17 +283,18 @@ static void ivas_peakfinder_fx( Word32 dx0[L_PROT48k_2], x[L_PROT48k_2 + 1], peakMag[MAX_PLOCS]; Word16 k, i, len, tempLoc = 0, foundPeak, ii, xInd; Word16 *ind, indarr[L_PROT48k_2 + 1], peakLoc[MAX_PLOCS]; + move16(); ind = indarr; move16(); /* Find derivative */ - v_sub_32( x0 + 1, x0, dx0, len0 - 1 ); + v_sub_32( x0 + 1, x0, dx0, sub( len0, 1 ) ); /* This is so we find the first of repeated values */ - FOR( i = 0; i < len0 - 1; i++ ) + FOR( i = 0; i < sub( len0, 1 ); i++ ) { - IF( EQ_32( dx0[i], 0 ) ) + IF( dx0[i] == 0 ) { dx0[i] = -EPSILON_FX; move32(); @@ -288,13 +310,14 @@ static void ivas_peakfinder_fx( { x[k] = x0[0]; move32(); - ind[k++] = 0; + ind[k] = 0; move16(); + k = add(k, 1); } - FOR( i = 1; i < len0 - 1; i++ ) + FOR( i = 1; i < sub( len0, 1 ); i++ ) { - IF( LT_32( L_xor( dx0[i - 1], dx0[i] ), 0 ) ) + IF( L_xor( dx0[i - 1], dx0[i] ) < 0 ) { ind[k] = i; move16(); @@ -307,8 +330,9 @@ static void ivas_peakfinder_fx( { ind[k] = sub( len0, 1 ); move16(); - x[k++] = x0[len0 - 1]; + x[k] = x0[sub( len0, 1 )]; move32(); + k = add( k, 1 ); } /* x only has the peaks, valleys, and endpoints */ len = k; @@ -317,7 +341,7 @@ static void ivas_peakfinder_fx( test(); test(); - IF( GT_16( len, 2 ) || ( !endpoints && GT_16( len, 0 ) ) ) + IF( GT_16( len, 2 ) || ( !endpoints && ( len > 0 ) ) ) { /* Set initial parameters for loop */ tempMag = minMag; @@ -411,7 +435,7 @@ static void ivas_peakfinder_fx( move32(); } - ii++; /* Move onto the valley */ + ii = add(ii,1); /* Move onto the valley */ /* Come down at least sel from peak */ test(); @@ -425,7 +449,8 @@ static void ivas_peakfinder_fx( move16(); peakMag[*cInd] = tempMag; move32(); - ( *cInd )++; + ( *cInd ) = add(*(cInd),1); + move16(); } ELSE IF( LT_32( x[ii], leftMin ) ) /* New left minimum */ { @@ -451,7 +476,8 @@ static void ivas_peakfinder_fx( move16(); peakMag[*cInd] = tempMag; move32(); - ( *cInd )++; + ( *cInd ) = add( *( cInd ), 1 ); + move16(); } /* Create output */ @@ -466,7 +492,17 @@ static void ivas_peakfinder_fx( IF( endpoints ) { /* This is a monotone function where an endpoint is the only peak */ - xInd = GT_32( x[0], x[1] ) ? 0 : 1; + // xInd = GT_32( x[0], x[1] ) ? 0 : 1; + IF( GT_32( x[0], x[1] ) ) + { + xInd = 0; + move16(); + } + ELSE + { + xInd = 1; + move16(); + } move16(); peakMag[0] = x[xInd]; move32(); @@ -546,7 +582,7 @@ void stereo_dft_res_subst_spec_fx( FOR( i = 1; i < L_res; i++ ) { Word32 r = L_shl( p_mem[2 * i], q_res ); - Word32 l = L_shl( p_mem[2 * i + 1], q_res ); + Word32 l = L_shl( p_mem[add(shl(i,1), 1)], q_res ); abs_res[i] = Madd_32_32( Mpy_32_32( r, r ), l, l ); move32(); } @@ -582,11 +618,11 @@ void stereo_dft_res_subst_spec_fx( FOR( i = 1; i < L_res; i++ ) { s1 = sign_l( pDFT_RES[2 * i] ); - s2 = sign_l( pDFT_RES[2 * i + 1] ); + s2 = sign_l( pDFT_RES[add( shl( i, 1 ), 1 )] ); abs1 = L_abs( pDFT_RES[2 * i] ); - abs2 = L_abs( pDFT_RES[2 * i + 1] ); + abs2 = L_abs( pDFT_RES[add( shl( i, 1 ), 1 )] ); abs3 = L_abs( p_mem[2 * i] ); - abs4 = L_abs( p_mem[2 * i + 1] ); + abs4 = L_abs( p_mem[add( shl( i, 1 ), 1 )] ); // fac = MAX_16; move16(); @@ -598,14 +634,14 @@ void stereo_dft_res_subst_spec_fx( { pDFT_RES[2 * i] = Mpy_32_32( s1, abs4 ); move32(); - pDFT_RES[2 * i + 1] = Mpy_32_32( s2, abs3 ); + pDFT_RES[add( shl( i, 1 ), 1 )] = Mpy_32_32( s2, abs3 ); move32(); } ELSE { pDFT_RES[2 * i] = Mpy_32_32( s1, abs3 ); move32(); - pDFT_RES[2 * i + 1] = Mpy_32_32( s2, abs4 ); + pDFT_RES[add( shl( i, 1 ), 1 )] = Mpy_32_32( s2, abs4 ); move32(); } } @@ -658,14 +694,14 @@ void stereo_dft_res_subst_spec_fx( cos_F = shl_o( getCosWord16( extract_l( corr_phase ) ), 1, &flg_ov ); sin_F = getSinWord16( extract_l( corr_phase ) ); - idx = s_max( 0, plocs[i] - Np ); /* Iterate over plocs[i]-1:plocs[i]+1, considering the edges of the spectrum */ + idx = s_max( 0, sub(plocs[i] , Np) ); /* Iterate over plocs[i]-1:plocs[i]+1, considering the edges of the spectrum */ WHILE( ( idx < add( add( plocs[i], Np ), 1 ) ) && LT_16( idx, L_res ) ) { - pDFT_RES[2 * idx] = Msub_32_16( Mpy_32_16_1( p_mem[2 * idx], cos_F ), p_mem[2 * idx + 1], sin_F ); + pDFT_RES[2 * idx] = Msub_32_16( Mpy_32_16_1( p_mem[2 * idx], cos_F ), p_mem[add( shl( idx, 1 ), 1 )], sin_F ); move32(); - pDFT_RES[2 * idx + 1] = Mpy_32_32( conj_sign, Madd_32_16( Mpy_32_16_1( p_mem[2 * idx], sin_F ), p_mem[2 * idx + 1], cos_F ) ); + pDFT_RES[add( shl( idx, 1 ), 1 )] = Mpy_32_32( conj_sign, Madd_32_16( Mpy_32_16_1( p_mem[2 * idx], sin_F ), p_mem[add( shl( idx, 1 ), 1 )], cos_F ) ); move32(); - idx++; + idx = add( idx, 1 ); } } return; @@ -696,7 +732,7 @@ void stereo_dft_res_ecu_burst_att_fx( move16(); /* attenuation of residual; follow attenuation of DMX */ - IF( EQ_16( hStereoDft->core_hist[0], ACELP_CORE ) ) + IF( hStereoDft->core_hist[0] == ACELP_CORE ) { fac = Mpy_32_16_1( Sqrt32( L_deposit_h( BASOP_Util_Divide3232_Scale( dmx_nrg, hStereoDft->past_dmx_nrg_fx, &q_fac ) ), &exponent ), (Word16) ( 0x0CCD ) ); } @@ -724,13 +760,13 @@ Word32 stereo_dft_dmx_swb_nrg_fx( const Word16 q0, const Word16 q1 ) { - int16_t i; + Word16 i; Word32 dmx_nrg; dmx_nrg = EPSILON_FIX; move32(); test(); - IF( EQ_16( q0, 0 ) && EQ_16( q1, 0 ) ) + IF( q0 == 0 && q1 == 0 ) { FOR( i = 0; i < shr( frame_length, 1 ); i++ ) { diff --git a/lib_dec/ivas_stereo_eclvq_dec.c b/lib_dec/ivas_stereo_eclvq_dec.c index 4094ced1a..eb4330992 100644 --- a/lib_dec/ivas_stereo_eclvq_dec.c +++ b/lib_dec/ivas_stereo_eclvq_dec.c @@ -89,22 +89,24 @@ static Word16 arith_decode_elias_mod( Word16 n, n_bits, bit; n_bits = 0; + move16(); bit = rc_uni_dec_read_bit( rc_st_dec ); - WHILE( EQ_16( bit, 0 ) ) + WHILE( bit == 0 ) { bit = rc_uni_dec_read_bit( rc_st_dec ); - ++n_bits; + n_bits = add( n_bits, 1 ); IF( EQ_16( n_bits, 17 ) ) { /* bitstream error encountered */ rc_st_dec->bit_error_detected = 1; + move16(); return 0; } } - IF( EQ_16( n_bits, 0 ) ) + IF( n_bits == 0 ) { /* code for 0 is 10 and code for 1 is 11 */ n = rc_uni_dec_read_bit( rc_st_dec ); @@ -316,9 +318,9 @@ void ECSQ_decode( { sym = arith_decode_prob_escape( rc_st_dec, tab_vals_cum_freq, tab_vals_sym_freq, ECSQ_TAB_VALS_SIZE ); - IF( NE_16( shift, 0 ) ) + IF( shift != 0 ) { - IF( GT_16( sym, 0 ) || GT_16( shift, 4 ) ) + IF( ( sym > 0 ) || ( shift > 4 ) ) { lsbs = rc_uni_dec_read_bits( rc_st_dec, shift ); } @@ -329,7 +331,7 @@ void ECSQ_decode( sym = s_or( shl( sym, shift ), lsbs ); } - IF( NE_16( sym, 0 ) ) + IF( sym != 0 ) { /* map the sign bit to +1 or -1 and then multiply */ IF( rc_uni_dec_read_bit( rc_st_dec ) ) @@ -339,6 +341,7 @@ void ECSQ_decode( } output[i] = sym; + move16(); } } ELSE @@ -347,17 +350,20 @@ void ECSQ_decode( nonzero = rc_uni_dec_read_bits( rc_st_dec, 2 ); left1 = nonzero; + move16(); left0 = sub( add( sub( seg_stop, seg_start ), 1 ), nonzero ); FOR( i = seg_start; i <= seg_stop; ++i ) { - IF( EQ_16( left1, 0 ) ) + IF( left1 == 0 ) { sym = 0; + move16(); } - ELSE IF( EQ_16( left0, 0 ) ) + ELSE IF( left0 == 0 ) { sym = 1; + move16(); } ELSE { @@ -365,21 +371,22 @@ void ECSQ_decode( sym = rc_uni_dec_read_bit_prob_fast( rc_st_dec, count0, ECSQ_PROB_BITS ); } - IF( NE_16( sym, 0 ) ) + IF( sym != 0 ) { /* map the sign bit to +1 or -1 and then multiply */ IF( rc_uni_dec_read_bit( rc_st_dec ) ) { sym = negate( sym ); } - --left1; + left1 = sub( left1, 1 ); } ELSE { - --left0; + left0 = sub( left0, 1 ); } output[i] = sym; + move16(); } } } diff --git a/lib_dec/ivas_stereo_ica_dec.c b/lib_dec/ivas_stereo_ica_dec.c index 804a5a68f..741a5f947 100644 --- a/lib_dec/ivas_stereo_ica_dec.c +++ b/lib_dec/ivas_stereo_ica_dec.c @@ -142,7 +142,16 @@ void stereo_tca_dec_fx( IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { hStereoTCA->corrLagStats = extract_l( L_abs( L_shr( hCPE->hStereoDft->itd_fx[1], Q15 ) ) ); - hStereoTCA->refChanIndx = GE_32( hCPE->hStereoDft->itd_fx[1], 0 ) ? ( L_CH_INDX ) : ( R_CH_INDX ); + // hStereoTCA->refChanIndx = GE_32( hCPE->hStereoDft->itd_fx[1], 0 ) ? ( L_CH_INDX ) : ( R_CH_INDX ); + IF( hCPE->hStereoDft->itd_fx[1] >= 0 ) + { + hStereoTCA->refChanIndx = ( L_CH_INDX ); + } + ELSE + { + hStereoTCA->refChanIndx = ( R_CH_INDX ); + } + move16(); move16(); } ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) @@ -152,12 +161,20 @@ void stereo_tca_dec_fx( itd = hCPE->hStereoMdct->itd_fx; move32(); hStereoTCA->corrLagStats = extract_l( L_abs( L_shr( itd, Q15 ) ) ); - hStereoTCA->refChanIndx = GE_32( itd, 0 ) ? ( L_CH_INDX ) : ( R_CH_INDX ); + // hStereoTCA->refChanIndx = GE_32( itd, 0 ) ? ( L_CH_INDX ) : ( R_CH_INDX ); + IF( GE_32( itd, 0 ) ) + { + hStereoTCA->refChanIndx = ( L_CH_INDX ); + } + ELSE + { + hStereoTCA->refChanIndx = ( R_CH_INDX ); + } move16(); } test(); - IF( NE_16( hStereoTCA->refChanIndx, hStereoTCA->prevRefChanIndx ) && NE_16( hStereoTCA->corrLagStats, 0 ) ) + IF( NE_16( hStereoTCA->refChanIndx, hStereoTCA->prevRefChanIndx ) && ( hStereoTCA->corrLagStats != 0 ) ) { bothChannelShift = 1; move16(); @@ -182,7 +199,7 @@ void stereo_tca_dec_fx( move16(); } - IF( NE_16( currentNCShift, 0 ) ) + IF( currentNCShift != 0 ) { currentNCShift = add( mult( 19660 /* 0.6 in Q15 */, prevNCShift ), mult( 13106 /* 0.4 in Q15 */, currentNCShift ) ); } @@ -207,8 +224,7 @@ void stereo_tca_dec_fx( /* identify target signal to adjust for shift variations */ test(); test(); - test(); - IF( ( EQ_16( prevNCShift, 0 ) && EQ_16( hStereoTCA->refChanIndx, R_CH_INDX ) ) || EQ_16( hStereoTCA->prevRefChanIndx, R_CH_INDX ) ) + IF( ( ( prevNCShift == 0 ) && EQ_16( hStereoTCA->refChanIndx, R_CH_INDX ) ) || EQ_16( hStereoTCA->prevRefChanIndx, R_CH_INDX ) ) { ref_fx = ptrChanR_fx; target_fx = ptrChanL_fx; @@ -645,8 +661,9 @@ void stereo_tca_scale_R_channel_fx( { Word16 temp_a = (Word16) L_shr( hCPE->hStereoDftDmx->targetGain_fx, (Word16) 16 ); Word16 temp_a_q = 2; + move16(); tempF1_fx = Inv16( temp_a, &temp_a_q ); - tempF1_fx = L_shl( tempF1_fx, ( 31 - 4 ) - ( 15 - temp_a_q ) ); + tempF1_fx = L_shl( tempF1_fx, sub( ( 31 - 4 ), sub( 15, temp_a_q ) ) ); } IF( EQ_32( hCPE->hStereoDftDmx->prevTargetGain_fx, ONE_IN_Q29 ) ) @@ -658,8 +675,9 @@ void stereo_tca_scale_R_channel_fx( { Word16 temp_b = (Word16) L_shr( hCPE->hStereoDftDmx->prevTargetGain_fx, 16 ); Word16 temp_b_q = 2; + move16(); tempF_fx = Inv16( temp_b, &temp_b_q ); - tempF_fx = L_shl( tempF_fx, ( 31 - 4 ) - ( 15 - temp_b_q ) ); + tempF_fx = L_shl( tempF_fx, sub( ( 31 - 4 ), sub( 15, temp_b_q ) ) ); } } ELSE @@ -674,8 +692,9 @@ void stereo_tca_scale_R_channel_fx( { Word16 temp_a = (Word16) L_shr( hStereoTCA->targetGain_fx, (Word16) 16 ); Word16 temp_a_q = 2; + move16(); tempF1_fx = Inv16( temp_a, &temp_a_q ); - tempF1_fx = L_shl( tempF1_fx, ( 31 - 4 ) - ( 15 - temp_a_q ) ); + tempF1_fx = L_shl( tempF1_fx, sub(( 31 - 4 ) , sub( 15 , temp_a_q )) ); } @@ -688,8 +707,9 @@ void stereo_tca_scale_R_channel_fx( { Word16 temp_b = (Word16) L_shr( hStereoTCA->prevTargetGain_fx, (Word16) 16 ); Word16 temp_b_q = 2; + move16(); tempF_fx = Inv16( temp_b, &temp_b_q ); - tempF_fx = L_shl( tempF_fx, ( 31 - 4 ) - ( 15 - temp_b_q ) ); + tempF_fx = L_shl( tempF_fx, sub(( 31 - 4 ) , sub( 15 , temp_b_q )) ); } } SWITCH( output_Fs ) @@ -734,7 +754,7 @@ void stereo_tca_scale_R_channel_fx( Word32 slope_gain_ascend = ( j * winSlope_fx ); Word32 left_res = Mpy_32_32( slope_gain_decend, output_fx[i_fx] ); Word32 right_res = Mpy_32_32( slope_gain_ascend, output_fx[i_fx] ); - output_fx[i_fx] = left_res + right_res; + output_fx[i_fx] = L_add( left_res, right_res ); move32(); } } @@ -743,7 +763,7 @@ void stereo_tca_scale_R_channel_fx( FOR( j = 0; i_fx < flat_old + l_ica_ovl; ( i_fx++, j++ ) ) { Word32 slope_gain_decend = L_sub( ONE_IN_Q31, j * winSlope_fx ); - Word32 slope_gain_ascend = ( j * winSlope_fx ); + Word32 slope_gain_ascend = imult3216( winSlope_fx, j ); Word32 left_res = Mpy_32_32( slope_gain_decend, output_fx[i_fx] ); Word32 right_res = Mpy_32_32( slope_gain_ascend, output_fx[i_fx] ); output_fx[i_fx] = L_add_sat( L_shl_sat( Mpy_32_32( tempF_fx, left_res ), 4 ), L_shl_sat( Mpy_32_32( right_res, tempF1_fx ), 4 ) ); diff --git a/lib_dec/ivas_stereo_icbwe_dec.c b/lib_dec/ivas_stereo_icbwe_dec.c index 199647063..80f9655bf 100644 --- a/lib_dec/ivas_stereo_icbwe_dec.c +++ b/lib_dec/ivas_stereo_icbwe_dec.c @@ -538,7 +538,7 @@ static Word16 FindScale( maximum_abs_32_fx( buff, len, &maxVal ); norm_shift = norm_l( maxVal ); - IF( EQ_32( maxVal, 0 ) ) + if ( maxVal == 0 ) { norm_shift = 31; move16(); @@ -628,14 +628,14 @@ void stereo_icBWE_dec_fx( move32(); maximum_abs_32_fx( synthRef_fx, output_frame, &maxVal ); synthRef_shift = norm_l( maxVal ); - IF( EQ_32( maxVal, 0 ) ) + if ( maxVal == 0 ) { synthRef_shift = 31; move16(); } synthRef_shift = sub( synthRef_shift, shr( add( find_guarded_bits_fx( output_frame ), 1 ), 1 ) ); test(); - IF( EQ_16( st->core, ACELP_CORE ) || EQ_16( st->last_core, ACELP_CORE ) ) + IF( st->core == ACELP_CORE || st->last_core == ACELP_CORE ) { FOR( i = 0; i < output_frame / 2; i++ ) { @@ -670,7 +670,9 @@ void stereo_icBWE_dec_fx( set32_fx( hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, 0, output_frame ); #ifdef MSAN_FIX hCPE->hStereoDft->hb_nrg_subr_fx[0] = 0; + move32(); hCPE->hStereoDft->hb_nrg_subr_fx[1] = 0; + move32(); #endif // MSAN_FIX } hCPE->hStereoDft->hb_nrg_subr_fx[0] = ( Mpy_32_16_1( hCPE->hStereoDft->hb_nrg_subr_fx[0], shl( hCPE->hStereoDft->NFFT / 2, 6 ) ) ); // 2 * (Qx + SynthRef_shift) - 40 // 2 * (Qx + SynthRef_shift) - 31 - 15 @@ -693,7 +695,7 @@ void stereo_icBWE_dec_fx( test(); test(); test(); - IF( NE_16( st->core, ACELP_CORE ) || EQ_16( st->extl, -1 ) || ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && NE_16( hCPE->hCoreCoder[0]->tdm_LRTD_flag, 0 ) ) ) + IF( st->core != ACELP_CORE || EQ_16( st->extl, -1 ) || ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && NE_16( hCPE->hCoreCoder[0]->tdm_LRTD_flag, 0 ) ) ) { return; } @@ -708,11 +710,11 @@ void stereo_icBWE_dec_fx( /* core switching reset */ test(); - IF( NE_16( st->last_core, ACELP_CORE ) || EQ_16( st->bwidth, (Word16) WB ) ) + IF( st->last_core != ACELP_CORE || EQ_16( st->bwidth, (Word16) WB ) ) { ic_bwe_dec_reset_fx( hStereoICBWE ); - IF( NE_16( st->last_core, ACELP_CORE ) ) + IF( st->last_core != ACELP_CORE ) { hStereoICBWE->prevSpecMapping_fx = 0; move16(); @@ -789,7 +791,7 @@ void stereo_icBWE_dec_fx( } } - IF( EQ_16( st->bfi, 0 ) ) + IF( st->bfi == 0 ) { hStereoICBWE->refChanIndx_bwe = get_next_indice_fx( st, STEREO_ICBWE_REFBITS ); IF( EQ_16( st->flag_ACELP16k, 1 ) ) @@ -876,7 +878,7 @@ void stereo_icBWE_dec_fx( } // nbSubFr = ( st->flag_ACELP16k == 0 ) ? NB_SUBFR : NB_SUBFR16k; - IF( EQ_16( st->flag_ACELP16k, 0 ) ) + IF( st->flag_ACELP16k == 0 ) { nbSubFr = NB_SUBFR; move16(); @@ -920,11 +922,11 @@ void stereo_icBWE_dec_fx( // common Q for addition L_nlExc16k = L_deposit_l( hStereoICBWE->nlExc16k_fx[k] ); // prev_q_bwe_exc - 16 L_mixExc16k = L_deposit_l( hStereoICBWE->mixExc16k_fx[k] ); // Q_exc - L_nlExc16k = L_shl( L_nlExc16k, Q_icBWE - ( st->prev_Q_bwe_exc - 16 ) ); // Q_icBWE + L_nlExc16k = L_shl( L_nlExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // Q_icBWE #ifndef FIX_736_BWE_SECT_C L_mixExc16k = L_shl( L_mixExc16k, Q_icBWE - st->Q_exc ); // Q_icBWE #else - L_mixExc16k = L_shl( L_mixExc16k, Q_icBWE - ( st->prev_Q_bwe_exc - 25 ) ); // Q_icBWE + L_mixExc16k = L_shl( L_mixExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 25 ) ) ) ); // Q_icBWE #endif excSHB_nonref_fx[k] = L_add( Mpy_32_16_1( L_nlExc16k, temp1_fx ), Mpy_32_16_1( L_mixExc16k, temp2_fx ) ); // Q_icBWE move32(); @@ -1043,7 +1045,7 @@ void stereo_icBWE_dec_fx( tmp = sub( tmp, 9 ); Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, tmp - Q_syn_shb ); - hStereoICBWE->memShbSpecMapping_fx = L_shl( hStereoICBWE->memShbSpecMapping_fx, tmp - hStereoICBWE->prev_Q_memshbspec ); + hStereoICBWE->memShbSpecMapping_fx = L_shl( hStereoICBWE->memShbSpecMapping_fx, sub( tmp, hStereoICBWE->prev_Q_memshbspec ) ); hStereoICBWE->prev_Q_memshbspec = tmp; move16(); @@ -1126,7 +1128,7 @@ void stereo_icBWE_dec_fx( icbweM2Ref_fx = gsMapping_fx; move16(); - IF( EQ_16( hStereoICBWE->refChanIndx_bwe, L_CH_INDX ) ) + IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) { IF( GE_16( ratio_L_fx, 3276 ) ) @@ -1159,7 +1161,7 @@ void stereo_icBWE_dec_fx( #ifdef FIX_TMP_714 tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15 #else - tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 + tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 #endif tmp = mult_r( tmp, gsMapping_fx ); // Q14 tmp = mult_r( tmp, gsMapping_fx ); // Q13 @@ -1290,7 +1292,7 @@ void stereo_icBWE_dec_fx( icbweM2Ref_fx = gsMapping_fx; move16(); - IF( EQ_16( hStereoICBWE->refChanIndx_bwe, L_CH_INDX ) ) + IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) { IF( GE_16( ratio_L_fx, 3276 ) ) { @@ -1680,6 +1682,7 @@ void stereo_icBWE_decproc_fx( Word32 temp0_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )], temp1_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; Word32 winSlope_fx = 0, alpha_fx; + move32(); const Word16 *win_dft_fx; Word32 extl_brate, output_Fs; @@ -1789,7 +1792,7 @@ void stereo_icBWE_decproc_fx( } test(); - IF( EQ_16( core, ACELP_CORE ) && GT_32( extl_brate, 0 ) ) + IF( EQ_16( core, ACELP_CORE ) && extl_brate > 0 ) { refChanIndx_bwe = hStereoICBWE->refChanIndx_bwe; move16(); @@ -1833,13 +1836,13 @@ void stereo_icBWE_decproc_fx( } } /* Resampled LB and HB offset */ - Copy32( outputHB[refChanIndx_bwe], temp0_fx + memOffset, output_frame - memOffset ); - Copy32( outputHB[!refChanIndx_bwe], temp1_fx + memOffset, output_frame - memOffset ); + Copy32( outputHB[refChanIndx_bwe], temp0_fx + memOffset, sub( output_frame, memOffset ) ); + Copy32( outputHB[!refChanIndx_bwe], temp1_fx + memOffset, sub( output_frame, memOffset ) ); decoderDelay = NS2SA( output_Fs, IVAS_DEC_DELAY_NS ); test(); - IF( NE_16( last_core, ACELP_CORE ) && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) + IF( last_core != ACELP_CORE && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */ icbweOLASize = NS2SA( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); @@ -1870,7 +1873,7 @@ void stereo_icBWE_decproc_fx( } alpha_fx = winSlope_fx; // Q30 move32(); - FOR( ; i < decoderDelay + icbweOLASize; i++ ) + FOR( ; i < add( decoderDelay, icbweOLASize ); i++ ) { temp0_fx[i] = L_shl_sat( Mpy_32_32( temp0_fx[i], alpha_fx ), 1 ); // Q11 move32(); @@ -1883,18 +1886,21 @@ void stereo_icBWE_decproc_fx( { IF( NE_16( refChanIndx_bwe, hStereoICBWE->prev_refChanIndx_bwe ) ) { - IF( GT_16( memOffset, 0 ) ) + IF( memOffset > 0 ) { SWITCH( memOffset ) { case 15: winSlope_fx = 71582792; + move32(); BREAK; case 30: winSlope_fx = 35791396; + move32(); BREAK; case 45: winSlope_fx = 23860930; // Q30 + move32(); BREAK; } // memOffset for 16K 32K 48K are 15 30 45 respectively.camera @@ -1961,7 +1967,7 @@ void stereo_icBWE_decproc_fx( move32(); hStereoICBWE->memTransitionHB_fx[1][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[1][i], win_dft_fx[tmp_mul] ); move32(); - j++; + j = add( j, 1 ); } FOR( i = 0; j < dftOvlLen; i++ ) @@ -1971,7 +1977,7 @@ void stereo_icBWE_decproc_fx( move32(); hStereoICBWE->memTransitionHB_fx[1][memOffset + i] = Mpy_32_16_1( outputHB[1][output_frame - i - 1], win_dft_fx[tmp_mul] ); move32(); - j++; + j = add( j, 1 ); } } @@ -1980,7 +1986,7 @@ void stereo_icBWE_decproc_fx( } ELSE { - IF( EQ_16( last_core, ACELP_CORE ) ) + IF( last_core == ACELP_CORE ) { IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) { diff --git a/lib_dec/ivas_stereo_mdct_core_dec.c b/lib_dec/ivas_stereo_mdct_core_dec.c index 3248c9323..de1bb794d 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec.c +++ b/lib_dec/ivas_stereo_mdct_core_dec.c @@ -85,11 +85,15 @@ void convert_coeffs_to_higher_res_fx( tmp1 = Mpy_32_32( POINT_5_Q31, ( L_add( in2[i], in1[i] ) ) ); tmp2 = Mpy_32_32( POINT_5_Q31, ( L_sub( in2[i], in1[i] ) ) ); out[2 * i] = tmp1; + move32(); out[2 * i + 1] = tmp2; + move32(); tmp1 = Mpy_32_32( POINT_5_Q31, ( L_sub( in2[i], in1[i] ) ) ); tmp2 = Mpy_32_32( POINT_5_Q31, ( L_add( in2[i], in1[i] ) ) ); out[2 * i + 2] = tmp1; + move32(); out[2 * i + 3] = tmp2; + move32(); } } ELSE @@ -97,9 +101,13 @@ void convert_coeffs_to_higher_res_fx( FOR( i = 0; i < len; i += 2 ) { out[2 * i] = Mpy_32_32( POINT_5_Q31, ( L_add( in2[i], in1[i] ) ) ); + move32(); out[2 * i + 1] = Mpy_32_32( POINT_5_Q31, ( L_sub( in2[i], in1[i] ) ) ); + move32(); out[2 * i + 2] = Mpy_32_32( POINT_5_Q31, ( L_sub( in2[i + 1], in1[i + 1] ) ) ); + move32(); out[2 * i + 3] = Mpy_32_32( POINT_5_Q31, ( L_add( in2[i + 1], in1[i + 1] ) ) ); + move32(); } } diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 37f8c7983..3fd7ff35f 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -63,11 +63,11 @@ static void run_min_stats_fx( Decoder_State **sts, Word32 *x[CPE_CHANNELS][NB_DI *-------------------------------------------------------------------*/ static void stereo_mdct_dec_stereo_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - int16_t ms_mask[2][MAX_SFB] /* o : bandwise MS mask */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word16 ms_mask[2][MAX_SFB] /* o : bandwise MS mask */ ) { - int16_t availableBits; + Word16 availableBits; Decoder_State **sts; sts = hCPE->hCoreCoder; @@ -75,14 +75,14 @@ static void stereo_mdct_dec_stereo_fx( parse_stereo_from_bitstream( hCPE->hStereoMdct, hCPE->hCoreCoder, 0, hCPE->hStereoMdct->isSBAStereoMode, hCPE->hCoreCoder[0], ms_mask ); /*Split available bits between channels */ - availableBits = sts[0]->bits_frame_channel + sts[1]->bits_frame_channel - sts[0]->next_bit_pos - sts[0]->core * ( NF_GAIN_BITS + SMDCT_MINIMUM_ARITH_BITS ) - sts[1]->core * ( NF_GAIN_BITS + SMDCT_MINIMUM_ARITH_BITS ); + availableBits = sub( sub( sub( add( sts[0]->bits_frame_channel, sts[1]->bits_frame_channel ), sts[0]->next_bit_pos ), i_mult( sts[0]->core, ( NF_GAIN_BITS + SMDCT_MINIMUM_ARITH_BITS ) ) ), i_mult( sts[1]->core, ( NF_GAIN_BITS + SMDCT_MINIMUM_ARITH_BITS ) ) ); splitAvailableBits_fx( availableBits, hCPE->hStereoMdct->split_ratio, hCPE->hStereoMdct->isSBAStereoMode, &sts[0]->bits_frame_channel, &sts[1]->bits_frame_channel ); - sts[0]->bits_frame_channel += sts[0]->core * SMDCT_MINIMUM_ARITH_BITS; - sts[1]->bits_frame_channel += sts[1]->core * SMDCT_MINIMUM_ARITH_BITS; + sts[0]->bits_frame_channel = add( sts[0]->bits_frame_channel, i_mult( sts[0]->core, SMDCT_MINIMUM_ARITH_BITS ) ); + sts[1]->bits_frame_channel = add( sts[1]->bits_frame_channel, i_mult( sts[1]->core, SMDCT_MINIMUM_ARITH_BITS ) ); - sts[1]->bit_stream = &sts[0]->bit_stream[sts[0]->next_bit_pos + sts[0]->bits_frame_channel + sts[0]->core * NF_GAIN_BITS]; + sts[1]->bit_stream = &sts[0]->bit_stream[add(add(sts[0]->next_bit_pos , sts[0]->bits_frame_channel) , i_mult(sts[0]->core , NF_GAIN_BITS))]; return; } @@ -179,18 +179,18 @@ void stereo_mdct_core_dec_fx( set_s( param_lpc[ch], 0, NPRM_LPC_NEW ); } - set_s( ms_mask[0], 0, MAX_SFB ); - set_s( ms_mask[1], 0, MAX_SFB ); + set16_fx( ms_mask[0], 0, MAX_SFB ); + set16_fx( ms_mask[1], 0, MAX_SFB ); initMdctStereoDecData_fx( hCPE->hStereoMdct, sts[0]->igf, sts[0]->hIGFDec->igfData.igfInfo.grid, hCPE->element_brate, sts[0]->bwidth ); hCPE->hStereoMdct->isSBAStereoMode = ( ( EQ_16( st_ivas->ivas_format, SBA_FORMAT ) || EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) && EQ_16( st_ivas->nchan_transport, 2 ) ); move16(); - IF( EQ_16( bfi, 0 ) ) + IF( bfi == 0 ) { ivas_mdct_dec_side_bits_frame_channel_fx( hCPE, param_lpc, p_param, hCPE->hCoreCoder[0], nTnsBitsTCX10, param, 0, 0 ); - IF( NE_16( sts[0]->igf, 0 ) ) + IF( sts[0]->igf != 0 ) { FOR( ch = 0; ch < nChannels; ch++ ) { @@ -203,9 +203,11 @@ void stereo_mdct_core_dec_fx( } ELSE { - mvs2s( hCPE->hStereoMdct->prev_ms_mask[0], ms_mask[0], MAX_SFB ); - mvs2s( hCPE->hStereoMdct->prev_ms_mask[1], ms_mask[1], MAX_SFB ); + Copy( hCPE->hStereoMdct->prev_ms_mask[0], ms_mask[0], MAX_SFB ); + Copy( hCPE->hStereoMdct->prev_ms_mask[1], ms_mask[1], MAX_SFB ); + test(); + test(); IF( NE_16( sts[0]->core, TCX_10_CORE ) && NE_16( sts[1]->core, TCX_10_CORE ) ) { hCPE->hStereoMdct->mdct_stereo_mode[1] = SMDCT_DUAL_MONO; @@ -241,7 +243,17 @@ void stereo_mdct_core_dec_fx( FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - Word16 subFrames = ( hCPE->hCoreCoder[ch]->core == TCX_10_CORE ) ? NB_DIV : 1; + Word16 subFrames; + // Word16 subFrames = ( hCPE->hCoreCoder[ch]->core == TCX_10_CORE ) ? NB_DIV : 1; + IF( ( hCPE->hCoreCoder[ch]->core == TCX_10_CORE ) ) + { + subFrames = NB_DIV; + } + ELSE + { + subFrames = 1; + } + move16(); FOR( k = 0; k < subFrames; ++k ) { Scale_sig32( x_fx[ch][k], x_len[ch][k], sub( x_e[ch][k], 20 ) ); @@ -261,19 +273,23 @@ void stereo_mdct_core_dec_fx( FOR( k = 0; k < nSubframes[ch]; k++ ) { L_spec[ch] = idiv1616( sts[ch]->hTcxCfg->tcx_coded_lines, nSubframes[ch] ); + move16(); init_tcx_info_fx( sts[ch], sts[ch]->L_frame / nSubframes[ch], sts[ch]->hTcxDec->L_frameTCX / nSubframes[ch], k, bfi, &tcx_offset[ch], &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] ); } } /* IGF decoding */ - IF( NE_16( sts[0]->igf, 0 ) || NE_16( sts[1]->igf, 0 ) ) + test(); + IF( sts[0]->igf || sts[1]->igf ) { IF( NE_16( sts[0]->core, sts[1]->core ) ) { FOR( ch = 0; ch < nChannels; ch++ ) { st = sts[ch]; + test(); + test(); IF( !bfi || ( bfi && NE_16( st->core, ACELP_CORE ) ) ) { FOR( k = 0; k < nSubframes[ch]; k++ ) @@ -287,15 +303,17 @@ void stereo_mdct_core_dec_fx( } } } - ELSE IF( NE_16( sts[0]->core, ACELP_CORE ) ) + ELSE IF( sts[0]->core != ACELP_CORE ) { assert( EQ_16( nSubframes[0], nSubframes[1] ) ); FOR( k = 0; k < nSubframes[0]; k++ ) { - IF( ( NE_16( hCPE->hStereoMdct->IGFStereoMode[k], SMDCT_DUAL_MONO ) || NE_16( hCPE->hStereoMdct->mdct_stereo_mode[k], SMDCT_DUAL_MONO ) ) && EQ_16( hCPE->hStereoMdct->isSBAStereoMode, 0 ) ) + test(); + test(); + IF( ( NE_16( hCPE->hStereoMdct->IGFStereoMode[k], SMDCT_DUAL_MONO ) || NE_16( hCPE->hStereoMdct->mdct_stereo_mode[k], SMDCT_DUAL_MONO ) ) && hCPE->hStereoMdct->isSBAStereoMode == 0 ) { - assert( ( EQ_16( sts[0]->core, sts[1]->core ) ) || ( EQ_16( hCPE->hStereoMdct->mdct_stereo_mode[0], SMDCT_DUAL_MONO ) ) ); + assert( ( EQ_16( sts[0]->core, sts[1]->core ) ) || ( hCPE->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO ) ); /* stereo IGF decoding */ decoder_tcx_IGF_stereo_fx( sts, hCPE->hStereoMdct, ms_mask, x_fx, x_e, x_len, L_frame[0], left_rect[0], k, bfi, 0 /* MCT_flag */ ); @@ -331,19 +349,21 @@ void stereo_mdct_core_dec_fx( * Stereo processing *--------------------------------------------------------------------------------*/ - IF( EQ_16( bfi, 0 ) ) + IF( !bfi ) { FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { Word32 sns_int_scf_fx[FDNS_NPTS]; Word16 scf_fx[FDNS_NPTS], scf_e[FDNS_NPTS]; Word16 norm; + Word32 L_tmp; st = sts[ch]; FOR( k = 0; k < nSubframes[ch]; k++ ) { sns_interpolate_scalefactors_fx( sns_int_scf_fx, &Aq_fx_32[ch][k * M], DEC ); + test(); IF( st->hTonalMDCTConc != NULL && EQ_16( add( k, 1 ), nSubframes[ch] ) ) { x_e[ch][k] = 20; @@ -352,7 +372,9 @@ void stereo_mdct_core_dec_fx( { norm = norm_l( sns_int_scf_fx[j] ); scf_e[j] = sub( 15, norm ); + move16(); scf_fx[j] = extract_h( L_shl( sns_int_scf_fx[j], norm ) ); + move16(); } Word16 s = getScaleFactor32( x_fx[ch][k], L_frameTCX[ch] ); Scale_sig32( x_fx[ch][k], L_frameTCX[ch], s ); @@ -361,16 +383,32 @@ void stereo_mdct_core_dec_fx( } } - TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, L_frameTCX[ch], ( st->hTcxDec->tcxltp_last_gain_unmodified > 0 ) ? st->old_fpitch : 0, bfi, bfi && st->tonal_mdct_plc_active ); + IF( ( st->hTcxDec->tcxltp_last_gain_unmodified > 0 ) ) + { + L_tmp = st->old_fpitch; + } + ELSE + { + L_tmp = 0; + } + move32(); + + // TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, L_frameTCX[ch], ( st->hTcxDec->tcxltp_last_gain_unmodified > 0 ) ? st->old_fpitch : 0, bfi, bfi && st->tonal_mdct_plc_active ); + TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, L_frameTCX[ch], L_tmp, bfi, bfi && st->tonal_mdct_plc_active ); } - mvs2s( ms_mask[0], hCPE->hStereoMdct->prev_ms_mask[0], MAX_SFB ); - mvs2s( ms_mask[1], hCPE->hStereoMdct->prev_ms_mask[1], MAX_SFB ); + Copy( ms_mask[0], hCPE->hStereoMdct->prev_ms_mask[0], MAX_SFB ); + Copy( ms_mask[1], hCPE->hStereoMdct->prev_ms_mask[1], MAX_SFB ); } - IF( ( EQ_16( bfi, 0 ) || ( NE_16( sts[0]->core, ACELP_CORE ) || NE_16( sts[1]->core, ACELP_CORE ) ) ) && EQ_16( hCPE->hStereoMdct->isSBAStereoMode, 0 ) ) + test(); + test(); + test(); + IF( ( !bfi || ( sts[0]->core != ACELP_CORE || sts[1]->core != ACELP_CORE ) ) && !hCPE->hStereoMdct->isSBAStereoMode ) { Word16 q_x_1 = 11, q_x_0 = 11; + move16(); + move16(); stereo_decoder_tcx_fx( hCPE->hStereoMdct, ms_mask, x_0_fx[1], x_fx[0], x_fx[1], &hCPE->hStereoMdct->mdct_stereo_mode[0], sts[0]->core, sts[1]->core, sts[0]->igf, L_frameTCX[0], L_frameTCX[1], 0, sts[0]->last_core, sts[1]->last_core, 0, &q_x_1, &q_x_0 ); } @@ -379,11 +417,21 @@ void stereo_mdct_core_dec_fx( FOR( Word16 ind = 0; ind < 2; ind++ ) { - Word16 nSubFrames = EQ_16( hCPE->hCoreCoder[ind]->core, TCX_20_CORE ) ? 1 : NB_DIV; + Word16 nSubFrames; + // Word16 nSubFrames = EQ_16( hCPE->hCoreCoder[ind]->core, TCX_20_CORE ) ? 1 : NB_DIV; + IF( EQ_16( hCPE->hCoreCoder[ind]->core, TCX_20_CORE ) ) + { + nSubFrames = 1; + } + ELSE + { + nSubFrames = NB_DIV; + } + move16(); Scale_sig32( x_fx[ind][0], shr( L_FRAME_MAX, sub( nSubFrames, 1 ) ), sub( x_e[ind][0], 20 ) ); x_e[ind][0] = 20; move16(); - IF( nSubFrames == 2 ) + IF( EQ_16( nSubFrames, 2 ) ) { Scale_sig32( x_fx[ind][1], shr( L_FRAME_MAX, 1 ), sub( x_e[ind][1], 20 ) ); x_e[ind][1] = 20; @@ -391,6 +439,8 @@ void stereo_mdct_core_dec_fx( } } + test(); + test(); IF( EQ_16( st_ivas->renderer_type, RENDERER_MC_PARAMMC ) && ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) { ivas_ls_setup_conversion_process_mdct_param_mc_fx( st_ivas, x_fx, x_e ); @@ -398,6 +448,10 @@ void stereo_mdct_core_dec_fx( run_min_stats_fx( sts, x_fx, x_e ); + test(); + test(); + test(); + test(); IF( EQ_16( hCPE->nchan_out, 1 ) && ( EQ_16( bfi, 0 ) || ( NE_16( bfi, 0 ) && NE_16( sts[0]->core, ACELP_CORE ) && NE_16( sts[1]->core, ACELP_CORE ) ) ) ) { apply_dmx_weights_fx( hCPE, x_fx, sts[0]->transform_type, sts[1]->transform_type ); @@ -406,6 +460,7 @@ void stereo_mdct_core_dec_fx( Word16 s; FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { + test(); IF( sts[ch]->hFdCngDec && sts[ch]->hFdCngDec->hFdCngCom ) { s = getScaleFactor32( sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); @@ -417,6 +472,7 @@ void stereo_mdct_core_dec_fx( scale_sig32( sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, s ); sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = sub( sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, s ); } + test(); IF( sts[ch]->hFdCngDec && sts[ch]->hFdCngDec->hFdCngCom ) { sts[ch]->hFdCngDec->hFdCngCom->likelihood_noisy_speech = extract_h( sts[ch]->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx ); @@ -436,11 +492,11 @@ void stereo_mdct_core_dec_fx( ivas_mdct_core_reconstruct_fx( hCPE, x_fx, signal_outFB_tmp_fx, fUseTns, 0, Q11, 17 ); - mvl2l( signal_out_tmp_fx[0], signal_out_fx[0], L_FRAME48k ); - mvl2l( signal_out_tmp_fx[1], signal_out_fx[1], L_FRAME48k ); + Copy32( signal_out_tmp_fx[0], signal_out_fx[0], L_FRAME48k ); + Copy32( signal_out_tmp_fx[1], signal_out_fx[1], L_FRAME48k ); - mvs2s( signal_outFB_tmp_fx[0], signal_outFB_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX ); - mvs2s( signal_outFB_tmp_fx[1], signal_outFB_fx[1], hCPE->hCoreCoder[1]->hTcxDec->L_frameTCX ); + Copy( signal_outFB_tmp_fx[0], signal_outFB_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX ); + Copy( signal_outFB_tmp_fx[1], signal_outFB_fx[1], hCPE->hCoreCoder[1]->hTcxDec->L_frameTCX ); pop_wmops(); return; @@ -667,36 +723,87 @@ static void apply_dmx_weights_fx( Word32 *sig[CPE_CHANNELS][NB_DIV], *pTmp[CPE_CHANNELS][NB_DIV]; nChannels = CPE_CHANNELS; + move16(); frameSize = hCPE->hStereoMdct->stbParamsTCX20.sfbOffset[hCPE->hStereoMdct->stbParamsTCX20.sfbCnt]; + move16(); transform_type[0][0] = transform_type_left[0]; + move16(); transform_type[0][1] = transform_type_left[1]; + move16(); transform_type[1][0] = transform_type_right[0]; + move16(); transform_type[1][1] = transform_type_right[1]; + move16(); /* set overall frequency resolution of (sub)frame to maximum of (sub)frame, requires conversion if both channels are not the same */ - IF( transform_type[0][0] == TCX_20 || transform_type[1][0] == TCX_20 ) + test(); + test(); + IF( EQ_16( transform_type[0][0], TCX_20 ) || EQ_16( transform_type[1][0], TCX_20 ) ) { /* use TCX20 band config for TCX20 in both channels and mixed frames */ sfbConf = &hCPE->hStereoMdct->stbParamsTCX20; nsub = nsub2[0] = nsub2[1] = 1; /* overall TCX 20 */ + move16(); + move16(); + move16(); tcx_10_only = 0; + move16(); } ELSE { /* use TCX10 band config only if none of the channels is TCX20 */ sfbConf = &hCPE->hStereoMdct->stbParamsTCX10; nsub = 2; + move16(); /* set resolution per subframe, subdivide again if subframe is TCX5 in both channels */ - nsub2[0] = ( transform_type[0][0] == TCX_5 && transform_type[1][0] == TCX_5 ) ? 2 : 1; - nsub2[1] = ( transform_type[0][1] == TCX_5 && transform_type[1][1] == TCX_5 ) ? 2 : 1; + // nsub2[0] = ( transform_type[0][0] == TCX_5 && transform_type[1][0] == TCX_5 ) ? 2 : 1; + test(); + IF( EQ_16( transform_type[0][0], TCX_5 ) && EQ_16( transform_type[1][0], TCX_5 ) ) + { + nsub2[0] = 2; + move16(); + } + ELSE + { + nsub2[0] = 1; + move16(); + } + // nsub2[1] = ( transform_type[0][1] == TCX_5 && transform_type[1][1] == TCX_5 ) ? 2 : 1; + test(); + IF( EQ_16( transform_type[0][1], TCX_5 ) && EQ_16( transform_type[1][1], TCX_5 ) ) + { + nsub2[1] = 2; + move16(); + } + ELSE + { + nsub2[1] = 1; + move16(); + } tcx_10_only = 1; + move16(); } /* for subframes with only TCX5 in both channels number of coefficients is only half (in 2 quarterframes) */ - numCoeffs[0] = ( nsub2[0] == 1 ) ? sfbConf->sfbOffset[sfbConf->sfbCnt] : sfbConf->sfbOffset[sfbConf->sfbCnt] / 2; - numCoeffs[1] = ( nsub2[1] == 1 ) ? sfbConf->sfbOffset[sfbConf->sfbCnt] : sfbConf->sfbOffset[sfbConf->sfbCnt] / 2; - + // numCoeffs[0] = ( nsub2[0] == 1 ) ? sfbConf->sfbOffset[sfbConf->sfbCnt] : sfbConf->sfbOffset[sfbConf->sfbCnt] / 2; + IF( EQ_16( nsub2[0], 1 ) ) + { + numCoeffs[0] = sfbConf->sfbOffset[sfbConf->sfbCnt]; + } + ELSE + { + numCoeffs[0] = shr( sfbConf->sfbOffset[sfbConf->sfbCnt], 1 ); + } + // numCoeffs[1] = ( nsub2[1] == 1 ) ? sfbConf->sfbOffset[sfbConf->sfbCnt] : sfbConf->sfbOffset[sfbConf->sfbCnt] / 2; + IF( EQ_16( nsub2[1], 1 ) ) + { + numCoeffs[1] = sfbConf->sfbOffset[sfbConf->sfbCnt]; + } + ELSE + { + numCoeffs[1] = shr( sfbConf->sfbOffset[sfbConf->sfbCnt], 1 ); + } /* initially, set pointers to input; if conversion occurs in (sub)frame, set to convertRes */ sig[0][0] = pTmp[0][0] = x[0][0]; sig[0][1] = pTmp[0][1] = x[0][1]; @@ -708,19 +815,21 @@ static void apply_dmx_weights_fx( { FOR( k = 0; k < NB_DIV; k++ ) { - IF( transform_type[ch][k] == TCX_5 && nsub2[k] == 1 ) + test(); + IF( EQ_16( transform_type[ch][k], TCX_5 ) && EQ_16( nsub2[k], 1 ) ) { /* subframe is TCX5, but TCX10 or TCX20 in other channel -> convert channel with TCX5 to TCX10 resolution */ - pTmp[ch][k] = sig[ch][k] = convertRes[ch] + k * frameSize / 2; - convert_coeffs_to_higher_res_fx( x[ch][k], x[ch][k] + frameSize / 4, pTmp[ch][k], frameSize / 4 ); + pTmp[ch][k] = sig[ch][k] = convertRes[ch] + i_mult( k, shr( frameSize, 1 ) ); + convert_coeffs_to_higher_res_fx( x[ch][k], x[ch][k] + shr(frameSize ,2), pTmp[ch][k], shr( frameSize, 2 ) ); } } - IF( transform_type[ch][0] != TCX_20 && nsub == 1 ) + test(); + IF( NE_16( transform_type[ch][0], TCX_20 ) && EQ_16( nsub, 1 ) ) { /* TCX20 and TCX10 in same frame -> convert channel with TCX10 to TCX20 resolution */ sig[ch][0] = convertRes[ch]; - convert_coeffs_to_higher_res_fx( pTmp[ch][0], pTmp[ch][1], sig[ch][0], frameSize / 2 ); + convert_coeffs_to_higher_res_fx( pTmp[ch][0], pTmp[ch][1], sig[ch][0], shr( frameSize, 1 ) ); } } @@ -732,10 +841,13 @@ static void apply_dmx_weights_fx( FOR( l = 0; l < nsub2[k]; l++ ) { // mdst[ch][k][l * numCoeffs[k]] = mdst[ch][k][( l + 1 ) * numCoeffs[k] - 1] = 0.f; - mdst[ch][k][l * numCoeffs[k]] = mdst[ch][k][( l + 1 ) * numCoeffs[k] - 1] = 0; + mdst[ch][k][i_mult(l , numCoeffs[k])] = mdst[ch][k][sub(i_mult(add( l , 1 ) , numCoeffs[k]) , 1)] = 0; + move32(); + move32(); FOR( i = l * numCoeffs[k] + 1; i < ( l + 1 ) * numCoeffs[k] - 1; i++ ) { - mdst[ch][k][i] = sig[ch][k][i + 1] - sig[ch][k][i - 1]; + mdst[ch][k][i] = L_sub( sig[ch][k][i + 1], sig[ch][k][i - 1] ); + move32(); } } } @@ -743,6 +855,7 @@ static void apply_dmx_weights_fx( /* compute and apply bandwise weigths for active downmix (similar to DFT Stereo) */ stop_tcx5 = 0; + move16(); FOR( b = 0; b < sfbConf->sfbCnt; b++ ) { Word16 w[CPE_CHANNELS][4]; @@ -752,11 +865,38 @@ static void apply_dmx_weights_fx( FOR( l = 0; l < nsub2[k]; l++ ) { Word64 sum_nrg_L = 0, sum_nrg_R = 0; + move64(); + move64(); Word64 dot_prod_real = 0, dot_prod_imag = 0; + move64(); + move64(); Word32 sum_nrg_Mid, sum_abs, dot_prod_abs; + Word16 val_div = 0; - start = l * numCoeffs[k] + sfbConf->sfbOffset[b] / nsub2[k]; - stop = l * numCoeffs[k] + sfbConf->sfbOffset[b + 1] / nsub2[k]; + IF( sfbConf->sfbOffset[b] == 0 ) + { + val_div = 0; + move16(); + } + ELSE + { + val_div = idiv1616( sfbConf->sfbOffset[b], nsub2[k] ); + move16(); + } + start = add( i_mult( l, numCoeffs[k] ), val_div ); + + IF( sfbConf->sfbOffset[b + 1] == 0 ) + { + val_div = 0; + move16(); + } + ELSE + { + val_div = idiv1616( sfbConf->sfbOffset[b + 1], nsub2[k] ); + move16(); + } + + stop = add( i_mult( l, numCoeffs[k] ), val_div ); /* compute band energies and cross correlation */ FOR( i = start; i < stop; i++ ) @@ -773,84 +913,102 @@ static void apply_dmx_weights_fx( Word16 norm_dot_prod_imag = W_norm( dot_prod_imag ); Word16 guard_bit = find_guarded_bits_fx( 4 ); - Word16 min_norm = min( min( min( norm_sum_nrg_L, norm_sum_nrg_R ), norm_dot_prod_real ), norm_dot_prod_imag ) - guard_bit; + Word16 min_norm = sub( s_min( s_min( s_min( norm_sum_nrg_L, norm_sum_nrg_R ), norm_dot_prod_real ), norm_dot_prod_imag ), guard_bit ); Word32 sum_nrg_L_32 = W_extract_h( W_shl( sum_nrg_L, min_norm ) ); Word32 sum_nrg_R_32 = W_extract_h( W_shl( sum_nrg_R, min_norm ) ); Word32 dot_prod_real_32 = W_extract_h( W_shl( dot_prod_real, min_norm ) ); Word32 dot_prod_imag_32 = W_extract_h( W_shl( dot_prod_imag, min_norm ) ); - Word16 q_sum_nrg_L = 23 + min_norm - 32; - Word16 q_sum_nrg_R = 23 + min_norm - 32; - Word16 q_dot_prod_real = 23 + min_norm - 32; + Word16 q_sum_nrg_L = sub( add( 23, min_norm ), 32 ); + Word16 q_sum_nrg_R = sub( add( 23, min_norm ), 32 ); + Word16 q_dot_prod_real = sub( add( 23, min_norm ), 32 ); - Word16 E_sum_nrg_l = 31 - q_sum_nrg_L; - Word16 E_sum_nrg_R = 31 - q_sum_nrg_R; - Word16 E_dot_prod_abs = 31 - ( q_dot_prod_real * 2 - 31 ); - Word16 E_sum_nrg_Mid = 31 - q_sum_nrg_L; - sum_nrg_Mid = max( 0, L_add( L_add( sum_nrg_L_32, sum_nrg_R_32 ), L_shl( dot_prod_real_32, 1 ) ) ); + Word16 E_sum_nrg_l = sub( 31, q_sum_nrg_L ); + Word16 E_sum_nrg_R = sub( 31, q_sum_nrg_R ); + Word16 E_dot_prod_abs = sub( 31, sub( shl( q_dot_prod_real, 1 ), 31 ) ); + Word16 E_sum_nrg_Mid = sub( 31, q_sum_nrg_L ); + sum_nrg_Mid = L_max( 0, L_add( L_add( sum_nrg_L_32, sum_nrg_R_32 ), L_shl( dot_prod_real_32, 1 ) ) ); Word32 tmp_nrg_L = Sqrt32( sum_nrg_L_32, &E_sum_nrg_l ); Word32 tmp_nrg_R = Sqrt32( sum_nrg_R_32, &E_sum_nrg_R ); Word16 max_e_sum_abs = E_sum_nrg_l; - IF( E_sum_nrg_R > E_sum_nrg_l ) + move16(); + IF( GT_16( E_sum_nrg_R, E_sum_nrg_l ) ) { max_e_sum_abs = E_sum_nrg_R; + move16(); } - max_e_sum_abs = max_e_sum_abs + 1; + max_e_sum_abs = add( max_e_sum_abs, 1 ); sum_abs = L_add( L_shr( tmp_nrg_L, max_e_sum_abs - E_sum_nrg_l ), L_shr( tmp_nrg_R, max_e_sum_abs - E_sum_nrg_R ) ); dot_prod_abs = Sqrt32( L_add( Mpy_32_32( dot_prod_real_32, dot_prod_real_32 ), Mpy_32_32( dot_prod_imag_32, dot_prod_imag_32 ) ), &E_dot_prod_abs ); Word32 num = L_add( L_shr( L_add( sum_nrg_L_32, sum_nrg_R_32 ), 1 ), L_shr( dot_prod_abs, ( 31 - E_dot_prod_abs ) - q_sum_nrg_L ) ); - Word16 E_num = 31 - q_sum_nrg_L; + Word16 E_num = sub( 31, q_sum_nrg_L ); Word32 num_sqrt = Sqrt32( num, &E_num ); Word16 e_full_w = max_e_sum_abs; - IF( max_e_sum_abs < E_num ) + move16(); + IF( LT_16( max_e_sum_abs, E_num ) ) { e_full_w = E_num; + move16(); } Word16 full_w_up; + test(); + test(); IF( num_sqrt == 0 && sum_abs == 0 ) { full_w_up = 6364; // 0.776887059 in Q13 + move16(); } ELSE IF( num_sqrt == 0 && sum_abs != 0 ) { full_w_up = 5793; // 0.707106769 in Q13 + move16(); } ELSE { - full_w_up = shr( divide3232( L_shr( num_sqrt, e_full_w - E_num ), L_shr( sum_abs, e_full_w - max_e_sum_abs ) ), 2 ); + full_w_up = shr( divide3232( L_shr( num_sqrt, sub( e_full_w, E_num ) ), L_shr( sum_abs, sub( e_full_w, max_e_sum_abs ) ) ), 2 ); } Word32 sum_nrg_Mid_sqrt = Sqrt32( sum_nrg_Mid, &E_sum_nrg_Mid ); Word16 e_full_down = max_e_sum_abs; - IF( max_e_sum_abs < E_sum_nrg_Mid ) + move16(); + IF( LT_16( max_e_sum_abs, E_sum_nrg_Mid ) ) { e_full_down = E_sum_nrg_Mid; + move16(); } Word16 full_w_down; + test(); + test(); IF( sum_nrg_Mid_sqrt == 0 && sum_abs == 0 ) { full_w_down = 6364; + move16(); } ELSE IF( sum_nrg_Mid_sqrt == 0 && sum_abs != 0 ) { full_w_down = 5793; + move16(); } ELSE { - full_w_down = shr( divide3232( L_shr( sum_nrg_Mid_sqrt, e_full_down - E_sum_nrg_Mid ), L_shr( sum_abs, e_full_down - max_e_sum_abs ) ), 1 ); + full_w_down = shr( divide3232( L_shr( sum_nrg_Mid_sqrt, sub( e_full_down, E_sum_nrg_Mid ) ), L_shr( sum_abs, sub( e_full_down, max_e_sum_abs ) ) ), 1 ); } IF( hCPE->hStereoMdct->reverse_dmx == 0 ) { - w[1][2 * k + l] = full_w_up; - w[0][2 * k + l] = add( w[1][2 * k + l], mult( 23170 /*sqrt(2.0f in Q14)*/, sub( 16384 /* 1.0f in Q14 */, full_w_down ) ) ); + w[1][add( 2 * k, l )] = full_w_up; + move16(); + w[0][add( 2 * k, l )] = add( w[1][add( 2 * k, l )], mult( 23170 /*sqrt(2.0f in Q14)*/, sub( 16384 /* 1.0f in Q14 */, full_w_down ) ) ); + move16(); } ELSE { - w[0][2 * k + l] = full_w_up; - w[1][2 * k + l] = add( w[0][2 * k + l], mult( 23170 /*sqrt(2.0f in Q14)*/, sub( 16384 /* 1.0f in Q14 */, full_w_down ) ) ); + w[0][add( 2 * k, l )] = full_w_up; + move16(); + w[1][add( 2 * k, l )] = add( w[0][add( 2 * k, l )], mult( 23170 /*sqrt(2.0f in Q14)*/, sub( 16384 /* 1.0f in Q14 */, full_w_down ) ) ); + move16(); } } } @@ -858,51 +1016,69 @@ static void apply_dmx_weights_fx( /* apply weights to channels with their original frequency resolutions */ FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - IF( transform_type[ch][0] == TCX_20 ) + IF( EQ_16( transform_type[ch][0], TCX_20 ) ) { FOR( i = sfbConf->sfbOffset[b]; i < sfbConf->sfbOffset[b + 1]; i++ ) { x[ch][0][i] = L_shl( Mpy_32_16_1( x[ch][0][i], w[ch][0] ), 2 ); + move32(); } } ELSE { start = sfbConf->sfbOffset[b]; + move16(); stop = sfbConf->sfbOffset[b + 1]; + move16(); IF( !tcx_10_only ) /* TCX20 band config is used */ { - start /= 2; - stop /= 2; + start = shr( start, 1 ); + stop = shr( stop, 1 ); } FOR( k = 0; k < NB_DIV; k++ ) { - w_idx = ( nsub == 1 ) ? 0 : 2 * k; - IF( transform_type[ch][k] == TCX_10 ) + // w_idx = ( nsub == 1 ) ? 0 : 2 * k; + IF( EQ_16( nsub, 1 ) ) + { + w_idx = 0; + move16(); + } + ELSE + { + w_idx = shl( k, 1 ); + move16(); + } + + IF( EQ_16( transform_type[ch][k], TCX_10 ) ) { FOR( i = start; i < stop; i++ ) { x[ch][k][i] = L_shl( Mpy_32_16_1( x[ch][k][i], w[ch][w_idx] ), 2 ); + move32(); } } ELSE /* TCX_5 */ { start_tcx5 = stop_tcx5; - stop_tcx5 = ( stop + 1 ) / 2; + move16(); + stop_tcx5 = shr( add( stop, 1 ), 1 ); FOR( i = start_tcx5; i < stop_tcx5; i++ ) { x[ch][k][i] = L_shl( Mpy_32_16_1( x[ch][k][i], w[ch][w_idx] ), 2 ); + move32(); } - IF( nsub2[k] == 2 ) + IF( EQ_16( nsub2[k], 2 ) ) { - w_idx++; + w_idx = add( w_idx, 1 ); } FOR( i = start_tcx5; i < stop_tcx5; i++ ) { - x[ch][k][i + ( frameSize >> 2 )] = L_shl( Mpy_32_16_1( x[ch][k][i + ( frameSize >> 2 )], w[ch][w_idx] ), 2 ); + x[ch][k][add( i, shr( frameSize, 2 ) )] = L_shl( Mpy_32_16_1( x[ch][k][add( i, shr( frameSize, 2 ) )], w[ch][w_idx] ), 2 ); + move32(); } } } @@ -926,17 +1102,26 @@ static void run_min_stats_fx( Word32 *x[CPE_CHANNELS][NB_DIV], /* i/o: MDCT Spectrum */ Word16 x_e[CPE_CHANNELS][NB_DIV] ) { - int16_t ch, will_estimate_noise_on_channel[CPE_CHANNELS], save_VAD[CPE_CHANNELS]; + Word16 ch, will_estimate_noise_on_channel[CPE_CHANNELS], save_VAD[CPE_CHANNELS]; Word32 power_spec[L_FRAME16k]; Word16 power_spec_16[L_FRAME16k], power_spec_e = 0; + move16(); Word32 *spec_in; Word16 spec_e; /* Check if the minimum statistics would run on the respective channels. They are run on inactive TCX20 channels */ - will_estimate_noise_on_channel[0] = sts[0]->core == TCX_20_CORE && !sts[0]->VAD; - will_estimate_noise_on_channel[1] = sts[1]->core == TCX_20_CORE && !sts[1]->VAD; + test(); + test(); + will_estimate_noise_on_channel[0] = EQ_16( sts[0]->core, TCX_20_CORE ) && !sts[0]->VAD; + will_estimate_noise_on_channel[1] = EQ_16( sts[1]->core, TCX_20_CORE ) && !sts[1]->VAD; + test(); + test(); + move16(); + move16(); save_VAD[0] = sts[0]->VAD; + move16(); save_VAD[1] = sts[1]->VAD; + move16(); /* The first loop calculates the power spectra needed in the minimum statistics (MS) noise estimation. This is only needed if the MS would run at all on at least one of the channels. If they run on both channels, we need to calculate two distinct power spectra @@ -948,6 +1133,8 @@ static void run_min_stats_fx( Decoder_State *st; st = sts[ch]; + test(); + test(); IF( !sts[0]->bfi && ( will_estimate_noise_on_channel[0] || will_estimate_noise_on_channel[1] ) ) { /* if noise estimation is expected to run on this channel, compute power spectrum from it, @@ -963,6 +1150,7 @@ static void run_min_stats_fx( spec_e = x_e[( ch + 1 ) % 2][0]; /* patch VAD to zero so that estimation runs, will later be restored */ st->VAD = 0; + move16(); } /* Compute power spectrum twice if estimation will run on both channels. If only on one channel, it is @@ -971,15 +1159,16 @@ static void run_min_stats_fx( { Word16 tmp16 = getScaleFactor32( spec_in, L_FRAME16k ); /* calculate power spectrum from MDCT coefficients and estimated MDST coeffs */ - power_spec[0] = W_extract_h( W_shl( W_mult_32_32( spec_in[0], spec_in[0] ), tmp16 - 4 ) ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31 */ - power_spec[L_FRAME16k - 1] = W_extract_h( W_shl( W_mult_32_32( spec_in[L_FRAME16k - 1], spec_in[L_FRAME16k - 1] ), tmp16 - 4 ) ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31 */ + power_spec[0] = W_extract_h( W_shl( W_mult_32_32( spec_in[0], spec_in[0] ), sub( tmp16, 4 ) ) ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31 */ + power_spec[L_FRAME16k - 1] = W_extract_h( W_shl( W_mult_32_32( spec_in[L_FRAME16k - 1], spec_in[L_FRAME16k - 1] ), sub( tmp16, 4 ) ) ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31 */ FOR( Word16 i = 1; i < L_FRAME16k - 1; i++ ) { Word32 mdst; mdst = L_sub( spec_in[i + 1], spec_in[i - 1] ); /* Q31 - x_e */ - power_spec[i] = L_add( W_extract_h( W_shl( W_mult_32_32( spec_in[i], spec_in[i] ), tmp16 - 4 ) ), W_extract_h( W_shl( W_mult_32_32( mdst, mdst ), tmp16 - 4 ) ) ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31*/ + power_spec[i] = L_add( W_extract_h( W_shl( W_mult_32_32( spec_in[i], spec_in[i] ), sub( tmp16, 4 ) ) ), W_extract_h( W_shl( W_mult_32_32( mdst, mdst ), sub( tmp16, 4 ) ) ) ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31*/ + move32(); } - power_spec_e = add( 4, shl( spec_e, 1 ) ) - tmp16; + power_spec_e = sub( add( 4, shl( spec_e, 1 ) ), tmp16 ); } Copy_Scale_sig32_16( power_spec, power_spec_16, L_FRAME16k, 0 ); @@ -990,8 +1179,11 @@ static void run_min_stats_fx( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = extract_h( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx ); st->lp_noise = st->hFdCngDec->lp_noise; + move32(); } + test(); + test(); IF( will_estimate_noise_on_channel[0] || will_estimate_noise_on_channel[1] || st->bfi ) { // for ( int p = 0; p < FFTCLDFBLEN; p++ ) @@ -1005,7 +1197,16 @@ static void run_min_stats_fx( // Scale_sig32(power_spec, L_FRAME16k, sub(power_spec_e, 31)); // power_spec_e = 31; /*=================================================*/ - ApplyFdCng_ivas_fx( NULL, 0, st->bfi ? NULL : power_spec, sub( 31, power_spec_e ), NULL, NULL, NULL, st, st->bfi, 0 ); + Word32 *arr_tmp; + IF( st->bfi ) + { + arr_tmp = NULL; + } + ELSE + { + arr_tmp = power_spec; + } + ApplyFdCng_ivas_fx( NULL, 0, arr_tmp, sub( 31, power_spec_e ), NULL, NULL, NULL, st, st->bfi, 0 ); /*=================================================*/ } diff --git a/lib_rend/ivas_reflections.c b/lib_rend/ivas_reflections.c index ee5596104..b06de85c6 100644 --- a/lib_rend/ivas_reflections.c +++ b/lib_rend/ivas_reflections.c @@ -55,6 +55,17 @@ #define ER_NUM_REF 6 +#ifdef IVAS_FLOAT_FIXED +static UWord16 LC_mixing_5_1[5] = { 0, 1, 2, 0, 1 }; + +static UWord16 LC_mixing_7_1[7] = { 0, 1, 2, 3, 4, 3, 4 }; + +static UWord16 LC_mixing_5_1_2[7] = { 0, 1, 2, 3, 4, 0, 1 }; + +static UWord16 LC_mixing_5_1_4[9] = { 0, 1, 2, 3, 4, 0, 1, 2, 3 }; + +static UWord16 LC_mixing_7_1_4[11] = { 0, 1, 2, 3, 4, 3, 4, 0, 1, 2, 3 }; +#else static uint16_t LC_mixing_5_1[5] = { 0, 1, 2, 0, 1 }; static uint16_t LC_mixing_7_1[7] = { 0, 1, 2, 3, 4, 3, 4 }; @@ -64,6 +75,7 @@ static uint16_t LC_mixing_5_1_2[7] = { 0, 1, 2, 3, 4, 0, 1 }; static uint16_t LC_mixing_5_1_4[9] = { 0, 1, 2, 3, 4, 0, 1, 2, 3 }; static uint16_t LC_mixing_7_1_4[11] = { 0, 1, 2, 3, 4, 3, 4, 0, 1, 2, 3 }; +#endif /*-----------------------------------------------------------------------------------------* @@ -142,15 +154,15 @@ ivas_error ivas_er_init( /* Set to defaults for shoebox */ reflections->is_ready = 0; + move16(); reflections->audio_config = IVAS_AUDIO_CONFIG_INVALID; - reflections->is_cartesian = 0; - reflections->is_relative = 1; - reflections->shoebox_data.n_ref = ER_NUM_REF; move16(); + reflections->is_cartesian = 0; move16(); + reflections->is_relative = 1; move16(); + reflections->shoebox_data.n_ref = ER_NUM_REF; move16(); - move32(); /* Store scene origin if present */ @@ -175,11 +187,11 @@ ivas_error ivas_er_init( return error; } - IF( ( reflections->closest_ch_idx = (uint16_t *) malloc( reflections->n_total_reflections * sizeof( uint16_t ) ) ) == NULL ) + IF( ( reflections->closest_ch_idx = (UWord16 *) malloc( reflections->n_total_reflections * sizeof( UWord16 ) ) ) == NULL ) { return IVAS_ERR_FAILED_ALLOC; } - set_s( (int16_t *) reflections->closest_ch_idx, 0, reflections->n_total_reflections ); + set16_fx( (Word16 *) reflections->closest_ch_idx, 0, reflections->n_total_reflections ); IF( NE_32( ( error = getAudioConfigNumChannels( reflections->audio_config, &( reflections->nchan_out ) ) ), IVAS_ERR_OK ) ) { @@ -252,9 +264,9 @@ ivas_error ivas_er_set_reflections_mode( FOR( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) { - reflections->source_positions_fx[3 * ch] = ls_azimuth_CICP2_idx[ch]; - reflections->source_positions_fx[1 + ( 3 * ch )] = ls_elevation_CICP2_idx[ch]; - reflections->source_positions_fx[2 + ( 3 * ch )] = ER_RADIUS_FX; + reflections->source_positions_fx[i_mult( 3, ch )] = ls_azimuth_CICP2_idx[ch]; + reflections->source_positions_fx[add( 1, i_mult( 3, ch ) )] = ls_elevation_CICP2_idx[ch]; + reflections->source_positions_fx[add( 2, i_mult( 3, ch ) )] = ER_RADIUS_FX; move32(); move32(); move32(); @@ -270,9 +282,9 @@ ivas_error ivas_er_set_reflections_mode( FOR( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) { - reflections->source_positions_fx[3 * ch] = ls_azimuth_CICP6_idx[ch]; - reflections->source_positions_fx[1 + ( 3 * ch )] = ls_elevation_CICP6_idx[ch]; - reflections->source_positions_fx[2 + ( 3 * ch )] = ER_RADIUS_FX; + reflections->source_positions_fx[i_mult( 3, ch )] = ls_azimuth_CICP6_idx[ch]; + reflections->source_positions_fx[add( 1, i_mult( 3, ch ) )] = ls_elevation_CICP6_idx[ch]; + reflections->source_positions_fx[add( 2, i_mult( 3, ch ) )] = ER_RADIUS_FX; move32(); move32(); move32(); @@ -287,9 +299,9 @@ ivas_error ivas_er_set_reflections_mode( move16(); FOR( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) { - reflections->source_positions_fx[3 * ch] = ls_azimuth_CICP12_idx[ch]; - reflections->source_positions_fx[1 + ( 3 * ch )] = ls_elevation_CICP12_idx[ch]; - reflections->source_positions_fx[2 + ( 3 * ch )] = ER_RADIUS_FX; + reflections->source_positions_fx[i_mult( 3, ch )] = ls_azimuth_CICP12_idx[ch]; + reflections->source_positions_fx[add( 1, i_mult( 3, ch ) )] = ls_elevation_CICP12_idx[ch]; + reflections->source_positions_fx[add( 2, i_mult( 3, ch ) )] = ER_RADIUS_FX; move32(); move32(); move32(); @@ -304,9 +316,9 @@ ivas_error ivas_er_set_reflections_mode( move16(); FOR( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) { - reflections->source_positions_fx[3 * ch] = ls_azimuth_CICP14_idx[ch]; - reflections->source_positions_fx[1 + ( 3 * ch )] = ls_elevation_CICP14_idx[ch]; - reflections->source_positions_fx[2 + ( 3 * ch )] = ER_RADIUS_FX; + reflections->source_positions_fx[i_mult( 3, ch )] = ls_azimuth_CICP14_idx[ch]; + reflections->source_positions_fx[add( 1, i_mult( 3, ch ) )] = ls_elevation_CICP14_idx[ch]; + reflections->source_positions_fx[add( 2, i_mult( 3, ch ) )] = ER_RADIUS_FX; move32(); move32(); move32(); @@ -321,9 +333,9 @@ ivas_error ivas_er_set_reflections_mode( move16(); FOR( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) { - reflections->source_positions_fx[3 * ch] = ls_azimuth_CICP16_idx[ch]; - reflections->source_positions_fx[1 + ( 3 * ch )] = ls_elevation_CICP16_idx[ch]; - reflections->source_positions_fx[2 + ( 3 * ch )] = ER_RADIUS_FX; + reflections->source_positions_fx[i_mult( 3, ch )] = ls_azimuth_CICP16_idx[ch]; + reflections->source_positions_fx[add( 1, i_mult( 3, ch ) )] = ls_elevation_CICP16_idx[ch]; + reflections->source_positions_fx[add( 2, i_mult( 3, ch ) )] = ER_RADIUS_FX; move32(); move32(); move32(); @@ -338,9 +350,9 @@ ivas_error ivas_er_set_reflections_mode( move16(); FOR( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) { - reflections->source_positions_fx[3 * ch] = ls_azimuth_CICP19_idx[ch]; - reflections->source_positions_fx[1 + ( 3 * ch )] = ls_elevation_CICP19_idx[ch]; - reflections->source_positions_fx[2 + ( 3 * ch )] = ER_RADIUS_FX; + reflections->source_positions_fx[i_mult( 3, ch )] = ls_azimuth_CICP19_idx[ch]; + reflections->source_positions_fx[add( 1, i_mult( 3, ch ) )] = ls_elevation_CICP19_idx[ch]; + reflections->source_positions_fx[add( 2, i_mult( 3, ch ) )] = ER_RADIUS_FX; move32(); move32(); move32(); @@ -626,11 +638,8 @@ ivas_error ivas_er_encoder_init( p_z_src_fx = Mpy_32_32( src_pos_ptr_fx[2], shoebox_sin_cos_tbl_fx[( src_pos_ptr_fx[1] )][0] ); //.29 = .30 * .30 p_x_src_fx = L_shr( p_x_src_fx, 14 ); - move32(); p_y_src_fx = L_shr( p_y_src_fx, 14 ); - move32(); p_z_src_fx = L_shr( p_z_src_fx, 15 ); - move32(); tmp_data = L_sub( p_x_src_fx, p_x_fx ); tmp16 = extract_l( tmp_data ); // Q.14 @@ -648,20 +657,21 @@ ivas_error ivas_er_encoder_init( tmp16 = shr( tmp16, 1 ); // Q.13 tmp_fx = L_mac( tmp_fx, tmp16, tmp16 ); // Q.27 q_format = Q31 - Q27; + move16(); dist_fx = Sqrt32( tmp_fx, &q_format ); - IF( EQ_32( dist_fx, 0 ) ) + if ( dist_fx == 0 ) { q_format = 0; move16(); } - IF( LE_16( q_format, 0 ) ) + IF( q_format <= 0 ) { dist_fx = L_shl( dist_fx, q_format ); // Q31 q_format = 0; move16(); } /* Save index of closest channel */ - IF( EQ_16( src_idx, 0 ) ) + IF( src_idx == 0 ) { min_dist_fx = dist_fx; min_qformat = q_format; @@ -743,20 +753,29 @@ ivas_error ivas_er_compute_reflections( { FOR( j = 0; j < reflections->shoebox_data.n_ref; j++ ) { - tmp_fx = reflections->shoebox_data.times.data_fx[j + ( i * reflections->shoebox_data.n_ref )]; + tmp_fx = reflections->shoebox_data.times.data_fx[add( j, i_mult( i, reflections->shoebox_data.n_ref ) )]; tmp_fx_lo = extract_l( tmp_fx ); Mpy_32_16_uu( tmp_fx, (UWord16) reflections->output_Fs_fx, &tmp_fx1, &tmp_fx_lo ); tmp_fx1 = (UWord32) L_add( tmp_fx1, 0x20 ); tmp_fx1 = L_shr( tmp_fx1, 6 ); - reflections->shoebox_data.times.data_fx[j + ( i * reflections->shoebox_data.n_ref )] = tmp_fx1; - circ_len = ( (UWord16) tmp_fx1 > circ_len ) ? (UWord16) tmp_fx1 : circ_len; + reflections->shoebox_data.times.data_fx[add( j, i_mult( i, reflections->shoebox_data.n_ref ) )] = tmp_fx1; + move32(); + // circ_len = ( (UWord16) tmp_fx1 > circ_len ) ? (UWord16) tmp_fx1 : circ_len; + IF( GT_32( u_extract_l( tmp_fx1 ), circ_len ) ) + { + circ_len = u_extract_l( tmp_fx1 ); + } } } /* If max delay is less than max frame size, use max frame size to compute circ buffer length */ - circ_len = ( circ_len > (UWord16) reflections->max_frame_size ) ? circ_len : (UWord16) reflections->max_frame_size; - circ_len += (UWord16) reflections->max_frame_size; + IF( LE_32( circ_len, u_extract_l( reflections->max_frame_size ) ) ) + { + circ_len = u_extract_l( reflections->max_frame_size ); + } + + circ_len = u_extract_l( UL_addNsD( circ_len, reflections->max_frame_size ) ); /* If circ buffers exist and size is the same, reset memory to all zeros */ /* If size is different, reallocate circ buffers */ @@ -768,10 +787,10 @@ ivas_error ivas_er_compute_reflections( } IF( reflections->circ_buffers ) { - IF( reflections->circ_len == circ_len ) + IF( EQ_32( reflections->circ_len, circ_len ) ) { /* circ buffers exist and size is the same */ - set32_fx( reflections->circ_buffers, 0, reflections->shoebox_data.n_sources * reflections->circ_len ); + set32_fx( reflections->circ_buffers, 0, i_mult( reflections->shoebox_data.n_sources, reflections->circ_len ) ); } ELSE { @@ -779,7 +798,7 @@ ivas_error ivas_er_compute_reflections( reflections->circ_len = circ_len; move16(); free( reflections->circ_buffers ); - IF( ( reflections->circ_buffers = (Word32 *) malloc( reflections->shoebox_data.n_sources * reflections->circ_len * sizeof( Word32 ) ) ) == NULL ) + IF( ( reflections->circ_buffers = (Word32 *) malloc( i_mult( reflections->shoebox_data.n_sources, reflections->circ_len ) * sizeof( Word32 ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections buffers" ); } @@ -791,7 +810,7 @@ ivas_error ivas_er_compute_reflections( /* circ buffers do not exist */ reflections->circ_len = circ_len; move16(); - IF( ( reflections->circ_buffers = (Word32 *) malloc( reflections->shoebox_data.n_sources * reflections->circ_len * sizeof( Word32 ) ) ) == NULL ) + IF( ( reflections->circ_buffers = (Word32 *) malloc( i_mult( reflections->shoebox_data.n_sources, reflections->circ_len ) * sizeof( Word32 ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections buffers" ); } @@ -799,10 +818,11 @@ ivas_error ivas_er_compute_reflections( } /* Initialize circular buffer insertion point */ - reflections->circ_insert = reflections->circ_len - (UWord16) reflections->max_frame_size; + reflections->circ_insert = u_extract_l( UL_subNsD( reflections->circ_len, reflections->max_frame_size ) ); /* Get total reflections number */ - reflections->n_total_reflections = reflections->shoebox_data.n_sources * reflections->shoebox_data.n_ref; + reflections->n_total_reflections = (UWord16) i_mult( reflections->shoebox_data.n_sources, reflections->shoebox_data.n_ref ); + move16(); /* Check that reflection buffers were allocated */ IF( NE_32( error, IVAS_ERR_OK ) ) @@ -933,12 +953,13 @@ ivas_error ivas_er_process( } /* should not arrive here if reflections are disabled but in case it does just do nothing */ - IF( reflections->use_er != 1 ) + IF( NE_32( reflections->use_er, 1 ) ) { return error; } /* Ensure all reflection memory is allocated */ + test(); IF( !reflections->circ_buffers || !reflections->is_ready ) { return IVAS_ERR_INIT_ERROR; @@ -967,19 +988,41 @@ ivas_error ivas_er_process( FOR( i = 0; i < reflections->shoebox_data.n_sources; i++ ) { /* Pull correct circular buffer depending on complexity mode */ - buf_ch_idx = ( reflections->lowComplexity == 1 ) ? reflections->LC_mixing[i] : i; - buffer_ch = &( reflections->circ_buffers[buf_ch_idx * reflections->circ_len] ); + // buf_ch_idx = ( reflections->lowComplexity == 1 ) ? reflections->LC_mixing[i] : i; + IF( EQ_32( reflections->lowComplexity, 1 ) ) + { + buf_ch_idx = reflections->LC_mixing[i]; + move16(); + } + ELSE + { + buf_ch_idx = i; + move16(); + } + buffer_ch = &( reflections->circ_buffers[i_mult( buf_ch_idx, reflections->circ_len )] ); /* Skip LFE from input buffer */ - in_ch_idx = ( i >= LFE_CHANNEL ) ? i + 1 : i; + // in_ch_idx = ( i >= LFE_CHANNEL ) ? i + 1 : i; + IF( GE_32( i, LFE_CHANNEL ) ) + { + in_ch_idx = add( i, 1 ); + } + ELSE + { + in_ch_idx = i; + move16(); + } samp_idx = reflections->circ_insert; + move16(); /* If less than number of reflection sources, overwrite buffer */ - IF( i == buf_ch_idx ) + IF( EQ_32( i, buf_ch_idx ) ) { FOR( j = 0; j < subframe_size; j++ ) { - buffer_ch[samp_idx++] = io[in_ch_idx][j + subframe_offset]; + buffer_ch[samp_idx] = io[in_ch_idx][add( j, subframe_offset )]; + move32(); + samp_idx = add( samp_idx, 1 ); samp_idx = samp_idx % reflections->circ_len; } } @@ -988,8 +1031,9 @@ ivas_error ivas_er_process( { FOR( j = 0; j < subframe_size; j++ ) { - buffer_ch[samp_idx] = L_add( io[in_ch_idx][j + subframe_offset], buffer_ch[samp_idx] ); - samp_idx++; + buffer_ch[samp_idx] = L_add( io[in_ch_idx][add( j, subframe_offset )], buffer_ch[samp_idx] ); + move32(); + samp_idx = add( samp_idx, 1 ); samp_idx = samp_idx % reflections->circ_len; } } @@ -1004,37 +1048,42 @@ ivas_error ivas_er_process( FOR( i = 0; i < n_ref_sources; i++ ) { /* Access correct row of input circ buffer */ - buffer_ch = &( reflections->circ_buffers[i * reflections->circ_len] ); + buffer_ch = &( reflections->circ_buffers[i_mult( i, reflections->circ_len )] ); /* Loop through reflections */ FOR( j = 0; j < n_ref; j++ ) { - ref_no = j + ( i * n_ref ); + ref_no = (UWord16) add( j, i_mult( i, n_ref ) ); + move16(); ref_gain = (Word32) reflections->shoebox_data.gains.data_fx[ref_no]; + move32(); ref_delay = (UWord16) reflections->shoebox_data.times.data_fx[ref_no]; + move16(); ref_out_idx = reflections->closest_ch_idx[ref_no]; + move16(); /* Determine start idx of reflection in circ buffer based on current insert idx and reflection delay */ - samp_idx = (Word16) reflections->circ_insert - ref_delay; - IF( LT_16( samp_idx, 0 ) ) + samp_idx = sub( reflections->circ_insert, ref_delay ); + if ( LT_16( samp_idx, 0 ) ) { - samp_idx = add( (Word16) reflections->circ_len, samp_idx ); + samp_idx = add( reflections->circ_len, samp_idx ); } /* Pull reflection from circ buffer and apply gain */ FOR( k = 0; k < subframe_size; k++ ) { temp = Mpy_32_32( buffer_ch[samp_idx], ref_gain ); - io[ref_out_idx][k + subframe_offset] = L_add( temp, io[ref_out_idx][k + subframe_offset] ); - samp_idx++; + io[ref_out_idx][add( k, subframe_offset )] = L_add( temp, io[ref_out_idx][add( k, subframe_offset )] ); + samp_idx = add( samp_idx, 1 ); samp_idx = samp_idx % reflections->circ_len; } } } /* Increment circular buffer start index */ - reflections->circ_insert = ( reflections->circ_insert + subframe_size ) % reflections->circ_len; + reflections->circ_insert = (UWord16) ( add( reflections->circ_insert, subframe_size ) ) % reflections->circ_len; + move16(); return error; } #else diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index 30b00be59..65525868c 100644 --- a/lib_rend/ivas_render_config.c +++ b/lib_rend/ivas_render_config.c @@ -138,15 +138,21 @@ ivas_error ivas_render_config_init_from_rom_fx( ) { Word16 i; + test(); IF( hRenderConfig == NULL || *hRenderConfig == NULL ) { return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Unexpected null pointer while attempting to fill renderer configuration from ROM" ); } ( *hRenderConfig )->roomAcoustics.override = FALSE; + move16(); ( *hRenderConfig )->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_N_BANDS; + move16(); ( *hRenderConfig )->roomAcoustics.acousticPreDelay_fx = IVAS_REVERB_DEFAULT_PRE_DELAY_FX; + move32(); ( *hRenderConfig )->roomAcoustics.inputPreDelay_fx = IVAS_REVERB_DEFAULT_INPUT_DELAY_FX; + move32(); ( *hRenderConfig )->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; + move16(); set32_fx( &( *hRenderConfig )->roomAcoustics.pFc_input_fx[0], 0, CLDFB_NO_CHANNELS_MAX ); set32_fx( &( *hRenderConfig )->roomAcoustics.pAcoustic_rt60_fx[0], 0, CLDFB_NO_CHANNELS_MAX ); set32_fx( &( *hRenderConfig )->roomAcoustics.pAcoustic_dsr_fx[0], 0, CLDFB_NO_CHANNELS_MAX ); @@ -158,9 +164,12 @@ ivas_error ivas_render_config_init_from_rom_fx( /*Q6*/ FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) { - ( *hRenderConfig )->directivity_fx[i * 3] = 23040; /* Front cone */ - ( *hRenderConfig )->directivity_fx[i * 3 + 1] = 23040; /* Back cone */ - ( *hRenderConfig )->directivity_fx[i * 3 + 2] = 64; /* Back attenuation */ + ( *hRenderConfig )->directivity_fx[i_mult( i, 3 )] = 23040; /* Front cone */ + move16(); + ( *hRenderConfig )->directivity_fx[add( i_mult( i, 3 ), 1 )] = 23040; /* Back cone */ + move16(); + ( *hRenderConfig )->directivity_fx[add( i_mult( i, 3 ), 2 )] = 64; /* Back attenuation */ + move16(); } return IVAS_ERR_OK; @@ -191,9 +200,9 @@ ivas_error ivas_render_config_init_from_rom( for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) { - ( *hRenderConfig )->directivity[i * 3] = 360.0f; /* Front cone */ - ( *hRenderConfig )->directivity[i * 3 + 1] = 360.0f; /* Back cone */ - ( *hRenderConfig )->directivity[i * 3 + 2] = 1.0f; /* Back attenuation */ + ( *hRenderConfig )->directivity[i_mult( i, 3 )] = 360.0f; /* Front cone */ + ( *hRenderConfig )->directivity[add( i_mult( i, 3 ), 1 )] = 360.0f; /* Back cone */ + ( *hRenderConfig )->directivity[add( i_mult( i, 3 ), 2 )] = 1.0f; /* Back attenuation */ } return IVAS_ERR_OK; diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 35752d092..e270cf1e9 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -109,10 +109,17 @@ static Word16 wrap_rad_fixed( #define MAX_NR_OUTPUTS ( 2 ) +#ifdef IVAS_FLOAT_FIXED +const Word16 init_loop_delay[IVAS_REV_MAX_NR_BRANCHES] = { 37, 31, 29, 23, 19, 17, 13, 11 }; +const Word16 default_loop_delay_48k[IVAS_REV_MAX_NR_BRANCHES] = { 2309, 1861, 1523, 1259, 1069, 919, 809, 719 }; +const Word16 default_loop_delay_32k[IVAS_REV_MAX_NR_BRANCHES] = { 1531, 1237, 1013, 839, 709, 613, 541, 479 }; +const Word16 default_loop_delay_16k[IVAS_REV_MAX_NR_BRANCHES] = { 769, 619, 509, 421, 353, 307, 269, 239 }; +#else const int16_t init_loop_delay[IVAS_REV_MAX_NR_BRANCHES] = { 37, 31, 29, 23, 19, 17, 13, 11 }; const int16_t default_loop_delay_48k[IVAS_REV_MAX_NR_BRANCHES] = { 2309, 1861, 1523, 1259, 1069, 919, 809, 719 }; const int16_t default_loop_delay_32k[IVAS_REV_MAX_NR_BRANCHES] = { 1531, 1237, 1013, 839, 709, 613, 541, 479 }; const int16_t default_loop_delay_16k[IVAS_REV_MAX_NR_BRANCHES] = { 769, 619, 509, 421, 353, 307, 269, 239 }; +#endif /*------------------------------------------------------------------------------------------* * Local Struct definition @@ -402,6 +409,7 @@ static void ivas_binaural_reverb_setReverbTimes_fx( move16(); hReverb->binRend_RandNext = (UWord16) BIN_REND_RANDOM_SEED; + move16(); hReverb->highestBinauralCoherenceBin = 0; move16(); @@ -415,12 +423,12 @@ static void ivas_binaural_reverb_setReverbTimes_fx( L_tmp = Mpy_32_16_1( output_Fs, tmp ); binCenterFreq_exp = add( 31, exp ); binCenterFreq_fx = L_shr( L_tmp, 1 ); // divide by 2 - IF( EQ_16( bin, 0 ) ) + IF( bin == 0 ) { diffuseFieldICC_fx = ONE_IN_Q31; move32(); } - ELSE IF( BASOP_Util_Cmp_Mant32Exp( binCenterFreq_fx, binCenterFreq_exp, 2700, 31 ) == -1 ) + ELSE IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( binCenterFreq_fx, binCenterFreq_exp, 2700, 31 ), -1 ) ) { /* binCenterFreq / 550.0f */ L_tmp = Mpy_32_32( binCenterFreq_fx, 3904516 /* 1 / 550 in Q31 */ ); @@ -470,18 +478,21 @@ static void ivas_binaural_reverb_setReverbTimes_fx( IF( diffuseFieldICC_fx > 0 ) { exp = tmpVal_exp; + move16(); L_tmp = Sqrt32( L_abs( tmpVal_fx ), &exp ); hReverb->binauralCoherenceCrossmixGains_fx[bin] = L_shl( L_tmp, exp ); // Q31 } ELSE { exp = tmpVal_exp; + move16(); L_tmp = Sqrt32( L_abs( tmpVal_fx ), &exp ); hReverb->binauralCoherenceCrossmixGains_fx[bin] = L_negate( L_shl( L_tmp, exp ) ); // Q31 } /* hReverb->binauralCoherenceDirectGains[bin] = sqrtf( 1.0f - fabsf( tmpVal ) ); */ exp = tmpVal_exp; + move16(); L_tmp = L_sub( ONE_IN_Q31, L_abs( tmpVal_fx ) ); L_tmp = Sqrt32( L_abs( L_tmp ), &exp ); hReverb->binauralCoherenceDirectGains_fx[bin] = L_shl( L_tmp, exp ); // making as Q31 @@ -493,7 +504,7 @@ static void ivas_binaural_reverb_setReverbTimes_fx( L_tmp = Mpy_32_16_1( -1610612736, tmp ); // * -3 scale = add( 2, scale ); L_tmp = Mpy_32_32( 1783446563, L_tmp ); // scale + 2 - attenuationFactorPerSample_fx = BASOP_util_Pow2( L_tmp, scale + 2, &attenuationFactorPerSample_exp ); + attenuationFactorPerSample_fx = BASOP_util_Pow2( L_tmp, add( scale, 2 ), &attenuationFactorPerSample_exp ); Word32 tmp_mul; scale = norm_l( hReverb->loopBufLength[bin] ); @@ -501,8 +512,8 @@ static void ivas_binaural_reverb_setReverbTimes_fx( L_tmp = BASOP_Util_Log2( attenuationFactorPerSample_fx ); L_tmp = L_add( L_tmp, L_shl( (Word32) attenuationFactorPerSample_exp, 25 ) ); L_tmp = Mpy_32_32( L_tmp, tmp_mul ); - hReverb->loopAttenuationFactor_fx[bin] = BASOP_util_Pow2( L_tmp, 6 + 31 - scale, &exp ); - hReverb->loopAttenuationFactor_fx[bin] = L_shl( hReverb->loopAttenuationFactor_fx[bin], exp ); // making as Q31 + L_tmp = BASOP_util_Pow2( L_tmp, sub( 6 + 31, scale ), &exp ); + hReverb->loopAttenuationFactor_fx[bin] = L_shl( L_tmp, exp ); // making as Q31 attenuationFactorPerSampleSq_fx = Mpy_32_32( attenuationFactorPerSample_fx, attenuationFactorPerSample_fx ); attenuationFactorPerSampleSq_exp = attenuationFactorPerSample_exp + attenuationFactorPerSample_exp; @@ -546,12 +557,13 @@ static void ivas_binaural_reverb_setReverbTimes_fx( L_tmp = Mpy_32_32( L_tmp, 214748364 ); // exp + 0 L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, exp, currentEnergy_fx, currentEnergy_exp, &exp ); energyBuildup_fx = BASOP_Util_Add_Mant32Exp( energyBuildup_fx, energyBuildup_exp, L_tmp, exp, &energyBuildup_exp ); - IF( BASOP_Util_Cmp_Mant32Exp( energyBuildup_fx, energyBuildup_exp, 0, 0 ) >= 0 ) /* A new filter tap is added at this condition */ + IF( energyBuildup_fx >= 0 ) /* A new filter tap is added at this condition */ { - IF( BASOP_Util_Cmp_Mant32Exp( energyBuildup_fx, energyBuildup_exp, 1, 31 ) >= 0 ) + IF( ( BASOP_Util_Cmp_Mant32Exp( energyBuildup_fx, energyBuildup_exp, 1, 31 ) > 0 ) ) { /* Four efficient phase operations: n*pi/2, n=0,1,2,3 */ hReverb->tapPhaseShiftType[bin][ch][tap] = (Word16) ( binRend_rand( hReverb ) % 4 ); + move16(); /* Set the tapPointer to point to the determined sample at the loop buffer */ hReverb->tapPointersReal_fx[bin][ch][tap] = &( hReverb->loopBufReal_fx[bin][sample] ); @@ -577,13 +589,17 @@ static void ivas_binaural_reverb_setReverbTimes_fx( reverb_exp = 0; move16(); hReverb->reverbEqGains_fx[bin] = Sqrt32( revEnes_fx[bin], &reverb_exp ); /* Determined reverb spectrum */ + move32(); hReverb->reverbEqGains_fx[bin] = BASOP_Util_Add_Mant32Exp( hReverb->reverbEqGains_fx[bin], reverb_exp, 0, 0, &reverb_exp ); + move32(); tmp = BASOP_Util_Divide3232_Scale( intendedEnergy_fx, actualizedEnergy_fx, &tmp_exp ); tmp_exp = add( tmp_exp, sub( intendedEnergy_exp, actualizedEnergy_exp ) ); hReverb->reverbEqGains_fx[bin] = BASOP_Util_Add_Mant32Exp( hReverb->reverbEqGains_fx[bin], reverb_exp, 0, 0, &reverb_exp ); + move32(); L_tmp = Sqrt32( L_deposit_h( tmp ), &tmp_exp ); hReverb->reverbEqGains_fx[bin] = Mpy_32_32( hReverb->reverbEqGains_fx[bin], L_tmp ); + move32(); reverb_exp = add( reverb_exp, tmp_exp ); L_tmp = BASOP_Util_Add_Mant32Exp( 1073741824, 1, L_negate( attenuationFactorPerSampleSq_fx ), attenuationFactorPerSampleSq_exp, &tmp_exp ); @@ -591,8 +607,10 @@ static void ivas_binaural_reverb_setReverbTimes_fx( tmp_exp = add( tmp_exp, 0 ); L_tmp = Sqrt32( L_tmp, &tmp_exp ); hReverb->reverbEqGains_fx[bin] = Mpy_32_32( L_tmp, hReverb->reverbEqGains_fx[bin] ); + move32(); reverb_exp = add( reverb_exp, tmp_exp ); hReverb->reverbEqGains_fx[bin] = L_shl( hReverb->reverbEqGains_fx[bin], reverb_exp ); // making as Q31 + move32(); } return; } @@ -613,19 +631,21 @@ static ivas_error compute_feedback_matrix_fx( Word16 i, j, x; u = MATRIX_CONSTANT; + move32(); pFeedbackMatrix[0] = u; + move32(); FOR( x = 1; x < n; x += x ) { FOR( i = 0; i < x; i++ ) { FOR( j = 0; j < x; j++ ) { - pFeedbackMatrix[( i + x ) * n + j] = pFeedbackMatrix[i * n + j]; + pFeedbackMatrix[add( i_mult( add( i, x ), n ), j )] = pFeedbackMatrix[add( i_mult( i, n ), j )]; move32(); - pFeedbackMatrix[i * n + j + x] = pFeedbackMatrix[i * n + j]; + pFeedbackMatrix[i_mult( i, n ) + j + x] = pFeedbackMatrix[add( i_mult( i, n ), j )]; move32(); - pFeedbackMatrix[( i + x ) * n + j + x] = -pFeedbackMatrix[i * n + j]; + pFeedbackMatrix[add( add( i_mult( add( i, x ), n ), j ), x )] = L_negate( pFeedbackMatrix[add( i_mult( i, n ), j )] ); move32(); } } @@ -656,7 +676,7 @@ static void compute_2_out_extract_matrix_fx( { pExtractMatrix[i] = 1; move16(); - pExtractMatrix[i + n] = ff; + pExtractMatrix[add( i, n )] = ff; move16(); ff = negate( ff ); } @@ -911,6 +931,7 @@ static ivas_error set_base_config( static Word32 calc_dmx_gain_fx( void ) { const Word32 gain = DMX_GAIN; + move32(); return gain; } #else @@ -939,18 +960,18 @@ static void calc_predelay_fx( { Word16 predelay, fbdelay, output_frame; predelay = round_fx( L_shl( Mult_32_32( L_shl( output_Fs, 15 ), acoustic_predelay_sec ), 5 ) ); - output_frame = (Word16) Mult_32_16( output_Fs, INV_FRAME_PER_SEC_Q15 ); + output_frame = extract_l( Mult_32_16( output_Fs, INV_FRAME_PER_SEC_Q15 ) ); fbdelay = pParams->pLoop_delays[sub( pParams->nr_loops, 1 )]; move16(); predelay = sub( predelay, fbdelay ); - IF( LT_16( predelay, 0 ) ) + if ( predelay < 0 ) { predelay = 0; move16(); } - IF( LT_16( output_frame, predelay ) ) + if ( LT_16( output_frame, predelay ) ) { predelay = output_frame; move16(); @@ -1025,8 +1046,10 @@ static ivas_error compute_t60_coeffs_fx( FOR( bin_idx = 0; bin_idx < tf_T60_len; bin_idx++ ) { norm_f_fx[bin_idx] = BASOP_Util_Divide3232_Scale( pFc_fx[bin_idx], freq_Nyquist_fx, &norm_f_e ); + move16(); norm_f_e = add( norm_f_e, sub( 17, 31 ) ); norm_f_fx[bin_idx] = shl( norm_f_fx[bin_idx], sub( norm_f_e, 1 ) ); // making Q14 + move16(); } FOR( loop_idx = 0; loop_idx < pParams->nr_loops; loop_idx++ ) @@ -1038,9 +1061,12 @@ static ivas_error compute_t60_coeffs_fx( FOR( bin_idx = 0; bin_idx < tf_T60_len; bin_idx++ ) { tmp = BASOP_Util_Divide3232_Scale( L_deposit_h( loop_delay_sec_fx ), targetT60_fx[bin_idx], &target_gains_db_exp[bin_idx] ); - target_gains_db_exp[bin_idx] = target_gains_db_exp[bin_idx] + ( loop_delay_sec_fx_exp - targetT60_e[bin_idx] ); - target_gains_db_fx[bin_idx] = mult( -30720, tmp ); // -60 in Q9 -> -30720 + target_gains_db_exp[bin_idx] = add( target_gains_db_exp[bin_idx], sub( loop_delay_sec_fx_exp, targetT60_e[bin_idx] ) ); + move16(); + target_gains_db_fx[bin_idx] = mult( -30720, tmp ); // -60 in Q9 -> -30720 + move16(); target_gains_db_exp[bin_idx] = add( target_gains_db_exp[bin_idx], 6 ); // Q9 -> e6 + move16(); tmp = BASOP_Util_Cmp_Mant32Exp( L_deposit_h( target_gains_db_fx[bin_idx] ), target_gains_db_exp[bin_idx], -2013265920, 7 ); IF( tmp < 0 ) @@ -1052,8 +1078,8 @@ static ivas_error compute_t60_coeffs_fx( } } - pCoeffs_a_fx = &pParams->pT60_filter_coeff_fx[2 * len * loop_idx + len]; - pCoeffs_b_fx = &pParams->pT60_filter_coeff_fx[2 * len * loop_idx]; + pCoeffs_a_fx = &pParams->pT60_filter_coeff_fx[add( shl( i_mult( len, loop_idx ), 1 ), len )]; + pCoeffs_b_fx = &pParams->pT60_filter_coeff_fx[shl( i_mult( len, loop_idx ), 1 )]; Word16 val = target_gains_db_exp[0]; move16(); @@ -1066,9 +1092,10 @@ static ivas_error compute_t60_coeffs_fx( FOR( Word16 i = 0; i < nr_fc_fft_filter; i++ ) { target_gains_db_fx[i] = shr( target_gains_db_fx[i], sub( val, target_gains_db_exp[i] ) ); + move16(); } - IF( ( error = calc_jot_t60_coeffs_fx( target_gains_db_fx, val, tf_T60_len, norm_f_fx, pCoeffs_a_fx, pCoeffs_b_fx, extract_l( freq_Nyquist_fx ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = calc_jot_t60_coeffs_fx( target_gains_db_fx, val, tf_T60_len, norm_f_fx, pCoeffs_a_fx, pCoeffs_b_fx, extract_l( freq_Nyquist_fx ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -1078,6 +1105,7 @@ static ivas_error compute_t60_coeffs_fx( FOR( loop_idx = 0; loop_idx < pParams->nr_loops; loop_idx++ ) { pParams->pLoop_delays[loop_idx] = sub( pParams->pLoop_delays[loop_idx], len ); + move16(); } return error; } @@ -1253,6 +1281,7 @@ static void calc_low_shelf_first_order_filter_fx( L_tmp = L_shl( L_tmp, shift ); tmp = extract_h( L_tmp ); pNum[0] = tmp; + move16(); norm_num0 = sub( tan_exp, sub( shift, 16 ) ); L_tmp = L_sub( tan_val, L_shl( 1, ( sub( 15, tan_exp ) ) ) ); @@ -1260,6 +1289,7 @@ static void calc_low_shelf_first_order_filter_fx( L_tmp = L_shl( L_tmp, shift ); tmp = extract_h( L_tmp ); pNum[1] = tmp; + move16(); norm_num1 = sub( tan_exp, sub( shift, 16 ) ); tmp = BASOP_Util_Divide1616_Scale( tan_val, gain_fx, &exp ); @@ -1269,6 +1299,7 @@ static void calc_low_shelf_first_order_filter_fx( L_tmp = L_shl( L_tmp, shift ); tmp = extract_h( L_tmp ); pDen[0] = tmp; + move16(); norm_den0 = sub( exp, sub( shift, 16 ) ); tmp = BASOP_Util_Divide1616_Scale( tan_val, gain_fx, &exp ); @@ -1278,23 +1309,31 @@ static void calc_low_shelf_first_order_filter_fx( L_tmp = L_shl( L_tmp, shift ); tmp = extract_h( L_tmp ); pDen[1] = tmp; + move16(); norm_den1 = sub( exp, sub( shift, 16 ) ); } /* Normalize and adjust gain to match target amplitudes */ pNum[0] = mult( BASOP_Util_Divide1616_Scale( pNum[0], pDen[0], &exp ), lin_gain_hf ); + move16(); norm_num0 = add( exp, sub( norm_num0, norm_den0 ) ); pNum[1] = mult( BASOP_Util_Divide1616_Scale( pNum[1], pDen[0], &exp ), lin_gain_hf ); + move16(); norm_num1 = add( exp, sub( norm_num1, norm_den0 ) ); pDen[1] = BASOP_Util_Divide1616_Scale( pDen[1], pDen[0], &exp ); + move16(); norm_den1 = add( exp, sub( norm_den1, norm_den0 ) ); - pNum[0] = shr( pNum[0], 1 - norm_num0 ); - pNum[1] = shr( pNum[1], 1 - norm_num1 ); - pDen[1] = shr( pDen[1], 1 - norm_den1 ); + pNum[0] = shr( pNum[0], sub( 1, norm_num0 ) ); + move16(); + pNum[1] = shr( pNum[1], sub( 1, norm_num1 ) ); + move16(); + pDen[1] = shr( pDen[1], sub( 1, norm_den1 ) ); + move16(); pDen[0] = shl( 1, 14 ); + move16(); return; } @@ -1392,10 +1431,10 @@ static ivas_error calc_jot_t60_coeffs_fx( Word16 ref_hf_min_norm_fx = BASOP_Util_Divide1616_Scale( REF_HF_MIN_FX, fNyquist_fx, &scale3 ); Word16 ref_hf_max_norm_fx = BASOP_Util_Divide1616_Scale( REF_HF_MAX_FX, fNyquist_fx, &scale4 ); - ref_lf_min_norm_fx = shl( ref_lf_min_norm_fx, scale1 - 1 ); // Q14 - ref_lf_max_norm_fx = shl( ref_lf_max_norm_fx, scale2 - 1 ); - ref_hf_min_norm_fx = shl( ref_hf_min_norm_fx, scale3 - 1 ); - ref_hf_max_norm_fx = shl( ref_hf_max_norm_fx, scale4 - 1 ); + ref_lf_min_norm_fx = shl( ref_lf_min_norm_fx, sub( scale1, 1 ) ); // Q14 + ref_lf_max_norm_fx = shl( ref_lf_max_norm_fx, sub( scale2, 1 ) ); + ref_hf_min_norm_fx = shl( ref_hf_min_norm_fx, sub( scale3, 1 ) ); + ref_hf_max_norm_fx = shl( ref_hf_max_norm_fx, sub( scale4, 1 ) ); Word32 L_tmp; Word16 f0_fx, tmp_fx, lf_target_gain_dB_fx, hf_target_gain_dB_fx, mid_crossing_gain_dB_fx; @@ -1424,11 +1463,13 @@ static ivas_error calc_jot_t60_coeffs_fx( FOR( f_idx = 0; f_idx < nrFrequencies; f_idx++ ) { + test(); IF( GE_16( pFrequencies_fx[f_idx], ref_lf_min_norm_fx ) && LE_16( pFrequencies_fx[f_idx], ref_lf_max_norm_fx ) ) { L_tmpl = L_add( L_tmpl, pH_dB_fx[f_idx] ); n_points_lf = add( n_points_lf, 1 ); } + test(); IF( GE_16( pFrequencies_fx[f_idx], ref_hf_min_norm_fx ) && LE_16( pFrequencies_fx[f_idx], ref_hf_max_norm_fx ) ) { L_tmph = L_add( L_tmph, pH_dB_fx[f_idx] ); @@ -1440,13 +1481,16 @@ static ivas_error calc_jot_t60_coeffs_fx( tmp_fx = extract_h( L_tmpl ); expl = sub( e, sub( shift, 16 ) ); lf_target_gain_dB_fx = tmp_fx; + move16(); shift = norm_l( L_tmph ); L_tmph = L_shl( L_tmph, shift ); tmp_fx = extract_h( L_tmph ); exph = sub( e, sub( shift, 16 ) ); hf_target_gain_dB_fx = tmp_fx; + move16(); + test(); IF( ( n_points_lf == 0 ) || ( n_points_hf == 0 ) ) { return IVAS_ERR_INTERNAL; @@ -1484,11 +1528,11 @@ static ivas_error calc_jot_t60_coeffs_fx( tmp_fx = mult( lf_target_gain_dB_fx, 5443 ); // expl L_tmp = BASOP_util_Pow2( L_deposit_h( tmp_fx ), expl, &e ); - lin_gain_lf_fx = (Word16) L_shr( L_tmp, 16 - e ); + lin_gain_lf_fx = extract_l( L_shr( L_tmp, sub( 16, e ) ) ); tmp_fx = mult( hf_target_gain_dB_fx, 5443 ); // exph L_tmp = BASOP_util_Pow2( L_deposit_h( tmp_fx ), exph, &e ); - lin_gain_hf_fx = (Word16) L_shr( L_tmp, sub( 16, e ) ); + lin_gain_hf_fx = extract_l( L_shr( L_tmp, sub( 16, e ) ) ); /* call low-pass iir shelf */ calc_low_shelf_first_order_filter_fx( pCoeffB_fx, pCoeffA_fx, f0_fx, lin_gain_lf_fx, lin_gain_hf_fx ); @@ -1510,27 +1554,27 @@ static ivas_error initialize_reverb_filters_fx( error = IVAS_ERR_OK; /* init correlation and coloration filters */ - IF( ( error = ivas_reverb_t2f_f2t_init( &hReverb->fft_filter_ols, hReverb->fft_size, hReverb->fft_subblock_size ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_reverb_t2f_f2t_init( &hReverb->fft_filter_ols, hReverb->fft_size, hReverb->fft_subblock_size ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_correl_0, hReverb->fft_size ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_correl_0, hReverb->fft_size ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_correl_1, hReverb->fft_size ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_correl_1, hReverb->fft_size ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_color_0, hReverb->fft_size ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_color_0, hReverb->fft_size ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_color_1, hReverb->fft_size ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_color_1, hReverb->fft_size ) ), IVAS_ERR_OK ) ) { return error; } @@ -1639,7 +1683,7 @@ static ivas_error set_feedback_delay_fx( const UWord16 branch, const Word16 fb_delay ) { - IF( branch >= hReverb->nr_of_branches ) + IF( GE_32( branch, hReverb->nr_of_branches ) ) { return IVAS_ERR_INTERNAL; } @@ -1683,7 +1727,7 @@ static ivas_error set_feedback_gain_fx( const Word32 *pGain ) { UWord16 gain_idx; - IF( branch >= hReverb->nr_of_branches ) + IF( GE_32( branch, hReverb->nr_of_branches ) ) { return IVAS_ERR_INTERNAL; } @@ -1691,6 +1735,7 @@ static ivas_error set_feedback_gain_fx( FOR( gain_idx = 0; gain_idx < hReverb->nr_of_branches; gain_idx++ ) { hReverb->gain_matrix_fx[branch][gain_idx] = pGain[gain_idx]; + move32(); } return IVAS_ERR_OK; @@ -1849,7 +1894,7 @@ static ivas_error set_mixer_level_fx( const Word16 level[] ) { UWord16 branch_idx; - IF( channel >= BINAURAL_CHANNELS ) + IF( GE_32( channel, BINAURAL_CHANNELS ) ) { return IVAS_ERR_INTERNAL; } @@ -1857,6 +1902,7 @@ static ivas_error set_mixer_level_fx( FOR( branch_idx = 0; branch_idx < hReverb->nr_of_branches; branch_idx++ ) { hReverb->mixer_fx[channel][branch_idx] = level[branch_idx]; + move16(); } return IVAS_ERR_OK; @@ -1927,7 +1973,8 @@ static void set_fft_and_datablock_sizes_fx( assert( 0 ); /* unsupported block size */ } - hReverb->fft_subblock_size = subframe_len / hReverb->num_fft_subblocks; + hReverb->fft_subblock_size = (UWord16) idiv1616( subframe_len, hReverb->num_fft_subblocks ); + move16(); return; } @@ -2117,7 +2164,7 @@ static void set_reverb_acoustic_data_fx( // 23 in Q26 tmp_flag = BASOP_Util_Cmp_Mant32Exp( L_deposit_h( exp_argument_fx ), exp_argument_e, 1543503872, 5 ); - IF( GT_16( tmp_flag, 0 ) ) + IF( tmp_flag > 0 ) { exp_argument_fx = 23552; move16(); @@ -2126,10 +2173,10 @@ static void set_reverb_acoustic_data_fx( } tmp_flag = BASOP_Util_Cmp_Mant32Exp( L_deposit_h( exp_argument_fx ), exp_argument_e, 0, 31 ); - IF( LT_16( tmp_flag, 0 ) ) + IF( tmp_flag < 0 ) { tmp_flag = BASOP_Util_Cmp_Mant32Exp( L_deposit_h( negate( exp_argument_fx ) ), exp_argument_e, 1543503872, 5 ); - IF( LT_16( tmp_flag, 0 ) ) + IF( tmp_flag < 0 ) { exp_argument_fx = -23552; move16(); @@ -2269,19 +2316,19 @@ static ivas_error setup_FDN_branches_fx( { FOR( branch_idx = 0; branch_idx < pParams->nr_loops; branch_idx++ ) { - pCoef_a = &pParams->pT60_filter_coeff_fx[2 * nr_coefs * branch_idx + nr_coefs]; /*Q14*/ - pCoef_b = &pParams->pT60_filter_coeff_fx[2 * nr_coefs * branch_idx]; /*Q14*/ + pCoef_b = &pParams->pT60_filter_coeff_fx[shl( i_mult( nr_coefs, branch_idx ), 1 )]; /*Q14*/ + pCoef_a = &pParams->pT60_filter_coeff_fx[add( shl( i_mult( nr_coefs, branch_idx ), 1 ), nr_coefs )]; /*Q14*/ - IF( ( error = set_t60_filter( hReverb, branch_idx, nr_coefs, pCoef_a, pCoef_b ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_t60_filter( hReverb, branch_idx, nr_coefs, pCoef_a, pCoef_b ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = set_feedback_delay_fx( hReverb, branch_idx, pParams->pLoop_delays[branch_idx] ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_feedback_delay_fx( hReverb, branch_idx, pParams->pLoop_delays[branch_idx] ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = set_feedback_gain_fx( hReverb, branch_idx, &( pParams->pLoop_feedback_matrix_fx[branch_idx * pParams->nr_loops] ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_feedback_gain_fx( hReverb, branch_idx, &( pParams->pLoop_feedback_matrix_fx[i_mult( branch_idx, pParams->nr_loops )] ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -2290,7 +2337,7 @@ static ivas_error setup_FDN_branches_fx( FOR( channel_idx = 0; channel_idx < pParams->nr_outputs; channel_idx++ ) { - IF( ( error = set_mixer_level_fx( hReverb, channel_idx, &( pParams->pLoop_extract_matrix_fx[channel_idx * pParams->nr_loops] ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_mixer_level_fx( hReverb, channel_idx, &( pParams->pLoop_extract_matrix_fx[i_mult( channel_idx, pParams->nr_loops )] ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -2405,7 +2452,7 @@ ivas_error ivas_reverb_open_fx( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Reverberator " ); } - IF( ( error = set_base_config_fx( ¶ms, output_Fs ) ) != IVAS_ERR_OK ) + IF( NE_32(( error = set_base_config_fx( ¶ms, output_Fs ) ) , IVAS_ERR_OK) ) { return error; } @@ -2449,6 +2496,7 @@ ivas_error ivas_reverb_open_fx( params.pFc_fx[bin_idx] = W_extract_l( W_mult0_32_32( freq_step_fx, bin_idx ) ); /*Q14*/ } + test(); IF( hHrtf == NULL && lr_energy_and_iac_fx != NULL ) { params.pHrtf_avg_pwr_response_l_const_fx = lr_energy_and_iac_fx[0]; @@ -2468,17 +2516,23 @@ ivas_error ivas_reverb_open_fx( FOR( Word16 i = 0; i < nr_fc_fft_filter; i++ ) { params.pRt60_fx[i] = L_abs( params.pRt60_fx[i] ); + move32(); params.pDsr_fx[i] = L_abs( params.pDsr_fx[i] ); + move32(); } /* set reverb acoustic configuration based on renderer config */ pState->pConfig.roomAcoustics.override = hRenderConfig->roomAcoustics.override; + move16(); pState->pConfig.roomAcoustics.nBands = hRenderConfig->roomAcoustics.nBands; + move16(); - IF( hRenderConfig->roomAcoustics.use_er == 1 ) + IF( EQ_16( hRenderConfig->roomAcoustics.use_er, 1 ) ) { pState->pConfig.roomAcoustics.use_er = hRenderConfig->roomAcoustics.use_er; + move16(); pState->pConfig.roomAcoustics.lowComplexity = hRenderConfig->roomAcoustics.lowComplexity; + move32(); } /* set up input downmix */ @@ -2489,7 +2543,7 @@ ivas_error ivas_reverb_open_fx( /* set up jot reverb 60 filters - must be set up after set_reverb_acoustic_data() */ - IF( ( error = compute_t60_coeffs_fx( ¶ms, nr_fc_fft_filter, output_Fs ) ) != IVAS_ERR_OK ) + IF( NE_32(( error = compute_t60_coeffs_fx( ¶ms, nr_fc_fft_filter, output_Fs ) ) , IVAS_ERR_OK) ) { return error; } @@ -2504,12 +2558,16 @@ ivas_error ivas_reverb_open_fx( FOR( int i = 0; i < nr_fc_fft_filter; i++ ) { params.pDsr_fx[i] = L_shl( params.pDsr_fx[i], params.pDsr_e[i] ); + move32(); pHrtf_avg_pwr_response_l_const[i] = L_shl( params.pHrtf_avg_pwr_response_l_const_fx[i], 5 ); /*Q23+5*/ + move32(); pHrtf_avg_pwr_response_r_const[i] = L_shl( params.pHrtf_avg_pwr_response_r_const_fx[i], 5 ); /*Q23+5*/ + move32(); } FOR( int i = 0; i < lenT60_filter_coeff; i++ ) { pT60_filter_coeff[i] = L_shl_sat( params.pT60_filter_coeff_fx[i], 17 ); + move32(); } ivas_reverb_calc_color_levels_fx( output_Fs, nr_fc_fft_filter, params.nr_loops, params.pFc_fx, params.pDsr_fx, pHrtf_avg_pwr_response_l_const, pHrtf_avg_pwr_response_r_const, params.pLoop_delays, pT60_filter_coeff, pColor_target_l_fx, pColor_target_r_fx ); @@ -2519,7 +2577,7 @@ ivas_error ivas_reverb_open_fx( free( pT60_filter_coeff ); /* Defining appropriate windowing parameters for FFT filters to prevent aliasing */ - fft_hist_size = pState->fft_size - pState->fft_subblock_size; + fft_hist_size = sub( pState->fft_size, pState->fft_subblock_size ); transition_start = round_fx( L_mult0( FFT_FILTER_WND_FLAT_REGION_FX, fft_hist_size ) ); transition_length = round_fx( L_mult0( FFT_FILTER_WND_TRANS_REGION_FX, fft_hist_size ) ); @@ -2533,11 +2591,13 @@ ivas_error ivas_reverb_open_fx( move16(); /* clear & init jot reverb fft filters */ - IF( ( error = initialize_reverb_filters_fx( pState ) ) != IVAS_ERR_OK ) + IF( NE_32(( error = initialize_reverb_filters_fx( pState ) ) , IVAS_ERR_OK) ) { return error; } Word16 q_pFft_wf_filter_ch0_fx = 23, q_pFft_wf_filter_ch1_fx = 23; + move16(); + move16(); IF( pState->do_corr_filter ) { q_pFft_wf_filter_ch0_fx = 31; @@ -2548,17 +2608,22 @@ ivas_error ivas_reverb_open_fx( FOR( int i = 0; i < nr_fc_fft_filter; i++ ) { pFft_wf_filter_ch0_fx[i][0] = L_shl_sat( pFft_wf_filter_ch0_fx[i][0], 8 ); + move32(); pFft_wf_filter_ch0_fx[i][1] = L_shl_sat( pFft_wf_filter_ch0_fx[i][1], 8 ); + move32(); } FOR( int i = 0; i < nr_fc_fft_filter; i++ ) { pFft_wf_filter_ch1_fx[i][0] = L_shl_sat( pFft_wf_filter_ch1_fx[i][0], 8 ); + move32(); pFft_wf_filter_ch1_fx[i][1] = L_shl_sat( pFft_wf_filter_ch1_fx[i][1], 8 ); + move32(); } #ifdef MSAN_FIX FOR( int i = 0; i < shl( sub( nr_fc_fft_filter, 1 ), 1 ); i++ ) { pTime_window_fx[i] = L_shr( pTime_window_fx[i], 1 ); /*Scaling signal down to 30*/ + move32(); } #else FOR( int i = 0; i < RV_FILTER_MAX_FFT_SIZE; i++ ) @@ -2568,31 +2633,36 @@ ivas_error ivas_reverb_open_fx( #endif // MSAN_FIX Word32 *pHrtf_inter_aural_coherence_const = (Word32 *) malloc( nr_fc_fft_filter * sizeof( Word32 ) ); - FOR( int i = 0; i < nr_fc_fft_filter; i++ ) + FOR( Word16 i = 0; i < nr_fc_fft_filter; i++ ) { pHrtf_inter_aural_coherence_const[i] = L_shl( params.pHrtf_inter_aural_coherence_const_fx[i], 3 ); /*Scaling up to Q30*/ + move32(); } ivas_reverb_calc_correl_filters_fx( pHrtf_inter_aural_coherence_const, pTime_window_fx, pState->fft_size, 0, pFft_wf_filter_ch0_fx, pFft_wf_filter_ch1_fx, &q_pFft_wf_filter_ch0_fx, &q_pFft_wf_filter_ch1_fx ); free( pHrtf_inter_aural_coherence_const ); - FOR( int i = 0; i < nr_fc_fft_filter; i++ ) + FOR( Word16 i = 0; i < nr_fc_fft_filter; i++ ) { - pFft_wf_filter_ch0_fx[i][0] = L_shl( pFft_wf_filter_ch0_fx[i][0], 31 - q_pFft_wf_filter_ch0_fx ); - pFft_wf_filter_ch0_fx[i][1] = L_shl( pFft_wf_filter_ch0_fx[i][1], 31 - q_pFft_wf_filter_ch0_fx ); + pFft_wf_filter_ch0_fx[i][0] = L_shl( pFft_wf_filter_ch0_fx[i][0], sub( 31, q_pFft_wf_filter_ch0_fx ) ); + move32(); + pFft_wf_filter_ch0_fx[i][1] = L_shl( pFft_wf_filter_ch0_fx[i][1], sub( 31, q_pFft_wf_filter_ch0_fx ) ); + move32(); } - FOR( int i = 0; i < nr_fc_fft_filter; i++ ) + FOR( Word16 i = 0; i < nr_fc_fft_filter; i++ ) { - pFft_wf_filter_ch1_fx[i][0] = L_shl( pFft_wf_filter_ch1_fx[i][0], 31 - q_pFft_wf_filter_ch1_fx ); - pFft_wf_filter_ch1_fx[i][1] = L_shl( pFft_wf_filter_ch1_fx[i][1], 31 - q_pFft_wf_filter_ch1_fx ); + pFft_wf_filter_ch1_fx[i][0] = L_shl( pFft_wf_filter_ch1_fx[i][0], sub( 31, q_pFft_wf_filter_ch1_fx ) ); + move32(); + pFft_wf_filter_ch1_fx[i][1] = L_shl( pFft_wf_filter_ch1_fx[i][1], sub( 31, q_pFft_wf_filter_ch1_fx ) ); + move32(); } /* Copying the computed FFT correlation filters to the fft_filter components */ - IF( ( error = set_correl_fft_filter_fx( pState, 0, pFft_wf_filter_ch0_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_correl_fft_filter_fx( pState, 0, pFft_wf_filter_ch0_fx ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = set_correl_fft_filter_fx( pState, 1, pFft_wf_filter_ch1_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_correl_fft_filter_fx( pState, 1, pFft_wf_filter_ch1_fx ) ), IVAS_ERR_OK ) ) { return error; } @@ -2603,25 +2673,29 @@ ivas_error ivas_reverb_open_fx( ivas_reverb_calc_color_filters_fx( pColor_target_l_fx, pColor_target_r_fx, pTime_window_fx, pState->fft_size, 0, pFft_wf_filter_ch0_fx, pFft_wf_filter_ch1_fx, &q_pFft_wf_filter_ch0_fx, &q_pFft_wf_filter_ch1_fx ); FOR( int i = 0; i < nr_fc_fft_filter; i++ ) { - pFft_wf_filter_ch0_fx[i][0] = L_shl( pFft_wf_filter_ch0_fx[i][0], 31 - q_pFft_wf_filter_ch0_fx ); - pFft_wf_filter_ch0_fx[i][1] = L_shl( pFft_wf_filter_ch0_fx[i][1], 31 - q_pFft_wf_filter_ch0_fx ); + pFft_wf_filter_ch0_fx[i][0] = L_shl( pFft_wf_filter_ch0_fx[i][0], sub( 31, q_pFft_wf_filter_ch0_fx ) ); + move32(); + pFft_wf_filter_ch0_fx[i][1] = L_shl( pFft_wf_filter_ch0_fx[i][1], sub( 31, q_pFft_wf_filter_ch0_fx ) ); + move32(); } FOR( int i = 0; i < nr_fc_fft_filter; i++ ) { - pFft_wf_filter_ch1_fx[i][0] = L_shl( pFft_wf_filter_ch1_fx[i][0], 31 - q_pFft_wf_filter_ch1_fx ); - pFft_wf_filter_ch1_fx[i][1] = L_shl( pFft_wf_filter_ch1_fx[i][1], 31 - q_pFft_wf_filter_ch1_fx ); + pFft_wf_filter_ch1_fx[i][0] = L_shl( pFft_wf_filter_ch1_fx[i][0], sub( 31, q_pFft_wf_filter_ch1_fx ) ); + move32(); + pFft_wf_filter_ch1_fx[i][1] = L_shl( pFft_wf_filter_ch1_fx[i][1], sub( 31, q_pFft_wf_filter_ch1_fx ) ); + move32(); } Scale_sig32( params.pHrtf_inter_aural_coherence_fx, nr_fc_fft_filter, 4 ); /*Scaling ( *hReverb )->fft_filter_color_0.fft_spectrum_fx to Q31*/ Scale_sig32( params.pFc_fx, nr_fc_fft_filter, 17 ); /*Scaling ( *hReverb )->fft_filter_color_1.fft_spectrum_fx to Q31*/ /* Copying the computed FFT colorations filters to the fft_filter components */ - IF( ( error = set_color_fft_filter_fx( pState, 0, pFft_wf_filter_ch0_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_color_fft_filter_fx( pState, 0, pFft_wf_filter_ch0_fx ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = set_color_fft_filter_fx( pState, 1, pFft_wf_filter_ch1_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_color_fft_filter_fx( pState, 1, pFft_wf_filter_ch1_fx ) ), IVAS_ERR_OK ) ) { return error; } @@ -2630,7 +2704,7 @@ ivas_error ivas_reverb_open_fx( ivas_rev_delay_line_init( &( pState->predelay_line ), pState->pPredelay_buffer_fx, params.pre_delay, predelay_bf_len ); /* set up feedback delay network */ - IF( ( error = setup_FDN_branches_fx( pState, ¶ms ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = setup_FDN_branches_fx( pState, ¶ms ) ), IVAS_ERR_OK ) ) { return error; } @@ -2843,6 +2917,7 @@ void ivas_reverb_close( hReverb = *hReverb_in; + test(); IF( hReverb_in == NULL || *hReverb_in == NULL ) { return; @@ -2999,7 +3074,7 @@ static void reverb_block_fx( FOR( branch_idx = 0; branch_idx < nr_branches; branch_idx++ ) { - ppOutput_fx[branch_idx] = (Word32 *) Output_fx + branch_idx * inner_bsize; + ppOutput_fx[branch_idx] = (Word32 *) Output_fx + i_mult( branch_idx, inner_bsize ); } FOR( k = 0; k < bsize; k += inner_bsize ) @@ -3019,14 +3094,16 @@ static void reverb_block_fx( { Word32 *pOutput_i_fx = &ppOutput_fx[i][0]; Word16 mixer_0_i = hReverb->mixer_fx[0][i]; + move16(); Word16 mixer_1_i = hReverb->mixer_fx[1][i]; + move16(); /* output and feedback are same, get sample from delay line ... */ ivas_rev_delay_line_get_sample_blk_fx( &( hReverb->delay_line[i] ), inner_bsize, pTemp_fx ); ivas_reverb_iir_filt_2taps_feed_blk_fx( &( hReverb->t60[i] ), inner_bsize, pTemp_fx, ppOutput_fx[i] ); FOR( ns = 0; ns < inner_bsize; ns++ ) { - pO0[ns] = L_add( pOutput_i_fx[ns] * mixer_0_i, pO0[ns] ); /* mixer ch 0 */ - pO1[ns] = L_add( pOutput_i_fx[ns] * mixer_1_i, pO1[ns] ); /* mixer ch 1 */ + pO0[ns] = L_add( imult3216( pOutput_i_fx[ns], mixer_0_i ), pO0[ns] ); /* mixer ch 0 */ + pO1[ns] = L_add( imult3216( pOutput_i_fx[ns], mixer_1_i ), pO1[ns] ); /* mixer ch 1 */ } } @@ -3059,7 +3136,9 @@ static void reverb_block_fx( FOR( k = 0; k < hReverb->fft_filter_ols.block_size; k++ ) { pOut0_fx[k] = (Word32) L_shr( pOut0_fx[k], ( r_shift ) ); + move32(); pOut1_fx[k] = (Word32) L_shr( pOut1_fx[k], ( r_shift ) ); + move32(); } /* Applying FFT filter to each sub-frame */ FOR( blk_idx = 0; blk_idx < hReverb->num_fft_subblocks; blk_idx++ ) @@ -3179,6 +3258,7 @@ static ivas_error downmix_input_block_fx( { Word16 i, s, nchan_transport; Word32 dmx_gain_fx = hReverb->dmx_gain_fx; + move32(); SWITCH( input_audio_config ) { case IVAS_AUDIO_CONFIG_STEREO: @@ -3195,12 +3275,14 @@ static ivas_error downmix_input_block_fx( nchan_transport = audioCfg2channels( input_audio_config ); FOR( s = 0; s < hReverb->full_block_size; s++ ) { - Word32 temp = pcm_in[0][input_offset + s]; + Word32 temp = pcm_in[0][add( input_offset, s )]; + move32(); FOR( i = 1; i < nchan_transport; i++ ) { - temp = L_add( temp, pcm_in[i][input_offset + s] ); + temp = L_add( temp, pcm_in[i][add( input_offset, s )] ); } - pPcm_out[s] = Mpy_32_32( dmx_gain_fx, L_shl_sat( temp, 7 ) ) << 1; + pPcm_out[s] = L_shl( Mpy_32_32( dmx_gain_fx, L_shl_sat( temp, 7 ) ), 1 ); + move32(); } BREAK; } @@ -3212,6 +3294,7 @@ static ivas_error downmix_input_block_fx( FOR( s = 0; s < hReverb->full_block_size; s++ ) { pPcm_out[s] = Mpy_32_32( dmx_gain_fx, L_shl_sat( pcm_in[0][input_offset + s], 8 ) ); + move32(); } BREAK; } @@ -3297,13 +3380,14 @@ static void predelay_block_fx( { UWord16 i, idx, n_samples, blk_size; UWord16 max_blk_size = (UWord16) hReverb->predelay_line.Delay; - IF( max_blk_size < 2 ) + IF( LT_32( max_blk_size, 2 ) ) { IF( max_blk_size == 0 ) /* zero-length delay line: just copy the data from input to output */ { FOR( i = 0; i < hReverb->full_block_size; i++ ) { pOutput[i] = pInput[i]; + move32(); } } ELSE /* 1-sample length delay line: feed the data sample-by-sample */ @@ -3311,6 +3395,7 @@ static void predelay_block_fx( FOR( i = 0; i < hReverb->full_block_size; i++ ) { pOutput[i] = ivas_rev_delay_line_get_sample_fx( &( hReverb->predelay_line ) ); + move32(); ivas_rev_delay_line_feed_sample_fx( &( hReverb->predelay_line ), pInput[i] ); } } @@ -3318,18 +3403,23 @@ static void predelay_block_fx( ELSE /* multiple-sample length delay line: use block processing */ { idx = 0; + move16(); n_samples = hReverb->full_block_size; - WHILE( n_samples > 0 ) + WHILE( GT_16( n_samples, 0 ) ) { blk_size = n_samples; - IF( blk_size > max_blk_size ) + move16(); + if ( GT_16( blk_size, max_blk_size ) ) { blk_size = max_blk_size; + move16(); } ivas_rev_delay_line_get_sample_blk_fx( &( hReverb->predelay_line ), blk_size, &pOutput[idx] ); ivas_rev_delay_line_feed_sample_blk_fx( &( hReverb->predelay_line ), blk_size, &pInput[idx] ); - idx += blk_size; - n_samples -= blk_size; + idx = (UWord16) UL_addNsD( idx, blk_size ); + move16(); + n_samples = (UWord16) UL_subNsD( n_samples, blk_size ); + move16(); } } @@ -3407,8 +3497,10 @@ static void mix_output_block_fx( FOR( i = 0; i < hReverb->full_block_size; i++ ) { - pOutL[i] = L_add( pInL[i], ( ( pOutL[i] ) >> 2 ) ); - pOutR[i] = L_add( pInR[i], ( ( pOutR[i] ) >> 2 ) ); + pOutL[i] = L_add( pInL[i], ( L_shr( pOutL[i], 2 ) ) ); + move32(); + pOutR[i] = L_add( pInR[i], ( L_shr( pOutR[i], 2 ) ) ); + move32(); } return; @@ -3457,7 +3549,7 @@ ivas_error ivas_reverb_process_fx( Word32 tmp0_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp1_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp2_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; ivas_error error; - IF( ( error = downmix_input_block_fx( hReverb, pcm_in_fx, input_audio_config, tmp1_fx, i_ts * hReverb->full_block_size ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = downmix_input_block_fx( hReverb, pcm_in_fx, input_audio_config, tmp1_fx, i_ts * hReverb->full_block_size ) ), IVAS_ERR_OK ) ) { return error; } @@ -3472,8 +3564,8 @@ ivas_error ivas_reverb_process_fx( } ELSE { - mvr2r_Word32( tmp1_fx, &pcm_out_fx[0][i_ts * hReverb->full_block_size], hReverb->full_block_size ); - mvr2r_Word32( tmp2_fx, &pcm_out_fx[1][i_ts * hReverb->full_block_size], hReverb->full_block_size ); + mvr2r_Word32( tmp1_fx, &pcm_out_fx[0][i_mult( i_ts, hReverb->full_block_size )], hReverb->full_block_size ); + mvr2r_Word32( tmp2_fx, &pcm_out_fx[1][i_mult( i_ts, hReverb->full_block_size )], hReverb->full_block_size ); } return IVAS_ERR_OK; @@ -3716,8 +3808,8 @@ void ivas_binaural_reverb_processSubframe_fx( FOR( bin = 0; bin < hReverb->numBins; bin++ ) { /* Move the data forwards by blockSize (i.e. by the frame size of 16 CLDFB slots) */ - mvl2l( hReverb->loopBufReal_fx[bin], hReverb->loopBufReal_fx[bin] + numSlots, hReverb->loopBufLength[bin] ); - mvl2l( hReverb->loopBufImag_fx[bin], hReverb->loopBufImag_fx[bin] + numSlots, hReverb->loopBufLength[bin] ); + Copy32( hReverb->loopBufReal_fx[bin], hReverb->loopBufReal_fx[bin] + numSlots, hReverb->loopBufLength[bin] ); + Copy32( hReverb->loopBufImag_fx[bin], hReverb->loopBufImag_fx[bin] + numSlots, hReverb->loopBufLength[bin] ); /* Add the data from the end of the loop to the beginning, with an attenuation factor * according to RT60. This procedure generates an IIR decaying response. The response @@ -3739,16 +3831,20 @@ void ivas_binaural_reverb_processSubframe_fx( Word32 temp_1 = Mpy_32_32( hReverb->preDelayBufferReal_fx[idx][bin], hReverb->reverbEqGains_fx[bin] ); Word32 temp_2 = Mpy_32_32( hReverb->preDelayBufferImag_fx[idx][bin], hReverb->reverbEqGains_fx[bin] ); hReverb->loopBufReal_fx[bin][invertSampleIndex] = L_add( hReverb->loopBufReal_fx[bin][invertSampleIndex], temp_1 ); + move32(); hReverb->loopBufImag_fx[bin][invertSampleIndex] = L_add( hReverb->loopBufImag_fx[bin][invertSampleIndex], temp_2 ); + move32(); hReverb->preDelayBufferReal_fx[idx][bin] = 0; + move32(); hReverb->preDelayBufferImag_fx[idx][bin] = 0; + move32(); } /* Add every second input channel as is to the pre-delay buffer, and every second input channel with * 90 degrees phase shift to reduce energy imbalances between coherent and incoherent sounds */ FOR( ch = 0; ch < numInChannels; ch++ ) { - IF( ch % 2 ) + IF( s_and( ch, 1 ) ) { v_add_fixed( hReverb->preDelayBufferReal_fx[idx], inReal[ch][sample], hReverb->preDelayBufferReal_fx[idx], hReverb->numBins, 0 ); v_add_fixed( hReverb->preDelayBufferImag_fx[idx], inImag[ch][sample], hReverb->preDelayBufferImag_fx[idx], hReverb->numBins, 0 ); @@ -3759,7 +3855,8 @@ void ivas_binaural_reverb_processSubframe_fx( v_add_fixed( hReverb->preDelayBufferImag_fx[idx], inReal[ch][sample], hReverb->preDelayBufferImag_fx[idx], hReverb->numBins, 0 ); } } - idx = ( idx + 1 ) % hReverb->preDelayBufferLength; + idx = add( idx, 1 ) % hReverb->preDelayBufferLength; + move16(); } hReverb->preDelayBufferIndex = idx; move16(); @@ -3776,8 +3873,8 @@ void ivas_binaural_reverb_processSubframe_fx( phaseShiftTypePr = hReverb->tapPhaseShiftType[bin][ch]; /* Flush output */ - set_l( hReverb->outputBufferReal_fx[bin][ch], 0, numSlots ); - set_l( hReverb->outputBufferImag_fx[bin][ch], 0, numSlots ); + set32_fx( hReverb->outputBufferReal_fx[bin][ch], 0, numSlots ); + set32_fx( hReverb->outputBufferImag_fx[bin][ch], 0, numSlots ); /* Add from temporally decaying sparse tap locations the audio to the output. */ FOR( tapIdx = 0; tapIdx < hReverb->taps[bin][ch]; tapIdx++ ) @@ -3823,10 +3920,14 @@ void ivas_binaural_reverb_processSubframe_fx( rightIm_fx = L_add( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferImag_fx[bin][1][sample] ), Mpy_32_32( hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferImag_fx[bin][0][sample] ) ); - hReverb->outputBufferReal_fx[bin][0][sample] = leftRe_fx; // Q_in + hReverb->outputBufferReal_fx[bin][0][sample] = leftRe_fx; // Q_in + move32(); hReverb->outputBufferReal_fx[bin][1][sample] = rightRe_fx; // Q_in - hReverb->outputBufferImag_fx[bin][0][sample] = leftIm_fx; // Q_in + move32(); + hReverb->outputBufferImag_fx[bin][0][sample] = leftIm_fx; // Q_in + move32(); hReverb->outputBufferImag_fx[bin][1][sample] = rightIm_fx; // Q_in + move32(); } } } @@ -3936,6 +4037,7 @@ static ivas_error ivas_binaural_reverb_open_fx( Word32 L_tmp_BufLength = L_shl( L_shr( Mpy_32_32( revTimes_fx[bin], 1258291200 /*150.0 in Q23*/ ), 23 ), 23 ); L_tmp_BufLength = L_add( Mpy_32_32( 1556925645 /*1.45 in Q30*/, L_tmp_BufLength ), ONE_IN_Q22 ); hReverb->loopBufLength[bin] = (Word16) L_shr( L_tmp_BufLength, 22 ); + move16(); hReverb->loopBufLength[bin] = s_min( hReverb->loopBufLength[bin], hReverb->loopBufLengthMax[bin] ); /* Sparse Filter Tap Locations */ @@ -3948,7 +4050,7 @@ static ivas_error ivas_binaural_reverb_open_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Reverberator\n" ) ); } - set_s( hReverb->tapPhaseShiftType[bin][chIdx], 0, len ); + set16_fx( hReverb->tapPhaseShiftType[bin][chIdx], 0, len ); IF( ( hReverb->tapPointersReal_fx[bin][chIdx] = (Word32 **) malloc( len * sizeof( Word32 * ) ) ) == NULL ) { @@ -4184,7 +4286,7 @@ ivas_error ivas_binaural_reverb_open_fastconv_fx( float ene_flt[CLDFB_NO_CHANNELS_MAX]; revTimes = t60; revEne = ene; - if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfFastConv, internal_config, false, sampling_rate, t60_flt, ene_flt ) ) != IVAS_ERR_OK ) + if ( NE_32( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfFastConv, internal_config, false, sampling_rate, t60_flt, ene_flt ) ), IVAS_ERR_OK ) ) { return error; } @@ -4282,6 +4384,7 @@ ivas_error ivas_binaural_reverb_open_parambin( // } // preDelay = (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); preDelay = (Word16) L_shr_r( Mpy_32_32( 1677721600 /*800 in Q21*/, roomAcoustics->acousticPreDelay_fx /*Q27*/ ), Q17 ); + move16(); } ELSE { diff --git a/lib_rend/ivas_reverb_delay_line.c b/lib_rend/ivas_reverb_delay_line.c index bb55a95ca..d24bbe1ec 100644 --- a/lib_rend/ivas_reverb_delay_line.c +++ b/lib_rend/ivas_reverb_delay_line.c @@ -92,8 +92,9 @@ void ivas_rev_delay_line_feed_sample_fx( Word32 input /* i : the sample to feed */ ) { - pDelay->pBuffer_fx[pDelay->BufferPos++] = input; - move32(); + pDelay->pBuffer_fx[pDelay->BufferPos] = input; + pDelay->BufferPos = u_extract_l( UL_addNsD( pDelay->BufferPos, 1 ) ); + move16(); IF( GE_32( pDelay->BufferPos, pDelay->Delay ) ) { @@ -233,7 +234,7 @@ void ivas_rev_delay_line_feed_sample_blk_fx( Word32 *pDst, *pSrc; UWord16 i, pos; - pos = (UWord16) pDelay->BufferPos; + pos = pDelay->BufferPos; move16(); IF( GT_32( L_add( pos, blk_size ), pDelay->Delay ) ) /* splitting block in 2 if it exceeds buffer end limit */ @@ -242,7 +243,9 @@ void ivas_rev_delay_line_feed_sample_blk_fx( UWord16 blk_size_2; /* 2nd block at the beginning of the buffer */ blk_size_1 = (UWord16) L_sub( pDelay->Delay, pos ); + move16(); blk_size_2 = (UWord16) L_sub( blk_size, blk_size_1 ); + move16(); pDst = &pDelay->pBuffer_fx[pos]; FOR( i = 0; i < blk_size_1; i++ ) { @@ -268,6 +271,7 @@ void ivas_rev_delay_line_feed_sample_blk_fx( move32(); } pos = (UWord16) L_add( pos, blk_size ); + move16(); } pDelay->BufferPos = pos; move16(); @@ -330,7 +334,9 @@ void ivas_rev_delay_line_get_sample_blk_fx( UWord16 blk_size_2; /* 2nd block at the beginning of the buffer */ blk_size_1 = (UWord16) L_sub( pDelay->Delay, pos ); + move16(); blk_size_2 = (UWord16) L_sub( blk_size, blk_size_1 ); + move16(); pSrc = &pDelay->pBuffer_fx[pos]; IF( EQ_16( gain, ONE_IN_Q14 ) ) { @@ -352,12 +358,14 @@ void ivas_rev_delay_line_get_sample_blk_fx( FOR( i = 0; i < blk_size_1; i++ ) { output[i] = L_shl( Mpy_32_16_r( pSrc[i], gain ), 1 ); + move32(); } pSrc = &pDelay->pBuffer_fx[0]; pDst = &output[blk_size_1]; FOR( i = 0; i < blk_size_2; i++ ) { pDst[i] = L_shl( Mpy_32_16_r( pSrc[i], gain ), 1 ); + move32(); } } } @@ -378,6 +386,7 @@ void ivas_rev_delay_line_get_sample_blk_fx( FOR( i = 0; i < blk_size; i++ ) { output[i] = L_shl( Mpy_32_16_r( pSrc[i], gain ), 1 ); + move32(); } } } diff --git a/lib_rend/ivas_reverb_fft_filter.c b/lib_rend/ivas_reverb_fft_filter.c index 5a734186b..62ab464da 100644 --- a/lib_rend/ivas_reverb_fft_filter.c +++ b/lib_rend/ivas_reverb_fft_filter.c @@ -73,22 +73,22 @@ UWord16 int_log2( if ( powerOf2 & 0x00FF ) { - l2 -= 8; + l2 = sub( l2, 8 ); } if ( powerOf2 & 0x0F0F ) { - l2 -= 4; + l2 = sub( l2, 4 ); } if ( powerOf2 & 0x3333 ) { - l2 -= 2; + l2 = sub( l2, 2 ); } if ( powerOf2 & 0x5555 ) { - l2 -= 1; + l2 = sub( l2, 1 ); } return l2; @@ -143,28 +143,34 @@ static void fft_wrapper_2ch_fx( Word32 *buffer_R_fx, const Word16 fft_size ) { - const Word16 half_sz = fft_size >> 1; + const Word16 half_sz = shr( fft_size, 1 ); Word16 k, mirror_k; Word32 left_re_fx, left_im_fx, right_re_fx, right_im_fx; DoRTFTn_fx_ivas( buffer_L_fx, buffer_R_fx, fft_size ); /* separating left and right channel spectra */ - buffer_L_fx[0] = buffer_L_fx[0] << 1; - buffer_R_fx[0] = buffer_R_fx[0] << 1; - for ( k = 1; k < half_sz; k++ ) + buffer_L_fx[0] = L_shl( buffer_L_fx[0], 1 ); + move32(); + buffer_R_fx[0] = L_shl( buffer_R_fx[0], 1 ); + move32(); + FOR( k = 1; k < half_sz; k++ ) { - mirror_k = fft_size - k; + mirror_k = sub( fft_size, k ); left_re_fx = ( L_add( buffer_L_fx[k], buffer_L_fx[mirror_k] ) ); left_im_fx = ( L_sub( buffer_R_fx[k], buffer_R_fx[mirror_k] ) ); right_re_fx = ( L_add( buffer_R_fx[k], buffer_R_fx[mirror_k] ) ); - right_im_fx = -( L_sub( buffer_L_fx[k], buffer_L_fx[mirror_k] ) ); + right_im_fx = L_negate( ( L_sub( buffer_L_fx[k], buffer_L_fx[mirror_k] ) ) ); buffer_L_fx[k] = left_re_fx; + move32(); buffer_R_fx[k] = right_re_fx; + move32(); buffer_L_fx[mirror_k] = left_im_fx; + move32(); buffer_R_fx[mirror_k] = right_im_fx; + move32(); } return; @@ -220,23 +226,31 @@ static void ifft_wrapper_2ch_fx( const Word16 fft_size ) { Word32 buffer_L_re, buffer_L_im, buffer_R_re, buffer_R_im; - const Word16 half_sz = fft_size >> 1; + const Word16 half_sz = shr( fft_size, 1 ); Word16 k, mirror_k; /* Re-arranging and adding spectra in order to obtain L/R signals as re/im ifft outputs */ - for ( k = 1; k < half_sz; k++ ) + FOR( k = 1; k < half_sz; k++ ) { - mirror_k = fft_size - k; + mirror_k = sub( fft_size, k ); buffer_L_re = buffer_L[k]; + move32(); buffer_L_im = buffer_L[mirror_k]; + move32(); buffer_R_re = buffer_R[k]; + move32(); buffer_R_im = buffer_R[mirror_k]; + move32(); buffer_L[k] = L_add( buffer_L_re, buffer_R_im ); + move32(); buffer_L[mirror_k] = L_sub( buffer_L_re, buffer_R_im ); + move32(); buffer_R[k] = L_sub( buffer_R_re, buffer_L_im ); + move32(); buffer_R[mirror_k] = L_add( buffer_R_re, buffer_L_im ); + move32(); } DoRTFTn_fx_ivas( buffer_L, buffer_R, fft_size ); @@ -295,32 +309,33 @@ static void ifft_wrapper_2ch( * Initializes t2t_f2t struct and clears history *-----------------------------------------------------------------------------------------*/ -int16_t ivas_reverb_t2f_f2t_init( +Word16 ivas_reverb_t2f_f2t_init( ivas_reverb_t2f_f2t_t *t2f_f2t, const Word16 fft_size, const Word16 block_size ) { - if ( fft_size > RV_FILTER_MAX_FFT_SIZE ) + IF( GT_16( fft_size, RV_FILTER_MAX_FFT_SIZE ) ) { return 1; } - if ( ( block_size > fft_size ) || ( fft_size - block_size > RV_FILTER_MAX_HISTORY ) ) + test(); + IF( GT_16( block_size, fft_size ) || GT_16( sub( fft_size, block_size ), RV_FILTER_MAX_HISTORY ) ) { return 2; } t2f_f2t->log2_fft_size = int_log2( fft_size ); - if ( ( 1 << t2f_f2t->log2_fft_size ) != fft_size ) + IF( NE_16( shl( 1, t2f_f2t->log2_fft_size ), fft_size ) ) { return 3; /* fft_size not a power of 2 */ } t2f_f2t->fft_size = fft_size; t2f_f2t->block_size = block_size; - t2f_f2t->hist_size = t2f_f2t->fft_size - t2f_f2t->block_size; + t2f_f2t->hist_size = sub( t2f_f2t->fft_size, t2f_f2t->block_size ); - if ( t2f_f2t->hist_size > RV_FILTER_MAX_HISTORY ) + IF( GT_16( t2f_f2t->hist_size, RV_FILTER_MAX_HISTORY ) ) { t2f_f2t->hist_size = RV_FILTER_MAX_HISTORY; } @@ -343,10 +358,12 @@ void ivas_reverb_t2f_f2t_ClearHistory( Word32 *hist_L = t2f_f2t->fft_history_L_fx; Word32 *hist_R = t2f_f2t->fft_history_R_fx; - for ( i = 0; i < t2f_f2t->hist_size; i++ ) + FOR( i = 0; i < t2f_f2t->hist_size; i++ ) { hist_L[i] = 0; + move32(); hist_R[i] = 0; + move32(); } return; @@ -431,34 +448,42 @@ void ivas_reverb_t2f_f2t_in_fx( { Word16 i; Word16 hlen = t2f_f2t->hist_size; + move16(); Word16 bsiz = t2f_f2t->block_size; + move16(); Word32 *hist_L = t2f_f2t->fft_history_L_fx; Word32 *hist_R = t2f_f2t->fft_history_R_fx; Word32 *pL, *pR; /* copy history to buffer */ - for ( i = 0; i < hlen; i++ ) + FOR( i = 0; i < hlen; i++ ) { buffer_L[i] = hist_L[i]; + move16(); buffer_R[i] = hist_R[i]; + move16(); } /* copy input to buffer */ pL = &buffer_L[hlen]; pR = &buffer_R[hlen]; - for ( i = 0; i < bsiz; i++ ) + FOR( i = 0; i < bsiz; i++ ) { pL[i] = input_L[i]; + move32(); pR[i] = input_R[i]; + move32(); } /* copy buffer to history */ pL = &buffer_L[bsiz]; pR = &buffer_R[bsiz]; - for ( i = 0; i < hlen; i++ ) + FOR( i = 0; i < hlen; i++ ) { hist_L[i] = pL[i]; + move32(); hist_R[i] = pR[i]; + move32(); } /* do FFT */ @@ -538,10 +563,12 @@ void ivas_reverb_t2f_f2t_out_fx( ifft_wrapper_2ch_fx( buffer_L, buffer_R, t2f_f2t->fft_size ); - for ( i = 0; i < t2f_f2t->block_size; i++ ) + FOR( i = 0; i < t2f_f2t->block_size; i++ ) { output_L[i] = pL[i]; + move32(); output_R[i] = pR[i]; + move32(); } return; @@ -586,7 +613,7 @@ Word16 ivas_reverb_fft_filter_init( ivas_reverb_fft_filter_t *fft_filter, const Word16 fft_size ) { - if ( fft_size > RV_FILTER_MAX_FFT_SIZE ) + IF( GT_16( fft_size, RV_FILTER_MAX_FFT_SIZE ) ) { return 1; } @@ -634,18 +661,23 @@ void ivas_reverb_fft_filter_ComplexMul_fx( Word32 t; f_spec = fft_filter->fft_size; - h = f_spec >> 1; + h = shr( f_spec, 1 ); spec = fft_filter->fft_spectrum_fx; buffer[0] = Mpy_32_32( spec[0], buffer[0] ); /* real multiply f0 DC */ + move32(); buffer[h] = Mpy_32_32( spec[h], buffer[h] ); /* real multiply f_spec Nyquist */ - j = f_spec - 1; - for ( i = 1; i < h; i++ ) /*actual complex multiply in loop */ + move32(); + j = sub( f_spec, 1 ); + FOR( i = 1; i < h; i++ ) /*actual complex multiply in loop */ { t = buffer[i]; + move32(); buffer[i] = L_sub( Mpy_32_32( t, spec[i] ), Mpy_32_32( buffer[j], spec[j] ) ); + move32(); buffer[j] = L_add( Mpy_32_32( t, spec[j] ), Mpy_32_32( buffer[j], spec[i] ) ); - j--; + move32(); + j = sub( j, 1 ); } return; @@ -698,11 +730,15 @@ void ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR_fx( h = shr( fft_size, 1 ); fft_real[0] = spectrum[0][0]; + move32(); fft_real[h] = spectrum[h][0]; - for ( i = 1; i < h; i++ ) + move32(); + FOR( i = 1; i < h; i++ ) { fft_real[i] = spectrum[i][0]; - fft_real[fft_size - i] = spectrum[i][1]; + move32(); + fft_real[sub( fft_size, i )] = spectrum[i][1]; + move32(); } return; @@ -743,11 +779,14 @@ void ivas_reverb_fft_filter_CrossMix_fx( Word32 t; Word16 i; - for ( i = 0; i < fft_size; i++ ) + FOR( i = 0; i < fft_size; i++ ) { t = buffer0[i]; + move32(); buffer0[i] = L_add( t, buffer1[i] ); + move32(); buffer1[i] = L_sub( t, buffer1[i] ); + move32(); } return; diff --git a/lib_rend/ivas_reverb_filter_design.c b/lib_rend/ivas_reverb_filter_design.c index dd6f2bb2d..8ffc766d4 100644 --- a/lib_rend/ivas_reverb_filter_design.c +++ b/lib_rend/ivas_reverb_filter_design.c @@ -250,7 +250,8 @@ static void calc_min_phase_fx( { const Word16 sine_value = getSineWord16R2( mult( add( initial_angle, shl( mult( shl( idx, 8 ), angle_increment ), 5 ) ), 20858 ) ); - pFolded_cepstrum_smoothing_win[idx + half_fft_size - cepstrum_smoothing_extent] = L_mult( sine_value, sine_value ); // q31 + pFolded_cepstrum_smoothing_win[add( idx, sub( half_fft_size, cepstrum_smoothing_extent ) )] = L_mult( sine_value, sine_value ); // q31 + move32(); } /* Padding the rest with zeros */ @@ -264,12 +265,13 @@ static void calc_min_phase_fx( FOR( idx = 0; idx < spectrum_size; idx++ ) { pCepstrum[idx] = Mpy_32_32( L_add( BASOP_Util_Log2( L_add( Mpy_32_32( pSpectrum[idx][0], pSpectrum[idx][0] ), Mpy_32_32( pSpectrum[idx][1], pSpectrum[idx][1] ) ) ), L_shl( 0, 25 ) ), LN_2_Q31 ); /* log2 = 0.693147, q = 31, value = 1488521848 */ // q =26 + move32(); } /* Extending one-sided spectrum to double-sided one */ FOR( idx = spectrum_size; idx < fft_size; idx++ ) { - pCepstrum[idx] = pCepstrum[fft_size - idx]; + pCepstrum[idx] = pCepstrum[sub( fft_size, idx )]; move32(); } Word16 guarded_bits; @@ -279,6 +281,7 @@ static void calc_min_phase_fx( FOR( Word16 j = 0; j < fft_size; j++ ) { pCepstrum[j] = L_shl( pCepstrum[j], *q_pCepstrum ); + move32(); } *q_pCepstrum = add( *q_pCepstrum, 26 ); /* Compute the real pCepstrum of the log amplitude spectrum */ @@ -290,6 +293,7 @@ static void calc_min_phase_fx( FOR( idx = 0; idx < fft_size; idx++ ) { pCepstrum[idx] = Mpy_32_32( pCepstrum[idx], scale_factor ); // q = q_pCepstrum + move32(); } #if 0 guarded_bits = L_norm_arr(pCepstrum, fft_size); @@ -307,8 +311,10 @@ static void calc_min_phase_fx( FOR( idx = 1; idx < half_fft_size; idx++ ) { - pFolded_cepstrum_re[idx] = L_shl( pCepstrum[idx], 1 ); // q = q_pCepstrum + pFolded_cepstrum_re[idx] = L_shl( pCepstrum[idx], 1 ); // q = q_pCepstrum + move32(); pFolded_cepstrum_im[idx] = L_negate( L_shl( pCepstrum[fft_size - idx], 1 ) ); // q = q_pCepstrum + move32(); /* Note: sign inverted because of fft rather than ifft used before */ } pFolded_cepstrum_re[half_fft_size] = pCepstrum[half_fft_size]; // q = q_pCepstrum @@ -329,7 +335,9 @@ static void calc_min_phase_fx( FOR( idx = 0; idx < fft_size; idx++ ) { pFolded_cepstrum_re[idx] = Mpy_32_32( pFolded_cepstrum_re[idx], pFolded_cepstrum_smoothing_win[idx] ); // q = q_pCepstrum + move32(); pFolded_cepstrum_im[idx] = Mpy_32_32( pFolded_cepstrum_im[idx], pFolded_cepstrum_smoothing_win[idx] ); // q = q_pCepstrum + move32(); } /* Convert back and isolate the phase. */ @@ -360,7 +368,8 @@ static void calc_min_phase_fx( /* Copying the img part into the output */ FOR( idx = 1; idx < half_fft_size; idx++ ) { - pMinPhase[idx] = L_add( pFolded_cepstrum_re[fft_size - idx], pFolded_cepstrum_im[idx] ); + pMinPhase[idx] = L_add( pFolded_cepstrum_re[sub( fft_size, idx )], pFolded_cepstrum_im[idx] ); + move32(); } } pMinPhase[0] = 0; @@ -440,7 +449,9 @@ static void calc_min_phase_filter_fx( /* Apply the computed phase */ pH_flt[idx][0] = Mpy_32_16_1( current_ampl, getCosWord16R2( mult( abs_s( (Word16) L_shr( pMin_phase[idx], sub( q_pMin_phase, 13 ) ) ), 20858 ) ) ); // shifting right for next function. + move32(); pH_flt[idx][1] = Mpy_32_16_1( current_ampl, getSineWord16R2( mult( (Word16) L_shr( pMin_phase[idx], sub( q_pMin_phase, 13 ) ), 20858 ) ) ); + move32(); } return; @@ -523,7 +534,7 @@ static void apply_window_fft_fx( /* Img parts */ FOR( idx = 1; idx < half_fft_size; idx++ ) { - pFilter[fft_size - idx] = pH_flt[idx][1]; + pFilter[sub( fft_size, idx )] = pH_flt[idx][1]; move32(); } *q_pFilter = 31; @@ -536,6 +547,7 @@ static void apply_window_fft_fx( FOR( Word16 j = 0; j < fft_size; j++ ) { pFilter[j] = L_shl( pFilter[j], temp ); + move32(); } *q_pFilter = add( *q_pFilter, temp ); } @@ -546,6 +558,7 @@ static void apply_window_fft_fx( FOR( idx = 0; idx < fft_size; idx++ ) { pFilter[idx] = Mpy_32_32( pWindow[idx], pFilter[idx] ); // q = q_pFilter + 30 - 31 + move32(); } *q_pFilter = add( *q_pFilter, sub( 30, 31 ) ); /* Convert back to the frequency domain */ @@ -555,6 +568,7 @@ static void apply_window_fft_fx( FOR( Word16 j = 0; j < fft_size; j++ ) { pFilter[j] = L_shl( pFilter[j], temp ); + move32(); } *q_pFilter = add( *q_pFilter, temp ); } @@ -574,7 +588,7 @@ static void apply_window_fft_fx( { pH_flt[idx][0] = pFilter[idx]; move32(); - pH_flt[idx][1] = pFilter[fft_size - idx]; + pH_flt[idx][1] = pFilter[sub( fft_size, idx )]; move32(); } @@ -666,7 +680,7 @@ static void response_step_limit_fx( const Word32 negative_step_limit_hf = 903441154; // 1.0f / positive_step_limit_hf = 1.26209271246779263; //q = 30 /* Go up from pivot frequency and limit the slope to the maximum given by T. */ - FOR( i = pivot_bin_idx + 1; i < dim_x; i++ ) + FOR( i = add( pivot_bin_idx, 1 ); i < dim_x; i++ ) { Word16 div_e; Word32 desiredChange = L_deposit_h( ( BASOP_Util_Divide3232_Scale( X[i], X[i - 1], &div_e ) ) ); @@ -688,6 +702,7 @@ static void response_step_limit_fx( move32(); temp = W_mult0_32_32( X[i - 1], change ); X[i] = (Word32) W_shr( temp, 30 ); + move32(); } } ELSE @@ -698,12 +713,13 @@ static void response_step_limit_fx( move32(); temp = W_mult0_32_32( X[i - 1], change ); X[i] = (Word32) W_shr( temp, 30 ); + move32(); } } } /* Go down from pivot frequency and limit the slope to the maximum given by T. */ - FOR( i = pivot_bin_idx - 1; i >= 0; i-- ) + FOR( i = sub( pivot_bin_idx, 1 ); i >= 0; i-- ) { Word16 div_e; Word32 desiredChange = L_deposit_h( ( BASOP_Util_Divide3232_Scale( X[i], X[i + 1], &div_e ) ) ); @@ -719,22 +735,24 @@ static void response_step_limit_fx( IF( GE_32( X[i], X[i + 1] ) ) { - IF( GT_32( change, L_shr( positive_step_limit_lf, 30 - desiredChange_q ) ) ) + IF( GT_32( change, L_shr( positive_step_limit_lf, sub( 30, desiredChange_q ) ) ) ) { change = positive_step_limit_lf; // q = 30; move32(); temp = W_mult0_32_32( X[i + 1], change ); X[i] = (Word32) W_shr( temp, 30 ); + move32(); } } ELSE { - IF( LT_32( change, L_shr( negative_step_limit_lf, 30 - desiredChange_q ) ) ) + IF( LT_32( change, L_shr( negative_step_limit_lf, sub( 30, desiredChange_q ) ) ) ) { change = negative_step_limit_lf; // q = 30; move32(); temp = W_mult0_32_32( X[i + 1], change ); X[i] = (Word32) W_shr( temp, 30 ); + move32(); } } } @@ -821,11 +839,12 @@ void ivas_reverb_define_window_fft_fx( { const Word16 sine_value = getSineWord16R2( mult( add( initial_angle, shl( mult( shl( idx, 8 ), angle_increment ), 5 ) ), 20858 ) ); // q31 - pWindow[idx + transitionStart] = L_mult( sine_value, sine_value ); + pWindow[add( idx, transitionStart )] = L_mult( sine_value, sine_value ); + move32(); } /* Padding the rest with zeros */ - FOR( idx = transitionStart + transitionLength; idx < fftLength; idx++ ) + FOR( idx = add( transitionStart, transitionLength ); idx < fftLength; idx++ ) { pWindow[idx] = 0; move32(); @@ -918,6 +937,7 @@ Word16 ivas_reverb_calc_color_filters_fx( FOR( idx = 0; idx <= half_fft_size; idx++ ) { + test(); IF( LT_32( pTargetL[idx], 0 ) || LT_32( pTargetR[idx], 0 ) ) /* Shouldn't have negative gains. */ { return 1; @@ -989,6 +1009,7 @@ Word16 ivas_reverb_calc_correl_filters_fx( half_fft_size = shr( fft_size, 1 ); FOR( idx = 0; idx <= half_fft_size; idx++ ) { + test(); IF( LT_32( pTargetICC[idx], L_negate( ONE_IN_Q30 ) ) || LT_32( ONE_IN_Q30, pTargetICC[idx] ) ) /* Shouldn't have negative gains. */ { return 1; @@ -1000,18 +1021,22 @@ Word16 ivas_reverb_calc_correl_filters_fx( temp = 1; move32(); pU[idx][0] = Sqrt32( L_shr( L_add( ONE_IN_Q30, pTargetICC[idx] ), 1 ), &temp ); + move32(); IF( temp ) { pU[idx][0] = L_shl( pU[idx][0], temp ); + move32(); } pU[idx][1] = 0; move32(); temp = 1; move32(); pV[idx][0] = Sqrt32( L_shr( L_sub( ONE_IN_Q30, pTargetICC[idx] ), 1 ), &temp ); + move32(); IF( temp ) { pV[idx][0] = L_shl( pV[idx][0], temp ); + move32(); } pV[idx][1] = 0; move32(); @@ -1189,7 +1214,9 @@ void ivas_reverb_calc_color_levels_fx( FOR( i = 0; i < nrcoefs; i++ ) { coefA[i] = pT60_filter_coeff[add( i_mult( shl( nrcoefs, 1 ), loop_idx ), add( i, nrcoefs ) )]; // q = 31 - coefB[i] = pT60_filter_coeff[add( i_mult( shl( nrcoefs, 1 ), loop_idx ), i )]; // // q = 31 + move32(); + coefB[i] = pT60_filter_coeff[add( i_mult( shl( nrcoefs, 1 ), loop_idx ), i )]; // // q = 31 + move32(); } t60_e[freq_count] = -100; move16(); @@ -1210,13 +1237,18 @@ void ivas_reverb_calc_color_levels_fx( T60_est = BASOP_Util_Divide3232_Scale( L_shl( i_mult( -3, pLoop_delays[loop_idx] ), 2 ), Mpy_32_32( Mpy_32_32( L_add( BASOP_Util_Log2( H_filter ), L_shl( temp, 25 ) ), LOG10_2_Q31 ), L_shl( output_Fs, 8 ) ), &temp ); // conversion of log2 to log10. T60_est = L_shl( T60_est, 16 ); t60[freq_idx] = BASOP_Util_Add_Mant32Exp( T60_est, temp, t60[freq_idx], t60_e[freq_idx], &result_e ); + move16(); t60_e[freq_idx] = result_e; - t60_e[freq_count] = max( result_e, t60_e[freq_count] ); + move16(); + t60_e[freq_count] = s_max( result_e, t60_e[freq_count] ); + move16(); } FOR( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) { - t60[freq_idx] = L_shr( t60[freq_idx], t60_e[freq_count] - t60_e[freq_idx] ); + t60[freq_idx] = L_shr( t60[freq_idx], sub( t60_e[freq_count], t60_e[freq_idx] ) ); + move32(); t60_e[freq_idx] = t60_e[freq_count]; + move16(); } } @@ -1224,6 +1256,7 @@ void ivas_reverb_calc_color_levels_fx( FOR( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) { t60[freq_idx] = Mpy_32_32( t60[freq_idx], L_shl( loop_count_inverted, 16 ) ); + move32(); } Word16 *pTarget_color_L_e = (Word16 *) malloc( 257 * sizeof( Word16 ) ); @@ -1232,8 +1265,8 @@ void ivas_reverb_calc_color_levels_fx( FOR( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) { Word16 temp, temp1, temp2, temp3 = 0, temp4, temp5; - move32(); - Word32 var1 = divide3232( (Word32) i_mult( -6, minDelay ), L_shr( Mpy_32_32( t60[freq_idx], L_shl( output_Fs, 11 ) ), 11 - t60_e[freq_idx] ) ); + move16(); + Word32 var1 = divide3232( (Word32) i_mult( -6, minDelay ), L_shr( Mpy_32_32( t60[freq_idx], L_shl( output_Fs, 11 ) ), sub( 11, t60_e[freq_idx] ) ) ); var1 = L_mult( (Word16) var1, LOG2_10 ); // q = 29 Word32 A0_square_est = BASOP_util_Pow2( var1, 31 - 29, &temp ); Word16 alpha_e; @@ -1250,6 +1283,7 @@ void ivas_reverb_calc_color_levels_fx( temp4 = 3; div2 = Sqrt32( Mpy_32_32( pAcoustic_dsr[freq_idx], pHrtf_avg_pwr_L[freq_idx] ), &temp4 ); pTarget_color_L[freq_idx] = (Word32) BASOP_Util_Divide3232_Scale( div2, div1, &temp5 ); + move32(); temp5 = add( temp5, sub( temp4, temp3 ) ); pTarget_color_L_e[freq_idx] = temp5; move16(); @@ -1260,6 +1294,7 @@ void ivas_reverb_calc_color_levels_fx( move16(); div2 = Sqrt32( Mpy_32_32( pAcoustic_dsr[freq_idx], pHrtf_avg_pwr_R[freq_idx] ), &temp4 ); pTarget_color_R[freq_idx] = BASOP_Util_Divide3232_Scale( div2, div1, &temp5 ); + move32(); temp5 = add( temp5, sub( temp4, temp3 ) ); pTarget_color_R_e[freq_idx] = temp5; move16(); @@ -1267,7 +1302,9 @@ void ivas_reverb_calc_color_levels_fx( FOR( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) { pTarget_color_R[freq_idx] = L_shr( L_shl( pTarget_color_R[freq_idx], 16 ), sub( 1, pTarget_color_R_e[freq_idx] ) ); // (31 - pTarget_color_R_e[freq_idx]) - 30 + move32(); pTarget_color_L[freq_idx] = L_shr( L_shl( pTarget_color_L[freq_idx], 16 ), sub( 1, pTarget_color_L_e[freq_idx] ) ); // (31 - pTarget_color_L_e[freq_idx]) - 30 + move32(); } /* Limiting the frequency response gradients Find frequency band closest to chosen pivot frequency. */ @@ -1276,7 +1313,7 @@ void ivas_reverb_calc_color_levels_fx( move16(); div1 = BASOP_Util_Divide3232_Scale( L_mult0( 1000, sub( freq_count, 1 ) ), L_shr( output_Fs, 1 ), &temp ); div1 = BASOP_Util_Add_Mant32Exp( L_shl( div1, 16 ), temp, ONE_IN_Q30, 1, &temp ); - idx_pivot = (Word16) L_shr( div1, sub( 31, temp ) ); + idx_pivot = extract_l( L_shr( div1, sub( 31, temp ) ) ); /* Perform step limiting */ response_step_limit_fx( pTarget_color_L, freq_count, RESPONSE_STEP_LIMIT_LF_FX, RESPONSE_STEP_LIMIT_HF_FX, idx_pivot ); @@ -1364,6 +1401,7 @@ void ivas_reverb_interpolate_acoustic_data_fx( Word32 rel_offset; Word16 rel_offset_e; input_idx = 0; + move16(); FOR( output_idx = 0; output_idx < output_table_size; output_idx++ ) { @@ -1393,11 +1431,12 @@ void ivas_reverb_interpolate_acoustic_data_fx( { WHILE( GT_32( pOutput_fc[output_idx], pInput_fc[input_idx + 1] ) ) { - input_idx++; + input_idx = add( input_idx, 1 ); } rel_offset = BASOP_Util_Divide3232_Scale( L_sub( pOutput_fc[output_idx], pInput_fc[input_idx] ), L_sub( pInput_fc[input_idx + 1], pInput_fc[input_idx] ), &rel_offset_e ); // q15 - rel_offset = L_shl_sat( rel_offset, 16 + rel_offset_e ); + rel_offset = L_shl_sat( rel_offset, add( 16, rel_offset_e ) ); rel_offset_e = 0; + move16(); } } Word32 mult1; @@ -1405,11 +1444,13 @@ void ivas_reverb_interpolate_acoustic_data_fx( move16(); mult1 = Mpy_32_32( rel_offset, L_sub( pInput_t60[input_idx + 1], pInput_t60[input_idx] ) ); pOutput_t60[output_idx] = BASOP_Util_Add_Mant32Exp( pInput_t60[input_idx], 5, mult1, add( 5, rel_offset_e ), &mult_e ); // 31 - (31 - rel_offset_e + 26 - 31) + move32(); pOutput_t60_e[output_idx] = mult_e; move16(); mult1 = Mpy_32_32( rel_offset, L_sub( pInput_dsr[input_idx + 1], pInput_dsr[input_idx] ) ); pOutput_dsr[output_idx] = BASOP_Util_Add_Mant32Exp( pInput_dsr[input_idx], 1, mult1, add( 1, rel_offset_e ), &mult_e ); // 31 - (31 - rel_offset_e + 26 - 31) + move32(); pOutput_dsr_e[output_idx] = mult_e; move16(); } @@ -1624,7 +1665,9 @@ void ivas_reverb_get_hrtf_set_properties_fx( Word32 avg_pwr_right[2]; Word32 IA_coherence[2]; - IF( input_audio_config == IVAS_AUDIO_CONFIG_FOA || input_audio_config == IVAS_AUDIO_CONFIG_HOA2 || input_audio_config == IVAS_AUDIO_CONFIG_HOA3 ) + test(); + test(); + IF( EQ_16( input_audio_config, IVAS_AUDIO_CONFIG_FOA ) || EQ_16( input_audio_config, IVAS_AUDIO_CONFIG_HOA2 ) || EQ_16( input_audio_config, IVAS_AUDIO_CONFIG_HOA3 ) ) { is_ambisonics = 1; move16(); @@ -1658,13 +1701,13 @@ void ivas_reverb_get_hrtf_set_properties_fx( move16(); // Word32 tbl_index = BASOP_Util_Divide3232_Scale(L_sub(norm_freq , L_shl(inp_freq_offset, 6)), L_shl(inp_freq_step, 6), &div_q);//q =15 - div_q Word32 tbl_index = Mpy_32_32( L_sub( norm_freq, L_shl( inp_freq_offset, 6 ) ), L_shl( in_freq_count, 22 ) ); // q = 11 - IF( LT_16( div_q, 0 ) ) + IF( div_q < 0 ) { tbl_index = L_shl( tbl_index, div_q ); div_q = 0; move16(); } - IF( LE_32( tbl_index, 0 ) ) /* In case of extrapolation (below 1st bin), choose nearest */ + IF( tbl_index <= 0 ) /* In case of extrapolation (below 1st bin), choose nearest */ { base_idx = 0; move32(); @@ -1730,16 +1773,24 @@ void ivas_reverb_get_hrtf_set_properties_fx( FOR( freq_idx = 0; freq_idx < 2; freq_idx++ ) { combined_channels_L_re[freq_idx] = 0; + move32(); combined_channels_R_re[freq_idx] = 0; + move32(); combined_channels_L_im[freq_idx] = 0; + move32(); combined_channels_R_im[freq_idx] = 0; + move32(); FOR( ch_index = 0; ch_index < 3; ch_index++ ) { combined_channels_L_re[freq_idx] = L_add( combined_channels_L_re[freq_idx], Mpy_32_16_1( ppHrtf_set_L_re[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); + move32(); combined_channels_R_re[freq_idx] = L_add( combined_channels_R_re[freq_idx], Mpy_32_16_1( ppHrtf_set_R_re[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); + move32(); combined_channels_L_im[freq_idx] = L_add( combined_channels_L_im[freq_idx], Mpy_32_16_1( ppHrtf_set_L_im[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); + move32(); combined_channels_R_im[freq_idx] = L_add( combined_channels_R_im[freq_idx], Mpy_32_16_1( ppHrtf_set_R_im[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); + move32(); } } @@ -1761,12 +1812,15 @@ void ivas_reverb_get_hrtf_set_properties_fx( move32(); move32(); move32(); - avg_pwr_left[freq_idx] = L_add( L_shr( L_add( Mpy_32_32( L_re, L_re ), Mpy_32_32( L_im, L_im ) ), 4 ), avg_pwr_left[freq_idx] ); // q = 23 + avg_pwr_left[freq_idx] = L_add( L_shr( L_add( Mpy_32_32( L_re, L_re ), Mpy_32_32( L_im, L_im ) ), 4 ), avg_pwr_left[freq_idx] ); // q = 23 + move32(); avg_pwr_right[freq_idx] = L_add( L_shr( L_add( Mpy_32_32( R_re, R_re ), Mpy_32_32( R_im, R_im ) ), 4 ), avg_pwr_right[freq_idx] ); // q = 23 + move32(); /* Cross product (Re part) */ C_re = L_add( Mpy_32_32( L_re, R_re ), Mpy_32_32( L_im, R_im ) ); // q = 27 IA_coherence[freq_idx] = L_add( C_re, IA_coherence[freq_idx] ); // q = 27 + move32(); } } @@ -1774,9 +1828,12 @@ void ivas_reverb_get_hrtf_set_properties_fx( FOR( freq_idx = 0; freq_idx < 2; freq_idx++ ) { Word16 sqrt_exp = 0; + move16(); Word32 var1; - avg_pwr_left[freq_idx] = Mpy_32_16_1( avg_pwr_left[freq_idx], hrtf_count_inverted ); // q = 23 + avg_pwr_left[freq_idx] = Mpy_32_16_1( avg_pwr_left[freq_idx], hrtf_count_inverted ); // q = 23 + move32(); avg_pwr_right[freq_idx] = Mpy_32_16_1( avg_pwr_right[freq_idx], hrtf_count_inverted ); // q = 23 + move32(); IF( EQ_32( avg_pwr_left[freq_idx], avg_pwr_right[freq_idx] ) ) { var1 = avg_pwr_left[freq_idx]; @@ -1791,18 +1848,25 @@ void ivas_reverb_get_hrtf_set_properties_fx( } Word16 temp; IA_coherence[freq_idx] = BASOP_Util_Divide3232_Scale( Mpy_32_16_1( IA_coherence[freq_idx], hrtf_count_inverted ), L_shl( var1, sqrt_exp ), &temp ); // q =15 - IA_coherence[freq_idx] = L_shl( IA_coherence[freq_idx], 27 - ( 15 - temp ) ); // q = 27 + move32(); + IA_coherence[freq_idx] = L_shl( IA_coherence[freq_idx], sub( 27, sub( 15, temp ) ) ); // q = 27 + move32(); /* Limiting to (0...1) range in case of small numerical errors or negative values */ IA_coherence[freq_idx] = min( IA_coherence[freq_idx], ONE_IN_Q27 ); + move32(); IA_coherence[freq_idx] = max( IA_coherence[freq_idx], 0 ); + move32(); } /* Computing weighted average of 2 nearest values (1 below + 1 above) for linear interpolation */ weight_1st = L_sub( ONE_IN_Q31, relative_pos ); // q = 31 - pOut_avg_pwr_L[out_bin_idx] = L_add( Mpy_32_32( weight_1st, avg_pwr_left[0] ), Mpy_32_32( relative_pos, avg_pwr_left[1] ) ); // q = 23 - pOut_avg_pwr_R[out_bin_idx] = L_add( Mpy_32_32( weight_1st, avg_pwr_right[0] ), Mpy_32_32( relative_pos, avg_pwr_right[1] ) ); // q = 23 + pOut_avg_pwr_L[out_bin_idx] = L_add( Mpy_32_32( weight_1st, avg_pwr_left[0] ), Mpy_32_32( relative_pos, avg_pwr_left[1] ) ); // q = 23 + move32(); + pOut_avg_pwr_R[out_bin_idx] = L_add( Mpy_32_32( weight_1st, avg_pwr_right[0] ), Mpy_32_32( relative_pos, avg_pwr_right[1] ) ); // q = 23 + move32(); out_i_a_coherence[out_bin_idx] = L_add( Mpy_32_32( weight_1st, IA_coherence[0] ), Mpy_32_32( relative_pos, IA_coherence[1] ) ); // q = 27 + move32(); } return; -- GitLab From 5197fa06a7c1f20fe323f4957b0c0162e930d28f Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 28 Jun 2024 13:24:12 +0530 Subject: [PATCH 011/110] Clang formatting changes --- lib_dec/ivas_stereo_dft_dec_dmx.c | 10 +++++----- lib_dec/ivas_stereo_dft_plc_fx.c | 18 +++++++++--------- lib_dec/ivas_stereo_ica_dec.c | 4 ++-- lib_dec/ivas_stereo_mdct_core_dec_fx.c | 8 ++++---- lib_rend/ivas_reverb.c | 6 +++--- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/lib_dec/ivas_stereo_dft_dec_dmx.c b/lib_dec/ivas_stereo_dft_dec_dmx.c index 0992568b5..7250baa6b 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx.c @@ -295,13 +295,13 @@ void stereo_dft_unify_dmx_fx( Word16 exp_sum_abs = exp_sum_nrg_l; move16(); - if( GT_16( exp_sum_nrg_R, exp_sum_nrg_l ) ) + if ( GT_16( exp_sum_nrg_R, exp_sum_nrg_l ) ) { exp_sum_abs = exp_sum_nrg_R; move16(); } exp_sum_abs = add( exp_sum_abs, 1 ); - sum_abs = L_add( L_shr( tmp_nrg_L, sub(exp_sum_abs , exp_sum_nrg_l) ), L_shr( tmp_nrg_R, sub( exp_sum_abs, exp_sum_nrg_R ) ) ); + sum_abs = L_add( L_shr( tmp_nrg_L, sub( exp_sum_abs, exp_sum_nrg_l ) ), L_shr( tmp_nrg_R, sub( exp_sum_abs, exp_sum_nrg_R ) ) ); dot_prod_abs = Sqrt32( L_add( Mpy_32_32( dot_prod_real_32, dot_prod_real_32 ), Mpy_32_32( dot_prod_img_32, dot_prod_img_32 ) ), &exp_dot_prod_abs ); Word32 num = L_add( L_shr( L_add( sum_nrg_L_32, sum_nrg_R_32 ), 1 ), L_shr( dot_prod_abs, sub( sub( 31, exp_dot_prod_abs ), q_sum_nrg_L ) ) ); Word16 E_num = sub( 31, q_sum_nrg_L ); @@ -309,7 +309,7 @@ void stereo_dft_unify_dmx_fx( Word16 exp_wR = exp_sum_abs; move16(); - if( LT_16( exp_sum_abs, E_num ) ) + if ( LT_16( exp_sum_abs, E_num ) ) { exp_wR = E_num; move16(); @@ -329,14 +329,14 @@ void stereo_dft_unify_dmx_fx( } ELSE { - wR_temp = shr( divide3232( L_shr( num_sqrt, sub(exp_wR , E_num) ), L_shr( sum_abs, sub(exp_wR , exp_sum_abs) ) ), 2 ); + wR_temp = shr( divide3232( L_shr( num_sqrt, sub( exp_wR, E_num ) ), L_shr( sum_abs, sub( exp_wR, exp_sum_abs ) ) ), 2 ); } Word32 sum_nrg_Mid_sqrt = Sqrt32( sum_nrg_Mid, &exp_sum_nrg_Mid ); Word16 exp_wL = exp_sum_abs; move16(); - if( LT_16( exp_sum_abs, exp_sum_nrg_Mid ) ) + if ( LT_16( exp_sum_abs, exp_sum_nrg_Mid ) ) { exp_wL = exp_sum_nrg_Mid; move16(); diff --git a/lib_dec/ivas_stereo_dft_plc_fx.c b/lib_dec/ivas_stereo_dft_plc_fx.c index 22d89ea8d..5abf182fe 100644 --- a/lib_dec/ivas_stereo_dft_plc_fx.c +++ b/lib_dec/ivas_stereo_dft_plc_fx.c @@ -111,12 +111,12 @@ void stereo_dft_res_ecu_fx( move16(); FOR( i = 0; i < STEREO_DFT32MS_N_8k / 4; i++ ) { - trigo_dec[i] = hStereoDft->dft_trigo_8k_fx[i_mult(i , trigo_step)]; + trigo_dec[i] = hStereoDft->dft_trigo_8k_fx[i_mult( i, trigo_step )]; move16(); - trigo_dec[STEREO_DFT32MS_N_8k / 2 - i] = hStereoDft->dft_trigo_8k_fx[i_mult(i , trigo_step)]; + trigo_dec[STEREO_DFT32MS_N_8k / 2 - i] = hStereoDft->dft_trigo_8k_fx[i_mult( i, trigo_step )]; move16(); } - trigo_dec[STEREO_DFT32MS_N_8k / 4] = hStereoDft->dft_trigo_8k_fx[i_mult(STEREO_DFT32MS_N_8k / 4 , trigo_step)]; + trigo_dec[STEREO_DFT32MS_N_8k / 4] = hStereoDft->dft_trigo_8k_fx[i_mult( STEREO_DFT32MS_N_8k / 4, trigo_step )]; move16(); /* estimation of res_cod_mem (ola part in imdct residual signal) and input_mem (memory for buffer in DFT analysis)*/ @@ -312,7 +312,7 @@ static void ivas_peakfinder_fx( move32(); ind[k] = 0; move16(); - k = add(k, 1); + k = add( k, 1 ); } FOR( i = 1; i < sub( len0, 1 ); i++ ) @@ -435,7 +435,7 @@ static void ivas_peakfinder_fx( move32(); } - ii = add(ii,1); /* Move onto the valley */ + ii = add( ii, 1 ); /* Move onto the valley */ /* Come down at least sel from peak */ test(); @@ -449,8 +449,8 @@ static void ivas_peakfinder_fx( move16(); peakMag[*cInd] = tempMag; move32(); - ( *cInd ) = add(*(cInd),1); - move16(); + ( *cInd ) = add( *( cInd ), 1 ); + move16(); } ELSE IF( LT_32( x[ii], leftMin ) ) /* New left minimum */ { @@ -582,7 +582,7 @@ void stereo_dft_res_subst_spec_fx( FOR( i = 1; i < L_res; i++ ) { Word32 r = L_shl( p_mem[2 * i], q_res ); - Word32 l = L_shl( p_mem[add(shl(i,1), 1)], q_res ); + Word32 l = L_shl( p_mem[add( shl( i, 1 ), 1 )], q_res ); abs_res[i] = Madd_32_32( Mpy_32_32( r, r ), l, l ); move32(); } @@ -694,7 +694,7 @@ void stereo_dft_res_subst_spec_fx( cos_F = shl_o( getCosWord16( extract_l( corr_phase ) ), 1, &flg_ov ); sin_F = getSinWord16( extract_l( corr_phase ) ); - idx = s_max( 0, sub(plocs[i] , Np) ); /* Iterate over plocs[i]-1:plocs[i]+1, considering the edges of the spectrum */ + idx = s_max( 0, sub( plocs[i], Np ) ); /* Iterate over plocs[i]-1:plocs[i]+1, considering the edges of the spectrum */ WHILE( ( idx < add( add( plocs[i], Np ), 1 ) ) && LT_16( idx, L_res ) ) { pDFT_RES[2 * idx] = Msub_32_16( Mpy_32_16_1( p_mem[2 * idx], cos_F ), p_mem[add( shl( idx, 1 ), 1 )], sin_F ); diff --git a/lib_dec/ivas_stereo_ica_dec.c b/lib_dec/ivas_stereo_ica_dec.c index 741a5f947..62bbbcdda 100644 --- a/lib_dec/ivas_stereo_ica_dec.c +++ b/lib_dec/ivas_stereo_ica_dec.c @@ -694,7 +694,7 @@ void stereo_tca_scale_R_channel_fx( Word16 temp_a_q = 2; move16(); tempF1_fx = Inv16( temp_a, &temp_a_q ); - tempF1_fx = L_shl( tempF1_fx, sub(( 31 - 4 ) , sub( 15 , temp_a_q )) ); + tempF1_fx = L_shl( tempF1_fx, sub( ( 31 - 4 ), sub( 15, temp_a_q ) ) ); } @@ -709,7 +709,7 @@ void stereo_tca_scale_R_channel_fx( Word16 temp_b_q = 2; move16(); tempF_fx = Inv16( temp_b, &temp_b_q ); - tempF_fx = L_shl( tempF_fx, sub(( 31 - 4 ) , sub( 15 , temp_b_q )) ); + tempF_fx = L_shl( tempF_fx, sub( ( 31 - 4 ), sub( 15, temp_b_q ) ) ); } } SWITCH( output_Fs ) diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 3fd7ff35f..88b25b872 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -82,7 +82,7 @@ static void stereo_mdct_dec_stereo_fx( sts[0]->bits_frame_channel = add( sts[0]->bits_frame_channel, i_mult( sts[0]->core, SMDCT_MINIMUM_ARITH_BITS ) ); sts[1]->bits_frame_channel = add( sts[1]->bits_frame_channel, i_mult( sts[1]->core, SMDCT_MINIMUM_ARITH_BITS ) ); - sts[1]->bit_stream = &sts[0]->bit_stream[add(add(sts[0]->next_bit_pos , sts[0]->bits_frame_channel) , i_mult(sts[0]->core , NF_GAIN_BITS))]; + sts[1]->bit_stream = &sts[0]->bit_stream[add( add( sts[0]->next_bit_pos, sts[0]->bits_frame_channel ), i_mult( sts[0]->core, NF_GAIN_BITS ) )]; return; } @@ -820,7 +820,7 @@ static void apply_dmx_weights_fx( { /* subframe is TCX5, but TCX10 or TCX20 in other channel -> convert channel with TCX5 to TCX10 resolution */ pTmp[ch][k] = sig[ch][k] = convertRes[ch] + i_mult( k, shr( frameSize, 1 ) ); - convert_coeffs_to_higher_res_fx( x[ch][k], x[ch][k] + shr(frameSize ,2), pTmp[ch][k], shr( frameSize, 2 ) ); + convert_coeffs_to_higher_res_fx( x[ch][k], x[ch][k] + shr( frameSize, 2 ), pTmp[ch][k], shr( frameSize, 2 ) ); } } @@ -841,7 +841,7 @@ static void apply_dmx_weights_fx( FOR( l = 0; l < nsub2[k]; l++ ) { // mdst[ch][k][l * numCoeffs[k]] = mdst[ch][k][( l + 1 ) * numCoeffs[k] - 1] = 0.f; - mdst[ch][k][i_mult(l , numCoeffs[k])] = mdst[ch][k][sub(i_mult(add( l , 1 ) , numCoeffs[k]) , 1)] = 0; + mdst[ch][k][i_mult( l, numCoeffs[k] )] = mdst[ch][k][sub( i_mult( add( l, 1 ), numCoeffs[k] ), 1 )] = 0; move32(); move32(); FOR( i = l * numCoeffs[k] + 1; i < ( l + 1 ) * numCoeffs[k] - 1; i++ ) @@ -1164,7 +1164,7 @@ static void run_min_stats_fx( FOR( Word16 i = 1; i < L_FRAME16k - 1; i++ ) { Word32 mdst; - mdst = L_sub( spec_in[i + 1], spec_in[i - 1] ); /* Q31 - x_e */ + mdst = L_sub( spec_in[i + 1], spec_in[i - 1] ); /* Q31 - x_e */ power_spec[i] = L_add( W_extract_h( W_shl( W_mult_32_32( spec_in[i], spec_in[i] ), sub( tmp16, 4 ) ) ), W_extract_h( W_shl( W_mult_32_32( mdst, mdst ), sub( tmp16, 4 ) ) ) ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31*/ move32(); } diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index e270cf1e9..127dd8326 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -2452,7 +2452,7 @@ ivas_error ivas_reverb_open_fx( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Reverberator " ); } - IF( NE_32(( error = set_base_config_fx( ¶ms, output_Fs ) ) , IVAS_ERR_OK) ) + IF( NE_32( ( error = set_base_config_fx( ¶ms, output_Fs ) ), IVAS_ERR_OK ) ) { return error; } @@ -2543,7 +2543,7 @@ ivas_error ivas_reverb_open_fx( /* set up jot reverb 60 filters - must be set up after set_reverb_acoustic_data() */ - IF( NE_32(( error = compute_t60_coeffs_fx( ¶ms, nr_fc_fft_filter, output_Fs ) ) , IVAS_ERR_OK) ) + IF( NE_32( ( error = compute_t60_coeffs_fx( ¶ms, nr_fc_fft_filter, output_Fs ) ), IVAS_ERR_OK ) ) { return error; } @@ -2591,7 +2591,7 @@ ivas_error ivas_reverb_open_fx( move16(); /* clear & init jot reverb fft filters */ - IF( NE_32(( error = initialize_reverb_filters_fx( pState ) ) , IVAS_ERR_OK) ) + IF( NE_32( ( error = initialize_reverb_filters_fx( pState ) ), IVAS_ERR_OK ) ) { return error; } -- GitLab From 5f41b03baa9016d627971c1c93eb561a719b1907 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 28 Jun 2024 13:47:31 +0530 Subject: [PATCH 012/110] Encoder related ivas_tools functions converted to fxd and integrated --- lib_com/ivas_prot.h | 15 + lib_com/ivas_tools.c | 53 +++ lib_enc/ivas_stereo_ica_enc.c | 292 ++++++++++++++ lib_enc/rom_enc.c | 17 + lib_enc/rom_enc.h | 6 + lib_enc/speech_music_classif.c | 704 +++++++++++++++++++++++++++++++++ 6 files changed, 1087 insertions(+) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 363237d9c..99dff9b37 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3459,6 +3459,13 @@ float sumAbs( const int16_t lvec /* i : length of input vector */ ); +#ifdef IVAS_FLOAT_FIXED +Word32 sumAbs_fx( + const Word32 *vec, /* i : input vector */ + const Word16 lvec /* i : length of input vector */ +); +#endif + void mvc2c( const uint8_t x[], /* i : input vector */ uint8_t y[], /* o : output vector */ @@ -3472,6 +3479,14 @@ float dot_product_cholesky( const int16_t N /* i : vector & matrix size */ ); +#ifdef IVAS_FLOAT_FIXED +Word32 dot_product_cholesky_fx( + const Word32 *x, /* i : vector x */ + const Word32 *A, /* i : Cholesky matrix A */ + const Word16 N /* i : vector & matrix size */ +); +#endif + #ifdef IVAS_FLOAT_FIXED void v_mult_mat_fx( Word32 *y_fx, /* o : the product x*A */ diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index dfc98c90d..39de3240e 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -76,6 +76,26 @@ float sumAbs( return tmp; } +#ifdef IVAS_FLOAT_FIXED +Word32 sumAbs_fx( + const Word32 *vec, /* i : input vector */ + const Word16 lvec /* i : length of input vector */ +) +{ + Word16 i; + Word32 tmp; + + tmp = 0; + move32(); + FOR( i = 0; i < lvec; i++ ) + { + tmp = L_add( tmp, L_abs( vec[i] ) ); + } + + return tmp; +} +#endif + /*---------------------------------------------------------------------* * mvc2c() * @@ -893,6 +913,39 @@ float dot_product_cholesky( return suma; } +#ifdef IVAS_FLOAT_FIXED +Word32 dot_product_cholesky_fx( + const Word32 *x, /* i : vector x */ + const Word32 *A, /* i : Cholesky matrix A */ + const Word16 N /* i : vector & matrix size */ +) +{ + Word16 i, j; + Word32 suma, tmp_sum; + const Word32 *pt_x, *pt_A; + + pt_A = A; + suma = 0; + move32(); + + FOR( i = 0; i < N; i++ ) + { + tmp_sum = 0; + move32(); + pt_x = x; + FOR( j = 0; j <= i; j++ ) + { + tmp_sum = L_add( tmp_sum, Mpy_32_32( *pt_x++, *pt_A++ ) ); + } + + suma = L_add( suma, Mpy_32_32( tmp_sum, tmp_sum ) ); + } + + return suma; +} + +#endif + #ifdef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * v_mult_mat_fx() diff --git a/lib_enc/ivas_stereo_ica_enc.c b/lib_enc/ivas_stereo_ica_enc.c index 428489882..dc9fdc301 100644 --- a/lib_enc/ivas_stereo_ica_enc.c +++ b/lib_enc/ivas_stereo_ica_enc.c @@ -42,6 +42,7 @@ #include "rom_com.h" #include "ivas_rom_com.h" #include "prot_fx1.h" +#include "prot_fx2.h" /*--------------------------------------------------------------- * Local function prototypes @@ -371,6 +372,7 @@ static void utilCrossCorr( * Non-causal shift estimation to encode future samples. * ---------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED static void corrStatsEst( STEREO_TCA_ENC_HANDLE hStereoTCA, /* i/o: Stereo TCA Encoder handle */ const float *buf1, /* i : channel 1 */ @@ -431,8 +433,31 @@ static void corrStatsEst( } mvr2r( corrEst, hStereoTCA->corrEstPrev[2], tempLen ); +#ifdef IVAS_FLOAT_FIXED + Word32 buf1_fx[160]; + Word32 buf2_fx[160]; + Word16 buf1_q, buf2_q, guard_bits; + Word32 temp_A_fx, temp_B_fx; + f2me_buf( buf1, buf1_fx, &buf1_q, 160 ); + f2me_buf( buf2, buf2_fx, &buf2_q, 160 ); + buf1_q = sub( 31, buf1_q ); + buf2_q = sub( 31, buf2_q ); + Word16 buf_q = s_min( buf1_q, buf2_q ); + guard_bits = find_guarded_bits_fx( 160 ); + scale_sig32( buf1_fx, 160, sub( sub( buf_q, guard_bits ), buf1_q ) ); + scale_sig32( buf2_fx, 160, sub( sub( buf_q, guard_bits ), buf2_q ) ); + buf_q = sub( buf_q, guard_bits ); +#endif + +#ifdef IVAS_FLOAT_FIXED + temp_A_fx = sumAbs_fx( buf1_fx, L_FRAME_DS - L_XCORRMEM_DS ) + sumAbs_fx( buf2_fx, L_FRAME_DS - L_XCORRMEM_DS ); + temp_B_fx = sumAbs_fx( buf1_fx + ( L_FRAME_DS - L_XCORRMEM_DS ), L_XCORRMEM_DS ) + sumAbs_fx( buf2_fx + ( L_FRAME_DS - L_XCORRMEM_DS ), L_XCORRMEM_DS ); + temp_A = fixedToFloat( temp_A_fx, buf_q ); + temp_B = fixedToFloat( temp_B_fx, buf_q ); +#else temp_A = sumAbs( buf1, L_FRAME_DS - L_XCORRMEM_DS ) + sumAbs( buf2, L_FRAME_DS - L_XCORRMEM_DS ); temp_B = sumAbs( buf1 + ( L_FRAME_DS - L_XCORRMEM_DS ), L_XCORRMEM_DS ) + sumAbs( buf2 + ( L_FRAME_DS - L_XCORRMEM_DS ), L_XCORRMEM_DS ); +#endif tempF = temp_A + temp_B + hStereoTCA->mem_tempF; hStereoTCA->mem_tempF = temp_B; @@ -637,7 +662,274 @@ static void corrStatsEst( return; } +#else +static void corrStatsEst( + STEREO_TCA_ENC_HANDLE hStereoTCA, /* i/o: Stereo TCA Encoder handle */ + const float *buf1, /* i : channel 1 */ + const float *buf2, /* i : channel 2 */ + const int16_t bufLenDS, /* i : buffer length */ + const int16_t dsFactor, /* i : buffer length */ + const int16_t vad_flag1, /* i : VAD flag channel 1 */ + const int16_t vad_flag2, /* i : VAD flag channel 2 */ + STEREO_CLASSIF_HANDLE hStereoClassif /* i/o: stereo classifier handle */ +) +{ + int16_t lagSearchRange[2]; + float corrEst[2 * L_NCSHIFT_DS + 1]; + int16_t corrLagStats[3]; + float *tempRK; + const float *winInterp; + float rInterp[MAX_INTERPOLATE]; + int16_t interpMin, interpMax, interpLen; + int16_t i, j, k, m; + float tempF, alpha; + float win_bias; + int16_t tempLen, win_width; + float loc_weight_win[4 * L_NCSHIFT_DS + 1]; + float X_hat, Y_hat, XY_hat, X_SQR_hat; + float alpha_reg, beta_reg, reg_prv_corr, dist_reg_prv_corr, bias_par, width_par; + float k1, k2, temp_A, temp_B; + int16_t stmp; + float corrEst_ncorr; + + /* init of regression parameters*/ + X_hat = 0; + X_SQR_hat = 0; + XY_hat = 0; + /* Initializations */ + alpha = 0.7f; + lagSearchRange[0] = -L_NCSHIFT_DS; + lagSearchRange[1] = L_NCSHIFT_DS; + tempLen = ( 2 * L_NCSHIFT_DS + 1 ); + + set_s( corrLagStats, 0, 3 ); + + /* First iteration of xcorr estimation */ + utilCrossCorr_mod( hStereoTCA, buf1, buf2, corrEst, lagSearchRange, bufLenDS - L_XCORRMEM_DS ); + + /* calculate features for the UNCLR classifier */ + unclr_calc_corr_features( hStereoClassif, hStereoTCA, buf1, buf2, bufLenDS - L_XCORRMEM_DS, corrEst, lagSearchRange, &corrEst_ncorr ); + + for ( i = 1; i < 3; i++ ) + { + v_add( hStereoTCA->corrEstPrev[i], hStereoTCA->corrEstPrev[0], hStereoTCA->corrEstPrev[0], tempLen ); + } + + /* back up the corrEst */ + for ( i = 0; i < 2; i++ ) + { + mvr2r( hStereoTCA->corrEstPrev[i + 1], hStereoTCA->corrEstPrev[i], tempLen ); + } + mvr2r( corrEst, hStereoTCA->corrEstPrev[2], tempLen ); + + temp_A = sumAbs( buf1, L_FRAME_DS - L_XCORRMEM_DS ) + sumAbs( buf2, L_FRAME_DS - L_XCORRMEM_DS ); + temp_B = sumAbs( buf1 + ( L_FRAME_DS - L_XCORRMEM_DS ), L_XCORRMEM_DS ) + sumAbs( buf2 + ( L_FRAME_DS - L_XCORRMEM_DS ), L_XCORRMEM_DS ); + tempF = temp_A + temp_B + hStereoTCA->mem_tempF; + hStereoTCA->mem_tempF = temp_B; + + alpha = 0.93f; + if ( tempF > 4.0f * hStereoTCA->ica_envVarLT ) + { + alpha = 0.83f; + } + else if ( tempF > 2.0f * hStereoTCA->ica_envVarLT ) + { + alpha = 0.85f; + } + else if ( tempF > hStereoTCA->ica_envVarLT ) + { + alpha = 0.90f; + } + + hStereoTCA->corrStatsSmoothFac = alpha; + + /* long term corr Stats estimation */ + v_multc( hStereoTCA->corrEstLT, alpha, hStereoTCA->corrEstLT, 2 * L_NCSHIFT_DS + 1 ); + v_multc( corrEst, 1.0f - alpha, corrEst, 2 * L_NCSHIFT_DS + 1 ); + v_add( hStereoTCA->corrEstLT, corrEst, hStereoTCA->corrEstLT, 2 * L_NCSHIFT_DS + 1 ); + + hStereoTCA->ica_envVarLT = SMOOTH_ENV_FACTOR * hStereoTCA->ica_envVarLT + ( 1 - SMOOTH_ENV_FACTOR ) * tempF; + + mvr2r( hStereoTCA->corrEstLT, corrEst, 2 * L_NCSHIFT_DS + 1 ); + Y_hat = hStereoTCA->delay_0_mem[0]; + /* Note: keep X_hat and X_SQR_hat calculations inside the loop to allow future tuning of MAX_DELAYREGLEN */ + for ( i = 1; i < MAX_DELAYREGLEN; i++ ) + { + X_hat += (float) i; + Y_hat += hStereoTCA->delay_0_mem[i]; + XY_hat += i * hStereoTCA->delay_0_mem[i]; + X_SQR_hat += (float) ( i * i ); + } + X_hat *= INV_MAX_DELAYREGLEN; + Y_hat *= INV_MAX_DELAYREGLEN; + XY_hat *= INV_MAX_DELAYREGLEN; + X_SQR_hat *= INV_MAX_DELAYREGLEN; + + beta_reg = 0; + tempF = X_SQR_hat - ( X_hat * X_hat ); + if ( tempF != 0 ) + { + beta_reg = ( XY_hat - X_hat * Y_hat ) / tempF; + } + alpha_reg = ( Y_hat - beta_reg * X_hat ); + reg_prv_corr = beta_reg * MAX_DELAYREGLEN + alpha_reg; + + if ( TRUNC( reg_prv_corr ) <= -L_NCSHIFT_DS ) + { + reg_prv_corr = -L_NCSHIFT_DS + 1; + } + + if ( TRUNC( reg_prv_corr ) >= L_NCSHIFT_DS ) + { + reg_prv_corr = L_NCSHIFT_DS - 1; + } + + bias_par = A_BIAS * hStereoTCA->smooth_dist_reg_prv_corr + B_BIAS; + bias_par = min( bias_par, XH_BIAS ); + bias_par = max( bias_par, XL_BIAS ); + + width_par = A_WIDTH * hStereoTCA->smooth_dist_reg_prv_corr + B_WIDTH; + width_par = min( width_par, XH_WIDTH ); + width_par = max( width_par, XL_WIDTH ); + + win_width = (int16_t) ( width_par * ( 4 * L_NCSHIFT_DS + 1 ) ); + win_bias = bias_par; + k1 = 0.5f * ( 1.0f + win_bias ); + k2 = 0.5f * ( 1.0f - win_bias ); + + for ( i = 0; i < ( 2 * L_NCSHIFT_DS - 2 * win_width ); i++ ) + { + loc_weight_win[i] = win_bias; + } + + for ( i = ( 2 * L_NCSHIFT_DS - 2 * win_width ); i <= ( 2 * L_NCSHIFT_DS + 2 * win_width ); i++ ) + { + loc_weight_win[i] = k1 + k2 * cosf( EVS_PI * ( ( i - 2 * L_NCSHIFT_DS ) / ( 2.0f * win_width ) ) ); + } + + for ( i = ( 2 * L_NCSHIFT_DS + 2 * win_width ); i < ( 4 * L_NCSHIFT_DS + 1 ); i++ ) + { + loc_weight_win[i] = win_bias; + } + + for ( i = 0, j = L_NCSHIFT_DS - TRUNC( reg_prv_corr ); i < 2 * L_NCSHIFT_DS + 1; i++, j++ ) + { + corrEst[i] *= loc_weight_win[j]; + } + + if ( hStereoTCA->prevTargetGain < 0.8f && vad_flag1 ) + { + /* ch 2 is prev reference channel */ + v_multc( corrEst, 1.2f, corrEst, L_NCSHIFT_DS + 1 ); + v_multc( corrEst + L_NCSHIFT_DS + 1, 0.833f, corrEst + L_NCSHIFT_DS + 1, L_NCSHIFT_DS ); + } + else if ( hStereoTCA->prevTargetGain > 1.2f && vad_flag1 ) + { + /* ch 1 is prev reference channel */ + v_multc( corrEst, 0.833f, corrEst, L_NCSHIFT_DS ); + v_multc( corrEst + L_NCSHIFT_DS, 1.2f, corrEst + L_NCSHIFT_DS, L_NCSHIFT_DS + 1 ); + } + + if ( corrEst_ncorr > 0.8f && vad_flag1 ) + { + i = max( 0, hStereoTCA->prevCorrLagStats[0] - 1 + L_NCSHIFT_DS ); + j = min( 2 * L_NCSHIFT_DS, hStereoTCA->prevCorrLagStats[0] + 1 + L_NCSHIFT_DS ); + k = j - i + 1; + v_multc( corrEst + i, 1.2f, corrEst + i, k ); + } + + /* Initial corr lag estimate */ + corrLagStats[0] = maximum( corrEst, ( lagSearchRange[1] - lagSearchRange[0] + 1 ), &tempF ); + corrLagStats[0] += lagSearchRange[0]; + + stmp = corrLagStats[0] * dsFactor; + hStereoClassif->unclr_fv[E_corrLagStats0] = (float) stmp; + hStereoClassif->xtalk_fv[E_corrLagStats0] = (float) stmp; + hStereoClassif->xtalk_fv[E_ica_corr_value0] = tempF; + + if ( vad_flag1 == 0 && alpha > 0.7f ) + { + corrLagStats[0] = 0; + } + + dist_reg_prv_corr = fabsf( reg_prv_corr - corrLagStats[0] ); + + if ( vad_flag1 == 1 && vad_flag2 == 1 ) + { + hStereoTCA->smooth_dist_reg_prv_corr = SMOOTH_DIST_FACTOR * hStereoTCA->smooth_dist_reg_prv_corr + ( 1.0f - SMOOTH_DIST_FACTOR ) * dist_reg_prv_corr; + + mvr2r( &( hStereoTCA->delay_0_mem[1] ), &( hStereoTCA->delay_0_mem[0] ), MAX_DELAYREGLEN - 1 ); + + hStereoTCA->delay_0_mem[MAX_DELAYREGLEN - 1] = 0.2f * hStereoTCA->delay_0_mem[MAX_DELAYREGLEN - 1] + 0.8f * corrLagStats[0]; + + if ( fabsf( reg_prv_corr - hStereoTCA->delay_0_mem[0] ) > 25 ) + { + set_f( &( hStereoTCA->delay_0_mem[0] ), hStereoTCA->delay_0_mem[MAX_DELAYREGLEN - 1], MAX_DELAYREGLEN - 1 ); + } + } + else + { + hStereoTCA->smooth_dist_reg_prv_corr = 0.; + } + + if ( vad_flag1 == 0 || vad_flag2 == 0 ) + { + corrLagStats[0] = TRUNC( hStereoTCA->delay_0_mem[MAX_DELAYREGLEN - 1] ); + } + + /* second iteration of xcorr update @ inputFs with interp*/ + tempRK = hStereoTCA->corrEstLT - lagSearchRange[0] + corrLagStats[0]; + set_f( rInterp, 0, MAX_INTERPOLATE ); + + /* select the Rk interp sinc window */ + winInterp = ica_sincInterp4 + SINC_ORDER1; + if ( dsFactor == 2 ) + { + winInterp = ica_sincInterp2 + SINC_ORDER1; + } + else if ( dsFactor == 6 ) + { + winInterp = ica_sincInterp6 + SINC_ORDER1; + } + + corrLagStats[1] = corrLagStats[0] * dsFactor; + + interpMin = max( -( dsFactor - 1 ), -corrLagStats[1] - L_NCSHIFT_DS * dsFactor ); + interpMax = min( ( dsFactor - 1 ), L_NCSHIFT_DS * dsFactor - corrLagStats[1] ); + interpLen = interpMax - interpMin + 1; + + for ( i = interpMin, k = 0; i <= interpMax; i++, k++ ) + { + rInterp[k] = 0.0f; + for ( j = -SINC_ORDER1 / dsFactor; j <= SINC_ORDER1 / dsFactor; j++ ) + { + m = j * dsFactor; + if ( ( m - i >= -SINC_ORDER1 ) && ( m - i <= SINC_ORDER1 ) ) + { + if ( j > lagSearchRange[1] - corrLagStats[0] ) + { + rInterp[k] += winInterp[m - i] * tempRK[lagSearchRange[1] - corrLagStats[0]]; + } + else if ( j < lagSearchRange[0] - corrLagStats[0] ) + { + rInterp[k] += winInterp[m - i] * tempRK[lagSearchRange[0] - corrLagStats[0]]; + } + else + { + rInterp[k] += winInterp[m - i] * tempRK[j]; + } + } + } + } + corrLagStats[1] += ( maximum( rInterp, interpLen, &tempF ) + interpMin ); + + /* save corr lag stats for the current frame */ + mvs2s( corrLagStats, hStereoTCA->corrLagStats, 3 ); + + return; +} +#endif /*--------------------------------------------------------------- * Function estDownmixGain() diff --git a/lib_enc/rom_enc.c b/lib_enc/rom_enc.c index dea73a1af..9b4d998d6 100644 --- a/lib_enc/rom_enc.c +++ b/lib_enc/rom_enc.c @@ -486,6 +486,10 @@ const float prec_chol_speech[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_COEF) 0.621627f, 0.011114f, 0.981192f, -0.253924f, -0.028998f, 0.716900f, -0.000541f, -0.058620f, -0.133470f, 1.285166f, 0.023501f, -0.107565f, 0.003875f, 0.521398f, 0.938485f, -0.274409f, -0.864538f, 0.475578f, 1.350173f, 0.704398f, 1.977759f, -0.009563f, -0.180193f, -0.152311f, 0.308965f, 0.476963f, 0.235046f, 1.431437f, 0.203638f, -1.193943f, -0.776895f, 2.853604f, 1.384001f, 2.607643f, 0.210453f, 4.753994f, -0.318441f, -0.641232f, 0.681624f, 0.064183f, 0.062136f, 0.491965f, 0.078715f, -1.190437f, 2.299521f, 0.279093f, -0.531432f, 0.056751f, 0.908371f, 0.596757f, 1.108720f, 0.554711f, 1.171101f, -0.006235f, 2.159307f, 0.175362f, -0.505673f, 0.166484f, 0.362916f, 0.227361f, 0.587717f, 0.301477f, 0.363320f, 0.233596f, 0.708472f, 2.246567f, -0.273318f, 0.112575f, -0.014105f, -0.074279f, -0.077574f, -0.191145f, -0.280995f, 0.338633f, 0.068418f, -1.464972f, -0.873218f, 2.629376f, }; +#ifdef IVAS_FLOAT_FIXED +const Word32 prec_chol_speech_fx[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_COEF) / 2] = { 232432352, -59879628, 304533312, -125429152, 99142344, 326068544, -56826444, 46350480, 37527544, 329625600, 31308164, -19632564, 32069984, 57804624, 403167520, 3554890, 64722740, -62716724, 56281252, -4959882, 478142080, -101929504, -14876156, 39897560, -40777760, -47372952, 187926288, 341264960, 21311090, -155172336, 108759040, -143880592, -20300968, -5616206, 73920144, 570679040, 218755296, -162775504, -64450816, -7369627, -36893500, -37446476, -80293072, 8201777, 597213568, -152507040, -256513440, -45927696, -77678512, -140313632, -170642272, -94367944, 112342656, 201967072, 756224576, -208080960, 225792336, 58484840, 66006132, -48434348, 7039720, -102562208, 39706704, -339747744, -90058216, 796577920, 202634944, 37851548, 10156524, 82895824, 73911016, -121567440, -148495536, -112251120, 27724282, 54130280, 84421344, 906663552, 209343680, 32186754, 306301216, -116259936, -36924908, 224391904, -24221736, 35642860, 46462152, 312121440, -39075344, -7622225, 60599840, 68880272, 244525904, -58326728, -36760892, 23687014, 173225968, 23444078, 473461088, -15582947, -34961840, 37741220, 31105764, -74304544, 12497281, 425261888, 33453500, 9509863, -120815016, 63221652, 7134209, 101693816, 61658284, 770215168, -17228724, -276690656, 128551864, -10146055, -15149155, 107287480, -8414646, -387697024, 649792832, 50705580, -73682312, -57487332, 8967623, -3074928, 20067160, 135318848, 273094432, -35929816, 819158720, -19654308, -23457232, 20863072, 11649830, -4230006, 119185344, 150983408, -51511960, -81179712, 365100416, 677546368, -1104880, 67182952, -148998320, -17748684, -31462514, 36981012, -243459152, -30465546, 39841460, -70792064, -7307618, 793560192, 196828960, -32199102, 232271296, -76255536, 20992994, 207772000, 19910932, 13635984, 32428882, 280196960, -25198842, -1165278, 42992624, -13211856, 237527792, -62810408, -99852624, 47340472, 231473232, -57426664, 489151424, 19632028, 2961111, -8761465, 94918512, -12379975, 80280456, 362603424, 142636400, 32065152, -350124672, 127381216, 47764332, 62010736, -35439924, 1157346560, -346969728, -366012832, 596499264, 170357456, 55534196, 444685088, 84101632, -1036655616, 1080018176, 147994640, -5793911, -7695776, 55731228, 16318191, 137087568, 107977896, 172195712, -159871568, 713860352, 105155024, -52278340, -47440328, 26797374, 11704323, 154628224, 63859720, 177926800, -3174517, 294978624, 586304384, -55530976, 100304664, -184816464, -121156736, -22429392, -187445792, -66290940, 399174784, -145260096, -435817856, -227558112, 632079616, 235678272, -8552354, 240827680, -37353868, -9822859, 337976896, -48387368, -7377143, 35740572, 353392864, 21862994, -32516660, 28525294, 31415538, 414974112, -20909780, 53856472, -18235358, 45784888, -63774628, 489165088, -36009004, -13625515, 11037798, -62288300, 22793928, 41337988, 507775744, 36684656, -117420112, 22649242, -64967556, -21585164, -59302760, 61845652, 551227904, 28334704, -96908688, -10986795, -3158680, -1148098, -1090116, -21733072, -98534064, 548509440, -12526541, -124452312, -39815688, 28119150, -82867096, -48626816, 41780368, 15056276, 114722336, 752520384, -72335840, 138609600, 457950, 58517588, -34335848, 7930120, 68274944, 71795744, -218303520, 30022896, 684244416, 29311810, 24879134, -5031822, -3604014, -107700064, 34280548, -161518960, -29972698, 45524776, -28767690, 70451960, 997068864, 181172464, -10389794, 282143392, -18262200, -9411616, 194651136, -34642400, 14696036, 32774090, 266709152, -12321724, -7934147, 42899744, 17961822, 326197120, -61064236, 2757905, -9434969, 114016616, -45294724, 423241632, 44844560, 7194607, -20771536, 17406428, -12688407, 27344446, 398144544, -20988432, 7578201, -36547220, 31998848, 1553972, 12336757, 23499376, 524998272, 38193264, -220705488, -3866007, -51896088, -8053332, 4608500, 2672543, 105980736, 617651200, 138849584, -138894416, -16658031, 14451491, -13349295, 42108932, 90309472, 45946488, 90752120, 714260864, -36247644, 218070784, 60232888, 133086544, 36377836, 146851648, 21597244, -80293880, -242705376, -25434260, 721932224, -73526080, 12684917, -26789322, -47208132, -29985852, -50325744, 4686614, 48175036, 81419696, -245451200, -121876408, 664714368, 166866720, 2983391, 263386720, -68162208, -7784091, 192441376, -145223, -15735686, -35828080, 344984128, 6308501, -28874260, 1040187, 139961712, 251922656, -73661104, -232072656, 127662000, 362434304, 189085392, 530900640, -2567048, -48370192, -40885672, 82937160, 128033784, 63094680, 384248448, 54663660, -320496640, -208546160, 766008512, 371514944, 699983808, 56493048, 1276140544, -85480856, -172129408, 182972048, 17228992, 16679505, 132060848, 21129896, -319555488, 617272960, 74918456, -142655184, 15233981, 243838976, 160190736, 297619744, 148904096, 314365024, -1673695, 579634560, 47073380, -135740560, 44690208, 97419520, 61031752, 157764080, 80927112, 97527968, 62705448, 190179008, 603058240, -73368240, 30219122, -3786282, -19939118, -20823612, -51310096, -75429024, 90901104, 18365818, -393250432, -234402672, 705817728 }; +#endif + const float weights_speech[N_SMC_MIXTURES] = { 0.110243f, 0.158178f, 0.164349f, 0.167653f, 0.235143f, 0.164434f, @@ -516,6 +520,13 @@ const float prec_chol_music[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_COEF) 1.209142f, 0.088647f, 1.211345f, -0.361558f, -0.636888f, 1.613629f, -0.073522f, 0.094440f, 0.348373f, 1.388855f, 0.080521f, -0.037507f, 0.070824f, 0.052632f, 1.876701f, -0.032255f, 0.124895f, -0.048464f, -0.228421f, -0.227230f, 1.726811f, -0.291388f, -0.077976f, 0.299319f, -0.171845f, 0.012052f, 0.228501f, 2.014814f, -0.039524f, -0.252147f, 0.412488f, -0.546076f, -0.276125f, -0.498767f, 0.283854f, 1.733851f, 0.044785f, -0.173411f, 0.095814f, -0.035061f, 0.007025f, 0.236956f, -0.269935f, -0.192304f, 1.968567f, -0.667309f, -0.209738f, -0.260295f, 0.087080f, -0.241920f, -0.281580f, 0.361767f, -0.183381f, 0.175271f, 3.096483f, -0.472230f, -0.015951f, -0.043282f, -0.052428f, -0.352133f, -0.334534f, 0.390436f, 0.113373f, -0.300916f, 1.454841f, 2.885831f, 0.478838f, 0.050578f, -0.039767f, 0.114396f, -0.067675f, 0.013117f, -1.117973f, -0.208723f, 0.445495f, -0.031657f, 0.011242f, 4.388051f, }; +#ifdef IVAS_FLOAT_FIXED +const Word32 prec_chol_music_fx[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_COEF) / 2] = +{ +232322304, 25836912, 235062480, -21970368, -88834688, 289087264, 38061464, 12829336, 25661356, 216226640, 3946806, 35926596, -49888460, 17696070, 235923888, -6313870, -29279598, 78824728, -1208764, 27664958, 273027328, -37742024, -71072048, 103689640, -10025259, -37697196, -61880548, 396421184, -26288422, 15300284, -459293, -23770764, 3474360, -25473720, 47310944, 332768160, 39007700, 9191767, -7766106, -35545148, 21523424, 6770747, -124619552, 1410091, 508736736, -25959320, -7817109, 19565456, 1404185, -51538532, -45457932, 165445904, -28407450, -81223736, 586521024, -46704816, -52083996, 9754944, -31150324, -39091720, -40270152, 66884720, 30225296, 100608000, 24531512, 657688896, 68076576, 48213692, -48020152, 49097380, -4268929, 59026004, -192775040, -50962204, -31122406, -117876448, -182476256, 625576192, 144678656, -9655086, 218327952, 6044361, -48620372, 254562448, -42861896, -13298292, 33123862, 287620000, -12122277, -30804848, 33071786, 16293764, 388198208, -19213268, 24338774, 14173929, -33506382, -87690080, 361291840, 34886676, 52138220, -48904644, -17044846, 2490812, 73471056, 354929120, 40659380, 38784092, 24256364, -112064552, -5929471, -94763888, -36720092, 322304000, -56521232, -65294776, 11020081, -15673409, 12677670, -51147960, -59997204, 68434128, 456261088, 44138304, 4000225, -77793136, 61852092, -3655554, -41457440, 71121976, -86157848, -69391640, 621925248, 56908, 50305072, -2964869, 102686760, -14214731, -68874360, 41617696, -34848560, -20007568, 56042344, 554498560, -36107792, -20590342, -25757992, -64163052, 53273432, 35053644, -77861048, -7609071, 98731368, 8330089, 81691888, 807686592, 206408080, 29242554, 246745872, -30320054, -141839152, 416885632, -31085094, 1968705, -7943542, 294907488, 972004, 26633630, -66413080, -21165868, 367168960, 11512928, -20904948, 56274004, -44399224, -4818953, 360435008, -49596404, 13496398, 7960453, 47073916, -4338185, -43219720, 462487456, 13815031, 2689991, 103510592, -71014872, -75477072, -97242624, -9769708, 371118464, -17768548, -22740510, -33236068, -8622415, 24936848, 18291192, -70021120, 2836020, 476147872, 63471028, 25856776, -21647440, 32818918, 34664144, 29404152, 114646368, -122478512, -68419632, 815255936, 35136860, -35646080, -34052916, 1725771, 2581812, -62708940, 215970288, -82662016, -34325112, 447461504, 753578304, -99274408, -3290213, 4633733, -15484968, -36483064, 40284916, -407272960, 58910844, 134671648, -601330048, -345841248, 981086208, 206335056, 1025423, 222901824, -58332100, -39948832, 262789184, -18609020, 1410628, -1774089, 212590416, 18125298, 28513752, -59463552, 4719095, 246369264, -81872, -23613194, 15571135, -16710912, 46739712, 268572096, 29908542, 37123820, 22983444, 55254756, 2779112, -57131120, 341562368, 5126580, 21001584, -6036039, -24000546, -46808700, -51209432, -9852655, 337137760, -8485513, -113351704, -16093779, -60946660, 8815152, -10634339, -80527416, 50575120, 478848064, 149115360, 27080038, 22408992, -24449906, 61073900, 40576168, 139484976, -77672608, -93439968, 705148288, 18536542, 21612006, -26196616, -17896592, 48906792, 10430328, 52505440, -55231936, -34737696, 181267760, 633243008, -77855408, -1544846, -16549583, -11117523, 31134218, 10136123, -124216360, 27077622, 80264352, -345837472, -203551920, 593004544, 99558952, 18271060, 165076528, -18376286, -30611842, 213814752, -21311628, -7249636, 15457856, 170620528, -4867540, -16669573, -49741896, 22724940, 143143472, -39989100, -10398384, 72010760, 44482440, 6079526, 200783008, -1092263, 15936208, 13659607, 18654116, -27689922, -23768886, 188797104, 12175964, -32829120, -61108256, 16816140, 3177470, 18617342, -5304821, 286432992, 28388660, -118288232, 51768048, -15788031, 7528809, 37260184, -33815620, -179149264, 306826016, -17569370, 22469390, -41274636, -16302085, -108179, -24384408, 16991428, -10070088, 94377344, 317392448, -28549990, -4354291, -2879238, 26857504, 15448729, 28430268, -357556, -21060910, -72179608, -65214248, 414794528, 6270384, -21697370, 62073552, -9898557, 21225192, 16768895, 1158030, 20269024, 9883257, 18578686, -97534416, 397891136, 324576576, 23795998, 325167936, -97054984, -170963328, 433155232, -19735912, 25351044, 93515664, 372817920, 21614692, -10068209, 19011672, 14128295, 503773088, -8658386, 33526246, -13009456, -61316296, -60996588, 463537312, -78218872, -20931524, 80347832, -46129292, 3235184, 61337772, 540847488, -10609643, -67685192, 110726408, -146586160, -74121744, -133886744, 76196480, 465427072, 12021882, -46549660, 25719874, -9411616, 1885759, 63607392, -72460128, -51621212, 528433184, -179129392, -56301116, -69872408, 23375360, -64939904, -75586056, 97111088, -49225964, 47048952, 831205824, -126763272, -4281814, -11618423, -14073534, -94524984, -89800784, 104806864, 30433332, -80776520, 390530912, 774659392, 128537096, 13576928, -10674873, 30707942, -18166370, 3521068, -300103584, -56028652, 119586656, -8497861, 3017751, 1177908480, +}; +#endif + const float weights_music[N_SMC_MIXTURES] = { 0.156143f, 0.136090f, 0.300104f, 0.193919f, 0.051812f, 0.161931f, @@ -546,6 +557,12 @@ const float prec_chol_noise[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_COEF) 1.388928f, -0.529069f, 1.914570f, -0.246147f, -0.376892f, 1.708861f, -0.205445f, 0.314175f, 0.650069f, 1.841539f, -0.085711f, -0.013295f, -0.070955f, -0.466548f, 3.166998f, -0.260572f, 0.720834f, -0.792817f, -1.467658f, -0.372909f, 2.710914f, 0.606852f, 0.637359f, -0.541404f, -0.330263f, 0.170983f, 0.064970f, 2.980650f, 0.184834f, -0.340049f, 0.288191f, -1.044021f, -0.466651f, -0.374637f, -0.231777f, 2.131845f, 0.132432f, -0.963210f, -0.294608f, 0.042302f, -0.114246f, -0.932316f, -0.166230f, 0.203508f, 2.563777f, 0.548839f, -0.440379f, -0.934541f, -0.344106f, 0.030490f, -0.377361f, -0.085154f, -0.262774f, 0.477136f, 4.772394f, 0.084517f, 0.357867f, -0.429870f, 0.688023f, 0.353825f, -0.439173f, 0.076948f, -0.769601f, -1.177351f, 1.958859f, 4.300092f, -0.207814f, 0.243404f, -0.706169f, -0.588024f, 0.962382f, 0.338356f, -0.298229f, -0.351656f, 0.768647f, 0.689511f, 0.692148f, 6.121235f, }; +#ifdef IVAS_FLOAT_FIXED +const Word32 prec_chol_noise_fx[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_COEF) / 2] = +{ 438274304, -101757704, 527959936, -92401656, -40066944, 569343040, -172637280, 92605400, 90126936, 502116576, -70281768, 15855140, 42644192, -75216424, 659778944, 21871852, 200184128, -66884720, -206631952, -271753600, 579995584, -41937404, 180430768, -70175472, 31213406, -61285692, -15286594, 914624320, 95589064, -197632384, 189309536, -378043296, -192572912, -278483808, 89525912, 667027200, 86715120, -398169504, -134308192, -24187914, -117845048, -77955000, 87847112, -65235184, 674295616, 118658400, 141179872, -385477600, 90381952, 47387716, -172783040, 213091584, -92059136, 180518816, 1113415808, 89164056, 159457376, -287768704, 140198736, 53548040, 12615661, 211052816, -195082784, -315002016, 199766976, 1060323264, -162984080, -169212048, 275297472, -209311472, -148597008, 90449592, -308289792, 131478344, 206830864, -316232544, -116264224, 1640643200, 575459840, -110880488, 540680576, -20299626, -120988960, 592097728, 75230912, 156925216, 72533680, 553807552, -272710816, -155779808, 38634840, -156862400, 752763072, -182010784, 94162056, -90105192, -416297760, -234046992, 690654080, 181351232, 128870224, -96438120, 75957304, 10280273, -216431728, 1041874240, -2115271, -161272000, 112353664, -387182976, 14206141, -50861004, -182521616, 664376128, -13428752, -358865984, -61852360, -3840774, -153737552, -335891136, 127812056, 72605352, 719982528, -11629161, -73992352, -370089824, -83219288, -95394448, -78352816, -28330678, -1691143, 79366160, 1178542208, -85602184, 94195616, -206783344, 134659312, -21508390, -89069568, 127365104, -119468808, -308679296, 307254432, 1144636160, 19030194, -8984535, -70737840, -155128048, 221865936, 50559280, 68931808, -94236416, 266750224, 260988512, 297829664, 1781693056, 421042624, -59415772, 527790560, -98705864, -94187288, 738609024, -33151778, 77225928, -97992632, 568460672, 43811888, 22125524, -44354932, -38434856, 696296640, 8982924, 76764488, 78076064, -148321856, -92465280, 669700032, 31240518, 1078842, -80158048, 17065784, 42776532, -97703528, 836559488, 101995008, -23285702, -44140184, -65183912, -32696244, -173090400, 116281136, 675435968, 24943022, -289375584, -28602066, -60206048, -67754184, -46702400, 88339696, -173576816, 792158656, 13933948, -103396240, -80619760, 4375229, 22152636, 20907632, 211938912, -232494096, 278967264, 1247803392, -70594232, 74254616, -54600844, 26415928, -10635144, 33370554, 298018912, -152319936, -244328336, 782944064, 1259614592, 20826564, 8513699, 101483096, -35796672, -149573040, -20171850, -532795264, 142151072, 163440688, -597162880, -376404768, 1708897920, 209270944, -23997324, 331448000, 6588480, -58776092, 382514624, -18828332, 39394512, -32496796, 381425568, 21953188, -17026056, -17383880, 29140548, 410380096, -22143510, 714575, 45383844, 30147180, -75072000, 468424448, 6863357, -2480612, -3718636, -18806856, 45715632, -12727867, 520436480, 52698712, 758061, -3390071, -57345060, -19137300, -94494648, 48669764, 553184256, 15456245, -55625196, 37220456, -21190832, 14073266, 37691024, -82113600, -125746712, 566309184, 24663312, -79263352, -81187768, 18228110, -23309324, -35227592, 45638592, -100310304, 111057384, 747604032, -38703024, -49378972, -1829387, -24915374, -44106092, 3890166, 95093528, 4453076, -105516344, 61340456, 779151360, 14067092, 24841018, 46075604, 14026826, -73798008, -27891786, -172234896, 22042846, 8342168, -136356624, -15677436, 917865664, 323919712, -183311616, 550143680, -136109392, -92123024, 508834976, -36581580, 25082610, 186993744, 612834112, 3323231, -41768288, 10869757, -32662958, 900676672, -132146208, 173920944, -285617472, -265424416, -17592454, 746075264, 174698064, 87668608, -12579422, 50304000, -52162648, -8793140, 1121056000, 147971552, -143892672, 40492148, -332957664, -99433056, -229635520, 90426776, 754189248, 91340536, -315738880, 3497714, 95215400, -131254200, -125219504, 210190864, -40012452, 774223424, 323906560, 82644032, -378786592, 18817058, 56163140, 78116600, -101264320, -171897472, 108985600, 1384031744, 217351648, 179599424, -252806064, 287773824, -31378494, -40052984, 121498448, -198681968, -319067488, 616561856, 1259752576, -10863851, -35322348, 214155392, -580386432, 360088192, 294499200, -423245408, 122124976, 92175096, -14300899, 19809194, 1852783360, 372837536, -142020880, 513938464, -66074584, -101171176, 458718880, -55148724, 84335712, 174501568, 494334368, -23007872, -3568849, -19046838, -125238024, 850134528, -69946760, 193497408, -212820192, -393971456, -100102000, 727705408, 162900592, 171089760, -145332032, -88654296, 45897900, 17440252, 800112128, 49616000, -91281208, 77360680, -280252256, -125265672, -100565856, -62217164, 572262784, 35549444, -258559712, -79083232, 11355357, -30667678, -250266672, -44622024, 54628764, 688208640, 147327840, -118213336, -250863936, -92370248, 8184597, -101297072, -22858352, -70537856, 128080216, 1281079808, 22687360, 96064192, -115392352, 184689760, 94979176, -117889608, 20655572, -206588192, -316042752, 525827200, 1154297216, -55784644, 65338264, -189560800, -157846496, 258337456, 90826744, -80055240, -94396936, 206332112, 185089200, 185797056, 1643156480, +}; +#endif + const float weights_noise[N_SMC_MIXTURES] = { 0.186702f, 0.110792f, 0.358051f, 0.085247f, 0.132809f, 0.126399f, diff --git a/lib_enc/rom_enc.h b/lib_enc/rom_enc.h index cc009fc7a..812db4821 100644 --- a/lib_enc/rom_enc.h +++ b/lib_enc/rom_enc.h @@ -137,6 +137,12 @@ extern const Word32 invV_speech_fx[]; extern const float lvm_speech[]; extern const Word32 lvm_speech_fx[]; +#ifdef IVAS_FLOAT_FIXED +extern const Word32 prec_chol_speech_fx[]; +extern const Word32 prec_chol_music_fx[]; +extern const Word32 prec_chol_noise_fx[]; +#endif + extern const float m_music[]; extern const Word16 m_music_fx[]; extern const float invV_music[]; diff --git a/lib_enc/speech_music_classif.c b/lib_enc/speech_music_classif.c index fe0ea5968..3fe6fe53b 100644 --- a/lib_enc/speech_music_classif.c +++ b/lib_enc/speech_music_classif.c @@ -44,6 +44,9 @@ #include "rom_enc.h" #include "rom_com.h" /* Common static table prototypes */ #include "wmc_auto.h" +#ifdef IVAS_FLOAT_FIXED +#include "prot_fx2.h" +#endif /*---------------------------------------------------------------------* @@ -1128,6 +1131,706 @@ static int16_t attack_det( *---------------------------------------------------------------------*/ /*! r: S/M decision (0=speech or noise,1=unclear,2=music) */ + +#ifdef IVAS_FLOAT_FIXED +int16_t ivas_smc_gmm( + Encoder_State *st, /* i/o: state structure */ + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + const int16_t localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ + const float Etot, /* i : total frame energy */ + const float lsp_new[M], /* i : LSPs in current frame */ + const float cor_map_sum, /* i : correlation map sum (from multi-harmonic anal.) */ + const float epsP[M + 1], /* i : LP prediciton error */ + const float PS[], /* i : energy spectrum */ + const float non_sta, /* i : unbound non-stationarity */ + const float relE, /* i : relative frame energy */ + int16_t *high_lpn_flag, /* i/o: sp/mus LPN flag */ + const int16_t flag_spitch /* i : flag to indicate very short stable pitch */ +) +{ + int16_t i, m, dec; + int16_t flag_odv; + float lps, lpm, lpn; + float ps[N_SMC_MIXTURES], pm[N_SMC_MIXTURES], pn[N_SMC_MIXTURES]; + float fvm[N_PCA_COEF], lprob; + float dlp, ftmp, sum_PS, ps_diff, ps_sta, wrelE, wdrop, wght; + float wrise; + float dlp_mean2var; + float FV[N_SMC_FEATURES], *pFV, PS_norm[128], dPS[128]; + const float *pODV; + float *pFV_st, smc_st_mean_fact; + int16_t relE_attack_flag; + int16_t j, len; + const float *pt_mel_fb; + float melS[NB_MEL_BANDS], mfcc[NB_MEL_BANDS]; + int16_t odv_cnt; + int16_t i_out[N_SMC_FEATURES], *p_out; + + /*------------------------------------------------------------------* + * Initialization + *------------------------------------------------------------------*/ + + SP_MUS_CLAS_HANDLE hSpMusClas = st->hSpMusClas; + + /*------------------------------------------------------------------* + * State machine (sp_mus_state: -8 = INACTIVE, -7:-1 = UNSTABLE, 0:7 = ENTRY, 8 = STABLE ) + *------------------------------------------------------------------*/ + + if ( localVAD_HE_SAD ) + { + if ( relE < -20 ) + { + if ( hSpMusClas->sp_mus_state > 0 ) + { + if ( hSpMusClas->sp_mus_state < HANG_LEN ) + { + /* energy is too low but we are in entry period -> reset the inactive counter to allow new entry later */ + hSpMusClas->inact_cnt = 0; + } + + /* energy is too low -> we are going to instable state */ + hSpMusClas->sp_mus_state = 0; + } + else if ( hSpMusClas->sp_mus_state > -HANG_LEN ) + { + /* energy is still too low -> we are still in instable state */ + hSpMusClas->sp_mus_state--; + } + } + else if ( hSpMusClas->sp_mus_state <= 0 ) + { + if ( hSpMusClas->inact_cnt == 0 ) + { + + hSpMusClas->sp_mus_state = 1; + } + else + { + + hSpMusClas->sp_mus_state = HANG_LEN; + } + + hSpMusClas->inact_cnt = 12; + } + else if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + { + /* we are inside an entry period -> increment the counter of entry frames */ + hSpMusClas->sp_mus_state++; + } + + if ( hSpMusClas->sp_mus_state < 0 && hSpMusClas->inact_cnt > 0 ) + { + hSpMusClas->inact_cnt--; + } + } + else + { + if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + { + hSpMusClas->inact_cnt = 0; + } + else if ( hSpMusClas->inact_cnt > 0 ) + { + hSpMusClas->inact_cnt--; + } + + if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + { + hSpMusClas->sp_mus_state = -HANG_LEN; + } + else if ( hSpMusClas->sp_mus_state > 0 ) + { + hSpMusClas->sp_mus_state = -1; + } + else if ( hSpMusClas->sp_mus_state > -HANG_LEN ) + { + /* we are in inactive state */ + hSpMusClas->sp_mus_state--; + } + } + + /* detect attacks based on relE */ + if ( relE > hSpMusClas->prev_relE ) + { + hSpMusClas->relE_attack_sum += relE - hSpMusClas->prev_relE; + } + else + { + hSpMusClas->relE_attack_sum = 0; + } + hSpMusClas->prev_relE = relE; + + /* update counter from last VAD 0->1 change */ + if ( hSpMusClas->prev_vad == 0 && localVAD_HE_SAD == 1 ) + { + hSpMusClas->vad_0_1_cnt = 1; + } + else if ( localVAD_HE_SAD == 1 && hSpMusClas->vad_0_1_cnt > 0 && hSpMusClas->vad_0_1_cnt < 50 ) + { + hSpMusClas->vad_0_1_cnt++; + } + else + { + hSpMusClas->vad_0_1_cnt = 0; + } + hSpMusClas->prev_vad = localVAD_HE_SAD; + + if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN && hSpMusClas->relE_attack_sum > 5.0f ) + { + hSpMusClas->relE_attack_cnt++; + + /* set flag only in the first X frames in a series */ + if ( hSpMusClas->relE_attack_cnt > 0 && hSpMusClas->relE_attack_cnt < 3 ) + { + relE_attack_flag = 1; + } + else + { + relE_attack_flag = 0; + } + } + else + { + hSpMusClas->relE_attack_cnt = 0; + relE_attack_flag = 0; + } + + hSpMusClas->prev_Etot = Etot; + + /*------------------------------------------------------------------* + * Preparation of the feature vector + *------------------------------------------------------------------*/ + + pFV = FV; + + /* [0] OL pitch */ + if ( relE_attack_flag || st->tc_cnt == 1 || st->tc_cnt == 2 ) + { + *pFV++ = (float) st->pitch[2]; + } + else + { + *pFV++ = (float) ( st->pitch[0] + st->pitch[1] + st->pitch[2] ) / 3.0f; + } + + /* [1] voicing */ + if ( relE_attack_flag || st->tc_cnt == 1 || st->tc_cnt == 2 ) + { + *pFV++ = st->voicing[2]; + } + else + { + *pFV++ = ( st->voicing[0] + st->voicing[1] + st->voicing[2] ) / 3.0f; + } + + /* [2,3,4,5,6] LSFs */ + *pFV++ = acosf( lsp_new[2] ); + *pFV++ = acosf( lsp_new[3] ); + *pFV++ = acosf( lsp_new[4] ); + *pFV++ = acosf( lsp_new[5] ); + *pFV++ = acosf( lsp_new[6] ); + + /* [7] cor_map_sum */ + *pFV++ = cor_map_sum; + + /* [8] non_sta */ + *pFV++ = non_sta; + + /* [9] epsP */ + *pFV++ = logf( epsP[14] + 1e-5f ) - logf( epsP[0] + 1e-5f ); + + /* [10,11,12] MFCCs */ + set_zero( melS, NB_MEL_BANDS ); + pt_mel_fb = mel_fb; + for ( i = 0; i < NB_MEL_BANDS; i++ ) + { + j = mel_fb_start[i]; + len = mel_fb_len[i]; + melS[i] = logf( dotp( &PS[j], pt_mel_fb, len ) + 1e-5f ); + pt_mel_fb += len; + } + + v_mult_mat( mfcc, melS, dct_mtx, NB_MEL_BANDS, NB_MEL_COEF ); + + *pFV++ = mfcc[2]; + *pFV++ = mfcc[6]; + *pFV++ = mfcc[12]; + + /* calculation of differential normalized power spectrum */ + sum_PS = 1e-5f; + for ( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) + { + sum_PS += PS[i]; + } + + for ( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) + { + PS_norm[i] = PS[i] / sum_PS; + dPS[i] = fabsf( PS_norm[i] - hSpMusClas->past_PS[i - LOWEST_FBIN] ); + } + + /* [13] ps_diff (spectral difference) */ + ps_diff = 0; + for ( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) + { + ps_diff += dPS[i]; + } + + *pFV++ = ps_diff; + + /* [14] ps_sta (spectral stationarity) */ + ps_sta = 0; + for ( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) + { + if ( PS_norm[i] > hSpMusClas->past_PS[i - LOWEST_FBIN] ) + { + ps_sta += PS_norm[i] / ( dPS[i] + 1e-5f ); + } + else + { + ps_sta += hSpMusClas->past_PS[i - LOWEST_FBIN] / ( dPS[i] + 1e-5f ); + } + } + + *pFV++ = logf( ps_sta + 1e-5f ); + mvr2r( &PS_norm[LOWEST_FBIN], hSpMusClas->past_PS, HIGHEST_FBIN - LOWEST_FBIN ); + + /* save ps_diff and ps_sta features for XTALK and UNCLR classifier */ + if ( hStereoClassif != NULL ) + { + if ( st->idchan == 0 ) + { + hStereoClassif->ps_diff_ch1 = ps_diff; + hStereoClassif->ps_sta_ch1 = logf( ps_sta + 1e-5f ); + } + else + { + hStereoClassif->ps_diff_ch2 = ps_diff; + hStereoClassif->ps_sta_ch2 = logf( ps_sta + 1e-5f ); + } + } + + /*------------------------------------------------------------------* + * Outlier detection based on feature histograms + *------------------------------------------------------------------*/ + + flag_odv = 0; + if ( localVAD_HE_SAD ) + { + pFV = FV; + pODV = hout_intervals; + p_out = i_out; + odv_cnt = 0; + for ( i = 0; i < N_SMC_FEATURES; i++ ) + { + if ( *pFV < pODV[0] || *pFV > pODV[1] ) + { + *p_out++ = i; + odv_cnt++; + } + + pFV++; + pODV += 2; + } + + /* set outlier flag */ + if ( odv_cnt >= 2 ) + { + flag_odv = 1; + + /* replace outlying features with values from the previous frame */ + for ( i = 0; i < odv_cnt; i++ ) + { + FV[i_out[i]] = hSpMusClas->prev_FV[i_out[i]]; + } + } + } + + /*------------------------------------------------------------------* + * Adaptive short-term mean filter on feature vector + *------------------------------------------------------------------*/ + + pFV = FV; + pFV_st = hSpMusClas->FV_st; + smc_st_mean_fact = SMC_ST_MEAN_FACT; + for ( i = 0; i < N_SMC_FEATURES; i++ ) + { + *pFV_st = smc_st_mean_fact * ( *pFV_st ) + ( 1 - smc_st_mean_fact ) * ( *pFV ); + + if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN && ( relE_attack_flag || flag_odv ) ) + { + /* strong attack or outlier frame during entry state -> features cannot be trusted but there is also no useful past info -> */ + /* -> do whatever you want because dlp will be reset to 0 anyway */ + pFV++; + pFV_st++; + } + else if ( hSpMusClas->sp_mus_state == HANG_LEN && ( st->tc_cnt == 1 || st->tc_cnt == 2 ) ) + { + /* energy attack in stable state -> use current features intead of the long-term average */ + pFV++; + pFV_st++; + } + else + { + *pFV++ = *pFV_st++; + } + } + + /* update */ + mvr2r( FV, hSpMusClas->prev_FV, N_SMC_FEATURES ); + + /*------------------------------------------------------------------* + * Non-linear power transformation (boxcox) on certain features + *------------------------------------------------------------------*/ + + pFV = FV; + for ( i = 0; i < N_SMC_FEATURES; i++ ) + { + if ( bcox_lmbd[i] != 0 ) + { + *pFV -= bcox_add_cnst[i]; + if ( *pFV < 1 ) + { + *pFV = 1; + } + *pFV = ( powf( *pFV, bcox_lmbd[i] ) - 1 ) / bcox_lmbd[i]; + } + + pFV++; + } + + /*------------------------------------------------------------------* + * Scaling of the feature vector + * PCA + *------------------------------------------------------------------*/ + + pFV = FV; + for ( i = 0; i < N_SMC_FEATURES; i++ ) + { + /* Standard scaler - mean and variance normalization */ + *pFV = ( *pFV - sm_means[i] ) / sm_scale[i]; + pFV++; + + /* MinMax sclaer - mean and variance normalization */ + /**pFV = *pFV * sm_scale[i] + sm_min[i];*/ + /*pFV++;*/ + } + + /* PCA */ + v_sub( FV, pca_mean_, FV, N_SMC_FEATURES ); + v_mult_mat( FV, FV, pca_components_, N_SMC_FEATURES, N_PCA_COEF ); + + /*------------------------------------------------------------------* + * Calculation of posterior probability + * Log-probability + *------------------------------------------------------------------*/ + +#ifdef IVAS_FLOAT_FIXED + Word32 fvm_fx[N_PCA_COEF], lprob_fx; + Word16 fvm_q, guard_bits; + guard_bits = find_guarded_bits_fx( N_PCA_COEF ); // 12! 479001600 +#endif + /* run loop for all mixtures (for each mixture, calculate the probability of speech, music and noise) */ + lps = lpm = lpn = 0; + for ( m = 0; m < N_SMC_MIXTURES; m++ ) + { + v_sub( FV, &means_speech[m * N_PCA_COEF], fvm, N_PCA_COEF ); + +#ifdef IVAS_FLOAT_FIXED + f2me_buf( fvm, fvm_fx, &fvm_q, N_PCA_COEF ); + fvm_q = sub( 31, fvm_q ); + scale_sig32( fvm_fx, N_PCA_COEF, sub( sub( fvm_q, guard_bits ), fvm_q ) ); + fvm_q = sub( fvm_q, guard_bits ); + + lprob_fx = dot_product_cholesky_fx( fvm_fx, &prec_chol_speech_fx[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); + lprob = fixedToFloat( lprob_fx, sub( 2 * fvm_q, 37 ) ); +#else + lprob = dot_product_cholesky( fvm, &prec_chol_speech[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); +#endif + ps[m] = logf( weights_speech[m] ) + log_det_chol_speech[m] - 0.5f * N_PCA_COEF * logf( PI2 ) - 0.5f * lprob; + + v_sub( FV, &means_music[m * N_PCA_COEF], fvm, N_PCA_COEF ); +#ifdef IVAS_FLOAT_FIXED + f2me_buf( fvm, fvm_fx, &fvm_q, N_PCA_COEF ); + fvm_q = sub( 31, fvm_q ); + scale_sig32( fvm_fx, N_PCA_COEF, sub( sub( fvm_q, guard_bits ), fvm_q ) ); + fvm_q = sub( fvm_q, guard_bits ); + lprob_fx = dot_product_cholesky_fx( fvm_fx, &prec_chol_music_fx[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); + lprob = fixedToFloat( lprob_fx, sub( 2 * fvm_q, 37 ) ); +#else + lprob = dot_product_cholesky( fvm, &prec_chol_music[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); +#endif + pm[m] = logf( weights_music[m] ) + log_det_chol_music[m] - 0.5f * N_PCA_COEF * logf( PI2 ) - 0.5f * lprob; + + v_sub( FV, &means_noise[m * N_PCA_COEF], fvm, N_PCA_COEF ); +#ifdef IVAS_FLOAT_FIXED + f2me_buf( fvm, fvm_fx, &fvm_q, N_PCA_COEF ); + fvm_q = sub( 31, fvm_q ); + scale_sig32( fvm_fx, N_PCA_COEF, sub( sub( fvm_q, guard_bits ), fvm_q ) ); + fvm_q = sub( fvm_q, guard_bits ); + lprob_fx = dot_product_cholesky_fx( fvm_fx, &prec_chol_noise_fx[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); + lprob = fixedToFloat( lprob_fx, sub( 2 * fvm_q, 37 ) ); +#else + lprob = dot_product_cholesky( fvm, &prec_chol_noise[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); +#endif + pn[m] = logf( weights_noise[m] ) + log_det_chol_noise[m] - 0.5f * N_PCA_COEF * logf( PI2 ) - 0.5f * lprob; + } + + lps = logsumexp( ps, N_SMC_MIXTURES ); + lpm = logsumexp( pm, N_SMC_MIXTURES ); + lpn = logsumexp( pn, N_SMC_MIXTURES ); + + *high_lpn_flag = 0; + if ( lpn > lps && lpn > lpm ) + { + *high_lpn_flag = 1; + } + + hSpMusClas->lpm = lpm; + hSpMusClas->lps = lps; + hSpMusClas->lpn = lpn; + + /* determine HQ Generic speech class */ + if ( st->hHQ_core != NULL ) + { + if ( lps > lpm + 0.5f ) + { + st->hHQ_core->hq_generic_speech_class = 1; + } + else + { + st->hHQ_core->hq_generic_speech_class = 0; + } + } + + /*------------------------------------------------------------------* + * Decision without hangover + * Weighted decision + *------------------------------------------------------------------*/ + + /* decision without hangover (0 - speech/noise, 1 - music) */ + if ( !localVAD_HE_SAD || Etot < 10 || ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN && ( relE_attack_flag || flag_odv ) ) ) + { + dlp = 0; + } + else + { + dlp = lpm - lps + DLP_BIAS; + + if ( dlp > 30.0f ) + { + dlp = 30.0f; + } + else if ( dlp < -30.0f ) + { + dlp = -30.0f; + } + } + + dec = dlp > 0; + + /* calculate weight based on relE (higher relE -> lower weight, lower relE -> higher weight) */ + wrelE = lin_interp( relE, 15.0f, 0.9f, -15.0f, 0.99f, 1 ); + + /* calculate weight based on drops of dlp (close to 1 during sudden drops of dlp, close to 0 otherwise) */ + hSpMusClas->dlp_mean_ST = 0.8f * hSpMusClas->dlp_mean_ST + 0.2f * dlp; + hSpMusClas->lt_dec_thres = hSpMusClas->dlp_mean_ST; + + if ( dlp < 0 && dlp < hSpMusClas->dlp_mean_ST ) + { + if ( hSpMusClas->dlp_mean_ST > 0 ) + { + hSpMusClas->wdrop = -dlp; + } + else if ( hSpMusClas->wdrop > 0 ) + { + hSpMusClas->wdrop += hSpMusClas->dlp_mean_ST - dlp; + } + } + else + { + hSpMusClas->wdrop = 0; + } + + wdrop = lin_interp( hSpMusClas->wdrop, 15.0f, 0.7f, 0.0f, 1.0f, 1 ); + + /* calculate weight based on rises of dlp (close to 1 during sudden rise of dlp, close to 0 otherwise) */ + if ( hSpMusClas->sp_mus_state == HANG_LEN && hSpMusClas->dlp_mean_ST > 0 && hSpMusClas->dlp_mean_ST > hSpMusClas->past_dlp_mean_ST[0] ) + { + if ( hSpMusClas->past_dlp_mean_ST[0] < 0 ) + { + hSpMusClas->wrise = hSpMusClas->dlp_mean_ST; + } + else if ( hSpMusClas->wrise > 0 ) + { + hSpMusClas->wrise += hSpMusClas->dlp_mean_ST - hSpMusClas->past_dlp_mean_ST[0]; + } + } + else + { + hSpMusClas->wrise = 0; + } + + wrise = lin_interp( hSpMusClas->wrise, 5.0f, 0.95f, 0.0f, 1.0f, 1 ); + + /* combine weights into one */ + wght = wrelE * wdrop * wrise; + + /* ratio of delta means vs. delta variances */ + if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + { + hSpMusClas->dlp_mean_LT = dlp; + hSpMusClas->dlp_var_LT = 0; + } + + hSpMusClas->dlp_mean_LT = 0.9f * hSpMusClas->dlp_mean_LT + 0.1f * dlp; + ftmp = dlp - hSpMusClas->dlp_mean_LT; + hSpMusClas->dlp_var_LT = 0.9f * hSpMusClas->dlp_var_LT + 0.1f * ( ftmp * ftmp ); + + if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + { + dlp_mean2var = 0; + } + else + { + dlp_mean2var = fabsf( hSpMusClas->dlp_mean_LT ) / ( sqrtf( fabsf( hSpMusClas->dlp_var_LT ) ) + 1.0f ); + } + + if ( dlp_mean2var > 15.0f ) + { + /* decrease the weight little bit when the classifier indicates "strong speech" or "strong music" */ + wght *= 0.9f; + } + + if ( wght > 1.0f ) + { + wght = 1.0f; + } + else if ( wght < 0.01f ) + { + wght = 0.01f; + } + + if ( Etot < 10 ) + { + /* silence */ + wght = 0.92f; + } + + /* calculate weighted decision */ + hSpMusClas->wdlp_0_95_sp = wght * hSpMusClas->wdlp_0_95_sp + ( 1 - wght ) * dlp; + + /* xtalk classifier: apply long hysteresis to prevent LRTD on music */ + hSpMusClas->wdlp_xtalk = 0.995f * hSpMusClas->wdlp_xtalk + 0.005f * dlp; + + /*------------------------------------------------------------------* + * Final speech/music decision + *------------------------------------------------------------------*/ + + if ( flag_spitch ) + { + hSpMusClas->flag_spitch_cnt = 5; + } + else if ( hSpMusClas->flag_spitch_cnt > 0 ) + { + hSpMusClas->flag_spitch_cnt--; + } + + if ( Etot < 10 ) + { + /* silence */ + dec = 0; + } + else if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + { + /* entry state -> final decision is calculated based on weighted average of past non-binary decisions */ + ftmp = w_spmus[hSpMusClas->sp_mus_state - 1][0] * dlp; + ftmp += dotp( &w_spmus[hSpMusClas->sp_mus_state - 1][1], hSpMusClas->past_dlp, HANG_LEN - 1 ); + if ( ftmp > 2.0f ) + { + if ( dlp > 2.0f ) + { + dec = 2; + } + else + { + dec = 1; + } + } + else + { + dec = 0; + } + } + else + { + /* stable active state */ + if ( hSpMusClas->past_dec[0] == 0 && hSpMusClas->past_dec[1] == 0 && hSpMusClas->past_dec[2] == 0 && + ( ( hSpMusClas->flag_spitch_cnt > 0 && hSpMusClas->wdlp_0_95_sp > 3.4f ) || ( hSpMusClas->flag_spitch_cnt == 0 && hSpMusClas->wdlp_0_95_sp > 2.1f ) ) ) + { + /* switching from speech to unclear */ + dec = 1; + } + else if ( hSpMusClas->past_dec[0] == 0 && hSpMusClas->vad_0_1_cnt < 50 && hSpMusClas->relE_attack_sum == 0.0f && hSpMusClas->wdlp_0_95_sp > 1.0f ) + { + /* switch from speech to unclear also during slowly rising weak music onsets */ + dec = 1; + } + else if ( hSpMusClas->past_dec[0] == 1 && hSpMusClas->wdlp_0_95_sp > 2.5f ) + { + /* switching from unclear to music */ + dec = 2; + } + else if ( hSpMusClas->past_dec[0] == 2 && hSpMusClas->past_dec[1] == 2 && hSpMusClas->past_dec[2] == 2 && hSpMusClas->wdlp_0_95_sp < -1.0f ) + { + /* switching from music to unclear */ + dec = 1; + } + else if ( hSpMusClas->past_dec[0] == 1 && hSpMusClas->wdlp_0_95_sp < -2.5f ) + { + /* switching from unclear to speech */ + dec = 0; + } + else + { + dec = hSpMusClas->past_dec[0]; + } + } + + /*------------------------------------------------------------------* + * raw S/M decision based on smoothed GMM score + *------------------------------------------------------------------*/ + + if ( dec == 0 || st->hSpMusClas->wdlp_0_95_sp <= 0 ) + { + st->sp_aud_decision0 = 0; + st->sp_aud_decision1 = 0; + } + else + { + st->sp_aud_decision0 = 1; + st->sp_aud_decision1 = 1; + } + + /*------------------------------------------------------------------* + * Updates + *------------------------------------------------------------------*/ + + /* update buffer of past non-binary decisions */ + mvr2r( &hSpMusClas->past_dlp[0], &hSpMusClas->past_dlp[1], HANG_LEN - 2 ); + hSpMusClas->past_dlp[0] = dlp; + + mvr2r( &hSpMusClas->past_dlp_mean_ST[0], &hSpMusClas->past_dlp_mean_ST[1], HANG_LEN - 2 ); + hSpMusClas->past_dlp_mean_ST[0] = hSpMusClas->dlp_mean_ST; + + /* update buffer of past binary decisions */ + mvs2s( &hSpMusClas->past_dec[0], &hSpMusClas->past_dec[1], HANG_LEN - 2 ); + hSpMusClas->past_dec[0] = dec; + + + return dec; +} +#else int16_t ivas_smc_gmm( Encoder_State *st, /* i/o: state structure */ STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ @@ -1791,6 +2494,7 @@ int16_t ivas_smc_gmm( return dec; } +#endif /*---------------------------------------------------------------------* * ivas_smc_mode_selection() -- GitLab From bf8cb40d4c5712cdd9247eea91178f661db6d61a Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 28 Jun 2024 14:08:03 +0530 Subject: [PATCH 013/110] Fix for LTV-Crash (Multi-channel 7_1_4 at 96 kbps, 48kHz in, 48kHz out, 5_1 out, random FER at 5%) [x] Increased precision for lfeGain in the function ivas_lfe_synth_with_filters_fx --- lib_rend/ivas_dirac_output_synthesis_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_dirac_output_synthesis_dec.c b/lib_rend/ivas_dirac_output_synthesis_dec.c index f999f8919..cc57f1a64 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec.c @@ -5543,7 +5543,7 @@ void ivas_lfe_synth_with_filters_fx( } ELSE { - lfeGain_fx = BASOP_Util_Divide3232_Scale( hMasaLfeSynth->targetEneLfeSmooth_fx, /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, &lfeGain_fx_exp ); + lfeGain_fx = extract_h( BASOP_Util_Divide3232_Scale_cadence( hMasaLfeSynth->targetEneLfeSmooth_fx, L_add( EPSILON_FX, hMasaLfeSynth->transportEneSmooth_fx ), &lfeGain_fx_exp ) ); lfeGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneLfeSmooth_q ), lfeGain_fx_exp ); lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); lfeGain_fx = shl_r( lfeGain_fx, lfeGain_fx_exp ); // Q15 -- GitLab From 6eb0e7e56bdaeb48f4224d3f5e1b2a655508ae6c Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 28 Jun 2024 14:44:23 +0530 Subject: [PATCH 014/110] BASOP and instrumentation changes added for swb_*, ivas-ism files --- lib_com/ivas_prot.h | 8 +- lib_dec/ivas_entropy_decoder.c | 80 +- lib_dec/ivas_init_dec.c | 1133 ++++++++++++++++-------- lib_dec/ivas_init_dec_fx.c | 108 ++- lib_dec/ivas_ism_dec.c | 93 +- lib_dec/ivas_ism_dtx_dec.c | 10 +- lib_dec/ivas_ism_metadata_dec.c | 85 +- lib_dec/ivas_ism_param_dec.c | 282 ++++-- lib_dec/ivas_ism_renderer.c | 94 +- lib_dec/ivas_mc_param_dec_fx.c | 3 + lib_dec/ivas_mct_dec.c | 10 +- lib_dec/ivas_mdct_core_dec.c | 534 ++++++++--- lib_dec/ivas_mono_dmx_renderer.c | 60 +- lib_dec/ivas_objectRenderer_internal.c | 52 +- lib_dec/ivas_omasa_dec.c | 119 ++- lib_dec/ivas_osba_dec.c | 49 +- lib_dec/ivas_output_config.c | 19 +- lib_dec/jbm_jb4sb.c | 4 +- lib_dec/rst_dec_fx.c | 4 +- lib_dec/stat_noise_uv_dec_fx.c | 24 +- lib_dec/swb_bwe_dec.c | 84 +- lib_dec/swb_bwe_dec_fx.c | 108 ++- lib_dec/swb_bwe_dec_hr_fx.c | 116 ++- lib_dec/swb_bwe_dec_lr_fx.c | 33 +- lib_dec/swb_tbe_dec.c | 540 +++++++---- lib_dec/swb_tbe_dec_fx.c | 886 ++++++++++++------ lib_dec/syn_outp_fx.c | 7 +- lib_dec/tcq_core_dec_fx.c | 68 +- lib_dec/tcx_utils_dec_fx.c | 784 ++++++++-------- 29 files changed, 3546 insertions(+), 1851 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 99dff9b37..766ec38de 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -932,11 +932,13 @@ void dtx_read_padding_bits( const int16_t num_bits ); -void ivas_apply_non_diegetic_panning( +#ifndef IVAS_FLOAT_FIXED +void ivas_apply_non_diegetic_panning( float *output_f[], /* i/o: core-coder transport mono channel/stereo output */ const float non_diegetic_pan_gain, /* i : non-diegetic panning gain */ const int16_t output_frame /* i : output frame length per channel */ ); +#endif /*----------------------------------------------------------------------------------* @@ -7014,11 +7016,13 @@ void ivas_mono_downmix_render_passive( const int16_t output_frame /* i : output frame length */ ); +#ifndef IVAS_FLOAT_FIXED void ivas_mono_stereo_downmix_mcmasa( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *output_f[], /* i/o: synthesized core-coder transport channels/mono or stereo output */ int16_t output_frame /* i : output frame length per channel */ ); +#endif #ifdef IVAS_FLOAT_FIXED void ivas_lfe_synth_with_filters_fx( MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth, /* i/o: LFE synthesis structure for McMASA */ @@ -7393,11 +7397,13 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm( float *output_f[] /* o : rendered time signal */ ); #endif +#ifndef IVAS_FLOAT_FIXED void ivas_omasa_rearrange_channels( float *output[], /* o : output synthesis signal */ const int16_t nchan_transport_ism, /* i : number of ISM TCs */ const int16_t output_frame /* i : output frame length per channel */ ); +#endif #ifndef IVAS_FLOAT_FIXED void ivas_omasa_dirac_rend_jbm( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ diff --git a/lib_dec/ivas_entropy_decoder.c b/lib_dec/ivas_entropy_decoder.c index af8e4082a..9c769bf57 100644 --- a/lib_dec/ivas_entropy_decoder.c +++ b/lib_dec/ivas_entropy_decoder.c @@ -66,14 +66,16 @@ static void ivas_arith_decode_array( Word16 *pCum_freq = NULL; Tastat as; Word16 extra_bits_read = 0; + move16(); - IF( GT_16( in_len, 0 ) && GT_16( pArith->range, 1 ) ) + test(); + IF( ( in_len > 0 ) && GT_16( pArith->range, 1 ) ) { - IF( GT_16( pArith->dyn_model_bits, 0 ) ) + IF( pArith->dyn_model_bits > 0 ) { model_idx = get_next_indice( st0, pArith->dyn_model_bits ); - IF( GT_16( model_idx, 0 ) ) + IF( model_idx > 0 ) { pCum_freq = pArith->cum_freq[model_idx]; } @@ -94,15 +96,18 @@ static void ivas_arith_decode_array( ind = ivas_ari_decode_14bits_bit_ext_1_lfe( st0, &as, (const UWord16 *) pCum_freq, &extra_bits_read ); pSymbols[i] = pArith->vals[ind]; + move16(); } ivas_ari_done_decoding_14bits_ext_1_lfe( st0, extra_bits_read ); } ELSE { + FOR( i = 0; i < in_len; i++ ) { pSymbols[i] = 0; + move16(); } } @@ -126,8 +131,9 @@ static void ivas_arithCoder_decode_array_diff( { Word16 n; Word16 offset = pArith->vals[0]; + move16(); - IF( GT_16( length, 0 ) ) + IF( length > 0 ) { ivas_arith_decode_array( pArith_diff, st0, length, pOutput_arr ); } @@ -135,6 +141,7 @@ static void ivas_arithCoder_decode_array_diff( FOR( n = 0; n < length; n++ ) { pOutput_arr[n] = add( sub( pSymbol_old[n], offset ), pOutput_arr[n] ); + move16(); } #ifndef IVAS_FLOAT_FIXED @@ -146,6 +153,7 @@ static void ivas_arithCoder_decode_array_diff( FOR( n = 0; n < length; n++ ) { pOutput_arr[n] = pArith->vals[pOutput_arr[n]]; + move16(); } return; @@ -166,19 +174,25 @@ static Word16 ivas_huffman_code_bits_present( { Word16 index = add( len, 1 ); Word16 i = 0; + move16(); Word16 ind_t, code_t, bits_t; WHILE( LT_16( i, len ) ) { ind_t = codebook[0]; + move16(); bits_t = codebook[1]; + move16(); code_t = codebook[2]; + move16(); + + test(); IF( ( EQ_16( code, code_t ) ) && ( EQ_16( bits, bits_t ) ) ) { return ind_t; } codebook = codebook + 3; - i++; + i = add( i, 1 ); } return index; @@ -200,6 +214,7 @@ ivas_error ivas_huffman_decode( code = get_next_indice( st0, huff_cfg->min_len ); num_bits_read = huff_cfg->min_len; + move16(); ind = ivas_huffman_code_bits_present( huff_cfg->codebook, code, num_bits_read, huff_cfg->sym_len ); @@ -207,7 +222,7 @@ ivas_error ivas_huffman_decode( { bit = get_next_indice( st0, 1 ); num_bits_read = add( num_bits_read, 1 ); - code = code << 1 | bit; + code = s_or( shl( code, 1 ), bit ); ind = ivas_huffman_code_bits_present( huff_cfg->codebook, code, num_bits_read, huff_cfg->sym_len ); IF( GT_16( num_bits_read, huff_cfg->max_len ) ) { @@ -215,6 +230,7 @@ ivas_error ivas_huffman_decode( } } *dec_out = ind; + move16(); return IVAS_ERR_OK; } @@ -234,11 +250,12 @@ static void arith_decode_cell_array( Word16 *pSymbol ) { Word16 total_symbol_len = 0; + move16(); Word16 i; FOR( i = 0; i < num_bands; i++ ) { - total_symbol_len += ( pCell_dims[i].dim1 * pCell_dims[i].dim2 ); + total_symbol_len = add( total_symbol_len, imult1616( pCell_dims[i].dim1, pCell_dims[i].dim2 ) ); } assert( LE_16( total_symbol_len, IVAS_MAX_INPUT_LEN ) ); @@ -265,11 +282,12 @@ static void arith_decode_cell_array_diff( Word16 *pSymbol_old ) { Word16 total_symbol_len = 0; + move16(); Word16 i; FOR( i = 0; i < num_bands; i++ ) { - total_symbol_len += ( pCell_dims[i].dim1 * pCell_dims[i].dim2 ); + total_symbol_len = add( total_symbol_len, imult1616( pCell_dims[i].dim1, pCell_dims[i].dim2 ) ); } assert( LE_16( total_symbol_len, IVAS_MAX_INPUT_LEN ) ); @@ -300,16 +318,19 @@ void ivas_arith_decode_cmplx_cell_array( Word16 cell_arr_no_diff[IVAS_MAX_INPUT_LEN]; Word16 cell_arr_diff_out[IVAS_MAX_INPUT_LEN]; Word16 idx2 = 0; + move16(); FOR( i = 0; i < num_bands; i++ ) { - IF( NE_16( pDo_diff[i], 0 ) ) + IF( pDo_diff[i] != 0 ) { any_diff = 1; + move16(); } ELSE { all_diff = 0; + move16(); } } @@ -324,35 +345,49 @@ void ivas_arith_decode_cmplx_cell_array( ivas_cell_dim_t cell_dims[IVAS_MAX_NUM_BANDS]; ivas_cell_dim_t cell_dims_diff[IVAS_MAX_NUM_BANDS]; Word16 idx1 = 0, idx = 0; + move16(); + move16(); FOR( i = 0; i < num_bands; i++ ) { - len = pCell_dims[i].dim1 * pCell_dims[i].dim2; - IF( NE_16( pDo_diff[i], 0 ) ) + len = imult1616( pCell_dims[i].dim1, pCell_dims[i].dim2 ); + IF( pDo_diff[i] != 0 ) { cell_dims[i].dim1 = 0; + move16(); cell_dims[i].dim2 = 0; + move16(); FOR( j = 0; j < len; j++ ) { - cell_arr_diff[idx++] = pSymbol_re_old[idx1++]; + cell_arr_diff[idx] = pSymbol_re_old[idx1]; + move16(); + idx = add( idx, 1 ); + idx1 = add( idx1, 1 ); } cell_dims_diff[i].dim1 = pCell_dims[i].dim1; + move16(); cell_dims_diff[i].dim2 = pCell_dims[i].dim2; + move16(); } ELSE { FOR( j = 0; j < len; j++ ) { cell_arr_diff[idx] = 0; - idx1++; + move16(); + idx1 = add( idx1, 1 ); } cell_dims[i].dim1 = pCell_dims[i].dim1; + move16(); cell_dims[i].dim2 = pCell_dims[i].dim2; + move16(); cell_dims_diff[i].dim1 = 0; + move16(); cell_dims_diff[i].dim2 = 0; + move16(); } } @@ -361,21 +396,30 @@ void ivas_arith_decode_cmplx_cell_array( arith_decode_cell_array_diff( cell_dims_diff, st0, num_bands, pArith_re, pArith_re_diff, cell_arr_diff_out, cell_arr_diff ); idx = 0; + move16(); idx1 = 0; + move16(); + FOR( i = 0; i < num_bands; i++ ) { - IF( NE_16( pDo_diff[i], 0 ) ) + IF( pDo_diff[i] != 0 ) { - FOR( j = 0; j < cell_dims_diff[i].dim1 * cell_dims_diff[i].dim2; j++ ) + FOR( j = 0; j < imult1616( cell_dims_diff[i].dim1, cell_dims_diff[i].dim2 ); j++ ) { - pSymbol_re[idx++] = cell_arr_diff_out[idx2++]; + pSymbol_re[idx] = cell_arr_diff_out[idx2]; + move16(); + idx = add( idx, 1 ); + idx2 = add( idx2, 1 ); } } ELSE { - FOR( j = 0; j < cell_dims[i].dim1 * cell_dims[i].dim2; j++ ) + FOR( j = 0; j < imult1616( cell_dims[i].dim1, cell_dims[i].dim2 ); j++ ) { - pSymbol_re[idx++] = cell_arr_no_diff[idx1++]; + pSymbol_re[idx] = cell_arr_no_diff[idx1]; + move16(); + idx = add( idx, 1 ); + idx1 = add( idx1, 1 ); } } } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 214c004fa..294a97bf5 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -83,11 +83,14 @@ ivas_error ivas_dec_setup( ivas_error error; error = IVAS_ERR_OK; - + move32(); num_bits_read = 0; + move16(); element_mode_flag = 0; + move16(); ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + move16(); /*-------------------------------------------------------------------* * Read IVAS format @@ -97,12 +100,13 @@ ivas_error ivas_dec_setup( Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; Word16 num_src = 0; + move16(); /*-------------------------------------------------------------------* * Read other signling (ISM/MC mode, number of channels, etc.) *-------------------------------------------------------------------*/ - IF( EQ_16( is_DTXrate( ivas_total_brate ), 0 ) ) + IF( is_DTXrate( ivas_total_brate ) == 0 ) { /*-------------------------------------------------------------------* * Read IVAS format related signaling: @@ -112,45 +116,55 @@ ivas_error ivas_dec_setup( * - in MC : read LS setup *-------------------------------------------------------------------*/ - IF( st_ivas->ivas_format == STEREO_FORMAT ) + IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) { element_mode_flag = 1; + move16(); } - ELSE IF( st_ivas->ivas_format == ISM_FORMAT ) + ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { /* read the number of objects */ st_ivas->nchan_transport = 1; + move16(); nchan_ism = 1; - k = (Word16) ( ( ivas_total_brate / FRAMES_PER_SEC ) - 1 ); + move16(); + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + k = extract_l( L_sub( res_dec, 1 ) ); + + test(); WHILE( st_ivas->bit_stream[k] && LT_16( nchan_ism, MAX_NUM_OBJECTS ) ) { - nchan_ism++; - k--; + nchan_ism = add( nchan_ism, 1 ); + k = sub( k, 1 ); } st_ivas->nchan_ism = nchan_ism; + move16(); - IF( ( error = ivas_ism_dec_config_fx( st_ivas, st_ivas->ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_ism_dec_config_fx( st_ivas, st_ivas->ism_mode, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) { return error; } } - ELSE IF( st_ivas->ivas_format == SBA_FORMAT ) + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) { /* read Ambisonic (SBA) planar flag */ st_ivas->sba_planar = st_ivas->bit_stream[num_bits_read]; - + move16(); num_bits_read = add( num_bits_read, SBA_PLANAR_BITS ); /* read Ambisonic (SBA) order */ st_ivas->sba_order = st_ivas->bit_stream[num_bits_read + 1]; - st_ivas->sba_order += 2 * st_ivas->bit_stream[num_bits_read]; - - + move16(); + st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[num_bits_read], 1 ) ); + move16(); num_bits_read = add( num_bits_read, SBA_ORDER_BITS ); - IF( GT_16( st_ivas->ini_frame, 0 ) && NE_32( ivas_total_brate, st_ivas->last_active_ivas_total_brate ) && GT_32( ivas_total_brate, IVAS_SID_5k2 ) ) + test(); + test(); + IF( st_ivas->ini_frame > 0 && NE_32( ivas_total_brate, st_ivas->last_active_ivas_total_brate ) && GT_32( ivas_total_brate, IVAS_SID_5k2 ) ) { - IF( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) { return error; } @@ -159,36 +173,45 @@ ivas_error ivas_dec_setup( { /* set Ambisonic (SBA) order used for analysis and coding */ st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->sba_order ); + move16(); ivas_sba_config_fx( ivas_total_brate, st_ivas->sba_analysis_order, -1, &( st_ivas->nchan_transport ), st_ivas->sba_planar, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init ); } } - ELSE IF( st_ivas->ivas_format == MASA_FORMAT ) + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) { /* read number of MASA transport channels */ - IF( st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 1] ) + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + IF( st_ivas->bit_stream[res_dec - 1] ) { st_ivas->nchan_transport = 2; + move16(); element_mode_flag = 1; + move16(); } ELSE { st_ivas->nchan_transport = 1; + move16(); } - IF( GT_16( st_ivas->ini_frame, 0 ) ) + IF( st_ivas->ini_frame > 0 ) { /* reconfigure in case a change of operation mode is detected */ - IF( ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) || EQ_16( st_ivas->ini_active_frame, 0 ) ) + test(); + test(); + IF( ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) || ( st_ivas->ini_active_frame == 0 ) ) { - IF( st_ivas->last_ivas_format == MASA_FORMAT ) + IF( EQ_32( st_ivas->last_ivas_format, MASA_FORMAT ) ) { - IF( EQ_16( st_ivas->ini_active_frame, 0 ) && NE_32( ivas_total_brate, FRAME_NO_DATA ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) && EQ_16( st_ivas->nCPE, 1 ) ) + IF( ( st_ivas->ini_active_frame == 0 ) && NE_32( ivas_total_brate, FRAME_NO_DATA ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) && EQ_16( st_ivas->nCPE, 1 ) ) { st_ivas->hCPE[0]->nchan_out = 1; + move16(); } ELSE { - IF( ( error = ivas_masa_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_masa_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) { return error; } @@ -196,7 +219,7 @@ ivas_error ivas_dec_setup( } ELSE { - IF( ( error = ivas_omasa_dec_config_fx( st_ivas, nSamplesRendered, &num_src, SrcInd, data ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_omasa_dec_config_fx( st_ivas, nSamplesRendered, &num_src, SrcInd, data ) ), IVAS_ERR_OK ) ) { return error; } @@ -204,52 +227,66 @@ ivas_error ivas_dec_setup( } } } - ELSE IF( st_ivas->ivas_format == MASA_ISM_FORMAT ) + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { st_ivas->nchan_transport = 2; /* always 2 MASA transport channels */ - + move16(); /* for the DISC mode the number of objects are written at the end of the bitstream, in the MASA metadata */ - st_ivas->nchan_ism = 2 * st_ivas->bit_stream[ivas_total_brate / FRAMES_PER_SEC - 1] + st_ivas->bit_stream[ivas_total_brate / FRAMES_PER_SEC - 2] + 1; - st_ivas->ism_mode = ivas_omasa_ism_mode_select_fx( ivas_total_brate, st_ivas->nchan_ism ); - move32(); - IF( GT_16( st_ivas->ini_frame, 0 ) ) + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + st_ivas->nchan_ism = add( add( shl( st_ivas->bit_stream[L_sub( res_dec, 1 )], 1 ), st_ivas->bit_stream[L_sub( res_dec, 2 )] ), 1 ); + move16(); + st_ivas->ism_mode = ivas_omasa_ism_mode_select_fx( ivas_total_brate, st_ivas->nchan_ism ); + move16(); + IF( st_ivas->ini_frame > 0 ) { /* reconfigure in case a change of operation mode is detected */ - IF( ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) || EQ_16( st_ivas->ini_active_frame, 0 ) ) + test(); + test(); + IF( ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) || ( st_ivas->ini_active_frame == 0 ) ) { - IF( ( error = ivas_omasa_dec_config_fx( st_ivas, nSamplesRendered, &num_src, SrcInd, data ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_omasa_dec_config_fx( st_ivas, nSamplesRendered, &num_src, SrcInd, data ) ), IVAS_ERR_OK ) ) { return error; } } } } - ELSE IF( st_ivas->ivas_format == SBA_ISM_FORMAT ) + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { /* the number of objects is written at the end of the bitstream, in the SBA metadata */ - st_ivas->nchan_ism = 2 * st_ivas->bit_stream[ivas_total_brate / FRAMES_PER_SEC - 1] + st_ivas->bit_stream[ivas_total_brate / FRAMES_PER_SEC - 2] + 1; + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + st_ivas->nchan_ism = add( add( shl( st_ivas->bit_stream[L_sub( res_dec, 1 )], 1 ), st_ivas->bit_stream[L_sub( res_dec, 2 )] ), 1 ); + move16(); + test(); IF( LT_32( ivas_total_brate, IVAS_24k4 ) || GE_32( ivas_total_brate, IVAS_256k ) ) { /* read Ambisonic (SBA) planar flag */ st_ivas->sba_planar = st_ivas->bit_stream[num_bits_read]; + move16(); num_bits_read = add( num_bits_read, SBA_PLANAR_BITS ); } st_ivas->sba_order = st_ivas->bit_stream[num_bits_read + 1]; - st_ivas->sba_order += 2 * st_ivas->bit_stream[num_bits_read]; + move16(); + st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[num_bits_read], 1 ) ); + move16(); num_bits_read = add( num_bits_read, SBA_ORDER_BITS ); /* read Ambisonic (SBA) order */ IF( LT_32( ivas_total_brate, IVAS_256k ) ) { st_ivas->sba_order = 3; + move16(); } - IF( GT_16( st_ivas->ini_frame, 0 ) && NE_32( ivas_total_brate, st_ivas->last_active_ivas_total_brate ) ) + test(); + IF( st_ivas->ini_frame > 0 && NE_32( ivas_total_brate, st_ivas->last_active_ivas_total_brate ) ) { - IF( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) { return error; } @@ -258,40 +295,46 @@ ivas_error ivas_dec_setup( { /* set Ambisonic (SBA) order used for analysis and coding */ st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->sba_order ); + move16(); ivas_sba_config_fx( ivas_total_brate, st_ivas->sba_analysis_order, -1, &( st_ivas->nchan_transport ), st_ivas->sba_planar, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init ); /*correct number of CPEs for discrete ISM coding*/ - IF( GT_16( st_ivas->ini_frame, 0 ) && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + test(); + IF( st_ivas->ini_frame > 0 && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { - st_ivas->nCPE += add( st_ivas->nchan_ism, 1 ) >> 1; + st_ivas->nCPE = add( st_ivas->nCPE, shr( add( st_ivas->nchan_ism, 1 ), 1 ) ); + move16(); } } IF( GE_32( ivas_total_brate, IVAS_256k ) ) { st_ivas->ism_mode = ISM_SBA_MODE_DISC; + move32(); } ELSE { st_ivas->ism_mode = ISM_MODE_NONE; + move32(); } } - ELSE IF( st_ivas->ivas_format == MC_FORMAT ) + ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) { /* read MC configuration */ idx = 0; + move16(); FOR( k = 0; k < MC_LS_SETUP_BITS; k++ ) { IF( st_ivas->bit_stream[num_bits_read + k] ) { - idx += 1 << ( MC_LS_SETUP_BITS - 1 - k ); + idx = add( idx, shl( 1, sub( ( MC_LS_SETUP_BITS - 1 ), k ) ) ); } } num_bits_read = add( num_bits_read, MC_LS_SETUP_BITS ); /* select MC format mode; reconfigure the MC format decoder */ - IF( ( error = ivas_mc_dec_config_fx( st_ivas, idx, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_mc_dec_config_fx( st_ivas, idx, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) { return error; } @@ -301,7 +344,7 @@ ivas_error ivas_dec_setup( * Read element mode *-------------------------------------------------------------------*/ - IF( EQ_16( st_ivas->ini_frame, 0 ) && element_mode_flag ) + IF( st_ivas->ini_frame == 0 && element_mode_flag ) { /* read stereo technology info */ IF( LT_32( ivas_total_brate, MIN_BRATE_MDCT_STEREO ) ) @@ -310,15 +353,18 @@ ivas_error ivas_dec_setup( IF( st_ivas->bit_stream[num_bits_read] ) { st_ivas->element_mode_init = add( 1, IVAS_CPE_DFT ); + move16(); } ELSE { st_ivas->element_mode_init = add( 0, IVAS_CPE_DFT ); + move16(); } } ELSE { st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); } } } @@ -328,101 +374,140 @@ ivas_error ivas_dec_setup( { case SID_DFT_STEREO: st_ivas->element_mode_init = IVAS_CPE_DFT; + move16(); BREAK; case SID_MDCT_STEREO: st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); BREAK; case SID_ISM: st_ivas->element_mode_init = IVAS_SCE; + move16(); BREAK; case SID_MASA_1TC: st_ivas->element_mode_init = IVAS_SCE; + move16(); st_ivas->nchan_transport = 1; + move16(); BREAK; case SID_MASA_2TC: - IF( st_ivas->bit_stream[ivas_total_brate / FRAMES_PER_SEC - 1 - SID_FORMAT_NBITS] == 1 ) + move16(); + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + IF( EQ_16( st_ivas->bit_stream[L_sub( L_sub( res_dec, 1 ), SID_FORMAT_NBITS )], 1 ) ) { st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); } ELSE { st_ivas->element_mode_init = IVAS_CPE_DFT; + move16(); } st_ivas->nchan_transport = 2; + move16(); BREAK; case SID_SBA_1TC: st_ivas->element_mode_init = IVAS_SCE; + move16(); BREAK; case SID_SBA_2TC: st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); BREAK; } - IF( GT_16( st_ivas->ini_frame, 0 ) && st_ivas->ivas_format == SBA_FORMAT ) + test(); + IF( st_ivas->ini_frame > 0 && EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) { Word16 nchan_transport_old, nchan_transport; nchan_transport_old = st_ivas->nchan_transport; - nchan_transport = ( EQ_16( st_ivas->sid_format, SID_SBA_2TC ) ) ? 2 : 1; + move16(); + IF( ( EQ_16( st_ivas->sid_format, SID_SBA_2TC ) ) ) + { + nchan_transport = 2; + } + ELSE + { + nchan_transport = 1; + } + move16(); - IF( ( nchan_transport_old != nchan_transport ) ) + IF( NE_16( nchan_transport_old, nchan_transport ) ) { /*Setting the default bitrate for the reconfig function*/ IF( EQ_16( st_ivas->sid_format, SID_SBA_2TC ) ) { st_ivas->hDecoderConfig->ivas_total_brate = IVAS_48k; + move16(); } ELSE { st_ivas->hDecoderConfig->ivas_total_brate = IVAS_24k4; + move16(); } - IF( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) { return error; } st_ivas->last_active_ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + move32(); st_ivas->hDecoderConfig->ivas_total_brate = ivas_total_brate; + move32(); } } - IF( st_ivas->ivas_format == ISM_FORMAT ) + IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { ISM_MODE last_ism_mode = st_ivas->ism_mode; - + move32(); /* read the number of objects */ st_ivas->nchan_transport = 1; + move16(); nchan_ism = 1; - k = (Word16) ( ( ivas_total_brate / FRAMES_PER_SEC ) - 1 ) - SID_FORMAT_NBITS; + move16(); + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + k = extract_l( L_sub( L_sub( res_dec, 1 ), SID_FORMAT_NBITS ) ); + move16(); + test(); WHILE( st_ivas->bit_stream[k] && LT_16( nchan_ism, MAX_NUM_OBJECTS ) ) { - nchan_ism++; - k--; + nchan_ism = add( nchan_ism, 1 ); + k = sub( k, 1 ); } - k--; + k = sub( k, 1 ); + test(); if ( st_ivas->ini_frame > 0 && nchan_ism != st_ivas->nchan_ism ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" ); } st_ivas->nchan_ism = nchan_ism; - + move16(); /* read ism_mode */ st_ivas->ism_mode = ISM_MODE_DISC; - IF( GT_16( nchan_ism, 2 ) ) + move32(); + if ( GT_16( nchan_ism, 2 ) ) { k -= nchan_ism; /* SID metadata flags */ + move16(); idx = st_ivas->bit_stream[k]; + move16(); st_ivas->ism_mode = (ISM_MODE) add( idx, 1 ); + move32(); } IF( st_ivas->ini_frame == 0 ) { last_ism_mode = st_ivas->ism_mode; + move32(); } - IF( ( error = ivas_ism_dec_config_fx( st_ivas, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_ism_dec_config_fx( st_ivas, last_ism_mode, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) { return error; } @@ -434,14 +519,14 @@ ivas_error ivas_dec_setup( * and number of transport channels *-------------------------------------------------------------------*/ - IF( EQ_16( st_ivas->ini_frame, 0 ) && st_ivas->ivas_format != UNDEFINED_FORMAT ) + IF( st_ivas->ini_frame == 0 && NE_32( st_ivas->ivas_format, UNDEFINED_FORMAT ) ) { - IF( ( error = doSanityChecks_IVAS( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = doSanityChecks_IVAS( st_ivas ) ), IVAS_ERR_OK ) ) { return IVAS_ERROR( error, "Sanity checks failed" ); } - IF( ( error = ivas_init_decoder_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_init_decoder_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -457,11 +542,21 @@ ivas_error ivas_dec_setup( reset_elements( st_ivas ); /* update bitstream buffer pointer -> take into account already read bits */ - IF( ( GT_16( st_ivas->nSCE, 0 ) ) || ( GT_16( st_ivas->nCPE, 0 ) ) ) + test(); + IF( ( st_ivas->nSCE > 0 ) || ( st_ivas->nCPE > 0 ) ) { - st = GT_16( st_ivas->nSCE, 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + IF( st_ivas->nSCE > 0 ) + { + st = st_ivas->hSCE[0]->hCoreCoder[0]; + } + ELSE + { + st = st_ivas->hCPE[0]->hCoreCoder[0]; + } st->next_bit_pos = num_bits_read; + move16(); st->total_brate = ACELP_8k00; /* only temporary initialization - this is needed for get_next_indice() in the frame following NO_DATA frame */ + move32(); } return error; @@ -865,7 +960,6 @@ ivas_error ivas_dec_setup( #endif -// ivas_param_ism_dec /*-------------------------------------------------------------------* * ivas_read_format() * @@ -883,129 +977,162 @@ static ivas_error ivas_read_format( ivas_error error; error = IVAS_ERR_OK; + move32(); ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; move32(); *num_bits_read = 0; move16(); - + test(); IF( !st_ivas->bfi && is_DTXrate( ivas_total_brate ) == 0 ) { /* read IVAS format */ k = 0; + move16(); IF( st_ivas->bit_stream[*num_bits_read] ) { k = 1; + move16(); } - k <<= 1; - ( *num_bits_read )++; - + k = shl( k, 1 ); + ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); + move16(); IF( st_ivas->bit_stream[*num_bits_read] ) { - k += 1; + k = add( k, 1 ); } - ( *num_bits_read )++; - + ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); + move16(); SWITCH( k ) { case 0: st_ivas->ivas_format = STEREO_FORMAT; + move32(); BREAK; case 1: st_ivas->ivas_format = MC_FORMAT; + move32(); BREAK; case 2: st_ivas->ivas_format = ISM_FORMAT; + move32(); - IF( ivas_total_brate >= IVAS_24k4 ) + IF( GE_32( ivas_total_brate, IVAS_24k4 ) ) { IF( st_ivas->bit_stream[*num_bits_read] ) { - ( *num_bits_read )++; + ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); + move16(); IF( st_ivas->bit_stream[*num_bits_read] ) { st_ivas->ivas_format = SBA_ISM_FORMAT; + move32(); } ELSE { st_ivas->ivas_format = MASA_ISM_FORMAT; + move32(); } } - ( *num_bits_read )++; + ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); + move16(); } BREAK; case 3: IF( st_ivas->bit_stream[*num_bits_read] ) { st_ivas->ivas_format = MASA_FORMAT; + move32(); } ELSE { st_ivas->ivas_format = SBA_FORMAT; + move32(); /* read Ambisonic (SBA) planar flag */ - st_ivas->sba_planar = st_ivas->bit_stream[( *num_bits_read ) + 1]; + st_ivas->sba_planar = st_ivas->bit_stream[add( ( *num_bits_read ), 1 )]; + move16(); /* read Ambisonic (SBA) order */ - st_ivas->sba_order = st_ivas->bit_stream[( *num_bits_read ) + 2 + SBA_PLANAR_BITS]; - st_ivas->sba_order += 2 * st_ivas->bit_stream[( *num_bits_read ) + 1 + SBA_PLANAR_BITS]; + st_ivas->sba_order = st_ivas->bit_stream[add( add( ( *num_bits_read ), 2 ), SBA_PLANAR_BITS )]; + move16(); + st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[add( add( ( *num_bits_read ), 1 ), SBA_PLANAR_BITS )], 1 ) ); + move16(); IF( st_ivas->sba_order == 0 ) { st_ivas->ivas_format = SBA_ISM_FORMAT; + move32(); } } - ( *num_bits_read )++; + ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); + move16(); BREAK; } } - ELSE IF( EQ_16( st_ivas->bfi, 0 ) && ivas_total_brate == IVAS_SID_5k2 ) + ELSE IF( ( st_ivas->bfi == 0 ) && EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) { /* read IVAS format in SID frame */ idx = 0; + move16(); FOR( k = 0; k < SID_FORMAT_NBITS; k++ ) { - idx += st_ivas->bit_stream[k] << ( SID_FORMAT_NBITS - 1 - k ); + idx = add( idx, shl( st_ivas->bit_stream[k], sub( sub( SID_FORMAT_NBITS, 1 ), k ) ) ); } ( *num_bits_read ) = add( *num_bits_read, SID_FORMAT_NBITS ); + move16(); st_ivas->sid_format = idx; + move16(); SWITCH( idx ) { case SID_DFT_STEREO: case SID_MDCT_STEREO: st_ivas->ivas_format = STEREO_FORMAT; + move32(); BREAK; case SID_ISM: st_ivas->ivas_format = ISM_FORMAT; - + move32(); BREAK; case SID_MULTICHANNEL: st_ivas->ivas_format = MC_FORMAT; + move32(); BREAK; case SID_SBA_1TC: st_ivas->ivas_format = SBA_FORMAT; + move32(); st_ivas->element_mode_init = IVAS_SCE; + move16(); BREAK; case SID_SBA_2TC: st_ivas->ivas_format = SBA_FORMAT; + move32(); st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); BREAK; case SID_MASA_1TC: st_ivas->ivas_format = MASA_FORMAT; + move32(); st_ivas->element_mode_init = IVAS_SCE; + move16(); BREAK; case SID_MASA_2TC: st_ivas->ivas_format = MASA_FORMAT; - IF( st_ivas->bit_stream[ivas_total_brate / FRAMES_PER_SEC - 1] == 1 ) + move32(); + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + IF( st_ivas->bit_stream[res_dec - 1] == 1 ) { st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); } ELSE { st_ivas->element_mode_init = IVAS_CPE_DFT; + move16(); } BREAK; default: @@ -1013,17 +1140,19 @@ static ivas_error ivas_read_format( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Invalid value %c found in SID format field.", st_ivas->sid_format ); } - IF( st_ivas->ivas_format == SBA_FORMAT ) + IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) { IF( st_ivas->sba_analysis_order == 0 ) { st_ivas->sba_analysis_order = SBA_FOA_ORDER; + move16(); } } /* reset bitstream handle to avoid BER detection after reading the 2400 kbps for ch0 */ - st_ivas->bit_stream += ( *num_bits_read ); + st_ivas->bit_stream = st_ivas->bit_stream + ( *num_bits_read ); ( *num_bits_read ) = 0; + move16(); } ELSE { @@ -1211,27 +1340,31 @@ Word16 getNumChanSynthesis( Word16 n; n = add( st_ivas->nSCE, imult1616( CPE_CHANNELS, st_ivas->nCPE ) ); - + test(); + test(); + test(); IF( st_ivas->sba_dirac_stereo_flag ) { n = CPE_CHANNELS; + move16(); } - ELSE IF( ( st_ivas->hMCT != NULL || EQ_16( st_ivas->ivas_format, SBA_FORMAT ) ) && NE_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + ELSE IF( ( st_ivas->hMCT != NULL || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) && NE_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { n = st_ivas->nchan_transport; + move16(); } - ELSE IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - IF( EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { n = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); } ELSE { n = st_ivas->nchan_transport; + move16(); } } - move16(); return n; } @@ -1336,7 +1469,7 @@ ivas_error ivas_init_decoder_front( ivas_error error; error = IVAS_ERR_OK; - + move32(); /*-----------------------------------------------------------------* * Resets *-----------------------------------------------------------------*/ @@ -1347,10 +1480,10 @@ ivas_error ivas_init_decoder_front( move16(); st_ivas->nchan_transport = -1; move16(); - st_ivas->ism_mode = ISM_MODE_NONE; + move32(); st_ivas->mc_mode = MC_MODE_NONE; - + move32(); st_ivas->sba_dirac_stereo_flag = 0; move32(); @@ -1385,12 +1518,12 @@ ivas_error ivas_init_decoder_front( IF( st_ivas->hDecoderConfig->Opt_Headrotation ) { - IF( ( error = ivas_headTrack_open_fx( &( st_ivas->hHeadTrackData ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_headTrack_open_fx( &( st_ivas->hHeadTrackData ) ) ), IVAS_ERR_OK ) ) { return error; } error = ivas_orient_trk_SetTrackingType_fx( st_ivas->hHeadTrackData->OrientationTracker, st_ivas->hDecoderConfig->orientation_tracking ); - IF( ( error ) != IVAS_ERR_OK ) + IF( NE_32( ( error ), IVAS_ERR_OK ) ) { return error; } @@ -1401,7 +1534,7 @@ ivas_error ivas_init_decoder_front( IF( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) { - IF( ( error = ivas_external_orientation_open( &( st_ivas->hExtOrientationData ), st_ivas->hDecoderConfig->render_framesize ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_external_orientation_open( &( st_ivas->hExtOrientationData ), st_ivas->hDecoderConfig->render_framesize ) ), IVAS_ERR_OK ) ) { return error; } @@ -1420,10 +1553,10 @@ ivas_error ivas_init_decoder_front( /*-------------------------------------------------------------------* * Allocate and initialize combined orientation handle *--------------------------------------------------------------------*/ - + test(); IF( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) { - IF( ( error = ivas_combined_orientation_open( &( st_ivas->hCombinedOrientationData ), st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->render_framesize ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_combined_orientation_open( &( st_ivas->hCombinedOrientationData ), st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->render_framesize ) ), IVAS_ERR_OK ) ) { return error; } @@ -1448,22 +1581,22 @@ ivas_error ivas_init_decoder_front( IF( st_ivas->hDecoderConfig->Opt_HRTF_binary ) { - IF( ( error = ivas_HRTF_binary_open_fx( &( st_ivas->hHrtfTD ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_HRTF_binary_open_fx( &( st_ivas->hHrtfTD ) ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_HRTF_CRend_binary_open_fx( &( st_ivas->hSetOfHRTF ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_HRTF_CRend_binary_open_fx( &( st_ivas->hSetOfHRTF ) ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_HRTF_fastconv_binary_open_fx( &st_ivas->hHrtfFastConv ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_HRTF_fastconv_binary_open_fx( &st_ivas->hHrtfFastConv ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_HRTF_parambin_binary_open_fx( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_HRTF_parambin_binary_open_fx( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) { return error; } @@ -1475,19 +1608,19 @@ ivas_error ivas_init_decoder_front( IF( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { - IF( ( error = ivas_render_config_open( &( st_ivas->hRenderConfig ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_render_config_open( &( st_ivas->hRenderConfig ) ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_render_config_init_from_rom_fx( &st_ivas->hRenderConfig ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_render_config_init_from_rom_fx( &st_ivas->hRenderConfig ) ), IVAS_ERR_OK ) ) { return error; } #ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED /*FLOAT CODE*/ - IF( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig ) ), IVAS_ERR_OK ) ) { return error; } @@ -1644,36 +1777,43 @@ ivas_error ivas_init_decoder_fx( Word32 ism_total_brate; error = IVAS_ERR_OK; - + move32(); output_Fs = st_ivas->hDecoderConfig->output_Fs; + move32(); hDecoderConfig = st_ivas->hDecoderConfig; output_config = hDecoderConfig->output_config; ivas_total_brate = hDecoderConfig->ivas_total_brate; - + move32(); hDecoderConfig->last_ivas_total_brate = ivas_total_brate; + move32(); st_ivas->last_active_ivas_total_brate = ivas_total_brate; - + move32(); /*-----------------------------------------------------------------* * Set number of output channels for EXTERNAL output config. *-----------------------------------------------------------------*/ - IF( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { - IF( st_ivas->ivas_format == SBA_ISM_FORMAT ) + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { hDecoderConfig->nchan_out = audioCfg2channels( IVAS_AUDIO_CONFIG_HOA3 ); - hDecoderConfig->nchan_out += st_ivas->nchan_ism; + move16(); + hDecoderConfig->nchan_out = add( hDecoderConfig->nchan_out, st_ivas->nchan_ism ); + move16(); } - ELSE IF( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { - hDecoderConfig->nchan_out = st_ivas->nchan_transport + st_ivas->nchan_ism; + hDecoderConfig->nchan_out = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); + move16(); } - ELSE IF( !( st_ivas->ism_mode == ISM_MODE_PARAM ) ) + ELSE IF( !EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) { hDecoderConfig->nchan_out = st_ivas->nchan_transport; + move32(); } st_ivas->hOutSetup.nchan_out_woLFE = hDecoderConfig->nchan_out; + move32(); } /*-----------------------------------------------------------------* @@ -1681,32 +1821,40 @@ ivas_error ivas_init_decoder_fx( *-----------------------------------------------------------------*/ st_ivas->intern_config = output_config; - + move32(); ivas_output_init( &( st_ivas->hOutSetup ), output_config ); - - IF( st_ivas->ivas_format == SBA_ISM_FORMAT && output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { st_ivas->hOutSetup.ambisonics_order = SBA_HOA3_ORDER; + move32(); st_ivas->intern_config = IVAS_AUDIO_CONFIG_7_1_4; + move32(); st_ivas->hOutSetup.output_config = st_ivas->intern_config; + move32(); st_ivas->hOutSetup.nchan_out_woLFE = audioCfg2channels( st_ivas->intern_config ); } - - IF( st_ivas->ivas_format == SBA_ISM_FORMAT && output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { st_ivas->hOutSetup.ambisonics_order = SBA_HOA3_ORDER; + move32(); st_ivas->intern_config = IVAS_AUDIO_CONFIG_HOA3; + move32(); st_ivas->hOutSetup.output_config = IVAS_AUDIO_CONFIG_HOA3; + move32(); st_ivas->hOutSetup.nchan_out_woLFE = audioCfg2channels( IVAS_AUDIO_CONFIG_HOA3 ); + move16(); } /* Only initialize transport setup if it is used */ - IF( st_ivas->transport_config != IVAS_AUDIO_CONFIG_INVALID ) + IF( NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_INVALID ) ) { ivas_output_init( &( st_ivas->hTransSetup ), st_ivas->transport_config ); } - IF( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) + test(); + IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) { ivas_mcmasa_setNumTransportChannels_fx( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); @@ -1715,14 +1863,18 @@ ivas_error ivas_init_decoder_fx( ivas_renderer_select( st_ivas ); - IF( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { IF( ( error = ivas_ls_custom_output_init_fx( st_ivas ) ) == IVAS_ERR_OK ) { st_ivas->hOutSetup.ls_azimuth_fx = st_ivas->hLsSetupCustom->ls_azimuth_fx; + move32(); st_ivas->hOutSetup.ls_elevation_fx = st_ivas->hLsSetupCustom->ls_elevation_fx; + move32(); st_ivas->hIntSetup.ls_azimuth_fx = st_ivas->hLsSetupCustom->ls_azimuth_fx; + move32(); st_ivas->hIntSetup.ls_elevation_fx = st_ivas->hLsSetupCustom->ls_elevation_fx; + move32(); } ELSE { @@ -1732,19 +1884,23 @@ ivas_error ivas_init_decoder_fx( ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); - IF( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) + test(); + IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) { ivas_mcmasa_set_separate_channel_mode_fx( &( st_ivas->hIntSetup.separateChannelEnabled ), &( st_ivas->hIntSetup.separateChannelIndex ), ivas_total_brate ); - IF( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.separateChannelEnabled ) + test(); + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && st_ivas->hOutSetup.separateChannelEnabled ) { st_ivas->hLsSetupCustom->separate_ch_found = 0; - IF( st_ivas->hOutSetup.nchan_out_woLFE >= MCMASA_MIN_SPEAKERS_SEPARATE_CENTER ) + move16(); + IF( GE_16( st_ivas->hOutSetup.nchan_out_woLFE, MCMASA_MIN_SPEAKERS_SEPARATE_CENTER ) ) { /* check for a speaker at (0, 0) if minimum speaker count is available */ FOR( i = 0; i < st_ivas->hOutSetup.nchan_out_woLFE; i++ ) { - IF( L_shr( st_ivas->hOutSetup.ls_azimuth_fx[i], Q22 ) == 0 && L_shr( st_ivas->hOutSetup.ls_elevation_fx[i], Q22 ) == 0 ) + test(); + IF( ( L_shr( st_ivas->hOutSetup.ls_azimuth_fx[i], Q22 ) == 0 ) && ( L_shr( st_ivas->hOutSetup.ls_elevation_fx[i], Q22 ) == 0 ) ) { st_ivas->hIntSetup.separateChannelIndex = i; move16(); @@ -1765,36 +1921,36 @@ ivas_error ivas_init_decoder_fx( IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) { st_ivas->nSCE = 1; /* in mono, there is always only one SCE */ - st_ivas->nCPE = 0; - st_ivas->nchan_transport = 1; - sce_id = 0; move16(); + st_ivas->nCPE = 0; move16(); + st_ivas->nchan_transport = 1; move16(); + sce_id = 0; move16(); - IF( ( error = create_sce_dec( st_ivas, sce_id, ivas_total_brate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) { return error; } reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); } - ELSE IF( st_ivas->ivas_format == STEREO_FORMAT ) + ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) { st_ivas->nchan_transport = CPE_CHANNELS; + move16(); st_ivas->intern_config = IVAS_AUDIO_CONFIG_STEREO; + move32(); st_ivas->nSCE = 0; - st_ivas->nCPE = 1; /* in stereo, there is always only one CPE */ - cpe_id = 0; - move16(); - move16(); move16(); + st_ivas->nCPE = 1; /* in stereo, there is always only one CPE */ move16(); + cpe_id = 0; move16(); - IF( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) { return error; } @@ -1805,9 +1961,9 @@ ivas_error ivas_init_decoder_fx( } /* init EFAP for custom LS output and set hTransSetup */ - IF( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - IF( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hOutSetup.ls_azimuth_fx, st_ivas->hOutSetup.ls_elevation_fx, st_ivas->hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hOutSetup.ls_azimuth_fx, st_ivas->hOutSetup.ls_elevation_fx, st_ivas->hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) { return error; } @@ -1815,40 +1971,39 @@ ivas_error ivas_init_decoder_fx( ivas_output_init( &( st_ivas->hTransSetup ), IVAS_AUDIO_CONFIG_STEREO ); } } - ELSE IF( st_ivas->ivas_format == ISM_FORMAT ) + ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { Word32 element_brate_tmp[MAX_NUM_OBJECTS]; st_ivas->nSCE = st_ivas->nchan_transport; /* "st_ivas->nchan_transport" is known from ivas_dec_setup */ - st_ivas->nCPE = 0; - st_ivas->ism_extmeta_active = -1; - st_ivas->ism_extmeta_cnt = 0; - move16(); + st_ivas->nCPE = 0; move16(); + st_ivas->ism_extmeta_active = -1; move16(); + st_ivas->ism_extmeta_cnt = 0; move16(); - IF( st_ivas->ism_mode == ISM_MODE_PARAM ) + IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) { st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; move16(); st_ivas->nSCE = MAX_PARAM_ISM_WAVE; move16(); - IF( ( error = ivas_param_ism_dec_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_param_ism_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } } - IF( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nSCE, element_brate_tmp ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nSCE, element_brate_tmp ) ), IVAS_ERR_OK ) ) { return error; } FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) { - IF( ( error = create_sce_dec( st_ivas, sce_id, element_brate_tmp[sce_id] ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, element_brate_tmp[sce_id] ) ), IVAS_ERR_OK ) ) { return error; } @@ -1856,6 +2011,7 @@ ivas_error ivas_init_decoder_fx( reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); st_ivas->hSCE[sce_id]->hCoreCoder[0]->is_ism_format = 1; + move16(); } st_ivas->hISMDTX.sce_id_dtx = 0; @@ -1869,18 +2025,19 @@ ivas_error ivas_init_decoder_fx( { FOR( sce_id = 0; sce_id < st_ivas->nSCE; ++sce_id ) { - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed2 = 2 + sce_id; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed2 = add( 2, sce_id ); + move16(); } } } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) { - IF( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_spar_dec_open_fx( st_ivas, 0 ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_spar_dec_open_fx( st_ivas, 0 ) ), IVAS_ERR_OK ) ) { return error; } @@ -1888,50 +2045,69 @@ ivas_error ivas_init_decoder_fx( set_f( st_ivas->hSpar->hFbMixer->cldfb_cross_fade, 0.f, CLDFB_NO_COL_MAX ); set_s( st_ivas->hSpar->hFbMixer->cldfb_cross_fade_fx, 0, CLDFB_NO_COL_MAX ); #endif - - IF( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->hOutSetup.is_loudspeaker_setup ) + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_DEC ) && st_ivas->hOutSetup.is_loudspeaker_setup ) { - IF( ( error = ivas_sba_get_hoa_dec_matrix_fx( st_ivas->hOutSetup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_sba_get_hoa_dec_matrix_fx( st_ivas->hOutSetup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ), IVAS_ERR_OK ) ) { return error; } } - IF( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ) != IVAS_ERR_OK ) + Word16 hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); + IF( hodirac_flag ) { - return error; + IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, IVAS_MAX_NUM_BANDS, st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) + { + return error; + } } + ELSE + { + IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + - IF( hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_FOA && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_STEREO && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_MONO ) + test(); + test(); + IF( NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) ) { - IF( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) { return error; } st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + move16(); } ELSE { Word16 band_grouping[IVAS_MAX_NUM_BANDS + 1]; - st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + st_ivas->hSpar->enc_param_start_band = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + move16(); IF( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ) { st_ivas->hSpar->enc_param_start_band = 0; - + move16(); set_c( (Word8 *) st_ivas->hQMetaData->twoDirBands, (Word8) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); st_ivas->hQMetaData->numTwoDirBands = (UWord8) st_ivas->hQMetaData->q_direction[0].cfg.nbands; + move16(); } - ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); } st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); - + move16(); FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) { - IF( ( error = create_sce_dec( st_ivas, sce_id, ivas_total_brate / st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, res_dec ) ), IVAS_ERR_OK ) ) { return error; } @@ -1941,7 +2117,9 @@ ivas_error ivas_init_decoder_fx( FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - IF( ( error = create_cpe_dec( st_ivas, cpe_id, ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS ) ) != IVAS_ERR_OK ) + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, (res_dec) *CPE_CHANNELS ) ), IVAS_ERR_OK ) ) { return error; } @@ -1953,9 +2131,13 @@ ivas_error ivas_init_decoder_fx( } /* create CPE element for DFT Stereo like upmix */ - IF( st_ivas->sba_dirac_stereo_flag && st_ivas->nCPE == 0 ) + test(); + IF( st_ivas->sba_dirac_stereo_flag && ( st_ivas->nCPE == 0 ) ) { - IF( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK ) + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &res_dec, &res_frac, 0 ); + + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, res_dec ) ), IVAS_ERR_OK ) ) { return error; } @@ -1964,9 +2146,9 @@ ivas_error ivas_init_decoder_fx( st_ivas->hCPE[0]->hCoreCoder[1] = NULL; } - IF( st_ivas->nCPE > 1 ) + IF( GT_16( st_ivas->nCPE, 1 ) ) { - IF( ( error = create_mct_dec_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -1975,26 +2157,30 @@ ivas_error ivas_init_decoder_fx( /* set CNA/CNG flags */ ivas_sba_set_cna_cng_flag( st_ivas ); } - ELSE IF( st_ivas->ivas_format == MASA_FORMAT ) + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) { /* if we start in ISM_MODE_NONE in MASA_ISM, that appears as normal MASA, but we may change to a mode with ISMs */ st_ivas->ism_extmeta_active = -1; - st_ivas->ism_extmeta_cnt = 0; move16(); + st_ivas->ism_extmeta_cnt = 0; move16(); - IF( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_masa_dec_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_masa_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } - IF( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + test(); + test(); + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { - IF( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) { return error; } @@ -2002,7 +2188,9 @@ ivas_error ivas_init_decoder_fx( FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) { - IF( ( error = create_sce_dec( st_ivas, sce_id, ivas_total_brate / st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, res_dec ) ), IVAS_ERR_OK ) ) { return error; } @@ -2012,7 +2200,9 @@ ivas_error ivas_init_decoder_fx( FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - IF( ( error = create_cpe_dec( st_ivas, cpe_id, ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS ) ) != IVAS_ERR_OK ) + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, L_shl( res_dec, 1 ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -2026,7 +2216,7 @@ ivas_error ivas_init_decoder_fx( /* set CNA/CNG flags */ ivas_sba_set_cna_cng_flag( st_ivas ); } - ELSE IF( st_ivas->ivas_format == SBA_ISM_FORMAT ) + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { Word32 temp_brate[MAX_SCE]; st_ivas->ism_extmeta_active = -1; @@ -2035,59 +2225,79 @@ ivas_error ivas_init_decoder_fx( move16(); st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); - - IF( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + move16(); + IF( NE_32( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_spar_dec_open_fx( st_ivas, 0 ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_spar_dec_open_fx( st_ivas, 0 ) ), IVAS_ERR_OK ) ) { return error; } - IF( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->hOutSetup.is_loudspeaker_setup ) + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_DEC ) && st_ivas->hOutSetup.is_loudspeaker_setup ) { - IF( ( error = ivas_sba_get_hoa_dec_matrix_fx( st_ivas->hOutSetup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_sba_get_hoa_dec_matrix_fx( st_ivas->hOutSetup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ), IVAS_ERR_OK ) ) { return error; } } - IF( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ) != IVAS_ERR_OK ) + Word16 hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); + IF( hodirac_flag ) { - return error; + IF( NE_32( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, IVAS_MAX_NUM_BANDS, st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE + { + IF( NE_32( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) + { + return error; + } } - IF( hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_FOA && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_STEREO && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_MONO ) + + test(); + test(); + test(); + IF( NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) ) { - IF( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) { return error; } st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + move16(); } ELSE { Word16 band_grouping[IVAS_MAX_NUM_BANDS + 1]; - st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + st_ivas->hSpar->enc_param_start_band = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); IF( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ) { st_ivas->hSpar->enc_param_start_band = 0; - + move16(); set_c( (Word8 *) st_ivas->hQMetaData->twoDirBands, (Word8) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); st_ivas->hQMetaData->numTwoDirBands = (UWord8) st_ivas->hQMetaData->q_direction[0].cfg.nbands; + move16(); } - ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); } FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) { - IF( ( error = create_sce_dec( st_ivas, sce_id, ivas_total_brate / st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, res_dec ) ), IVAS_ERR_OK ) ) { return error; } @@ -2095,15 +2305,19 @@ ivas_error ivas_init_decoder_fx( reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); } - IF( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { - st_ivas->nCPE += ( st_ivas->nchan_ism + 1 ) >> 1; + st_ivas->nCPE = add( st_ivas->nCPE, shr( add( st_ivas->nchan_ism, 1 ), 1 ) ); + move16(); st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); } FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - IF( ( error = create_cpe_dec( st_ivas, cpe_id, ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS ) ) != IVAS_ERR_OK ) + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, L_shl( res_dec, 1 ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -2117,7 +2331,9 @@ ivas_error ivas_init_decoder_fx( /* create CPE element for DFT Stereo like upmix */ IF( st_ivas->sba_dirac_stereo_flag && st_ivas->nCPE == 0 ) { - IF( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK ) + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, res_dec ) ), IVAS_ERR_OK ) ) { return error; } @@ -2126,22 +2342,22 @@ ivas_error ivas_init_decoder_fx( st_ivas->hCPE[0]->hCoreCoder[1] = NULL; } - IF( st_ivas->nCPE > 1 ) + IF( GT_16( st_ivas->nCPE, 1 ) ) { - IF( ( error = create_mct_dec_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } } - IF( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { - IF( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, temp_brate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, temp_brate ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_osba_data_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_osba_data_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -2150,52 +2366,60 @@ ivas_error ivas_init_decoder_fx( /* set CNA/CNG flags */ ivas_sba_set_cna_cng_flag( st_ivas ); } - ELSE IF( st_ivas->ivas_format == MASA_ISM_FORMAT ) + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { st_ivas->ism_extmeta_active = -1; + move16(); st_ivas->ism_extmeta_cnt = 0; + move16(); - IF( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) { return error; } k = 0; + move16(); ism_total_brate = 0; + move16(); + test(); WHILE( LT_16( k, SIZE_IVAS_BRATE_TBL ) && NE_32( ivas_total_brate, ivas_brate_tbl[k] ) ) { k++; + move16(); } - - IF( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) { /* one separated object */ st_ivas->nSCE = 1; - + move16(); ism_total_brate = sep_object_brate[k - 2][0]; - IF( ( error = create_sce_dec( st_ivas, 0, ism_total_brate ) ) != IVAS_ERR_OK ) + move32(); + IF( NE_32( ( error = create_sce_dec( st_ivas, 0, ism_total_brate ) ), IVAS_ERR_OK ) ) { return error; } reset_indices_dec( st_ivas->hSCE[0]->hCoreCoder[0] ); - IF( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, 1, NULL ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, 1, NULL ) ), IVAS_ERR_OK ) ) { return error; } } - ELSE IF( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { Word32 temp_brate[MAX_SCE]; st_ivas->nSCE = st_ivas->nchan_ism; /* number of objects */ - + move16(); FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) { temp_brate[sce_id] = sep_object_brate[k - 2][st_ivas->nSCE - 1]; - ism_total_brate += temp_brate[sce_id]; + move16(); + ism_total_brate = L_add( ism_total_brate, temp_brate[sce_id] ); - IF( ( error = create_sce_dec( st_ivas, sce_id, temp_brate[sce_id] ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, temp_brate[sce_id] ) ), IVAS_ERR_OK ) ) { return error; } @@ -2203,31 +2427,34 @@ ivas_error ivas_init_decoder_fx( reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); } - IF( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, temp_brate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, temp_brate ) ), IVAS_ERR_OK ) ) { return error; } } - IF( ( error = ivas_masa_dec_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_masa_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_omasa_data_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_omasa_data_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } - IF( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + test(); + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { - IF( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) { return error; } } - IF( ( error = create_cpe_dec( st_ivas, 0, ivas_total_brate - ism_total_brate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = create_cpe_dec( st_ivas, 0, ivas_total_brate - ism_total_brate ) ), IVAS_ERR_OK ) ) { return error; } @@ -2237,32 +2464,36 @@ ivas_error ivas_init_decoder_fx( reset_indices_dec( st_ivas->hCPE[0]->hCoreCoder[n] ); } } - ELSE IF( st_ivas->ivas_format == MC_FORMAT ) + ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) { - IF( st_ivas->mc_mode == MC_MODE_MCT ) + IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) ) { /* init EFAP for custom LS setup */ - IF( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { /*float2fix block: to be removed*/ floatToFixed_arrL( st_ivas->hLsSetupCustom->ls_azimuth, st_ivas->hLsSetupCustom->ls_azimuth_fx, Q22, st_ivas->hLsSetupCustom->num_spk ); floatToFixed_arrL( st_ivas->hLsSetupCustom->ls_elevation, st_ivas->hLsSetupCustom->ls_elevation_fx, Q22, st_ivas->hLsSetupCustom->num_spk ); /*float2fix block end*/ - IF( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) { return error; } } st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels_fx( ivas_mc_map_output_config_to_mc_ls_setup_fx( st_ivas->transport_config ) ); + move16(); st_ivas->nSCE = 0; - st_ivas->nCPE = st_ivas->nchan_transport / CPE_CHANNELS; - + move16(); + st_ivas->nCPE = shr( st_ivas->nchan_transport, 1 ); + move16(); st_ivas->element_mode_init = IVAS_CPE_MDCT; - + move16(); FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - IF( ( error = create_cpe_dec( st_ivas, cpe_id, ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) * CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, sub( st_ivas->nchan_transport, 1 ), &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, L_shl( res_dec, 1 ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -2273,33 +2504,34 @@ ivas_error ivas_init_decoder_fx( } } - IF( ( error = create_mct_dec_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } } - ELSE IF( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) { /* init EFAP for custom LS setup */ - IF( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { /*float2fix block: to be removed*/ floatToFixed_arrL( st_ivas->hLsSetupCustom->ls_azimuth, st_ivas->hLsSetupCustom->ls_azimuth_fx, Q22, st_ivas->hLsSetupCustom->num_spk ); floatToFixed_arrL( st_ivas->hLsSetupCustom->ls_elevation, st_ivas->hLsSetupCustom->ls_elevation_fx, Q22, st_ivas->hLsSetupCustom->num_spk ); /*float2fix block end*/ - IF( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) { return error; } } st_ivas->nSCE = 0; - st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / CPE_CHANNELS; - st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; move16(); + st_ivas->nCPE = shr( MC_PARAMUPMIX_MAX_TRANSPORT_CHANS, 1 ); move16(); + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; move16(); - IF( ( error = ivas_mc_paramupmix_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + + IF( NE_32( ( error = ivas_mc_paramupmix_dec_open( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -2308,7 +2540,9 @@ ivas_error ivas_init_decoder_fx( move16(); FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - IF( ( error = create_cpe_dec( st_ivas, cpe_id, ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) * CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, sub( st_ivas->nchan_transport, 1 ), &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, L_shl( res_dec, 1 ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -2319,22 +2553,22 @@ ivas_error ivas_init_decoder_fx( } } - IF( ( error = create_mct_dec_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } } - ELSE IF( st_ivas->mc_mode == MC_MODE_PARAMMC ) + ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) { /* init EFAP for custom LS setup */ - IF( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - IF( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) { return error; } } - IF( ( error = ivas_param_mc_dec_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_param_mc_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -2343,7 +2577,10 @@ ivas_error ivas_init_decoder_fx( move16(); FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - IF( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK ) + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &res_dec, &res_frac, 0 ); + + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, res_dec ) ), IVAS_ERR_OK ) ) { return error; } @@ -2356,56 +2593,60 @@ ivas_error ivas_init_decoder_fx( IF( GT_16( st_ivas->nCPE, 1 ) ) { - IF( ( error = create_mct_dec_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } } } - ELSE IF( st_ivas->mc_mode == MC_MODE_MCMASA ) + ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) { Word32 brate_sce, brate_cpe; ivas_mcmasa_setNumTransportChannels_fx( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); - IF( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_masa_dec_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_masa_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); - - IF( st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_MCMASA_MONO_STEREO ) + move16(); + test(); + IF( NE_32( st_ivas->renderer_type, RENDERER_DISABLE ) && NE_32( st_ivas->renderer_type, RENDERER_MCMASA_MONO_STEREO ) ) { - IF( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) { return error; } } - IF( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.separateChannelEnabled && !st_ivas->hLsSetupCustom->separate_ch_found ) + test(); + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && st_ivas->hOutSetup.separateChannelEnabled && !st_ivas->hLsSetupCustom->separate_ch_found ) { /* If no speaker matching the separated channel, compute panning gains for the separated channel. */ IF( st_ivas->hVBAPdata == NULL ) { /* Distribute signal to all channels if VBAP is not properly initialized. */ Word16 inv_sqr, sqr, exp = 15, exp_sqr; + move16(); IF( EQ_16( st_ivas->hLsSetupCustom->num_spk, 1 ) ) { inv_sqr = 32767; + move16(); } ELSE { sqr = Sqrt16( st_ivas->hLsSetupCustom->num_spk, &exp ); inv_sqr = BASOP_Util_Divide1616_Scale( 32767, sqr, &exp_sqr ); exp_sqr = sub( exp_sqr, exp ); - IF( LT_16( exp, 0 ) ) + IF( ( exp < 0 ) ) { inv_sqr = shr( inv_sqr, exp ); } @@ -2423,7 +2664,7 @@ ivas_error ivas_init_decoder_fx( FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) { - IF( ( error = create_sce_dec( st_ivas, sce_id, brate_sce ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, brate_sce ) ), IVAS_ERR_OK ) ) { return error; } @@ -2434,8 +2675,8 @@ ivas_error ivas_init_decoder_fx( FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { st_ivas->element_mode_init = IVAS_CPE_MDCT; /* element_mode_init was IVAS_SCE for SCE initialization */ - - IF( ( error = create_cpe_dec( st_ivas, cpe_id, brate_cpe ) ) != IVAS_ERR_OK ) + move16(); + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, brate_cpe ) ), IVAS_ERR_OK ) ) { return error; } @@ -2449,7 +2690,9 @@ ivas_error ivas_init_decoder_fx( /* create CPE element for DFT Stereo like upmix */ IF( st_ivas->sba_dirac_stereo_flag ) { - IF( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK ) + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, res_dec ) ), IVAS_ERR_OK ) ) { return error; } @@ -2462,7 +2705,9 @@ ivas_error ivas_init_decoder_fx( IF( EQ_16( st_ivas->nchan_transport, 1 ) && ( ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) { st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1; + move16(); st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1; + move16(); } } } @@ -2475,7 +2720,7 @@ ivas_error ivas_init_decoder_fx( /* set number of output channels used for synthesis/decoding */ n = getNumChanSynthesis( st_ivas ); - IF( GT_16( n, 0 ) ) + IF( n > 0 ) { IF( ( st_ivas->mem_hp20_out_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) { @@ -2499,43 +2744,51 @@ ivas_error ivas_init_decoder_fx( /*-------------------------------------------------------------------* * Allocate and initialize rendering handles *--------------------------------------------------------------------*/ - - IF( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) - { - IF( ( error = ivas_binRenderer_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + IF( NE_32( ( error = ivas_binRenderer_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } } - /* ParamISM is handled separately from other common config */ - ELSE IF( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) ) + ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) && ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) ) { - IF( st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) + IF( NE_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { - IF( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) { return error; } } - IF( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) { return error; } } - ELSE IF( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) { Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; Word16 num_src; - IF( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { return error; } Word16 nchan_rend = num_src; - IF( EQ_16( st_ivas->ivas_format, MC_FORMAT ) && NE_16( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + move16(); + test(); + IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - nchan_rend--; /* Skip LFE channel -- added to the others */ + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ } FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) { @@ -2543,69 +2796,77 @@ ivas_error ivas_init_decoder_fx( IF( Src_p->SrcSpatial_p != NULL ) { Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); } TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; SrcSpatial_p->q_Pos_p = Q31; + move16(); } IF( EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { - IF( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) { return error; } } granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); - + move16(); n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); - IF( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ), IVAS_ERR_OK ) ) { return error; } } - ELSE IF( st_ivas->renderer_type == RENDERER_MC ) + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_MC ) ) { - IF( ( error = ivas_ls_setup_conversion_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_ls_setup_conversion_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } } - ELSE IF( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) ) { - IF( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } } - ELSE IF( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) { - IF( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->ivas_format == MC_FORMAT && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) + test(); + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) && EQ_32( st_ivas->ivas_format, MC_FORMAT ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) { - IF( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth_fx, st_ivas->hIntSetup.ls_elevation_fx, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth_fx, st_ivas->hIntSetup.ls_elevation_fx, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) { return error; } } - IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, - st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, + st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ), + IVAS_ERR_OK ) ) { return error; } st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; + move32(); - IF( ( st_ivas->ivas_format == MC_FORMAT ) && ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) + test(); + IF( ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) && ( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) ) { granularity = NS2SA( output_Fs, CLDFB_SLOT_NS ); - + move16(); n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); - IF( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, MC_PARAMUPMIX_MAX_INPUT_CHANS, MC_PARAMUPMIX_MAX_INPUT_CHANS, granularity ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, MC_PARAMUPMIX_MAX_INPUT_CHANS, MC_PARAMUPMIX_MAX_INPUT_CHANS, granularity ) ), IVAS_ERR_OK ) ) { return error; } @@ -2613,31 +2874,35 @@ ivas_error ivas_init_decoder_fx( ELSE { granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); - + move16(); n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); - IF( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ), IVAS_ERR_OK ) ) { return error; } } } - IF( st_ivas->ivas_format == MASA_ISM_FORMAT ) + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { - IF( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { /* Allocate TD renderer for the objects in DISC mode */ Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; Word16 num_src; - IF( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { return error; } Word16 nchan_rend = num_src; - IF( EQ_16( st_ivas->ivas_format, MC_FORMAT ) && NE_16( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + move16(); + test(); + IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - nchan_rend--; /* Skip LFE channel -- added to the others */ + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ + move16(); } FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) { @@ -2645,61 +2910,83 @@ ivas_error ivas_init_decoder_fx( IF( Src_p->SrcSpatial_p != NULL ) { Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); } TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; SrcSpatial_p->q_Pos_p = Q31; + move16(); } /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ - IF( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } } - IF( st_ivas->renderer_type == RENDERER_DIRAC && ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) ) + test(); + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) && ( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) ) { /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ - IF( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } } } - IF( ( st_ivas->ivas_format == ISM_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) && - ( st_ivas->ism_mode == ISM_MODE_DISC || st_ivas->ism_mode == ISM_SBA_MODE_DISC ) && - ( st_ivas->renderer_type == RENDERER_TD_PANNING || - st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX || - st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || - st_ivas->renderer_type == RENDERER_OSBA_STEREO || - st_ivas->renderer_type == RENDERER_OSBA_AMBI || - st_ivas->renderer_type == RENDERER_OSBA_LS || - st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || - st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || - st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) - { - IF( ( error = ivas_ism_renderer_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) && + ( EQ_32( st_ivas->ism_mode, ISM_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) && + ( EQ_32( st_ivas->renderer_type, RENDERER_TD_PANNING ) || + EQ_32( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) || + EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || + EQ_32( st_ivas->renderer_type, RENDERER_OSBA_STEREO ) || + EQ_32( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || + EQ_32( st_ivas->renderer_type, RENDERER_OSBA_LS ) || + EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || + EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || + EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) ) + { + IF( NE_32( ( error = ivas_ism_renderer_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } } - IF( st_ivas->ivas_format == SBA_ISM_FORMAT ) + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - IF( ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + test(); + test(); + IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { /* Allocate TD renderer for the objects in DISC mode */ Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; Word16 num_src; - IF( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { return error; } Word16 nchan_rend = num_src; - IF( EQ_16( st_ivas->ivas_format, MC_FORMAT ) && NE_16( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + move16(); + + test(); + IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - nchan_rend--; /* Skip LFE channel -- added to the others */ + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ } FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) { @@ -2707,9 +2994,11 @@ ivas_error ivas_init_decoder_fx( IF( Src_p->SrcSpatial_p != NULL ) { Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); } TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; SrcSpatial_p->q_Pos_p = Q31; + move16(); } } } @@ -2717,10 +3006,11 @@ ivas_error ivas_init_decoder_fx( /*-----------------------------------------------------------------* * LFE handles for rendering after rendering to adjust LFE delay to binaural filter delay *-----------------------------------------------------------------*/ - - IF( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + test(); + IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) || EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) { binauralization_delay_ns = st_ivas->binaural_latency_ns; + move32(); IF( st_ivas->hBinRenderer != NULL ) { IF( st_ivas->hBinRenderer->render_lfe ) @@ -2737,7 +3027,7 @@ ivas_error ivas_init_decoder_fx( } } - IF( ( error = ivas_create_lfe_dec_fx( &st_ivas->hLFE, output_Fs, binauralization_delay_ns ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_create_lfe_dec_fx( &st_ivas->hLFE, output_Fs, binauralization_delay_ns ) ), IVAS_ERR_OK ) ) { return error; } @@ -2754,7 +3044,7 @@ ivas_error ivas_init_decoder_fx( FOR( i = 0; i < numCldfbAnalyses; i++ ) { - IF( ( error = openCldfb_ivas( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = openCldfb_ivas( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) { return error; } @@ -2766,7 +3056,7 @@ ivas_error ivas_init_decoder_fx( FOR( i = 0; i < numCldfbSyntheses; i++ ) { - IF( ( error = openCldfb_ivas( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = openCldfb_ivas( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) { return error; } @@ -2777,11 +3067,15 @@ ivas_error ivas_init_decoder_fx( } /* CLDFB Interpolation weights */ - IF( ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 ) + test(); + test(); + test(); + IF( ( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 ) { #ifdef IVAS_FLOAT_FIXED #if 1 Word16 Q_cldfbSynDec = Q11; + move16(); #ifndef MSAN_FIX IF( st_ivas->hSpar ) { @@ -2793,11 +3087,19 @@ ivas_error ivas_init_decoder_fx( ivas_spar_get_cldfb_gains_fx( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); #if 1 FOR( i = 0; i < st_ivas->cldfbAnaDec[0]->cldfb_state_length; i++ ) - st_ivas->cldfbAnaDec[0]->cldfb_state_fx[i] = L_shr( st_ivas->cldfbAnaDec[0]->cldfb_state_fx[i], 16 ); // Scaling down from 27 to 11 + { + st_ivas->cldfbAnaDec[0]->cldfb_state_fx[i] = L_shr( st_ivas->cldfbAnaDec[0]->cldfb_state_fx[i], 16 ); // Scaling down from 27 to 11 + move16(); + } st_ivas->cldfbAnaDec[0]->Q_cldfb_state = Q11; + move16(); FOR( i = 0; i < st_ivas->cldfbSynDec[0]->cldfb_state_length; i++ ) - st_ivas->cldfbSynDec[0]->cldfb_state_fx[i] = L_shr( st_ivas->cldfbSynDec[0]->cldfb_state_fx[i], 21 - Q_cldfbSynDec ); // Scaling down from 21 to Q_cldfbSynDec + { + st_ivas->cldfbSynDec[0]->cldfb_state_fx[i] = L_shr( st_ivas->cldfbSynDec[0]->cldfb_state_fx[i], sub( 21, Q_cldfbSynDec ) ); // Scaling down from 21 to Q_cldfbSynDec + move16(); + } st_ivas->cldfbSynDec[0]->Q_cldfb_state = Q11; + move16(); IF( st_ivas->hSpar ) { fixedToFloat_arr( st_ivas->hSpar->hFbMixer->cldfb_cross_fade_fx, st_ivas->hSpar->hFbMixer->cldfb_cross_fade, st_ivas->hSpar->hFbMixer->cldfb_cross_fade_q, 16 ); @@ -2812,7 +3114,7 @@ ivas_error ivas_init_decoder_fx( * Allocate and initialize limiter struct *-----------------------------------------------------------------*/ - IF( ( error = ivas_limiter_open( &st_ivas->hLimiter, hDecoderConfig->nchan_out, output_Fs ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_limiter_open( &st_ivas->hLimiter, hDecoderConfig->nchan_out, output_Fs ) ), IVAS_ERR_OK ) ) { return error; } @@ -2827,16 +3129,17 @@ ivas_error ivas_init_decoder_fx( /* no module has yet open the TC buffer, open a default one */ n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); - IF( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, ivas_jbm_dec_get_tc_buffer_mode( st_ivas ), n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, ivas_jbm_dec_get_tc_buffer_mode( st_ivas ), n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ), IVAS_ERR_OK ) ) { return error; } + move16(); // For NS2SA } IF( st_ivas->hTcBuffer == NULL ) { /* we need the handle anyway, but without the buffer*/ - IF( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_NONE, 0, 0, 0, 1 ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_NONE, 0, 0, 0, 1 ) ), IVAS_ERR_OK ) ) { return error; } @@ -2844,9 +3147,9 @@ ivas_error ivas_init_decoder_fx( IF( st_ivas->hJbmMetadata == NULL ) { - IF( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { - IF( ( error = ivas_jbm_dec_metadata_open( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_jbm_dec_metadata_open( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -2857,7 +3160,7 @@ ivas_error ivas_init_decoder_fx( * Allocate floating-point output audio buffers *-----------------------------------------------------------------*/ st_ivas->p_out_len = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); - + move16(); FOR( n = 0; n < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); n++ ) { /* note: these are intra-frame heap memories */ @@ -4547,7 +4850,7 @@ void ivas_destroy_dec_fx( ivas_ism_renderer_close( &( st_ivas->hIsmRendererData ) ); /* DirAC handle */ - IF( st_ivas->ivas_format == ISM_FORMAT ) + IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { ivas_param_ism_dec_close_fx( &( st_ivas->hParamIsmDec ), &( st_ivas->hSpatParamRendCom ), st_ivas->hDecoderConfig->output_config ); } @@ -4933,85 +5236,119 @@ void ivas_init_dec_get_num_cldfb_instances( { IVAS_FORMAT ivas_format; *numCldfbAnalyses = st_ivas->nchan_transport; + move16(); *numCldfbSyntheses = st_ivas->hDecoderConfig->nchan_out; + move16(); - ivas_format = ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_NONE ) ? SBA_FORMAT : st_ivas->ivas_format; /* treat ISM_SBA_MODE_NONE just like SBA_FORMAT */ + test(); + IF( ( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_NONE ) ) ) + { + ivas_format = SBA_FORMAT; + move32(); + } + ELSE + { + ivas_format = st_ivas->ivas_format; + move32(); + } SWITCH( st_ivas->renderer_type ) { case RENDERER_BINAURAL_PARAMETRIC: case RENDERER_BINAURAL_PARAMETRIC_ROOM: case RENDERER_STEREO_PARAMETRIC: - IF( st_ivas->nchan_transport == 1 ) + IF( EQ_16( st_ivas->nchan_transport, 1 ) ) { - *numCldfbAnalyses = st_ivas->nchan_transport + 1; + *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + move16(); } - IF( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->hOutSetup.separateChannelEnabled ) + test(); + IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) && st_ivas->hOutSetup.separateChannelEnabled ) { - *numCldfbAnalyses = st_ivas->nchan_transport + 1; + *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + move16(); } IF( ivas_format == SBA_ISM_FORMAT ) { - IF( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { - *numCldfbAnalyses += st_ivas->nchan_ism; + *numCldfbAnalyses = add( *numCldfbAnalyses, st_ivas->nchan_ism ); + move16(); } } - IF( ivas_format == MASA_ISM_FORMAT ) + test(); + IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) ) { - IF( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { - *numCldfbAnalyses += st_ivas->nchan_ism; + *numCldfbAnalyses = add( *numCldfbAnalyses, st_ivas->nchan_ism ); + move16(); } - ELSE IF( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) { - *numCldfbAnalyses = st_ivas->nchan_transport + 1; + *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + move16(); } } IF( st_ivas->hDiracDecBin->useTdDecorr ) { - *numCldfbAnalyses += 2; + *numCldfbAnalyses = add( *numCldfbAnalyses, 2 ); + move16(); } BREAK; case RENDERER_NON_DIEGETIC_DOWNMIX: case RENDERER_MONO_DOWNMIX: - IF( ivas_format == ISM_FORMAT || ivas_format == MASA_ISM_FORMAT || ivas_format == SBA_ISM_FORMAT ) + test(); + test(); + IF( EQ_32( ivas_format, ISM_FORMAT ) || EQ_32( ivas_format, MASA_ISM_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) { /* CLDFB not used in rendering */ *numCldfbAnalyses = 0; + move16(); *numCldfbSyntheses = 0; + move16(); } BREAK; case RENDERER_DIRAC: - IF( ivas_format == SBA_FORMAT ) + IF( EQ_32( ivas_format, SBA_FORMAT ) ) { *numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; + move16(); - IF( st_ivas->hOutSetup.is_loudspeaker_setup && st_ivas->renderer_type == RENDERER_DIRAC ) + test(); + IF( st_ivas->hOutSetup.is_loudspeaker_setup && EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) { *numCldfbSyntheses = st_ivas->hOutSetup.nchan_out_woLFE; + move16(); } - ELSE IF( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_FOA ) + ELSE IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) { *numCldfbSyntheses = st_ivas->hSpar->hFbMixer->fb_cfg->num_out_chans; + move16(); } ELSE { *numCldfbSyntheses = MAX_OUTPUT_CHANNELS; + move16(); } } - IF( ivas_format != SBA_FORMAT ) + IF( NE_32( ivas_format, SBA_FORMAT ) ) { - IF( GT_16( st_ivas->nchan_transport, 2 ) && NE_16( st_ivas->sba_planar, 0 ) ) + test(); + test(); + IF( GT_16( st_ivas->nchan_transport, 2 ) && ( st_ivas->sba_planar != 0 ) ) { *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + move16(); } - ELSE IF( EQ_16( st_ivas->nchan_transport, 1 ) && st_ivas->hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + ELSE IF( EQ_16( st_ivas->nchan_transport, 1 ) && EQ_32( st_ivas->hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + move16(); } } BREAK; @@ -5020,11 +5357,14 @@ void ivas_init_dec_get_num_cldfb_instances( { /* CLDFB not used in rendering */ *numCldfbAnalyses = 0; + move16(); *numCldfbSyntheses = 0; + move16(); } ELSE { *numCldfbSyntheses = param_mc_get_num_cldfb_syntheses_fx( st_ivas ); + move16(); } BREAK; case RENDERER_PARAM_ISM: @@ -5033,7 +5373,9 @@ void ivas_init_dec_get_num_cldfb_instances( case RENDERER_DISABLE: /* CLDFB not used */ *numCldfbAnalyses = 0; + move16(); *numCldfbSyntheses = 0; + move16(); BREAK; case RENDERER_MC: case RENDERER_SBA_LINEAR_DEC: @@ -5047,37 +5389,46 @@ void ivas_init_dec_get_num_cldfb_instances( case RENDERER_OSBA_STEREO: case RENDERER_OSBA_AMBI: case RENDERER_OSBA_LS: - IF( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) + test(); + IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) { - IF( NE_16( st_ivas->sba_dirac_stereo_flag, 0 ) ) + IF( st_ivas->sba_dirac_stereo_flag != 0 ) { *numCldfbAnalyses = 0; + move16(); *numCldfbSyntheses = 0; + move16(); } ELSE { *numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; + move16(); - IF( st_ivas->hOutSetup.is_loudspeaker_setup && st_ivas->renderer_type == RENDERER_DIRAC ) + test(); + IF( st_ivas->hOutSetup.is_loudspeaker_setup && EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) { *numCldfbSyntheses = st_ivas->hOutSetup.nchan_out_woLFE; + move16(); } - ELSE IF( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_FOA ) + ELSE IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) { *numCldfbSyntheses = st_ivas->hSpar->hFbMixer->fb_cfg->num_out_chans; + move16(); } ELSE { *numCldfbSyntheses = MAX_OUTPUT_CHANNELS; + move16(); } - - IF( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { - *numCldfbAnalyses = st_ivas->nchan_ism + st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; + *numCldfbAnalyses = add( st_ivas->nchan_ism, st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans ); + move16(); } } } - ELSE IF( st_ivas->mc_mode == MC_MODE_PARAMMC ) + ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) { /* do nothing for ParamMC */ } @@ -5085,45 +5436,59 @@ void ivas_init_dec_get_num_cldfb_instances( { /* CLDFB not used in rendering */ *numCldfbAnalyses = 0; + move16(); *numCldfbSyntheses = 0; + move16(); } BREAK; case RENDERER_SBA_LINEAR_ENC: - IF( st_ivas->mc_mode == MC_MODE_PARAMMC ) + IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) { *numCldfbSyntheses = param_mc_get_num_cldfb_syntheses_fx( st_ivas ); + move16(); } - ELSE IF( st_ivas->ism_mode == ISM_MODE_PARAM ) + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) { - *numCldfbSyntheses = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + *numCldfbSyntheses = add( st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hIntSetup.num_lfe ); + move16(); } - ELSE IF( st_ivas->mc_mode == MC_MODE_MCMASA ) + ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) { *numCldfbAnalyses = st_ivas->nchan_transport; - *numCldfbSyntheses = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + move16(); + *numCldfbSyntheses = add( st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hIntSetup.num_lfe ); + move16(); } ELSE { /* CLDFB not used in rendering */ *numCldfbAnalyses = 0; + move16(); *numCldfbSyntheses = 0; + move16(); } BREAK; default: assert( 0 && "Renderer not handled for CLDFB reservation." ); } - - IF( st_ivas->mc_mode == MC_MODE_PARAMUPMIX && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_MONO && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_STEREO ) + test(); + test(); + IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) ) { - IF( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { - *numCldfbAnalyses = max( MC_PARAMUPMIX_MAX_INPUT_CHANS, *numCldfbAnalyses ); + *numCldfbAnalyses = s_max( MC_PARAMUPMIX_MAX_INPUT_CHANS, *numCldfbAnalyses ); + move16(); } ELSE { - *numCldfbAnalyses = max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbAnalyses ); + *numCldfbAnalyses = s_max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbAnalyses ); + move16(); } - *numCldfbSyntheses = max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbSyntheses ); + *numCldfbSyntheses = s_max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbSyntheses ); + move16(); } return; @@ -5354,12 +5719,12 @@ static ivas_error doSanityChecks_IVAS( output_Fs = st_ivas->hDecoderConfig->output_Fs; move32(); output_config = st_ivas->hDecoderConfig->output_config; - + move32(); /*-----------------------------------------------------------------* * Sanity checks *-----------------------------------------------------------------*/ - IF( output_Fs == 8000 ) + IF( EQ_32( output_Fs, 8000 ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz output sampling rate is not supported in IVAS." ); } @@ -5368,46 +5733,56 @@ static ivas_error doSanityChecks_IVAS( assert( st_ivas->ivas_format != MONO_FORMAT && "\n Wrong IVAS format: MONO" ); /* Verify output configuration compatible with non-diegetic panning */ + test(); + test(); IF( st_ivas->hDecoderConfig->Opt_non_diegetic_pan && ( st_ivas->ivas_format != MONO_FORMAT ) && ( st_ivas->transport_config != IVAS_AUDIO_CONFIG_ISM1 ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Error: Non-diegetic panning not supported in this IVAS format" ); } /* Verify stereo output configuration */ - IF( st_ivas->ivas_format == STEREO_FORMAT ) + IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) { - IF( output_config != IVAS_AUDIO_CONFIG_MONO && output_config != IVAS_AUDIO_CONFIG_STEREO && output_config != IVAS_AUDIO_CONFIG_5_1 && output_config != IVAS_AUDIO_CONFIG_7_1 && output_config != IVAS_AUDIO_CONFIG_5_1_2 && output_config != IVAS_AUDIO_CONFIG_5_1_4 && output_config != IVAS_AUDIO_CONFIG_7_1_4 && output_config != IVAS_AUDIO_CONFIG_LS_CUSTOM ) + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( NE_32( output_config, IVAS_AUDIO_CONFIG_MONO ) && NE_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( output_config, IVAS_AUDIO_CONFIG_5_1 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_7_1 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_5_1_2 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_5_1_4 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_7_1_4 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Wrong output configuration specified for Stereo!" ); } } - ELSE IF( st_ivas->ivas_format == ISM_FORMAT ) + ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { /* Verify ISM output configuration */ - IF( output_config == IVAS_AUDIO_CONFIG_INVALID ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for ISM" ); } } - ELSE IF( st_ivas->ivas_format == SBA_FORMAT ) + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) { /* Verify SBA output coniguration */ - IF( output_config == IVAS_AUDIO_CONFIG_INVALID ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for SBA" ); } } - ELSE IF( st_ivas->ivas_format == MASA_FORMAT ) + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) { - IF( output_config == IVAS_AUDIO_CONFIG_INVALID ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for MASA!" ); } } - ELSE IF( st_ivas->ivas_format == MC_FORMAT ) + ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) { /* Verify MC output configuration */ - IF( output_config == IVAS_AUDIO_CONFIG_INVALID || output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + test(); + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for Multi-channel" ); } @@ -5416,7 +5791,10 @@ static ivas_error doSanityChecks_IVAS( IF( st_ivas->hDecoderConfig->Opt_Headrotation ) { - IF( !( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + test(); + test(); + test(); + IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) { return IVAS_ERROR( IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED, "Wrong set-up: Head-rotation not supported in this configuration" ); } @@ -5424,7 +5802,10 @@ static ivas_error doSanityChecks_IVAS( IF( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) { - IF( !( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + test(); + test(); + test(); + IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) { return IVAS_ERROR( IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED, "Wrong set-up: External orientation not supported in this configuration" ); } @@ -5432,7 +5813,8 @@ static ivas_error doSanityChecks_IVAS( IF( st_ivas->hDecoderConfig->Opt_dpid_on ) { - IF( !( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + test(); + IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) { return IVAS_ERROR( IVAS_ERR_DIRECTIVITY_NOT_SUPPORTED, "Wrong set-up: Directivity is not supported in this output configuration." ); } @@ -5446,9 +5828,10 @@ static ivas_error doSanityChecks_IVAS( } } - IF( st_ivas->ivas_format == MASA_ISM_FORMAT ) + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { - IF( st_ivas->ism_mode != ISM_MASA_MODE_DISC && output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + test(); + IF( NE_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for combined MASA and ISM format" ); } diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index 7d4820c14..1d56a3412 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -8,12 +8,17 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx( { IVAS_FORMAT ivas_format; *numCldfbAnalyses = st_ivas->nchan_transport; + move16(); *numCldfbSyntheses = st_ivas->hDecoderConfig->nchan_out; - + move16(); ivas_format = st_ivas->ivas_format; + move32(); + + test(); IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_16( st_ivas->ism_mode, ISM_MODE_NONE ) ) { ivas_format = SBA_FORMAT; /* treat ISM_SBA_MODE_NONE just like SBA_FORMAT */ + move32(); } SWITCH( st_ivas->renderer_type ) @@ -24,73 +29,94 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx( IF( EQ_16( st_ivas->nchan_transport, 1 ) ) { *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + move16(); } - + test(); IF( EQ_16( st_ivas->mc_mode, MC_MODE_MCMASA ) && st_ivas->hOutSetup.separateChannelEnabled ) { *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + move16(); } - IF( EQ_16( ivas_format, SBA_ISM_FORMAT ) ) + IF( EQ_32( ivas_format, SBA_ISM_FORMAT ) ) { - IF( EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { *numCldfbAnalyses = add( *numCldfbAnalyses, st_ivas->nchan_ism ); + move16(); } } - IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) + IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) ) { - IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + test(); + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { *numCldfbAnalyses = add( *numCldfbAnalyses, st_ivas->nchan_ism ); + move16(); } - ELSE IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) { *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + move16(); } } IF( st_ivas->hDiracDecBin->useTdDecorr ) { *numCldfbAnalyses = add( *numCldfbAnalyses, 2 ); + move16(); } BREAK; case RENDERER_NON_DIEGETIC_DOWNMIX: case RENDERER_MONO_DOWNMIX: - IF( EQ_16( ivas_format, ISM_FORMAT ) || EQ_16( ivas_format, MASA_ISM_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) + test(); + test(); + test(); + IF( EQ_32( ivas_format, ISM_FORMAT ) || EQ_32( ivas_format, MASA_ISM_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) { /* CLDFB not used in rendering */ *numCldfbAnalyses = 0; + move16(); *numCldfbSyntheses = 0; + move16(); } BREAK; case RENDERER_DIRAC: - IF( EQ_16( ivas_format, SBA_FORMAT ) ) + IF( EQ_32( ivas_format, SBA_FORMAT ) ) { *numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; - - IF( st_ivas->hOutSetup.is_loudspeaker_setup && EQ_16( st_ivas->renderer_type, RENDERER_DIRAC ) ) + move16(); + test(); + IF( st_ivas->hOutSetup.is_loudspeaker_setup && EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) { *numCldfbSyntheses = st_ivas->hOutSetup.nchan_out_woLFE; + move16(); } - ELSE IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) + ELSE IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) { *numCldfbSyntheses = st_ivas->hSpar->hFbMixer->fb_cfg->num_out_chans; + move16(); } ELSE { *numCldfbSyntheses = MAX_OUTPUT_CHANNELS; + move16(); } } - IF( NE_16( ivas_format, SBA_FORMAT ) ) + IF( NE_32( ivas_format, SBA_FORMAT ) ) { - IF( GT_16( st_ivas->nchan_transport, 2 ) && NE_16( st_ivas->sba_planar, 0 ) ) + test(); + test(); + IF( GT_16( st_ivas->nchan_transport, 2 ) && ( st_ivas->sba_planar != 0 ) ) { *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + move16(); } - ELSE IF( EQ_16( st_ivas->nchan_transport, 1 ) && EQ_16( st_ivas->hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) + ELSE IF( EQ_16( st_ivas->nchan_transport, 1 ) && EQ_32( st_ivas->hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + move16(); } } BREAK; @@ -99,11 +125,14 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx( { /* CLDFB not used in rendering */ *numCldfbAnalyses = 0; + move16(); *numCldfbSyntheses = 0; + move16(); } ELSE { *numCldfbSyntheses = param_mc_get_num_cldfb_syntheses_ivas_fx( st_ivas ); + move16(); } BREAK; case RENDERER_PARAM_ISM: @@ -112,7 +141,9 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx( case RENDERER_DISABLE: /* CLDFB not used */ *numCldfbAnalyses = 0; + move16(); *numCldfbSyntheses = 0; + move16(); BREAK; case RENDERER_MC: case RENDERER_SBA_LINEAR_DEC: @@ -126,37 +157,47 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx( case RENDERER_OSBA_STEREO: case RENDERER_OSBA_AMBI: case RENDERER_OSBA_LS: - IF( EQ_16( ivas_format, SBA_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) + test(); + IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) { - IF( NE_16( st_ivas->sba_dirac_stereo_flag, 0 ) ) + IF( st_ivas->sba_dirac_stereo_flag != 0 ) { *numCldfbAnalyses = 0; + move16(); *numCldfbSyntheses = 0; + move16(); } ELSE { *numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; + move16(); - IF( st_ivas->hOutSetup.is_loudspeaker_setup && EQ_16( st_ivas->renderer_type, RENDERER_DIRAC ) ) + test(); + IF( st_ivas->hOutSetup.is_loudspeaker_setup && EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) { *numCldfbSyntheses = st_ivas->hOutSetup.nchan_out_woLFE; + move16(); } - ELSE IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) + ELSE IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) { *numCldfbSyntheses = st_ivas->hSpar->hFbMixer->fb_cfg->num_out_chans; + move16(); } ELSE { *numCldfbSyntheses = MAX_OUTPUT_CHANNELS; + move16(); } - IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { *numCldfbAnalyses = add( st_ivas->nchan_ism, st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans ); + move16(); } } } - ELSE IF( EQ_16( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) + ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) { /* do nothing for ParamMC */ } @@ -164,45 +205,60 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx( { /* CLDFB not used in rendering */ *numCldfbAnalyses = 0; + move16(); *numCldfbSyntheses = 0; + move16(); } BREAK; case RENDERER_SBA_LINEAR_ENC: - IF( EQ_16( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) + IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) { *numCldfbSyntheses = param_mc_get_num_cldfb_syntheses_ivas_fx( st_ivas ); + move16(); } - ELSE IF( EQ_16( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) { *numCldfbSyntheses = add( st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hIntSetup.num_lfe ); + move16(); } - ELSE IF( EQ_16( st_ivas->mc_mode, MC_MODE_MCMASA ) ) + ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) { *numCldfbAnalyses = st_ivas->nchan_transport; + move16(); *numCldfbSyntheses = add( st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hIntSetup.num_lfe ); + move16(); } ELSE { /* CLDFB not used in rendering */ *numCldfbAnalyses = 0; + move16(); *numCldfbSyntheses = 0; + move16(); } BREAK; default: assert( 0 && "Renderer not handled for CLDFB reservation." ); } - IF( EQ_16( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) && NE_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) && NE_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) ) + test(); + test(); + IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) ) { - IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || EQ_16( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { *numCldfbAnalyses = s_max( MC_PARAMUPMIX_MAX_INPUT_CHANS, *numCldfbAnalyses ); + move16(); } ELSE { *numCldfbAnalyses = s_max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbAnalyses ); + move16(); } *numCldfbSyntheses = s_max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbSyntheses ); + move16(); } return; diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index e15b3a421..b806bc79c 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -73,7 +73,9 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( error = IVAS_ERR_OK; nCPE_old = st_ivas->nCPE; + move16(); nSCE_old = st_ivas->nSCE; + move16(); /* temporarily set the ism mode back to the old one, otherwise this can give wrong results*/ ism_mode = st_ivas->ism_mode; @@ -85,7 +87,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( move16(); nchan_out_buff_old = ivas_get_nchan_buffers_dec_ivas_fx( st_ivas, -1, -1 ); - IF( ( error = ivas_ism_config_fx( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 0 ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_ism_config_fx( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 0 ) ), IVAS_ERR_OK ) ) { return error; } @@ -97,7 +99,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( * Allocate, initialize, and configure SCE/CPE/MCT handles *-----------------------------------------------------------------*/ - IF( ( error = ivas_corecoder_dec_reconfig_fx( st_ivas, nSCE_old, nCPE_old, nchan_transport_old, 0, st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport, ( st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_corecoder_dec_reconfig_fx( st_ivas, nSCE_old, nCPE_old, nchan_transport_old, 0, st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport, ( st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS ) ), IVAS_ERR_OK ) ) { return error; } @@ -105,7 +107,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( /*-----------------------------------------------------------------* * HP20 memories *-----------------------------------------------------------------*/ - IF( ( error = ivas_hp20_dec_reconfig_fx( st_ivas, nchan_transport_old ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_hp20_dec_reconfig_fx( st_ivas, nchan_transport_old ) ), IVAS_ERR_OK ) ) { return error; } @@ -155,7 +157,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( IF( LT_16( tc_granularity_new, st_ivas->hTcBuffer->n_samples_granularity ) ) { - IF( ( error = ivas_jbm_dec_flush_renderer_fx( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &hIntSetupOld, MC_MODE_NONE, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_jbm_dec_flush_renderer_fx( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &hIntSetupOld, MC_MODE_NONE, last_ism_mode, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) { return error; } @@ -163,7 +165,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( /* JBM: when granularity goes up set samples to discard at the beginning of the frame */ ELSE IF( GT_16( tc_granularity_new, st_ivas->hTcBuffer->n_samples_granularity ) ) { - IF( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -181,27 +183,30 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( *-----------------------------------------------------------------*/ /* switching from ParamISM to DiscISM */ + test(); IF( EQ_32( st_ivas->ism_mode, ISM_MODE_DISC ) && EQ_32( last_ism_mode, ISM_MODE_PARAM ) ) { /* Deallocate the ParamISM struct */ ivas_param_ism_dec_close_fx( &( st_ivas->hParamIsmDec ), &( st_ivas->hSpatParamRendCom ), st_ivas->hDecoderConfig->output_config ); + test(); IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { /* close the parametric binaural renderer */ ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); /* Open the TD Binaural renderer */ + test(); IF( st_ivas->hHrtfTD == NULL || st_ivas->hBinRendererTd == NULL ) { Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; Word16 num_src; - IF( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { return error; } - IF( st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + IF( EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { - IF( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) { return error; } @@ -212,19 +217,19 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( { /* close the ISM renderer and reinitialize */ ivas_ism_renderer_close( &st_ivas->hIsmRendererData ); - IF( ( error = ivas_ism_renderer_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_ism_renderer_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } } - IF( EQ_16( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { /* close the parametric binaural renderer */ ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); /* Open Crend Binaural renderer */ - IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) { return error; } @@ -235,23 +240,25 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( } /* switching from Discrete ISM to ParamISM */ + test(); IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) && EQ_32( last_ism_mode, ISM_MODE_DISC ) ) { /* Allocate and initialize the ParamISM struct */ - IF( ( error = ivas_param_ism_dec_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_param_ism_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } + test(); IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { /* open the parametric binaural renderer */ - IF( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) { return error; } @@ -262,7 +269,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); st_ivas->hHrtfTD = NULL; - IF( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { ivas_reverb_close( &st_ivas->hReverb ); } @@ -277,12 +284,12 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { /* open the parametric binaural renderer */ - IF( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) { return error; } @@ -296,7 +303,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( * CLDFB instances *-----------------------------------------------------------------*/ - IF( ( error = ivas_cldfb_dec_reconfig_fx( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_cldfb_dec_reconfig_fx( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ), IVAS_ERR_OK ) ) { return error; } @@ -308,12 +315,12 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( { nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ); - IF( ( error = ivas_output_buff_dec_fx( st_ivas->p_output_fx, nchan_out_buff_old, nchan_out_buff ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_output_buff_dec_fx( st_ivas->p_output_fx, nchan_out_buff_old, nchan_out_buff ) ), IVAS_ERR_OK ) ) { return error; } #if 1 /* TODO: remove float code */ - if ( ( error = ivas_output_buff_dec( st_ivas->p_output_f, nchan_out_buff_old, nchan_out_buff ) ) != IVAS_ERR_OK ) + if ( NE_32( ( error = ivas_output_buff_dec( st_ivas->p_output_f, nchan_out_buff_old, nchan_out_buff ) ), IVAS_ERR_OK ) ) { return error; } @@ -335,6 +342,8 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( tc_nchan_full_new = tc_nchan_tc_new; move16(); + test(); + test(); IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; @@ -343,6 +352,10 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( move16(); } + test(); + test(); + test(); + test(); IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) && ( NE_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) && NE_32( st_ivas->renderer_type, RENDERER_DISABLE ) && NE_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && NE_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) { tc_nchan_full_new = 0; @@ -350,10 +363,13 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( } /* reconfigure buffer */ + test(); + test(); + test(); IF( NE_32( hTcBuffer->tc_buffer_mode, tc_buffer_mode_new ) || NE_16( hTcBuffer->nchan_transport_jbm, tc_nchan_tc_new ) || NE_16( hTcBuffer->nchan_buffer_full, tc_nchan_full_new ) || NE_16( hTcBuffer->nchan_transport_internal, tc_nchan_allocate_new ) ) { - IF( ( error = ivas_jbm_dec_tc_buffer_reconfigure_fx( st_ivas, tc_buffer_mode_new, tc_nchan_tc_new, tc_nchan_allocate_new, tc_nchan_full_new, tc_granularity_new ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_reconfigure_fx( st_ivas, tc_buffer_mode_new, tc_nchan_tc_new, tc_nchan_allocate_new, tc_nchan_full_new, tc_granularity_new ) ), IVAS_ERR_OK ) ) { return error; } @@ -701,34 +717,42 @@ ivas_error ivas_ism_dec_config_fx( error = IVAS_ERR_OK; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - + move32(); /* Assumes that num of input objects are constant */ nchan_transport_old = st_ivas->nchan_ism; + move16(); - IF( EQ_16( last_ism_mode, ISM_MODE_PARAM ) ) + if ( EQ_32( last_ism_mode, ISM_MODE_PARAM ) ) { nchan_transport_old = MAX_PARAM_ISM_WAVE; + move16(); } + test(); IF( !st_ivas->bfi && NE_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, FRAME_NO_DATA ) ) { /* select ISM format mode */ st_ivas->ism_mode = ivas_ism_mode_select( st_ivas->nchan_ism, ivas_total_brate ); - + move32(); st_ivas->nchan_transport = st_ivas->nchan_ism; - IF( EQ_16( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + move16(); + + if ( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) { st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; - IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + move16(); + if ( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { st_ivas->hDecoderConfig->nchan_out = st_ivas->nchan_ism; + move16(); } } - IF( NE_16( st_ivas->ini_active_frame, 0 ) ) + if ( st_ivas->ini_active_frame != 0 ) { /* ISM bit-rate switching */ { + test(); IF( ( NE_16( st_ivas->ism_mode, last_ism_mode ) ) || ( NE_32( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) ) { IF( NE_16( ( error = ivas_ism_bitrate_switching_dec_fx( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, @@ -744,17 +768,20 @@ ivas_error ivas_ism_dec_config_fx( ELSE IF( !st_ivas->bfi && EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) { st_ivas->nchan_transport = st_ivas->nchan_ism; - IF( EQ_16( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + move16(); + IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) { st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; - IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + move16(); + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { st_ivas->hDecoderConfig->nchan_out = st_ivas->nchan_ism; + move16(); } } /* ISM mode switching */ - IF( NE_16( st_ivas->ism_mode, last_ism_mode ) ) + IF( NE_32( st_ivas->ism_mode, last_ism_mode ) ) { IF( NE_16( ( error = ivas_ism_bitrate_switching_dec_fx( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, data ) ), @@ -769,21 +796,25 @@ ivas_error ivas_ism_dec_config_fx( { case 1: st_ivas->transport_config = IVAS_AUDIO_CONFIG_ISM1; + move32(); BREAK; case 2: st_ivas->transport_config = IVAS_AUDIO_CONFIG_ISM2; + move32(); BREAK; case 3: st_ivas->transport_config = IVAS_AUDIO_CONFIG_ISM3; + move32(); BREAK; case 4: st_ivas->transport_config = IVAS_AUDIO_CONFIG_ISM4; + move32(); BREAK; default: st_ivas->transport_config = IVAS_AUDIO_CONFIG_INVALID; + move32(); BREAK; } - return error; } #else diff --git a/lib_dec/ivas_ism_dtx_dec.c b/lib_dec/ivas_ism_dtx_dec.c index 2fd8bf77b..d891ccfca 100644 --- a/lib_dec/ivas_ism_dtx_dec.c +++ b/lib_dec/ivas_ism_dtx_dec.c @@ -65,6 +65,7 @@ void ivas_ism_dtx_dec_fx( nchan_ism_prev = st_ivas->nchan_ism; move16(); + test(); IF( !st_ivas->bfi && EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) { /* 'nchan_ism' was read in ivas_dec_setup() */ @@ -82,6 +83,7 @@ void ivas_ism_dtx_dec_fx( ivas_ism_metadata_sid_dec_fx( st_ivas->hSCE, ivas_total_brate, st_ivas->bfi, nchan_ism, st_ivas->nchan_transport, st_ivas->ism_mode, &flag_noisy_speech, &sce_id_dtx, st_ivas->hIsmMetaData, nb_bits_metadata ); + test(); IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) && !st_ivas->bfi ) { IF( st_ivas->hParamIsmDec != NULL ) @@ -96,7 +98,7 @@ void ivas_ism_dtx_dec_fx( set16_fx( md_diff_flag, 1, nchan_ism ); - IF( EQ_16( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) { FOR( ch = 0; ch < nchan_ism; ch++ ) { @@ -107,7 +109,7 @@ void ivas_ism_dtx_dec_fx( } } /* synch common seed between SCEs */ - IF( EQ_16( st_ivas->ism_mode, ISM_MODE_DISC ) ) + IF( EQ_32( st_ivas->ism_mode, ISM_MODE_DISC ) ) { FOR( ch = 0; ch < nchan_ism; ++ch ) { @@ -121,6 +123,7 @@ void ivas_ism_dtx_dec_fx( st_ivas->hISMDTX.ism_dtx_hangover_cnt = 0; move16(); + test(); IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) && !st_ivas->bfi ) { FOR( ch = 0; ch < st_ivas->nchan_transport; ch++ ) @@ -137,10 +140,11 @@ void ivas_ism_dtx_dec_fx( st = st_ivas->hSCE[ch]->hCoreCoder[0]; st->bit_stream = st_ivas->hSCE[0]->hCoreCoder[0]->bit_stream; st->next_bit_pos = 0; /* note: needed in paramISM -> discISM switching */ - st->cng_ism_flag = 1; move16(); + st->cng_ism_flag = 1; move16(); st->L_frame = s_min( st->L_frame, L_FRAME16k ); /* note: needed for switching from active frame with L_frame=640 to CNG in object with no SID */ + move16(); } } diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 0543b1519..2c2e61b70 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -161,6 +161,7 @@ static void ism_metadata_smooth_fx( { diff_fx = L_sub( diff_fx, ( ISM_AZIMUTH_MAX_FX - ISM_AZIMUTH_MIN_FX ) ); hIsmMetaData->last_azimuth_fx = L_add( hIsmMetaData->last_azimuth_fx, ( ISM_AZIMUTH_MAX_FX - ISM_AZIMUTH_MIN_FX ) ); + move32(); } ELSE IF( LT_32( diff_fx, ISM_AZIMUTH_MIN_FX ) ) { @@ -174,9 +175,19 @@ static void ism_metadata_smooth_fx( } ELSE IF( GT_32( L_abs( diff_fx ), L_shl( CNG_MD_MAX_DIFF_AZIMUTH, Q22 ) ) ) { - hIsmMetaData->azimuth_fx = L_add( hIsmMetaData->last_azimuth_fx, ( GE_32( diff_fx, 0 ) ? 1 : -1 ) * L_shl( CNG_MD_MAX_DIFF_AZIMUTH, Q22 ) ); + Word32 temp; + IF( ( diff_fx > 0 ) ) + { + temp = L_shl( CNG_MD_MAX_DIFF_AZIMUTH, Q22 ); + } + ELSE + { + temp = L_negate( L_shl( CNG_MD_MAX_DIFF_AZIMUTH, Q22 ) ); + } + hIsmMetaData->azimuth_fx = L_add( hIsmMetaData->last_azimuth_fx, temp ); + move32(); } - ELSE IF( NE_32( diff_fx, 0 ) ) + ELSE IF( diff_fx != 0 ) { hIsmMetaData->azimuth_fx = hIsmMetaData->last_true_azimuth_fx; move32(); @@ -185,6 +196,7 @@ static void ism_metadata_smooth_fx( IF( GT_32( hIsmMetaData->azimuth_fx, ISM_AZIMUTH_MAX_FX ) ) { hIsmMetaData->azimuth_fx = L_sub( hIsmMetaData->azimuth_fx, ( ISM_AZIMUTH_MAX_FX - ISM_AZIMUTH_MIN_FX ) ); + move32(); } /* smooth elevation */ @@ -197,7 +209,17 @@ static void ism_metadata_smooth_fx( } ELSE IF( GT_32( L_abs( diff_fx ), L_shl( CNG_MD_MAX_DIFF_ELEVATION, Q22 ) ) ) { - hIsmMetaData->elevation_fx = L_add( hIsmMetaData->last_elevation_fx, ( GE_32( diff_fx, 0 ) ? 1 : -1 ) * L_shl( CNG_MD_MAX_DIFF_ELEVATION, Q22 ) ); + Word32 temp; + IF( ( diff_fx > 0 ) ) + { + temp = L_shl( CNG_MD_MAX_DIFF_ELEVATION, Q22 ); + } + ELSE + { + temp = L_negate( L_shl( CNG_MD_MAX_DIFF_ELEVATION, Q22 ) ); + } + hIsmMetaData->elevation_fx = L_add( hIsmMetaData->last_elevation_fx, temp ); + move32(); } } @@ -753,6 +775,7 @@ ivas_error ivas_ism_metadata_dec_fx( Word16 nbands, nblocks; Word16 md_diff_flag[MAX_NUM_OBJECTS]; ivas_error error; + Word32 res_dec, res_frac; move16(); push_wmops( "ism_meta_dec" ); @@ -762,10 +785,9 @@ ivas_error ivas_ism_metadata_dec_fx( move16(); nchan_transport_prev = *nchan_transport; move16(); - - last_bit_pos = extract_l( L_sub( ( ism_total_brate / FRAMES_PER_SEC ), 1 ) ); + iDiv_and_mod_32( ism_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + last_bit_pos = extract_l( L_sub( res_dec, 1 ) ); bstr_orig = st0->bit_stream; - move16(); next_bit_pos_orig = st0->next_bit_pos; move16(); st0->next_bit_pos = 0; @@ -780,7 +802,7 @@ ivas_error ivas_ism_metadata_dec_fx( /* reverse the bitstream for easier reading of indices */ FOR( i = 0; i < s_min( MAX_BITS_ISM_METADATA, last_bit_pos ); i++ ) { - bstr_meta[i] = st0->bit_stream[last_bit_pos - i]; + bstr_meta[i] = st0->bit_stream[sub( last_bit_pos, i )]; move16(); } st0->bit_stream = bstr_meta; @@ -797,13 +819,16 @@ ivas_error ivas_ism_metadata_dec_fx( { /* number of objects was read in ivas_dec_setup() */ st0->next_bit_pos = add( st0->next_bit_pos, NO_BITS_MASA_ISM_NO_OBJ ); + move32(); } ELSE IF( NE_32( ism_mode, ISM_MASA_MODE_DISC ) && NE_32( ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) { /* number of objects was read in ivas_dec_setup() */ st0->next_bit_pos = add( st0->next_bit_pos, nchan_ism ); + move16(); ism_mode = ivas_ism_mode_select( nchan_ism, ism_total_brate ); + move16(); } IF( EQ_32( ism_mode, ISM_MODE_PARAM ) ) @@ -932,7 +957,7 @@ ivas_error ivas_ism_metadata_dec_fx( lowrate_metadata_flag[ch] = hIsmMeta[ch]->ism_md_lowrate_flag; move16(); - IF( EQ_16( null_metadata_flag[ch], 0 ) ) + IF( null_metadata_flag[ch] == 0 ) { ism_metadata_flag_global = s_or( ism_metadata_flag_global, lowrate_metadata_flag[ch] ); } @@ -1072,7 +1097,7 @@ ivas_error ivas_ism_metadata_dec_fx( } ELSE { - IF( EQ_16( *ism_extmeta_active, 0 ) ) + IF( *ism_extmeta_active == 0 ) { hIsmMetaData->yaw_fx = 0; move32(); @@ -1187,6 +1212,7 @@ ivas_error ivas_ism_metadata_dec_fx( { ism_metadata_smooth_fx( hIsmMeta, ism_total_brate, nchan_ism ); hISMDTX.ism_dtx_hangover_cnt = add( hISMDTX.ism_dtx_hangover_cnt, 1 ); + move16(); } IF( EQ_32( ism_mode, ISM_SBA_MODE_DISC ) ) @@ -1481,7 +1507,7 @@ static void decode_angle_indices_fx( sgn = 1; move16(); - IF( EQ_16( get_next_indice_fx( st0, 1 ), 0 ) ) + IF( get_next_indice_fx( st0, 1 ) == 0 ) { nbits_diff_angle1 = 1; move16(); @@ -1497,19 +1523,19 @@ static void decode_angle_indices_fx( move16(); } - nbits_diff_angle1++; + nbits_diff_angle1 = add( nbits_diff_angle1, 1 ); /* read until the stop bit */ WHILE( LT_16( nbits_diff_angle1, sub( ISM_AZIMUTH_NBITS, 1 ) ) && EQ_16( get_next_indice_fx( st0, 1 ), 1 ) ) { - diff++; - nbits_diff_angle1++; + diff = add( diff, 1 ); + nbits_diff_angle1 = add( nbits_diff_angle1, 1 ); } IF( LT_16( nbits_diff_angle1, sub( ISM_AZIMUTH_NBITS, 1 ) ) ) { /* count stop bit */ - nbits_diff_angle1++; + nbits_diff_angle1 = add( nbits_diff_angle1, 1 ); } } idx_angle1 = add( angle->last_angle1_idx, i_mult2( sgn, diff ) ); @@ -1520,7 +1546,7 @@ static void decode_angle_indices_fx( { idx_angle1 = sub( idx_angle1, sub( shl( 1, ISM_AZIMUTH_NBITS ), 1 ) ); /* +180° -> -180° */ } - ELSE IF( LT_16( idx_angle1, 0 ) ) + ELSE IF( idx_angle1 < 0 ) { idx_angle1 = add( idx_angle1, sub( shl( 1, ISM_AZIMUTH_NBITS ), 1 ) ); /* -180° -> +180° */ } @@ -1534,7 +1560,7 @@ static void decode_angle_indices_fx( /* sanity check in case of FER or BER */ test(); - IF( LT_16( idx_angle1, 0 ) || GT_16( idx_angle1, sub( shl( 1, ISM_AZIMUTH_NBITS ), 1 ) ) ) + IF( ( idx_angle1 < 0 ) || GT_16( idx_angle1, sub( shl( 1, ISM_AZIMUTH_NBITS ), 1 ) ) ) { idx_angle1 = angle->last_angle1_idx; move16(); @@ -1544,11 +1570,11 @@ static void decode_angle_indices_fx( * Elevation/pitch decoding and dequantization *----------------------------------------------------------------*/ - IF( EQ_16( non_diegetic_flag, 0 ) ) + IF( non_diegetic_flag == 0 ) { /* Decode elevation/pitch index */ test(); - IF( EQ_16( *flag_abs_angle1, 0 ) && EQ_16( get_next_indice_fx( st0, 1 ), 1 ) ) /* elevation_abs_flag */ + IF( ( *flag_abs_angle1 == 0 ) && EQ_16( get_next_indice_fx( st0, 1 ), 1 ) ) /* elevation_abs_flag */ { idx_angle2 = get_next_indice_fx( st0, ISM_ELEVATION_NBITS ); } @@ -1559,7 +1585,7 @@ static void decode_angle_indices_fx( sgn = 1; move16(); - IF( EQ_16( get_next_indice_fx( st0, 1 ), 0 ) ) + IF( get_next_indice_fx( st0, 1 ) == 0 ) { nbits_diff_angle2 = 1; move16(); @@ -1596,7 +1622,7 @@ static void decode_angle_indices_fx( /* sanity check in case of FER or BER */ test(); - IF( LT_16( idx_angle2, 0 ) || GT_16( idx_angle2, sub( shl( 1, ISM_ELEVATION_NBITS ), 1 ) ) ) + IF( ( idx_angle2 < 0 ) || GT_16( idx_angle2, sub( shl( 1, ISM_ELEVATION_NBITS ), 1 ) ) ) { idx_angle2 = angle->last_angle2_idx; move16(); @@ -1798,7 +1824,7 @@ static Word16 decode_radius_fx( sgn = 1; move16(); - IF( EQ_16( get_next_indice_fx( st0, 1 ), 0 ) ) + IF( get_next_indice_fx( st0, 1 ) == 0 ) { nbits_diff_radius = 1; move16(); @@ -1814,19 +1840,19 @@ static Word16 decode_radius_fx( move16(); } - nbits_diff_radius++; + nbits_diff_radius = add( nbits_diff_radius, 1 ); /* read until the stop bit */ WHILE( LT_16( nbits_diff_radius, ISM_RADIUS_NBITS ) && EQ_16( get_next_indice_fx( st0, 1 ), 1 ) ) { - diff++; - nbits_diff_radius++; + diff = add( diff, 1 ); + nbits_diff_radius = add( nbits_diff_radius, 1 ); } IF( LT_16( nbits_diff_radius, ISM_RADIUS_NBITS ) ) { /* count stop bit */ - nbits_diff_radius++; + nbits_diff_radius = add( nbits_diff_radius, 1 ); } } idx_radius = add( *last_radius_idx, i_mult2( sgn, diff ) ); @@ -1834,7 +1860,7 @@ static Word16 decode_radius_fx( /* sanity check in case of FER or BER */ test(); - IF( LT_16( idx_radius, 0 ) || GT_16( idx_radius, sub( shl( 1, ISM_RADIUS_NBITS ), 1 ) ) ) + IF( ( idx_radius < 0 ) || GT_16( idx_radius, sub( shl( 1, ISM_RADIUS_NBITS ), 1 ) ) ) { idx_radius = *last_radius_idx; move16(); @@ -2197,7 +2223,8 @@ void ivas_ism_metadata_sid_dec_fx( } idx = get_next_indice_fx( st0, nBits_coh ); - hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx = div_s( idx, ( ( 1 << nBits_coh ) - 1 ) ); + hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence_fx = div_s( idx, sub( ( shl( 1, nBits_coh ) ), 1 ) ); + move16(); } } @@ -2245,7 +2272,9 @@ void ivas_ism_metadata_sid_dec_fx( } /* take into account padding bits as metadata bits to keep later bitrate checks valid */ - nb_bits_metadata[*sce_id_dtx] = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; + Word32 res_dec, res_frac; + iDiv_and_mod_32( sub( IVAS_SID_5k2, SID_2k40 ), FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + nb_bits_metadata[*sce_id_dtx] = (Word16) res_dec; move16(); /* set the bitstream pointer to its original position */ diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 3124f80a5..5aad96908 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -70,9 +70,9 @@ static void ivas_param_ism_dec_dequant_DOA_fx( FOR( i = 0; i < nchan_ism; i++ ) { hParamIsmDec->azimuth_values_fx[i] = ism_dequant_meta_fx( hParamIsm->azi_index[i], ism_azimuth_borders_fx, ISM_Q_STEP_FX, ISM_Q_STEP_BORDER_FX, 1 << ISM_AZIMUTH_NBITS ); - move32(); + move16(); hParamIsmDec->elevation_values_fx[i] = ism_dequant_meta_fx( hParamIsm->ele_index[i], ism_elevation_borders_fx, ISM_Q_STEP_FX, ISM_Q_STEP_BORDER_FX, 1 << ISM_ELEVATION_NBITS ); - move32(); + move16(); } return; @@ -198,14 +198,14 @@ static void ivas_ism_get_proto_matrix_fx( { FOR( idx = 0; idx < hOutSetup.nchan_out_woLFE; idx++ ) { - IF( GT_32( hOutSetup.ls_azimuth_fx[idx], 0 ) ) + IF( hOutSetup.ls_azimuth_fx[idx] > 0 ) { proto_matrix[idx] = shl_sat( ONE_IN_Q14, 1 ); move16(); - proto_matrix[idx + hOutSetup.nchan_out_woLFE] = 0; + proto_matrix[add( idx, hOutSetup.nchan_out_woLFE )] = 0; move16(); } - ELSE IF( LT_32( hOutSetup.ls_azimuth_fx[idx], 0 ) ) + ELSE IF( hOutSetup.ls_azimuth_fx[idx] < 0 ) { proto_matrix[idx] = 0; move16(); @@ -307,7 +307,7 @@ static void ivas_param_ism_collect_slot_fx( Word16 exp_ref_power_buf[CLDFB_NO_CHANNELS_MAX]; Word16 exp_cx_diag_buf[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; set16_fx( exp_ref_power_buf, *exp_ref_power, CLDFB_NO_CHANNELS_MAX ); - for ( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + FOR( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) { set16_fx( exp_cx_diag_buf[i], *exp_cx_diag, PARAM_ISM_MAX_DMX ); } @@ -320,17 +320,21 @@ static void ivas_param_ism_collect_slot_fx( FOR( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) { tmp_fx = 0; + move32(); exp_tmp = 0; + move32(); Word32 var1 = Mpy_32_32( Cldfb_RealBuffer_in_fx[bin_idx], Cldfb_RealBuffer_in_fx[bin_idx] ); // 2 * exp_real Word32 var2 = Mpy_32_32( Cldfb_ImagBuffer_in_fx[bin_idx], Cldfb_ImagBuffer_in_fx[bin_idx] ); // 2 * exp_imag tmp_fx = BASOP_Util_Add_Mant32Exp( tmp_fx, exp_tmp, var1, add( exp_real, exp_real ), &exp_tmp ); tmp_fx = BASOP_Util_Add_Mant32Exp( tmp_fx, exp_tmp, var2, add( exp_imag, exp_imag ), &exp_tmp ); Word16 exp_cx_diag_new = 0, exp_ref_power_new = 0; + move16(); + move16(); cx_diag_fx[bin_idx][ch] = BASOP_Util_Add_Mant32Exp( cx_diag_fx[bin_idx][ch], exp_cx_diag_buf[bin_idx][ch], tmp_fx, exp_tmp, &exp_cx_diag_new ); - move32(); + move16(); ref_power_fx[bin_idx] = BASOP_Util_Add_Mant32Exp( ref_power_fx[bin_idx], exp_ref_power_buf[bin_idx], tmp_fx, exp_tmp, &exp_ref_power_new ); - move32(); + move16(); exp_cx_diag_buf[bin_idx][ch] = exp_cx_diag_new; move16(); exp_ref_power_buf[bin_idx] = exp_ref_power_new; @@ -340,6 +344,8 @@ static void ivas_param_ism_collect_slot_fx( /*make common exponent*/ Word16 max_exp_cx_diag = exp_cx_diag_buf[0][0], max_exp_ref_power = exp_ref_power_buf[0]; + move16(); + move16(); FOR( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) { FOR( j = 0; j < PARAM_ISM_MAX_DMX; j++ ) @@ -354,12 +360,16 @@ static void ivas_param_ism_collect_slot_fx( FOR( j = 0; j < PARAM_ISM_MAX_DMX; j++ ) { cx_diag_fx[i][j] = L_shr_r( cx_diag_fx[i][j], sub( max_exp_cx_diag, exp_cx_diag_buf[i][j] ) ); + move16(); } ref_power_fx[i] = L_shr_r( ref_power_fx[i], sub( max_exp_ref_power, exp_ref_power_buf[i] ) ); + move16(); } *exp_cx_diag = max_exp_cx_diag; + move16(); *exp_ref_power = max_exp_ref_power; + move16(); return; } @@ -429,28 +439,34 @@ static void ivas_param_ism_compute_mixing_matrix_fx( assert( ( nchan_ism == 3 ) || ( nchan_ism == 4 ) ); assert( nchan_transport == 2 ); + test(); IF( hParamIsmDec->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) { num_wave = nchan_ism; + move16(); } ELSE { num_wave = MAX_PARAM_ISM_WAVE; + move16(); } set32_fx( response_matrix_fx, 0, PARAM_ISM_MAX_CHAN * MAX_NUM_OBJECTS ); response_matrix_e = 0; + move16(); /* loop over parameter bands to compute the mixing matrix */ FOR( band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ ) { brange[0] = hParamIsmDec->hParamIsm->band_grouping[band_idx]; + move16(); brange[1] = hParamIsmDec->hParamIsm->band_grouping[band_idx + 1]; + move16(); /* Compute covaraince matrix from direct response*/ FOR( w = 0; w < num_wave; w++ ) { set32_fx( cy_diag_tmp_fx[w], 0, nchan_out_woLFE ); - + test(); IF( hParamIsmDec->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) { dir_res_ptr_fx = direct_response_fx[w]; @@ -458,11 +474,14 @@ static void ivas_param_ism_compute_mixing_matrix_fx( ELSE { obj_indx = hParamIsmDec->hParamIsm->obj_indices[band_idx][0][w]; + move16(); dir_res_ptr_fx = direct_response_fx[obj_indx]; } Copy32( dir_res_ptr_fx, response_matrix_fx + w * nchan_out_woLFE, nchan_out_woLFE ); // Q30 dir_res_ptr_e = 1; + move16(); response_matrix_e = 1; + move16(); /* we only need the diagonal of Cy*/ matrix_product_diag_fx( dir_res_ptr_fx, dir_res_ptr_e, nchan_out_woLFE, 1, 0, dir_res_ptr_fx, dir_res_ptr_e, 1, nchan_out_woLFE, 0, cy_diag_tmp_fx[w], &cy_diag_tmp_e[w] ); } @@ -474,6 +493,7 @@ static void ivas_param_ism_compute_mixing_matrix_fx( set16_fx( cy_diag_e_arr, 0, nchan_out_woLFE ); FOR( w = 0; w < num_wave; w++ ) { + test(); IF( hParamIsmDec->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) { // direct_power[w] = ( 1.0f / nchan_ism ) * ref_power[bin_idx]; @@ -495,7 +515,8 @@ static void ivas_param_ism_compute_mixing_matrix_fx( direct_power_fx[w] = Mpy_32_16_1( ref_power_fx[bin_idx], hParamIsmDec->power_ratios_fx[band_idx][0][w] ); } direct_power_e = ref_power_e; - IF( NE_32( direct_power_fx[w], 0 ) ) + move16(); + IF( direct_power_fx[w] != 0 ) { FOR( i = 0; i < nchan_out_woLFE; i++ ) { @@ -503,9 +524,11 @@ static void ivas_param_ism_compute_mixing_matrix_fx( } } temp_e[w] = direct_power_e; + move16(); direct_power_fx[w] = Sqrt32( direct_power_fx[w], &temp_e[w] ); } cy_diag_e = cy_diag_e_arr[0]; + move16(); FOR( i = 1; i < nchan_out_woLFE; i++ ) { cy_diag_e = s_max( cy_diag_e, cy_diag_e_arr[i] ); @@ -516,6 +539,7 @@ static void ivas_param_ism_compute_mixing_matrix_fx( } direct_power_e = temp_e[0]; + move16(); FOR( w = 1; w < num_wave; w++ ) { direct_power_e = s_max( direct_power_e, temp_e[w] ); @@ -653,12 +677,12 @@ static void ivas_param_ism_render_slot_fx( tmp_1_fx = L_deposit_h( hParamIsmDec->hParamIsmRendering->interpolator_fx[interpolator_idx] ); /* Q31 */ Word16 res_exp = 0; - Word16 real_buf_exp = hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_exp; - Word16 imag_buf_exp = hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_exp; - Word16 i, j, k; move16(); + Word16 real_buf_exp = hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_exp; move16(); + Word16 imag_buf_exp = hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_exp; move16(); + Word16 i, j, k; /*exponent buffers to handle variable exp*/ Word16 exp_buf_real[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; @@ -696,7 +720,6 @@ static void ivas_param_ism_render_slot_fx( Cldfb_ImagBuffer_fx[outchIdx][out_slot_idx][bin_idx] = BASOP_Util_Add_Mant32Exp( Cldfb_ImagBuffer_fx[outchIdx][out_slot_idx][bin_idx], imag_buf_exp, tmp_5, res_exp + hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_exp, &imag_buf_exp ); move32(); - exp_buf_real[outchIdx][out_slot_idx][bin_idx] = real_buf_exp; move16(); exp_buf_imag[outchIdx][out_slot_idx][bin_idx] = imag_buf_exp; @@ -932,7 +955,6 @@ static void ivas_param_ism_update_mixing_matrix_fx( } Copy( mixing_matrix_exp, hParamIsmDec->hParamIsmRendering->exp_mixing_matrix_lin_old_fx, CLDFB_NO_CHANNELS_MAX ); - move16(); return; } @@ -987,7 +1009,7 @@ ivas_error ivas_param_ism_dec_open_fx( ivas_error error; error = IVAS_ERR_OK; - + move32(); push_wmops( "ivas_param_ism_dec_open" ); /*-----------------------------------------------------------------* @@ -1018,7 +1040,7 @@ ivas_error ivas_param_ism_dec_open_fx( output_Fs = st_ivas->hDecoderConfig->output_Fs; move32(); output_config = st_ivas->hDecoderConfig->output_config; - + move32(); ivas_param_ism_config_fx( hParamIsmDec->hParamIsm, st_ivas->nchan_ism ); // assuming Q14 for gains; /*-----------------------------------------------------------------* @@ -1036,11 +1058,13 @@ ivas_error ivas_param_ism_dec_open_fx( hSpatParamRendCom->slots_rendered = 0; move16(); hSpatParamRendCom->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; + move16(); /* hSpatParamRendCom->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); */ hSpatParamRendCom->num_freq_bands = extract_l( Mpy_32_32( output_Fs, 2684355 /* INV_CLDFB_BANDWIDTH in Q31 */ ) ); move16(); hParamIsmDec->hParamIsm->nbands = MAX_PARAM_ISM_NBANDS; + move16(); FOR( i = 0; i < ( hParamIsmDec->hParamIsm->nbands + 1 ); i++ ) { @@ -1059,12 +1083,13 @@ ivas_error ivas_param_ism_dec_open_fx( *-----------------------------------------------------------------*/ /* hIntSetup and hOutSetup differs only for Binaural rendering */ - IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { /* nchan_out is essential for memory initialization for CLDFB Synthesis */ st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->nchan_ism; move16(); st_ivas->hIntSetup.is_loudspeaker_setup = 1; + move16(); } hOutSetup = st_ivas->hIntSetup; @@ -1094,8 +1119,8 @@ ivas_error ivas_param_ism_dec_open_fx( test(); test(); test(); - IF( !( output_config == IVAS_AUDIO_CONFIG_EXTERNAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB || - output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || + EQ_32( output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) { /* Initialize efap handle */ IF( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), hOutSetup.ls_azimuth_fx, hOutSetup.ls_elevation_fx, hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) @@ -1150,7 +1175,7 @@ ivas_error ivas_param_ism_dec_open_fx( IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { nchan_full = nchan_transport; - + move16(); hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx = NULL; hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx = NULL; } @@ -1183,7 +1208,8 @@ ivas_error ivas_param_ism_dec_open_fx( IF( st_ivas->hTcBuffer == NULL ) { - IF( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, nchan_full, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + move16(); // NS2SA + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, nchan_full, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ), IVAS_ERR_OK ) ) { return error; @@ -1198,7 +1224,8 @@ ivas_error ivas_param_ism_dec_open_fx( { Word16 nchan_to_allocate = st_ivas->hDecoderConfig->nchan_out; move16(); - IF( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_BUFFER, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + move16(); // NS2SA + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_BUFFER, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -1426,6 +1453,7 @@ void ivas_param_ism_dec_close_fx( AUDIO_CONFIG output_config /* i : output audio configuration */ ) { + test(); IF( hParamIsmDec_out != NULL && *hParamIsmDec_out != NULL ) { PARAM_ISM_DEC_HANDLE hParamIsmDec; @@ -1438,7 +1466,8 @@ void ivas_param_ism_dec_close_fx( hParamIsmDec->hParamIsm = NULL; } - IF( !( EQ_16( output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) + test(); + IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) { /* Param ISM Rendering */ IF( hParamIsmDec->hParamIsmRendering->interpolator_fx != NULL ) @@ -1472,9 +1501,12 @@ void ivas_param_ism_dec_close_fx( *hParamIsmDec_out = NULL; } + test(); IF( hSpatParamRendCom_out != NULL && *hSpatParamRendCom_out != NULL ) { - IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + test(); + test(); + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { ivas_dirac_deallocate_parameters_fx( *hSpatParamRendCom_out, 1 ); ivas_dirac_deallocate_parameters_fx( *hSpatParamRendCom_out, 2 ); @@ -1839,9 +1871,11 @@ void ivas_ism_dec_digest_tc_fx( /* we have a full frame interpolator, adapt it */ /* for BE testing */ - IF( EQ_16( extract_l( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ), st_ivas->hTcBuffer->n_samples_available ) ) + Word32 res_dec, res_frac; + iDiv_and_mod_32( st_ivas->hDecoderConfig->output_Fs, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + IF( EQ_32( extract_l( res_dec ), st_ivas->hTcBuffer->n_samples_available ) ) { - Word16 interpolator_length = extract_l( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + Word16 interpolator_length = extract_l( res_dec ); test(); test(); @@ -1870,6 +1904,7 @@ void ivas_ism_dec_digest_tc_fx( ELSE { ivas_jbm_dec_get_adapted_linear_interpolator_fx( (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ), st_ivas->hTcBuffer->n_samples_available, st_ivas->hIsmRendererData->interpolator_fx ); + move16(); } /* also get the gains here */ @@ -1879,14 +1914,14 @@ void ivas_ism_dec_digest_tc_fx( { Copy32( st_ivas->hIsmRendererData->gains_fx[i], st_ivas->hIsmRendererData->prev_gains_fx[i], MAX_OUTPUT_CHANNELS ); - IF( st_ivas->intern_config == IVAS_AUDIO_CONFIG_STEREO ) + IF( EQ_32( st_ivas->intern_config, IVAS_AUDIO_CONFIG_STEREO ) ) { Word16 gains_fx[2]; ivas_ism_get_stereo_gains_fx( (Word16) L_shr( st_ivas->hIsmMetaData[i]->azimuth_fx, 22 ), (Word16) L_shr( st_ivas->hIsmMetaData[i]->elevation_fx, 22 ), &gains_fx[0], &gains_fx[1] ); st_ivas->hIsmRendererData->gains_fx[i][0] = L_shr( L_deposit_h( gains_fx[0] ), 1 ); - move32(); + move16(); st_ivas->hIsmRendererData->gains_fx[i][1] = L_shr( L_deposit_h( gains_fx[1] ), 1 ); - move32(); + move16(); } ELSE { @@ -2040,9 +2075,14 @@ void ivas_param_ism_dec_digest_tc_fx( { Word16 exp_ref_power = 31, exp_cx_diag = 31; Word16 exp_real_tmp = 0, exp_imag_tmp = 0; + move16(); + move16(); + move16(); + move16(); Word32 ref_power_fx[CLDFB_NO_CHANNELS_MAX]; Word32 cx_diag_fx[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; Word16 q_tc = q_tc_in; + move16(); Word16 ch, nchan_transport, nchan_out, nchan_out_woLFE, i; Word16 slot_idx, bin_idx; Word32 ivas_total_brate; @@ -2062,20 +2102,28 @@ void ivas_param_ism_dec_digest_tc_fx( fade_len = shr( output_frame, 2 ); nchan_transport = st_ivas->nchan_transport; + move16(); ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + move32(); hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_exp = 25; + move16(); hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_exp = 25; - IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + move16(); + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { nchan_out = st_ivas->nchan_ism; + move16(); nchan_out_woLFE = nchan_out; + move16(); st_ivas->hDecoderConfig->nchan_out = nchan_out; + move16(); } ELSE { - nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + nchan_out = add( st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hIntSetup.num_lfe ); nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + move16(); } push_wmops( "ivas_param_ism_dec" ); @@ -2091,24 +2139,29 @@ void ivas_param_ism_dec_digest_tc_fx( set_zero_fx( cx_diag_fx[bin_idx], PARAM_ISM_MAX_DMX ); } exp_cx_diag = 0; + move16(); set_zero_fx( ref_power_fx, CLDFB_NO_CHANNELS_MAX ); exp_ref_power = 0; + move16(); /* Frame-level Processing */ /* De-quantization */ + test(); IF( !( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) || EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) ) { ivas_param_ism_dec_dequant_DOA_fx( hParamIsmDec, st_ivas->nchan_ism ); ivas_param_ism_dec_dequant_powrat_fx( hParamIsmDec ); st_ivas->hISMDTX.dtx_flag = 0; + move16(); } ELSE { st_ivas->hISMDTX.dtx_flag = 1; + move16(); } /* obtain the direct response using EFAP */ - IF( !( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) ) + IF( !( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) ) { FOR( i = 0; i < st_ivas->nchan_ism; i++ ) { @@ -2126,10 +2179,12 @@ void ivas_param_ism_dec_digest_tc_fx( IF( EQ_16( i, j ) ) { direct_response_fx[i][j] = ONE_IN_Q30; + move32(); } ELSE { direct_response_fx[i][j] = 0; + move32(); } } } @@ -2139,19 +2194,25 @@ void ivas_param_ism_dec_digest_tc_fx( IF( GT_32( hParamIsmDec->azimuth_values_fx[j], 0 ) ) { hParamIsmDec->hParamIsmRendering->proto_matrix_fx[j] = 32767; + move16(); hParamIsmDec->hParamIsmRendering->proto_matrix_fx[nchan_out_woLFE + j] = 0; + move16(); } ELSE { IF( LT_32( hParamIsmDec->azimuth_values_fx[j], 0 ) ) { hParamIsmDec->hParamIsmRendering->proto_matrix_fx[j] = 0; + move16(); hParamIsmDec->hParamIsmRendering->proto_matrix_fx[nchan_out_woLFE + j] = 32767; + move16(); } ELSE /* == 0.0f */ { hParamIsmDec->hParamIsmRendering->proto_matrix_fx[j] = ONE_IN_Q14; + move16(); hParamIsmDec->hParamIsmRendering->proto_matrix_fx[nchan_out_woLFE + j] = ONE_IN_Q14; + move16(); } } } @@ -2168,6 +2229,7 @@ void ivas_param_ism_dec_digest_tc_fx( scale_sig32( transport_channels[i], output_frame, sub( q_tc_in, q_tc ) ); } q_tc = q_tc_in; + move16(); } } @@ -2181,6 +2243,7 @@ void ivas_param_ism_dec_digest_tc_fx( Word32 RealBuffer_fx[CLDFB_NO_CHANNELS_MAX]; Word32 ImagBuffer_fx[CLDFB_NO_CHANNELS_MAX]; q_tc = q_tc_in; + move16(); cldfbAnalysis_ts_fx_fixed_q( &( transport_channels[ch][hSpatParamRendCom->num_freq_bands * slot_idx] ), RealBuffer_fx, ImagBuffer_fx, hSpatParamRendCom->num_freq_bands, st_ivas->cldfbAnaDec[ch], &q_tc ); Copy32( RealBuffer_fx, &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands ); Copy32( ImagBuffer_fx, &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands ); @@ -2188,27 +2251,30 @@ void ivas_param_ism_dec_digest_tc_fx( hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_exp = sub( 31, q_tc ); } Word16 scale_factor_real, scale_factor_imag; - + Word16 current_idx; exp_real_tmp = hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_exp; + move16(); exp_imag_tmp = hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_exp; - scale_factor_real = getScaleFactor32( &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands ); - scale_factor_imag = getScaleFactor32( &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands ); - scale_sig32( &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands, scale_factor_real ); - scale_sig32( &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands, scale_factor_imag ); - exp_real_tmp -= scale_factor_real; - exp_imag_tmp -= scale_factor_imag; + move16(); + current_idx = add( imult1616( imult1616( slot_idx, hSpatParamRendCom->num_freq_bands ), nchan_transport ), imult1616( ch, hSpatParamRendCom->num_freq_bands ) ); + scale_factor_real = getScaleFactor32( &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx[current_idx], hSpatParamRendCom->num_freq_bands ); + scale_factor_imag = getScaleFactor32( &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[current_idx], hSpatParamRendCom->num_freq_bands ); + scale_sig32( &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx[current_idx], hSpatParamRendCom->num_freq_bands, scale_factor_real ); + scale_sig32( &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[current_idx], hSpatParamRendCom->num_freq_bands, scale_factor_imag ); + exp_real_tmp = sub( exp_real_tmp, scale_factor_real ); + exp_imag_tmp = sub( exp_imag_tmp, scale_factor_imag ); ivas_param_ism_collect_slot_fx( hParamIsmDec, - &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], + &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx[current_idx], exp_real_tmp, - &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], + &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[current_idx], exp_imag_tmp, ch, ref_power_fx, &exp_ref_power, cx_diag_fx, &exp_cx_diag ); - exp_real_tmp += scale_factor_real; - exp_imag_tmp += scale_factor_imag; - scale_sig32( &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands, -scale_factor_real ); - scale_sig32( &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[slot_idx * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands], hSpatParamRendCom->num_freq_bands, -scale_factor_imag ); + exp_real_tmp = add( exp_real_tmp, scale_factor_real ); + exp_imag_tmp = add( exp_imag_tmp, scale_factor_imag ); + scale_sig32( &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx[current_idx], hSpatParamRendCom->num_freq_bands, -scale_factor_real ); + scale_sig32( &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[current_idx], hSpatParamRendCom->num_freq_bands, -scale_factor_imag ); } } /* Obtain Mixing Matrix on a frame-level */ @@ -2493,9 +2559,13 @@ void ivas_ism_param_dec_tc_gain_ajust_fx( FOR( i = 0; i < nSamples; i++ ) { ch0_e = 0; + move16(); ch1_e = 0; + move16(); ch0 = transport_channels_f[0][i]; + move16(); ch1 = transport_channels_f[1][i]; + move16(); ch0 = BASOP_Util_Add_Mant32Exp( ch0, ch0_e, 0, 0, &ch0_e ); ch1 = BASOP_Util_Add_Mant32Exp( ch1, ch1_e, 0, 0, &ch1_e ); @@ -2591,7 +2661,7 @@ void ivas_ism_param_dec_tc_gain_ajust_fx( move16(); *Q_tc = sub( *Q_tc, tmp_e1 ); - + move16(); return; } #endif @@ -2627,8 +2697,9 @@ static void ivas_ism_param_dec_render_sf_fx( hParamIsmDec = st_ivas->hParamIsmDec; hSpatParamRendCom = st_ivas->hSpatParamRendCom; slot_idx_start = hSpatParamRendCom->slots_rendered; + move16(); subframe_idx = hSpatParamRendCom->subframes_rendered; - + move16(); /* Set some memories to zero */ FOR( ch = 0; ch < nchan_out_woLFE; ch++ ) { @@ -2645,16 +2716,20 @@ static void ivas_ism_param_dec_render_sf_fx( FOR( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) { index_slot = slot_idx_start + slot_idx; + move16(); FOR( ch = 0; ch < nchan_transport; ch++ ) { - Cldfb_RealBuffer_in_fx[ch] = &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx[index_slot * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands]; // Q11 - Cldfb_ImagBuffer_in_fx[ch] = &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[index_slot * hSpatParamRendCom->num_freq_bands * nchan_transport + ch * hSpatParamRendCom->num_freq_bands]; // Q11 + Word16 cldfb_idx = add( imult1616( imult1616( index_slot, hSpatParamRendCom->num_freq_bands ), nchan_transport ), imult1616( ch, hSpatParamRendCom->num_freq_bands ) ); + Cldfb_RealBuffer_in_fx[ch] = &hParamIsmDec->hParamIsmRendering->Cldfb_RealBuffer_tc_fx[cldfb_idx]; // Q11 + Cldfb_ImagBuffer_in_fx[ch] = &hParamIsmDec->hParamIsmRendering->Cldfb_ImagBuffer_tc_fx[cldfb_idx]; // Q11 } /* Compute bandwise rendering to target LS using covariance rendering */ real_exp[slot_idx] = 0; + move16(); imag_exp[slot_idx] = 0; + move16(); ivas_param_ism_render_slot_fx( hParamIsmDec, hSpatParamRendCom, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, &real_exp[slot_idx], &imag_exp[slot_idx], hParamIsmDec->hParamIsmRendering->mixing_matrix_lin_fx, @@ -2663,20 +2738,22 @@ static void ivas_ism_param_dec_render_sf_fx( /* CLDFB Synthesis */ idx_in = 0; + move16(); idx_lfe = 0; + move16(); // Word16 tmp_buff_Q[MAX_OUTPUT_CHANNELS]; FOR( ch = 0; ch < nchan_out; ch++ ) { - IF( ( hSetup.num_lfe > 0 ) && ( hSetup.index_lfe[idx_lfe] == ch ) ) + test(); + IF( ( hSetup.num_lfe > 0 ) && EQ_16( hSetup.index_lfe[idx_lfe], ch ) ) { set32_fx( output_f_fx[ch], 0, i_mult( hSpatParamRendCom->subframe_nbslots[subframe_idx], hSpatParamRendCom->num_freq_bands ) ); - IF( idx_lfe < sub( hSetup.num_lfe, 1 ) ) + IF( LT_16( idx_lfe, sub( hSetup.num_lfe, 1 ) ) ) { idx_lfe = add( idx_lfe, 1 ); } - // tmp_buff_Q[ch] = 0; } ELSE { @@ -2685,6 +2762,7 @@ static void ivas_ism_param_dec_render_sf_fx( Word32 *ImagBuffer_fx[16]; Word16 Q_real = 31; + move16(); FOR( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) { @@ -2703,30 +2781,38 @@ static void ivas_ism_param_dec_render_sf_fx( } Scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->p_filter_length, sub( sub( Q_real, 1 ), Q11 ) ); - st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q_real - 1; + st_ivas->cldfbSynDec[ch]->Q_cldfb_state = sub( Q_real, 1 ); + move16(); cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, output_f_fx[ch], hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); Scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->p_filter_length, sub( Q11, sub( Q_real, 1 ) ) ); st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q11; + move16(); /*scaling the output_f buffer to have common Q accross the buffer*/ - samplesProcessed = hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->subframe_nbslots[subframe_idx]; + samplesProcessed = imult1616( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ); no_col_cldfb = st_ivas->cldfbSynDec[ch]->no_col; + move16(); IF( GT_16( samplesProcessed, -1 ) ) { - no_col_cldfb = min( no_col_cldfb, ( samplesProcessed + st_ivas->cldfbSynDec[ch]->no_channels - 1 ) / st_ivas->cldfbSynDec[ch]->no_channels ); + Word32 res_dec, res_frac; + iDiv_and_mod_32( sub( add( samplesProcessed, st_ivas->cldfbSynDec[ch]->no_channels ), 1 ), st_ivas->cldfbSynDec[ch]->no_channels, &res_dec, &res_frac, 0 ); + no_col_cldfb = s_min( no_col_cldfb, extract_l( res_dec ) ); move16(); } - size_cldfb = st_ivas->cldfbSynDec[ch]->no_channels * no_col_cldfb; + size_cldfb = imult1616( st_ivas->cldfbSynDec[ch]->no_channels, no_col_cldfb ); Scale_sig32( output_f_fx[ch], size_cldfb, sub( Q11, sub( Q_real, 1 ) ) ); Q_output[ch] = sub( Q_real, 1 ); + move16(); idx_in = add( idx_in, 1 ); } } hSpatParamRendCom->slots_rendered = add( hSpatParamRendCom->slots_rendered, hSpatParamRendCom->subframe_nbslots[subframe_idx] ); + move16(); hSpatParamRendCom->subframes_rendered = add( hSpatParamRendCom->subframes_rendered, 1 ); + move16(); return; } @@ -2851,25 +2937,37 @@ void ivas_param_ism_dec_render_fx( hSpatParamRendCom = st_ivas->hSpatParamRendCom; hSetup = st_ivas->hIntSetup; nchan_transport = st_ivas->nchan_transport; + move16(); - IF( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { nchan_out = st_ivas->nchan_ism; + move16(); nchan_out_woLFE = nchan_out; + move16(); st_ivas->hDecoderConfig->nchan_out = nchan_out; + move16(); } ELSE { nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + move16(); nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + move16(); } slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); - + move16(); /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ - slots_to_render = min( hSpatParamRendCom->num_slots - hSpatParamRendCom->slots_rendered, nSamplesAsked / slot_size ); - *nSamplesRendered = slots_to_render * slot_size; + Word32 res_dec, res_frac; + iDiv_and_mod_32( nSamplesAsked, slot_size, &res_dec, &res_frac, 0 ); + + slots_to_render = s_min( sub( hSpatParamRendCom->num_slots, hSpatParamRendCom->slots_rendered ), extract_l( res_dec ) ); + *nSamplesRendered = imult1616( slots_to_render, extract_l( slot_size ) ); + move16(); first_sf = hSpatParamRendCom->subframes_rendered; + move16(); last_sf = first_sf; + move16(); WHILE( slots_to_render > 0 ) { @@ -2893,7 +2991,7 @@ void ivas_param_ism_dec_render_fx( } } - IF( hSpatParamRendCom->slots_rendered == hSpatParamRendCom->num_slots ) + IF( EQ_16( hSpatParamRendCom->slots_rendered, hSpatParamRendCom->num_slots ) ) { /* copy the memories */ /* store mixing matrix for next subframe */ @@ -2902,20 +3000,24 @@ void ivas_param_ism_dec_render_fx( /* store MetaData parameters */ FOR( ch = 0; ch < st_ivas->nchan_ism; ch++ ) { - IF( st_ivas->hParamIsmDec->azimuth_values_fx[ch] > 754974720 /*180.f in Q22*/ ) + IF( GT_32( st_ivas->hParamIsmDec->azimuth_values_fx[ch], 754974720 ) /*180.f in Q22*/ ) { st_ivas->hIsmMetaData[ch]->azimuth_fx = L_sub( st_ivas->hParamIsmDec->azimuth_values_fx[ch], 1509949440 ) /*360.0F in Q22*/; + move32(); } ELSE { st_ivas->hIsmMetaData[ch]->azimuth_fx = st_ivas->hParamIsmDec->azimuth_values_fx[ch]; + move32(); } st_ivas->hIsmMetaData[ch]->elevation_fx = st_ivas->hParamIsmDec->elevation_values_fx[ch]; + move32(); } } - *nSamplesAvailableNext = ( hSpatParamRendCom->num_slots - hSpatParamRendCom->slots_rendered ) * slot_size; + *nSamplesAvailableNext = imult1616( sub( hSpatParamRendCom->num_slots, hSpatParamRendCom->slots_rendered ), (Word16) slot_size ); + move16(); return; } @@ -3031,11 +3133,11 @@ void ivas_param_ism_params_to_masa_param_mapping_fx( hParamIsmDec = st_ivas->hParamIsmDec; hSpatParamRendCom = st_ivas->hSpatParamRendCom; nBins = hSpatParamRendCom->num_freq_bands; - move16(); ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; move32(); + test(); IF( !( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) || EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) ) { ivas_param_ism_dec_dequant_DOA_fx( hParamIsmDec, st_ivas->nchan_ism ); @@ -3058,24 +3160,24 @@ void ivas_param_ism_params_to_masa_param_mapping_fx( hSpatParamRendCom->numSimultaneousDirections = 1; move16(); - azimuth[0] = (Word16) L_shr( ( hParamIsmDec->azimuth_values_fx[0] + ( 1 << 21 ) ), 22 ); - elevation[0] = (Word16) L_shr( ( hParamIsmDec->elevation_values_fx[0] + ( 1 << 21 ) ), 22 ); + azimuth[0] = (Word16) L_shr( L_add( hParamIsmDec->azimuth_values_fx[0], ONE_IN_Q21 ), 22 ); + move16(); + elevation[0] = (Word16) L_shr( L_add( hParamIsmDec->elevation_values_fx[0], ONE_IN_Q21 ), 22 ); + move16(); FOR( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) { FOR( bin_idx = 0; bin_idx < nBins; bin_idx++ ) { hSpatParamRendCom->azimuth[sf_idx][bin_idx] = azimuth[0]; + move16(); hSpatParamRendCom->elevation[sf_idx][bin_idx] = elevation[0]; - - hSpatParamRendCom->energy_ratio1_fx[sf_idx][bin_idx] = energy_ratio_fx; - - hSpatParamRendCom->spreadCoherence_fx[sf_idx][bin_idx] = 0; - hSpatParamRendCom->surroundingCoherence_fx[sf_idx][bin_idx] = 0; move16(); + hSpatParamRendCom->energy_ratio1_fx[sf_idx][bin_idx] = energy_ratio_fx; move16(); - move32(); + hSpatParamRendCom->spreadCoherence_fx[sf_idx][bin_idx] = 0; move16(); + hSpatParamRendCom->surroundingCoherence_fx[sf_idx][bin_idx] = 0; move16(); } } @@ -3087,19 +3189,21 @@ void ivas_param_ism_params_to_masa_param_mapping_fx( FOR( band_idx = 0; band_idx < hParamIsmDec->hParamIsm->nbands; band_idx++ ) { brange[0] = hParamIsmDec->hParamIsm->band_grouping[band_idx]; - brange[1] = hParamIsmDec->hParamIsm->band_grouping[band_idx + 1]; - move16(); + brange[1] = hParamIsmDec->hParamIsm->band_grouping[band_idx + 1]; move16(); + azimuth[0] = (Word16) L_shr( hParamIsmDec->azimuth_values_fx[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][0]] + ( 1 << 21 ), 22 ); + move16(); elevation[0] = (Word16) L_shr( hParamIsmDec->elevation_values_fx[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][0]] + ( 1 << 21 ), 22 ); - + move16(); power_ratio_fx[0] = hParamIsmDec->power_ratios_fx[band_idx][0][0]; move16(); azimuth[1] = (Word16) L_shr( hParamIsmDec->azimuth_values_fx[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][1]] + ( 1 << 21 ), 22 ); + move16(); elevation[1] = (Word16) L_shr( hParamIsmDec->elevation_values_fx[hParamIsmDec->hParamIsm->obj_indices[band_idx][0][1]] + ( 1 << 21 ), 22 ); + move16(); power_ratio_fx[1] = hParamIsmDec->power_ratios_fx[band_idx][0][1]; - move16(); FOR( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) @@ -3107,16 +3211,16 @@ void ivas_param_ism_params_to_masa_param_mapping_fx( FOR( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) { hSpatParamRendCom->azimuth[sf_idx][bin_idx] = azimuth[0]; + move16(); hSpatParamRendCom->elevation[sf_idx][bin_idx] = elevation[0]; + move16(); hSpatParamRendCom->energy_ratio1_fx[sf_idx][bin_idx] = L_shl( power_ratio_fx[0], Q15 ); + move32(); hSpatParamRendCom->azimuth2[sf_idx][bin_idx] = azimuth[1]; - hSpatParamRendCom->elevation2[sf_idx][bin_idx] = elevation[1]; - hSpatParamRendCom->energy_ratio2_fx[sf_idx][bin_idx] = L_shl( power_ratio_fx[1], Q15 ); - move16(); - move16(); move16(); + hSpatParamRendCom->elevation2[sf_idx][bin_idx] = elevation[1]; move16(); - move32(); + hSpatParamRendCom->energy_ratio2_fx[sf_idx][bin_idx] = L_shl( power_ratio_fx[1], Q15 ); move32(); } } @@ -3127,10 +3231,10 @@ void ivas_param_ism_params_to_masa_param_mapping_fx( FOR( bin_idx = 0; bin_idx < nBins; bin_idx++ ) { hSpatParamRendCom->spreadCoherence_fx[sf_idx][bin_idx] = 0; - hSpatParamRendCom->spreadCoherence2_fx[sf_idx][bin_idx] = 0; - hSpatParamRendCom->surroundingCoherence_fx[sf_idx][bin_idx] = 0; move16(); + hSpatParamRendCom->spreadCoherence2_fx[sf_idx][bin_idx] = 0; move16(); + hSpatParamRendCom->surroundingCoherence_fx[sf_idx][bin_idx] = 0; move16(); } } @@ -3141,21 +3245,23 @@ void ivas_param_ism_params_to_masa_param_mapping_fx( hSpatParamRendCom->numSimultaneousDirections = 1; move16(); azimuth[0] = (Word16) L_shr( ( hParamIsmDec->azimuth_values_fx[0] + ( 1 << 21 ) ), 22 ); + move16(); elevation[0] = (Word16) L_shr( hParamIsmDec->elevation_values_fx[0] + ( 1 << 21 ), 22 ); + move16(); FOR( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) { FOR( bin_idx = 0; bin_idx < nBins; bin_idx++ ) { hSpatParamRendCom->azimuth[sf_idx][bin_idx] = azimuth[0]; - hSpatParamRendCom->elevation[sf_idx][bin_idx] = elevation[0]; - hSpatParamRendCom->energy_ratio1_fx[sf_idx][bin_idx] = ONE_IN_Q30; /* 1.0f in Q30 */ - hSpatParamRendCom->spreadCoherence_fx[sf_idx][bin_idx] = 0; - hSpatParamRendCom->surroundingCoherence_fx[sf_idx][bin_idx] = 0; move16(); + hSpatParamRendCom->elevation[sf_idx][bin_idx] = elevation[0]; move16(); + hSpatParamRendCom->energy_ratio1_fx[sf_idx][bin_idx] = ONE_IN_Q30; /* 1.0f in Q30 */ move32(); + hSpatParamRendCom->spreadCoherence_fx[sf_idx][bin_idx] = 0; move16(); + hSpatParamRendCom->surroundingCoherence_fx[sf_idx][bin_idx] = 0; move16(); } } diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index f766a5b95..11fd356f4 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -34,6 +34,7 @@ #include "options.h" #include "ivas_cnst.h" #include "prot.h" +#include "prot_fx1.h" #include "prot_fx2.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" @@ -127,9 +128,12 @@ ivas_error ivas_ism_renderer_open_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM renderer\n" ) ); } + test(); + test(); + test(); IF( st_ivas->hIntSetup.is_loudspeaker_setup && st_ivas->hIntSetup.ls_azimuth_fx != NULL && st_ivas->hIntSetup.ls_elevation_fx != NULL && st_ivas->hEFAPdata == NULL ) { - IF( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth_fx, st_ivas->hIntSetup.ls_elevation_fx, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth_fx, st_ivas->hIntSetup.ls_elevation_fx, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) { return error; } @@ -143,14 +147,18 @@ ivas_error ivas_ism_renderer_open_fx( IF( st_ivas->hDecoderConfig->Opt_tsm ) { + Word32 res_dec, res_frac; init_interpolator_length = NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_CLDFB_TIMESLOTS * CLDFB_SLOT_NS ); move16(); - interpolator_length = (UWord16) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + iDiv_and_mod_32( st_ivas->hDecoderConfig->output_Fs, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + interpolator_length = (UWord16) ( res_dec ); move16(); } ELSE { - init_interpolator_length = (UWord16) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + Word32 res_dec, res_frac; + iDiv_and_mod_32( st_ivas->hDecoderConfig->output_Fs, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + init_interpolator_length = (UWord16) ( res_dec ); move16(); interpolator_length = init_interpolator_length; move16(); @@ -163,11 +171,13 @@ ivas_error ivas_ism_renderer_open_fx( st_ivas->hIsmRendererData->interpolator_len = init_interpolator_length; move16(); - FOR( i = 0; i < interpolator_length - 1; i++ ) + FOR( i = 0; i < sub( interpolator_length, 1 ); i++ ) { st_ivas->hIsmRendererData->interpolator_fx[i] = div_s( i, sub( interpolator_length, 1 ) ); + move16(); } - st_ivas->hIsmRendererData->interpolator_fx[interpolator_length - 1] = 32767; + st_ivas->hIsmRendererData->interpolator_fx[sub( interpolator_length, 1 )] = 32767; + move16(); return IVAS_ERR_OK; } @@ -205,6 +215,7 @@ void ivas_ism_renderer_close( ISM_RENDERER_HANDLE *hIsmRendererData /* i/o: ISM renderer handle */ ) { + test(); IF( hIsmRendererData == NULL || *hIsmRendererData == NULL ) { return; @@ -378,7 +389,7 @@ void ivas_ism_render_sf_fx( num_objects = st_ivas->nchan_transport; move16(); - IF( st_ivas->ivas_format == SBA_ISM_FORMAT ) + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { num_objects = st_ivas->nchan_ism; move16(); @@ -397,7 +408,6 @@ void ivas_ism_render_sf_fx( FOR( i = 0; i < num_objects; i++ ) { p_tc_fx[i] = &st_ivas->hTcBuffer->tc_fx[i][tc_offset]; - move16(); } } ELSE @@ -406,7 +416,6 @@ void ivas_ism_render_sf_fx( { mvl2l( &output_fx[i][tc_offset], tc_local_fx[i], n_samples_to_render ); p_tc_fx[i] = tc_local_fx[i]; - move16(); } } @@ -415,7 +424,8 @@ void ivas_ism_render_sf_fx( set32_fx( output_fx[i], 0, n_samples_to_render ); } - IF( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) + test(); + IF( st_ivas->hCombinedOrientationData && EQ_16( st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx], 1 ) ) { ivas_jbm_dec_get_adapted_linear_interpolator_fx( n_samples_to_render, n_samples_to_render, st_ivas->hIsmRendererData->interpolator_fx ); interp_offset = 0; @@ -425,11 +435,12 @@ void ivas_ism_render_sf_fx( FOR( i = 0; i < num_objects; i++ ) { /* Combined rotation: rotate the object positions depending the head and external orientations */ - IF( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) + test(); + IF( st_ivas->hCombinedOrientationData != NULL && EQ_16( st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx], 1 ) ) { rotateAziEle_fx( (Word16) L_shr( st_ivas->hIsmMetaData[i]->azimuth_fx, 22 ), (Word16) L_shr( st_ivas->hIsmMetaData[i]->elevation_fx, 22 ), &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat_fx[0], st_ivas->hIntSetup.is_planar_setup ); - move32(); - move32(); + move16(); + move16(); IF( st_ivas->hEFAPdata != NULL ) { @@ -441,18 +452,27 @@ void ivas_ism_render_sf_fx( move16(); FOR( ( j = 0, j2 = 0 ); j < nchan_out_woLFE; ( j++, j2++ ) ) { - IF( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[lfe_index] == j ) ) + test(); + IF( ( st_ivas->hIntSetup.num_lfe > 0 ) && EQ_16( st_ivas->hIntSetup.index_lfe[lfe_index], j ) ) { - ( lfe_index < ( st_ivas->hIntSetup.num_lfe - 1 ) ) ? ( lfe_index++, j2++ ) : j2++; - move16(); - move16(); + IF( LE_16( lfe_index, sub( st_ivas->hIntSetup.num_lfe, 1 ) ) ) + { + lfe_index = add( lfe_index, 1 ); + j2 = add( j2, 1 ); + } + ELSE + { + j2 = add( j2, 1 ); + } } gain_fx = st_ivas->hIsmRendererData->gains_fx[i][j]; move32(); prev_gain_fx = st_ivas->hIsmRendererData->prev_gains_fx[i][j]; move32(); - IF( GT_32( L_abs( gain_fx ), 0 ) || GT_32( L_abs( prev_gain_fx ), 0 ) ) + + test(); + IF( ( L_abs( gain_fx ) > 0 ) || ( L_abs( prev_gain_fx ) > 0 ) ) { g1_fx = &st_ivas->hIsmRendererData->interpolator_fx[interp_offset]; tc_fx = p_tc_fx[i]; @@ -460,10 +480,12 @@ void ivas_ism_render_sf_fx( { g2_fx = sub( 32767, *g1_fx ); output_fx[j2][k] = L_add( output_fx[j2][k], L_shl( Mpy_32_32( L_add( Mpy_32_16_1( gain_fx, *( g1_fx++ ) ), Mpy_32_16_1( prev_gain_fx, g2_fx ) ), *( tc_fx++ ) ), 1 ) ); + move16(); } } /* update here only in case of head rotation */ + test(); IF( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 ) { st_ivas->hIsmRendererData->prev_gains_fx[i][j] = gain_fx; @@ -593,7 +615,6 @@ void ivas_ism_get_stereo_gains( } #endif - /*-------------------------------------------------------------------------* * ivas_masa_oism_separate_object_renderer_open() * @@ -675,9 +696,11 @@ ivas_error ivas_omasa_separate_object_renderer_open( { set32_fx( st_ivas->hIsmRendererData->prev_gains_fx[i], 0, MAX_OUTPUT_CHANNELS ); } - - init_interpolator_length = (Word16) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ); - move32(); + Word32 res_dec1, res_frac1; + Word32 res_dec2, res_frac2; + iDiv_and_mod_32( st_ivas->hDecoderConfig->output_Fs, FRAMES_PER_SEC, &res_dec1, &res_frac1, 0 ); + iDiv_and_mod_32( res_dec1, MAX_PARAM_SPATIAL_SUBFRAMES, &res_dec2, &res_frac2, 0 ); + init_interpolator_length = extract_l( res_dec2 ); interpolator_length = init_interpolator_length; move16(); @@ -685,18 +708,21 @@ ivas_error ivas_omasa_separate_object_renderer_open( #if 1 /*TODO: To be removed later: Stores length of interpolator_fx*/ st_ivas->hIsmRendererData->interpolator_len = init_interpolator_length; + move16(); #endif FOR( i = 0; i < interpolator_length; i++ ) { st_ivas->hIsmRendererData->interpolator_fx[i] = div_s( i, interpolator_length ); + move16(); } st_ivas->hIsmRendererData->interpolator_len = interpolator_length; move16(); - st_ivas->hMasaIsmData->delayBuffer_size = (Word16) ( ( st_ivas->hDecoderConfig->output_Fs / 50 ) / MAX_PARAM_SPATIAL_SUBFRAMES ); + st_ivas->hMasaIsmData->delayBuffer_size = extract_l( ( st_ivas->hDecoderConfig->output_Fs / 50 ) / MAX_PARAM_SPATIAL_SUBFRAMES ); move16(); - IF( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) { st_ivas->hMasaIsmData->delayBuffer_nchan = 1; move16(); @@ -1000,22 +1026,25 @@ void ivas_omasa_separate_object_render_jbm_fx( lfe_index = hDirACRend->hOutSetup.index_lfe[0]; move16(); - IF( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) { single_separated = 1; + move16(); num_objects = 1; move16(); } ELSE { single_separated = 0; + move16(); num_objects = st_ivas->nchan_ism; move16(); } offsetSamples = i_mult( slots_rendered, hSpatParamRendCom->slot_size ); - FOR( j = 0; j < nchan_out_woLFE + num_lfe; j++ ) + FOR( j = 0; j < add( nchan_out_woLFE, num_lfe ); j++ ) { output_fx_local[j] = output_fx[j]; } @@ -1035,8 +1064,7 @@ void ivas_omasa_separate_object_render_jbm_fx( } } - slots_to_render = nSamplesRendered / hSpatParamRendCom->slot_size; - move16(); + slots_to_render = idiv1616( nSamplesRendered, hSpatParamRendCom->slot_size ); first_sf = subframes_rendered; move16(); last_sf = first_sf; @@ -1059,6 +1087,7 @@ void ivas_omasa_separate_object_render_jbm_fx( delay_signal_fx( input_fx[obj], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer_fx[obj], st_ivas->hMasaIsmData->delayBuffer_size ); } offsetSamples = 0; + move16(); FOR( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { @@ -1091,7 +1120,7 @@ void ivas_omasa_separate_object_render_jbm_fx( move16(); } - IF( st_ivas->hOutSetup.is_planar_setup ) + if ( st_ivas->hOutSetup.is_planar_setup ) { /* If no elevation support in output format, then rendering should be done with zero elevation */ elevation = 0; @@ -1109,7 +1138,7 @@ void ivas_omasa_separate_object_render_jbm_fx( FOR( j = 0; j < nchan_out_woLFE; j++ ) { - IF( GT_16( hDirACRend->hOutSetup.num_lfe, 0 ) ) + IF( hDirACRend->hOutSetup.num_lfe > 0 ) { j2 = add( j, (Word16) GE_16( j, lfe_index ) ); } @@ -1119,15 +1148,16 @@ void ivas_omasa_separate_object_render_jbm_fx( move16(); } - IF( GT_32( L_abs( gains_fx[j] ), 0 ) || GT_32( L_abs( hRendererData->prev_gains_fx[obj][j] ), 0 ) ) + test(); + IF( ( L_abs( gains_fx[j] ) > 0 ) || ( L_abs( hRendererData->prev_gains_fx[obj][j] ) > 0 ) ) { FOR( k = 0; k < n_samples_sf; k++ ) { g1_fx = hRendererData->interpolator_fx[k]; move16(); g2_fx = sub( 32767, g1_fx ); - move16(); - output_fx_local[j2][k + offsetSamples] = L_add( output_fx_local[j2][k + offsetSamples], L_add( L_shl( Mpy_32_32( Mpy_32_16_1( input_fx[obj][k + offsetSamples], g1_fx ), gains_fx[j] ), 2 ), L_shl( Mpy_32_32( Mpy_32_16_1( input_fx[obj][k + offsetSamples], g2_fx ), hRendererData->prev_gains_fx[obj][j] ), 2 ) ) ); + + output_fx_local[j2][k + offsetSamples] = L_add( output_fx_local[j2][add( k, offsetSamples )], L_add( L_shl( Mpy_32_32( Mpy_32_16_1( input_fx[obj][k + offsetSamples], g1_fx ), gains_fx[j] ), 2 ), L_shl( Mpy_32_32( Mpy_32_16_1( input_fx[obj][add( k, offsetSamples )], g2_fx ), hRendererData->prev_gains_fx[obj][j] ), 2 ) ) ); } } hRendererData->prev_gains_fx[obj][j] = gains_fx[j]; diff --git a/lib_dec/ivas_mc_param_dec_fx.c b/lib_dec/ivas_mc_param_dec_fx.c index f3faac41b..56635af0d 100644 --- a/lib_dec/ivas_mc_param_dec_fx.c +++ b/lib_dec/ivas_mc_param_dec_fx.c @@ -8,6 +8,7 @@ Word16 param_mc_get_num_cldfb_syntheses_ivas_fx( Word16 num_cldfb_syntheses; num_cldfb_syntheses = 0; + move16(); /* sanity check*/ IF( st_ivas->hParamMC == NULL ) @@ -15,9 +16,11 @@ Word16 param_mc_get_num_cldfb_syntheses_ivas_fx( assert( 0 && "ParamMC handle does not exist!\n" ); } + test(); IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { num_cldfb_syntheses = 2; + move16(); } ELSE IF( EQ_16( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) ) { diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index b8c544a57..d83e28576 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -314,7 +314,9 @@ ivas_error ivas_mct_dec_fx( Word32 *x_fx[CPE_CHANNELS][NB_DIV]; Word16 x_e[MAX_CICP_CHANNELS][NB_DIV]; - Word16 x_len[CPE_CHANNELS][NB_DIV] = { 0 }; + Word16 x_len[CPE_CHANNELS][NB_DIV]; + set16_fx( x_len[0], 0, NB_DIV ); + set16_fx( x_len[1], 0, NB_DIV ); Decoder_State **sts; Word16 synth_fx[CPE_CHANNELS][L_FRAME_PLUS]; int32_t ivas_total_brate; @@ -517,7 +519,11 @@ ivas_error ivas_mct_dec_fx( } ELSE IF( EQ_16( st_ivas->renderer_type, RENDERER_MC_PARAMMC ) && ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) { - Word16 x_all_e[MAX_CICP_CHANNELS][NB_DIV] = { 0 }; + Word16 x_all_e[MAX_CICP_CHANNELS][NB_DIV]; + FOR( i = 0; i < MAX_CICP_CHANNELS; i++ ) + { + set16_fx( x_all_e[i], 0, NB_DIV ); + } Word32 *x_all_fx[MAX_CICP_CHANNELS][NB_DIV]; FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) { diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index 61c5be3b1..72c1985d8 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -64,36 +64,57 @@ void mdct_read_IGF_bits_fx( Decoder_State *st0 /* i : pointer to handle where bitstream is read */ ) { - int16_t k, start; + Word16 k, start, temp; start = st0->next_bit_pos; + move16(); - IF( st->core == TCX_20_CORE ) + IF( EQ_16( st->core, TCX_20_CORE ) ) { + IF( st->last_core == ACELP_CORE ) + { + temp = IGF_GRID_LB_TRAN; + move16(); + } + ELSE + { + temp = IGF_GRID_LB_NORM; + move16(); + } /* read IGF payload */ - IGFDecReadLevel( st->hIGFDec, st0, ( st->last_core == ACELP_CORE ) ? IGF_GRID_LB_TRAN : IGF_GRID_LB_NORM, 1 ); + IGFDecReadLevel( st->hIGFDec, st0, temp, 1 ); - IGFDecReadData_ivas_fx( st->hIGFDec, st0, ( st->last_core == ACELP_CORE ) ? IGF_GRID_LB_TRAN : IGF_GRID_LB_NORM, 1 ); + IGFDecReadData_ivas_fx( st->hIGFDec, st0, temp, 1 ); } - IF( st->core == TCX_10_CORE ) + IF( EQ_16( st->core, TCX_10_CORE ) ) { FOR( k = 0; k < 2; k++ ) { - IGFDecReadLevel( st->hIGFDec, st0, IGF_GRID_LB_SHORT, k == 0 ? 1 : 0 ); + IF( k == 0 ) + { + temp = 1; + move16(); + } + ELSE + { + temp = 0; + move16(); + } + IGFDecReadLevel( st->hIGFDec, st0, IGF_GRID_LB_SHORT, temp ); - IGFDecReadData_ivas_fx( st->hIGFDec, st0, IGF_GRID_LB_SHORT, k == 0 ? 1 : 0 ); + IGFDecReadData_ivas_fx( st->hIGFDec, st0, IGF_GRID_LB_SHORT, temp ); IGFDecStoreTCX10SubFrameData( st->hIGFDec, k ); } } - st->side_bits_frame_channel += ( st0->next_bit_pos - start ); + st->side_bits_frame_channel = add( st->side_bits_frame_channel, sub( st0->next_bit_pos, start ) ); + move16(); return; } -#endif -#ifndef IVAS_FLOAT_FIXED +#else // IVAS_FLOAT_FIXED void mdct_read_IGF_bits( Decoder_State *st, /* i/o: Decoder state handle */ Decoder_State *st0 /* i : pointer to handle where bitstream is read */ @@ -157,10 +178,13 @@ static void dec_prm_tcx_sidebits_fx( hm_cfg.indexBuffer = NULL; start_bit_pos = st0->next_bit_pos; + move16(); /* Init LTP data */ st->hTcxDec->tcx_hm_LtpPitchLag = -1; + move16(); st->hTcxLtpDec->tcxltp_gain = 0; + move16(); /*--------------------------------------------------------------------------------* * Header @@ -170,57 +194,85 @@ static void dec_prm_tcx_sidebits_fx( getTCXMode_ivas_fx( st, st0, MCT_flag ); st->flagGuidedAcelp = 0; + move16(); - IF( st->dec_glr ) + if ( st->dec_glr ) { st->dec_glr_idx = -1; + move16(); } /* last_core for core switching and error concealment */ - IF( ( st->last_core == ACELP_CORE && st->last_total_brate == FRAME_NO_DATA ) || st->prev_bfi ) + test(); + test(); + IF( ( ( st->last_core == ACELP_CORE ) && ( st->last_total_brate == FRAME_NO_DATA ) ) || st->prev_bfi ) { /* needed for cases where first TCX frame after a certain transition (e.g. inactive SID/zero frame -> active or stereo switching) is lost */ st->last_core_from_bs = get_next_indice( st0, 1 ); + move16(); /* ACELP -> TCX_10 transitions are forbidden */ - IF( st->core == TCX_10_CORE && st->last_core == ACELP_CORE ) + test(); + if ( EQ_16( st->core, TCX_10_CORE ) && ( st->last_core == ACELP_CORE ) ) { st->last_core = TCX_20_CORE; + move16(); } } ELSE { st->last_core = get_next_indice( st0, 1 ); + move16(); st->last_core_from_bs = st->last_core; + move16(); } getTCXWindowing_ivas_fx( st->core, st->last_core, st->element_mode, st->hTcxCfg, st0 ); st->hTcxDec->kernel_type[0] = st->hTcxDec->kernel_type[1] = MDCT_IV; - st->hTcxDec->kernel_type[0] = get_next_indice( st0, st->last_core_from_bs != ACELP_CORE ? 2 : 1 ); - IF( st->core == TCX_10_CORE ) + move16(); + move16(); + IF( st->last_core_from_bs != ACELP_CORE ) { - st->hTcxDec->kernel_type[1] = 2 * ( st->hTcxDec->kernel_type[0] & 1 ) + get_next_indice( st0, 1 ); + st->hTcxDec->kernel_type[0] = get_next_indice( st0, 2 ); } - IF( st->core == TCX_20_CORE ) + ELSE + { + st->hTcxDec->kernel_type[0] = get_next_indice( st0, 1 ); + } + move16(); + IF( EQ_16( st->core, TCX_10_CORE ) ) + { + st->hTcxDec->kernel_type[1] = add( shl( s_and( st->hTcxDec->kernel_type[0], 1 ), 1 ), get_next_indice( st0, 1 ) ); + move16(); + } + IF( EQ_16( st->core, TCX_20_CORE ) ) { st->transform_type[0] = st->transform_type[1] = TCX_20; + move16(); + move16(); } ELSE { - IF( st->hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) + IF( EQ_16( st->hTcxCfg->tcx_curr_overlap_mode, FULL_OVERLAP ) ) { st->transform_type[0] = TCX_5; + move16(); st->transform_type[1] = TCX_10; + move16(); } - ELSE IF( st->hTcxCfg->tcx_last_overlap_mode == FULL_OVERLAP ) + ELSE IF( EQ_16( st->hTcxCfg->tcx_last_overlap_mode, FULL_OVERLAP ) ) { st->transform_type[0] = TCX_10; + move16(); st->transform_type[1] = TCX_5; + move16(); } ELSE { st->transform_type[0] = st->transform_type[1] = TCX_5; + move16(); + move16(); } } @@ -228,9 +280,19 @@ static void dec_prm_tcx_sidebits_fx( * TCX20/TCX10 parameters *--------------------------------------------------------------------------------*/ - getTCXparam_fx( st, st0, hm_cfg, param, 0, 0, ( ( ch > 0 ) && ( tnsSize ) && ( tnsSize[0] + tnsSize[1] > 0 ) ? tnsSize : NULL ), p_param, nTnsBitsTCX10, 0 ); + test(); + test(); + IF( ( ch > 0 ) && tnsSize && ( add( tnsSize[0], tnsSize[1] ) > 0 ) ) + { + getTCXparam_fx( st, st0, hm_cfg, param, 0, 0, tnsSize, p_param, nTnsBitsTCX10, 0 ); + } + ELSE + { + getTCXparam_fx( st, st0, hm_cfg, param, 0, 0, NULL, p_param, nTnsBitsTCX10, 0 ); + } - st->side_bits_frame_channel = st0->next_bit_pos - start_bit_pos; + st->side_bits_frame_channel = sub( st0->next_bit_pos, start_bit_pos ); + move16(); return; } @@ -373,10 +435,18 @@ static void dec_prm_tcx_spec_fx( nbits_tcx = 0; move16(); - nSubframes = ( EQ_16( st->core, TCX_10_CORE ) ) ? NB_DIV : 1; + IF( EQ_16( st->core, TCX_10_CORE ) ) + { + nSubframes = NB_DIV; + } + ELSE + { + nSubframes = 1; + } move16(); /*calculate TCX10 target bits before to assure minimum amount is distributed between subframes*/ + test(); IF( EQ_16( st->core, TCX_10_CORE ) && EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) { Word16 nTnsBitsTCX10Tmp[NB_DIV]; @@ -386,7 +456,7 @@ static void dec_prm_tcx_spec_fx( move16(); /*compute target bits */ - tmp = i_mult2( nSubframes, add( NBITS_TCX_GAIN, i_mult2( NOISE_FILL_RANGES, NBITS_NOISE_FILL_LEVEL ) ) ); + tmp = i_mult2( nSubframes, NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL ); nbits_tcx = add( add( add( st->bits_frame_channel, nTnsBitsTCX10[0] ), nTnsBitsTCX10[1] ), tmp ); ivas_mdct_tcx10_bit_distribution_fx( target_bitsTCX10, nbits_tcx, nTnsBitsTCX10Tmp ); } @@ -397,13 +467,14 @@ static void dec_prm_tcx_spec_fx( getTCXparam_fx( st, st, hm_cfg, param, 0, 0, NULL, p_param, target_bitsTCX10, 1 ); - nf_bits = i_mult2( nSubframes, ( add( NBITS_TCX_GAIN, i_mult2( NOISE_FILL_RANGES, NBITS_NOISE_FILL_LEVEL ) ) ) ); + nf_bits = i_mult2( nSubframes, NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL ); IF( LT_16( add( sub( *total_nbbits, bitsRead[0] ), nf_bits ), sub( st->next_bit_pos, start_bit_pos ) ) ) { st->BER_detect = 1; move16(); st->next_bit_pos = add( start_bit_pos, sub( *total_nbbits, bitsRead[0] ) ); + move16(); } bitsRead[0] = sub( st->next_bit_pos, start_bit_pos ); @@ -503,9 +574,10 @@ void ivas_mdct_dec_side_bits_frame_channel_fx( sts = hCPE->hCoreCoder; bfi = sts[0]->bfi; + move16(); - set_s( total_nbbits, 0, MCT_MAX_CHANNELS ); - set_s( bitsRead, 0, MCT_MAX_CHANNELS ); + set16_fx( total_nbbits, 0, MCT_MAX_CHANNELS ); + set16_fx( bitsRead, 0, MCT_MAX_CHANNELS ); FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { @@ -515,6 +587,7 @@ void ivas_mdct_dec_side_bits_frame_channel_fx( stereo_tcx_init_dec_fx( sts[ch], 1, hCPE->last_element_mode ); } sts[ch]->enablePlcWaveadjust = 0; + move16(); } IF( !bfi ) @@ -522,9 +595,10 @@ void ivas_mdct_dec_side_bits_frame_channel_fx( FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { /* disguard reading second channel of odd transport channels, mct_chan_mode is set by default*/ + test(); IF( odd_channel_cpe && ch == 1 ) { - continue; + CONTINUE; } st = sts[ch]; @@ -539,6 +613,7 @@ void ivas_mdct_dec_side_bits_frame_channel_fx( { st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; } + move16(); } } @@ -546,21 +621,33 @@ void ivas_mdct_dec_side_bits_frame_channel_fx( FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; - IF( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + IF( EQ_32( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { sts[ch]->coder_type = INACTIVE; + move16(); sts[ch]->side_bits_frame_channel = 0; - continue; + move16(); + CONTINUE; } tmp = ch; - IF( ch == 1 && param_lpc[0][0] == 2 ) + move16(); + test(); + if ( EQ_16( ch, 1 ) && EQ_16( param_lpc[0][0], 2 ) ) { tmp = 3; + move16(); } - dec_prm_tcx_sidebits_fx( param[ch], st, ( ( st->element_mode == IVAS_CPE_MDCT && !MCT_flag ) ? sts[0]->hTcxDec->tnsActive : NULL ), p_param[ch], nTnsBitsTCX10[ch], st0, MCT_flag, tmp ); - + test(); + IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && !MCT_flag ) + { + dec_prm_tcx_sidebits_fx( param[ch], st, sts[0]->hTcxDec->tnsActive, p_param[ch], nTnsBitsTCX10[ch], st0, MCT_flag, tmp ); + } + ELSE + { + dec_prm_tcx_sidebits_fx( param[ch], st, NULL, p_param[ch], nTnsBitsTCX10[ch], st0, MCT_flag, tmp ); + } assert( st->BER_detect != 1 ); } @@ -569,102 +656,159 @@ void ivas_mdct_dec_side_bits_frame_channel_fx( *--------------------------------------------------------------------------------*/ sns_low_br_mode = 0; + move16(); skipped_first_channel = 0; - IF( !MCT_flag && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) + move16(); + + test(); + test(); + test(); + IF( !MCT_flag && EQ_32( sts[0]->sr_core, 25600 ) && ( EQ_32( hCPE->element_brate, IVAS_48k ) || EQ_32( hCPE->element_brate, IVAS_64k ) ) ) { param_lpc[0][0] = SNS_STEREO_MODE_LR; + move16(); param_lpc[0][1] = SNS_STEREO_MODE_LR; + move16(); param_lpc[0][2] = 0; + move16(); param_lpc[0][3] = 0; - IF( sts[0]->core == sts[1]->core ) + move16(); + IF( EQ_16( sts[0]->core, sts[1]->core ) ) { Word16 nSubframes; - nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; + IF( EQ_16( sts[0]->core, TCX_20_CORE ) ) + { + nSubframes = 1; + } + ELSE + { + nSubframes = NB_DIV; + } + move16(); - for ( Word16 n = 0; n < nSubframes; ++n ) + FOR( Word16 n = 0; n < nSubframes; ++n ) { param_lpc[0][n] = get_next_indice( st0, 1 ); + move16(); } /* zero side flags only get transmitted if needed */ - for ( Word16 n = 0; n < nSubframes; ++n ) + FOR( Word16 n = 0; n < nSubframes; ++n ) { - if ( param_lpc[0][n] == SNS_STEREO_MODE_MS ) + IF( EQ_16( param_lpc[0][n], SNS_STEREO_MODE_MS ) ) { - param_lpc[0][n + SNS_STEREO_MODE_OFFSET_INDICES / 2] = get_next_indice( st0, 1 ); + param_lpc[0][n + ( SNS_STEREO_MODE_OFFSET_INDICES / 2 )] = get_next_indice( st0, 1 ); + move16(); } } } - for ( ch = 0; ch < CPE_CHANNELS; ++ch ) + FOR( ch = 0; ch < CPE_CHANNELS; ++ch ) { Word16 nSubframes; Word16 idxIndices; st = sts[ch]; - nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; + IF( EQ_16( st->core, TCX_20_CORE ) ) + { + nSubframes = 1; + } + ELSE + { + nSubframes = NB_DIV; + } + move16(); idxIndices = 0; + move16(); - for ( Word16 n = 0; n < nSubframes; ++n ) + FOR( Word16 n = 0; n < nSubframes; ++n ) { - const Word16 is_side = ch == 1 && param_lpc[0][n] == SNS_STEREO_MODE_MS; - const Word16 *bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_bits : ivas_sns_cdbks_tcx10_bits; - Word16 nStages = ( ( nSubframes == 1 ) ? SNS_MSVQ_NSTAGES_TCX20 : SNS_MSVQ_NSTAGES_TCX10 ); - - if ( is_side ) + const Word16 is_side = (Word16) L_and( EQ_16( ch, 1 ), EQ_16( param_lpc[0][n], SNS_STEREO_MODE_MS ) ); + const Word16 *bits; + Word16 nStages; + IF( EQ_16( nSubframes, 1 ) ) + { + bits = ivas_sns_cdbks_tcx20_bits; + nStages = SNS_MSVQ_NSTAGES_TCX20; + } + ELSE + { + bits = ivas_sns_cdbks_tcx10_bits; + nStages = SNS_MSVQ_NSTAGES_TCX10; + } + move16(); + IF( is_side ) { /* check for zero-side flag */ - if ( param_lpc[0][n + SNS_STEREO_MODE_OFFSET_INDICES / 2] ) + IF( param_lpc[0][n + ( SNS_STEREO_MODE_OFFSET_INDICES / 2 )] ) { - continue; + CONTINUE; } nStages = SNS_MSVQ_NSTAGES_SIDE; - bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_side_tcx20_bits : ivas_sns_cdbks_side_tcx10_bits; + move16(); + IF( EQ_16( nSubframes, 1 ) ) + { + bits = ivas_sns_cdbks_side_tcx20_bits; + } + ELSE + { + bits = ivas_sns_cdbks_side_tcx10_bits; + } } - for ( Word16 j = 0; j < nStages; ++j ) + FOR( Word16 j = 0; j < nStages; ++j ) { /* plus one in index for stereo mode storage! */ - param_lpc[ch][j + idxIndices + SNS_STEREO_MODE_OFFSET_INDICES] = get_next_indice_fx( st0, bits[j] ); + param_lpc[ch][add( add( j, idxIndices ), SNS_STEREO_MODE_OFFSET_INDICES )] = get_next_indice_fx( st0, bits[j] ); + move16(); } - idxIndices += nStages; + idxIndices = add( idxIndices, nStages ); } } } - else + ELSE { - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; - if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + IF( EQ_32( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { skipped_first_channel = 1; - continue; + move16(); + CONTINUE; } start_bit_pos_sns = st0->next_bit_pos; - if ( ch == 0 || skipped_first_channel ) + test(); + IF( ( ch == 0 ) || skipped_first_channel ) { /* read SNS stereo mode */ - param_lpc[0][0] = get_next_indice( st0, 1 ) << 1; + param_lpc[0][0] = shl( (Word16) get_next_indice( st0, 1 ), 1 ); /* read low br mode flag (if it is possible to be non-zero) */ - if ( sts[0]->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) ) + test(); + test(); + IF( EQ_32( sts[0]->element_brate, IVAS_48k ) && !( EQ_16( sts[0]->core, TCX_20 ) && EQ_16( sts[1]->core, TCX_20 ) ) ) { sns_low_br_mode = get_next_indice( st0, 1 ); } } tmp = ch; - if ( ch == 1 && param_lpc[0][0] == 2 ) + move16(); + + test(); + if ( EQ_16( ch, 1 ) && EQ_16( param_lpc[0][0], 2 ) ) { tmp = 3; + move16(); } - getLPCparam_fx( st, ¶m_lpc[ch][0], st0, tmp, sns_low_br_mode && !( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ); + getLPCparam_fx( st, ¶m_lpc[ch][0], st0, tmp, sns_low_br_mode && !( EQ_16( sts[0]->core, TCX_20 ) && EQ_16( sts[1]->core, TCX_20 ) ) ); - st->side_bits_frame_channel += st0->next_bit_pos - start_bit_pos_sns; + st->side_bits_frame_channel = add( st->side_bits_frame_channel, sub( st0->next_bit_pos, start_bit_pos_sns ) ); + move16(); } } } @@ -917,20 +1061,27 @@ void ivas_mdct_core_invQ_fx( Word16 L_frame[CPE_CHANNELS], nSubframes[CPE_CHANNELS], L_frameTCX[CPE_CHANNELS]; Word16 tmp_concealment_method; Word16 gain_tcx = 0, gain_tcx_e = 0; + move16(); + move16(); Word16 nf_seed; const Word16 *prm_sqQ; Word16 L_frameTCX_global[CPE_CHANNELS]; Word16 tmp_ms_sig[CPE_CHANNELS][N_MAX]; Word16 tmp_ms_sig_e[CPE_CHANNELS]; Word32 concealment_noise_fx[CPE_CHANNELS][L_FRAME48k]; - Word16 concealment_noise_e[CPE_CHANNELS] = { 0 }; + Word16 concealment_noise_e[CPE_CHANNELS]; + set16_fx( concealment_noise_e, 0, CPE_CHANNELS ); TONALMDCTCONC_NOISE_GEN_MODE noise_gen_mode_bfi; Word16 q_l = 0, q_r = 0; + move16(); + move16(); Word16 q_snsq = 0; + move16(); Word32 *spectralData_tmp[CPE_CHANNELS]; Word16 shift; Word16 common_exp = 0; + move16(); FOR( k = 0; k < CPE_CHANNELS; ++k ) { @@ -949,8 +1100,8 @@ void ivas_mdct_core_invQ_fx( move32(); set16_fx( xn_buf, 0, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX ); - set_s( total_nbbits, 0, CPE_CHANNELS ); - set_s( bitsRead, 0, CPE_CHANNELS ); + set16_fx( total_nbbits, 0, CPE_CHANNELS ); + set16_fx( bitsRead, 0, CPE_CHANNELS ); tmp_concealment_method = 0; move16(); @@ -964,7 +1115,7 @@ void ivas_mdct_core_invQ_fx( test(); test(); test(); - IF( bfi && !MCT_flag && ( GT_16( hCPE->hStereoMdct->mdct_stereo_mode[0], SMDCT_DUAL_MONO ) || GT_16( hCPE->hStereoMdct->mdct_stereo_mode[1], SMDCT_DUAL_MONO ) ) ) + IF( bfi && !MCT_flag && ( ( hCPE->hStereoMdct->mdct_stereo_mode[0] > SMDCT_DUAL_MONO ) || ( hCPE->hStereoMdct->mdct_stereo_mode[1] > SMDCT_DUAL_MONO ) ) ) { L_frameTCX[0] = sts[0]->L_frameTCX_past; move16(); @@ -981,8 +1132,8 @@ void ivas_mdct_core_invQ_fx( common_exp = s_max( sts[0]->hTonalMDCTConc->lastBlockData.spectralData_exp, sts[1]->hTonalMDCTConc->lastBlockData.spectralData_exp ); #ifdef MSAN_FIX - Copy_Scale_sig_16_32( sts[0]->hTonalMDCTConc->lastBlockData.spectralData, spectralData_tmp[0], L_frameTCX[0], 15 - ( common_exp - sts[0]->hTonalMDCTConc->lastBlockData.spectralData_exp ) ); // 30 - spectral_exp1 - Copy_Scale_sig_16_32( sts[1]->hTonalMDCTConc->lastBlockData.spectralData, spectralData_tmp[1], L_frameTCX[1], 15 - ( common_exp - sts[1]->hTonalMDCTConc->lastBlockData.spectralData_exp ) ); // 30 - spectral_exp2 + Copy_Scale_sig_16_32( sts[0]->hTonalMDCTConc->lastBlockData.spectralData, spectralData_tmp[0], L_frameTCX[0], sub( 15, sub( common_exp, sts[0]->hTonalMDCTConc->lastBlockData.spectralData_exp ) ) ); // 30 - spectral_exp1 + Copy_Scale_sig_16_32( sts[1]->hTonalMDCTConc->lastBlockData.spectralData, spectralData_tmp[1], L_frameTCX[1], sub( 15, sub( common_exp, sts[1]->hTonalMDCTConc->lastBlockData.spectralData_exp ) ) ); // 30 - spectral_exp2 #else Copy_Scale_sig_16_32( sts[0]->hTonalMDCTConc->lastBlockData.spectralData, spectralData_tmp[0], L_FRAME_MAX, 15 - ( common_exp - sts[0]->hTonalMDCTConc->lastBlockData.spectralData_exp ) ); // 30 - spectral_exp1 Copy_Scale_sig_16_32( sts[1]->hTonalMDCTConc->lastBlockData.spectralData, spectralData_tmp[1], L_FRAME_MAX, 15 - ( common_exp - sts[1]->hTonalMDCTConc->lastBlockData.spectralData_exp ) ); // 30 - spectral_exp2 @@ -1007,6 +1158,8 @@ void ivas_mdct_core_invQ_fx( #endif sts[0]->hTonalMDCTConc->lastBlockData.spectralData_exp = sub( 30, q_l ); sts[1]->hTonalMDCTConc->lastBlockData.spectralData_exp = sub( 30, q_r ); + move16(); + move16(); } IF( bfi ) @@ -1050,6 +1203,7 @@ void ivas_mdct_core_invQ_fx( move16(); sts[ch]->total_brate = L_mult0( add( sts[ch]->bits_frame_channel, add( sts[ch]->side_bits_frame_channel, i_mult( sts[ch]->core, NF_GAIN_BITS ) ) ), FRAMES_PER_SEC ); + move32(); } /* Framing parameters */ @@ -1068,14 +1222,16 @@ void ivas_mdct_core_invQ_fx( st->second_last_core = st->last_core; move16(); test(); - IF( EQ_16( hCPE->cpe_id, 0 ) && EQ_16( ch, 0 ) ) + IF( ( hCPE->cpe_id == 0 ) && ( ch == 0 ) ) { /* add mct and side bits to first handle bitrate to avoid false BER detection */ st->total_brate = L_add( st->total_brate, L_mult0( st->next_bit_pos, FRAMES_PER_SEC ) ); + move32(); dec_prm_tcx_spec_fx( st, param[ch], &total_nbbits[ch], &bitsRead[ch], p_param[ch], nTnsBitsTCX10[ch] ); /*revert to actual total bitrate assigned to ch0 */ sts[ch]->total_brate = L_mult0( add( add( sts[ch]->bits_frame_channel, sts[ch]->side_bits_frame_channel ), i_mult2( sts[ch]->core, NF_GAIN_BITS ) ), FRAMES_PER_SEC ); + move32(); } ELSE { @@ -1086,7 +1242,7 @@ void ivas_mdct_core_invQ_fx( } ELSE { - IF( GT_16( st->nbLostCmpt, 1 ) ) + if ( GT_16( st->nbLostCmpt, 1 ) ) { st->flagGuidedAcelp = 0; move16(); @@ -1100,10 +1256,11 @@ void ivas_mdct_core_invQ_fx( test(); test(); - IF( ( !st->bfi || st->hTcxCfg->psychParamsCurrent == NULL ) && GT_16( st->core, ACELP_CORE ) ) + IF( ( !st->bfi || st->hTcxCfg->psychParamsCurrent == NULL ) && ( st->core > ACELP_CORE ) ) { Word16 last_frame_was_concealed_cng; - last_frame_was_concealed_cng = ( EQ_16( st->last_core, ACELP_CORE ) ) && ( NE_16( st->last_core, st->last_core_from_bs ) ); + test(); + last_frame_was_concealed_cng = ( st->last_core == ACELP_CORE ) && NE_16( st->last_core, st->last_core_from_bs ); SetCurrentPsychParams( st->core, last_frame_was_concealed_cng, st->hTcxCfg ); } @@ -1135,14 +1292,14 @@ void ivas_mdct_core_invQ_fx( /* avoid using TD-PLC in only one channel when stereo mode isn't dual mono */ test(); test(); - IF( NE_16( sts[0]->core, sts[1]->core ) && ( EQ_16( sts[0]->core, ACELP_CORE ) || EQ_16( sts[1]->core, ACELP_CORE ) ) ) + IF( NE_16( sts[0]->core, sts[1]->core ) && ( ( sts[0]->core == ACELP_CORE ) || ( sts[1]->core == ACELP_CORE ) ) ) { - IF( EQ_16( sts[0]->core, ACELP_CORE ) ) + IF( sts[0]->core == ACELP_CORE ) { sts[0]->core = sts[0]->last_core; move16(); } - ELSE IF( EQ_16( sts[1]->core, ACELP_CORE ) ) + ELSE IF( sts[1]->core == ACELP_CORE ) { sts[1]->core = sts[1]->last_core; move16(); @@ -1161,7 +1318,7 @@ void ivas_mdct_core_invQ_fx( * LPC PARAMETERS *--------------------------------------------------------------------------------*/ - IF( EQ_16( bfi, 0 ) ) + IF( bfi == 0 ) { test(); test(); @@ -1237,9 +1394,16 @@ void ivas_mdct_core_invQ_fx( test(); test(); - IF( !bfi || ( bfi && NE_16( st->core, ACELP_CORE ) ) ) + IF( !bfi || ( bfi && ( st->core != ACELP_CORE ) ) ) { - nSubframes[ch] = ( EQ_16( st->core, TCX_10_CORE ) ) ? NB_DIV : 1; + IF( EQ_16( st->core, TCX_10_CORE ) ) + { + nSubframes[ch] = NB_DIV; + } + ELSE + { + nSubframes[ch] = 1; + } move16(); FOR( k = 0; k < nSubframes[ch]; k++ ) @@ -1256,13 +1420,13 @@ void ivas_mdct_core_invQ_fx( } /* Set pointer to parameters */ - prm[ch] = param[ch] + ( k * DEC_NPRM_DIV ); - L_frameTCX_global[ch] = st->hTcxDec->L_frameTCX / nSubframes[ch]; + prm[ch] = param[ch] + L_mult0( k, DEC_NPRM_DIV ); + L_frameTCX_global[ch] = idiv1616( st->hTcxDec->L_frameTCX, nSubframes[ch] ); move16(); - L_spec[ch] = st->hTcxCfg->tcx_coded_lines / nSubframes[ch]; + L_spec[ch] = idiv1616( st->hTcxCfg->tcx_coded_lines, nSubframes[ch] ); move16(); - init_tcx_info_fx( st, st->L_frame / nSubframes[ch], st->hTcxDec->L_frameTCX / nSubframes[ch], k, bfi, &tcx_offset[ch], &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] ); + init_tcx_info_fx( st, idiv1616( st->L_frame, nSubframes[ch] ), idiv1616( st->hTcxDec->L_frameTCX, nSubframes[ch] ), k, bfi, &tcx_offset[ch], &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] ); tmp_concealment_method = 0; move16(); @@ -1271,9 +1435,9 @@ void ivas_mdct_core_invQ_fx( test(); test(); test(); - IF( !bfi && st->hTcxCfg->fIsTNSAllowed && GT_16( ch, 0 ) && LT_16( nf_seed, 0 ) ) + IF( !bfi && st->hTcxCfg->fIsTNSAllowed && ( ch > 0 ) && ( nf_seed < 0 ) ) { - mvs2s( param[0] + k * DEC_NPRM_DIV + 1 + NOISE_FILL_RANGES + LTPSIZE, prm[ch] + 1 + NOISE_FILL_RANGES + LTPSIZE, nf_seed * -1 ); + Copy( param[0] + k * DEC_NPRM_DIV + 1 + NOISE_FILL_RANGES + LTPSIZE, prm[ch] + 1 + NOISE_FILL_RANGES + LTPSIZE, negate( nf_seed ) ); } nf_seed = 0; move16(); @@ -1830,7 +1994,9 @@ void ivas_mdct_core_reconstruct_fx( Word16 synth_bufFB_fx[OLD_SYNTH_SIZE_DEC + L_FRAME_PLUS + M]; Word16 *synthFB_fx; Word16 q_syn = 0; + move16(); Word16 q_win = -2; + move16(); /* TCX */ Word16 xn_buf_fx[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; Word16 tcx_offset[CPE_CHANNELS]; @@ -1847,6 +2013,7 @@ void ivas_mdct_core_reconstruct_fx( /* Initializations */ sts = hCPE->hCoreCoder; bfi = sts[0]->bfi; + move16(); /* TNS, ITF, IMDCT and updates */ FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -1854,12 +2021,21 @@ void ivas_mdct_core_reconstruct_fx( st = sts[ch]; skip_decoding = 0; - IF( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + if ( EQ_32( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { skip_decoding = 1; + move16(); } - nSubframes[ch] = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; + IF( EQ_16( st->core, TCX_20_CORE ) ) + { + nSubframes[ch] = 1; + } + ELSE + { + nSubframes[ch] = NB_DIV; + } + move16(); synth_fx = synth_buf_fx + st->hTcxDec->old_synth_len; synthFB_fx = synth_bufFB_fx + st->hTcxDec->old_synth_lenFB; @@ -1867,11 +2043,11 @@ void ivas_mdct_core_reconstruct_fx( Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( q_syn, st->Q_syn ) ); set16_fx( synth_fx, 0, L_FRAME_PLUS + M ); set16_fx( synthFB_fx, 0, L_FRAME_PLUS + M ); - IF( NE_16( st->core, ACELP_CORE ) ) + IF( st->core != ACELP_CORE ) { - Scale_sig( st->hTcxDec->syn_Overl_TDACFB, shr( L_FRAME_MAX, 1 ), sub( q_win, -1 - st->Q_syn ) ); - Scale_sig( st->hTcxDec->syn_Overl_TDAC, shr( L_FRAME32k, 1 ), sub( q_win, -1 - st->Q_syn ) ); - Scale_sig( st->hTcxDec->old_syn_Overl, shr( L_FRAME32k, 1 ), sub( q_win, -1 - st->Q_syn ) ); + Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( q_win, sub( -1, st->Q_syn ) ) ); + Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( q_win, sub( -1, st->Q_syn ) ) ); + Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( q_win, sub( -1, st->Q_syn ) ) ); Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( q_win, st->Q_syn ) ); Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( q_win, st->Q_syn ) ); Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( q_win, st->Q_syn ) ); @@ -1883,30 +2059,49 @@ void ivas_mdct_core_reconstruct_fx( Scale_sig( synth_buf_fx, 3136, sub( q_win, q_syn ) ); Scale_sig( synth_bufFB_fx, 3136, sub( q_win, q_syn ) ); #endif - Scale_sig( st->syn, M + 1, q_win - st->Q_syn ); + Scale_sig( st->syn, M + 1, sub( q_win, st->Q_syn ) ); FOR( k = 0; k < nSubframes[ch]; k++ ) { - L_spec[ch] = st->hTcxCfg->tcx_coded_lines / nSubframes[ch]; - L_frame_global[ch] = st->L_frame / nSubframes[ch]; - L_frame_globalTCX[ch] = st->hTcxDec->L_frameTCX / nSubframes[ch]; + Word16 temp_e; + Word16 temp = BASOP_Util_Divide1616_Scale( st->hTcxCfg->tcx_coded_lines, nSubframes[ch], &temp_e ); + temp = shr( temp, sub( 15, temp_e ) ); + L_spec[ch] = temp; + move16(); + temp = BASOP_Util_Divide1616_Scale( st->L_frame, nSubframes[ch], &temp_e ); + temp = shr( temp, sub( 15, temp_e ) ); + L_frame_global[ch] = temp; + move16(); + temp = BASOP_Util_Divide1616_Scale( st->hTcxDec->L_frameTCX, nSubframes[ch], &temp_e ); + temp = shr( temp, sub( 15, temp_e ) ); + L_frame_globalTCX[ch] = temp; + move16(); init_tcx_info_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], k, bfi, &tcx_offset[ch], &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] ); IF( !skip_decoding ) { - decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, q_win, - ( ( hCPE->nchan_out == 1 && st->hTcxDec->kernel_type[k] == MDST_IV ) || st->hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) ? MDCT_IV : st->hTcxDec->kernel_type[k], - fUseTns[ch][k], &synth_fx[k * L_frame[ch]], &synthFB_fx[k * L_frameTCX[ch]], bfi, k, 0 ); + test(); + test(); + IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) + { + decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, q_win, + MDCT_IV, fUseTns[ch][k], &synth_fx[L_mult0( k, L_frame[ch] )], &synthFB_fx[L_mult0( k, L_frameTCX[ch] )], bfi, k, 0 ); + } + ELSE + { + decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, q_win, + st->hTcxDec->kernel_type[k], fUseTns[ch][k], &synth_fx[L_mult0( k, L_frame[ch] )], &synthFB_fx[L_mult0( k, L_frameTCX[ch] )], bfi, k, 0 ); + } } ELSE { - set16_fx( &synth_fx[k * L_frame[ch]], 0, L_frame[ch] ); - set16_fx( &synthFB_fx[k * L_frame[ch]], 0, L_frameTCX[ch] ); + set16_fx( &synth_fx[L_mult0( k, L_frame[ch] )], 0, L_frame[ch] ); + set16_fx( &synthFB_fx[L_mult0( k, L_frame[ch] )], 0, L_frameTCX[ch] ); } } - IF( EQ_16( bfi, 0 ) && st->hTonalMDCTConc != NULL ) + IF( ( bfi == 0 ) && st->hTonalMDCTConc != NULL ) { Word16 synth_tmp[L_FRAME48k]; Copy_Scale_sig( synthFB_fx, synth_tmp, st->hTonalMDCTConc->nSamples, 2 ); @@ -1914,9 +2109,9 @@ void ivas_mdct_core_reconstruct_fx( } decoder_tcx_post_ivas_fx( st, synth_fx, synthFB_fx, NULL, bfi, MCT_flag ); - Scale_sig( st->hTcxDec->syn_Overl_TDACFB, shr( L_FRAME_MAX, 1 ), sub( -1 - st->Q_syn, q_win ) ); - Scale_sig( st->hTcxDec->syn_Overl_TDAC, shr( L_FRAME32k, 1 ), sub( -1 - st->Q_syn, q_win ) ); - Scale_sig( st->hTcxDec->old_syn_Overl, shr( L_FRAME32k, 1 ), sub( -1 - st->Q_syn, q_win ) ); + Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( sub( -1, st->Q_syn ), q_win ) ); + Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), q_win ) ); + Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), q_win ) ); #ifdef MSAN_FIX Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); @@ -1924,9 +2119,9 @@ void ivas_mdct_core_reconstruct_fx( Scale_sig( synth_buf_fx, 3136, sub( q_syn, q_win ) ); Scale_sig( synth_bufFB_fx, 3136, sub( q_syn, q_win ) ); #endif - Scale_sig( st->syn, M + 1, st->Q_syn + 2 ); - Scale_sig( st->hTcxDec->syn_OverlFB, shr( L_FRAME_MAX, 1 ), sub( st->Q_syn, q_win ) ); - Scale_sig( st->hTcxDec->syn_Overl, shr( L_FRAME32k, 1 ), sub( st->Q_syn, q_win ) ); + Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); + Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( st->Q_syn, q_win ) ); + Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, q_win ) ); Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( st->Q_syn, q_win ) ); Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( st->Q_syn, q_win ) ); } @@ -1934,28 +2129,36 @@ void ivas_mdct_core_reconstruct_fx( { assert( EQ_16( st->bfi, 1 ) ); /* PLC: [TCX: TD PLC] */ - IF( NE_16( MCT_flag, 0 ) ) + IF( MCT_flag != 0 ) { con_tcx_fx( st, &synthFB_fx[0] /*, -1.f, NULL, 0, NULL */ ); } ELSE { - Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, M + 1, norm_s( st->hFdCngDec->hFdCngCom->A_cng[0] - 1 ) ); - con_tcx_ivas_fx( st, &synthFB_fx[0], hCPE->hStereoMdct->lastCoh_fx, &sts[0]->seed_acelp, ( sts[1]->core != ACELP_CORE ) ? 1 : 0, &st->hFdCngDec->hFdCngCom->A_cng[0] ); + Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, M + 1, norm_s( sub( st->hFdCngDec->hFdCngCom->A_cng[0], 1 ) ) ); + IF( sts[1]->core != ACELP_CORE ) + { + con_tcx_ivas_fx( st, &synthFB_fx[0], hCPE->hStereoMdct->lastCoh_fx, &sts[0]->seed_acelp, 1, &st->hFdCngDec->hFdCngCom->A_cng[0] ); + } + ELSE + { + con_tcx_ivas_fx( st, &synthFB_fx[0], hCPE->hStereoMdct->lastCoh_fx, &sts[0]->seed_acelp, 0, &st->hFdCngDec->hFdCngCom->A_cng[0] ); + } } Scale_sig( synthFB_fx, st->hTcxDec->L_frameTCX, q_syn ); - IF( ( EQ_16( st->nbLostCmpt, 1 ) ) || NE_16( st->hTcxDec->tcxConceal_recalc_exc, 0 ) ) + IF( ( EQ_16( st->nbLostCmpt, 1 ) ) || ( st->hTcxDec->tcxConceal_recalc_exc != 0 ) ) { - Scale_sig( synthFB_fx - ( st->hTcxDec->L_frameTCX / 2 + st->hTcxDec->pit_max_TCX + 2 * M ), sub( q_syn, st->Q_exc - 1 ), st->hTcxDec->L_frameTCX / 2 + st->hTcxDec->pit_max_TCX + 2 * M ); + Scale_sig( synthFB_fx - add( add( shr( st->hTcxDec->L_frameTCX, 1 ), st->hTcxDec->pit_max_TCX ), 2 * M ), sub( q_syn, sub( st->Q_exc, 1 ) ), add( add( shr( st->hTcxDec->L_frameTCX, 1 ), st->hTcxDec->pit_max_TCX ), 2 * M ) ); } ELSE { - Scale_sig( synthFB_fx - st->hTcxDec->L_frameTCX, sub( q_syn, st->Q_exc - 1 ), st->hTcxDec->L_frameTCX ); + Scale_sig( synthFB_fx - st->hTcxDec->L_frameTCX, sub( q_syn, sub( st->Q_exc, 1 ) ), st->hTcxDec->L_frameTCX ); } lerp( synthFB_fx, synth_fx, st->L_frame, st->hTcxDec->L_frameTCX ); st->con_tcx = 1; + move16(); set16_fx( &st->mem_pitch_gain[2], st->lp_gainp_fx, st->nb_subfr ); /* PLC: [TCX: Tonal Concealment] */ @@ -1974,10 +2177,12 @@ void ivas_mdct_core_reconstruct_fx( st = sts[ch]; - IF( NE_16( bfi, 0 ) && NE_16( st->last_core, ACELP_CORE ) && EQ_16( st->core, ACELP_CORE ) ) + test(); + test(); + IF( ( bfi != 0 ) && ( st->last_core != ACELP_CORE ) && ( st->core == ACELP_CORE ) ) { /* Update FEC_scale_syn parameters */ - IF( EQ_16( st->hTcxLtpDec->tcxltp_gain, 0 ) ) + IF( st->hTcxLtpDec->tcxltp_gain == 0 ) { frame_ener_fx( st->L_frame, UNVOICED, synth_fx, shr( st->L_frame, 1 ), &st->enr_old_fx, st->L_frame, 0, 0, 0 ); } @@ -1990,23 +2195,24 @@ void ivas_mdct_core_reconstruct_fx( /* Update */ Copy( synth_buf_fx + st->L_frame, st->hTcxDec->old_synth, st->hTcxDec->old_synth_len ); Copy( st->hTcxDec->old_synthFB_fx + st->hTcxDec->L_frameTCX - NS2SA( st->output_Fs, PH_ECU_MEM_NS ), st->hTcxDec->synth_history_fx, NS2SA( st->output_Fs, PH_ECU_MEM_NS ) ); - mvs2s( synth_bufFB_fx + st->hTcxDec->L_frameTCX, st->hTcxDec->old_synthFB_fx, st->hTcxDec->old_synth_lenFB ); + Copy( synth_bufFB_fx + st->hTcxDec->L_frameTCX, st->hTcxDec->old_synthFB_fx, st->hTcxDec->old_synth_lenFB ); Scale_sig( st->hTcxDec->old_synthFB_fx, st->hTcxDec->old_synth_lenFB, sub( st->Q_syn, q_syn ) ); IF( st->hHQ_core != NULL ) { - mvs2s( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + st->hTcxDec->old_synth_lenFB, NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + st->hTcxDec->old_synth_lenFB, NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } - mvs2s( st->lsp_q_cng, st->old_lsp_q_cng, M ); - mvs2s( st->lsf_q_cng, st->old_lsf_q_cng, M ); + Copy( st->lsp_q_cng, st->old_lsp_q_cng, M ); + Copy( st->lsf_q_cng, st->old_lsf_q_cng, M ); st->last_is_cng = 0; + move16(); /* Postfiltering */ Word16 x_fx_16[1200]; Copy_Scale_sig_32_16( x_fx[ch][0], x_fx_16, st->L_frame, sub( 0, q_x ) ); IF( st->p_bpf_noise_buf_32 ) { - Copy_Scale_sig_32_16( st->p_bpf_noise_buf_32, st->p_bpf_noise_buf, st->L_frame, negate( Q11 ) ); + Copy_Scale_sig_32_16( st->p_bpf_noise_buf_32, st->p_bpf_noise_buf, st->L_frame, -Q11 ); } post_decoder_ivas_fx( st, synth_buf_fx, pit_gain_fx[ch], pitch[ch], x_fx_16, st->p_bpf_noise_buf ); @@ -2023,13 +2229,17 @@ void ivas_mdct_core_reconstruct_fx( /* updates */ st->last_voice_factor_fx = 0; + move16(); st->last_coder_type = st->coder_type; + move16(); - Copy_Scale_sig_16_32( x_fx_16, x_fx[ch][0], st->L_frame, sub( q_x, 0 ) ); + Copy_Scale_sig_16_32( x_fx_16, x_fx[ch][0], st->L_frame, q_x - 0 ); } /* calculate coherence of signal needed when next frame is lost */ - IF( EQ_16( bfi, 0 ) && EQ_16( MCT_flag, 0 ) && EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) + test(); + test(); + IF( ( bfi == 0 ) && ( MCT_flag == 0 ) && EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) { Word16 i; Word64 nrgL_fx, nrgR_fx, xcorr_fx; @@ -2068,7 +2278,9 @@ void ivas_mdct_core_reconstruct_fx( e_tmp = add( e_nrgL, e_nrgR ); L_tmp = ISqrt32( L_tmp, &e_tmp ); hCPE->hStereoMdct->lastCoh_fx = extract_l( L_shr( Mpy_32_32( L_abs( W_extract_h( xcorr_fx ) ), L_tmp ), sub( 17, add( e_xcorr, e_tmp ) ) ) ); + move16(); hCPE->hStereoMdct->lastCoh_fx = s_min( hCPE->hStereoMdct->lastCoh_fx, 16384 ); + move16(); } return; @@ -2339,19 +2551,34 @@ void ivas_mdct_core_tns_ns_fx( FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; - nSubframes[ch] = EQ_16( st->core, TCX_20_CORE ) ? 1 : NB_DIV; + IF( EQ_16( st->core, TCX_20_CORE ) ) + { + nSubframes[ch] = 1; + } + ELSE + { + nSubframes[ch] = NB_DIV; + } move16(); L_frame_global[ch] = BASOP_Util_Divide3216_Scale( st->L_frame, nSubframes[ch], &exp ); - L_frame_global[ch] = shl( L_frame_global[ch], exp + 1 ); + move16(); + L_frame_global[ch] = shl( L_frame_global[ch], add( exp, 1 ) ); + move16(); L_frameTCX_glob[ch] = BASOP_Util_Divide3216_Scale( st->hTcxDec->L_frameTCX, nSubframes[ch], &exp ); - L_frameTCX_glob[ch] = shl( L_frameTCX_glob[ch], exp + 1 ); + move16(); + L_frameTCX_glob[ch] = shl( L_frameTCX_glob[ch], add( exp, 1 ) ); + move16(); L_spec[ch] = BASOP_Util_Divide3216_Scale( st->hTcxCfg->tcx_coded_lines, nSubframes[ch], &exp ); - L_spec[ch] = shl( L_spec[ch], exp + 1 ); + move16(); + L_spec[ch] = shl( L_spec[ch], add( exp, 1 ) ); + move16(); - IF( ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) || ( NE_16( st->bfi, 0 ) && EQ_16( st->core, ACELP_CORE ) ) ) /* indicates LFE with no content, or odd number of channels */ + test(); + test(); + IF( EQ_32( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) || ( ( st->bfi != 0 ) && ( st->core == ACELP_CORE ) ) ) /* indicates LFE with no content, or odd number of channels */ { IF( st->hTonalMDCTConc != NULL ) { @@ -2369,11 +2596,11 @@ void ivas_mdct_core_tns_ns_fx( Word16 q_x; q_x = sub( 31, x_e[ch][k] ); - IF( EQ_16( bfi, 0 ) ) + IF( bfi == 0 ) { sns_interpolate_scalefactors_fx( sns_int_scf_fx, &Aq_fx[ch][k * M], DEC ); - IF( NE_16( MCT_flag, 0 ) && st->hTonalMDCTConc != NULL && EQ_16( add( k, 1 ), nSubframes[ch] ) ) + IF( ( MCT_flag != 0 ) && st->hTonalMDCTConc != NULL && EQ_16( add( k, 1 ), nSubframes[ch] ) ) { Word16 scf_fx[FDNS_NPTS], scf_e[FDNS_NPTS]; Word16 q_shift; @@ -2381,7 +2608,9 @@ void ivas_mdct_core_tns_ns_fx( { q_shift = norm_l( sns_int_scf_fx[ind] ); scf_fx[ind] = extract_h( L_shl( sns_int_scf_fx[ind], q_shift ) ); + move16(); scf_e[ind] = sub( 15, q_shift ); + move16(); } TonalMDCTConceal_SaveFreqSignal_ivas_fx( st->hTonalMDCTConc, x_fx[ch][k], x_e[ch][k], L_frameTCX[ch], L_frame[ch], &scf_fx[0], scf_e, 0, get_igf_startline( st, L_frame[ch], L_frameTCX[ch] ) ); } @@ -2390,7 +2619,7 @@ void ivas_mdct_core_tns_ns_fx( { IF( st->hTonalMDCTConc != NULL ) { - IF( EQ_16( MCT_flag, 0 ) && LT_16( st->hTcxDec->cummulative_damping_tcx, 32440 ) ) + IF( ( MCT_flag == 0 ) && LT_16( st->hTcxDec->cummulative_damping_tcx, 32440 ) ) { Word16 *scf_last_m, *scf_last_e; Word32 *scf_bg; @@ -2401,21 +2630,26 @@ void ivas_mdct_core_tns_ns_fx( scf_bg = &st->hTonalMDCTConc->scaleFactorsBackground_fx[0]; st->hTonalMDCTConc->scf_fadeout = mult( st->hTonalMDCTConc->scf_fadeout, 31130 ); // 0.95 in Q15 = 31130 + move16(); fade_out = st->hTonalMDCTConc->scf_fadeout; + move16(); fade_in = sub( 32767, fade_out ); FOR( Word16 i = 0; i < st->hTonalMDCTConc->nScaleFactors; i++ ) { - sns_int_scf_fx[i] = L_add( Mpy_32_16_1( L_shl( scf_last_m[i], 1 + scf_last_e[i] ), fade_out ), Mpy_32_16_1( L_shl( scf_bg[i], 1 ), fade_in ) ); + sns_int_scf_fx[i] = L_add( Mpy_32_16_1( L_shl( scf_last_m[i], add( 1, scf_last_e[i] ) ), fade_out ), Mpy_32_16_1( L_shl( scf_bg[i], 1 ), fade_in ) ); + move32(); } } ELSE { st->hTonalMDCTConc->scf_fadeout = 32767; + move16(); FOR( Word16 i = 0; i < st->hTonalMDCTConc->nScaleFactors; i++ ) { - sns_int_scf_fx[i] = L_shl( st->hTonalMDCTConc->lastBlockData.scaleFactors[i], 1 + st->hTonalMDCTConc->lastBlockData.scaleFactors_exp[i] ); + sns_int_scf_fx[i] = L_shl( st->hTonalMDCTConc->lastBlockData.scaleFactors[i], add( 1, st->hTonalMDCTConc->lastBlockData.scaleFactors_exp[i] ) ); + move32(); } } } @@ -2428,6 +2662,7 @@ void ivas_mdct_core_tns_ns_fx( Scale_sig32( &x_fx[ch][k][0], L_spec[ch], norm_x ); q_x = add( q_x, norm_x ); x_e[ch][k] = sub( 31, q_x ); + move16(); Word16 q_sns_int_scf; Word16 q_2, length; @@ -2435,28 +2670,34 @@ void ivas_mdct_core_tns_ns_fx( // q_sns_int_scf -= 1; FOR( Word16 c = 0; c < FDNS_NPTS; c++ ) { - sns_int_scf_fx[c] = L_shl( sns_int_scf_fx[c], q_sns_int_scf - 16 ); + sns_int_scf_fx[c] = L_shl( sns_int_scf_fx[c], sub( q_sns_int_scf, 16 ) ); + move32(); } q_2 = q_x; + move16(); sns_shape_spectrum_fx( x_fx[ch][k], &q_x, st->hTcxCfg->psychParamsCurrent, sns_int_scf_fx, q_sns_int_scf, st->hTcxCfg->psychParamsCurrent->nBins, &length ); IF( LT_16( q_2, add( q_x, 1 ) ) ) /*scaling to q_2*/ { Scale_sig32( &x_fx[ch][k][0], length, q_2 - q_x - 1 ); q_x = q_2; + move16(); } ELSE /*scaling to q_x+1*/ { - Scale_sig32( &x_fx[ch][k][0] + length, L_spec[ch] - length, q_x + 1 - q_2 ); + Scale_sig32( &x_fx[ch][k][0] + length, sub( L_spec[ch], length ), sub( add( q_x, 1 ), q_2 ) ); q_x = add( q_x, 1 ); } x_e[ch][k] = sub( 31, q_x ); + move16(); - v_multc_fixed( x_fx[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, sns_int_scf_fx[FDNS_NPTS - 1], x_fx[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, L_spec[ch] - st->hTcxCfg->psychParamsCurrent->nBins ); + v_multc_fixed( x_fx[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, sns_int_scf_fx[FDNS_NPTS - 1], x_fx[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, sub( L_spec[ch], st->hTcxCfg->psychParamsCurrent->nBins ) ); q_2 = sub( add( q_x, q_sns_int_scf ), 31 ); - Scale_sig32( &x_fx[ch][k][0], st->hTcxCfg->psychParamsCurrent->nBins, q_2 - q_x ); + Scale_sig32( &x_fx[ch][k][0], st->hTcxCfg->psychParamsCurrent->nBins, sub( q_2, q_x ) ); q_x = q_2; + move16(); x_e[ch][k] = sub( 31, q_x ); + move16(); q_x = sub( q_x, 5 ); Scale_sig32( &x_fx[ch][k][0], L_spec[ch], -5 ); @@ -2465,9 +2706,10 @@ void ivas_mdct_core_tns_ns_fx( Scale_sig32( &x_fx[ch][k][0], L_spec[ch], norm_x ); q_x = add( q_x, norm_x ); x_e[ch][k] = sub( 31, q_x ); + move16(); } - IF( NE_16( bfi, 0 ) && NE_16( st->tonal_mdct_plc_active, 0 ) ) + IF( ( bfi != 0 ) && ( st->tonal_mdct_plc_active != 0 ) ) { Word16 q_x, q_x_old; FOR( Word16 i = 0; i < FDNS_NPTS; i++ ) @@ -2481,34 +2723,48 @@ void ivas_mdct_core_tns_ns_fx( IF( LT_16( q_x_old, q_x ) ) { x_e[ch][0] = sub( 31, q_x_old ); + move16(); FOR( Word16 i = 0; i < st->hTonalMDCTConc->pTCI->numIndexes; i++ ) { FOR( Word16 l = st->hTonalMDCTConc->pTCI->lowerIndex[i]; l <= st->hTonalMDCTConc->pTCI->upperIndex[i]; l++ ) { - x_fx[ch][0][l] = L_shr( x_fx[ch][0][l], q_x - q_x_old ); + x_fx[ch][0][l] = L_shr( x_fx[ch][0][l], sub( q_x, q_x_old ) ); + move32(); } } } ELSE { x_e[ch][0] = sub( 31, q_x ); + move16(); FOR( Word16 i = 0; i < st->hTonalMDCTConc->pTCI->numIndexes; i++ ) { FOR( Word16 l = 0; l < st->hTonalMDCTConc->pTCI->lowerIndex[i]; l++ ) { x_fx[ch][0][l] = L_shr( x_fx[ch][0][l], sub( q_x_old, q_x ) ); + move32(); } FOR( Word16 l = st->hTonalMDCTConc->pTCI->upperIndex[i] + 1; l < L_spec[ch]; l++ ) { x_fx[ch][0][l] = L_shr( x_fx[ch][0][l], sub( q_x_old, q_x ) ); + move32(); } } } } + test(); + test(); IF( ( bfi || MCT_flag ) && st->hTonalMDCTConc != NULL ) { - TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, L_frameTCX[ch], ( st->hTcxDec->tcxltp_last_gain_unmodified > 0 ) ? st->old_fpitch : 0, bfi, bfi && st->tonal_mdct_plc_active ); + IF( st->hTcxDec->tcxltp_last_gain_unmodified > 0 ) + { + TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, L_frameTCX[ch], st->old_fpitch, bfi, (Word8) s_and( bfi, st->tonal_mdct_plc_active ) ); + } + ELSE + { + TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, L_frameTCX[ch], 0, bfi, (Word8) s_and( bfi, st->tonal_mdct_plc_active ) ); + } } } diff --git a/lib_dec/ivas_mono_dmx_renderer.c b/lib_dec/ivas_mono_dmx_renderer.c index 75d42d5ec..892298f1c 100644 --- a/lib_dec/ivas_mono_dmx_renderer.c +++ b/lib_dec/ivas_mono_dmx_renderer.c @@ -73,9 +73,13 @@ ivas_error ivas_mono_dmx_renderer_open( } hDownmix->inputEnergy_fx = 0; + move16(); hDownmix->protoEnergy_fx = 0; + move16(); hDownmix->Q_inputEner = 0; + move16(); hDownmix->Q_protoEner = 0; + move16(); st_ivas->hMonoDmxRenderer = hDownmix; @@ -112,6 +116,7 @@ void ivas_mono_dmx_renderer_close( MONO_DOWNMIX_RENDERER_HANDLE *hMonoDmxRenderer /* i/ i/o: Mono downmix structure */ ) { + test(); IF( hMonoDmxRenderer == NULL || *hMonoDmxRenderer == NULL ) { return; @@ -219,14 +224,17 @@ void ivas_mono_downmix_render_passive_fx( Word16 diff_shift, div, div_sqrt; Word32 protoEner_pre, inputEner_pre; numInputChannels = st_ivas->nSCE; - IF( EQ_16( (Word16) st_ivas->ivas_format, (Word16) SBA_ISM_FORMAT ) ) + move16(); + if ( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { numInputChannels = st_ivas->nchan_ism; + move16(); } - IF( EQ_16( (Word16) st_ivas->ivas_format, (Word16) MASA_ISM_FORMAT ) ) + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { - IF( EQ_16( (Word16) st_ivas->ism_mode, (Word16) ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_16( (Word16) st_ivas->ism_mode, (Word16) ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) { numInputChannels = add( st_ivas->nchan_transport, 1 ); } @@ -240,10 +248,11 @@ void ivas_mono_downmix_render_passive_fx( set32_fx( proto_signal_fx, 0, output_frame ); Word16 Output_norm = 32; - FOR( int lp = 0; lp < numInputChannels; lp++ ) + move16(); + FOR( Word16 lp = 0; lp < numInputChannels; lp++ ) { Word16 norm = L_norm_arr( output_f_fx[lp], output_frame ); - Output_norm = min( Output_norm, norm ); + Output_norm = s_min( Output_norm, norm ); } Q_shift = sub( Output_norm, find_guarded_bits_fx( numInputChannels ) ); @@ -256,7 +265,9 @@ void ivas_mono_downmix_render_passive_fx( /* compute the input energy, proto energy after smoothing */ hDownmix->inputEnergy_fx = Mpy_32_16_1( hDownmix->inputEnergy_fx, DOWNMIX_ALPHA_FX ); + move32(); hDownmix->protoEnergy_fx = Mpy_32_16_1( hDownmix->protoEnergy_fx, DOWNMIX_ALPHA_FX ); + move32(); proto_norm = L_norm_arr( proto_signal_fx, output_frame ); @@ -279,7 +290,7 @@ void ivas_mono_downmix_render_passive_fx( /* compute the eq factor */ - IF( EQ_32( hDownmix->protoEnergy_fx, 0 ) ) + IF( hDownmix->protoEnergy_fx == 0 ) { norm_protoEner = add( 31, hDownmix->Q_protoEner ); } @@ -287,7 +298,7 @@ void ivas_mono_downmix_render_passive_fx( { norm_protoEner = add( norm_l( hDownmix->protoEnergy_fx ), hDownmix->Q_protoEner ); } - IF( EQ_32( hDownmix->inputEnergy_fx, 0 ) ) + IF( hDownmix->inputEnergy_fx == 0 ) { norm_inputEner = add( 31, hDownmix->Q_inputEner ); } @@ -296,31 +307,41 @@ void ivas_mono_downmix_render_passive_fx( norm_inputEner = add( norm_l( hDownmix->inputEnergy_fx ), hDownmix->Q_inputEner ); } - norm_protoEner = min( norm_protoEner, sub( shl( add( add( 11, Q_shift ), proto_shift ), 1 ), 31 ) ) - 1; - norm_inputEner = min( norm_inputEner, sub( shl( add( 11, input_shift ), 1 ), 31 ) ) - 1; + norm_protoEner = sub( s_min( norm_protoEner, sub( shl( add( add( 11, Q_shift ), proto_shift ), 1 ), 31 ) ), 1 ); + norm_inputEner = sub( s_min( norm_inputEner, sub( shl( add( 11, input_shift ), 1 ), 31 ) ), 1 ); hDownmix->protoEnergy_fx = L_shl( hDownmix->protoEnergy_fx, sub( norm_protoEner, hDownmix->Q_protoEner ) ); + move32(); hDownmix->inputEnergy_fx = L_shl( hDownmix->inputEnergy_fx, sub( norm_inputEner, hDownmix->Q_inputEner ) ); + move32(); hDownmix->Q_protoEner = norm_protoEner; + move16(); hDownmix->Q_inputEner = norm_inputEner; + move16(); protoEner_pre = L_shl( protoEner_pre, sub( norm_protoEner, sub( shl( add( add( 11, Q_shift ), proto_shift ), 1 ), 31 ) ) ); inputEner_pre = L_shl( inputEner_pre, sub( norm_inputEner, sub( shl( add( 11, input_shift ), 1 ), 31 ) ) ); hDownmix->protoEnergy_fx = L_add( hDownmix->protoEnergy_fx, protoEner_pre ); + move32(); hDownmix->inputEnergy_fx = L_add( hDownmix->inputEnergy_fx, inputEner_pre ); + move32(); diff_shift = sub( hDownmix->Q_inputEner, hDownmix->Q_protoEner ); - IF( GT_16( diff_shift, 0 ) ) + IF( diff_shift > 0 ) { hDownmix->inputEnergy_fx = L_shr( hDownmix->inputEnergy_fx, diff_shift ); + move32(); hDownmix->Q_inputEner = sub( hDownmix->Q_inputEner, diff_shift ); + move16(); } ELSE { hDownmix->protoEnergy_fx = L_shr( hDownmix->protoEnergy_fx, -diff_shift ); + move32(); hDownmix->Q_protoEner = add( hDownmix->Q_protoEner, diff_shift ); + move16(); } IF( GE_32( hDownmix->protoEnergy_fx, L_shr( hDownmix->inputEnergy_fx, 2 ) ) ) { @@ -349,6 +370,7 @@ void ivas_mono_downmix_render_passive_fx( * Downmix process in McMASA *------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ivas_mono_stereo_downmix_mcmasa( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *output_f[], /* i/o: synthesized core-coder transport channels/mono or stereo output */ @@ -388,7 +410,7 @@ void ivas_mono_stereo_downmix_mcmasa( return; } -#ifdef IVAS_FLOAT_FIXED +#else void ivas_mono_stereo_downmix_mcmasa_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ Word32 *output_f_fx[], /* i/o: synthesized core-coder transport channels/mono or stereo output */ @@ -402,21 +424,22 @@ void ivas_mono_stereo_downmix_mcmasa_fx( set32_fx( dmx_tmp_fx, 0, output_frame ); /* Dowmix center channel to L and R */ - if ( st_ivas->hDecoderConfig->nchan_out == 2 && st_ivas->hOutSetup.separateChannelEnabled ) + test(); + IF( EQ_16( st_ivas->hDecoderConfig->nchan_out, 2 ) && st_ivas->hOutSetup.separateChannelEnabled ) { v_multc_acc_32_16( output_f_fx[st_ivas->hOutSetup.separateChannelIndex], INV_SQRT2_FX_Q15, output_f_fx[0], output_frame ); v_multc_acc_32_16( output_f_fx[st_ivas->hOutSetup.separateChannelIndex], INV_SQRT2_FX_Q15, output_f_fx[1], output_frame ); } /* Mono downmix */ - else if ( st_ivas->hDecoderConfig->nchan_out == 1 ) + ELSE IF( EQ_16( st_ivas->hDecoderConfig->nchan_out, 1 ) ) { /* Downmix L and R to dmx_tmp */ - for ( i = 0; i < st_ivas->nchan_transport; i++ ) + FOR( i = 0; i < st_ivas->nchan_transport; i++ ) { v_multc_acc_32_16( output_f_fx[i], INV_SQRT2_FX_Q15, dmx_tmp_fx, output_frame ); } /* Add center channel */ - if ( st_ivas->hOutSetup.separateChannelEnabled ) + IF( st_ivas->hOutSetup.separateChannelEnabled ) { v_add_32( output_f_fx[st_ivas->hOutSetup.separateChannelIndex], dmx_tmp_fx, dmx_tmp_fx, output_frame ); } @@ -437,6 +460,7 @@ void ivas_mono_stereo_downmix_mcmasa_fx( * Apply non-diegetic panning *------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ivas_apply_non_diegetic_panning( float *output_f[], /* i/o: core-coder transport mono channel/stereo output */ const float non_diegetic_pan_gain, /* i : non-diegetic panning gain */ @@ -454,7 +478,7 @@ void ivas_apply_non_diegetic_panning( return; } -#ifdef IVAS_FLOAT_FIXED +#else void ivas_apply_non_diegetic_panning_fx( Word32 *output_f_fx[], /* i/o: core-coder transport mono channel/stereo output */ const Word16 non_diegetic_pan_gain_fx, /* i : non-diegetic panning gain */ @@ -463,8 +487,8 @@ void ivas_apply_non_diegetic_panning_fx( { Word16 pan_left_fx, pan_right_fx; - pan_left_fx = mult( non_diegetic_pan_gain_fx, 16348 ) + 16348; - pan_right_fx = 32767 - pan_left_fx; + pan_left_fx = add( mult( non_diegetic_pan_gain_fx, 16348 ), 16348 ); + pan_right_fx = sub( 32767, pan_left_fx ); v_multc_fixed( output_f_fx[0], L_shl( L_deposit_l( pan_right_fx ), 16 ), output_f_fx[1], output_frame ); v_multc_fixed( output_f_fx[0], L_shl( L_deposit_l( pan_left_fx ), 16 ), output_f_fx[0], output_frame ); diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index aeb119af8..51cf795b3 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -43,8 +43,6 @@ #include "prot_fx1.h" #include "prot_fx2.h" #include "debug.h" -#define float_to_fixed( n, factor ) ( round( n * ( 1 << factor ) ) ) -#define fixed_to_float( n, factor ) ( (float) n / ( 1 << factor ) ) #endif @@ -61,7 +59,8 @@ ivas_error ivas_td_binaural_open_fx( { *num_src = st_ivas->nchan_transport; move16(); - IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + test(); + if ( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { *num_src = st_ivas->nchan_ism; move16(); @@ -104,7 +103,15 @@ ivas_error ivas_td_binaural_renderer_fx( Word16 ism_md_subframe_update; Word16 nchan_transport; test(); - nchan_transport = ( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) ? st_ivas->nchan_ism : st_ivas->nchan_transport; + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + nchan_transport = st_ivas->nchan_ism; + } + ELSE + { + nchan_transport = st_ivas->nchan_transport; + } + move16(); IF( st_ivas->hDecoderConfig->Opt_delay_comp ) { @@ -114,12 +121,13 @@ ivas_error ivas_td_binaural_renderer_fx( { ism_md_subframe_update = 2; } + move16(); - IF( EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + if ( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { ism_md_subframe_update = 2; + move16(); } - return ivas_td_binaural_renderer_unwrap_fx( st_ivas->hReverb, st_ivas->transport_config, st_ivas->hBinRendererTd, nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, st_ivas->hIsmMetaData, st_ivas->hCombinedOrientationData, ism_md_subframe_update, output, output_frame, MAX_PARAM_SPATIAL_SUBFRAMES ); } #else @@ -186,7 +194,7 @@ ivas_error ivas_td_binaural_renderer_sf_fx( Word16 enableCombinedOrientation; /* Set the number of ISMs */ - IF( EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { nchan_ism_internal = st_ivas->nchan_ism; move16(); @@ -195,7 +203,7 @@ ivas_error ivas_td_binaural_renderer_sf_fx( ch_offset = 2; move16(); } - ELSE IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { nchan_ism_internal = st_ivas->nchan_ism; move16(); @@ -224,7 +232,7 @@ ivas_error ivas_td_binaural_renderer_sf_fx( ism_md_subframe_update_jbm = sub( st_ivas->hTcBuffer->nb_subframes, 2 ); } - IF( EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { ism_md_subframe_update_jbm = s_max( 0, sub( st_ivas->hTcBuffer->nb_subframes, 2 ) ); } @@ -248,6 +256,7 @@ ivas_error ivas_td_binaural_renderer_sf_fx( /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ tmp = 0; + move16(); IF( n_samples_granularity != 0 ) { tmp = idiv1616( n_samples_granularity, slot_size ); @@ -258,6 +267,7 @@ ivas_error ivas_td_binaural_renderer_sf_fx( last_sf = first_sf; move16(); st_ivas->hTcBuffer->slots_rendered = add( st_ivas->hTcBuffer->slots_rendered, slots_to_render ); + move16(); WHILE( slots_to_render > 0 ) { @@ -275,7 +285,8 @@ ivas_error ivas_td_binaural_renderer_sf_fx( FOR( nS = 0; nS < nchan_ism; nS++ ) { - IF( !( EQ_16( st_ivas->ivas_format, MC_FORMAT ) && EQ_16( nS, LFE_CHANNEL ) ) ) /* Skip LFE for MC */ + test(); + IF( !( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_16( nS, LFE_CHANNEL ) ) ) /* Skip LFE for MC */ { st_ivas->hBinRendererTd->Sources[c_indx]->InputFrame_p_fx = tc_local_fx[nS]; /* Q11 */ st_ivas->hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; @@ -298,6 +309,7 @@ ivas_error ivas_td_binaural_renderer_sf_fx( tmp_Quaternion_fx = &st_ivas->hCombinedOrientationData->Quaternions[st_ivas->hCombinedOrientationData->subframe_idx]; tmp_vector_fx = &st_ivas->hCombinedOrientationData->listenerPos[st_ivas->hCombinedOrientationData->subframe_idx]; enableCombinedOrientation = st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx]; + move16(); /* Shifting x_fx, y_fx, z_fx to the same Q-factor as Listener_p->Pos_q (usually Q25) */ Word16 pos_q = st_ivas->hBinRendererTd->Listener_p->Pos_q; @@ -306,6 +318,7 @@ ivas_error ivas_td_binaural_renderer_sf_fx( tmp_vector_fx->y_fx = L_shr( tmp_vector_fx->y_fx, sub( tmp_vector_fx->q_fact, pos_q ) ); tmp_vector_fx->z_fx = L_shr( tmp_vector_fx->z_fx, sub( tmp_vector_fx->q_fact, pos_q ) ); tmp_vector_fx->q_fact = pos_q; + move16(); } ELSE { @@ -315,17 +328,19 @@ ivas_error ivas_td_binaural_renderer_sf_fx( move16(); } - IF( ( error = TDREND_Update_listener_orientation_fx( st_ivas->hBinRendererTd, - enableCombinedOrientation, - tmp_Quaternion_fx, - tmp_vector_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_Update_listener_orientation_fx( st_ivas->hBinRendererTd, + enableCombinedOrientation, + tmp_Quaternion_fx, + tmp_vector_fx ) ), + IVAS_ERR_OK ) ) { return error; } - IF( st_ivas->hRenderConfig != NULL && st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + test(); + IF( st_ivas->hRenderConfig != NULL && EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { - IF( ( error = ivas_reverb_process_fx( st_ivas->hReverb, st_ivas->transport_config, 0, tc_local_fx, p_reverb_signal_fx, 0 ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_reverb_process_fx( st_ivas->hReverb, st_ivas->transport_config, 0, tc_local_fx, p_reverb_signal_fx, 0 ) ), IVAS_ERR_OK ) ) { return error; } @@ -334,12 +349,13 @@ ivas_error ivas_td_binaural_renderer_sf_fx( /* Render subframe */ /* ism_md_subframe_update_jbm != subframe_idx: trigger update only for ism_md_subframe_update_jbm == subframe_idx, where then the two TDREND_GetMix()-arguments subframe_idx and ism_md_subframe_update are equal, and we want to enforce the update inside TDREND_GetMix to use subframe_idx == 0 */ - IF( ( error = TDREND_GetMix_fx( st_ivas->hBinRendererTd, output_fx_local, output_frame, 0, ism_md_subframe_update_jbm != subframe_idx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_GetMix_fx( st_ivas->hBinRendererTd, output_fx_local, output_frame, 0, ism_md_subframe_update_jbm != subframe_idx ) ), IVAS_ERR_OK ) ) { return error; } - IF( st_ivas->hRenderConfig != NULL && st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + test(); + IF( st_ivas->hRenderConfig != NULL && EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { /* add reverb to rendered signals */ v_add_32( reverb_signal_fx[0], output_fx_local[0], output_fx_local[0], output_frame ); diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 01a1e4554..f376e8d7e 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -147,11 +147,13 @@ ivas_error ivas_omasa_data_open_fx( } hMasaIsmData->objectsMoved = 0; + move16(); hMasaIsmData->delayBuffer_fx = NULL; FOR( ch = 0; ch < MAX_NUM_OBJECTS; ch++ ) { hMasaIsmData->ism_is_edited[ch] = 0; + move16(); hMasaIsmData->q_elevation_old_fx[ch] = 0; move32(); hMasaIsmData->q_azimuth_old_fx[ch] = 0; @@ -302,6 +304,7 @@ ivas_error ivas_omasa_dec_config_fx( *-----------------------------------------------------------------*/ old_renderer_type = st_ivas->renderer_type; + move32(); /* MASA reconfig. */ cpe_brate = calculate_cpe_brate_MASA_ISM_fx( st_ivas->ism_mode, ivas_total_brate, st_ivas->nchan_ism ); @@ -309,14 +312,14 @@ ivas_error ivas_omasa_dec_config_fx( test(); test(); test(); - IF( st_ivas->ini_active_frame == 0 && NE_32( ivas_total_brate, FRAME_NO_DATA ) && LT_32( cpe_brate, MASA_STEREO_MIN_BITRATE ) && EQ_16( st_ivas->nCPE, 1 ) ) + IF( ( st_ivas->ini_active_frame == 0 ) && ( ivas_total_brate != FRAME_NO_DATA ) && LT_32( cpe_brate, MASA_STEREO_MIN_BITRATE ) && EQ_16( st_ivas->nCPE, 1 ) ) { st_ivas->hCPE[0]->nchan_out = 1; move16(); } ELSE { - IF( ( error = ivas_masa_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_masa_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) { return error; } @@ -335,9 +338,9 @@ ivas_error ivas_omasa_dec_config_fx( /* OMASA reconfig. */ test(); - IF( st_ivas->hMasaIsmData == NULL && EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + IF( st_ivas->hMasaIsmData == NULL && EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { - IF( ( error = ivas_omasa_data_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_omasa_data_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -346,7 +349,7 @@ ivas_error ivas_omasa_dec_config_fx( ivas_set_omasa_TC_fx( st_ivas->ism_mode, st_ivas->nchan_ism, &st_ivas->nSCE, &st_ivas->nCPE ); /* re-configure hp20 memories */ - IF( ( error = ivas_hp20_dec_reconfig_fx( st_ivas, nchan_hp20_old ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_hp20_dec_reconfig_fx( st_ivas, nchan_hp20_old ) ), IVAS_ERR_OK ) ) { return error; } @@ -361,28 +364,22 @@ ivas_error ivas_omasa_dec_config_fx( FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) { - ism_total_brate = L_add( ism_total_brate, sep_object_brate[k - 2][st_ivas->nSCE - 1] ); + ism_total_brate = L_add( ism_total_brate, sep_object_brate[sub( k, 2 )][sub( st_ivas->nSCE, 1 )] ); } brate_SCE = 0; move32(); - IF( GT_16( st_ivas->nSCE, 0 ) ) + IF( st_ivas->nSCE > 0 ) { - brate_SCE = sep_object_brate[k - 2][st_ivas->nSCE - 1]; + brate_SCE = sep_object_brate[sub( k, 2 )][sub( st_ivas->nSCE, 1 )]; move32(); } brate_CPE = L_sub( ivas_total_brate, ism_total_brate ); -#ifdef IVAS_FLOAT_FIXED - IF( ( error = ivas_corecoder_dec_reconfig_fx( st_ivas, nSCE_old, 1, 2, 0, brate_SCE, brate_CPE ) ) != IVAS_ERR_OK ) - { - return error; - } -#else - IF( ( error = ivas_corecoder_dec_reconfig( st_ivas, nSCE_old, 1, 2, 0, brate_SCE, brate_CPE ) ) != IVAS_ERR_OK ) + + IF( NE_32( ( error = ivas_corecoder_dec_reconfig_fx( st_ivas, nSCE_old, 1, 2, 0, brate_SCE, brate_CPE ) ), IVAS_ERR_OK ) ) { return error; } -#endif IF( NE_16( ism_mode_old, st_ivas->ism_mode ) ) { @@ -391,27 +388,27 @@ ivas_error ivas_omasa_dec_config_fx( move16(); test(); - IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) { n_MD = 1; move16(); IF( st_ivas->hIsmMetaData[0] == NULL ) { - IF( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, 1, NULL ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, 1, NULL ) ), IVAS_ERR_OK ) ) { return error; } } } - ELSE IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { n_MD = st_ivas->nchan_ism; move16(); ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); - IF( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, NULL ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, NULL ) ), IVAS_ERR_OK ) ) { return error; } @@ -433,9 +430,9 @@ ivas_error ivas_omasa_dec_config_fx( IF( NE_16( old_renderer_type, st_ivas->renderer_type ) ) { - IF( EQ_16( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) ) + IF( EQ_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) ) { - IF( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -452,16 +449,16 @@ ivas_error ivas_omasa_dec_config_fx( ivas_omasa_separate_object_renderer_close( st_ivas ); } - IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) ) + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) ) { - IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { /* Allocate TD renderer for the objects in DISC mode */ #ifdef FIX_1033_MEMORY_LEAK_OMASA IF( st_ivas->hBinRendererTd == NULL ) { #endif - IF( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, num_src ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, num_src ) ), IVAS_ERR_OK ) ) { return error; } @@ -470,7 +467,7 @@ ivas_error ivas_omasa_dec_config_fx( #endif /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ - IF( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -479,7 +476,8 @@ ivas_error ivas_omasa_dec_config_fx( { /* TD renderer handle */ #ifdef FIX_1033_MEMORY_LEAK_OMASA - IF( st_ivas->hBinRendererTd != NULL && st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) + test(); + IF( st_ivas->hBinRendererTd != NULL && EQ_16( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM, TRUE ) ) { #endif ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); @@ -494,17 +492,19 @@ ivas_error ivas_omasa_dec_config_fx( } } - IF( st_ivas->renderer_type == RENDERER_DIRAC ) + IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) { - IF( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ), IVAS_ERR_OK ) ) { return error; } - IF( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + test(); + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ - IF( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -522,7 +522,7 @@ ivas_error ivas_omasa_dec_config_fx( IF( st_ivas->hDiracDecBin != NULL ) { - IF( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ), IVAS_ERR_OK ) ) { return error; @@ -533,7 +533,7 @@ ivas_error ivas_omasa_dec_config_fx( * CLDFB instances *-----------------------------------------------------------------*/ - IF( ( error = ivas_cldfb_dec_reconfig_fx( st_ivas, 2, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_cldfb_dec_reconfig_fx( st_ivas, 2, numCldfbAnalyses_old, numCldfbSyntheses_old ) ), IVAS_ERR_OK ) ) { return error; } @@ -543,12 +543,12 @@ ivas_error ivas_omasa_dec_config_fx( *-----------------------------------------------------------------*/ nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 ); - IF( ( error = ivas_output_buff_dec_fx( st_ivas->p_output_fx, nchan_out_buff_old, nchan_out_buff ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_output_buff_dec_fx( st_ivas->p_output_fx, nchan_out_buff_old, nchan_out_buff ) ), IVAS_ERR_OK ) ) { return error; } #ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED - IF( ( error = ivas_output_buff_dec( st_ivas->p_output_f, nchan_out_buff_old, nchan_out_buff ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_output_buff_dec( st_ivas->p_output_f, nchan_out_buff_old, nchan_out_buff ) ), IVAS_ERR_OK ) ) { return error; } @@ -919,6 +919,7 @@ void ivas_set_surplus_brate_dec( move32(); st_ivas->hCPE[0]->brate_surplus = L_sub( st_ivas->hSCE[0]->element_brate, *ism_total_brate ); + move32(); /* set 'st->total_brate'; there are no meta-data in ISM_MASA_MODE_PARAM_ONE_OBJ mode */ st_ivas->hSCE[0]->hCoreCoder[0]->total_brate = *ism_total_brate; @@ -926,7 +927,7 @@ void ivas_set_surplus_brate_dec( st_ivas->hSCE[0]->hCoreCoder[0]->low_rate_mode = 0; move16(); - IF( EQ_16( st_ivas->hIsmMetaData[0]->ism_imp, ISM_NO_META ) ) + if ( EQ_16( st_ivas->hIsmMetaData[0]->ism_imp, ISM_NO_META ) ) { st_ivas->hSCE[0]->hCoreCoder[0]->low_rate_mode = 1; move16(); @@ -961,7 +962,7 @@ void ivas_set_surplus_brate_dec( tmp = idiv1616( bits_ism, st_ivas->nchan_ism ); } set16_fx( bits_element, tmp, st_ivas->nchan_ism ); - bits_element[st_ivas->nchan_ism - 1] = add( bits_element[st_ivas->nchan_ism - 1], bits_ism % st_ivas->nchan_ism ); + bits_element[sub( st_ivas->nchan_ism, 1 )] = add( bits_element[sub( st_ivas->nchan_ism, 1 )], bits_ism % st_ivas->nchan_ism ); move16(); bitbudget_to_brate( bits_element, element_brate, st_ivas->nchan_ism ); @@ -980,16 +981,20 @@ void ivas_set_surplus_brate_dec( IF( GT_16( ism_imp[n], 1 ) && EQ_16( st_ivas->flag_omasa_brate, 1 ) && brate_limit_flag >= 0 ) { *ism_total_brate = L_sub( *ism_total_brate, ADJUST_ISM_BRATE_NEG ); + move32(); } + test(); test(); test(); IF( EQ_16( brate_limit_flag, -1 ) && GE_16( ism_imp[n], 1 ) && GE_16( st_ivas->nchan_ism, 3 ) && GT_32( L_sub( ism_total_brate_ref, *ism_total_brate ), IVAS_48k ) ) { *ism_total_brate = L_add( *ism_total_brate, ADJUST_ISM_BRATE_POS ); + move32(); } } st_ivas->hCPE[0]->brate_surplus = L_sub( ism_total_brate_ref, *ism_total_brate ); + move32(); /* 'st->total_brate' is set in ivas_ism_config */ } @@ -1124,8 +1129,9 @@ ivas_error ivas_omasa_ism_metadata_dec_fx( IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) { /* decode ISM metadata */ - IF( ( error = ivas_ism_metadata_dec_fx( ism_total_brate, *nchan_ism, nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, - nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt, st_ivas->hSCE[0]->hCoreCoder[0] ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_ism_metadata_dec_fx( ism_total_brate, *nchan_ism, nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, + nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt, st_ivas->hSCE[0]->hCoreCoder[0] ) ), + IVAS_ERR_OK ) ) { return error; } @@ -1138,8 +1144,16 @@ ivas_error ivas_omasa_ism_metadata_dec_fx( { // azimuth_ism = (int16_t) ( st_ivas->hIsmMetaData[n]->azimuth + 0.5f ); // elevation_ism = (int16_t) ( st_ivas->hIsmMetaData[n]->elevation + 0.5f ); - azimuth_ism = extract_l( L_shr( L_add( st_ivas->hIsmMetaData[n]->azimuth_fx, ONE_IN_Q21 ), 21 ) / 2 ); // using "/ 2" here because it rounds towards 0, whereas L_shr rounds towards -inf - elevation_ism = extract_l( L_shr( L_add( st_ivas->hIsmMetaData[n]->elevation_fx, ONE_IN_Q21 ), 21 ) / 2 ); + azimuth_ism = extract_l( L_shr_r( L_abs( st_ivas->hIsmMetaData[n]->azimuth_fx ), 22 ) ); + if ( st_ivas->hIsmMetaData[n]->azimuth_fx < 0 ) + { + azimuth_ism = negate( azimuth_ism ); + } + elevation_ism = extract_l( L_shr_r( L_abs( st_ivas->hIsmMetaData[n]->elevation_fx ), 22 ) ); + if ( st_ivas->hIsmMetaData[n]->elevation_fx < 0 ) + { + elevation_ism = negate( elevation_ism ); + } FOR( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) { @@ -1154,8 +1168,16 @@ ivas_error ivas_omasa_ism_metadata_dec_fx( } ELSE /* ISM_MASA_MODE_MASA_ONE_OBJ */ { - azimuth_ism = extract_l( L_shr( L_add( st_ivas->hIsmMetaData[0]->azimuth_fx, ONE_IN_Q21 ), 21 ) / 2 ); // using "/ 2" here because it rounds towards 0, whereas L_shr rounds towards -inf - elevation_ism = extract_l( L_shr( L_add( st_ivas->hIsmMetaData[0]->elevation_fx, ONE_IN_Q21 ), 21 ) / 2 ); + azimuth_ism = extract_l( L_shr_r( L_abs( st_ivas->hIsmMetaData[0]->azimuth_fx ), 22 ) ); + if ( st_ivas->hIsmMetaData[0]->azimuth_fx < 0 ) + { + azimuth_ism = negate( azimuth_ism ); + } + elevation_ism = extract_l( L_shr_r( L_abs( st_ivas->hIsmMetaData[0]->elevation_fx ), 22 ) ); + if ( st_ivas->hIsmMetaData[0]->elevation_fx < 0 ) + { + elevation_ism = negate( elevation_ism ); + } FOR( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) { @@ -1237,6 +1259,7 @@ void ivas_omasa_dirac_rend_jbm_fx( Word16 n; Word32 data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k]; + test(); IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) { Copy32( output_f[CPE_CHANNELS], data_separated_objects[0], nSamplesAsked ); @@ -1371,7 +1394,7 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm_fx( } /* Delay the object signals to match the CLDFB delay. Delay the whole buffer with the first rendering call of the stretched buffer. */ - IF( EQ_16( st_ivas->hSpatParamRendCom->slots_rendered, 0 ) ) + IF( st_ivas->hSpatParamRendCom->slots_rendered == 0 ) { Word16 tcBufferSize; @@ -1391,7 +1414,7 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm_fx( /* reset combined orientation access index before calling the td renderer */ ivas_combined_orientation_set_to_start_index( st_ivas->hCombinedOrientationData ); - IF( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_sepobj_fx, q_factor, *nSamplesRendered ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_sepobj_fx, q_factor, *nSamplesRendered ) ), IVAS_ERR_OK ) ) { return error; } @@ -1411,6 +1434,7 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm_fx( * in case of external rendering, rearrange the channels order *--------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ivas_omasa_rearrange_channels( float *output[], /* o : output synthesis signal */ const int16_t nchan_transport_ism, /* o : number of ISM TCs */ @@ -1432,8 +1456,7 @@ void ivas_omasa_rearrange_channels( return; } - -#ifdef IVAS_FLOAT_FIXED +#else void ivas_omasa_rearrange_channels_fx( Word32 *output[], /* o : output synthesis signal */ const Word16 nchan_transport_ism, /* o : number of ISM TCs */ @@ -1451,7 +1474,7 @@ void ivas_omasa_rearrange_channels_fx( Copy32( output[CPE_CHANNELS + n], output[n], output_frame ); } Copy32( tmp_buff[0], output[n], output_frame ); - Copy32( tmp_buff[1], output[n + 1], output_frame ); + Copy32( tmp_buff[1], output[add( n, 1 )], output_frame ); return; } diff --git a/lib_dec/ivas_osba_dec.c b/lib_dec/ivas_osba_dec.c index fff163ccd..47d3ee5ec 100644 --- a/lib_dec/ivas_osba_dec.c +++ b/lib_dec/ivas_osba_dec.c @@ -42,8 +42,6 @@ #ifdef IVAS_FLOAT_FIXED #include "prot_fx1.h" #include "prot_fx2.h" -#include "math.h" // temporary (for fabs) -#define IVAS_FLOAT_FIXED_TO_BE_REMOVED #endif // IVAS_FLOAT_FIXED @@ -93,24 +91,26 @@ ivas_error ivas_osba_data_open_fx( ) { SBA_ISM_DATA_HANDLE hSbaIsmData; - int16_t i; + Word16 i; - if ( ( hSbaIsmData = (SBA_ISM_DATA_HANDLE) malloc( sizeof( SBA_ISM_DATA ) ) ) == NULL ) + IF( ( hSbaIsmData = (SBA_ISM_DATA_HANDLE) malloc( sizeof( SBA_ISM_DATA ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OSBA data\n" ) ); } hSbaIsmData->delayBuffer_nchan = st_ivas->nchan_ism; - hSbaIsmData->delayBuffer_size = (int16_t) ( ( st_ivas->hDecoderConfig->output_Fs / 50 ) / MAX_PARAM_SPATIAL_SUBFRAMES ); + move16(); + hSbaIsmData->delayBuffer_size = shr( div_l( st_ivas->hDecoderConfig->output_Fs, 50 / 2 ), 2 /* / MAX_PARAM_SPATIAL_SUBFRAMES*/ ); + move16(); - if ( ( hSbaIsmData->delayBuffer_fx = (Word32 **) malloc( hSbaIsmData->delayBuffer_nchan * sizeof( Word32 * ) ) ) == NULL ) + IF( ( hSbaIsmData->delayBuffer_fx = (Word32 **) malloc( hSbaIsmData->delayBuffer_nchan * sizeof( Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for OSBA delay buffer \n" ) ); } - for ( i = 0; i < hSbaIsmData->delayBuffer_nchan; i++ ) + FOR( i = 0; i < hSbaIsmData->delayBuffer_nchan; i++ ) { - if ( ( hSbaIsmData->delayBuffer_fx[i] = (Word32 *) malloc( hSbaIsmData->delayBuffer_size * sizeof( Word32 ) ) ) == NULL ) + IF( ( hSbaIsmData->delayBuffer_fx[i] = (Word32 *) malloc( hSbaIsmData->delayBuffer_size * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for OSBA delay buffer \n" ) ); } @@ -162,16 +162,17 @@ void ivas_osba_data_close_fx( SBA_ISM_DATA_HANDLE *hSbaIsmData /* i/o: OSBA rendering handle */ ) { - int16_t i; + Word16 i; - if ( hSbaIsmData == NULL || *hSbaIsmData == NULL ) + test(); + IF( hSbaIsmData == NULL || *hSbaIsmData == NULL ) { return; } - if ( ( *hSbaIsmData )->delayBuffer_fx != NULL ) + IF( ( *hSbaIsmData )->delayBuffer_fx != NULL ) { - for ( i = 0; i < ( *hSbaIsmData )->delayBuffer_nchan; i++ ) + FOR( i = 0; i < ( *hSbaIsmData )->delayBuffer_nchan; i++ ) { free( ( *hSbaIsmData )->delayBuffer_fx[i] ); } @@ -208,7 +209,7 @@ ivas_error ivas_osba_dirac_td_binaural_jbm_fx( ivas_error error; Word32 output_separated_objects_fx[BINAURAL_CHANNELS][L_FRAME48k]; // VE2SB: TBV Word32 *p_sepobj_fx[BINAURAL_CHANNELS]; - int16_t channel_offset; + Word16 channel_offset; FOR( n = 0; n < BINAURAL_CHANNELS; n++ ) { @@ -218,12 +219,12 @@ ivas_error ivas_osba_dirac_td_binaural_jbm_fx( channel_offset = st_ivas->nchan_ism; move16(); - IF( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailable, &output_fx[channel_offset], out_len ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailable, &output_fx[channel_offset], out_len ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_sepobj_fx, q_factor, *nSamplesRendered ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_sepobj_fx, q_factor, *nSamplesRendered ) ), IVAS_ERR_OK ) ) { return error; } @@ -233,7 +234,8 @@ ivas_error ivas_osba_dirac_td_binaural_jbm_fx( Word16 i; FOR( i = 0; i < nSamplesAsked; i++ ) { - output_fx[n][i] = L_add( L_shr( output_fx[channel_offset + n][i], 1 ), L_shr( p_sepobj_fx[n][i], 1 ) ); + output_fx[n][i] = L_add( L_shr( output_fx[add( channel_offset, n )][i], 1 ), L_shr( p_sepobj_fx[n][i], 1 ) ); + move32(); } } return IVAS_ERR_OK; @@ -302,11 +304,14 @@ ivas_error ivas_osba_ism_metadata_dec_fx( /* set ISM parameters */ nchan_transport_ism = st_ivas->nchan_ism; + move16(); *nchan_ism = st_ivas->nchan_ism; + move16(); /* decode ISM metadata */ - IF( ( error = ivas_ism_metadata_dec_fx( ism_total_brate, *nchan_ism, &nchan_transport_ism, st_ivas->hIsmMetaData, NULL, st_ivas->bfi, - nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt, st_ivas->hCPE[0]->hCoreCoder[0] ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_ism_metadata_dec_fx( ism_total_brate, *nchan_ism, &nchan_transport_ism, st_ivas->hIsmMetaData, NULL, st_ivas->bfi, + nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt, st_ivas->hCPE[0]->hCoreCoder[0] ) ), + IVAS_ERR_OK ) ) { return error; } @@ -367,22 +372,22 @@ ivas_error ivas_osba_render_sf_fx( FOR( n = 0; n < st_ivas->nchan_ism; n++ ) { - v_shr( p_output[n], sub( Q11, Q11 ), output_ism[n], nSamplesAsked ); + v_shr( p_output[n], Q11 - Q11, output_ism[n], nSamplesAsked ); } - IF( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailableNext, p_output, 960 ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailableNext, p_output, 960 ) ), IVAS_ERR_OK ) ) { return error; } - IF( st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV_ROOM ) + IF( NE_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { ivas_ism_render_sf_fx( st_ivas, p_output_ism, *nSamplesRendered ); } FOR( n = 0; n < st_ivas->hDecoderConfig->nchan_out; n++ ) { - IF( st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV_ROOM ) + IF( NE_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { v_add_fixed( p_output[n], p_output_ism[n], p_output[n], *nSamplesRendered, 1 ); // takes care of downscaling by 0.5f } diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 2e34c3508..9b9d1b402 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -176,18 +176,22 @@ void ivas_renderer_select( IF( EQ_16( nchan_internal, 2 ) ) { st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; + move16(); } ELSE IF( EQ_16( nchan_internal, 4 ) || EQ_16( nchan_internal, 3 ) ) { st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; + move16(); } ELSE IF( EQ_16( nchan_internal, 6 ) || EQ_16( nchan_internal, 5 ) ) { st_ivas->hCombinedOrientationData->shd_rot_max_order = 2; + move16(); } ELSE IF( EQ_16( nchan_internal, 8 ) || EQ_16( nchan_internal, 7 ) ) { st_ivas->hCombinedOrientationData->shd_rot_max_order = 3; + move16(); } } } @@ -357,7 +361,17 @@ void ivas_renderer_select( IVAS_FORMAT ivas_format; *renderer_type = RENDERER_DIRAC; move16(); - ivas_format = ( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_NONE ) ) ? SBA_FORMAT : st_ivas->ivas_format; /* treat ISM_SBA_MODE_NONE just like SBA_FORMAT */ + + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_NONE ) ) + { + ivas_format = SBA_FORMAT; /* treat ISM_SBA_MODE_NONE just like SBA_FORMAT */ + } + ELSE + { + ivas_format = st_ivas->ivas_format; + } + move16(); test(); test(); @@ -410,6 +424,7 @@ void ivas_renderer_select( move16(); } st_ivas->renderer_type = RENDERER_SBA_LINEAR_DEC; + move16(); } ELSE IF( ( EQ_32( ivas_format, MASA_FORMAT ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_MONO ) && EQ_16( st_ivas->nchan_transport, 1 ) ) || ( EQ_32( ivas_format, SBA_FORMAT ) && ( EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_MONO ) ) ) ) @@ -487,6 +502,7 @@ void ivas_renderer_select( ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) { *internal_config = transport_config; + move16(); test(); IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) && NE_32( *internal_config, output_config ) ) { @@ -506,6 +522,7 @@ void ivas_renderer_select( ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) { *internal_config = transport_config; + move16(); IF( NE_32( *internal_config, output_config ) ) { test(); diff --git a/lib_dec/jbm_jb4sb.c b/lib_dec/jbm_jb4sb.c index fb4a65206..095868940 100644 --- a/lib_dec/jbm_jb4sb.c +++ b/lib_dec/jbm_jb4sb.c @@ -1432,7 +1432,7 @@ static void JB4_popFromBuffer( test(); IF( !tempDataUnit->partial_frame && !h->lastPoppedWasSilence ) { - frameoffset = Mult_32_32( JB4_rtpTimeStampDiff( h->nextExpectedTs, tempDataUnit->timeStamp ), INV_20_Q31 ); + frameoffset = extract_l( Mult_32_32( JB4_rtpTimeStampDiff( h->nextExpectedTs, tempDataUnit->timeStamp ), INV_20_Q31 ) ); test(); IF( frameoffset > 0 && LT_16( frameoffset, MAXOFFSET ) ) { @@ -1509,7 +1509,7 @@ static void JB4_popFromBuffer( test(); IF( !tempDataUnit->partial_frame && !h->lastPoppedWasSilence ) { - frameoffset = Mult_32_32( JB4_rtpTimeStampDiff( h->nextExpectedTs, tempDataUnit->timeStamp ), INV_20_Q31 ); + frameoffset = extract_l( Mult_32_32( JB4_rtpTimeStampDiff( h->nextExpectedTs, tempDataUnit->timeStamp ), INV_20_Q31 ) ); test(); IF( ( frameoffset > 0 ) && LT_16( frameoffset, MAXOFFSET ) ) { diff --git a/lib_dec/rst_dec_fx.c b/lib_dec/rst_dec_fx.c index ad750273b..a4810115b 100644 --- a/lib_dec/rst_dec_fx.c +++ b/lib_dec/rst_dec_fx.c @@ -28,6 +28,7 @@ void CNG_reset_dec_fx( /*set16_fx( st_fx->dispMem_fx, 0, 8 );*/ set16_fx( st_fx->dm_fx.prev_gain_pit, 0, 6 ); st_fx->dm_fx.prev_gain_code = L_deposit_l( 0 ); + move32(); st_fx->dm_fx.prev_state = 0; move16(); @@ -66,6 +67,7 @@ void CNG_reset_dec_fx( #else st_fx->lp_gainc_fx = round_fx( L_shl( L_tmp, sub( exp, 12 ) ) ); /* In Q3 */ #endif + move16(); } /* reset the pitch buffer in case of FRAME_NO_DATA or SID frames */ IF( EQ_16( st_fx->L_frame, L_FRAME ) ) @@ -86,8 +88,8 @@ void CNG_reset_dec_fx( if ( st_fx->hTdCngDec != NULL ) { st_fx->hTdCngDec->act_cnt2 = 0; + move16(); } - move16(); return; } diff --git a/lib_dec/stat_noise_uv_dec_fx.c b/lib_dec/stat_noise_uv_dec_fx.c index 39b56fa7f..b3c6998b6 100644 --- a/lib_dec/stat_noise_uv_dec_fx.c +++ b/lib_dec/stat_noise_uv_dec_fx.c @@ -14,18 +14,19 @@ * Modifies excitation signal in UC mode when the noise is stationary *---------------------------------------------------------*/ void stat_noise_uv_dec_fx( - Decoder_State *st_fx, /* i/o: Decoder static memory */ - Word16 *lsp_new, /* i : end-frame LSP vector */ - Word16 *lsp_mid, /* i : mid-frame LSP vector */ - Word16 *Aq, /* o : A(z) quantized for the 4 subframes */ - Word16 *exc2 /* i/o: excitation buffer */ - , + Decoder_State *st_fx, /* i/o: Decoder static memory */ + Word16 *lsp_new, /* i : end-frame LSP vector */ + Word16 *lsp_mid, /* i : mid-frame LSP vector */ + Word16 *Aq, /* o : A(z) quantized for the 4 subframes */ + Word16 *exc2, /* i/o: excitation buffer */ const Word16 uc_two_stage_flag /* i : flag indicating two-stage UC */ ) { Word16 noisiness = 0, i; + move16(); Word32 L_tmp; Word16 coder_type = st_fx->coder_type; + move16(); /*-----------------------------------------------------------------* @@ -33,18 +34,18 @@ void stat_noise_uv_dec_fx( *-----------------------------------------------------------------*/ test(); test(); - IF( ( EQ_16( coder_type, UNVOICED ) && !uc_two_stage_flag ) || ( EQ_16( coder_type, INACTIVE ) && LE_32( st_fx->core_brate, ACELP_9k60 ) ) ) + test(); + IF( ( EQ_16( coder_type, UNVOICED ) && !uc_two_stage_flag ) || ( coder_type == INACTIVE && LE_32( st_fx->core_brate, ACELP_9k60 ) ) ) { /* read the noisiness parameter */ noisiness = (Word16) get_next_indice( st_fx, 5 ); - move16(); } /*-----------------------------------------------------------------* * Update long-term energies for FEC * Update LSP vector for CNG *-----------------------------------------------------------------*/ - IF( EQ_16( coder_type, INACTIVE ) ) + IF( coder_type == INACTIVE ) { IF( GT_16( st_fx->unv_cnt, 20 ) ) { @@ -52,8 +53,8 @@ void stat_noise_uv_dec_fx( L_tmp = L_mult0( st_fx->lp_gainc_fx, st_fx->lp_gainc_fx ); /*Q3 * Q3 ->Q6*/ /*st->lp_ener = 0.7f * st->lp_ener + 0.3f * ftmp;*/ L_tmp = Mult_32_16( L_tmp, 9830 ); - st_fx->lp_ener_fx = L_add( Mult_32_16( st_fx->lp_ener_fx, 22938 ), L_tmp ); - move16(); /*Q6 + Q6*/ + st_fx->lp_ener_fx = L_add( Mult_32_16( st_fx->lp_ener_fx, 22938 ), L_tmp ); /*Q6 + Q6*/ + move32(); FOR( i = 0; i < M; i++ ) /* AR Low pass filter */ { @@ -66,6 +67,7 @@ void stat_noise_uv_dec_fx( ELSE { st_fx->unv_cnt = add( st_fx->unv_cnt, 1 ); + move16(); } } ELSE diff --git a/lib_dec/swb_bwe_dec.c b/lib_dec/swb_bwe_dec.c index bcee86982..f2b096d72 100644 --- a/lib_dec/swb_bwe_dec.c +++ b/lib_dec/swb_bwe_dec.c @@ -239,6 +239,7 @@ static Word16 para_pred_bws_fx( Word32 avrg1_fx, avrg2_fx, min_fx; Word16 att_fx; Word16 coder_type = st_fx->coder_type; + move16(); mode = NORMAL; move16(); @@ -246,7 +247,6 @@ static Word16 para_pred_bws_fx( k = 0; move16(); input_hi_fx = &signal_wb_fx[SHARP_WIDTH]; - move16(); FOR( i = 0; i < 7; i++ ) { peak_fx = 0; @@ -266,7 +266,7 @@ static Word16 para_pred_bws_fx( input_hi_fx++; } - IF( Q_syn < 11 ) + IF( LT_16( Q_syn, 11 ) ) { tmp = 1; move16(); @@ -343,6 +343,7 @@ static Word16 para_pred_bws_fx( IF( GT_16( st_fx->tilt_wb_fx, 30720 ) ) { min_fx = peak_32_fx; + move32(); } ELSE { @@ -380,34 +381,30 @@ static Word16 para_pred_bws_fx( j = 0; move16(); mea = &mean_fx[4]; - move16(); L_tmp_max = L_shl( 32767, add( Q_syn, 5 ) ); FOR( i = 0; i < SWB_FENV; i++ ) { - IF( j == 5 ) + if ( EQ_16( j, 5 ) ) { mea++; - move16(); j = 0; move16(); } - j++; - move16(); + j = add( j, 1 ); L_tmp = L_min( Mult_32_16( *mea, tmp ), L_tmp_max ); SWB_fenv_fx[i] = extract_l( L_shr( L_tmp, add( Q_syn, 5 ) ) ); + move16(); } } j = 0; move16(); - FOR( i = shr( SWB_FENV, 1 ); i < SWB_FENV; i++ ) + FOR( i = SWB_FENV / 2; i < SWB_FENV; i++ ) { tmp = sub( 32767, i_mult( j, 2341 ) ); - move16(); SWB_fenv_fx[i] = mult_r( SWB_fenv_fx[i], tmp ); move16(); - j++; - move16(); + j = add( j, 1 ); } IF( GT_32( avrg1_fx, L_shl( avrg2_fx, 3 ) ) ) @@ -435,11 +432,13 @@ static Word16 para_pred_bws_fx( { /*SWB_fenv_fx[i] = add(mult_r(SWB_fenv_fx[i], 3277), mult_r(st_fx->prev_SWB_fenv_fx[i], 29491)); */ SWB_fenv_fx[i] = round_fx( L_mac( L_mult( SWB_fenv_fx[i], 3277 ), st_fx->prev_SWB_fenv_fx[i], 29491 ) ); + move16(); } ELSE { /*SWB_fenv_fx[i] = add(mult_r(SWB_fenv_fx[i], st_fx->attenu_fx), mult_r(st_fx->prev_SWB_fenv_fx[i], sub(32767, st_fx->attenu_fx))); */ SWB_fenv_fx[i] = round_fx( L_mac( L_mult( SWB_fenv_fx[i], st_fx->attenu_fx ), st_fx->prev_SWB_fenv_fx[i], sub( 32767, st_fx->attenu_fx ) ) ); + move16(); } } @@ -472,6 +471,7 @@ static Word16 para_pred_bws_fx( { /*SWB_fenv_fx[i] = add(mult_r(SWB_fenv_fx[i], 29491), mult_r(st_fx->prev_SWB_fenv_fx[i], 3277)); */ SWB_fenv_fx[i] = round_fx( L_mac( L_mult( SWB_fenv_fx[i], 29491 ), st_fx->prev_SWB_fenv_fx[i], 3277 ) ); + move16(); } st_fx->attenu_fx = 3277; move16(); @@ -484,8 +484,7 @@ static Word16 para_pred_bws_fx( } - att_fx = i_mult( sub( N_WS2N_FRAMES, st_fx->bws_cnt ), 819 ); - move16(); /*15 */ + att_fx = i_mult( sub( N_WS2N_FRAMES, st_fx->bws_cnt ), 819 ); /*15 */ IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) { FOR( i = 0; i < 4; i++ ) @@ -1072,8 +1071,10 @@ Word16 swb_bwe_dec_fx32( Word16 i, j, l_subfr; Word16 fb_band_begin; Word16 frica_flag = 0; + move16(); Word16 ener_adjust_quan_fx; Word16 fb_ener_adjust_fx = 0; + move16(); Word16 scl, new_input_fx_exp, ysynth_frame_size; Word16 Q_syn, Q_syn_hb, tmp, tmp2, q_tmp, Qsynth_fx16; @@ -1095,7 +1096,7 @@ Word16 swb_bwe_dec_fx32( /*---------------------------------------------------------------------* * SWB BWE decoding *---------------------------------------------------------------------*/ - + test(); IF( EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) && !use_cldfb_for_dft ) { /* todo - wtda() does not support L_FRAME length; thus temporarily resample the signal */ @@ -1107,8 +1108,10 @@ Word16 swb_bwe_dec_fx32( /* DCT of the ACELP core synthesis */ new_input_fx_exp = 11; + move16(); direct_transform_fx( wtda_synth_fx, ysynth_fx32, 0, /*st_fx->L_frame*/ L_FRAME16k, &new_input_fx_exp, st_fx->element_mode ); ysynth_frame_size = L_FRAME16k; + move16(); } ELSE { @@ -1119,18 +1122,20 @@ Word16 swb_bwe_dec_fx32( /* DCT of the ACELP core synthesis */ // direct_transform(wtda_synth, ysynth, 0, output_frame, st_fx->element_mode); new_input_fx_exp = 11; + move16(); direct_transform_fx( wtda_synth_fx, ysynth_fx32, 0, output_frame, &new_input_fx_exp, st_fx->element_mode ); ysynth_frame_size = output_frame; + move16(); } /* Convert to 16 Bits (Calc Shift Required to Stay within MAX_Q_NEW_INPUT) */ scl = sub( 16 + 11, new_input_fx_exp ); /* Possible to Upscale? */ - IF( GT_16( scl, 0 ) ) + IF( scl > 0 ) { /* Yes */ /* Calc Room to Upscale */ - Q_syn = Find_Max_Norm32( ysynth_fx32, ysynth_frame_size ) - 3; + Q_syn = sub( Find_Max_Norm32( ysynth_fx32, ysynth_frame_size ), 3 ); /* Stay within MAX_Q_NEW_INPUT */ scl = s_min( Q_syn, scl ); } @@ -1140,8 +1145,10 @@ Word16 swb_bwe_dec_fx32( FOR( i = 0; i < ysynth_frame_size; i++ ) { ysynth_fx[i] = extract_l( ysynth_fx32[i] ); + move16(); } Q_syn = new_input_fx_exp; + move16(); } ELSE { @@ -1151,7 +1158,7 @@ Word16 swb_bwe_dec_fx32( IF( !st_fx->bfi ) { - IF( GT_16( st_fx->bws_cnt, 0 ) ) + IF( st_fx->bws_cnt > 0 ) { /* estimate parameters */ mode = para_pred_bws_fx( st_fx, ysynth_fx, SWB_fenv_fx, Q_syn ); @@ -1163,12 +1170,15 @@ Word16 swb_bwe_dec_fx32( } L = SWB_FENV; - IF( EQ_16( mode, TRANSIENT ) ) + move16(); + if ( EQ_16( mode, TRANSIENT ) ) { L = SWB_FENV_TRANS; + move16(); } L_tmp = 0; + move32(); FOR( i = 0; i < L; i++ ) { L_tmp = L_add( L_tmp, L_deposit_l( SWB_fenv_fx[i] ) ); @@ -1177,6 +1187,7 @@ Word16 swb_bwe_dec_fx32( tmp = div_s( shl( 1, sub( 14, q_tmp ) ), L ); /*Q(29-q_tmp) */ L_tmp = Mpy_32_16_1( L_tmp, tmp ); /*Q(1+29-q_tmp+1-16)->Q(15-q_tmp) */ st_fx->prev_ener_shb_fx = round_fx( L_shl( L_tmp, add( q_tmp, 2 ) ) ); /*Q1 */ + move16(); } ELSE { @@ -1185,10 +1196,12 @@ Word16 swb_bwe_dec_fx32( IF( NE_16( hBWE_FD->prev_mode, TRANSIENT ) ) { mode = hBWE_FD->prev_mode; + move16(); } ELSE { mode = NORMAL; + move16(); } Copy( st_fx->prev_SWB_fenv_fx, SWB_fenv_fx, SWB_FENV ); @@ -1206,18 +1219,20 @@ Word16 swb_bwe_dec_fx32( SWB_BWE_decoding_fx( ysynth_fx, SWB_fenv_fx, yerror_fx, L_FRAME32k - 80, mode, &frica_flag, &hBWE_FD->prev_Energy_fx, st_fx->prev_SWB_fenv_fx, &hBWE_FD->prev_L_swb_norm, st_fx->tilt_wb_fx, &hBWE_FD->Seed, 6, &hBWE_FD->prev_weight_fx, st_fx->extl, Q_syn, st_fx->last_extl, st_fx->element_mode ); } - + test(); IF( EQ_16( hBWE_FD->prev_frica_flag, 1 ) && frica_flag == 0 ) { FOR( i = 0; i < L_SUBFR; i++ ) { tmp = sub( 32767, extract_l( L_mult0( i, 512 ) ) ); /*Q15 */ hBWE_FD->mem_imdct_fx[i] = mult_r( hBWE_FD->mem_imdct_fx[i], tmp ); + move16(); } FOR( ; i < output_frame; i++ ) { hBWE_FD->mem_imdct_fx[i] = 0; + move16(); } } @@ -1232,9 +1247,11 @@ Word16 swb_bwe_dec_fx32( ELSE IF( st_fx->bfi ) { fb_ener_adjust_fx = st_fx->prev_fb_ener_adjust_fx; + move16(); } st_fx->prev_fb_ener_adjust_fx = fb_ener_adjust_fx; + move16(); IF( EQ_16( mode, TRANSIENT ) ) { ener_adjust_quan_fx = shr( fb_ener_adjust_fx, 2 ); @@ -1249,17 +1266,21 @@ Word16 swb_bwe_dec_fx32( ELSE { ener_adjust_quan_fx = 0; + move16(); } } fb_band_begin = FB_BAND_BEGIN; - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) + move16(); + if ( EQ_16( st_fx->L_frame, L_FRAME ) ) { fb_band_begin = FB_BAND_BEGIN_12k8; + move16(); } j = 0; - FOR( i = fb_band_begin; i < fb_band_begin + DE_OFFSET1; i++ ) + move16(); + FOR( i = fb_band_begin; i < add( fb_band_begin, DE_OFFSET1 ); i++ ) { tmp = sub( 32767, i_mult( j, 1024 ) ); tmp = mult_r( tmp, ener_adjust_quan_fx ); /*Q13*/ @@ -1269,11 +1290,13 @@ Word16 swb_bwe_dec_fx32( tmp = add( tmp, tmp2 ); /*Q13*/ yerror_fx[i] = L_shl( Mpy_32_16_1( yerror_fx[i - FB_BAND_WIDTH], tmp ), 2 ); /*15+Q_syn */ + move32(); j = add( j, 1 ); } FOR( ; i < FB_BAND_END; i++ ) { yerror_fx[i] = Mpy_32_16_1( yerror_fx[i - FB_BAND_WIDTH], fb_ener_adjust_fx ); /*15+Q_syn */ + move32(); } } @@ -1285,11 +1308,13 @@ Word16 swb_bwe_dec_fx32( window_ola_fx( wtda_synth_fx, hb_synth_fx16, &Q_syn_hb, hBWE_FD->mem_imdct_fx, &hBWE_FD->mem_imdct_exp_fx, output_frame, ALDO_WINDOW, ALDO_WINDOW, 0, 0, 0 ); l_subfr = mult( output_frame, 8192 ); + test(); IF( EQ_16( mode, TRANSIENT ) ) { FOR( i = 0; i < SWB_TENV; i++ ) { SWB_tenv_tmp_fx[i] = L_mult0( SWB_tenv_fx[i], 26214 ); + move32(); } /* time envelope shaping when the current frame is TRANSIENT frame */ @@ -1297,13 +1322,14 @@ Word16 swb_bwe_dec_fx32( Q_syn_hb = sub( Q_syn_hb, 3 ); hBWE_FD->prev_td_energy_fx = SWB_tenv_fx[3]; + move16(); } - ELSE IF( EQ_16( frica_flag, 1 ) && EQ_16( hBWE_FD->prev_frica_flag, 0 ) ) + ELSE IF( EQ_16( frica_flag, 1 ) && hBWE_FD->prev_frica_flag == 0 ) { Qsynth_fx16 = Find_Max_Norm32( synth_fx, output_frame ); Qsynth_fx16 = sub( Qsynth_fx16, shr( add( sub( 15, norm_s( l_subfr ) ), 1 ), 1 ) ); Copy_Scale_sig32_16( synth_fx, synth_fx16, output_frame, Qsynth_fx16 ); - Qsynth_fx16 = add( sub( 11, 16 ), Qsynth_fx16 ); + Qsynth_fx16 = add( 11 - 16, Qsynth_fx16 ); /* IVAS_fmToDo: synth[] is @internal_Fs!!! */ time_reduce_pre_echo_fx( synth_fx16, hb_synth_fx16, hBWE_FD->prev_td_energy_fx, l_subfr, Qsynth_fx16, Q_syn_hb ); @@ -1315,13 +1341,14 @@ Word16 swb_bwe_dec_fx32( FOR( i = 0; i < l_subfr; i++ ) { - L_tmp = L_mac0_sat( L_tmp, hb_synth_fx16[tmp + i], hb_synth_fx16[tmp + i] ); /*(2*Q_syn_hb) */ + L_tmp = L_mac0_sat( L_tmp, hb_synth_fx16[add( tmp, i )], hb_synth_fx16[add( tmp, i )] ); /*(2*Q_syn_hb) */ } L_tmp = Mult_32_16( L_tmp, div_s( 1, l_subfr ) ); /*(2*Q_syn_hb) */ hBWE_FD->prev_td_energy_fx = 0; + move16(); - IF( NE_32( L_tmp, 0 ) ) + IF( L_tmp != 0 ) { q_tmp = norm_l( L_tmp ); tmp = extract_h( L_shl( L_tmp, q_tmp ) ); @@ -1331,12 +1358,14 @@ Word16 swb_bwe_dec_fx32( L_tmp = L_deposit_h( tmp ); L_tmp = Isqrt_lc( L_tmp, &q_tmp ); /*Q(31-exp) */ hBWE_FD->prev_td_energy_fx = round_fx( L_shl( L_tmp, sub( q_tmp, 15 ) ) ); /*Q0 */ + move16(); } } + test(); IF( EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) && !use_cldfb_for_dft ) { - Qsynth_fx16 = add( sub( 16, 11 ), Q_syn_hb ); + Qsynth_fx16 = add( 16 - 11, Q_syn_hb ); Copy_Scale_sig32_16( synth_fx, synth_fx16, output_frame, Qsynth_fx16 ); /* add HB synth from hf_synth() */ @@ -1344,11 +1373,14 @@ Word16 swb_bwe_dec_fx32( } hBWE_FD->prev_mode = mode; + move16(); hBWE_FD->prev_frica_flag = frica_flag; + move16(); FOR( i = 0; i < output_frame; i++ ) { hb_synth_fx[i] = L_deposit_l( hb_synth_fx16[i] ); + move32(); } return Q_syn_hb; diff --git a/lib_dec/swb_bwe_dec_fx.c b/lib_dec/swb_bwe_dec_fx.c index 34167dc29..742706db3 100644 --- a/lib_dec/swb_bwe_dec_fx.c +++ b/lib_dec/swb_bwe_dec_fx.c @@ -38,6 +38,7 @@ static Word16 para_pred_bws_fx( Word32 avrg1_fx, avrg2_fx, min_fx; Word16 att_fx; Word16 coder_type = st_fx->coder_type; + move16(); mode = NORMAL; move16(); @@ -45,7 +46,6 @@ static Word16 para_pred_bws_fx( k = 0; move16(); input_hi_fx = &signal_wb_fx[SHARP_WIDTH]; - move16(); FOR( i = 0; i < 7; i++ ) { peak_fx = 0; @@ -65,7 +65,7 @@ static Word16 para_pred_bws_fx( input_hi_fx++; } - IF( Q_syn < 11 ) + IF( LT_16( Q_syn, 11 ) ) { tmp = 1; move16(); @@ -142,6 +142,7 @@ static Word16 para_pred_bws_fx( IF( GT_16( st_fx->tilt_wb_fx, 30720 ) ) { min_fx = peak_32_fx; + move32(); } ELSE { @@ -179,34 +180,30 @@ static Word16 para_pred_bws_fx( j = 0; move16(); mea = &mean_fx[4]; - move16(); L_tmp_max = L_shl( 32767, add( Q_syn, 5 ) ); FOR( i = 0; i < SWB_FENV; i++ ) { - IF( j == 5 ) + if ( EQ_16( j, 5 ) ) { mea++; - move16(); j = 0; move16(); } - j++; - move16(); + j = add( j, 1 ); L_tmp = L_min( Mult_32_16( *mea, tmp ), L_tmp_max ); SWB_fenv_fx[i] = extract_l( L_shr( L_tmp, add( Q_syn, 5 ) ) ); + move16(); } } j = 0; move16(); - FOR( i = shr( SWB_FENV, 1 ); i < SWB_FENV; i++ ) + FOR( i = SWB_FENV / 2; i < SWB_FENV; i++ ) { tmp = sub( 32767, i_mult( j, 2341 ) ); - move16(); SWB_fenv_fx[i] = mult_r( SWB_fenv_fx[i], tmp ); move16(); - j++; - move16(); + j = add( j, 1 ); } IF( GT_32( avrg1_fx, L_shl( avrg2_fx, 3 ) ) ) @@ -234,11 +231,13 @@ static Word16 para_pred_bws_fx( { /*SWB_fenv_fx[i] = add(mult_r(SWB_fenv_fx[i], 3277), mult_r(st_fx->prev_SWB_fenv_fx[i], 29491)); */ SWB_fenv_fx[i] = round_fx( L_mac( L_mult( SWB_fenv_fx[i], 3277 ), st_fx->prev_SWB_fenv_fx[i], 29491 ) ); + move16(); } ELSE { /*SWB_fenv_fx[i] = add(mult_r(SWB_fenv_fx[i], st_fx->attenu_fx), mult_r(st_fx->prev_SWB_fenv_fx[i], sub(32767, st_fx->attenu_fx))); */ SWB_fenv_fx[i] = round_fx( L_mac( L_mult( SWB_fenv_fx[i], st_fx->attenu_fx ), st_fx->prev_SWB_fenv_fx[i], sub( 32767, st_fx->attenu_fx ) ) ); + move16(); } } @@ -271,6 +270,7 @@ static Word16 para_pred_bws_fx( { /*SWB_fenv_fx[i] = add(mult_r(SWB_fenv_fx[i], 29491), mult_r(st_fx->prev_SWB_fenv_fx[i], 3277)); */ SWB_fenv_fx[i] = round_fx( L_mac( L_mult( SWB_fenv_fx[i], 29491 ), st_fx->prev_SWB_fenv_fx[i], 3277 ) ); + move16(); } st_fx->attenu_fx = 3277; move16(); @@ -283,8 +283,7 @@ static Word16 para_pred_bws_fx( } - att_fx = i_mult( sub( N_WS2N_FRAMES, st_fx->bws_cnt ), 819 ); - move16(); /*15 */ + att_fx = i_mult( sub( N_WS2N_FRAMES, st_fx->bws_cnt ), 819 ); /*15 */ IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) { FOR( i = 0; i < 4; i++ ) @@ -332,7 +331,7 @@ Word16 WB_BWE_gain_deq_fx( move16(); - L_tmp = L_shr( F_2_5_fx[add( index2, 1 )], 1 ); + L_tmp = L_shr( F_2_5_fx[index2 + 1], 1 ); L_tmp = L_shl( L_tmp, 6 ); frac = L_Extract_lc( L_tmp, &exp ); @@ -372,6 +371,7 @@ Word16 ivas_wb_bwe_dec_fx( FD_BWE_DEC_HANDLE hBWE_FD; Word16 coder_type = st_fx->coder_type; + move16(); hBWE_FD = st_fx->hBWE_FD; @@ -379,7 +379,8 @@ Word16 ivas_wb_bwe_dec_fx( new_input_fx_exp = *Qpost; move16(); - IF( st_fx->element_mode == IVAS_CPE_DFT && !use_cldfb_for_dft ) + test(); + IF( EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) && !use_cldfb_for_dft ) { /* IVAS_fmToDo: wtda() does not support L_FRAME length; thus temporarily resample the signal */ /* IVAS_fmToDo: delay output[] by 1.25ms ? */ @@ -387,6 +388,7 @@ Word16 ivas_wb_bwe_dec_fx( wtda_fx( ysynth_fx, &new_input_fx_exp, L_wtda_synth_fx, hBWE_FD->L_old_wtda_swb_fx, &hBWE_FD->old_wtda_swb_fx_exp, ALDO_WINDOW, ALDO_WINDOW, /*st->L_frame*/ L_FRAME16k ); *Qpost = sub( new_input_fx_exp, 15 ); + move16(); direct_transform_fx( L_wtda_synth_fx, ysynth_32, 0, /*st->L_frame*/ L_FRAME16k, &new_input_fx_exp, st_fx->element_mode ); } ELSE @@ -395,6 +397,7 @@ Word16 ivas_wb_bwe_dec_fx( &hBWE_FD->old_wtda_swb_fx_exp, ALDO_WINDOW, ALDO_WINDOW, /* window overlap of current frame (0: full, 2: none, or 3: half) */ output_frame ); *Qpost = sub( new_input_fx_exp, 15 ); + move16(); /* DCT of the ACELP core synthesis */ #ifdef MSAN_FIX direct_transform_fx( L_wtda_synth_fx, ysynth_32, 0, L_FRAME16k, &new_input_fx_exp, st_fx->element_mode ); @@ -430,19 +433,21 @@ Word16 ivas_wb_bwe_dec_fx( /* de-quantization */ mode = WB_BWE_gain_deq_fx( st_fx, WB_fenv_fx ); st_fx->last_wb_bwe_ener_fx = extract_l( Mpy_32_16_r( L_add( WB_fenv_fx[0], WB_fenv_fx[1] ), 16384 ) ); + move16(); } ELSE { Word32 tmp_brate; tmp_brate = st_fx->last_core_brate; + move32(); test(); - IF( EQ_32( st_fx->last_total_brate, ACELP_9k60 ) && EQ_16( st_fx->last_extl, SWB_TBE ) ) + if ( EQ_32( st_fx->last_total_brate, ACELP_9k60 ) && EQ_16( st_fx->last_extl, SWB_TBE ) ) { tmp_brate = ACELP_8k00; /* this is needed in order to stay BE wrt. EVS mono */ - move16(); + move32(); } - IF( NE_16( st_fx->last_extl, WB_BWE ) ) + if ( NE_16( st_fx->last_extl, WB_BWE ) ) { st_fx->prev_SWB_fenv_fx[0] = 0; move16(); @@ -450,7 +455,6 @@ Word16 ivas_wb_bwe_dec_fx( mode = WB_BWE_gain_pred_fx( WB_fenv_fx, ysynth_fx, coder_type, st_fx->prev_coder_type, st_fx->prev_SWB_fenv_fx[0], voice_factors_fx, pitch_buf_fx, tmp_brate, st_fx->last_wb_bwe_ener_fx, Q_syn, st_fx->last_extl, st_fx->tilt_wb_fx ); - move16(); } } ELSE @@ -461,6 +465,7 @@ Word16 ivas_wb_bwe_dec_fx( FOR( i = 0; i < 2; i++ ) { WB_fenv_fx[i] = mult_r( st_fx->prev_SWB_fenv_fx[i], 24576 ); + move16(); } } test(); @@ -473,11 +478,13 @@ Word16 ivas_wb_bwe_dec_fx( IF( GT_16( add( st_fx->prev_Q_synth, exp ), Q_syn ) ) { hBWE_FD->prev_Energy_wb_fx = L_shr( hBWE_FD->prev_Energy_wb_fx, sub( st_fx->prev_Q_synth, Q_syn ) ); + move32(); } ELSE { Q_syn = add( st_fx->prev_Q_synth, exp ); hBWE_FD->prev_Energy_wb_fx = L_shl( hBWE_FD->prev_Energy_wb_fx, exp ); + move32(); } WB_BWE_decoding_fx( ysynth_fx, WB_fenv_fx, ysynth_32, L_FRAME16k, mode, st_fx->last_extl, &hBWE_FD->prev_Energy_wb_fx, st_fx->prev_SWB_fenv_fx, &hBWE_FD->prev_L_swb_norm, @@ -502,7 +509,9 @@ Word16 ivas_wb_bwe_dec_fx( v_add_16( hb_synth_fx, synth_fx, hb_synth_fx, output_frame ); } hBWE_FD->prev_mode = mode; + move16(); st_fx->prev_Q_synth = Q_syn; + move16(); return Q_syn_hb; } #endif @@ -533,6 +542,7 @@ Word16 wb_bwe_dec_fx( FD_BWE_DEC_HANDLE hBWE_FD; Word16 coder_type = st_fx->coder_type; + move16(); hBWE_FD = st_fx->hBWE_FD; @@ -557,6 +567,7 @@ Word16 wb_bwe_dec_fx( &hBWE_FD->old_wtda_swb_fx_exp, ALDO_WINDOW, ALDO_WINDOW, /* window overlap of current frame (0: full, 2: none, or 3: half) */ output_frame ); *Qpost = sub( new_input_fx_exp, 15 ); + move16(); /* DCT of the ACELP core synthesis */ direct_transform_fx( L_wtda_synth_fx, ysynth_32, 0, output_frame, &new_input_fx_exp, st_fx->element_mode ); } @@ -588,18 +599,20 @@ Word16 wb_bwe_dec_fx( #else st_fx->last_wb_bwe_ener_fx = mult_r( add( WB_fenv_fx[0], WB_fenv_fx[1] ), 16384 ); #endif + move16(); } ELSE { int32_t tmp_brate; tmp_brate = st_fx->last_core_brate; + move32(); #if 1 // def ADD_IVAS_BWE test(); - IF( EQ_32( st_fx->last_total_brate, ACELP_9k60 ) && EQ_16( st_fx->last_extl, SWB_TBE ) ) + if ( EQ_32( st_fx->last_total_brate, ACELP_9k60 ) && EQ_16( st_fx->last_extl, SWB_TBE ) ) { tmp_brate = ACELP_8k00; /* this is needed in order to stay BE wrt. EVS mono */ - move16(); + move32(); } #endif if ( NE_16( st_fx->last_extl, WB_BWE ) ) @@ -610,7 +623,6 @@ Word16 wb_bwe_dec_fx( mode = WB_BWE_gain_pred_fx( WB_fenv_fx, ysynth_fx, coder_type, st_fx->prev_coder_type, st_fx->prev_SWB_fenv_fx[0], voice_factors_fx, pitch_buf_fx, tmp_brate, st_fx->last_wb_bwe_ener_fx, Q_syn, st_fx->last_extl, st_fx->tilt_wb_fx ); - move16(); } } ELSE @@ -621,6 +633,7 @@ Word16 wb_bwe_dec_fx( FOR( i = 0; i < 2; i++ ) { WB_fenv_fx[i] = mult_r( st_fx->prev_SWB_fenv_fx[i], 24576 ); + move16(); } } test(); @@ -633,11 +646,13 @@ Word16 wb_bwe_dec_fx( IF( GT_16( add( st_fx->prev_Q_synth, exp ), Q_syn ) ) { hBWE_FD->prev_Energy_wb_fx = L_shr( hBWE_FD->prev_Energy_wb_fx, sub( st_fx->prev_Q_synth, Q_syn ) ); + move32(); } ELSE { Q_syn = add( st_fx->prev_Q_synth, exp ); hBWE_FD->prev_Energy_wb_fx = L_shl( hBWE_FD->prev_Energy_wb_fx, exp ); + move32(); } WB_BWE_decoding_fx( ysynth_fx, WB_fenv_fx, ysynth_32, L_FRAME16k, mode, st_fx->last_extl, &hBWE_FD->prev_Energy_wb_fx, st_fx->prev_SWB_fenv_fx, &hBWE_FD->prev_L_swb_norm, @@ -664,7 +679,9 @@ Word16 wb_bwe_dec_fx( } #endif hBWE_FD->prev_mode = mode; + move16(); st_fx->prev_Q_synth = Q_syn; + move16(); return Q_syn_hb; } /*-------------------------------------------------------------------* @@ -708,7 +725,7 @@ Word16 swb_bwe_gain_deq_fx( /* o : BWE class } test(); - IF( EQ_16( mode, 1 ) && EQ_16( core, ACELP_CORE ) ) + IF( EQ_16( mode, 1 ) && core == ACELP_CORE ) { FOR( n_band = 0; n_band < SWB_TENV; n_band++ ) { @@ -740,7 +757,7 @@ Word16 swb_bwe_gain_deq_fx( /* o : BWE class quant_tmp[1] = add( shr( add( quant_tmp[0], quant_tmp[2] ), 1 ), Env_TR_Cdbk2_fx[tmp] ); #endif move16(); /*Q8 */ - quant_tmp[3] = add( quant_tmp[2], Env_TR_Cdbk2_fx[add( tmp, 1 )] ); + quant_tmp[3] = add( quant_tmp[2], Env_TR_Cdbk2_fx[tmp + 1] ); move16(); /*Q8 */ FOR( n_band = 0; n_band < SWB_FENV_TRANS; n_band++ ) @@ -817,9 +834,9 @@ Word16 swb_bwe_gain_deq_fx( /* o : BWE class Copy( &EnvCdbk11_fx[i_mult2( indice[0], DIM11 )], quant_tmp, DIM11 ); Copy( &EnvCdbk1st_fx[i_mult2( indice[1], DIM1ST )], quant_tmp2, DIM1ST ); - Copy( &EnvCdbk2nd_fx[i_mult2( indice[2], DIM2ND )], quant_tmp2 + DIM1ST, DIM2ND ); + Copy( &EnvCdbk2nd_fx[indice[2] * DIM2ND], quant_tmp2 + DIM1ST, DIM2ND ); - FOR( n_band = 0; n_band < DIM11 - 1; n_band++ ) + FOR( n_band = 0; n_band < ( DIM11 - 1 ); n_band++ ) { quant_tmp[n_band] = add( quant_tmp[n_band], quant_tmp2[n_band] ); move16(); /*Q8 */ @@ -834,13 +851,13 @@ Word16 swb_bwe_gain_deq_fx( /* o : BWE class SWB_fenv[11] = quant_tmp[6]; move16(); - Copy( &EnvCdbk3rd_fx[indice[3] * DIM3RD], quant_tmp2, DIM3RD ); - Copy( &EnvCdbk3rd_fx[indice[4] * DIM3RD], quant_tmp2 + DIM3RD, DIM3RD ); + Copy( &EnvCdbk3rd_fx[i_mult( indice[3], DIM3RD )], quant_tmp2, DIM3RD ); + Copy( &EnvCdbk3rd_fx[i_mult( indice[4], DIM3RD )], quant_tmp2 + DIM3RD, DIM3RD ); FOR( n_band = 0; n_band < 5; n_band++ ) { #ifdef BASOP_NOGLOB - SWB_fenv[add( shl( n_band, 1 ), 1 )] = add_sat( shr( add_sat( quant_tmp[n_band], quant_tmp[n_band + 1] ), 1 ), quant_tmp2[n_band + 1] ); + SWB_fenv[add( n_band * 2, 1 )] = add_sat( shr( add_sat( quant_tmp[n_band], quant_tmp[n_band + 1] ), 1 ), quant_tmp2[n_band + 1] ); #else SWB_fenv[add( shl( n_band, 1 ), 1 )] = add( shr( add( quant_tmp[n_band], quant_tmp[n_band + 1] ), 1 ), quant_tmp2[n_band + 1] ); #endif @@ -858,19 +875,19 @@ Word16 swb_bwe_gain_deq_fx( /* o : BWE class move16(); Copy( &EnvCdbk3rd_fx[i_mult2( indice[3], DIM3RD )], quant_tmp2, DIM3RD ); - Copy( &EnvCdbk4th_fx[i_mult2( indice[4], DIM4TH )], quant_tmp2 + DIM3RD, DIM4TH ); + Copy( &EnvCdbk4th_fx[indice[4] * DIM4TH], quant_tmp2 + DIM3RD, DIM4TH ); FOR( n_band = 0; n_band < DIM12 - 1; n_band++ ) { #ifdef BASOP_NOGLOB - SWB_fenv[add( shl( n_band, 1 ), 1 )] = add_sat( shr( add_sat( quant_tmp[n_band], quant_tmp[n_band + 1] ), 1 ), quant_tmp2[n_band] ); + SWB_fenv[add( n_band * 2, 1 )] = add_sat( shr( add_sat( quant_tmp[n_band], quant_tmp[n_band + 1] ), 1 ), quant_tmp2[n_band] ); #else SWB_fenv[add( shl( n_band, 1 ), 1 )] = add( shr( add( quant_tmp[n_band], quant_tmp[n_band + 1] ), 1 ), quant_tmp2[n_band] ); #endif move16(); /*Q8 */ } - SWB_fenv[n_band * 2 + 1] = add( quant_tmp[n_band], quant_tmp2[n_band] ); + SWB_fenv[add( n_band * 2, 1 )] = add( quant_tmp[n_band], quant_tmp2[n_band] ); move16(); /*Q8 */ } @@ -942,6 +959,7 @@ Word16 swb_bwe_dec_fx( Word16 i, l_subfr; Word16 mode; Word16 frica_flag = 0; + move16(); Word16 idxGain; Word16 Q_syn, Q_syn_hb; Word16 ysynth_fx[L_FRAME48k]; @@ -954,9 +972,11 @@ Word16 swb_bwe_dec_fx( Word32 L_tmp; Word16 exp, frac; Word16 fb_ener_adjust_fx = 0; + move16(); Word16 SWB_fenv_fx[SWB_FENV]; Word16 L; Word16 j = 0; + move16(); Word16 ener_adjust_quan_fx; Word16 tmp2; Word16 fb_band_begin; @@ -968,6 +988,7 @@ Word16 swb_bwe_dec_fx( *---------------------------------------------------------------------*/ /* windowing of the ACELP core synthesis */ new_input_fx_exp = *Qpost; + move16(); #ifdef ADD_IVAS_BWE if ( st->element_mode == IVAS_CPE_DFT && !use_cldfb_for_dft ) { @@ -988,6 +1009,7 @@ Word16 swb_bwe_dec_fx( ALDO_WINDOW, /* window overlap of current frame (0: full, 2: none, or 3: half) */ output_frame ); *Qpost = sub( new_input_fx_exp, 15 ); + move16(); /* DCT of the ACELP core synthesis */ direct_transform_fx( L_wtda_synth_fx, ysynth_32, 0, output_frame, &new_input_fx_exp, st_fx->element_mode ); } @@ -1011,13 +1033,11 @@ Word16 swb_bwe_dec_fx( { /* estimate parameters */ mode = para_pred_bws_fx( st_fx, ysynth_fx, SWB_fenv_fx, Q_syn ); - move16(); } ELSE { /* de-quantization */ mode = swb_bwe_gain_deq_fx( st_fx, ACELP_CORE, SWB_tenv_fx, SWB_fenv_fx, 0, -1 ); - move16(); } L = SWB_FENV; @@ -1031,7 +1051,7 @@ Word16 swb_bwe_dec_fx( move16(); FOR( i = 0; i < L; i++ ) { - L_tmp = L_add( L_tmp, (Word32) SWB_fenv_fx[i] ); + L_tmp = L_add( L_tmp, L_deposit_l( SWB_fenv_fx[i] ) ); } exp = norm_s( L ); @@ -1039,6 +1059,7 @@ Word16 swb_bwe_dec_fx( L_tmp = Mult_32_16( L_tmp, tmp ); /*Q(1+29-exp+1-16)->Q(15-exp) */ st_fx->prev_ener_shb_fx = round_fx( L_shl( L_tmp, add( exp, 2 ) ) ); /*Q1 */ + move16(); } ELSE { @@ -1096,7 +1117,7 @@ Word16 swb_bwe_dec_fx( idxGain = (Word16) get_next_indice( st_fx, NUM_BITS_FB_FRAMEGAIN ); fb_ener_adjust_fx = usdequant_fx( idxGain, FB_GAIN_QLOW_FX, FB_GAIN_QDELTA_FX ); /*Q15 */ } - ELSE if ( st_fx->bfi ) + ELSE IF( st_fx->bfi ) { fb_ener_adjust_fx = st_fx->prev_fb_ener_adjust_fx; move16(); @@ -1106,8 +1127,7 @@ Word16 swb_bwe_dec_fx( move16(); IF( EQ_16( mode, TRANSIENT ) ) { - ener_adjust_quan_fx = shr( fb_ener_adjust_fx, 2 ); - move16(); /*Q13*/ + ener_adjust_quan_fx = shr( fb_ener_adjust_fx, 2 ); /*Q13*/ } ELSE { @@ -1116,11 +1136,10 @@ Word16 swb_bwe_dec_fx( tmp = div_s( 1, SWB_fenv_fx[7] ); move16(); /*Q14*/ #ifdef BASOP_NOGLOB - ener_adjust_quan_fx = s_min( shr( i_mult_sat( SWB_fenv_fx[13], tmp ), 2 ), 32767 ); + ener_adjust_quan_fx = s_min( shr( i_mult_sat( SWB_fenv_fx[13], tmp ), 2 ), 32767 ); /*Q13*/ #else ener_adjust_quan_fx = s_min( shr( i_mult( SWB_fenv_fx[13], tmp ), 2 ), 32767 ); #endif - move16(); /*Q13*/ } ELSE { @@ -1129,13 +1148,14 @@ Word16 swb_bwe_dec_fx( } } fb_band_begin = FB_BAND_BEGIN; + move16(); #ifdef ADD_IVAS_BWE IF( st_fx->L_frame == L_FRAME ) { fb_band_begin = FB_BAND_BEGIN_12k8; } #endif - FOR( i = fb_band_begin; i < fb_band_begin + DE_OFFSET1; i++ ) + FOR( i = fb_band_begin; i < add( fb_band_begin, DE_OFFSET1 ); i++ ) { tmp = sub( 32767, i_mult( j, 1024 ) ); tmp = mult_r( tmp, ener_adjust_quan_fx ); /*Q13*/ @@ -1192,7 +1212,7 @@ Word16 swb_bwe_dec_fx( FOR( i = 0; i < l_subfr; i++ ) { #ifdef BASOP_NOGLOB - L_tmp = L_mac0_sat( L_tmp, hb_synth_fx[tmp + i], hb_synth_fx[tmp + i] ); /*(2*Q_syn_hb) */ + L_tmp = L_mac0_sat( L_tmp, hb_synth_fx[add( tmp, i )], hb_synth_fx[add( tmp, i )] ); /*(2*Q_syn_hb) */ #else L_tmp = L_mac0( L_tmp, hb_synth_fx[tmp + i], hb_synth_fx[tmp + i] ); /*(2*Q_syn_hb) */ #endif @@ -1211,6 +1231,7 @@ Word16 swb_bwe_dec_fx( L_tmp = L_deposit_h( tmp ); L_tmp = Isqrt_lc( L_tmp, &exp ); /*Q(31-exp) */ hBWE_FD->prev_td_energy_fx = round_fx( L_shl( L_tmp, sub( exp, 15 ) ) ); /*Q0 */ + move16(); } } #ifdef ADD_IVAS_BWE @@ -1271,6 +1292,7 @@ void fd_bwe_dec_init( st_fx->last_wb_bwe_ener_fx = 0; move16(); hBWE_FD->prev_Energy_wb_fx = L_deposit_l( 0 ); + move32(); hBWE_FD->memExp1 = 0; move16(); @@ -1279,7 +1301,9 @@ void fd_bwe_dec_init( move16(); hBWE_FD->mem_deemph_old_syn_fx = 0; + move16(); st_fx->prev_fb_ener_adjust_fx = 0; + move16(); return; } diff --git a/lib_dec/swb_bwe_dec_hr_fx.c b/lib_dec/swb_bwe_dec_hr_fx.c index 3276cf990..ed6ed4ae6 100644 --- a/lib_dec/swb_bwe_dec_hr_fx.c +++ b/lib_dec/swb_bwe_dec_hr_fx.c @@ -47,27 +47,37 @@ static Word16 Gain_Dequant_HR( /* o: decoded gain (Q13) IF( EQ_16( min, G_AVQ_MIN_FX ) ) { L_mini = MAKE_PSEUDO_FLT( 26214, 15 ); /* 0.8 in Q15 */ + move32(); L_fact = MAKE_PSEUDO_FLT( 14145, 11 ); /* Log2(96) - Log2(0.8) in Q11 */ + move32(); } ELSE IF( EQ_16( min, G_AVQ_MIN_DIV10_FX ) ) { L_mini = MAKE_PSEUDO_FLT( 20972, 18 ); /* 0.8*0.1 in Q18 */ + move32(); L_fact = MAKE_PSEUDO_FLT( 20949, 11 ); /* Log2(96) - Log2(0.8*0.1) in Q11 */ + move32(); } ELSE IF( EQ_16( min, G_CODE_MIN_FX ) ) { L_mini = MAKE_PSEUDO_FLT( 20972, 20 ); /* 0.02 in Q20 */ + move32(); L_fact = MAKE_PSEUDO_FLT( 32628, 12 ); /* Log2(5) - Log2(0.02) in Q12 */ + move32(); } ELSE IF( EQ_16( min, G_CODE_MIN_TC192_FX ) ) { L_mini = MAKE_PSEUDO_FLT( 19661, 15 ); /* 0.6 in Q15 */ + move32(); L_fact = MAKE_PSEUDO_FLT( 24963, 12 ); /* Log2(41) - Log2(0.6) in Q12 */ + move32(); } ELSE IF( EQ_16( min, MIN_GLOB_GAIN_BWE_HR_FX ) ) { L_mini = MAKE_PSEUDO_FLT( 24576, 13 ); /* 3.0 in Q13 */ + move32(); L_fact = MAKE_PSEUDO_FLT( 30232, 12 ); /* Log2(500) - Log2(3) in Q12 */ + move32(); } /* levels = 1<bwe_highrate_seed_fx = extract_l( L_mult0( pitch_buf[0], pitch_buf[3] ) ); + move16(); /*---------------------------------------------------------------------* @@ -308,7 +321,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB ind2 = 0; move16(); L_ener_saved = 0; - move16(); + move32(); ener_saved_exp = 0; move16(); @@ -331,7 +344,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB * calculate tilt of the core synthesis *---------------------------------------------------------------------*/ L_tilt_wb = calc_tilt_bwe_fx( syn_12k8_16k_fx, exp, L_FRAME16k ); - L_temp = L_mac( 1L, 8192, pitch_buf[0] ); + L_temp = L_mac( 1, 8192, pitch_buf[0] ); FOR( i = 1; i < NB_SUBFR16k - 1; i++ ) { L_temp = L_mac( L_temp, 8192, pitch_buf[i] ); @@ -401,9 +414,9 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB temp4 = add( temp4, t_audio_exp ); FOR( i = 0; i < tmpS; i++ ) { - L_temp = L_mult( alpha, hBWE_FD_HR->t_audio_prev_fx[i + ind1] ); + L_temp = L_mult( alpha, hBWE_FD_HR->t_audio_prev_fx[add( i, ind1 )] ); L_temp = L_shr( L_temp, temp4 ); - t_audio32[pos + i] = L_temp; + t_audio32[add( pos, i )] = L_temp; move32(); } ind1 = add( ind1, tmpS ); @@ -457,6 +470,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB hBWE_FD_HR->L_mem_EnergyLT_fx = Mul_flt32_Q15( hBWE_FD_HR->L_mem_EnergyLT_fx, &hBWE_FD_HR->mem_EnergyLT_fx_exp, alpha ); move32(); hBWE_FD_HR->mem_EnergyLT_fx_exp = add( hBWE_FD_HR->mem_EnergyLT_fx_exp, t_audio_exp ); + move16(); /* Set Exponent */ t_audio_exp = Q_32_BITS; @@ -557,7 +571,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB temp = shl( ind1, 1 ); en_band[0] = swb_hr_env_code3_fx[temp]; move16(); - en_band[1] = swb_hr_env_code3_fx[add( temp, 1 )]; + en_band[1] = swb_hr_env_code3_fx[temp + 1]; move16(); /*env = add(shr(en_band[0], 1), shr(en_band[1], 1));*/ @@ -606,9 +620,9 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB /* 't_audio' in Q8 */ t_audio_exp = 8; move16(); - FOR( i = 0; i < Nsv * WIDTH_BAND; i++ ) + FOR( i = 0; i < i_mult( Nsv, WIDTH_BAND ); i++ ) { - t_audio[temp + i] = shl( x_norm[i], t_audio_exp ); + t_audio[add( temp, i )] = shl( x_norm[i], t_audio_exp ); move16(); } @@ -623,7 +637,6 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB /* Go from Q't_audio_exp' on 16 Bits to 'Q_32_BITS' on 32 bits */ temp2 = i_mult2( WIDTH_BAND, Nsv ); ptr16 = &t_audio[temp]; - move16(); ptr32 = &t_audio32[temp]; j = shl( 1, sub( Q_32_BITS, t_audio_exp ) ); FOR( i = 0; i < temp2; i++ ) @@ -644,7 +657,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB /* reconstruct 14-16(20) kHz spectrum */ FOR( j = 0; j < tmpS; j++ ) { - *ptr32++ = L_shr( t_audio32[pos + j], 1 ); + *ptr32++ = L_shr( t_audio32[add( pos, j )], 1 ); move32(); } @@ -667,7 +680,6 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB temp2 = add( NUM_TRANS_END_FREQ_COEF_EFF, temp ); j = sub( tmpS, width_noncoded ); ptr16 = &t_audio[add( temp2, j )]; - move16(); ptr32 = &t_audio32[add( temp2, j )]; /* envelope denormalization of 14.4-16(20) kHz spectrum */ FOR( ; j < tmpS; j++ ) @@ -680,15 +692,14 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB temp2 = add( NUM_TRANS_START_FREQ_COEF, temp ); ptr16 = &t_audio[temp2]; - move16(); ptr32 = &t_audio32[temp2]; - temp4 = i_mult2( NSV_OVERLAP, shr( WIDTH_BAND, 2 ) ); + temp4 = NSV_OVERLAP * ( WIDTH_BAND >> 2 ); /* overlap region */ IF( EQ_16( output_frame, L_FRAME48k ) ) { FOR( i = 0; i < temp4; i++ ) { - L_temp = Mult_32_16( *ptr32, overlap_coefs_48kHz_fx[shl( i, 2 )] ); /* overlap_coefs_fx in Q15 */ + L_temp = Mult_32_16( *ptr32, overlap_coefs_48kHz_fx[i * 4] ); /* overlap_coefs_fx in Q15 */ *ptr32++ = L_temp; move32(); } @@ -697,7 +708,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB { FOR( i = 0; i < temp4; i++ ) { - L_temp = Mult_32_16( *ptr32, overlap_coefs_fx[shl( i, 2 )] ); /* overlap_coefs_fx in Q15 */ + L_temp = Mult_32_16( *ptr32, overlap_coefs_fx[i * 4] ); /* overlap_coefs_fx in Q15 */ *ptr32++ = L_temp; move32(); } @@ -705,9 +716,8 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB temp2 = add( NUM_TRANS_START_FREQ_COEF, temp ); ptr16 = &t_audio[temp2]; - move16(); ptr32 = &t_audio32[temp2]; - temp4 = add( i_mult2( WIDTH_TRANS_FREQ_COEF, N_BANDS_TRANS_BWE_HR ), width_noncoded ); + temp4 = add( WIDTH_TRANS_FREQ_COEF * N_BANDS_TRANS_BWE_HR, width_noncoded ); temp3 = sub( 15, exp1 ); /* apply global gain */ FOR( i = 0; i < temp4; i++ ) @@ -720,7 +730,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB /* save transform coefficients for the next frame (needed in case of frame erasures) */ temp = add( NUM_TRANS_START_FREQ_COEF, len ); - IF( output_frame == L_FRAME32k ) + IF( EQ_16( output_frame, L_FRAME32k ) ) { pos = L_FRAME32k / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_START_FREQ_COEF; move16(); @@ -728,6 +738,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB ELSE /* output_frame == L_FRAME48k */ { pos = ( 2 * END_FREQ_BWE_FULL_FB / 50 ) / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_START_FREQ_COEF; + move16(); } temp4 = Find_Max_Norm32( t_audio32 + temp, pos ); Copy_Scale_sig32_16( t_audio32 + temp, hBWE_FD_HR->t_audio_prev_fx + i_mult2( k, pos ), pos, temp4 ); @@ -745,7 +756,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB j = ( 2 * END_FREQ_BWE_FULL_FB / 50 ) / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_START_FREQ_COEF; move16(); - if ( output_frame == L_FRAME32k ) + if ( EQ_16( output_frame, L_FRAME32k ) ) { j = L_FRAME32k / NUM_TIME_SWITCHING_BLOCKS - NUM_TRANS_START_FREQ_COEF; move16(); @@ -753,7 +764,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB FOR( i = 0; i < j; i++ ) { - t_audio[temp + i] = mult_r( t_audio[temp + i], temp2 ); + t_audio[add( temp, i )] = mult_r( t_audio[add( temp, i )], temp2 ); move16(); } } @@ -779,12 +790,12 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB temp = shl( ind1, 1 ); en_band[0] = swb_hr_env_code1_fx[temp]; move16(); - en_band[1] = swb_hr_env_code1_fx[add( temp, 1 )]; + en_band[1] = swb_hr_env_code1_fx[temp + 1]; move16(); temp = shl( ind2, 1 ); en_band[2] = swb_hr_env_code2_fx[temp]; move16(); - en_band[3] = swb_hr_env_code2_fx[add( temp, 1 )]; + en_band[3] = swb_hr_env_code2_fx[temp + 1]; move16(); /*env = add(add(shr(en_band[0], 2), shr(en_band[1], 2)), add(shr(en_band[2], 2), shr(en_band[3], 2)));*/ @@ -892,7 +903,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB /* Nsv2 * 12 <= nBits (Nsv2 is not too high) AND */ /* nBits - Nsv2 * 12 < 12 (Nsv2 is the highest divisor) */ L_temp = L_msu0( L_deposit_l( nBits ), 12, Nsv2 ); - if ( GE_32( L_temp, 12L ) ) + if ( GE_32( L_temp, 12 ) ) Nsv2 = add( Nsv2, 1 ); if ( L_temp < 0 ) Nsv2 = sub( Nsv2, 1 ); @@ -913,7 +924,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB /* set 't_audio' exp */ t_audio_exp = 10; move16(); - FOR( i = 0; i < Nsv * WIDTH_BAND; i++ ) + FOR( i = 0; i < i_mult( Nsv, WIDTH_BAND ); i++ ) { #ifdef BASOP_NOGLOB t_audio_tmp[i] = shl_sat( x_norm[i], t_audio_exp ); @@ -944,7 +955,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB { L_temp = L_mult( gain2_fx, *ptr16++ ); L_temp = L_shr( L_temp, temp2 ); /* go to Q't_audio' */ - t_audio_tmp[temp + j] = round_fx( L_temp ); + t_audio_tmp[add( temp, j )] = round_fx( L_temp ); } /* 'nq[i] = add(nq[i], nq2[incr])' replaced by 'nq[i] = nq2[incr]' because 'nq[i] == 0' */ nq[i] = nq2[incr]; @@ -968,9 +979,9 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB FOR( j = 0; j < WIDTH_BAND; j++ ) { L_temp = L_mult( gain2_fx, *ptr16++ ); - L_temp = L_msu( L_temp, t_audio_tmp[temp + j], temp3 ); /* go to -Q't_audio' */ - L_temp = L_shr( L_temp, temp2 ); /* go to Q't_audio' */ - t_audio_tmp[temp + j] = round_fx( L_temp ); + L_temp = L_msu( L_temp, t_audio_tmp[add( temp, j )], temp3 ); /* go to -Q't_audio' */ + L_temp = L_shr( L_temp, temp2 ); /* go to Q't_audio' */ + t_audio_tmp[add( temp, j )] = round_fx( L_temp ); } nq[i] = add( nq[i], nq2[incr] ); move16(); @@ -989,6 +1000,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB Copy( t_audio_tmp, ptr16, NUM_NONTRANS_END_FREQ_COEF - NUM_NONTRANS_START_FREQ_COEF ); /* Update Maximum Written Location (from t_audio + NUM_NONTRANS_START_FREQ_COEF) */ temp4 = NUM_NONTRANS_END_FREQ_COEF - NUM_NONTRANS_START_FREQ_COEF; + move16(); } ELSE { @@ -997,12 +1009,14 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB /* Update Maximum Written Location (from t_audio + NUM_NONTRANS_START_FREQ_COEF) */ temp4 = ind1; + move16(); temp = add( pos, 1 ); ind2 = add( shl( temp, 6 ), i_mult2( shr( temp, 1 ), WIDTH_BAND ) ); - Copy( t_audio_tmp + ind1, ptr16 + ind2, NUM_NONTRANS_END_FREQ_COEF - NUM_NONTRANS_START_FREQ_COEF - ind2 ); + Copy( t_audio_tmp + ind1, ptr16 + ind2, sub( NUM_NONTRANS_END_FREQ_COEF - NUM_NONTRANS_START_FREQ_COEF, ind2 ) ); /* Update Maximum Written Location (from t_audio + NUM_NONTRANS_START_FREQ_COEF) */ temp4 = s_max( temp4, NUM_NONTRANS_END_FREQ_COEF - NUM_NONTRANS_START_FREQ_COEF ); + move16(); /* reconstruct non-encoded subband */ IF( EQ_16( pos, 3 ) ) @@ -1030,7 +1044,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB { nq[j] = nq[i]; move16(); - j = sub( j, 1 ); + j = j - 1; } Copy( nq + ind2, nq + ind1, add( WIDTH_BAND, pos ) ); @@ -1069,14 +1083,14 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB IF( EQ_16( pos, 3 ) && LE_16( nBits_total, 400 ) ) { ptr16 = &t_audio[NUM_NONTRANS_START_FREQ_COEF + 200 - WIDTH_BAND]; - L_temp = L_mac0( 1L /* EPSILON */, *ptr16, *ptr16 ); + L_temp = L_mac0( 1 /* EPSILON */, *ptr16, *ptr16 ); FOR( i = 1; i < WIDTH_BAND; i++ ) { ptr16++; L_temp = L_mac0( L_temp, *ptr16, *ptr16 ); } ptr16++; - L_temp2 = L_mac0( 1L /* EPSILON */, *ptr16, *ptr16 ); + L_temp2 = L_mac0( 1 /* EPSILON */, *ptr16, *ptr16 ); FOR( i = 1; i < WIDTH_BAND; i++ ) { ptr16++; @@ -1088,7 +1102,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB temp2 = s_min( 0, temp ); L_temp = L_shl( L_temp, temp2 ); /* Energy_flt - i*(Energy_flt-1.0)/8.0 */ - L_temp2 = L_add( L_temp, L_shr( -2147483647L - 1L, s_max( 0, temp ) ) ); /* 1.0 in same Q as Sqrt minus the Guard */ + L_temp2 = L_add( L_temp, L_shr( -2147483647 - 1, s_max( 0, temp ) ) ); /* 1.0 in same Q as Sqrt minus the Guard */ /* / 8.0 */ L_temp2 = L_shr( L_temp2, 3 + Q_GUARD ); /* Add Guard */ @@ -1112,22 +1126,22 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB width_noncoded = 2 * END_FREQ_BWE_FULL_FB / 50 - NUM_NONTRANS_END_FREQ_COEF; move16(); /* st->extl == FB_BWE_HIGHRATE */ test(); - if ( EQ_16( st_fx->extl, SWB_BWE_HIGHRATE ) || EQ_16( output_frame, L_FRAME32k ) ) + IF( EQ_16( st_fx->extl, SWB_BWE_HIGHRATE ) || EQ_16( output_frame, L_FRAME32k ) ) { width_noncoded = L_FRAME32k - NUM_NONTRANS_END_FREQ_COEF; move16(); } ptr16 = &t_audio[NUM_NONTRANS_END_FREQ_COEF - WIDTH_BAND]; - L_temp = L_mac0( 1L /* EPSILON */, *ptr16, *ptr16 ); + L_temp = L_mac0( 1 /* EPSILON */, *ptr16, *ptr16 ); FOR( i = 1; i < WIDTH_BAND; i++ ) { ptr16++; L_temp = L_mac0( L_temp, *ptr16, *ptr16 ); } - ptr16 = &t_audio[sub( NUM_NONTRANS_END_FREQ_COEF, width_noncoded )]; - L_temp2 = L_mac0( 1L /* EPSILON */, *ptr16, *ptr16 ); + ptr16 = &t_audio[NUM_NONTRANS_END_FREQ_COEF - width_noncoded]; + L_temp2 = L_mac0( 1 /* EPSILON */, *ptr16, *ptr16 ); FOR( i = 1; i < WIDTH_BAND; i++ ) { ptr16++; @@ -1143,7 +1157,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB t_audio32 + NUM_NONTRANS_END_FREQ_COEF + WIDTH_BAND, sub( width_noncoded, WIDTH_BAND ) ); /* smoothing 14.4-14.8kHz */ - ptr16 = &t_audio[sub( NUM_NONTRANS_END_FREQ_COEF, width_noncoded )]; + ptr16 = &t_audio[NUM_NONTRANS_END_FREQ_COEF - width_noncoded]; ptr32 = &t_audio32[NUM_NONTRANS_END_FREQ_COEF]; temp = sub( temp, add( t_audio_exp, 16 - Q_32_BITS ) ); FOR( i = 0; i < WIDTH_BAND; i++ ) @@ -1186,7 +1200,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB /* in L_temp/L_temp2, value in Q16+9 */ FOR( j = 0; j < WIDTH_BAND; j++ ) { - *ptr32 = L_shl( Mult_32_16( *ptr32, round_fx( L_temp ) ), 15 - 9 ); + *ptr32 = L_shl( Mult_32_16( *ptr32, round_fx( L_temp ) ), ( 15 - 9 ) ); move32(); ptr32++; L_temp = L_sub( L_temp, L_temp2 ); @@ -1216,7 +1230,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB FOR( j = 0; j < tmpS; j++ ) { /* t_audio[NUM_NONTRANS_END_FREQ_COEF + j] *= 2.2f * en_noncoded * (1-(float)k/(float)160); */ - *ptr32 = L_shl( Mult_32_16( *ptr32, round_fx( L_temp ) ), 31 - 23 ); + *ptr32 = L_shl( Mult_32_16( *ptr32, round_fx( L_temp ) ), ( 31 - 23 ) ); move32(); ptr32++; L_temp = L_sub( L_temp, L_temp2 ); @@ -1227,7 +1241,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB FOR( ; j < width_noncoded; j++ ) { /* t_audio[NUM_NONTRANS_END_FREQ_COEF + j] *= 0.65f * en_noncoded * (1-(float)k/(float)320); */ - *ptr32 = L_shl( Mult_32_16( *ptr32, round_fx( L_temp ) ), 31 - 25 ); + *ptr32 = L_shl( Mult_32_16( *ptr32, round_fx( L_temp ) ), ( 31 - 25 ) ); move32(); ptr32++; L_temp = L_sub( L_temp, L_temp2 ); @@ -1279,13 +1293,15 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB /* Save transform coefficients for the next frame (needed in case of frame erasures) */ temp = NUM_NONTRANS_START_FREQ_COEF; move16(); /* not necessary but improves readability and allows a larger common code path */ - IF( output_frame == L_FRAME32k ) + IF( EQ_16( output_frame, L_FRAME32k ) ) { pos = L_FRAME32k - NUM_NONTRANS_START_FREQ_COEF; + move16(); } ELSE /* output_frame == L_FRAME48k */ { pos = 2 * END_FREQ_BWE_FULL_FB / 50 - NUM_NONTRANS_START_FREQ_COEF; + move16(); } temp4 = Find_Max_Norm32( t_audio32 + temp, pos ); Copy_Scale_sig32_16( t_audio32 + temp, hBWE_FD_HR->t_audio_prev_fx, pos, temp4 ); @@ -1299,7 +1315,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB j = 2 * END_FREQ_BWE_FULL_FB / 50 - NUM_NONTRANS_START_FREQ_COEF; move16(); - if ( output_frame == L_FRAME32k ) + if ( EQ_16( output_frame, L_FRAME32k ) ) { j = L_FRAME32k - NUM_NONTRANS_START_FREQ_COEF; move16(); @@ -1317,10 +1333,12 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB IF( gain_fx < 0 ) { st_fx->prev_ener_shb_fx = extract_h( L_shr( L_mult0( 32767, env ), 7 ) ); + move16(); } ELSE { st_fx->prev_ener_shb_fx = extract_h( L_shr( L_mult0( gain_fx, env ), 7 ) ); + move16(); } FOR( i = 0; i < SWB_FENV; i++ ) { @@ -1333,6 +1351,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB *---------------------------------------------------------------------*/ t_audio_exp = Q_32_BITS; + move16(); Inverse_Transform( t_audio32, &t_audio_exp, t_audio32_tmp, is_transient, output_frame, output_frame, st_fx->element_mode ); window_ola_fx( t_audio32_tmp, hb_synth_fx, &t_audio_exp, hBWE_FD->L_old_wtda_swb_fx, &st_fx->hHQ_core->Q_old_wtda, output_frame, ALDO_WINDOW, ALDO_WINDOW, 0, 0, 0 ); @@ -1354,7 +1373,6 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB move16(); ptr16 = hb_synth_fx; - move16(); len = shr( output_frame, 2 ); /* Divide Frame Len by 4, all (160, 320, 640, 960) are divisible by 4 */ L_ener_all = L_deposit_l( 0 ); @@ -1365,7 +1383,6 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB { L_Energy = Calc_Energy_Autoscaled( ptr16, hb_synth_fx_exp, len, &temp2 ); ptr16 += len; - move16(); /* Normalize Energy */ temp = norm_l( L_Energy ); L_Energy = L_shl( L_Energy, temp ); @@ -1414,11 +1431,12 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB test(); test(); test(); - IF( IsTransient != 0 && pos > 0 && LT_32( L_tilt_wb, 16777216L * 3 /*tilt_wb in Q24*/ ) && GT_16( pitch, 500 * 16 /*Q4*/ ) ) + IF( IsTransient != 0 && pos > 0 && LT_32( L_tilt_wb, 50331648 /* (16777216L * 3) */ /*tilt_wb in Q24*/ ) && GT_16( pitch, ( 500 * 16 ) /*Q4*/ ) ) { Nsv = i_mult2( pos, shr( output_frame, 2 ) ); gain_fx = 16384; /* sqrt(1.0) in Q14 */ + move16(); /* pos is 1,2 or 3 */ temp3 = sub( pos, 2 ); if ( temp3 == 0 ) @@ -1456,7 +1474,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB * +1: Because of L_mult'0' * and the normalization */ - exp2 = add( exp1, +16 - 16 - 15 + 1 ); + exp2 = add( exp1, 16 - 16 - 15 + 1 ); temp = norm_l( L_temp ); L_temp = L_shl( L_temp, temp ); exp2 = add( exp2, temp ); @@ -1466,6 +1484,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB L_temp2 = L_mult( temp, hb_synth_fx[i] ); L_temp2 = L_shr( L_temp2, exp2 ); hb_synth_fx[i] = round_fx( L_temp2 ); + move16(); } len = shr( output_frame, 3 ); /* all frame length are divisible by 8 */ @@ -1484,7 +1503,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB /* Put to Q30 */ L_temp2 = L_shr( L_temp2, exp2 ); /* 1/frame_len in Q30 */ - L_temp2 = L_msu( L_temp2, swb_hr_inv_frm_len[temp], 32768L >> ( 19 - 15 + 1 ) ); /* 19-15+1 to Bring to Q30 */ + L_temp2 = L_msu( L_temp2, swb_hr_inv_frm_len[temp], 1024 /*(32768L >> ( 19 - 15 + 1 )*/ ); /* 19-15+1 to Bring to Q30 */ FOR( i = 0; i < len; i++ ) { /* hb_synth[i+Nsv] *= (gain_flt - i*8.0f*(1.0f/output_frame*gain_flt - 1.0f/output_frame)) */ @@ -1506,7 +1525,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB test(); IF( EQ_16( st_fx->last_core, HQ_CORE ) || NE_16( st_fx->last_extl, st_fx->extl ) ) { - IF( LT_32( L_tilt_wb, 16777216L * 3 /*tilt_wb in Q24*/ ) ) + IF( LT_32( L_tilt_wb, 50331648 /* (16777216L * 3) */ /*tilt_wb in Q24*/ ) ) { temp = TD_Postprocess( hb_synth_fx, hb_synth_fx_exp, output_frame, st_fx->last_extl ); @@ -1553,6 +1572,7 @@ void hr_bwe_dec_init( move16(); hBWE_FD_HR->L_mem_EnergyLT_fx = L_deposit_h( 16384 ); + move32(); hBWE_FD_HR->mem_EnergyLT_fx_exp = 40; move16(); /* set to a high exponent */ diff --git a/lib_dec/swb_bwe_dec_lr_fx.c b/lib_dec/swb_bwe_dec_lr_fx.c index 689029be4..52c200bc4 100644 --- a/lib_dec/swb_bwe_dec_lr_fx.c +++ b/lib_dec/swb_bwe_dec_lr_fx.c @@ -30,14 +30,14 @@ static void DecodeSWBGenericParameters_fx( { IF( EQ_16( hq_swb_clas_fx, HQ_HARMONIC ) ) { - lagIndices_fx[sb] = get_next_indice( st_fx, bits_lagIndices_mode0_Har[sb] ); + lagIndices_fx[sb] = (Word16) get_next_indice( st_fx, bits_lagIndices_mode0_Har[sb] ); move16(); } ELSE { - IF( p2a_flags_fx[BANDS_fx - NB_SWB_SUBBANDS + sb] == 0 ) + IF( p2a_flags_fx[add( sub( BANDS_fx, NB_SWB_SUBBANDS ), sb )] == 0 ) { - lagIndices_fx[sb] = get_next_indice( st_fx, bits_lagIndices_modeNormal[sb] ); + lagIndices_fx[sb] = (Word16) get_next_indice( st_fx, bits_lagIndices_modeNormal[sb] ); move16(); } ELSE @@ -144,8 +144,7 @@ static void DecodeSWBSubbands_fx( /* Generate HF noise */ genhf_noise_fx( sspectra_diff_fx, Qss, L_xSynth_har, QsL, sspectra_fx, BANDS_fx, har_bands_fx, har_freq_est2, pos_max_hfe2, pul_res_fx, pk_sf_fx, fLenLow_fx, fLenHigh_fx, sbWidth_fx, lagIndices_fx, subband_offsets_fx, subband_search_offset_fx ); - imin_fx = get_next_indice( st_fx, 2 ); - move16(); + imin_fx = (Word16) get_next_indice( st_fx, 2 ); /* g= pow(10.0f, gain_table_SWB_BWE[imin]) */ L_temp = L_mult( gain_table_SWB_BWE_fx[imin_fx], 27213 ); /* Q14+Q13+1=Q28 log(10)/log(2)=3.3219 27213.23(Q13) */ L_temp = L_shr( L_temp, 12 ); /* Q28-Q12 -> Q16 */ @@ -180,12 +179,12 @@ static void DecodeSWBSubbands_fx( { FOR( i = band_start_fx[k]; i <= band_end_fx[k]; i++ ) { - L_spectra[i] = L_xSynth_har[i - fLenLow_fx]; + L_spectra[i] = L_xSynth_har[sub( i, fLenLow_fx )]; move32(); /* QsL */ } } } - ELSE IF( EQ_16( hqswb_clas_fx, HQ_NORMAL ) ) + ELSE IF( hqswb_clas_fx == HQ_NORMAL ) { ss_min_fx = spectrumsmooth_noiseton_fx( L_spectra, /*QsL,*/ L_spectra_ni, sspectra_fx, sspectra_diff_fx, sspectra_ni_fx, &Qss, fLenLow_fx, ni_seed_fx ); @@ -193,7 +192,7 @@ static void DecodeSWBSubbands_fx( convert_lagIndices_pls2smp_fx( lagIndices_fx, nBands_fx, lagIndices_real_fx, sspectra_fx, sbWidth_fx, fLenLow_fx ); FOR( k = 0; k < nBands_fx; k++ ) { - if ( EQ_16( p2a_flags_fx[BANDS_fx - NB_SWB_SUBBANDS + k], 1 ) ) + if ( EQ_16( p2a_flags_fx[add( BANDS_fx - NB_SWB_SUBBANDS, k )], 1 ) ) { lagIndices_real_fx[k] = 0; move16(); @@ -201,12 +200,12 @@ static void DecodeSWBSubbands_fx( } GetlagGains_fx( sspectra_ni_fx, Qss, - &L_band_energy[BANDS_fx - NB_SWB_SUBBANDS], Qbe, + &L_band_energy[sub( BANDS_fx, NB_SWB_SUBBANDS )], Qbe, nBands_fx, sbWidth_fx, lagIndices_real_fx, fLenLow_fx, lagGains_fx, QlagGains ); FOR( k = 0; k < nBands_fx; k++ ) { - IF( EQ_16( p2a_flags_fx[BANDS_fx - NB_SWB_SUBBANDS + k], 1 ) ) + IF( EQ_16( p2a_flags_fx[add( BANDS_fx - NB_SWB_SUBBANDS, k )], 1 ) ) { lagGains_fx[k] = 0; move16(); @@ -216,15 +215,18 @@ static void DecodeSWBSubbands_fx( ELSE { lagGains_fx[k] = mult_r( lagGains_fx[k], 29491 ); /* lagGains[k]*0.9f; */ + move16(); } } FOR( k = 0; k < NB_SWB_SUBBANDS; k++ ) { - L_th_g[k] = L_deposit_l( 0 ); - IF( p2a_flags_fx[BANDS_fx - NB_SWB_SUBBANDS + k] == 0 ) + L_th_g[k] = 0; + move32(); + IF( p2a_flags_fx[add( BANDS_fx - NB_SWB_SUBBANDS, k )] == 0 ) { L_th_g[k] = L_shl( L_mult( lagGains_fx[k], ss_min_fx ), sub( QsL, add( add( QlagGains[k], Qss ), 1 ) ) ); /* QlagGain+Qss -> Qs */ + move32(); } } @@ -242,7 +244,7 @@ static void DecodeSWBSubbands_fx( { FOR( i = band_start_fx[k]; i <= band_end_fx[k]; i++ ) { - L_spectra[i] = L_xSynth_har[i - fLenLow_fx]; + L_spectra[i] = L_xSynth_har[sub( i, fLenLow_fx )]; move32(); /* QsL */ } } @@ -313,7 +315,7 @@ void swb_bwe_dec_lr_fx( DecodeSWBGenericParameters_fx( st_fx, lagIndices_fx, nBands_search_fx, BANDS_fx, p2a_flags_fx, hqswb_clas_fx ); /* Copy WB synthesis for SWB decoding */ - Copy32( L_m_core, L_m, swb_lowband_fx + swb_highband_fx ); + Copy32( L_m_core, L_m, add( swb_lowband_fx, swb_highband_fx ) ); /* Generic subband processing */ DecodeSWBSubbands_fx( st_fx, st_fx->hHQ_core, L_m, QsL, swb_lowband_fx, swb_highband_fx, nBands_fx, wBands_fx, subband_offsets_fx, @@ -321,7 +323,7 @@ void swb_bwe_dec_lr_fx( L_band_energy, Qbe, p2a_flags_fx, hqswb_clas_fx, har_bands_fx, subband_search_offset_fx, prev_frm_hfe2, prev_stab_hfe2, band_width_fx, L_y2_ni, ni_seed_fx ); - p_L_m = &L_m[sub( allband_fx, 1 )]; + p_L_m = &L_m[allband_fx - 1]; *p_L_m = Mult_32_16( *p_L_m, 2028 ); move32(); p_L_m--; /* 0.0625 = 2028 (Q15) */ @@ -339,6 +341,7 @@ void swb_bwe_dec_lr_fx( FOR( k = 0; k < swb_lowband_fx; k++ ) { L_m[k] = L_deposit_l( 0 ); + move32(); } return; diff --git a/lib_dec/swb_tbe_dec.c b/lib_dec/swb_tbe_dec.c index 70c57bff2..2b1bd7f63 100644 --- a/lib_dec/swb_tbe_dec.c +++ b/lib_dec/swb_tbe_dec.c @@ -468,54 +468,72 @@ static void calc_tilt_bwe_fx_loc( Word64 r0_fx, r1_fx; r0_fx = EPSILON_FX_SMALL; + move64(); FOR( i = 0; i < N; i++ ) { - r0_fx += ( (Word64) sp_fx[i] ) * ( sp_fx[i] ); + r0_fx = W_add( r0_fx, W_shr( W_mult_32_32( sp_fx[i], sp_fx[i] ), 1 ) ); } - r1_fx = abs( sp_fx[1] - sp_fx[0] ); + r1_fx = W_deposit32_l( abs( L_sub( sp_fx[1], sp_fx[0] ) ) ); FOR( i = 2; i < N; i++ ) { - IF( ( (Word64) ( sp_fx[i] - sp_fx[i - 1] ) ) * ( sp_fx[i - 1] - sp_fx[i - 2] ) < 0 ) + IF( W_mult_32_32( L_sub( sp_fx[i], sp_fx[i - 1] ), L_sub( sp_fx[i - 1], sp_fx[i - 2] ) ) < 0 ) { - r1_fx += abs( sp_fx[i] - sp_fx[i - 1] ); + r1_fx = W_add( r1_fx, W_deposit32_l( abs( L_sub( sp_fx[i], sp_fx[i - 1] ) ) ) ); } } Word16 headroom_left_r0 = W_norm( r0_fx ); Word16 headroom_left_r1 = W_norm( r1_fx ); Word16 r0_q = 0, r1_q = 0; + move16(); + move16(); // Word16 r0_bits_occ = 0, r1_bits_occ = 0; - IF( headroom_left_r0 < 32 ) + IF( LT_16( headroom_left_r0, 32 ) ) { - r0_fx = W_shr( r0_fx, ( 32 - headroom_left_r0 ) ); - r0_q = ( 31 - ( ( 2 * OUTPUT_Q ) - ( 32 - headroom_left_r0 ) ) ); + r0_fx = W_shr( r0_fx, sub( 32, headroom_left_r0 ) ); + r0_q = sub( 31, sub( ( 2 * OUTPUT_Q ), sub( 32, headroom_left_r0 ) ) ); } ELSE { r0_q = 31 - ( 2 * OUTPUT_Q ); + move16(); } - IF( headroom_left_r1 < 32 ) + IF( LT_16( headroom_left_r1, 32 ) ) { - r1_fx = W_shr( r1_fx, ( 32 - headroom_left_r1 ) ); - r1_q = ( OUTPUT_Q - ( 32 - headroom_left_r1 ) ); + r1_fx = W_shr( r1_fx, sub( 32, headroom_left_r1 ) ); + r1_q = sub( OUTPUT_Q, sub( 32, headroom_left_r1 ) ); } ELSE { r1_q = OUTPUT_Q; + move16(); + } + Word32 temp_r0_inv = ISqrt32( W_extract_l( r0_fx ), &r0_q ); + Word32 res = Mpy_32_32( W_extract_l( r1_fx ), temp_r0_inv ); + // Word16 res_q = r1_q + ( r0_q < 0 ? ( 31 + ( -1 * r0_q ) ) : r0_q ) - 31; + Word16 res_q; + IF( r0_q < 0 ) + { + res_q = add( r1_q, sub( add( 31, -r0_q ), 31 ) ); + } + ELSE + { + res_q = add( r1_q, sub( r0_q, 31 ) ); } - Word32 temp_r0_inv = ISqrt32( (Word32) r0_fx, &r0_q ); - Word32 res = Mpy_32_32( (Word32) r1_fx, temp_r0_inv ); - Word16 res_q = r1_q + ( r0_q < 0 ? ( 31 + ( -1 * r0_q ) ) : r0_q ) - 31; Word16 norm_res = norm_l( res ); IF( norm_res > 0 ) { *tilt_fx = L_shl_sat( res, norm_res ); - *tilt_fx_q = res_q + norm_res; + move32(); + *tilt_fx_q = add( res_q, norm_res ); + move16(); } ELSE { *tilt_fx = res; + move32(); *tilt_fx_q = res_q; + move16(); } return; } @@ -561,7 +579,7 @@ static void rescale_genSHB_mem_dec( } } - IF( EQ_16( st_fx->extl, FB_TBE ) ) + if ( EQ_16( st_fx->extl, FB_TBE ) ) { } hBWE_TD->mem_csfilt_fx[0] = L_shl( hBWE_TD->mem_csfilt_fx[0], sf ); @@ -619,7 +637,7 @@ static void gradientGainShape( /* get the first gainshape template */ test(); test(); - IF( ( st_fx->prev_coder_type == UNVOICED || st_fx->last_good == UNVOICED_CLAS ) && GainGradFEC[0] > 0 ) + IF( ( EQ_16( st_fx->prev_coder_type, UNVOICED ) || ( st_fx->last_good == UNVOICED_CLAS ) ) && ( GainGradFEC[0] > 0 ) ) { GainShapeTemp[0] = add( shr( st_fx->GainShape_Delay[7], 1 ), GainGradFEC[0] ); move16(); @@ -641,7 +659,7 @@ static void gradientGainShape( tmp = mult_r( tmp, 26214 ); /* 0.8 in Q15 tmp*(8/10) */ test(); - IF( ( GT_16( tmp, GainGrad1[1] ) ) && GainGrad1[1] > 0 ) + IF( ( GT_16( tmp, GainGrad1[1] ) ) && ( GainGrad1[1] > 0 ) ) { FOR( i = 1; i < NUM_SHB_SUBFR / 4; i++ ) { @@ -654,7 +672,7 @@ static void gradientGainShape( ELSE { test(); - IF( ( GT_16( tmp, GainGrad1[1] ) ) && GainGrad1[1] < 0 ) + IF( ( GT_16( tmp, GainGrad1[1] ) ) && ( GainGrad1[1] < 0 ) ) { FOR( i = 1; i < NUM_SHB_SUBFR / 4; i++ ) { @@ -680,7 +698,7 @@ static void gradientGainShape( test(); test(); test(); - IF( ( st_fx->prev_coder_type == UNVOICED || st_fx->last_good == UNVOICED_CLAS ) && st_fx->nbLostCmpt == 1 ) + IF( ( EQ_16( st_fx->prev_coder_type, UNVOICED ) || ( st_fx->last_good == UNVOICED_CLAS ) ) && EQ_16( st_fx->nbLostCmpt, 1 ) ) { FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) { @@ -690,19 +708,20 @@ static void gradientGainShape( IF( GT_16( 8192, tmp ) ) { - GainShape_fx[i * 4 + j] = shl( tmp, 2 ); + GainShape_fx[add( i * 4, j )] = shl( tmp, 2 ); move16(); /* (GainShapeTemp[i]*0.6)>>1 */ } ELSE { - GainShape_fx[i * 4 + j] = 32767; + GainShape_fx[add( i * 4, j )] = 32767; move16(); /* Clipping here to avoid the a huge change of the code due to gain shape change */ } } } hBWE_TD->GainAttn_fx = mult_r( hBWE_TD->GainAttn_fx, 31129 ); + move16(); } - ELSE IF( st_fx->prev_coder_type == UNVOICED || st_fx->last_good == UNVOICED_CLAS ) + ELSE IF( EQ_16( st_fx->prev_coder_type, UNVOICED ) || ( st_fx->last_good == UNVOICED_CLAS ) ) { FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) { @@ -710,29 +729,31 @@ static void gradientGainShape( { IF( LT_16( GainShapeTemp[i], 16384 ) ) { - GainShape_fx[i * 4 + j] = shl( GainShapeTemp[i], 1 ); + GainShape_fx[add( i * 4, j )] = shl( GainShapeTemp[i], 1 ); move16(); } ELSE { - GainShape_fx[i * 4 + j] = 32767; + GainShape_fx[add( i * 4, j )] = 32767; move16(); } } } hBWE_TD->GainAttn_fx = mult_r( hBWE_TD->GainAttn_fx, 31129 ); + move16(); } - ELSE IF( st_fx->nbLostCmpt > 1 ) + ELSE IF( GT_16( st_fx->nbLostCmpt, 1 ) ) { FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) { FOR( j = 0; j < 4; j++ ) { - GainShape_fx[i * 4 + j] = GainShapeTemp[i]; + GainShape_fx[add( i * 4, j )] = GainShapeTemp[i]; move16(); } } hBWE_TD->GainAttn_fx = mult_r( hBWE_TD->GainAttn_fx, 16384 ); + move16(); } ELSE { @@ -742,20 +763,22 @@ static void gradientGainShape( { IF( LT_16( GainShapeTemp[i], 16384 ) ) { - GainShape_fx[i * 4 + j] = shl( GainShapeTemp[i], 1 ); + GainShape_fx[add( i * 4, j )] = shl( GainShapeTemp[i], 1 ); move16(); } ELSE { - GainShape_fx[i * 4 + j] = 32767; + GainShape_fx[add( i * 4, j )] = 32767; move16(); } } } hBWE_TD->GainAttn_fx = mult_r( hBWE_TD->GainAttn_fx, 27852 ); + move16(); } *GainFrame_fx = Mult_32_16( hBWE_TD->GainFrame_prevfrm_fx, hBWE_TD->GainAttn_fx ); /* Q18 */ + move32(); } static void find_max_mem_dec( @@ -767,8 +790,11 @@ static void find_max_mem_dec( Word16 i; Word16 n_mem_32; Word16 max = 0; + move16(); Word32 Lmax = 0; + move32(); Word16 tempQ15, max2 = 0; + move16(); Word16 max3; Word32 tempQ32, Lmax3; TD_BWE_DEC_HANDLE hBWE_TD; @@ -813,9 +839,14 @@ static void find_max_mem_dec( /* for total_brate > 16.4kbps, use n_mem2; else account for the max2 for n_mem calculation */ *n_mem2 = norm_s( max2 ); - IF( max2 == 0 ) *n_mem2 = 15; + move16(); + if ( max2 == 0 ) + { + *n_mem2 = 15; + move16(); + } - IF( LT_32( st_fx->total_brate, ACELP_24k40 ) ) + if ( LT_32( st_fx->total_brate, ACELP_24k40 ) ) { max = s_max( max, max2 ); } @@ -840,22 +871,26 @@ static void find_max_mem_dec( } /* estimate the norm for 16-bit memories */ *n_mem = norm_s( max ); - IF( max == 0 ) + move16(); + if ( max == 0 ) { *n_mem = 15; + move16(); } /* estimate the norm for 32-bit memories */ Lmax = L_abs( hBWE_TD->mem_csfilt_fx[0] ); /* only element [0] is used in env. shaping */ n_mem_32 = norm_l( Lmax ); - IF( Lmax == 0 ) + if ( Lmax == 0 ) { n_mem_32 = 31; + move16(); } tempQ15 = sub( s_min( *n_mem, n_mem_32 ), 1 ); *n_mem = s_max( tempQ15, 0 ); + move16(); /* --------------------------------------------------------------*/ /* Find headroom for synthesis stage associated with these memories: @@ -863,6 +898,7 @@ static void find_max_mem_dec( 2. st_fx->genSHBsynth_state_lsyn_filt_shb_local 3. st_fx->genSHBsynth_Hilbert_Mem_fx (32-bit) */ max3 = 0; + move16(); /* find max in prev overlapSyn */ FOR( i = 0; i < L_SHB_LAHEAD; i++ ) { @@ -894,9 +930,15 @@ static void find_max_mem_dec( } /* estimate the norm for 16-bit memories */ *n_mem3 = norm_s( max3 ); - IF( max3 == 0 ) *n_mem3 = 15; + move16(); + if ( max3 == 0 ) + { + *n_mem3 = 15; + move16(); + } Lmax3 = 0; + move32(); IF( EQ_16( st_fx->L_frame, L_FRAME ) ) { /* find max in prev genSHBsynth_Hilbert_Mem_fx */ @@ -909,12 +951,16 @@ static void find_max_mem_dec( /* estimate the norm for 32-bit memories */ n_mem_32 = norm_l( Lmax3 ); - IF( Lmax3 == 0 ) - n_mem_32 = 31; + if ( Lmax3 == 0 ) + { + n_mem_32 = 31; + move16(); + } tempQ15 = sub( s_min( *n_mem3, n_mem_32 ), 2 ); /* very important leave at least 2 bit head room because of the Hilber transform and Q14 coeffs */ *n_mem3 = s_max( tempQ15, 0 ); + move16(); /* --------------------------------------------------------------*/ } #endif // IVAS_FLOAT_FIXED @@ -935,6 +981,7 @@ void find_max_mem_dec_m3( /* Find headroom for synthesis stage associated with these memories: 1. st->syn_overlap_fx*/ max3 = 0; + move16(); /* find max in prev overlapSyn */ FOR( i = 0; i < L_SHB_LAHEAD; i++ ) { @@ -966,7 +1013,12 @@ void find_max_mem_dec_m3( // } /* estimate the norm for 16-bit memories */ *n_mem3 = norm_s( max3 ); - IF( max3 == 0 ) *n_mem3 = 15; + move16(); + if ( max3 == 0 ) + { + *n_mem3 = 15; + move16(); + } // Lmax3 = 0; // IF(EQ_16(st->L_frame, L_FRAME)) @@ -1080,7 +1132,7 @@ void ivas_swb_tbe_dec_fx( shb_ener_sf_32 = 0; move32(); set16_fx( shaped_shb_excitationTemp_fx, 0, L_FRAME16k ); - IF( st->hTdCngDec != NULL ) + if ( st->hTdCngDec != NULL ) { st->hTdCngDec->shb_dtx_count = 0; move16(); @@ -1105,16 +1157,19 @@ void ivas_swb_tbe_dec_fx( /* find tilt */ calc_tilt_bwe_fx_loc( old_syn_12k8_16k_fx, &tilt_swb_fec_32_fx, &tilt_swb_fec_fx_q, L_FRAME ); - tilt_swb_fec_fx = extract_l( L_shr( tilt_swb_fec_32_fx, ( tilt_swb_fec_fx_q - 11 ) ) ); + tilt_swb_fec_fx = extract_l( L_shr( tilt_swb_fec_32_fx, sub( tilt_swb_fec_fx_q, 11 ) ) ); - IF( st->bfi && st->clas_dec != UNVOICED_CLAS ) + test(); + if ( st->bfi && st->clas_dec != UNVOICED_CLAS ) { tilt_swb_fec_fx = hBWE_TD->tilt_swb_fec_fx; move16(); } /* WB/SWB bandwidth switching */ - IF( ( st->tilt_wb_fx > 10240 && st->clas_dec == UNVOICED_CLAS ) || st->tilt_wb_fx > 20480 ) + test(); + test(); + IF( ( GT_16( st->tilt_wb_fx, 10240 ) && ( st->clas_dec == UNVOICED_CLAS ) ) || GT_16( st->tilt_wb_fx, 20480 ) ) { test(); test(); @@ -1123,7 +1178,8 @@ void ivas_swb_tbe_dec_fx( test(); test(); test(); - IF( ( st->prev_fractive == 0 && + test(); + IF( ( ( st->prev_fractive == 0 ) && ( LT_32( st->prev_enerLH_fx, L_shl( st->enerLH_fx, 1 ) ) && GT_32( st->prev_enerLH_fx, L_shr( st->enerLH_fx, 1 ) ) && LT_32( st->prev_enerLL_fx, L_shl( st->enerLL_fx, 1 ) ) && GT_32( st->prev_enerLL_fx, L_shr( st->enerLL_fx, 1 ) ) ) ) || ( EQ_16( st->prev_fractive, 1 ) && GT_32( L_shr( st->prev_enerLH_fx, 2 ), Mult_32_16( st->enerLH_fx, 24576 ) ) ) /* 24576 in Q13*/ @@ -1149,7 +1205,7 @@ void ivas_swb_tbe_dec_fx( inc_fx = 1489; /*Q15*/ move16(); - IF( is_fractive == 1 ) + IF( EQ_16( is_fractive, 1 ) ) { Copy( lsf_tab_fx, hBWE_TD->lsp_prevfrm_fx, LPC_SHB_ORDER ); } @@ -1162,13 +1218,20 @@ void ivas_swb_tbe_dec_fx( f_fx = add( f_fx, inc_fx ); } } - IF( ( st->last_extl != SWB_TBE && st->last_extl != FB_TBE && !( L_sub( L_shr( st->prev_enerLH_fx, 1 ), st->enerLH_fx ) < 0 && L_sub( st->prev_enerLH_fx, L_shr( st->enerLH_fx, 1 ) > 0 ) ) ) || st->last_core != ACELP_CORE || ( st->last_core == ACELP_CORE && labs( st->last_core_brate - st->core_brate ) > 3600 ) || ( is_fractive ^ st->prev_fractive ) == 1 ) + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( NE_16( st->last_extl, SWB_TBE ) && NE_16( st->last_extl, FB_TBE ) && !( ( L_sub( L_shr( st->prev_enerLH_fx, 1 ), st->enerLH_fx ) < 0 ) && L_sub( st->prev_enerLH_fx, ( L_shr( st->enerLH_fx, 1 ) > 0 ) ) ) ) || st->last_core != ACELP_CORE || ( ( st->last_core == ACELP_CORE ) && GT_32( abs( L_sub( st->last_core_brate, st->core_brate ) ), 3600 ) ) || EQ_16( s_xor( is_fractive, st->prev_fractive ), 1 ) ) { set16_fx( GainShape_fx, 11587, NUM_SHB_SUBFR ); } ELSE { - IF( GT_16( hBWE_TD->prev_GainShape_fx, 11587 ) ) + if ( GT_16( hBWE_TD->prev_GainShape_fx, 11587 ) ) { hBWE_TD->prev_GainShape_fx = 11587; move16(); @@ -1181,7 +1244,8 @@ void ivas_swb_tbe_dec_fx( } ELSE { - IF( st->last_extl != SWB_TBE && st->last_extl != FB_TBE ) + test(); + IF( NE_16( st->last_extl, SWB_TBE ) && NE_16( st->last_extl, FB_TBE ) ) { f_fx = 1489; /*Q15*/ move16(); @@ -1199,7 +1263,7 @@ void ivas_swb_tbe_dec_fx( { IF( st->use_partial_copy ) { - IF( st->last_extl != SWB_TBE ) + IF( NE_16( st->last_extl, SWB_TBE ) ) { hBWE_TD->GainFrame_prevfrm_fx = 0; move32(); @@ -1217,7 +1281,7 @@ void ivas_swb_tbe_dec_fx( Copy( hBWE_TD->lsp_prevfrm_fx, lsf_shb_fx, LPC_SHB_ORDER ); set16_fx( GainShape_fx, RECIP_ROOT_EIGHT_FX, NUM_SHB_SUBFR ); - IF( st->rf_frame_type == RF_NELP ) + IF( EQ_16( st->rf_frame_type, RF_NELP ) ) { /* Frame gain */ @@ -1228,7 +1292,13 @@ void ivas_swb_tbe_dec_fx( L_tmp = Pow2( 30, frac ); GainFrame_fx = L_shl( L_tmp, sub( exp, 12 ) ); /*Q18*/ - IF( st->core == ACELP_CORE && st->last_core == ACELP_CORE && !st->prev_use_partial_copy && st->prev_coder_type == UNVOICED && NE_32( GainFrame_fx, hBWE_TD->GainFrame_prevfrm_fx ) && st->next_coder_type != GENERIC && st->last_extl == SWB_TBE ) + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( st->core == ACELP_CORE ) && ( st->last_core == ACELP_CORE ) && !st->prev_use_partial_copy && EQ_16( st->prev_coder_type, UNVOICED ) && NE_32( GainFrame_fx, hBWE_TD->GainFrame_prevfrm_fx ) && NE_16( st->next_coder_type, GENERIC ) && EQ_16( st->last_extl, SWB_TBE ) ) { GainFrame_fx = L_add( Mult_32_16( hBWE_TD->GainFrame_prevfrm_fx, 26214 ), Mult_32_16( GainFrame_fx, 6553 ) ); } @@ -1243,33 +1313,41 @@ void ivas_swb_tbe_dec_fx( case 0: GainFrame_fx = 131072; /* 0.5f in Q18 */ move32(); - IF( LE_32( hBWE_TD->GainFrame_prevfrm_fx, 327680l /*1.25 Q18*/ ) ) - temp_fx = 26214 /*0.8 Q15*/; - move16(); + if ( LE_32( hBWE_TD->GainFrame_prevfrm_fx, 327680l /*1.25 Q18*/ ) ) + { + temp_fx = 26214 /*0.8 Q15*/; + move16(); + } BREAK; case 1: GainFrame_fx = 524288; /* 2.0f in Q18 */ move32(); - IF( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 327680l /*1.25 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 786432l /*3 Q18*/ ) ) - temp_fx = 26214 /*0.8 Q15*/; - move16(); test(); + if ( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 327680l /*1.25 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 786432l /*3 Q18*/ ) ) + { + temp_fx = 26214 /*0.8 Q15*/; + move16(); + } BREAK; case 2: GainFrame_fx = 1048576; /* 4.0f in Q18 */ move32(); - IF( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 786432l /*3 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 1572864l /*6 Q18*/ ) ) - temp_fx = 26214 /*0.8 Q15*/; - move16(); test(); + if ( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 786432l /*3 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 1572864l /*6 Q18*/ ) ) + { + temp_fx = 26214 /*0.8 Q15*/; + move16(); + } BREAK; case 3: GainFrame_fx = 2097152; /* 8.0f in Q18 */ move32(); - IF( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 1572864l /*6 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 4194304l /*16Q18*/ ) ) - temp_fx = 26214 /*0.8 Q15*/; - move16(); test(); + if ( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 1572864l /*6 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 4194304l /*16Q18*/ ) ) + { + temp_fx = 26214 /*0.8 Q15*/; + move16(); + } BREAK; default: fprintf( stderr, "RF SWB-TBE gain bits not supported." ); @@ -1280,9 +1358,9 @@ void ivas_swb_tbe_dec_fx( GainFrame_fx = L_add( Mult_32_16( hBWE_TD->GainFrame_prevfrm_fx, temp_fx ), Mult_32_16( GainFrame_fx, sub( 32767, temp_fx ) ) ); } - IF( st->core == ACELP_CORE && st->last_core == ACELP_CORE ) + IF( ( st->core == ACELP_CORE ) && ( st->last_core == ACELP_CORE ) ) { - IF( !st->prev_use_partial_copy && st->last_coder_type == VOICED && st->rf_frame_type == RF_GENPRED && GT_32( GainFrame_fx, 2097152 ) && LT_32( GainFrame_fx, 3059606 ) ) + if ( !st->prev_use_partial_copy && EQ_16( st->last_coder_type, VOICED ) && EQ_16( st->rf_frame_type, RF_GENPRED ) && GT_32( GainFrame_fx, 2097152 ) && LT_32( GainFrame_fx, 3059606 ) ) { GainFrame_fx = Mult_32_16( GainFrame_fx, 9830 ); } @@ -1294,7 +1372,7 @@ void ivas_swb_tbe_dec_fx( /* de-quantization */ ivas_dequantizeSHBparams_fx_9_1( st, st->extl, st->extl_brate, lsf_shb_fx, GainShape_fx, &GainFrame_fx, &stemp, &shb_ener_sf_32, shb_res_gshape_fx, &mixFactors_fx, &MSFlag ); - IF( hStereoICBWE != NULL ) + if ( hStereoICBWE != NULL ) { hStereoICBWE->MSFlag = MSFlag; move16(); @@ -1304,8 +1382,8 @@ void ivas_swb_tbe_dec_fx( ELSE { Copy( hBWE_TD->lsp_prevfrm_fx, lsf_shb_fx, LPC_SHB_ORDER ); - - IF( st->codec_mode == MODE1 && st->element_mode == EVS_MONO ) + test(); + IF( EQ_16( st->codec_mode, MODE1 ) && ( st->element_mode == EVS_MONO ) ) { gradientGainShape( st, GainShape_fx, &GainFrame_fx ); } @@ -1315,11 +1393,11 @@ void ivas_swb_tbe_dec_fx( { FOR( j = 0; j < 4; j++ ) { - GainShape_fx[i * 4 + j] = mult_r( st->cummulative_damping, st->GainShape_Delay[4 + i] ); + GainShape_fx[add( i * 4, j )] = mult_r( st->cummulative_damping, st->GainShape_Delay[4 + i] ); move16(); } } - IF( GT_16( tilt_swb_fec_fx, 8 << 11 ) ) /* tilt_swb_fec_fx in Q11 */ + IF( GT_16( tilt_swb_fec_fx, ( 8 << 11 ) ) ) /* tilt_swb_fec_fx in Q11 */ { IF( EQ_16( st->nbLostCmpt, 1 ) ) { @@ -1342,9 +1420,10 @@ void ivas_swb_tbe_dec_fx( } } - IF( st->extl_brate >= SWB_TBE_2k8 ) + IF( GE_32( st->extl_brate, SWB_TBE_2k8 ) ) { - IF( st->codec_mode == MODE1 && st->element_mode == EVS_MONO ) + test(); + IF( EQ_16( st->codec_mode, MODE1 ) && ( st->element_mode == EVS_MONO ) ) { L_tmp = L_mult( extract_l( hBWE_TD->prev2_shb_ener_sf_fx ), extract_l( hBWE_TD->prev3_shb_ener_sf_fx ) ); /*Q1*/ tmp = round_fx( root_a_fx( L_tmp, 1, &exp ) ); /* Q = 15-exp */ @@ -1361,19 +1440,19 @@ void ivas_swb_tbe_dec_fx( scale_fx = div_s( tmp1, tmp ); /* Q15 - Q(15-exp) + Qi = Qexp+i */ scale_fx = s_max( scale_fx, 0 ); #ifdef BASOP_NOGLOB - tmp = shl_sat( scale_fx, 15 - exp - i ); /*Q15*/ + tmp = shl_sat( scale_fx, sub( sub( 15, exp ), i ) ); /*Q15*/ #else tmp = shl( scale, 15 - exp - i ); /*Q15*/ #endif } scale_fx = mult_r( hBWE_TD->prev_res_shb_gshape_fx, tmp ); /* Q14 */ - + test(); IF( GT_32( L_shr( hBWE_TD->prev2_shb_ener_sf_fx, 1 ), hBWE_TD->prev1_shb_ener_sf_fx ) || GT_32( L_shr( hBWE_TD->prev3_shb_ener_sf_fx, 1 ), hBWE_TD->prev2_shb_ener_sf_fx ) ) { shb_ener_sf_32 = Mult_32_16( hBWE_TD->prev1_shb_ener_sf_fx, scale_fx ); - IF( GT_16( st->nbLostCmpt, 1 ) ) + if ( GT_16( st->nbLostCmpt, 1 ) ) { shb_ener_sf_32 = L_shr( shb_ener_sf_32, 1 ); } @@ -1386,6 +1465,7 @@ void ivas_swb_tbe_dec_fx( } ELSE { + test(); IF( GT_32( L_shr( hBWE_TD->prev2_shb_ener_sf_fx, 1 ), hBWE_TD->prev1_shb_ener_sf_fx ) || GT_32( L_shr( hBWE_TD->prev3_shb_ener_sf_fx, 1 ), hBWE_TD->prev2_shb_ener_sf_fx ) ) { @@ -1428,6 +1508,7 @@ void ivas_swb_tbe_dec_fx( Copy( voice_factors_fx, vf_modified_fx, NB_SUBFR16k ); + test(); IF( EQ_16( st->coder_type, VOICED ) || GT_16( mean_vf, 13107 /*0.4f Q15*/ ) ) { FOR( i = 1; i < NB_SUBFR; i++ ) @@ -1445,6 +1526,7 @@ void ivas_swb_tbe_dec_fx( } } + test(); IF( st->use_partial_copy && st->nelp_mode_dec ) { set16_fx( vf_modified_fx, 0, NB_SUBFR16k ); @@ -1453,7 +1535,8 @@ void ivas_swb_tbe_dec_fx( /* SHB LSF from current frame; and convert to LSP for interpolation */ E_LPC_lsf_lsp_conversion( lsf_shb_fx, lsp_shb_2_fx, LPC_SHB_ORDER ); - IF( st->last_extl == SWB_TBE || st->last_extl == FB_TBE ) + test(); + IF( EQ_16( st->last_extl, SWB_TBE ) || EQ_16( st->last_extl, FB_TBE ) ) { /* SHB LSP values from prev. frame for interpolation */ Copy( hBWE_TD->swb_lsp_prev_interp_fx, lsp_shb_1_fx, LPC_SHB_ORDER ); @@ -1464,15 +1547,18 @@ void ivas_swb_tbe_dec_fx( Copy( lsp_shb_2_fx, lsp_shb_1_fx, LPC_SHB_ORDER ); } - IF( st->bws_cnt == 0 && st->bws_cnt1 == 0 && st->prev_use_partial_copy == 0 && st->use_partial_copy == 0 ) + test(); + test(); + test(); + IF( ( st->bws_cnt == 0 ) && ( st->bws_cnt1 == 0 ) && ( st->prev_use_partial_copy == 0 ) && ( st->use_partial_copy == 0 ) ) { lsf_diff_fx[0] = 16384; move16(); /*Q15*/ - lsf_diff_fx[sub( LPC_SHB_ORDER, 1 )] = 16384; + lsf_diff_fx[LPC_SHB_ORDER - 1] = 16384; move16(); /*Q15*/ FOR( i = 1; i < LPC_SHB_ORDER - 1; i++ ) { - lsf_diff_fx[i] = sub( lsf_shb_fx[i], lsf_shb_fx[sub( i, 1 )] ); + lsf_diff_fx[i] = sub( lsf_shb_fx[i], lsf_shb_fx[i - 1] ); move16(); } @@ -1483,7 +1569,8 @@ void ivas_swb_tbe_dec_fx( tmp2 = shr( mult( 31715, tmp ), 2 ); /*Q10*/ tilt_para_fx = add( sub( tmp1, tmp2 ), 1335 ); /*Q10*/ - IF( st->last_extl != SWB_TBE && st->last_extl != FB_TBE ) + test(); + IF( NE_16( st->last_extl, SWB_TBE ) && NE_16( st->last_extl, FB_TBE ) ) { FOR( i = 1; i < LPC_SHB_ORDER - 1; i++ ) { @@ -1492,8 +1579,13 @@ void ivas_swb_tbe_dec_fx( } } - IF( st->extl_brate <= FB_TBE_1k8 ) + IF( LE_32( st->extl_brate, FB_TBE_1k8 ) ) { + test(); + test(); + test(); + test(); + test(); IF( !( GT_16( hBWE_TD->prev_tilt_para_fx, 5120 ) && ( EQ_16( st->coder_type, TRANSITION ) || LT_16( tilt_para_fx, 1024 ) ) ) && !( ( ( LT_16( hBWE_TD->prev_tilt_para_fx, 3072 ) && GE_16( st->prev_coder_type, VOICED ) ) ) && GT_16( tilt_para_fx, 5120 ) ) ) { @@ -1504,7 +1596,7 @@ void ivas_swb_tbe_dec_fx( tmp = mult( 26214, lsf_diff_fx[i] ); test(); - IF( hBWE_TD->prev_lsf_diff_fx[i - 1] <= 0 || tmp < 0 ) /* safety check in case of bit errors */ + IF( ( hBWE_TD->prev_lsf_diff_fx[i - 1] <= 0 ) || ( tmp < 0 ) ) /* safety check in case of bit errors */ { st->BER_detect = 1; move16(); @@ -1525,7 +1617,7 @@ void ivas_swb_tbe_dec_fx( tmp = mult( 26214, hBWE_TD->prev_lsf_diff_fx[i - 1] ); test(); - IF( lsf_diff_fx[i] <= 0 || tmp < 0 ) /* safety check in case of bit errors */ + IF( ( lsf_diff_fx[i] <= 0 ) || ( tmp < 0 ) ) /* safety check in case of bit errors */ { st->BER_detect = 1; move16(); @@ -1544,7 +1636,7 @@ void ivas_swb_tbe_dec_fx( } w_fx[0] = w_fx[1]; move16(); - w_fx[sub( LPC_SHB_ORDER, 1 )] = w_fx[sub( LPC_SHB_ORDER, 2 )]; + w_fx[LPC_SHB_ORDER - 1] = w_fx[LPC_SHB_ORDER - 2]; move16(); FOR( i = 0; i < LPC_SHB_ORDER; i++ ) @@ -1566,13 +1658,14 @@ void ivas_swb_tbe_dec_fx( Copy( lsf_diff_fx + 1, hBWE_TD->prev_lsf_diff_fx, LPC_SHB_ORDER - 2 ); hBWE_TD->prev_tilt_para_fx = tilt_para_fx; + move16(); } ELSE { Copy( lsp_shb_2_fx, lsp_temp_fx, LPC_SHB_ORDER ); } - IF( st->extl_brate >= SWB_TBE_2k8 ) + IF( GE_32( st->extl_brate, SWB_TBE_2k8 ) ) { /* SHB LSP interpolation */ ptr_lsp_interp_coef_fx = interpol_frac_shb; /*Q15*/ @@ -1591,7 +1684,8 @@ void ivas_swb_tbe_dec_fx( E_LPC_f_lsp_a_conversion( lsp_temp_fx, lpc_shb_sf_fx + tmp, LPC_SHB_ORDER ); /* Bring the LPCs to Q12 */ Copy_Scale_sig( lpc_shb_sf_fx + tmp, lpc_shb_sf_fx + tmp, LPC_SHB_ORDER + 1, sub( norm_s( lpc_shb_sf_fx[tmp] ), 2 ) ); - lpc_shb_sf_fx[j * ( LPC_SHB_ORDER + 1 )] = ONE_IN_Q12; // recheck this + lpc_shb_sf_fx[i_mult( j, ( LPC_SHB_ORDER + 1 ) )] = ONE_IN_Q12; // recheck this + move16(); } } @@ -1623,10 +1717,11 @@ void ivas_swb_tbe_dec_fx( lpc_shb_fx[0] = ONE_IN_Q12; move16(); - IF( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) + test(); + IF( EQ_32( st->extl_brate, SWB_TBE_1k10 ) || EQ_32( st->extl_brate, SWB_TBE_1k75 ) ) { - Word32 vind_temp = ( L_add( mixFactors_fx, 1 ) * ( ( 1 << NUM_BITS_SHB_VF ) - 1 ) ); // check addition of 1 - vind = extract_l( L_shr( vind_temp, 15 ) ); /* 3 for mpy by 8.0f, -15 to bring it to Q0 */ /*mixFactors*7*/ + Word32 vind_temp = Mpy_32_32( L_shl( L_add( L_deposit_l( mixFactors_fx ), 1 ), 15 ), ( ( ( 1 << NUM_BITS_SHB_VF ) - 1 ) << 16 ) ); // check addition of 1 + vind = extract_l( L_shr( vind_temp, 15 ) ); /* 3 for mpy by 8.0f, -15 to bring it to Q0 */ /*mixFactors*7*/ /* i: mixFactors_fx in Q15 */ /* o: vind in Q0 */ } @@ -1640,11 +1735,11 @@ void ivas_swb_tbe_dec_fx( /* Determine formant PF strength */ formant_fac_fx = swb_formant_fac_fx( lpc_shb_fx[1], &hBWE_TD->tilt_mem_fx ); /* i:lpc_shb_fx Q12, o:formant_fac_fx Q15 */ - IF( st->total_brate > ACELP_32k ) + IF( GT_32( st->total_brate, ACELP_32k ) ) { FOR( j = 0; j < 4; j++ ) { - Copy( lpc_shb_fx, &lpc_shb_sf_fx[j * ( LPC_SHB_ORDER + 1 )], LPC_SHB_ORDER + 1 ); + Copy( lpc_shb_fx, &lpc_shb_sf_fx[i_mult( j, ( LPC_SHB_ORDER + 1 ) )], LPC_SHB_ORDER + 1 ); } } @@ -1659,7 +1754,7 @@ void ivas_swb_tbe_dec_fx( Lmax = L_max( Lmax, L_abs( bwe_exc_extended_fx[cnt] ) ); } Q_bwe_exc = norm_l( Lmax ); - IF( Lmax == 0 ) + if ( Lmax == 0 ) { Q_bwe_exc = 31; move16(); @@ -1668,7 +1763,7 @@ void ivas_swb_tbe_dec_fx( find_max_mem_dec( st, &n_mem, &n_mem2, &n_mem3 ); /* for >=24.4, use n_mem2 lpc_syn, shb_20sample, and mem_stp_swb_fx memory */ tmp = add( st->prev_Q_bwe_exc, n_mem ); - IF( GT_16( Q_bwe_exc, tmp ) ) + if ( GT_16( Q_bwe_exc, tmp ) ) { Q_bwe_exc = tmp; move16(); @@ -1691,6 +1786,7 @@ void ivas_swb_tbe_dec_fx( #else bwe_exc_extended_16[cnt + NL_BUFF_OFFSET] = round_fx( L_shl( bwe_exc_extended[cnt], sc ) ); #endif + move16(); } /* state_syn_shbexc_fx is kept at (st_fx->prev_Q_bwe_syn) for 24.4/32kbps or is kept at Q_bwe_exc for 13.2/16.4kbps */ @@ -1738,12 +1834,14 @@ void ivas_swb_tbe_dec_fx( /* rescale the TBE post proc memory */ FOR( i = 0; i < LPC_SHB_ORDER; i++ ) { - hBWE_TD->mem_stp_swb_fx[i] = shl( hBWE_TD->mem_stp_swb_fx[i], Q_bwe_exc - st->prev_Q_bwe_syn ); + hBWE_TD->mem_stp_swb_fx[i] = shl( hBWE_TD->mem_stp_swb_fx[i], sub( Q_bwe_exc, st->prev_Q_bwe_syn ) ); move16(); } #endif /* fill-in missing SHB excitation */ - IF( ( st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT ) && st->last_core_brate <= SID_2k40 ) + test(); + test(); + IF( ( EQ_16( st->element_mode, IVAS_CPE_TD ) || EQ_16( st->element_mode, IVAS_CPE_DFT ) ) && LE_32( st->last_core_brate, SID_2k40 ) ) { Copy( shaped_shb_excitation_fx + L_SHB_LAHEAD, shaped_shb_excitation_fx, L_SHB_LAHEAD ); } @@ -1753,7 +1851,8 @@ void ivas_swb_tbe_dec_fx( Copy( shaped_shb_excitation_fx + L_SHB_LAHEAD, hStereoICBWE->shbSynthRef_fx, L_FRAME16k ); } - IF( st->extl_brate != SWB_TBE_1k10 && st->extl_brate != SWB_TBE_1k75 ) + test(); + IF( NE_32( st->extl_brate, SWB_TBE_1k10 ) && NE_32( st->extl_brate, SWB_TBE_1k75 ) ) { FOR( i = 0; i < L_FRAME16k; i += L_SUBFR16k ) { @@ -1783,7 +1882,7 @@ void ivas_swb_tbe_dec_fx( #endif } - IF( GT_16( voice_factors_fx[0], 24576 /*0.75f Q15*/ ) ) + if ( GT_16( voice_factors_fx[0], 24576 /*0.75f Q15*/ ) ) { curr_pow_fx = L_shr( curr_pow_fx, 2 ); /* Q(2*Q_bwe_exc) */ } @@ -1804,6 +1903,7 @@ void ivas_swb_tbe_dec_fx( { Lscale = L_shl( Lscale, exp ); exp = 0; + move16(); } FOR( ; i < L_SHB_LAHEAD + 10; i++ ) { @@ -1833,6 +1933,7 @@ void ivas_swb_tbe_dec_fx( /* Update SHB excitation */ Copy( shaped_shb_excitation_fx + L_FRAME16k, hBWE_TD->state_syn_shbexc_fx, L_SHB_LAHEAD ); /* Q_bwe_exc */ l_subframe = L_FRAME16k / NUM_SHB_SUBGAINS; + move16(); L_ener = EPSILON_FX_SMALL; move32(); @@ -1847,7 +1948,7 @@ void ivas_swb_tbe_dec_fx( move64(); FOR( j = 0; j < l_subframe; j++ ) { - tmp64 = W_mac0_16_16( tmp64, shaped_shb_excitation_fx[i * l_subframe + j], shaped_shb_excitation_fx[i * l_subframe + j] ); /* 2*Q_bwe_exc */ + tmp64 = W_mac0_16_16( tmp64, shaped_shb_excitation_fx[add( i_mult( i, l_subframe ), j )], shaped_shb_excitation_fx[add( i_mult( i, l_subframe ), j )] ); /* 2*Q_bwe_exc */ } L_tmp = W_sat_l( tmp64 ); @@ -1856,7 +1957,7 @@ void ivas_swb_tbe_dec_fx( { exp = norm_l( L_tmp ); tmp = extract_h( L_shl( L_tmp, exp ) ); - exp = sub( exp, 30 - ( 2 * Q_bwe_exc ) ); + exp = sub( exp, sub( 30, i_mult( 2, Q_bwe_exc ) ) ); tmp = div_s( 16384, tmp ); L_tmp = L_deposit_h( tmp ); @@ -1890,7 +1991,7 @@ void ivas_swb_tbe_dec_fx( move16(); } test(); - IF( st->prev_fractive == 1 && GT_16( st->tilt_wb_fx, 1024 ) ) + if ( EQ_16( st->prev_fractive, 1 ) && GT_16( st->tilt_wb_fx, 1024 ) ) { st->tilt_wb_fx = 1024; move16(); @@ -1914,6 +2015,7 @@ void ivas_swb_tbe_dec_fx( ELSE { st->tilt_wb_fx = shl( st->tilt_wb_fx, 2 ); + move16(); } } @@ -1932,6 +2034,7 @@ void ivas_swb_tbe_dec_fx( #else st->tilt_wb_fx = extract_h( L_shr( Mult_32_16( st->enerLH_fx, inv_ener ), sub( sub( st->Q_syn2, exp_ener ), 16 ) ) ); /*Q11*/ #endif + move16(); /*st->Q_syn2 -1 + 26- exp_ener -15 -(st->Q_syn2 -exp_ener -16 ) -16 +1 -1 = (11) *0.5*/ } ELSE IF( LT_32( L_tmp, Mult_32_16( st->enerLH_fx, 1638 ) ) && EQ_16( is_fractive, 1 ) ) @@ -1941,6 +2044,7 @@ void ivas_swb_tbe_dec_fx( #else st->tilt_wb_fx = extract_h( L_shr( Mult_32_16( st->enerLH_fx, inv_ener ), sub( sub( st->Q_syn2, exp_ener ), 15 ) ) ); /*Q11*/ #endif + move16(); /*st->Q_syn2 -1 + 26- exp_ener -15 -(st->Q_syn2 -exp_ener -15 ) -16 = (11) 0.25*/ } L_tmp = L_mult0( st->prev_ener_shb_fx, inv_ener ); /*Q(1+15+14-3-exp_ener) = 27 -exp_ener*/ @@ -1954,11 +2058,11 @@ void ivas_swb_tbe_dec_fx( IF( EQ_16( is_fractive, 1 ) ) { - GainFrame_fx = L_shl( (Word32) st->tilt_wb_fx, 10 ); + GainFrame_fx = L_shl( L_deposit_l( st->tilt_wb_fx ), 10 ); } ELSE { - GainFrame_fx = L_shl( (Word32) st->tilt_wb_fx, 8 ); + GainFrame_fx = L_shl( L_deposit_l( st->tilt_wb_fx ), 8 ); } test(); @@ -1972,14 +2076,14 @@ void ivas_swb_tbe_dec_fx( test(); test(); test(); - IF( ( LT_32( L_shr( st->prev_enerLH_fx, 1 ), st->enerLH_fx ) && GT_32( st->prev_enerLH_fx, L_shr( st->enerLH_fx, 1 ) ) ) && ( LT_32( L_shr( st->prev_enerLL_fx, 1 ), st->enerLL_fx ) && GT_32( st->prev_enerLL_fx, L_shr( st->enerLL_fx, 1 ) ) ) && ( is_fractive ^ st->prev_fractive ) == 0 ) + IF( ( LT_32( L_shr( st->prev_enerLH_fx, 1 ), st->enerLH_fx ) && GT_32( st->prev_enerLH_fx, L_shr( st->enerLH_fx, 1 ) ) ) && ( LT_32( L_shr( st->prev_enerLL_fx, 1 ), st->enerLL_fx ) && GT_32( st->prev_enerLL_fx, L_shr( st->enerLL_fx, 1 ) ) ) && ( s_xor( is_fractive, st->prev_fractive ) == 0 ) ) { GainFrame_fx = L_add( L_shr( GainFrame_fx, 1 ), L_shr( GainFrame_prevfrm_fx, 1 ) ); } ELSE { test(); - IF( is_fractive == 0 && EQ_16( st->prev_fractive, 1 ) ) + IF( ( is_fractive == 0 ) && EQ_16( st->prev_fractive, 1 ) ) { L_tmp1 = L_shl( Mult_32_16( GainFrame_fx, 3277 ), 13 ); /* 31 */ L_tmp = L_sub( 2147483647, L_tmp1 ); /* 31 */ @@ -2009,9 +2113,19 @@ void ivas_swb_tbe_dec_fx( prev_ener_ratio_fx = L_shr( L_mult0( st->prev_ener_shb_fx, inv_ener ), add( sub( 9, exp_ener ), 1 ) ); /*Q: 1+27-exp-9+exp-1 = 18 */ } - IF( st->nbLostCmpt == 1 ) + IF( EQ_16( st->nbLostCmpt, 1 ) ) { - IF( NE_16( st->clas_dec, UNVOICED_CLAS ) && NE_16( st->clas_dec, UNVOICED_TRANSITION ) && LT_16( hBWE_TD->tilt_swb_fec_fx, 16384 ) && + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( st->clas_dec != UNVOICED_CLAS ) && NE_16( st->clas_dec, UNVOICED_TRANSITION ) && LT_16( hBWE_TD->tilt_swb_fec_fx, 16384 ) && ( ( GT_32( st->enerLL_fx, L_shr( st->prev_enerLL_fx, 1 ) ) && LT_32( L_shr( st->enerLL_fx, 1 ), st->prev_enerLL_fx ) ) || ( GT_32( st->enerLH_fx, L_shr( st->prev_enerLH_fx, 1 ) ) && LT_32( L_shr( st->enerLH_fx, 1 ), st->prev_enerLH_fx ) ) ) ) { IF( GT_32( L_shr( prev_ener_ratio_fx, 2 ), GainFrame_fx ) ) /*18*/ @@ -2028,7 +2142,7 @@ void ivas_swb_tbe_dec_fx( } test(); - IF( GT_16( tilt_swb_fec_fx, hBWE_TD->tilt_swb_fec_fx ) && hBWE_TD->tilt_swb_fec_fx > 0 ) + IF( GT_16( tilt_swb_fec_fx, hBWE_TD->tilt_swb_fec_fx ) && ( hBWE_TD->tilt_swb_fec_fx > 0 ) ) { exp = norm_s( hBWE_TD->tilt_swb_fec_fx ); tmp = shl( hBWE_TD->tilt_swb_fec_fx, exp ); /*Q(11+exp)*/ @@ -2037,14 +2151,22 @@ void ivas_swb_tbe_dec_fx( GainFrame_fx = L_shl( Mult_32_16( GainFrame_fx, s_min( tmp, 20480 ) ), 3 ); /*Q18 = 18 +12 -15 +3 */ } } - ELSE IF( ( NE_16( st->clas_dec, UNVOICED_CLAS ) || GT_16( hBWE_TD->tilt_swb_fec_fx, 4096 ) ) && GT_32( L_shr( prev_ener_ratio_fx, 2 ), GainFrame_fx ) && + ELSE IF( ( ( st->clas_dec != UNVOICED_CLAS ) || GT_16( hBWE_TD->tilt_swb_fec_fx, 4096 ) ) && GT_32( L_shr( prev_ener_ratio_fx, 2 ), GainFrame_fx ) && ( GT_32( st->enerLL_fx, L_shr( st->prev_enerLL_fx, 1 ) ) || GT_32( st->enerLH_fx, L_shr( st->prev_enerLH_fx, 1 ) ) ) ) { GainFrame_fx = L_add( Mult_32_16( prev_ener_ratio_fx, 6554 ), Mult_32_16( GainFrame_fx, 26214 ) ); } } - ELSE IF( st->nbLostCmpt > 1 ) + ELSE IF( GT_16( st->nbLostCmpt, 1 ) ) { + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); IF( GT_32( L_shr( prev_ener_ratio_fx, 2 ), GainFrame_fx ) && ( ( EQ_16( st->codec_mode, MODE1 ) && GT_32( st->enerLL_fx, st->prev_enerLL_fx ) && GT_32( st->enerLH_fx, st->prev_enerLH_fx ) ) || EQ_16( st->codec_mode, MODE2 ) ) ) { test(); @@ -2077,7 +2199,7 @@ void ivas_swb_tbe_dec_fx( /* Adjust the subframe and frame gain of the synthesized shb signal */ /* Scale the shaped excitation */ - IF( st->L_frame == L_FRAME ) + IF( EQ_16( st->L_frame, L_FRAME ) ) { L_tmp = L_mult( pitch_buf_fx[0], 8192 ); FOR( i = 1; i < NB_SUBFR; i++ ) @@ -2096,11 +2218,23 @@ void ivas_swb_tbe_dec_fx( pitch_fx = round_fx( L_tmp ); /* Q6 */ } - IF( ( ( st->extl_brate >= SWB_TBE_2k8 && st->prev_coder_type == st->coder_type && st->coder_type != UNVOICED ) || ( st->extl_brate < SWB_TBE_2k8 && ( st->prev_coder_type == st->coder_type || ( st->prev_coder_type == VOICED && st->coder_type == GENERIC ) || ( st->prev_coder_type == GENERIC && st->coder_type == VOICED ) ) ) ) && GT_16( pitch_fx, 4480 /*70 in Q6*/ ) && st->extl < FB_TBE && st->extl_brate != SWB_TBE_1k10 && st->extl_brate != SWB_TBE_1k75 ) + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( ( GE_32( st->extl_brate, SWB_TBE_2k8 ) && EQ_16( st->prev_coder_type, st->coder_type ) && NE_16( st->coder_type, UNVOICED ) ) || ( LT_32( st->extl_brate, SWB_TBE_2k8 ) && ( EQ_16( st->prev_coder_type, st->coder_type ) || ( EQ_16( st->prev_coder_type, VOICED ) && EQ_16( st->coder_type, GENERIC ) ) || ( EQ_16( st->prev_coder_type, GENERIC ) && EQ_16( st->coder_type, VOICED ) ) ) ) ) && GT_16( pitch_fx, 4480 /*70 in Q6*/ ) && LT_16( st->extl, FB_TBE ) && NE_32( st->extl_brate, SWB_TBE_1k10 ) && NE_32( st->extl_brate, SWB_TBE_1k75 ) ) { FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) { - GainShape_tmp_fx[i] = GainShape_fx[shl( i, 2 )]; /* Q15 */ + GainShape_tmp_fx[i] = GainShape_fx[i * 4]; /* Q15 */ move16(); } @@ -2118,7 +2252,7 @@ void ivas_swb_tbe_dec_fx( { L_tmp = L_tmp2; move32(); - IF( L_tmp2 < 0 ) + if ( L_tmp2 < 0 ) { L_tmp = L_negate( L_tmp2 ); } @@ -2129,11 +2263,11 @@ void ivas_swb_tbe_dec_fx( #else fracb = round_fx( L_shl( L_tmp, expb ) ); #endif - expb = 30 - expb; /* - (2*Q_bwe_exc_ext); */ + expb = sub( 30, expb ); /* - (2*Q_bwe_exc_ext); */ expa = norm_l( ener_tmp_fx[i] ); fraca = extract_h( L_shl( ener_tmp_fx[i], expa ) ); - expa = 30 - expa; + expa = sub( 30, expa ); scale_fx = shr( sub( fraca, fracb ), 15 ); fracb = shl( fracb, scale_fx ); @@ -2156,7 +2290,13 @@ void ivas_swb_tbe_dec_fx( FOR( i = 0; i < NUM_SHB_SUBFR; i++ ) { - GainShape_fx[i] = GainShape_tmp_fx[i * NUM_SHB_SUBGAINS / NUM_SHB_SUBFR]; + Word16 idx = 0; + move16(); + IF( i != 0 ) + { + idx = idiv1616( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR ); + } + GainShape_fx[i] = GainShape_tmp_fx[idx]; move16(); } } @@ -2170,7 +2310,8 @@ void ivas_swb_tbe_dec_fx( /* Gain shape smoothing after quantization */ - IF( st->extl_brate == SWB_TBE_1k10 || st->extl_brate == SWB_TBE_1k75 ) + test(); + IF( EQ_32( st->extl_brate, SWB_TBE_1k10 ) || EQ_32( st->extl_brate, SWB_TBE_1k75 ) ) { FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) { @@ -2180,37 +2321,47 @@ void ivas_swb_tbe_dec_fx( lls_interp_n_fx( GainShape_tmp_fx, NUM_SHB_SUBGAINS, &GainShape_tilt_fx, &temp_fx, 1 ); - IF( vind >= 6 && abs( GainShape_tilt_fx ) < 3932 ) + test(); + IF( GE_16( vind, 6 ) && LT_16( abs_s( GainShape_tilt_fx ), 3932 ) ) { feedback_fx = 9830; move16(); FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) { - GainShape_fx[i] = add_sat( mult( ( 32767 - feedback_fx ), GainShape_fx[i * NUM_SHB_SUBGAINS] ), mult( feedback_fx, GainShape_tmp_fx[i] ) ); + GainShape_fx[i] = add_sat( mult( sub( 32767, feedback_fx ), GainShape_fx[i * NUM_SHB_SUBGAINS] ), mult( feedback_fx, GainShape_tmp_fx[i] ) ); move16(); } FOR( i = NUM_SHB_SUBFR - 1; i > 0; i-- ) { - GainShape_fx[i] = GainShape_fx[i * NUM_SHB_SUBGAINS / NUM_SHB_SUBFR]; + Word16 idx = 0; + move16(); + IF( i != 0 ) + { + idx = idiv1616( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR ); + } + GainShape_fx[i] = GainShape_fx[idx]; move16(); } } } /* fil-in missing memory */ - IF( ( st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT ) && st->last_core_brate <= SID_2k40 ) + test(); + test(); + IF( ( EQ_16( st->element_mode, IVAS_CPE_TD ) || EQ_16( st->element_mode, IVAS_CPE_DFT ) ) && LE_32( st->last_core_brate, SID_2k40 ) ) { FOR( i = 0; i < L_SHB_LAHEAD; i++ ) { Word16 intermediate = mult( shaped_shb_excitation_fx[i], subwin_shb_fx[L_SHB_LAHEAD - i] ); Word32 intermediate_32 = Mpy_32_16_1( Mpy_32_16_1( GainFrame_fx, window_shb_fx[L_SHB_LAHEAD - 1 - i] ), intermediate ); - hBWE_TD->syn_overlap_fx[i] = (Word16) round_fx( L_shl_sat( intermediate_32, 16 - ( Q_bwe_exc + 18 - 15 ) ) ); + hBWE_TD->syn_overlap_fx[i] = round_fx( L_shl_sat( intermediate_32, sub( 16, ( add( Q_bwe_exc, 18 - 15 ) ) ) ) ); move16(); } } Word16 n_mem3_new = 0; + move16(); find_max_mem_dec_m3( st, &n_mem3_new ); ScaleShapedSHB_fx( SHB_OVERLAP_LEN, @@ -2233,6 +2384,7 @@ void ivas_swb_tbe_dec_fx( } max_val = 0; + move16(); FOR( i = 0; i < L_FRAME16k; i++ ) { max_val = s_max( max_val, shaped_shb_excitation_fx[i] ); /* Q0 */ @@ -2275,10 +2427,12 @@ void ivas_swb_tbe_dec_fx( IF( GT_16( tmp, 32 ) ) { st->prev_frame_pow_exp = add( curr_frame_pow_exp, 32 ); + move16(); tmp = 32; move16(); } hBWE_TD->prev_swb_bwe_frame_pow_fx = L_shr( hBWE_TD->prev_swb_bwe_frame_pow_fx, tmp ); + move32(); st->prev_frame_pow_exp = curr_frame_pow_exp; move16(); } @@ -2294,18 +2448,21 @@ void ivas_swb_tbe_dec_fx( curr_frame_pow_exp = st->prev_frame_pow_exp; move16(); } - + test(); + test(); IF( !st->bfi && ( st->prev_bfi || st->prev_use_partial_copy ) ) { + test(); + test(); IF( ( GT_32( L_shr( curr_frame_pow_fx, 1 ), hBWE_TD->prev_swb_bwe_frame_pow_fx ) ) && ( GT_32( hBWE_TD->prev_swb_bwe_frame_pow_fx, L_tmp ) ) && EQ_16( st->prev_coder_type, UNVOICED ) ) { L_tmp = root_a_over_b_fx( hBWE_TD->prev_swb_bwe_frame_pow_fx, curr_frame_pow_exp, curr_frame_pow_fx, curr_frame_pow_exp, &exp ); scale_fx = round_fx( L_shl( L_tmp, exp ) ); /*Q15*/ - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); temp_fx = round_fx( L_shl( L_tmp, exp ) ); /*Q15*/ } ELSE @@ -2319,11 +2476,11 @@ void ivas_swb_tbe_dec_fx( { GainShape_fx[2 * j] = mult_r( GainShape_fx[2 * j], scale_fx ); move16(); - GainShape_fx[2 * j + 1] = mult_r( GainShape_fx[2 * j + 1], scale_fx ); + GainShape_fx[add( 2 * j, 1 )] = mult_r( GainShape_fx[add( 2 * j, 1 )], scale_fx ); move16(); FOR( i = 0; i < L_FRAME16k / 8; i++ ) { - shaped_shb_excitation_fx[i + j * L_FRAME16k / 8] = mult_r( shaped_shb_excitation_fx[i + j * L_FRAME16k / 8], scale_fx ); + shaped_shb_excitation_fx[add( i, j * ( L_FRAME16k / 8 ) )] = mult_r( shaped_shb_excitation_fx[add( i, j * ( L_FRAME16k / 8 ) )], scale_fx ); move16(); } @@ -2355,7 +2512,7 @@ void ivas_swb_tbe_dec_fx( scale_fx = temp_fx = 4096; move16(); /*Q12*/ move16(); - IF( st->nbLostCmpt == 1 ) + IF( EQ_16( st->nbLostCmpt, 1 ) ) { test(); test(); @@ -2367,18 +2524,18 @@ void ivas_swb_tbe_dec_fx( test(); IF( GT_32( curr_frame_pow_fx, hBWE_TD->prev_swb_bwe_frame_pow_fx ) && NE_16( st->prev_coder_type, UNVOICED ) && - NE_16( st->last_good, UNVOICED_CLAS ) ) + ( st->last_good != UNVOICED_CLAS ) ) { L_tmp = root_a_over_b_fx( hBWE_TD->prev_swb_bwe_frame_pow_fx, curr_frame_pow_exp, curr_frame_pow_fx, curr_frame_pow_exp, &exp ); /*31 - exp*/ scale_fx = round_fx( L_shl( L_tmp, sub( exp, 3 ) ) ); /*Q12*/ - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); temp_fx = round_fx( L_shl( L_tmp, sub( exp, 3 ) ) ); /*Q12*/ } ELSE IF( LT_32( curr_frame_pow_fx, L_shr( hBWE_TD->prev_swb_bwe_frame_pow_fx, 1 ) ) && EQ_16( st->nbLostCmpt, 1 ) && ( GT_32( st->enerLL_fx, L_shr( st->prev_enerLL_fx, 1 ) ) || GT_32( st->enerLH_fx, L_shr( st->prev_enerLH_fx, 1 ) ) ) && - ( EQ_16( st->prev_coder_type, UNVOICED ) || EQ_16( st->last_good, UNVOICED_CLAS ) || GT_16( hBWE_TD->tilt_swb_fec_fx, 10240 ) ) ) + ( EQ_16( st->prev_coder_type, UNVOICED ) || ( st->last_good == UNVOICED_CLAS ) || GT_16( hBWE_TD->tilt_swb_fec_fx, 10240 ) ) ) { L_tmp = root_a_over_b_fx( hBWE_TD->prev_swb_bwe_frame_pow_fx, curr_frame_pow_exp, curr_frame_pow_fx, curr_frame_pow_exp, &exp ); #ifdef BASOP_NOGLOB @@ -2386,21 +2543,26 @@ void ivas_swb_tbe_dec_fx( #else scale_fx = round_fx( L_shl( L_tmp, sub( exp, 3 ) ) ); /*Q12*/ #endif - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); temp_fx = round_fx( L_shl( L_tmp, sub( exp, 3 ) ) ); /*Q12*/ } } - ELSE IF( st->nbLostCmpt > 1 ) + ELSE IF( GT_16( st->nbLostCmpt, 1 ) ) { + test(); + test(); + test(); + test(); + test(); IF( GT_32( curr_frame_pow_fx, hBWE_TD->prev_swb_bwe_frame_pow_fx ) ) { L_tmp = root_a_over_b_fx( hBWE_TD->prev_swb_bwe_frame_pow_fx, curr_frame_pow_exp, curr_frame_pow_fx, curr_frame_pow_exp, &exp ); scale_fx = round_fx( L_shl( L_tmp, sub( exp, 3 ) ) ); /*Q12*/ - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); #ifdef BASOP_NOGLOB temp_fx = round_fx_sat( L_shl_sat( L_tmp, sub( exp, 3 ) ) ); /*Q12*/ #else @@ -2409,18 +2571,18 @@ void ivas_swb_tbe_dec_fx( } ELSE IF( LT_32( curr_frame_pow_fx, L_shr( hBWE_TD->prev_swb_bwe_frame_pow_fx, 1 ) ) && ( GT_32( st->enerLL_fx, L_shr( st->prev_enerLL_fx, 1 ) ) || GT_32( st->enerLH_fx, L_shr( st->prev_enerLH_fx, 1 ) ) ) && - ( st->prev_coder_type == UNVOICED || st->last_good == UNVOICED_CLAS || GT_16( hBWE_TD->tilt_swb_fec_fx, 10240 ) ) ) + ( EQ_16( st->prev_coder_type, UNVOICED ) || ( st->last_good == UNVOICED_CLAS ) || GT_16( hBWE_TD->tilt_swb_fec_fx, 10240 ) ) ) { L_tmp = root_a_over_b_fx( hBWE_TD->prev_swb_bwe_frame_pow_fx, curr_frame_pow_exp, curr_frame_pow_fx, curr_frame_pow_exp, &exp ); #ifdef BASOP_NOGLOB - L_tmp = L_min( L_tmp, L_shl_sat( 2, ( 31 - exp ) ) ); /*31 - exp*/ + L_tmp = L_min( L_tmp, L_shl_sat( 2, sub( 31, exp ) ) ); /*31 - exp*/ #else L_tmp = L_min( L_tmp, L_shl( 2, ( 31 - exp ) ) ); /*31 - exp*/ #endif scale_fx = round_fx( L_shl( L_tmp, sub( exp, 3 ) ) ); /*Q12*/ - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); temp_fx = round_fx( L_shl( L_tmp, sub( exp, 3 ) ) ); /*Q12*/ } } @@ -2434,14 +2596,14 @@ void ivas_swb_tbe_dec_fx( #endif move16(); /* 15 +12 +3-15 =15*/ #ifdef BASOP_NOGLOB - GainShape_fx[2 * j + 1] = shl_sat( mult_r( GainShape_fx[2 * j + 1], scale_fx ), 3 ); + GainShape_fx[add( 2 * j, 1 )] = shl_sat( mult_r( GainShape_fx[add( 2 * j, 1 )], scale_fx ), 3 ); #else GainShape_fx[2 * j + 1] = shl( mult_r( GainShape_fx[2 * j + 1], scale_fx ), 3 ); #endif move16(); FOR( i = 0; i < 40; i++ ) { - shaped_shb_excitation_fx[add( i, i_mult( j, 40 ) )] = shl( mult_r( shaped_shb_excitation_fx[add( i, i_mult( j, 40 ) )], scale_fx ), 3 ); + shaped_shb_excitation_fx[add( i, j * 40 )] = shl( mult_r( shaped_shb_excitation_fx[add( i, j * 40 )], scale_fx ), 3 ); move16(); /* Q_bwe_exc +12+3 -15 =Q_bwe_exc*/ } @@ -2487,12 +2649,13 @@ void ivas_swb_tbe_dec_fx( { exp = norm_l( L_prev_ener_shb ); tmp = extract_h( L_shl( L_prev_ener_shb, exp ) ); - exp = sub( exp, 30 - ( 2 * Q_bwe_exc + 8 ) ); + exp = sub( exp, sub( 30, ( add( i_mult( 2, Q_bwe_exc ), 8 ) ) ) ); tmp = div_s( 16384, tmp ); L_tmp = L_deposit_h( tmp ); L_tmp = Isqrt_lc( L_tmp, &exp ); st->prev_ener_shb_fx = round_fx( L_shl( L_tmp, sub( exp, 14 ) ) ); /* Q1 */ + move16(); } IF( st->hBWE_FD != NULL ) @@ -2504,7 +2667,7 @@ void ivas_swb_tbe_dec_fx( { exp = norm_l( L_tmp ); tmp = extract_h( L_shl( L_tmp, exp ) ); - exp = sub( exp, 30 - ( curr_frame_pow_exp + 8 ) ); + exp = sub( exp, sub( 30, add( curr_frame_pow_exp, 8 ) ) ); tmp = div_s( 16384, tmp ); L_tmp = L_deposit_h( tmp ); @@ -2516,7 +2679,7 @@ void ivas_swb_tbe_dec_fx( FOR( i = 0; i < L_FRAME16k; i++ ) { - shaped_shb_excitation_fx_32[i] = L_shl( shaped_shb_excitation_fx[i], Q11 - Q_bwe_exc ); + shaped_shb_excitation_fx_32[i] = L_shl( shaped_shb_excitation_fx[i], sub( Q11, Q_bwe_exc ) ); move32(); } @@ -2528,18 +2691,18 @@ void ivas_swb_tbe_dec_fx( /* resample SHB synthesis (if needed) and scale down */ synth_scale_fx = 32767; move16(); /* 1.0 in Q15 */ - IF( EQ_16( st->codec_mode, MODE1 ) ) + if ( EQ_16( st->codec_mode, MODE1 ) ) { synth_scale_fx = 29491; move16(); /* 0.9 in Q15 */ } - IF( st->output_Fs == 48000 ) + IF( EQ_32( st->output_Fs, 48000 ) ) { - IF( st->extl == FB_TBE ) + IF( EQ_16( st->extl, FB_TBE ) ) { tmp = norm_l( GainFrame_fx ); - IF( GainFrame_fx == 0 ) + if ( GainFrame_fx == 0 ) { tmp = 31; move16(); @@ -2550,14 +2713,22 @@ void ivas_swb_tbe_dec_fx( move16(); FOR( i = 0; i < L_FRAME16k; i++ ) { - L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[NUM_SHB_SUBFR * i / L_FRAME16k] ); /* Q : 18 + tmp +15 -15*/ - White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ + Word16 idx = 0; + move16(); + IF( i != 0 ) + { + idx = idiv1616( i_mult( NUM_SHB_SUBFR, i ), L_FRAME16k ); + } + L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ + White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ + move16(); tmp1 = s_max( tmp1, abs_s( White_exc16k_fx[i] ) ); } *Q_white_exc = sub( add( *Q_white_exc, tmp ), 13 ); /* *Q_white_exc + 18 + tmp -15 -16 */ + move16(); tmp = norm_s( tmp1 ); - IF( tmp1 == 0 ) + if ( tmp1 == 0 ) { tmp = 15; move16(); @@ -2569,6 +2740,7 @@ void ivas_swb_tbe_dec_fx( move16(); } *Q_white_exc = sub( add( *Q_white_exc, tmp ), 1 ); + move16(); } IF( NE_16( synth_scale_fx, 32767 ) ) /* 1.0 in Q15 */ @@ -2581,7 +2753,7 @@ void ivas_swb_tbe_dec_fx( } interpolate_3_over_2_allpass_32( error_fx, L_FRAME32k, synth_fx, hBWE_TD->int_3_over_2_tbemem_dec_fx_32 ); } - ELSE IF( st->output_Fs == 32000 ) + ELSE IF( EQ_32( st->output_Fs, 32000 ) ) { IF( NE_16( synth_scale_fx, 32767 ) ) /* 1.0 in Q15 */ { @@ -2596,7 +2768,7 @@ void ivas_swb_tbe_dec_fx( Copy32( error_fx, synth_fx, L_FRAME32k ); } } - ELSE IF( st->output_Fs == 16000 ) + ELSE IF( EQ_32( st->output_Fs, 16000 ) ) { IF( NE_16( synth_scale_fx, 32767 ) ) /* 1.0 in Q15 */ { @@ -2612,14 +2784,14 @@ void ivas_swb_tbe_dec_fx( /* Update previous frame parameters for FEC */ - IF( st->codec_mode == MODE1 ) + IF( EQ_16( st->codec_mode, MODE1 ) ) { hBWE_TD->GainFrame_prevfrm_fx = GainFrame_fx; move32(); /*Q18*/ hBWE_TD->tilt_swb_fec_fx = tilt_swb_fec_fx; move16(); - IF( !st->bfi ) + if ( !st->bfi ) { hBWE_TD->GainAttn_fx = 32767; move16(); @@ -4247,7 +4419,7 @@ void fb_tbe_dec( } #endif - +#ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * tbe_read_bitstream() * @@ -4335,7 +4507,7 @@ void tbe_read_bitstream( return; } - +#endif #ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* @@ -4418,13 +4590,17 @@ void GenTransition_fixed( Word32 syn_overlap_32k_fx[2 * SHB_OVERLAP_LEN]; /* set targeted length of transition signal */ - length = 2 * NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ); + length = i_mult( 2, NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ) ); /* upsample overlap snippet */ Interpolate_allpass_steep_32( hBWE_TD->syn_overlap_fx_32, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, SHB_OVERLAP_LEN, syn_overlap_32k_fx ); /* perFORm spectral flip and downmix with overlap snippet to match HB synth */ - IF( ( element_mode == EVS_MONO && ( rf_flag || total_brate == ACELP_9k60 ) ) || ( element_mode > EVS_MONO && L_frame == L_FRAME ) ) + test(); + test(); + test(); + test(); + IF( ( ( element_mode == EVS_MONO ) && ( rf_flag || EQ_32( total_brate, ACELP_9k60 ) ) ) || ( ( element_mode > EVS_MONO ) && EQ_16( L_frame, L_FRAME ) ) ) { flip_and_downmix_generic_fx_32( syn_overlap_32k_fx, syn_overlap_32k_fx, 2 * SHB_OVERLAP_LEN, hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_Hilbert_Mem_fx + HILBERT_ORDER1, hBWE_TD->genSHBsynth_Hilbert_Mem_fx + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ), &( hBWE_TD->syn_dm_phase ) ); } @@ -4432,7 +4608,16 @@ void GenTransition_fixed( { FOR( i = 0; i < 2 * SHB_OVERLAP_LEN; i++ ) { - syn_overlap_32k_fx[i] = ( ( i % 2 ) == 0 ) ? ( -syn_overlap_32k_fx[i] ) : ( syn_overlap_32k_fx[i] ); + IF( i % 2 == 0 ) + { + syn_overlap_32k_fx[i] = -syn_overlap_32k_fx[i]; + move32(); + } + ELSE + { + syn_overlap_32k_fx[i] = syn_overlap_32k_fx[i]; + move32(); + } } } @@ -4440,19 +4625,21 @@ void GenTransition_fixed( FOR( i = 0; i < 2 * L_SHB_LAHEAD; i++ ) { outputHB_fx[i] = L_add_sat( Mpy_32_16_1( hBWE_TD->old_tbe_synth_fx_32[L_SHB_TRANSITION_LENGTH - 1 - i], window_shb_32k_fx[i] ), Mpy_32_16_1( syn_overlap_32k_fx[i], window_shb_32k_fx[2 * L_SHB_LAHEAD - 1 - i] ) ); + move32(); } /* fill transition signal with mirrored HB synth from previous frame to fully fill delay alignment buffer gap */ FOR( ; i < length; i++ ) { outputHB_fx[i] = hBWE_TD->old_tbe_synth_fx[L_SHB_TRANSITION_LENGTH - 1 - i]; + move32(); } - IF( output_Fs == 48000 ) + IF( EQ_32( output_Fs, 48000 ) ) { interpolate_3_over_2_allpass_32( outputHB_fx, length, outputHB_fx, hBWE_TD->int_3_over_2_tbemem_dec_fx_32 ); } - ELSE IF( output_Fs == 16000 ) + ELSE IF( EQ_32( output_Fs, 16000 ) ) { Decimate_allpass_steep_fx32( outputHB_fx, hBWE_TD->mem_resamp_HB_32k_fx_32, L_FRAME32k, outputHB_fx ); } @@ -4531,7 +4718,7 @@ void GenTransition_WB_fixed( Word32 upsampled_synth_fx[L_FRAME48k]; /* set targeted length of transition signal */ - length = 2 * NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ); + length = i_mult( 2, NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ) ); /* upsample overlap snippet */ Interpolate_allpass_steep_32( hBWE_TD->syn_overlap_fx_32, hBWE_TD->state_lsyn_filt_shb_fx_32, SHB_OVERLAP_LEN / 2, speech_buf_16k1_fx ); @@ -4540,30 +4727,43 @@ void GenTransition_WB_fixed( /* perform spectral flip and downmix with overlap snippet to match HB synth */ FOR( i = 0; i < SHB_OVERLAP_LEN; i++ ) { - speech_buf_16k2_fx[i] = ( ( i % 2 ) == 0 ) ? ( -speech_buf_16k2_fx[i] ) : ( speech_buf_16k2_fx[i] ); + IF( i % 2 == 0 ) + { + speech_buf_16k2_fx[i] = -speech_buf_16k2_fx[i]; + move32(); + } + ELSE + { + speech_buf_16k2_fx[i] = speech_buf_16k2_fx[i]; + move32(); + } } /* cross fade of overlap snippet and mirrored HB synth from previous frame */ FOR( i = 0; i < L_SHB_LAHEAD; i++ ) { outputHB_fx[i] = L_add( Mpy_32_16_1( hBWE_TD->old_tbe_synth_fx_32[L_SHB_TRANSITION_LENGTH - 1 - i], window_shb_fx[i] ), Mpy_32_16_1( speech_buf_16k2_fx[i], window_shb_fx[L_SHB_LAHEAD - 1 - i] ) ); + move32(); outputHB_fx[i] = Mpy_32_16_1( outputHB_fx[i], 21299 ); + move32(); } /* fill transition signal with mirrored HB synth from previous frame to fully fill delay alignment buffer gap */ FOR( ; i < length; i++ ) { outputHB_fx[i] = hBWE_TD->old_tbe_synth_fx_32[L_SHB_TRANSITION_LENGTH - 1 - i]; + move32(); outputHB_fx[i] = Mpy_32_16_1( outputHB_fx[i], 21299 ); + move32(); } /* upsampling if necessary */ - IF( output_Fs == 32000 ) + IF( EQ_32( output_Fs, 32000 ) ) { Interpolate_allpass_steep_32( outputHB_fx, hBWE_TD->mem_resamp_HB_fx_32, L_FRAME16k, upsampled_synth_fx ); Copy32( upsampled_synth_fx, outputHB_fx, L_FRAME32k ); } - ELSE IF( output_Fs == 48000 ) + ELSE IF( EQ_32( output_Fs, 48000 ) ) { interpolate_3_over_1_allpass_32( outputHB_fx, L_FRAME16k, upsampled_synth_fx, hBWE_TD->mem_resamp_HB_fx_32 ); Copy32( upsampled_synth_fx, outputHB_fx, L_FRAME48k ); diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 11421e1e1..333361cc8 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -52,8 +52,11 @@ static void find_max_mem_dec( Word16 i; Word16 n_mem_32; Word16 max = 0; + move16(); Word32 Lmax = 0; + move32(); Word16 tempQ15, max2 = 0; + move16(); Word16 max3; Word32 tempQ32, Lmax3; TD_BWE_DEC_HANDLE hBWE_TD; @@ -98,8 +101,12 @@ static void find_max_mem_dec( /* for total_brate > 16.4kbps, use n_mem2; else account for the max2 for n_mem calculation */ *n_mem2 = norm_s( max2 ); + move16(); if ( max2 == 0 ) + { *n_mem2 = 15; + move16(); + } if ( LT_32( st_fx->total_brate, ACELP_24k40 ) ) { @@ -126,9 +133,11 @@ static void find_max_mem_dec( } /* estimate the norm for 16-bit memories */ *n_mem = norm_s( max ); + move16(); if ( max == 0 ) { *n_mem = 15; + move16(); } /* estimate the norm for 32-bit memories */ @@ -138,10 +147,12 @@ static void find_max_mem_dec( if ( Lmax == 0 ) { n_mem_32 = 31; + move16(); } tempQ15 = sub( s_min( *n_mem, n_mem_32 ), 1 ); *n_mem = s_max( tempQ15, 0 ); + move16(); /* --------------------------------------------------------------*/ /* Find headroom for synthesis stage associated with these memories: @@ -149,6 +160,7 @@ static void find_max_mem_dec( 2. st_fx->genSHBsynth_state_lsyn_filt_shb_local 3. st_fx->genSHBsynth_Hilbert_Mem_fx (32-bit) */ max3 = 0; + move16(); /* find max in prev overlapSyn */ FOR( i = 0; i < L_SHB_LAHEAD; i++ ) { @@ -180,10 +192,15 @@ static void find_max_mem_dec( } /* estimate the norm for 16-bit memories */ *n_mem3 = norm_s( max3 ); + move16(); if ( max3 == 0 ) + { *n_mem3 = 15; + move16(); + } Lmax3 = 0; + move32(); IF( EQ_16( st_fx->L_frame, L_FRAME ) ) { /* find max in prev genSHBsynth_Hilbert_Mem_fx */ @@ -197,11 +214,15 @@ static void find_max_mem_dec( /* estimate the norm for 32-bit memories */ n_mem_32 = norm_l( Lmax3 ); if ( Lmax3 == 0 ) + { n_mem_32 = 31; + move16(); + } tempQ15 = sub( s_min( *n_mem3, n_mem_32 ), 2 ); /* very important leave at least 2 bit head room because of the Hilber transform and Q14 coeffs */ *n_mem3 = s_max( tempQ15, 0 ); + move16(); /* --------------------------------------------------------------*/ } @@ -246,7 +267,7 @@ static void rescale_genSHB_mem_dec( } } - IF( EQ_16( st_fx->extl, FB_TBE ) ) + if ( EQ_16( st_fx->extl, FB_TBE ) ) { } hBWE_TD->mem_csfilt_fx[0] = L_shl( hBWE_TD->mem_csfilt_fx[0], sf ); @@ -262,7 +283,9 @@ void find_max_mem_wb( Decoder_State *st_fx, Word16 *n_mem ) { Word16 i; Word16 max = 0; + move16(); Word32 Lmax = 0; + move32(); Word16 n_mem_32; TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st_fx->hBWE_TD; @@ -274,34 +297,34 @@ void find_max_mem_wb( Decoder_State *st_fx, Word16 *n_mem ) FOR( i = 0; i < 7; i++ ) { - if ( abs_s( hBWE_TD->mem_genSHBexc_filt_down_shb_fx[i] ) > max ) + if ( GT_16( abs_s( hBWE_TD->mem_genSHBexc_filt_down_shb_fx[i] ), max ) ) max = abs_s( hBWE_TD->mem_genSHBexc_filt_down_shb_fx[i] ); } FOR( i = 0; i < 7; i++ ) { - if ( abs_s( hBWE_TD->mem_genSHBexc_filt_down_wb2_fx[i] ) > max ) + if ( GT_16( abs_s( hBWE_TD->mem_genSHBexc_filt_down_wb2_fx[i] ), max ) ) max = abs_s( hBWE_TD->mem_genSHBexc_filt_down_wb2_fx[i] ); } FOR( i = 0; i < 7; i++ ) { - if ( abs_s( hBWE_TD->mem_genSHBexc_filt_down_wb3_fx[i] ) > max ) + if ( GT_16( abs_s( hBWE_TD->mem_genSHBexc_filt_down_wb3_fx[i] ), max ) ) max = abs_s( hBWE_TD->mem_genSHBexc_filt_down_wb3_fx[i] ); } FOR( i = 0; i < 10; i++ ) { - if ( abs_s( hBWE_TD->state_lpc_syn_fx[i] ) > max ) + if ( GT_16( abs_s( hBWE_TD->state_lpc_syn_fx[i] ), max ) ) max = abs_s( hBWE_TD->state_lpc_syn_fx[i] ); } FOR( i = 0; i < 5; i++ ) { - if ( abs_s( hBWE_TD->state_syn_shbexc_fx[i] ) > max ) + if ( GT_16( abs_s( hBWE_TD->state_syn_shbexc_fx[i] ), max ) ) max = abs_s( hBWE_TD->state_syn_shbexc_fx[i] ); } @@ -320,7 +343,7 @@ void find_max_mem_wb( Decoder_State *st_fx, Word16 *n_mem ) FOR( i = 0; i < 2; i++ ) { - if ( L_abs( hBWE_TD->mem_csfilt_fx[i] ) > Lmax ) + if ( GT_32( L_abs( hBWE_TD->mem_csfilt_fx[i] ), Lmax ) ) Lmax = L_abs( hBWE_TD->mem_csfilt_fx[i] ); } @@ -335,7 +358,9 @@ void find_max_mem_wb( Decoder_State *st_fx, Word16 *n_mem ) } *n_mem = sub( s_min( *n_mem, n_mem_32 ), 1 ); + move16(); *n_mem = s_max( *n_mem, 0 ); + move16(); } void rescale_genWB_mem( Decoder_State *st_fx, Word16 sf ) @@ -413,10 +438,13 @@ void InitSWBdecBuffer_ivas_fx( hBWE_TD->syn_dm_phase = 0; move16(); hBWE_TD->prev_fbbwe_ratio_fx = 32767 /*1.0f Q15*/; + move16(); /* these are fd-bwe constants */ - hBWE_TD->prev_wb_bwe_frame_pow_fx = 4194l /*0.001f Q22*/; /* Q22 */ + hBWE_TD->prev_wb_bwe_frame_pow_fx = 4194l /*0.001f Q22*/; /* Q22 */ + move32(); hBWE_TD->prev_swb_bwe_frame_pow_fx = 4194l /*0.001f Q22*/; /* Q22 */ + move32(); st_fx->prev_Q_bwe_exc = 31; move16(); st_fx->prev_ener_fx_Q = 31; @@ -455,10 +483,13 @@ void InitSWBdecBuffer_fx( hBWE_TD->syn_dm_phase = 0; move16(); hBWE_TD->prev_fbbwe_ratio_fx = 32767 /*1.0f Q15*/; + move16(); /* these are fd-bwe constants */ - hBWE_TD->prev_wb_bwe_frame_pow_fx = 4194l /*0.001f Q22*/; /* Q22 */ + hBWE_TD->prev_wb_bwe_frame_pow_fx = 4194l /*0.001f Q22*/; /* Q22 */ + move32(); hBWE_TD->prev_swb_bwe_frame_pow_fx = 4194l /*0.001f Q22*/; /* Q22 */ + move32(); st_fx->prev_Q_bwe_exc = 31; move16(); st_fx->prev_ener_fx_Q = 31; @@ -483,7 +514,7 @@ void ResetSHBbuffer_Dec_fx( Decoder_State *st_fx /* i/o: SHB encoder structure * TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st_fx->hBWE_TD; - IF( st_fx->extl != WB_TBE ) + IF( NE_16( st_fx->extl, WB_TBE ) ) { f = 1489; move16(); /* Q15 */ @@ -528,7 +559,7 @@ void ResetSHBbuffer_Dec_fx( Decoder_State *st_fx /* i/o: SHB encoder structure * /* States for FEC */ - IF( st_fx->extl != WB_TBE ) + IF( NE_16( st_fx->extl, WB_TBE ) ) { FOR( i = 0; i < LPC_SHB_ORDER; i++ ) { @@ -558,12 +589,17 @@ void ResetSHBbuffer_Dec_fx( Decoder_State *st_fx /* i/o: SHB encoder structure * hBWE_TD->GainAttn_fx = 32767; move16(); /*Q15*/ hBWE_TD->tbe_demph_fx = 0; + move16(); hBWE_TD->tbe_premph_fx = 0; + move16(); set16_fx( hBWE_TD->mem_stp_swb_fx, 0, LPC_SHB_ORDER ); hBWE_TD->gain_prec_swb_fx = 16384; /*Q14 =1*/ + move16(); set16_fx( &st_fx->GainShape_Delay[0], 0, NUM_SHB_SUBFR / 2 ); hBWE_TD->prev_pow_exc16kWhtnd_fx32 = 1; /* Q0 1.f */ - hBWE_TD->prev_mix_factor_fx = 32767; /*Q15 1.f*/ + move32(); + hBWE_TD->prev_mix_factor_fx = 32767; /*Q15 1.f*/ + move16(); set16_fx( hBWE_TD->old_core_synth_fx, 0, L_FRAME16k ); set16_fx( hBWE_TD->old_tbe_synth_fx, 0, L_SHB_TRANSITION_LENGTH ); @@ -625,24 +661,30 @@ void ivas_wb_tbe_dec_fx( Word16 Q_bwe_exc, Q_bwe_exc_ext, Qx; Word16 n_mem, cnt; Word16 max = 0; + move16(); Word32 L_tmp, Lacc, Lscale, Lmax = 0; + move32(); Word16 tmp, exp, sc; Word16 vf_modified[NB_SUBFR16k]; Word16 uv_flag = 0; + move16(); Word16 dummy = 0; - Word32 dummy2[HILBERT_MEM_SIZE] = { 0 }; + move16(); + Word32 dummy2[HILBERT_MEM_SIZE]; Word16 f, inc; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st_fx->hBWE_TD; - + set_val_Word32( &dummy2[0], 0, HILBERT_MEM_SIZE ); IF( st_fx->bws_cnt == 0 ) { /* Initialization */ set16_fx( GainShape, 11469 /*0.35f Q15*/, NUM_SHB_SUBFR ); GainFrame = 1; + move32(); IF( !st_fx->bfi ) { @@ -651,11 +693,13 @@ void ivas_wb_tbe_dec_fx( IF( NE_16( st_fx->last_extl, WB_TBE ) ) { hBWE_TD->GainFrame_prevfrm_fx = 0; + move32(); hBWE_TD->lsp_prevfrm_fx[0] = 3277 /*0.1f Q15*/; move16(); FOR( i = 1; i < LPC_SHB_ORDER_LBR_WB; i++ ) { hBWE_TD->lsp_prevfrm_fx[i] = add( hBWE_TD->lsp_prevfrm_fx[i - i], 3277 /*0.1f Q15*/ ); + move16(); } } Copy( hBWE_TD->lsp_prevfrm_fx, lsf_wb, LPC_SHB_ORDER_LBR_WB ); @@ -665,8 +709,14 @@ void ivas_wb_tbe_dec_fx( { /* Frame gain */ st_fx->rf_indx_tbeGainFr = s_and( st_fx->rf_indx_tbeGainFr, 0xF ); /* only four LSBs are valid */ + move16(); Copy32( SHBCB_FrameGain16_fx + st_fx->rf_indx_tbeGainFr, &GainFrame, 1 ); - IF( EQ_16( st_fx->core, ACELP_CORE ) && EQ_16( st_fx->last_core, ACELP_CORE ) && !st_fx->prev_use_partial_copy && EQ_16( st_fx->prev_coder_type, UNVOICED ) && NE_32( GainFrame, hBWE_TD->GainFrame_prevfrm_fx ) && EQ_16( st_fx->last_extl, WB_TBE ) ) + test(); + test(); + test(); + test(); + test(); + IF( ( st_fx->core == ACELP_CORE ) && ( st_fx->last_core == ACELP_CORE ) && !st_fx->prev_use_partial_copy && EQ_16( st_fx->prev_coder_type, UNVOICED ) && NE_32( GainFrame, hBWE_TD->GainFrame_prevfrm_fx ) && EQ_16( st_fx->last_extl, WB_TBE ) ) { /*GainFrame = 0.2f*GainFrame + 0.8f*st_fx->GainFrame_prevfrm_fx;*/ GainFrame = L_add( Mult_32_16( hBWE_TD->GainFrame_prevfrm_fx, 26214 ), Mult_32_16( GainFrame, 6553 ) ); @@ -681,30 +731,42 @@ void ivas_wb_tbe_dec_fx( { case 0: GainFrame = 131072; /* 0.5f in Q18 */ - IF( LE_32( hBWE_TD->GainFrame_prevfrm_fx, 327680l /*1.25 Q18*/ ) ) - temp = 26214 /*0.8 Q15*/; - move16(); + move32(); + if ( LE_32( hBWE_TD->GainFrame_prevfrm_fx, 327680l /*1.25 Q18*/ ) ) + { + temp = 26214 /*0.8 Q15*/; + move16(); + } BREAK; case 1: GainFrame = 524288; /* 2.0f in Q18 */ - IF( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 327680l /*1.25 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 786432l /*3 Q18*/ ) ) - temp = 26214 /*0.8 Q15*/; - move16(); + move32(); test(); + if ( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 327680l /*1.25 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 786432l /*3 Q18*/ ) ) + { + temp = 26214 /*0.8 Q15*/; + move16(); + } BREAK; case 2: GainFrame = 1048576; /* 4.0f in Q18 */ - IF( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 786432l /*3 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 1572864l /*6 Q18*/ ) ) - temp = 26214 /*0.8 Q15*/; - move16(); + move32(); test(); + if ( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 786432l /*3 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 1572864l /*6 Q18*/ ) ) + { + temp = 26214 /*0.8 Q15*/; + move16(); + } BREAK; case 3: GainFrame = 2097152; /* 8.0f in Q18 */ - IF( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 1572864l /*6 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 4194304l /*16 Q18*/ ) ) - temp = 26214 /*0.8 Q15*/; - move16(); + move32(); test(); + if ( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 1572864l /*6 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 4194304l /*16 Q18*/ ) ) + { + temp = 26214 /*0.8 Q15*/; + move16(); + } BREAK; default: fprintf( stderr, "RF SWB-TBE gain bits not supported." ); @@ -714,8 +776,13 @@ void ivas_wb_tbe_dec_fx( GainFrame = L_add( Mult_32_16( hBWE_TD->GainFrame_prevfrm_fx, temp ), Mult_32_16( GainFrame, sub( 32767, temp ) ) ); } - IF( EQ_16( st_fx->core, ACELP_CORE ) && EQ_16( st_fx->last_core, ACELP_CORE ) ) + test(); + IF( ( st_fx->core == ACELP_CORE ) && ( st_fx->last_core == ACELP_CORE ) ) { + test(); + test(); + test(); + test(); IF( !st_fx->prev_use_partial_copy && EQ_16( st_fx->last_coder_type, VOICED ) && EQ_16( st_fx->rf_frame_type, RF_GENPRED ) && LT_16( st_fx->prev_tilt_code_dec_fx, 1497 ) && GT_16( st_fx->prev_tilt_code_dec_fx, 200 ) ) { GainFrame = Mult_32_16( GainFrame, 9830 ); @@ -752,10 +819,11 @@ void ivas_wb_tbe_dec_fx( ELSE { GainFrame = hBWE_TD->GainFrame_prevfrm_fx; /*Q18*/ + move32(); } } - IF( st_fx->extl_brate == WB_TBE_0k35 ) + IF( EQ_32( st_fx->extl_brate, WB_TBE_0k35 ) ) { /* convert LSPs back into LP coeffs */ lsp2lpc_fx( lpc_wb + 1, lsf_wb, st_fx->prev_lpc_wb_fx, LPC_SHB_ORDER_LBR_WB ); @@ -792,14 +860,14 @@ void ivas_wb_tbe_dec_fx( } Copy( voice_factors, vf_modified, NB_SUBFR16k ); - IF( coder_type == VOICED ) + IF( EQ_16( coder_type, VOICED ) ) { FOR( i = 1; i < NB_SUBFR; i++ ) { vf_modified[i] = add( mult_r( 26214, voice_factors[i] ), mult_r( 6554, voice_factors[i - 1] ) ); /* Q15 */ move16(); } - IF( st_fx->L_frame != L_FRAME ) + IF( NE_16( st_fx->L_frame, L_FRAME ) ) { vf_modified[4] = add( mult_r( 26214, voice_factors[4] ), mult_r( 6554, voice_factors[3] ) ); /* Q15 */ move16(); @@ -808,29 +876,39 @@ void ivas_wb_tbe_dec_fx( /* From low band excitation, generate highband excitation */ Lmax = 0; + move32(); FOR( cnt = 0; cnt < L_FRAME32k + NL_BUFF_OFFSET; cnt++ ) { Lmax = L_max( Lmax, L_abs( bwe_exc_extended[cnt] ) ); } - Q_bwe_exc = ( Lmax == 0 ) ? 31 : norm_l( Lmax ); + IF( Lmax == 0 ) + { + Q_bwe_exc = 31; + move16(); + } + ELSE + { + Q_bwe_exc = norm_l( Lmax ); + } Q_bwe_exc = sub( Q_bwe_exc, 3 ); Q_bwe_exc = add( Q_bwe_exc, add( Q_exc, Q_exc ) ); find_max_mem_wb( st_fx, &n_mem ); - IF( sub( Q_bwe_exc, st_fx->prev_Q_bwe_exc ) > n_mem ) + if ( GT_16( sub( Q_bwe_exc, st_fx->prev_Q_bwe_exc ), n_mem ) ) { Q_bwe_exc = add( st_fx->prev_Q_bwe_exc, n_mem ); } test(); - IF( uv_flag && GT_16( Q_bwe_exc, 20 ) ) + if ( uv_flag && GT_16( Q_bwe_exc, 20 ) ) { Q_bwe_exc = 20; move16(); /* restrict this to 21 due to the Q factor requireemnt of the random number generator (keep 1 bit headroom) */ } prev_pow = 0; + move32(); FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ ) { prev_pow = L_mac0( prev_pow, hBWE_TD->state_syn_shbexc_fx[i], hBWE_TD->state_syn_shbexc_fx[i] ); /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/ @@ -842,6 +920,7 @@ void ivas_wb_tbe_dec_fx( FOR( cnt = 0; cnt < L_FRAME32k + NL_BUFF_OFFSET; cnt++ ) { bwe_exc_extended_16[cnt] = round_fx( L_shl( bwe_exc_extended[cnt], sc ) ); + move16(); } Copy( hBWE_TD->state_syn_shbexc_fx, shaped_wb_excitation, L_SHB_LAHEAD / 4 ); @@ -854,12 +933,13 @@ void ivas_wb_tbe_dec_fx( bwe_exc_extended_16, Q_bwe_exc_ext, hBWE_TD->bwe_seed, vf_modified, uv_flag, st_fx->igf ); curr_pow = 0; + move32(); FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ ) { curr_pow = L_mac0( curr_pow, shaped_wb_excitation[i + L_SHB_LAHEAD / 4], shaped_wb_excitation[i + L_SHB_LAHEAD / 4] ); /* Q(2*Q_bwe_exc_ext) */ } - IF( GT_16( voice_factors[0], 24576 ) ) + if ( GT_16( voice_factors[0], 24576 ) ) { curr_pow = L_shr( curr_pow, 2 ); /* Q(2*Q_bwe_exc_ext) */ } @@ -871,10 +951,12 @@ void ivas_wb_tbe_dec_fx( { L_tmp = Mult_32_16( Lscale, shaped_wb_excitation[i] ); /* Q(16-exp+Q_bwe_exc_ext) */ shaped_wb_excitation[i] = round_fx( L_shl( L_tmp, exp ) ); /* Q_bwe_exc_ext */ + move16(); } - Lscale = root_a_fx( Lscale, 31 - exp, &exp ); + Lscale = root_a_fx( Lscale, sub( 31, exp ), &exp ); L_tmp = Mult_32_16( Lscale, shaped_wb_excitation[L_SHB_LAHEAD / 4 - 1] ); /* Q(16-exp+Q_bwe_exc_ext) */ shaped_wb_excitation[L_SHB_LAHEAD / 4 - 1] = round_fx( L_shl( L_tmp, exp ) ); /* Q_bwe_exc_ext */ + move16(); /* Update SHB excitation */ Copy( shaped_wb_excitation + L_FRAME16k / 4, hBWE_TD->state_syn_shbexc_fx, L_SHB_LAHEAD / 4 ); @@ -887,6 +969,7 @@ void ivas_wb_tbe_dec_fx( Q_bwe_exc_ext, st_fx->L_frame, 0, &dummy, dummy, dummy2 ); max = 0; + move16(); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { max = s_max( max, abs_s( shaped_wb_excitation[i] ) ); @@ -914,6 +997,7 @@ void ivas_wb_tbe_dec_fx( } n = sub( 14, n ); curr_frame_pow = 1; + move32(); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { #ifdef BASOP_NOGLOB @@ -931,12 +1015,15 @@ void ivas_wb_tbe_dec_fx( { curr_frame_pow = L_shr( curr_frame_pow, sub( st_fx->prev_frame_pow_exp, curr_frame_pow_exp ) ); curr_frame_pow_exp = st_fx->prev_frame_pow_exp; + move16(); } ELSE { hBWE_TD->prev_wb_bwe_frame_pow_fx = L_shr( hBWE_TD->prev_wb_bwe_frame_pow_fx, sub( curr_frame_pow_exp, st_fx->prev_frame_pow_exp ) ); + move32(); } + test(); test(); IF( !st_fx->bfi && ( st_fx->prev_bfi || st_fx->prev_use_partial_copy ) ) { @@ -945,24 +1032,26 @@ void ivas_wb_tbe_dec_fx( L_tmp = root_a_over_b_fx( hBWE_TD->prev_wb_bwe_frame_pow_fx, 22, curr_frame_pow, 22, &exp ); scale = round_fx( L_shl( L_tmp, exp ) ); /*Q15*/ - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); temp = round_fx( L_shl( L_tmp, exp ) ); /* Q15 */ } ELSE { scale = temp = 32767; move16(); /* Q15 */ + move16(); } FOR( j = 0; j < 8; j++ ) { GainShape[2 * j] = mult_r( GainShape[2 * j], scale ); - GainShape[2 * j + 1] = mult_r( GainShape[2 * j + 1], scale ); + GainShape[add( 2 * j, 1 )] = mult_r( GainShape[add( 2 * j, 1 )], scale ); FOR( i = 0; i < L_FRAME16k / ( 4 * 8 ); i++ ) { - shaped_wb_excitation[i + j * L_FRAME16k / ( 4 * 8 )] = mult_r( shaped_wb_excitation[i + j * L_FRAME16k / ( 4 * 8 )], scale ); + shaped_wb_excitation[add( i, j * ( L_FRAME16k / ( 4 * 8 ) ) )] = mult_r( shaped_wb_excitation[add( i, j * ( L_FRAME16k / ( 4 * 8 ) ) )], scale ); + move16(); } IF( temp > 0 ) { @@ -994,13 +1083,13 @@ void ivas_wb_tbe_dec_fx( move16(); FOR( cnt = 0; cnt < ( L_FRAME16k + L_SHB_LAHEAD ) / 4; cnt++ ) { - IF( abs_s( shaped_wb_excitation[cnt] ) > max ) + if ( GT_16( abs_s( shaped_wb_excitation[cnt] ), max ) ) { max = abs_s( shaped_wb_excitation[cnt] ); } } Qx = norm_s( max ); - IF( max == 0 ) + if ( max == 0 ) { Qx = 15; move16(); @@ -1012,14 +1101,14 @@ void ivas_wb_tbe_dec_fx( move16(); FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ ) { - IF( abs_s( hBWE_TD->state_lsyn_filt_shb_fx[i] ) > max ) - max = abs_s( hBWE_TD->state_lsyn_filt_shb_fx[i] ); + if ( GT_16( abs_s( hBWE_TD->state_lsyn_filt_shb_fx[i] ), max ) ) + max = abs_s( hBWE_TD->state_lsyn_filt_shb_fx[i] ); } FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ ) { - IF( abs_s( hBWE_TD->state_lsyn_filt_dwn_shb_fx[i] ) > max ) - max = abs_s( hBWE_TD->state_lsyn_filt_dwn_shb_fx[i] ); + if ( GT_16( abs_s( hBWE_TD->state_lsyn_filt_dwn_shb_fx[i] ), max ) ) + max = abs_s( hBWE_TD->state_lsyn_filt_dwn_shb_fx[i] ); } IF( EQ_32( st_fx->output_Fs, 32000 ) ) @@ -1037,14 +1126,15 @@ void ivas_wb_tbe_dec_fx( } } n_mem = 15; - IF( max != 0 ) + move16(); + if ( max != 0 ) { n_mem = norm_s( max ); } n_mem = s_max( n_mem, 0 ); - IF( sub( Qx, st_fx->prev_Qx ) > n_mem ) - Qx = add( st_fx->prev_Qx, n_mem ); + if ( GT_16( sub( Qx, st_fx->prev_Qx ), n_mem ) ) + Qx = add( st_fx->prev_Qx, n_mem ); FOR( i = 0; i < ( L_FRAME16k + L_SHB_LAHEAD ) / 4; i++ ) { @@ -1097,6 +1187,7 @@ void ivas_wb_tbe_dec_fx( n = sub( sub( 14, n ), Qx ); Lacc = 0; + move32(); FOR( i = 0; i < L_FRAME16k; i++ ) { L_tmp = L_mult( synth_frac[i], synth_frac[i] ); /* Q29 */ @@ -1112,8 +1203,9 @@ void ivas_wb_tbe_dec_fx( #endif exp = sub( add( exp, 22 ), 30 ); tmp = div_s( 16384, tmp ); - L_tmp = Isqrt_lc( L_deposit_h( tmp ), &exp ); /* Q(31-exp) */ - st_fx->last_wb_bwe_ener_fx = round_fx( L_shl( L_tmp, add( exp, n - 12 ) ) ); /* Q3 */ + L_tmp = Isqrt_lc( L_deposit_h( tmp ), &exp ); /* Q(31-exp) */ + st_fx->last_wb_bwe_ener_fx = round_fx( L_shl( L_tmp, add( exp, sub( n, 12 ) ) ) ); /* Q3 */ + move16(); } @@ -1148,9 +1240,13 @@ void ivas_wb_tbe_dec_fx( move16(); } GainFrame = 0; /* Q18 */ + move32(); Qx = 0; + move16(); Q_bwe_exc = 31; + move16(); hBWE_TD->prev_wb_bwe_frame_pow_fx = 4194l /*0.001f Q22*/; /* Q22 */ + move32(); st_fx->prev_frame_pow_exp = 0; move16(); } @@ -1165,8 +1261,9 @@ void ivas_wb_tbe_dec_fx( Copy( lsf_wb, hBWE_TD->lsp_prevfrm_fx, LPC_SHB_ORDER_WB ); } hBWE_TD->GainFrame_prevfrm_fx = GainFrame; /* Q18 */ + move32(); - IF( !st_fx->bfi ) + if ( !st_fx->bfi ) { hBWE_TD->GainAttn_fx = 32767; move16(); @@ -1211,24 +1308,30 @@ void wb_tbe_dec_fx( Word16 Q_bwe_exc, Q_bwe_exc_ext, Qx; Word16 n_mem, cnt; Word16 max = 0; + move16(); Word32 L_tmp, Lacc, Lscale, Lmax = 0; + move32(); Word16 tmp, exp, sc; Word16 vf_modified[NB_SUBFR16k]; Word16 uv_flag = 0; + move16(); Word16 dummy = 0; - Word32 dummy2[HILBERT_MEM_SIZE] = { 0 }; + move16(); + Word32 dummy2[HILBERT_MEM_SIZE]; Word16 f, inc; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st_fx->hBWE_TD; - + set_val_Word32( &dummy2[0], 0, HILBERT_MEM_SIZE ); IF( st_fx->bws_cnt == 0 ) { /* Initialization */ set16_fx( GainShape, 11469 /*0.35f Q15*/, NUM_SHB_SUBFR ); GainFrame = 1; + move32(); IF( !st_fx->bfi ) { @@ -1237,11 +1340,13 @@ void wb_tbe_dec_fx( IF( NE_16( st_fx->last_extl, WB_TBE ) ) { hBWE_TD->GainFrame_prevfrm_fx = 0; + move32(); hBWE_TD->lsp_prevfrm_fx[0] = 3277 /*0.1f Q15*/; move16(); FOR( i = 1; i < LPC_SHB_ORDER_LBR_WB; i++ ) { hBWE_TD->lsp_prevfrm_fx[i] = add( hBWE_TD->lsp_prevfrm_fx[i - i], 3277 /*0.1f Q15*/ ); + move16(); } } Copy( hBWE_TD->lsp_prevfrm_fx, lsf_wb, LPC_SHB_ORDER_LBR_WB ); @@ -1251,8 +1356,14 @@ void wb_tbe_dec_fx( { /* Frame gain */ st_fx->rf_indx_tbeGainFr = s_and( st_fx->rf_indx_tbeGainFr, 0xF ); /* only four LSBs are valid */ + move16(); Copy32( SHBCB_FrameGain16_fx + st_fx->rf_indx_tbeGainFr, &GainFrame, 1 ); - IF( EQ_16( st_fx->core, ACELP_CORE ) && EQ_16( st_fx->last_core, ACELP_CORE ) && !st_fx->prev_use_partial_copy && EQ_16( st_fx->prev_coder_type, UNVOICED ) && NE_32( GainFrame, hBWE_TD->GainFrame_prevfrm_fx ) && EQ_16( st_fx->last_extl, WB_TBE ) ) + test(); + test(); + test(); + test(); + test(); + IF( ( st_fx->core == ACELP_CORE ) && ( st_fx->last_core == ACELP_CORE ) && !st_fx->prev_use_partial_copy && EQ_16( st_fx->prev_coder_type, UNVOICED ) && NE_32( GainFrame, hBWE_TD->GainFrame_prevfrm_fx ) && EQ_16( st_fx->last_extl, WB_TBE ) ) { /*GainFrame = 0.2f*GainFrame + 0.8f*st_fx->GainFrame_prevfrm_fx;*/ GainFrame = L_add( Mult_32_16( hBWE_TD->GainFrame_prevfrm_fx, 26214 ), Mult_32_16( GainFrame, 6553 ) ); @@ -1267,30 +1378,42 @@ void wb_tbe_dec_fx( { case 0: GainFrame = 131072; /* 0.5f in Q18 */ - IF( LE_32( hBWE_TD->GainFrame_prevfrm_fx, 327680l /*1.25 Q18*/ ) ) - temp = 26214 /*0.8 Q15*/; - move16(); + move32(); + if ( LE_32( hBWE_TD->GainFrame_prevfrm_fx, 327680l /*1.25 Q18*/ ) ) + { + temp = 26214 /*0.8 Q15*/; + move16(); + } BREAK; case 1: GainFrame = 524288; /* 2.0f in Q18 */ - IF( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 327680l /*1.25 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 786432l /*3 Q18*/ ) ) - temp = 26214 /*0.8 Q15*/; - move16(); + move32(); test(); + if ( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 327680l /*1.25 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 786432l /*3 Q18*/ ) ) + { + temp = 26214 /*0.8 Q15*/; + move16(); + } BREAK; case 2: GainFrame = 1048576; /* 4.0f in Q18 */ - IF( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 786432l /*3 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 1572864l /*6 Q18*/ ) ) - temp = 26214 /*0.8 Q15*/; - move16(); + move32(); test(); + if ( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 786432l /*3 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 1572864l /*6 Q18*/ ) ) + { + temp = 26214 /*0.8 Q15*/; + move16(); + } BREAK; case 3: GainFrame = 2097152; /* 8.0f in Q18 */ - IF( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 1572864l /*6 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 4194304l /*16 Q18*/ ) ) - temp = 26214 /*0.8 Q15*/; - move16(); + move32(); test(); + if ( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 1572864l /*6 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 4194304l /*16 Q18*/ ) ) + { + temp = 26214 /*0.8 Q15*/; + move16(); + } BREAK; default: fprintf( stderr, "RF SWB-TBE gain bits not supported." ); @@ -1300,8 +1423,13 @@ void wb_tbe_dec_fx( GainFrame = L_add( Mult_32_16( hBWE_TD->GainFrame_prevfrm_fx, temp ), Mult_32_16( GainFrame, sub( 32767, temp ) ) ); } - IF( EQ_16( st_fx->core, ACELP_CORE ) && EQ_16( st_fx->last_core, ACELP_CORE ) ) + test(); + IF( ( st_fx->core == ACELP_CORE ) && ( st_fx->last_core == ACELP_CORE ) ) { + test(); + test(); + test(); + test(); IF( !st_fx->prev_use_partial_copy && EQ_16( st_fx->last_coder_type, VOICED ) && EQ_16( st_fx->rf_frame_type, RF_GENPRED ) && LT_16( st_fx->prev_tilt_code_dec_fx, 1497 ) && GT_16( st_fx->prev_tilt_code_dec_fx, 200 ) ) { GainFrame = Mult_32_16( GainFrame, 9830 ); @@ -1337,14 +1465,15 @@ void wb_tbe_dec_fx( ELSE { GainFrame = hBWE_TD->GainFrame_prevfrm_fx; /*Q18*/ + move32(); } } - IF( st_fx->extl_brate == WB_TBE_0k35 ) + IF( EQ_32( st_fx->extl_brate, WB_TBE_0k35 ) ) { /* convert LSPs back into LP coeffs */ lsp2lpc_fx( lpc_wb + 1, lsf_wb, st_fx->prev_lpc_wb_fx, LPC_SHB_ORDER_LBR_WB ); - set16_fx( lpc_wb + LPC_SHB_ORDER_LBR_WB + 1, 0, ( LPC_SHB_ORDER_WB - LPC_SHB_ORDER_LBR_WB ) ); + set16_fx( lpc_wb + LPC_SHB_ORDER_LBR_WB + 1, 0, LPC_SHB_ORDER_WB - LPC_SHB_ORDER_LBR_WB ); FOR( i = 0; i < LPC_SHB_ORDER_WB; i++ ) { st_fx->prev_lpc_wb_fx[i] = lpc_wb[i + 1]; @@ -1377,14 +1506,14 @@ void wb_tbe_dec_fx( } Copy( voice_factors, vf_modified, NB_SUBFR16k ); - IF( coder_type == VOICED ) + IF( EQ_16( coder_type, VOICED ) ) { FOR( i = 1; i < NB_SUBFR; i++ ) { vf_modified[i] = add( mult_r( 26214, voice_factors[i] ), mult_r( 6554, voice_factors[i - 1] ) ); /* Q15 */ move16(); } - IF( st_fx->L_frame != L_FRAME ) + IF( NE_16( st_fx->L_frame, L_FRAME ) ) { vf_modified[4] = add( mult_r( 26214, voice_factors[4] ), mult_r( 6554, voice_factors[3] ) ); /* Q15 */ move16(); @@ -1393,17 +1522,26 @@ void wb_tbe_dec_fx( /* From low band excitation, generate highband excitation */ Lmax = 0; + move32(); FOR( cnt = 0; cnt < L_FRAME32k; cnt++ ) { Lmax = L_max( Lmax, L_abs( bwe_exc_extended[cnt] ) ); } - Q_bwe_exc = ( Lmax == 0 ) ? 31 : norm_l( Lmax ); + IF( Lmax == 0 ) + { + Q_bwe_exc = 31; + move16(); + } + ELSE + { + Q_bwe_exc = norm_l( Lmax ); + } Q_bwe_exc = sub( Q_bwe_exc, 1 ); Q_bwe_exc = add( Q_bwe_exc, add( Q_exc, Q_exc ) ); find_max_mem_wb( st_fx, &n_mem ); - if ( sub( Q_bwe_exc, st_fx->prev_Q_bwe_exc ) > n_mem ) + if ( GT_16( sub( Q_bwe_exc, st_fx->prev_Q_bwe_exc ), n_mem ) ) { Q_bwe_exc = add( st_fx->prev_Q_bwe_exc, n_mem ); } @@ -1416,6 +1554,7 @@ void wb_tbe_dec_fx( } prev_pow = 0; + move32(); FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ ) { #ifdef BASOP_NOGLOB @@ -1449,6 +1588,7 @@ void wb_tbe_dec_fx( bwe_exc_extended_16, Q_bwe_exc_ext, hBWE_TD->bwe_seed, vf_modified, uv_flag, st_fx->igf ); curr_pow = 0; + move32(); FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ ) { #ifdef BASOP_NOGLOB @@ -1474,8 +1614,9 @@ void wb_tbe_dec_fx( #else shaped_wb_excitation[i] = round_fx( L_shl( L_tmp, exp ) ); /* Q_bwe_exc_ext */ #endif + move16(); } - Lscale = root_a_fx( Lscale, 31 - exp, &exp ); + Lscale = root_a_fx( Lscale, sub( 31, exp ), &exp ); L_tmp = Mult_32_16( Lscale, shaped_wb_excitation[L_SHB_LAHEAD / 4 - 1] ); /* Q(16-exp+Q_bwe_exc_ext) */ shaped_wb_excitation[L_SHB_LAHEAD / 4 - 1] = round_fx( L_shl( L_tmp, exp ) ); /* Q_bwe_exc_ext */ @@ -1490,6 +1631,7 @@ void wb_tbe_dec_fx( Q_bwe_exc_ext, st_fx->L_frame, 0, &dummy, dummy, dummy2 ); max = 0; + move16(); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { max = s_max( max, shaped_wb_excitation[i] ); /*Q0*/ @@ -1498,7 +1640,7 @@ void wb_tbe_dec_fx( IF( max == 0 ) { curr_frame_pow = 1; - move16(); + move32(); n = 0; move16(); } @@ -1517,6 +1659,7 @@ void wb_tbe_dec_fx( } n = sub( 14, n ); curr_frame_pow = 1; + move32(); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { #ifdef BASOP_NOGLOB @@ -1534,10 +1677,12 @@ void wb_tbe_dec_fx( { curr_frame_pow = L_shr( curr_frame_pow, sub( st_fx->prev_frame_pow_exp, curr_frame_pow_exp ) ); curr_frame_pow_exp = st_fx->prev_frame_pow_exp; + move16(); } ELSE { hBWE_TD->prev_wb_bwe_frame_pow_fx = L_shr( hBWE_TD->prev_wb_bwe_frame_pow_fx, sub( curr_frame_pow_exp, st_fx->prev_frame_pow_exp ) ); + move32(); } test(); @@ -1548,24 +1693,25 @@ void wb_tbe_dec_fx( L_tmp = root_a_over_b_fx( hBWE_TD->prev_wb_bwe_frame_pow_fx, 22, curr_frame_pow, 22, &exp ); scale = round_fx( L_shl( L_tmp, exp ) ); /*Q15*/ - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); temp = round_fx( L_shl( L_tmp, exp ) ); /* Q15 */ } ELSE { scale = temp = 32767; move16(); /* Q15 */ + move16(); } FOR( j = 0; j < 8; j++ ) { GainShape[2 * j] = mult_r( GainShape[2 * j], scale ); - GainShape[2 * j + 1] = mult_r( GainShape[2 * j + 1], scale ); + GainShape[add( 2 * j, 1 )] = mult_r( GainShape[add( 2 * j, 1 )], scale ); FOR( i = 0; i < L_FRAME16k / ( 4 * 8 ); i++ ) { - shaped_wb_excitation[i + j * L_FRAME16k / ( 4 * 8 )] = mult_r( shaped_wb_excitation[i + j * L_FRAME16k / ( 4 * 8 )], scale ); + shaped_wb_excitation[add( i, j * ( L_FRAME16k / ( 4 * 8 ) ) )] = mult_r( shaped_wb_excitation[add( i, j * ( L_FRAME16k / ( 4 * 8 ) ) )], scale ); } IF( temp > 0 ) { @@ -1597,7 +1743,7 @@ void wb_tbe_dec_fx( move16(); FOR( cnt = 0; cnt < ( L_FRAME16k + L_SHB_LAHEAD ) / 4; cnt++ ) { - if ( abs_s( shaped_wb_excitation[cnt] ) > max ) + if ( GT_16( abs_s( shaped_wb_excitation[cnt] ), max ) ) { max = abs_s( shaped_wb_excitation[cnt] ); } @@ -1615,13 +1761,13 @@ void wb_tbe_dec_fx( move16(); FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ ) { - if ( abs_s( hBWE_TD->state_lsyn_filt_shb_fx[i] ) > max ) + if ( GT_16( abs_s( hBWE_TD->state_lsyn_filt_shb_fx[i] ), max ) ) max = abs_s( hBWE_TD->state_lsyn_filt_shb_fx[i] ); } FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ ) { - if ( abs_s( hBWE_TD->state_lsyn_filt_dwn_shb_fx[i] ) > max ) + if ( GT_16( abs_s( hBWE_TD->state_lsyn_filt_dwn_shb_fx[i] ), max ) ) max = abs_s( hBWE_TD->state_lsyn_filt_dwn_shb_fx[i] ); } @@ -1640,13 +1786,14 @@ void wb_tbe_dec_fx( } } n_mem = 15; + move16(); if ( max != 0 ) { n_mem = norm_s( max ); } n_mem = s_max( n_mem, 0 ); - if ( sub( Qx, st_fx->prev_Qx ) > n_mem ) + if ( GT_16( sub( Qx, st_fx->prev_Qx ), n_mem ) ) Qx = add( st_fx->prev_Qx, n_mem ); FOR( i = 0; i < ( L_FRAME16k + L_SHB_LAHEAD ) / 4; i++ ) @@ -1700,6 +1847,7 @@ void wb_tbe_dec_fx( n = sub( sub( 14, n ), Qx ); Lacc = 0; + move32(); FOR( i = 0; i < L_FRAME16k; i++ ) { L_tmp = L_mult( synth_frac[i], synth_frac[i] ); /* Q29 */ @@ -1717,10 +1865,11 @@ void wb_tbe_dec_fx( tmp = div_s( 16384, tmp ); L_tmp = Isqrt_lc( L_deposit_h( tmp ), &exp ); /* Q(31-exp) */ #ifdef BASOP_NOGLOB - st_fx->last_wb_bwe_ener_fx = round_fx_sat( L_shl_sat( L_tmp, add( exp, n - 12 ) ) ); /* Q3 */ + st_fx->last_wb_bwe_ener_fx = round_fx_sat( L_shl_sat( L_tmp, add( exp, sub( n, 12 ) ) ) ); /* Q3 */ #else st_fx->last_wb_bwe_ener_fx = round_fx( L_shl( L_tmp, add( exp, n - 12 ) ) ); /* Q3 */ #endif + move16(); } @@ -1755,9 +1904,13 @@ void wb_tbe_dec_fx( move16(); } GainFrame = 0; /* Q18 */ + move32(); Qx = 0; + move16(); Q_bwe_exc = 31; + move16(); hBWE_TD->prev_wb_bwe_frame_pow_fx = 4194l /*0.001f Q22*/; /* Q22 */ + move32(); st_fx->prev_frame_pow_exp = 0; move16(); } @@ -1772,8 +1925,9 @@ void wb_tbe_dec_fx( Copy( lsf_wb, hBWE_TD->lsp_prevfrm_fx, LPC_SHB_ORDER_WB ); } hBWE_TD->GainFrame_prevfrm_fx = GainFrame; /* Q18 */ + move32(); - if ( !st_fx->bfi ) + IF( !st_fx->bfi ) { hBWE_TD->GainAttn_fx = 32767; move16(); @@ -1883,6 +2037,7 @@ void swb_tbe_dec_fx( Word16 mean_vf; Word16 exp_ener, inv_ener; Word32 prev_ener_ratio_fx = 0; /* initialize just to avoid compiler warning */ + move32(); Word16 max, n, temp, shaped_shb_excitation_frac[L_FRAME16k + L_SHB_LAHEAD]; Word32 curr_frame_pow; Word16 curr_frame_pow_exp; @@ -1902,7 +2057,7 @@ void swb_tbe_dec_fx( move16(); set16_fx( shb_res_gshape, 1638 /*0.1f Q14*/, NB_SUBFR16k ); /* Q14 */ Q_shb = 0; /* high band target Q factor set to zero */ - + move16(); L_tmp = calc_tilt_bwe_fx( old_syn_12k8_16k, st_fx->Q_syn2, st_fx->L_frame ); #ifdef BASOP_NOGLOB tilt_swb_fec = round_fx_sat( L_shl_sat( L_tmp, 3 ) ); @@ -1912,7 +2067,7 @@ void swb_tbe_dec_fx( /* i: old_syn_12k8_16k in st_fx->Q_syn2 */ /* o: tilt_swb_fec in Q11 */ test(); - IF( st_fx->bfi && NE_16( st_fx->clas_dec, UNVOICED_CLAS ) ) + if ( st_fx->bfi && st_fx->clas_dec != UNVOICED_CLAS ) { tilt_swb_fec = hBWE_TD->tilt_swb_fec_fx; move16(); @@ -1921,7 +2076,7 @@ void swb_tbe_dec_fx( /* WB/SWB bandwidth switching */ test(); test(); - IF( ( GT_16( st_fx->tilt_wb_fx, 10240 ) && EQ_16( st_fx->clas_dec, UNVOICED_CLAS ) ) || GT_16( st_fx->tilt_wb_fx, 20480 ) ) + IF( ( GT_16( st_fx->tilt_wb_fx, 10240 ) && ( st_fx->clas_dec == UNVOICED_CLAS ) ) || GT_16( st_fx->tilt_wb_fx, 20480 ) ) { test(); test(); @@ -1930,7 +2085,8 @@ void swb_tbe_dec_fx( test(); test(); test(); - IF( ( st_fx->prev_fractive == 0 && + test(); + IF( ( ( st_fx->prev_fractive == 0 ) && ( LT_32( st_fx->prev_enerLH_fx, L_shl( st_fx->enerLH_fx, 1 ) ) && GT_32( st_fx->prev_enerLH_fx, L_shr( st_fx->enerLH_fx, 1 ) ) && LT_32( st_fx->prev_enerLL_fx, L_shl( st_fx->enerLL_fx, 1 ) ) && GT_32( st_fx->prev_enerLL_fx, L_shr( st_fx->enerLL_fx, 1 ) ) ) ) || ( EQ_16( st_fx->prev_fractive, 1 ) && GT_32( L_shr( st_fx->prev_enerLH_fx, 2 ), Mult_32_16( st_fx->enerLH_fx, 24576 ) ) ) /* 24576 in Q13*/ @@ -1951,8 +2107,10 @@ void swb_tbe_dec_fx( /* WB/SWB bandwidth switching */ IF( st_fx->bws_cnt > 0 ) { - f_fx = 1489; /*Q15*/ + f_fx = 1489; /*Q15*/ + move16(); inc_fx = 1489; /*Q15*/ + move16(); IF( EQ_16( is_fractive, 1 ) ) { Copy( lsf_tab_fx, hBWE_TD->lsp_prevfrm_fx, LPC_SHB_ORDER ); @@ -1974,8 +2132,8 @@ void swb_tbe_dec_fx( test(); test(); IF( ( NE_16( st_fx->last_extl, SWB_TBE ) && NE_16( st_fx->last_extl, FB_TBE ) && - !( L_sub( L_shr( st_fx->prev_enerLH_fx, 1 ), st_fx->enerLH_fx ) < 0 && L_sub( st_fx->prev_enerLH_fx, L_shr( st_fx->enerLH_fx, 1 ) > 0 ) ) ) || - sub( st_fx->last_core, ACELP_CORE ) != 0 || ( sub( st_fx->last_core, ACELP_CORE ) == 0 && L_sub( L_abs( L_sub( st_fx->last_core_brate, st_fx->core_brate ) ), 3600 ) > 0 ) || sub( ( is_fractive ^ st_fx->prev_fractive ), 1 ) == 0 ) + !( ( L_sub( L_shr( st_fx->prev_enerLH_fx, 1 ), st_fx->enerLH_fx ) < 0 ) && L_sub( st_fx->prev_enerLH_fx, ( L_shr( st_fx->enerLH_fx, 1 ) > 0 ) ) ) ) || + ( sub( st_fx->last_core, ACELP_CORE ) != 0 ) || ( ( sub( st_fx->last_core, ACELP_CORE ) == 0 ) && ( L_sub( L_abs( L_sub( st_fx->last_core_brate, st_fx->core_brate ) ), 3600 ) > 0 ) ) || ( sub( s_xor( is_fractive, st_fx->prev_fractive ), 1 ) == 0 ) ) { set16_fx( GainShape, 11587, NUM_SHB_SUBFR ); } @@ -2017,11 +2175,10 @@ void swb_tbe_dec_fx( { hBWE_TD->GainFrame_prevfrm_fx = 0; move16(); + f_fx = 1489 /*0.045454f Q15*/; move16(); - move16(); - f_fx = 1489 /*0.045454f Q15*/; /*Q15*/ inc_fx = 1489 /*0.045454f Q15*/; - ; /*Q15*/ + move16(); FOR( i = 0; i < LPC_SHB_ORDER; i++ ) { hBWE_TD->lsp_prevfrm_fx[i] = f_fx; @@ -2042,7 +2199,13 @@ void swb_tbe_dec_fx( frac = L_Extract_lc( L_tmp, &exp ); L_tmp = Pow2( 30, frac ); GainFrame = L_shl( L_tmp, sub( exp, 12 ) ); /*Q18*/ - IF( EQ_16( st_fx->core, ACELP_CORE ) && EQ_16( st_fx->last_core, ACELP_CORE ) && !st_fx->prev_use_partial_copy && EQ_16( st_fx->prev_coder_type, UNVOICED ) && NE_32( GainFrame, hBWE_TD->GainFrame_prevfrm_fx ) && NE_16( st_fx->next_coder_type, GENERIC ) && EQ_16( st_fx->last_extl, SWB_TBE ) ) + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( st_fx->core == ACELP_CORE ) && ( st_fx->last_core == ACELP_CORE ) && !st_fx->prev_use_partial_copy && EQ_16( st_fx->prev_coder_type, UNVOICED ) && NE_32( GainFrame, hBWE_TD->GainFrame_prevfrm_fx ) && NE_16( st_fx->next_coder_type, GENERIC ) && EQ_16( st_fx->last_extl, SWB_TBE ) ) { /*GainFrame = 0.2f*GainFrame + 0.8f*st_fx->GainFrame_prevfrm_fx;*/ GainFrame = L_add( Mult_32_16( hBWE_TD->GainFrame_prevfrm_fx, 26214 ), Mult_32_16( GainFrame, 6553 ) ); @@ -2057,30 +2220,42 @@ void swb_tbe_dec_fx( { case 0: GainFrame = 131072; /* 0.5f in Q18 */ - IF( LE_32( hBWE_TD->GainFrame_prevfrm_fx, 327680l /*1.25 Q18*/ ) ) - temp = 26214 /*0.8 Q15*/; - move16(); + move32(); + if ( LE_32( hBWE_TD->GainFrame_prevfrm_fx, 327680l /*1.25 Q18*/ ) ) + { + temp = 26214 /*0.8 Q15*/; + move16(); + } BREAK; case 1: GainFrame = 524288; /* 2.0f in Q18 */ - IF( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 327680l /*1.25 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 786432l /*3 Q18*/ ) ) - temp = 26214 /*0.8 Q15*/; - move16(); + move32(); test(); + if ( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 327680l /*1.25 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 786432l /*3 Q18*/ ) ) + { + temp = 26214 /*0.8 Q15*/; + move16(); + } BREAK; case 2: GainFrame = 1048576; /* 4.0f in Q18 */ - IF( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 786432l /*3 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 1572864l /*6 Q18*/ ) ) - temp = 26214 /*0.8 Q15*/; - move16(); + move32(); test(); + if ( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 786432l /*3 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 1572864l /*6 Q18*/ ) ) + { + temp = 26214 /*0.8 Q15*/; + move16(); + } BREAK; case 3: GainFrame = 2097152; /* 8.0f in Q18 */ - IF( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 1572864l /*6 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 4194304l /*16Q18*/ ) ) - temp = 26214 /*0.8 Q15*/; - move16(); + move32(); test(); + if ( GT_32( hBWE_TD->GainFrame_prevfrm_fx, 1572864l /*6 Q18*/ ) && LE_32( hBWE_TD->GainFrame_prevfrm_fx, 4194304l /*16Q18*/ ) ) + { + temp = 26214 /*0.8 Q15*/; + move16(); + } BREAK; default: fprintf( stderr, "RF SWB-TBE gain bits not supported." ); @@ -2089,9 +2264,14 @@ void swb_tbe_dec_fx( { GainFrame = L_add( Mult_32_16( hBWE_TD->GainFrame_prevfrm_fx, temp ), Mult_32_16( GainFrame, sub( 32767, temp ) ) ); } - IF( EQ_16( st_fx->core, ACELP_CORE ) && EQ_16( st_fx->last_core, ACELP_CORE ) ) + test(); + IF( ( st_fx->core == ACELP_CORE ) && ( st_fx->last_core == ACELP_CORE ) ) { - IF( !st_fx->prev_use_partial_copy && EQ_16( st_fx->last_coder_type, VOICED ) && EQ_16( st_fx->rf_frame_type, RF_GENPRED ) && GT_32( GainFrame, 2097152 ) && LT_32( GainFrame, 3059606 ) ) + test(); + test(); + test(); + test(); + if ( !st_fx->prev_use_partial_copy && EQ_16( st_fx->last_coder_type, VOICED ) && EQ_16( st_fx->rf_frame_type, RF_GENPRED ) && GT_32( GainFrame, 2097152 ) && LT_32( GainFrame, 3059606 ) ) { GainFrame = Mult_32_16( GainFrame, 9830 ); } @@ -2130,11 +2310,11 @@ void swb_tbe_dec_fx( { FOR( j = 0; j < 4; j++ ) { - GainShape[i * 4 + j] = mult_r( st_fx->cummulative_damping, st_fx->GainShape_Delay[4 + i] ); + GainShape[add( i * 4, j )] = mult_r( st_fx->cummulative_damping, st_fx->GainShape_Delay[4 + i] ); move16(); } } - IF( GT_16( tilt_swb_fec, 8 << 11 ) ) /* tilt_swb_fec in Q11 */ + IF( GT_16( tilt_swb_fec, ( 8 << 11 ) ) ) /* tilt_swb_fec in Q11 */ { IF( EQ_16( st_fx->nbLostCmpt, 1 ) ) { @@ -2169,7 +2349,7 @@ void swb_tbe_dec_fx( tmp1 = extract_l( hBWE_TD->prev1_shb_ener_sf_fx ); /*Q0*/ i = sub( norm_s( tmp1 ), 1 ); tmp1 = shl( tmp1, i ); /* Qi */ - if ( tmp == 0 ) + IF( tmp == 0 ) { tmp = 32767 /*1.0f Q15*/; move16(); /*Q15*/ @@ -2180,7 +2360,7 @@ void swb_tbe_dec_fx( scale = s_max( scale, 0 ); /*scale = st->prev_res_shb_gshape * min(scale, 1.0f); */ #ifdef BASOP_NOGLOB - tmp = shl_sat( scale, 15 - exp - i ); /*Q15*/ + tmp = shl_sat( scale, sub( sub( 15, exp ), i ) ); /*Q15*/ #else tmp = shl( scale, 15 - exp - i ); /*Q15*/ #endif @@ -2225,6 +2405,7 @@ void swb_tbe_dec_fx( shb_ener_sf_32 = L_max( shb_ener_sf_32, 1l /*1.0f Q0*/ ); mixFactors = hBWE_TD->prev_mixFactors_fx; + move16(); IF( EQ_16( st_fx->codec_mode, MODE1 ) ) { @@ -2300,15 +2481,15 @@ void swb_tbe_dec_fx( test(); test(); test(); - IF( st_fx->bws_cnt == 0 && st_fx->bws_cnt1 == 0 && st_fx->prev_use_partial_copy == 0 && st_fx->use_partial_copy == 0 ) + IF( ( st_fx->bws_cnt == 0 ) && ( st_fx->bws_cnt1 == 0 ) && ( st_fx->prev_use_partial_copy == 0 ) && ( st_fx->use_partial_copy == 0 ) ) { lsf_diff[0] = 16384; move16(); /*Q15*/ - lsf_diff[sub( LPC_SHB_ORDER, 1 )] = 16384; + lsf_diff[LPC_SHB_ORDER - 1] = 16384; move16(); /*Q15*/ FOR( i = 1; i < LPC_SHB_ORDER - 1; i++ ) { - lsf_diff[i] = sub( lsf_shb[i], lsf_shb[sub( i, 1 )] ); + lsf_diff[i] = sub( lsf_shb[i], lsf_shb[i - 1] ); move16(); } @@ -2346,11 +2527,12 @@ void swb_tbe_dec_fx( tmp = mult( 26214, lsf_diff[i] ); test(); - IF( hBWE_TD->prev_lsf_diff_fx[i - 1] <= 0 || tmp < 0 ) /* safety check in case of bit errors */ + IF( ( hBWE_TD->prev_lsf_diff_fx[i - 1] <= 0 ) || ( tmp < 0 ) ) /* safety check in case of bit errors */ { st_fx->BER_detect = 1; move16(); tmp = 0; + move16(); } ELSE { @@ -2366,11 +2548,12 @@ void swb_tbe_dec_fx( tmp = mult( 26214, hBWE_TD->prev_lsf_diff_fx[i - 1] ); test(); - IF( lsf_diff[i] <= 0 || tmp < 0 ) /* safety check in case of bit errors */ + IF( ( lsf_diff[i] <= 0 ) || ( tmp < 0 ) ) /* safety check in case of bit errors */ { st_fx->BER_detect = 1; move16(); tmp = 0; + move16(); } ELSE { @@ -2383,7 +2566,9 @@ void swb_tbe_dec_fx( } } w[0] = w[1]; - w[sub( LPC_SHB_ORDER, 1 )] = w[sub( LPC_SHB_ORDER, 2 )]; + move16(); + w[LPC_SHB_ORDER - 1] = w[LPC_SHB_ORDER - 2]; + move16(); FOR( i = 0; i < LPC_SHB_ORDER; i++ ) { @@ -2401,6 +2586,7 @@ void swb_tbe_dec_fx( Copy( lsf_diff + 1, hBWE_TD->prev_lsf_diff_fx, LPC_SHB_ORDER - 2 ); hBWE_TD->prev_tilt_para_fx = tilt_para; + move16(); } ELSE { @@ -2427,7 +2613,7 @@ void swb_tbe_dec_fx( /* convert from lsp to lsf */ /*old code: lsp2lsf_fx(lsp_temp, lsp_temp, LPC_SHB_ORDER, INT_FS_FX); */ /* input lsp_temp_fx in Q15*/ - tmp = i_mult( j, ( LPC_SHB_ORDER + 1 ) ); + tmp = i_mult( j, LPC_SHB_ORDER + 1 ); /* convert LSPs to LP coefficients */ E_LPC_f_lsp_a_conversion( lsp_temp, lpc_shb_sf + tmp, LPC_SHB_ORDER ); /* Bring the LPCs to Q12 */ @@ -2447,10 +2633,15 @@ void swb_tbe_dec_fx( /* save the shb_ener Q18, prev_resgainshape Q14, and mixFactor Q15 values */ hBWE_TD->prev3_shb_ener_sf_fx = hBWE_TD->prev2_shb_ener_sf_fx; + move32(); hBWE_TD->prev2_shb_ener_sf_fx = hBWE_TD->prev1_shb_ener_sf_fx; + move32(); hBWE_TD->prev1_shb_ener_sf_fx = shb_ener_sf_32; + move32(); hBWE_TD->prev_res_shb_gshape_fx = shb_res_gshape[4]; + move16(); hBWE_TD->prev_mixFactors_fx = mixFactors; + move16(); /* SWB CNG/DTX - update memories */ Copy( st_fx->lsp_shb_prev_fx, st_fx->lsp_shb_prev_prev_fx, LPC_SHB_ORDER ); /* Q15 */ @@ -2468,6 +2659,7 @@ void swb_tbe_dec_fx( /* -------- start of memory rescaling -------- */ /* ----- calculate optimum Q_bwe_exc and rescale memories accordingly ----- */ Lmax = 0; + move32(); FOR( cnt = 0; cnt < L_FRAME32k; cnt++ ) { Lmax = L_max( Lmax, L_abs( bwe_exc_extended[cnt] ) ); @@ -2476,6 +2668,7 @@ void swb_tbe_dec_fx( if ( Lmax == 0 ) { Q_bwe_exc = 31; + move16(); } Q_bwe_exc = add( Q_bwe_exc, add( Q_exc, Q_exc ) ); @@ -2486,6 +2679,7 @@ void swb_tbe_dec_fx( if ( GT_16( Q_bwe_exc, tmp ) ) { Q_bwe_exc = tmp; + move16(); } /* rescale the memories if Q_bwe_exc is different from previous frame */ @@ -2526,7 +2720,7 @@ void swb_tbe_dec_fx( { FOR( j = 0; j < 4; j++ ) { - Copy( lpc_shb, &lpc_shb_sf[j * ( LPC_SHB_ORDER + 1 )], LPC_SHB_ORDER + 1 ); + Copy( lpc_shb, &lpc_shb_sf[i_mult( j, LPC_SHB_ORDER + 1 )], LPC_SHB_ORDER + 1 ); } } @@ -2539,6 +2733,7 @@ void swb_tbe_dec_fx( &( hBWE_TD->fb_tbe_demph_fx ), &Q_bwe_exc, &Q_bwe_exc_fb, Q_shb, n_mem2, st_fx->prev_Q_bwe_syn, st_fx->total_brate, st_fx->prev_bfi ); *Q_white_exc = Q_bwe_exc_fb; + move16(); IF( EQ_16( st_fx->extl, FB_TBE ) ) { st_fx->prev_Q_bwe_exc_fb = Q_bwe_exc_fb; @@ -2554,7 +2749,7 @@ void swb_tbe_dec_fx( /* rescale the TBE post proc memory */ FOR( i = 0; i < LPC_SHB_ORDER; i++ ) { - hBWE_TD->mem_stp_swb_fx[i] = shl( hBWE_TD->mem_stp_swb_fx[i], Q_bwe_exc - st_fx->prev_Q_bwe_syn ); + hBWE_TD->mem_stp_swb_fx[i] = shl( hBWE_TD->mem_stp_swb_fx[i], sub( Q_bwe_exc, st_fx->prev_Q_bwe_syn ) ); move16(); } @@ -2600,11 +2795,13 @@ void swb_tbe_dec_fx( { L_tmp = Mult_32_16( Lscale, shaped_shb_excitation[i] ); /* Q_bwe_exc + (31-exp) - 15 */ shaped_shb_excitation[i] = round_fx( L_shl( L_tmp, exp ) ); /* Q_bwe_exc */ + move16(); } IF( exp < 0 ) { Lscale = L_shl( Lscale, exp ); exp = 0; + move16(); } FOR( ; i < L_SHB_LAHEAD + 10; i++ ) { @@ -2619,6 +2816,7 @@ void swb_tbe_dec_fx( Lscale = L_add( Mult_32_16( Lscale, temp ), L_tmp1 ); L_tmp = Mult_32_16( Lscale, shaped_shb_excitation[i] ); /* Q_bwe_exc + (31-exp) - 15 */ shaped_shb_excitation[i] = round_fx( L_shl( L_tmp, exp ) ); /* Q_bwe_exc */ + move16(); } /* Update SHB excitation */ @@ -2626,17 +2824,19 @@ void swb_tbe_dec_fx( l_subframe_fx = L_FRAME16k / NUM_SHB_SUBGAINS; L_ener = 0; + move32(); FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) { L_tmp = 0; + move32(); ener_tmp[i] = 0; - + move32(); { Word64 tmp64 = 0; move64(); FOR( j = 0; j < l_subframe_fx; j++ ) { - tmp64 = W_mac0_16_16( tmp64, shaped_shb_excitation[i * l_subframe_fx + j], shaped_shb_excitation[i * l_subframe_fx + j] ); /* 2*Q_bwe_exc */ + tmp64 = W_mac0_16_16( tmp64, shaped_shb_excitation[add( i_mult( i, l_subframe_fx ), j )], shaped_shb_excitation[add( i_mult( i, l_subframe_fx ), j )] ); /* 2*Q_bwe_exc */ } L_tmp = W_sat_l( tmp64 ); } @@ -2646,7 +2846,7 @@ void swb_tbe_dec_fx( { exp = norm_l( L_tmp ); tmp = extract_h( L_shl( L_tmp, exp ) ); - exp = sub( exp, 30 - ( 2 * Q_bwe_exc ) ); + exp = sub( exp, sub( 30, i_mult( 2, Q_bwe_exc ) ) ); tmp = div_s( 16384, tmp ); L_tmp = L_deposit_h( tmp ); @@ -2691,7 +2891,7 @@ void swb_tbe_dec_fx( move16(); } test(); - if ( st_fx->prev_fractive == 1 && GT_16( st_fx->tilt_wb_fx, 1024 ) ) + if ( EQ_16( st_fx->prev_fractive, 1 ) && GT_16( st_fx->tilt_wb_fx, 1024 ) ) { st_fx->tilt_wb_fx = 1024; move16(); @@ -2704,15 +2904,18 @@ void swb_tbe_dec_fx( IF( st_fx->prev_fractive == 0 ) { st_fx->tilt_wb_fx = 8192; + move16(); } ELSE { st_fx->tilt_wb_fx = 16384; + move16(); } } ELSE { st_fx->tilt_wb_fx = shl( st_fx->tilt_wb_fx, 2 ); + move16(); } } @@ -2731,6 +2934,7 @@ void swb_tbe_dec_fx( #else st_fx->tilt_wb_fx = extract_h( L_shr( Mult_32_16( st_fx->enerLH_fx, inv_ener ), sub( sub( st_fx->Q_syn2, exp_ener ), 16 ) ) ); /*Q11*/ #endif + move16(); /*st_fx->Q_syn2 -1 + 26- exp_ener -15 -(st_fx->Q_syn2 -exp_ener -16 ) -16 +1 -1 = (11) *0.5*/ } ELSE IF( LT_32( L_tmp, Mult_32_16( st_fx->enerLH_fx, 1638 ) ) && EQ_16( is_fractive, 1 ) ) @@ -2740,6 +2944,7 @@ void swb_tbe_dec_fx( #else st_fx->tilt_wb_fx = extract_h( L_shr( Mult_32_16( st_fx->enerLH_fx, inv_ener ), sub( sub( st_fx->Q_syn2, exp_ener ), 15 ) ) ); /*Q11*/ #endif + move16(); /*st_fx->Q_syn2 -1 + 26- exp_ener -15 -(st_fx->Q_syn2 -exp_ener -15 ) -16 = (11) 0.25*/ } L_tmp = L_mult0( st_fx->prev_ener_shb_fx, inv_ener ); /*Q(1+15+14-3-exp_ener) = 27 -exp_ener*/ @@ -2752,19 +2957,20 @@ void swb_tbe_dec_fx( ELSE { GainFrame_prevfrm_fx = 0; + move32(); } IF( EQ_16( is_fractive, 1 ) ) { - GainFrame = L_shl( (Word32) st_fx->tilt_wb_fx, 10 ); + GainFrame = L_shl( L_deposit_l( st_fx->tilt_wb_fx ), 10 ); } ELSE { - GainFrame = L_shl( (Word32) st_fx->tilt_wb_fx, 8 ); + GainFrame = L_shl( L_deposit_l( st_fx->tilt_wb_fx ), 8 ); } test(); - IF( EQ_16( ( is_fractive & st_fx->prev_fractive ), 1 ) && GT_32( GainFrame, GainFrame_prevfrm_fx ) ) + IF( EQ_16( s_and( is_fractive, st_fx->prev_fractive ), 1 ) && GT_32( GainFrame, GainFrame_prevfrm_fx ) ) { GainFrame = L_add( Mult_32_16( GainFrame_prevfrm_fx, 26214 ), Mult_32_16( GainFrame, 6554 ) ); /* 18 +15 -15 = 18*/ } @@ -2774,14 +2980,14 @@ void swb_tbe_dec_fx( test(); test(); test(); - IF( ( LT_32( L_shr( st_fx->prev_enerLH_fx, 1 ), st_fx->enerLH_fx ) && GT_32( st_fx->prev_enerLH_fx, L_shr( st_fx->enerLH_fx, 1 ) ) ) && ( LT_32( L_shr( st_fx->prev_enerLL_fx, 1 ), st_fx->enerLL_fx ) && GT_32( st_fx->prev_enerLL_fx, L_shr( st_fx->enerLL_fx, 1 ) ) ) && ( is_fractive ^ st_fx->prev_fractive ) == 0 ) + IF( ( LT_32( L_shr( st_fx->prev_enerLH_fx, 1 ), st_fx->enerLH_fx ) && GT_32( st_fx->prev_enerLH_fx, L_shr( st_fx->enerLH_fx, 1 ) ) ) && ( LT_32( L_shr( st_fx->prev_enerLL_fx, 1 ), st_fx->enerLL_fx ) && GT_32( st_fx->prev_enerLL_fx, L_shr( st_fx->enerLL_fx, 1 ) ) ) && ( s_xor( is_fractive, st_fx->prev_fractive ) == 0 ) ) { GainFrame = L_add( L_shr( GainFrame, 1 ), L_shr( GainFrame_prevfrm_fx, 1 ) ); } ELSE { test(); - IF( is_fractive == 0 && EQ_16( st_fx->prev_fractive, 1 ) ) + IF( ( is_fractive == 0 ) && EQ_16( st_fx->prev_fractive, 1 ) ) { L_tmp1 = L_shl( Mult_32_16( GainFrame, 3277 ), 13 ); /* 31 */ L_tmp = L_sub( 2147483647, L_tmp1 ); /* 31 */ @@ -2798,7 +3004,7 @@ void swb_tbe_dec_fx( } ELSE { - IF( st_fx->bws_cnt1 > 0 ) + if ( st_fx->bws_cnt1 > 0 ) { GainFrame = Mult_32_16( GainFrame, i_mult( st_fx->bws_cnt1, 819 ) ); /*Q18*/ } @@ -2827,7 +3033,7 @@ void swb_tbe_dec_fx( test(); test(); test(); - IF( NE_16( st_fx->clas_dec, UNVOICED_CLAS ) && NE_16( st_fx->clas_dec, UNVOICED_TRANSITION ) && LT_16( hBWE_TD->tilt_swb_fec_fx, 16384 ) && + IF( ( st_fx->clas_dec != UNVOICED_CLAS ) && NE_16( st_fx->clas_dec, UNVOICED_TRANSITION ) && LT_16( hBWE_TD->tilt_swb_fec_fx, 16384 ) && ( ( GT_32( st_fx->enerLL_fx, L_shr( st_fx->prev_enerLL_fx, 1 ) ) && LT_32( L_shr( st_fx->enerLL_fx, 1 ), st_fx->prev_enerLL_fx ) ) || ( GT_32( st_fx->enerLH_fx, L_shr( st_fx->prev_enerLH_fx, 1 ) ) && LT_32( L_shr( st_fx->enerLH_fx, 1 ), st_fx->prev_enerLH_fx ) ) ) ) { IF( GT_32( L_shr( prev_ener_ratio_fx, 2 ), GainFrame ) ) /*18*/ @@ -2844,7 +3050,7 @@ void swb_tbe_dec_fx( } test(); - IF( GT_16( tilt_swb_fec, hBWE_TD->tilt_swb_fec_fx ) && hBWE_TD->tilt_swb_fec_fx > 0 ) + IF( GT_16( tilt_swb_fec, hBWE_TD->tilt_swb_fec_fx ) && ( hBWE_TD->tilt_swb_fec_fx > 0 ) ) { exp = norm_s( hBWE_TD->tilt_swb_fec_fx ); tmp = shl( hBWE_TD->tilt_swb_fec_fx, exp ); /*Q(11+exp)*/ @@ -2853,7 +3059,7 @@ void swb_tbe_dec_fx( GainFrame = L_shl( Mult_32_16( GainFrame, s_min( tmp, 20480 ) ), 3 ); /*Q18 = 18 +12 -15 +3 */ } } - ELSE IF( ( NE_16( st_fx->clas_dec, UNVOICED_CLAS ) || GT_16( hBWE_TD->tilt_swb_fec_fx, 16384 ) ) && GT_32( L_shr( prev_ener_ratio_fx, 2 ), GainFrame ) && + ELSE IF( ( ( st_fx->clas_dec != UNVOICED_CLAS ) || GT_16( hBWE_TD->tilt_swb_fec_fx, 16384 ) ) && GT_32( L_shr( prev_ener_ratio_fx, 2 ), GainFrame ) && ( GT_32( st_fx->enerLL_fx, L_shr( st_fx->prev_enerLL_fx, 1 ) ) || GT_32( st_fx->enerLH_fx, L_shr( st_fx->prev_enerLH_fx, 1 ) ) ) ) { GainFrame = L_add( Mult_32_16( prev_ener_ratio_fx, 6554 ), Mult_32_16( GainFrame, 26214 ) ); @@ -2934,7 +3140,7 @@ void swb_tbe_dec_fx( { FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) { - GainShape_tmp[i] = GainShape[shl( i, 2 )]; /* Q15 */ + GainShape_tmp[i] = GainShape[i * 4]; /* Q15 */ move16(); } @@ -2954,6 +3160,7 @@ void swb_tbe_dec_fx( /*GainShape_tmp_fx[i] = 0.5f*(L_tmp2/ener_tmp_fx[i] + GainShape_tmp_fx[i]);*/ /* tmp = L_tmp2/ener_tmp_fx[i]*/ L_tmp = L_tmp2; + move32(); if ( L_tmp2 < 0 ) { L_tmp = L_negate( L_tmp2 ); @@ -2965,11 +3172,11 @@ void swb_tbe_dec_fx( #else fracb = round_fx( L_shl( L_tmp, expb ) ); #endif - expb = 30 - expb; /* - (2*Q_bwe_exc_ext); */ + expb = sub( 30, expb ); /* - (2*Q_bwe_exc_ext); */ expa = norm_l( ener_tmp[i] ); fraca = extract_h( L_shl( ener_tmp[i], expa ) ); - expa = 30 - expa; + expa = sub( 30, expa ); scale = shr( sub( fraca, fracb ), 15 ); fracb = shl( fracb, scale ); @@ -2979,15 +3186,25 @@ void swb_tbe_dec_fx( exp = sub( sub( expb, expa ), 1 ); tmp = shl( tmp, exp ); GainShape_tmp[i] = add( tmp, shr( GainShape_tmp[i], 1 ) ); /* Q15 */ + move16(); } hBWE_TD->prev_ener_fx = ener_tmp[i]; + move32(); hBWE_TD->prev_GainShape_fx = GainShape_tmp[i]; + move16(); st_fx->prev_ener_fx_Q = Q_bwe_exc; + move16(); } FOR( i = 0; i < NUM_SHB_SUBFR; i++ ) { - GainShape[i] = GainShape_tmp[i * NUM_SHB_SUBGAINS / NUM_SHB_SUBFR]; + Word16 idx = 0; + move16(); + IF( i != 0 ) + { + idx = idiv1616( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR ); + } + GainShape[i] = GainShape_tmp[idx]; move16(); } } @@ -3019,6 +3236,7 @@ void swb_tbe_dec_fx( max = 0; + move16(); FOR( i = 0; i < L_FRAME16k; i++ ) { max = s_max( max, shaped_shb_excitation[i] ); /* Q0 */ @@ -3035,6 +3253,7 @@ void swb_tbe_dec_fx( { n = norm_s( max ); max = 0; + move16(); FOR( i = 0; i < L_FRAME16k; i++ ) { #ifdef BASOP_NOGLOB @@ -3047,6 +3266,7 @@ void swb_tbe_dec_fx( } curr_frame_pow = 0; + move32(); FOR( i = 0; i < L_FRAME16k; i++ ) { L_tmp = L_mult0( shaped_shb_excitation_frac[i], shaped_shb_excitation_frac[i] ); /*2*(Q_bwe_exc+n)*/ @@ -3062,9 +3282,12 @@ void swb_tbe_dec_fx( IF( GT_16( tmp, 32 ) ) { st_fx->prev_frame_pow_exp = add( curr_frame_pow_exp, 32 ); + move16(); tmp = 32; + move16(); } hBWE_TD->prev_swb_bwe_frame_pow_fx = L_shr( hBWE_TD->prev_swb_bwe_frame_pow_fx, tmp ); + move32(); st_fx->prev_frame_pow_exp = curr_frame_pow_exp; move16(); } @@ -3074,9 +3297,11 @@ void swb_tbe_dec_fx( { curr_frame_pow_exp = sub( st_fx->prev_frame_pow_exp, 32 ); tmp = -32; + move16(); } curr_frame_pow = L_shr( curr_frame_pow, -tmp ); curr_frame_pow_exp = st_fx->prev_frame_pow_exp; + move16(); } test(); IF( !st_fx->bfi && st_fx->prev_bfi ) @@ -3092,9 +3317,9 @@ void swb_tbe_dec_fx( L_tmp = root_a_over_b_fx( hBWE_TD->prev_swb_bwe_frame_pow_fx, curr_frame_pow_exp, curr_frame_pow, curr_frame_pow_exp, &exp ); scale = round_fx( L_shl( L_tmp, exp ) ); /*Q15*/ - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); temp = round_fx( L_shl( L_tmp, exp ) ); /*Q15*/ } ELSE @@ -3106,11 +3331,11 @@ void swb_tbe_dec_fx( { GainShape[2 * j] = mult_r( GainShape[2 * j], scale ); move16(); - GainShape[2 * j + 1] = mult_r( GainShape[2 * j + 1], scale ); + GainShape[add( 2 * j, 1 )] = mult_r( GainShape[add( 2 * j, 1 )], scale ); move16(); FOR( i = 0; i < L_FRAME16k / 8; i++ ) { - shaped_shb_excitation[i + j * L_FRAME16k / 8] = mult_r( shaped_shb_excitation[i + j * L_FRAME16k / 8], scale ); + shaped_shb_excitation[add( i, j * ( L_FRAME16k / 8 ) )] = mult_r( shaped_shb_excitation[add( i, j * ( L_FRAME16k / 8 ) )], scale ); move16(); } @@ -3154,18 +3379,18 @@ void swb_tbe_dec_fx( test(); IF( GT_32( curr_frame_pow, hBWE_TD->prev_swb_bwe_frame_pow_fx ) && NE_16( st_fx->prev_coder_type, UNVOICED ) && - NE_16( st_fx->last_good, UNVOICED_CLAS ) ) + ( st_fx->last_good != UNVOICED_CLAS ) ) { L_tmp = root_a_over_b_fx( hBWE_TD->prev_swb_bwe_frame_pow_fx, curr_frame_pow_exp, curr_frame_pow, curr_frame_pow_exp, &exp ); /*31 - exp*/ scale = round_fx( L_shl( L_tmp, sub( exp, 3 ) ) ); /*Q12*/ - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); temp = round_fx( L_shl( L_tmp, sub( exp, 3 ) ) ); /*Q12*/ } ELSE IF( LT_32( curr_frame_pow, L_shr( hBWE_TD->prev_swb_bwe_frame_pow_fx, 1 ) ) && EQ_16( st_fx->nbLostCmpt, 1 ) && ( GT_32( st_fx->enerLL_fx, L_shr( st_fx->prev_enerLL_fx, 1 ) ) || GT_32( st_fx->enerLH_fx, L_shr( st_fx->prev_enerLH_fx, 1 ) ) ) && - ( EQ_16( st_fx->prev_coder_type, UNVOICED ) || EQ_16( st_fx->last_good, UNVOICED_CLAS ) || GT_16( hBWE_TD->tilt_swb_fec_fx, 10240 ) ) ) + ( EQ_16( st_fx->prev_coder_type, UNVOICED ) || ( st_fx->last_good == UNVOICED_CLAS ) || GT_16( hBWE_TD->tilt_swb_fec_fx, 10240 ) ) ) { L_tmp = root_a_over_b_fx( hBWE_TD->prev_swb_bwe_frame_pow_fx, curr_frame_pow_exp, curr_frame_pow, curr_frame_pow_exp, &exp ); #ifdef BASOP_NOGLOB @@ -3173,9 +3398,9 @@ void swb_tbe_dec_fx( #else scale = round_fx( L_shl( L_tmp, sub( exp, 3 ) ) ); /*Q12*/ #endif - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); temp = round_fx( L_shl( L_tmp, sub( exp, 3 ) ) ); /*Q12*/ } } @@ -3190,9 +3415,9 @@ void swb_tbe_dec_fx( { L_tmp = root_a_over_b_fx( hBWE_TD->prev_swb_bwe_frame_pow_fx, curr_frame_pow_exp, curr_frame_pow, curr_frame_pow_exp, &exp ); scale = round_fx( L_shl( L_tmp, sub( exp, 3 ) ) ); /*Q12*/ - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); #ifdef BASOP_NOGLOB temp = round_fx_sat( L_shl_sat( L_tmp, sub( exp, 3 ) ) ); /*Q12*/ #else @@ -3201,18 +3426,18 @@ void swb_tbe_dec_fx( } ELSE IF( LT_32( curr_frame_pow, L_shr( hBWE_TD->prev_swb_bwe_frame_pow_fx, 1 ) ) && ( GT_32( st_fx->enerLL_fx, L_shr( st_fx->prev_enerLL_fx, 1 ) ) || GT_32( st_fx->enerLH_fx, L_shr( st_fx->prev_enerLH_fx, 1 ) ) ) && - ( st_fx->prev_coder_type == UNVOICED || st_fx->last_good == UNVOICED_CLAS || GT_16( hBWE_TD->tilt_swb_fec_fx, 10240 ) ) ) + ( EQ_16( st_fx->prev_coder_type, UNVOICED ) || ( st_fx->last_good == UNVOICED_CLAS ) || GT_16( hBWE_TD->tilt_swb_fec_fx, 10240 ) ) ) { L_tmp = root_a_over_b_fx( hBWE_TD->prev_swb_bwe_frame_pow_fx, curr_frame_pow_exp, curr_frame_pow, curr_frame_pow_exp, &exp ); #ifdef BASOP_NOGLOB - L_tmp = L_min( L_tmp, L_shl_sat( 2, ( 31 - exp ) ) ); /*31 - exp*/ + L_tmp = L_min( L_tmp, L_shl_sat( 2, sub( 31, exp ) ) ); /*31 - exp*/ #else L_tmp = L_min( L_tmp, L_shl( 2, ( 31 - exp ) ) ); /*31 - exp*/ #endif scale = round_fx( L_shl( L_tmp, sub( exp, 3 ) ) ); /*Q12*/ - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); - L_tmp = root_a_fx( L_tmp, 31 - exp, &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); + L_tmp = root_a_fx( L_tmp, sub( 31, exp ), &exp ); temp = round_fx( L_shl( L_tmp, sub( exp, 3 ) ) ); /*Q12*/ } } @@ -3225,7 +3450,7 @@ void swb_tbe_dec_fx( #endif move16(); /* 15 +12 +3-15 =15*/ #ifdef BASOP_NOGLOB - GainShape[2 * j + 1] = shl_sat( mult_r( GainShape[2 * j + 1], scale ), 3 ); + GainShape[add( 2 * j, 1 )] = shl_sat( mult_r( GainShape[add( 2 * j, 1 )], scale ), 3 ); #else GainShape[2 * j + 1] = shl( mult_r( GainShape[2 * j + 1], scale ), 3 ); #endif @@ -3233,7 +3458,7 @@ void swb_tbe_dec_fx( FOR( i = 0; i < 40; i++ ) { #ifdef BASOP_NOGLOB - shaped_shb_excitation[add( i, i_mult( j, 40 ) )] = shl_sat( mult_r( shaped_shb_excitation[add( i, i_mult( j, 40 ) )], scale ), 3 ); + shaped_shb_excitation[add( i, j * 40 )] = shl_sat( mult_r( shaped_shb_excitation[add( i, j * 40 )], scale ), 3 ); #else shaped_shb_excitation[add( i, i_mult( j, 40 ) )] = shl( mult_r( shaped_shb_excitation[add( i, i_mult( j, 40 ) )], scale ), 3 ); #endif @@ -3288,7 +3513,7 @@ void swb_tbe_dec_fx( { exp = norm_l( L_prev_ener_shb ); tmp = extract_h( L_shl( L_prev_ener_shb, exp ) ); - exp = sub( exp, 30 - ( 2 * Q_bwe_exc + 8 ) ); + exp = sub( exp, sub( 30, ( add( i_mult( 2, Q_bwe_exc ), 8 ) ) ) ); tmp = div_s( 16384, tmp ); L_tmp = L_deposit_h( tmp ); @@ -3298,15 +3523,17 @@ void swb_tbe_dec_fx( #else st_fx->prev_ener_shb_fx = round_fx( L_shl( L_tmp, sub( exp, 14 ) ) ); /* Q1 */ #endif + move16(); } /* st->prev_SWB_fenv[i] = sqrt(curr_frame_pow/L_FRAME16k); */ L_tmp = Mult_32_16( curr_frame_pow, 26214 ); /* curr_frame_pow_exp+8; 26214=(1/L_FRAME16k) in Q23 */ tmp = 0; + move16(); IF( L_tmp != 0 ) { exp = norm_l( L_tmp ); tmp = extract_h( L_shl( L_tmp, exp ) ); - exp = sub( exp, 30 - ( curr_frame_pow_exp + 8 ) ); + exp = sub( exp, sub( 30, add( curr_frame_pow_exp, 8 ) ) ); tmp = div_s( 16384, tmp ); L_tmp = L_deposit_h( tmp ); @@ -3338,11 +3565,11 @@ void swb_tbe_dec_fx( move32(); } } - IF( st_fx->output_Fs == 48000 ) + IF( EQ_32( st_fx->output_Fs, 48000 ) ) { Scale_sig( hBWE_TD->int_3_over_2_tbemem_dec_fx, INTERP_3_2_MEM_LEN, sc ); } - IF( st_fx->output_Fs == 16000 ) + IF( EQ_32( st_fx->output_Fs, 16000 ) ) { Scale_sig( hBWE_TD->mem_resamp_HB_32k_fx, 2 * ALLPASSSECTIONS_STEEP + 1, sc ); } @@ -3373,22 +3600,32 @@ void swb_tbe_dec_fx( if ( GainFrame == 0 ) { tmp = 31; + move16(); } L_tmp = L_shl( GainFrame, tmp ); /* 18 + tmp */ tmp1 = 0; + move16(); FOR( i = 0; i < L_FRAME16k; i++ ) { - L_tmp1 = Mult_32_16( L_tmp, GainShape[NUM_SHB_SUBFR * i / L_FRAME16k] ); /* Q : 18 + tmp +15 -15*/ - White_exc16k[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ + Word16 idx = 0; + IF( i != 0 ) + { + idx = idiv1616( i_mult( NUM_SHB_SUBFR, i ), L_FRAME16k ); + } + L_tmp1 = Mult_32_16( L_tmp, GainShape[idx] ); /* Q : 18 + tmp +15 -15*/ + White_exc16k[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ + move16(); tmp1 = s_max( tmp1, abs_s( White_exc16k[i] ) ); } *Q_white_exc = sub( add( *Q_white_exc, tmp ), 13 ); /* *Q_white_exc + 18 + tmp -15 -16 */ + move16(); tmp = norm_s( tmp1 ); if ( tmp1 == 0 ) { tmp = 15; + move16(); } FOR( i = 0; i < L_FRAME16k; i++ ) @@ -3447,6 +3684,7 @@ void swb_tbe_dec_fx( hBWE_TD->GainFrame_prevfrm_fx = GainFrame; move16(); /*Q18*/ hBWE_TD->tilt_swb_fec_fx = tilt_swb_fec; + move16(); if ( !st_fx->bfi ) { @@ -3468,7 +3706,9 @@ void swb_tbe_dec_fx( } hBWE_TD->prev_ener_fx = ener_tmp[NUM_SHB_SUBGAINS - 1]; + move32(); hBWE_TD->prev_GainShape_fx = GainShape[NUM_SHB_SUBFR - 1]; + move32(); *Q_synth = Q_bwe_exc; move16(); st_fx->prev_Q_bwe_syn2 = Q_bwe_exc; @@ -3523,7 +3763,7 @@ static void gradientGainShape( /* get the first gainshape template */ test(); test(); - IF( ( st_fx->prev_coder_type == UNVOICED || st_fx->last_good == UNVOICED_CLAS ) && GainGradFEC[0] > 0 ) + IF( ( EQ_16( st_fx->prev_coder_type, UNVOICED ) || ( st_fx->last_good == UNVOICED_CLAS ) ) && ( GainGradFEC[0] > 0 ) ) { GainShapeTemp[0] = add( shr( st_fx->GainShape_Delay[7], 1 ), GainGradFEC[0] ); move16(); @@ -3545,7 +3785,7 @@ static void gradientGainShape( tmp = mult_r( tmp, 26214 ); /* 0.8 in Q15 tmp*(8/10) */ test(); - IF( ( GT_16( tmp, GainGrad1[1] ) ) && GainGrad1[1] > 0 ) + IF( ( GT_16( tmp, GainGrad1[1] ) ) && ( GainGrad1[1] > 0 ) ) { FOR( i = 1; i < NUM_SHB_SUBFR / 4; i++ ) { @@ -3558,7 +3798,7 @@ static void gradientGainShape( ELSE { test(); - IF( ( GT_16( tmp, GainGrad1[1] ) ) && GainGrad1[1] < 0 ) + IF( ( GT_16( tmp, GainGrad1[1] ) ) && ( GainGrad1[1] < 0 ) ) { FOR( i = 1; i < NUM_SHB_SUBFR / 4; i++ ) { @@ -3584,7 +3824,7 @@ static void gradientGainShape( test(); test(); test(); - IF( ( st_fx->prev_coder_type == UNVOICED || st_fx->last_good == UNVOICED_CLAS ) && st_fx->nbLostCmpt == 1 ) + IF( ( EQ_16( st_fx->prev_coder_type, UNVOICED ) || ( st_fx->last_good == UNVOICED_CLAS ) ) && EQ_16( st_fx->nbLostCmpt, 1 ) ) { FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) { @@ -3594,19 +3834,20 @@ static void gradientGainShape( IF( GT_16( 8192, tmp ) ) { - GainShape[i * 4 + j] = shl( tmp, 2 ); + GainShape[add( i * 4, j )] = shl( tmp, 2 ); move16(); /* (GainShapeTemp[i]*0.6)>>1 */ } ELSE { - GainShape[i * 4 + j] = 32767; + GainShape[add( i * 4, j )] = 32767; move16(); /* Clipping here to avoid the a huge change of the code due to gain shape change */ } } } hBWE_TD->GainAttn_fx = mult_r( hBWE_TD->GainAttn_fx, 31129 ); + move16(); } - ELSE IF( st_fx->prev_coder_type == UNVOICED || st_fx->last_good == UNVOICED_CLAS ) + ELSE IF( EQ_16( st_fx->prev_coder_type, UNVOICED ) || ( st_fx->last_good == UNVOICED_CLAS ) ) { FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) { @@ -3614,29 +3855,31 @@ static void gradientGainShape( { IF( LT_16( GainShapeTemp[i], 16384 ) ) { - GainShape[i * 4 + j] = shl( GainShapeTemp[i], 1 ); + GainShape[add( i * 4, j )] = shl( GainShapeTemp[i], 1 ); move16(); } ELSE { - GainShape[i * 4 + j] = 32767; + GainShape[add( i * 4, j )] = 32767; move16(); } } } hBWE_TD->GainAttn_fx = mult_r( hBWE_TD->GainAttn_fx, 31129 ); + move16(); } - ELSE IF( st_fx->nbLostCmpt > 1 ) + ELSE IF( GT_16( st_fx->nbLostCmpt, 1 ) ) { FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) { FOR( j = 0; j < 4; j++ ) { - GainShape[i * 4 + j] = GainShapeTemp[i]; + GainShape[add( i * 4, j )] = GainShapeTemp[i]; move16(); } } hBWE_TD->GainAttn_fx = mult_r( hBWE_TD->GainAttn_fx, 16384 ); + move16(); } ELSE { @@ -3646,20 +3889,22 @@ static void gradientGainShape( { IF( LT_16( GainShapeTemp[i], 16384 ) ) { - GainShape[i * 4 + j] = shl( GainShapeTemp[i], 1 ); + GainShape[add( i * 4, j )] = shl( GainShapeTemp[i], 1 ); move16(); } ELSE { - GainShape[i * 4 + j] = 32767; + GainShape[add( i * 4, j )] = 32767; move16(); } } } hBWE_TD->GainAttn_fx = mult_r( hBWE_TD->GainAttn_fx, 27852 ); + move16(); } *GainFrame = Mult_32_16( hBWE_TD->GainFrame_prevfrm_fx, hBWE_TD->GainAttn_fx ); /* Q18 */ + move32(); } /*-------------------------------------------------------------------* @@ -3813,6 +4058,7 @@ void ivas_dequantizeSHBparams_fx_9_1( const Word16 *cb_stage; Word16 predictor_bits; Word16 nbits = NUM_BITS_SHB_MSLVQ; + move16(); hBWE_TD = st_fx->hBWE_TD; /* LSFs */ @@ -3824,29 +4070,29 @@ void ivas_dequantizeSHBparams_fx_9_1( IF( EQ_16( st_fx->codec_mode, MODE2 ) ) { idxFrameGain = hBWE_TD->gFrame_WB; + move16(); idxLSF = hBWE_TD->lsf_WB; + move16(); } ELSE { - idxFrameGain = get_next_indice( st_fx, NUM_BITS_SHB_FrameGain_LBR_WB ); - idxLSF = get_next_indice( st_fx, NUM_BITS_LBR_WB_LSF ); + idxFrameGain = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_FrameGain_LBR_WB ); + idxLSF = (Word16) get_next_indice( st_fx, NUM_BITS_LBR_WB_LSF ); } - Copy( lbr_wb_bwe_lsfvq_cbook_2bit_fx + idxLSF * LPC_SHB_ORDER_LBR_WB, Q_lsf, LPC_SHB_ORDER_LBR_WB ); + Copy( lbr_wb_bwe_lsfvq_cbook_2bit_fx + i_mult( idxLSF, LPC_SHB_ORDER_LBR_WB ), Q_lsf, LPC_SHB_ORDER_LBR_WB ); set16_fx( Q_subgain, RECIP_ROOT_EIGHT_FX, NUM_SHB_SUBFR / 2 ); Copy32( SHBCB_FrameGain16_fx + idxFrameGain, Q_framegrain, 1 ); } ELSE { *uv_flag = (Word16) get_next_indice( st_fx, 1 ); - idxSubGain = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_SUBGAINS ); move16(); + idxSubGain = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_SUBGAINS ); idxFrameGain = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_FrameGain ); - move16(); idxLSF = (Word16) get_next_indice( st_fx, NUM_BITS_WB_LSF ); - move16(); - Copy( wb_bwe_lsfvq_cbook_8bit_fx + idxLSF * LPC_SHB_ORDER_WB, Q_lsf, LPC_SHB_ORDER_WB ); - Copy( HBCB_SubGain5bit_fx + idxSubGain * NUM_SHB_SUBFR / 4, Q_combined_gains, NUM_SHB_SUBFR / 4 ); + Copy( wb_bwe_lsfvq_cbook_8bit_fx + i_mult( idxLSF, LPC_SHB_ORDER_WB ), Q_lsf, LPC_SHB_ORDER_WB ); + Copy( HBCB_SubGain5bit_fx + i_mult( idxSubGain, NUM_SHB_SUBFR / 4 ), Q_combined_gains, NUM_SHB_SUBFR / 4 ); FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) { @@ -3858,6 +4104,7 @@ void ivas_dequantizeSHBparams_fx_9_1( /* output of Pow2() will be: */ /* 16384 < Pow2() <= 32767 */ Q_combined_gains[i] = shl( tmp, add( exp, 1 ) ); /* Q15 */ + move16(); } FOR( i = 0; i < NUM_SHB_SUBFR / 2; i += 2 ) @@ -3877,40 +4124,47 @@ void ivas_dequantizeSHBparams_fx_9_1( IF( EQ_16( st_fx->codec_mode, MODE2 ) ) { idxSubGain = hBWE_TD->idxSubGains; + move16(); idxFrameGain = hBWE_TD->idxFrameGain; + move16(); } ELSE { idxSubGain = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_SUBGAINS ); - IF( st_fx->extl_brate == SWB_TBE_1k75 ) + IF( EQ_32( st_fx->extl_brate, SWB_TBE_1k75 ) ) { - idxFrameGain = get_next_indice( st_fx, NUM_BITS_SHB_FRAMEGAIN_1k75 ); + idxFrameGain = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_FRAMEGAIN_1k75 ); } ELSE { - idxFrameGain = get_next_indice( st_fx, NUM_BITS_SHB_FRAMEGAIN ); + idxFrameGain = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_FRAMEGAIN ); } } /* Multi Source Flag */ - IF( st_fx->element_mode >= IVAS_CPE_DFT && !( st_fx->element_mode == IVAS_CPE_TD && st_fx->tdm_LRTD_flag ) ) + test(); + test(); + IF( GE_16( st_fx->element_mode, IVAS_CPE_DFT ) && !( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && st_fx->tdm_LRTD_flag ) ) { - *MSFlag = get_next_indice( st_fx, STEREO_ICBWE_MSFLAG_BITS ); + *MSFlag = (Word16) get_next_indice( st_fx, STEREO_ICBWE_MSFLAG_BITS ); + move16(); } ELSE { *MSFlag = 0; + move16(); } - test(); - IF( st_fx->extl_brate >= SWB_TBE_2k8 ) + + IF( GE_32( st_fx->extl_brate, SWB_TBE_2k8 ) ) { IF( EQ_16( st_fx->codec_mode, MODE2 ) ) { idx_shb_fr_gain = hBWE_TD->idx_shb_fr_gain; + move16(); } ELSE { - idx_shb_fr_gain = get_next_indice( st_fx, NUM_BITS_SHB_ENER_SF ); + idx_shb_fr_gain = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_ENER_SF ); } temp_shb_ener_sf_fx = usdequant_fx( idx_shb_fr_gain, 0, 86 ); /* 86 = 0.042f in Q11 = Qin-1 */ /* o: temp_shb_ener_sf_fx in Q12 */ @@ -3921,7 +4175,8 @@ void ivas_dequantizeSHBparams_fx_9_1( L_tmp = L_shl( L_tmp, -10 ); /* bring L_tmp from Q26 to Q16 */ frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent */ L_tmp = Pow2( 14, frac ); - *Q_shb_ener_sf = L_shl( L_tmp, exp - 14 + 0 ); /* In Q_ener: 2*Q_shb+1, Q_shb = 0; */ + *Q_shb_ener_sf = L_shl( L_tmp, sub( exp, 14 ) /*exp - 14 + 0 */ ); /* In Q_ener: 2*Q_shb+1, Q_shb = 0; */ + move32(); FOR( i = 0; i < 5; i++ ) { @@ -3932,7 +4187,7 @@ void ivas_dequantizeSHBparams_fx_9_1( } ELSE { - idx_res_gs[i] = get_next_indice( st_fx, NUM_BITS_SHB_RES_GS ); + idx_res_gs[i] = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_RES_GS ); move16(); } Q_shb_res_gshape[i] = usdequant_fx( idx_res_gs[i], @@ -3959,17 +4214,20 @@ void ivas_dequantizeSHBparams_fx_9_1( ELSE { *Q_shb_ener_sf = L_deposit_l( 0 ); - IF( st_fx->extl_brate == SWB_TBE_1k10 || st_fx->extl_brate == SWB_TBE_1k75 ) + move32(); + test(); + IF( EQ_32( st_fx->extl_brate, SWB_TBE_1k10 ) || EQ_32( st_fx->extl_brate, SWB_TBE_1k75 ) ) { - idx_mixFac = get_next_indice( st_fx, NUM_BITS_SHB_VF ); + idx_mixFac = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_VF ); *Q_mixFactors = usdequant_fx( idx_mixFac, 0 /* 0.0f in Q15*/, 2341 /*1.0f / ((1 << NUM_BITS_SHB_VF) - 1) in Q14*/ ); + move16(); } ELSE { *Q_mixFactors = 0; + move16(); } //*Q_mixFactors = 0; - move16(); set16_fx( Q_shb_res_gshape, 0, 5 ); } @@ -3981,51 +4239,61 @@ void ivas_dequantizeSHBparams_fx_9_1( test(); test(); test(); - IF( ( st_fx->extl_brate == SWB_TBE_0k95 || st_fx->extl_brate == SWB_TBE_1k10 ) && st_fx->codec_mode == MODE1 ) + test(); + test(); + test(); + test(); + IF( ( EQ_32( st_fx->extl_brate, SWB_TBE_0k95 ) || EQ_32( st_fx->extl_brate, SWB_TBE_1k10 ) ) && EQ_16( st_fx->codec_mode, MODE1 ) ) { set16_fx( lsf_idx, 0, 5 ); - lsf_idx[0] = get_next_indice( st_fx, 8 ); + lsf_idx[0] = (Word16) get_next_indice( st_fx, 8 ); + move16(); grid_idx = 0; + move16(); m_idx = 0; + move16(); - Copy( swb_tbe_lsfvq_cbook_8b + lsf_idx[0] * LPC_SHB_ORDER, Q_lsf, LPC_SHB_ORDER ); + Copy( swb_tbe_lsfvq_cbook_8b + i_mult( lsf_idx[0], LPC_SHB_ORDER ), Q_lsf, LPC_SHB_ORDER ); } - ELSE IF( st_fx->rf_flag == 0 && !( ( st_fx->element_mode == EVS_MONO && st_fx->total_brate == ACELP_9k60 ) || ( st_fx->element_mode == EVS_MONO && ( st_fx->total_brate == 0 ) && ( ( st_fx->last_total_brate == ACELP_9k60 ) || ( st_fx->last_total_brate == ACELP_13k20 && st_fx->rf_flag_last ) ) ) ) ) + ELSE IF( ( st_fx->rf_flag == 0 ) && !( ( ( st_fx->element_mode == EVS_MONO ) && EQ_32( st_fx->total_brate, ACELP_9k60 ) ) || ( ( st_fx->element_mode == EVS_MONO ) && ( ( st_fx->total_brate == 0 ) ) && ( ( EQ_32( st_fx->last_total_brate, ACELP_9k60 ) ) || ( EQ_32( st_fx->last_total_brate, ACELP_13k20 ) && st_fx->rf_flag_last ) ) ) ) ) { - IF( st_fx->extl_brate == SWB_TBE_1k75 ) + IF( EQ_32( st_fx->extl_brate, SWB_TBE_1k75 ) ) { /* read multi-stage LVQ quantizer */ - IF( nbits >= 19 ) + IF( GE_16( nbits, 19 ) ) { cb_stage = cb_LSF_BWE_fx[0]; + move16(); } ELSE { cb_stage = cb_LSF_BWE_fx[1]; + move16(); } set16_fx( lsf_q, 0, LPC_SHB_ORDER ); /* VQ part */ - num_bits_lvq = config_LSF_BWE[( NUM_BITS_SHB_MSLVQ - nbits ) * 3]; + num_bits_lvq = config_LSF_BWE[i_mult( sub( NUM_BITS_SHB_MSLVQ, nbits ), 3 )]; Idx = get_next_indice( st_fx, num_bits_lvq ); - v_add_16( lsf_q, cb_stage + Idx * 6, lsf_q, 6 ); + v_add_16( lsf_q, cb_stage + i_mult( Idx, 6 ), lsf_q, 6 ); /* MSLVQ part */ - num_bits_lvq = nbits - num_bits_lvq - config_LSF_BWE[( NUM_BITS_SHB_MSLVQ - nbits ) * 3 + 2]; - predictor_bits = config_LSF_BWE[( NUM_BITS_SHB_MSLVQ - nbits ) * 3 + 2]; + num_bits_lvq = sub( sub( nbits, num_bits_lvq ), config_LSF_BWE[add( i_mult( sub( NUM_BITS_SHB_MSLVQ, nbits ), 3 ), 2 )] ); + predictor_bits = config_LSF_BWE[add( i_mult( sub( NUM_BITS_SHB_MSLVQ, nbits ), 3 ), 2 )]; Idx_pred = 0; + move16(); - IF( num_bits_lvq == 16 ) + IF( EQ_16( num_bits_lvq, 16 ) ) { /* MSLVQ part */ - Idx_lvq = get_next_indice( st_fx, num_bits_lvq - 1 ) + ( ( get_next_indice( st_fx, 1 ) ) << 15 ); + Idx_lvq = L_add( get_next_indice( st_fx, sub( num_bits_lvq, 1 ) ), L_shl( get_next_indice( st_fx, 1 ), 15 ) ); deindex_lvq_SHB_fx( Idx_lvq, out, num_bits_lvq, 0 ); } ELSE { /* MSLVQ part */ Idx_lvq = get_next_indice( st_fx, num_bits_lvq ); - deindex_lvq_SHB_fx( Idx_lvq, out, num_bits_lvq, ( nbits < 19 ) ); + deindex_lvq_SHB_fx( Idx_lvq, out, num_bits_lvq, extract_l( LT_16( nbits, 19 ) ) ); } /* mvr2r( mean_lsf, Q_lsfs, LPC_SHB_ORDER ); */ @@ -4035,19 +4303,22 @@ void ivas_dequantizeSHBparams_fx_9_1( IF( predictor_bits == 0 ) { lsf_q[LATTICE_DIM] = dotp_loc( lsf_q, LastCoefPred_0bit_fx, LATTICE_DIM ); + move16(); lsf_q[LATTICE_DIM + 1] = dotp_loc( lsf_q, &LastCoefPred_0bit_fx[LATTICE_DIM + 1], LATTICE_DIM ); + move16(); } ELSE { - Idx_pred = get_next_indice( st_fx, 1 ); - - lsf_q[LATTICE_DIM] = dotp_loc( lsf_q, &LastCoefPred_1bit_fx[2 * ( LATTICE_DIM + 1 ) * Idx_pred], LATTICE_DIM ); - lsf_q[LATTICE_DIM + 1] = dotp_loc( lsf_q, &LastCoefPred_1bit_fx[2 * ( LATTICE_DIM + 1 ) * Idx_pred + LATTICE_DIM + 1], LATTICE_DIM ); + Idx_pred = (Word16) get_next_indice( st_fx, 1 ); + lsf_q[LATTICE_DIM] = dotp_loc( lsf_q, &LastCoefPred_1bit_fx[i_mult( 2 * ( LATTICE_DIM + 1 ), Idx_pred )], LATTICE_DIM ); + move16(); + lsf_q[LATTICE_DIM + 1] = dotp_loc( lsf_q, &LastCoefPred_1bit_fx[add( i_mult( 2 * ( LATTICE_DIM + 1 ), Idx_pred ), LATTICE_DIM + 1 )], LATTICE_DIM ); + move16(); } - IF( nbits < NUM_BITS_SHB_MSLVQ ) + IF( LT_16( nbits, NUM_BITS_SHB_MSLVQ ) ) { - Idx_pred = get_next_indice( st_fx, NUM_BITS_SHB_MSLVQ - nbits ); + Idx_pred = (Word16) get_next_indice( st_fx, sub( NUM_BITS_SHB_MSLVQ, nbits ) ); } v_add_16( SHB_LSF_mean_fx, lsf_q, lsf_q, LPC_SHB_ORDER ); @@ -4083,11 +4354,11 @@ void ivas_dequantizeSHBparams_fx_9_1( IF( EQ_16( st_fx->codec_mode, MODE2 ) ) { m_idx = hBWE_TD->m_idx; + move16(); } ELSE { m_idx = (Word16) get_next_indice( st_fx, MIRROR_POINT_BITS ); - move16(); } Dequant_mirror_point_fx( lsf_q, m_idx, &m ); @@ -4096,17 +4367,19 @@ void ivas_dequantizeSHBparams_fx_9_1( IF( GT_16( m, MAX_LSF_FX ) ) { st_fx->BER_detect = 1; + move16(); m = MAX_LSF_FX - 1; + move16(); } IF( EQ_16( st_fx->codec_mode, MODE2 ) ) { grid_idx = hBWE_TD->grid_idx; + move16(); } ELSE { grid_idx = (Word16) get_next_indice( st_fx, NUM_LSF_GRID_BITS ); - move16(); } Map_higher_LSF_fx( lsf_q, m, lsf_grid_fx[grid_idx] ); @@ -4117,7 +4390,9 @@ void ivas_dequantizeSHBparams_fx_9_1( IF( GT_16( lsf_q[LPC_SHB_ORDER - 1 - i], MAX_LSF_FX ) ) { st_fx->BER_detect = 1; + move16(); lsf_q[LPC_SHB_ORDER - 1 - i] = MAX_LSF_FX - 1; + move16(); } Q_lsf[i] = sub( 16384, lsf_q[LPC_SHB_ORDER - 1 - i] ); move16(); @@ -4128,14 +4403,16 @@ void ivas_dequantizeSHBparams_fx_9_1( set16_fx( lsf_idx, 0, 5 ); Copy( hBWE_TD->lsf_idx, lsf_idx, 5 ); grid_idx = 0; + move16(); m_idx = 0; - Copy( swb_tbe_lsfvq_cbook_8b + lsf_idx[0] * LPC_SHB_ORDER, Q_lsf, LPC_SHB_ORDER ); + move16(); + Copy( swb_tbe_lsfvq_cbook_8b + i_mult( lsf_idx[0], LPC_SHB_ORDER ), Q_lsf, LPC_SHB_ORDER ); } space_lsfs_fx( Q_lsf, LPC_SHB_ORDER ); /* Dequantize subgain indices */ - j = idxSubGain * NUM_SHB_SUBGAINS; + j = i_mult( idxSubGain, NUM_SHB_SUBGAINS ); move16(); FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) { @@ -4153,24 +4430,32 @@ void ivas_dequantizeSHBparams_fx_9_1( FOR( i = NUM_SHB_SUBFR - 1; i >= 0; i-- ) { - Q_subgain[i] = Q_subgain[i * NUM_SHB_SUBGAINS / NUM_SHB_SUBFR]; + Word16 idx = 0; + move16(); + IF( i != 0 ) + { + idx = idiv1616( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR ); + } + Q_subgain[i] = Q_subgain[idx]; move16(); } /* Frame gain */ - IF( st_fx->extl_brate == SWB_TBE_1k75 ) + IF( EQ_32( st_fx->extl_brate, SWB_TBE_1k75 ) ) { *Q_framegrain = L_mac( SHB_GAIN_QLOW_1k75_FX, idxFrameGain, SHB_GAIN_QDELTA_1k75_FX ); + move32(); } ELSE { *Q_framegrain = L_mac( SHB_GAIN_QLOW_FX, idxFrameGain, SHB_GAIN_QDELTA_FX ); - } - move32(); /*Q18*/ + move32(); + } /*Q18*/ L_tmp = Mult_32_16( *Q_framegrain, 27213 ); /*Q16*/ /* 3.321928 in Q13 */ frac = L_Extract_lc( L_tmp, &exp ); L_tmp = Pow2( 30, frac ); *Q_framegrain = L_shl( L_tmp, sub( exp, 12 ) ); /*Q18*/ + move32(); } return; @@ -4233,23 +4518,23 @@ static void dequantizeSHBparams_fx_9_1( IF( EQ_32( extl_brate, WB_TBE_0k35 ) ) { idxFrameGain = hBWE_TD->gFrame_WB; + move16(); idxLSF = hBWE_TD->lsf_WB; + move16(); - Copy( lbr_wb_bwe_lsfvq_cbook_2bit_fx + idxLSF * LPC_SHB_ORDER_LBR_WB, Q_lsf, LPC_SHB_ORDER_LBR_WB ); + Copy( lbr_wb_bwe_lsfvq_cbook_2bit_fx + i_mult( idxLSF, LPC_SHB_ORDER_LBR_WB ), Q_lsf, LPC_SHB_ORDER_LBR_WB ); set16_fx( Q_subgain, RECIP_ROOT_EIGHT_FX, NUM_SHB_SUBFR / 2 ); Copy32( SHBCB_FrameGain16_fx + idxFrameGain, Q_framegrain, 1 ); } ELSE { *uv_flag = (Word16) get_next_indice( st_fx, 1 ); - idxSubGain = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_SUBGAINS ); move16(); + idxSubGain = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_SUBGAINS ); idxFrameGain = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_FrameGain ); - move16(); idxLSF = (Word16) get_next_indice( st_fx, NUM_BITS_WB_LSF ); - move16(); - Copy( wb_bwe_lsfvq_cbook_8bit_fx + idxLSF * LPC_SHB_ORDER_WB, Q_lsf, LPC_SHB_ORDER_WB ); - Copy( HBCB_SubGain5bit_fx + idxSubGain * NUM_SHB_SUBFR / 4, Q_combined_gains, NUM_SHB_SUBFR / 4 ); + Copy( wb_bwe_lsfvq_cbook_8bit_fx + i_mult( idxLSF, LPC_SHB_ORDER_WB ), Q_lsf, LPC_SHB_ORDER_WB ); + Copy( HBCB_SubGain5bit_fx + i_mult( idxSubGain, NUM_SHB_SUBFR / 4 ), Q_combined_gains, NUM_SHB_SUBFR / 4 ); FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) { @@ -4261,6 +4546,7 @@ static void dequantizeSHBparams_fx_9_1( /* output of Pow2() will be: */ /* 16384 < Pow2() <= 32767 */ Q_combined_gains[i] = shl( tmp, add( exp, 1 ) ); /* Q15 */ + move16(); } FOR( i = 0; i < NUM_SHB_SUBFR / 2; i += 2 ) @@ -4280,7 +4566,9 @@ static void dequantizeSHBparams_fx_9_1( IF( EQ_16( st_fx->codec_mode, MODE2 ) ) { idxSubGain = hBWE_TD->idxSubGains; + move16(); idxFrameGain = hBWE_TD->idxFrameGain; + move16(); } ELSE { @@ -4294,10 +4582,11 @@ static void dequantizeSHBparams_fx_9_1( IF( EQ_16( st_fx->codec_mode, MODE2 ) ) { idx_shb_fr_gain = hBWE_TD->idx_shb_fr_gain; + move16(); } ELSE { - idx_shb_fr_gain = get_next_indice( st_fx, NUM_BITS_SHB_ENER_SF ); + idx_shb_fr_gain = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_ENER_SF ); } temp_shb_ener_sf_fx = usdequant_fx( idx_shb_fr_gain, 0, 86 ); /* 86 = 0.042f in Q11 = Qin-1 */ /* o: temp_shb_ener_sf_fx in Q12 */ @@ -4308,7 +4597,8 @@ static void dequantizeSHBparams_fx_9_1( L_tmp = L_shl( L_tmp, -10 ); /* bring L_tmp from Q26 to Q16 */ frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent */ L_tmp = Pow2( 14, frac ); - *Q_shb_ener_sf = L_shl( L_tmp, exp - 14 + 0 ); /* In Q_ener: 2*Q_shb+1, Q_shb = 0; */ + *Q_shb_ener_sf = L_shl( L_tmp, sub( exp, 14 ) /* exp - 14 + 0 */ ); /* In Q_ener: 2*Q_shb+1, Q_shb = 0; */ + move32(); FOR( i = 0; i < 5; i++ ) { @@ -4319,7 +4609,7 @@ static void dequantizeSHBparams_fx_9_1( } ELSE { - idx_res_gs[i] = get_next_indice( st_fx, NUM_BITS_SHB_RES_GS ); + idx_res_gs[i] = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_RES_GS ); move16(); } Q_shb_res_gshape[i] = usdequant_fx( idx_res_gs[i], @@ -4346,6 +4636,7 @@ static void dequantizeSHBparams_fx_9_1( ELSE { *Q_shb_ener_sf = L_deposit_l( 0 ); + move32(); *Q_mixFactors = 0; move16(); set16_fx( Q_shb_res_gshape, 0, 5 ); @@ -4359,7 +4650,7 @@ static void dequantizeSHBparams_fx_9_1( test(); test(); test(); - IF( ( st_fx->rf_flag == 0 ) && !( ( EQ_32( st_fx->total_brate, ACELP_9k60 ) ) || ( ( st_fx->total_brate == 0 ) && ( ( EQ_32( st_fx->last_total_brate, ACELP_9k60 ) ) || ( EQ_32( st_fx->last_total_brate, ACELP_13k20 ) && EQ_16( st_fx->rf_flag_last, 1 ) ) ) ) ) ) + IF( ( ( st_fx->rf_flag == 0 ) ) && !( ( EQ_32( st_fx->total_brate, ACELP_9k60 ) ) || ( ( ( st_fx->total_brate == 0 ) ) && ( ( EQ_32( st_fx->last_total_brate, ACELP_9k60 ) ) || ( EQ_32( st_fx->last_total_brate, ACELP_13k20 ) && EQ_16( st_fx->rf_flag_last, 1 ) ) ) ) ) ) { /* LSFs */ @@ -4390,11 +4681,11 @@ static void dequantizeSHBparams_fx_9_1( IF( EQ_16( st_fx->codec_mode, MODE2 ) ) { m_idx = hBWE_TD->m_idx; + move16(); } ELSE { m_idx = (Word16) get_next_indice( st_fx, MIRROR_POINT_BITS ); - move16(); } Dequant_mirror_point_fx( lsf_q, m_idx, &m ); @@ -4403,17 +4694,19 @@ static void dequantizeSHBparams_fx_9_1( IF( GT_16( m, MAX_LSF_FX ) ) { st_fx->BER_detect = 1; + move16(); m = MAX_LSF_FX - 1; + move16(); } IF( EQ_16( st_fx->codec_mode, MODE2 ) ) { grid_idx = hBWE_TD->grid_idx; + move16(); } ELSE { grid_idx = (Word16) get_next_indice( st_fx, NUM_LSF_GRID_BITS ); - move16(); } Map_higher_LSF_fx( lsf_q, m, lsf_grid_fx[grid_idx] ); @@ -4424,7 +4717,9 @@ static void dequantizeSHBparams_fx_9_1( IF( GT_16( lsf_q[LPC_SHB_ORDER - 1 - i], MAX_LSF_FX ) ) { st_fx->BER_detect = 1; + move16(); lsf_q[LPC_SHB_ORDER - 1 - i] = MAX_LSF_FX - 1; + move16(); } Q_lsf[i] = sub( 16384, lsf_q[LPC_SHB_ORDER - 1 - i] ); move16(); @@ -4435,20 +4730,23 @@ static void dequantizeSHBparams_fx_9_1( set16_fx( lsf_idx, 0, 5 ); Copy( hBWE_TD->lsf_idx, lsf_idx, 5 ); grid_idx = 0; + move16(); m_idx = 0; - Copy( swb_tbe_lsfvq_cbook_8b + lsf_idx[0] * LPC_SHB_ORDER, Q_lsf, LPC_SHB_ORDER ); + move16(); + Copy( swb_tbe_lsfvq_cbook_8b + i_mult( lsf_idx[0], LPC_SHB_ORDER ), Q_lsf, LPC_SHB_ORDER ); } space_lsfs_fx( Q_lsf, LPC_SHB_ORDER ); /* Dequantize subgain indices */ - j = idxSubGain * NUM_SHB_SUBGAINS; + j = i_mult( idxSubGain, NUM_SHB_SUBGAINS ); move16(); FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) { /* Q_subgain[i] = (float) pow(10.0, SHBCB_SubGain5bit[j++]); */ - L_tmp = L_mult( SHBCB_SubGain5bit_fx[j++], 27213 ); /*Q28 3.321928 in Q13 */ + L_tmp = L_mult( SHBCB_SubGain5bit_fx[j], 27213 ); /*Q28 3.321928 in Q13 */ + j = add( j, 1 ); L_tmp = L_shr( L_tmp, 12 ); frac = L_Extract_lc( L_tmp, &exp ); tmp = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ @@ -4460,17 +4758,24 @@ static void dequantizeSHBparams_fx_9_1( FOR( i = NUM_SHB_SUBFR - 1; i >= 0; i-- ) { - Q_subgain[i] = Q_subgain[i * NUM_SHB_SUBGAINS / NUM_SHB_SUBFR]; + Word16 idx = 0; + move16(); + IF( i != 0 ) + { + idx = idiv1616( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR ); + } + Q_subgain[i] = Q_subgain[idx]; move16(); } /* Frame gain */ - *Q_framegrain = L_mac( SHB_GAIN_QLOW_FX, idxFrameGain, SHB_GAIN_QDELTA_FX ); - move32(); /*Q18*/ + *Q_framegrain = L_mac( SHB_GAIN_QLOW_FX, idxFrameGain, SHB_GAIN_QDELTA_FX ); /*Q18*/ + move32(); L_tmp = Mult_32_16( *Q_framegrain, 27213 ); /*Q16*/ /* 3.321928 in Q13 */ frac = L_Extract_lc( L_tmp, &exp ); L_tmp = Pow2( 30, frac ); *Q_framegrain = L_shl( L_tmp, sub( exp, 12 ) ); /*Q18*/ + move32(); } return; @@ -4491,7 +4796,9 @@ void fb_tbe_dec_fx( { Word16 i; Word16 ratio = 0; + move16(); Word32 fb_exc_energy = 0; + move32(); Word16 fb_synth[L_FRAME48k]; TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st->hBWE_TD; @@ -4516,7 +4823,7 @@ void fb_tbe_dec_fx( ratio = shl( 1, i ); #endif } - ELSE if ( EQ_16( st->extl, FB_TBE ) && st->bfi ) + ELSE IF( EQ_16( st->extl, FB_TBE ) && st->bfi ) { ratio = hBWE_TD->prev_fbbwe_ratio_fx; move16(); @@ -4554,16 +4861,18 @@ void fb_tbe_dec_ivas_fx( { Word16 i; Word16 ratio = 0; + move16(); Word32 fb_exc_energy = 0; + move32(); Word16 fb_synth[L_FRAME48k]; TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st->hBWE_TD; /* decode FB slope information */ - test(); - test(); - if ( output_frame == L_FRAME48k ) + IF( EQ_16( output_frame, L_FRAME48k ) ) { + test(); + test(); IF( EQ_16( st->extl, FB_TBE ) && !st->bfi ) { IF( EQ_16( st->codec_mode, MODE2 ) ) @@ -4581,7 +4890,7 @@ void fb_tbe_dec_ivas_fx( ratio = shl( 1, i ); #endif } - ELSE if ( EQ_16( st->extl, FB_TBE ) && st->bfi ) + ELSE IF( EQ_16( st->extl, FB_TBE ) && st->bfi ) { ratio = hBWE_TD->prev_fbbwe_ratio_fx; move16(); @@ -4592,6 +4901,7 @@ void fb_tbe_dec_ivas_fx( IF( !st->bfi ) { st->next_bit_pos = add( st->next_bit_pos, NUM_BITS_FB_FRAMEGAIN ); + move16(); } return; @@ -4601,7 +4911,8 @@ void fb_tbe_dec_ivas_fx( /* FB TBE synthesis */ synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); - IF( GE_16( st->element_mode, IVAS_CPE_DFT ) && EQ_16( st->idchan, 0 ) ) + test(); + IF( GE_16( st->element_mode, IVAS_CPE_DFT ) && ( st->idchan == 0 ) ) { Copy_Scale_sig( fb_synth, fb_synth_ref, L_FRAME48k, sub( Q_fb_synth_ref, hb_synth_exp ) ); // scaling is required } @@ -4632,30 +4943,33 @@ void tbe_read_bitstream_fx( IF( ( EQ_16( st_fx->rf_flag, 1 ) || EQ_32( st_fx->total_brate, ACELP_9k60 ) ) && EQ_16( st_fx->bwidth, WB ) ) { /* WB LSF */ - hBWE_TD->lsf_WB = get_next_indice( st_fx, NUM_BITS_LBR_WB_LSF ); + hBWE_TD->lsf_WB = (Word16) get_next_indice( st_fx, NUM_BITS_LBR_WB_LSF ); + move16(); /* WB frame gain */ - hBWE_TD->gFrame_WB = get_next_indice( st_fx, NUM_BITS_SHB_FrameGain_LBR_WB ); + hBWE_TD->gFrame_WB = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_FrameGain_LBR_WB ); + move16(); } ELSE IF( ( GE_32( st_fx->total_brate, ACELP_9k60 ) ) && ( LE_32( st_fx->total_brate, ACELP_32k ) ) && ( ( EQ_16( st_fx->bwidth, SWB ) ) || ( EQ_16( st_fx->bwidth, FB ) ) ) ) { test(); - IF( ( st_fx->rf_flag == 0 ) && ( GT_32( st_fx->total_brate, ACELP_9k60 ) ) ) + IF( ( ( st_fx->rf_flag == 0 ) ) && ( GT_32( st_fx->total_brate, ACELP_9k60 ) ) ) { FOR( i = 0; i < NUM_Q_LSF; i++ ) { - hBWE_TD->lsf_idx[i] = get_next_indice( st_fx, lsf_q_num_bits[i] ); + hBWE_TD->lsf_idx[i] = (Word16) get_next_indice( st_fx, lsf_q_num_bits[i] ); move16(); } - hBWE_TD->m_idx = get_next_indice( st_fx, MIRROR_POINT_BITS ); - - hBWE_TD->grid_idx = get_next_indice( st_fx, NUM_LSF_GRID_BITS ); + hBWE_TD->m_idx = (Word16) get_next_indice( st_fx, MIRROR_POINT_BITS ); + move16(); + hBWE_TD->grid_idx = (Word16) get_next_indice( st_fx, NUM_LSF_GRID_BITS ); + move16(); } ELSE { - hBWE_TD->lsf_idx[0] = get_next_indice( st_fx, 8 ); + hBWE_TD->lsf_idx[0] = (Word16) get_next_indice( st_fx, 8 ); move16(); hBWE_TD->m_idx = 0; move16(); @@ -4664,31 +4978,37 @@ void tbe_read_bitstream_fx( } /* shape gains */ - hBWE_TD->idxSubGains = get_next_indice( st_fx, NUM_BITS_SHB_SUBGAINS ); + hBWE_TD->idxSubGains = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_SUBGAINS ); + move16(); /* frame gain */ - hBWE_TD->idxFrameGain = get_next_indice( st_fx, NUM_BITS_SHB_FRAMEGAIN ); + hBWE_TD->idxFrameGain = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_FRAMEGAIN ); + move16(); IF( GE_32( st_fx->total_brate, ACELP_24k40 ) ) { /* sub frame energy*/ - hBWE_TD->idx_shb_fr_gain = get_next_indice( st_fx, NUM_BITS_SHB_ENER_SF ); + hBWE_TD->idx_shb_fr_gain = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_ENER_SF ); + move16(); /* gain shapes residual */ FOR( i = 0; i < NB_SUBFR16k; i++ ) { - hBWE_TD->idx_res_gs[i] = get_next_indice( st_fx, NUM_BITS_SHB_RES_GS ); + hBWE_TD->idx_res_gs[i] = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_RES_GS ); move16(); } /* voicing factor */ - hBWE_TD->idx_mixFac = get_next_indice( st_fx, NUM_BITS_SHB_VF ); + hBWE_TD->idx_mixFac = (Word16) get_next_indice( st_fx, NUM_BITS_SHB_VF ); + move16(); } IF( EQ_16( st_fx->tec_tfa, 1 ) ) { - st_fx->tec_flag = get_next_indice( st_fx, BITS_TEC ); - st_fx->tfa_flag = get_next_indice( st_fx, BITS_TFA ); + st_fx->tec_flag = (Word16) get_next_indice( st_fx, BITS_TEC ); + move16(); + st_fx->tfa_flag = (Word16) get_next_indice( st_fx, BITS_TFA ); + move16(); test(); IF( st_fx->tfa_flag && st_fx->tec_flag ) { @@ -4709,7 +5029,8 @@ void tbe_read_bitstream_fx( IF( EQ_16( st_fx->bwidth, FB ) ) { - hBWE_TD->idxGain = get_next_indice( st_fx, 4 ); + hBWE_TD->idxGain = (Word16) get_next_indice( st_fx, 4 ); + move16(); } } @@ -4767,12 +5088,14 @@ void GenTransition_fx( { L_tmp = L_mult( window_shb_32k_fx[i], old_hb_synth[L_SHB_TRANSITION_LENGTH - 1 - i] ); output[i] = mac_r( L_tmp, window_shb_32k_fx[2 * L_SHB_LAHEAD - 1 - i], syn_overlap_32k[i] ); + move16(); } /* fill transition signal with mirrored HB synth from previous frame to fully fill delay alignment buffer gap */ FOR( ; i < length; i++ ) { output[i] = old_hb_synth[L_SHB_TRANSITION_LENGTH - 1 - i]; + move16(); } IF( EQ_32( target_fs, 48000 ) ) @@ -4872,6 +5195,7 @@ void TBEreset_dec_fx( { set16_fx( hBWE_TD->old_bwe_exc_fx, 0, PIT16k_MAX * 2 ); hBWE_TD->bwe_non_lin_prev_scale_fx = L_deposit_l( 0 ); + move32(); st_fx->prev_Q_bwe_exc = 31; move16(); } @@ -4905,8 +5229,10 @@ void TBEreset_dec_fx( IF( EQ_16( bandwidth, FB ) ) { st_fx->prev_fb_ener_adjust_fx = 0; + move16(); set16_fx( hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER ); hBWE_TD->fb_tbe_demph_fx = 0; + move16(); fb_tbe_reset_synth_fx( hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, &hBWE_TD->prev_fbbwe_ratio_fx ); } } @@ -4923,10 +5249,11 @@ void TBEreset_dec_ivas_fx( hBWE_TD = st->hBWE_TD; - IF( NE_16( st->last_core, ACELP_CORE ) ) + IF( st->last_core != ACELP_CORE ) { set16_fx( hBWE_TD->old_bwe_exc_fx, 0, PIT16k_MAX * 2 ); hBWE_TD->bwe_non_lin_prev_scale_fx = L_deposit_l( 0 ); + move32(); st->prev_Q_bwe_exc = 31; move16(); } @@ -4953,19 +5280,23 @@ void TBEreset_dec_ivas_fx( set16_fx( hBWE_TD->mem_resamp_HB_32k_fx, 0, 2 * ALLPASSSECTIONS_STEEP + 1 ); set32_fx( hBWE_TD->mem_resamp_HB_32k_fx_32, 0, 2 * ALLPASSSECTIONS_STEEP + 1 ); hBWE_TD->prev_pow_exc16kWhtnd_fx32 = 1; /* Q0 1.f */ - hBWE_TD->prev_mix_factor_fx = 32767; /* Q15 1.f */ + move32(); + hBWE_TD->prev_mix_factor_fx = 32767; /* Q15 1.f */ + move16(); // swb_tbe_reset_synth_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx ); swb_tbe_reset_synth_ivas_fx( hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32 ); IF( EQ_16( st->bwidth, FB ) ) { - IF( st->hBWE_FD != NULL ) + if ( st->hBWE_FD != NULL ) { st->prev_fb_ener_adjust_fx = 0; + move16(); } set16_fx( hBWE_TD->fb_state_lpc_syn_fx, 0, LPC_SHB_ORDER ); hBWE_TD->fb_tbe_demph_fx = 0; + move16(); fb_tbe_reset_synth_fx( hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, &hBWE_TD->prev_fbbwe_ratio_fx ); } } @@ -5049,6 +5380,7 @@ void td_bwe_dec_init_ivas_fx( set16_fx( hBWE_TD->old_hb_synth_fx, 0, L_FRAME48k ); hBWE_TD->prev_ener_fx = L_deposit_l( 0 ); + move32(); return; } @@ -5124,7 +5456,7 @@ void td_bwe_dec_init_fx( hBWE_TD->prev_ener_fx = L_deposit_l( 0 ); - + move32(); return; } diff --git a/lib_dec/syn_outp_fx.c b/lib_dec/syn_outp_fx.c index d291ba3e4..67399e2dd 100644 --- a/lib_dec/syn_outp_fx.c +++ b/lib_dec/syn_outp_fx.c @@ -27,6 +27,7 @@ void syn_output_fx( /*tmp = sub(Q_syn2, 1); */ tmp = Q_syn2; + move16(); /*-----------------------------------------------------------------* * Output synthesis signal with compensation for saturation @@ -45,6 +46,7 @@ void syn_output_fx( #else synth_out[i] = round_fx( L_shr( L_tmp, tmp ) ); #endif + move16(); } } ELSE @@ -72,6 +74,7 @@ void unscale_AGC( Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif /*----------------------------------------------------------------* @@ -109,6 +112,7 @@ void unscale_AGC( L_tmp = L_shr( L_tmp, -1 ); /* saturation can occur here */ y[0] = round_fx( L_tmp ); + move16(); FOR( i = 1; i < n; i++ ) { @@ -119,10 +123,11 @@ void unscale_AGC( L_tmp = L_msu( L_tmp, fac, x[i] ); L_tmp = L_msu( L_tmp, fac, x[i - 1] ); y[i] = round_fx( L_tmp ); + move16(); } mem[0] = fac; move16(); - mem[1] = shr( x[sub( i, 1 )], 1 ); + mem[1] = shr( x[i - 1], 1 ); move16(); } diff --git a/lib_dec/tcq_core_dec_fx.c b/lib_dec/tcq_core_dec_fx.c index 894372201..0e3fa5f90 100644 --- a/lib_dec/tcq_core_dec_fx.c +++ b/lib_dec/tcq_core_dec_fx.c @@ -34,6 +34,7 @@ void tcq_core_LR_dec_fx( Word16 i, j, k; Word32 Rk_sort_fx[NB_SFM]; Word16 flag_wbnb = 0; + move16(); Word16 USQ_TCQ[NB_SFM]; /* TCQ is selected by default*/ Word16 nb_bytes, pulsesnum, nz; @@ -45,19 +46,28 @@ void tcq_core_LR_dec_fx( TCQ_BITSTREAM bs_fx, *pbs_fx; Word16 nzb = 0; + move16(); Word16 nzbands = 0; + move16(); Word16 lsbtcq_bits = TCQ_AMP; + move16(); Word16 tcq_arbits = 2; + move16(); /* LSB TCQ variables*/ Word16 dpath[280]; Word16 bcount = 0; + move16(); Word32 bsub_fx = 0; + move32(); Word16 mbuffer_fx[560]; Word32 leftbits = 0; + move32(); Word32 sepbits = 0; + move32(); Word32 divider = 0; + move32(); #ifndef BASOP_NOGLOB_DECLARE_LOCAL if ( Overflow == 1 ) @@ -74,7 +84,7 @@ void tcq_core_LR_dec_fx( test(); test(); - IF( LE_16( input_frame, L_FRAME16k ) && adjustFlag == 0 && *is_transient == 0 ) + IF( LE_16( input_frame, L_FRAME16k ) && ( adjustFlag == 0 ) && ( *is_transient == 0 ) ) { flag_wbnb = 1; move16(); @@ -89,7 +99,9 @@ void tcq_core_LR_dec_fx( pbs_fx->curPos = 7; move16(); pbs_fx->numbits = L_deposit_l( 0 ); + move32(); pbs_fx->numByte = L_deposit_l( 0 ); + move32(); /* Bits distribution analysis*/ FOR( i = 0; i < BANDS; i++ ) @@ -125,15 +137,17 @@ void tcq_core_LR_dec_fx( { bsub_fx = L_add( bsub_fx, 2048 ); } - FOR( j = BANDS - 1; j >= 0; j-- ) + FOR( j = sub( BANDS, 1 ); j >= 0; j-- ) { IF( Rk_fx[j] > 0 ) { Rk_fx[j] = L_sub( Rk_fx[j], ar_div( bsub_fx, nzb ) ); + move32(); IF( Rk_fx[j] < 0 ) { bsub_fx = L_sub( bsub_fx, L_add( ar_div( bsub_fx, nzb ), Rk_fx[j] ) ); Rk_fx[j] = L_deposit_l( 0 ); + move32(); } ELSE { @@ -157,8 +171,9 @@ void tcq_core_LR_dec_fx( IF( k > 0 ) { Word16 tmp; - tmp = (UWord8) get_next_indice( st_fx, k ); + tmp = (Word16) get_next_indice( st_fx, k ); pbs_fx->buf[nb_bytes] = (UWord8) shl( tmp, sub( 8, k ) ); + move16(); /* i++; nb_bytes++; */ i = add( i, 1 ); @@ -183,7 +198,7 @@ void tcq_core_LR_dec_fx( test(); test(); - IF( LE_16( input_frame, L_FRAME16k ) && adjustFlag == 0 && *is_transient == 0 ) + IF( LE_16( input_frame, L_FRAME16k ) && ( adjustFlag == 0 ) && ( *is_transient == 0 ) ) { surplus_fx = -131072; move32(); /*16 */ @@ -194,6 +209,7 @@ void tcq_core_LR_dec_fx( move16(); FOR( j = 0; j < BANDS; j++ ) { + test(); IF( EQ_16( j, k_num[0] ) || EQ_16( j, k_num[1] ) ) { sepbits = L_add( sepbits, Rk_fx[k_sort[j]] ); @@ -215,7 +231,7 @@ void tcq_core_LR_dec_fx( { test(); test(); - IF( Rk_fx[k_sort[k]] > 0 && USQ_TCQ[k_sort[k]] == 0 ) + IF( ( Rk_fx[k_sort[k]] > 0 ) && ( USQ_TCQ[k_sort[k]] == 0 ) ) { /* When number of bits per band is less than arithmetic bits overhead, this band is not encoded. @@ -228,7 +244,7 @@ void tcq_core_LR_dec_fx( move16(); FOR( i = 0; i < band_width[k_sort[k]]; i++ ) { - inp_vector_fx[band_start[k_sort[k]] + i] = 0; + inp_vector_fx[add( band_start[k_sort[k]], i )] = 0; move16(); } IF( surplus_fx != 0 ) @@ -253,7 +269,7 @@ void tcq_core_LR_dec_fx( nzbands--; move16(); } - ELSE IF( Rk_fx[k_sort[k]] > 0 && EQ_16( USQ_TCQ[k_sort[k]], 1 ) ) + ELSE IF( ( Rk_fx[k_sort[k]] > 0 ) && EQ_16( USQ_TCQ[k_sort[k]], 1 ) ) { /* When number of bits per band is less than arithmetic bits overhead, this band is not encoded. @@ -266,7 +282,7 @@ void tcq_core_LR_dec_fx( move16(); FOR( i = 0; i < band_width[k_sort[k]]; i++ ) { - inp_vector_fx[band_start[k_sort[k]] + i] = 0; + inp_vector_fx[add( band_start[k_sort[k]], i )] = 0; move16(); } IF( surplus_fx != 0 ) @@ -295,7 +311,7 @@ void tcq_core_LR_dec_fx( move16(); FOR( i = 0; i < band_width[k_sort[k]]; i++ ) { - inp_vector_fx[band_start[k_sort[k]] + i] = 0; + inp_vector_fx[add( band_start[k_sort[k]], i )] = 0; move16(); } } @@ -305,25 +321,28 @@ void tcq_core_LR_dec_fx( delta_fx = L_deposit_l( 0 ); test(); - IF( Rk_fx[k_sort[k]] > 0 && surplus_fx < 0 ) + IF( ( Rk_fx[k_sort[k]] > 0 ) && ( surplus_fx < 0 ) ) { - IF( nzbands <= 1 ) + IF( LE_16( nzbands, 1 ) ) { divider = 0; + move32(); } ELSE { divider = 2; + move32(); } IF( L_add( L_add( surplus_fx, sepbits ), ar_div( leftbits, divider ) ) < 0 ) { /* Overflow possible => start to distribute negative surplus */ - delta_fx = ar_div( surplus_fx + sepbits, nzbands ); + delta_fx = ar_div( L_add( surplus_fx, sepbits ), nzbands ); } - else + ELSE { delta_fx = 0; + move32(); } surplus_fx = L_sub( surplus_fx, delta_fx ); } @@ -336,13 +355,16 @@ void tcq_core_LR_dec_fx( IF( ( GT_32( surplus_fx, 524288 ) && EQ_16( input_frame, L_FRAME8k ) ) || ( GT_32( surplus_fx, 786432 ) && EQ_16( input_frame, L_FRAME16k ) ) ) { bit_surplus_fx[0] = Mult_32_16( surplus_fx, 24576 ); /* Q16 */ - bit_surplus_fx[1] = Mult_32_16( surplus_fx, 8192 ); /* Q16 */ + move32(); + bit_surplus_fx[1] = Mult_32_16( surplus_fx, 8192 ); /* Q16 */ + move32(); } ELSE { bit_surplus_fx[0] = surplus_fx; move32(); bit_surplus_fx[1] = L_deposit_l( 0 ); + move32(); } FOR( k = 0; k < BANDS; k++ ) @@ -356,7 +378,7 @@ void tcq_core_LR_dec_fx( test(); test(); - IF( Rk_fx[k_sort[k]] > 0 && USQ_TCQ[k_sort[k]] == 0 ) + IF( ( Rk_fx[k_sort[k]] > 0 ) && ( USQ_TCQ[k_sort[k]] == 0 ) ) { /* get number of pulses */ pulsesnum = GetScale_fx( band_width[k_sort[k]], Rk_fx[k_sort[k]], &surplus_fx ); @@ -366,7 +388,7 @@ void tcq_core_LR_dec_fx( decode_mangitude_tcq_fx( pardec_fx, band_width[k_sort[k]], pulsesnum, nz, &positions_fx[band_start[k_sort[k]]], &inp_vector_fx[band_start[k_sort[k]]], &surplus_fx ); decode_signs_fx( pardec_fx, band_width[k_sort[k]], &inp_vector_fx[band_start[k_sort[k]]] ); } - ELSE IF( Rk_fx[k_sort[k]] > 0 && USQ_TCQ[k_sort[k]] == 1 ) + ELSE IF( ( Rk_fx[k_sort[k]] > 0 ) && EQ_16( USQ_TCQ[k_sort[k]], 1 ) ) { pulsesnum = GetScale_fx( band_width[k_sort[k]], Rk_fx[k_sort[k]], &surplus_fx ); @@ -381,7 +403,7 @@ void tcq_core_LR_dec_fx( move16(); FOR( i = 0; i < band_width[k_sort[k]]; i++ ) { - inp_vector_fx[band_start[k_sort[k]] + i] = 0; + inp_vector_fx[add( band_start[k_sort[k]], i )] = 0; move16(); } } @@ -398,7 +420,7 @@ void tcq_core_LR_dec_fx( { IF( Rk_fx[k_sort[k]] > 0 ) { - pulsesnum = GetScale_fx( band_width[k_sort[k]], Rk_fx[k_sort[k]] + delta_fx, &surplus_fx ); + pulsesnum = GetScale_fx( band_width[k_sort[k]], L_add( Rk_fx[k_sort[k]], delta_fx ), &surplus_fx ); decode_position_ari_fx( pardec_fx, band_width[k_sort[k]], pulsesnum, &nz, &positions_fx[band_start[k_sort[k]]] ); @@ -414,7 +436,7 @@ void tcq_core_LR_dec_fx( move16(); FOR( i = 0; i < band_width[k_sort[k]]; i++ ) { - inp_vector_fx[band_start[k_sort[k]] + i] = 0; + inp_vector_fx[add( band_start[k_sort[k]], i )] = 0; move16(); } } @@ -424,7 +446,7 @@ void tcq_core_LR_dec_fx( /* surplus distribution */ test(); - IF( surplus_fx > 0 && nzbands > 0 ) + IF( ( surplus_fx > 0 ) && ( nzbands > 0 ) ) { delta_fx = ar_div( surplus_fx, nzbands ); surplus_fx = L_sub( surplus_fx, delta_fx ); @@ -435,7 +457,7 @@ void tcq_core_LR_dec_fx( /* Load TCQ path from bitstream */ LoadTCQdata_fx( pardec_fx, dpath, lsbtcq_bits ); - TCQLSBdec_fx( dpath, mbuffer_fx, 2 * lsbtcq_bits ); + TCQLSBdec_fx( dpath, mbuffer_fx, i_mult( 2, lsbtcq_bits ) ); ar_decoder_done_fx( pardec_fx ); @@ -456,7 +478,7 @@ void tcq_core_LR_dec_fx( { test(); test(); - IF( Rk_fx[k_sort[k]] > 0 && k != k_num[0] && k != k_num[1] ) + IF( ( Rk_fx[k_sort[k]] > 0 ) && NE_16( k, k_num[0] ) && NE_16( k, k_num[1] ) ) { RestoreTCQdec_fx( &inp_vector_fx[band_start[k_sort[k]]], band_width[k_sort[k]], &bcount, mbuffer_fx ); } @@ -466,7 +488,7 @@ void tcq_core_LR_dec_fx( { test(); test(); - IF( Rk_fx[k_sort[k]] > 0 && ( k == k_num[0] || k == k_num[1] ) ) + IF( ( Rk_fx[k_sort[k]] > 0 ) && ( EQ_16( k, k_num[0] ) || EQ_16( k, k_num[1] ) ) ) { RestoreTCQdec_fx( &inp_vector_fx[band_start[k_sort[k]]], band_width[k_sort[k]], &bcount, mbuffer_fx ); } diff --git a/lib_dec/tcx_utils_dec_fx.c b/lib_dec/tcx_utils_dec_fx.c index be8d5237d..7eb2d7576 100644 --- a/lib_dec/tcx_utils_dec_fx.c +++ b/lib_dec/tcx_utils_dec_fx.c @@ -1,385 +1,399 @@ -/*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 - ====================================================================================*/ - - -#include -#include -#include -#include -#include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" -#include "rom_basop_util.h" -#include "basop_util.h" -#include "rom_com.h" - -/*--------------------------------------------------------------- - * tcx_decoder_memory_update() - * - * - *--------------------------------------------------------------*/ -void tcx_decoder_memory_update( - Word16 *xn_buf, /* i/o: mdct output buffer used also as temporary buffer */ - Word16 *synthout, /* o: synth */ - Word16 *A, /* i: Quantized LPC coefficients */ - Decoder_State *st, /* i/o: decoder memory state */ - Word8 fb /* i: fullband flag */ -) -{ - Word16 tmp; - Word16 *synth; - Word16 buf[1 + M + LFAC + L_FRAME_PLUS]; - Word16 L_frame_glob; - Word16 preemph; - - L_frame_glob = st->L_frame; - preemph = st->preemph_fac; - move16(); - - /* Output synth */ - Copy( xn_buf, synthout, L_frame_glob ); - - /* Update synth */ - - synth = buf + M + 1; - Copy( st->syn, buf, M + 1 ); - Copy( xn_buf, synth, L_frame_glob ); - Copy( synth + sub( L_frame_glob, M + 1 ), st->syn, M + 1 ); - -#ifndef FIX_778_STEREO_BRATE_SWITCHING - IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) -#endif - { - IF( !fb ) /* TV2FhG -> Condition differs from floating point */ - { - - /* Emphasis of synth -> synth_pe */ - tmp = synth[-M - 1]; - move16(); -#ifdef FIX_778_STEREO_BRATE_SWITCHING - IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) - { -#endif - st->Q_syn = E_UTIL_f_preemph3( synth - M, preemph, add( M, L_frame_glob ), &tmp, 1 ); - st->prev_Q_syn = st->Q_syn = st->Q_syn - 1; -#ifdef FIX_778_STEREO_BRATE_SWITCHING - } - ELSE - { - E_UTIL_f_preemph2( 2, synth - M, preemph, add( M, L_frame_glob ), &tmp ); - st->prev_Q_syn = st->Q_syn = 0; /* in case of MDCT, Q0 seems to be used*/ - } -#endif - Copy( synth + sub( L_frame_glob, M ), st->mem_syn2_fx, M ); - Copy( synth + sub( L_frame_glob, L_SYN_MEM ), st->mem_syn_r, L_SYN_MEM ); -#ifdef FIX_778_STEREO_BRATE_SWITCHING - IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) - { -#endif - test(); - IF( st->tcxonly == 0 || LE_16( L_frame_glob, L_FRAME16k ) ) - { - /* Update excitation */ - IF( NE_16( st->Q_syn + 1, st->Q_exc ) ) - { - Scale_sig( st->old_exc_fx, L_EXC_MEM_DEC, sub( st->Q_syn + 1, st->Q_exc ) ); - } - st->Q_exc = st->Q_syn + 1; - st->Q_subfr[0] = st->Q_subfr[1] = st->Q_subfr[2] = st->Q_subfr[3] = st->Q_subfr[4] = st->Q_exc; - - assert( L_frame_glob < L_EXC_MEM_DEC ); - Copy( st->old_exc_fx + L_frame_glob, st->old_exc_fx, sub( L_EXC_MEM_DEC, L_frame_glob ) ); - Residu3_fx( A, synth, st->old_exc_fx + sub( L_EXC_MEM_DEC, L_frame_glob ), L_frame_glob, 1 ); - } - /* Update old_Aq */ - Copy( A, st->old_Aq_12_8_fx, M + 1 ); -#ifdef FIX_778_STEREO_BRATE_SWITCHING - } -#endif - } - } - return; -} - -/* Returns: number of bits used (including "bits") */ -Word16 tcx_ari_res_invQ_spec( - Word32 x_Q[], /* i/o: quantized spectrum Q31-e */ - Word16 x_Q_e, /* i: quantized spectrum exponent Q0 */ - Word16 L_frame, /* i: number of lines Q0 */ - const Word16 prm[], /* i: bitstream Q0 */ - Word16 target_bits, /* i: number of bits available Q0 */ - Word16 bits, /* i: number of bits used so far Q0 */ - Word16 deadzone, /* i: quantizer deadzone Q15 */ - const Word16 x_fac[] /* i: spectrum post-quantization factors Q14 */ -) -{ - Word16 i, j, num_zeros; - Word16 zeros[L_FRAME_PLUS]; - Word16 fac_p, sign; - Word32 L_tmp; - Word16 s; - - - /* Limit the number of residual bits */ - target_bits = s_min( target_bits, NPRM_RESQ ); - - - /* Requantize the spectrum line-by-line */ - /* fac_m = deadzone * 0.5f; */ - num_zeros = 0; - move16(); - - FOR( i = 0; i < L_frame; i++ ) - { - IF( GE_16( bits, target_bits ) ) /* no bits left */ - { - BREAK; - } - - IF( x_Q[i] != 0 ) - { - sign = x_fac[i]; - move16(); - if ( x_Q[i] < 0 ) - sign = negate( sign ); - - /* x_Q[i] += sign*(prm[bits++] * 0.5f - fac_m); */ - x_Q[i] = L_sub( x_Q[i], L_shr( L_mult( sign, add( deadzone, lshl( prm[bits], 15 ) ) ), x_Q_e ) ); - move32(); - bits = add( bits, 1 ); - } - ELSE - { - zeros[num_zeros] = i; - move16(); - num_zeros = add( num_zeros, 1 ); - } - } - - /* Requantize zeroed-lines of the spectrum */ - fac_p = msu_r( 1417339264l /*0.33f*2.0f Q31*/, deadzone, 21627 /*0.33f*2.0f Q15*/ ); /* Q15 */ - target_bits = sub( target_bits, 1 ); /* reserve 1 bit for the check below */ - - s = sub( x_Q_e, 1 ); - FOR( j = 0; j < num_zeros; j++ ) - { - IF( GE_16( bits, target_bits ) ) /* 1 or 0 bits left */ - { - BREAK; - } - - i = zeros[j]; - move16(); - - IF( prm[bits] != 0 ) - { - bits = add( bits, 1 ); - L_tmp = L_mult( fac_p, x_fac[i] ); /* Q30 */ - if ( prm[bits] == 0 ) - L_tmp = L_negate( L_tmp ); - x_Q[i] = L_shr( L_tmp, s ); - move32(); - } - bits = add( bits, 1 ); - } - - - return bits; -} -/*--------------------------------------------------------------- - * tcx_res_invQ_gain() - * - * - *--------------------------------------------------------------*/ -Word16 tcx_res_invQ_gain( - Word16 *gain_tcx, - Word16 *gain_tcx_e, - Word16 *prm, - Word16 resQBits ) -{ - Word16 bits; - Word16 gain, tmp1, tmp2; - - - gain = *gain_tcx; - move16(); - - /* make sure we have a bit of headroom */ - IF( GT_16( gain, 0x7000 ) ) - { - gain = shr( gain, 1 ); - *gain_tcx_e = add( *gain_tcx_e, 1 ); - move16(); - } - - /*Refine the gain quantization*/ - tmp1 = s_min( resQBits, TCX_RES_Q_BITS_GAIN ); - FOR( bits = 0; bits < tmp1; bits++ ) - { - tmp2 = gain_corr_fac[bits]; - move16(); - if ( prm[bits] == 0 ) - { - tmp2 = gain_corr_inv_fac[bits]; - move16(); - } - - gain = mult_r( gain, tmp2 ); - if ( prm[bits] != 0 ) - gain = shl( gain, 1 ); - } - - *gain_tcx = gain; - move16(); - - - return bits; -} - -/*--------------------------------------------------------------- - * tcx_res_invQ_spec() - * - * - *--------------------------------------------------------------*/ -Word16 tcx_res_invQ_spec( - Word32 *x, - Word16 x_e, - Word16 L_frame, - Word16 *prm, - Word16 resQBits, - Word16 bits, - Word16 sq_round, - const Word16 lf_deemph_factors[] ) -{ - Word16 i; - Word16 fac_m, fac_p; - Word16 lf_deemph_factor, c, s; - Word32 tmp; - - - /* Limit the number of residual bits */ - resQBits = s_min( resQBits, NPRM_RESQ ); - - /* Requantize the spectrum line-by-line */ - fac_m = shr( sq_round, 1 ); - fac_p = sub( 0x4000, fac_m ); - - lf_deemph_factor = 0x4000; - move16(); - s = sub( x_e, 1 ); - - FOR( i = 0; i < L_frame; i++ ) - { - IF( GE_16( bits, resQBits ) ) - { - BREAK; - } - - test(); - test(); - IF( ( x[i] != 0 ) && ( ( lf_deemph_factors == NULL ) || ( GT_16( lf_deemph_factors[i], 0x2000 ) ) ) ) - { - if ( lf_deemph_factors != NULL ) - { - lf_deemph_factor = lf_deemph_factors[i]; - move16(); - } - - IF( prm[bits] == 0 ) - { - - /* Debug initialization to catch illegal cases of x[i] */ - tmp = 0; - - if ( x[i] > 0 ) - tmp = L_mult( fac_m, lf_deemph_factor ); - if ( x[i] < 0 ) - tmp = L_mult( fac_p, lf_deemph_factor ); - - assert( tmp != 0 ); - - x[i] = L_sub( x[i], L_shr( tmp, s ) ); - move32(); - } - ELSE - { - - /* Debug initialization to catch illegal cases of x[i] */ - tmp = 0; - - if ( x[i] > 0 ) - tmp = L_mult( fac_p, lf_deemph_factor ); - if ( x[i] < 0 ) - tmp = L_mult( fac_m, lf_deemph_factor ); - - assert( tmp != 0 ); - - x[i] = L_add( x[i], L_shr( tmp, s ) ); - move32(); - } - bits = add( bits, 1 ); - } - } - - /*Quantize zeroed-line of the spectrum*/ - resQBits = sub( resQBits, 1 ); - - IF( lf_deemph_factors == NULL ) - { - FOR( i = 0; i < L_frame; i++ ) - { - IF( GE_16( bits, resQBits ) ) - { - BREAK; - } - - IF( x[i] == 0 ) - { - IF( prm[bits] != 0 ) - { - bits = add( bits, 1 ); - - tmp = L_mult( 21627 /*1.32f Q14*/, fac_p ); - if ( prm[bits] == 0 ) - tmp = L_negate( tmp ); - - x[i] = L_shr( tmp, s ); - move32(); - } - bits = add( bits, 1 ); - } - } - } - ELSE - { - c = sub( 21627 /*0.66f Q15*/, mult_r( sq_round, 21627 /*0.66f Q15*/ ) ); - - FOR( i = 0; i < L_frame; i++ ) - { - IF( GE_16( bits, resQBits ) ) - { - BREAK; - } - - test(); - IF( ( x[i] == 0 ) && ( GT_16( lf_deemph_factors[i], 0x2000 ) ) ) - { - IF( prm[bits] != 0 ) - { - bits = add( bits, 1 ); - - tmp = L_mult( c, lf_deemph_factors[i] ); - if ( prm[bits] == 0 ) - tmp = L_negate( tmp ); - - x[i] = L_shr( tmp, s ); - move32(); - } - bits = add( bits, 1 ); - } - } - } - - return bits; -} +/*==================================================================================== + EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + ====================================================================================*/ + + +#include +#include +#include +#include +#include "options.h" +#include "prot_fx1.h" +#include "prot_fx2.h" +#include "rom_basop_util.h" +#include "basop_util.h" +#include "rom_com.h" + +/*--------------------------------------------------------------- + * tcx_decoder_memory_update() + * + * + *--------------------------------------------------------------*/ +void tcx_decoder_memory_update( + Word16 *xn_buf, /* i/o: mdct output buffer used also as temporary buffer */ + Word16 *synthout, /* o: synth */ + Word16 *A, /* i: Quantized LPC coefficients */ + Decoder_State *st, /* i/o: decoder memory state */ + Word8 fb /* i: fullband flag */ +) +{ + Word16 tmp; + Word16 *synth; + Word16 buf[1 + M + LFAC + L_FRAME_PLUS]; + Word16 L_frame_glob; + Word16 preemph; + + L_frame_glob = st->L_frame; + move16(); + preemph = st->preemph_fac; + move16(); + + /* Output synth */ + Copy( xn_buf, synthout, L_frame_glob ); + + /* Update synth */ + + synth = buf + M + 1; + Copy( st->syn, buf, M + 1 ); + Copy( xn_buf, synth, L_frame_glob ); + Copy( synth + sub( L_frame_glob, M + 1 ), st->syn, M + 1 ); + +#ifndef FIX_778_STEREO_BRATE_SWITCHING + IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) +#endif + { + IF( !fb ) /* TV2FhG -> Condition differs from floating point */ + { + + /* Emphasis of synth -> synth_pe */ + tmp = synth[-M - 1]; + move16(); +#ifdef FIX_778_STEREO_BRATE_SWITCHING + IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) + { +#endif + st->Q_syn = E_UTIL_f_preemph3( synth - M, preemph, add( M, L_frame_glob ), &tmp, 1 ); + move16(); + st->prev_Q_syn = st->Q_syn = sub( st->Q_syn, 1 ); + move16(); + move16(); +#ifdef FIX_778_STEREO_BRATE_SWITCHING + } + ELSE + { + E_UTIL_f_preemph2( 2, synth - M, preemph, add( M, L_frame_glob ), &tmp ); + st->prev_Q_syn = st->Q_syn = 0; /* in case of MDCT, Q0 seems to be used*/ + move16(); + move16(); + } +#endif + Copy( synth + sub( L_frame_glob, M ), st->mem_syn2_fx, M ); + Copy( synth + sub( L_frame_glob, L_SYN_MEM ), st->mem_syn_r, L_SYN_MEM ); +#ifdef FIX_778_STEREO_BRATE_SWITCHING + IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) + { +#endif + test(); + IF( ( st->tcxonly == 0 ) || LE_16( L_frame_glob, L_FRAME16k ) ) + { + /* Update excitation */ + IF( NE_16( add( st->Q_syn, 1 ), st->Q_exc ) ) + { + Scale_sig( st->old_exc_fx, L_EXC_MEM_DEC, sub( add( st->Q_syn, 1 ), st->Q_exc ) ); + } + st->Q_exc = add( st->Q_syn, 1 ); + move16(); + st->Q_subfr[0] = st->Q_subfr[1] = st->Q_subfr[2] = st->Q_subfr[3] = st->Q_subfr[4] = st->Q_exc; + move16(); + move16(); + move16(); + move16(); + move16(); + + assert( L_frame_glob < L_EXC_MEM_DEC ); + Copy( st->old_exc_fx + L_frame_glob, st->old_exc_fx, sub( L_EXC_MEM_DEC, L_frame_glob ) ); + Residu3_fx( A, synth, st->old_exc_fx + sub( L_EXC_MEM_DEC, L_frame_glob ), L_frame_glob, 1 ); + } + /* Update old_Aq */ + Copy( A, st->old_Aq_12_8_fx, M + 1 ); +#ifdef FIX_778_STEREO_BRATE_SWITCHING + } +#endif + } + } + return; +} + +/* Returns: number of bits used (including "bits") */ +Word16 tcx_ari_res_invQ_spec( + Word32 x_Q[], /* i/o: quantized spectrum Q31-e */ + Word16 x_Q_e, /* i: quantized spectrum exponent Q0 */ + Word16 L_frame, /* i: number of lines Q0 */ + const Word16 prm[], /* i: bitstream Q0 */ + Word16 target_bits, /* i: number of bits available Q0 */ + Word16 bits, /* i: number of bits used so far Q0 */ + Word16 deadzone, /* i: quantizer deadzone Q15 */ + const Word16 x_fac[] /* i: spectrum post-quantization factors Q14 */ +) +{ + Word16 i, j, num_zeros; + Word16 zeros[L_FRAME_PLUS]; + Word16 fac_p, sign; + Word32 L_tmp; + Word16 s; + + + /* Limit the number of residual bits */ + target_bits = s_min( target_bits, NPRM_RESQ ); + + + /* Requantize the spectrum line-by-line */ + /* fac_m = deadzone * 0.5f; */ + num_zeros = 0; + move16(); + + FOR( i = 0; i < L_frame; i++ ) + { + IF( GE_16( bits, target_bits ) ) /* no bits left */ + { + BREAK; + } + + IF( x_Q[i] != 0 ) + { + sign = x_fac[i]; + move16(); + if ( x_Q[i] < 0 ) + sign = negate( sign ); + + /* x_Q[i] += sign*(prm[bits++] * 0.5f - fac_m); */ + x_Q[i] = L_sub( x_Q[i], L_shr( L_mult( sign, add( deadzone, lshl( prm[bits], 15 ) ) ), x_Q_e ) ); + move32(); + bits = add( bits, 1 ); + } + ELSE + { + zeros[num_zeros] = i; + move16(); + num_zeros = add( num_zeros, 1 ); + } + } + + /* Requantize zeroed-lines of the spectrum */ + fac_p = msu_r( 1417339264l /*0.33f*2.0f Q31*/, deadzone, 21627 /*0.33f*2.0f Q15*/ ); /* Q15 */ + target_bits = sub( target_bits, 1 ); /* reserve 1 bit for the check below */ + + s = sub( x_Q_e, 1 ); + FOR( j = 0; j < num_zeros; j++ ) + { + IF( GE_16( bits, target_bits ) ) /* 1 or 0 bits left */ + { + BREAK; + } + + i = zeros[j]; + move16(); + + IF( prm[bits] != 0 ) + { + bits = add( bits, 1 ); + L_tmp = L_mult( fac_p, x_fac[i] ); /* Q30 */ + if ( prm[bits] == 0 ) + L_tmp = L_negate( L_tmp ); + x_Q[i] = L_shr( L_tmp, s ); + move32(); + } + bits = add( bits, 1 ); + } + + + return bits; +} +/*--------------------------------------------------------------- + * tcx_res_invQ_gain() + * + * + *--------------------------------------------------------------*/ +Word16 tcx_res_invQ_gain( + Word16 *gain_tcx, + Word16 *gain_tcx_e, + Word16 *prm, + Word16 resQBits ) +{ + Word16 bits; + Word16 gain, tmp1, tmp2; + + + gain = *gain_tcx; + move16(); + + /* make sure we have a bit of headroom */ + IF( GT_16( gain, 0x7000 ) ) + { + gain = shr( gain, 1 ); + *gain_tcx_e = add( *gain_tcx_e, 1 ); + move16(); + } + + /*Refine the gain quantization*/ + tmp1 = s_min( resQBits, TCX_RES_Q_BITS_GAIN ); + FOR( bits = 0; bits < tmp1; bits++ ) + { + tmp2 = gain_corr_fac[bits]; + move16(); + if ( prm[bits] == 0 ) + { + tmp2 = gain_corr_inv_fac[bits]; + move16(); + } + + gain = mult_r( gain, tmp2 ); + if ( prm[bits] != 0 ) + gain = shl( gain, 1 ); + } + + *gain_tcx = gain; + move16(); + + + return bits; +} + +/*--------------------------------------------------------------- + * tcx_res_invQ_spec() + * + * + *--------------------------------------------------------------*/ +Word16 tcx_res_invQ_spec( + Word32 *x, + Word16 x_e, + Word16 L_frame, + Word16 *prm, + Word16 resQBits, + Word16 bits, + Word16 sq_round, + const Word16 lf_deemph_factors[] ) +{ + Word16 i; + Word16 fac_m, fac_p; + Word16 lf_deemph_factor, c, s; + Word32 tmp; + + + /* Limit the number of residual bits */ + resQBits = s_min( resQBits, NPRM_RESQ ); + + /* Requantize the spectrum line-by-line */ + fac_m = shr( sq_round, 1 ); + fac_p = sub( 0x4000, fac_m ); + + lf_deemph_factor = 0x4000; + move16(); + s = sub( x_e, 1 ); + + FOR( i = 0; i < L_frame; i++ ) + { + IF( GE_16( bits, resQBits ) ) + { + BREAK; + } + + test(); + test(); + IF( ( x[i] != 0 ) && ( ( lf_deemph_factors == NULL ) || ( GT_16( lf_deemph_factors[i], 0x2000 ) ) ) ) + { + if ( lf_deemph_factors != NULL ) + { + lf_deemph_factor = lf_deemph_factors[i]; + move16(); + } + + IF( prm[bits] == 0 ) + { + + /* Debug initialization to catch illegal cases of x[i] */ + tmp = 0; + move32(); + + if ( x[i] > 0 ) + tmp = L_mult( fac_m, lf_deemph_factor ); + if ( x[i] < 0 ) + tmp = L_mult( fac_p, lf_deemph_factor ); + + assert( tmp != 0 ); + + x[i] = L_sub( x[i], L_shr( tmp, s ) ); + move32(); + } + ELSE + { + + /* Debug initialization to catch illegal cases of x[i] */ + tmp = 0; + move32(); + + if ( x[i] > 0 ) + tmp = L_mult( fac_p, lf_deemph_factor ); + if ( x[i] < 0 ) + tmp = L_mult( fac_m, lf_deemph_factor ); + + assert( tmp != 0 ); + + x[i] = L_add( x[i], L_shr( tmp, s ) ); + move32(); + } + bits = add( bits, 1 ); + } + } + + /*Quantize zeroed-line of the spectrum*/ + resQBits = sub( resQBits, 1 ); + + IF( lf_deemph_factors == NULL ) + { + FOR( i = 0; i < L_frame; i++ ) + { + IF( GE_16( bits, resQBits ) ) + { + BREAK; + } + + IF( x[i] == 0 ) + { + IF( prm[bits] != 0 ) + { + bits = add( bits, 1 ); + + tmp = L_mult( 21627 /*1.32f Q14*/, fac_p ); + if ( prm[bits] == 0 ) + tmp = L_negate( tmp ); + + x[i] = L_shr( tmp, s ); + move32(); + } + bits = add( bits, 1 ); + } + } + } + ELSE + { + c = sub( 21627 /*0.66f Q15*/, mult_r( sq_round, 21627 /*0.66f Q15*/ ) ); + + FOR( i = 0; i < L_frame; i++ ) + { + IF( GE_16( bits, resQBits ) ) + { + BREAK; + } + + test(); + IF( ( x[i] == 0 ) && ( GT_16( lf_deemph_factors[i], 0x2000 ) ) ) + { + IF( prm[bits] != 0 ) + { + bits = add( bits, 1 ); + + tmp = L_mult( c, lf_deemph_factors[i] ); + if ( prm[bits] == 0 ) + tmp = L_negate( tmp ); + + x[i] = L_shr( tmp, s ); + move32(); + } + bits = add( bits, 1 ); + } + } + } + + return bits; +} -- GitLab From cf42e101851305e8f872a636e6e4bb8fb3d8800f Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 1 Jul 2024 11:23:45 +0530 Subject: [PATCH 015/110] Integration of common fixed point functions in encoder [x] Following functions have been integrated: ivas_get_horidac_flag ivas_dirac_config_bands ivas_dirac_config ivas_dirac_sba_config ivas_get_dirac_sba_mx_md_bits --- lib_com/ivas_cov_smooth.c | 75 +++++++++ lib_com/ivas_dirac_com.c | 48 +++--- lib_dec/ivas_dirac_dec.c | 2 +- lib_dec/ivas_init_dec.c | 14 +- lib_dec/ivas_sba_dec.c | 18 ++- lib_dec/ivas_spar_md_dec.c | 2 +- lib_enc/ivas_dirac_enc.c | 161 +++++++++++++++++++ lib_enc/ivas_spar_encoder.c | 299 ++++++++++++++++++++++++++++++++++++ 8 files changed, 581 insertions(+), 38 deletions(-) diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index 2f9a462e8..6a762cb95 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -274,6 +274,7 @@ static void ivas_set_up_cov_smoothing( * Allocate and initialize SPAR Covar. smoothing handle *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED ivas_error ivas_spar_covar_smooth_enc_open( ivas_cov_smooth_state_t **hCovState_out, /* i/o: SPAR Covar. smoothing handle */ const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ @@ -332,7 +333,48 @@ ivas_error ivas_spar_covar_smooth_enc_open( return IVAS_ERR_OK; } +#else +ivas_error ivas_spar_covar_smooth_enc_open( + ivas_cov_smooth_state_t **hCovState_out, /* i/o: SPAR Covar. smoothing handle */ + const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ + ivas_filterbank_t *pFb, /* i/o: FB handle */ + const int16_t nchan_inp, /* i : number of input channels */ + const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + ivas_cov_smooth_state_t *hCovState; + int16_t i, j; + + if ( ( hCovState = (ivas_cov_smooth_state_t *) malloc( sizeof( ivas_cov_smooth_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder" ); + } + + if ( ( hCovState->pSmoothing_factor = (float *) malloc( sizeof( float ) * cov_smooth_cfg->max_bands ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder" ); + } + for ( i = 0; i < nchan_inp; i++ ) + { + for ( j = 0; j < nchan_inp; j++ ) + { + if ( ( hCovState->pPrior_cov_real[i][j] = (float *) malloc( sizeof( float ) * cov_smooth_cfg->max_bands ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder" ); + } + set_zero( hCovState->pPrior_cov_real[i][j], cov_smooth_cfg->max_bands ); + } + } + + ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, smooth_mode, ivas_total_brate ); + + *hCovState_out = hCovState; + + return IVAS_ERR_OK; +} +#endif /*------------------------------------------------------------------------- * ivas_spar_covar_smooth_enc_close() @@ -340,6 +382,7 @@ ivas_error ivas_spar_covar_smooth_enc_open( * Deallocate SPAR Covar. smoothing handle *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED void ivas_spar_covar_smooth_enc_close( ivas_cov_smooth_state_t **hCovState_out, /* i/o: SPAR Covar. smoothing handle */ const int16_t nchan_inp /* i : number of input channels */ @@ -379,6 +422,38 @@ void ivas_spar_covar_smooth_enc_close( return; } +#else +void ivas_spar_covar_smooth_enc_close( + ivas_cov_smooth_state_t **hCovState_out, /* i/o: SPAR Covar. smoothing handle */ + const int16_t nchan_inp /* i : number of input channels */ +) +{ + ivas_cov_smooth_state_t *hCovState; + int16_t i, j; + + hCovState = *hCovState_out; + + if ( hCovState != NULL ) + { + free( hCovState->pSmoothing_factor ); + hCovState->pSmoothing_factor = NULL; + + for ( i = 0; i < nchan_inp; i++ ) + { + for ( j = 0; j < nchan_inp; j++ ) + { + free( hCovState->pPrior_cov_real[i][j] ); + hCovState->pPrior_cov_real[i][j] = NULL; + } + } + + free( hCovState ); + hCovState_out = NULL; + } + + return; +} +#endif #ifdef IVAS_FLOAT_FIXED diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index b87592d22..3b70fd7df 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -61,38 +61,38 @@ static UWord16 deindex_sph_idx_general_fx( const Word16 idx_sph, const Word16 no *------------------------------------------------------------------------*/ /*! r: HO-DirAC flag */ -int16_t ivas_get_hodirac_flag( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const int16_t sba_order /* i : Ambisonic (SBA) order */ +#ifdef IVAS_FLOAT_FIXED +Word16 ivas_get_hodirac_flag_fx( + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 sba_order /* i : Ambisonic (SBA) order */ ) { - if ( sba_order > 1 && ivas_total_brate > IVAS_256k ) + IF( GT_16( sba_order, 1 ) && GT_32( ivas_total_brate, IVAS_256k ) ) { return 1; } - else + ELSE { return 0; } } +#endif -#ifdef IVAS_FLOAT_FIXED -Word16 ivas_get_hodirac_flag_fx( - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word16 sba_order /* i : Ambisonic (SBA) order */ +int16_t ivas_get_hodirac_flag( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ ) { - IF( GT_16( sba_order, 1 ) && GT_32( ivas_total_brate, IVAS_256k ) ) + if ( sba_order > 1 && ivas_total_brate > IVAS_256k ) { return 1; } - ELSE + else { return 0; } } -#endif /*------------------------------------------------------------------------- * ivas_dirac_sba_config() * @@ -169,7 +169,7 @@ ivas_error ivas_dirac_config_fx( spar_dirac_split_band = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); - IF( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) ) // add call after merge of 100861_dirac_dec + IF( ivas_get_hodirac_flag_fx( ivas_total_brate, sba_order ) ) // add call after merge of 100861_dirac_dec { spar_dirac_split_band = 0; } @@ -204,7 +204,7 @@ ivas_error ivas_dirac_config_fx( hConfig->enc_param_start_band = spar_dirac_split_band; } - IF( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) ) + IF( ivas_get_hodirac_flag_fx( ivas_total_brate, sba_order ) ) { hConfig->dec_param_estim = FALSE; hConfig->enc_param_start_band = 0; @@ -217,17 +217,16 @@ ivas_error ivas_dirac_config_fx( IF( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) { // 100861_dirac_dec - ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); + ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); } ELSE { - ivas_dirac_config_bands( band_grouping, hConfig->nbands, (Word16) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), NULL, 0, 0, hFbMdft ); + ivas_dirac_config_bands_fx( band_grouping, hConfig->nbands, (Word16) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), NULL, 0, 0, hFbMdft ); } return error; } -#endif - +#else ivas_error ivas_dirac_config( void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ const int16_t enc_dec /* i : encoder or decoder flag */ @@ -354,6 +353,7 @@ ivas_error ivas_dirac_config( return error; } +#endif /*------------------------------------------------------------------------- @@ -362,6 +362,7 @@ ivas_error ivas_dirac_config( * DirAC Configuration freq. band function; used also in MASA decoder *------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ivas_dirac_config_bands( int16_t *band_grouping, /* o : band grouping */ const int16_t nbands, /* i : number of bands */ @@ -458,8 +459,7 @@ void ivas_dirac_config_bands( return; } - -#ifdef IVAS_FLOAT_FIXED +#else void ivas_dirac_config_bands_fx( Word16 *band_grouping, /* o : band grouping */ const Word16 nbands, /* i : number of bands */ @@ -673,8 +673,7 @@ void ivas_get_dirac_sba_max_md_bits_fx( return; } -#endif - +#else void ivas_get_dirac_sba_max_md_bits( const int32_t sba_total_brate, int16_t *bits_frame_nominal, @@ -743,6 +742,7 @@ void ivas_get_dirac_sba_max_md_bits( return; } +#endif /*------------------------------------------------------------------------- * ivas_dirac_sba_config() @@ -832,8 +832,7 @@ ivas_error ivas_dirac_sba_config_fx( return error; } -#endif - +#else ivas_error ivas_dirac_sba_config( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ int16_t *element_mode, /* i/o: element mode of the core coder */ @@ -908,6 +907,7 @@ ivas_error ivas_dirac_sba_config( return error; } +#endif #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index c5c65c8d1..f94faadc5 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -107,7 +107,7 @@ static ivas_error ivas_dirac_dec_config_internal_fx( * DirAC main configuration *-----------------------------------------------------------------*/ - IF( NE_32( ( error = ivas_dirac_config( (void *) st_ivas, DEC ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_config_fx( (void *) st_ivas, DEC ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 294a97bf5..f223ffd6c 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2054,7 +2054,7 @@ ivas_error ivas_init_decoder_fx( } } - Word16 hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); + Word16 hodirac_flag = ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ); IF( hodirac_flag ) { IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, IVAS_MAX_NUM_BANDS, st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) @@ -2089,7 +2089,7 @@ ivas_error ivas_init_decoder_fx( st_ivas->hSpar->enc_param_start_band = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); move16(); - IF( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ) + IF( ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ) { st_ivas->hSpar->enc_param_start_band = 0; move16(); @@ -2245,17 +2245,17 @@ ivas_error ivas_init_decoder_fx( } } - Word16 hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); + Word16 hodirac_flag = ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ); IF( hodirac_flag ) { - IF( NE_32( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, IVAS_MAX_NUM_BANDS, st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, IVAS_MAX_NUM_BANDS, st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) { return error; } } ELSE { - IF( NE_32( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) { return error; } @@ -2280,7 +2280,7 @@ ivas_error ivas_init_decoder_fx( Word16 band_grouping[IVAS_MAX_NUM_BANDS + 1]; st_ivas->hSpar->enc_param_start_band = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); - IF( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ) + IF( ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ) { st_ivas->hSpar->enc_param_start_band = 0; move16(); @@ -2289,7 +2289,7 @@ ivas_error ivas_init_decoder_fx( move16(); } - ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), + ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 2d985870b..c060d0774 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -432,11 +432,19 @@ ivas_error ivas_sba_dec_reconfigure( ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); } +#ifdef IVAS_FLOAT_FIXED + if ( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), + st_ivas->ivas_format ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ) != IVAS_ERR_OK ) { return error; } +#endif if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( ( hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_MONO ) ) ) { @@ -462,7 +470,7 @@ ivas_error ivas_sba_dec_reconfigure( int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1]; st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); - if ( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ) + if ( ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ) { st_ivas->hSpar->enc_param_start_band = 0; @@ -470,8 +478,8 @@ ivas_error ivas_sba_dec_reconfigure( st_ivas->hQMetaData->numTwoDirBands = (uint8_t) st_ivas->hQMetaData->q_direction[0].cfg.nbands; } - ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), - st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); if ( st_ivas->hDirAC ) { @@ -1084,7 +1092,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); } - if ( NE_32( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), + if ( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) { @@ -1122,7 +1130,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( move16(); } - ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( L_add( st_ivas->hDecoderConfig->output_Fs, 400 ) / CLDFB_BANDWIDTH ), + ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( L_add( st_ivas->hDecoderConfig->output_Fs, 400 ) / CLDFB_BANDWIDTH ), st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); if ( st_ivas->hDirAC ) diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 0bc16f201..4d5d54195 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -4914,7 +4914,7 @@ void ivas_spar_to_dirac_fx( enc_param_start_band = st_ivas->hSpar->enc_param_start_band / bw; active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; - if ( hDirAC != NULL && ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) == 0 ) + if ( hDirAC != NULL && ivas_get_hodirac_flag_fx( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) == 0 ) { band_grouping = hDirAC->band_grouping; num_slots_in_subfr = st_ivas->hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 6f58a2501..bd7b63a4c 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -57,6 +57,7 @@ static void computeIntensityVector_enc( DIRAC_ENC_HANDLE hDirAC, float Cldfb_Rea * Initialize DirAC handle *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED ivas_error ivas_dirac_enc_open( Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ) @@ -90,10 +91,17 @@ ivas_error ivas_dirac_enc_open( st_ivas->hDirAC = hDirAC; +#ifdef IVAS_FLOAT_FIXED + IF( ( error = ivas_dirac_config_fx( (void *) st_ivas, ENC ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = ivas_dirac_config( (void *) st_ivas, ENC ) ) != IVAS_ERR_OK ) { return error; } +#endif /* set FB config. */ hDirAC->hFbMixer = NULL; @@ -166,6 +174,117 @@ ivas_error ivas_dirac_enc_open( return error; } +#else +ivas_error ivas_dirac_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +) +{ + int16_t i, j; + DIRAC_ENC_HANDLE hDirAC; + int32_t dirac_slot_ns; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( hDirAC = (DIRAC_ENC_HANDLE) malloc( sizeof( DIRAC_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->hConfig = (DIRAC_CONFIG_DATA_HANDLE) malloc( sizeof( DIRAC_CONFIG_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC Config\n" ) ); + } + hDirAC->firstrun_sector_params = 1; + set_zero( hDirAC->sec_I_vec_smth_x[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->sec_I_vec_smth_y[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->sec_I_vec_smth_z[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->azi_prev, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->ele_prev, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->energy_smth[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + /*-----------------------------------------------------------------* + * DirAC main configuration + *-----------------------------------------------------------------*/ + + st_ivas->hDirAC = hDirAC; + + if ( ( error = ivas_dirac_config( (void *) st_ivas, ENC ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* set FB config. */ + hDirAC->hFbMixer = NULL; + + for ( i = 0; i < DIRAC_MAX_NBANDS + 1; i++ ) + { + /* adapt band grouping to from CLDFB to MDFT bands */ + hDirAC->band_grouping[i] *= CLDFB_TO_MDFT_FAC; + } + dirac_slot_ns = DIRAC_SLOT_ENC_NS; + + /* initialize delay for SPAR/DirAC delay synchronization */ + + /* intensity 3-dim */ + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + if ( ( hDirAC->direction_vector_m[i] = (float **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + if ( ( hDirAC->direction_vector_m[i][j] = (float *) malloc( DIRAC_MAX_NBANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->direction_vector_m[i][j], 0.0f, DIRAC_MAX_NBANDS ); + } + } + + hDirAC->no_col_avg_diff = (int16_t) ( DIRAC_NO_COL_AVG_DIFF_NS / dirac_slot_ns ); + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + if ( ( hDirAC->buffer_intensity_real[i] = (float **) malloc( hDirAC->no_col_avg_diff * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + for ( j = 0; j < hDirAC->no_col_avg_diff; j++ ) + { + if ( ( hDirAC->buffer_intensity_real[i][j] = (float *) malloc( DIRAC_MAX_NBANDS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->buffer_intensity_real[i][j], 0.0f, DIRAC_MAX_NBANDS ); + } + } + + if ( ( hDirAC->buffer_energy = (float *) malloc( DIRAC_MAX_NBANDS * hDirAC->no_col_avg_diff * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->buffer_energy, 0.0f, DIRAC_MAX_NBANDS * hDirAC->no_col_avg_diff ); + + if ( st_ivas->hQMetaData->useLowerRes ) + { + hDirAC->block_grouping[0] = 0; + hDirAC->block_grouping[1] = MAX_PARAM_SPATIAL_SUBFRAMES; + } + else + { + mvs2s( DirAC_block_grouping_5ms_MDFT, hDirAC->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + } + + hDirAC->index_buffer_intensity = 0; + hDirAC->mono_frame_count = 0; + + st_ivas->hDirAC = hDirAC; + st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + + return error; +} +#endif /*------------------------------------------------------------------------- @@ -174,6 +293,7 @@ ivas_error ivas_dirac_enc_open( * Reconfigure DirAC handle *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED ivas_error ivas_dirac_enc_reconfigure( Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ) @@ -189,10 +309,17 @@ ivas_error ivas_dirac_enc_reconfigure( * DirAC main configuration *-----------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED + IF( ( error = ivas_dirac_config_fx( (void *) st_ivas, ENC ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = ivas_dirac_config( (void *) st_ivas, ENC ) ) != IVAS_ERR_OK ) { return error; } +#endif if ( st_ivas->hQMetaData->useLowerRes ) { @@ -206,6 +333,40 @@ ivas_error ivas_dirac_enc_reconfigure( return error; } +#else +ivas_error ivas_dirac_enc_reconfigure( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +) +{ + DIRAC_ENC_HANDLE hDirAC; + ivas_error error; + + error = IVAS_ERR_OK; + + hDirAC = st_ivas->hDirAC; + + /*-----------------------------------------------------------------* + * DirAC main configuration + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_dirac_config( (void *) st_ivas, ENC ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hQMetaData->useLowerRes ) + { + hDirAC->block_grouping[0] = 0; + hDirAC->block_grouping[1] = MAX_PARAM_SPATIAL_SUBFRAMES; + } + else + { + mvs2s( DirAC_block_grouping_5ms_MDFT, hDirAC->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + } + + return error; +} +#endif /*------------------------------------------------------------------------- diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 0352d0fc9..75c174481 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -771,6 +771,7 @@ static ivas_error ivas_spar_cov_md_process( * Process call for SPAR encoder *-----------------------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED static ivas_error ivas_spar_enc_process( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ @@ -922,7 +923,11 @@ static ivas_error ivas_spar_enc_process( * DirAC encoding *-----------------------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED + hodirac_flag = ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ); +#else hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); +#endif if ( ( error = ivas_dirac_enc( st_ivas->hDirAC, hQMetaData, hMetaData, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, dtx_vad, hEncoderConfig->ivas_format, hodirac_flag ) ) != IVAS_ERR_OK ) { @@ -1100,3 +1105,297 @@ static ivas_error ivas_spar_enc_process( return error; } +#else +static ivas_error ivas_spar_enc_process( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ + const int16_t front_vad_flag, /* i : front-VAD decision */ + float *data_f[] /* i/o: input/transport audio channels */ +) +{ + float pcm_tmp[DIRAC_MAX_ANA_CHANS][L_FRAME48k * 2]; + float *p_pcm_tmp[DIRAC_MAX_ANA_CHANS]; +#ifdef IVAS_FLOAT_FIXED + Word32 pcm_tmp_fx[DIRAC_MAX_ANA_CHANS][L_FRAME48k * 2]; + Word32 *p_pcm_tmp_fx[DIRAC_MAX_ANA_CHANS]; + // Word16 q_pcm_tmp_fx[DIRAC_MAX_ANA_CHANS][L_FRAME48k * 2]; + // Word16 *q_p_pcm_tmp_fx[DIRAC_MAX_ANA_CHANS]; + Word16 q_pcm_fx[DIRAC_MAX_ANA_CHANS]; +#endif + int16_t i, j, input_frame, dtx_vad; + int16_t transient_det[2]; + int16_t hodirac_flag; + int32_t ivas_total_brate, input_Fs; + int16_t nchan_inp, sba_order, nchan_transport; + int16_t in_out_mixer_map[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH]; + ivas_error error; + const int16_t *order; + SPAR_ENC_HANDLE hSpar = st_ivas->hSpar; + IVAS_QMETADATA_HANDLE hQMetaData = st_ivas->hQMetaData; + int16_t ts, l_ts, num_del_samples, b, i_ts; + + float *ppIn_FR_real[IVAS_SPAR_MAX_CH], *ppIn_FR_imag[IVAS_SPAR_MAX_CH]; + float wyzx_del_buf[FOA_CHANNELS][IVAS_FB_1MS_48K_SAMP]; + int16_t dyn_active_w_flag; + int16_t nchan_fb_in; + + push_wmops( "ivas_spar_enc_process" ); + + /*-----------------------------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------------------------------*/ + + error = IVAS_ERR_OK; + + input_Fs = hEncoderConfig->input_Fs; + ivas_total_brate = hEncoderConfig->ivas_total_brate; + num_del_samples = hSpar->hFbMixer->fb_cfg->fb_latency; + + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + nchan_inp = ivas_sba_get_nchan_metadata( sba_order, hEncoderConfig->ivas_total_brate ); + assert( nchan_inp <= hEncoderConfig->nchan_inp ); + + nchan_fb_in = hSpar->hFbMixer->fb_cfg->nchan_fb_in; + nchan_transport = st_ivas->nchan_transport; + + for ( i = FOA_CHANNELS + 1; i < nchan_fb_in; i++ ) + { + mvr2r( data_f[HOA_keep_ind[i]], data_f[i], input_frame ); + } + + /*-----------------------------------------------------------------------------------------* + * Transient detector + *-----------------------------------------------------------------------------------------*/ + ivas_transient_det_process( hSpar->hTranDet, data_f[0], input_frame, transient_det ); +#ifdef DUMPS_ENABLED + float a[2]; + a[0] = transient_det[0]; + a[1] = transient_det[1]; + dbgwrite_txt( a, 2, "fixed.txt", NULL ); +#endif + if ( ivas_total_brate < IVAS_24k4 ) + { + transient_det[1] = 0; + } + + /* store previous input samples for W in local buffer */ + assert( num_del_samples <= IVAS_FB_1MS_48K_SAMP ); + if ( hSpar->hFbMixer->fb_cfg->active_w_mixing == 0 ) + { + /* fill delay (1 ms) buffer for all Transport channels */ + for ( i = 0; i < FOA_CHANNELS; i++ ) + { + int16_t idx = hSpar->hFbMixer->fb_cfg->remix_order[i]; + mvr2r( &hSpar->hFbMixer->ppFilterbank_prior_input[idx][hSpar->hFbMixer->fb_cfg->prior_input_length - num_del_samples], wyzx_del_buf[idx], num_del_samples ); + } + } + + /*-----------------------------------------------------------------------------------------* + * FB mixer ingest + *-----------------------------------------------------------------------------------------*/ + + for ( i = 0; i < nchan_fb_in; i++ ) + { + p_pcm_tmp[i] = pcm_tmp[i]; + } + + /* run Filter Bank overlapping MDFT analysis first, then we can use the temporary buffer for Parameter MDFT analysis*/ + ivas_fb_mixer_pcm_ingest( hSpar->hFbMixer, data_f, p_pcm_tmp, input_frame, hSpar->hMdEnc->HOA_md_ind ); + + /* prepare Parameter MDFT analysis */ + for ( i = 0; i < nchan_fb_in; i++ ) + { + ppIn_FR_real[i] = p_pcm_tmp[i]; + ppIn_FR_imag[i] = p_pcm_tmp[i] + input_frame; + p_pcm_tmp[i] = data_f[i]; + } + + l_ts = input_frame / MAX_PARAM_SPATIAL_SUBFRAMES; + + for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) + { + ivas_fb_mixer_get_windowed_fr( hSpar->hFbMixer, p_pcm_tmp, ppIn_FR_real, ppIn_FR_imag, l_ts, l_ts, nchan_fb_in ); + + ivas_fb_mixer_update_prior_input( hSpar->hFbMixer, p_pcm_tmp, l_ts, nchan_fb_in ); + + for ( i = 0; i < nchan_fb_in; i++ ) + { + p_pcm_tmp[i] += l_ts; + ppIn_FR_real[i] += l_ts; + ppIn_FR_imag[i] += l_ts; + } + } + + /* turn pointers back to the local buffer, needed for the following processing */ + for ( i = 0; i < nchan_fb_in; i++ ) + { + ppIn_FR_real[i] = pcm_tmp[i]; + ppIn_FR_imag[i] = pcm_tmp[i] + input_frame; + p_pcm_tmp[i] = pcm_tmp[i]; + } + + dtx_vad = ( hEncoderConfig->Opt_DTX_ON == 1 ) ? front_vad_flag : 1; + + /*-----------------------------------------------------------------------------------------* + * DirAC encoding + *-----------------------------------------------------------------------------------------*/ + + hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); + + if ( ( error = ivas_dirac_enc( st_ivas->hDirAC, hQMetaData, hMetaData, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, dtx_vad, hEncoderConfig->ivas_format, hodirac_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Set Energy Ratio to 0.0 if the mono flag has been set */ + if ( hQMetaData->dirac_mono_flag ) + { + for ( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ ) + { + for ( i_ts = 0; i_ts < ( ( dtx_vad == 1 ) ? hQMetaData->q_direction[0].cfg.nblocks : 1 ); i_ts++ ) + { + hQMetaData->q_direction[0].band_data[b].energy_ratio[i_ts] = 0.0f; + } + } + } + + /*-----------------------------------------------------------------------------------------* + * Covariance and MD processing + *-----------------------------------------------------------------------------------------*/ + + if ( ( error = ivas_spar_cov_md_process( hEncoderConfig, st_ivas->hSpar, st_ivas->hQMetaData, hMetaData, nchan_inp, sba_order, ppIn_FR_real, ppIn_FR_imag, transient_det, dtx_vad, nchan_transport, &dyn_active_w_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------------------------------* + * FB mixer + *-----------------------------------------------------------------------------------------*/ + + ivas_fb_mixer_get_in_out_mapping( hSpar->hFbMixer->fb_cfg, in_out_mixer_map ); + +#ifdef DEBUG_SPAR_DIRAC_WRITE_OUT_PRED_PARS + { + static FILE *fid = 0; + int16_t band = 9; + if ( !fid ) + { + fid = fopen( "pred_coeffs_enc.txt", "wt" ); + } + fprintf( fid, "%.6f\n", hSpar->hMdEnc->mixer_mat[1][0][band] ); + } +#endif + + ivas_fb_mixer_process( hSpar->hFbMixer, hSpar->hMdEnc->mixer_mat, p_pcm_tmp, input_frame, in_out_mixer_map ); + + if ( hSpar->hFbMixer->fb_cfg->active_w_mixing == 0 ) + { + + /*cross fade between new active W channels and old passive W channel*/ + if ( dyn_active_w_flag == 1 ) + { + if ( hSpar->hMdEnc->spar_md.prior_dyn_active_w_flag != dyn_active_w_flag ) + { + float new_w[L_FRAME48k]; + + /* delayed W */ + mvr2r( wyzx_del_buf[0], p_pcm_tmp[0], num_del_samples ); + mvr2r( data_f[0], p_pcm_tmp[0] + num_del_samples, input_frame - num_del_samples ); + + mvr2r( wyzx_del_buf[hSpar->hMdEnc->spar_md.res_ind], new_w, num_del_samples ); + mvr2r( data_f[hSpar->hMdEnc->spar_md.res_ind], &new_w[num_del_samples], input_frame - num_del_samples ); + + if ( hSpar->hMdEnc->spar_md.prior_dyn_active_w_flag == 0 && dyn_active_w_flag == 1 ) + { + ivas_fb_mixer_cross_fading( hSpar->hFbMixer, p_pcm_tmp, p_pcm_tmp[0], new_w, 0, input_frame, 0 ); + } + else if ( hSpar->hMdEnc->spar_md.prior_dyn_active_w_flag == 1 && dyn_active_w_flag == 0 ) + { + ivas_fb_mixer_cross_fading( hSpar->hFbMixer, p_pcm_tmp, new_w, p_pcm_tmp[0], 0, input_frame, 0 ); + } + } + else + { + mvr2r( wyzx_del_buf[hSpar->hMdEnc->spar_md.res_ind], p_pcm_tmp[0], num_del_samples ); + mvr2r( data_f[hSpar->hMdEnc->spar_md.res_ind], p_pcm_tmp[0] + num_del_samples, input_frame - num_del_samples ); + } + } + else + { + /* delayed W */ + mvr2r( wyzx_del_buf[0], p_pcm_tmp[0], num_del_samples ); + mvr2r( data_f[0], p_pcm_tmp[0] + num_del_samples, input_frame - num_del_samples ); + } + + for ( i = 1; i < hSpar->hFbMixer->fb_cfg->num_out_chans; i++ ) + { + int16_t idx = hSpar->hFbMixer->fb_cfg->remix_order[i]; + + /* delayed, reorderd and accumulated with (negative) prediction from W */ + v_add( wyzx_del_buf[idx], p_pcm_tmp[i], p_pcm_tmp[i], num_del_samples ); + v_add( data_f[idx], p_pcm_tmp[i] + num_del_samples, p_pcm_tmp[i] + num_del_samples, input_frame - num_del_samples ); + } + } + + /*-----------------------------------------------------------------------------------------* + * PCA encoder + *-----------------------------------------------------------------------------------------*/ + + if ( hSpar->hPCA != NULL ) + { + ivas_pca_enc( hEncoderConfig, hSpar->hPCA, hMetaData, p_pcm_tmp, input_frame, FOA_CHANNELS ); + } + else + { + if ( ivas_total_brate == PCA_BRATE && sba_order == SBA_FOA_ORDER ) + { + /* write PCA bypass bit */ + push_next_indice( hMetaData, PCA_MODE_INACTIVE, 1 ); + } + } + + + /*-----------------------------------------------------------------------------------------* + * AGC + *-----------------------------------------------------------------------------------------*/ + + if ( dtx_vad == 1 ) + { + if ( hSpar->AGC_Enable != 0 ) + { + ivas_agc_enc_process( hSpar->hAgcEnc, hMetaData, p_pcm_tmp, p_pcm_tmp, hSpar->hFbMixer->fb_cfg->num_out_chans, hEncoderConfig ); + } + } + + + /*-----------------------------------------------------------------------------------------* + * Re-order the dmx back to ACN/SN3D format + *-----------------------------------------------------------------------------------------*/ + + order = remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order]; + + for ( j = 0; j < nchan_transport; j++ ) + { + if ( st_ivas->nchan_transport < 3 ) + { + mvr2r( p_pcm_tmp[j], data_f[j], input_frame ); + } + else + { + mvr2r( p_pcm_tmp[j], data_f[order[j]], input_frame ); + } + } + for ( ; j < IVAS_SPAR_MAX_DMX_CHS; j++ ) + { + set_f( data_f[order[j]], 0.0f, input_frame ); + } + + hSpar->hMdEnc->spar_md.prior_dyn_active_w_flag = dyn_active_w_flag; + + pop_wmops(); + + return error; +} +#endif -- GitLab From af01ef9a8beab6020ec36cc011132e6f3a2bf7b8 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 1 Jul 2024 11:28:11 +0530 Subject: [PATCH 016/110] Clang formatting --- lib_dec/ivas_init_dec.c | 2 +- lib_dec/ivas_sba_dec.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index f223ffd6c..5dafca0bc 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2290,7 +2290,7 @@ ivas_error ivas_init_decoder_fx( } ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), - st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); } FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index c060d0774..3d9020f7c 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -1093,7 +1093,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( } if ( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), - st_ivas->ivas_format ) ), + st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) { return error; @@ -1131,7 +1131,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( } ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( L_add( st_ivas->hDecoderConfig->output_Fs, 400 ) / CLDFB_BANDWIDTH ), - st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); if ( st_ivas->hDirAC ) { -- GitLab From bb427c093550cb00a6931d9f73eb54fd94e591f8 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 1 Jul 2024 12:20:51 +0530 Subject: [PATCH 017/110] BASOP and instrumentation updates for decoder and renderer files [x] BASOP added for lib_rend and lib_dec files [x] Unnecessary code duplication cleared as mentioned in issue 805 --- lib_com/prot_fx1.h | 2 +- lib_com/swb_tbe_com.c | 190 -------- lib_com/swb_tbe_com_fx.c | 126 ++++- lib_com/tools_fx.c | 2 +- lib_dec/FEC_HQ_core.c | 43 +- lib_dec/FEC_HQ_core_fx.c | 287 ++++++----- lib_dec/FEC_HQ_phase_ecu_fx.c | 407 ++++++++++------ lib_dec/FEC_pitch_estim_fx.c | 9 +- lib_dec/FEC_scale_syn_fx.c | 24 +- lib_dec/gain_dec_fx.c | 58 +-- lib_dec/gaus_dec_fx.c | 15 +- lib_dec/gs_dec_amr_wb_fx.c | 30 +- lib_dec/gs_dec_fx.c | 201 +++++--- lib_dec/hdecnrm_fx.c | 6 +- lib_dec/hf_synth_fx.c | 58 ++- lib_dec/hq_classifier_dec_fx.c | 24 +- lib_dec/hq_core_dec_fx.c | 8 +- lib_dec/hq_env_dec_fx.c | 8 +- lib_dec/hq_lr_dec_fx.c | 22 +- lib_dec/igf_dec_fx.c | 196 ++++---- lib_dec/igf_scf_dec_fx.c | 20 +- lib_dec/init_dec_fx.c | 98 ++-- lib_dec/inov_dec_fx.c | 16 +- lib_dec/ivas_agc_dec_fx.c | 15 +- lib_dec/ivas_sba_dec.c | 69 +-- lib_dec/ivas_stereo_mdct_stereo_dec.c | 199 ++++++-- lib_dec/ivas_stereo_switching_dec.c | 646 +++++++++++++++++-------- lib_dec/ivas_stereo_td_dec.c | 139 ++++-- lib_dec/ivas_svd_dec.c | 323 +++++++++++-- lib_dec/ivas_tcx_core_dec.c | 91 ++-- lib_dec/ivas_td_low_rate_dec.c | 43 +- lib_rend/ivas_mcmasa_ana.c | 510 +++++++++++++------ lib_rend/ivas_objectRenderer.c | 228 +++++---- lib_rend/ivas_objectRenderer_hrFilt.c | 69 ++- lib_rend/ivas_objectRenderer_mix.c | 162 ++----- lib_rend/ivas_objectRenderer_sfx.c | 13 +- lib_rend/ivas_objectRenderer_sources.c | 377 +++++++-------- lib_rend/ivas_output_init.c | 146 +++++- 38 files changed, 3036 insertions(+), 1844 deletions(-) diff --git a/lib_com/prot_fx1.h b/lib_com/prot_fx1.h index db593758b..d560a67a7 100644 --- a/lib_com/prot_fx1.h +++ b/lib_com/prot_fx1.h @@ -524,7 +524,7 @@ void hp400_12k8_fx( Word16 mem[] /* i/o: filter memory [6] */ ); -#ifdef IVAS_FLOAT_FIXED +#if 0 void hp400_12k8_ivas_fx( Word16 signal[], /* i/o: input signal / output is divided by 16 */ const Word16 lg, /* i : lenght of signal */ diff --git a/lib_com/swb_tbe_com.c b/lib_com/swb_tbe_com.c index 582dc217b..ede212bb1 100644 --- a/lib_com/swb_tbe_com.c +++ b/lib_com/swb_tbe_com.c @@ -56,9 +56,6 @@ static void create_random_vector( float output[], const int16_t length, int16_t seed[] ); static void flip_spectrum( const float input[], float output[], const int16_t length ); static void Hilbert_transform( float tmp_R[], float tmp_I[], float *tmpi_R, float *tmpi_I, const int16_t length, const int16_t HB_stage_id ); -#ifdef IVAS_FLOAT_FIXED -static void Hilbert_transform_fx_32( Word32 tmp_R[], Word32 tmp_I[], Word32 *tmpi_R, Word32 *tmpi_I, const Word16 length, const Word16 HB_stage_id ); -#endif static void Estimate_mix_factors( const float *shb_res, const float *exc16kWhtnd, const float *White_exc16k, const float pow1, const float pow22, float *vf_modified, int16_t *vf_ind ); /*-------------------------------------------------------------------* @@ -241,133 +238,6 @@ void flip_and_downmix_generic( return; } -#ifdef IVAS_FLOAT_FIXED -void flip_and_downmix_generic_fx_32( - Word32 input[], /* i : input spectrum Qx*/ - Word32 output[], /* o : output spectrum Qx*/ - const Word16 length, /* i : length of spectra */ - Word32 mem1_ext[HILBERT_ORDER1], /* i/o: memory Qx*/ - Word32 mem2_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx*/ - Word32 mem3_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx*/ - Word16 *phase_state /* i/o: Phase state in case frequency isn't multiple of 50 Hz */ -) -{ - Word16 i, j; - Word32 tmp[L_FRAME32k + HILBERT_ORDER1]; - Word32 tmpi_R[L_FRAME32k]; - Word32 tmpi_I[L_FRAME32k]; - Word32 tmpi2_R[L_FRAME32k + HILBERT_ORDER2]; - Word32 tmpi2_I[L_FRAME32k + HILBERT_ORDER2]; - Word32 tmp_R[L_FRAME32k + HILBERT_ORDER2]; - Word32 tmp_I[L_FRAME32k + HILBERT_ORDER2]; - - /*Word16 s_tmp[L_FRAME32k];*/ - /*Word16 factor;*/ - Word16 period; - Word16 local_negsin_table17[17] = { 0, -11793, -22005, -29268, -32609, -31580, - -26319, -17530, -6393, 6393, 17530, 26319, - 31580, 32609, 29268, 22005, 11793 }; /* Q15 */ - Word16 local_cos_table17[17] = { 32767, 30571, 24279, 14732, 3212, -8739, - -19519, -27683, -32137, -32137, -27683, - -19519, -8739, 3212, 14732, 24279, 30571 }; /* Q15 */ - Word16 *local_negsin_table, *local_cos_table; - Word32 L_tmp; - - /* 1850 Hz downmix */ - period = 17; - move16(); - local_negsin_table = local_negsin_table17; - local_cos_table = local_cos_table17; - - - FOR( i = 0; i < length; i = i + 2 ) - { - input[i] = L_negate( input[i] ); - move16(); - } - - Copy32( input, tmp + HILBERT_ORDER1, length ); - Copy32( mem1_ext, tmp, HILBERT_ORDER1 ); - - /* Hilber transform stage - 0 - single precision */ - Hilbert_transform_fx_32( tmp, /* i: Real component of HB */ - tmp, /* i: Imag component of HB */ - tmpi_R, /* o: Real component of HB */ - tmpi_I, /* o: Imag. component of HB */ - length, /* i: length of the spectra */ - 0 ); /* i: HB transform stage */ - - - Copy32( mem2_ext, tmpi2_R, HILBERT_ORDER2 ); - Copy32( mem3_ext, tmpi2_I, HILBERT_ORDER2 ); - - /* Hilber transform stage - 1 */ - Hilbert_transform_fx_32( tmpi_R, /* i: Real component of HB */ - tmpi_I, /* i: Imag component of HB */ - tmpi2_R, /* o: Real component of HB */ - tmpi2_I, /* o: Imag. component of HB */ - length, /* i: length of the spectra */ - 1 ); /* i: HB transform stage */ - Copy32( tmp + length, mem1_ext, HILBERT_ORDER1 ); - Copy32( mem2_ext + HILBERT_ORDER2, tmp_R, HILBERT_ORDER2 ); - Copy32( mem3_ext + HILBERT_ORDER2, tmp_I, HILBERT_ORDER2 ); - - /* Hilber transform stage - 2 */ - Hilbert_transform_fx_32( tmpi2_R, /* i: Real component of HB */ - tmpi2_I, /* i: Imag component of HB */ - tmpi_R, /* o: Real component of HB */ - tmpi_I, /* o: Imag. component of HB */ - length, /* i: length of the spectra */ - 2 ); /* i: HB transform stage */ - - Copy32( tmpi2_R + length, mem2_ext, HILBERT_ORDER2 ); - Copy32( tmpi2_I + length, mem3_ext, HILBERT_ORDER2 ); - - /* Hilber transform stage - 3 */ - Hilbert_transform_fx_32( tmpi_R, /* i: Real component of HB */ - tmpi_I, /* i: Imag component of HB */ - tmp_R, /* o: Real component of HB */ - tmp_I, /* o: Imag. component of HB */ - length, /* i: length of the spectra */ - 3 ); /* i: HB transform stage */ - - Copy32( tmp_R + length, mem2_ext + HILBERT_ORDER2, HILBERT_ORDER2 ); - Copy32( tmp_I + length, mem3_ext + HILBERT_ORDER2, HILBERT_ORDER2 ); - - if ( *phase_state >= period ) - { - *phase_state = 0; - move16(); - } - - i = 0; - move16(); - j = *phase_state; - move16(); - - WHILE( i < length ) - { - WHILE( ( j < period ) && ( i < length ) ) - { - L_tmp = Mult_32_16( tmp_R[i + 4], local_cos_table[j] ); /*//Qx+16 */ - L_tmp = Madd_32_16( L_tmp, tmp_I[i + 4], local_negsin_table[j] ); /*Qx+16 */ - output[i] = L_tmp; /*Qx */ - i++; - j++; - } - - if ( j >= period ) - { - j = 0; - move16(); - } - } - - *phase_state = j; - move16(); - return; -} -#endif /*---------------------------------------------- * Hilbert_transform() @@ -411,66 +281,6 @@ static void Hilbert_transform( return; } -#ifdef IVAS_FLOAT_FIXED -static void Hilbert_transform_fx_32( - Word32 tmp_R[], /* i: Real component of HB */ - Word32 tmp_I[], /* i: Real component of HB */ - Word32 tmpi_R[], /* o: Real component of HB */ - Word32 tmpi_I[], /* o: Imag. component of HB */ - const Word16 length, /* i: input length */ - const Word16 HB_stage_id /* i: HB transform stage */ -) -{ - Word16 i, hb_filter_stage, offset; - Word32 L_tmp; - - hb_filter_stage = 2 * HB_stage_id; - offset = 0; - move16(); - if ( HB_stage_id == 0 ) - { - offset = 1; - move16(); - } - - test(); - test(); - IF( HB_stage_id == 0 || HB_stage_id == 2 ) - { - FOR( i = 0; i < length; i++ ) - { - L_tmp = Mult_32_16( tmp_R[i + 4], Hilbert_coeffs_fx[hb_filter_stage][0 + offset] ); /*Qx+15 */ - L_tmp = Madd_32_16( L_tmp, tmp_R[i + 2], Hilbert_coeffs_fx[hb_filter_stage][2 + offset] ); /*Qx+15 */ - L_tmp = Madd_32_16( L_tmp, tmp_R[i], Hilbert_coeffs_fx[hb_filter_stage][4 + offset] ); /*Qx+15 */ - tmpi_R[i] = L_shl( L_tmp, 1 ); - move32(); /*Qx+16 */ - - L_tmp = Mult_32_16( tmp_I[i + 4 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][0] ); /*Qx+15 */ - L_tmp = Madd_32_16( L_tmp, tmp_I[i + 2 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][2] ); /*Qx+15 */ - L_tmp = Madd_32_16( L_tmp, tmp_I[i + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][4] ); /*Qx+15 */ - tmpi_I[i] = L_shl( L_tmp, 1 ); - move32(); /*Qx+16 */ - } - } - ELSE IF( HB_stage_id == 1 || HB_stage_id == 3 ) - { - FOR( i = 0; i < length; i++ ) - { - - L_tmp = Mult_32_16( tmpi_R[i + 2], Hilbert_coeffs_fx[hb_filter_stage][2] ); /*Qx+15 */ - L_tmp = Madd_32_16( L_tmp, tmpi_R[i], Hilbert_coeffs_fx[hb_filter_stage][4] ); /*Qx+15 */ - tmpi_R[i + 4] = L_sub( tmp_R[i], L_shl( L_tmp, 1 ) ); - move32(); /*Qx+16 */ - - L_tmp = Mult_32_16( tmpi_I[i + 2], Hilbert_coeffs_fx[hb_filter_stage + 1][2] ); /*Qx+15 */ - L_tmp = Madd_32_16( L_tmp, tmpi_I[i], Hilbert_coeffs_fx[hb_filter_stage + 1][4] ); /*Qx+15 */ - tmpi_I[i + 4] = L_sub( tmp_I[i], L_shl( L_tmp, 1 ) ); - move32(); /*Qx+16 */ - } - } -} -#endif - /*-------------------------------------------------------------------* * flip_spectrum() * diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index ffb96c5df..fe77f4918 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -483,6 +483,131 @@ void flip_and_downmix_generic_fx( return; } +void flip_and_downmix_generic_fx_32( + Word32 input[], /* i : input spectrum Qx*/ + Word32 output[], /* o : output spectrum Qx*/ + const Word16 length, /* i : length of spectra */ + Word32 mem1_ext[HILBERT_ORDER1], /* i/o: memory Qx*/ + Word32 mem2_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx*/ + Word32 mem3_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx*/ + Word16 *phase_state /* i/o: Phase state in case frequency isn't multiple of 50 Hz */ +) +{ + Word16 i, j; + Word32 tmp[L_FRAME32k + HILBERT_ORDER1]; + Word32 tmpi_R[L_FRAME32k]; + Word32 tmpi_I[L_FRAME32k]; + Word32 tmpi2_R[L_FRAME32k + HILBERT_ORDER2]; + Word32 tmpi2_I[L_FRAME32k + HILBERT_ORDER2]; + Word32 tmp_R[L_FRAME32k + HILBERT_ORDER2]; + Word32 tmp_I[L_FRAME32k + HILBERT_ORDER2]; + + /*Word16 s_tmp[L_FRAME32k];*/ + /*Word16 factor;*/ + Word16 period; + Word16 local_negsin_table17[17] = { 0, -11793, -22005, -29268, -32609, -31580, + -26319, -17530, -6393, 6393, 17530, 26319, + 31580, 32609, 29268, 22005, 11793 }; /* Q15 */ + Word16 local_cos_table17[17] = { 32767, 30571, 24279, 14732, 3212, -8739, + -19519, -27683, -32137, -32137, -27683, + -19519, -8739, 3212, 14732, 24279, 30571 }; /* Q15 */ + Word16 *local_negsin_table, *local_cos_table; + Word32 L_tmp; + + /* 1850 Hz downmix */ + period = 17; + move16(); + local_negsin_table = local_negsin_table17; + local_cos_table = local_cos_table17; + + + FOR( i = 0; i < length; i = i + 2 ) + { + input[i] = L_negate( input[i] ); + move16(); + } + + Copy32( input, tmp + HILBERT_ORDER1, length ); + Copy32( mem1_ext, tmp, HILBERT_ORDER1 ); + + /* Hilber transform stage - 0 - single precision */ + Hilbert_transform_fx( tmp, /* i: Real component of HB */ + tmp, /* i: Imag component of HB */ + tmpi_R, /* o: Real component of HB */ + tmpi_I, /* o: Imag. component of HB */ + length, /* i: length of the spectra */ + 0 ); /* i: HB transform stage */ + + + Copy32( mem2_ext, tmpi2_R, HILBERT_ORDER2 ); + Copy32( mem3_ext, tmpi2_I, HILBERT_ORDER2 ); + + /* Hilber transform stage - 1 */ + Hilbert_transform_fx( tmpi_R, /* i: Real component of HB */ + tmpi_I, /* i: Imag component of HB */ + tmpi2_R, /* o: Real component of HB */ + tmpi2_I, /* o: Imag. component of HB */ + length, /* i: length of the spectra */ + 1 ); /* i: HB transform stage */ + Copy32( tmp + length, mem1_ext, HILBERT_ORDER1 ); + Copy32( mem2_ext + HILBERT_ORDER2, tmp_R, HILBERT_ORDER2 ); + Copy32( mem3_ext + HILBERT_ORDER2, tmp_I, HILBERT_ORDER2 ); + + /* Hilber transform stage - 2 */ + Hilbert_transform_fx( tmpi2_R, /* i: Real component of HB */ + tmpi2_I, /* i: Imag component of HB */ + tmpi_R, /* o: Real component of HB */ + tmpi_I, /* o: Imag. component of HB */ + length, /* i: length of the spectra */ + 2 ); /* i: HB transform stage */ + + Copy32( tmpi2_R + length, mem2_ext, HILBERT_ORDER2 ); + Copy32( tmpi2_I + length, mem3_ext, HILBERT_ORDER2 ); + + /* Hilber transform stage - 3 */ + Hilbert_transform_fx( tmpi_R, /* i: Real component of HB */ + tmpi_I, /* i: Imag component of HB */ + tmp_R, /* o: Real component of HB */ + tmp_I, /* o: Imag. component of HB */ + length, /* i: length of the spectra */ + 3 ); /* i: HB transform stage */ + + Copy32( tmp_R + length, mem2_ext + HILBERT_ORDER2, HILBERT_ORDER2 ); + Copy32( tmp_I + length, mem3_ext + HILBERT_ORDER2, HILBERT_ORDER2 ); + + if ( *phase_state >= period ) + { + *phase_state = 0; + move16(); + } + + i = 0; + move16(); + j = *phase_state; + move16(); + + WHILE( i < length ) + { + WHILE( ( j < period ) && ( i < length ) ) + { + L_tmp = Mult_32_16( tmp_R[i + 4], local_cos_table[j] ); /*//Qx+16 */ + L_tmp = Madd_32_16( L_tmp, tmp_I[i + 4], local_negsin_table[j] ); /*Qx+16 */ + output[i] = L_tmp; /*Qx */ + i++; + j++; + } + + if ( j >= period ) + { + j = 0; + move16(); + } + } + + *phase_state = j; + move16(); + return; +} /*---------------------------------------------- * Hilbert transform - Double precision @@ -779,7 +904,6 @@ static void filt_mu_fx( Overflow = 0; } #endif - #else sig_out[n] = shl( mult_r( ga, temp ), 1 ); #endif diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index bba84cdb9..98568a301 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -3545,7 +3545,7 @@ void hp400_12k8_fx( return; } -#ifdef IVAS_FLOAT_FIXED +#if 0 void hp400_12k8_ivas_fx( Word16 signal[], /* i/o: input signal / output is divided by 16 */ const Word16 lg, /* i : lenght of signal */ diff --git a/lib_dec/FEC_HQ_core.c b/lib_dec/FEC_HQ_core.c index 23b587ac1..e160a25fc 100644 --- a/lib_dec/FEC_HQ_core.c +++ b/lib_dec/FEC_HQ_core.c @@ -1551,68 +1551,79 @@ void save_synthesis_hq_fec_fx( { case EVS_MONO: post_hq_delay = NS2SA( st->output_Fs, POST_HQ_DELAY_NS ); + move16(); BREAK; case IVAS_SCE: post_hq_delay = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); + move16(); BREAK; case IVAS_CPE_DFT: - IF( hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) + IF( EQ_16(hCPE->nchan_out , 1) && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) { post_hq_delay = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); + move16(); } ELSE { post_hq_delay = 0; + move16(); } BREAK; default: post_hq_delay = 0; + move16(); BREAK; } + test(); + test(); + test(); + test(); + test(); IF( ( EQ_16( st->codec_mode, MODE1 ) && st->hTcxDec != NULL ) && ( ( EQ_16( st->core, ACELP_CORE ) && !( EQ_16( st->bfi, 1 ) && EQ_16( st->con_tcx, 1 ) ) ) || EQ_16( st->core, HQ_CORE ) ) ) { - Copy( st->hTcxDec->synth_history_fx + output_frame, st->hTcxDec->synth_history_fx, output_frame - post_hq_delay + NS2SA( st->output_Fs, PH_ECU_MEM_NS ) ); - FOR( int i = 0; i < output_frame; i++ ) + Copy( st->hTcxDec->synth_history_fx + output_frame, st->hTcxDec->synth_history_fx, add(sub(output_frame , post_hq_delay) , NS2SA( st->output_Fs, PH_ECU_MEM_NS )) ); + FOR( Word16 i = 0; i < output_frame; i++ ) { - st->hTcxDec->old_synthFB_fx[i + output_frame - post_hq_delay] = extract_h( output_fx[i] ); + st->hTcxDec->old_synthFB_fx[sub(add(i , output_frame) , post_hq_delay)] = extract_h( output_fx[i] ); + move16(); } - IF( EQ_16( st->element_mode, EVS_MONO ) ) + IF( st->element_mode == EVS_MONO ) { /* reset the remaining buffer, which is read in TCX concealment the necessary samples to fill this buffer are not available for all cases, the impact on the output is limited */ - set16_fx( st->hTcxDec->old_synthFB_fx + 2 * output_frame - post_hq_delay, 0, post_hq_delay ); + set16_fx( st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , post_hq_delay), 0, post_hq_delay ); IF( GE_16( output_frame, L_FRAME16k ) ) { - Copy( st->prev_synth_buffer_fx, st->hTcxDec->old_synthFB_fx + 2 * output_frame - NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); + Copy( st->prev_synth_buffer_fx, st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS )), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); } ELSE { - Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + 2 * output_frame, NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl(output_frame, 1), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } - IF( NE_16( st->core, ACELP_CORE ) ) + IF( st->core != ACELP_CORE ) { IF( GE_16( output_frame, L_FRAME16k ) ) { - Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + 2 * output_frame - NS2SA( st->output_Fs, DELAY_CLDFB_NS ), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); - Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + 2 * output_frame, NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , NS2SA( st->output_Fs, DELAY_CLDFB_NS )), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl(output_frame, 1), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } ELSE { - Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + 2 * output_frame - NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); - Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + 2 * output_frame - NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS )), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS )), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } } } ELSE { - IF( NE_16( st->core, ACELP_CORE ) ) + IF( st->core != ACELP_CORE ) { - Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + 2 * output_frame - post_hq_delay, post_hq_delay ); - Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + 2 * output_frame, NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , post_hq_delay), post_hq_delay ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl(output_frame, 1), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } } } diff --git a/lib_dec/FEC_HQ_core_fx.c b/lib_dec/FEC_HQ_core_fx.c index 6d709b728..d00b95109 100644 --- a/lib_dec/FEC_HQ_core_fx.c +++ b/lib_dec/FEC_HQ_core_fx.c @@ -49,10 +49,11 @@ static void Regression_Anal_fx( Word32 b_p_fx[MAX_PGF + 1]; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif /* Initialize */ - FOR( i = 0; i < num_pgf + 1; i++ ) + FOR( i = 0; i < add( num_pgf, 1 ); i++ ) { aindex_fx[i] = 0; move16(); @@ -69,19 +70,24 @@ static void Regression_Anal_fx( /*aindex[0]=num_pgf; */ aindex_fx[0] = num_pgf; move16(); - FOR( i = 1; i < num_pgf + 1; i++ ) + FOR( i = 1; i < add( num_pgf, 1 ); i++ ) { aindex_fx[1] = add( aindex_fx[1], i ); + move16(); aindex_fx[2] = add( aindex_fx[2], i_mult( i, i ) ); + move16(); } /* Calculate b[] */ FOR( i = 0; i < num_pgf; i++ ) { b_p_fx[0] = L_add( b_p_fx[0], L_shr( values_fx[i], 2 ) ); /*10 */ + move32(); #ifdef BASOP_NOGLOB b_p_fx[1] = L_add( b_p_fx[1], Mult_32_16( values_fx[i], shl_o( sub( num_pgf, i ), 13, &Overflow ) ) ); /*10 */ + move32(); #else b_p_fx[1] = L_add( b_p_fx[1], Mult_32_16( values_fx[i], shl( sub( num_pgf, i ), 13 ) ) ); /*10 */ + move32(); #endif } @@ -91,7 +97,9 @@ static void Regression_Anal_fx( L_tmp1 = L_sub( Mult_32_16( b_p_fx[0], shl( aindex_fx[2], 10 ) ), Mult_32_16( b_p_fx[1], shl( aindex_fx[1], 10 ) ) ); /*5 */ L_tmp2 = L_sub( Mult_32_16( b_p_fx[1], shl( aindex_fx[0], 10 ) ), Mult_32_16( b_p_fx[0], shl( aindex_fx[1], 10 ) ) ); /*5 */ r_p_fx[0] = Mult_32_16( L_tmp1, tmp ); + move32(); r_p_fx[1] = Mult_32_16( L_tmp2, tmp ); + move32(); return; } @@ -112,6 +120,7 @@ static void FEC_scaling_fx( FOR( j = start_band[i]; j < end_band[i]; j++ ) { t_audio_q_fx[j] = Mult_32_16( old_coeffs_fx[j], Norm_gain_fx[i] ); /*12 */ + move32(); } } @@ -122,10 +131,12 @@ static void FEC_scaling_fx( IF( Random( HQ_FEC_seed ) < 0 ) { t_audio_q_fx[j] = Mult_32_16( L_negate( old_coeffs_fx[j] ), Norm_gain_fx[i] ); /*12*/ + move32(); } ELSE { t_audio_q_fx[j] = Mult_32_16( old_coeffs_fx[j], Norm_gain_fx[i] ); /*12*/ + move32(); } } } @@ -159,6 +170,7 @@ void HQ_FEC_processing_fx( HQ_DEC_HANDLE hHQ_core; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif hHQ_nbfec = st_fx->hHQ_nbfec; hHQ_core = st_fx->hHQ_core; @@ -186,9 +198,10 @@ void HQ_FEC_processing_fx( } test(); test(); - if ( EQ_16( st_fx->prev_old_bfi, 1 ) && EQ_16( st_fx->nbLostCmpt, 1 ) && EQ_16( output_frame, L_FRAME8k ) ) + IF( EQ_16( st_fx->prev_old_bfi, 1 ) && EQ_16( st_fx->nbLostCmpt, 1 ) && EQ_16( output_frame, L_FRAME8k ) ) { st_fx->nbLostCmpt = add( st_fx->nbLostCmpt, 1 ); + move32(); } /* Frequency-domain FEC */ @@ -209,6 +222,7 @@ void HQ_FEC_processing_fx( FOR( i = 0; i < output_frame; i++ ) { hHQ_nbfec->old_coeffs_fx[i] = Mult_32_16( hHQ_nbfec->old_coeffs_fx[i], 23170 ); /*23170, 3dB, Q15*/ + move32(); t_audio_q_fx[i] = hHQ_nbfec->old_coeffs_fx[i]; move32(); } @@ -225,7 +239,7 @@ void HQ_FEC_processing_fx( { FOR( i = 0; i < HQ_FEC_BAND_SIZE; i++ ) { - t_audio_q_fx[i + sfm * HQ_FEC_BAND_SIZE] = L_negate( t_audio_q_fx[i + sfm * HQ_FEC_BAND_SIZE] ); + t_audio_q_fx[add( i, imult1616( sfm, HQ_FEC_BAND_SIZE ) )] = L_negate( t_audio_q_fx[add( i, imult1616( sfm, HQ_FEC_BAND_SIZE ) )] ); move32(); } } @@ -239,7 +253,7 @@ void HQ_FEC_processing_fx( { FOR( i = 0; i < HQ_FEC_BAND_SIZE; i++ ) { - t_audio_q_fx[i + sfm * HQ_FEC_BAND_SIZE] = L_negate( t_audio_q_fx[i + sfm * HQ_FEC_BAND_SIZE] ); + t_audio_q_fx[add( i, imult1616( sfm, HQ_FEC_BAND_SIZE ) )] = L_negate( t_audio_q_fx[add( i, imult1616( sfm, HQ_FEC_BAND_SIZE ) )] ); move32(); } } @@ -265,6 +279,7 @@ void HQ_FEC_processing_fx( FOR( i = 0; i < output_frame; i++ ) { hHQ_nbfec->old_coeffs_fx[i] = Mult_32_16( hHQ_nbfec->old_coeffs_fx[i], 23170 ); + move32(); t_audio_q_fx[i] = hHQ_nbfec->old_coeffs_fx[i]; move32(); } @@ -274,6 +289,7 @@ void HQ_FEC_processing_fx( FOR( i = 0; i < RANDOM_START * 8; i++ ) { hHQ_nbfec->old_coeffs_fx[i] = Mult_32_16( hHQ_nbfec->old_coeffs_fx[i], 23170 ); + move32(); t_audio_q_fx[i] = hHQ_nbfec->old_coeffs_fx[i]; move32(); } @@ -281,6 +297,7 @@ void HQ_FEC_processing_fx( FOR( i = RANDOM_START * 8; i < output_frame; i++ ) { hHQ_nbfec->old_coeffs_fx[i] = Mult_32_16( hHQ_nbfec->old_coeffs_fx[i], 23170 ); + move32(); IF( Random( &hHQ_nbfec->HQ_FEC_seed ) < 0 ) { t_audio_q_fx[i] = L_negate( hHQ_nbfec->old_coeffs_fx[i] ); @@ -345,12 +362,14 @@ void HQ_FEC_processing_fx( IF( r_p_fx[1] > 0 ) { r_p_fx[1] = L_deposit_l( 0 ); + move32(); norm_p_fx[i] = L_shr( norm_values_fx[0], 7 ); /*5*/ move32(); } ELSE { norm_p_fx[i] = L_add( r_p_fx[0], L_mult0( extract_l( r_p_fx[1] ), sub( add( st_fx->nbLostCmpt, num_pgf ), 1 ) ) ); + move32(); } test(); @@ -363,7 +382,7 @@ void HQ_FEC_processing_fx( #ifdef BASOP_NOGLOB tmp_fx = shl_sat( tmp_fx, add( 6, sub( exp2, exp1 ) ) ); /*14*/ #else - tmp_fx = shl( tmp_fx, add( 6, sub( exp2, exp1 ) ) ); /*14*/ + tmp_fx = shl( tmp_fx, add( 6, sub( exp2, exp1 ) ) ); /*14*/ #endif if ( GT_16( tmp_fx, 16384 ) ) { @@ -374,7 +393,9 @@ void HQ_FEC_processing_fx( FOR( j = 0; j < Num_bands_p[i]; j++ ) { #ifdef BASOP_NOGLOB - hHQ_nbfec->Norm_gain_fx[k++] = shl_o( tmp_fx, 1, &Overflow ); + hHQ_nbfec->Norm_gain_fx[k] = shl_o( tmp_fx, 1, &Overflow ); + move16(); + k = add( k, 1 ); #else hHQ_nbfec->Norm_gain_fx[k++] = shl( tmp_fx, 1 ); #endif @@ -388,7 +409,7 @@ void HQ_FEC_processing_fx( { hHQ_nbfec->Norm_gain_fx[k] = mult_r( hHQ_nbfec->Norm_gain_fx[k], 23170 ); move16(); - k++; + k = add( k, 1 ); } } } @@ -435,7 +456,9 @@ void ivas_HQ_FEC_Mem_update_fx( hHQ_core = st_fx->hHQ_core; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif + move32(); // for tmp_energy_fx IF( EQ_16( output_frame, L_FRAME8k ) ) { @@ -458,7 +481,7 @@ void ivas_HQ_FEC_Mem_update_fx( test(); test(); test(); - IF( ( GT_32( hHQ_nbfec->old_coeffs_fx[i + j * HQ_FEC_BAND_SIZE], 0 ) && LT_32( t_audio_q_fx[i + j * HQ_FEC_BAND_SIZE], 0 ) ) || ( LT_32( hHQ_nbfec->old_coeffs_fx[i + j * HQ_FEC_BAND_SIZE], 0 ) && GT_32( t_audio_q_fx[i + j * HQ_FEC_BAND_SIZE], 0 ) ) ) + IF( ( hHQ_nbfec->old_coeffs_fx[add( i, imult1616( j, HQ_FEC_BAND_SIZE ) )] > 0 && t_audio_q_fx[add( i, imult1616( j, HQ_FEC_BAND_SIZE ) )] < 0 ) || ( hHQ_nbfec->old_coeffs_fx[add( i, imult1616( j, HQ_FEC_BAND_SIZE ) )] < 0 && t_audio_q_fx[add( i, imult1616( j, HQ_FEC_BAND_SIZE ) )] > 0 ) ) { hHQ_nbfec->prev_sign_switch[j] = add( hHQ_nbfec->prev_sign_switch[j], 1 ); move16(); @@ -473,7 +496,7 @@ void ivas_HQ_FEC_Mem_update_fx( IF( ( EQ_16( hqswb_clas, HQ_HVQ ) ) || ( EQ_16( hq_core_type, LOW_RATE_HQ_CORE ) ) ) { /* First group */ - logqnorm_fx( t_audio_q_fx, 12, ynrm, 32, WID_G1, ( hqswb_clas == HQ_HVQ ) ); + logqnorm_fx( t_audio_q_fx, 12, ynrm, 32, WID_G1, (const Word16)EQ_16( hqswb_clas, HQ_HVQ ) ); j = ynrm[0]; move16(); offset = WID_G1; @@ -481,17 +504,15 @@ void ivas_HQ_FEC_Mem_update_fx( FOR( i = 1; i < SFM_G1; i++ ) { - logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G1, ( hqswb_clas == HQ_HVQ ) ); - offset += WID_G1; - move16(); + logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G1, (const Word16)EQ_16( hqswb_clas, HQ_HVQ ) ); + offset = add( offset, WID_G1 ); } /* Second group */ FOR( i = SFM_G1; i < SFM_G1 + 2; i++ ) { - logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G2, ( hqswb_clas == HQ_HVQ ) ); - offset += WID_G2; - move16(); + logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G2, (const Word16)EQ_16( hqswb_clas, HQ_HVQ ) ); + offset = add( offset, WID_G2 ); } } @@ -511,7 +532,8 @@ void ivas_HQ_FEC_Mem_update_fx( L_tmp = L_deposit_l( 0 ); FOR( j = 0; j < Num_bands_p[i]; j++ ) { - L_tmp = L_add( L_tmp, L_shr( normq_fx[k++], 3 ) ); /*11*/ + L_tmp = L_add( L_tmp, L_shr( normq_fx[k], 3 ) ); /*11*/ + k = add( k, 1 ); } #ifdef BASOP_NOGLOB tmp_fx = shl_o( inv_tbl_fx[Num_bands_p[i]], 1, &Overflow ); /*16*/ @@ -524,7 +546,7 @@ void ivas_HQ_FEC_Mem_update_fx( } test(); test(); - IF( ( c_switching_flag ) || ( ( EQ_16( st_fx->last_core, ACELP_CORE ) ) && ( EQ_16( st_fx->core, HQ_CORE ) ) ) ) + IF( ( c_switching_flag ) || ( ( st_fx->last_core == ACELP_CORE ) && ( EQ_16( st_fx->core, HQ_CORE ) ) ) ) { FOR( i = 0; i < MAX_SB_NB; i++ ) { @@ -549,11 +571,14 @@ void ivas_HQ_FEC_Mem_update_fx( /*st->diff_energy = (float)fabs((st->energy_MA_Curr[1] - st->energy_MA_Curr[0])/st->energy_MA_Curr[0]); */ hHQ_nbfec->diff_energy_fx = abs_s( sub( hHQ_nbfec->energy_MA_Curr_fx[1], hHQ_nbfec->energy_MA_Curr_fx[0] ) ); + move16(); exp1 = sub( norm_l( hHQ_nbfec->diff_energy_fx ), 1 ); exp2 = norm_l( hHQ_nbfec->energy_MA_Curr_fx[0] ); hHQ_nbfec->diff_energy_fx = div_s( extract_h( L_shl( hHQ_nbfec->diff_energy_fx, exp1 ) ), extract_h( L_shl( hHQ_nbfec->energy_MA_Curr_fx[0], exp2 ) ) ); + move16(); exp = add( 15, sub( exp1, exp2 ) ); hHQ_nbfec->diff_energy_fx = shl( hHQ_nbfec->diff_energy_fx, sub( 11, exp ) ); /*11*/ + move16(); /* Classify the stationary mode : 12% */ IF( LT_16( hHQ_nbfec->diff_energy_fx, ED_THRES_12P_fx ) ) @@ -568,7 +593,7 @@ void ivas_HQ_FEC_Mem_update_fx( } /* Apply Hysteresis to prevent frequent mode changing */ - IF( EQ_16( hHQ_nbfec->stat_mode_old, stat_mode_curr ) ) + if ( EQ_16( hHQ_nbfec->stat_mode_old, stat_mode_curr ) ) { hHQ_nbfec->stat_mode_out = stat_mode_curr; move16(); @@ -595,7 +620,7 @@ void ivas_HQ_FEC_Mem_update_fx( /* Find max. coeff in band 0 */ Max_ind = 0; move16(); - IF( EQ_16( Min_ind, 0 ) ) + IF( Min_ind == 0 ) { Max_coeff_fx = L_deposit_l( 0 ); FOR( i = 0; i < 8; i++ ) @@ -617,6 +642,7 @@ void ivas_HQ_FEC_Mem_update_fx( FOR( i = k; i < num_Sb; i++ ) { en_high_fx[i] = L_deposit_l( 0 ); + move32(); FOR( j = 0; j < 2; j++ ) { /*en_high[i] += 0.5f*st->ynrm_values[i][j+1];*/ @@ -639,8 +665,10 @@ void ivas_HQ_FEC_Mem_update_fx( #else *mean_en_high_fx = add( *mean_en_high_fx, shr( tmp_fx, sub( exp, 5 ) ) ); #endif + move16(); } - *mean_en_high_fx = mult( *mean_en_high_fx, inv_tbl_fx[num_Sb - k] ); + *mean_en_high_fx = mult( *mean_en_high_fx, inv_tbl_fx[sub( num_Sb, k )] ); + move16(); test(); test(); @@ -656,7 +684,7 @@ void ivas_HQ_FEC_Mem_update_fx( hHQ_nbfec->phase_mat_flag = 1; move16(); test(); - IF( ( EQ_16( Min_ind, 0 ) ) && ( LT_16( Max_ind, 3 ) ) ) + if ( ( Min_ind == 0 ) && ( LT_16( Max_ind, 3 ) ) ) { hHQ_nbfec->phase_mat_flag = 0; move16(); @@ -722,7 +750,9 @@ void HQ_FEC_Mem_update_fx( hHQ_core = st_fx->hHQ_core; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif + move32(); // tmp_energy_fx #ifdef ADD_IVAS_HQ_CODE_FEC IF( EQ_16( output_frame, L_FRAME8k ) ) { @@ -747,7 +777,7 @@ void HQ_FEC_Mem_update_fx( test(); test(); test(); - IF( ( hHQ_nbfec->old_coeffs_fx[i + j * HQ_FEC_BAND_SIZE] > 0 && t_audio_q_fx[i + j * HQ_FEC_BAND_SIZE] < 0 ) || ( hHQ_nbfec->old_coeffs_fx[i + j * HQ_FEC_BAND_SIZE] < 0 && t_audio_q_fx[i + j * HQ_FEC_BAND_SIZE] > 0 ) ) + IF( ( hHQ_nbfec->old_coeffs_fx[add( i, imult1616( j, HQ_FEC_BAND_SIZE ) )] > 0 && t_audio_q_fx[add( i, imult1616( j, HQ_FEC_BAND_SIZE ) )] < 0 ) || ( hHQ_nbfec->old_coeffs_fx[add( i, imult1616( j, HQ_FEC_BAND_SIZE ) )] < 0 && t_audio_q_fx[add( i, imult1616( j, HQ_FEC_BAND_SIZE ) )] > 0 ) ) { hHQ_nbfec->prev_sign_switch[j] = add( hHQ_nbfec->prev_sign_switch[j], 1 ); move16(); @@ -758,7 +788,7 @@ void HQ_FEC_Mem_update_fx( } } #ifndef ADD_IVAS_HQ_CODE_FEC - IF( EQ_16( output_frame, L_FRAME8k ) ) + if ( EQ_16( output_frame, L_FRAME8k ) ) { #endif /* if LR MDCT core is used, recalculate norms from decoded MDCT spectrum (using code from hq_hr_enc_fx()) */ @@ -766,7 +796,7 @@ void HQ_FEC_Mem_update_fx( IF( ( EQ_16( hqswb_clas, HQ_HVQ ) ) || ( EQ_16( hq_core_type, LOW_RATE_HQ_CORE ) ) ) { /* First group */ - logqnorm_fx( t_audio_q_fx, 12, ynrm, 32, WID_G1, ( hqswb_clas == HQ_HVQ ) ); + logqnorm_fx( t_audio_q_fx, 12, ynrm, 32, WID_G1, (const Word16)EQ_16( hqswb_clas, HQ_HVQ ) ); j = ynrm[0]; move16(); offset = WID_G1; @@ -774,17 +804,15 @@ void HQ_FEC_Mem_update_fx( FOR( i = 1; i < SFM_G1; i++ ) { - logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G1, ( hqswb_clas == HQ_HVQ ) ); - offset += WID_G1; - move16(); + logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G1, (const Word16)EQ_16( hqswb_clas, HQ_HVQ ) ); + offset = add( offset, WID_G1 ); } /* Second group */ FOR( i = SFM_G1; i < SFM_G1 + 2; i++ ) { - logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G2, ( hqswb_clas == HQ_HVQ ) ); - offset += WID_G2; - move16(); + logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G2, (const Word16)EQ_16( hqswb_clas, HQ_HVQ ) ); + offset = add( offset, WID_G2 ); } } @@ -804,7 +832,8 @@ void HQ_FEC_Mem_update_fx( L_tmp = L_deposit_l( 0 ); FOR( j = 0; j < Num_bands_p[i]; j++ ) { - L_tmp = L_add( L_tmp, L_shr( normq_fx[k++], 3 ) ); /*11*/ + L_tmp = L_add( L_tmp, L_shr( normq_fx[k], 3 ) ); /*11*/ + k = add( k, 1 ); } #ifdef BASOP_NOGLOB tmp_fx = shl_o( inv_tbl_fx[Num_bands_p[i]], 1, &Overflow ); /*16*/ @@ -817,7 +846,7 @@ void HQ_FEC_Mem_update_fx( } test(); test(); - IF( ( c_switching_flag ) || ( ( EQ_16( st_fx->last_core, ACELP_CORE ) ) && ( EQ_16( st_fx->core, HQ_CORE ) ) ) ) + IF( ( c_switching_flag ) || ( ( st_fx->last_core == ACELP_CORE ) && ( EQ_16( st_fx->core, HQ_CORE ) ) ) ) { FOR( i = 0; i < MAX_SB_NB; i++ ) { @@ -836,19 +865,24 @@ void HQ_FEC_Mem_update_fx( #ifdef BASOP_NOGLOB hHQ_nbfec->energy_MA_Curr_fx[1] = extract_h( L_shl_sat( L_tmp, 16 - 8 ) ); + move16(); #else hHQ_nbfec->energy_MA_Curr_fx[1] = extract_h( L_shl( L_tmp, 16 - 8 ) ); #endif /* Moving Average */ hHQ_nbfec->energy_MA_Curr_fx[0] = s_max( 1, add( mult_r( 26214, hHQ_nbfec->energy_MA_Curr_fx[0] ), mult_r( 6554, hHQ_nbfec->energy_MA_Curr_fx[1] ) ) ); + move16(); /*st->diff_energy = (float)fabs((st->energy_MA_Curr[1] - st->energy_MA_Curr[0])/st->energy_MA_Curr[0]); */ hHQ_nbfec->diff_energy_fx = abs_s( sub( hHQ_nbfec->energy_MA_Curr_fx[1], hHQ_nbfec->energy_MA_Curr_fx[0] ) ); + move16(); exp1 = sub( norm_l( hHQ_nbfec->diff_energy_fx ), 1 ); exp2 = norm_l( hHQ_nbfec->energy_MA_Curr_fx[0] ); hHQ_nbfec->diff_energy_fx = div_s( extract_h( L_shl( hHQ_nbfec->diff_energy_fx, exp1 ) ), extract_h( L_shl( hHQ_nbfec->energy_MA_Curr_fx[0], exp2 ) ) ); + move16(); exp = add( 15, sub( exp1, exp2 ) ); hHQ_nbfec->diff_energy_fx = shl( hHQ_nbfec->diff_energy_fx, sub( 11, exp ) ); /*11*/ + move16(); /* Classify the stationary mode : 12% */ IF( LT_16( hHQ_nbfec->diff_energy_fx, ED_THRES_12P_fx ) ) @@ -863,7 +897,7 @@ void HQ_FEC_Mem_update_fx( } /* Apply Hysteresis to prevent frequent mode changing */ - IF( EQ_16( hHQ_nbfec->stat_mode_old, stat_mode_curr ) ) + if ( EQ_16( hHQ_nbfec->stat_mode_old, stat_mode_curr ) ) { hHQ_nbfec->stat_mode_out = stat_mode_curr; move16(); @@ -912,6 +946,7 @@ void HQ_FEC_Mem_update_fx( FOR( i = k; i < num_Sb; i++ ) { en_high_fx[i] = L_deposit_l( 0 ); + move16(); FOR( j = 0; j < 2; j++ ) { /*en_high[i] += 0.5f*st->ynrm_values[i][j+1];*/ @@ -934,8 +969,10 @@ void HQ_FEC_Mem_update_fx( #else *mean_en_high_fx = add( *mean_en_high_fx, shr( tmp_fx, sub( exp, 5 ) ) ); #endif + move16(); } - *mean_en_high_fx = mult( *mean_en_high_fx, inv_tbl_fx[num_Sb - k] ); + *mean_en_high_fx = mult( *mean_en_high_fx, inv_tbl_fx[sub( num_Sb, k )] ); + move16(); test(); test(); @@ -946,12 +983,12 @@ void HQ_FEC_Mem_update_fx( test(); test(); test(); - IF( ( LT_16( Min_ind, 5 ) ) && ( LT_16( abs_s( sub( Min_ind, hHQ_nbfec->old_Min_ind ) ), 2 ) ) && ( LT_16( hHQ_nbfec->diff_energy_fx, ED_THRES_90P_fx ) ) && ( !st_fx->bfi ) && ( !st_fx->prev_bfi ) && ( !st_fx->prev_old_bfi ) && ( !is_transient ) && ( !hHQ_core->old_is_transient[1] ) && ( hHQ_nbfec->prev_last_core == HQ_CORE ) && ( st_fx->last_core == HQ_CORE ) ) + IF( ( LT_16( Min_ind, 5 ) ) && ( LT_16( abs_s( sub( Min_ind, hHQ_nbfec->old_Min_ind ) ), 2 ) ) && ( LT_16( hHQ_nbfec->diff_energy_fx, ED_THRES_90P_fx ) ) && ( !st_fx->bfi ) && ( !st_fx->prev_bfi ) && ( !st_fx->prev_old_bfi ) && ( !is_transient ) && ( !hHQ_core->old_is_transient[1] ) && EQ_16( hHQ_nbfec->prev_last_core, HQ_CORE ) && EQ_16( st_fx->last_core, HQ_CORE ) ) { hHQ_nbfec->phase_mat_flag = 1; move16(); test(); - if ( ( Min_ind == 0 ) && ( LT_16( Max_ind, 3 ) ) ) + if ( Min_ind == 0 && ( LT_16( Max_ind, 3 ) ) ) { hHQ_nbfec->phase_mat_flag = 0; move16(); @@ -1005,20 +1042,22 @@ void HQ_FEC_Mem_update_fx( Word32 Rxy_fx[MAXDELAY_FEC], Ryy_fx[MAXDELAY_FEC]; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif + move16(); // d1m d1 = mind1; move16(); - FOR( k = 0; k < ( maxd1 - mind1 ) / delta; k++ ) + FOR( k = 0; k < idiv1616( sub( maxd1, mind1 ), delta ); k++ ) { accA_fx = L_deposit_l( 0 ); accB_fx = L_deposit_l( 0 ); FOR( i = 0; i < lin; i += delta ) { #ifdef BASOP_NOGLOB - accA_fx = L_add_sat( accA_fx, L_shr( L_mult_sat( mu_o_fx[d1 + i], mu_o_fx[d1 + i] ), 2 ) ); - accB_fx = L_add_sat( accB_fx, L_shr( L_mult_sat( mu_o_fx[d1 + i], in_fx[i] ), 2 ) ); + accA_fx = L_add_sat( accA_fx, L_shr( L_mult_sat( mu_o_fx[add(d1 , i)], mu_o_fx[add(d1 , i)] ), 2 ) ); + accB_fx = L_add_sat( accB_fx, L_shr( L_mult_sat( mu_o_fx[add(d1 , i)], in_fx[i] ), 2 ) ); #else accA_fx = L_add( accA_fx, L_shr( L_mult( mu_o_fx[d1 + i], mu_o_fx[d1 + i] ), 2 ) ); accB_fx = L_add( accB_fx, L_shr( L_mult( mu_o_fx[d1 + i], in_fx[i] ), 2 ) ); @@ -1041,7 +1080,7 @@ void HQ_FEC_Mem_update_fx( move16(); FOR( d1 = 0; d1 < ( maxd1 - mind1 ) / delta; d1++ ) { - IF( L_abs( Rxy_fx[d1] ) > L_abs( Ryy_fx[d1] ) ) + IF( GT_32( L_abs( Rxy_fx[d1] ), L_abs( Ryy_fx[d1] ) ) ) exp1 = norm_l( Rxy_fx[d1] ); ELSE exp1 = norm_l( Ryy_fx[d1] ); @@ -1120,7 +1159,7 @@ void HQ_FEC_Mem_update_fx( maxd1 = mult_r( L, 19661 ); /* max value of delay d1 to search for */ /*in = mu_o + 2*L -lin; */ - in_fx = mu_o_fx + 2 * L - lin; + in_fx = mu_o_fx + sub( shl( L, 1 ), lin ); move16(); /* generate correlation */ @@ -1158,7 +1197,7 @@ void HQ_FEC_Mem_update_fx( lin = mult_r( L, 9830 ); mind1 = mult_r( L, 14746 ); /* min value of delay d1 to search for */ maxd1 = mult_r( L, 22938 ); /* max value of delay d1 to search for */ - in_fx = mu_o_fx + 2 * L - lin; + in_fx = mu_o_fx + sub( shl( L, 1 ), lin ); move16(); /* generate correlation */ @@ -1216,23 +1255,23 @@ void HQ_FEC_Mem_update_fx( L = L_FRAME8k; move16(); - ol_size = 2 * L / 20; + ol_size = idiv1616( shl( L, 1 ), 20 ); move16(); - L_overlap = 3 * L / 20; + L_overlap = idiv1616( imult1616( 3, L ), 20 ); move16(); FOR( i = 0; i < L_overlap; i++ ) { - SmoothingWin_NB3_fx[i] = SmoothingWin_NB875_fx[i * 3]; + SmoothingWin_NB3_fx[i] = SmoothingWin_NB875_fx[imult1616(i , 3)]; move16(); } - FOR( i = 0; i < L + 25; i++ ) + FOR( i = 0; i < add( L, 25 ); i++ ) { - win_NB_fx[i] = window_48kHz_fx[i * 6 + 3]; + win_NB_fx[i] = window_48kHz_fx[add( imult1616( i, 6 ), 3 )]; move16(); } - set16_fx( ImdctOutWin_fx, 0, 2 * L ); + set16_fx( ImdctOutWin_fx, 0, shl( L, 1 ) ); pos = Search_Max_Corr_fx( st_fx->old_auOut_2fr_fx, st_fx->old_Min_ind, L ); @@ -1242,27 +1281,28 @@ void HQ_FEC_Mem_update_fx( } /* Repetition */ - remain = L + N_Z_L_NB - ( ( 2 * L ) - pos ); - move16(); - Copy( &st_fx->old_auOut_2fr_fx[pos], &ImdctOutWin_fx[N_ZERO_NB], ( 2 * L ) - pos ); + remain = sub( add( L, N_Z_L_NB ), sub( shl( L, 1 ), pos ) ); + Copy( &st_fx->old_auOut_2fr_fx[pos], &ImdctOutWin_fx[N_ZERO_NB], sub( shl( L, 1 ), pos ) ); /* OldauOut without windowing */ - FOR( i = N_ZERO_NB; i < L / 2; i++ ) + FOR( i = N_ZERO_NB; i < shr( L, 1 ); i++ ) { - OldauOutnoWin_fx[i - N_ZERO_NB] = extract_l( L_shr( L_negate( st_fx->oldIMDCTout_fx[L / 2 - 1 - i] ), 6 ) ); + OldauOutnoWin_fx[i - N_ZERO_NB] = extract_l( L_shr( L_negate( st_fx->oldIMDCTout_fx[sub( sub( shr( L, 1 ), 1 ), i )] ), 6 ) ); + move16(); } - FOR( i = 0; i < L / 2; i++ ) + FOR( i = 0; i < shr( L, 1 ); i++ ) { OldauOutnoWin_fx[i + N_ZERO_O_NB] = extract_l( L_shr( L_negate( st_fx->oldIMDCTout_fx[i] ), 6 ) ); + move16(); } - Copy( OldauOutnoWin_fx, &ImdctOutWin_fx[N_ZERO_NB + ( 2 * L ) - pos], remain ); + Copy( OldauOutnoWin_fx, &ImdctOutWin_fx[add( N_ZERO_NB, sub( shl( L, 1 ), pos ) )], remain ); pow1_fx = L_deposit_l( 0 ); pow22_fx = L_deposit_l( 0 ); FOR( i = 0; i < L; i++ ) { - pow1_fx = L_add( pow1_fx, shr( abs_s( st_fx->old_auOut_2fr_fx[L + i] ), 1 ) ); + pow1_fx = L_add( pow1_fx, shr( abs_s( st_fx->old_auOut_2fr_fx[add(L , i)] ), 1 ) ); pow22_fx = L_add( pow22_fx, shr( abs_s( ImdctOutWin_fx[N_ZERO_NB + i] ), 1 ) ); } IF( pow22_fx != 0 ) @@ -1271,40 +1311,43 @@ void HQ_FEC_Mem_update_fx( exp2 = norm_l( pow22_fx ); tmp = div_s( extract_h( L_shl( pow1_fx, exp1 ) ), extract_h( L_shl( pow22_fx, exp2 ) ) ); /*15 + exp1 - exp2*/ tmp = shl( tmp, sub( sub( exp2, exp1 ), 1 ) ); /*14*/ - FOR( i = N_ZERO_NB; i < 2 * L; i++ ) + FOR( i = N_ZERO_NB; i < shl( L, 1 ); i++ ) { #ifdef BASOP_NOGLOB ImdctOutWin_fx[i] = shl_sat( mult( ImdctOutWin_fx[i], tmp ), 1 ); #else ImdctOutWin_fx[i] = shl( mult( ImdctOutWin_fx[i], tmp ), 1 ); #endif + move16(); } } Smoothing_vector_NB_fx( OldauOutnoWin_fx, &ImdctOutWin_fx[N_ZERO_NB], SmoothingWin_NB2_fx, auOut_fx, ol_size ); - FOR( i = 0; i < L / 2; i++ ) + FOR( i = 0; i < shr( L, 1 ); i++ ) { /*ImdctOutWin[3*L/2 + i] *= win_NB[L/2-i-1];*/ - ImdctOutWin_fx[3 * L / 2 + i] = mult( ImdctOutWin_fx[3 * L / 2 + i], win_NB_fx[L / 2 - i - 1] ); + ImdctOutWin_fx[add( shr( imult1616( 3, L ), 1 ), i )] = mult( ImdctOutWin_fx[add( shr( imult1616( 3, L ), 1 ), i )], win_NB_fx[sub( sub( shr( L, 1 ), i ), 1 )] ); move16(); } - FOR( i = N_ZERO_NB; i < L / 2; i++ ) + FOR( i = N_ZERO_NB; i < shr( L, 1 ); i++ ) { /*ImdctOutWin_fx[L + i] *= win_NB_fx[(L-1-i)];*/ - ImdctOutWin_fx[L + i] = mult( ImdctOutWin_fx[L + i], win_NB_fx[( L - 1 - i )] ); + ImdctOutWin_fx[add( L, i )] = mult( ImdctOutWin_fx[add( L, i )], win_NB_fx[sub( sub( L, 1 ), i )] ); move16(); } Copy( &ImdctOutWin_fx[N_Z_L_O_NB], &OldauOut_pha_fx[0][0], N_LEAD_NB ); - Copy( &ImdctOutWin_fx[ol_size + N_ZERO_NB], &auOut_fx[ol_size], N_Z_L_NB - ol_size ); + Copy( &ImdctOutWin_fx[add( ol_size, N_ZERO_NB )], &auOut_fx[ol_size], sub( N_Z_L_NB, ol_size ) ); Copy( &ImdctOutWin_fx[L], &auOut_fx[N_Z_L_NB], N_ZERO_NB ); Copy( &ImdctOutWin_fx[L], OldauOut_fx, L ); - FOR( i = 0; i < L / 2; i++ ) + FOR( i = 0; i < shr( L, 1 ); i++ ) { - OldauOut2_fx[i] = extract_l( L_shr( L_negate( ImdctOut_fx[L / 2 - 1 - i] ), 6 ) ); - OldauOut2_fx[L / 2 + i] = extract_l( L_shr( L_negate( ImdctOut_fx[i] ), 6 ) ); + OldauOut2_fx[i] = extract_l( L_shr( L_negate( ImdctOut_fx[sub( sub( shr( L, 1 ), 1 ), i )] ), 6 ) ); + move16(); + OldauOut2_fx[add( shr( L, 1 ), i )] = extract_l( L_shr( L_negate( ImdctOut_fx[i] ), 6 ) ); + move16(); } Smoothing_vector_NB_fx( &ImdctOutWin_fx[N_Z_L_O_NB], &OldauOut2_fx[N_ZERO_NB], SmoothingWin_NB3_fx, &OldauOut_pha_fx[1][0], L_overlap ); @@ -1338,7 +1381,7 @@ void HQ_FEC_Mem_update_fx( FOR( i = 0; i < L + 25; i++ ) { /* win_NB[i] = window_48kHz[i*6+3]; */ - win_NB_fx[i] = window_48kHz_fx[i * 6 + 3]; + win_NB_fx[i] = window_48kHz_fx[add( imult1616( i, 6 ), 3 )]; move16(); } @@ -1361,7 +1404,7 @@ void HQ_FEC_Mem_update_fx( FOR( i = 0; i < N_LEAD_NB; i++ ) { /* OldOut_pha[i] *= SmoothingWin_NB875[L_overlap-i-1]; */ - OldOut_pha_fx[i] = mult( OldOut_pha_fx[i], SmoothingWin_NB875_fx[L_overlap - i - 1] ); + OldOut_pha_fx[i] = mult( OldOut_pha_fx[i], SmoothingWin_NB875_fx[sub( sub( L_overlap, i ), 1 )] ); move16(); } @@ -1408,7 +1451,7 @@ void HQ_FEC_Mem_update_fx( L = L_FRAME8k; move16(); - L_overlap = 3 * L / 20; + L_overlap = idiv1616( imult1616( 3, L ), 20 ); move16(); FOR( i = 0; i < L_overlap; i++ ) @@ -1417,9 +1460,9 @@ void HQ_FEC_Mem_update_fx( move16(); } - FOR( i = 0; i < L + 25; i++ ) + FOR( i = 0; i < add( L, 25 ); i++ ) { - win_NB_fx[i] = window_48kHz_fx[i * 6 + 3]; + win_NB_fx[i] = window_48kHz_fx[add( imult1616( i, 6 ), 3 )]; move16(); } @@ -1439,12 +1482,14 @@ void HQ_FEC_Mem_update_fx( Copy( &ImdctOutWin_fx[L], OldauOut_fx, L ); Scaledown_fx( prev_oldauOut_fx, prev_oldauOut_fx, 23170, L ); - FOR( i = 0; i < L / 2; i++ ) + FOR( i = 0; i < shr( L, 1 ); i++ ) { /* OldauOut2[i] = -ImdctOut[L/2 - 1 - i];*/ /* OldauOut2[L/2+i] = -ImdctOut[i];*/ - OldauOut2_fx[i] = extract_l( L_shr( L_negate( ImdctOut_fx[L / 2 - 1 - i] ), 6 ) ); - OldauOut2_fx[L / 2 + i] = extract_l( L_shr( L_negate( ImdctOut_fx[i] ), 6 ) ); + OldauOut2_fx[i] = extract_l( L_shr( L_negate( ImdctOut_fx[sub( sub( shr( L, 1 ), 1 ), i )] ), 6 ) ); + move16(); + OldauOut2_fx[add( shr( L, 1 ), i )] = extract_l( L_shr( L_negate( ImdctOut_fx[i] ), 6 ) ); + move16(); } Smoothing_vector_NB_fx( &ImdctOutWin_fx[N_Z_L_O_NB], &OldauOut2_fx[N_ZERO_NB], SmoothingWin_NB3_fx, &OldauOut_pha_fx[1][0], L_overlap ); @@ -1480,19 +1525,21 @@ void HQ_FEC_Mem_update_fx( FOR( i = 0; i < L_FRAME8k + 25; i++ ) { /*win_NB[i] = window_48kHz[i*6+3];*/ - win_NB_fx[i] = window_48kHz_fx[i * 6 + 3]; + win_NB_fx[i] = window_48kHz_fx[add( imult1616( i, 6 ), 3 )]; move16(); } - FOR( i = N_ZERO_NB; i < L / 2; i++ ) + FOR( i = N_ZERO_NB; i < shr( L, 1 ); i++ ) { /*OldauOut[i-N_ZERO_NB] = -OldImdctOut[L/2 - 1 - i];*/ - OldauOut_fx[i - N_ZERO_NB] = extract_l( L_shr( L_negate( OldImdctOut_fx[L / 2 - 1 - i] ), 6 ) ); /* Q6 -> Q0 */ + OldauOut_fx[i - N_ZERO_NB] = extract_l( L_shr( L_negate( OldImdctOut_fx[sub( sub( shr( L, 1 ), 1 ), i )] ), 6 ) ); /* Q6 -> Q0 */ + move16(); } - FOR( i = 0; i < L / 2; i++ ) + FOR( i = 0; i < shr( L, 2 ); i++ ) { /*OldauOut[i+N_ZERO_O_NB] = -OldImdctOut[i];*/ OldauOut_fx[i + N_ZERO_O_NB] = extract_l( L_shr( L_negate( OldImdctOut_fx[i] ), 6 ) ); /* Q6 -> Q0 */ + move16(); } /* Overlapping with next good frame : Overlapping to remove the discontinuity */ @@ -1501,21 +1548,23 @@ void HQ_FEC_Mem_update_fx( ol_size = N_LEAD_NB; move16(); - FOR( i = N_ZERO_NB; i < L / 2; i++ ) + FOR( i = N_ZERO_NB; i < shr( L, 1 ); i++ ) { /* ImdctOutWin[i+L] = -ImdctOut[L/2 - 1 - i]; */ - ImdctOutWin_fx[i + L] = extract_l( L_shr( L_negate( ImdctOut_fx[L / 2 - 1 - i] ), 6 ) ); + ImdctOutWin_fx[add( i, L )] = extract_l( L_shr( L_negate( ImdctOut_fx[sub( sub( shr( L, 1 ), 1 ), i )] ), 6 ) ); + move16(); } - FOR( i = 0; i < L / 2; i++ ) + FOR( i = 0; i < shr( L, 1 ); i++ ) { - ImdctOutWin_fx[i + 3 * L / 2] = extract_l( L_shr( L_negate( ImdctOut_fx[i] ), 6 ) ); + ImdctOutWin_fx[add( i, shr( imult1616( 3, L ), 1 ) )] = extract_l( L_shr( L_negate( ImdctOut_fx[i] ), 6 ) ); + move16(); } /*a = (float)(1./(float)(ol_size)); y = ax */ Smoothing_vector_scaledown_NB_fx( OldauOut_fx, &ImdctOutWin_fx[N_Z_L_O_NB], SmoothingWin_NB875_fx, OldauOut_fx, ol_size ); /* Scale down the overlapped signal */ - Scaledown_fx( &ImdctOutWin_fx[ol_size + N_Z_L_O_NB], &OldauOut_fx[ol_size], 23170, N_Z_L_NB - ol_size ); + Scaledown_fx( &ImdctOutWin_fx[add( ol_size, N_Z_L_O_NB )], &OldauOut_fx[ol_size], 23170, sub( N_Z_L_NB, ol_size ) ); } L_overlap = overlap_time; @@ -1523,7 +1572,7 @@ void HQ_FEC_Mem_update_fx( FOR( i = 0; i < L_overlap; i++ ) { /*OldauOut[i] *= SmoothingWin_NB875[L_overlap-i-1];*/ - OldauOut_fx[i] = mult( OldauOut_fx[i], SmoothingWin_NB875_fx[L_overlap - i - 1] ); + OldauOut_fx[i] = mult( OldauOut_fx[i], SmoothingWin_NB875_fx[sub( sub( L_overlap, i ), 1 )] ); move16(); } FOR( i = L_overlap; i < L; i++ ) @@ -1574,7 +1623,7 @@ void HQ_FEC_Mem_update_fx( FOR( i = 0; i < L_FRAME8k + 25; i++ ) { /*win_NB[i] = window_48kHz[i*6+3];*/ - win_NB_fx[i] = window_48kHz_fx[i * 6 + 3]; + win_NB_fx[i] = window_48kHz_fx[add( imult1616( i, 6 ), 3 )]; move16(); } @@ -1586,13 +1635,15 @@ void HQ_FEC_Mem_update_fx( common_overlapping_fx( auOut_fx, ImdctOutWin_fx, prev_oldauOut_fx, N_Z_L_NB, 0, N_Z_L_NB, L, N_ZERO_NB, 0 ); /* OldauOut without windowing */ - FOR( i = N_ZERO_NB; i < L / 2; i++ ) + FOR( i = N_ZERO_NB; i < shr( L, 1 ); i++ ) { - OldauOutnoWin_fx[i - N_ZERO_NB] = extract_l( L_shr( L_negate( OldImdctOut_fx[L / 2 - 1 - i] ), 6 ) ); + OldauOutnoWin_fx[i - N_ZERO_NB] = extract_l( L_shr( L_negate( OldImdctOut_fx[sub( sub( shr( L, 1 ), 1 ), i )] ), 6 ) ); + move16(); } - FOR( i = 0; i < L / 2; i++ ) + FOR( i = 0; i < shr( L, 1 ); i++ ) { OldauOutnoWin_fx[i + N_ZERO_O_NB] = extract_l( L_shr( L_negate( OldImdctOut_fx[i] ), 6 ) ); + move16(); } /* data transition from OldauOut to auOut using smoothing win*/ @@ -1600,14 +1651,14 @@ void HQ_FEC_Mem_update_fx( pow1_fx = L_deposit_l( 0 ); pow22_fx = L_deposit_l( 0 ); - FOR( i = 0; i < 4 * L / 20; i++ ) + FOR( i = 0; i < idiv1616( imult1616( 4, L ), 20 ); i++ ) { - pow1_fx = L_add( pow1_fx, Mult_32_32( L_shl( (Word32) auOut_fx[1 * L / 20 + i], 6 ), L_shl( (Word32) auOut_fx[1 * L / 20 + i], 6 ) ) ); + pow1_fx = L_add( pow1_fx, Mult_32_32( L_shl( (Word32) auOut_fx[add( idiv1616( L, 20 ), i )], 6 ), L_shl( (Word32) auOut_fx[add( idiv1616( L, 20 ), i )], 6 ) ) ); pow22_fx = L_add( pow22_fx, Mult_32_32( L_shl( (Word32) auOut_fx[N_LEAD_NB + i], 6 ), L_shl( (Word32) auOut_fx[N_LEAD_NB + i], 6 ) ) ); } - IF( pow22_fx > L_add( pow1_fx, L_shl( pow1_fx, 1 ) ) ) + IF( GT_32( pow22_fx, L_add( pow1_fx, L_shl( pow1_fx, 1 ) ) ) ) { return 1; } @@ -1637,7 +1688,7 @@ void HQ_FEC_Mem_update_fx( { /*auOut_fx[i] = L_add(ImdctOutWin_fx[i+7*L/20], OldauOut_fx[i+offset1]);*/ #ifdef BASOP_NOGLOB - auOut_fx[i] = add_sat( ImdctOutWin_fx[i + N_ZERO_NB], OldauOut_fx[i + offset1] ); + auOut_fx[i] = add_sat( ImdctOutWin_fx[i + N_ZERO_NB], OldauOut_fx[add( i, offset1 )] ); #else auOut_fx[i] = add( ImdctOutWin_fx[i + N_ZERO_NB], OldauOut_fx[i + offset1] ); #endif @@ -1646,7 +1697,7 @@ void HQ_FEC_Mem_update_fx( FOR( i = start2; i < end2; i++ ) { /*auOut_fx[i+offset2] = ImdctOutWin_fx[i+offset_i2]; move32();*/ - auOut_fx[i + offset2] = ImdctOutWin_fx[i + offset_i2]; + auOut_fx[add( i, offset2 )] = ImdctOutWin_fx[add( i, offset_i2 )]; move16(); } @@ -1692,34 +1743,40 @@ void HQ_FEC_Mem_update_fx( move16(); IF( smoothing_flag == 0 ) { - FOR( i = N_ZERO_NB; i < L / 2; i++ ) + FOR( i = N_ZERO_NB; i < shr( L, 1 ); i++ ) { /*ImdctOutWin[i] = ImdctOut[L/2 + i] * win[(2*L-1-i)-N_LEAD_O_NB];*/ - ImdctOutWin_fx[i] = extract_l( L_shr( Mult_32_16( ImdctOut_fx[L / 2 + i], win_fx[( 2 * L - 1 - i ) - N_LEAD_O_NB] ), 6 ) ); + ImdctOutWin_fx[i] = extract_l( L_shr( Mult_32_16( ImdctOut_fx[add( shr( L, 1 ), i )], win_fx[sub( sub( sub( shl( L, 1 ), 1 ), i ), N_LEAD_O_NB )] ), 6 ) ); + move16(); } FOR( i = 0; i < N_ZERO_O_NB; i++ ) { /*ImdctOutWin[L/2 + i] = -ImdctOut[L - 1 - i] * win[(3*L/2-1-i)-N_LEAD_O_NB];*/ /*ImdctOutWin[3*L/2 + i] = -ImdctOut[i] * win[(L/2-i-1)];*/ - ImdctOutWin_fx[L / 2 + i] = extract_l( L_shr( Mult_32_16( L_negate( ImdctOut_fx[L - 1 - i] ), win_fx[( 3 * L / 2 - 1 - i ) - N_LEAD_O_NB] ), 6 ) ); - ImdctOutWin_fx[3 * L / 2 + i] = extract_l( L_shr( Mult_32_16( L_negate( ImdctOut_fx[i] ), win_fx[( L / 2 - i - 1 )] ), 6 ) ); + ImdctOutWin_fx[add( shr( L, 1 ), i )] = extract_l( L_shr( Mult_32_16( L_negate( ImdctOut_fx[sub( sub( L, 1 ), i )] ), win_fx[sub( ( sub( sub( shr( imult1616( 3, L ), 1 ), 1 ), i ) ), N_LEAD_O_NB )] ), 6 ) ); + move16(); + ImdctOutWin_fx[add( idiv1616( imult1616( 3, L ), 1 ), i )] = extract_l( L_shr( Mult_32_16( L_negate( ImdctOut_fx[i] ), win_fx[sub( sub( shr( L, 1 ), i ), 1 )] ), 6 ) ); + move16(); } } ELSE { - FOR( i = N_ZERO_NB; i < L / 2; i++ ) + FOR( i = N_ZERO_NB; i < shr( L, 1 ); i++ ) { - /*ImdctOutWin[i] = ImdctOut[L/2 + i] * smoothingWin[(i-N_ZERO_NB)];*/ /*win[(2*L-i)*decimate-1-decay-14*L_FRAME48k/20];*/ - ImdctOutWin_fx[i] = extract_l( L_shr( Mult_32_16( ImdctOut_fx[L / 2 + i], smoothingWin_fx[( i - N_ZERO_NB )] ), 6 ) ); /*win[(2*L-i)*decimate-1-decay-14*L_FRAME48k/20];*/ + /*ImdctOutWin[i] = ImdctOut[L/2 + i] * smoothingWin[(i-N_ZERO_NB)];*/ /*win[(2*L-i)*decimate-1-decay-14*L_FRAME48k/20];*/ + ImdctOutWin_fx[i] = extract_l( L_shr( Mult_32_16( ImdctOut_fx[add( shr( L, 1 ), i )], smoothingWin_fx[sub( i, N_ZERO_NB )] ), 6 ) ); /*win[(2*L-i)*decimate-1-decay-14*L_FRAME48k/20];*/ + move16(); } FOR( i = 0; i < N_ZERO_O_NB; i++ ) { /*ImdctOutWin[L/2 + i] = -ImdctOut[L - 1 - i] * smoothingWin[(i+N_ZERO_O_NB)];*/ /*win[(3*L/2-1-i)*decimate+decay-L_FRAME48k*14/20];*/ /*ImdctOutWin[3*L/2 + i] = -ImdctOut[i] * win[(L/2-i-1)];*/ - ImdctOutWin_fx[L / 2 + i] = extract_l( L_shr( Mult_32_16( L_negate( ImdctOut_fx[L - 1 - i] ), smoothingWin_fx[( i + N_ZERO_O_NB )] ), 6 ) ); /*win[(3*L/2-1-i)*decimate+decay-L_FRAME48k*14/20];*/ - ImdctOutWin_fx[3 * L / 2 + i] = extract_l( L_shr( Mult_32_16( L_negate( ImdctOut_fx[i] ), win_fx[( L / 2 - i - 1 )] ), 6 ) ); + ImdctOutWin_fx[add( shr( L, 1 ), i )] = extract_l( L_shr( Mult_32_16( L_negate( ImdctOut_fx[sub( sub( L, 1 ), i )] ), smoothingWin_fx[add( i, N_ZERO_O_NB )] ), 6 ) ); /*win[(3*L/2-1-i)*decimate+decay-L_FRAME48k*14/20];*/ + move16(); + ImdctOutWin_fx[add( shr( imult1616( 3, L ), 1 ), i )] = extract_l( L_shr( Mult_32_16( L_negate( ImdctOut_fx[i] ), win_fx[sub( sub( shr( L, 1 ), i ), 1 )] ), 6 ) ); + move16(); } } @@ -1736,24 +1793,28 @@ void HQ_FEC_Mem_update_fx( L = L_FRAME8k; move16(); - FOR( i = N_ZERO_O_NB; i < L / 2; i++ ) + FOR( i = N_ZERO_O_NB; i < shr( L, 1 ); i++ ) { /*ImdctOutWin[L/2 + i] = -ImdctOut[L - 1 - i];*/ /*ImdctOutWin[3*L/2 + i] = -ImdctOut[i] * win[L/2-i-1];*/ - ImdctOutWin_fx[L / 2 + i] = extract_l( L_shr( L_negate( ImdctOut_fx[L - 1 - i] ), 6 ) ); - ImdctOutWin_fx[3 * L / 2 + i] = extract_l( L_shr( Mult_32_16( L_negate( ImdctOut_fx[i] ), win_fx[L / 2 - i - 1] ), 6 ) ); + ImdctOutWin_fx[add( shr( L, 1 ), i )] = extract_l( L_shr( L_negate( ImdctOut_fx[sub( sub( L, 1 ), i )] ), 6 ) ); + move16(); + ImdctOutWin_fx[add( shr( imult1616( 3, L ), 1 ), i )] = extract_l( L_shr( Mult_32_16( L_negate( ImdctOut_fx[i] ), win_fx[sub( sub( shr( L, 1 ), i ), 1 )] ), 6 ) ); + move16(); } FOR( i = 0; i < N_ZERO_NB; i++ ) { /*ImdctOutWin[L + i] = -ImdctOut[L/2 - 1 - i];*/ - ImdctOutWin_fx[L + i] = extract_l( L_shr( L_negate( ImdctOut_fx[L / 2 - 1 - i] ), 6 ) ); + ImdctOutWin_fx[add( L, i )] = extract_l( L_shr( L_negate( ImdctOut_fx[sub( sub( shr( L, 1 ), 1 ), i )] ), 6 ) ); + move16(); } - FOR( i = N_ZERO_NB; i < L / 2; i++ ) + FOR( i = N_ZERO_NB; i < shr( L, 1 ); i++ ) { /*ImdctOutWin[L + i] = -ImdctOut[L/2 - 1 - i] * win[L - 1 - i];*/ - ImdctOutWin_fx[L + i] = extract_l( L_shr( Mult_32_16( L_negate( ImdctOut_fx[L / 2 - 1 - i] ), win_fx[L - 1 - i] ), 6 ) ); + ImdctOutWin_fx[add( L, i )] = extract_l( L_shr( Mult_32_16( L_negate( ImdctOut_fx[sub( sub( shr( L, 1 ), 1 ), i )] ), win_fx[sub( sub( L, 1 ), i )] ), 6 ) ); + move16(); } return; @@ -1828,7 +1889,7 @@ void HQ_FEC_Mem_update_fx( test(); test(); test(); - IF( ( EQ_16( st_fx->nbLostCmpt, 1 ) ) && ( EQ_16( hHQ_nbfec->phase_mat_flag, 1 ) ) && ( EQ_16( hHQ_nbfec->phase_mat_next, 0 ) ) ) + IF( ( EQ_16( st_fx->nbLostCmpt, 1 ) ) && ( EQ_16( hHQ_nbfec->phase_mat_flag, 1 ) ) && ( hHQ_nbfec->phase_mat_next == 0 ) ) { IF( FEC_phase_matching_fx( hHQ_nbfec, wtda_audio_fx, out_fx, hHQ_core->old_out_fx, hHQ_nbfec->old_out_pha_fx ) ) { @@ -1874,9 +1935,11 @@ void HQ_FEC_Mem_update_fx( Word16 tmp; tmp = 0; + move16(); if ( GT_16( st_fx->old_bfi_cnt, 1 ) ) { tmp = 1; + move16(); } Repetition_smoothing_nextgood_fx( wtda_audio_fx, out_fx, hHQ_nbfec->oldIMDCTout_fx, hHQ_core->old_out_fx, tmp, N_LEAD_NB ); *Q_synth = 0; @@ -1939,9 +2002,9 @@ void HQ_FEC_Mem_update_fx( L = L_FRAME8k; move16(); - FOR( i = 0; i < L + 25; i++ ) + FOR( i = 0; i < add( L, 25 ); i++ ) { - win_NB_fx[i] = window_48kHz_fx[i * 6 + 3]; + win_NB_fx[i] = window_48kHz_fx[add( imult1616( i, 6 ), 3 )]; move16(); } @@ -1953,7 +2016,7 @@ void HQ_FEC_Mem_update_fx( Smoothing_vector_scaledown_NB_fx( &OldauOut_fx[N_ZERO_NB], &ImdctOutWin_fx[N_Z_L_O_NB], SmoothingWin_NB875_fx, &OldauOut_fx[N_ZERO_NB], ol_size ); /* Scale down the overlapped signal */ - Scaledown_fx( &ImdctOutWin_fx[ol_size + N_Z_L_O_NB], &OldauOut_fx[ol_size + N_ZERO_NB], 23170, N_Z_L_NB - ol_size ); + Scaledown_fx( &ImdctOutWin_fx[add( ol_size, N_Z_L_O_NB )], &OldauOut_fx[add( ol_size, N_ZERO_NB )], 23170, sub( N_Z_L_NB, ol_size ) ); /* Common Overlapping */ common_overlapping_fx( auOut_fx, ImdctOutWin_fx, OldauOut_fx, N_Z_L_NB, N_ZERO_NB, 0, N_ZERO_NB, L, N_Z_L_NB ); diff --git a/lib_dec/FEC_HQ_phase_ecu_fx.c b/lib_dec/FEC_HQ_phase_ecu_fx.c index e43cf7f25..bd63131d1 100644 --- a/lib_dec/FEC_HQ_phase_ecu_fx.c +++ b/lib_dec/FEC_HQ_phase_ecu_fx.c @@ -193,7 +193,7 @@ static Word16 ivas_imax2_jacobsen_mag_fx( denom = L_add( L_mult0( D_re, D_re ), L_mult0( D_im, D_im ) ); test(); - IF( NE_32( numer, 0 ) && NE_32( denom, 0 ) ) + IF( numer != 0 && denom != 0 ) { tmp = BASOP_Util_Divide3232_Scale( numer, denom, &tmp_e ); tmp = shl_sat( tmp, tmp_e ); // Q15 @@ -202,6 +202,7 @@ static Word16 ivas_imax2_jacobsen_mag_fx( ELSE { posi = 0; /* flat top, division is not possible choose center freq */ + move16(); } return posi; @@ -296,6 +297,7 @@ static void fft_spec2_fx( pMagSq = &xMagSq[0]; pRe = &x[0]; *pMagSq++ = L_mult0( *pRe, *pRe ); + move32(); pRe++; /* Non-fractional multiply gives subsequent group power accumulation a bit headroom. */ /* From 1 to (N/2 - 1). */ @@ -357,7 +359,16 @@ static void trans_ana_fx( Word32 acc; Lgw = 0; + move16(); LtranaLogMinus1 = 0; + move16(); + + move16(); // att_always + move16(); // burst_phdith_thresh + move16(); // burst_att_thresh + move16(); // att_per_frame + move16(); // burst_phdith_rampup_len + pFftTbl = NULL; /* Initialisation to prevent warnings */ @@ -385,13 +396,11 @@ static void trans_ana_fx( oneOverFrame = 51; /* 1/640 in Q15 */ move16(); w_hamm = w_hamm32k_2_fx; - move16(); Lgw = LGW32K; move16(); Lprot = 1024; move16(); pFftTbl = FFT_W128; /* Table for 256 real input radix-2 FFT */ - move16(); LtranaLogMinus1 = LTRANALOG32K - 1; move16(); } @@ -400,13 +409,11 @@ static void trans_ana_fx( oneOverFrame = 102; /* 1/320 in Q15 */ move16(); w_hamm = w_hamm16k_2_fx; - move16(); Lgw = LGW16K; move16(); Lprot = 512; move16(); pFftTbl = FFT_W64; /* Table for 128 real input radix-2 FFT */ - move16(); LtranaLogMinus1 = LTRANALOG16K - 1; move16(); } @@ -516,7 +523,9 @@ static void trans_ana_fx( /* band powers in frequency groups * exclude bin at PI from calculation */ magSqLeft[Ltrana_2] = L_deposit_l( 0 ); + move32(); magSqRight[Ltrana_2] = L_deposit_l( 0 ); + move32(); } pGrPowLeft = &gr_pow_left[0]; @@ -536,7 +545,9 @@ static void trans_ana_fx( pLeft = magSqLeft + lowerEdge; pRight = magSqRight + lowerEdge; *pGrPowLeft = L_deposit_l( 0 ); + move32(); *pGrPowRight = L_deposit_l( 0 ); + move32(); FOR( i = 0; i < l; i++ ) { acc = L_shr( *pLeft++, headroom ); /* Scale down to prevent from saturation. */ @@ -561,6 +572,7 @@ static void trans_ana_fx( expo = shr( expo, 1 ); Xavg[k] = round_fx( L_shl( acc, sub( sub( 16, expo ), 2 ) ) ); /* Q0, additional right shift by 2 to account for that Xavg is calculated using lenght N/4 fft but is applied on a fft of length N */ + move16(); /*dither phase in case of transient */ /* separate transition detection and application of forced burst dithering */ @@ -598,9 +610,9 @@ static void trans_ana_fx( #endif att_val = 32767; move16(); - IF( GT_32( *pGrPowRight, 0 ) ) + IF ( *pGrPowRight > 0 ) { - IF( LT_32( *pGrPowRight, *pGrPowLeft ) ) /* i.e., (gr_pow_right/gr_pow_left) < 1.0 */ + IF ( LT_32( *pGrPowRight, *pGrPowLeft ) ) /* i.e., (gr_pow_right/gr_pow_left) < 1.0 */ { /* Compute sqrt(grp_pow_chg), where grp_pow_chg = gr_pow_right/gr_pow_left. */ tmp16 = ratio( *pGrPowRight, *pGrPowLeft, &expo ); /* tmp16 in Q14 */ @@ -652,10 +664,12 @@ static void trans_ana_fx( move16(); } mag_chg[k] = mult_r( mag_chg_1st[k], att_val ); /* Q15 */ + move16(); - if ( GT_16( burst_len, BETA_MUTE_THR ) ) + IF ( GT_16( burst_len, BETA_MUTE_THR ) ) { *beta_mute = shr( *beta_mute, 1 ); + move16(); } alpha[k] = mag_chg[k]; move16(); @@ -674,10 +688,12 @@ static void trans_ana_fx( IF( GE_16( k, LGW32K - 1 ) ) { beta[k] = mult_r( beta[k], 3277 ); /* 0.1 in Q15 */ + move16(); } ELSE IF( GE_16( k, LGW16K - 1 ) ) { beta[k] = mult_r( beta[k], 16384 ); /* 0.5 in Q15 */ + move16(); } } pGrPowLeft++; @@ -721,7 +737,7 @@ static void ivas_peakfinder_fx( FOR( i = 0; i < len0Minus1; i++ ) { - IF( EQ_16( dx0[i], 0 ) ) + if ( dx0[i] == 0 ) { dx0[i] = -1; move16(); @@ -737,7 +753,7 @@ static void ivas_peakfinder_fx( pDx0 = pDx01 + 1; len = 0; move16(); - IF( endpoints ) + IF ( endpoints ) { *pX++ = *pX0++; move16(); @@ -753,16 +769,17 @@ static void ivas_peakfinder_fx( FOR( i = 0; i < len0Minus2; i++ ) { - IF( s_xor( *pDx01++, *pDx0++ ) < 0 ) /* Detect sign change. */ + IF ( s_xor( *pDx01++, *pDx0++ ) < 0 ) /* Detect sign change. */ { *pInd++ = add( i, 1 ); + move16(); *pX++ = *pX0; move16(); len = add( len, 1 ); } pX0++; } - IF( endpoints ) + IF ( endpoints ) { *pInd = len0Minus1; move16(); @@ -775,7 +792,7 @@ static void ivas_peakfinder_fx( pInd = indarr; test(); test(); - IF( GT_16( len, 2 ) || ( !endpoints && ( GT_16( len, 0 ) ) ) ) + IF( GT_16( len, 2 ) || ( !endpoints && ( len > 0 ) ) ) { /* Set initial parameters for loop */ tempMag = minMag; @@ -786,7 +803,7 @@ static void ivas_peakfinder_fx( move16(); threshold = add( leftMin, sel ); - IF( GT_16( len, 0 ) ) + IF ( len > 0 ) { /* Deal with first point a little differently since tacked it on Calculate the sign of the derivative since we took the first point @@ -804,7 +821,7 @@ static void ivas_peakfinder_fx( { ii = -1; move16(); - IF( GE_16( xAt1, xAt2 ) ) /* x[1] is not extremum -> overwrite with x[0] */ + IF ( GE_16( xAt1, xAt2 ) ) /* x[1] is not extremum -> overwrite with x[0] */ { *pX = xAt0; /* x[1] = x[0] */ move16(); @@ -819,6 +836,7 @@ static void ivas_peakfinder_fx( ELSE /* First point is smaller than the second */ { ii = 0; + move16(); IF( LT_16( xAt1, xAt2 ) ) /* x[1] is not extremum -> overwrite with x[0] */ { *pX = xAt0; /* x[1] = x[0] */ @@ -836,11 +854,13 @@ static void ivas_peakfinder_fx( { // PMTE () ii = -1; /* First point is a peak */ - IF( GE_16( len, 2 ) ) + move16(); + IF ( GE_16( len, 2 ) ) { - IF( GE_16( x[1], x[0] ) ) + if ( GE_16( x[1], x[0] ) ) { ii = 0; /* First point is a valley, skip it */ + move16(); } } } @@ -853,14 +873,14 @@ static void ivas_peakfinder_fx( ii = add( ii, 1 ); /* This is a peak */ /* Make sure we don't iterate past the length of our vector */ - IF( GE_16( ii, lenMinus1 ) ) + IF ( GE_16( ii, lenMinus1 ) ) { BREAK; } /*Reset peak finding if we had a peak and the next peak is bigger than the last or the left min was small enough to reset.*/ - IF( GT_16( foundPeak, 0 ) ) + IF ( foundPeak > 0 ) { tempMag = minMag; move16(); @@ -870,9 +890,9 @@ static void ivas_peakfinder_fx( /* Found new peak that was larger than temp mag and selectivity larger than the minimum to its left. */ - IF( GT_16( *( ++pX ), tempMag ) ) + IF ( GT_16( *( ++pX ), tempMag ) ) { - IF( GT_16( *pX, threshold ) ) /* threshold = leftMin + sel */ + IF ( GT_16( *pX, threshold ) ) /* threshold = leftMin + sel */ { tempLoc = ii; move16(); @@ -885,9 +905,9 @@ static void ivas_peakfinder_fx( pX++; /* Come down at least sel from peak */ - IF( EQ_16( foundPeak, 0 ) ) + IF ( foundPeak == 0 ) { - IF( GT_16( tempMag, add( sel, *pX ) ) ) + IF ( GT_16( tempMag, add( sel, *pX ) ) ) { foundPeak = 1; /* We have found a peak */ move16(); @@ -899,11 +919,12 @@ static void ivas_peakfinder_fx( peakMag[*cInd] = tempMag; move16(); *cInd = add( *cInd, 1 ); + move16(); } } - IF( EQ_16( foundPeak, 0 ) ) /* The above IF-block has not found the peak yet. */ + IF ( foundPeak == 0 ) /* The above IF-block has not found the peak yet. */ { - IF( LT_16( *pX, leftMin ) ) /* New left minimum */ + IF ( LT_16( *pX, leftMin ) ) /* New left minimum */ { leftMin = *pX; move16(); @@ -913,28 +934,30 @@ static void ivas_peakfinder_fx( } /* Check end point */ - IF( GT_16( x[lenMinus1], tempMag ) ) + IF ( GT_16( x[lenMinus1], tempMag ) ) { - IF( GT_16( x[lenMinus1], threshold ) ) /* threshold = leftMin + sel */ + IF ( GT_16( x[lenMinus1], threshold ) ) /* threshold = leftMin + sel */ { peakLoc[*cInd] = lenMinus1; move16(); peakMag[*cInd] = x[lenMinus1]; move16(); *cInd = add( *cInd, 1 ); + move16(); foundPeak = 1; move16(); } } - IF( EQ_16( foundPeak, 0 ) ) /* Check if we still need to add the last point */ + IF ( foundPeak == 0 ) /* Check if we still need to add the last point */ { - IF( GT_16( tempMag, minMag ) ) + IF ( GT_16( tempMag, minMag ) ) { peakLoc[*cInd] = tempLoc; move16(); peakMag[*cInd] = tempMag; move16(); *cInd = add( *cInd, 1 ); + move16(); } } @@ -943,7 +966,6 @@ static void ivas_peakfinder_fx( { plocs[i] = *( indarr + peakLoc[i] ); move16(); - move16(); } } ELSE /* This is a monotone function where an endpoint is the only peak */ @@ -952,7 +974,7 @@ static void ivas_peakfinder_fx( { xInd = 1; move16(); - IF( GT_16( x[0], x[1] ) ) + if ( GT_16( x[0], x[1] ) ) { xInd = 0; move16(); @@ -1004,6 +1026,7 @@ static void peakfinder_fx( Word16 *pInd; tempLoc = 0; + move16(); /* Find derivative */ len0Minus1 = sub( len0, 1 ); @@ -1046,9 +1069,10 @@ static void peakfinder_fx( FOR( i = 0; i < len0Minus2; i++ ) { - IF( s_xor( *pDx01++, *pDx0++ ) < 0 ) /* Detect sign change. */ + IF ( s_xor( *pDx01++, *pDx0++ ) < 0 ) /* Detect sign change. */ { *pInd++ = add( i, 1 ); + move16(); *pX++ = *pX0; move16(); len = add( len, 1 ); @@ -1120,6 +1144,7 @@ static void peakfinder_fx( ELSE /* First point is smaller than the second */ { ii = 0; + move16(); IF( LT_16( xAt1, xAt2 ) ) /* x[1] is not extremum -> overwrite with x[0] */ { *pX = xAt0; /* x[1] = x[0] */ @@ -1163,7 +1188,7 @@ static void peakfinder_fx( /*Reset peak finding if we had a peak and the next peak is bigger than the last or the left min was small enough to reset.*/ - IF( GT_16( foundPeak, 0 ) ) + IF ( foundPeak > 0 ) { tempMag = minMag; move16(); @@ -1173,9 +1198,9 @@ static void peakfinder_fx( /* Found new peak that was larger than temp mag and selectivity larger than the minimum to its left. */ - IF( GT_16( *( ++pX ), tempMag ) ) + IF ( GT_16( *( ++pX ), tempMag ) ) { - IF( GT_16( *pX, threshold ) ) /* threshold = leftMin + sel */ + IF ( GT_16( *pX, threshold ) ) /* threshold = leftMin + sel */ { tempLoc = ii; move16(); @@ -1188,9 +1213,9 @@ static void peakfinder_fx( pX++; /* Come down at least sel from peak */ - IF( foundPeak == 0 ) + IF ( foundPeak == 0 ) { - IF( GT_16( tempMag, add( sel, *pX ) ) ) + IF ( GT_16( tempMag, add( sel, *pX ) ) ) { foundPeak = 1; /* We have found a peak */ move16(); @@ -1202,11 +1227,12 @@ static void peakfinder_fx( peakMag[*cInd] = tempMag; move16(); *cInd = add( *cInd, 1 ); + move16(); } } - IF( foundPeak == 0 ) /* The above IF-block has not found the peak yet. */ + IF ( foundPeak == 0 ) /* The above IF-block has not found the peak yet. */ { - IF( LT_16( *pX, leftMin ) ) /* New left minimum */ + IF ( LT_16( *pX, leftMin ) ) /* New left minimum */ { leftMin = *pX; move16(); @@ -1216,9 +1242,9 @@ static void peakfinder_fx( } /* Check end point */ - IF( GT_16( x[lenMinus1], tempMag ) ) + IF ( GT_16( x[lenMinus1], tempMag ) ) { - IF( GT_16( x[lenMinus1], threshold ) ) /* threshold = leftMin + sel */ + IF ( GT_16( x[lenMinus1], threshold ) ) /* threshold = leftMin + sel */ { peakLoc[*cInd] = lenMinus1; move16(); @@ -1229,15 +1255,16 @@ static void peakfinder_fx( move16(); } } - IF( foundPeak == 0 ) /* Check if we still need to add the last point */ + IF ( foundPeak == 0 ) /* Check if we still need to add the last point */ { - IF( GT_16( tempMag, minMag ) ) + IF ( GT_16( tempMag, minMag ) ) { peakLoc[*cInd] = tempLoc; move16(); peakMag[*cInd] = tempMag; move16(); *cInd = add( *cInd, 1 ); + move16(); } } @@ -1246,7 +1273,6 @@ static void peakfinder_fx( { plocs[i] = *( indarr + peakLoc[i] ); move16(); - move16(); } } ELSE /* This is a monotone function where an endpoint is the only peak */ @@ -1304,6 +1330,7 @@ static Word16 imax_fx( /* o: The location, relative to the Word32 numer, denom, sign, acc, y3_y1; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif /* Seek the extremum of the parabola P(x) defined by 3 consecutive points so that P([-1 0 1]) = [y1 y2 y3] */ @@ -1327,11 +1354,11 @@ static Word16 imax_fx( /* o: The location, relative to the sign = L_xor( y3_y1, denom ); /* Preserve the sign since div_s() only takes positive arguments. */ numer = L_abs( y3_y1 ); denom = L_abs( denom ); - IF( numer == 0 ) + IF ( numer == 0 ) { return 0; } - IF( denom == 0 ) + IF ( denom == 0 ) { return 0; } @@ -1350,11 +1377,11 @@ static Word16 imax_fx( /* o: The location, relative to the /* For both edges (left and right), the extremum found above may be minimum. * It needs to reject the minimum. */ - IF( NE_16( special, 0 ) ) /* Either edge specical case. */ + IF ( special != 0 ) /* Either edge specical case. */ { edge = 0x7fff; /* 1 in Q15 for the right edge special case */ move16(); - if ( LT_16( special, 0 ) ) + if ( special < 0 ) { edge = 0; /* Left edge special case */ move16(); @@ -1366,7 +1393,7 @@ static Word16 imax_fx( /* o: The location, relative to the * Therefore, the slope at y=0 is simply B. Use this slope to determine * if the parabola is concave upward or downward. */ - IF( GT_16( posi, 0 ) ) /* The extremum is in between the middle and the right given data points. */ + IF( posi > 0 ) /* The extremum is in between the middle and the right given data points. */ { IF( LE_16( y3, y1 ) ) /* Check the slope at y=0, i.e., at the middle given data point. */ { @@ -1430,10 +1457,13 @@ static void ivas_spec_ana_fx( Word16 currPlocs, endPlocs, nJacob, k, i; Word32 sig, noise, st_point, end_point; + move16(); // LprotLog2Minus1 + move16(); // hamm_len2 Lprot = 512; /* 1536=(2*output_frame)*1024/1280; */ move16(); sinTblOffset = 0; + move16(); IF( EQ_16( output_frame, L_FRAME48k ) ) { @@ -1482,7 +1512,7 @@ static void ivas_spec_ana_fx( IF( EQ_16( output_frame, L_FRAME48k ) ) { /* Apply hamming-rect window */ - IF( EQ_16( element_mode, EVS_MONO ) ) + IF( element_mode == EVS_MONO ) { windowing( xfp, xfp, w_hamm_sana48k_2_fx, rectLength, hamm_len2 ); } @@ -1490,12 +1520,13 @@ static void ivas_spec_ana_fx( { // PMTE() window_corr = w_hamm[0]; - window_corr_step = w_hamm[0] / hamm_len2; + move16(); + window_corr_step = idiv1616(w_hamm[0] , hamm_len2); FOR( i = 0; i < hamm_len2; i++ ) { xfp[i] = mult_r( shl( prevsynth[i], *Q ), sub( w_hamm[i], window_corr ) ); move16(); - xfp[Lprot - i - 1] = mult_r( shl( prevsynth[Lprot - i - 1], *Q ), sub( w_hamm[i], window_corr ) ); + xfp[sub( sub( Lprot, i ), 1 )] = mult_r( shl( prevsynth[sub( sub( Lprot, i ), 1 )], *Q ), sub( w_hamm[i], window_corr ) ); move16(); window_corr = sub( window_corr, window_corr_step ); } @@ -1505,7 +1536,7 @@ static void ivas_spec_ana_fx( } ELSE { - IF( EQ_16( element_mode, EVS_MONO ) ) + IF( element_mode == EVS_MONO ) { /* Apply hamming-rect window */ windowing_ROM_optimized( xfp, xfp, sinTblOffset, rectLength, hamm_len2 ); @@ -1514,12 +1545,13 @@ static void ivas_spec_ana_fx( { // PMTE() window_corr = w_hamm[0]; - window_corr_step = w_hamm[0] / hamm_len2; + move16(); + window_corr_step = idiv1616(w_hamm[0] , hamm_len2); FOR( i = 0; i < hamm_len2; i++ ) { xfp[i] = mult_r( shl( prevsynth[i], *Q ), sub( w_hamm[i], window_corr ) ); move16(); - xfp[Lprot - i - 1] = mult_r( shl( prevsynth[Lprot - i - 1], *Q ), sub( w_hamm[i], window_corr ) ); + xfp[sub(sub(Lprot , i) , 1)] = mult_r( shl( prevsynth[sub(sub(Lprot , i) , 1)], *Q ), sub( w_hamm[i], window_corr ) ); move16(); window_corr = sub( window_corr, window_corr_step ); } @@ -1557,14 +1589,15 @@ static void ivas_spec_ana_fx( IF( *pMagSq == 0 ) { *pXfp++ = extract_l( *pMagSq++ ); /* magSq[] is zero */ + move16(); } ELSE { expo = norm_l( *pMagSq ); /* exponent */ man = extract_h( L_shl( *pMagSq++, expo ) ); /* mantissa */ man = sqrt2ndOrder( man ); - expoBy2 = shr( expo, 1 ); /* Divided by 2-- square root operation. */ - IF( s_and( expo, 1 ) == 0 ) /* Check even or odd. */ + expoBy2 = shr( expo, 1 ); /* Divided by 2-- square root operation. */ + IF ( s_and( expo, 1 ) == 0 ) /* Check even or odd. */ { man = mult_r( man, FEC_HQ_ECU_ROOT2 ); /* FEC_HQ_ECU_ROOT2 is sqrt(2) in Q14 */ expoBy2 = sub( expoBy2, 1 ); @@ -1577,7 +1610,7 @@ static void ivas_spec_ana_fx( /* Find maximum and minimum. */ maximum_fx( xfp, Lprot2_1, &Xmax ); minimum_fx( xfp, Lprot2_1, &Xmin ); - IF( EQ_16( element_mode, EVS_MONO ) ) + IF( element_mode == EVS_MONO ) { sel = mult_r( sub( Xmax, Xmin ), CMPLMNT_PFIND_SENS_FX ); } @@ -1589,12 +1622,13 @@ static void ivas_spec_ana_fx( /* Currently not the pitch correlation but some LF correlation */ - IF( element_mode != EVS_MONO && *num_plocs > 50 && pcorr < 19661 /* 0.6f in Q15 */ ) + if ( element_mode != EVS_MONO && *num_plocs > 50 && pcorr < 19661 /* 0.6f in Q15 */ ) { *num_plocs = 0; + move16(); } - IF( EQ_16( element_mode, EVS_MONO ) ) + IF( element_mode == EVS_MONO ) { /* Refine peaks */ @@ -1602,7 +1636,7 @@ static void ivas_spec_ana_fx( pPlocs = plocs; n = sub( *num_plocs, 1 ); /* -1 so as to exclude the very last peak. */ /* Special case-- The very 1st peak if it is at 0 index position */ - IF( EQ_16( *pPlocs, 0 ) ) /* Only the very 1st peak is possible the peak at 0 index position. */ + IF ( *pPlocs == 0 ) /* Only the very 1st peak is possible the peak at 0 index position. */ { fraction = imax_fx( xfp, -1 ); /* -1 signifies special left edge case. */ acc = L_deposit_h( *pPlocs++ ); /* N.B., (*pPlocs) must be zero here. */ @@ -1620,7 +1654,7 @@ static void ivas_spec_ana_fx( *pPlocsi++ = L_mac( acc, fraction, 1 ); move32(); /* in Q16. Append the fractional part to the integral part. */ } - IF( n >= 0 ) + IF ( n >= 0 ) { /* Special case-- The very last peak */ pXfp = pXfp1 + *pPlocs; @@ -1656,7 +1690,7 @@ static void ivas_spec_ana_fx( /* With DELTA_CORR_F0_INT == 2 one needs to handle both *pPlocs==0 and *pPlocs==1 */ // IF( n > 0 && *pPlocs == 0 ) /* Very 1st peak position possible to have a peak at 0/DC index position. */ test(); - IF( GT_16( n, 0 ) && EQ_16( *pPlocs, 0 ) ) /* Very 1st peak position possible to have a peak at 0/DC index position. */ + IF( n > 0 && *pPlocs == 0 ) /* Very 1st peak position possible to have a peak at 0/DC index position. */ { fraction = imax_fx( &xfp[*pPlocs], -1 ); /* in Q15 */ acc = L_deposit_h( *pPlocs ); @@ -1667,7 +1701,7 @@ static void ivas_spec_ana_fx( } test(); - IF( GT_16( n, 0 ) && EQ_16( *pPlocs, 1 ) ) /* Also 2nd peak position uses DC which makes jacobsen unsuitable. */ + IF( n > 0 && EQ_16( *pPlocs, 1 ) ) /* Also 2nd peak position uses DC which makes jacobsen unsuitable. */ { fraction = imax_fx( &xfp[*pPlocs - 1], -1 ); /* in Q15 */ acc = L_deposit_h( *pPlocs - 1 ); @@ -1684,18 +1718,18 @@ static void ivas_spec_ana_fx( endPlocs = sub( Lprot2_1, DELTA_CORR_F0_INT ); /* last *pPlocs position for Jacobsen */ /* precompute number of turns based on endpoint integer location and make into a proper for loop */ - IF( GT_16( n, 0 ) ) + IF ( n > 0 ) { nJacob = n; move16(); - IF( LE_16( sub( endPlocs, plocs[sub( *num_plocs, 1 )] ), 0 ) ) + if ( sub( endPlocs, plocs[sub( *num_plocs, 1 )] <= 0 ) ) { nJacob = sub( nJacob, 1 ); } FOR( k = 0; k < nJacob; k++ ) { - fraction = ivas_imax2_jacobsen_mag_fx( &( X_sav[currPlocs - 1] ), &( X_sav[Lprot - 1 - currPlocs] ) ); /* in Q15 */ + fraction = ivas_imax2_jacobsen_mag_fx( &( X_sav[currPlocs - 1] ), &( X_sav[sub( sub( Lprot, 1 ), currPlocs )] ) ); /* in Q15 */ acc = L_deposit_h( currPlocs ); *pPlocsi++ = L_mac( acc, fraction, 1 ); move32(); @@ -1707,16 +1741,16 @@ static void ivas_spec_ana_fx( /* At this point there should at most two plocs left to process */ /* the position before fs/2 and fs/2 both use the same magnitude points */ - IF( GT_16( n, 0 ) ) + IF ( n > 0 ) { /* [ . . . . . . . ] Lprot/2+1 positions */ /* | | | */ /* 0 (Lprot/2-2) (Lprot/2) */ - IF( EQ_16( currPlocs, ( sub( Lprot2_1, DELTA_CORR_F0_INT ) ) ) ) /* Also 2nd last peak position uses fs/2 which makes jacobsen less suitable. */ + IF ( EQ_16( currPlocs, ( sub( Lprot2_1, DELTA_CORR_F0_INT ) ) ) ) /* Also 2nd last peak position uses fs/2 which makes jacobsen less suitable. */ { fraction = imax_fx( &xfp[currPlocs - 1], 0 ); /* in Q15 */ - acc = L_deposit_h( currPlocs - 1 ); + acc = L_deposit_h( sub( currPlocs, 1 ) ); *pPlocsi++ = L_mac( acc, fraction, 1 ); move32(); currPlocs = *pPlocs++; @@ -1727,10 +1761,10 @@ static void ivas_spec_ana_fx( /* Here the only remaining point would be a fs/2 plocs */ /* pXfp = xfp + sub(Lprot2,1); already set just a reminder where it * whould point */ - IF( GT_16( n, 0 ) ) /* fs/2 which makes special case . */ + IF ( n > 0 ) /* fs/2 which makes special case . */ { fraction = imax_fx( &xfp[currPlocs - 2], 0 ); /* in Q15 */ - acc = L_deposit_h( currPlocs - 2 ); + acc = L_deposit_h( sub( currPlocs, 2 ) ); *pPlocsi++ = L_mac( acc, fraction, 1 ); move32(); currPlocs = *pPlocs++; @@ -1741,18 +1775,18 @@ static void ivas_spec_ana_fx( /* For few peaks decide noise floor attenuation */ test(); - IF( LT_16( *num_plocs, 3 ) && GT_16( *num_plocs, 0 ) ) + IF( LT_16( *num_plocs, 3 ) && *num_plocs > 0 ) { - sig = sum16_32_fx( xfp, Lprot2_1 ) + 1; + sig = L_add( sum16_32_fx( xfp, Lprot2_1 ), 1 ); /*excluding peaks and neighboring bins*/ FOR( i = 0; i < *num_plocs; i++ ) { - st_point = s_max( 0, plocs[i] - DELTA_CORR ); - end_point = s_min( Lprot2_1 - 1, plocs[i] + DELTA_CORR ); - set16_fx( &xfp[st_point], 0, (Word16) ( end_point - st_point + 1 ) ); + st_point = s_max( 0, sub( plocs[i], DELTA_CORR ) ); + end_point = s_min( sub( Lprot2_1, 1 ), add( plocs[i], DELTA_CORR ) ); + set16_fx( &xfp[st_point], 0, extract_l(L_add( L_sub( end_point, st_point ), 1 )) ); } - noise = sum16_32_fx( xfp, Lprot2_1 ) + 1; + noise = L_add( sum16_32_fx( xfp, Lprot2_1 ), 1 ); IF( LT_32( noise, Mpy_32_32( 64424509 /* 0.03 in Q31 */, sig ) ) ) { @@ -1798,10 +1832,13 @@ static void spec_ana_fx( Word16 stop_band_start; Word16 stop_band_length; + move16(); // LprotLog2Minus1 + move16(); // hamm_len2 Lprot = 512; /* 1536=(2*output_frame)*1024/1280; */ move16(); sinTblOffset = 0; + move16(); IF( EQ_16( output_frame, L_FRAME48k ) ) { @@ -1897,7 +1934,7 @@ static void spec_ana_fx( } /* Apply zeroing of non-coded FFT spectrum */ - IF( GT_16( output_frame, inner_frame_tbl[bwidth_fx] ) ) + IF ( GT_16( output_frame, inner_frame_tbl[bwidth_fx] ) ) { stop_band_start = shl( 128, bwidth_fx ); stop_band_length = sub( Lprot, shl( stop_band_start, 1 ) ); @@ -1930,8 +1967,8 @@ static void spec_ana_fx( expo = norm_l( *pMagSq ); /* exponent */ man = extract_h( L_shl( *pMagSq++, expo ) ); /* mantissa */ man = sqrt2ndOrder( man ); - expoBy2 = shr( expo, 1 ); /* Divided by 2-- square root operation. */ - IF( s_and( expo, 1 ) == 0 ) /* Check even or odd. */ + expoBy2 = shr( expo, 1 ); /* Divided by 2-- square root operation. */ + IF ( s_and( expo, 1 ) == 0 ) /* Check even or odd. */ { man = mult_r( man, FEC_HQ_ECU_ROOT2 ); /* FEC_HQ_ECU_ROOT2 is sqrt(2) in Q14 */ expoBy2 = sub( expoBy2, 1 ); @@ -1984,7 +2021,7 @@ static void spec_ana_fx( pPlocs = plocs; n = sub( *num_plocs, 1 ); /* -1 so as to exclude the very last peak. */ /* Special case-- The very 1st peak if it is at 0 index position */ - IF( EQ_16( *pPlocs, 0 ) ) /* Only the very 1st peak is possible the peak at 0 index position. */ + IF ( *pPlocs == 0 ) /* Only the very 1st peak is possible the peak at 0 index position. */ { fraction = imax_fx( xfp, -1 ); /* -1 signifies special left edge case. */ acc = L_deposit_h( *pPlocs++ ); /* N.B., (*pPlocs) must be zero here. */ @@ -2002,7 +2039,7 @@ static void spec_ana_fx( *pPlocsi++ = L_mac( acc, fraction, 1 ); move32(); /* in Q16. Append the fractional part to the integral part. */ } - IF( n >= 0 ) + IF ( n >= 0 ) { /* Special case-- The very last peak */ pXfp = pXfp1 + *pPlocs; @@ -2210,6 +2247,7 @@ static void ivas_subst_spec_fx( { // tmp = NS2SA(output_frame*50,PH_ECU_ALDO_OLP2_NS-PH_ECU_LOOKAHEAD_NS); tmp = NS2SA( output_frame * 50, PH_ECU_ALDO_OLP2_NS ); + move16(); tmp = sub( tmp, ph_ecu_lookahead ); tmp = add( tmp, sub( Lecu, shr( sub( Lecu, Lprot ), 1 ) ) ); tmp = sub( tmp, shr( output_frame, 1 ) ); @@ -2228,19 +2266,19 @@ static void ivas_subst_spec_fx( } one_peak_flag_mask = 32767 /* 1.0f in Q15 */; /* all ones mask -> keep */ move16(); - IF( NE_16( element_mode, EVS_MONO ) ) + IF ( element_mode != EVS_MONO ) { test(); - IF( ( GT_16( *num_plocs, 0 ) ) && LT_16( sub( *num_plocs, 3 ), 0 ) ) + if ( ( *num_plocs > 0 ) && ( sub( *num_plocs, 3 ) < 0 ) ) { one_peak_flag_mask = noise_fac; /* all zeroes mask -> zero */ move16(); } - IF( EQ_16( *num_plocs, 0 ) ) + IF ( *num_plocs == 0 ) { X[0] = 0; /* reset DC if there are no peaks */ move16(); - X[shr( Lprot, 1 )] = 0; /* also reset fs/2 if there are no peaks */ + X[Lprot / 2] = 0; /* also reset fs/2 if there are no peaks */ move16(); } } @@ -2273,20 +2311,20 @@ static void ivas_subst_spec_fx( move16(); pkLocation1 = *pPlocs++; /* plocs[m + 1] */ move16(); - IF( GT_16( m, 0 ) ) + IF ( m > 0 ) { delta_tmp = shr( sub( sub( pkLocation, pkLocation_1 ), 1 ), 1 ); - IF( LT_16( delta_tmp, DELTA_CORR ) ) + if ( LT_16( delta_tmp, DELTA_CORR ) ) { delta_corr_dn = delta_tmp; move16(); } } - IF( LT_16( m, lastPeak ) ) + IF ( LT_16( m, lastPeak ) ) { delta_tmp = shr( sub( sub( pkLocation1, pkLocation ), 1 ), 1 ); - IF( LT_16( delta_tmp, DELTA_CORR ) ) + if ( LT_16( delta_tmp, DELTA_CORR ) ) { delta_corr_up = delta_tmp; move16(); @@ -2304,7 +2342,7 @@ static void ivas_subst_spec_fx( move16(); im = *pImX; move16(); - IF( EQ_16( element_mode, EVS_MONO ) ) + IF( element_mode == EVS_MONO ) { tmp = sub( mult_r( re, cos_F ), mult_r( im, sin_F ) ); im = add( mult_r( re, sin_F ), mult_r( im, cos_F ) ); @@ -2317,6 +2355,7 @@ static void ivas_subst_spec_fx( IF( LT_16( alpha[k], 32766 ) ) { *seed = rand_phase_fx( *seed, &sin_F, &cos_F ); + move16(); tmp2 = mult_r( beta[k], Xavg[k] ); *pReX++ = add( mult_r( alpha[k], tmp ), mult_r( tmp2, cos_F ) ); move16(); @@ -2331,20 +2370,21 @@ static void ivas_subst_spec_fx( move16(); } i = add( i, 1 ); - IF( GE_16( i, ivas_gwlpr[k + 1] ) ) + if ( GE_16( i, ivas_gwlpr[k + 1] ) ) { k = add( k, 1 ); } } e = add( pkLocation, delta_corr_up ); - IF( GT_16( e, lprotBy2Minus1 ) ) + if ( GT_16( e, lprotBy2Minus1 ) ) { e = lprotBy2Minus1; move16(); } Xph = *pCorrPhase; + move32(); Xph_short = s_and( extract_l( L_shr( Xph, 16 - 10 ) ), 0x3ff ); /* 10 bits precision after radix point */ IF( GE_16( Xph_short, 512 ) ) { @@ -2380,15 +2420,16 @@ static void ivas_subst_spec_fx( { mag_chg_local = mag_chg[k]; move16(); - IF( NE_16( ph_dith, 0 ) ) + IF ( ph_dith != 0 ) { - Xph = *pCorrPhase; /* in Q16. 2*PI is not included. */ + Xph = *pCorrPhase; /* in Q16. 2*PI is not included. */ + move32(); Random( seed ); /* in Q0 */ acc = L_mult( *seed, ph_dith ); /* N.B. ph_dith[i] is in Q15, i.e., in between 0 and 1.0 (2*PI not included) */ acc = L_shr( acc, PHASE_DITH_SCALE_SHIFT ); Xph = L_add( Xph, acc ); /* in Q16. */ - IF( GT_16( ph_dith, 0 ) ) /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized ) */ + IF ( ph_dith > 0 ) /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized ) */ { /* mag_chg_local *= 0.5 + (1.0 - ph_dith[i])/2 where 0.5~= sqrt((float)pow(10.0,-6/10.0)) and ph_dith=0..1.0--> scale=1.0 ...5 */ mag_chg_local = mult_r( mag_chg_local, sub( 32767, shr( ph_dith, 1 ) ) ); @@ -2437,14 +2478,14 @@ static void ivas_subst_spec_fx( acc = L_sub( 1073741824L, L_mult0( alpha_local, alpha_local ) ); acc = Sqrt_l( acc, &expo ); expo = add( 30, add( 31, expo ) ); - IF( EQ_16( s_and( expo, 1 ), 1 ) ) + if ( EQ_16( s_and( expo, 1 ), 1 ) ) { acc = Mult_32_16( acc, 23170 ); /* 1/sqrt(2) in Q15 */ } expo = shr( expo, 1 ); beta_local = mult_r( beta_mute, round_fx( L_shl( acc, sub( 31, expo ) ) ) ); - IF( GE_16( k, LGW32K - 1 ) ) + IF ( GE_16( k, LGW32K - 1 ) ) { beta_local = mult_r( beta_local, 3277 ); /* 0.1 in Q15 */ } @@ -2454,6 +2495,7 @@ static void ivas_subst_spec_fx( } *seed = rand_phase_fx( *seed, &sin_F, &cos_F ); + move16(); tmp2 = mult_r( beta_local, Xavg[k] ); *pReX++ = add( mult_r( alpha_local, tmp ), mult_r( tmp2, cos_F ) ); move16(); @@ -2469,7 +2511,7 @@ static void ivas_subst_spec_fx( } i = add( i, 1 ); - IF( GE_16( i, ivas_gwlpr[k + 1] ) ) + if ( GE_16( i, ivas_gwlpr[k + 1] ) ) { k = add( k, 1 ); } @@ -2481,6 +2523,7 @@ static void ivas_subst_spec_fx( FOR( j = 0; j < segmentLen; j++ ) { *seed = rand_phase_fx( *seed, &sin_F, &cos_F ); + move16(); re = *pReX; move16(); @@ -2488,7 +2531,7 @@ static void ivas_subst_spec_fx( move16(); - IF( EQ_16( element_mode, EVS_MONO ) ) + IF( element_mode == EVS_MONO ) { tmp = sub( mult_r( re, cos_F ), mult_r( im, sin_F ) ); im = add( mult_r( re, sin_F ), mult_r( im, cos_F ) ); @@ -2501,6 +2544,7 @@ static void ivas_subst_spec_fx( IF( LT_16( alpha[k], 32766 ) ) { *seed = rand_phase_fx( *seed, &sin_F, &cos_F ); + move16(); tmp2 = mult_r( beta[k], Xavg[k] ); *pReX++ = add( mult_r( alpha[k], tmp ), mult_r( tmp2, cos_F ) ); move16(); @@ -2516,7 +2560,7 @@ static void ivas_subst_spec_fx( } i = add( i, 1 ); - IF( GE_16( i, ivas_gwlpr[k + 1] ) ) + if ( GE_16( i, ivas_gwlpr[k + 1] ) ) { k = add( k, 1 ); } @@ -2609,6 +2653,7 @@ static void subst_spec_fx( ELSE { tmp = NS2SA( output_frame * 50, PH_ECU_ALDO_OLP2_NS - PH_ECU_LOOKAHEAD_NS ); + move16(); tmp = add( tmp, sub( Lecu, shr( sub( Lecu, Lprot ), 1 ) ) ); tmp = sub( tmp, shr( output_frame, 1 ) ); tmp = add( tmp, time_offs ); @@ -2668,7 +2713,7 @@ static void subst_spec_fx( move16(); pkLocation1 = *pPlocs++; /* plocs[m + 1] */ move16(); - IF( m > 0 ) + IF ( m > 0 ) { delta_tmp = shr( sub( sub( pkLocation, pkLocation_1 ), 1 ), 1 ); if ( LT_16( delta_tmp, DELTA_CORR ) ) @@ -2678,7 +2723,7 @@ static void subst_spec_fx( } } - IF( LT_16( m, lastPeak ) ) + IF ( LT_16( m, lastPeak ) ) { delta_tmp = shr( sub( sub( pkLocation1, pkLocation ), 1 ), 1 ); if ( LT_16( delta_tmp, DELTA_CORR ) ) @@ -2717,6 +2762,7 @@ static void subst_spec_fx( IF( LT_16( alpha[k], 32766 ) ) { *seed = rand_phase_fx( *seed, &sin_F, &cos_F ); + move16(); tmp2 = mult_r( beta[k], Xavg[k] ); *pReX++ = add( mult_r( alpha[k], tmp ), mult_r( tmp2, cos_F ) ); move16(); @@ -2745,6 +2791,7 @@ static void subst_spec_fx( } Xph = *pCorrPhase; + move32(); Xph_short = s_and( extract_l( L_shr( Xph, 16 - 10 ) ), 0x3ff ); /* 10 bits precision after radix point */ IF( GE_16( Xph_short, 512 ) ) { @@ -2780,15 +2827,16 @@ static void subst_spec_fx( { mag_chg_local = mag_chg[k]; move16(); - IF( ph_dith != 0 ) + IF ( ph_dith != 0 ) { - Xph = *pCorrPhase; /* in Q16. 2*PI is not included. */ + Xph = *pCorrPhase; /* in Q16. 2*PI is not included. */ + move32(); Random( seed ); /* in Q0 */ acc = L_mult( *seed, ph_dith ); /* N.B. ph_dith[i] is in Q15, i.e., in between 0 and 1.0 (2*PI not included) */ acc = L_shr( acc, PHASE_DITH_SCALE_SHIFT ); Xph = L_add( Xph, acc ); /* in Q16. */ - IF( ph_dith > 0 ) /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized ) */ + IF ( ph_dith > 0 ) /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized ) */ { /* mag_chg_local *= 0.5 + (1.0 - ph_dith[i])/2 where 0.5~= sqrt((float)pow(10.0,-6/10.0)) and ph_dith=0..1.0--> scale=1.0 ...5 */ mag_chg_local = mult_r( mag_chg_local, sub( 32767, shr( ph_dith, 1 ) ) ); @@ -2866,12 +2914,13 @@ static void subst_spec_fx( { beta_local = mult_r( beta_local, 3277 ); /* 0.1 in Q15 */ } - ELSE if ( GE_16( k, LGW16K - 1 ) ) + ELSE IF( GE_16( k, LGW16K - 1 ) ) { beta_local = mult_r( beta_local, 16384 ); /* 0.5 in Q15 */ } *seed = rand_phase_fx( *seed, &sin_F, &cos_F ); + move16(); tmp2 = mult_r( beta_local, Xavg[k] ); *pReX++ = add( mult_r( alpha_local, tmp ), mult_r( tmp2, cos_F ) ); move16(); @@ -2899,6 +2948,7 @@ static void subst_spec_fx( FOR( j = 0; j < segmentLen; j++ ) { *seed = rand_phase_fx( *seed, &sin_F, &cos_F ); + move16(); re = *pReX; move16(); @@ -2909,6 +2959,7 @@ static void subst_spec_fx( IF( LT_16( alpha[k], 32766 ) ) { *seed = rand_phase_fx( *seed, &sin_F, &cos_F ); + move16(); tmp2 = mult_r( beta[k], Xavg[k] ); *pReX++ = add( mult_r( alpha[k], tmp ), mult_r( tmp2, cos_F ) ); move16(); @@ -2969,7 +3020,9 @@ static void ivas_rec_wtda_fx( Word16 ola_len; copy_len = NS2SA( output_frame * FRAMES_PER_SEC, ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* prototype fill on each side of xsubst to fill MDCT Frame */ + move16(); ola_len = NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS - ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* remaining lengt of LA_ZEROS to overlap add decoded with xsubst */ + move16(); xf_len = 26; move16(); @@ -2979,6 +3032,7 @@ static void ivas_rec_wtda_fx( { w_hamm = w_hamm_sana48k_2_fx; hamm_len2 = L_PROT_HAMM_LEN2_48k; + move16(); xf_len = 78; move16(); tbl_delta = 3361; /* Q12 */ @@ -2988,6 +3042,7 @@ static void ivas_rec_wtda_fx( { w_hamm = w_hamm_sana32k_2_fx; hamm_len2 = L_PROT_HAMM_LEN2_32k; + move16(); xf_len = 52; move16(); tbl_delta = 5041; /* Q12 */ @@ -2997,15 +3052,16 @@ static void ivas_rec_wtda_fx( { w_hamm = w_hamm_sana16k_2_fx; hamm_len2 = L_PROT_HAMM_LEN2_16k; + move16(); } test(); test(); - IF( NE_16( element_mode, EVS_MONO ) && GT_16( *num_p, 0 ) && GT_16( plocs[0], 3 ) ) + IF( element_mode != EVS_MONO && *num_p > 0 && GT_16( plocs[0], 3 ) ) { /* Perform inverse windowing of hammrect */ pX_start = X; - pX_end = X + Lprot - 1; + pX_end = X + sub( Lprot, 1 ); FOR( i = 0; i < hamm_len2; i++ ) { tmp = BASOP_Util_Divide1616_Scale( 1, *w_hamm, &tmp_e ); @@ -3021,22 +3077,22 @@ static void ivas_rec_wtda_fx( } /* extract reconstructed frame with aldo window */ - timesh = NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) - ( 2 * output_frame - Lprot ) / 2; + timesh = sub(NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) , shr(sub( shl(output_frame, 1) , Lprot ) , 1)); - set16_fx( xsubst_, 0, 2 * output_frame - Lprot + timesh ); - Copy( X, xsubst_ + 2 * output_frame - Lprot + timesh, Lprot - timesh ); + set16_fx( xsubst_, 0, add(sub(shl(output_frame, 1) , Lprot) , timesh) ); + Copy( X, xsubst_ + add(sub(shl(output_frame, 1) , Lprot) , timesh), sub(Lprot , timesh) ); /* Copy and OLA look ahead zero part of MDCT window from decoded signal */ - IF( NE_16( element_mode, EVS_MONO ) ) + IF( element_mode != EVS_MONO ) { Copy( old_dec, xsubst_ + NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ), copy_len ); /* also need to scale to Q0 ?? */ pOld = old_dec + copy_len; - pNew = xsubst_ + copy_len + NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ); + pNew = xsubst_ + add(copy_len , NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS )); tmp = div_s( 1, shl( ola_len, 1 ) ); // Q15 tmp = round_fx( L_shl( L_mult( tmp, EVS_PI_FX ), 2 ) ); // Q15 sinq_fx( tmp, 0, ola_len, xfwin ); v_mult16_fixed( xfwin, xfwin, xfwin, ola_len ); /* xfwin = sin^2 of 0..pi/4 */ - pOldW = xfwin + ola_len - 1; + pOldW = xfwin + sub(ola_len , 1); pNewW = xfwin; FOR( i = 0; i < ola_len; i++ ) { @@ -3051,11 +3107,12 @@ static void ivas_rec_wtda_fx( ELSE { /* Smoothen onset of ECU frame */ - p_ecu = xsubst_ + 2 * output_frame - Lprot + timesh; + p_ecu = xsubst_ + add( sub( shl(output_frame, 1), Lprot ), timesh ); FOR( i = 0; i < xf_len; ( i++, p_ecu++ ) ) { idx = extract_l( L_shr( L_mult0( i, tbl_delta ), 12 ) ); g = sincos_t_fx[idx]; + move16(); g = mult( g, g ); *p_ecu = mult( g, ( *p_ecu ) ); move16(); @@ -3211,11 +3268,12 @@ static void rec_wtda_fx( set16_fx( xsubst_ + add( output_frame, Lprot2 ), 0, l ); /* Smoothen onset of ECU frame */ - p_ecu = xsubst_ + ( output_frame - Lprot2 ); + p_ecu = xsubst_ + sub( output_frame , Lprot2 ); FOR( i = 0; i < xf_len; i++ ) { idx = extract_l( L_shr( L_mult0( i, tbl_delta ), 12 ) ); g = sincos_t_fx[idx]; + move16(); g = mult( g, g ); *p_ecu = mult( g, ( *p_ecu ) ); move16(); @@ -3223,9 +3281,11 @@ static void rec_wtda_fx( } timesh = NS2SA_fx2( fs, 10000000L - PH_ECU_ALDO_OLP2_NS ); + move16(); set16_fx( rec_buf, 0, output_frame ); Qin = 0; + move16(); out_ptr = rec_buf + sub( shl( output_frame, 1 ), timesh ); wtda_fx( out_ptr, &Qin, ecu_rec, NULL, 0, ALDO_WINDOW, ALDO_WINDOW, /* window overlap of current frame (0: full, 2: none, or 3: half) */ output_frame ); @@ -3353,11 +3413,12 @@ static Word32 mult_32_32_q( const Word32 a, const Word32 b, const Word16 q ) UWord32 lo; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif Mpy_32_32_ss( a, b, &hi, &lo ); #ifdef BASOP_NOGLOB - return L_or( L_shl_o( hi, 32 - q - 1, &Overflow ), L_lshr( lo, q + 1 ) ); + return L_or( L_shl_o( hi, sub(32 - 1 , q ), &Overflow ), L_lshr( lo, add(q , 1) ) ); #else return L_or( L_shl( hi, 32 - q - 1 ), L_lshr( lo, q + 1 ) ); #endif @@ -3390,8 +3451,7 @@ static void fir_dwn_fx( { s = L_deposit_l( 0 ); ptr_h = h + 1; - ptr_x = x + i - 1; - move16(); + ptr_x = x + sub(i , 1); FOR( j = 1; j <= i; j++ ) { @@ -3404,6 +3464,7 @@ static void fir_dwn_fx( #ifdef BASOP_NOGLOB *ptr_y++ = extract_h( L_shl_sat( s, centering ) ); + move16(); #else *ptr_y++ = extract_h( L_shl( s, centering ) ); #endif @@ -3412,7 +3473,7 @@ static void fir_dwn_fx( { s = L_deposit_l( 0 ); ptr_h = h + 1; - ptr_x = x + i - 1; + ptr_x = x + sub(i , 1); move16(); FOR( j = 1; j <= K; j++ ) @@ -3426,6 +3487,7 @@ static void fir_dwn_fx( #ifdef BASOP_NOGLOB *ptr_y++ = extract_h( L_shl_sat( s, centering ) ); + move16(); #else *ptr_y++ = extract_h( L_shl( s, centering ) ); #endif @@ -3434,9 +3496,9 @@ static void fir_dwn_fx( FOR( i = i; i < tmp; i += decimation ) { s = L_deposit_l( 0 ); - ptr_h = h + i - L + 1; + ptr_h = h + add( sub( i, L ), 1 ); move16(); - ptr_x = x + L - 1; + ptr_x = x + sub( L, 1 ); move16(); FOR( j = add( sub( i, L ), 1 ); j <= K; j++ ) @@ -3450,6 +3512,7 @@ static void fir_dwn_fx( #ifdef BASOP_NOGLOB *ptr_y++ = extract_h( L_shl_sat( s, centering ) ); + move16(); #else *ptr_y++ = extract_h( L_shl( s, centering ) ); #endif @@ -3590,26 +3653,34 @@ static void fec_ecu_pitch_fx( } - IF( HqVoicing == 1 ) + IF( EQ_16(HqVoicing , 1) ) { cb_start = 0; + move16(); cb_end = Lon20mul33; + move16(); } ELSE { cb_start = 0; + move16(); cb_end = Lon20mul28; + move16(); } accB = 0; + move16(); delay_ind = cb_start; + move16(); FOR( i = cb_start; i < cb_end; i++ ) /* cb_end = 35 let 6 ms min of loop size */ { accA = 0; - IF( i == cb_start ) + move16(); + IF( EQ_16(i , cb_start) ) { accB = 0; + move16(); ptr_LP = prevsynth_LP_fx; ptr_LP2 = prevsynth_LP_fx + Lon20mul34; FOR( k = 0; k < Lon20mul6; k++ ) @@ -3646,26 +3717,28 @@ static void fec_ecu_pitch_fx( accCisqrt = Isqrt( accC ); /* Q31 - 3 + tmpQLP*/ - Ryytmp = mult_32_32_q( accA, accCisqrt, 16 + 3 - tmpQLP ); /*Q 6 -2*tmpQLP + Q31 - 3 + tmpQLP -16 -3 +tmpQLP = Q15*/ - Ryytmp = mult_32_32_q( Ryytmp, accBisqrt, 15 - 3 + tmpQLP ); /*Q15 + Q31 - 3 + tmpQLP -15 + 3- tmpQLP = Q31*/ + Ryytmp = mult_32_32_q( accA, accCisqrt, sub(16 + 3 , tmpQLP) ); /*Q 6 -2*tmpQLP + Q31 - 3 + tmpQLP -16 -3 +tmpQLP = Q15*/ + Ryytmp = mult_32_32_q( Ryytmp, accBisqrt, add(15 - 3 , tmpQLP) ); /*Q15 + Q31 - 3 + tmpQLP -15 + 3- tmpQLP = Q31*/ Ryy = extract_h( Ryytmp ); /* Q15 */ - IF( Ryy > *min_corr_fx ) + IF( GT_16( Ryy, *min_corr_fx ) ) { *min_corr_fx = Ryy; + move16(); delay_ind = i; + move16(); } test(); - IF( HqVoicing == 0 && *min_corr_fx > 31130 ) + IF( HqVoicing == 0 && GT_16( *min_corr_fx, 31130 ) ) { BREAK; } } *N = sub( Lon20mul34, delay_ind ); - + move16(); Scale_sig( prevsynth_LP_fx, 320, negate( sub( tmpQLP, 3 ) ) ); return; @@ -3710,7 +3783,9 @@ static void sin_cos_est_fx( Word32 phi, Word16 *cosfreq, Word16 *sinfreq ) #endif #ifdef BASOP_NOGLOB *sinfreq = round_fx_sat( sinv ); + move16(); *cosfreq = round_fx_sat( cosv ); + move16(); #else *sinfreq = round_fx( sinv ); *cosfreq = round_fx( cosv ); @@ -3802,7 +3877,7 @@ static void ivas_fec_ecu_dft_fx( Lon20 = 8; move16(); - IF( EQ_16( element_mode, EVS_MONO ) ) + IF( element_mode == EVS_MONO ) { alignment_point = sub( shl( 160, 1 ), i_mult( 3, Lon20 ) ); } @@ -3821,6 +3896,7 @@ static void ivas_fec_ecu_dft_fx( L_tmp = L_shl( L_tmp, 1 ); } *Nfft = shl( 1, sub( 15, tmp ) ); + move16(); set32_fx( Tfr32, 0, *Nfft ); set32_fx( Tfi32, 0, *Nfft ); @@ -3831,7 +3907,7 @@ static void ivas_fec_ecu_dft_fx( IF( EQ_16( *Nfft, N ) ) { - Copy( &target[1], &Tfr16[1], *Nfft - 2 ); + Copy( &target[1], &Tfr16[1], sub( *Nfft, 2 ) ); } ELSE { @@ -3860,6 +3936,7 @@ static void ivas_fec_ecu_dft_fx( /*to avoid overflow in DoRTFTn_fx() */ tmp = Exp16Array( *Nfft, Tfr16 ); *exp = add( tmp, add( 2, norm_s( *Nfft ) ) ); + move16(); Copy_Scale_sig_16_32( Tfr16, Tfr32, *Nfft, *exp ); /*Qin+exp; */ DoRTFTn_fx( Tfr32, Tfi32, *Nfft ); @@ -3876,7 +3953,9 @@ static void ivas_fec_ecu_dft_fx( FOR( i = 0; i < N_LP; i++ ) { *pt1 = extract_h( *Pt1 ); /*Qin+exp-16 */ + move16(); *pt2 = extract_h( *Pt2 ); /*Qin+exp-16 */ + move16(); *pt3 = abs_iter_fx( Tfr[i], Tfi[i], 5 ); move16(); /*Qin+exp-16 */ L_tmp = L_mac0( L_tmp, *pt3, 1 ); /*Qin+exp-16 */ @@ -3889,6 +3968,7 @@ static void ivas_fec_ecu_dft_fx( *sum_Tf_abs = L_tmp; move32(); *exp = sub( *exp, 16 ); + move16(); return; } #endif @@ -3936,6 +4016,7 @@ static void fec_ecu_dft_fx( L_tmp = L_shl( L_tmp, 1 ); } *Nfft = shl( 1, sub( 15, tmp ) ); + move16(); set32_fx( Tfr32, 0, *Nfft ); @@ -3947,7 +4028,7 @@ static void fec_ecu_dft_fx( IF( EQ_16( *Nfft, N ) ) { - Copy( &target[1], &Tfr16[1], *Nfft - 2 ); + Copy( &target[1], &Tfr16[1], sub(*Nfft , 2) ); } ELSE { @@ -3976,6 +4057,7 @@ static void fec_ecu_dft_fx( /*to avoid overflow in DoRTFTn_fx() */ tmp = Exp16Array( *Nfft, Tfr16 ); *exp = add( tmp, add( 2, norm_s( *Nfft ) ) ); + move16(); Copy_Scale_sig_16_32( Tfr16, Tfr32, *Nfft, *exp ); /*Qin+exp; */ DoRTFTn_fx( Tfr32, Tfi32, *Nfft ); @@ -3992,7 +4074,9 @@ static void fec_ecu_dft_fx( FOR( i = 0; i < N_LP; i++ ) { *pt1 = extract_h( *Pt1 ); /*Qin+exp-16 */ + move16(); *pt2 = extract_h( *Pt2 ); /*Qin+exp-16 */ + move16(); *pt3 = abs_iter_fx( Tfr[i], Tfi[i], 5 ); move16(); /*Qin+exp-16 */ L_tmp = L_mac0( L_tmp, *pt3, 1 ); /*Qin+exp-16 */ @@ -4005,6 +4089,7 @@ static void fec_ecu_dft_fx( *sum_Tf_abs = L_tmp; move32(); *exp = sub( *exp, 16 ); + move16(); return; } @@ -4108,6 +4193,8 @@ static void sinusoidal_synthesis_fx( Word32 synthesis_fx[2 * L_FRAME48k]; Word16 *pt1, *pt2, *pt3, *pt4; + move16(); // indmax + move16(); // Lon20_10 flag = HqVoicing; move16(); if ( GT_16( N, Lon20_10 ) ) @@ -4331,7 +4418,7 @@ static void ivas_fec_noise_filling_fx( Word16 alignment_point; // PMTE() L20 = extract_h( L_mult( 1639, L ) ); /*L/20 */ - IF( EQ_16( element_mode, EVS_MONO ) ) + IF( element_mode == EVS_MONO ) { alignment_point = sub( shl( L, 1 ), i_mult2( 3, L20 ) ); } @@ -4353,7 +4440,7 @@ static void ivas_fec_noise_filling_fx( sinq_tab = sinq_16k; } - Copy( prevsynth_fx + alignment_point - N, noisevect_fx, N ); + Copy( prevsynth_fx + sub( alignment_point, N ), noisevect_fx, N ); /* Noise addition on full band */ /* residual */ @@ -4392,7 +4479,7 @@ static void ivas_fec_noise_filling_fx( flag = ind; move16(); pt5 = synthesis_fx; - WHILE( GT_16( flag, 0 ) ) + WHILE( flag > 0 ) { tmp_fx = Random( ni_seed_forfec ); @@ -4433,7 +4520,7 @@ static void ivas_fec_noise_filling_fx( flag = sub( flag, tmp_fx ); } - IF( EQ_16( element_mode, EVS_MONO ) ) + IF( element_mode == EVS_MONO ) { kk = i_mult2( 7, L20 ); tmp_fx = i_mult2( 37, L20 ); @@ -4458,11 +4545,12 @@ static void ivas_fec_noise_filling_fx( L_tmp = L_mult( ( *pt1 ), q1 ); /*Qsynth+16 */ L_tmp = L_mac( L_tmp, ( *pt6++ ), q2 ); /*Qsynth+16 */ ( *pt1++ ) = round_fx( L_tmp ); /*Qsynth */ + move16(); } - Copy( synthesis_fx, synthesis_fx + kk, 2 * L - kk ); + Copy( synthesis_fx, synthesis_fx + kk, sub( 2 * L, kk ) ); Copy( synthesis_fx + L, gapsynth_fx, L ); - Copy( prevsynth_fx + alignment_point - kk, synthesis_fx, kk ); + Copy( prevsynth_fx + sub(alignment_point , kk), synthesis_fx, kk ); } #endif @@ -4644,6 +4732,7 @@ static void fec_noise_filling_fx( L_tmp = L_mult( ( *pt1 ), q1 ); /*Qsynth+16 */ L_tmp = L_mac( L_tmp, ( *pt6++ ), q2 ); /*Qsynth+16 */ ( *pt1++ ) = round_fx( L_tmp ); /*Qsynth */ + move16(); } } @@ -4685,7 +4774,7 @@ static void ivas_fec_alg_fx( n = R1_16 - R2_16; move16(); - IF( EQ_16( output_frame, L_FRAME32k ) ) + if ( EQ_16( output_frame, L_FRAME32k ) ) { n = 2 * N16_CORE_SW; move16(); @@ -4809,9 +4898,10 @@ static void ivas_hq_phase_ecu_fx( noise_fac = 32767; /* 1.0f in Q15 */ move16(); - IF( EQ_16( element_mode, EVS_MONO ) ) + IF( element_mode == EVS_MONO ) { ph_ecu_lookahead = NS2SA( output_frame * FRAMES_PER_SEC, PH_ECU_LOOKAHEAD_NS ); + move16(); } ELSE { @@ -4828,7 +4918,7 @@ static void ivas_hq_phase_ecu_fx( lprot = L_PROT32k; /* 1024 */ move16(); } - ELSE IF( output_frame == L_FRAME16k ) + ELSE IF( EQ_16(output_frame , L_FRAME16k) ) { lprot = 512; move16(); @@ -4842,11 +4932,12 @@ static void ivas_hq_phase_ecu_fx( test(); test(); test(); - IF( EQ_16( prev_bfi, 0 ) || ( NE_16( prev_bfi, 0 ) && NE_16( *last_fec, 0 ) && ( EQ_16( *time_offs, output_frame ) ) ) ) + IF( prev_bfi == 0 || ( prev_bfi != 0 && *last_fec != 0 && ( EQ_16( *time_offs, output_frame ) ) ) ) { + test(); test(); // PMT("verify condition compared to float") - IF( !( NE_16( prev_bfi, 0 ) && NE_16( *last_fec, 0 ) && EQ_16( element_mode, EVS_MONO ) ) ) + if ( !( prev_bfi != 0 && *last_fec != 0 && element_mode == EVS_MONO ) ) { *time_offs = 0; move16(); @@ -4859,15 +4950,16 @@ static void ivas_hq_phase_ecu_fx( ivas_spec_ana_fx( prevsynth + offset, plocs, plocsi, num_p, X_sav, output_frame, bwidth_fx, Q_spec, element_mode, &noise_fac, pcorr ); test(); - IF( NE_16( prev_bfi, 0 ) && NE_16( *last_fec, 0 ) ) + IF( prev_bfi != 0 && *last_fec != 0 ) { *time_offs = add( *time_offs, output_frame ); + move16(); } } ELSE { *time_offs = add( *time_offs, output_frame ); - + move16(); offset = sub( shl( output_frame, 1 ), lprot ); trans_ana_fx( prevsynth + offset, mag_chg, &ph_dith, mag_chg_1st, output_frame, *time_offs, env_stab, 0, alpha, beta, beta_mute, Xavg ); @@ -4878,16 +4970,16 @@ static void ivas_hq_phase_ecu_fx( /* seed for own_rand2 */ seed = *time_offs; move16(); - IF( GT_16( *num_p, 0 ) ) + IF ( *num_p > 0 ) { - seed = add( seed, plocs[*num_p - 1] ); + seed = add( seed, plocs[sub(*num_p , 1)] ); } ivas_subst_spec_fx( plocs, plocsi, num_p, *time_offs, X, mag_chg, ph_dith, old_is_transient, output_frame, &seed, alpha, beta, *beta_mute, Xavg, element_mode, ph_ecu_lookahead, noise_fac ); /* reconstructed frame in tda domain */ - old_dec = prevsynth + 2 * output_frame - NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ); + old_dec = prevsynth + sub( shl(output_frame, 1), NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) ); ivas_rec_frame_fx( X, ecu_rec, output_frame, *Q_spec, old_dec, element_mode, num_p, plocs ); *last_fec = 0; @@ -4975,7 +5067,7 @@ static void hq_phase_ecu_fx( #ifdef IVAS_FEC_ECU_TO_COMPLETE IF( !( prev_bfi != 0 && *last_fec != 0 ) && EQ_16( element_mode == EVS_MONO ) ) #else - IF( !( prev_bfi != 0 && *last_fec != 0 ) ) + if ( !( prev_bfi != 0 && *last_fec != 0 ) ) #endif { *time_offs = 0; @@ -5001,11 +5093,13 @@ static void hq_phase_ecu_fx( IF( prev_bfi != 0 && *last_fec != 0 ) { *time_offs = add( *time_offs, output_frame ); + move16(); } } ELSE { *time_offs = add( *time_offs, output_frame ); + move16(); offset = sub( shl( output_frame, 1 ), lprot ); trans_ana_fx( prevsynth + offset, mag_chg, &ph_dith, mag_chg_1st, output_frame, *time_offs, env_stab, @@ -5017,9 +5111,9 @@ static void hq_phase_ecu_fx( /* seed for own_rand2 */ seed = *time_offs; move16(); - if ( *num_p > 0 ) + IF ( *num_p > 0 ) { - seed = add( seed, plocs[*num_p - 1] ); + seed = add( seed, plocs[sub(*num_p , 1)] ); } subst_spec_fx( plocs, plocsi, num_p, *time_offs, X, mag_chg, ph_dith, old_is_transient, output_frame, &seed, @@ -5042,6 +5136,7 @@ static void hq_phase_ecu_fx( ); *last_fec = 0; + move16(); *ph_ecu_active = 1; move16(); } @@ -5139,8 +5234,8 @@ void ivas_hq_ecu_fx( test(); test(); test(); - IF( ( ( EQ_16( st_fx->element_mode, EVS_MONO ) ) && evs_mode_selection ) || - ( ( NE_16( st_fx->element_mode, EVS_MONO ) ) && evs_mode_selection && ivas_mode_selection ) ) + IF( ( ( st_fx->element_mode == EVS_MONO ) && evs_mode_selection ) || + ( ( st_fx->element_mode != EVS_MONO ) && evs_mode_selection && ivas_mode_selection ) ) { ivas_fec_alg_fx( fec_alg_input, prevsynth_LP, &st_fx->hHQ_core->ni_seed_forfec, ecu_rec, output_frame, N, decimatefactor, ph_ecu_HqVoicing, gapsynth, st_fx->element_mode, st_fx->hHQ_core->old_out_fx ); *last_fec = 1; @@ -5210,6 +5305,7 @@ void hq_ecu_fx( #endif /* init (values ar changed after) */ decimatefactor = 4; + move16(); N = shr( output_frame, 2 ); @@ -5277,6 +5373,7 @@ void hq_ecu_fx( fec_alg_fx( prevsynth + NS2SA( output_frame * 50, ACELP_LOOK_NS / 2 - PH_ECU_LOOKAHEAD_NS ), prevsynth_LP, &st_fx->hHQ_core->ni_seed_forfec, ecu_rec, output_frame, N, decimatefactor, ph_ecu_HqVoicing, gapsynth ); *last_fec = 1; + move16(); *ph_ecu_active = 0; move16(); *time_offs = output_frame; diff --git a/lib_dec/FEC_pitch_estim_fx.c b/lib_dec/FEC_pitch_estim_fx.c index 4fa36e5b8..2e139334c 100644 --- a/lib_dec/FEC_pitch_estim_fx.c +++ b/lib_dec/FEC_pitch_estim_fx.c @@ -69,9 +69,12 @@ void FEC_pitch_estim_fx( test(); test(); - IF( ( EQ_16( element_mode, EVS_MONO ) && EQ_16( last_core, HQ_CORE ) ) || ( NE_16( element_mode, EVS_MONO ) && ( EQ_16( last_core, HQ_CORE ) || EQ_16( last_core, TCX_20_CORE ) || EQ_16( last_core, TCX_10_CORE ) ) ) ) + test(); + test(); + test(); + IF( ( ( element_mode == EVS_MONO ) && EQ_16( last_core, HQ_CORE ) ) || ( element_mode != EVS_MONO && ( EQ_16( last_core, HQ_CORE ) || EQ_16( last_core, TCX_20_CORE ) || EQ_16( last_core, TCX_10_CORE ) ) ) ) { - *bfi_pitch = pitch_buf[shr( L_frame, 6 ) - 1]; + *bfi_pitch = pitch_buf[sub(shr( L_frame, 6 ) , 1)]; move16(); *bfi_pitch_frame = L_frame; move16(); @@ -102,7 +105,7 @@ void FEC_pitch_estim_fx( ( EQ_16( L_frame, L_FRAME16k ) ) ) || ( EQ_16( coder_type, TRANSITION ) ) ) { - *bfi_pitch = pitch_buf[shr( L_frame, 6 ) - 1]; + *bfi_pitch = pitch_buf[sub(shr( L_frame, 6 ) , 1)]; move16(); *bfi_pitch_frame = L_frame; move16(); diff --git a/lib_dec/FEC_scale_syn_fx.c b/lib_dec/FEC_scale_syn_fx.c index 24fca62db..ad0fcae88 100644 --- a/lib_dec/FEC_scale_syn_fx.c +++ b/lib_dec/FEC_scale_syn_fx.c @@ -163,6 +163,7 @@ void FEC_scale_syn_fx( ELSE IF( *scaling_flag > 0 ) { ( *scaling_flag ) = sub( *scaling_flag, 1 ); /* If scaling flag was equal to 2, add one control frame to account for the LSF interpolation */ + move16(); } scaling = 32767; /*2.0 Q14*/ move16(); @@ -175,7 +176,9 @@ void FEC_scale_syn_fx( /*fer_energy( L_frame, clas, synth, pitch[(L_frame>>6)-1], &enr2, L_frame );*/ frame_ener_fx( L_frame, clas, synth, pitch[sub( shr( L_frame, 6 ), 1 )], &L_enr2 /*Q0*/, 1, Q_syn, 3, 0 ); - if ( bfi || ( EQ_32( total_brate, ACELP_7k20 ) ) || ( EQ_32( total_brate, ACELP_8k00 ) ) ) + test(); + test(); + IF( bfi || ( EQ_32( total_brate, ACELP_7k20 ) ) || ( EQ_32( total_brate, ACELP_8k00 ) ) ) { /* previous frame erased and no TC frame */ IF( *scaling_flag > 0 ) @@ -222,7 +225,7 @@ void FEC_scale_syn_fx( h1[0] = 1024; move16(); /*syn_filt( Aq+(3*(M+1)), M, h1, h1, L_FRAME/2, h1+(M+1), 0 );*/ - E_UTIL_synthesis( 1, Aq + ( 3 * ( M + 1 ) ), h1, h1, L_FRAME / 2, h1 + ( M + 1 ), 0, M ); + E_UTIL_synthesis( 1, Aq + (3 * ( M + 1 ) ), h1, h1, L_FRAME / 2, h1 + ( M + 1 ), 0, M ); /*Compute tilt */ /*rr0 = dotp( h1, h1, L_FRAME/2-1 ) + 0.1f;*/ @@ -236,7 +239,6 @@ void FEC_scale_syn_fx( pitch_dist = 0; move16(); L_mean_pitch = L_mult( pitch[0], 8192 ); - move32(); FOR( k = 0; k < ( NB_SUBFR - 1 ); k++ ) { pitch_dist = add( pitch_dist, abs_s( sub( pitch[k + 1], pitch[k] ) ) ); @@ -270,7 +272,7 @@ void FEC_scale_syn_fx( ener_max = *lp_ener_FEC_max; move32(); test(); - if ( EQ_16( clas, VOICED_TRANSITION ) || ( GE_16( clas, INACTIVE_CLAS ) ) ) + if( EQ_16( clas, VOICED_TRANSITION ) || ( GE_16( clas, INACTIVE_CLAS ) ) ) { ener_max = *lp_ener_FEC_av; move32(); @@ -301,8 +303,8 @@ void FEC_scale_syn_fx( test(); test(); test(); - IF( ( ( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && ( EQ_16( clas, UNVOICED_CLAS ) || EQ_16( clas, INACTIVE_CLAS ) ) ) || - EQ_32( last_core_brate, SID_1k75 ) || EQ_32( last_core_brate, SID_2k40 ) || EQ_32( last_core_brate, FRAME_NO_DATA ) ) && + IF( ( ( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && ( clas == UNVOICED_CLAS || EQ_16( clas, INACTIVE_CLAS ) ) ) || + EQ_32( last_core_brate, SID_1k75 ) || EQ_32( last_core_brate, SID_2k40 ) || last_core_brate == FRAME_NO_DATA ) && prev_bfi ) { /* voiced -> unvoiced signal transition */ @@ -405,8 +407,8 @@ void FEC_scale_syn_fx( test(); IF( ( ( ( EQ_32( total_brate, ACELP_13k20 ) ) || ( EQ_32( total_brate, ACELP_12k85 ) ) || ( EQ_32( total_brate, ACELP_12k15 ) ) || ( EQ_32( total_brate, ACELP_11k60 ) ) || ( EQ_32( total_brate, ACELP_9k60 ) ) ) && - ( GT_16( tilt, 22938 ) ) && /* HF resonnant filter */ - ( ( EQ_16( clas, UNVOICED_CLAS ) ) || ( EQ_16( clas, INACTIVE_CLAS ) ) ) ) ) /* unvoiced classification */ + ( GT_16( tilt, 22938 ) ) && /* HF resonnant filter */ + ( ( ( clas == UNVOICED_CLAS ) ) || ( EQ_16( clas, INACTIVE_CLAS ) ) ) ) ) /* unvoiced classification */ { /*if( enr_q > scaling * enr_old )enr_q = scaling * enr_old;*/ #ifdef BASOP_NOGLOB @@ -457,6 +459,7 @@ void FEC_scale_syn_fx( exp2 = 7; move16(); tmp2 = 160 << 7; /* 160 = 20.0f in Q3 */ + move16(); exp = sub( exp2, exp ); IF( GT_16( tmp, tmp2 ) ) @@ -474,6 +477,7 @@ void FEC_scale_syn_fx( test(); test(); test(); + test(); IF( ( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && GE_16( clas, VOICED_TRANSITION ) && LT_16( clas, INACTIVE_CLAS ) ) || force_scaling ) { @@ -538,8 +542,8 @@ void FEC_scale_syn_fx( /*------------------------------------------------------------* * voiced->unvoiced transition recovery *------------------------------------------------------------*/ - ELSE IF( ( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && ( EQ_16( clas, UNVOICED_CLAS ) || EQ_16( clas, INACTIVE_CLAS ) ) ) || /* voiced->unvoiced transition recovery */ - EQ_32( last_core_brate, SID_1k75 ) || EQ_32( last_core_brate, SID_2k40 ) || EQ_32( last_core_brate, FRAME_NO_DATA ) ) /* CNG -> active signal transition */ + ELSE IF( ( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && ( clas == UNVOICED_CLAS || EQ_16( clas, INACTIVE_CLAS ) ) ) || /* voiced->unvoiced transition recovery */ + EQ_32( last_core_brate, SID_1k75 ) || EQ_32( last_core_brate, SID_2k40 ) || last_core_brate == FRAME_NO_DATA ) /* CNG -> active signal transition */ { gain1 = gain2; move16(); diff --git a/lib_dec/gain_dec_fx.c b/lib_dec/gain_dec_fx.c index dd8b57681..cf4202907 100644 --- a/lib_dec/gain_dec_fx.c +++ b/lib_dec/gain_dec_fx.c @@ -63,6 +63,7 @@ void Es_pred_dec_fx( ELSE { *Es_pred = Es_pred_qua_4b_no_ltp_fx[enr_idx]; + move16(); } } /*======================================================================================*/ @@ -117,6 +118,7 @@ void gain_dec_tc_fx( * find number of bits for gain dequantization *----------------------------------------------------------------*/ nBits = st_fx->acelp_cfg.gains_mode[shr( i_subfr_fx, 6 )]; + move16(); /*-----------------------------------------------------------------* * calculate the predicted gain code *-----------------------------------------------------------------*/ @@ -256,6 +258,7 @@ void gain_dec_tc_ivas_fx( * find number of bits for gain dequantization *----------------------------------------------------------------*/ nBits = st_fx->acelp_cfg.gains_mode[shr( i_subfr_fx, 6 )]; + move16(); /*-----------------------------------------------------------------* * calculate the predicted gain code *-----------------------------------------------------------------*/ @@ -301,7 +304,6 @@ void gain_dec_tc_ivas_fx( /* index = (Word16)get_indice( st_fx,"gain_code", i_subfr_fx, ACELP_CORE);move16();*/ index = (Word16) get_next_indice( st_fx, nBits ); - move16(); IF( GT_16( nBits, 3 ) ) @@ -388,6 +390,8 @@ void gain_dec_mless_fx( * decode pitch gain *-----------------------------------------------------------------*/ nBits = st_fx->acelp_cfg.gains_mode[shr( i_subfr_fx, 6 )]; + move16(); + test(); test(); test(); @@ -398,7 +402,6 @@ void gain_dec_mless_fx( { /* decode pitch gain */ index = (Word16) get_next_indice( st_fx, shr( nBits, 1 ) ); - move16(); /*Ei = (G_PITCH_MAX_TC192 - G_PITCH_MIN_TC192) / ((1 << (nBits>>1)) - 1);*/ /* set quantization step */ tmp_fx = div_s( 1, sub( shl( 1, shr( nBits, 1 ) ), 1 ) ); /*Q15*/ @@ -420,6 +423,7 @@ void gain_dec_mless_fx( L_tmp = Isqrt_lc( L_tmp, &expg ); *gain_inov_fx = extract_h( L_shl( L_tmp, sub( expg, 3 ) ) ); /* gain_inov in Q12 */ + move16(); /*Ei = 10 * (float)log10( Ecode );*/ e_tmp = norm_l( L_tmp1 ); @@ -452,11 +456,9 @@ void gain_dec_mless_fx( /* decode normalized codebook gain */ /*index = (short)get_indice( st_fx, "gain_code", i_subfr_fx, ACELP_CORE );move16();*/ index = (Word16) get_next_indice( st_fx, shr( add( nBits, 1 ), 1 ) ); - move16(); /**gain_code = gain_dequant( index, G_CODE_MIN_TC192, G_CODE_MAX_TC192, (nBits+1)>>1 );*/ gain_code16 = gain_dequant_fx( index, G_CODE_MIN_TC192_Q15, G_CODE_MAX_TC192_Q0, shr( add( nBits, 1 ), 1 ), &expg ); - move16(); /**gain_code *= gcode0;*/ L_tmp = L_mult( gain_code16, gcode0_fx ); /*Q0*Q0 -> Q1*/ @@ -474,14 +476,12 @@ void gain_dec_mless_fx( case 7: { qua_table_fx = gain_qua_mless_7b_fx; - move16(); BREAK; } case 6: { qua_table_fx = gain_qua_mless_6b_fx; - move16(); - IF( GT_16( st_fx->element_mode, EVS_MONO ) ) + if ( st_fx->element_mode > EVS_MONO ) { // PMT("gain_qua_mless_6b_stereo to fixed point") qua_table_fx = gain_qua_mless_6b_stereo_fx; @@ -491,25 +491,22 @@ void gain_dec_mless_fx( case 5: { qua_table_fx = gain_qua_mless_5b_fx; - move16(); BREAK; } default: { qua_table_fx = gain_qua_mless_6b_fx; - move16(); BREAK; } } test(); - if ( EQ_16( coder_type, INACTIVE ) && EQ_16( nBits, 6 ) ) + if ( coder_type == INACTIVE && EQ_16( nBits, 6 ) ) { nBits = sub( nBits, 1 ); } index = (Word16) get_next_indice( st_fx, nBits ); - move16(); *gain_pit_fx = qua_table_fx[index * 2]; move16(); @@ -526,6 +523,7 @@ void gain_dec_mless_fx( L_tmp = Isqrt_lc( L_tmp, &expg ); *gain_inov_fx = extract_h( L_shl( L_tmp, sub( expg, 3 ) ) ); /* gain_inov in Q12 */ + move16(); /*Ei = 10 * (float)log10( Ecode );*/ e_tmp = norm_l( L_tmp1 ); @@ -629,8 +627,9 @@ void gain_dec_lbr_fx( *gain_inov = 1.0f / (float)sqrt(Ecode); */ Word16 shift_L_subfr; shift_L_subfr = 6; + move16(); // for *cdbk_fx move16(); - IF( GT_16( L_subfr, L_SUBFR ) ) + if ( GT_16( L_subfr, L_SUBFR ) ) { shift_L_subfr = add( shift_L_subfr, 1 ); } @@ -644,7 +643,7 @@ void gain_dec_lbr_fx( L_tmp = Isqrt_lc( L_tmp, &expg ); *gain_inov_fx = extract_h( L_shl_sat( L_tmp, sub( expg, 3 ) ) ); /* gain_inov in Q12 */ - + move16(); /*-----------------------------------------------------------------* * select the codebook, size and number of bits @@ -671,19 +670,16 @@ void gain_dec_lbr_fx( case 8: { cdbk_fx = gp_gamma_1sfr_8b_fx; /* Q14/Q9*/ - move16(); BREAK; } case 7: { cdbk_fx = gp_gamma_1sfr_7b_fx; /* Q14/Q9*/ - move16(); BREAK; } case 6: { cdbk_fx = gp_gamma_1sfr_6b_fx; /* Q14/Q9*/ - move16(); BREAK; } } @@ -692,6 +688,7 @@ void gain_dec_lbr_fx( aux_fx[0] = 4096; move16(); aux_fx[1] = shl( ctype, 12 ); + move16(); /* gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.5f * (float)log10(Ecode)); gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.05f * 10 * (float)log10(Ecode)); @@ -727,7 +724,6 @@ void gain_dec_lbr_fx( /* retrieve the codebook index and calculate both gains */ /*index = (Word16)get_indice( st_fx,"gain", i_subfr, ACELP_CORE);move16();*/ index = (Word16) get_next_indice( st_fx, nBits ); - move16(); *gain_pit_fx = cdbk_fx[index * 2]; move16(); @@ -758,13 +754,11 @@ void gain_dec_lbr_fx( case 7: { cdbk_fx = gp_gamma_2sfr_7b_fx; /* Q14/Q9*/ - move16(); BREAK; } case 6: { cdbk_fx = gp_gamma_2sfr_6b_fx; /* Q14/Q9*/ - move16(); BREAK; } } @@ -773,6 +767,7 @@ void gain_dec_lbr_fx( aux_fx[0] = 4096; move16(); aux_fx[1] = shl( ctype, 12 ); + move16(); /*aux_fx[2] = (float)log10(gc_mem[0]); = log2(gc_mem[0])*log10(2);*/ @@ -781,8 +776,10 @@ void gain_dec_lbr_fx( e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + move16(); aux_fx[3] = shr( gp_mem[0], 2 ); /*Q12*/ + move16(); /*-----------------------------------------------------------------* * gcode0 = pow(10.0, dotp(b, aux, n_pred) @@ -800,7 +797,6 @@ void gain_dec_lbr_fx( /* retrieve the codebook index and calculate both gains */ index = (Word16) get_next_indice( st_fx, nBits ); - move16(); *gain_pit_fx = cdbk_fx[index * 2]; move16(); @@ -827,12 +823,11 @@ void gain_dec_lbr_fx( cdbk_fx = gp_gamma_3sfr_6b_fx; - IF( EQ_16( nBits, 7 ) ) + if ( EQ_16( nBits, 7 ) ) { cdbk_fx = gp_gamma_3sfr_7b_fx; // PMT("verify if gp_gamma_3sfr_7b_fx is correct") } - move16(); /* Q14/Q9*/ /* calculate predicted gain */ aux_fx[0] = 4096; @@ -847,6 +842,7 @@ void gain_dec_lbr_fx( e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + move16(); /*aux[3] = (float)log10(gc_mem[1]); = log2(gc_mem[1])*log10(2);*/ @@ -855,6 +851,7 @@ void gain_dec_lbr_fx( e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[1])=16*/ L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ aux_fx[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + move16(); aux_fx[4] = shr( gp_mem[0], 2 ); move16(); @@ -877,9 +874,8 @@ void gain_dec_lbr_fx( /* retrieve the codebook index and calculate both gains */ index = (Word16) get_next_indice( st_fx, nBits ); - move16(); - *gain_pit_fx = cdbk_fx[index * 2]; + *gain_pit_fx = cdbk_fx[shl(index , 1)]; move16(); L_tmp = L_mult( cdbk_fx[add( shl( index, 1 ), 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ @@ -896,7 +892,6 @@ void gain_dec_lbr_fx( ELSE IF( EQ_16( i_subfr, 3 * L_SUBFR ) ) { b_fx = b_4sfr_fx; - move16(); n_pred = 8; move16(); @@ -909,7 +904,6 @@ void gain_dec_lbr_fx( PMT( "verify if gp_gamma_4sfr_7b_fx is correct" ) } #endif - move16(); /* Q14/Q9*/ /* calculate predicted gain */ aux_fx[0] = 4096; @@ -924,6 +918,7 @@ void gain_dec_lbr_fx( e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + move16(); /*aux[3] = (float)log10(gc_mem[1]); = log2(gc_mem[1])*log10(2);*/ @@ -932,6 +927,7 @@ void gain_dec_lbr_fx( e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[1])=16*/ L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ aux_fx[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + move16(); /*aux[4] = (float)log10(gc_mem[2]); = log2(gc_mem[2])*log10(2);*/ @@ -940,6 +936,7 @@ void gain_dec_lbr_fx( e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[2])=16*/ L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ aux_fx[4] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + move16(); aux_fx[5] = shr( gp_mem[0], 2 ); /*Q12*/ move16(); @@ -965,7 +962,7 @@ void gain_dec_lbr_fx( /* retrieve the codebook index and calculate both gains */ index = (Word16) get_next_indice( st_fx, nBits ); move16(); - *gain_pit_fx = cdbk_fx[index * 2]; + *gain_pit_fx = cdbk_fx[shl(index , 1)]; move16(); L_tmp = L_mult( cdbk_fx[add( shl( index, 1 ), 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ @@ -1034,7 +1031,7 @@ void lp_gain_updt_fx( #endif IF( EQ_16( L_frame, L_FRAME ) ) { - IF( i_subfr == 0 ) + IF( EQ_16(i_subfr , 0) ) { *lp_gainp = mult( 3277, gain_pit ); move16(); /*0.1 in Q15 = 3277 , (15+14)-15 -> Q14*/ @@ -1239,6 +1236,7 @@ void gain_dec_SQ_fx( L_tmp = Isqrt_lc( L_tmp, &expg ); *gain_inov = extract_h( L_shl( L_tmp, sub( expg, 3 ) ) ); /* gain_inov in Q12 */ + move16(); /*Ei = 10 * (float)log10( Ecode );*/ e_tmp = norm_l( L_tmp1 ); @@ -1313,6 +1311,7 @@ void gain_dec_amr_wb_fx( Word16 expg, exp_gcode0, fracg; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif @@ -1323,6 +1322,7 @@ void gain_dec_amr_wb_fx( L_tmp = Isqrt_lc( L_tmp, &expg ); *gain_inov = extract_h( L_shl( L_tmp, sub( expg, 3 ) ) ); /* gain_inov in Q12 */ + move16(); /*-----------------------------------------------------------------* * Select the gain quantization table @@ -1331,7 +1331,7 @@ void gain_dec_amr_wb_fx( move16(); t_qua_gain = t_qua_gain7b_fx; - IF( LT_32( core_brate, ACELP_12k65 ) ) + if ( LT_32( core_brate, ACELP_12k65 ) ) { nbits = 6; move16(); diff --git a/lib_dec/gaus_dec_fx.c b/lib_dec/gaus_dec_fx.c index 0dec8dbf6..b825af764 100644 --- a/lib_dec/gaus_dec_fx.c +++ b/lib_dec/gaus_dec_fx.c @@ -67,14 +67,15 @@ void gaus_dec_fx( exp = sub( exp, 18 /*24*/ + 6 ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ L_tmp = Isqrt_lc( L_tmp, &exp ); *inv_gain_inov = extract_h( L_shl( L_tmp, sub( exp, 3 ) ) ); /* inv_gain_inov in Q12 */ + move16(); nb_bits = st_fx->acelp_cfg.gains_mode[shr( i_subfr, 6 )]; move16(); idx = (Word16) get_next_indice( st_fx, nb_bits ); - move16(); /* safety check in case of bit errors */ - IF( GT_16( idx, 78 ) && EQ_16( st_fx->element_mode, EVS_MONO ) ) + test(); + IF( GT_16( idx, 78 ) && st_fx->element_mode == EVS_MONO ) { idx = 78; move16(); @@ -83,6 +84,7 @@ void gaus_dec_fx( } *L_gain_code = gain_dec_gaus_fx( idx, nb_bits, -30, 190, *inv_gain_inov, L_norm_gain_code ); + move32(); /* update LP filtered gains for the case of frame erasures */ lp_gain_updt_fx( i_subfr, 0, *L_norm_gain_code, lp_gainp, lp_gainc, L_FRAME ); /* supposes that gain_dec_gaus() is used for ACELP@12k8 only */ @@ -122,7 +124,8 @@ void gaus_dec_fx( FOR( i = 0; i < L_SUBFR; i++ ) { L_tmp = L_shl( L_mult( gain_code, code[i] ), 6 /*3*/ ); - exc[i + i_subfr] = round_fx( L_tmp ); + exc[add(i , i_subfr)] = round_fx( L_tmp ); + move16(); } return; @@ -174,6 +177,7 @@ void gaus_dec2v_fx( /* gaus_dico2[i] = (gaus_dico_fx[i] - delta*gaus_dico_fx[i-1])/(1+delta*delta) */ tmp16 = msu_r( L_deposit_h( gaus_dico_fx[i] ), delta, gaus_dico_fx[i - 1] ); gaus_dico2_fx[i] = mult_r( tmp16, inv_delta ); + move16(); } } ELSE @@ -186,15 +190,14 @@ void gaus_dec2v_fx( } pt1 = &gaus_dico2_fx[i_mult2( ind1, step )]; - move16(); pt2 = &gaus_dico2_fx[i_mult2( ind2, step )]; - move16(); FOR( i = 0; i < lg; i++ ) { /* code is Q9, Gaussian codebook is Q12 */ /* code[i] = pt1[i] * sign1 + pt2[i] * sign2 */ code[i] = add( mult( pt1[i], sign1 ), mult( pt2[i], sign2 ) ); + move16(); } return; @@ -236,7 +239,7 @@ static void dec_2pos_fx( move16(); *sign2 = *sign1; move16(); - if ( GT_16( *ind1, *ind2 ) ) + IF ( GT_16( *ind1, *ind2 ) ) { *sign2 = negate( *sign1 ); move16(); diff --git a/lib_dec/gs_dec_amr_wb_fx.c b/lib_dec/gs_dec_amr_wb_fx.c index f55b5e877..f3645cc58 100644 --- a/lib_dec/gs_dec_amr_wb_fx.c +++ b/lib_dec/gs_dec_amr_wb_fx.c @@ -71,6 +71,7 @@ static void NoiseFill_fx( L_temp = L_mult( Random( seed_tcx ), fact ); L_temp = L_msu( L_temp, exc_diffQ_fx[CurBin], -32768 ); exc_diffQ_fx[CurBin] = round_fx( L_temp ); + move16(); } } @@ -175,6 +176,7 @@ static void Apply_gain_fx( L_temp = L_mult( exc_diffQ_fx[CurBin], y_gain_fx ); L_temp = L_shr( L_temp, y_gain_exp ); exc_diffQ_fx[CurBin] = round_fx( L_temp ); + move16(); } } } @@ -212,6 +214,7 @@ static void normalize_spec_fx( FOR( j = 0; j < L_frame; j++ ) { fy_norm_fx[j] = round_fx( Mult_32_16( L_temp, fy_norm_fx[j] ) ); + move16(); } return; @@ -300,7 +303,7 @@ static void gs_dec_amr_wb_fx( test(); IF( L_temp <= CONTR_LIMIT && ( VeryLowRateSTflag || GE_32( core_brate, ACELP_12k65 ) ) ) #else - IF( GE_32( core_brate, ACELP_12k65 ) ) + if ( GE_32( core_brate, ACELP_12k65 ) ) #endif { L_temp = L_shl( L_temp, 1 ); @@ -361,6 +364,7 @@ static void gs_dec_amr_wb_fx( temp2 = mult_r( temp2, temp ); /* Q15*Q9+1-16 -> Q9 */ L_temp = L_mult( exc_diffQ_fx[i], s_max( temp2, 512 ) ); /*Q(Qexc_diffQ+10) */ exc_diffQ_fx[i] = round_fx( L_shl( L_temp, 16 - 10 ) ); /*Qexc_diffQ */ + move16(); } /*--------------------------------------------------------------------------------------* @@ -412,6 +416,7 @@ void improv_amr_wb_gs_fx( Word16 Aq_orig[NB_SUBFR * ( M + 1 )], enr_LP_old, enr_LP_new; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif /*------------------------------------------------------------* @@ -435,8 +440,8 @@ void improv_amr_wb_gs_fx( #else IF( ( locattack == 0 && LE_32( core_brate, ACELP_12k65 ) ) && ( ( LT_32( core_brate, ACELP_8k85 ) && NE_16( clas, AUDIO_CLAS ) && - ( EQ_16( clas, UNVOICED_CLAS ) || EQ_16( clas, VOICED_TRANSITION ) ) ) || - EQ_16( coder_type, INACTIVE ) ) ) + ( clas == UNVOICED_CLAS || EQ_16( clas, VOICED_TRANSITION ) ) ) || + ( coder_type == INACTIVE ) ) ) #endif { /*------------------------------------------------------------* @@ -446,32 +451,34 @@ void improv_amr_wb_gs_fx( * LP filter smoothing for inactive parts *------------------------------------------------------------*/ *seed_tcx = extract_l( L_mult0( pitch_buf_fx[0], pitch_buf_fx[3] ) ); + move16(); /* last_coder_type == UNVOICED should be understand as INACTIVE, but it is forced to UNVOICED in update_dec */ test(); test(); test(); - IF( EQ_16( coder_type, INACTIVE ) && GT_16( Last_ener_fx, -3 * 256 ) && EQ_16( last_coder_type, UNVOICED ) && rate_switching_reset == 0 ) /* 3.0 x 256 to Go to Q8 */ + IF( coder_type == INACTIVE && GT_16( Last_ener_fx, -3 * 256 ) && EQ_16( last_coder_type, UNVOICED ) && rate_switching_reset == 0 ) /* 3.0 x 256 to Go to Q8 */ { FOR( i = 0; i < NB_SUBFR; i++ ) { Copy( Aq_fx, Aq_orig, NB_SUBFR * ( M + 1 ) ); - exp_a = norm_s( Aq_fx[i * ( M + 1 )] ); - exp_b = norm_s( old_Aq_fx[i * ( M + 1 )] ); + exp_a = norm_s( Aq_fx[imult1616(i , ( M + 1 ))] ); + exp_b = norm_s( old_Aq_fx[imult1616(i , ( M + 1 ))] ); exp_diff = sub( exp_a, exp_b ); IF( exp_diff > 0 ) { - Scale_sig( &old_Aq_fx[i * ( M + 1 )], ( M + 1 ), negate( exp_diff ) ); + Scale_sig( &old_Aq_fx[imult1616(i , ( M + 1 ))], ( M + 1 ), negate( exp_diff ) ); } ELSE { - Scale_sig( &Aq_fx[i * ( M + 1 )], ( M + 1 ), exp_diff ); + Scale_sig( &Aq_fx[imult1616(i , ( M + 1 ))], ( M + 1 ), exp_diff ); } - FOR( j = i * ( M + 1 ); j < ( i + 1 ) * ( M + 1 ); j++ ) + FOR( j = imult1616(i , ( M + 1 )); j < imult1616(add( i , 1 ) , ( M + 1 )); j++ ) { Aq_fx[j] = round_fx( L_mac( L_mult( ALP_FX, old_Aq_fx[j] ), MALP_FX, Aq_fx[j] ) ); + move16(); } } @@ -483,11 +490,12 @@ void improv_amr_wb_gs_fx( FOR( i = 0; i < NB_SUBFR; i++ ) { #ifdef BASOP_NOGLOB - enr_LP_new = Enr_1_Az_fx_o( Aq_fx + i * ( M + 1 ), L_SUBFR, &Overflow ); + enr_LP_new = Enr_1_Az_fx_o( Aq_fx + imult1616(i , ( M + 1 )), L_SUBFR, &Overflow ); #else enr_LP_new = Enr_1_Az_fx( Aq_fx + i * ( M + 1 ), L_SUBFR ); #endif - IF( ( shr( enr_LP_new, 7 ) > enr_LP_old ) || Overflow ) + test(); + IF( GT_16( shr( enr_LP_new, 7 ) , enr_LP_old ) || Overflow ) { /* filter is unstable, do not modify the excitation */ Copy( Aq_orig, Aq_fx, NB_SUBFR * ( M + 1 ) ); diff --git a/lib_dec/gs_dec_fx.c b/lib_dec/gs_dec_fx.c index 4c2925369..01d791f28 100644 --- a/lib_dec/gs_dec_fx.c +++ b/lib_dec/gs_dec_fx.c @@ -67,6 +67,7 @@ void decod_audio_fx( /*---------------------------------------------------------------* * Initialization *---------------------------------------------------------------*/ + move16(); // corresponding to initialization of Es_pred Diff_len = 0; move16(); @@ -76,17 +77,19 @@ void decod_audio_fx( /* decode GSC SWB speech flag */ test(); #if !defined ADD_LRTD - IF( NE_16( st_fx->coder_type, INACTIVE ) && GE_32( st_fx->total_brate, ACELP_13k20 ) ) + IF( st_fx->coder_type != INACTIVE && GE_32( st_fx->total_brate, ACELP_13k20 ) ) #else if ( st_fx->GSC_IVAS_mode >= 1 || ( st_fx->coder_type != INACTIVE && ( ( st_fx->element_mode == EVS_MONO && st_fx->total_brate >= ACELP_13k20 ) || ( st_fx->element_mode > EVS_MONO && st_fx->total_brate > MIN_BRATE_GSC_NOISY_FLAG && st_fx->bwidth >= SWB && !st_fx->flag_ACELP16k ) ) ) ) #endif { st_fx->GSC_noisy_speech = (Word16) get_next_indice( st_fx, 1 ); + move16(); } /* safety check in case of bit errors */ test(); + test(); IF( st_fx->GSC_noisy_speech && LT_16( st_fx->bwidth, SWB ) && st_fx->GSC_IVAS_mode == 0 ) { st_fx->BER_detect = 1; @@ -142,10 +145,12 @@ void decod_audio_fx( IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) { hGSCDec->noise_lev = add( (Word16) get_next_indice( st_fx, 2 ), NOISE_LEVEL_SP2 ); + move16(); } ELSE { hGSCDec->noise_lev = add( (Word16) get_next_indice( st_fx, 3 ), NOISE_LEVEL_SP0 ); + move16(); } /*---------------------------------------------------------------* @@ -177,7 +182,7 @@ void decod_audio_fx( #endif nb_frame_flg = (Word16) get_next_indice( st_fx, nbits ); - IF( s_and( nb_frame_flg, 0x1 ) == 0 ) + if ( s_and( nb_frame_flg, 0x1 ) == 0 ) { nb_subfr = 2 * SWNB_SUBFR; move16(); @@ -213,7 +218,7 @@ void decod_audio_fx( nbits = 3; move16(); test(); - if ( LT_32( st_fx->core_brate, ACELP_9k60 ) && ( EQ_16( st_fx->coder_type, INACTIVE ) ) ) + IF( LT_32( st_fx->core_brate, ACELP_9k60 ) && st_fx->coder_type == INACTIVE ) { nbits = 1; move16(); @@ -225,7 +230,7 @@ void decod_audio_fx( move16(); } test(); - IF( LT_32( st_fx->core_brate, ACELP_9k60 ) && NE_16( st_fx->coder_type, INACTIVE ) ) + IF( LT_32( st_fx->core_brate, ACELP_9k60 ) && st_fx->coder_type != INACTIVE ) { pit_band_idx = 1; move16(); @@ -235,7 +240,7 @@ void decod_audio_fx( pit_band_idx = (Word16) get_next_indice( st_fx, nbits ); } - IF( pit_band_idx != 0 ) + if ( pit_band_idx != 0 ) { IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) { @@ -248,7 +253,7 @@ void decod_audio_fx( } /* detect bit errors in the bitstream */ - IF( GT_16( pit_band_idx, 13 ) ) /* The maximum decodable index is 10 + BAND1k2 (3) = 13 */ + if ( GT_16( pit_band_idx, 13 ) ) /* The maximum decodable index is 10 + BAND1k2 (3) = 13 */ { pit_band_idx = 13; move16(); @@ -283,7 +288,7 @@ void decod_audio_fx( Word16 indice; nbits = Es_pred_bits_tbl[BIT_ALLOC_IDX_fx( st_fx->core_brate, GENERIC, -1, -1 )]; move16(); - IF( GT_16( st_fx->element_mode, EVS_MONO ) ) + if ( st_fx->element_mode > EVS_MONO ) { nbits = 5; move16(); @@ -307,7 +312,7 @@ void decod_audio_fx( { pit_band_idx = 9 + BAND1k2; move16(); - if ( EQ_16( st_fx->bwidth, NB ) ) + if ( st_fx->bwidth == NB ) { pit_band_idx = 7 + BAND1k2; move16(); @@ -341,14 +346,14 @@ void decod_audio_fx( max_len = sub( st_fx->L_frame, Diff_len ); - if ( EQ_16( st_fx->bwidth, NB ) ) + if ( st_fx->bwidth == NB ) { max_len = sub( 160, Diff_len ); } Len = 80; move16(); - if ( max_len < 80 ) + if ( LT_16( max_len, 80 ) ) { Len = max_len; move16(); @@ -359,7 +364,7 @@ void decod_audio_fx( { FOR( i = 0; i < max_len; i++ ) { - dct_epit[i + Diff_len] = 0; + dct_epit[add( i, Diff_len )] = 0; move16(); } } @@ -367,13 +372,13 @@ void decod_audio_fx( { FOR( i = 0; i < Len; i++ ) { - dct_epit[i + Diff_len] = mult_r( dct_epit[i + Diff_len], sm_table_fx[i] ); + dct_epit[add( i, Diff_len )] = mult_r( dct_epit[add( i, Diff_len )], sm_table_fx[i] ); move16(); } FOR( ; i < max_len; i++ ) { - dct_epit[i + Diff_len] = 0; + dct_epit[add( i, Diff_len )] = 0; move16(); } } @@ -406,6 +411,7 @@ void decod_audio_fx( set16_fx( gain_buf, 0, NB_SUBFR16k ); st_fx->bfi_pitch_fx = shl( L_SUBFR, 6 ); + move16(); st_fx->bfi_pitch_frame = st_fx->L_frame; move16(); st_fx->lp_gainp_fx = 0; @@ -444,7 +450,8 @@ void decod_audio_fx( test(); if ( EQ_16( st_fx->coder_type, INACTIVE ) && LE_32( st_fx->core_brate, ACELP_9k60 ) && st_fx->idchan == 0 ) #else - if ( EQ_16( st_fx->coder_type, INACTIVE ) && LE_32( st_fx->core_brate, ACELP_9k60 ) ) + test(); + if ( st_fx->coder_type == INACTIVE && LE_32( st_fx->core_brate, ACELP_9k60 ) ) #endif { tmp_nb_bits_tot = add( tmp_nb_bits_tot, 5 ); @@ -477,7 +484,7 @@ void decod_audio_fx( * Update BWE excitation *--------------------------------------------------------------------------------------*/ - if ( st_fx->hBWE_TD != NULL ) + IF ( st_fx->hBWE_TD != NULL ) { set16_fx( voice_factors, 0, NB_SUBFR16k ); IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) @@ -561,6 +568,7 @@ void decod_audio_ivas_fx( GSC_DEC_HANDLE hGSCDec; hGSCDec = st_fx->hGSCDec; + move16(); //Es_pred /*---------------------------------------------------------------* * Initialization @@ -576,15 +584,23 @@ void decod_audio_ivas_fx( #if 0 // !defined ADD_LRTD IF(NE_16(st_fx->coder_type, INACTIVE) && GE_32(st_fx->total_brate, ACELP_13k20)) #else - if ( st_fx->GSC_IVAS_mode >= 1 || ( st_fx->coder_type != INACTIVE && ( ( st_fx->element_mode == EVS_MONO && st_fx->total_brate >= ACELP_13k20 ) || - ( st_fx->element_mode > EVS_MONO && st_fx->total_brate > MIN_BRATE_GSC_NOISY_FLAG && st_fx->bwidth >= SWB && !st_fx->flag_ACELP16k ) ) ) ) + test(); + test(); + test(); + test(); + test(); + test(); + IF( GE_16( st_fx->GSC_IVAS_mode, 1 ) || ( st_fx->coder_type != INACTIVE && ( ( st_fx->element_mode == EVS_MONO && GE_32( st_fx->total_brate, ACELP_13k20 ) ) || + ( st_fx->element_mode > EVS_MONO && GT_32( st_fx->total_brate, MIN_BRATE_GSC_NOISY_FLAG ) && GE_16( st_fx->bwidth, SWB ) && !st_fx->flag_ACELP16k ) ) ) ) #endif { st_fx->GSC_noisy_speech = (Word16) get_next_indice( st_fx, 1 ); + move16(); } /* safety check in case of bit errors */ test(); + test(); IF( st_fx->GSC_noisy_speech && LT_16( st_fx->bwidth, SWB ) && st_fx->GSC_IVAS_mode == 0 ) { st_fx->BER_detect = 1; @@ -604,7 +620,7 @@ void decod_audio_ivas_fx( #if 1 // defined ADD_LRTD test(); test(); - IF( st_fx->GSC_IVAS_mode >= 1 || ( EQ_16( st_fx->GSC_noisy_speech, 1 ) && st_fx->GSC_IVAS_mode == 0 ) ) + IF( GE_16( st_fx->GSC_IVAS_mode, 1 ) || ( EQ_16( st_fx->GSC_noisy_speech, 1 ) && st_fx->GSC_IVAS_mode == 0 ) ) #else IF( EQ_16( st_fx->GSC_noisy_speech, 1 ) ) #endif @@ -616,21 +632,26 @@ void decod_audio_ivas_fx( hGSCDec->noise_lev = NOISE_LEVEL_SP3; move16(); #if 1 // def ADD_LRTD - if ( st_fx->GSC_IVAS_mode >= 1 ) + IF ( GE_16( st_fx->GSC_IVAS_mode, 1 ) ) { - if ( st_fx->core_brate < GSC_L_RATE_STG && st_fx->GSC_IVAS_mode < 3 ) + test(); + if ( LT_32( st_fx->core_brate, GSC_L_RATE_STG ) && LT_32( st_fx->GSC_IVAS_mode, 3 ) ) { nb_subfr = 2; + move16(); } hGSCDec->noise_lev = NOISE_LEVEL_SP2; + move16(); - if ( st_fx->GSC_IVAS_mode == 3 ) /* Music like */ + IF( EQ_16( st_fx->GSC_IVAS_mode, 3 ) ) /* Music like */ { hGSCDec->noise_lev = NOISE_LEVEL_SP0; + move16(); } - else if ( st_fx->GSC_noisy_speech == 0 ) /* speech like but not noisy */ + ELSE IF( st_fx->GSC_noisy_speech == 0 ) /* speech like but not noisy */ { hGSCDec->noise_lev = NOISE_LEVEL_SP3; + move16(); } } #endif @@ -640,22 +661,28 @@ void decod_audio_ivas_fx( IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) { hGSCDec->noise_lev = add( (Word16) get_next_indice( st_fx, 2 ), NOISE_LEVEL_SP2 ); + move16(); } ELSE { hGSCDec->noise_lev = add( (Word16) get_next_indice( st_fx, 3 ), NOISE_LEVEL_SP0 ); + move16(); } /*---------------------------------------------------------------* * Decode number of subframes *---------------------------------------------------------------*/ #if 1 // def ADD_LRTD - if ( st_fx->L_frame == L_FRAME16k && ( st_fx->core_brate <= ACELP_13k20 || st_fx->coder_type == INACTIVE ) ) + test(); + test(); + IF( EQ_16( st_fx->L_frame, L_FRAME16k ) && ( LE_32( st_fx->core_brate, ACELP_13k20 ) || st_fx->coder_type == INACTIVE ) ) { hGSCDec->cor_strong_limit = 0; + move16(); nb_subfr = 1; + move16(); } - else + ELSE #endif { hGSCDec->cor_strong_limit = 1; @@ -663,18 +690,21 @@ void decod_audio_ivas_fx( nb_subfr = SWNB_SUBFR; move16(); - IF( GE_32( st_fx->core_brate, ACELP_9k60 ) ) + IF ( GE_32( st_fx->core_brate, ACELP_9k60 ) ) { nbits = 1; move16(); #if 1 // def ADD_LRTD - if ( st_fx->L_frame == L_FRAME16k && st_fx->core_brate >= MIN_RATE_4SBFR ) + test(); + if ( EQ_16( st_fx->L_frame, L_FRAME16k ) && GE_32( st_fx->core_brate, MIN_RATE_4SBFR ) ) { nbits = 2; + move16(); } #endif nb_frame_flg = (Word16) get_next_indice( st_fx, nbits ); + test(); IF( s_and( nb_frame_flg, 0x1 ) == 0 ) { nb_subfr = 2 * SWNB_SUBFR; @@ -683,23 +713,26 @@ void decod_audio_ivas_fx( move16(); } #if 1 // def ADD_LRTD - else if ( st_fx->L_frame == L_FRAME16k && st_fx->core_brate >= MIN_RATE_4SBFR ) + ELSE IF( EQ_16( st_fx->L_frame, L_FRAME16k ) && GE_32( st_fx->core_brate, MIN_RATE_4SBFR ) ) { nb_subfr = 2 * SWNB_SUBFR; /* cor_strong already set to 1 */ + move16(); } - if ( ( nb_frame_flg >> 1 ) == 1 ) + if ( EQ_16( shr( nb_frame_flg, 1 ), 1 ) ) { - nb_subfr *= 2; + nb_subfr = shl(nb_subfr, 1); } #endif } } } #if 1 - if ( st_fx->L_frame == L_FRAME16k && nb_subfr == NB_SUBFR ) + test(); + if ( EQ_16( st_fx->L_frame, L_FRAME16k ) && EQ_16( nb_subfr, NB_SUBFR ) ) { nb_subfr = NB_SUBFR16k; + move16(); } #endif /*---------------------------------------------------------------* @@ -711,7 +744,7 @@ void decod_audio_ivas_fx( nbits = 3; move16(); test(); - if ( LT_32( st_fx->core_brate, ACELP_9k60 ) && ( EQ_16( st_fx->coder_type, INACTIVE ) ) ) + if ( LT_32( st_fx->core_brate, ACELP_9k60 ) && ( st_fx->coder_type == INACTIVE ) ) { nbits = 1; move16(); @@ -723,7 +756,7 @@ void decod_audio_ivas_fx( move16(); } test(); - IF( LT_32( st_fx->core_brate, ACELP_9k60 ) && NE_16( st_fx->coder_type, INACTIVE ) ) + IF( LT_32( st_fx->core_brate, ACELP_9k60 ) && st_fx->coder_type != INACTIVE ) { pit_band_idx = 1; move16(); @@ -733,7 +766,7 @@ void decod_audio_ivas_fx( pit_band_idx = (Word16) get_next_indice( st_fx, nbits ); } - IF( pit_band_idx != 0 ) + IF ( pit_band_idx != 0 ) { IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) { @@ -746,7 +779,7 @@ void decod_audio_ivas_fx( } /* detect bit errors in the bitstream */ - IF( GT_16( pit_band_idx, 13 ) ) /* The maximum decodable index is 10 + BAND1k2 (3) = 13 */ + IF ( GT_16( pit_band_idx, 13 ) ) /* The maximum decodable index is 10 + BAND1k2 (3) = 13 */ { pit_band_idx = 13; move16(); @@ -771,9 +804,16 @@ void decod_audio_ivas_fx( *---------------------------------------------------------------*/ test(); #if 1 // def ADD_LRTD - if ( !( st_fx->GSC_IVAS_mode > 0 && st_fx->L_frame / nb_subfr == 2 * L_SUBFR && st_fx->GSC_IVAS_mode < 3 ) && - ( ( st_fx->core_brate >= MIN_RATE_FCB || st_fx->GSC_noisy_speech ) && - ( ( nb_subfr == NB_SUBFR && st_fx->L_frame == L_FRAME ) || ( nb_subfr == NB_SUBFR16k && st_fx->L_frame == L_FRAME16k ) ) ) ) + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( !( ( st_fx->GSC_IVAS_mode > 0 ) && EQ_16( idiv1616( st_fx->L_frame, nb_subfr ), 2 * L_SUBFR ) && LT_16( st_fx->GSC_IVAS_mode, 3 ) ) && + ( ( GE_32( st_fx->core_brate, MIN_RATE_FCB ) || st_fx->GSC_noisy_speech ) && + ( ( EQ_16( nb_subfr, NB_SUBFR ) && EQ_16( st_fx->L_frame, L_FRAME ) ) || ( EQ_16( nb_subfr, NB_SUBFR16k ) && EQ_16( st_fx->L_frame, L_FRAME16k ) ) ) ) ) #else IF( EQ_16( st_fx->GSC_noisy_speech, 1 ) && EQ_16( nb_subfr, NB_SUBFR ) ) #endif @@ -781,7 +821,7 @@ void decod_audio_ivas_fx( Word16 indice; nbits = Es_pred_bits_tbl[BIT_ALLOC_IDX_fx( st_fx->core_brate, GENERIC, -1, -1 )]; move16(); - IF( GT_16( st_fx->element_mode, EVS_MONO ) ) + if ( st_fx->element_mode > EVS_MONO ) { nbits = 5; move16(); @@ -796,7 +836,7 @@ void decod_audio_ivas_fx( #else dec_pit_exc_fx( st_fx, Aq, st_fx->coder_type, Es_pred, pitch_buf, code, exc, bwe_exc, nb_subfr, gain_buf ); #endif - IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) + IF ( LT_32( st_fx->core_brate, ACELP_9k60 ) ) { minimum_fx( pitch_buf, shr( st_fx->L_frame, 6 ), &low_pit ); low_pit = shr( low_pit, 6 ); /*Q6 -> Q0 */ @@ -805,7 +845,7 @@ void decod_audio_ivas_fx( { pit_band_idx = 9 + BAND1k2; move16(); - if ( EQ_16( st_fx->bwidth, NB ) ) + if ( st_fx->bwidth == NB ) { pit_band_idx = 7 + BAND1k2; move16(); @@ -839,25 +879,25 @@ void decod_audio_ivas_fx( max_len = sub( st_fx->L_frame, Diff_len ); - if ( EQ_16( st_fx->bwidth, NB ) ) + if ( st_fx->bwidth == NB ) { max_len = sub( 160, Diff_len ); } Len = 80; move16(); - if ( max_len < 80 ) + if ( LT_16( max_len, 80 ) ) { Len = max_len; move16(); } test(); - IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && NE_16( st_fx->bwidth, NB ) ) + IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && st_fx->bwidth != NB ) { FOR( i = 0; i < max_len; i++ ) { - dct_epit[i + Diff_len] = 0; + dct_epit[add( i, Diff_len )] = 0; move16(); } } @@ -865,13 +905,13 @@ void decod_audio_ivas_fx( { FOR( i = 0; i < Len; i++ ) { - dct_epit[i + Diff_len] = mult_r( dct_epit[i + Diff_len], sm_table_fx[i] ); + dct_epit[add( i, Diff_len )] = mult_r( dct_epit[add( i, Diff_len )], sm_table_fx[i] ); move16(); } FOR( ; i < max_len; i++ ) { - dct_epit[i + Diff_len] = 0; + dct_epit[add( i, Diff_len )] = 0; move16(); } } @@ -904,6 +944,7 @@ void decod_audio_ivas_fx( set16_fx( gain_buf, 0, NB_SUBFR16k ); st_fx->bfi_pitch_fx = shl( L_SUBFR, 6 ); + move16(); st_fx->bfi_pitch_frame = st_fx->L_frame; move16(); st_fx->lp_gainp_fx = 0; @@ -940,7 +981,7 @@ void decod_audio_ivas_fx( test(); #if 1 // defined ADD_LRTD test(); - if ( EQ_16( st_fx->coder_type, INACTIVE ) && LE_32( st_fx->core_brate, ACELP_9k60 ) && st_fx->idchan == 0 ) + if ( st_fx->coder_type == INACTIVE && LE_32( st_fx->core_brate, ACELP_9k60 ) && st_fx->idchan == 0 ) #else if ( EQ_16( st_fx->coder_type, INACTIVE ) && LE_32( st_fx->core_brate, ACELP_9k60 ) ) #endif @@ -949,10 +990,10 @@ void decod_audio_ivas_fx( } #if 1 // ydef ADD_LRTD - IF( EQ_16( st_fx->idchan, 1 ) ) + IF ( EQ_16( st_fx->idchan, 1 ) ) { tmp_nb_bits_tot = add( tmp_nb_bits_tot, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ); - IF( EQ_16( st_fx->tdm_LRTD_flag, 1 ) ) + if ( EQ_16( st_fx->tdm_LRTD_flag, 1 ) ) { tmp_nb_bits_tot = sub( tmp_nb_bits_tot, STEREO_BITS_TCA ); } @@ -976,7 +1017,7 @@ void decod_audio_ivas_fx( * Update BWE excitation *--------------------------------------------------------------------------------------*/ - if ( st_fx->hBWE_TD != NULL ) + IF ( st_fx->hBWE_TD != NULL ) { set16_fx( voice_factors, 0, NB_SUBFR16k ); IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) @@ -1069,6 +1110,8 @@ void gsc_dec_fx( GSC_DEC_HANDLE hGSCDec; hGSCDec = st_fx->hGSCDec; + move16(); // for Mbands_gn + move16(); // for Qexc_diffQ set16_fx( inpulses_fx, 0, NB_SFM ); set16_fx( imaxpulse_fx, 0, NB_SFM ); @@ -1112,6 +1155,7 @@ void gsc_dec_fx( } st_fx->lp_gainc_fx = mult_r( st_fx->lp_gainc_fx, 32112 ); /*Q3*/ + move16(); } ELSE { @@ -1143,12 +1187,13 @@ void gsc_dec_fx( mean_gain = gsc_gaindec_fx( st_fx, Ener_per_bd_iQ, st_fx->core_brate, hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); #endif st_fx->lp_gainc_fx = mult_r( 640, mean_gain ); /*10 in Q6 x Q12 -> lp_gainc in Q3 */ + move16(); } *last_bin = 0; move16(); test(); - IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && NE_16( st_fx->bwidth, NB ) ) + IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && st_fx->bwidth != NB ) { bitallocation_exc[0] = 0; move16(); @@ -1178,6 +1223,7 @@ void gsc_dec_fx( L_tmp = L_shr( L_mult( Random( &hGSCDec->seed_tcx ), 26214 ), 5 ); /*Q10*/ L_tmp = L_mac( L_tmp, hGSCDec->Last_GSC_spectrum_fx[i], 6554 ); hGSCDec->Last_GSC_spectrum_fx[i] = round_fx( L_tmp ); /*Q10*/ + move16(); } } @@ -1242,11 +1288,11 @@ void gsc_dec_fx( { FOR( j = 0; j < shl( nb_subbands, 4 ); j++ ) { - IF( concat_out[j] > 0 ) + IF ( concat_out[j] > 0 ) { seed_init = extract_l( L_shl( seed_init, 3 ) ); } - IF( concat_out[j] < 0 ) + if ( concat_out[j] < 0 ) { seed_init = add( seed_init, 3 ); move16(); @@ -1257,7 +1303,7 @@ void gsc_dec_fx( move16(); } test(); - IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && NE_16( st_fx->bwidth, NB ) ) + IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && st_fx->bwidth != NB ) { if ( exc_diffQ[L_FRAME8k - 2] != 0 ) { @@ -1390,6 +1436,8 @@ void gsc_dec_ivas_fx( GSC_DEC_HANDLE hGSCDec; hGSCDec = st_fx->hGSCDec; + move16(); // for Mbands_gn + move16(); // for Qexc_diffQ set16_fx( inpulses_fx, 0, NB_SFM ); set16_fx( imaxpulse_fx, 0, NB_SFM ); @@ -1402,13 +1450,12 @@ void gsc_dec_ivas_fx( test(); test(); test(); - test(); - IF( EQ_16( coder_type, INACTIVE ) && ( EQ_16( st_fx->tdm_LRTD_flag, 1 ) || EQ_16( st_fx->element_mode, IVAS_SCE ) ) && LE_32( st_fx->core_brate, GSC_LRES_GAINQ_LIMIT ) ) + if ( coder_type == INACTIVE && ( EQ_16( st_fx->tdm_LRTD_flag, 1 ) || EQ_16( st_fx->element_mode, IVAS_SCE ) ) && LE_32( st_fx->core_brate, GSC_LRES_GAINQ_LIMIT ) ) { bit = add( bit, GSC_LRES_NB_NITS ); } - IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) + if ( EQ_16( st_fx->L_frame, L_FRAME16k ) ) { Mbands_gn = MBANDS_GN16k; move16(); @@ -1433,6 +1480,7 @@ void gsc_dec_ivas_fx( } st_fx->lp_gainc_fx = mult_r( st_fx->lp_gainc_fx, 32112 ); /*Q3*/ + move16(); } ELSE { @@ -1442,7 +1490,7 @@ void gsc_dec_ivas_fx( move16(); WHILE( LT_16( i, SIZE_BRATE_INTERMED_TBL ) ) { - IF( LE_32( st_fx->core_brate, brate_intermed_tbl[i] ) ) + IF ( LE_32( st_fx->core_brate, brate_intermed_tbl[i] ) ) { break; } @@ -1452,11 +1500,10 @@ void gsc_dec_ivas_fx( test(); test(); test(); - test(); - IF( GT_16( st_fx->element_mode, EVS_MONO ) && EQ_16( coder_type, AUDIO ) && + IF( st_fx->element_mode > EVS_MONO && EQ_16( coder_type, AUDIO ) && LE_32( st_fx->core_brate, STEREO_GSC_BIT_RATE_ALLOC ) && EQ_32( brate_intermed_tbl[i], ACELP_9k60 ) ) /* Bit allocation is mapped to 8 kb/s instead of 9.6 kb/s in this case */ { - i--; + i = sub( i, 1 ); } mean_gain = gsc_gaindec_ivas_fx( st_fx, Ener_per_bd_iQ, brate_intermed_tbl[i], hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); @@ -1464,12 +1511,13 @@ void gsc_dec_ivas_fx( mean_gain = gsc_gaindec_fx( st_fx, Ener_per_bd_iQ, st_fx->core_brate, hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); #endif st_fx->lp_gainc_fx = mult_r( 640, mean_gain ); /*10 in Q6 x Q12 -> lp_gainc in Q3 */ + move16(); } *last_bin = 0; move16(); test(); - IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && NE_16( st_fx->bwidth, NB ) ) + IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && st_fx->bwidth != NB ) { bitallocation_exc[0] = 0; move16(); @@ -1499,6 +1547,7 @@ void gsc_dec_ivas_fx( L_tmp = L_shr( L_mult( Random( &hGSCDec->seed_tcx ), 26214 ), 5 ); /*Q10*/ L_tmp = L_mac( L_tmp, hGSCDec->Last_GSC_spectrum_fx[i], 6554 ); hGSCDec->Last_GSC_spectrum_fx[i] = round_fx( L_tmp ); /*Q10*/ + move16(); } } @@ -1521,7 +1570,7 @@ void gsc_dec_ivas_fx( st_fx->L_frame, st_fx->element_mode, st_fx->GSC_IVAS_mode ); #if 1 // def ADD_LRTD - IF( bit == 0 ) + IF ( bit == 0 ) { set16_fx( concat_out, 0, L_FRAME16k ); } @@ -1536,20 +1585,27 @@ void gsc_dec_ivas_fx( #if 1 // def ADD_LRTD max_eq = 0; + move16(); max_eq_val = 32767; + move16(); - IF( ( ( st_fx->core_brate < ACELP_7k20 && st_fx->GSC_noisy_speech == 1 ) || st_fx->core_brate < 6000 ) && coder_type <= UNVOICED ) + test(); + test(); + test(); + IF( ( ( LT_32( st_fx->core_brate, ACELP_7k20 ) && EQ_16( st_fx->GSC_noisy_speech, 1 ) ) || LT_32( st_fx->core_brate, 6000 ) ) && LE_16( coder_type, UNVOICED ) ) { - j = maximum_fx( concat_out, nb_subbands * 16, &max_eq ); + j = maximum_fx( concat_out, imult1616( nb_subbands, 16 ), &max_eq ); // max_eq = max_eq_val / (abs_s(concat_out[j]) + 328 /*0.01f*/ ); - Word16 temp_max_eq = abs_s( concat_out[j] ) + 10 /*0.01f in Q10*/; + Word16 temp_max_eq = add( abs_s( concat_out[j] ), 10 ) /*0.01f in Q10*/; IF( LE_16( temp_max_eq, ONE_IN_Q10 ) ) { max_eq = max_eq_val; + move16(); } ELSE { Word16 exp = 5; + move16(); max_eq = Inv16( temp_max_eq, &exp ); max_eq = shl( max_eq, exp ); } @@ -1578,14 +1634,13 @@ void gsc_dec_ivas_fx( { seed_init = extract_l( L_shl( seed_init, 3 ) ); } - IF( concat_out[j] < 0 ) + if ( concat_out[j] < 0 ) { #ifdef BASOP_NOGLOB_TMP_715 seed_init = add_sat( seed_init, 3 ); #else seed_init = add( seed_init, 3 ); #endif - move16(); } } @@ -1593,15 +1648,15 @@ void gsc_dec_ivas_fx( move16(); } test(); - IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && NE_16( st_fx->bwidth, NB ) ) + IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && st_fx->bwidth != NB ) { - IF( exc_diffQ[L_FRAME8k - 2] != 0 ) + if ( exc_diffQ[L_FRAME8k - 2] != 0 ) { bitallocation_exc[0] = 1; move16(); } - IF( exc_diffQ[L_FRAME8k - 1] != 0 ) + if ( exc_diffQ[L_FRAME8k - 1] != 0 ) { bitallocation_exc[1] = 1; move16(); @@ -1620,8 +1675,6 @@ void gsc_dec_ivas_fx( test(); test(); test(); - test(); - test(); IF( GE_16( st_fx->GSC_IVAS_mode, 1 ) && EQ_16( st_fx->GSC_noisy_speech, 1 ) ) { FOR( i = 64; i < st_fx->L_frame; i++ ) @@ -1629,6 +1682,7 @@ void gsc_dec_ivas_fx( // PMT("GSC FIX point to be done here") // exc_diffQ[i] *= max_eq; exc_diffQ[i] = mult_r( exc_diffQ[i], max_eq ); + move16(); } } ELSE IF( ( ( LT_32( st_fx->core_brate, ACELP_7k20 ) && EQ_16( st_fx->GSC_noisy_speech, 1 ) ) || LT_32( st_fx->core_brate, 6000 ) ) && LE_16( st_fx->coder_type, UNVOICED ) ) @@ -1638,6 +1692,7 @@ void gsc_dec_ivas_fx( // PMT("GSC FIX point to be done here") // exc_diffQ[i] *= max_eq; exc_diffQ[i] = mult_r( exc_diffQ[i], max_eq ); + move16(); } } ELSE diff --git a/lib_dec/hdecnrm_fx.c b/lib_dec/hdecnrm_fx.c index 40946cb20..4894ee0e8 100644 --- a/lib_dec/hdecnrm_fx.c +++ b/lib_dec/hdecnrm_fx.c @@ -55,7 +55,7 @@ void hdecnrm_fx( move16(); if ( get_next_indice_1( st_fx ) != 0 ) { - j = (Word16) 1; + j = 1; move16(); } temp = add( 8, n ); @@ -110,6 +110,7 @@ Word16 decode_huff_context_fx( tmp_h = shr( hufftab[hufftab_idx], 4 ); tmp_l = sub( hufftab[hufftab_idx], shl( tmp_h, 4 ) ); *rbits = add( *rbits, tmp_l ); + move16(); hufftab_idx = L_add( hufftab_idx, L_add( L_deposit_l( tmp_h ), get_next_indice( st_fx, tmp_l ) ) ); } return negate( hufftab[hufftab_idx] ); @@ -218,7 +219,6 @@ void hdecnrm_resize_fx( ELSE{ IF( get_next_indice_1( st_fx ) != 0 ){ temp = add( 16, k ); - move16(); } ELSE { @@ -282,6 +282,7 @@ void huff_dec_fx( /* Put back unused bits */ st_fx->next_bit_pos = sub( st_fx->next_bit_pos, j ); + move16(); return; } @@ -304,7 +305,6 @@ void hdecnrm_tran_fx( Word16 l; pidx = index; - move16(); m = sub( N, 1 ); FOR( i = 0; i < m; i++ ) diff --git a/lib_dec/hf_synth_fx.c b/lib_dec/hf_synth_fx.c index c63636e23..e32e5807c 100644 --- a/lib_dec/hf_synth_fx.c +++ b/lib_dec/hf_synth_fx.c @@ -48,6 +48,7 @@ void hf_synth_init_fx( ) { hBWE_zero->seed2 = RANDOM_INITSEED; + move16(); set16_fx( hBWE_zero->mem_hf_fx, 0, ( L_FIR - 1 ) ); set16_fx( hBWE_zero->mem_syn_hf_fx, 0, M ); set16_fx( hBWE_zero->mem_hp400_fx, 0, 4 ); @@ -113,14 +114,12 @@ void hf_synth_fx( move16(); p_Aq = Aq; - move16(); FOR( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) { - hf_synthesis_fx( hBWE_zero, core_brate, output_subfr, p_Aq, &exc[i_subfr], Q_exc, &synth[i_subfr], &synth16k[i_subfr * output_subfr / L_SUBFR], + hf_synthesis_fx( hBWE_zero, core_brate, output_subfr, p_Aq, &exc[i_subfr], Q_exc, &synth[i_subfr], &synth16k[imult3216((Word32)i_subfr , output_subfr) / L_SUBFR], Q_syn2, delay_syn_hf, memExp1, mem_hp_interp, extl, CNG_mode ); p_Aq += ( M + 1 ); - move16(); } return; @@ -241,7 +240,6 @@ static void hf_synthesis_fx( scale = round_fx( L_tmp ); /* Q18 when Q_exc=-1, HF_exc in Q-3 */ exp2 = sub( *memExp1, exp1 ); - move16(); *memExp1 = exp1; move16(); @@ -303,7 +301,7 @@ static void hf_synthesis_fx( tmp = add( 1, sub( 32767, tmp ) ); #endif test(); - if ( EQ_32( core_brate, FRAME_NO_DATA ) || EQ_32( core_brate, SID_2k40 ) ) + if ( core_brate == FRAME_NO_DATA || EQ_32( core_brate, SID_2k40 ) ) { /* emphasize HF noise in CNG */ /*fac *= 2.0f;*/ @@ -349,8 +347,8 @@ static void hf_synthesis_fx( /* delay by 5 samples @16kHz to compensate CLDFB resampling delay (20samples) and HP filtering delay (roughly 15 samples) */ delay = NS2SA( 16000, DELAY_CLDFB_NS ) - 15; - Copy( HF_syn + L_SUBFR16k - delay, temp_buffer, delay ); - Copy( HF_syn, HF_syn + delay, L_SUBFR16k - delay ); + Copy( HF_syn + sub(L_SUBFR16k , delay), temp_buffer, delay ); + Copy( HF_syn, HF_syn + delay, sub(L_SUBFR16k , delay) ); Copy( delay_syn_hf, HF_syn, delay ); Copy( temp_buffer, delay_syn_hf, delay ); @@ -643,6 +641,7 @@ static void filt_6k_7k_scale_fx( Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif Copy_Scale_sig( mem, x, L_FIR - 1, exp ); @@ -657,7 +656,7 @@ static void filt_6k_7k_scale_fx( Word16 j; L_tmp = 0; move32(); - for ( j = 0; j < 31; j++ ) + FOR ( j = 0; j < 31; j++ ) { #ifdef BASOP_NOGLOB L_tmp = L_mac_o( L_tmp, x[i + j], fir_6k_7k_fx[j], &Overflow ); @@ -668,6 +667,7 @@ static void filt_6k_7k_scale_fx( #ifdef BASOP_NOGLOB signal[i] = round_fx_o( L_tmp, &Overflow ); + move16(); #else signal[i] = round_fx( L_tmp ); #endif @@ -844,6 +844,7 @@ void hf_synth_amr_wb_fx( tmp1 = div_s( shl( 1, sub( 14, exp ) ), tmp1 ); /*Q(29-exp-2*(Q_syn-3)-1) */ L_tmp = L_mult( tmp2, tmp1 ); /*30-exp-2*(Q_syn-3)-1+2*(Q_syn-3)+1 - >30-exp */ *pt3 = round_fx( L_shl( L_tmp, sub( exp, 1 ) ) ); /*13 */ + move16(); *pt4++ = *pt3++; move16(); @@ -879,10 +880,12 @@ void hf_synth_amr_wb_fx( } ELSE { - move16(); hAmrwb_IO->frame_count_fx = s_min( hAmrwb_IO->frame_count_fx, 2 * FRAME_COUNT_HF_SYNTH - 1 ); + move16(); hAmrwb_IO->frame_count_fx = add( hAmrwb_IO->frame_count_fx, 1 ); + move16(); hAmrwb_IO->ne_min_fx = s_min( hAmrwb_IO->ne_min_fx, ng_ener_ST ); + move16(); } pt6 = voice_factors; @@ -912,6 +915,7 @@ void hf_synth_amr_wb_fx( fmerit_w = extract_l( L_shr( L_tmp, 15 ) ); /*Q14 */ /**fmerit_w_sm = add(mult_r(*fmerit_w_sm, 29491), mult_r(fmerit_w, 3277)); //Q14 */ hAmrwb_IO->fmerit_w_sm_fx = round_fx( L_mac( L_mult( hAmrwb_IO->fmerit_w_sm_fx, 29491 ), fmerit_w, 3277 ) ); /*Q14 */ + move16(); fmerit_w = hAmrwb_IO->fmerit_w_sm_fx; move16(); @@ -925,6 +929,7 @@ void hf_synth_amr_wb_fx( } fmerit_m = negate( add( -32768, tmp1 ) ); hAmrwb_IO->fmerit_m_sm_fx = add( shr( hAmrwb_IO->fmerit_m_sm_fx, 1 ), shr( fmerit_m, 1 ) ); /*Q14 */ + move16(); fmerit_m = hAmrwb_IO->fmerit_m_sm_fx; move16(); @@ -949,6 +954,7 @@ void hf_synth_amr_wb_fx( L_tmp = L_mult0( *pt1, fmerit_m ); /*Q13+14 */ *pt1++ = extract_l( L_shr( L_tmp, 14 ) ); /*Q13 */ + move16(); } /* predict LPC coefficents and calculate sub-frame gains */ p_Aq = Aq; @@ -1032,6 +1038,7 @@ void hf_synth_amr_wb_fx( IF( LT_16( beta, 16384 ) ) { L_tmp = 1; /*variable for tonal energy*/ + move32(); pt1 = hb_amb; pt2 = hb_tonal; @@ -1052,6 +1059,7 @@ void hf_synth_amr_wb_fx( #endif } *pt1 = round_fx( L_shl( L_mult( tmp, tmp1 ), 2 ) ); /*qdct */ + move16(); *pt2 = sub( *pt3, *pt1 ); move16(); IF( *pt2 > 0 ) @@ -1067,6 +1075,7 @@ void hf_synth_amr_wb_fx( fb = sub( i, 7 ); fn = add( fb, 15 ); tmp = 0; + move16(); pt4 = &dct_hb[fb + 240]; FOR( j = fb; j < fn; j++ ) { @@ -1109,6 +1118,7 @@ void hf_synth_amr_wb_fx( #endif } *pt1 = round_fx( L_shl( L_mult( tmp, tmp1 ), 2 ) ); /*qdct */ + move16(); *pt2 = sub( *pt3, *pt1 ); move16(); IF( *pt2 > 0 ) @@ -1140,20 +1150,22 @@ void hf_synth_amr_wb_fx( pt4 = signum; FOR( i = 0; i < L_SUBFR16k; i++ ) { - if ( *pt1 > 0 ) + IF ( *pt1 > 0 ) { *pt1 = mult_r( *pt1, g ); /*qdct */ move16(); } #ifdef BASOP_NOGLOB *pt2 = round_fx_sat( L_shl_sat( L_mult( *pt2, inv_g ), 3 ) ); /*qdct */ + move16(); *pt3 = add_sat( *pt1, *pt2 ); + move16(); #else *pt2 = round_fx( L_shl( L_mult( *pt2, inv_g ), 3 ) ); /*qdct */ *pt3 = add( *pt1, *pt2 ); #endif - move16(); *pt3 = extract_l( L_mult0( *pt3, *pt4 ) ); /*qdct */ + move16(); pt1++; pt2++; pt3++; @@ -1221,6 +1233,7 @@ void hf_synth_amr_wb_fx( IF( GE_16( i, sub( L_FRAME16k, filt_weight_coeff ) ) ) { *pt1 = round_fx( L_shl( L_mult( *pt3, *pt1 ), 1 ) ); /*qdct */ + move16(); } pt1++; pt3++; @@ -1251,7 +1264,7 @@ void hf_synth_amr_wb_fx( FOR( i = 240; i < L_FRAME16k; i++ ) { *pt1 = mult_r( *pt1, scale ); /*qdct */ - IF( GT_16( i, 255 ) ) + IF ( GT_16( i, 255 ) ) { *pt1 = mult_r( 19505, *pt1 ); move16(); @@ -1260,6 +1273,7 @@ void hf_synth_amr_wb_fx( IF( GE_16( i, sub( L_FRAME16k, filt_weight_coeff ) ) ) { *pt1 = round_fx( L_shl( L_mult( *pt3, *pt1 ), 1 ) ); /*qdct */ + move16(); } pt1++; pt3++; @@ -1334,6 +1348,7 @@ void hf_synth_amr_wb_fx( { #ifdef BASOP_NOGLOB *pt2 = round_fx_sat( L_shl_sat( L_mult( *pt2, scale ), 2 ) ); /*qhf-1 */ + move16(); #else *pt2 = round_fx( L_shl( L_mult( *pt2, scale ), 2 ) ); /*qhf-1 */ #endif @@ -1418,6 +1433,7 @@ static void hf_synthesis_amr_wb_fx( L_tmp = L_mult( *pt1++, HF_corr_gain ); /*qhf+15*/ L_tmp = Mult_32_16( L_tmp, scale ); /*qhf-1+12+1*/ *pt2++ = round_fx( L_shl( L_tmp, 1 ) ); /*qhf-3*/ + move16(); } pt1 = exc16k; @@ -1468,6 +1484,7 @@ static void hf_synthesis_amr_wb_fx( tmp = s_min( tmp, 4096 ); tmp = s_max( tmp, scale ); *pt1++ = round_fx( L_shl( L_mult( *pt2++, tmp ), 3 ) ) /*qhf*/; + move16(); } } } @@ -1555,6 +1572,7 @@ static Word16 EnhanceClass_fx( /* Decide (*unvoicing_flag) to allow BWE enhancement when qq>pp */ /**voice_fac_fx = add(mult_r(*voice_fac_fx, 24576), mult_r(voice_factor_fx, 8192)); //Q15 */ *voice_fac_fx = round_fx( L_mac( L_mult( *voice_fac_fx, 24576 ), voice_factor_fx, 8192 ) ); /*Q15 */ + move16(); tmp = mult_r( sub( 8192, tilt0_fx ), 16384 ); /*Q13 */ @@ -1571,16 +1589,19 @@ static Word16 EnhanceClass_fx( /**unvoicing_fx = add(mult_r(16384, *unvoicing_fx), mult_r(16384, unvoicing_tmp_fx)); //Q15 */ *unvoicing_fx = round_fx( L_mac( L_mult( 16384, *unvoicing_fx ), 16384, unvoicing_tmp_fx ) ); /*Q15 */ + move16(); IF( GT_16( *unvoicing_sm_fx, *unvoicing_fx ) ) { /**unvoicing_sm_fx = add(mult_r(29491, *unvoicing_sm_fx), mult_r(3277, *unvoicing_fx)); //Q15 */ *unvoicing_sm_fx = round_fx( L_mac( L_mult( 29491, *unvoicing_sm_fx ), 3277, *unvoicing_fx ) ); /*Q15 */ + move16(); } ELSE { /**unvoicing_sm_fx = add(mult_r(32440, *unvoicing_sm_fx), mult_r(328, *unvoicing_fx)); //Q15 */ *unvoicing_sm_fx = round_fx( L_mac( L_mult( 32440, *unvoicing_sm_fx ), 328, *unvoicing_fx ) ); /*Q15 */ + move16(); } #ifdef BASOP_NOGLOB @@ -1590,6 +1611,7 @@ static Word16 EnhanceClass_fx( #endif { *unvoicing_flag = 1; + move16(); } #ifdef BASOP_NOGLOB @@ -1599,6 +1621,7 @@ static Word16 EnhanceClass_fx( #endif { *unvoicing_flag = 0; + move16(); } test(); return ( *unvoicing_flag && GT_16( qq_fx, pp_fx ) ); @@ -1651,7 +1674,8 @@ static void envelope_fx( } /* LPC envelope level estimate */ - L_tmp = L_deposit_l( 0 ); + L_tmp = 0 ; + move32(); pt1 = Ap; pt2 = exp_tab_p_fx; FOR( i = 0; i <= M; i++ ) @@ -1766,7 +1790,6 @@ static void envelope_fx( if ( k1 < 0 ) { tmp = negate( tmp ); - move16(); } L_tmp = L_mult( As[1], tmp ); /*Q(42-q1) */ @@ -1803,6 +1826,7 @@ static void envelope_fx( move16(); L_tmp = L_mult( As[1], k1 ); /*Q25 */ As[1] = round_fx( L_shl( L_tmp, 3 ) ); /*Q12 */ + move16(); As[2] = k2; move16(); /*Q12 */ @@ -1926,6 +1950,7 @@ static void envelope_fx( #ifdef BASOP_NOGLOB *sub_gain = s_min( 20480, round_fx_sat( L_shl_sat( L_tmp, sub( q1, 2 ) ) ) ); /*Q12 */ + move16(); #else *sub_gain = s_min( 20480, round_fx( L_shl( L_tmp, sub( q1, 2 ) ) ) ); /*Q12 */ #endif @@ -1958,8 +1983,10 @@ void AdaptiveStartBand_fx( Word16 *pt1, flag; const Word16 *pt2, *pt3; + move32(); // corresponding to initialization of OptCrit_fx /*voicing switching flag : to avoid switching start band frequently in VOICED or AUDIO area*/ voicing_flag_old = *voicing_flag; + move16(); test(); test(); test(); @@ -2045,6 +2072,7 @@ void AdaptiveStartBand_fx( tmp1 = add( mult_r( lsf_fx[pos - 1], 256 ), mult_r( lsf_fx[pos], 256 ) ); *start_band = s_min( s_max( sub( tmp1, 40 ), 40 ), 160 ); + move16(); L_tmp = Mult_32_16( *OptCrit_old_fx, 22938 ); /* Q11+2.56+2.56 */ test(); @@ -2052,7 +2080,7 @@ void AdaptiveStartBand_fx( test(); test(); IF( NE_16( voicing_flag_old, *voicing_flag ) || ( *voicing_flag == 0 && LT_32( OptCrit_fx, *OptCrit_old_fx ) ) || - ( LT_32( OptCrit_fx, L_tmp ) && GT_32( *OptCrit_old_fx, 858993 ) > 0 ) ) + ( LT_32( OptCrit_fx, L_tmp ) && GT_32( *OptCrit_old_fx, 858993 ) ) ) { *OptCrit_old_fx = OptCrit_fx; move16(); diff --git a/lib_dec/hq_classifier_dec_fx.c b/lib_dec/hq_classifier_dec_fx.c index d8ce93970..fa5c470be 100644 --- a/lib_dec/hq_classifier_dec_fx.c +++ b/lib_dec/hq_classifier_dec_fx.c @@ -29,7 +29,7 @@ Word16 ivas_hq_classifier_dec_fx( /* o : Consumed bits max_brate = HQ_32k; move32(); - IF( GT_16( st_fx->element_mode, EVS_MONO ) ) + if ( st_fx->element_mode > EVS_MONO ) { max_brate = HQ_48k; move32(); @@ -39,7 +39,8 @@ Word16 ivas_hq_classifier_dec_fx( /* o : Consumed bits test(); IF( ( EQ_16( length, L_SPEC32k ) || EQ_16( length, L_SPEC48k ) ) && LE_32( core_brate, max_brate ) ) { - *hqswb_clas = get_next_indice( st_fx, 2 ); + *hqswb_clas = (Word16)get_next_indice( st_fx, 2 ); + move16(); bits = 2; move16(); } @@ -53,23 +54,23 @@ Word16 ivas_hq_classifier_dec_fx( /* o : Consumed bits ELSE { *hqswb_clas = get_next_indice( st_fx, 1 ); + move16(); bits = 1; move16(); } *is_transient = 0; move16(); - IF( EQ_16( *hqswb_clas, HQ_TRANSIENT ) ) + if ( EQ_16( *hqswb_clas, HQ_TRANSIENT ) ) { *is_transient = 1; move16(); } test(); - IF( LE_32( st_fx->core_brate, HQ_32k ) && EQ_16( *hqswb_clas, HQ_NORMAL ) ) + IF( LE_32( st_fx->core_brate, HQ_32k ) && *hqswb_clas == HQ_NORMAL ) { - move16(); - IF( EQ_16( length, L_SPEC32k ) ) + IF ( EQ_16( length, L_SPEC32k ) ) { *hqswb_clas = HQ_GEN_SWB; move16(); @@ -99,12 +100,16 @@ Word16 hq_classifier_dec_fx( /* o : Consumed bits max_brate = HQ_32k; move32(); - if ( GT_16( st_fx->element_mode, EVS_MONO ) ) + if ( st_fx->element_mode > EVS_MONO ) { max_brate = HQ_48k; move32(); } #ifndef SOLVED_COMP_ENC_DEC + test(); + test(); + test(); + test(); IF( ( EQ_16( length, L_SPEC32k ) || EQ_16( length, L_FRAME48k ) ) && LE_32( core_brate, max_brate ) ) #else /*_DIFF_FLOAT_FIX_ -> could this modification break the interoperability with EVS ?? */ @@ -113,6 +118,7 @@ Word16 hq_classifier_dec_fx( /* o : Consumed bits #endif { *hqswb_clas = get_next_indice( st_fx, 2 ); + move16(); bits = 2; move16(); } @@ -126,6 +132,7 @@ Word16 hq_classifier_dec_fx( /* o : Consumed bits ELSE { *hqswb_clas = get_next_indice( st_fx, 1 ); + move16(); bits = 1; move16(); } @@ -139,9 +146,8 @@ Word16 hq_classifier_dec_fx( /* o : Consumed bits } test(); - IF( LE_32( st_fx->core_brate, HQ_32k ) && EQ_16( *hqswb_clas, HQ_NORMAL ) ) + IF( LE_32( st_fx->core_brate, HQ_32k ) && *hqswb_clas == HQ_NORMAL ) { - move16(); IF( EQ_16( length, L_SPEC32k ) ) { *hqswb_clas = HQ_GEN_SWB; diff --git a/lib_dec/hq_core_dec_fx.c b/lib_dec/hq_core_dec_fx.c index 1dc75f434..fb0f5f024 100644 --- a/lib_dec/hq_core_dec_fx.c +++ b/lib_dec/hq_core_dec_fx.c @@ -131,7 +131,7 @@ void hq_core_dec_fx( { hHQ_core->HqVoicing = 0; move16(); - IF( GT_32( st_fx->core_brate, MINIMUM_RATE_TO_ENCODE_VOICING_FLAG ) ) + if ( GT_32( st_fx->core_brate, MINIMUM_RATE_TO_ENCODE_VOICING_FLAG ) ) { hHQ_core->HqVoicing = 1; move16(); @@ -146,6 +146,7 @@ void hq_core_dec_fx( /* set inner frame (== coded bandwidth) length */ inner_frame = inner_frame_tbl[st_fx->bwidth]; + move16(); #ifndef ADD_IVAS_HQ_CODE_L_SPEC L_spec = inner_frame; #endif @@ -252,6 +253,7 @@ void hq_core_dec_fx( { tmp = mult_r( output_frame, 410 / 2 ); /* 1/8000 in Q15 */ ener_match = hq_nominal_scaling_inv[tmp]; + move16(); FOR( i = 0; i < inner_frame; i++ ) { /*t_audio_q[i] *= ener_match;*/ @@ -500,6 +502,7 @@ void hq_core_dec_fx( st_fx->plcInfo.recovery_gain = shl_sat( st_fx->plcInfo.recovery_gain, *Q_synth ); #else st_fx->plcInfo.recovery_gain = shl( st_fx->plcInfo.recovery_gain, *Q_synth ); + move16(); #endif waveform_adj2_fix( st_fx->tonalMDCTconceal.secondLastPcmOut, synth, @@ -555,6 +558,7 @@ void hq_core_dec_fx( Word16 nbsubfr; /*nbsubfr = extract_l(L_mult0(st_fx->L_frame,FL2WORD16(1/L_SUBFR)));*/ nbsubfr = 4; + move16(); if ( EQ_16( st_fx->L_frame, 320 ) ) { nbsubfr = 5; @@ -660,6 +664,8 @@ void ivas_hq_core_dec_fx( } st_fx->hTcxCfg->tcx_curr_overlap_mode = ALDO_WINDOW; move16(); + test(); + test(); hq_recovery_flag = ( EQ_16( st_fx->last_core, ACELP_CORE ) ) && st_fx->prev_bfi && ( GT_16( st_fx->element_mode, EVS_MONO ) ); /* ACELP -> HQtrans -> HQ; with HQtrans lost */ /*-------------------------------------------------------------------------- * Find the number of bits for transform-domain coding diff --git a/lib_dec/hq_env_dec_fx.c b/lib_dec/hq_env_dec_fx.c index 14037b5f6..0226c32f3 100644 --- a/lib_dec/hq_env_dec_fx.c +++ b/lib_dec/hq_env_dec_fx.c @@ -67,7 +67,7 @@ Word16 decode_envelope_indices_fx( /* o : Number of b { hcode_l = 0; move16(); - IF( EQ_16( LCmode, 0 ) ) + IF( LCmode == 0 ) { hdecnrm_context_fx( st_fx, num_sfm, &difidx[start_norm], &hcode_l ); } @@ -93,17 +93,19 @@ Word16 decode_envelope_indices_fx( /* o : Number of b { pDifidx = pDifidx1++; move16(); - IF( *pDifidx > 17 ) + IF( GT_16( *pDifidx, 17 ) ) { offset = sub( *pDifidx, 17 ); offset = s_min( offset, 3 ); *pDifidx1 = sub( *pDifidx1, offset ); + move16(); } - ELSE IF( *pDifidx < 13 ) + ELSE IF( LT_16( *pDifidx, 13 ) ) { offset = sub( *pDifidx, 13 ); offset = s_max( offset, -3 ); *pDifidx1 = sub( *pDifidx1, offset ); + move16(); } } } diff --git a/lib_dec/hq_lr_dec_fx.c b/lib_dec/hq_lr_dec_fx.c index 8a014d817..a454af97a 100644 --- a/lib_dec/hq_lr_dec_fx.c +++ b/lib_dec/hq_lr_dec_fx.c @@ -240,7 +240,7 @@ void hq_lr_dec_fx( { num_bits = sub( num_bits, get_usebit_npswb_fx( hqswb_clas_fx ) ); } - IF( EQ_16( hqswb_clas_fx, HQ_NORMAL ) ) + if ( EQ_16( hqswb_clas_fx, HQ_NORMAL ) ) { flag_spt_fx = 1; move16(); @@ -333,6 +333,7 @@ void hq_lr_dec_fx( } Q_band_energy = SWB_BWE_LR_Qbe; + move16(); FOR( i = 0; i < bands_fx; i++ ) { L_tmp = L_shl( L_band_energy[i], sub( 16, Q_band_energy ) ); /*Q16 */ @@ -342,6 +343,7 @@ void hq_lr_dec_fx( exp = sub( exp, 30 ); #ifdef BASOP_NOGLOB Ep_fx[i] = L_shl_sat( L_tmp, s_max( sub( exp, 6 ), -31 ) ); /* Q -6 */ + move32(); #else Ep_fx[i] = L_shl( L_tmp, s_max( sub( exp, 6 ), -31 ) ); /* Q -6 */ #endif @@ -389,6 +391,7 @@ void hq_lr_dec_fx( FOR( i = 0; i < 2; i++ ) { last_bitalloc_max_band[i] = get_next_indice( st_fx, 1 ); + move16(); } lowband = 6; move16(); @@ -435,7 +438,7 @@ void hq_lr_dec_fx( #else Ep_avrgL_fx = L_add( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */ #endif - IF( GT_32( Ep_tmp_fx[i], Ep_peak_fx ) ) + if ( GT_32( Ep_tmp_fx[i], Ep_peak_fx ) ) { Ep_peak_fx = L_add( Ep_tmp_fx[i], 0 ); /*Q15 */ } @@ -564,7 +567,7 @@ void hq_lr_dec_fx( ELSE { Ep_avrgL_fx = L_add( Ep_avrgL_fx, L_shr( Ep_tmp_fx[i], 1 ) ); /*Q12 */ - IF( GT_32( Ep_tmp_fx[i], Ep_peak_fx ) ) + if ( GT_32( Ep_tmp_fx[i], Ep_peak_fx ) ) { Ep_peak_fx = L_add( Ep_tmp_fx[i], 0 ); /*Q13 */ } @@ -798,7 +801,7 @@ void hq_lr_dec_fx( #else Ep_avrgL_fx = L_add( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */ #endif - IF( GT_32( Ep_tmp_fx[i], Ep_peak_fx ) ) + if ( GT_32( Ep_tmp_fx[i], Ep_peak_fx ) ) { Ep_peak_fx = L_add( Ep_tmp_fx[i], 0 ); /*Q15 */ } @@ -1043,10 +1046,11 @@ static Word16 decode_huff_8s_fx( { Word16 bit; - WHILE( GT_16( *hufftab, 0 ) ) + WHILE( *hufftab > 0 ) { *rbits = add( *rbits, s_and( *hufftab, 0xf ) ); bit = get_next_indice( st_fx, s_and( *hufftab, 0xf ) ); + move16(); hufftab += add( shr( *hufftab, 4 ), bit ); } @@ -1069,13 +1073,13 @@ static Word16 large_symbol_dec_fx( /* o : bits move16(); ns2mode = get_next_indice( st_fx, BITS_DE_8SMODE ); - IF( EQ_16( ns2mode, 0 ) ) + IF( ns2mode == 0 ) { ns2mode0 = get_next_indice( st_fx, BITS_DE_8SMODE_N0 ); ns2mode1 = get_next_indice( st_fx, BITS_DE_8SMODE_N1 ); cntbits = add( cntbits, BITS_DE_8SMODE_N0 + BITS_DE_8SMODE_N1 ); - IF( EQ_16( ns2mode0, 0 ) ) + IF( ns2mode0 == 0 ) { IF( EQ_16( ns2mode1, 1 ) ) { @@ -1160,6 +1164,7 @@ static Word16 large_symbol_dec_fx( /* o : bits bits = 0; move16(); qbidx[i] = sub( decode_huff_8s_fx( st_fx, hestable, &bits ), 4 ); + move16(); qbidx[i] = shl( qbidx[i], basic_shift ); move16(); cntbits = add( cntbits, bits ); @@ -1210,7 +1215,7 @@ static Word16 band_energy_dequant_fx( /* parsing energy difference coding mode */ deng_cmode = get_next_indice( st_fx, BITS_DE_CMODE ); - IF( EQ_16( deng_cmode, 0 ) ) + IF( deng_cmode == 0 ) { deng_bits = large_symbol_dec_fx( st_fx, bq2_fx, bands_fx ); @@ -1369,6 +1374,7 @@ static void mdct_spectrum_fine_gain_dec_fx( IF( L_y2[i] >= 0x0 ) { L_y2[i] = L_shl( Mpy_32_16_1( L_y2[i], gamma_fx ), 1 ); + move32(); } ELSE { diff --git a/lib_dec/igf_dec_fx.c b/lib_dec/igf_dec_fx.c index d2c4670b3..8d846a794 100644 --- a/lib_dec/igf_dec_fx.c +++ b/lib_dec/igf_dec_fx.c @@ -48,17 +48,17 @@ static Word16 IGF_getScaleFactor32Cond( /**< ou { tmp32 = L_add( x[i], 0 ); /*L_and(x[i], cond[i]);*/ - IF( EQ_16( cond[i], 0 ) ) + if ( cond[i] == 0 ) { tmp32 = L_deposit_h( 0 ); } - IF( GE_32( tmp32, 0 ) ) + if ( tmp32 >= 0 ) { x_max = L_max( x_max, tmp32 ); } - IF( LT_32( tmp32, 0 ) ) + if ( tmp32 < 0 ) { x_min = L_min( x_min, tmp32 ); } @@ -69,11 +69,11 @@ static Word16 IGF_getScaleFactor32Cond( /**< ou i_min = 0x20; move16(); - IF( NE_32( x_max, 0 ) ) + if ( x_max != 0 ) { i_max = norm_l( x_max ); } - IF( NE_32( x_min, 0 ) ) + if ( x_min != 0 ) { i_min = norm_l( x_min ); } @@ -109,24 +109,26 @@ static Word16 IGF_replaceTCXNoise_1( /**< ou nE = 0; move32(); - FOR( sb = start; sb < stop; sb++ ){ - IF( TCXNoise[sb] ){ + FOR( sb = start; sb < stop; sb++ ) + { + if ( TCXNoise[sb] ) + { tmp16 = extract_h( L_shl( in[sb], s_l ) ); -} -IF( TCXNoise[sb] ) -{ - nE = L_mac( nE, tmp16, tmp16 ); -} -IF( TCXNoise[sb] ) -{ - noise = add( noise, 1 ); -} -} + } + if ( TCXNoise[sb] ) + { + nE = L_mac( nE, tmp16, tmp16 ); + } + if ( TCXNoise[sb] ) + { + noise = add( noise, 1 ); + } + } -*totalNoiseNrg = nE; -move32(); + *totalNoiseNrg = nE; + move32(); -return noise; + return noise; } /**********************************************************************/ /* @@ -177,20 +179,20 @@ static void IGF_replaceTCXNoise_2( Word32 *in, /**< in /* make sure that rE is never 0 */ - IF( EQ_32( rE, 0 ) ) + IF( rE == 0 ) { rE = L_add( totalNoiseNrg, 0 ); /* save move32() -> use L_add(x, 0) = x; */ } /* if totalNoiseNrg == 0, then rE must be at least 0x00010000, otherwise division by 0 will occur */ - IF( EQ_32( totalNoiseNrg, 0 ) ) + if ( totalNoiseNrg == 0 ) { rE = L_max( rE, 0x00010000 ); } /* make sure that rE is never smaller than totalNoiseNrg */ L_tmp = L_sub( rE, totalNoiseNrg ); - IF( LT_32( L_tmp, 0 ) ) + if ( L_tmp < 0 ) { rE = totalNoiseNrg; /* save move32() -> use L_add(x, 0) = x; */ move32(); @@ -254,18 +256,18 @@ static void IGF_replaceTCXNoise_2_new_ivas( Word32 *in, /**< in } - IF( NE_16( n_noise_bands_tile, 0 ) ) + IF( n_noise_bands_tile != 0 ) { noise_band_ratio = div_s( n_noise_bands_tile, n_noise_bands ); // Q15 /* make sure that rE is never 0 */ - IF( EQ_32( rE, 0 ) ) + if ( rE == 0 ) { rE = L_add( totalNoiseNrg, 0 ); /* save move32() -> use L_add(x, 0) = x; */ } /* if totalNoiseNrg == 0, then rE must be at least 0x00010000, otherwise division by 0 will occur */ - IF( EQ_32( totalNoiseNrg, 0 ) ) + if ( totalNoiseNrg == 0 ) { rE = L_max( rE, 0x00010000 ); } @@ -281,9 +283,9 @@ static void IGF_replaceTCXNoise_2_new_ivas( Word32 *in, /**< in IF( TCXNoise[sb] ) { Word16 nrm = norm_l( in[sb] ); - in[sb] = L_shl( in[sb], nrm ); // exp: 31 - tmp - in[sb] = Mpy_32_16_1( in[sb], g ); // exp: 31 - tmp + tmp_e - in[sb] = L_shr( in[sb], sub( in_e, 31 - nrm + tmp_e ) ); // Making the exponent same as original + in[sb] = L_shl( in[sb], nrm ); // exp: 31 - tmp + in[sb] = Mpy_32_16_1( in[sb], g ); // exp: 31 - tmp + tmp_e + in[sb] = L_shr( in[sb], sub( in_e, sub( add( 31, tmp_e ), nrm ) ) ); // Making the exponent same as original move32(); } } @@ -336,18 +338,18 @@ static void IGF_replaceTCXNoise_2_new_ivas_with_var_shift( Word32 *in, } - IF( NE_16( n_noise_bands_tile, 0 ) ) + IF( n_noise_bands_tile != 0 ) { noise_band_ratio = div_s( n_noise_bands_tile, n_noise_bands ); // Q15 /* make sure that rE is never 0 */ - IF( EQ_32( rE, 0 ) ) + IF( rE == 0 ) { rE = L_add( totalNoiseNrg, 0 ); /* save move32() -> use L_add(x, 0) = x; */ } /* if totalNoiseNrg == 0, then rE must be at least 0x00010000, otherwise division by 0 will occur */ - IF( EQ_32( totalNoiseNrg, 0 ) ) + IF( totalNoiseNrg == 0 ) { rE = L_max( rE, 0x00010000 ); } @@ -389,7 +391,7 @@ static void IGF_decode_whitening_level( Decoder_State *st, tmp = get_next_indice( st, 1 ); - IF( EQ_16( tmp, 0 ) ) + IF( tmp == 0 ) { hPrivateData->currWhiteningLevel[p] = IGF_WHITENING_MID; move16(); @@ -401,7 +403,7 @@ static void IGF_decode_whitening_level( Decoder_State *st, hPrivateData->currWhiteningLevel[p] = IGF_WHITENING_STRONG; move16(); - IF( EQ_16( tmp, 0 ) ) + if ( tmp == 0 ) { hPrivateData->currWhiteningLevel[p] = IGF_WHITENING_OFF; move16(); @@ -434,9 +436,10 @@ static void IGF_setLinesToZero( const Word16 startLine, /**< in if there is content in the original MDCT spectrum */ FOR( i = startLine; i < stopLine; i++ ) { - IF( NE_32( pSpectralData[i], 0 ) ) + if ( pSpectralData[i] != 0 ) { pPowerSpecIGF[i] = L_deposit_l( 0 ); + move32(); } } } @@ -545,7 +548,7 @@ static void IGF_prep( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in tb = hGrid->swb_offset[hGrid->sfbWrap[tile_idx]]; move16(); - IF( NE_32( abs_sum, 0 ) ) + IF( abs_sum != 0 ) { FOR( i = strt_cpy; i < startLine; i++ ) { @@ -570,7 +573,7 @@ static void IGF_prep( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in /* medium whitening detected */ IF( EQ_16( IGF_WHITENING_MID, hPrivateData->currWhiteningLevel[tile_idx] ) ) { - IF( NE_16( n_noise_bands, 0 ) ) + IF( n_noise_bands != 0 ) { IGF_replaceTCXNoise_2( igf_spec, TCXNoise, @@ -593,7 +596,7 @@ static void IGF_prep( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in /* off whitening detectded */ ELSE { - IF( NE_16( n_noise_bands_off, 0 ) ) + IF( n_noise_bands_off != 0 ) { IGF_replaceTCXNoise_2( hPrivateData->pSpecFlat, TCXNoise, @@ -715,11 +718,12 @@ static void IGF_prep_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in tb = hGrid->swb_offset[hGrid->sfbWrap[tile_idx]]; move16(); - IF( NE_32( abs_sum, 0 ) ) + IF( abs_sum != 0 ) { FOR( i = strt_cpy; i < stop; i++ ) { igf_spec[tb++] = L_deposit_l( Random( hInfo->nfSeed ) ); /* 31Q0, fill LSBs */ + move32(); } } ELSE @@ -742,7 +746,7 @@ static void IGF_prep_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in { IF( GT_16( element_mode, EVS_MONO ) ) { - IF( NE_16( n_noise_bands, 0 ) ) + IF( n_noise_bands != 0 ) { IGF_replaceTCXNoise_2_new_ivas( igf_spec, specMed_e, @@ -757,7 +761,7 @@ static void IGF_prep_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in } ELSE { - IF( NE_16( n_noise_bands, 0 ) ) + IF( n_noise_bands != 0 ) { IGF_replaceTCXNoise_2( igf_spec, TCXNoise, @@ -783,7 +787,7 @@ static void IGF_prep_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in IF( GT_16( element_mode, EVS_MONO ) ) { - IF( NE_16( n_noise_bands_off, 0 ) ) + IF( n_noise_bands_off != 0 ) { IGF_replaceTCXNoise_2_new_ivas( src_spec, src_spec_e, @@ -798,7 +802,7 @@ static void IGF_prep_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in } ELSE { - IF( NE_16( n_noise_bands_off, 0 ) ) + IF( n_noise_bands_off != 0 ) { IGF_replaceTCXNoise_2( src_spec, TCXNoise, @@ -1040,6 +1044,7 @@ static void IGF_prepStereo( IF( EQ_16( IGF_WHITENING_STRONG, hPrivateDataR->currWhiteningLevel[tile_idx] ) ) { tb = swb_offset[hGrid->sfbWrap[tile_idx]]; + move16(); FOR( tb = swb_offset[hGrid->sfbWrap[tile_idx]]; tb < swb_offset[hGrid->sfbWrap[tile_idx + 1]]; tb++ ) { @@ -1156,7 +1161,7 @@ static void IGF_prepStereo( move16(); } - IF( EQ_16( coreMsMask[tb], 0 ) ) + IF( ( coreMsMask[tb] == 0 ) ) { IF( EQ_16( coreMsMask[strt_cpy], 0 ) ) /* LR->LR */ { @@ -1510,6 +1515,7 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in FOR( tb = 0; tb < 24; tb++ ) { Carry = 0; + move16(); #ifdef BASOP_NOGLOB /* Critical Carry/Overflow*/ L_tmp = L_add_co( L_tmp, energyTmp[tb], &Carry, &Overflow ); Overflow = 0; @@ -1531,12 +1537,12 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in /* select correct hopsize for envelope refinement */ hopsize = 2; move16(); - IF( EQ_16( hPrivateData->currWhiteningLevel[0], IGF_WHITENING_OFF ) ) + if ( EQ_16( hPrivateData->currWhiteningLevel[0], IGF_WHITENING_OFF ) ) { hopsize = 4; move16(); } - IF( EQ_16( hPrivateData->currWhiteningLevel[0], IGF_WHITENING_STRONG ) ) + if ( EQ_16( hPrivateData->currWhiteningLevel[0], IGF_WHITENING_STRONG ) ) { hopsize = 1; move16(); @@ -1563,13 +1569,15 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in &pN_e[sfb] ); move32(); sN[tb] = L_deposit_l( 0 ); + move32(); pN[tb] = L_deposit_l( 0 ); + move32(); } } } /* IGF_rescale_SCF */ - IF( NE_16( hGrid->infoIsRefined, 0 ) ) + IF( hGrid->infoIsRefined != 0 ) { FOR( sfb = start_sfb; sfb < stop_sfb; sfb += 2 ) { @@ -1626,7 +1634,7 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in #endif BASOP_SATURATE_WARNING_ON_EVS - IF( LT_32( L_tmp2, 0 ) ) + IF( L_tmp2 < 0 ) { L_tmp = Mpy_32_16_1( sNlocal, 33 /*0.001f Q15*/ ); L_tmp_e = sNlocal_e; @@ -1637,8 +1645,10 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in L_tmp = Sqrt32( L_tmp, &L_tmp_e ); #ifdef BASOP_NOGLOB dN[sfb] = round_fx_sat( L_tmp ); + move16(); #else dN[sfb] = round_fx( L_tmp ); + move16(); #endif dN_e[sfb] = L_tmp_e; move16(); @@ -1704,7 +1714,7 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in #endif BASOP_SATURATE_WARNING_ON_EVS - IF( LT_32( L_tmp2, 0 ) ) + IF( L_tmp2 < 0 ) { L_tmp = Mpy_32_16_1( sNlocal, 33 /*0.001f Q15*/ ); L_tmp_e = sNlocal_e; @@ -1713,6 +1723,7 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in /* calc square root of L_tmp and store result in dN */ L_tmp = Sqrt32( L_tmp, &L_tmp_e ); dN[sfb] = round_fx( L_tmp ); + move16(); dN_e[sfb] = L_tmp_e; move16(); } @@ -1729,7 +1740,7 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in negate( dN[start_sfb] ), dN_e[start_sfb], &tmp ); /* float: tmp = dE - dN[start_sfb] */ - IF( LT_16( tmp, 0 ) ) + IF( tmp < 0 ) { /* float: dS[start_sfb] = dN[start_sfb] + fFactor * (dE-dN[start_sfb]); basop: */ L_tmp = L_mult( fFactor, tmp ); @@ -1750,7 +1761,7 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in sfb_p1 = add( start_sfb, 1 ); sfb_m1 = sub( stop_sfb, 1 ); test(); - IF( NE_16( hGrid->infoIsRefined, 0 ) && EQ_16( hopsize, 1 ) ) + IF( hGrid->infoIsRefined != 0 && EQ_16( hopsize, 1 ) ) { /* apply filter to absolute energy values: */ FOR( sfb = sfb_p1; sfb < sfb_m1; sfb++ ) @@ -1880,7 +1891,7 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in /* gain calculation */ gain[sfb] = 0; move16(); - IF( NE_32( pN[sfb], 0 ) ) + IF( pN[sfb] != 0 ) { tmp = BASOP_Util_Divide3232_Scale( dNlocal, pN[sfb], &s ); s = sub( add( s, dNlocal_e ), pN_e[sfb] ); @@ -1905,7 +1916,7 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in /*--- check gains /spectrum exponents for possible overflows --- */ /* get tile index */ - IF( LE_16( hGrid->sfbWrap[tileIdx + 1], sfb ) ) + if ( LE_16( hGrid->sfbWrap[add( tileIdx, 1 )], sfb ) ) { tileIdx = add( tileIdx, 1 ); } @@ -1915,7 +1926,7 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in /*check whether overflow would occur and calculate Headroom, needed*/ shift = sub( L_tmp_e, *spectrum_e ); tmp = sub( shift, sub( norm_l( L_tmp ), TCX_IMDCT_HEADROOM ) ); - IF( GT_16( tmp, 0 ) ) + if ( tmp > 0 ) { Hr = s_max( Hr, tmp ); } @@ -1923,7 +1934,7 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in /* disable rescaling if gain is smaler than 1 */ /* gain < 1, if norm_s(gain[sfb]) >= gain_e[sfb] */ tmp = sub( norm_s( gain[sfb] ), gain_e[sfb] ); - IF( GE_16( tmp, 0 ) ) + if ( tmp >= 0 ) { Hr = 0; move16(); @@ -1933,7 +1944,7 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in /* Rescale spectrum if overflow may occur */ tileIdx = -1; move16(); - IF( GT_16( Hr, 0 ) ) + IF( Hr > 0 ) { /* rescale virtual Spec, cheap and easy: reset scalingfactor */ *virtualSpec_e = add( *virtualSpec_e, Hr ); @@ -1955,7 +1966,7 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in FOR( sfb = start_sfb; sfb < stop_sfb; sfb++ ) { /* get tile index */ - IF( EQ_16( hGrid->sfbWrap[tileIdx + 1], sfb ) ) + if ( EQ_16( hGrid->sfbWrap[tileIdx + 1], sfb ) ) { tileIdx = add( tileIdx, 1 ); } @@ -1965,7 +1976,9 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in /* normalize gain */ tmp = norm_s( gain[sfb] ); gain[sfb] = shl( gain[sfb], tmp ); + move16(); gain_e[sfb] = sub( gain_e[sfb], tmp ); + move16(); /* gain[sfb] = min(gain[sfb], 12.f); */ BASOP_SATURATE_WARNING_OFF_EVS /* threshold, may overflow */ @@ -2032,8 +2045,8 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in IF( spectrum[tb] == 0 ) { shift = sub( L_tmp_e, *spectrum_e ); - tmp = norm_l( L_tmp ) - shift - 32; - IF( LT_16( tmp, 0 ) ) + tmp = sub( sub( norm_l( L_tmp ), shift ), 32 ); + if ( tmp < 0 ) { L_tmp2 = L_shl( L_tmp, shift ); } @@ -2045,8 +2058,8 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in ELSE { shift = sub( L_tmp_e, *virtualSpec_e ); - tmp = norm_l( L_tmp ) - shift - 32; - IF( LT_16( tmp, 0 ) ) + tmp = sub( sub( norm_l( L_tmp ), shift ), 32 ); + if ( tmp < 0 ) { L_tmp2 = L_shl( L_tmp, shift ); } @@ -2129,7 +2142,9 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in Word16 vspec_e_arr[N_MAX_TCX - IGF_START_MN]; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move16(); Flag Carry = 0; + move16(); #endif @@ -2213,6 +2228,7 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in FOR( tb = 0; tb < 24; tb++ ) { Carry = 0; + move16(); #ifdef BASOP_NOGLOB /* Critical Carry/Overflow*/ L_tmp = L_add_co( L_tmp, energyTmp[tb], &Carry, &Overflow ); Overflow = 0; @@ -2234,12 +2250,12 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in /* select correct hopsize for envelope refinement */ hopsize = 2; move16(); - IF( EQ_16( hPrivateData->currWhiteningLevel[0], IGF_WHITENING_OFF ) ) + if ( EQ_16( hPrivateData->currWhiteningLevel[0], IGF_WHITENING_OFF ) ) { hopsize = 4; move16(); } - IF( EQ_16( hPrivateData->currWhiteningLevel[0], IGF_WHITENING_STRONG ) ) + if ( EQ_16( hPrivateData->currWhiteningLevel[0], IGF_WHITENING_STRONG ) ) { hopsize = 1; move16(); @@ -2270,13 +2286,15 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in &pN_e[sfb] ); move32(); sN[tb] = L_deposit_l( 0 ); + move32(); pN[tb] = L_deposit_l( 0 ); + move32(); } } } /* IGF_rescale_SCF */ - IF( NE_16( hGrid->infoIsRefined, 0 ) ) + IF( hGrid->infoIsRefined != 0 ) { FOR( sfb = start_sfb; sfb < stop_sfb; sfb += 2 ) { @@ -2333,7 +2351,7 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in #endif BASOP_SATURATE_WARNING_ON_EVS - IF( LT_32( L_tmp2, 0 ) ) + IF( L_tmp2 < 0 ) { L_tmp = Mpy_32_16_1( sNlocal, 33 /*0.001f Q15*/ ); L_tmp_e = sNlocal_e; @@ -2343,6 +2361,7 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in /* calc square root of L_tmp and store result in dN */ L_tmp = Sqrt32( L_tmp, &L_tmp_e ); dN[sfb] = extract_h( L_tmp ); + move16(); dN_e[sfb] = L_tmp_e; move16(); dN[sfb + 1] = dN[sfb]; @@ -2400,15 +2419,17 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in L_tmp2 = L_shl_sat( L_negate( Mpy_32_16_1( sNlocal, 33 /*0.001f Q15*/ ) ), sub( sNlocal_e, L_tmp_e ) ); L_tmp2 = L_sub_sat( L_tmp2, L_negate( L_tmp ) ); - IF( LT_32( L_tmp2, 0 ) ) + IF( L_tmp2 < 0 ) { L_tmp = Mpy_32_16_1( sNlocal, 33 /*0.001f Q15*/ ); L_tmp_e = sNlocal_e; + move16(); } /* calc square root of L_tmp and store result in dN */ L_tmp = Sqrt32( L_tmp, &L_tmp_e ); dN[sfb] = round_fx( L_tmp ); + move16(); dN_e[sfb] = L_tmp_e; move16(); } @@ -2425,7 +2446,7 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in negate( dN[start_sfb] ), dN_e[start_sfb], &tmp ); /* float: tmp = dE - dN[start_sfb] */ - IF( LT_16( tmp, 0 ) ) + IF( tmp < 0 ) { /* float: dS[start_sfb] = dN[start_sfb] + fFactor * (dE-dN[start_sfb]); basop: */ L_tmp = L_mult( fFactor, tmp ); @@ -2446,7 +2467,7 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in sfb_p1 = add( start_sfb, 1 ); sfb_m1 = sub( stop_sfb, 1 ); test(); - IF( NE_16( hGrid->infoIsRefined, 0 ) && EQ_16( hopsize, 1 ) ) + IF( hGrid->infoIsRefined != 0 && EQ_16( hopsize, 1 ) ) { /* apply filter to absolute energy values: */ FOR( sfb = sfb_p1; sfb < sfb_m1; sfb++ ) @@ -2456,6 +2477,7 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in dS[sfb] = round_fx( L_tmp ); move16(); dS_e[sfb] = dN_e[sfb - 1]; /* w0 is Q15, so no need to add an exponent */ + move16(); L_tmp = L_mult( w1, dN[sfb] ); dS_e[sfb] = BASOP_Util_Add_MantExp( dS[sfb], dS_e[sfb], @@ -2543,6 +2565,7 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in /* take the square root and store the result in dS */ L_tmp = Sqrt32( L_tmp, &L_tmp_e ); dS[sfb] = round_fx( L_tmp ); + move16(); dS_e[sfb] = L_tmp_e; move16(); @@ -2604,7 +2627,7 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in FOR( sfb = start_sfb; sfb < stop_sfb; sfb++ ) { /* get tile index */ - IF( EQ_16( hGrid->sfbWrap[tileIdx + 1], sfb ) ) + if ( EQ_16( hGrid->sfbWrap[tileIdx + 1], sfb ) ) { tileIdx = add( tileIdx, 1 ); } @@ -2615,7 +2638,9 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in /* normalize gain */ tmp = norm_s( gain[sfb] ); gain[sfb] = shl( gain[sfb], tmp ); + move16(); gain_e[sfb] = sub( gain_e[sfb], tmp ); + move16(); /* gain[sfb] = min(gain[sfb], 12.f); */ BASOP_SATURATE_WARNING_OFF_EVS /* threshold, may overflow */ @@ -2768,7 +2793,7 @@ static void IGF_getWhiteSpectralData( const Word32 *in, /**< in ak_norm = Mpy_32_16_r( ak, 2185 ); tmp_16 = sub( 31, norm_l( ak_norm ) ); - IF( EQ_32( ak, 0 ) ) + if ( ak == 0 ) { tmp_16 = 0; move16(); @@ -2791,7 +2816,7 @@ static void IGF_getWhiteSpectralData( const Word32 *in, /**< in ak_norm = Mpy_32_16_r( ak, nrm_tab[nrm_i++] ); tmp_16 = sub( 31, norm_l( ak_norm ) ); - IF( EQ_32( ak, 0 ) ) + if ( ak == 0 ) { tmp_16 = 0; move16(); @@ -2800,7 +2825,7 @@ static void IGF_getWhiteSpectralData( const Word32 *in, /**< in tmp_16 = s_min( 14, sub( 15, shr( tmp_16, 1 ) ) ); div = shl( 1, tmp_16 ); - IF( LT_32( ak, 16 ) ) + if ( LT_32( ak, 16 ) ) { div = 1; move16(); @@ -2857,7 +2882,9 @@ static void IGF_getWhiteSpectralData_ivas( FOR( i = start; i < stop - level; i++ ) { ak = 0; + move32(); ak_e = 0; + move32(); FOR( j = i - level; j < i + level + 1; j++ ) { tmp_16 = extract_h( L_shl( in[j], s_l ) ); @@ -2919,6 +2946,7 @@ static void IGF_RefineGrid( H_IGF_GRID hGrid /**< in Word16 delta; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move16(); #endif set16_fx( a, 0, IGF_MAX_SFB + 1 ); @@ -2969,6 +2997,7 @@ static void IGF_RefineGrid_ivas_fx( H_IGF_GRID hGrid /**< in/out: | IGF grid han Word16 delta; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move16(); #endif set16_fx( a, 0, IGF_MAX_SFB + 1 ); @@ -2994,6 +3023,7 @@ static void IGF_RefineGrid_ivas_fx( H_IGF_GRID hGrid /**< in/out: | IGF grid han IF( GE_16( sub( delta, shl( shr( delta, 6 ), 6 ) ), MID ) ) { a[tmp] = add( a[tmp], 1 ); + move16(); } move16(); IF( s_and( a[tmp], 1 ) != 0 ) @@ -3048,12 +3078,12 @@ void IGFDecReadData_ivas_fx( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in move16(); } - IF( EQ_16( isIndepFrame, 0 ) ) + IF( isIndepFrame == 0 ) { tmp = get_next_indice( st, 1 ); } - IF( EQ_16( tmp, 1 ) ) + IF( tmp == 1 ) { FOR( p = 0; p < nT; p++ ) { @@ -3065,7 +3095,7 @@ void IGFDecReadData_ivas_fx( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in { IGF_decode_whitening_level( st, hPrivateData, 0 ); test(); - IF( hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_SWB_48000_CPE || hPrivateData->igfInfo.bitRateIndex == IGF_BITRATE_FB_48000_CPE ) + IF( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) { tmp = 0; move16(); @@ -3133,7 +3163,7 @@ void IGFDecReadData( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in: | ins move16(); } - IF( EQ_16( isIndepFrame, 0 ) ) + IF( isIndepFrame == 0 ) { tmp = get_next_indice( st, 1 ); } @@ -3205,7 +3235,7 @@ void IGFDecReadLevel( /**< ou move16(); IGFAllZero = get_next_indice( st, 1 ); - IF( EQ_16( IGFAllZero, 0 ) ) + IF( IGFAllZero == 0 ) { Copy( hPrivateData->igf_curr, hPrivateData->igf_prev, hGrid->stopSfb ); IGFSCFDecoderDecode( &hPrivateData->hArithSCFdec, st, &hPrivateData->igf_curr[m_igfSfbStart], /* 0Q15, hPrivateData->igf_curr = [0, 91] */ igfGridIdx, isIndepFrame ); @@ -3266,7 +3296,7 @@ void IGFDecApplyMono( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in set16_fx( igf_spec_e, 0, IGF_MAX_TILES ); /* concealment counter */ - IF( NE_16( bfi, 0 ) ) + IF( bfi != 0 ) { hPrivateData->frameLossCounter = add( hPrivateData->frameLossCounter, 1 ); } @@ -3277,7 +3307,7 @@ void IGFDecApplyMono( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in } /* skip IGF processing if all IGF levels are zero */ - IF( EQ_16( hInstance->infoIGFAllZero, 0 ) ) + IF( hInstance->infoIGFAllZero == 0 ) { @@ -3434,7 +3464,7 @@ void IGFDecApplyMono_ivas( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in set16_fx( igf_spec_e, 0, IGF_MAX_TILES ); /* concealment counter */ - IF( NE_16( bfi, 0 ) ) + IF( bfi != 0 ) { hPrivateData->frameLossCounter = add( hPrivateData->frameLossCounter, 1 ); } @@ -3445,7 +3475,7 @@ void IGFDecApplyMono_ivas( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in } /* skip IGF processing if all IGF levels are zero */ - IF( EQ_16( hInstance->infoIGFAllZero, 0 ) ) + IF( hInstance->infoIGFAllZero == 0 ) { FOR( i = 0; i < hGrid->nTiles; i++ ) { @@ -4262,9 +4292,9 @@ Word16 get_igf_startline( { Word16 igf_startline; - IF( EQ_16( st->igf, 0 ) ) + IF( st->igf == 0 ) { - IF( EQ_16( st->narrowBand, 0 ) ) + IF( st->narrowBand == 0 ) { /* minimum needed for output with sampling rates lower then the nominal sampling rate */ diff --git a/lib_dec/igf_scf_dec_fx.c b/lib_dec/igf_scf_dec_fx.c index cda1bb3b8..b9af11db1 100644 --- a/lib_dec/igf_scf_dec_fx.c +++ b/lib_dec/igf_scf_dec_fx.c @@ -54,7 +54,7 @@ static Word16 quant_ctx_fx( result = s_min( abs_s( ctx ), IGF_CTX_OFFSET ); /* limit the absolute value to IGF_CTX_OFFSET */ - IF( LT_16( ctx, 0 ) ) /* add the sign back, if needed */ + if ( ctx < 0 ) /* add the sign back, if needed */ { result = negate( result ); } @@ -80,7 +80,7 @@ static Word16 arith_decode_bits_fx( x = lshl( x, 1 ); /* decode one bit using the new raw AC function */ bit = ari_decode_14bits_bit_ext_fx( st, &hPrivateData->acState ); - IF( NE_16( bit, 0 ) ) + if ( bit != 0 ) { x = s_or( x, 1 ); } @@ -107,7 +107,7 @@ static Word16 arith_decode_residual_fx( /* meaning of the values of val: */ /* esc_{0} IGF_MIN_ENC_SEPARATE ... IGF_MAX_ENC_SEPARATE esc_{IGF_SYMBOLS_IN_TABLE - 1} */ test(); - IF( ( NE_16( val, 0 ) ) && ( NE_16( val, IGF_SYMBOLS_IN_TABLE - 1 ) ) ) + IF( ( val != 0 ) && ( NE_16( val, IGF_SYMBOLS_IN_TABLE - 1 ) ) ) { x = add( val, -1 + IGF_MIN_ENC_SEPARATE ); /* (val - 1) + IGF_MIN_ENC_SEPARATE */ @@ -133,12 +133,12 @@ static Word16 arith_decode_residual_fx( extra = add( 15, extra ); } - IF( EQ_16( val, 0 ) ) + if ( val == 0 ) { /* escape code 0 to indicate x <= IGF_MIN_ENC_SEPARATE - 1 */ x = sub( IGF_MIN_ENC_SEPARATE - 1, extra ); } - IF( EQ_16( val, IGF_SYMBOLS_IN_TABLE - 1 ) ) + if ( EQ_16( val, IGF_SYMBOLS_IN_TABLE - 1 ) ) { /* escape code (IGF_SYMBOLS_IN_TABLE - 1) to indicate x >= IGF_MAX_ENC_SEPARATE + 1 */ x = add( IGF_MAX_ENC_SEPARATE + 1, extra ); @@ -186,9 +186,9 @@ static void decode_sfe_vector_fx( FOR( f = 0; f < length; ++f ) { - IF( EQ_16( t, 0 ) ) + IF( t == 0 ) { - IF( EQ_16( f, 0 ) ) + IF( f == 0 ) { /* (t == 0) && (f == 0) */ /* decode one of the IGF_SYMBOLS_IN_TABLE == 27 alphabet symbols using the new raw AC function */ @@ -228,7 +228,7 @@ static void decode_sfe_vector_fx( ELSE { /* t == 1 */ - IF( EQ_16( f, 0 ) ) + IF( f == 0 ) { /* (t == 1) && (f == 0) */ res = arith_decode_residual_fx( hPrivateData, @@ -264,7 +264,7 @@ static void decode_sfe_vector_fx( } } - IF( LT_16( x[f], 0 ) ) + IF( x[f] < 0 ) { x[f] = 0; move16(); @@ -315,7 +315,7 @@ void IGFSCFDecoderDecode( ari_start_decoding_14bits_fx( st, &hPublicData->acState ); /* start AC decoding */ /* check if coder needs a reset and do it if necessary */ - IF( NE_16( indepFlag, 0 ) ) + IF( indepFlag != 0 ) { /* reset of coder */ IGFSCFDecoderReset( hPublicData ); diff --git a/lib_dec/init_dec_fx.c b/lib_dec/init_dec_fx.c index ad5c524c1..ba95b6933 100644 --- a/lib_dec/init_dec_fx.c +++ b/lib_dec/init_dec_fx.c @@ -130,7 +130,7 @@ ivas_error init_decoder_fx( *-----------------------------------------------------------------*/ test(); - IF( EQ_16( idchan, 0 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + IF( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) { IF( ( st_fx->hBWE_FD = (FD_BWE_DEC_HANDLE) count_malloc( sizeof( FD_BWE_DEC_DATA ) ) ) == NULL ) { @@ -149,7 +149,7 @@ ivas_error init_decoder_fx( *-----------------------------------------------------------------*/ test(); - IF( ( EQ_16( idchan, 0 ) || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) + IF( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) { IF( ( st_fx->hIGFDec = (IGF_DEC_INSTANCE_HANDLE) count_malloc( sizeof( IGFDEC_INSTANCE ) ) ) == NULL ) { @@ -209,7 +209,7 @@ ivas_error init_decoder_fx( test(); test(); - IF( ( EQ_16( idchan, 0 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) + IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) { IF( ( st_fx->hGSCDec = (GSC_DEC_HANDLE) count_malloc( sizeof( GSC_DEC_DATA ) ) ) == NULL ) { @@ -227,7 +227,7 @@ ivas_error init_decoder_fx( * parameters for fast recovery (WI) *-----------------------------------------------------------------*/ test(); - IF( EQ_32( st_fx->output_Fs, 16000 ) && EQ_16( st_fx->element_mode, EVS_MONO ) ) + IF( EQ_32( st_fx->output_Fs, 16000 ) && ( st_fx->element_mode == EVS_MONO ) ) { IF( ( st_fx->hWIDec = (WI_DEC_HANDLE) count_malloc( sizeof( WI_DEC_DATA ) ) ) == NULL ) { @@ -354,7 +354,7 @@ ivas_error init_decoder_fx( test(); test(); test(); - IF( EQ_16( idchan, 0 ) && ( EQ_16( st_fx->element_mode, EVS_MONO ) || EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) ) + IF( idchan == 0 && ( ( st_fx->element_mode == EVS_MONO ) || EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) ) { IF( ( st_fx->hTdCngDec = (TD_CNG_DEC_HANDLE) count_malloc( sizeof( TD_CNG_DEC_DATA ) ) ) == NULL ) { @@ -368,6 +368,7 @@ ivas_error init_decoder_fx( st_fx->hTdCngDec = NULL; } st_fx->cng_type = -1; + move16(); st_fx->CNG_fx = 0; move16(); /* RTXDTX handler CNG=1 nonCNG= 0,*/ st_fx->prev_ft_speech_fx = 1; @@ -397,7 +398,9 @@ ivas_error init_decoder_fx( FOR( i = 0; i < LPC_SHB_ORDER; i++ ) { st_fx->lsp_shb_prev_fx[i] = lsp_shb_prev_tbl_fx[i]; + move16(); st_fx->lsp_shb_prev_prev_fx[i] = st_fx->lsp_shb_prev_fx[i]; + move16(); } st_fx->shb_dtx_count_fx = 0; @@ -428,7 +431,7 @@ ivas_error init_decoder_fx( test(); test(); test(); - IF( ( EQ_16( idchan, 0 ) || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || EQ_16( st_fx->element_mode, IVAS_SCE ) || EQ_16( st_fx->element_mode, EVS_MONO ) ) ) + IF( ( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || EQ_16( st_fx->element_mode, IVAS_SCE ) || ( st_fx->element_mode == EVS_MONO ) ) ) { IF( ( st_fx->hHQ_core = (HQ_DEC_HANDLE) count_malloc( sizeof( HQ_DEC_DATA ) ) ) == NULL ) { @@ -438,7 +441,7 @@ ivas_error init_decoder_fx( /* HQ core initialization */ HQ_core_dec_init_fx( st_fx->hHQ_core ); - IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + IF( st_fx->element_mode == EVS_MONO ) { /* HQ NB FEC initialization */ IF( ( st_fx->hHQ_nbfec = (HQ_NBFEC_HANDLE) count_malloc( sizeof( HQ_NBFEC_DATA ) ) ) == NULL ) @@ -468,7 +471,7 @@ ivas_error init_decoder_fx( move16(); set16_fx( st_fx->delay_buf_out_fx, 0, HQ_DELTA_MAX * HQ_DELAY_COMP ); set16_fx( st_fx->previoussynth_fx, 0, L_FRAME48k ); - IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + IF( st_fx->element_mode == EVS_MONO ) { set16_fx( st_fx->old_synth_sw_fx, 0, NS2SA( 48000, FRAME_SIZE_NS - ACELP_LOOK_NS - DELAY_BWE_TOTAL_NS ) ); } @@ -477,7 +480,7 @@ ivas_error init_decoder_fx( *-----------------------------------------------------------------*/ /* TCX-LTP */ - IF( ( EQ_16( idchan, 0 ) || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) + IF( ( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) { IF( ( st_fx->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) count_malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL ) { @@ -491,7 +494,7 @@ ivas_error init_decoder_fx( /* TCX core */ // VE: reduction possible for MCT_CHAN_MODE_LFE channel - see I1-172 - IF( EQ_16( idchan, 0 ) || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + IF( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) { IF( ( st_fx->hTcxDec = (TCX_DEC_HANDLE) count_malloc( sizeof( TCX_DEC_DATA ) ) ) == NULL ) { @@ -508,7 +511,7 @@ ivas_error init_decoder_fx( st_fx->hTcxDec = NULL; } /* TCX config. data structure */ - IF( ( EQ_16( idchan, 0 ) || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) + IF( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) { IF( ( st_fx->hTcxCfg = (TCX_CONFIG_HANDLE) count_malloc( sizeof( TCX_config ) ) ) == NULL ) { @@ -536,7 +539,7 @@ ivas_error init_decoder_fx( *-----------------------------------------------------------------*/ test(); - IF( EQ_16( idchan, 0 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + IF( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) { IF( ( st_fx->hBWE_TD = (TD_BWE_DEC_HANDLE) count_malloc( sizeof( TD_BWE_DEC_DATA ) ) ) == NULL ) { @@ -623,7 +626,7 @@ ivas_error init_decoder_fx( * AMR-WB IO mode parameters *----------------------------------------------------------------------------------*/ test(); - IF( st_fx->Opt_AMR_WB || EQ_16( st_fx->element_mode, EVS_MONO ) ) + IF( st_fx->Opt_AMR_WB || st_fx->element_mode == EVS_MONO ) { IF( ( st_fx->hAmrwb_IO = (AMRWB_IO_DEC_HANDLE) count_malloc( sizeof( AMRWB_IO_DEC_DATA ) ) ) == NULL ) { @@ -645,7 +648,7 @@ ivas_error init_decoder_fx( *-----------------------------------------------------------------*/ test(); test(); - IF( ( EQ_16( idchan, 0 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) + IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) { IF( ( st_fx->hBWE_zero = (ZERO_BWE_DEC_HANDLE) count_malloc( sizeof( ZERO_BWE_DEC_DATA ) ) ) == NULL ) { @@ -672,7 +675,7 @@ ivas_error init_decoder_fx( *-----------------------------------------------------------------*/ test(); test(); - IF( ( EQ_16( idchan, 0 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) + IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) { IF( ( st_fx->hBPF = (BPF_DEC_HANDLE) count_malloc( sizeof( BPF_DEC_DATA ) ) ) == NULL ) { @@ -689,18 +692,18 @@ ivas_error init_decoder_fx( * FD BPF & resampling tools parameters *-----------------------------------------------------------------*/ /* open analysis for max. SR 48kHz */ - IF( ( error = openCldfb( &st_fx->cldfbAna, CLDFB_ANALYSIS, CLDFB_getNumChannels( 48000 ), 320 ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = openCldfb( &st_fx->cldfbAna, CLDFB_ANALYSIS, CLDFB_getNumChannels( 48000 ), 320 ) ), IVAS_ERR_OK ) ) { return error; } /* open analysis BPF for max. SR 16kHz */ - IF( ( error = openCldfb( &st_fx->cldfbBPF, CLDFB_ANALYSIS, CLDFB_getNumChannels( 16000 ), 320 ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = openCldfb( &st_fx->cldfbBPF, CLDFB_ANALYSIS, CLDFB_getNumChannels( 16000 ), 320 ) ), IVAS_ERR_OK ) ) { return error; } /* open synthesis for output SR */ - IF( ( error = openCldfb( &st_fx->cldfbSyn, CLDFB_SYNTHESIS, CLDFB_getNumChannels( st_fx->output_Fs ), st_fx->output_frame_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = openCldfb( &st_fx->cldfbSyn, CLDFB_SYNTHESIS, CLDFB_getNumChannels( st_fx->output_Fs ), st_fx->output_frame_fx ) ), IVAS_ERR_OK ) ) { return error; } @@ -731,7 +734,7 @@ ivas_error init_decoder_fx( * SC-VBR parameters *-----------------------------------------------------------------*/ - IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + IF( st_fx->element_mode == EVS_MONO ) { IF( ( st_fx->hSC_VBR = (SC_VBR_DEC_HANDLE) count_malloc( sizeof( SC_VBR_DEC_DATA ) ) ) == NULL ) { @@ -788,12 +791,12 @@ ivas_error init_decoder_fx( #ifdef IVAS_CODE IF( ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || idchan == 0 ) && NE_16( mc_mode, MC_MODE_MCT ) && NE_16( mc_mode, MC_MODE_PARAMUPMIX ) ) // TBV Fixed point missing #else - IF( ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || EQ_16( idchan, 0 ) ) /*&& mc_mode != MC_MODE_MCT && mc_mode != MC_MODE_PARAMUPMIX*/ ) + IF( ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || idchan == 0 ) /*&& mc_mode != MC_MODE_MCT && mc_mode != MC_MODE_PARAMUPMIX*/ ) #endif { /* Create FD_CNG instance */ - IF( ( error = createFdCngDec_fx( &st_fx->hFdCngDec ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = createFdCngDec_fx( &st_fx->hFdCngDec ) ), IVAS_ERR_OK ) ) { return error; } @@ -942,6 +945,7 @@ ivas_error init_decoder_ivas_fx( move16(); st_fx->flag_ACELP16k = set_ACELP_flag( st_fx->element_mode, st_fx->total_brate, st_fx->total_brate, idchan, 0, -1, -1 ); + move16(); /*-----------------------------------------------------------------* * ACELP core parameters @@ -1109,7 +1113,7 @@ ivas_error init_decoder_ivas_fx( test(); test(); - IF( ( EQ_16( idchan, 0 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) + IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) { IF( ( st_fx->hGSCDec = (GSC_DEC_HANDLE) count_malloc( sizeof( GSC_DEC_DATA ) ) ) == NULL ) { @@ -1128,7 +1132,7 @@ ivas_error init_decoder_ivas_fx( *-----------------------------------------------------------------*/ test(); - IF( EQ_32( st_fx->output_Fs, 16000 ) && EQ_16( st_fx->element_mode, EVS_MONO ) ) + IF( EQ_32( st_fx->output_Fs, 16000 ) && ( st_fx->element_mode == EVS_MONO ) ) { IF( ( st_fx->hWIDec = (WI_DEC_HANDLE) count_malloc( sizeof( WI_DEC_DATA ) ) ) == NULL ) { @@ -1148,7 +1152,7 @@ ivas_error init_decoder_ivas_fx( *-----------------------------------------------------------------*/ test(); test(); - IF( ( EQ_16( idchan, 0 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) + IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) { IF( ( st_fx->hPFstat = (PFSTAT_HANDLE) count_malloc( sizeof( PFSTAT ) ) ) == NULL ) { @@ -1170,7 +1174,7 @@ ivas_error init_decoder_ivas_fx( test(); test(); - IF( ( EQ_16( idchan, 0 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) + IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) { IF( ( st_fx->hBWE_zero = (ZERO_BWE_DEC_HANDLE) malloc( sizeof( ZERO_BWE_DEC_DATA ) ) ) == NULL ) { @@ -1192,7 +1196,7 @@ ivas_error init_decoder_ivas_fx( *-----------------------------------------------------------------*/ test(); test(); - IF( ( EQ_16( idchan, 0 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) + IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) { IF( ( st_fx->hMusicPF = (MUSIC_POSTFILT_HANDLE) count_malloc( sizeof( MUSIC_POSTFILT_DATA ) ) ) == NULL ) { @@ -1226,7 +1230,7 @@ ivas_error init_decoder_ivas_fx( test(); test(); test(); - IF( EQ_16( idchan, 0 ) && ( EQ_16( st_fx->element_mode, EVS_MONO ) || EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) ) + IF( idchan == 0 && ( EQ_16( st_fx->element_mode, EVS_MONO ) || EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) ) { IF( ( st_fx->hTdCngDec = (TD_CNG_DEC_HANDLE) count_malloc( sizeof( TD_CNG_DEC_DATA ) ) ) == NULL ) { @@ -1266,7 +1270,7 @@ ivas_error init_decoder_ivas_fx( test(); test(); test(); - IF( ( EQ_16( idchan, 0 ) || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || EQ_16( st_fx->element_mode, IVAS_SCE ) || EQ_16( st_fx->element_mode, EVS_MONO ) ) ) + IF( ( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || EQ_16( st_fx->element_mode, IVAS_SCE ) || EQ_16( st_fx->element_mode, EVS_MONO ) ) ) { IF( ( st_fx->hHQ_core = (HQ_DEC_HANDLE) malloc( sizeof( HQ_DEC_DATA ) ) ) == NULL ) { @@ -1302,7 +1306,7 @@ ivas_error init_decoder_ivas_fx( *-----------------------------------------------------------------*/ test(); - IF( EQ_16( idchan, 0 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + IF( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) { IF( ( st_fx->hBWE_TD = (TD_BWE_DEC_HANDLE) malloc( sizeof( TD_BWE_DEC_DATA ) ) ) == NULL ) { @@ -1328,7 +1332,7 @@ ivas_error init_decoder_ivas_fx( * SWB BWE parameters *-----------------------------------------------------------------*/ test(); - IF( EQ_16( idchan, 0 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + IF( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) { IF( ( st_fx->hBWE_FD = (FD_BWE_DEC_HANDLE) malloc( sizeof( FD_BWE_DEC_DATA ) ) ) == NULL ) { @@ -1373,7 +1377,7 @@ ivas_error init_decoder_ivas_fx( * HR SWB BWE parameters *-----------------------------------------------------------------*/ - IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + IF( ( st_fx->element_mode == EVS_MONO ) ) { IF( ( st_fx->hBWE_FD_HR = (HR_BWE_DEC_HANDLE) count_malloc( sizeof( HR_BWE_DEC_DATA ) ) ) == NULL ) { @@ -1448,7 +1452,7 @@ ivas_error init_decoder_ivas_fx( test(); test(); - IF( ( EQ_16( idchan, 0 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) + IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) { IF( ( st_fx->hBPF = (BPF_DEC_HANDLE) malloc( sizeof( BPF_DEC_DATA ) ) ) == NULL ) { @@ -1467,16 +1471,16 @@ ivas_error init_decoder_ivas_fx( *-----------------------------------------------------------------*/ test(); test(); - IF( ( EQ_16( idchan, 0 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) + IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) { /* open analysis for max. SR 48kHz */ - IF( ( error = openCldfb_ivas_fx( &st_fx->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) { return error; } /* open analysis BPF for max. SR 16kHz */ - IF( ( error = openCldfb_ivas_fx( &st_fx->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) { return error; } @@ -1488,7 +1492,7 @@ ivas_error init_decoder_ivas_fx( } /* open synthesis for output SR */ - IF( ( error = openCldfb_ivas_fx( &st_fx->cldfbSyn, CLDFB_SYNTHESIS, st_fx->output_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbSyn, CLDFB_SYNTHESIS, st_fx->output_Fs, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) { return error; } @@ -1566,7 +1570,7 @@ ivas_error init_decoder_ivas_fx( /* TCX-LTP */ test(); - IF( ( EQ_16( idchan, 0 ) || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) + IF( ( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) { IF( ( st_fx->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) count_malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL ) { @@ -1580,7 +1584,7 @@ ivas_error init_decoder_ivas_fx( /* TCX core */ test(); - IF( EQ_16( idchan, 0 ) || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + IF( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) { IF( ( st_fx->hTcxDec = (TCX_DEC_HANDLE) malloc( sizeof( TCX_DEC_DATA ) ) ) == NULL ) { @@ -1589,8 +1593,8 @@ ivas_error init_decoder_ivas_fx( set32_fx( st_fx->hTcxDec->FBTCXdelayBuf_32, 0, 111 ); - st_fx->hTcxDec->old_synthFB_fx = st_fx->hTcxDec->synth_history_fx + NS2SA( st_fx->output_Fs, PH_ECU_MEM_NS ); - st_fx->hTcxDec->prev_good_synth_fx = st_fx->hTcxDec->old_synthFB_fx + NS2SA( st_fx->output_Fs, PH_ECU_LOOKAHEAD_NS ); + st_fx->hTcxDec->old_synthFB_fx = st_fx->hTcxDec->synth_history_fx + NS2SA_fx2( st_fx->output_Fs, PH_ECU_MEM_NS ); + st_fx->hTcxDec->prev_good_synth_fx = st_fx->hTcxDec->old_synthFB_fx + NS2SA_fx2( st_fx->output_Fs, PH_ECU_LOOKAHEAD_NS ); } ELSE { @@ -1599,7 +1603,7 @@ ivas_error init_decoder_ivas_fx( /* TCX config. data structure */ test(); - IF( ( EQ_16( idchan, 0 ) || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) + IF( ( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) { IF( ( st_fx->hTcxCfg = (TCX_CONFIG_HANDLE) count_malloc( sizeof( TCX_config ) ) ) == NULL ) { @@ -1613,7 +1617,7 @@ ivas_error init_decoder_ivas_fx( /* Tonal MDCT concealment data structure */ test(); - IF( ( EQ_16( idchan, 0 ) || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) + IF( ( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) { IF( ( st_fx->hTonalMDCTConc = (TonalMDCTConcealPtr) malloc( sizeof( TonalMDCTConceal_INSTANCE ) ) ) == NULL ) { @@ -1630,7 +1634,7 @@ ivas_error init_decoder_ivas_fx( *-----------------------------------------------------------------*/ test(); - IF( ( EQ_16( idchan, 0 ) || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) + IF( ( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) { IF( ( st_fx->hIGFDec = (IGF_DEC_INSTANCE_HANDLE) malloc( sizeof( IGFDEC_INSTANCE ) ) ) == NULL ) { @@ -1649,7 +1653,7 @@ ivas_error init_decoder_ivas_fx( /*-----------------------------------------------------------------* * Mode 2 initialization *-----------------------------------------------------------------*/ - IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + IF( ( st_fx->element_mode == EVS_MONO ) ) { IF( ( st_fx->hPlcInfo = (T_PLCInfo_HANDLE) malloc( sizeof( T_PLCInfo ) ) ) == NULL ) { @@ -1697,7 +1701,7 @@ ivas_error init_decoder_ivas_fx( move16(); test(); - IF( ( EQ_16( idchan, 0 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) + IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) { resampleCldfb_ivas_fx( st_fx->cldfbAna, L_mult0( st_fx->L_frame, FRAMES_PER_SEC ) ); resampleCldfb_ivas_fx( st_fx->cldfbBPF, L_mult0( st_fx->L_frame, FRAMES_PER_SEC ) ); @@ -1710,11 +1714,11 @@ ivas_error init_decoder_ivas_fx( test(); test(); test(); - IF( ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || EQ_16( idchan, 0 ) ) && NE_16( mc_mode, MC_MODE_MCT ) && NE_16( mc_mode, MC_MODE_PARAMUPMIX ) ) + IF( ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) || idchan == 0 ) && NE_16( mc_mode, MC_MODE_MCT ) && NE_16( mc_mode, MC_MODE_PARAMUPMIX ) ) { /* Create FD_CNG instance */ - IF( ( error = createFdCngDec_fx( &st_fx->hFdCngDec ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = createFdCngDec_fx( &st_fx->hFdCngDec ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/inov_dec_fx.c b/lib_dec/inov_dec_fx.c index 9531a05be..24c82e20a 100644 --- a/lib_dec/inov_dec_fx.c +++ b/lib_dec/inov_dec_fx.c @@ -82,7 +82,7 @@ void inov_decode_fx( test(); test(); test(); - IF( GE_16( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_subfr], 0 ) ) + IF( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_subfr] >= 0 ) { IF( EQ_16( L_subfr, 2 * L_SUBFR ) ) { @@ -100,9 +100,9 @@ void inov_decode_fx( dec_acelp_fast_fx( st_fx, nBits, code, L_subfr ); } } - ELSE IF( ( EQ_16( st_fx->idchan, 1 ) && LE_16( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR], 7 ) ) || ( EQ_16( st_fx->idchan, 0 ) && LE_16( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR], 3 ) ) ) + ELSE IF( ( EQ_16( st_fx->idchan, 1 ) && LE_16( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR], 7 ) ) || ( ( st_fx->idchan == 0 ) && LE_16( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR], 3 ) ) ) { - IF( EQ_16( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR], 0 ) ) + IF( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] == 0 ) { // dec_acelp_1t64(st_fx, code, L_SUBFR); dec_acelp_1t64_fx( st_fx, code, L_SUBFR ); @@ -115,18 +115,20 @@ void inov_decode_fx( } ELSE { - wordcnt = ACELP_FIXED_CDK_BITS( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] ) >> 4; + wordcnt = shr( ACELP_FIXED_CDK_BITS( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] ), 4 ); move16(); - bitcnt = ACELP_FIXED_CDK_BITS( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] ) & 15; + bitcnt = s_and( ACELP_FIXED_CDK_BITS( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] ), 15 ); move16(); // PMT("CONDITION above is missing -> idchan") FOR( i = 0; i < wordcnt; i++ ) { indexing_indices[i] = get_next_indice( st_fx, 16 ); + move16(); } IF( bitcnt ) { indexing_indices[i] = get_next_indice( st_fx, bitcnt ); + move16(); } config = PulseConfTable[st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR]]; D_ACELP_indexing_fx( code, config, NB_TRACK_FCB_4T, indexing_indices, &st_fx->BER_detect ); @@ -271,7 +273,7 @@ void inov_decode_ivas_fx( test(); test(); test(); - IF( GE_16( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_subfr], 0 ) ) + IF( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_subfr] >= 0 ) { IF( EQ_16( L_subfr, 2 * L_SUBFR ) ) { @@ -290,7 +292,7 @@ void inov_decode_ivas_fx( } ELSE IF( ( EQ_16( st_fx->idchan, 1 ) && LE_16( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR], 7 ) ) || ( EQ_16( st_fx->idchan, 0 ) && LE_16( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR], 3 ) ) ) { - IF( EQ_16( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR], 0 ) ) + IF( st_fx->acelp_cfg.fixed_cdk_index[i_subfr / L_SUBFR] == 0 ) { // dec_acelp_1t64(st_fx, code, L_SUBFR); dec_acelp_1t64_fx( st_fx, code, L_SUBFR ); diff --git a/lib_dec/ivas_agc_dec_fx.c b/lib_dec/ivas_agc_dec_fx.c index 6043e082c..2bf3ad9ca 100644 --- a/lib_dec/ivas_agc_dec_fx.c +++ b/lib_dec/ivas_agc_dec_fx.c @@ -210,7 +210,7 @@ void ivas_agc_dec_process_fx( // gainLast = 1.f / pState->gain_state[i].lastGain; tmp = negate( sub( pState->gain_data[i].absGainExp, pState->agc_com.absEmin ) ); - IF( LT_16( tmp, 0 ) ) + IF( tmp < 0 ) { tmp_2 = MAX_16; move16(); @@ -233,7 +233,7 @@ void ivas_agc_dec_process_fx( move16(); gainLast = div_l( ONE_IN_Q29, pState->gain_state[i].lastGain_fx ); // Q13 - IF( NE_16( pState->gain_state[i].gainExpVal, 0 ) ) + IF( pState->gain_state[i].gainExpVal != 0 ) { FOR( idx = 0; idx < output_frame; idx++ ) { @@ -242,8 +242,7 @@ void ivas_agc_dec_process_fx( // gain = powf( pState->agc_com.winFunc[idx - pState->agc_com.in_delay], (float) ( -1 * pState->gain_state[i].gainExpVal ) ) * gainLast; tmp = negate( pState->gain_state[i].gainExpVal ); - move16(); - IF( LT_16( tmp, 0 ) ) + IF( tmp < 0 ) { tmp_2 = MAX_16; move16(); @@ -251,7 +250,7 @@ void ivas_agc_dec_process_fx( { tmp_2 = mult( pState->agc_com.winFunc_fx[idx - pState->agc_com.in_delay], tmp_2 ); } - IF( LT_16( tmp_2, 0 ) ) + IF( tmp_2 < 0 ) { tmp_2 = div_l( ONE_IN_Q30, negate( tmp_2 ) ); // Q14 tmp_2 = negate( tmp_2 ); @@ -267,7 +266,7 @@ void ivas_agc_dec_process_fx( move16(); FOR( j = 0; j < ( tmp ); j++ ) { - tmp_2 = mult( pState->agc_com.winFunc_fx[idx - pState->agc_com.in_delay], tmp_2 ); + tmp_2 = mult( pState->agc_com.winFunc_fx[sub( idx, pState->agc_com.in_delay )], tmp_2 ); } tmp_2 = shr( tmp_2, 1 ); // Q14 } @@ -284,7 +283,7 @@ void ivas_agc_dec_process_fx( // pState->gain_state[i].lastGain *= powf( pState->agc_com.winFunc[offset - 1], (float) pState->gain_state[i].gainExpVal ); tmp = pState->gain_state[i].gainExpVal; move16(); - IF( LT_16( tmp, 0 ) ) + IF( tmp < 0 ) { tmp_2 = MAX_16; move16(); @@ -357,6 +356,7 @@ void ivas_agc_read_bits_fx( ELSE { pState->gain_data[i].absGainExpCurr = (Word32) pState->agc_com.absEmin; + move32(); } } } @@ -365,6 +365,7 @@ void ivas_agc_read_bits_fx( FOR( i = 0; i < n_channels; i++ ) { pState->gain_data[i].absGainExpCurr = (Word32) pState->agc_com.absEmin; + move32(); } } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 3d9020f7c..8933057bd 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -328,11 +328,7 @@ ivas_error ivas_sba_dec_reconfigure( { ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 ); -#ifdef IVAS_FLOAT_FIXED - if ( ( error = ivas_spar_dec_open_fx( st_ivas, 1 ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_spar_dec_open( st_ivas, 1 ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -357,20 +353,13 @@ ivas_error ivas_sba_dec_reconfigure( } ivas_pca_dec_init( hSpar->hPCA ); -#ifdef IVAS_FLOAT_FIXED - ivas_pca_dec_init_fx( hSpar->hPCA ); -#endif } ivas_spar_config( ivas_total_brate, sba_order_internal, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, st_ivas->sid_format ); } else { -#ifdef IVAS_FLOAT_FIXED - if ( ( error = ivas_spar_dec_open_fx( st_ivas, 0 ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -432,19 +421,11 @@ ivas_error ivas_sba_dec_reconfigure( ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); } -#ifdef IVAS_FLOAT_FIXED - if ( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), - st_ivas->ivas_format ) ) != IVAS_ERR_OK ) - { - return error; - } -#else if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ) != IVAS_ERR_OK ) { return error; } -#endif if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( ( hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_MONO ) ) ) { @@ -456,11 +437,7 @@ ivas_error ivas_sba_dec_reconfigure( flag_config = DIRAC_RECONFIGURE_MODE; } -#ifdef IVAS_FLOAT_FIXED - if ( ( error = ivas_dirac_dec_config_fx( st_ivas, flag_config ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_dirac_dec_config( st_ivas, flag_config ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -470,7 +447,7 @@ ivas_error ivas_sba_dec_reconfigure( int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1]; st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); - if ( ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ) + if ( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ) { st_ivas->hSpar->enc_param_start_band = 0; @@ -478,8 +455,8 @@ ivas_error ivas_sba_dec_reconfigure( st_ivas->hQMetaData->numTwoDirBands = (uint8_t) st_ivas->hQMetaData->q_direction[0].cfg.nbands; } - ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), - st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); if ( st_ivas->hDirAC ) { @@ -489,17 +466,10 @@ ivas_error ivas_sba_dec_reconfigure( if ( st_ivas->renderer_type == RENDERER_DISABLE ) { -#ifdef IVAS_FLOAT_FIXED - ivas_dirac_rend_close_fx( &( st_ivas->hDirACRend ) ); - ivas_spat_hSpatParamRendCom_close_fx( &( st_ivas->hSpatParamRendCom ) ); - ivas_dirac_dec_close_fx( &( st_ivas->hDirAC ) ); - vbap_free_data_fx( &( st_ivas->hVBAPdata ) ); -#else ivas_dirac_rend_close( &( st_ivas->hDirACRend ) ); ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) ); ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); vbap_free_data( &( st_ivas->hVBAPdata ) ); -#endif } if ( st_ivas->hDirAC != NULL ) @@ -518,11 +488,7 @@ ivas_error ivas_sba_dec_reconfigure( int32_t temp_brate[MAX_SCE]; st_ivas->ism_mode = ISM_SBA_MODE_DISC; -#ifdef IVAS_FLOAT_FIXED - IF( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, temp_brate ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_ism_metadata_dec_create( st_ivas, st_ivas->nchan_ism, temp_brate ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -537,17 +503,10 @@ ivas_error ivas_sba_dec_reconfigure( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) { -#ifdef IVAS_FLOAT_FIXED - IF( ( error = ivas_ism_renderer_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } -#else if ( ( error = ivas_ism_renderer_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; } -#endif } if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) @@ -613,32 +572,20 @@ ivas_error ivas_sba_dec_reconfigure( } } -#ifdef IVAS_FLOAT_FIXED - IF( ( error = ivas_corecoder_dec_reconfig_fx( st_ivas, nSCE_old, nCPE_old, nchan_transport_old, sba_dirac_stereo_flag_old, st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport, ( st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS ) ) != IVAS_ERR_OK ) - { - return error; - } -#else if ( ( error = ivas_corecoder_dec_reconfig( st_ivas, nSCE_old, nCPE_old, nchan_transport_old, sba_dirac_stereo_flag_old, st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport, ( st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS ) ) != IVAS_ERR_OK ) { return error; } -#endif /*-----------------------------------------------------------------* * HP20 memories *-----------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED - if ( ( error = ivas_hp20_dec_reconfig_fx( st_ivas, nchan_hp20_old ) ) != IVAS_ERR_OK ) - { - return error; - } -#else + if ( ( error = ivas_hp20_dec_reconfig( st_ivas, nchan_hp20_old ) ) != IVAS_ERR_OK ) { return error; } -#endif + /*-----------------------------------------------------------------* * TD Decorrelator *-----------------------------------------------------------------*/ @@ -748,12 +695,6 @@ ivas_error ivas_sba_dec_reconfigure( { return error; } -#ifdef IVAS_FLOAT_FIXED - if ( ( error = ivas_output_buff_dec_fx( st_ivas->p_output_fx, nchan_out_buff_old, nchan_out_buff ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif // IVAS_FLOAT_FIXED return error; } diff --git a/lib_dec/ivas_stereo_mdct_stereo_dec.c b/lib_dec/ivas_stereo_mdct_stereo_dec.c index b6a424093..d88e31198 100644 --- a/lib_dec/ivas_stereo_mdct_stereo_dec.c +++ b/lib_dec/ivas_stereo_mdct_stereo_dec.c @@ -360,10 +360,29 @@ void parse_stereo_from_bitstream( IF( !isSBAStereoMode ) { - nSubframes = ( EQ_16( sts[0]->core, TCX_10_CORE ) || ( NE_16( sts[0]->core, sts[1]->core ) ) ) ? NB_DIV : 1; + // nSubframes = ( EQ_16( sts[0]->core, TCX_10_CORE ) || ( NE_16( sts[0]->core, sts[1]->core ) ) ) ? NB_DIV : 1; + test(); + IF( ( EQ_16( sts[0]->core, TCX_10_CORE ) || ( NE_16( sts[0]->core, sts[1]->core ) ) ) ) + { + nSubframes = NB_DIV; + move16(); + } + ELSE + { + nSubframes = 1; + move16(); + } move16(); - sfbConf = ( EQ_16( sts[0]->core, TCX_20_CORE ) ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; - IF( EQ_16( sts[0]->last_core_from_bs, ACELP_CORE ) ) + // sfbConf = ( EQ_16( sts[0]->core, TCX_20_CORE ) ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + IF( ( EQ_16( sts[0]->core, TCX_20_CORE ) ) ) + { + sfbConf = &hStereoMdct->stbParamsTCX20; + } + ELSE + { + sfbConf = &hStereoMdct->stbParamsTCX10; + } + if ( sts[0]->last_core_from_bs == ACELP_CORE ) { sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; } @@ -412,7 +431,7 @@ void parse_stereo_from_bitstream( IF( !mct_on ) { test(); - IF( EQ_16( sts[0]->core, sts[1]->core ) || EQ_16( k, 0 ) ) + IF( EQ_16( sts[0]->core, sts[1]->core ) || k == 0 ) { hStereoMdct->global_ild[k] = extract_l( get_next_indice_fx( st0, SMDCT_GLOBAL_ILD_BITS ) ); move16(); @@ -425,7 +444,15 @@ void parse_stereo_from_bitstream( } } - set16_fx( ms_mask[k], ( EQ_16( hStereoMdct->mdct_stereo_mode[k], SMDCT_MS_FULL ) ) ? 1 : 0, sfbConf->nBandsStereoCore ); + // set16_fx( ms_mask[k], ( EQ_16( hStereoMdct->mdct_stereo_mode[k], SMDCT_MS_FULL ) ) ? 1 : 0, sfbConf->nBandsStereoCore ); + IF( ( EQ_16( hStereoMdct->mdct_stereo_mode[k], SMDCT_MS_FULL ) ) ) + { + set16_fx( ms_mask[k], 1, sfbConf->nBandsStereoCore ); + } + ELSE + { + set16_fx( ms_mask[k], 0, sfbConf->nBandsStereoCore ); + } IF( EQ_16( hStereoMdct->mdct_stereo_mode[k], SMDCT_BW_MS ) ) { @@ -462,7 +489,15 @@ void parse_stereo_from_bitstream( assert( !"Not supported stereo mode\n" ); } - set16_fx( &ms_mask[k][sfbConf->nBandsStereoCore], ( EQ_16( hStereoMdct->IGFStereoMode[k], SMDCT_MS_FULL ) ) ? 1 : 0, sub( sfbConf->sfbCnt, sfbConf->nBandsStereoCore ) ); + // set16_fx( &ms_mask[k][sfbConf->nBandsStereoCore], ( EQ_16( hStereoMdct->IGFStereoMode[k], SMDCT_MS_FULL ) ) ? 1 : 0, sub( sfbConf->sfbCnt, sfbConf->nBandsStereoCore ) ); + IF( ( EQ_16( hStereoMdct->IGFStereoMode[k], SMDCT_MS_FULL ) ) ) + { + set16_fx( &ms_mask[k][sfbConf->nBandsStereoCore], 1, sub( sfbConf->sfbCnt, sfbConf->nBandsStereoCore ) ); + } + ELSE + { + set16_fx( &ms_mask[k][sfbConf->nBandsStereoCore], 0, sub( sfbConf->sfbCnt, sfbConf->nBandsStereoCore ) ); + } IF( EQ_16( hStereoMdct->IGFStereoMode[k], SMDCT_BW_MS ) ) { @@ -576,7 +611,7 @@ void stereo_decoder_tcx_fx( move16(); test(); test(); - IF( ( LE_16( core_l, TCX_20_CORE ) && LE_16( core_r, TCX_20_CORE ) ) || tmp_plc_upmix ) + if ( ( LE_16( core_l, TCX_20_CORE ) && LE_16( core_r, TCX_20_CORE ) ) || tmp_plc_upmix ) { nSubframes = 1; move16(); @@ -584,10 +619,18 @@ void stereo_decoder_tcx_fx( FOR( k = 0; k < nSubframes; k++ ) { - sfbConf = ( EQ_16( core_l, TCX_20_CORE ) ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + // sfbConf = ( EQ_16( core_l, TCX_20_CORE ) ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + IF( ( EQ_16( core_l, TCX_20_CORE ) ) ) + { + sfbConf = &hStereoMdct->stbParamsTCX20; + } + ELSE + { + sfbConf = &hStereoMdct->stbParamsTCX10; + } test(); - IF( EQ_16( last_core_l, ACELP_CORE ) || EQ_16( last_core_r, ACELP_CORE ) ) + if ( last_core_l == ACELP_CORE || last_core_r == ACELP_CORE ) { sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; } @@ -643,7 +686,7 @@ void stereo_decoder_tcx_fx( move32(); } } - inverseMS_fx( sfbConf->sfbOffset[sfbConf->sfbCnt] - sfbConf->sfbOffset[sfbConf->nBandsStereoCore], &spec_l[k][sfbConf->sfbOffset[sfbConf->nBandsStereoCore]], &spec_r[k][sfbConf->sfbOffset[sfbConf->nBandsStereoCore]], SQRT2_OVER_2_FIXED ); + inverseMS_fx( sub( sfbConf->sfbOffset[sfbConf->sfbCnt], sfbConf->sfbOffset[sfbConf->nBandsStereoCore] ), &spec_l[k][sfbConf->sfbOffset[sfbConf->nBandsStereoCore]], &spec_r[k][sfbConf->sfbOffset[sfbConf->nBandsStereoCore]], SQRT2_OVER_2_FIXED ); *q_x_ch2 = *q_x_ch2; move16(); *q_x_ch1 = *q_x_ch1; @@ -692,9 +735,33 @@ void stereo_decoder_tcx_fx( move16(); } + Word16 tmp1, tmp2 = 0; + + IF( EQ_16( core_r, TCX_10_CORE ) ) + { + tmp1 = NB_DIV; + move16(); + } + ELSE + { + tmp1 = 1; + move16(); + } + + IF( EQ_16( core_l, TCX_10_CORE ) ) + { + tmp2 = NB_DIV; + move16(); + } + ELSE + { + tmp2 = 1; + move16(); + } + test(); test(); - IF( ( GT_32( nrgRatio, ONE_IN_Q26 ) ) && ( LT_16( k, ( ( EQ_16( core_r, TCX_10_CORE ) ) ? NB_DIV : 1 ) ) ) ) + IF( ( GT_32( nrgRatio, ONE_IN_Q26 ) ) && ( LT_16( k, tmp1 ) ) ) { shift = norm_l( nrgRatio ); nrgRatio = L_shl( nrgRatio, shift ); @@ -703,11 +770,11 @@ void stereo_decoder_tcx_fx( *q_x_ch2 = *q_x_ch2; move16(); } - ELSE IF( ( LT_32( nrgRatio, ONE_IN_Q26 ) ) && ( LT_16( k, ( ( EQ_16( core_l, TCX_10_CORE ) ) ? NB_DIV : 1 ) ) ) ) + ELSE IF( ( LT_32( nrgRatio, ONE_IN_Q26 ) ) && ( LT_16( k, tmp2 ) ) ) { tmp = BASOP_Util_Divide3232_Scale( ONE_IN_Q26, nrgRatio, &tmp_e ); inv_nrgRatio = L_deposit_h( tmp ); - shift = 5 - tmp_e; + shift = sub( 5, tmp_e ); v_multc_fixed( spec_l[k], inv_nrgRatio, spec_l[k], L_frameTCX_l ); Scale_sig32( spec_l[k], L_frameTCX_l, sub( 5, shift ) ); *q_x_ch1 = *q_x_ch1; @@ -891,7 +958,7 @@ ivas_error initMdctStereoDtxData_fx( IF( st->hFdCngDec == NULL ) { /* Create FD_CNG instance */ - IF( ( error = createFdCngDec_fx( &st->hFdCngDec ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = createFdCngDec_fx( &st->hFdCngDec ) ), IVAS_ERR_OK ) ) { return error; } @@ -903,18 +970,20 @@ ivas_error initMdctStereoDtxData_fx( initFdCngDec_ivas_fx( st, st->cldfbSyn->scale ); } - IF( EQ_16( st->first_CNG, 0 ) ) + IF( st->first_CNG == 0 ) { + test(); IF( EQ_16( ch, 1 ) && st->cng_sba_flag ) { st->hFdCngDec->hFdCngCom->seed = add( st->hFdCngDec->hFdCngCom->seed, 3 ); + move16(); } } IF( st->cldfbAna == NULL ) { /* open analysis for max. sampling rate 48kHz */ - IF( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) { return error; } @@ -923,7 +992,7 @@ ivas_error initMdctStereoDtxData_fx( IF( st->cldfbBPF == NULL ) { /* open analysis BPF for max. internal sampling rate 16kHz */ - IF( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) { return error; } @@ -1036,7 +1105,7 @@ void synchonize_channels_mdct_sid_fx( } } - IF( EQ_16( sts[0]->first_CNG, 0 ) ) + IF( sts[0]->first_CNG == 0 ) { /* configure CNG after reading first side info from SID to get correct values for L_frame and bwidth if first SID is also first valid frame */ configureFdCngDec_ivas_fx( st->hFdCngDec, st->bwidth, st->element_brate, st->L_frame, st->last_L_frame, st->element_mode ); @@ -1100,35 +1169,41 @@ static void update_exp( Word16 *a_exp, Word16 *b_exp, Word16 *buff_a, Word16 *bu static void update_exp( Word16 *a_exp, Word16 *b_exp, Word16 *buff_a, Word16 *buff_b, Word16 legth ) { Word16 diff = 0; - if ( *a_exp > *b_exp ) + move16(); + IF( GT_16( *a_exp, *b_exp ) ) { - diff = *a_exp - *b_exp; - for ( int j = 0; j < legth; j++ ) + diff = sub( *a_exp, *b_exp ); + FOR( Word16 j = 0; j < legth; j++ ) { buff_b[j] = shr( buff_b[j], diff ); + move16(); } *b_exp = *a_exp; + move16(); } - else if ( *a_exp < *b_exp ) + ELSE IF( LT_16( *a_exp, *b_exp ) ) { - diff = *b_exp - *a_exp; + diff = sub( *b_exp, *a_exp ); - for ( int j = 0; j < legth; j++ ) + FOR( Word16 j = 0; j < legth; j++ ) { buff_a[j] = shr( buff_a[j], diff ); + move16(); } *a_exp = *b_exp; + move16(); } return; } -static Word16 norm_arr( Word16 *arr, int size ) +static Word16 norm_arr( Word16 *arr, Word32 size ) { Word16 q = 15; - for ( int i = 0; i < size; i++ ) - if ( arr[i] != 0 ) - { - q = min( q, norm_s( arr[i] ) ); - } + move16(); + FOR( Word32 i = 0; i < size; i++ ) + IF( arr[i] != 0 ) + { + q = s_min( q, norm_s( arr[i] ) ); + } return q; } void updateBuffersForDmxMdctStereo_fx( @@ -1153,36 +1228,49 @@ void updateBuffersForDmxMdctStereo_fx( } Word32 Var1 = 0; + move16(); Word16 diff_sidNoiseEst = 0; + move16(); Word16 exp_sidNoiseEst0 = sts[0]->hFdCngDec->hFdCngCom->sidNoiseEstExp; + move16(); Word16 exp_sidNoiseEst1 = sts[1]->hFdCngDec->hFdCngCom->sidNoiseEstExp; - if ( exp_sidNoiseEst0 > exp_sidNoiseEst1 ) + move16(); + IF( GT_16( exp_sidNoiseEst0, exp_sidNoiseEst1 ) ) { - diff_sidNoiseEst = exp_sidNoiseEst0 - exp_sidNoiseEst1; - for ( int j = 0; j < NPART; j++ ) + diff_sidNoiseEst = sub( exp_sidNoiseEst0, exp_sidNoiseEst1 ); + FOR( Word32 j = 0; j < NPART; j++ ) { sts[1]->hFdCngDec->hFdCngCom->sidNoiseEst[j] = L_shr( sts[1]->hFdCngDec->hFdCngCom->sidNoiseEst[j], diff_sidNoiseEst ); + move16(); } exp_sidNoiseEst1 = exp_sidNoiseEst0; + move16(); } - else if ( exp_sidNoiseEst0 < exp_sidNoiseEst1 ) + ELSE IF( LT_16( exp_sidNoiseEst0, exp_sidNoiseEst1 ) ) { - diff_sidNoiseEst = exp_sidNoiseEst1 - exp_sidNoiseEst0; - for ( int j = 0; j < NPART; j++ ) + diff_sidNoiseEst = sub( exp_sidNoiseEst1, exp_sidNoiseEst0 ); + FOR( Word32 j = 0; j < NPART; j++ ) { sts[0]->hFdCngDec->hFdCngCom->sidNoiseEst[j] = L_shr( sts[0]->hFdCngDec->hFdCngCom->sidNoiseEst[j], diff_sidNoiseEst ); + move16(); } exp_sidNoiseEst0 = exp_sidNoiseEst1; + move16(); } sts[0]->hFdCngDec->hFdCngCom->sidNoiseEstExp = exp_sidNoiseEst0; + move16(); sts[1]->hFdCngDec->hFdCngCom->sidNoiseEstExp = exp_sidNoiseEst1; + move16(); + test(); + test(); IF( EQ_32( hCPE->element_brate, IVAS_SID_5k2 ) && GT_32( hCPE->last_element_brate, IVAS_SID_5k2 ) ) { /* in the first SID frame after an active frame, create mid noise shape here, in SID frames that follow inactive frames, it is done directly in the SID decoding since the mid shape is being used in CNG then */ FOR( int16_t p = 0; p < sts[0]->hFdCngDec->hFdCngCom->npart; p++ ) { - Var1 = L_add( sts[0]->hFdCngDec->hFdCngCom->sidNoiseEst[p] >> 1, sts[1]->hFdCngDec->hFdCngCom->sidNoiseEst[p] >> 1 ); // exp_sidNoiseEst0 - 1 - sts[0]->hFdCngDec->hFdCngCom->sidNoiseEst[p] = Mpy_32_32( float_to_fix( 0.5f, 31 ), Var1 ); // 31 - exp_sidNoiseEst0 - 1 + 31 - 31 + Var1 = L_add( L_shr( sts[0]->hFdCngDec->hFdCngCom->sidNoiseEst[p], 1 ), L_shr( sts[1]->hFdCngDec->hFdCngCom->sidNoiseEst[p], 1 ) ); // exp_sidNoiseEst0 - 1 + sts[0]->hFdCngDec->hFdCngCom->sidNoiseEst[p] = Mpy_32_32( ONE_IN_Q30, Var1 ); // 31 - exp_sidNoiseEst0 - 1 + 31 - 31 + move32(); } } @@ -1190,25 +1278,34 @@ void updateBuffersForDmxMdctStereo_fx( IF( LE_32( hCPE->last_element_brate, IVAS_SID_5k2 ) ) { delta = 1; + move16(); IF( EQ_16( output_frame, L_FRAME16k ) ) { delta = 2; + move16(); } ELSE IF( EQ_16( output_frame, L_FRAME32k ) ) { delta = 4; + move16(); } ELSE IF( EQ_16( output_frame, L_FRAME48k ) ) { delta = 6; + move16(); } delay_buf_out_len = i_mult( delta, HQ_DELAY_COMP ); tcxltp_mem_in_len = NS2SA_fx2( sts[0]->output_Fs, TCXLTP_DELAY_NS ); + move16(); assert( delay_buf_out_len > tcxltp_mem_in_len ); Word16 sum_tcx_ltp = 0, sum_delay_buf = 0, sum_tcx_ltp_out = 0, sum_old_out = 0; + move16(); + move16(); + move16(); + move16(); Copy_Scale_sig_32_16( &sts[0]->hTcxLtpDec->tcxltp_mem_in_32[0], &sts[0]->hTcxLtpDec->tcxltp_mem_in[0], TCXLTP_MAX_DELAY, -11 ); Copy_Scale_sig_32_16( &sts[1]->hTcxLtpDec->tcxltp_mem_in_32[0], &sts[1]->hTcxLtpDec->tcxltp_mem_in[0], TCXLTP_MAX_DELAY, -11 ); @@ -1216,11 +1313,15 @@ void updateBuffersForDmxMdctStereo_fx( Copy_Scale_sig_32_16( &sts[0]->hTcxLtpDec->tcxltp_mem_out_32[0], &sts[0]->hTcxLtpDec->tcxltp_mem_out[0], L_FRAME48k, -11 ); Copy_Scale_sig_32_16( &sts[1]->hTcxLtpDec->tcxltp_mem_out_32[0], &sts[1]->hTcxLtpDec->tcxltp_mem_out[0], L_FRAME48k, -11 ); - sts[0]->hTcxLtpDec->exp_tcxltp_mem_in = 15 - norm_arr( sts[0]->hTcxLtpDec->tcxltp_mem_in, TCXLTP_MAX_DELAY ); - sts[1]->hTcxLtpDec->exp_tcxltp_mem_in = 15 - norm_arr( sts[1]->hTcxLtpDec->tcxltp_mem_in, TCXLTP_MAX_DELAY ); + sts[0]->hTcxLtpDec->exp_tcxltp_mem_in = sub( 15, norm_arr( sts[0]->hTcxLtpDec->tcxltp_mem_in, TCXLTP_MAX_DELAY ) ); + move16(); + sts[1]->hTcxLtpDec->exp_tcxltp_mem_in = sub( 15, norm_arr( sts[1]->hTcxLtpDec->tcxltp_mem_in, TCXLTP_MAX_DELAY ) ); + move16(); - sts[0]->hTcxLtpDec->exp_tcxltp_mem_out = 15 - norm_arr( sts[0]->hTcxLtpDec->tcxltp_mem_out, L_FRAME48k ); - sts[1]->hTcxLtpDec->exp_tcxltp_mem_out = 15 - norm_arr( sts[1]->hTcxLtpDec->tcxltp_mem_out, L_FRAME48k ); + sts[0]->hTcxLtpDec->exp_tcxltp_mem_out = sub( 15, norm_arr( sts[0]->hTcxLtpDec->tcxltp_mem_out, L_FRAME48k ) ); + move16(); + sts[1]->hTcxLtpDec->exp_tcxltp_mem_out = sub( 15, norm_arr( sts[1]->hTcxLtpDec->tcxltp_mem_out, L_FRAME48k ) ); + move16(); Scale_sig( &sts[0]->hTcxLtpDec->tcxltp_mem_in[0], TCXLTP_MAX_DELAY, sub( 15, sts[0]->hTcxLtpDec->exp_tcxltp_mem_in ) ); @@ -1243,15 +1344,19 @@ void updateBuffersForDmxMdctStereo_fx( { sum_tcx_ltp = add( shr( sts[0]->hTcxLtpDec->tcxltp_mem_in[i], 1 ), shr( sts[1]->hTcxLtpDec->tcxltp_mem_in[i], 1 ) ); // exp_tcxltp_mem_in + 1 sts[0]->hTcxLtpDec->tcxltp_mem_in[i] = mult( INV_SQRT2_FX_Q15, sum_tcx_ltp ); // 14 - exp_tcxltp_mem_in - 1 + move16(); sum_delay_buf = add( sts[0]->delay_buf_out_fx[i], sts[1]->delay_buf_out_fx[i] ); sts[0]->delay_buf_out_fx[i] = mult( INV_SQRT2_FX_Q15, sum_delay_buf ); // exp_delay_buf_sum + move16(); sum_old_out = add( shr( sts[0]->hHQ_core->old_out_fx[i], 1 ), shr( sts[1]->hHQ_core->old_out_fx[i], 1 ) ); sts[0]->hHQ_core->old_out_fx[i] = mult( INV_SQRT2_FX_Q15, sum_old_out ); // exp_old_out_sum + move16(); sum_tcx_ltp_out = add( shr( sts[0]->hTcxLtpDec->tcxltp_mem_out[i], 1 ), shr( sts[1]->hTcxLtpDec->tcxltp_mem_out[i], 1 ) ); sts[0]->hTcxLtpDec->tcxltp_mem_out[i] = mult( INV_SQRT2_FX_Q15, sum_tcx_ltp_out ); // exp_tcs_ltp_out_sm + move16(); } @@ -1259,25 +1364,33 @@ void updateBuffersForDmxMdctStereo_fx( { sum_delay_buf = add( sts[0]->delay_buf_out_fx[i], sts[1]->delay_buf_out_fx[i] ); sts[0]->delay_buf_out_fx[i] = mult( INV_SQRT2_FX_Q15, sum_delay_buf ); // exp_delay_buf_sum + move16(); sum_old_out = add( shr( sts[0]->hHQ_core->old_out_fx[i], 1 ), shr( sts[1]->hHQ_core->old_out_fx[i], 1 ) ); sts[0]->hHQ_core->old_out_fx[i] = mult( INV_SQRT2_FX_Q15, sum_old_out ); + move16(); sum_tcx_ltp_out = add( shr( sts[0]->hTcxLtpDec->tcxltp_mem_out[i], 1 ), shr( sts[1]->hTcxLtpDec->tcxltp_mem_out[i], 1 ) ); sts[0]->hTcxLtpDec->tcxltp_mem_out[i] = mult( INV_SQRT2_FX_Q15, sum_tcx_ltp_out ); // exp_tcs_ltp_out_sm + move16(); } FOR( ; i < output_frame; i++ ) { sum_old_out = add( shr( sts[0]->hHQ_core->old_out_fx[i], 1 ), shr( sts[1]->hHQ_core->old_out_fx[i], 1 ) ); sts[0]->hHQ_core->old_out_fx[i] = mult( INV_SQRT2_FX_Q15, sum_old_out ); // exp_old_out_sum + move16(); sum_tcx_ltp_out = add( shr( sts[0]->hTcxLtpDec->tcxltp_mem_out[i], 1 ), shr( sts[1]->hTcxLtpDec->tcxltp_mem_out[i], 1 ) ); sts[0]->hTcxLtpDec->tcxltp_mem_out[i] = mult( INV_SQRT2_FX_Q15, sum_tcx_ltp_out ); // 15 + exp_tcs_ltp_out_sm - 15 + move16(); } sts[0]->hTcxLtpDec->exp_tcxltp_mem_in = add( sts[0]->hTcxLtpDec->exp_tcxltp_mem_in, 1 ); + move16(); sts[0]->hHQ_core->exp_old_out = add( sts[0]->hHQ_core->exp_old_out, 1 ); + move16(); sts[0]->hTcxLtpDec->exp_tcxltp_mem_out = add( sts[0]->hTcxLtpDec->exp_tcxltp_mem_out, 1 ); + move16(); Copy_Scale_sig_16_32( &sts[0]->hTcxLtpDec->tcxltp_mem_in[0], &sts[0]->hTcxLtpDec->tcxltp_mem_in_32[0], TCXLTP_MAX_DELAY, sub( 11, sub( 15, sts[0]->hTcxLtpDec->exp_tcxltp_mem_in ) ) ); Copy_Scale_sig_16_32( &sts[0]->hTcxLtpDec->tcxltp_mem_out[0], &sts[0]->hTcxLtpDec->tcxltp_mem_out_32[0], TCXLTP_MAX_DELAY, sub( 11, sub( 15, sts[0]->hTcxLtpDec->exp_tcxltp_mem_out ) ) ); @@ -1445,6 +1558,7 @@ void applyDmxMdctStereo_fx( IF( LE_32( hCPE->last_element_brate, IVAS_SID_5k2 ) ) { crossfade_len = NS2SA( hCPE->hCoreCoder[0]->output_Fs, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ); + move16(); SWITCH( hCPE->hCoreCoder[0]->output_Fs ) { case 48000: @@ -1491,6 +1605,7 @@ void applyDmxMdctStereo_fx( ELSE IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && LE_32( hCPE->last_element_brate, IVAS_32k ) ) { crossfade_len = NS2SA( hCPE->hCoreCoder[0]->output_Fs, DELAY_CLDFB_NS ); + move16(); SWITCH( hCPE->hCoreCoder[0]->output_Fs ) { case 48000: diff --git a/lib_dec/ivas_stereo_switching_dec.c b/lib_dec/ivas_stereo_switching_dec.c index 514d5c520..232675e4b 100644 --- a/lib_dec/ivas_stereo_switching_dec.c +++ b/lib_dec/ivas_stereo_switching_dec.c @@ -384,7 +384,7 @@ static ivas_error allocate_CoreCoder_fx( IF( st->cldfbAna == NULL ) { /* open analysis for max. sampling rate 48kHz */ - IF( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) { return error; } @@ -393,7 +393,7 @@ static ivas_error allocate_CoreCoder_fx( IF( st->cldfbBPF == NULL ) { /* open analysis BPF for max. internal sampling rate 16kHz */ - IF( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) { return error; } @@ -590,12 +590,12 @@ static void cpy_tcx_ltp_data_fx( move16(); /* (int16_t) ( ( TCXLTP_MAX_DELAY * output_Fs ) / 48000 ) */ sz = extract_l( Mpy_32_32_r( TCXLTP_MAX_DELAY * output_Fs, 44739 /* 1 / 48000 in Q31 */ ) ); - mvs2s( hTcxLtpDecOld->tcxltp_mem_in, hTcxLtpDecNew->tcxltp_mem_in, sz ); // TODO: One of these will be removed later - mvl2l( hTcxLtpDecOld->tcxltp_mem_in_32, hTcxLtpDecNew->tcxltp_mem_in_32, sz ); + Copy( hTcxLtpDecOld->tcxltp_mem_in, hTcxLtpDecNew->tcxltp_mem_in, sz ); // TODO: One of these will be removed later + Copy32( hTcxLtpDecOld->tcxltp_mem_in_32, hTcxLtpDecNew->tcxltp_mem_in_32, sz ); /* (int16_t) ( ( L_FRAME48k * output_Fs ) / 48000 ) */ sz = extract_l( Mpy_32_32_r( L_FRAME48k * output_Fs, 44739 /* 1 / 48000 in Q31 */ ) ); - mvs2s( hTcxLtpDecOld->tcxltp_mem_out, hTcxLtpDecNew->tcxltp_mem_out, sz ); // TODO: One of these will be removed later - mvl2l( hTcxLtpDecOld->tcxltp_mem_out_32, hTcxLtpDecNew->tcxltp_mem_out_32, sz ); + Copy( hTcxLtpDecOld->tcxltp_mem_out, hTcxLtpDecNew->tcxltp_mem_out, sz ); // TODO: One of these will be removed later + Copy32( hTcxLtpDecOld->tcxltp_mem_out_32, hTcxLtpDecNew->tcxltp_mem_out_32, sz ); return; } @@ -1296,6 +1296,8 @@ ivas_error stereo_memory_dec_fx( *---------------------------------------------------------------*/ /* handling of DFT->TD switching */ + test(); + test(); IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) || EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) ) { delay_comp_DFT = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); @@ -1308,20 +1310,22 @@ ivas_error stereo_memory_dec_fx( { div_m = BASOP_Util_Divide3216_Scale( hCPE->output_mem_fx[n][sub( i, delay_comp_DFT )], hCPE->hStereoDft->win32ms_fx[i_mult( STEREO_DFT32MS_STEP, ( sub( add( sub( hCPE->hStereoDft->dft32ms_ovl, 1 ), delay_comp_DFT ), i ) ) )], &div_e ); hCPE->output_mem_fx[n][sub( i, delay_comp_DFT )] = L_shl( div_m, add( div_e, 16 ) ); + move32(); // hCPE->output_mem_fx[n][sub(i, delay_comp_DFT)] = hCPE->hStereoDft->win32ms_fx[i_mult(STEREO_DFT32MS_STEP, ( sub(add(sub(hCPE->hStereoDft->dft32ms_ovl, 1), delay_comp_DFT), i) ))]; } } - IF( NE_16( hCPE->hCoreCoder[0]->last_core, ACELP_CORE ) ) + IF( hCPE->hCoreCoder[0]->last_core != ACELP_CORE ) { - mvl2l( hCPE->hStereoDft->buff_LBTCX_mem_fx, hCPE->input_mem_LB_fx[0], NS2SA( i_mult( hCPE->hCoreCoder[0]->last_L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) ); + Copy32( hCPE->hStereoDft->buff_LBTCX_mem_fx, hCPE->input_mem_LB_fx[0], NS2SA( i_mult( hCPE->hCoreCoder[0]->last_L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) ); } } + test(); IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { - v_add_32( hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, hCPE->hCoreCoder[1]->hHQ_core->oldOut_fx, hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, (int16_t) ( output_Fs / FRAMES_PER_SEC ) ); - v_multc_fixed_16( hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, 16384 /* 0.5 in Q15 */, hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, (int16_t) ( output_Fs / FRAMES_PER_SEC ) ); + v_add_32( hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, hCPE->hCoreCoder[1]->hHQ_core->oldOut_fx, hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, extract_l( Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ) ) ); + v_multc_fixed_16( hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, 16384 /* 0.5 in Q15 */, hCPE->hCoreCoder[0]->hHQ_core->oldOut_fx, extract_l( Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ) ) ); v_add_32( hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, hCPE->hCoreCoder[1]->hHQ_core->old_outLB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, L_FRAME32k ); v_multc_fixed_16( hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, 16384, hCPE->hCoreCoder[0]->hHQ_core->old_outLB_fx, L_FRAME32k ); @@ -1356,7 +1360,7 @@ ivas_error stereo_memory_dec_fx( deallocate_CoreCoder_fx( hCPE->hCoreCoder[1] ); /* allocate DFT stereo data structure */ - IF( NE_16( ( error = stereo_dft_dec_create_fx( &( hCPE->hStereoDft ), hCPE->element_brate, output_Fs, 0, nchan_transport ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = stereo_dft_dec_create_fx( &( hCPE->hStereoDft ), hCPE->element_brate, output_Fs, 0, nchan_transport ) ), IVAS_ERR_OK ) ) { return error; } @@ -1368,7 +1372,7 @@ ivas_error stereo_memory_dec_fx( } /* memory update - needed in TD stereo, TCX/HQ frame -> DFT stereo, ACELP frame switching */ - mvl2l( hCPE->input_mem_LB_fx[0], hCPE->hStereoDft->buff_LBTCX_mem_fx, NS2SA( s_min( hCPE->hCoreCoder[0]->last_L_frame * FRAMES_PER_SEC, 16000 ), STEREO_DFT32MS_OVL_NS ) ); + Copy32( hCPE->input_mem_LB_fx[0], hCPE->hStereoDft->buff_LBTCX_mem_fx, NS2SA( s_min( i_mult( hCPE->hCoreCoder[0]->last_L_frame, FRAMES_PER_SEC ), 16000 ), STEREO_DFT32MS_OVL_NS ) ); /* allocate ICBWE structure */ IF( hCPE->hStereoICBWE == NULL ) @@ -1449,7 +1453,7 @@ ivas_error stereo_memory_dec_fx( stereo_td_init_dec_fx( hCPE->hStereoTD, hCPE->last_element_mode ); /* allocate CoreCoder secondary channel */ - IF( NE_16( ( error = allocate_CoreCoder_fx( hCPE->hCoreCoder[1] ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = allocate_CoreCoder_fx( hCPE->hCoreCoder[1] ) ), IVAS_ERR_OK ) ) { return error; } @@ -1459,6 +1463,8 @@ ivas_error stereo_memory_dec_fx( * allocate DFT/TD stereo structures after MDCT stereo frame *---------------------------------------------------------------*/ + test(); + test(); IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) && ( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) || EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) ) { /* deallocated TCX-LTP for second channel */ @@ -1473,11 +1479,11 @@ ivas_error stereo_memory_dec_fx( { /* re-use an existing buffer for MDCT->TD stereo switching */ Word16 nZeros, len; - nZeros = (Word16) ( NS2SA( st->output_Fs, N_ZERO_MDCT_NS ) ); + nZeros = extract_l( NS2SA( st->output_Fs, N_ZERO_MDCT_NS ) ); move16(); len = NS2SA( st->output_Fs, 3000000 ); move16(); - mvl2l( st->hHQ_core->oldOut_fx + nZeros, hCPE->output_mem_fx[1], len ); + Copy32( st->hHQ_core->oldOut_fx + nZeros, hCPE->output_mem_fx[1], len ); } /* deallocated HQ-core for second channel */ @@ -1488,6 +1494,7 @@ ivas_error stereo_memory_dec_fx( } /* allocate DFT stereo mono DMX data structure */ + test(); IF( EQ_16( hCPE->nchan_out, 1 ) && hCPE->hStereoDftDmx == NULL ) { IF( ( hCPE->hStereoDftDmx = (STEREO_DFT_DMX_DATA_HANDLE) malloc( sizeof( STEREO_DFT_DMX_DATA ) ) ) == NULL ) @@ -1499,6 +1506,7 @@ ivas_error stereo_memory_dec_fx( } /* allocate TCA data structure */ + test(); IF( NE_16( hCPE->nchan_out, 1 ) && hCPE->hStereoTCA == NULL ) { IF( ( hCPE->hStereoTCA = (STEREO_TCA_DEC_HANDLE) malloc( sizeof( STEREO_TCA_DEC_DATA ) ) ) == NULL ) @@ -1512,7 +1520,7 @@ ivas_error stereo_memory_dec_fx( st = hCPE->hCoreCoder[0]; /* allocate primary channel substructures */ - IF( NE_16( ( error = allocate_CoreCoder_fx( st ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = allocate_CoreCoder_fx( st ) ), IVAS_ERR_OK ) ) { return error; } @@ -1528,9 +1536,13 @@ ivas_error stereo_memory_dec_fx( td_bwe_dec_init_ivas_fx( st, st->hBWE_TD, st->output_Fs ); st->prev_Q_bwe_exc = 31; + move16(); st->prev_Qx = 0; + move16(); st->prev_ener_fx_Q = 31; + move16(); st->prev_frame_pow_exp = 0; + move16(); IF( ( st->hBWE_FD = (FD_BWE_DEC_HANDLE) malloc( sizeof( FD_BWE_DEC_DATA ) ) ) == NULL ) { @@ -1549,15 +1561,18 @@ ivas_error stereo_memory_dec_fx( #endif fd_bwe_dec_init( st, st->hBWE_FD ); st->hBWE_FD->old_wtda_swb_fx_exp = 0; + move16(); st->hBWE_FD->mem_imdct_exp_fx = 0; + move16(); st->prev_Q_synth = 0; + move16(); } /* Allocated FD_CNG instance for primary channel*/ IF( st->hFdCngDec == NULL ) { /* Create FD_CNG instance */ - IF( ( error = createFdCngDec_fx( &st->hFdCngDec ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = createFdCngDec_fx( &st->hFdCngDec ) ), IVAS_ERR_OK ) ) { return error; } @@ -1589,7 +1604,7 @@ ivas_error stereo_memory_dec_fx( IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_TD ) ) { - mvl2l( hCPE->hStereoTD->TCX_old_syn_Overl_fx, tmpF_buff, L_FRAME16k / 2 ); + Copy32( hCPE->hStereoTD->TCX_old_syn_Overl_fx, tmpF_buff, L_FRAME16k / 2 ); } IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) @@ -1647,7 +1662,7 @@ ivas_error stereo_memory_dec_fx( IF( st->cldfbAna == NULL ) { - IF( NE_16( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) { return error; } @@ -1656,14 +1671,14 @@ ivas_error stereo_memory_dec_fx( IF( st->cldfbBPF == NULL ) { /* open analysis BPF for max. internal sampling rate 16kHz */ - IF( NE_16( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) { return error; } } /* allocate Fd-Cng structure for second channel */ - IF( NE_16( ( error = createFdCngDec_fx( &st->hFdCngDec ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = createFdCngDec_fx( &st->hFdCngDec ) ), IVAS_ERR_OK ) ) { return error; } @@ -1674,13 +1689,14 @@ ivas_error stereo_memory_dec_fx( initFdCngDec( st ); #endif - IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) + if ( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) { st->last_core = ACELP_CORE; /* needed to set-up TCX core in SetTCXModeInfo() */ + move16(); } /*Allocate CoreCoder TCX modules for second channel */ - IF( NE_16( ( error = allocate_CoreCoder_TCX_fx( hCPE->hCoreCoder[1] ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = allocate_CoreCoder_TCX_fx( hCPE->hCoreCoder[1] ) ), IVAS_ERR_OK ) ) { return error; } @@ -1699,7 +1715,7 @@ ivas_error stereo_memory_dec_fx( IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_TD ) ) { - mvl2l( tmpF_buff, st->hTcxDec->old_syn_Overl_32, L_FRAME16k / 2 ); + Copy32( tmpF_buff, st->hTcxDec->old_syn_Overl_32, L_FRAME16k / 2 ); Copy_Scale_sig32_16( st->hTcxDec->old_syn_Overl_32, st->hTcxDec->old_syn_Overl, L_FRAME16k / 2, add( st->Q_syn, 5 ) ); //(st->Qsyn - (11 - 16)) } @@ -1742,12 +1758,13 @@ ivas_error stereo_memory_dec_fx( IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) { - IF( EQ_16( hCPE->hCoreCoder[0]->bfi, 0 ) ) + IF( hCPE->hCoreCoder[0]->bfi == 0 ) { st = hCPE->hCoreCoder[1]; - hCPE->hStereoTD->tdm_LRTD_flag = get_indice_st( hCPE->hCoreCoder[0], hCPE->element_brate + hCPE->brate_surplus, (int16_t) ( ( hCPE->element_brate / FRAMES_PER_SEC ) - nb_bits_metadata + ( hCPE->brate_surplus / FRAMES_PER_SEC ) - TDM_SECONDARY_SIGNALLING - TDM_RATIO_BITS - TDM_LP_REUSE_BITS - TDM_LR_CONTENT_BITS ), TDM_LR_CONTENT_BITS ); + hCPE->hStereoTD->tdm_LRTD_flag = get_indice_st( hCPE->hCoreCoder[0], L_add( hCPE->element_brate, hCPE->brate_surplus ), ( sub( add( sub( extract_l( Mpy_32_16_1( hCPE->element_brate, INV_FRAME_PER_SEC_Q15 ) ), nb_bits_metadata ), extract_l( Mpy_32_16_1( hCPE->brate_surplus, INV_FRAME_PER_SEC_Q15 ) ) ), ( TDM_SECONDARY_SIGNALLING + TDM_RATIO_BITS + TDM_LP_REUSE_BITS + TDM_LR_CONTENT_BITS ) ) ), TDM_LR_CONTENT_BITS ); + move16(); - IF( NE_16( hCPE->hStereoTD->tdm_LRTD_flag, 0 ) ) + IF( hCPE->hStereoTD->tdm_LRTD_flag != 0 ) { /* deallocate ICBWE structure */ IF( hCPE->hStereoICBWE != NULL ) @@ -1767,9 +1784,13 @@ ivas_error stereo_memory_dec_fx( td_bwe_dec_init_ivas_fx( st, st->hBWE_TD, st->output_Fs ); st->prev_Q_bwe_exc = 31; + move16(); st->prev_Qx = 0; + move16(); st->prev_ener_fx_Q = 31; + move16(); st->prev_frame_pow_exp = 0; + move16(); IF( ( st->hBWE_FD = (FD_BWE_DEC_HANDLE) malloc( sizeof( FD_BWE_DEC_DATA ) ) ) == NULL ) { @@ -1788,8 +1809,11 @@ ivas_error stereo_memory_dec_fx( #endif fd_bwe_dec_init( st, st->hBWE_FD ); st->hBWE_FD->old_wtda_swb_fx_exp = 0; + move16(); st->hBWE_FD->mem_imdct_exp_fx = 0; + move16(); st->prev_Q_synth = 0; + move16(); } } ELSE /* tdm_LRTD_flag == 0 */ @@ -1828,11 +1852,13 @@ ivas_error stereo_memory_dec_fx( * MDCT stereo bitrate switching *---------------------------------------------------------------*/ + test(); IF( EQ_16( ivas_format, STEREO_FORMAT ) && EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) { + test(); IF( LE_32( hCPE->element_brate, MAX_MDCT_ITD_BRATE ) && GT_32( ivas_total_brate, IVAS_SID_5k2 ) ) { - IF( EQ_16( hCPE->hStereoMdct->use_itd, 0 ) ) + IF( hCPE->hStereoMdct->use_itd == 0 ) { IF( hCPE->hStereoTCA == NULL ) { @@ -1852,14 +1878,17 @@ ivas_error stereo_memory_dec_fx( ELSE { /* de-allocate TCA data structure */ - IF( hCPE->hStereoMdct->use_itd == 1 && ivas_total_brate > IVAS_SID_5k2 && hCPE->hStereoTCA != NULL ) + test(); + test(); + test(); + IF( EQ_16( hCPE->hStereoMdct->use_itd, 1 ) && GT_32( ivas_total_brate, IVAS_SID_5k2 ) && hCPE->hStereoTCA != NULL ) { free( hCPE->hStereoTCA ); hCPE->hStereoTCA = NULL; hCPE->hStereoMdct->use_itd = 0; move16(); } - ELSE IF( hCPE->hStereoMdct->use_itd == 1 && ivas_total_brate <= IVAS_SID_5k2 ) + ELSE IF( EQ_16( hCPE->hStereoMdct->use_itd, 1 ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) { hCPE->hStereoMdct->itd_fx = 0; move32(); @@ -1876,6 +1905,8 @@ ivas_error stereo_memory_dec_fx( * Bitrate switching in MASA format *---------------------------------------------------------------*/ + test(); + test(); IF( ( EQ_16( ivas_format, MASA_FORMAT ) || EQ_16( ivas_format, MASA_ISM_FORMAT ) ) && EQ_16( nchan_transport, 2 ) ) { IF( EQ_16( hCPE->nchan_out, 1 ) ) @@ -1962,8 +1993,10 @@ ivas_error stereo_memory_dec_fx( * Bitrate switching in MASA format *---------------------------------------------------------------*/ + test(); IF( EQ_16( ivas_format, MC_FORMAT ) && EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) { + test(); IF( EQ_16( mc_mode, MC_MODE_MCT ) || EQ_16( mc_mode, MC_MODE_PARAMUPMIX ) ) { /* deallocate the FdCNG handle */ @@ -1979,7 +2012,7 @@ ivas_error stereo_memory_dec_fx( { IF( hCPE->hCoreCoder[i]->cldfbSyn == NULL ) /* could be NULL when we had the MCT LFE channel */ { - IF( NE_16( ( error = openCldfb_ivas_fx( &hCPE->hCoreCoder[i]->cldfbSyn, CLDFB_SYNTHESIS, hCPE->hCoreCoder[i]->output_Fs, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &hCPE->hCoreCoder[i]->cldfbSyn, CLDFB_SYNTHESIS, hCPE->hCoreCoder[i]->output_Fs, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) { return error; } @@ -1987,7 +2020,7 @@ ivas_error stereo_memory_dec_fx( IF( hCPE->hCoreCoder[i]->hFdCngDec == NULL ) { - IF( NE_16( ( error = createFdCngDec_fx( &hCPE->hCoreCoder[i]->hFdCngDec ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = createFdCngDec_fx( &hCPE->hCoreCoder[i]->hFdCngDec ) ), IVAS_ERR_OK ) ) { return error; } @@ -2388,34 +2421,55 @@ void synchro_synthesis_fx( Word16 dft_mono_brate_switch; Word16 delay_diff; Word32 tmpF_fx = 0; + move32(); Word16 nChannels; sts = hCPE->hCoreCoder; output_Fs = sts[0]->output_Fs; use_cldfb_for_last_dft = 0; - IF( ( hCPE->element_mode != IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->last_element_brate <= IVAS_24k4 ) /* note: this is to mimic the DFT stereo condition "hCPE->hStereoDft->hConfig->res_cod_mode == 0" in last frame */ - || ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ) + move16(); + + test(); + test(); + test(); + test(); + test(); + if ( ( NE_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && LE_32( hCPE->last_element_brate, IVAS_24k4 ) ) /* note: this is to mimic the DFT stereo condition "hCPE->hStereoDft->hConfig->res_cod_mode == 0" in last frame */ + || ( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) ) { use_cldfb_for_last_dft = 1; + move16(); } dft_mono_brate_switch = 0; - IF( hCPE->element_mode == IVAS_CPE_DFT && ( hCPE->last_element_mode == IVAS_CPE_DFT || hCPE->last_element_mode == IVAS_CPE_MDCT ) && hCPE->nchan_out == 1 && hCPE->element_brate != hCPE->last_element_brate ) + move16(); + test(); + test(); + test(); + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && ( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) || EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) ) && EQ_16( hCPE->nchan_out, 1 ) && NE_32( hCPE->element_brate, hCPE->last_element_brate ) ) { - IF( hCPE->last_element_brate >= IVAS_32k && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) + test(); + test(); + IF( GE_32( hCPE->last_element_brate, IVAS_32k ) && EQ_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) { dft_mono_brate_switch = -1; /* switch from residual coding mode or MDCT Stereo */ + move16(); } - ELSE IF( hCPE->last_element_brate <= IVAS_24k4 && hCPE->hStereoDft->hConfig->res_cod_mode > STEREO_DFT_RES_COD_OFF ) + ELSE IF( LE_32( hCPE->last_element_brate, IVAS_24k4 ) && GT_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) { dft_mono_brate_switch = 1; /* switch to residual coding mode*/ + move16(); } } IF( use_cldfb_for_last_dft ) { - IF( hCPE->element_mode == IVAS_CPE_DFT && hCPE->last_element_mode == IVAS_CPE_TD && ( ivas_total_brate > IVAS_SID_5k2 || hCPE->nchan_out == 2 ) ) + test(); + test(); + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->last_element_mode, IVAS_CPE_TD ) && ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) || EQ_16( hCPE->nchan_out, 2 ) ) ) { stereo_tca_scale_R_channel_fx( hCPE, output_fx[0], output_frame ); } @@ -2423,14 +2477,18 @@ void synchro_synthesis_fx( /* set delays */ delay_comp_DFT = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); + move16(); delay_comp_TD = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ); - delay_diff = delay_comp_TD - delay_comp_DFT; + move16(); + delay_diff = sub( delay_comp_TD, delay_comp_DFT ); - dft32ms_ovl = (Word16) ( ( STEREO_DFT32MS_OVL_MAX * output_Fs ) / 48000 ); + dft32ms_ovl = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 ) ); delay_cldfb = NS2SA( output_Fs, DELAY_CLDFB_NS ); + move16(); /* initialize pointers */ - IF( hCPE->element_mode >= IVAS_CPE_DFT && hCPE->output_mem_fx[0] != NULL ) + test(); + IF( GE_16( hCPE->element_mode, IVAS_CPE_DFT ) && hCPE->output_mem_fx[0] != NULL ) { FOR( n = 0; n < CPE_CHANNELS; n++ ) { @@ -2442,28 +2500,33 @@ void synchro_synthesis_fx( * DFT stereo synchro *----------------------------------------------------------------*/ - IF( hCPE->element_mode == IVAS_CPE_DFT || sba_dirac_stereo_flag ) + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) || sba_dirac_stereo_flag ) { /* handling of bitrate switching from residual (using DFT) to non-residual mode (using CLDFB) FOR mono output - as in DFT->TD switching */ - IF( dft_mono_brate_switch == -1 ) + IF( EQ_16( dft_mono_brate_switch, -1 ) ) { FOR( i = delay_comp_DFT; i < delay_comp_TD; i++ ) { - sts[0]->prev_synth_buffer32_fx[i] = p_output_mem_fx[0][i - delay_comp_DFT]; + sts[0]->prev_synth_buffer32_fx[i] = p_output_mem_fx[0][sub( i, delay_comp_DFT )]; + move32(); } - FOR( i = delay_comp_TD; i < delay_comp_TD + delay_cldfb; i++ ) + FOR( i = delay_comp_TD; i < add( delay_comp_TD, delay_cldfb ); i++ ) { - tmp_out_fx[0][i - delay_comp_TD] = p_output_mem_fx[0][i - delay_comp_DFT]; + tmp_out_fx[0][sub( i, delay_comp_TD )] = p_output_mem_fx[0][sub( i, delay_comp_DFT )]; + move32(); } } - IF( hCPE->nchan_out == 1 && hCPE->last_element_mode == IVAS_CPE_MDCT ) + test(); + IF( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) ) { FOR( Word32 ind = 0; ind < delay_comp_DFT; ind++ ) { - Word32 temp = sts[0]->prev_synth_buffer32_fx[ind] + sts[1]->prev_synth_buffer32_fx[ind]; + Word32 temp = L_add( sts[0]->prev_synth_buffer32_fx[ind], sts[1]->prev_synth_buffer32_fx[ind] ); sts[0]->prev_synth_buffer32_fx[ind] = Mpy_32_32( temp, INV_SQRT2_FX ); + move32(); } } @@ -2474,7 +2537,7 @@ void synchro_synthesis_fx( delay_signal_fx( output_fx[0], output_frame, hCPE->hCoreCoder[0]->hTcxDec->FBTCXdelayBuf_32, delay_diff ); } - IF( hCPE->element_mode != IVAS_CPE_MDCT ) + IF( NE_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) { ivas_post_proc_fx( NULL, hCPE, 0, output_fx[0], output_fx, output_frame, sba_dirac_stereo_flag ); } @@ -2491,9 +2554,10 @@ void synchro_synthesis_fx( delay_signal_fx( output_fx[n], output_frame, sts[n]->prev_synth_buffer32_fx, delay_comp_DFT ); } } - IF( sba_dirac_stereo_flag ) + if ( sba_dirac_stereo_flag ) { hCPE->q_prev_synth_fx = hCPE->hStereoDft->q_dft; + move16(); } IF( use_cldfb_for_last_dft ) { @@ -2503,20 +2567,27 @@ void synchro_synthesis_fx( /* handling of TD->DFT switching */ FOR( n = 0; n < hCPE->nchan_out; n++ ) { - IF( ( hCPE->last_element_mode != IVAS_CPE_DFT && !sba_dirac_stereo_flag && dft_mono_brate_switch != -1 ) || dft_mono_brate_switch == 1 ) + test(); + test(); + test(); + IF( ( NE_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && !sba_dirac_stereo_flag && NE_16( dft_mono_brate_switch, -1 ) ) || EQ_16( dft_mono_brate_switch, 1 ) ) { Word32 *pPrev_synth_fx; Word32 inv_fade_len_fx = 0; + move32(); SWITCH( output_Fs ) { case 16000: inv_fade_len_fx = 71582792; + move32(); BREAK; case 32000: inv_fade_len_fx = 35791396; + move32(); BREAK; case 48000: inv_fade_len_fx = 23860930; + move32(); BREAK; default: assert( 0 ); @@ -2526,63 +2597,79 @@ void synchro_synthesis_fx( IF( sba_dirac_stereo_flag ) { pPrev_synth_fx = hCPE->prev_synth_fx[n]; + move32(); } ELSE { pPrev_synth_fx = sts[n]->prev_synth_buffer32_fx; + move32(); } - IF( hCPE->last_element_mode != IVAS_CPE_MDCT ) + IF( NE_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) ) { FOR( i = delay_comp_DFT; i < delay_comp_TD; i++ ) { - Word64 res1 = (Word64) pPrev_synth_fx[i] * ( delay_comp_TD - i ); - Word64 res2 = (Word64) output_fx[n][i] * ( i - delay_comp_DFT ); - Word64 res = W_shr( res1, 6 ) + W_shr( res2, 6 ); + Word64 res1 = W_mult0_32_32( pPrev_synth_fx[i], ( sub( delay_comp_TD, i ) ) ); + Word64 res2 = W_mult0_32_32( output_fx[n][i], ( sub( i, delay_comp_DFT ) ) ); + Word64 res = W_add( W_shr( res1, 6 ), W_shr( res2, 6 ) ); res = res * inv_fade_len_fx; - output_fx[n][i] = (Word32) W_shr( res, 31 - 6 ); + move64(); + output_fx[n][i] = W_extract_l( W_shr( res, 31 - 6 ) ); + move32(); // change 6 to less number to get better precision } } } - ELSE IF( dft_mono_brate_switch == -1 ) + ELSE IF( EQ_16( dft_mono_brate_switch, -1 ) ) { Word32 inv_fade_len_1_fx = 0; + move32(); Word32 inv_fade_len_2_fx = 0; + move32(); SWITCH( output_Fs ) { case 16000: inv_fade_len_1_fx = 71582792; + move32(); inv_fade_len_2_fx = 107374184; + move32(); BREAK; case 32000: inv_fade_len_1_fx = 35791396; + move32(); inv_fade_len_2_fx = 53687092; + move32(); BREAK; case 48000: inv_fade_len_1_fx = 23860930; + move32(); inv_fade_len_2_fx = 35791396; + move32(); BREAK; default: assert( 0 ); } FOR( i = 0; i < delay_diff; i++ ) { - Word64 res1 = (Word64) output_fx[0][i + delay_comp_DFT] * ( delay_diff - i ); - Word64 res2 = (Word64) p_output_mem_fx[0][i] * i; - Word64 res = W_shr( res1, 6 ) + W_shr( res2, 6 ); + Word64 res1 = W_mult0_32_32( output_fx[0][add( i, delay_comp_DFT )], ( sub( delay_diff, i ) ) ); + Word64 res2 = W_mult0_32_32( p_output_mem_fx[0][i], i ); + Word64 res = W_add( W_shr( res1, 6 ), W_shr( res2, 6 ) ); res = res * inv_fade_len_1_fx; - output_fx[0][i + delay_comp_DFT] = (Word32) W_shr( res, 31 - 6 ); + move64(); + output_fx[0][add( i, delay_comp_DFT )] = W_extract_l( W_shr( res, 31 - 6 ) ); + move32(); } FOR( i = 0; i < delay_cldfb; i++ ) { - Word64 res1 = (Word64) tmp_out_fx[0][i] * ( delay_cldfb - i ); - Word64 res2 = (Word64) output_fx[0][i + delay_comp_TD] * i; - Word64 res = W_shr( res1, 6 ) + W_shr( res2, 6 ); + Word64 res1 = W_mult0_32_32( tmp_out_fx[0][i], ( sub( delay_cldfb, i ) ) ); + Word64 res2 = W_mult0_32_32( output_fx[0][add( i, delay_comp_TD )], i ); + Word64 res = W_add( W_shr( res1, 6 ), W_shr( res2, 6 ) ); res = res * inv_fade_len_2_fx; - output_fx[0][i + delay_comp_TD] = (Word32) W_shr( res, 31 - 6 ); + move64(); + output_fx[0][add( i, delay_comp_TD )] = W_extract_l( W_shr( res, 31 - 6 ) ); + move32(); } } } @@ -2597,28 +2684,35 @@ void synchro_synthesis_fx( return; } - IF( hCPE->element_mode == IVAS_CPE_TD || hCPE->element_mode == IVAS_CPE_MDCT ) + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) || EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) { /* handling of DFT->TD switching */ - IF( hCPE->last_element_mode == IVAS_CPE_DFT && !use_cldfb_for_last_dft && hCPE->output_mem_fx[0] != NULL ) + test(); + test(); + IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && !use_cldfb_for_last_dft && hCPE->output_mem_fx[0] != NULL ) { /* use redressed DFT stereo OLA part to reconstruct the TD stereo synchro memory */ FOR( n = 0; n < hCPE->nchan_out; n++ ) { FOR( i = delay_comp_DFT; i < delay_comp_TD; i++ ) { - sts[n]->prev_synth_buffer32_fx[i] = p_output_mem_fx[n][i - delay_comp_DFT]; + sts[n]->prev_synth_buffer32_fx[i] = p_output_mem_fx[n][sub( i, delay_comp_DFT )]; + move32(); } - FOR( i = delay_comp_TD; i < delay_comp_TD + delay_cldfb; i++ ) + FOR( i = delay_comp_TD; i < add( delay_comp_TD, delay_cldfb ); i++ ) { - tmp_out_fx[n][i - delay_comp_TD] = p_output_mem_fx[n][i - delay_comp_DFT]; + tmp_out_fx[n][sub( i, delay_comp_TD )] = p_output_mem_fx[n][sub( i, delay_comp_DFT )]; + move32(); } } } /* IF previous frame had only one channel copy buffers to other channel */ - IF( hCPE->nchan_out == 1 && hCPE->element_mode == IVAS_CPE_MDCT && hCPE->last_element_mode == IVAS_CPE_DFT ) + test(); + test(); + IF( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) { Copy32( sts[0]->prev_synth_buffer32_fx, sts[1]->prev_synth_buffer32_fx, delay_comp_TD ); Copy32( tmp_out_fx[0], tmp_out_fx[1], delay_cldfb ); @@ -2630,11 +2724,12 @@ void synchro_synthesis_fx( *----------------------------------------------------------------*/ /* resample LB synthesis to output_Fs */ - IF( hCPE->element_mode != IVAS_CPE_MDCT && !use_cldfb_for_last_dft ) + test(); + IF( NE_16( hCPE->element_mode, IVAS_CPE_MDCT ) && !use_cldfb_for_last_dft ) { FOR( n = 0; n < hCPE->nchan_out; n++ ) { - IF( sts[n]->core == ACELP_CORE ) + IF( EQ_16( sts[n]->core, ACELP_CORE ) ) { L_lerp_fx_q11( hCPE->input_mem_LB_fx[n], tmp_out_TD_fx[n], dft32ms_ovl, NS2SA( sts[n]->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) ); } @@ -2645,12 +2740,13 @@ void synchro_synthesis_fx( /* use TCX synchro memory (perfect signal is available) */ FOR( i = delay_diff; i < dft32ms_ovl; i++ ) { - tmp_out_TD_fx[n][i] = sts[n]->delay_buf_out32_fx[i - delay_diff]; + tmp_out_TD_fx[n][i] = sts[n]->delay_buf_out32_fx[sub( i, delay_diff )]; + move32(); } } } - IF( hCPE->nchan_out == CPE_CHANNELS ) + IF( EQ_16( hCPE->nchan_out, CPE_CHANNELS ) ) { /* upmix the resampled LB / the TCX synchro memory */ tdm_upmix_plain_fx( tmp_out_TD2_fx[0], tmp_out_TD2_fx[1], tmp_out_TD_fx[0], tmp_out_TD_fx[1], tdm_ratio_tabl_fx[hCPE->hStereoTD->tdm_last_ratio_idx], tdm_den_ratio_tabl_fx[hCPE->hStereoTD->tdm_last_ratio_idx], 0, dft32ms_ovl, 1 ); @@ -2668,12 +2764,15 @@ void synchro_synthesis_fx( { case 16000: tmpF_fx = 71582792; + move32(); BREAK; case 32000: tmpF_fx = 35791396; + move32(); BREAK; case 48000: tmpF_fx = 23860930; + move32(); BREAK; default: assert( 0 ); @@ -2682,11 +2781,12 @@ void synchro_synthesis_fx( FOR( i = 0; i < delay_diff; i++ ) { - Word64 res1 = (Word64) output_fx[n][output_frame - dft32ms_ovl + delay_cldfb + i] * ( delay_diff - i ); - Word64 res2 = (Word64) tmp_out_TD2_fx[n][i] * i; - Word64 res = W_shr( res1, 6 ) + W_shr( res2, 6 ); + Word64 res1 = W_mult0_32_32( output_fx[n][add( add( sub( output_frame, dft32ms_ovl ), delay_cldfb ), i )], ( sub( delay_diff, i ) ) ); + Word64 res2 = W_mult0_32_32( tmp_out_TD2_fx[n][i], i ); + Word64 res = W_add( W_shr( res1, 6 ), W_shr( res2, 6 ) ); res = res * tmpF_fx; - p_output_mem_fx[n][i] = (Word32) W_shr( res, 31 - 6 ); + move64(); + p_output_mem_fx[n][i] = W_extract_l( W_shr( res, 31 - 6 ) ); } } ELSE /* TCX core */ @@ -2695,6 +2795,7 @@ void synchro_synthesis_fx( FOR( i = 0; i < delay_diff; i++ ) { p_output_mem_fx[n][i] = output_fx[n][output_frame - dft32ms_ovl + delay_cldfb + i]; + move32(); } } @@ -2702,6 +2803,7 @@ void synchro_synthesis_fx( FOR( i = delay_diff; i < dft32ms_ovl; i++ ) { p_output_mem_fx[n][i] = tmp_out_TD2_fx[n][i]; + move32(); } } } @@ -2711,20 +2813,28 @@ void synchro_synthesis_fx( * the upmixed TD/MDCT stereo synthesis with the DFT stereo synthesis *----------------------------------------------------------------*/ - IF( hCPE->element_mode == IVAS_CPE_TD && hCPE->stereo_switching_counter == 0 && hCPE->nchan_out == 1 && hCPE->last_element_brate <= IVAS_24k4 ) + test(); + test(); + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->stereo_switching_counter == 0 && EQ_16( hCPE->nchan_out, 1 ) && LE_32( hCPE->last_element_brate, IVAS_24k4 ) ) { Word32 step_fx = 0; + move32(); tmpF_fx = ONE_IN_Q31; + move32(); SWITCH( output_Fs ) { case 16000: step_fx = 33554432; + move32(); BREAK; case 32000: step_fx = 16777216; + move32(); BREAK; case 48000: step_fx = 11184811; + move32(); BREAK; default: assert( 0 ); @@ -2733,19 +2843,33 @@ void synchro_synthesis_fx( FOR( n = 0; n < delay_comp_TD; n++ ) { sts[0]->prev_synth_buffer32_fx[n] = Mpy_32_32( sts[0]->prev_synth_buffer32_fx[n], tmpF_fx ); + move32(); tmpF_fx = L_sub_sat( tmpF_fx, step_fx ); } } - IF( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->nchan_out == 1 && !is_DTXrate( hCPE->element_brate ) && is_DTXrate( hCPE->last_element_brate ) ) + test(); + test(); + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->nchan_out, 1 ) && !is_DTXrate( hCPE->element_brate ) && is_DTXrate( hCPE->last_element_brate ) ) { Copy32( sts[0]->prev_synth_buffer32_fx, sts[1]->prev_synth_buffer32_fx, delay_comp_TD ); } - nChannels = ( hCPE->element_mode == IVAS_CPE_MDCT ) ? 2 : hCPE->nchan_out; + // nChannels = ( hCPE->element_mode == IVAS_CPE_MDCT ) ? 2 : hCPE->nchan_out; + IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) + { + nChannels = 2; + move16(); + } + ELSE + { + nChannels = hCPE->nchan_out; + move16(); + } FOR( n = 0; n < nChannels; n++ ) { - IF( hCPE->element_mode == IVAS_CPE_MDCT ) + IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) { Copy32( sts[n]->prev_synth_buffer32_fx + delay_comp_DFT, hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32, delay_diff ); delay_signal_fx( output_fx[n], output_frame, hCPE->hCoreCoder[n]->hTcxDec->FBTCXdelayBuf_32, delay_diff ); @@ -2761,9 +2885,11 @@ void synchro_synthesis_fx( } /* handling of DFT->TD switching */ - IF( hCPE->last_element_mode == IVAS_CPE_DFT && !use_cldfb_for_last_dft ) + test(); + IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && !use_cldfb_for_last_dft ) { - IF( hCPE->element_mode == IVAS_CPE_TD && hCPE->hStereoCng->prev_sid_nodata ) + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hStereoCng->prev_sid_nodata ) { FOR( n = 0; n < hCPE->nchan_out; n++ ) { @@ -2771,19 +2897,23 @@ void synchro_synthesis_fx( { case 16000: tmpF_fx = 107374184; + move32(); BREAK; case 32000: tmpF_fx = 53687092; + move32(); BREAK; case 48000: tmpF_fx = 35791396; + move32(); BREAK; default: assert( 0 ); } FOR( i = 0; i < delay_cldfb; i++ ) { - tmp_out_fx[n][i] = Mpy_32_32( tmp_out_fx[n][i], tmpF_fx ) * ( delay_cldfb - i ); + tmp_out_fx[n][i] = W_extract_l( W_mult0_32_32( Mpy_32_32( tmp_out_fx[n][i], tmpF_fx ), ( sub( delay_cldfb, i ) ) ) ); + move32(); } } } @@ -2791,18 +2921,21 @@ void synchro_synthesis_fx( /* cross-fading between DFT OLA memory and TD output */ FOR( n = 0; n < nChannels; n++ ) { - IF( hCPE->element_mode == IVAS_CPE_MDCT ) + IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) { SWITCH( output_Fs ) { case 16000: tmpF_fx = 71582792; + move32(); BREAK; case 32000: tmpF_fx = 35791396; + move32(); BREAK; case 48000: tmpF_fx = 23860930; + move32(); BREAK; default: assert( 0 ); @@ -2810,34 +2943,41 @@ void synchro_synthesis_fx( FOR( i = 0; i < delay_diff; i++ ) { - Word64 res1 = (Word64) output_fx[n][i + delay_comp_DFT] * ( delay_diff - i ); - Word64 res2 = (Word64) p_output_mem_fx[n][i] * i; - Word64 res = W_shr( res1, 6 ) + W_shr( res2, 6 ); + Word64 res1 = W_mult0_32_32( output_fx[n][i + delay_comp_DFT], ( sub( delay_diff, i ) ) ); + Word64 res2 = W_mult0_32_32( p_output_mem_fx[n][i], i ); + Word64 res = W_add( W_shr( res1, 6 ), W_shr( res2, 6 ) ); res = res * tmpF_fx; - output_fx[n][i + delay_comp_DFT] = (Word32) W_shr( res, 31 - 6 ); + move64(); + output_fx[n][add( i, delay_comp_DFT )] = W_extract_l( W_shr( res, 31 - 6 ) ); + move32(); } } SWITCH( output_Fs ) { case 16000: tmpF_fx = 107374184; + move32(); BREAK; case 32000: tmpF_fx = 53687092; + move32(); BREAK; case 48000: tmpF_fx = 35791396; + move32(); BREAK; default: assert( 0 ); } FOR( i = 0; i < delay_cldfb; i++ ) { - Word64 res1 = (Word64) tmp_out_fx[n][i] * ( delay_cldfb - i ); - Word64 res2 = (Word64) output_fx[n][i + delay_comp_TD] * i; - Word64 res = W_shr( res1, 6 ) + W_shr( res2, 6 ); + Word64 res1 = W_mult0_32_32( tmp_out_fx[n][i], ( sub( delay_cldfb, i ) ) ); + Word64 res2 = W_mult0_32_32( output_fx[n][add( i, delay_comp_TD )], i ); + Word64 res = W_add( W_shr( res1, 6 ), W_shr( res2, 6 ) ); res = res * tmpF_fx; - output_fx[n][i + delay_comp_TD] = (Word32) W_shr( res, 31 - 6 ); + move64(); + output_fx[n][add( i, delay_comp_TD )] = W_extract_l( W_shr( res, 31 - 6 ) ); + move32(); } } } @@ -2902,66 +3042,83 @@ void stereo_switching_dec( sts = hCPE->hCoreCoder; delay_comp_TD = NS2SA( sts[0]->output_Fs, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ); + move16(); /* prevent CPE mode switching in the first received frame */ IF( sts[0]->ini_frame == 0 ) { hCPE->last_element_mode = hCPE->element_mode; + move16(); hCPE->stereo_switching_counter = 10; + move16(); hCPE->NbFrameMod = 7; + move16(); hCPE->lt_es_em_fx = 0; + move16(); } - IF( hCPE->element_mode == hCPE->last_element_mode ) + IF( EQ_16( hCPE->element_mode, hCPE->last_element_mode ) ) { - hCPE->stereo_switching_counter++; - hCPE->stereo_switching_counter = min( 10, hCPE->stereo_switching_counter ); + hCPE->stereo_switching_counter = add( hCPE->stereo_switching_counter, 1 ); + hCPE->stereo_switching_counter = s_min( 10, hCPE->stereo_switching_counter ); } ELSE { hCPE->stereo_switching_counter = 0; + move16(); } - IF( hCPE->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->element_brate >= IVAS_32k && hCPE->last_element_brate <= IVAS_24k4 ) + test(); + test(); + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && GE_32( hCPE->element_brate, IVAS_32k ) && LE_32( hCPE->last_element_brate, IVAS_24k4 ) ) { - dft32ms_ovl = (Word16) ( ( STEREO_DFT32MS_OVL_MAX * sts[0]->output_Fs ) / 48000 ); + dft32ms_ovl = extract_l( Mpy_32_32( imult3216( sts[0]->output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 ) ); // 1/48000 = 44740 (Q31) set32_fx( hCPE->output_mem_fx[0], 0, dft32ms_ovl ); } - IF( hCPE->element_mode == IVAS_CPE_DFT && hCPE->last_element_mode != IVAS_CPE_DFT && hCPE->hCoreCoder[0]->ini_frame > 0 ) + test(); + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && NE_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && hCPE->hCoreCoder[0]->ini_frame > 0 ) { /* windowing the OLA memory */ - dft32ms_ovl = (Word16) ( ( STEREO_DFT32MS_OVL_MAX * sts[0]->output_Fs ) / 48000 ); + dft32ms_ovl = extract_l( Mpy_32_32( imult3216( sts[0]->output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 ) ); // 1/48000 = 44740 (Q31) FOR( n = 0; n < CPE_CHANNELS; n++ ) { - IF( hCPE->last_element_mode == IVAS_CPE_MDCT ) + IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) ) { /* copy memories from previous MDCT Stereo frame to output_mem */ Copy32( hCPE->input_mem_fx[n], hCPE->output_mem_fx[n], dft32ms_ovl ); } - IF( ivas_total_brate > IVAS_SID_5k2 || n == 0 || hCPE->last_element_mode != IVAS_CPE_TD || hCPE->nchan_out == 1 ) + test(); + test(); + test(); + IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) || n == 0 || EQ_16( hCPE->last_element_mode, IVAS_CPE_TD ) || EQ_16( hCPE->nchan_out, 1 ) ) { FOR( i = 0; i < dft32ms_ovl; i++ ) { - hCPE->output_mem_fx[n][i] = Mpy_32_16_1( hCPE->output_mem_fx[n][i], hCPE->hStereoDft->win32ms_fx[STEREO_DFT32MS_STEP * ( dft32ms_ovl - 1 - i )] ); + hCPE->output_mem_fx[n][i] = Mpy_32_16_1( hCPE->output_mem_fx[n][i], hCPE->hStereoDft->win32ms_fx[i_mult( STEREO_DFT32MS_STEP, ( sub( sub( dft32ms_ovl, 1 ), i ) ) )] ); + move32(); } } ELSE { - IF( hCPE->hStereoTCA->prevTargetGain_fx == ONE_IN_Q29 ) + IF( EQ_32( hCPE->hStereoTCA->prevTargetGain_fx, ONE_IN_Q29 ) ) { tmpF_fx = ONE_IN_Q27; + move32(); } ELSE { - Word16 temp_b = (Word16) L_shr( hCPE->hStereoTCA->prevTargetGain_fx, 16 ); + Word16 temp_b = extract_l( L_shr( hCPE->hStereoTCA->prevTargetGain_fx, 16 ) ); Word16 temp_b_q = 2; + move16(); tmpF_fx = Inv16( temp_b, &temp_b_q ); - tmpF_fx = L_shl( tmpF_fx, ( 31 - 4 ) - ( 15 - temp_b_q ) ); + tmpF_fx = L_shl( tmpF_fx, sub( ( 31 - 4 ), sub( 15, temp_b_q ) ) ); } FOR( i = 0; i < dft32ms_ovl; i++ ) { - Word32 temp_result = Mpy_32_16_1( tmpF_fx, hCPE->hStereoDft->win32ms_fx[STEREO_DFT32MS_STEP * ( dft32ms_ovl - 1 - i )] ); + Word32 temp_result = Mpy_32_16_1( tmpF_fx, hCPE->hStereoDft->win32ms_fx[i_mult( STEREO_DFT32MS_STEP, sub( dft32ms_ovl, 1 + i ) )] ); hCPE->output_mem_fx[n][i] = L_shl_sat( Mpy_32_32( hCPE->output_mem_fx[n][i], temp_result ), 4 ); } FOR( i = 0; i < delay_comp_TD; i++ ) @@ -2971,48 +3128,55 @@ void stereo_switching_dec( // temp_result = (Word64) hCPE->hCoreCoder[1]->prev_synth_buffer_fx[i] * tmpF_fx; // hCPE->hCoreCoder[1]->prev_synth_buffer_fx[i] = saturate( W_extract_l(W_shr( temp_result, 27 )) ); // 32bit buffer - temp_result = (Word64) hCPE->hCoreCoder[1]->prev_synth_buffer32_fx[i] * tmpF_fx; + temp_result = W_mult0_32_32( hCPE->hCoreCoder[1]->prev_synth_buffer32_fx[i], tmpF_fx ); hCPE->hCoreCoder[1]->prev_synth_buffer32_fx[i] = W_sat_l( W_shr( temp_result, 27 ) ); + move32(); } FOR( i = 0; i < L_DEC_MEM_LEN_ICA; i++ ) { hCPE->hStereoTCA->memChanR_fx[i] = L_shl_sat( Mpy_32_32( hCPE->hStereoTCA->memChanR_fx[i], tmpF_fx ), 4 ); + move32(); } } } - IF( hCPE->last_element_mode == IVAS_CPE_MDCT ) + IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) ) { /* create passive downmix of MDCT Stereo memories FOR DFT input memory */ - FOR( int ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++ ) + FOR( Word32 ind = 0; ind < STEREO_DFT32MS_OVL_16k; ind++ ) { Word32 result_int = L_add_sat( hCPE->input_mem_LB_fx[0][ind], hCPE->input_mem_LB_fx[1][ind] ); hCPE->input_mem_LB_fx[0][ind] = L_shr( result_int, 1 ); + move32(); } - FOR( int ind = 0; ind < dft32ms_ovl; ind++ ) + FOR( Word32 ind = 0; ind < dft32ms_ovl; ind++ ) { Word32 result_int = L_add_sat( hCPE->input_mem_fx[0][ind], hCPE->input_mem_fx[1][ind] ); hCPE->input_mem_fx[0][ind] = L_shr( result_int, 1 ); + move32(); } - IF( hCPE->nchan_out == 1 ) + IF( EQ_16( hCPE->nchan_out, 1 ) ) { - FOR( int ind = 0; ind < dft32ms_ovl; ind++ ) + FOR( Word32 ind = 0; ind < dft32ms_ovl; ind++ ) { Word32 result_int = L_add_sat( hCPE->output_mem_fx[0][ind], hCPE->output_mem_fx[1][ind] ); hCPE->output_mem_fx[0][ind] = Mpy_32_32( result_int, INV_SQRT_2_Q31 ); + move32(); } } } /* Update the side_gain[] parameters */ - IF( hCPE->last_element_mode != IVAS_CPE_MDCT ) + IF( NE_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) ) { tmpF_fx = 0; - IF( hCPE->hStereoTCA != NULL ) + move32(); + if ( hCPE->hStereoTCA != NULL ) { tmpF_fx = side_gain_table[hCPE->hStereoTCA->indx_ica_gD]; + move32(); } set32_fx( hCPE->hStereoDft->side_gain_fx + STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX, tmpF_fx, STEREO_DFT_BAND_MAX ); } @@ -3020,27 +3184,37 @@ void stereo_switching_dec( /* reset residual coding / ESF (secondary channel) */ set32_fx( hCPE->hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k ); hCPE->hStereoDft->q_res_cod_mem_fx = Q16; + move16(); set32_fx( hCPE->input_mem_fx[1], 0, NS2SA( sts[0]->output_Fs, STEREO_DFT32MS_OVL_NS ) ); } - IF( hCPE->element_mode == IVAS_CPE_TD && hCPE->last_element_mode != IVAS_CPE_TD && hCPE->hCoreCoder[0]->ini_frame > 0 ) + test(); + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && NE_16( hCPE->last_element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->ini_frame > 0 ) { hCPE->hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_MID_IS_PRIM; + move16(); hCPE->hStereoTD->tdm_last_SM_flag = 0; + move16(); hCPE->hStereoTD->tdm_prev_last_SM_flag = 0; + move16(); /* First frame after DFT frame AND the content is uncorrelated or xtalk -> the primary channel is forced to left */ - IF( hCPE->hStereoTD->tdm_LRTD_flag == 1 ) + if ( EQ_16( hCPE->hStereoTD->tdm_LRTD_flag, 1 ) ) { hCPE->hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_LEFT_IS_PRIM; + move16(); } } /* no secondary channel in the previous frame -> memory resets */ - IF( hCPE->element_mode > IVAS_CPE_DFT && hCPE->last_element_mode == IVAS_CPE_DFT ) + test(); + test(); + IF( GT_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) { - IF( hCPE->last_element_brate <= IVAS_SID_5k2 && hCPE->nchan_out == 2 ) + test(); + IF( LE_32( hCPE->last_element_brate, IVAS_SID_5k2 ) && EQ_16( hCPE->nchan_out, 2 ) ) { /* reset CLDFB memories */ #ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED @@ -3055,6 +3229,7 @@ void stereo_switching_dec( // sts[0]->mem_deemph = 0; sts[0]->mem_deemph_fx = 0; + move16(); #ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED // sts[0]->tilt_code = 0.0f; @@ -3062,7 +3237,9 @@ void stereo_switching_dec( #endif sts[0]->tilt_code_fx = 0; + move16(); sts[0]->gc_threshold_fx = 0; + move16(); #ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED // set_f( sts[0]->mem_syn1, 0, M ); @@ -3077,6 +3254,7 @@ void stereo_switching_dec( set16_fx( sts[0]->mem_syn_r, 0, L_SYN_MEM ); sts[1]->last_L_frame = sts[0]->last_L_frame; + move16(); #ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED /* reset PCh memories */ @@ -3090,8 +3268,10 @@ void stereo_switching_dec( set16_fx( sts[0]->lsp_old_fx, 0, M ); } sts[1]->last_extl = -1; + move16(); sts[1]->prev_bfi = sts[0]->prev_bfi; + move16(); #ifndef IVAS_FLOAT_FIXED set_f( sts[1]->old_pitch_buf, (float) L_SUBFR, 2 * NB_SUBFR16k ); @@ -3101,6 +3281,7 @@ void stereo_switching_dec( // fix need to do correctly set32_fx( sts[1]->old_pitch_buf_fx, L_deposit_h( L_SUBFR ), 2 * NB_SUBFR16k ); sts[1]->old_fpitchFB = 2 * L_SUBFR; + move32(); /* reset CLDFB memories */ #ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED @@ -3115,13 +3296,16 @@ void stereo_switching_dec( // sts[1]->mem_deemph = 0; sts[1]->mem_deemph_fx = 0; + move16(); #ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED // sts[1]->tilt_code = 0.0f; // sts[1]->gc_threshold = 0.0f; #endif sts[1]->tilt_code_fx = 0; + move16(); sts[1]->gc_threshold_fx = 0; + move16(); #ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED // set_f( sts[1]->mem_syn1, 0, M ); @@ -3136,14 +3320,17 @@ void stereo_switching_dec( set16_fx( sts[1]->mem_syn_r, 0, L_SYN_MEM ); sts[1]->last_L_frame = sts[0]->last_L_frame; + move16(); Copy_Scale_sig( sts[0]->old_exc_fx, sts[1]->old_exc_fx, L_EXC_MEM_DEC, sub( sts[1]->Q_exc, sts[0]->Q_exc ) ); Copy( sts[0]->lsf_old_fx, sts[1]->lsf_old_fx, M ); Copy( sts[0]->lsp_old_fx, sts[1]->lsp_old_fx, M ); - IF( hCPE->element_mode == IVAS_CPE_MDCT ) + IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) { sts[1]->last_core = sts[0]->last_core; + move16(); sts[1]->last_coder_type = sts[0]->last_coder_type; + move16(); #ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED // mvr2r( sts[0]->hHQ_core->old_out, sts[1]->hHQ_core->old_out, L_FRAME48k ); @@ -3163,7 +3350,7 @@ void stereo_switching_dec( Copy( sts[0]->hTcxDec->old_syn_Overl, sts[1]->hTcxDec->old_syn_Overl, 256 ); } } - ELSE IF( hCPE->element_mode == IVAS_CPE_TD && hCPE->last_element_mode == IVAS_CPE_MDCT ) + ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) ) { #ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED // set_f( sts[0]->old_exc, 0.0f, L_EXC_MEM_DEC ); @@ -3174,19 +3361,27 @@ void stereo_switching_dec( } /* TD/DFT -> MDCT stereo switching (there is no TCX in the TD stereo secondary channel, or DFT stereo) */ - IF( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->last_element_mode != IVAS_CPE_MDCT ) + IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && NE_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) ) { sts[1]->hTcxCfg->last_aldo = sts[0]->hTcxCfg->last_aldo; + move16(); sts[1]->hTcxCfg->tcx_curr_overlap_mode = sts[0]->hTcxCfg->tcx_curr_overlap_mode; + move16(); sts[1]->fscale = sts[0]->fscale; + move16(); sts[1]->hTcxCfg->tcx_mdct_window_length = sts[0]->hTcxCfg->tcx_mdct_window_length; + move16(); sts[1]->pit_res_max = sts[0]->pit_res_max; + move16(); sts[1]->pit_res_max_past = sts[0]->pit_res_max_past; + move16(); sts[1]->hTcxDec->L_frameTCX = sts[0]->hTcxDec->L_frameTCX; + move16(); #ifndef IVAS_FLOAT_FIXED sts[1]->hTcxDec->conceal_eof_gain_float = sts[0]->hTcxDec->conceal_eof_gain_float; #endif sts[1]->hTcxDec->conceal_eof_gain = sts[0]->hTcxDec->conceal_eof_gain; + move16(); } return; @@ -3548,11 +3743,16 @@ void stereo_td2dft_update_fx( /* initialization */ sts = hCPE->hCoreCoder; - ovl = NS2SA( sts[n]->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ); - dft32ms_ovl = (Word16) ( ( STEREO_DFT32MS_OVL_MAX * sts[0]->output_Fs ) / 48000 ); + ovl = NS2SA( i_mult( sts[n]->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ); + move16(); + dft32ms_ovl = extract_l( Mpy_32_32( imult3216( sts[0]->output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 ) ); // 1/48000 = 44740 (Q31) + move16(); hq_delay_comp = NS2SA( sts[0]->output_Fs, DELAY_CLDFB_NS ); + move16(); - IF( hCPE->element_mode >= IVAS_CPE_DFT && hCPE->element_mode != IVAS_CPE_MDCT ) + test(); + test(); + IF( GE_16( hCPE->element_mode, IVAS_CPE_DFT ) && NE_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) { IF( sts[n]->core == ACELP_CORE ) { @@ -3564,64 +3764,72 @@ void stereo_td2dft_update_fx( /* update DFT analysis overlap memory @internal_fs: BPF */ IF( sts[n]->p_bpf_noise_buf_32 ) { - Copy32( sts[n]->p_bpf_noise_buf_32 + sts[n]->L_frame - ovl, hCPE->input_mem_BPF_fx[n], ovl ); + Copy32( sts[n]->p_bpf_noise_buf_32 + sub( sts[n]->L_frame, ovl ), hCPE->input_mem_BPF_fx[n], ovl ); } /* update DFT analysis overlap memory @output_Fs: BWE */ - IF( sts[n]->extl != -1 || ( sts[n]->bws_cnt > 0 && sts[n]->core == ACELP_CORE ) ) + test(); + test(); + IF( NE_16( sts[n]->extl, -1 ) || ( sts[n]->bws_cnt > 0 && sts[n]->core == ACELP_CORE ) ) { - Copy32( hb_synth_fx + output_frame - dft32ms_ovl, hCPE->input_mem_fx[n], dft32ms_ovl ); + Copy32( hb_synth_fx + sub( output_frame, dft32ms_ovl ), hCPE->input_mem_fx[n], dft32ms_ovl ); } } ELSE { /* update DFT analysis overlap memory @internal_fs: core synthesis, secondary channel */ - Copy32( output_fx + sts[n]->L_frame - ovl, hCPE->input_mem_LB_fx[n], ovl ); + Copy32( output_fx + sub( sts[n]->L_frame, ovl ), hCPE->input_mem_LB_fx[n], ovl ); } } ELSE /* TCX core */ { /* LB-TCX synthesis */ - Copy32( output_fx + sts[n]->L_frame - ovl, hCPE->input_mem_LB_fx[n], ovl ); + Copy32( output_fx + sub( sts[n]->L_frame, ovl ), hCPE->input_mem_LB_fx[n], ovl ); /* BPF */ IF( n == 0 && sts[n]->p_bpf_noise_buf_32 ) { - Copy32( sts[n]->p_bpf_noise_buf_32 + sts[n]->L_frame - ovl, hCPE->input_mem_BPF_fx[n], ovl ); + Copy32( sts[n]->p_bpf_noise_buf_32 + sub( sts[n]->L_frame, ovl ), hCPE->input_mem_BPF_fx[n], ovl ); } /* TCX synthesis (it was already delayed in TD stereo in core_switching_post_dec()) */ IF( sts[n]->hTcxDec != NULL ) { ovl_TCX = NS2SA( sts[n]->hTcxDec->L_frameTCX * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ); + move16(); Copy32( synth_fx + sts[n]->hTcxDec->L_frameTCX + hq_delay_comp - ovl_TCX, hCPE->input_mem_fx[n], ovl_TCX - hq_delay_comp ); Copy32( sts[n]->delay_buf_out32_fx, hCPE->input_mem_fx[n] + ovl_TCX - hq_delay_comp, hq_delay_comp ); } } } - ELSE IF( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->input_mem_fx[0] != NULL ) + ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && hCPE->input_mem_fx[0] != NULL ) { /* update DFT stereo OLA memories */ /*set_zero( hCPE->input_mem_LB[n], STEREO_DFT32MS_OVL_16k );*/ - L_lerp_fx_q11( output_fx + sts[n]->L_frame - ovl, hCPE->input_mem_LB_fx[n], STEREO_DFT32MS_OVL_16k, ovl ); + L_lerp_fx_q11( output_fx + sub( sts[n]->L_frame, ovl ), hCPE->input_mem_LB_fx[n], STEREO_DFT32MS_OVL_16k, ovl ); /* TCX synthesis (it was already delayed in TD stereo in core_switching_post_dec()) */ IF( sts[n]->hTcxDec != NULL ) { ovl_TCX = NS2SA( sts[n]->hTcxDec->L_frameTCX * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ); - Copy32( synth_fx + sts[n]->hTcxDec->L_frameTCX + hq_delay_comp - ovl_TCX, hCPE->input_mem_fx[n], ovl_TCX - hq_delay_comp ); - Copy32( sts[n]->delay_buf_out32_fx, hCPE->input_mem_fx[n] + ovl_TCX - hq_delay_comp, hq_delay_comp ); + move16(); + Copy32( synth_fx + add( sts[n]->hTcxDec->L_frameTCX, sub( hq_delay_comp, ovl_TCX ) ), hCPE->input_mem_fx[n], sub( ovl_TCX, hq_delay_comp ) ); + Copy32( sts[n]->delay_buf_out32_fx, hCPE->input_mem_fx[n] + sub( ovl_TCX, hq_delay_comp ), hq_delay_comp ); } - IF( n == 1 ) + IF( EQ_16( n, 1 ) ) { - nsLB = NS2SA( sts[n]->L_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ); + nsLB = NS2SA( L_mult0( sts[n]->L_frame, FRAMES_PER_SEC ), N_ZERO_MDCT_NS ); + move16(); ns = NS2SA( sts[n]->output_Fs, N_ZERO_MDCT_NS ); - old_outLB_len = (Word16) ( ( 3 * STEREO_MDCT2DFT_FADE_LEN_48k * sts[0]->L_frame * FRAMES_PER_SEC ) / 48000 ); - old_out_len = (Word16) ( ( STEREO_MDCT2DFT_FADE_LEN_48k * sts[0]->output_Fs ) / 48000 ); + move16(); + old_outLB_len = extract_l( Mpy_32_32( ( L_mult0( STEREO_MDCT2DFT_FADE_LEN_48k * FRAMES_PER_SEC, i_mult( 3, sts[0]->L_frame ) ) ), 44740 ) ); + move16(); + old_out_len = extract_l( Mpy_32_32( imult3216( sts[0]->output_Fs, STEREO_MDCT2DFT_FADE_LEN_48k ), 44740 ) ); + move16(); /* update buffers used for fading when switching to DFT Stereo */ v_add_fx( sts[0]->hHQ_core->old_outLB_fx + nsLB, sts[1]->hHQ_core->old_outLB_fx + nsLB, hCPE->old_outLB_mdct_fx, old_outLB_len ); @@ -3629,19 +3837,21 @@ void stereo_td2dft_update_fx( #ifndef MSAN_FIX for ( int i = 0; i < STEREO_MDCT2DFT_FADE_LEN_48k; i++ ) #else - FOR( int i = 0; i < old_outLB_len; i++ ) + FOR( Word32 i = 0; i < old_outLB_len; i++ ) #endif { hCPE->old_outLB_mdct_fx[i] = L_shr( hCPE->old_outLB_mdct_fx[i], 1 ); + move32(); } v_add_fx( sts[0]->hHQ_core->oldOut_fx + ns, sts[1]->hHQ_core->oldOut_fx + ns, hCPE->old_out_mdct_fx, old_out_len ); #ifndef MSAN_FIX for ( int i = 0; i < STEREO_MDCT2DFT_FADE_LEN_48k; i++ ) #else - FOR( int i = 0; i < old_out_len; i++ ) + FOR( Word32 i = 0; i < old_out_len; i++ ) #endif { hCPE->old_out_mdct_fx[i] = L_shr( hCPE->old_out_mdct_fx[i], 1 ); + move32(); } } @@ -3652,9 +3862,11 @@ void stereo_td2dft_update_fx( } /* update ovl buffer for possible switching from TD stereo SCh ACELP frame to MDCT stereo TCX frame */ - IF( hCPE->element_mode == IVAS_CPE_TD && n == 1 && sts[n]->hTcxDec == NULL ) + test(); + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && EQ_16( n, 1 ) && sts[n]->hTcxDec == NULL ) { - Copy32( output_fx + sts[n]->L_frame / 2, hCPE->hStereoTD->TCX_old_syn_Overl_fx, sts[n]->L_frame / 2 ); + Copy32( output_fx + shr( sts[n]->L_frame, 1 ), hCPE->hStereoTD->TCX_old_syn_Overl_fx, shr( sts[n]->L_frame, 1 ) ); } return; @@ -3708,89 +3920,102 @@ void stereo_mdct2dft_update_fx( Word32 synth0_fx[] /* i/o: synthesis @output Fs, ch0 */ ) { - int16_t i; - int16_t fade_len, fade_len_LB; + Word16 i; + Word16 fade_len, fade_len_LB; Word32 tmpF_fx = 0; Decoder_State *st; - if ( hCPE == NULL ) + IF( hCPE == NULL ) { return; } st = hCPE->hCoreCoder[0]; - fade_len = (int16_t) ( ( STEREO_MDCT2DFT_FADE_LEN_48k * st->output_Fs ) / 48000 ); - fade_len_LB = (int16_t) ( 3 * ( STEREO_MDCT2DFT_FADE_LEN_48k * st->L_frame * FRAMES_PER_SEC ) / 48000 ); - switch ( st->output_Fs ) + fade_len = extract_l( Mpy_32_32( imult3216( st->output_Fs, STEREO_MDCT2DFT_FADE_LEN_48k ), 44740 ) ); // 1/48000 = 44740 (Q31) + fade_len_LB = extract_l( Mpy_32_32( imult3216( 3 * STEREO_MDCT2DFT_FADE_LEN_48k * FRAMES_PER_SEC, st->L_frame ), 44740 ) ); // 1/48000 = 44740 (Q31) + SWITCH( st->output_Fs ) { case 16000: tmpF_fx = 53687092; + move32(); BREAK; case 32000: tmpF_fx = 26843546; + move32(); BREAK; case 48000: tmpF_fx = 17895698; + move32(); BREAK; } - for ( i = 0; i < fade_len; i++ ) + FOR( i = 0; i < fade_len; i++ ) { Word32 descen_gain; - if ( i == 0 ) + IF( EQ_16( i, 0 ) ) { descen_gain = ONE_IN_Q31; + move32(); } - else + ELSE { - descen_gain = ( fade_len - i ) * tmpF_fx; + descen_gain = W_extract_l( W_mult0_32_32( ( sub( fade_len, i ) ), tmpF_fx ) ); } Word32 temp_a = Mpy_32_32( hCPE->old_out_mdct_fx[i], descen_gain ); - Word32 ascend_gain = i * tmpF_fx; + Word32 ascend_gain = W_extract_l( W_mult0_32_32( i, tmpF_fx ) ); Word32 temp_b = Mpy_32_32( synth0_fx[i], ascend_gain ); synth0_fx[i] = L_add_sat( temp_a, temp_b ); + move32(); } - switch ( st->L_frame ) + SWITCH( st->L_frame ) { case 80: tmpF_fx = 71582792; + move32(); BREAK; case 160: tmpF_fx = 35791396; + move32(); BREAK; case 256: tmpF_fx = 22369622; + move32(); BREAK; case 320: tmpF_fx = 17895698; + move32(); BREAK; case 512: tmpF_fx = 11184811; + move32(); BREAK; case 640: tmpF_fx = 8947849; + move32(); BREAK; case 960: tmpF_fx = 5965232; + move32(); BREAK; default: assert( 0 ); } - for ( i = 0; i < fade_len_LB; i++ ) + FOR( i = 0; i < fade_len_LB; i++ ) { Word32 descen_gain; - if ( i == 0 ) + IF( i == 0 ) { descen_gain = ONE_IN_Q31; + move32(); } - else + ELSE { - descen_gain = ( fade_len_LB - i ) * tmpF_fx; + descen_gain = W_extract_l( W_mult0_32_32( sub( fade_len_LB, i ), tmpF_fx ) ); } Word32 temp_a = Mpy_32_32( hCPE->old_outLB_mdct_fx[i], descen_gain ); - Word32 ascend_gain = i * tmpF_fx; + Word32 ascend_gain = W_extract_l( W_mult0_32_32( i, tmpF_fx ) ); Word32 temp_b = Mpy_32_32( output0_fx[i], ascend_gain ); output0_fx[i] = L_add_sat( temp_a, temp_b ); } @@ -3865,26 +4090,26 @@ static Word32 ncross_corr_self_fx( signal_b_fx = &signal_fx[y]; FOR( j = 0; j < corr_len; j += subsampling ) { - c_c_fx += ( (Word64) ( signal_a_fx[j] ) * ( signal_b_fx[j] ) ); - energy_x_fx += (Word64) ( signal_a_fx[j] ) * ( signal_a_fx[j] ); - energy_y_fx += (Word64) ( signal_b_fx[j] ) * ( signal_b_fx[j] ); + c_c_fx = W_add( c_c_fx, W_mult0_32_32( ( signal_a_fx[j] ), ( signal_b_fx[j] ) ) ); + energy_x_fx = W_add( energy_x_fx, W_mult0_32_32( ( signal_a_fx[j] ), ( signal_a_fx[j] ) ) ); + energy_y_fx = W_add( energy_y_fx, W_mult0_32_32( ( signal_b_fx[j] ), ( signal_b_fx[j] ) ) ); } headroom_left_x = W_norm( energy_x_fx ); headroom_left_y = W_norm( energy_y_fx ); - IF( headroom_left_x < 32 ) + IF( LT_16( headroom_left_x, 32 ) ) { - energy_x_fx = W_shr( energy_x_fx, (Word16) ( 32 - headroom_left_x ) ); - x_q = (Word16) ( 31 - ( ( 2 * OUTPUT_Q ) - ( 32 - headroom_left_x ) ) ); + energy_x_fx = W_shr( energy_x_fx, sub( 32, headroom_left_x ) ); + x_q = sub( 31, ( sub( ( 2 * OUTPUT_Q ), sub( 32, headroom_left_x ) ) ) ); } ELSE { x_q = 31 - ( 2 * OUTPUT_Q ); } - IF( headroom_left_y < 32 ) + IF( LT_16( headroom_left_y, 32 ) ) { - energy_y_fx = W_shr( energy_y_fx, (Word16) ( 32 - headroom_left_y ) ); - y_q = (Word16) ( 31 - ( ( 2 * OUTPUT_Q ) - ( 32 - headroom_left_y ) ) ); + energy_y_fx = W_shr( energy_y_fx, sub( 32, headroom_left_y ) ); + y_q = sub( 31, ( sub( ( 2 * OUTPUT_Q ), ( sub( 32, headroom_left_y ) ) ) ) ); } ELSE { @@ -3892,26 +4117,30 @@ static Word32 ncross_corr_self_fx( } x_inv_q = x_q; + move16(); y_inv_q = y_q; + move16(); - temp_x = Sqrt32( (Word32) energy_x_fx, &x_q ); + temp_x = Sqrt32( W_extract_l( energy_x_fx ), &x_q ); IF( x_q < 0 ) { - temp_x = L_shr( temp_x, -1 * x_q ); + temp_x = L_shr( temp_x, i_mult( -1, x_q ) ); x_q = 0; + move16(); } - temp_y = Sqrt32( (Word32) energy_y_fx, &y_q ); + temp_y = Sqrt32( W_extract_l( energy_y_fx ), &y_q ); IF( y_q < 0 ) { - temp_y = L_shr( temp_y, -1 * y_q ); + temp_y = L_shr( temp_y, i_mult( -1, y_q ) ); y_q = 0; + move16(); } energy_xy_fx = Mpy_32_32( temp_x, temp_y ); - res_q = y_q + x_q; + res_q = add( y_q, x_q ); - IF( ( energy_xy_fx < L_shr( ONE_IN_Q31, (Word16) res_q ) ) || energy_xy_fx == 0 ) + IF( ( energy_xy_fx < L_shr( ONE_IN_Q31, res_q ) ) || energy_xy_fx == 0 ) { energy_xy_fx = ONE_IN_Q31; /* conceal silent frames */ res_q = 0; @@ -3919,24 +4148,26 @@ static Word32 ncross_corr_self_fx( } ELSE { - Word32 temp_x_inv = ISqrt32( (Word32) energy_x_fx, &x_inv_q ); - Word32 temp_y_inv = ISqrt32( (Word32) energy_y_fx, &y_inv_q ); + Word32 temp_x_inv = ISqrt32( W_extract_l( energy_x_fx ), &x_inv_q ); + Word32 temp_y_inv = ISqrt32( W_extract_l( energy_y_fx ), &y_inv_q ); Word16 headroom_left_c_c; - energy_xy_fx = (Word32) Mpy_32_32( temp_x_inv, temp_y_inv ); - res_q = x_inv_q + y_inv_q; + energy_xy_fx = Mpy_32_32( temp_x_inv, temp_y_inv ); + res_q = add( x_inv_q, y_inv_q ); headroom_left_c_c = W_norm( c_c_fx ); c_c_fx_q = OUTPUT_Q * 2; - IF( headroom_left_c_c < 32 ) + move16(); + IF( LT_16( headroom_left_c_c, 32 ) ) { - c_c_fx = W_shr( c_c_fx, (Word16) ( 32 - headroom_left_c_c ) ); - c_c_fx_q = c_c_fx_q - ( 32 - headroom_left_c_c ); + c_c_fx = W_shr( c_c_fx, extract_l( sub( 32, headroom_left_c_c ) ) ); + c_c_fx_q = sub( c_c_fx_q, sub( 32, headroom_left_c_c ) ); } - c_c_fx = (Word64) Mpy_32_32( (Word32) c_c_fx, (Word32) energy_xy_fx ); - c_c_fx_q = (Word16) c_c_fx_q + ( 31 - res_q ) - 31; - c_c_fx = (Word32) W_shl_sat_l( c_c_fx, (Word16) ( 31 - c_c_fx_q ) ); + c_c_fx = W_deposit32_l( Mpy_32_32( W_extract_l( c_c_fx ), W_extract_l( energy_xy_fx ) ) ); + c_c_fx_q = add( c_c_fx_q, sub( sub( 31, res_q ), 31 ) ); + c_c_fx = W_extract_l( W_shl_sat_l( c_c_fx, extract_l( sub( 31, c_c_fx_q ) ) ) ); } - c_c_fx_return = (Word32) c_c_fx; + c_c_fx_return = W_extract_l( c_c_fx ); + move32(); return c_c_fx_return; } #endif @@ -4128,7 +4359,7 @@ void smooth_dft2td_transition_fx( ilen = shr( output_frame, 1 ); /* correlation length */ - corr_len = output_frame / 20; + corr_len = idiv1616( output_frame, 20 ); subsampl = 4; FOR( ch = 0; ch < hCPE->nchan_out; ch++ ) @@ -4136,10 +4367,10 @@ void smooth_dft2td_transition_fx( /* core to external sampling frequency ratio */ Word16 q = norm_l( output_frame ); Word32 check = BASOP_Util_Divide3232_Scale( output_frame, sts[ch]->L_frame, &q ); - fac_fs_fx = check * ( 1 << ( 26 - ( 15 - q ) ) ); + fac_fs_fx = imult3216( check, shl( 1, add( 26 - 15, q ) ) ); /* Find minimum and maximum pitch*/ - ipit_min = minimum_32_fx( sts[ch]->old_pitch_buf_fx + 4, 4, &flen_fx ) + 4; - ipit_max = maximum_32_fx( sts[ch]->old_pitch_buf_fx + 4, 4, &flen_fx ) + 4; + ipit_min = add( minimum_32_fx( sts[ch]->old_pitch_buf_fx + 4, 4, &flen_fx ), 4 ); + ipit_max = add( maximum_32_fx( sts[ch]->old_pitch_buf_fx + 4, 4, &flen_fx ), 4 ); ipit_min = (Word16) L_shr( L_add( Mpy_32_32( sts[ch]->old_pitch_buf_fx[ipit_min], fac_fs_fx ), ONE_IN_Q10 ), 11 ); ipit_max = (Word16) L_shr( L_add( Mpy_32_32( sts[ch]->old_pitch_buf_fx[ipit_max], fac_fs_fx ), ONE_IN_Q10 ), 11 ); @@ -4152,7 +4383,7 @@ void smooth_dft2td_transition_fx( lsearch = s_min( lsearch, shr( output_frame, 2 ) ); /* ptr init for search of the best correlation in the past frame */ - ptE_fx = hCPE->prev_synth_chs_fx[ch] + output_frame - ipit_max - corr_len; + ptE_fx = hCPE->prev_synth_chs_fx[ch] + sub( output_frame, add( ipit_max, corr_len ) ); idiff = 0; move16(); @@ -4190,11 +4421,11 @@ void smooth_dft2td_transition_fx( } /* Set buffer for the reserved buffer of the current frame */ - ptO2_fx = tmp_out2_fx + output_frame - ilen; - set32_fx( tmp_out2_fx + output_frame - ilen, 0, ilen ); + ptO2_fx = tmp_out2_fx + sub( output_frame, ilen ); + set32_fx( tmp_out2_fx + sub( output_frame, ilen ), 0, ilen ); FOR( i = 0; i < output_frame; i++ ) { - tmp_out2_fx[i] = output_fx[ch][output_frame - 1 - i]; + tmp_out2_fx[i] = output_fx[ch][sub( output_frame, ( 1 + i ) )]; move32(); } /* ptr init for search of the best correlation of the current frame */ @@ -4221,7 +4452,7 @@ void smooth_dft2td_transition_fx( /* If the correlation is too low, don't use the prediction */ IF( GT_32( fmaxcorr_fx, DFT2TD_CORR_THRESH_FX ) ) { - pt1_fx = tmp_out2_fx + output_frame - ilen - ipit; + pt1_fx = tmp_out2_fx + sub( output_frame, add( ilen, ipit ) ); FOR( i = 0; i < ilen; i++ ) { ptO2_fx[i] = pt1_fx[i]; @@ -4250,16 +4481,17 @@ void smooth_dft2td_transition_fx( } FOR( i = 0; i < 4; i++ ) { - Word64 temp_a = W_shr( ( ( 4 - i ) * (Word64) output_fx[ch][i] + i * ptO_fx[i] ), 2 ) * ( ilen - i ); - Word64 temp_b = tmp_out2_fx[output_frame - 1 - i] * i; - output_fx[ch][i] = (Word32) W_shr( ( W_add( temp_a, temp_b ) * flen_fx ), 31 ); + Word64 temp_a = W_shr( W_add( W_mult0_32_32( sub( 4, i ), output_fx[ch][i] ), W_mult0_32_32( i, ptO_fx[i] ) ), 2 ) * ( ilen - i ); + move64(); + Word64 temp_b = W_mult0_32_32( tmp_out2_fx[sub( output_frame, add( 1, i ) )], i ); + output_fx[ch][i] = W_extract_l( W_shr( ( W_add( temp_a, temp_b ) * flen_fx ), 31 ) ); move32(); } - FOR( ; i < ilen - 4; i++ ) + FOR( ; i < sub( ilen, 4 ); i++ ) { - Word64 temp_a = (Word64) ptO_fx[i] * ( ilen - i ); - Word64 temp_b = (Word64) tmp_out2_fx[output_frame - 1 - i] * i; - output_fx[ch][i] = (Word32) W_shr( ( W_add( temp_a, temp_b ) * flen_fx ), 31 ); + Word64 temp_a = W_mult0_32_32( ptO_fx[i], sub( ilen, i ) ); + Word64 temp_b = W_mult0_32_32( tmp_out2_fx[sub( output_frame, add( 1, i ) )], i ); + output_fx[ch][i] = W_extract_l( W_shr( ( W_add( temp_a, temp_b ) * flen_fx ), 31 ) ); move32(); } j = 0; @@ -4267,10 +4499,10 @@ void smooth_dft2td_transition_fx( FOR( ; i < ilen; i++ ) { Word64 temp_a = (Word64) ptO_fx[i] * ( ilen - i ); - Word64 temp_b = W_shr( ( W_add( (Word64) ( 4 - j ) * tmp_out2_fx[output_frame - 1 - i], (Word64) j * output_fx[ch][i] ) * i ), 2 ); - output_fx[ch][i] = (Word32) W_shr( ( W_add( temp_a, temp_b ) * flen_fx ), 31 ); + Word64 temp_b = W_shr( ( W_add( W_mult0_32_32( sub( 4, j ), tmp_out2_fx[sub( output_frame, add( 1, i ) )] ), W_mult0_32_32( j, output_fx[ch][i] ) ) * i ), 2 ); + output_fx[ch][i] = W_extract_l( W_shr( ( W_add( temp_a, temp_b ) * flen_fx ), 31 ) ); move32(); - j++; + j = add( j, 1 ); } } } diff --git a/lib_dec/ivas_stereo_td_dec.c b/lib_dec/ivas_stereo_td_dec.c index ffb63c5ce..d9401f665 100644 --- a/lib_dec/ivas_stereo_td_dec.c +++ b/lib_dec/ivas_stereo_td_dec.c @@ -85,23 +85,34 @@ void stereo_td_init_dec_fx( ) { hStereoTD->tdm_SM_flag = 0; + move16(); hStereoTD->tdm_last_SM_flag = 0; + move16(); hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_MID_IS_PRIM; + move16(); hStereoTD->tdm_prev_last_SM_flag = 0; + move16(); hStereoTD->tdm_LRTD_flag = 0; + move16(); // hStereoTD->prevSP_ratio = 0.5f; hStereoTD->prevSP_ratio_fx = ONE_IN_Q14; //.5 + move16(); // hStereoTD->SP_ratio_LT = 0.0f; hStereoTD->SP_ratio_LT_fx = 0; + move32(); // hStereoTD->c_LR_LT = 0.5f; hStereoTD->c_LR_LT_fx = ONE_IN_Q30; //.5 + move32(); hStereoTD->flag_skip_DMX = 0; + move16(); - if ( last_element_mode == IVAS_CPE_MDCT ) + IF( EQ_16( last_element_mode, IVAS_CPE_MDCT ) ) { hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_LEFT_IS_PRIM; + move16(); hStereoTD->tdm_LRTD_flag = 1; + move16(); } set32_fx( hStereoTD->TCX_old_syn_Overl_fx, 0, L_FRAME16k / 2 ); @@ -142,8 +153,8 @@ void tdm_configure_dec( hStereoTD = hCPE->hStereoTD; sts = hCPE->hCoreCoder; - element_brate_adapt = hCPE->element_brate + hCPE->brate_surplus; - bstr_last_pos = (Word16) ( hCPE->element_brate / FRAMES_PER_SEC ) - nb_bits_metadata + (Word16) ( hCPE->brate_surplus / FRAMES_PER_SEC ); + element_brate_adapt = L_add( hCPE->element_brate, hCPE->brate_surplus ); + bstr_last_pos = add( sub( div_l( hCPE->element_brate, FRAMES_PER_SEC / 2 ), nb_bits_metadata ), div_l( hCPE->brate_surplus, FRAMES_PER_SEC / 2 ) ); /*----------------------------------------------------------------* * Decode CoreCoder signaling @@ -151,45 +162,55 @@ void tdm_configure_dec( /* temporarily decode PCh signaling */ bits_offset = sts[0]->next_bit_pos; + move16(); core = get_indice_st( sts[0], hCPE->element_brate, bits_offset, 1 ); - bits_offset += 1; + bits_offset = add( bits_offset, 1 ); - IF( core == ACELP_CORE && hCPE->element_brate < IVAS_24k4 ) + IF( core == ACELP_CORE && LT_32( hCPE->element_brate, IVAS_24k4 ) ) { mod_ct = get_indice_st( sts[0], hCPE->element_brate, bits_offset, 3 ); /* Only transition mode is important to decoder, otherwise mod_ct is set to AUDIO only to easy debugging IF needed */ - IF( mod_ct != TRANSITION ) + if ( NE_16( mod_ct, TRANSITION ) ) { mod_ct = AUDIO; + move16(); } } ELSE /* core != ACELP_CORE */ { mod_ct = AUDIO; /* coder_type == VOICED || coder_type == GENERIC */ + move16(); } /* Get few parameters needed to decode the bitrate allocated to each channel */ /* Get the coder_type of the secondary channel (last parameter on 2 bits) */ sts[1]->coder_type = get_indice_st( sts[0], element_brate_adapt, bstr_last_pos - TDM_SECONDARY_SIGNALLING, TDM_SECONDARY_SIGNALLING ); + move16(); /* Get the LRTD config flag: 1 = LRTD configuration, favor closer bitrate per channel; 0 = Pri/Sec configuration, bitrates linked wrt. the mono */ - tdm_tmp_SM_LRTD_flag = sts[1]->coder_type & 0x1; - sts[1]->coder_type >>= 1; + tdm_tmp_SM_LRTD_flag = s_and( sts[1]->coder_type, 0x1 ); + sts[1]->coder_type = shr( sts[1]->coder_type, 1 ); + move16(); hStereoTD->tdm_Pitch_reuse_flag = 0; + move16(); - IF( sts[1]->coder_type == 2 ) + IF( EQ_16( sts[1]->coder_type, 2 ) ) { sts[1]->coder_type = GENERIC; + move16(); } - ELSE IF( sts[1]->coder_type == 3 ) + ELSE IF( EQ_16( sts[1]->coder_type, 3 ) ) { sts[1]->coder_type = AUDIO; + move16(); - IF( hCPE->element_brate <= IVAS_24k4 ) + IF( LE_32( hCPE->element_brate, IVAS_24k4 ) ) { hStereoTD->tdm_Pitch_reuse_flag = 1; + move16(); sts[1]->coder_type = GENERIC; + move16(); } } @@ -198,104 +219,140 @@ void tdm_configure_dec( *----------------------------------------------------------------*/ /* Get the correlation ratio */ - *tdm_ratio_idx = get_indice_st( sts[0], element_brate_adapt, (Word16) ( bstr_last_pos - TDM_SECONDARY_SIGNALLING - TDM_RATIO_BITS ), TDM_RATIO_BITS ); + *tdm_ratio_idx = get_indice_st( sts[0], element_brate_adapt, ( sub( bstr_last_pos, ( TDM_SECONDARY_SIGNALLING + TDM_RATIO_BITS ) ) ), TDM_RATIO_BITS ); + move16(); hStereoTD->tdm_use_IAWB_Ave_lpc = 0; + move16(); IF( sts[1]->coder_type == INACTIVE ) { /* Get the flag on the LPC reusage type (primary channel of ave LPC */ - hStereoTD->tdm_use_IAWB_Ave_lpc = get_indice_st( sts[0], element_brate_adapt, bstr_last_pos - TDM_SECONDARY_SIGNALLING - TDM_RATIO_BITS - TDM_LP_REUSE_BITS, TDM_LP_REUSE_BITS ); + hStereoTD->tdm_use_IAWB_Ave_lpc = get_indice_st( sts[0], element_brate_adapt, sub( bstr_last_pos, TDM_SECONDARY_SIGNALLING + TDM_RATIO_BITS + TDM_LP_REUSE_BITS ), TDM_LP_REUSE_BITS ); + move16(); hStereoTD->tdm_lp_reuse_flag = 1; + move16(); } ELSE { /* Get the flag on the LPC reusage */ - hStereoTD->tdm_lp_reuse_flag = get_indice_st( sts[0], element_brate_adapt, bstr_last_pos - TDM_SECONDARY_SIGNALLING - TDM_RATIO_BITS - TDM_LP_REUSE_BITS, TDM_LP_REUSE_BITS ); + hStereoTD->tdm_lp_reuse_flag = get_indice_st( sts[0], element_brate_adapt, sub( bstr_last_pos, TDM_SECONDARY_SIGNALLING + TDM_RATIO_BITS + TDM_LP_REUSE_BITS ), TDM_LP_REUSE_BITS ); + move16(); } sts[0]->tdm_LRTD_flag = hStereoTD->tdm_LRTD_flag; /* the flag was already read in function stereo_memory_dec() */ + move16(); sts[1]->tdm_LRTD_flag = hStereoTD->tdm_LRTD_flag; + move16(); tdm_inst_ratio_idx = *tdm_ratio_idx; + move16(); /* update past tdm_SM_flag */ hStereoTD->tdm_prev_last_SM_flag = hStereoTD->tdm_last_SM_flag; + move16(); hStereoTD->tdm_last_SM_flag = hStereoTD->tdm_SM_flag; + move16(); idx_LRTD_pri_side = -1; - IF( hStereoTD->tdm_LRTD_flag == 1 ) + move16(); + IF( EQ_16( hStereoTD->tdm_LRTD_flag, 1 ) ) { idx_LRTD_pri_side = tdm_tmp_SM_LRTD_flag; + move16(); hStereoTD->tdm_SM_flag = 0; + move16(); IF( tdm_inst_ratio_idx == TDM_NQ ) { hStereoTD->flag_skip_DMX = 1; + move16(); } ELSE { hStereoTD->flag_skip_DMX = 0; + move16(); } /* Set primary channel */ *tdm_ratio_idx = LRTD_STEREO_RIGHT_IS_PRIM; - IF( idx_LRTD_pri_side == 1 ) + move16(); + if ( EQ_16( idx_LRTD_pri_side, 1 ) ) { *tdm_ratio_idx = LRTD_STEREO_LEFT_IS_PRIM; + move16(); } } ELSE { hStereoTD->tdm_SM_flag = tdm_tmp_SM_LRTD_flag; - IF( hCPE->nchan_out == 1 ) + move16(); + if ( EQ_16( hCPE->nchan_out, 1 ) ) { /* in case of mono output, use exclusively the YX upmixing scheme in order to deal with NOOP signals */ hStereoTD->tdm_SM_flag = 0; + move16(); } } - IF( sts[1]->coder_type == INACTIVE && ( *tdm_ratio_idx >= 29 || *tdm_ratio_idx <= 1 ) ) + test(); + test(); + IF( sts[1]->coder_type == INACTIVE && ( GE_16( *tdm_ratio_idx, 29 ) || LE_16( *tdm_ratio_idx, 1 ) ) ) { hStereoTD->tdm_lp_reuse_flag = hStereoTD->tdm_use_IAWB_Ave_lpc; + move16(); hStereoTD->tdm_use_IAWB_Ave_lpc = 0; + move16(); } /*sts[1]->tdm_inst_ratio_idx = sts[0]->tdm_inst_ratio_idx;*/ - IF( hCPE->nchan_out == 1 && hCPE->hStereoDftDmx != NULL ) + test(); + test(); + IF( EQ_16( hCPE->nchan_out, 1 ) && hCPE->hStereoDftDmx != NULL ) { /* in mono DMX, only targetGain is needed */ Word16 tmpS = 20; + move16(); IF( hStereoTD->tdm_LRTD_flag == 0 ) { - tmpS = get_indice_st( sts[0], element_brate_adapt, bstr_last_pos - TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS + STEREO_BITS_TCA_CHAN + STEREO_BITS_TCA_CORRSTATS, STEREO_BITS_TCA_GD ); + tmpS = get_indice_st( sts[0], element_brate_adapt, add( sub( bstr_last_pos, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ), STEREO_BITS_TCA_CHAN + STEREO_BITS_TCA_CORRSTATS ), STEREO_BITS_TCA_GD ); } hCPE->hStereoDftDmx->targetGain_fx = power_table[tmpS]; + move32(); } ELSE { IF( hStereoTD->tdm_LRTD_flag == 0 ) { - hCPE->hStereoTCA->refChanIndx = get_indice_st( sts[0], element_brate_adapt, bstr_last_pos - TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS, STEREO_BITS_TCA_CHAN ); - hCPE->hStereoTCA->indx_ica_NCShift = get_indice_st( sts[0], element_brate_adapt, bstr_last_pos - TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS + STEREO_BITS_TCA_CHAN, STEREO_BITS_TCA_CORRSTATS ); - hCPE->hStereoTCA->indx_ica_gD = get_indice_st( sts[0], element_brate_adapt, bstr_last_pos - TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS + STEREO_BITS_TCA_CHAN + STEREO_BITS_TCA_CORRSTATS, STEREO_BITS_TCA_GD ); + hCPE->hStereoTCA->refChanIndx = get_indice_st( sts[0], element_brate_adapt, sub( bstr_last_pos, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ), STEREO_BITS_TCA_CHAN ); + move16(); + hCPE->hStereoTCA->indx_ica_NCShift = get_indice_st( sts[0], element_brate_adapt, add( sub( bstr_last_pos, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ), STEREO_BITS_TCA_CHAN ), STEREO_BITS_TCA_CORRSTATS ); + move16(); + hCPE->hStereoTCA->indx_ica_gD = get_indice_st( sts[0], element_brate_adapt, add( sub( bstr_last_pos, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ), STEREO_BITS_TCA_CHAN + STEREO_BITS_TCA_CORRSTATS ), STEREO_BITS_TCA_GD ); + move16(); } ELSE { hCPE->hStereoTCA->refChanIndx = L_CH_INDX; + move16(); hCPE->hStereoTCA->indx_ica_NCShift = 0; + move16(); hCPE->hStereoTCA->indx_ica_gD = 20; + move16(); } hCPE->hStereoTCA->targetGain_fx = power_table[hCPE->hStereoTCA->indx_ica_gD]; + move32(); } /* set the BW of the secondary channel */ - IF( hStereoTD->tdm_LRTD_flag && sts[1]->bits_frame_channel >= IVAS_16k4 / FRAMES_PER_SEC ) + IF( hStereoTD->tdm_LRTD_flag && GE_16( sts[1]->bits_frame_channel, IVAS_16k4 / FRAMES_PER_SEC ) ) { /* set BW of the secondary channel in LRTD stereo mode as the BW of the primary channel at higher bitrates */ sts[1]->bwidth = sts[0]->bwidth; + move16(); } ELSE { /* limit BW of the secondary channel in LRTD mode to WB for low bitrates */ sts[1]->bwidth = WB; + move16(); } /*----------------------------------------------------------------* @@ -553,14 +610,16 @@ void tdm_upmix_plain_fx( { Word16 i; - IF( plus_minus_flag == 1 ) + IF( EQ_16( plus_minus_flag, 1 ) ) { FOR( i = start_index; i < end_index; i++ ) { Word32 temp_left = L_add( Mpy_32_32( L_sub( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ), SCh_2_R_fx[i] ); Left_fx[i] = L_shl_sat( Mpy_32_32( temp_left, inv_den_LR_ratio_fx ), 1 ); + move32(); Word32 temp_right = L_add( Mpy_32_32( L_add( PCh_2_L_fx[i], SCh_2_R_fx[i] ), L_negate( LR_ratio_fx ) ), PCh_2_L_fx[i] ); Right_fx[i] = L_shl_sat( Mpy_32_32( temp_right, inv_den_LR_ratio_fx ), 1 ); + move32(); } } ELSE @@ -569,8 +628,10 @@ void tdm_upmix_plain_fx( { Word32 temp_left = L_sub( Mpy_32_32( L_add( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ), SCh_2_R_fx[i] ); Left_fx[i] = L_shl_sat( Mpy_32_32( temp_left, inv_den_LR_ratio_fx ), 1 ); + move32(); Word32 temp_right = L_sub( Mpy_32_32( L_sub( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ), PCh_2_L_fx[i] ); Right_fx[i] = L_shl_sat( Mpy_32_32( temp_right, inv_den_LR_ratio_fx ), 1 ); + move32(); } } @@ -799,7 +860,9 @@ static void tdm_upmix_fade_fx( step_fx = inv_time[end_index - start_index]; fade_out_fx = ONE_IN_Q31; + move32(); fade_in_fx = 0; + move32(); fade_out_fx = Mpy_32_32( fade_out_fx, inv_den_LR_ratio_mem_fx ); fade_in_fx = Mpy_32_32( fade_in_fx, inv_den_LR_ratio_fx ); @@ -813,57 +876,65 @@ static void tdm_upmix_fade_fx( Word32 temp_left1 = Mpy_32_32( L_add( Mpy_32_32( L_sub( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_mem_fx ), SCh_2_R_fx[i] ), fade_out_fx ); Word32 temp_left2 = Mpy_32_32( L_sub( Mpy_32_32( L_add( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ), SCh_2_R_fx[i] ), fade_in_fx ); Left_fx[i] = L_shl_sat( L_add( temp_left1, temp_left2 ), 1 ); + move32(); Word32 temp_right1 = Mpy_32_32( L_add( Mpy_32_32( L_add( PCh_2_L_fx[i], SCh_2_R_fx[i] ), L_negate( LR_ratio_mem_fx ) ), PCh_2_L_fx[i] ), fade_out_fx ); Word32 temp_right2 = Mpy_32_32( L_sub( Mpy_32_32( L_sub( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ), PCh_2_L_fx[i] ), fade_in_fx ); Right_fx[i] = L_shl_sat( L_add( temp_right1, temp_right2 ), 1 ); + move32(); fade_in_fx = L_add( fade_in_fx, step2_fx ); fade_out_fx = L_sub( fade_out_fx, step_fx ); } } - ELSE IF( fading_type == 1 ) /* SM scheme */ + ELSE IF( EQ_16( fading_type, 1 ) ) /* SM scheme */ { FOR( i = start_index; i < end_index; i++ ) { Word32 temp_left1 = Mpy_32_32( L_sub( Mpy_32_32( L_add( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_mem_fx ), SCh_2_R_fx[i] ), fade_out_fx ); Word32 temp_left2 = Mpy_32_32( L_sub( Mpy_32_32( L_add( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ), SCh_2_R_fx[i] ), fade_in_fx ); Left_fx[i] = L_shl_sat( L_add( temp_left1, temp_left2 ), 1 ); + move32(); Word32 temp_right1 = Mpy_32_32( L_sub( Mpy_32_32( L_sub( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_mem_fx ), PCh_2_L_fx[i] ), fade_out_fx ); Word32 temp_right2 = Mpy_32_32( L_sub( Mpy_32_32( L_sub( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ), PCh_2_L_fx[i] ), fade_in_fx ); Right_fx[i] = L_shl_sat( L_add( temp_right1, temp_right2 ), 1 ); + move32(); fade_in_fx = L_add( fade_in_fx, step2_fx ); fade_out_fx = L_sub( fade_out_fx, step_fx ); } } - ELSE IF( fading_type == 2 ) /* Switching from SM scheme to YX scheme */ + ELSE IF( EQ_16( fading_type, 2 ) ) /* Switching from SM scheme to YX scheme */ { FOR( i = start_index; i < end_index; i++ ) { Word32 temp_left1 = Mpy_32_32( L_sub( Mpy_32_32( L_add( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_mem_fx ), SCh_2_R_fx[i] ), fade_out_fx ); Word32 temp_left2 = Mpy_32_32( L_add( Mpy_32_32( L_sub( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ), SCh_2_R_fx[i] ), fade_in_fx ); Left_fx[i] = L_shl_sat( L_add( temp_left1, temp_left2 ), 1 ); + move32(); Word32 temp_right1 = Mpy_32_32( L_sub( Mpy_32_32( L_sub( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_mem_fx ), PCh_2_L_fx[i] ), fade_out_fx ); Word32 temp_right2 = Mpy_32_32( L_add( Mpy_32_32( L_add( PCh_2_L_fx[i], SCh_2_R_fx[i] ), L_negate( LR_ratio_fx ) ), PCh_2_L_fx[i] ), fade_in_fx ); Right_fx[i] = L_shl_sat( L_add( temp_right1, temp_right2 ), 1 ); + move32(); fade_in_fx = L_add( fade_in_fx, step2_fx ); fade_out_fx = L_sub( fade_out_fx, step_fx ); } } - ELSE IF( fading_type == 3 ) /* YX scheme */ + ELSE IF( EQ_16( fading_type, 3 ) ) /* YX scheme */ { FOR( i = start_index; i < end_index; i++ ) { Word32 temp_left1 = Mpy_32_32( L_add( Mpy_32_32( L_sub( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_mem_fx ), SCh_2_R_fx[i] ), fade_out_fx ); Word32 temp_left2 = Mpy_32_32( L_add( Mpy_32_32( L_sub( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ), SCh_2_R_fx[i] ), fade_in_fx ); Left_fx[i] = L_shl_sat( L_add( temp_left1, temp_left2 ), 1 ); + move32(); Word32 temp_right1 = Mpy_32_32( L_add( Mpy_32_32( L_add( PCh_2_L_fx[i], SCh_2_R_fx[i] ), L_negate( LR_ratio_mem_fx ) ), PCh_2_L_fx[i] ), fade_out_fx ); Word32 temp_right2 = Mpy_32_32( L_add( Mpy_32_32( L_add( PCh_2_L_fx[i], SCh_2_R_fx[i] ), L_negate( LR_ratio_fx ) ), PCh_2_L_fx[i] ), fade_in_fx ); Right_fx[i] = L_shl_sat( L_add( temp_right1, temp_right2 ), 1 ); + move32(); fade_in_fx = L_add( fade_in_fx, step2_fx ); fade_out_fx = L_sub( fade_out_fx, step_fx ); @@ -1090,7 +1161,7 @@ void stereo_tdm_combine_fx( } ELSE IF( EQ_16( hCPE->hStereoTD->tdm_last_SM_flag, 1 ) ) { - IF( EQ_16( hCPE->hStereoTD->tdm_prev_last_SM_flag, 0 ) ) + IF( hCPE->hStereoTD->tdm_prev_last_SM_flag == 0 ) { stereo_tdm_coder_type = 0; /* mode 1 : Switching from YX scheme to SM scheme*/ move16(); @@ -1123,10 +1194,10 @@ void stereo_tdm_combine_fx( tdm_upmix_plain_fx( Left_fx, Right_fx, PCh_2_L_fx, SCh_2_R_fx, LR_ratio_mem_fx, tdm_den_ratio_tabl_fx[tdm_last_ratio_idx], 0, upmixing_delay, 1 ); /* Switching from YX scheme to SM scheme */ - tdm_upmix_fade_fx( Left_fx, Right_fx, PCh_2_L_fx, SCh_2_R_fx, LR_ratio_mem_fx, tdm_den_ratio_tabl_fx[tdm_last_ratio_idx], LR_ratio_fx, tdm_den_ratio_tabl_fx[tdm_ratio_idx], upmixing_delay, upmixing_delay + tdm_n_OVA, 0 ); + tdm_upmix_fade_fx( Left_fx, Right_fx, PCh_2_L_fx, SCh_2_R_fx, LR_ratio_mem_fx, tdm_den_ratio_tabl_fx[tdm_last_ratio_idx], LR_ratio_fx, tdm_den_ratio_tabl_fx[tdm_ratio_idx], upmixing_delay, add( upmixing_delay, tdm_n_OVA ), 0 ); /* Do the upmixing of the other samples with the new coefficient and formular for SM scheme */ - tdm_upmix_plain_fx( Left_fx, Right_fx, PCh_2_L_fx, SCh_2_R_fx, LR_ratio_fx, tdm_den_ratio_tabl_fx[tdm_ratio_idx], upmixing_delay + tdm_n_OVA, output_frame, 0 ); + tdm_upmix_plain_fx( Left_fx, Right_fx, PCh_2_L_fx, SCh_2_R_fx, LR_ratio_fx, tdm_den_ratio_tabl_fx[tdm_ratio_idx], add( upmixing_delay, tdm_n_OVA ), output_frame, 0 ); } BREAK; case ( 1 ): @@ -1141,7 +1212,7 @@ void stereo_tdm_combine_fx( } ELSE { - tdm_upmix_fade_fx( Left_fx, Right_fx, PCh_2_L_fx, SCh_2_R_fx, LR_ratio_mem_fx, tdm_den_ratio_tabl_fx[tdm_last_ratio_idx], LR_ratio_fx, tdm_den_ratio_tabl_fx[tdm_ratio_idx], upmixing_delay, upmixing_delay + tdm_n_OVA, 1 ); + tdm_upmix_fade_fx( Left_fx, Right_fx, PCh_2_L_fx, SCh_2_R_fx, LR_ratio_mem_fx, tdm_den_ratio_tabl_fx[tdm_last_ratio_idx], LR_ratio_fx, tdm_den_ratio_tabl_fx[tdm_ratio_idx], upmixing_delay, add( upmixing_delay, tdm_n_OVA ), 1 ); tdm_upmix_plain_fx( Left_fx, Right_fx, PCh_2_L_fx, SCh_2_R_fx, LR_ratio_fx, tdm_den_ratio_tabl_fx[tdm_ratio_idx], upmixing_delay + tdm_n_OVA, output_frame, 0 ); } } @@ -1152,7 +1223,7 @@ void stereo_tdm_combine_fx( tdm_upmix_plain_fx( Left_fx, Right_fx, PCh_2_L_fx, SCh_2_R_fx, LR_ratio_mem_fx, tdm_den_ratio_tabl_fx[tdm_last_ratio_idx], 0, upmixing_delay, 0 ); /* Switching from SM scheme to YX scheme */ - tdm_upmix_fade_fx( Left_fx, Right_fx, PCh_2_L_fx, SCh_2_R_fx, LR_ratio_mem_fx, tdm_den_ratio_tabl_fx[tdm_last_ratio_idx], LR_ratio_fx, tdm_den_ratio_tabl_fx[tdm_ratio_idx], upmixing_delay, upmixing_delay + tdm_n_OVA, 2 ); + tdm_upmix_fade_fx( Left_fx, Right_fx, PCh_2_L_fx, SCh_2_R_fx, LR_ratio_mem_fx, tdm_den_ratio_tabl_fx[tdm_last_ratio_idx], LR_ratio_fx, tdm_den_ratio_tabl_fx[tdm_ratio_idx], upmixing_delay, add( upmixing_delay, tdm_n_OVA ), 2 ); /* Do the upmixing of the other samples with the new coefficient and formular for YX scheme */ tdm_upmix_plain_fx( Left_fx, Right_fx, PCh_2_L_fx, SCh_2_R_fx, LR_ratio_fx, tdm_den_ratio_tabl_fx[tdm_ratio_idx], upmixing_delay + tdm_n_OVA, output_frame, 1 ); @@ -1170,7 +1241,7 @@ void stereo_tdm_combine_fx( } ELSE { - tdm_upmix_fade_fx( Left_fx, Right_fx, PCh_2_L_fx, SCh_2_R_fx, LR_ratio_mem_fx, tdm_den_ratio_tabl_fx[tdm_last_ratio_idx], LR_ratio_fx, tdm_den_ratio_tabl_fx[tdm_ratio_idx], upmixing_delay, upmixing_delay + tdm_n_OVA, 3 ); + tdm_upmix_fade_fx( Left_fx, Right_fx, PCh_2_L_fx, SCh_2_R_fx, LR_ratio_mem_fx, tdm_den_ratio_tabl_fx[tdm_last_ratio_idx], LR_ratio_fx, tdm_den_ratio_tabl_fx[tdm_ratio_idx], upmixing_delay, add( upmixing_delay, tdm_n_OVA ), 3 ); tdm_upmix_plain_fx( Left_fx, Right_fx, PCh_2_L_fx, SCh_2_R_fx, LR_ratio_fx, tdm_den_ratio_tabl_fx[tdm_ratio_idx], upmixing_delay + tdm_n_OVA, output_frame, 1 ); } } diff --git a/lib_dec/ivas_svd_dec.c b/lib_dec/ivas_svd_dec.c index 218be7640..630e24d4e 100644 --- a/lib_dec/ivas_svd_dec.c +++ b/lib_dec/ivas_svd_dec.c @@ -236,7 +236,8 @@ void mat2svdMat_fx( { FOR( j = 0; j < nRows; j++ ) { - svdMat[i][j] = mat[j + nRows * i]; + svdMat[i][j] = mat[add( j, i_mult( nRows, i ) )]; + move32(); } set_zero_fx( &svdMat[i][mCols], MAX_OUTPUT_CHANNELS - nRows ); @@ -253,7 +254,8 @@ void mat2svdMat_fx( { FOR( j = 0; j < mCols; j++ ) { - svdMat[i][j] = mat[i + nRows * j]; + svdMat[i][j] = mat[add( i, i_mult( nRows, j ) )]; + move32(); } set_zero_fx( &svdMat[i][mCols], MAX_OUTPUT_CHANNELS - mCols ); @@ -288,7 +290,8 @@ void svdMat2mat_fx( { FOR( j = 0; j < mCols; j++ ) { - mat[i + nRows * j] = svdMat[i][j]; + mat[add( i, i_mult( nRows, j ) )] = svdMat[i][j]; + move32(); } } @@ -405,8 +408,11 @@ Word16 svd_fx( // int16_t max_length = ((nChannelsL > nChannelsC) ? nChannelsL : nChannelsC); Word32 secDiag_fx[MAX_OUTPUT_CHANNELS]; Word16 secDiag_fx_e = 0; + move16(); Word32 eps_x_fx = 0, temp_fx; + move16(); Word16 eps_x_fx_e = 0; + move16(); push_wmops( "svd_fx" ); set32_fx( secDiag_fx, 0, MAX_OUTPUT_CHANNELS ); @@ -417,10 +423,12 @@ Word16 svd_fx( FOR( jCh = 0; jCh < nChannelsC; jCh++ ) { singularVectors_Left_fx[iCh][jCh] = InputMatrix[iCh][jCh]; + move32(); } } *singularValues_fx_e = 0; + move16(); /* Householder reduction */ HouseholderReduction_fx( singularVectors_Left_fx, singularValues_fx, singularVectors_Right_fx, secDiag_fx, InputMatrix_e, singularValues_fx_e, &secDiag_fx_e, nChannelsL, nChannelsC, &eps_x_fx, &eps_x_fx_e ); @@ -439,27 +447,38 @@ Word16 svd_fx( DO { condition = 0; - FOR( iCh = 0; iCh < lengthSingularValues - 1; iCh++ ) + move16(); + FOR( iCh = 0; iCh < sub( lengthSingularValues, 1 ); iCh++ ) { IF( LT_32( singularValues_fx[iCh], singularValues_fx[iCh + 1] ) ) { condition = 1; + move16(); temp_fx = singularValues_fx[iCh]; + move32(); singularValues_fx[iCh] = singularValues_fx[iCh + 1]; + move32(); singularValues_fx[iCh + 1] = temp_fx; + move32(); FOR( jCh = 0; jCh < nChannelsL; ++jCh ) { temp_fx = singularVectors_Left_fx[jCh][iCh]; + move32(); singularVectors_Left_fx[jCh][iCh] = singularVectors_Left_fx[jCh][iCh + 1]; + move32(); singularVectors_Left_fx[jCh][iCh + 1] = temp_fx; + move32(); } FOR( jCh = 0; jCh < nChannelsC; ++jCh ) { temp_fx = singularVectors_Right_fx[jCh][iCh]; + move32(); singularVectors_Right_fx[jCh][iCh] = singularVectors_Right_fx[jCh][iCh + 1]; + move32(); singularVectors_Right_fx[jCh][iCh + 1] = temp_fx; + move32(); } } } @@ -577,11 +596,16 @@ static Word16 BidagonalDiagonalisation_fx( Word32 c, s, f1, f2; Word16 c_e, s_e, f1_e, f2_e; Word16 x11_e = 0, x12_e = 0; + move16(); + move16(); Word16 temp_exp; Word32 g = 0; + move16(); Word16 g_e = 0; + move16(); Word16 convergence, iteration, found_split; Word16 error = 0; + move16(); Word16 singularValues_new_e[MAX_OUTPUT_CHANNELS], secDiag_new_e[MAX_OUTPUT_CHANNELS]; set16_fx( singularValues_new_e, *singularValues_fx_e, MAX_OUTPUT_CHANNELS ); set16_fx( secDiag_new_e, *secDiag_fx_e, MAX_OUTPUT_CHANNELS ); @@ -589,20 +613,25 @@ static Word16 BidagonalDiagonalisation_fx( FOR( iCh = nChannelsC - 1; iCh >= 0; iCh-- ) /* nChannelsC */ { convergence = 0; + move16(); iteration = 0; + move16(); split = iCh - 1; + move16(); WHILE( EQ_16( convergence, 0 ) ) { - iteration++; + iteration = add( iteration, 1 ); found_split = 1; + move16(); FOR( jCh = iCh; jCh >= 0; jCh-- ) { - split = jCh - 1; + split = sub( jCh, 1 ); IF( LE_16( BASOP_Util_Cmp_Mant32Exp( L_abs( secDiag_fx[jCh] ), secDiag_new_e[jCh], Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), eps_x_e ), 0 ) ) /* is secDiag[ch] vanishing compared to eps_x */ { found_split = 0; + move16(); BREAK; } IF( LE_16( BASOP_Util_Cmp_Mant32Exp( L_abs( singularValues_fx[split] ), singularValues_new_e[split], Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), eps_x_e ), 0 ) ) /* is singularValues[split] vanishing compared to eps_x */ @@ -611,14 +640,28 @@ static Word16 BidagonalDiagonalisation_fx( } } - convergence = ( jCh == iCh ) ? 1 : 0; + // convergence = ( jCh == iCh ) ? 1 : 0; + IF( EQ_16( jCh, iCh ) ) + { + convergence = 1; + move16(); + } + ELSE + { + convergence = 0; + move16(); + } IF( found_split ) { s = MAX_32; + move32(); s_e = 0; + move16(); c = 0; + move32(); c_e = 0; + move16(); FOR( kCh = jCh; kCh <= iCh; kCh++ ) { @@ -636,17 +679,19 @@ static Word16 BidagonalDiagonalisation_fx( singularValues_fx[kCh] = GivensRotation_fx( g, g_e, singularValues_fx[kCh], singularValues_new_e[kCh], &singularValues_new_e[kCh] ); c = BASOP_Util_Divide3232_Scale_cadence( c, maxWithSign_fx( singularValues_fx[kCh] ), &temp_exp ); c_e = add( temp_exp, sub( c_e, singularValues_new_e[kCh] ) ); - IF( GT_16( c_e, 0 ) ) + IF( c_e > 0 ) { c = L_shl_sat( c, c_e ); // Q31 c_e = 0; + move16(); } s = BASOP_Util_Divide3232_Scale_cadence( -g, maxWithSign_fx( singularValues_fx[kCh] ), &temp_exp ); s_e = add( temp_exp, sub( g_e, singularValues_new_e[kCh] ) ); - IF( GT_16( s_e, 0 ) ) + IF( s_e > 0 ) { s = L_shl_sat( s, s_e ); // Q31 s_e = 0; + move16(); } ApplyRotation_fx( singularVectors_Left_fx, c, c_e, s, s_e, 0, x11_e, 0, x12_e, &f1, &f1_e, &f2, &f2_e, kCh, split, nChannelsL ); /* nChannelsL */ @@ -655,13 +700,16 @@ static Word16 BidagonalDiagonalisation_fx( IF( convergence ) { - singularValues_fx[iCh] = (Word32) singularValues_fx[iCh]; - IF( LT_32( singularValues_fx[iCh], 0 ) ) + singularValues_fx[iCh] = singularValues_fx[iCh]; + move32(); + IF( singularValues_fx[iCh] < 0 ) { singularValues_fx[iCh] = L_negate( singularValues_fx[iCh] ); + move32(); FOR( nCh = 0; nCh < nChannelsC; nCh++ ) /* nChannelsC */ { singularVectors_Right_fx[nCh][iCh] = L_negate( singularVectors_Right_fx[nCh][iCh] ); + move32(); } } } @@ -672,14 +720,18 @@ static Word16 BidagonalDiagonalisation_fx( IF( LT_32( singularValues_fx[iCh], 0 ) ) { singularValues_fx[iCh] = L_negate( singularValues_fx[iCh] ); + move32(); FOR( nCh = 0; nCh < nChannelsC; nCh++ ) /* nChannelsC */ { singularVectors_Right_fx[nCh][iCh] = L_negate( singularVectors_Right_fx[nCh][iCh] ); + move32(); } } error = 1; + move16(); convergence = 1; + move16(); } ELSE { @@ -691,30 +743,40 @@ static Word16 BidagonalDiagonalisation_fx( // rescaling block Word16 max_exp = -31; - FOR( iCh = 0; iCh < nChannelsC; iCh++ ){ - IF( singularValues_fx[iCh] ){ + move16(); + FOR( iCh = 0; iCh < nChannelsC; iCh++ ) + { + if ( singularValues_fx[iCh] ) + { max_exp = s_max( max_exp, singularValues_new_e[iCh] ); -} -} -*singularValues_fx_e = max_exp; -FOR( iCh = 0; iCh < nChannelsC; iCh++ ) -{ - singularValues_fx[iCh] = L_shr_r( singularValues_fx[iCh], sub( *singularValues_fx_e, singularValues_new_e[iCh] ) ); -} + } + } + *singularValues_fx_e = max_exp; + move16(); + FOR( iCh = 0; iCh < nChannelsC; iCh++ ) + { + singularValues_fx[iCh] = L_shr_r( singularValues_fx[iCh], sub( *singularValues_fx_e, singularValues_new_e[iCh] ) ); + move32(); + } -max_exp = -31; -FOR( iCh = 0; iCh < nChannelsC; iCh++ ){ - IF( secDiag_fx[iCh] ){ - max_exp = s_max( max_exp, secDiag_new_e[iCh] ); -} -} -*secDiag_fx_e = max_exp; -FOR( iCh = 0; iCh < nChannelsC; iCh++ ) -{ - secDiag_fx[iCh] = L_shr_r( secDiag_fx[iCh], sub( *secDiag_fx_e, secDiag_new_e[iCh] ) ); -} + max_exp = -31; + move16(); + FOR( iCh = 0; iCh < nChannelsC; iCh++ ) + { + if ( secDiag_fx[iCh] ) + { + max_exp = s_max( max_exp, secDiag_new_e[iCh] ); + } + } + *secDiag_fx_e = max_exp; + move16(); + FOR( iCh = 0; iCh < nChannelsC; iCh++ ) + { + secDiag_fx[iCh] = L_shr_r( secDiag_fx[iCh], sub( *secDiag_fx_e, secDiag_new_e[iCh] ) ); + move32(); + } -return ( error ); + return ( error ); } #else static int16_t BidagonalDiagonalisation( @@ -845,26 +907,57 @@ static void ApplyQRTransform_fx( { Word16 ch, split; Word32 d = 0, g = 0, r = 0, x_ii = 0, x_split = 0, x_kk = 0, mu = 0, aux = 0; + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); Word16 d_e = 0, g_e = 0, r_e = 0, x_ii_e = 0, x_split_e = 0, x_kk_e = 0, mu_e = 0, aux_e = 0; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); Word32 L_temp1, L_temp2, L_temp3, L_temp4; Word16 L_temp1_e, L_temp2_e, L_temp3_e, L_temp4_e, temp_exp; Word32 c = MAX_32; + move32(); Word16 c_e = 0; + move16(); Word32 s = MAX_32; + move32(); Word16 s_e = 0; + move16(); x_kk = singularValues[currentIndex]; + move32(); x_kk_e = singularValues_e[currentIndex]; + move16(); x_ii = singularValues[startIndex]; + move32(); x_ii_e = singularValues_e[startIndex]; - split = currentIndex - 1; + move16(); + split = sub( currentIndex, 1 ); + move16(); x_split = singularValues[split]; + move32(); x_split_e = singularValues_e[split]; + move16(); g = secDiag[split]; + move32(); g_e = secDiag_e[split]; + move16(); r = secDiag[currentIndex]; + move32(); r_e = secDiag_e[currentIndex]; + move16(); // d = (x_split + x_kk) * (x_split - x_kk) + (g + r) * (g - r); L_temp1 = BASOP_Util_Add_Mant32Exp( x_split, x_split_e, x_kk, x_kk_e, &L_temp1_e ); @@ -883,8 +976,17 @@ static void ApplyQRTransform_fx( g = GivensRotation_fx( MAX_32, 0, d, d_e, &g_e ); // mu = x_split / maxWithSign(d + (d >= 0.0f ? 1 : (-1)) * fabsf(g)) - r; - L_temp1 = d >= 0 ? L_abs( g ) : -L_abs( g ); + // L_temp1 = d >= 0 ? L_abs( g ) : -L_abs( g ); + IF( d >= 0 ) + { + L_temp1 = L_abs( g ); + } + ELSE + { + L_temp1 = L_negate( L_abs( g ) ); + } L_temp1_e = g_e; + move16(); L_temp2 = maxWithSign_fx( BASOP_Util_Add_Mant32Exp( d, d_e, L_temp1, L_temp1_e, &L_temp2_e ) ); mu = BASOP_Util_Divide3232_Scale_cadence( x_split, L_temp2, &mu_e ); mu_e = add( mu_e, sub( x_split_e, L_temp2_e ) ); @@ -906,19 +1008,22 @@ static void ApplyQRTransform_fx( g_e = add( c_e, secDiag_e[ch + 1] ); secDiag[ch] = GivensRotation_fx( d, d_e, r, r_e, &secDiag_e[ch] ); + move32(); c = BASOP_Util_Divide3232_Scale_cadence( d, maxWithSign_fx( secDiag[ch] ), &c_e ); c_e = add( c_e, sub( d_e, secDiag_e[ch] ) ); - IF( GT_16( c_e, 0 ) ) + IF( c_e > 0 ) { c = L_shl_sat( c, c_e ); // Q31 c_e = 0; + move16(); } s = BASOP_Util_Divide3232_Scale_cadence( r, maxWithSign_fx( secDiag[ch] ), &s_e ); s_e = add( s_e, sub( r_e, secDiag_e[ch] ) ); - IF( GT_16( s_e, 0 ) ) + IF( s_e > 0 ) { s = L_shl_sat( s, s_e ); // Q31 s_e = 0; + move16(); } r = Mpy_32_32( s, singularValues[ch + 1] ); @@ -927,12 +1032,15 @@ static void ApplyQRTransform_fx( x_split_e = add( c_e, singularValues_e[ch + 1] ); aux = g; + move32(); aux_e = g_e; + move16(); // ApplyRotation(singularVectors_Right, c, s, x_ii, aux, &d, &g, ch + 1, ch, nChannelsC); ApplyRotation_fx( singularVectors_Right, c, c_e, s, s_e, x_ii, x_ii_e, aux, aux_e, &d, &d_e, &g, &g_e, ch + 1, ch, nChannelsC ); singularValues[ch] = GivensRotation_fx( d, d_e, r, r_e, &singularValues_e[ch] ); + move32(); IF( GT_32( L_abs( singularValues[ch] ), Mpy_32_32( CONVERGENCE_FACTOR_FX, L_abs( singularValues[ch] ) ) ) ) { aux = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, singularValues[ch], &aux_e ); @@ -940,18 +1048,20 @@ static void ApplyQRTransform_fx( c = Mpy_32_32( d, aux ); c_e = add( d_e, aux_e ); - IF( GT_16( c_e, 0 ) ) + IF( c_e > 0 ) { c = L_shl_sat( c, c_e ); // Q31 c_e = 0; + move16(); } s = Mpy_32_32( r, aux ); s_e = add( r_e, aux_e ); - IF( GT_16( s_e, 0 ) ) + IF( s_e > 0 ) { s = L_shl_sat( s, s_e ); // Q31 s_e = 0; + move16(); } } @@ -960,10 +1070,15 @@ static void ApplyQRTransform_fx( } secDiag[startIndex] = 0; + move32(); secDiag[currentIndex] = d; + move32(); secDiag_e[currentIndex] = d_e; + move16(); singularValues[currentIndex] = x_ii; + move32(); singularValues_e[currentIndex] = x_ii_e; + move16(); return; } @@ -1062,16 +1177,24 @@ static void ApplyRotation_fx( Word16 temp_exp; *d = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x11 ), add( c_e, x11_e ), Mpy_32_32( s, x12 ), add( s_e, x12_e ), d_e ); + move32(); *g = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x12 ), add( c_e, x12_e ), Mpy_32_32( -s, x11 ), add( s_e, x11_e ), g_e ); + move32(); FOR( ch = 0; ch < nChannels; ch++ ) { x11 = singularVector[ch][currentIndex2]; + move32(); x12 = singularVector[ch][currentIndex1]; + move32(); singularVector[ch][currentIndex2] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x11 ), c_e, Mpy_32_32( s, x12 ), s_e, &temp_exp ); + move32(); singularVector[ch][currentIndex2] = L_shl_sat( singularVector[ch][currentIndex2], temp_exp ); + move32(); singularVector[ch][currentIndex1] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x12 ), c_e, Mpy_32_32( -s, x11 ), s_e, &temp_exp ); + move32(); singularVector[ch][currentIndex1] = L_shl_sat( singularVector[ch][currentIndex1], temp_exp ); + move32(); } return; @@ -1121,15 +1244,18 @@ static void HouseholderReduction_fx( Word16 singularVectors_Left_e, Word16 *singularValues_fx_e, Word16 *secDiag_fx_e, - const int16_t nChannelsL, - const int16_t nChannelsC, + const Word16 nChannelsL, + const Word16 nChannelsC, Word32 *eps_x_fx, Word16 *eps_x_fx_e ) { - int16_t nCh; + Word16 nCh; // float g = 0.0f, sig_x = 0.0f;// to be removed Word32 g_fx = 0, sig_x_fx = 0; + move32(); + move32(); Word16 sig_x_fx_e = 0; + move16(); /* Bidiagonal Reduction for every channel */ FOR( nCh = 0; nCh < nChannelsC; nCh++ ) /* nChannelsC */ @@ -1142,7 +1268,9 @@ static void HouseholderReduction_fx( IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( L_temp, L_temp_e, *eps_x_fx, *eps_x_fx_e ), 1 ) ) { *eps_x_fx = L_temp; + move32(); *eps_x_fx_e = L_temp_e; + move32(); } } @@ -1212,32 +1340,39 @@ static void biDiagonalReductionLeft_fx( Word16 L_temp_e; FOR( jCh = 0; jCh < MAX_OUTPUT_CHANNELS; jCh++ ) { - set_s( sing_exp2[jCh], *singularVectors_e, MAX_OUTPUT_CHANNELS ); + set16_fx( sing_exp2[jCh], *singularVectors_e, MAX_OUTPUT_CHANNELS ); } secDiag[currChannel] = Mpy_32_32( *sig_x, *g ); + move32(); // rescaling block IF( GT_16( *sig_x_e, *secDiag_e ) ) { FOR( Word16 i = 0; i < MAX_OUTPUT_CHANNELS; i++ ){ IF( NE_16( i, currChannel ) ){ secDiag[i] = L_shl( secDiag[i], sub( *secDiag_e, *sig_x_e ) ); + move32(); } } *secDiag_e = *sig_x_e; +move16(); } ELSE IF( LT_16( *sig_x_e, *secDiag_e ) ) { secDiag[currChannel] = L_shr_r( secDiag[currChannel], sub( *secDiag_e, *sig_x_e ) ); + move32(); } /* Setting values to 0 */ ( *sig_x ) = 0; +move32(); ( *g ) = 0; +move32(); IF( LT_16( currChannel, nChannelsL ) ) /* i <= m */ { idx = currChannel; + move16(); FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ { @@ -1247,30 +1382,50 @@ IF( LT_16( currChannel, nChannelsL ) ) /* i <= m */ IF( ( *sig_x ) ) /*(fabsf(*sig_x) > EPSILON * fabsf(*sig_x)) { */ { norm_x = 0; + move32(); norm_x_e = 0; + move16(); FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ { singularVectors[jCh][currChannel] = BASOP_Util_Divide3232_Scale_cadence( singularVectors[jCh][currChannel], maxWithSign_fx( *sig_x ), &sing_exp[jCh] ); + move32(); sing_exp[jCh] = add( sing_exp[jCh], sub( *singularVectors_e, *sig_x_e ) ); + move16(); norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][currChannel] ), shl( sing_exp[jCh], 1 ), &norm_x_e ); } IF( GT_16( norm_x_e, 0 ) ) { norm_x = MAX_32; + move32(); norm_x_e = 0; + move16(); } L_temp_e = norm_x_e; + move16(); L_temp = Sqrt32( norm_x, &L_temp_e ); L_temp = L_shl_r( L_temp, L_temp_e ); // Q31 - ( *g ) = L_negate( GE_32( singularVectors[currChannel][idx], 0 ) ? L_temp : L_negate( L_temp ) ); + //( *g ) = L_negate( GE_32( singularVectors[currChannel][idx], 0 ) ? L_temp : L_negate( L_temp ) ); + IF( singularVectors[currChannel][idx] >= 0 ) + { + ( *g ) = L_negate( L_temp ); + move32(); + } + ELSE + { + ( *g ) = L_negate( L_negate( L_temp ) ); + move32(); + } r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ( *g ), singularVectors[currChannel][idx] ), sing_exp[currChannel], -norm_x, norm_x_e, &r_e ); singularVectors[currChannel][idx] = BASOP_Util_Add_Mant32Exp( singularVectors[currChannel][idx], sing_exp[idx], -( *g ), 0, &sing_exp[currChannel] ); + move32(); FOR( iCh = currChannel + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ { norm_x = 0; + move32(); norm_x_e = 0; + move16(); FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ { norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][iCh] ), add( sing_exp[jCh], *singularVectors_e ), &norm_x_e ); @@ -1282,6 +1437,7 @@ IF( LT_16( currChannel, nChannelsL ) ) /* i <= m */ FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ { singularVectors[jCh][iCh] = BASOP_Util_Add_Mant32Exp( singularVectors[jCh][iCh], *singularVectors_e, Mpy_32_32( f, singularVectors[jCh][currChannel] ), add( f_e, sing_exp[jCh] ), &sing_exp2[jCh][iCh] ); + move32(); } } @@ -1289,11 +1445,14 @@ IF( LT_16( currChannel, nChannelsL ) ) /* i <= m */ FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ { singularVectors[jCh][currChannel] = Mpy_32_32( singularVectors[jCh][currChannel], ( *sig_x ) ); + move32(); sing_exp2[jCh][currChannel] = add( sing_exp[jCh], *sig_x_e ); + move16(); } // rescaling block Word16 exp_max = *singularVectors_e; + move16(); FOR( iCh = 0; iCh < nChannelsC; iCh++ ) { FOR( jCh = 0; jCh < nChannelsL; jCh++ ) @@ -1307,25 +1466,31 @@ IF( LT_16( currChannel, nChannelsL ) ) /* i <= m */ FOR( jCh = 0; jCh < nChannelsL; jCh++ ) { singularVectors[jCh][iCh] = L_shr_r( singularVectors[jCh][iCh], sub( exp_max, sing_exp2[jCh][iCh] ) ); + move32(); } } *singularVectors_e = exp_max; + move16(); } // rescaling block singularValues[currChannel] = Mpy_32_32( ( *sig_x ), ( *g ) ); + move32(); IF( GT_16( *sig_x_e, *singularValues_e ) ) { FOR( Word16 i = 0; i < MAX_OUTPUT_CHANNELS; i++ ){ IF( NE_16( i, currChannel ) ){ singularValues[i] = L_shl( singularValues[i], sub( *singularValues_e, *sig_x_e ) ); + move32(); } } *singularValues_e = *sig_x_e; +move16(); } ELSE IF( LT_16( *sig_x_e, *singularValues_e ) ) { singularValues[currChannel] = L_shr_r( singularValues[currChannel], sub( *singularValues_e, *sig_x_e ) ); + move32(); } } @@ -1433,13 +1598,15 @@ static void biDiagonalReductionRight_fx( Word16 L_temp_e; FOR( jCh = 0; jCh < MAX_OUTPUT_CHANNELS; jCh++ ) { - set_s( sing_exp2[jCh], *singularVectors_e, MAX_OUTPUT_CHANNELS ); + set16_fx( sing_exp2[jCh], *singularVectors_e, MAX_OUTPUT_CHANNELS ); } - set_s( secDiag_exp, *secDiag_e, MAX_OUTPUT_CHANNELS ); + set16_fx( secDiag_exp, *secDiag_e, MAX_OUTPUT_CHANNELS ); /* Setting values to 0 */ ( *sig_x ) = 0; + move32(); ( *g ) = 0; + move32(); IF( LT_16( currChannel, nChannelsL ) && NE_16( currChannel, sub( nChannelsC, 1 ) ) ) /* i <=m && i !=n */ { @@ -1453,37 +1620,58 @@ static void biDiagonalReductionRight_fx( IF( ( *sig_x ) ) /*(fabsf(*sig_x) > EPSILON * fabsf(*sig_x)) { */ { norm_x = 0; + move32(); norm_x_e = 0; + move16(); FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /*nChannelsC */ { singularVectors[currChannel][jCh] = BASOP_Util_Divide3232_Scale_cadence( singularVectors[currChannel][jCh], maxWithSign_fx( *sig_x ), &sing_exp[jCh] ); + move32(); sing_exp[jCh] = add( sing_exp[jCh], sub( *singularVectors_e, *sig_x_e ) ); + move16(); norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[currChannel][jCh], singularVectors[currChannel][jCh] ), shl( sing_exp[jCh], 1 ), &norm_x_e ); } IF( GT_16( norm_x_e, 0 ) ) { norm_x = MAX_32; + move32(); norm_x_e = 0; + move16(); } L_temp_e = norm_x_e; + move16(); L_temp = Sqrt32( norm_x, &L_temp_e ); L_temp = L_shl_r( L_temp, L_temp_e ); // Q31 - ( *g ) = L_negate( GE_32( singularVectors[currChannel][idx], 0 ) ? L_temp : L_negate( L_temp ) ); + IF( singularVectors[currChannel][idx] >= 0 ) + { + ( *g ) = L_negate( L_temp ); + move32(); + } + ELSE + { + ( *g ) = L_negate( L_negate( L_temp ) ); + move32(); + } r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ( *g ), singularVectors[currChannel][idx] ), sing_exp[idx], -norm_x, norm_x_e, &r_e ); singularVectors[currChannel][idx] = BASOP_Util_Add_Mant32Exp( singularVectors[currChannel][idx], sing_exp[idx], -( *g ), 0, &sing_exp[idx] ); + move32(); FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ { secDiag[jCh] = BASOP_Util_Divide3232_Scale_cadence( singularVectors[currChannel][jCh], maxWithSign_fx( r ), &secDiag_exp[jCh] ); + move32(); secDiag_exp[jCh] = add( secDiag_exp[jCh], sub( sing_exp[jCh], r_e ) ); + move32(); } FOR( iCh = currChannel + 1; iCh < nChannelsL; iCh++ ) /* nChannelsL */ { norm_x = 0; + move32(); norm_x_e = 0; + move16(); FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ { norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[iCh][jCh], singularVectors[currChannel][jCh] ), add( *singularVectors_e, sing_exp[jCh] ), &norm_x_e ); @@ -1492,17 +1680,21 @@ static void biDiagonalReductionRight_fx( FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ { singularVectors[iCh][jCh] = BASOP_Util_Add_Mant32Exp( singularVectors[iCh][jCh], *singularVectors_e, Mpy_32_32( norm_x, secDiag[jCh] ), add( norm_x_e, secDiag_exp[jCh] ), &sing_exp2[iCh][jCh] ); + move32(); } } FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ { singularVectors[currChannel][jCh] = Mpy_32_32( singularVectors[currChannel][jCh], ( *sig_x ) ); + move32(); sing_exp2[currChannel][jCh] = add( sing_exp[jCh], *sig_x_e ); + move16(); } /*rescaling block*/ Word16 exp_max = *secDiag_e; + move16(); FOR( jCh = 0; jCh < nChannelsC; jCh++ ) { exp_max = s_max( exp_max, secDiag_exp[jCh] ); @@ -1510,10 +1702,12 @@ static void biDiagonalReductionRight_fx( FOR( jCh = 0; jCh < nChannelsC; jCh++ ) { secDiag[jCh] = L_shr_r( secDiag[jCh], sub( exp_max, secDiag_exp[jCh] ) ); + move32(); } exp_max = *singularVectors_e; + move16(); FOR( iCh = 0; iCh < nChannelsL; iCh++ ) { FOR( jCh = 0; jCh < nChannelsC; jCh++ ) @@ -1527,9 +1721,11 @@ static void biDiagonalReductionRight_fx( FOR( jCh = 0; jCh < nChannelsC; jCh++ ) { singularVectors[iCh][jCh] = L_shr_r( singularVectors[iCh][jCh], sub( exp_max, sing_exp2[iCh][jCh] ) ); + move32(); } } *singularVectors_e = exp_max; + move16(); } } @@ -1626,7 +1822,7 @@ static void singularVectorsAccumulationLeft_fx( Word16 sing_exp2[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS] = { 0 }; FOR( nCh = 0; nCh < MAX_OUTPUT_CHANNELS; nCh++ ) { - set_s( sing_exp2[nCh], singularVectors_e, MAX_OUTPUT_CHANNELS ); + set16_fx( sing_exp2[nCh], singularVectors_e, MAX_OUTPUT_CHANNELS ); } /* Processing */ @@ -1635,11 +1831,14 @@ static void singularVectorsAccumulationLeft_fx( FOR( nCh = nChannels - 1; nCh >= 0; nCh-- ) /* min(nChannelsL,ChannelsC) */ { t_ii = singularValues[nCh]; + move32(); t_ii_e = singularValues_e; + move16(); FOR( iCh = nCh + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ { singularVectors_Left[nCh][iCh] = 0; + move32(); } IF( t_ii ) /*if (fabsf(t_ii) > EPSILON *fabsf(t_ii)) {*/ @@ -1650,7 +1849,9 @@ static void singularVectorsAccumulationLeft_fx( FOR( iCh = nCh + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ { norm_y = 0; + move32(); norm_y_e = 0; + move16(); FOR( k = nCh + 1; k < nChannelsL; k++ ) /* nChannelsL */ { norm_y = BASOP_Util_Add_Mant32Exp( norm_y, norm_y_e, Mpy_32_32( singularVectors_Left[k][nCh], singularVectors_Left[k][iCh] ), add( sing_exp2[k][nCh], sing_exp2[k][iCh] ), &norm_y_e ); @@ -1661,13 +1862,16 @@ static void singularVectorsAccumulationLeft_fx( FOR( k = nCh; k < nChannelsL; k++ ) /* nChannelsL */ { singularVectors_Left[k][iCh] = BASOP_Util_Add_Mant32Exp( singularVectors_Left[k][iCh], sing_exp2[k][iCh], Mpy_32_32( t_jj, singularVectors_Left[k][nCh] ), add( t_jj_e, sing_exp2[k][nCh] ), &sing_exp2[k][iCh] ); + move32(); } } FOR( iCh = nCh; iCh < nChannelsL; iCh++ ) /* nChannelsL */ { singularVectors_Left[iCh][nCh] = Mpy_32_32( singularVectors_Left[iCh][nCh], t_ii ); + move32(); sing_exp2[iCh][nCh] = add( sing_exp2[iCh][nCh], t_ii_e ); + move16(); } } ELSE @@ -1675,10 +1879,12 @@ static void singularVectorsAccumulationLeft_fx( FOR( iCh = nCh; iCh < nChannelsL; iCh++ ) /* nChannelsL */ { singularVectors_Left[iCh][nCh] = 0; + move32(); } } singularVectors_Left[nCh][nCh] = BASOP_Util_Add_Mant32Exp( singularVectors_Left[nCh][nCh], sing_exp2[nCh][nCh], ONE_IN_Q30, 1, &sing_exp2[nCh][nCh] ); + move32(); } // fclose(fp); FOR( nCh = 0; nCh < nChannelsL; nCh++ ) @@ -1686,6 +1892,7 @@ static void singularVectorsAccumulationLeft_fx( FOR( iCh = 0; iCh < nChannelsC; iCh++ ) { singularVectors_Left[nCh][iCh] = L_shl_sat( singularVectors_Left[nCh][iCh], sing_exp2[nCh][iCh] ); + move32(); } } @@ -1779,6 +1986,7 @@ static void singularVectorsAccumulationRight_fx( /* avoid compiler warning */ t_ii = secDiag[nChannels - 1]; + move32(); FOR( nCh = nChannels - 1; nCh >= 0; nCh-- ) /* nChannelsC, min(nChannelsLmnChannelsC) otherwise */ { @@ -1792,14 +2000,18 @@ static void singularVectorsAccumulationRight_fx( { ratio_float = BASOP_Util_Divide3232_Scale_cadence( singularVectors_Left[nCh][iCh], maxWithSign_fx( singularVectors_Left[nCh][nCh + 1] ), &temp_exp1 ); singularVectors_Right[iCh][nCh] = BASOP_Util_Divide3232_Scale_cadence( ratio_float, maxWithSign_fx( t_ii ), &sing_right_exp[iCh][nCh] ); + move32(); sing_right_exp[iCh][nCh] = add( sing_right_exp[iCh][nCh], sub( temp_exp1, secDiag_e ) ); + move16(); // singularVectors_Right[iCh][nCh] = L_shl_sat( singularVectors_Right[iCh][nCh], temp_exp2 ); } FOR( iCh = nCh + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ { norm_y = 0; + move32(); norm_y_e = 0; + move16(); FOR( k = nCh + 1; k < nChannelsC; k++ ) /* nChannelsC */ { @@ -1809,8 +2021,11 @@ static void singularVectorsAccumulationRight_fx( FOR( k = nCh + 1; k < nChannelsC; k++ ) /* nChannelsC */ { singularVectors_Right[k][iCh] = BASOP_Util_Add_Mant32Exp( singularVectors_Right[k][iCh], sing_right_exp[k][iCh], Mpy_32_32( norm_y, singularVectors_Right[k][nCh] ), add( norm_y_e, sing_right_exp[k][nCh] ), &sing_right_exp[k][iCh] ); + move32(); singularVectors_Right[k][iCh] = L_shl_sat( singularVectors_Right[k][iCh], sing_right_exp[k][iCh] ); + move32(); sing_right_exp[k][iCh] = 0; + move16(); } } } @@ -1818,10 +2033,14 @@ static void singularVectorsAccumulationRight_fx( FOR( iCh = nCh + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ { singularVectors_Right[nCh][iCh] = singularVectors_Right[iCh][nCh] = 0; + move32(); + move32(); } } singularVectors_Right[nCh][nCh] = MAX_32; + move32(); t_ii = secDiag[nCh]; + move32(); } return; } @@ -1905,15 +2124,18 @@ static Word32 GivensRotation_fx( Word32 L_temp; x_abs = L_abs( x ); z_abs = L_abs( z ); + test(); IF( LE_32( x_abs, Mpy_32_32( CONVERGENCE_FACTOR_FX, x_abs ) ) && LE_32( z_abs, Mpy_32_32( CONVERGENCE_FACTOR_FX, z_abs ) ) ) { r = 0; + move32(); } - ELSE IF( GE_16( BASOP_Util_Cmp_Mant32Exp( x_abs, x_e, z_abs, z_e ), 0 ) ) + ELSE IF( BASOP_Util_Cmp_Mant32Exp( x_abs, x_e, z_abs, z_e ) >= 0 ) { IF( LE_32( x_abs, SVD_MINIMUM_VALUE_FX ) ) { r = 0; + move32(); } ELSE { @@ -1930,12 +2152,13 @@ static Word32 GivensRotation_fx( IF( LE_32( z_abs, SVD_MINIMUM_VALUE_FX ) ) { r = 0; + move32(); } ELSE { tan = BASOP_Util_Divide3232_Scale_cadence( x_abs, z_abs, &temp_exp ); temp_exp = add( temp_exp, sub( x_e, z_e ) ); - L_temp = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, Mpy_32_32( tan, tan ), 2 * temp_exp, &temp_exp ); + L_temp = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, Mpy_32_32( tan, tan ), shl( temp_exp, 1 ), &temp_exp ); L_temp = Sqrt32( L_temp, &temp_exp ); r = Mpy_32_32( z_abs, L_temp ); *out_e = add( z_e, temp_exp ); @@ -2000,7 +2223,7 @@ static Word32 maxWithSign_fx( { return a; } - ELSE IF( LT_32( a, 0 ) ) + ELSE IF( a < 0 ) { return -SVD_MINIMUM_VALUE_FX; } diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index 342c69d71..cb3512374 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -77,16 +77,16 @@ void stereo_tcx_init_dec_fx( TCX_DEC_HANDLE hTcxDec = st->hTcxDec; st->rate_switching_init = 0; - st->m_frame_type = ACTIVE_FRAME; - st->core_brate = st->total_brate; move16(); + st->m_frame_type = ACTIVE_FRAME; move16(); + st->core_brate = st->total_brate; move32(); /*sampling rate*/ st->sr_core = getCoreSamplerateMode2( st->element_mode, L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->bwidth, st->flag_ACELP16k, st->rf_flag, st->is_ism_format ); - st->fscale = sr2fscale( st->sr_core ); move32(); + st->fscale = sr2fscale( st->sr_core ); move16(); /*frame size*/ @@ -99,27 +99,29 @@ void stereo_tcx_init_dec_fx( test(); test(); test(); - IF( ( EQ_16( st->L_frame, L_FRAME16k ) && LE_32( ( L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ) ), MAX_ACELP_BRATE ) ) || ( st->tcxonly && ( EQ_32( st->sr_core, 32000 ) || EQ_32( st->sr_core, INT_FS_16k ) ) ) ) + IF( ( EQ_16( st->L_frame, L_FRAME16k ) && LE_32( L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), MAX_ACELP_BRATE ) ) || ( st->tcxonly && ( EQ_32( st->sr_core, 32000 ) || EQ_32( st->sr_core, INT_FS_16k ) ) ) ) { st->nb_subfr = NB_SUBFR16k; + move16(); } ELSE { st->nb_subfr = NB_SUBFR; + move16(); } move16(); /*TCX tools*/ st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->rf_flag ); - st->hTcxCfg->resq = getResq( L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ) ); - hTcxDec->tcx_lpc_shaped_ari = getTcxLpcShapedAri( L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->rf_flag, st->element_mode ); - st->igf = getIgfPresent_fx( st->element_mode, L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->bwidth, st->rf_flag ); move16(); + st->hTcxCfg->resq = getResq( L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ) ); move16(); + hTcxDec->tcx_lpc_shaped_ari = getTcxLpcShapedAri( L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->rf_flag, st->element_mode ); move16(); + st->igf = getIgfPresent_fx( st->element_mode, L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->bwidth, st->rf_flag ); move16(); - IF( NE_16( st->element_mode, EVS_MONO ) ) + IF( st->element_mode != EVS_MONO ) { st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->igf, st->element_mode ); move16(); @@ -135,25 +137,29 @@ void stereo_tcx_init_dec_fx( st->tcxonly = getTcxonly_fx( st->element_mode, L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), MCT_flag, st->is_ism_format ); move16(); - test(); /* LPC quantization */ + test(); IF( LE_32( st->sr_core, INT_FS_16k ) && st->tcxonly == 0 ) { st->lpcQuantization = 1; + move16(); } ELSE { st->lpcQuantization = 0; + move16(); } move16(); IF( st->tcxonly == 0 ) { st->numlpc = 1; + move16(); } ELSE { st->numlpc = 2; + move16(); } move16(); } @@ -169,7 +175,7 @@ void stereo_tcx_init_dec_fx( test(); IF( ( NE_32( st->bits_frame_nominal, st->last_bits_frame_nominal ) ) || ( NE_16( st->bwidth, st->last_bwidth ) ) || - ( NE_16( st->last_core, TCX_20_CORE ) && NE_16( st->last_core, TCX_10_CORE ) && !( EQ_16( st->prev_bfi, 1 ) && EQ_16( st->last_core, ACELP_CORE ) && EQ_16( st->last_con_tcx, 1 ) ) ) || + ( NE_16( st->last_core, TCX_20_CORE ) && NE_16( st->last_core, TCX_10_CORE ) && !( EQ_16( st->prev_bfi, 1 ) && st->last_core == ACELP_CORE && EQ_16( st->last_con_tcx, 1 ) ) ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_MDCT ) && NE_16( last_element_mode, IVAS_CPE_MDCT ) ) ) { /*re-initialization*/ @@ -356,24 +362,24 @@ void stereo_tcx_core_dec_fx( iDiv_and_mod_32( st->total_brate, FRAMES_PER_SEC, &L_tmp, &mod, 0 ); total_nbbits = extract_l( L_tmp ); bitsRead = 0; - LSF_Q_prediction = -1; /* to avoid compilation warnings */ - move16(); + LSF_Q_prediction = -1; /* to avoid compilation warnings */ move16(); - IF( EQ_32( frameMode, FRAMEMODE_NORMAL ) ) + + IF( frameMode == FRAMEMODE_NORMAL ) { st->m_decodeMode = DEC_NO_FRAM_LOSS; + move32(); bfi = 0; move16(); - move16(); } IF( EQ_32( frameMode, FRAMEMODE_MISSING ) ) { st->m_decodeMode = DEC_CONCEALMENT_EXT; + move32(); bfi = 1; move16(); - move16(); } /* for bass postfilter */ IF( st->tcxonly ) @@ -403,6 +409,7 @@ void stereo_tcx_core_dec_fx( IF( !bfi ) { st->second_last_core = st->last_core; + move16(); move16(); dec_prm_tcx_ivas_fx( st, param, param_lpc, &total_nbbits, last_element_mode, &bitsRead ); @@ -439,10 +446,12 @@ void stereo_tcx_core_dec_fx( IF( bfi && st->use_partial_copy && EQ_16( st->rf_frame_type, RF_TCXFD ) ) { tcx_lpc_cdk = tcxlpc_get_cdk( GENERIC ); + move16(); } ELSE { tcx_lpc_cdk = tcxlpc_get_cdk( st->coder_type ); + move16(); } Copy( st->lsf_old_fx, &lsf_fx[0], M ); @@ -455,6 +464,7 @@ void stereo_tcx_core_dec_fx( lsf_update_memory( st->narrowBand, &lsf_fx[M], st->mem_MA_fx, st->mem_MA_fx, M ); Copy( &lsf_fx[M], st->mem_AR_fx, M ); hTcxDec->envWeighted = 1; + move16(); move16(); E_LPC_lsp_unweight( &lsp_fx[M], lspnew_uw_fx, lsfnew_uw_fx, st->inv_gamma /*1.0f / st->gamma_float*/, M ); @@ -483,11 +493,11 @@ void stereo_tcx_core_dec_fx( { FOR( i = 0; i < M; i++ ) { - st->lsf_adaptive_mean_fx[i] = add( add( mult_r( st->lsfoldbfi1_fx[i], ONE_BY_THREE_Q15 ), mult_r( st->lsfoldbfi0_fx[i], ONE_BY_THREE_Q15 ) ), mult_r( lsfnew_uw_fx[add( imult1616( k, M ), i )], ONE_BY_THREE_Q15 ) ); - st->lsfoldbfi1_fx[i] = st->lsfoldbfi0_fx[i]; - st->lsfoldbfi0_fx[i] = lsfnew_uw_fx[add( imult1616( k, M ), i )]; + st->lsf_adaptive_mean_fx[i] = add( add( mult_r( st->lsfoldbfi1_fx[i], ONE_BY_THREE_Q15 ), mult_r( st->lsfoldbfi0_fx[i], ONE_BY_THREE_Q15 ) ), mult_r( lsfnew_uw_fx[add( i_mult( k, M ), i )], ONE_BY_THREE_Q15 ) ); move16(); + st->lsfoldbfi1_fx[i] = st->lsfoldbfi0_fx[i]; move16(); + st->lsfoldbfi0_fx[i] = lsfnew_uw_fx[add( i_mult( k, M ), i )]; move16(); } } @@ -501,10 +511,12 @@ void stereo_tcx_core_dec_fx( IF( st->tcxonly == 0 || LT_16( st->core, TCX_10_CORE ) ) { st->numlpc = 1; + move16(); } ELSE { st->numlpc = 2; + move16(); } move16(); @@ -550,6 +562,7 @@ void stereo_tcx_core_dec_fx( E_LPC_f_lsp_a_conversion( st->lsp_old_fx, st->old_Aq_12_8_fx, M ); } + test(); if ( st->enablePlcWaveadjust && bfi ) { st->hPlcInfo->nbLostCmpt = add( st->hPlcInfo->nbLostCmpt, 1 ); @@ -560,7 +573,7 @@ void stereo_tcx_core_dec_fx( * TD-TCX concealment *--------------------------------------------------------------------------------*/ - IF( EQ_16( st->core, ACELP_CORE ) ) + IF( st->core == ACELP_CORE ) { assert( bfi ); /*must only happen in BFI*/ @@ -594,7 +607,7 @@ void stereo_tcx_core_dec_fx( test(); IF( st->narrowBand || EQ_32( st->sr_core, INT_FS_12k8 ) || EQ_32( st->sr_core, INT_FS_16k ) ) { - Copy( Aq_fx, st->mem_Aq, imult1616( st->nb_subfr, ( M + 1 ) ) ); + Copy( Aq_fx, st->mem_Aq, i_mult( st->nb_subfr, ( M + 1 ) ) ); } /* PLC: [TCX: Tonal Concealment] */ @@ -618,6 +631,7 @@ void stereo_tcx_core_dec_fx( IF( !bfi ) { st->stab_fac_fx = lsf_stab_fx( &lsf_fx[M], &lsf_fx[0], 0, st->L_frame ); + move16(); } IF( hTcxDec->enableTcxLpc ) @@ -733,7 +747,7 @@ void stereo_tcx_core_dec_fx( IF( st->narrowBand || EQ_32( st->sr_core, INT_FS_12k8 ) || EQ_32( st->sr_core, INT_FS_16k ) ) { int_lsp_fx( st->L_frame, st->lspold_uw, lspnew_uw_fx, Aq_fx, M, interpol_frac_fx, 0 ); - Copy( Aq_fx, st->mem_Aq, imult1616( st->nb_subfr, ( M + 1 ) ) ); + Copy( Aq_fx, st->mem_Aq, i_mult( st->nb_subfr, ( M + 1 ) ) ); } } } @@ -755,10 +769,17 @@ void stereo_tcx_core_dec_fx( /* note: codec_mode is forced to MODE2, since FEC_clas_estim() considers only TCX being in Mode2*/ Word16 prev_codec_mode = st->codec_mode; - st->codec_mode = MODE2; move16(); + st->codec_mode = MODE2; move16(); - FEC_clas_estim_fx( st, 0, st->L_frame, &st->clas_dec, st->tcxonly ? GENERIC : st->core_ext_mode, pitch_C, synth_fx, &st->lp_ener_FER_fx, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /*st->core_brate*/, st->Q_syn, NULL, st->mem_syn_clas_estim_fx, &st->classifier_Q_mem_syn, hTcxLtpDec->tcxltp ? hTcxDec->tcxltp_last_gain_unmodified : MIN_16, CLASSIFIER_TCX, bfi, st->last_core_brate, -1 ); + IF( st->tcxonly ) + { + FEC_clas_estim_fx( st, 0, st->L_frame, &st->clas_dec, GENERIC, pitch_C, synth_fx, &st->lp_ener_FER_fx, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /*st->core_brate*/, st->Q_syn, NULL, st->mem_syn_clas_estim_fx, &st->classifier_Q_mem_syn, hTcxLtpDec->tcxltp ? hTcxDec->tcxltp_last_gain_unmodified : MIN_16, CLASSIFIER_TCX, bfi, st->last_core_brate, -1 ); + } + ELSE + { + FEC_clas_estim_fx( st, 0, st->L_frame, &st->clas_dec, st->core_ext_mode, pitch_C, synth_fx, &st->lp_ener_FER_fx, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /*st->core_brate*/, st->Q_syn, NULL, st->mem_syn_clas_estim_fx, &st->classifier_Q_mem_syn, hTcxLtpDec->tcxltp ? hTcxDec->tcxltp_last_gain_unmodified : MIN_16, CLASSIFIER_TCX, bfi, st->last_core_brate, -1 ); + } st->codec_mode = prev_codec_mode; move16(); } @@ -770,7 +791,7 @@ void stereo_tcx_core_dec_fx( *--------------------------------------------------------------------------------*/ test(); - IF( bfi && NE_16( st->last_core, ACELP_CORE ) ) + IF( bfi && st->last_core != ACELP_CORE ) { /* Update FEC_scale_syn parameters */ IF( hTcxLtpDec->tcxltp_gain == 0 ) @@ -808,8 +829,8 @@ void stereo_tcx_core_dec_fx( } ELSE { - Copy( &lsp_fx[st->numlpc * M], st->lsp_old_fx, M ); - Copy( &lsf_fx[st->numlpc * M], st->lsf_old_fx, M ); + Copy( &lsp_fx[i_mult( st->numlpc, M )], st->lsp_old_fx, M ); + Copy( &lsf_fx[i_mult( st->numlpc, M )], st->lsf_old_fx, M ); } Copy( st->lsp_q_cng, st->old_lsp_q_cng, M ); Copy( st->lsf_q_cng, st->old_lsf_q_cng, M ); @@ -821,7 +842,7 @@ void stereo_tcx_core_dec_fx( /* update CNG parameters in active frames */ test(); test(); - IF( EQ_16( st->bwidth, NB ) && hTcxDec->enableTcxLpc && NE_16( st->core, ACELP_CORE ) ) + IF( EQ_16( st->bwidth, NB ) && hTcxDec->enableTcxLpc && st->core != ACELP_CORE ) { Word16 buf[L_LP], res[L_FRAME], A[M + 1], r_h[M + 1], r_l[M + 1], tmp, lsptmp[M], q_r; assert( EQ_16( st->L_frame, L_FRAME ) ); @@ -846,15 +867,17 @@ void stereo_tcx_core_dec_fx( cng_params_upd_ivas_fx( &lsp_fx[M], st->old_exc_fx + sub( L_EXC_MEM_DEC, st->L_frame ), st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, st->hTdCngDec->ho_lsp_circ_fx, st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate, st->element_mode, st->hFdCngDec->hFdCngCom->CngBandwidth ); } /* Set 16k LSP flag for CNG buffer */ + // st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = ( st->L_frame == L_FRAME ? 0 : 1 ); IF( EQ_16( st->L_frame, L_FRAME ) ) { st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 0; + move16(); } ELSE { st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 1; + move16(); } - move16(); } st->last_is_cng = 0; @@ -913,8 +936,8 @@ void stereo_tcx_core_dec_fx( /* updates */ st->last_voice_factor_fx = 0; - st->last_coder_type = st->coder_type; move16(); + st->last_coder_type = st->coder_type; move16(); /* -------------------------------------------------------------- * @@ -952,7 +975,6 @@ void stereo_tcx_core_dec_fx( /* Generate additional comfort noise to mask potential coding artefacts */ test(); - test(); IF( EQ_16( st->m_frame_type, ACTIVE_FRAME ) && st->flag_cna && !st->cna_dirac_flag ) { test(); @@ -1808,12 +1830,12 @@ static void dec_prm_tcx_ivas_fx( move16(); } start_bit_pos = st->next_bit_pos; + move16(); /* Init LTP data */ st->hTcxDec->tcx_hm_LtpPitchLag = -1; - st->hTcxLtpDec->tcxltp_gain = 0; - move16(); move16(); + st->hTcxLtpDec->tcxltp_gain = 0; move16(); /*--------------------------------------------------------------------------------* @@ -1829,8 +1851,9 @@ static void dec_prm_tcx_ivas_fx( { st->last_core_from_bs = get_next_indice_fx( st, 1 ); /* Store decoder memory of last_core */ move16(); + test(); - IF( EQ_16( st->last_core, ACELP_CORE ) && NE_16( st->last_core_from_bs, ACELP_CORE ) ) + IF( st->last_core == ACELP_CORE && st->last_core_from_bs != ACELP_CORE ) { /* A mismatch between the memory and the last_core from the bitstream indicates a frame was lost. If prev_bfi is @@ -1845,7 +1868,7 @@ static void dec_prm_tcx_ivas_fx( test(); test(); test(); - IF( NE_16( st->last_core, st->last_core_from_bs ) && ( NE_16( st->last_core_from_bs, TCX_20_CORE ) && NE_16( st->last_core_from_bs, TCX_10_CORE ) && !( EQ_16( st->prev_bfi, 1 ) && EQ_16( st->last_core_from_bs, ACELP_CORE ) && EQ_16( st->last_con_tcx, 1 ) ) ) ) + IF( NE_16( st->last_core, st->last_core_from_bs ) && ( NE_16( st->last_core_from_bs, TCX_20_CORE ) && NE_16( st->last_core_from_bs, TCX_10_CORE ) && !( EQ_16( st->prev_bfi, 1 ) && st->last_core_from_bs == ACELP_CORE && EQ_16( st->last_con_tcx, 1 ) ) ) ) { Word16 Q_old_Aq_12_8 = Q12; move16(); diff --git a/lib_dec/ivas_td_low_rate_dec.c b/lib_dec/ivas_td_low_rate_dec.c index 4731bf883..02eb8e9a0 100644 --- a/lib_dec/ivas_td_low_rate_dec.c +++ b/lib_dec/ivas_td_low_rate_dec.c @@ -249,10 +249,10 @@ void tdm_low_rate_dec_fx( move16(); st->GSC_IVAS_mode = 0; - st->GSC_noisy_speech = 1; - hGSCDec->noise_lev = 14; move16(); + st->GSC_noisy_speech = 1; move16(); + hGSCDec->noise_lev = 14; move16(); pit_band_idx = 10 + BAND1k2; @@ -266,18 +266,22 @@ void tdm_low_rate_dec_fx( // set_f(exc, 0, L_FRAME); // set_f(dct_epit, 0, L_FRAME); // set_f(pitch_buf, L_SUBFR, NB_SUBFR); - set_s( exc, 0, L_FRAME ); - set_s( dct_epit, 0, L_FRAME ); - set_s( pitch_buf, shl( L_SUBFR, Q6 ), NB_SUBFR ); + set16_fx( exc, 0, L_FRAME ); + set16_fx( dct_epit, 0, L_FRAME ); + set16_fx( pitch_buf, shl( L_SUBFR, Q6 ), NB_SUBFR ); st->bpf_off = 1; move16(); st->bfi_pitch_fx = mean_fx( pitch_buf, 4 ); move16(); st->bfi_pitch_frame = L_FRAME; + move16(); Diff_len = L_FRAME / 2; + move16(); st->bpf_off = 0; + move16(); attack_flag = 0; + move16(); move16(); move16(); @@ -289,9 +293,10 @@ void tdm_low_rate_dec_fx( /* find the current total number of bits used */ tmp_nb_bits_tot = st->next_bit_pos; + move16(); move16(); - if ( EQ_16( st->element_mode, IVAS_CPE_TD ) ) + if( EQ_16( st->element_mode, IVAS_CPE_TD ) ) { tmp_nb_bits_tot = add( tmp_nb_bits_tot, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ); } @@ -301,7 +306,7 @@ void tdm_low_rate_dec_fx( tmp_nb_bits_tot = sub( tmp_nb_bits_tot, STEREO_BITS_TCA ); } - if ( st->extl_brate_orig > 0 ) + if( st->extl_brate_orig > 0 ) { /* subtract 1 bit for TBE/BWE BWE flag (bit counted in extl_brate) */ tmp_nb_bits_tot = sub( tmp_nb_bits_tot, 1 ); @@ -333,7 +338,7 @@ void tdm_low_rate_dec_fx( *--------------------------------------------------------------------------------------*/ // set_f(voice_factors, 0.0f, NB_SUBFR16k); - set_s( voice_factors, 0, NB_SUBFR16k ); + set16_fx( voice_factors, 0, NB_SUBFR16k ); IF( st->hBWE_TD != NULL ) { @@ -345,7 +350,7 @@ void tdm_low_rate_dec_fx( ELSE { // set_f(bwe_exc, 0, L_FRAME32k); - set_s( bwe_exc, 0, L_FRAME32k ); + set16_fx( bwe_exc, 0, L_FRAME32k ); } } @@ -362,7 +367,7 @@ void tdm_low_rate_dec_fx( * Channel aware mode parameters *--------------------------------------------------------------------------------------*/ - set_s( st->tilt_code_dec_fx, 0, NB_SUBFR16k ); + set16_fx( st->tilt_code_dec_fx, 0, NB_SUBFR16k ); return; } @@ -536,13 +541,13 @@ void decod_gen_2sbfr_ivas_fx( // float code[2 * L_SUBFR]; /* algebraic codevector */ // const float *p_Aq; /* Pointer to frame LP coefficient */ // float *pt_pitch; /* pointer to floating pitch */ - Word16 gain_pit = 0; /* pitch gain */ - Word32 gain_code = 0; /* gain/normalized gain of the algebraic excitation */ - Word32 norm_gain_code = 0; /* normalized gain of the algebraic excitation */ - Word16 gain_inov = 0; /* Innovation gain */ + Word16 gain_pit = 0; /* pitch gain */ move16(); + Word32 gain_code = 0; /* gain/normalized gain of the algebraic excitation */ move32(); + Word32 norm_gain_code = 0; /* normalized gain of the algebraic excitation */ move32(); + Word16 gain_inov = 0; /* Innovation gain */ move16(); // Word16 gains_mem[2 * (NB_SUBFR - 1)]; /* pitch gain and code gain from previous subframes */ Word32 gc_mem[NB_SUBFR - 1]; /* gain_code from previous subframes */ @@ -565,8 +570,11 @@ void decod_gen_2sbfr_ivas_fx( move16(); T0 = PIT_MIN; + move16(); T0_frac = 0; + move16(); error = 0; + move16(); move16(); move16(); @@ -695,15 +703,16 @@ void decod_gen_2sbfr_ivas_fx( pt_pitch++; *pt_pitch = *( pt_pitch - 1 ); + move16(); pt_pitch++; gain_buf[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/] = gain_pit; - gain_buf[shr( add( i_subfr, L_SUBFR ), 6 ) /*(i_subfr+L_SUBFR) / L_SUBFR*/] = gain_pit; - st->tilt_code_dec_fx[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/] = st->tilt_code_fx; - st->tilt_code_dec_fx[shr( add( i_subfr, L_SUBFR ), 6 ) /*( i_subfr + L_SUBFR ) / L_SUBFR*/] = st->tilt_code_fx; move16(); + gain_buf[shr( add( i_subfr, L_SUBFR ), 6 ) /*(i_subfr+L_SUBFR) / L_SUBFR*/] = gain_pit; move16(); + st->tilt_code_dec_fx[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/] = st->tilt_code_fx; move16(); + st->tilt_code_dec_fx[shr( add( i_subfr, L_SUBFR ), 6 ) /*( i_subfr + L_SUBFR ) / L_SUBFR*/] = st->tilt_code_fx; move16(); // st->tilt_code_dec[i_subfr / L_SUBFR] = st->tilt_code; // st->tilt_code_dec[( i_subfr + L_SUBFR ) / L_SUBFR] = st->tilt_code; diff --git a/lib_rend/ivas_mcmasa_ana.c b/lib_rend/ivas_mcmasa_ana.c index d210b3603..b0c4e82a0 100644 --- a/lib_rend/ivas_mcmasa_ana.c +++ b/lib_rend/ivas_mcmasa_ana.c @@ -172,59 +172,75 @@ ivas_error ivas_mcmasa_ana_open( IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_5_1 ) ) { nchan_inp = 6; - Copy32( ls_azimuth_CICP6_fx, ls_azimuth_fx, nchan_inp - 1 ); - Copy32( ls_elevation_CICP6_fx, ls_elevation_fx, nchan_inp - 1 ); + move16(); + Copy32( ls_azimuth_CICP6_fx, ls_azimuth_fx, 5 ); /* nchan_inp - 1 */ + Copy32( ls_elevation_CICP6_fx, ls_elevation_fx, 5 ); /* nchan_inp - 1 */ hMcMasa->numHorizontalChannels = 5; + move16(); hMcMasa->isHorizontalSetup = 1; + move16(); } ELSE IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_7_1 ) ) { nchan_inp = 8; - Copy32( ls_azimuth_CICP12_fx, ls_azimuth_fx, nchan_inp - 1 ); - Copy32( ls_elevation_CICP12_fx, ls_elevation_fx, nchan_inp - 1 ); + move16(); + Copy32( ls_azimuth_CICP12_fx, ls_azimuth_fx, 7 ); /* nchan_inp - 1 */ + Copy32( ls_elevation_CICP12_fx, ls_elevation_fx, 7 ); /* nchan_inp - 1 */ hMcMasa->numHorizontalChannels = 7; + move16(); hMcMasa->isHorizontalSetup = 1; + move16(); } ELSE IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_5_1_2 ) ) { nchan_inp = 8; - Copy32( ls_azimuth_CICP14_fx, ls_azimuth_fx, nchan_inp - 1 ); - Copy32( ls_elevation_CICP14_fx, ls_elevation_fx, nchan_inp - 1 ); + move16(); + Copy32( ls_azimuth_CICP14_fx, ls_azimuth_fx, 7 ); /* nchan_inp - 1 */ + Copy32( ls_elevation_CICP14_fx, ls_elevation_fx, 7 ); /* nchan_inp - 1 */ hMcMasa->numHorizontalChannels = 5; + move16(); hMcMasa->isHorizontalSetup = 0; + move16(); } ELSE IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_5_1_4 ) ) { nchan_inp = 10; - Copy32( ls_azimuth_CICP16_fx, ls_azimuth_fx, nchan_inp - 1 ); - Copy32( ls_elevation_CICP16_fx, ls_elevation_fx, nchan_inp - 1 ); + Copy32( ls_azimuth_CICP16_fx, ls_azimuth_fx, 9 ); /* nchan_inp - 1 */ + Copy32( ls_elevation_CICP16_fx, ls_elevation_fx, 9 ); /* nchan_inp - 1 */ hMcMasa->numHorizontalChannels = 5; + move16(); hMcMasa->isHorizontalSetup = 0; + move16(); } ELSE { nchan_inp = 12; - Copy32( ls_azimuth_CICP19_fx, ls_azimuth_fx, nchan_inp - 1 ); - Copy32( ls_elevation_CICP19_fx, ls_elevation_fx, nchan_inp - 1 ); + move16(); + Copy32( ls_azimuth_CICP19_fx, ls_azimuth_fx, 11 ); /* nchan_inp - 1 */ + Copy32( ls_elevation_CICP19_fx, ls_elevation_fx, 11 ); /* nchan_inp - 1 */ hMcMasa->numHorizontalChannels = 7; + move16(); hMcMasa->isHorizontalSetup = 0; + move16(); } numAnalysisChannels = sub( nchan_inp, 1 ); /* Determine the number of bands */ hMcMasa->nbands = MASA_FREQUENCY_BANDS; - + move16(); /* Determine band grouping */ Copy( MASA_band_grouping_24, hMcMasa->band_grouping, 24 + 1 ); maxBin = extract_l( W_extract_h( W_add( W_mult_32_32( input_Fs, INV_CLDFB_BANDWIDTH_Q31 ), ONE_IN_Q31 /*0.5f in Q31*/ ) ) ); - FOR( i = 1; i < hMcMasa->nbands + 1; i++ ) + FOR( i = 1; i < add( hMcMasa->nbands, 1 ); i++ ) { IF( GE_16( hMcMasa->band_grouping[i], maxBin ) ) { hMcMasa->band_grouping[i] = maxBin; + move16(); hMcMasa->nbands = i; + move16(); break; } } @@ -234,9 +250,10 @@ ivas_error ivas_mcmasa_ana_open( /* open/initialize CLDFB */ hMcMasa->num_Cldfb_instances = numAnalysisChannels; + move16(); FOR( i = 0; i < hMcMasa->num_Cldfb_instances; i++ ) { - IF( ( error = openCldfb_ivas( &( hMcMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = openCldfb_ivas( &( hMcMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) { return error; } @@ -308,22 +325,32 @@ ivas_error ivas_mcmasa_ana_open( FOR( i = 0; i < numAnalysisChannels; i++ ) { hMcMasa->chnlToFoaMtx_fx[0][i] = ONE_IN_Q31; + move32(); hMcMasa->chnlToFoaMtx_fx[1][i] = L_mult( getSineWord16R2( extract_l( L_shr( Mult_32_16( ls_azimuth_fx[i], 91 /*32767/360*/ ), 7 ) ) ), getCosWord16R2( extract_l( L_shr( Mult_32_16( ls_elevation_fx[i], 91 ), 7 ) ) ) ); + move32(); hMcMasa->chnlToFoaMtx_fx[2][i] = L_shl( getSineWord16R2( extract_l( L_shr( Mult_32_16( ls_elevation_fx[i], 91 ), 7 ) ) ), 16 ); + move32(); hMcMasa->chnlToFoaMtx_fx[3][i] = L_mult( getCosWord16R2( extract_l( L_shr( Mult_32_16( ls_azimuth_fx[i], 91 ), 7 ) ) ), getCosWord16R2( extract_l( L_shr( Mult_32_16( ls_elevation_fx[i], 91 ), 7 ) ) ) ); + move32(); hMcMasa->chnlToFoaEvenMtx_fx[0][i] = ONE_IN_Q31; + move32(); hMcMasa->chnlToFoaEvenMtx_fx[1][i] = L_shl( getSineWord16R2( extract_l( L_shr( Mult_32_16( ls_azimuth_even_fx[i], 91 ), 7 ) ) ), 16 ); + move32(); hMcMasa->chnlToFoaEvenMtx_fx[2][i] = 0; + move32(); hMcMasa->chnlToFoaEvenMtx_fx[3][i] = L_shl( getCosWord16R2( extract_l( L_shr( Mult_32_16( ls_azimuth_even_fx[i], 91 ), 7 ) ) ), 16 ); + move32(); } Copy32( ls_azimuth_fx, hMcMasa->ls_azimuth_fx, numAnalysisChannels ); FOR( i = 0; i < hMcMasa->numHorizontalChannels; i++ ) { - left_min_fx = L_shl( 360, 22 ); - right_min_fx = L_shl( -360, 22 ); + left_min_fx = 360 << 22; + move32(); + right_min_fx = -( 360 << 22 ); + move32(); FOR( j = 0; j < hMcMasa->numHorizontalChannels; j++ ) { @@ -337,34 +364,47 @@ ivas_error ivas_mcmasa_ana_open( { azi_diff_fx = L_add( azi_diff_fx, 360 << 22 ); } - + test(); IF( LT_32( azi_diff_fx, left_min_fx ) && GT_32( azi_diff_fx, 0 ) ) { hMcMasa->leftNearest[i] = j; + move16(); left_min_fx = azi_diff_fx; + move32(); } - + test(); IF( GT_32( azi_diff_fx, right_min_fx ) && LT_32( azi_diff_fx, 0 ) ) { hMcMasa->rightNearest[i] = j; + move16(); right_min_fx = azi_diff_fx; + move32(); } } } hMcMasa->prevMultiChEne_fx = 0; + move32(); hMcMasa->prevDownmixEne_fx = 0; + move32(); hMcMasa->prevMultiChEne_e = 0; + move16(); hMcMasa->prevDownmixEne_e = 0; + move16(); hMcMasa->prevEQ_e = 1; + move16(); hMcMasa->prevEQ_fx = 1073741824; - input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + move32(); + input_frame = (Word16) Mpy_32_32( input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ); + move16(); FOR( i = 0; i < input_frame; i++ ) { hMcMasa->interpolator_fx[i] = div_s( i, input_frame ); + move16(); } hMcMasa->index_buffer_intensity = 0; + move16(); IF( ( hMcMasa->hMasaOut = (MASA_DECODER_EXT_OUT_META_HANDLE) malloc( sizeof( MASA_DECODER_EXT_OUT_META ) ) ) == NULL ) { @@ -616,7 +656,8 @@ void ivas_mcmasa_ana_close( { Word16 i, j; - IF( hMcMasa == NULL || *hMcMasa == NULL ) + test(); + if ( hMcMasa == NULL || *hMcMasa == NULL ) { return; } @@ -650,31 +691,6 @@ void ivas_mcmasa_ana_close( free( ( *hMcMasa )->buffer_intensity_real_vert_fx[j] ); ( *hMcMasa )->buffer_intensity_real_vert_fx[j] = NULL; } -#if 0 /*TODO: To be removed later( freeing float buffer)*/ - FOR ( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - FOR ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) - { - free( ( *hMcMasa )->direction_vector_m[i][j] ); - ( *hMcMasa )->direction_vector_m[i][j] = NULL; - } - - FOR ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) - { - free( ( *hMcMasa )->buffer_intensity_real[i][j] ); - ( *hMcMasa )->buffer_intensity_real[i][j] = NULL; - } - - free( ( *hMcMasa )->direction_vector_m[i] ); - ( *hMcMasa )->direction_vector_m[i] = NULL; - } - - FOR ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) - { - free( ( *hMcMasa )->buffer_intensity_real_vert[j] ); - ( *hMcMasa )->buffer_intensity_real_vert[j] = NULL; - } -#endif free( ( *hMcMasa )->hMasaOut ); ( *hMcMasa )->hMasaOut = NULL; @@ -779,7 +795,7 @@ void ivas_mcmasa_ana_fx( /* Downmix */ - ivas_mcmasa_dmx_fx( hMcMasa, data, 31 - q_data, input_frame, nchan_transport, nchan_inp ); + ivas_mcmasa_dmx_fx( hMcMasa, data, sub( 31, q_data ), input_frame, nchan_transport, nchan_inp ); return; @@ -870,6 +886,7 @@ void ivas_mcmasa_param_est_ana_fx( Word16 lsEnergy_e[MCMASA_MAX_ANA_CHANS]; Word32 lsEnergySum_fx, maxEne_fx; Word16 lsEnergySum_e = 0; + move16(); Word16 maxEne_e; Word32 angleDist_fx, minAngleDist_fx; Word32 currentAzi_fx; @@ -896,8 +913,10 @@ void ivas_mcmasa_param_est_ana_fx( Word16 numAnalysisChannels; Word16 spreadCoh_e; num_freq_bins = hMcMasa->cldfbAnaEnc[0]->no_channels; + move16(); num_freq_bands = hMcMasa->nbands; - l_ts = input_frame / CLDFB_NO_COL_MAX; + move16(); + l_ts = idiv1616( input_frame, CLDFB_NO_COL_MAX ); numAnalysisChannels = sub( nchan_inp, 1 ); set16_fx( q_vdv, 31, MASA_FREQUENCY_BANDS ); @@ -906,16 +925,24 @@ void ivas_mcmasa_param_est_ana_fx( FOR( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) { mrange[0] = hMcMasa->block_grouping[block_m_idx]; + move16(); mrange[1] = hMcMasa->block_grouping[block_m_idx + 1]; + move16(); FOR( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) { hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = 0; + move16(); hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = 0; + move16(); hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = 0; + move16(); hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx] = 0; + move16(); hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx] = 0; + move16(); hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx] = 0; + move16(); } /* Need to initialize renormalization_factors, and variables to be normalized */ @@ -940,11 +967,15 @@ void ivas_mcmasa_param_est_ana_fx( FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { Word16 cr_q = MAX_16, ci_q = MAX_16, sf, c_e; + move16(); + move16(); Word16 inp_q = q_data; + move16(); FOR( i = 0; i < numAnalysisChannels; i++ ) { inp_q = q_data; - cldfbAnalysis_ts_fx_fixed_q( &( data_fx[i][l_ts * ts] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hMcMasa->cldfbAnaEnc[i], &inp_q ); + move16(); + cldfbAnalysis_ts_fx_fixed_q( &( data_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hMcMasa->cldfbAnaEnc[i], &inp_q ); cr_q = s_min( cr_q, getScaleFactor32( Chnl_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); ci_q = s_min( ci_q, getScaleFactor32( Chnl_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); } @@ -957,17 +988,21 @@ void ivas_mcmasa_param_est_ana_fx( inp_q = add( inp_q, sf ); c_e = sub( 31, inp_q ); hMcMasa->chnlToFoaMtx_e = c_e; + move16(); /* Compute channel-based energy for metadata processing */ FOR( band_m_idx = 0; band_m_idx < num_freq_bands; band_m_idx++ ) { brange[0] = hMcMasa->band_grouping[band_m_idx]; + move16(); brange[1] = hMcMasa->band_grouping[band_m_idx + 1]; + move16(); FOR( j = brange[0]; j < brange[1]; j++ ) { FOR( i = 0; i < numAnalysisChannels; i++ ) { Word32 temp = L_add( Mult_32_32( Chnl_RealBuffer_fx[i][j], Chnl_RealBuffer_fx[i][j] ), Mult_32_32( Chnl_ImagBuffer_fx[i][j], Chnl_ImagBuffer_fx[i][j] ) ); - hMcMasa->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->energy_fx[block_m_idx][band_m_idx], hMcMasa->energy_e[block_m_idx][band_m_idx], temp, (c_e) *2, &hMcMasa->energy_e[block_m_idx][band_m_idx] ); + hMcMasa->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->energy_fx[block_m_idx][band_m_idx], hMcMasa->energy_e[block_m_idx][band_m_idx], temp, shl( c_e, 1 ), &hMcMasa->energy_e[block_m_idx][band_m_idx] ); + move32(); } } } @@ -976,7 +1011,9 @@ void ivas_mcmasa_param_est_ana_fx( FOR( i = 0; i < num_freq_bands; i++ ) { brange[0] = hMcMasa->band_grouping[i]; + move16(); brange[1] = hMcMasa->band_grouping[i + 1]; + move16(); FOR( j = brange[0]; j < brange[1]; j++ ) { compute_cov_mtx_fx( Chnl_RealBuffer_fx, Chnl_ImagBuffer_fx, j, numAnalysisChannels, &( COVls[i] ), c_e ); @@ -1057,45 +1094,55 @@ void ivas_mcmasa_param_est_ana_fx( /* Direction estimation */ computeIntensityVector_ana_fx( hMcMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx ); /*2+q-31*/ - computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], 2 * c_e ); /*Q30*/ + computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], shl( c_e, 1 ) ); /*Q30*/ /* Power and intensity estimation for diffuseness */ computeIntensityVector_ana_fx( hMcMasa->band_grouping, FoaEven_RealBuffer_fx, FoaEven_ImagBuffer_fx, num_freq_bands, intensity_even_real_fx ); /*2*(q)-31*/ computeReferencePower_ana_fx( hMcMasa->band_grouping, FoaEven_RealBuffer_fx, FoaEven_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); /*2*q-30*/ /* Fill buffers of length "averaging_length" time slots for intensity and energy */ - hMcMasa->index_buffer_intensity = ( hMcMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ + hMcMasa->index_buffer_intensity = add( ( hMcMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ), 1 ); /* averaging_length = 32 */ index = hMcMasa->index_buffer_intensity; + move16(); FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { /* only real part needed */ Copy32( intensity_even_real_fx[i], &( hMcMasa->buffer_intensity_real_fx[i][index - 1][0] ), num_freq_bands ); } - hMcMasa->buffer_intensity_real_q[index - 1] = 2 * inp_q - 31; - Copy32( reference_power_fx[ts], &( hMcMasa->buffer_energy_fx[( index - 1 ) * num_freq_bands] ), num_freq_bands ); - hMcMasa->buffer_energy_q[index - 1] = 2 * inp_q - 30; + hMcMasa->buffer_intensity_real_q[index - 1] = sub( shl( inp_q, 1 ), 31 ); + move16(); + Copy32( reference_power_fx[ts], &( hMcMasa->buffer_energy_fx[i_mult( index - 1, num_freq_bands )] ), num_freq_bands ); + hMcMasa->buffer_energy_q[index - 1] = sub( shl( inp_q, 1 ), 30 ); + move16(); computeDiffuseness_fixed( hMcMasa->buffer_intensity_real_fx, hMcMasa->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, hMcMasa->buffer_intensity_real_q, hMcMasa->buffer_energy_q, out_exp ); /* Compute vertical diffuseness, and tune original diffuseness if needed */ IF( !hMcMasa->isHorizontalSetup ) { Copy32( intensity_real_fx[2], &( hMcMasa->buffer_intensity_real_vert_fx[index - 1][0] ), num_freq_bands ); - hMcMasa->buffer_intensity_real_vert_q[index - 1] = 2 * inp_q - 31; + hMcMasa->buffer_intensity_real_vert_q[index - 1] = sub( shl( inp_q, 1 ), 31 ); + move16(); computeVerticalDiffuseness_fx( hMcMasa->buffer_intensity_real_vert_fx, hMcMasa->buffer_energy_fx, num_freq_bands, vertical_diffuseness_vector_fx, hMcMasa->buffer_intensity_real_vert_q, hMcMasa->buffer_energy_q ); v_min_fx( diffuseness_vector_fx, out_exp, vertical_diffuseness_vector_fx, q_vdv, diffuseness_vector_fx, out_exp, num_freq_bands ); } FOR( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) { norm_tmp_fx = L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], L_sub( ONE_IN_Q30, diffuseness_vector_fx[band_m_idx] ) ), 1 ); /*2q-30*/ - hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), 2 * c_e, &hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx] ); - hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), 2 * c_e, &hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx] ); - hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), 2 * c_e, &hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx] ); - diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ), 1 ), 2 * c_e - 1, &diffuseness_e[band_m_idx] ); - renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], 2 * c_e - 1, &renormalization_factor_diff_e[band_m_idx] ); + hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), shl( c_e, 1 ), &hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx] ); + hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), shl( c_e, 1 ), &hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx] ); + hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), shl( c_e, 1 ), &hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx] ); + diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ), 1 ), sub( shl( c_e, 1 ), 1 ), &diffuseness_e[band_m_idx] ); + renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( shl( c_e, 1 ), 1 ), &renormalization_factor_diff_e[band_m_idx] ); + move32(); + move32(); + move32(); + move32(); + move32(); } } FOR( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) { Word16 max_e = MIN_16; + move16(); FOR( d = 0; d < DIRAC_NUM_DIMS; d++ ) { max_e = s_max( max_e, hMcMasa->direction_vector_e[d][block_m_idx][band_m_idx] ); @@ -1103,11 +1150,13 @@ void ivas_mcmasa_param_est_ana_fx( max_e = add( max_e, 1 ); /*1 as guard bit to prevent overflow*/ FOR( d = 0; d < DIRAC_NUM_DIMS; d++ ) { - dir_v_fx[d] = L_shr( hMcMasa->direction_vector_m_fx[d][block_m_idx][band_m_idx], max_e - hMcMasa->direction_vector_e[d][block_m_idx][band_m_idx] ); + dir_v_fx[d] = L_shr( hMcMasa->direction_vector_m_fx[d][block_m_idx][band_m_idx], sub( max_e, hMcMasa->direction_vector_e[d][block_m_idx][band_m_idx] ) ); + move32(); } Word16 div_q = sub( 31, max_e ); ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( dir_v_fx, div_q, &azimuth_m_values_fx[block_m_idx][band_m_idx], &elevation_m_values_fx[block_m_idx][band_m_idx] ); elevation_m_values_fx[block_m_idx][band_m_idx] = L_add( elevation_m_values_fx[block_m_idx][band_m_idx], L_shr( elevation_m_values_fx[block_m_idx][band_m_idx], 5 ) ); + move32(); } /* Coherence processing */ @@ -1118,30 +1167,40 @@ void ivas_mcmasa_param_est_ana_fx( { FOR( j = i; j < numAnalysisChannels; j++ ) { - Word32 temp = BASOP_Util_Add_Mant32Exp( Mult_32_32( COVls[band_m_idx].xr_fx[i][j], COVls[band_m_idx].xr_fx[i][j] ), 2 * COVls[band_m_idx].xr_e[i][j], Mult_32_32( COVls[band_m_idx].xi_fx[i][j], COVls[band_m_idx].xi_fx[i][j] ), 2 * COVls[band_m_idx].xi_e[i][j], &absCOVls_e[i][j] ); + Word32 temp = BASOP_Util_Add_Mant32Exp( Mult_32_32( COVls[band_m_idx].xr_fx[i][j], COVls[band_m_idx].xr_fx[i][j] ), shl( COVls[band_m_idx].xr_e[i][j], 1 ), Mult_32_32( COVls[band_m_idx].xi_fx[i][j], COVls[band_m_idx].xi_fx[i][j] ), shl( COVls[band_m_idx].xi_e[i][j], 1 ), &absCOVls_e[i][j] ); absCOVls_fx[i][j] = Sqrt32( temp, &absCOVls_e[i][j] ); + move32(); } lsEnergy_fx[i] = absCOVls_fx[i][i]; + move32(); lsEnergy_e[i] = absCOVls_e[i][i]; + move16(); } /* Find loudest channel */ maxEne_fx = lsEnergy_fx[0]; + move32(); maxEne_e = lsEnergy_e[0]; + move16(); loudestCh = 0; FOR( i = 1; i < numAnalysisChannels; i++ ) { IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( lsEnergy_fx[i], lsEnergy_e[i], maxEne_fx, maxEne_e ), 1 ) ) { maxEne_fx = lsEnergy_fx[i]; + move32(); maxEne_e = lsEnergy_e[i]; + move16(); loudestCh = i; + move16(); } } /* Compute surrounding coherence */ surrCoh_fx = ONE_IN_Q31; + move32(); surrCoh_e = 0; + move16(); FOR( i = 0; i < numAnalysisChannels; i++ ) { IF( NE_16( i, loudestCh ) ) @@ -1149,36 +1208,56 @@ void ivas_mcmasa_param_est_ana_fx( IF( LT_16( i, loudestCh ) ) { i1 = i; + move16(); i2 = loudestCh; + move16(); } ELSE { i1 = loudestCh; + move16(); i2 = i; + move16(); } - Word16 temp_exp = lsEnergy_e[i1] + lsEnergy_e[i2]; + Word16 temp_exp = add( lsEnergy_e[i1], lsEnergy_e[i2] ); Word32 temp = Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i2] ), EPSILON_FX ), &temp_exp ); tempCoh_e = 0; + move16(); tempCoh_fx = L_shl( BASOP_Util_Divide3232_Scale( absCOVls_fx[i1][i2], temp, &tempCoh_e ), 16 ); - tempCoh_e = absCOVls_e[i1][i2] - temp_exp + tempCoh_e; + tempCoh_e = add( sub( absCOVls_e[i1][i2], temp_exp ), tempCoh_e ); IF( NE_16( BASOP_Util_Cmp_Mant32Exp( surrCoh_fx, surrCoh_e, tempCoh_fx, tempCoh_e ), -1 ) ) { surrCoh_fx = tempCoh_fx; + move32(); surrCoh_e = tempCoh_e; + move16(); } } } surrCoh_fx = L_shl( surrCoh_fx, surrCoh_e ); surrCoh_e = 0; + move16(); surrCoh_fx = Mult_32_32( surrCoh_fx, surrCoh_fx ); - surrCoh_fx = ( LT_32( surrCoh_fx, ONE_IN_Q31 ) ) ? surrCoh_fx : ONE_IN_Q31; - surrCoh_fx = ( GT_32( surrCoh_fx, 0 ) ) ? surrCoh_fx : 0; + IF( LT_32( surrCoh_fx, ONE_IN_Q31 ) ) + { + surrCoh_fx = surrCoh_fx; + move32(); + } + ELSE + { + surrCoh_fx = ONE_IN_Q31; + move32(); + } + surrCoh_fx = L_max( surrCoh_fx, 0 ); /* Compute spread coherence */ IF( LT_32( elevation_m_values_fx[block_m_idx][band_m_idx], NEAR_HORIZONTAL_PLANE_ELEVATION_FX ) ) /* Computed only near horizontal plane */ { minAngleDist_fx = 754974720; /*Q22*/ + move32(); i1 = 0; + move16(); currentAzi_fx = azimuth_m_values_fx[block_m_idx][band_m_idx]; + move32(); FOR( i = 0; i < hMcMasa->numHorizontalChannels; i++ ) { angleDist_fx = L_abs( L_sub( currentAzi_fx, hMcMasa->ls_azimuth_fx[i] ) ); @@ -1189,13 +1268,17 @@ void ivas_mcmasa_param_est_ana_fx( IF( LT_32( angleDist_fx, minAngleDist_fx ) ) { minAngleDist_fx = angleDist_fx; + move32(); i1 = i; + move16(); } } i2 = hMcMasa->leftNearest[i1]; + move16(); i3 = hMcMasa->rightNearest[i1]; + move16(); Word16 temp_e = add( lsEnergy_e[i2], lsEnergy_e[i3] ); - Word32 temp = Sqrt32( Mult_32_32( lsEnergy_fx[i2], lsEnergy_fx[i3] ) + EPSILON_FX, &temp_e ); + Word32 temp = Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i2], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e ); IF( LT_16( i2, i3 ) ) { stereoCoh_fx = BASOP_Util_Divide3232_Scale( absCOVls_fx[i2][i3], temp, &stereoCoh_e ); @@ -1214,9 +1297,10 @@ void ivas_mcmasa_param_est_ana_fx( temp2 = L_add( temp2, EPSILON_FX ); lsEnergyRelation_fx = BASOP_Util_Divide3232_Scale( temp1, temp2, &lsEnergyRelation_e ); lsEnergyRelation_e = add( lsEnergyRelation_e, sub( temp1_e, temp2_e ) ); - lsEnergyRelation_fx = L_shl( lsEnergyRelation_fx, 16 + lsEnergyRelation_e ); + lsEnergyRelation_fx = L_shl( lsEnergyRelation_fx, add( 16, lsEnergyRelation_e ) ); stereoness_fx = Mult_32_32( stereoCoh_fx, lsEnergyRelation_fx ); stereoness_e = stereoCoh_e; + move16(); IF( LT_16( i1, i2 ) ) { temp_e = add( lsEnergy_e[i1], lsEnergy_e[i2] ); @@ -1232,13 +1316,13 @@ void ivas_mcmasa_param_est_ana_fx( tempCoh_fx = L_shl( tempCoh_fx, 16 ); IF( LT_16( i1, i3 ) ) { - temp_e = lsEnergy_e[i1] + lsEnergy_e[i3]; + temp_e = add( lsEnergy_e[i1], lsEnergy_e[i3] ); tempCoh2_fx = BASOP_Util_Divide3232_Scale( absCOVls_fx[i1][i3], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e ) ), &tempCoh2_e ); tempCoh2_e = add( tempCoh2_e, sub( absCOVls_e[i1][i3], temp_e ) ); } ELSE { - temp_e = lsEnergy_e[i1] + lsEnergy_e[i3]; + temp_e = add( lsEnergy_e[i1], lsEnergy_e[i3] ); tempCoh2_fx = BASOP_Util_Divide3232_Scale( absCOVls_fx[i3][i1], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e ) ), &tempCoh2_e ); tempCoh2_e = add( tempCoh2_e, sub( absCOVls_e[i3][i1], temp_e ) ); } @@ -1246,82 +1330,129 @@ void ivas_mcmasa_param_est_ana_fx( IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( tempCoh_fx, tempCoh_e, tempCoh2_fx, tempCoh2_e ), -1 ) ) { cohPanCoh_fx = tempCoh_fx; + move32(); cohPanCoh_e = tempCoh_e; + move16(); } ELSE { cohPanCoh_fx = tempCoh2_fx; + move32(); cohPanCoh_e = tempCoh2_e; + move16(); } cohPanCoh_fx = L_shl( cohPanCoh_fx, cohPanCoh_e ); /*Q31*/ cohPanCoh_e = 0; + move16(); lsEnergyRelation_fx = BASOP_Util_Divide3232_Scale( lsEnergy_fx[i2], L_add( lsEnergy_fx[i1], EPSILON_FX ), &lsEnergyRelation_e ); - lsEnergyRelation_e += lsEnergy_e[i2] - lsEnergy_e[i1]; + lsEnergyRelation_e = add( lsEnergyRelation_e, sub( lsEnergy_e[i2], lsEnergy_e[i1] ) ); tempLsEnergyRelation_fx = BASOP_Util_Divide3232_Scale( lsEnergy_fx[i1], L_add( lsEnergy_fx[i2], EPSILON_FX ), &tempLsEnergyRelation_e ); - tempLsEnergyRelation_e += lsEnergy_e[i1] - lsEnergy_e[i2]; + tempLsEnergyRelation_e = add( tempLsEnergyRelation_e, sub( lsEnergy_e[i1], lsEnergy_e[i2] ) ); IF( NE_16( BASOP_Util_Cmp_Mant32Exp( lsEnergyRelation_fx, lsEnergyRelation_e, tempLsEnergyRelation_fx, tempLsEnergyRelation_e ), -1 ) ) { lsEnergyRelation_fx = tempLsEnergyRelation_fx; + move32(); lsEnergyRelation_e = tempLsEnergyRelation_e; + move16(); } tempLsEnergyRelation_fx = BASOP_Util_Divide3232_Scale( lsEnergy_fx[i3], L_add( lsEnergy_fx[i1], EPSILON_FX ), &tempLsEnergyRelation_e ); tempLsEnergyRelation_e = add( tempLsEnergyRelation_e, sub( lsEnergy_e[i3], lsEnergy_e[i1] ) ); IF( NE_16( BASOP_Util_Cmp_Mant32Exp( lsEnergyRelation_fx, lsEnergyRelation_e, tempLsEnergyRelation_fx, tempLsEnergyRelation_e ), -1 ) ) { lsEnergyRelation_fx = tempLsEnergyRelation_fx; + move32(); lsEnergyRelation_e = tempLsEnergyRelation_e; + move16(); } - tempLsEnergyRelation_fx = BASOP_Util_Divide3232_Scale( lsEnergy_fx[i1], ( lsEnergy_fx[i3] + EPSILON_FX ), &tempLsEnergyRelation_e ); + tempLsEnergyRelation_fx = BASOP_Util_Divide3232_Scale( lsEnergy_fx[i1], L_add( lsEnergy_fx[i3], EPSILON_FX ), &tempLsEnergyRelation_e ); tempLsEnergyRelation_e = add( tempLsEnergyRelation_e, sub( lsEnergy_e[i1], lsEnergy_e[i3] ) ); IF( NE_16( BASOP_Util_Cmp_Mant32Exp( lsEnergyRelation_fx, lsEnergyRelation_e, tempLsEnergyRelation_fx, tempLsEnergyRelation_e ), -1 ) ) { lsEnergyRelation_fx = tempLsEnergyRelation_fx; + move32(); lsEnergyRelation_e = tempLsEnergyRelation_e; + move16(); } - lsEnergyRelation_fx = L_shl( lsEnergyRelation_fx, 16 + lsEnergyRelation_e ); /*Q31*/ - cohwideness_fx = Mult_32_32( cohPanCoh_fx, lsEnergyRelation_fx ); /*cohPanCoh_e*/ + lsEnergyRelation_fx = L_shl( lsEnergyRelation_fx, add( 16, lsEnergyRelation_e ) ); /*Q31*/ + cohwideness_fx = Mult_32_32( cohPanCoh_fx, lsEnergyRelation_fx ); /*cohPanCoh_e*/ IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( cohwideness_fx, cohPanCoh_e, stereoness_fx, stereoness_e ), 1 ) ) { spreadCoh_fx = cohwideness_fx; + move32(); spreadCoh_e = cohPanCoh_e; + move16(); } ELSE { spreadCoh_fx = stereoness_fx; + move32(); spreadCoh_e = stereoness_e; + move16(); } - IF( LT_16( spreadCoh_e, 0 ) ) + IF( ( spreadCoh_e < 0 ) ) { spreadCoh_fx = L_shl( spreadCoh_fx, spreadCoh_e ); spreadCoh_e = 0; + move16(); } - IF( GT_32( spreadCoh_fx, L_shl_sat( 1, 31 - spreadCoh_e - 1 /*0.5f with exp=spreadCoh_e*/ ) ) ) + IF( GT_32( spreadCoh_fx, L_shl_sat( 1, sub( 30, spreadCoh_e ) /*0.5f with exp=spreadCoh_e*/ ) ) ) { IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( cohwideness_fx, cohPanCoh_e, stereoness_fx, stereoness_e ), 1 ) ) { - tempCoh_fx = BASOP_Util_Add_Mant32Exp( stereoness_fx, stereoness_e, -L_sub( cohwideness_fx, L_shl( 1, 31 - cohPanCoh_e - 1 ) ), cohPanCoh_e, &tempCoh_e ); - IF( LT_16( tempCoh_e, 0 ) ) + tempCoh_fx = BASOP_Util_Add_Mant32Exp( stereoness_fx, stereoness_e, L_negate( L_sub( cohwideness_fx, L_shl( 1, sub( 30, cohPanCoh_e ) ) ) ), cohPanCoh_e, &tempCoh_e ); + IF( ( tempCoh_e < 0 ) ) { tempCoh_fx = L_shl( tempCoh_fx, tempCoh_e ); tempCoh_e = 0; + move16(); + } + IF( GT_32( tempCoh_fx, L_shl_sat( 1, sub( 30, tempCoh_e ) ) ) ) + { + spreadCoh_fx = tempCoh_fx; + move32(); + } + ELSE + { + spreadCoh_fx = L_shl_sat( 1, sub( 30, tempCoh_e ) ); } - spreadCoh_fx = GT_32( tempCoh_fx, L_shl_sat( 1, 31 - tempCoh_e - 1 ) ) ? tempCoh_fx : L_shl_sat( 1, 31 - tempCoh_e - 1 ); spreadCoh_e = tempCoh_e; + move16(); } } - IF( LT_16( spreadCoh_e, 0 ) ) + IF( ( spreadCoh_e < 0 ) ) { spreadCoh_fx = L_shl( spreadCoh_fx, spreadCoh_e ); spreadCoh_e = 0; + move16(); + } + + IF( ( LT_32( spreadCoh_fx, L_shl_sat( 1, sub( 31, spreadCoh_e ) ) ) ) ) + { + spreadCoh_fx = spreadCoh_fx; + move32(); + } + ELSE + { + spreadCoh_fx = L_shl_sat( 1, sub( 31, spreadCoh_e ) ); + } + IF( ( spreadCoh_fx > 0 ) ) + { + spreadCoh_fx = spreadCoh_fx; + move32(); + } + ELSE + { + spreadCoh_fx = 0; + move32(); } - spreadCoh_fx = ( LT_32( spreadCoh_fx, L_shl_sat( 1, 31 - spreadCoh_e ) ) ) ? spreadCoh_fx : L_shl_sat( 1, 31 - spreadCoh_e ); - spreadCoh_fx = ( spreadCoh_fx > 0 ) ? spreadCoh_fx : 0; spreadCoh_fx = L_shl( spreadCoh_fx, spreadCoh_e ); /*Q31*/ /* Compute energy ratio tuning parameter */ lsEnergySum_fx = 0; + move32(); lsEnergySum_e = 0; + move16(); FOR( i = 0; i < numAnalysisChannels; i++ ) { lsEnergySum_fx = BASOP_Util_Add_Mant32Exp( lsEnergy_fx[i], lsEnergy_e[i], lsEnergySum_fx, lsEnergySum_e, &lsEnergySum_e ); @@ -1329,23 +1460,55 @@ void ivas_mcmasa_param_est_ana_fx( lsEnergySum_fx = L_add_sat( lsEnergySum_fx, EPSILON_FX ); lsEnergyRelation_fx = BASOP_Util_Divide3232_Scale( temp1, lsEnergySum_fx, &lsEnergyRelation_e ); lsEnergyRelation_e = add( lsEnergyRelation_e, sub( temp1_e, lsEnergySum_e ) ); - lsEnergyRelation_fx = L_shl( lsEnergyRelation_fx, 16 + lsEnergyRelation_e ); + lsEnergyRelation_fx = L_shl( lsEnergyRelation_fx, add( 16, lsEnergyRelation_e ) ); stereoRatio_fx = L_sub( Mult_32_32( L_shl_sat( stereoCoh_fx, stereoCoh_e ), lsEnergyRelation_fx ), surrCoh_fx ); lsEnergyRelation_fx = BASOP_Util_Divide3232_Scale( temp2, lsEnergySum_fx, &lsEnergyRelation_e ); lsEnergyRelation_e = add( lsEnergyRelation_e, sub( temp2_e, lsEnergySum_e ) ); - lsEnergyRelation_fx = L_shl( lsEnergyRelation_fx, 16 + lsEnergyRelation_e ); + lsEnergyRelation_fx = L_shl( lsEnergyRelation_fx, add( 16, lsEnergyRelation_e ) ); cohPanRatio_fx = L_sub( Mult_32_32( cohPanCoh_fx, lsEnergyRelation_fx ), surrCoh_fx ); - cohRatio_fx = GT_32( stereoRatio_fx, cohPanRatio_fx ) ? stereoRatio_fx : cohPanRatio_fx; /*Q31*/ - cohRatio_fx = ( LT_32( cohRatio_fx, ONE_IN_Q31 ) ) ? cohRatio_fx : ONE_IN_Q31; - cohRatio_fx = ( GT_32( cohRatio_fx, 0 ) ) ? cohRatio_fx : 0; + IF( GT_32( stereoRatio_fx, cohPanRatio_fx ) ) + { + cohRatio_fx = stereoRatio_fx; + move32(); + } + ELSE + { + cohRatio_fx = cohPanRatio_fx; + move32(); + } + + IF( LT_32( cohRatio_fx, ONE_IN_Q31 ) ) + { + cohRatio_fx = cohRatio_fx; + move32(); + } + ELSE + { + cohRatio_fx = ONE_IN_Q31; + move32(); + } + + IF( cohRatio_fx > 0 ) + { + cohRatio_fx = cohRatio_fx; + move32(); + } + ELSE + { + cohRatio_fx = 0; + move32(); + } } ELSE /* Otherwise, set spread coherence to zero */ { spreadCoh_fx = 0; + move32(); cohRatio_fx = 0; + move32(); lsEnergySum_fx = 0; + move32(); FOR( i = 0; i < numAnalysisChannels; i++ ) { lsEnergySum_fx = BASOP_Util_Add_Mant32Exp( lsEnergy_fx[i], lsEnergy_e[i], lsEnergySum_fx, lsEnergySum_e, &lsEnergySum_e ); @@ -1354,9 +1517,12 @@ void ivas_mcmasa_param_est_ana_fx( } /* Store values */ - spreadCoherence_fx[block_m_idx][band_m_idx] = spreadCoh_fx; /*Q31*/ + spreadCoherence_fx[block_m_idx][band_m_idx] = spreadCoh_fx; /*Q31*/ + move32(); surroundingCoherence_fx[block_m_idx][band_m_idx] = surrCoh_fx; /*Q31*/ - coherentEnergyRatio_fx[band_m_idx] = cohRatio_fx; /*Q31*/ + move32(); + coherentEnergyRatio_fx[band_m_idx] = cohRatio_fx; /*Q31*/ + move32(); } /* Determine energy ratios */ @@ -1366,16 +1532,29 @@ void ivas_mcmasa_param_est_ana_fx( IF( GT_32( renormalization_factor_diff_fx[band_m_idx], EPSILON_FX ) ) { diffuseness_m_fx[band_m_idx] = BASOP_Util_Divide3232_Scale( diffuseness_m_fx[band_m_idx], renormalization_factor_diff_fx[band_m_idx], &diffuseness_m_e ); + move32(); diffuseness_m_e = add( diffuseness_m_e, sub( diffuseness_e[band_m_idx], renormalization_factor_diff_e[band_m_idx] ) ); - diffuseness_m_fx[band_m_idx] = L_shl_sat( diffuseness_m_fx[band_m_idx], 16 + diffuseness_m_e ); + diffuseness_m_fx[band_m_idx] = L_shl_sat( diffuseness_m_fx[band_m_idx], add( 16, diffuseness_m_e ) ); + move32(); } ELSE { diffuseness_m_fx[band_m_idx] = 0; + move32(); } energyRatio_fx[block_m_idx][band_m_idx] = L_sub( ONE_IN_Q31, diffuseness_m_fx[band_m_idx] ); - energyRatio_fx[block_m_idx][band_m_idx] = GT_32( energyRatio_fx[block_m_idx][band_m_idx], coherentEnergyRatio_fx[band_m_idx] ) ? energyRatio_fx[block_m_idx][band_m_idx] : coherentEnergyRatio_fx[band_m_idx]; + move32(); + IF( GT_32( energyRatio_fx[block_m_idx][band_m_idx], coherentEnergyRatio_fx[band_m_idx] ) ) + { + energyRatio_fx[block_m_idx][band_m_idx] = energyRatio_fx[block_m_idx][band_m_idx]; + move32(); + } + ELSE + { + energyRatio_fx[block_m_idx][band_m_idx] = coherentEnergyRatio_fx[band_m_idx]; + move32(); + } } } return; @@ -1886,19 +2065,22 @@ static void ivas_mcmasa_dmx_fx( const Word16 nchan_transport, const Word16 nchan_inp ) { - int16_t i, j; - int16_t numAnalysisChannels; + Word16 i, j; + Word16 numAnalysisChannels; Word32 dmx_c_fx; Word32 multiChEne_fx, downmixEne_fx; Word32 prevEQ_fx, currEQ_fx, instEQ_fx; Word32 alpha_fx, L_tmp, L_tmp1; Word16 multiChEne_e, scale, downmixEne_e = 0, prevEQ_e, tmp, currEQ_e, instEQ_e; + move16(); - numAnalysisChannels = nchan_inp - 1; + numAnalysisChannels = sub( nchan_inp, 1 ); multiChEne_fx = 0; + move32(); multiChEne_e = 0; + move16(); FOR( j = 0; j < numAnalysisChannels; j++ ) { @@ -1908,47 +2090,54 @@ static void ivas_mcmasa_dmx_fx( L_tmp = Mpy_32_32( L_tmp1, L_tmp1 ); // data_e + data_e multiChEne_fx = BASOP_Util_Add_Mant32Exp( L_tmp, scale + scale, multiChEne_fx, multiChEne_e, &scale ); multiChEne_e = scale; + move16(); } } - IF( nchan_transport == 2 ) + IF( EQ_16( nchan_transport, 2 ) ) { Word16 numSideChannels; /* Channels other than left, right, center */ Word16 leftIndex, rightIndex; - numSideChannels = numAnalysisChannels / 2 - 1; + numSideChannels = sub( shr( numAnalysisChannels, 1 ), 1 ); FOR( j = 0; j < numSideChannels; j++ ) { - leftIndex = j * 2 + 3; - rightIndex = j * 2 + 4; + leftIndex = add( shl( j, 1 ), 3 ); + rightIndex = add( shl( j, 1 ), 4 ); FOR( i = 0; i < input_frame; i++ ) { data_f_fx[0][i] = L_add( data_f_fx[0][i], data_f_fx[leftIndex][i] ); + move32(); data_f_fx[1][i] = L_add( data_f_fx[1][i], data_f_fx[rightIndex][i] ); + move32(); } } FOR( i = 0; i < input_frame; i++ ) { - dmx_c_fx = (Word32) W_shr( W_mult_32_32( INV_SQRT2_FX, data_f_fx[2][i] ), 32 ); - + dmx_c_fx = W_extract_h( W_mult_32_32( INV_SQRT2_FX, data_f_fx[2][i] ) ); + move32(); data_f_fx[0][i] = L_add( dmx_c_fx, data_f_fx[0][i] ); + move32(); data_f_fx[1][i] = L_add( dmx_c_fx, data_f_fx[1][i] ); + move32(); } } - ELSE IF( nchan_transport == 1 ) + ELSE IF( EQ_16( nchan_transport, 1 ) ) { FOR( i = 0; i < input_frame; i++ ) { FOR( j = 1; j < numAnalysisChannels; j++ ) { data_f_fx[0][i] = L_add( data_f_fx[0][i], data_f_fx[j][i] ); + move32(); } } } downmixEne_fx = 0; + move32(); FOR( j = 0; j < nchan_transport; j++ ) { @@ -1961,6 +2150,7 @@ static void ivas_mcmasa_dmx_fx( } alpha_fx = 214748364; // Q31 + move32(); L_tmp = Mpy_32_32( alpha_fx, multiChEne_fx ); L_tmp1 = Mpy_32_32( 1932735284, hMcMasa->prevMultiChEne_fx ); @@ -1972,26 +2162,31 @@ static void ivas_mcmasa_dmx_fx( hMcMasa->prevDownmixEne_fx = BASOP_Util_Add_Mant32Exp( L_tmp, downmixEne_e, L_tmp1, hMcMasa->prevDownmixEne_e, &hMcMasa->prevDownmixEne_e ); prevEQ_fx = hMcMasa->prevEQ_fx; + move32(); prevEQ_e = hMcMasa->prevEQ_e; + move16(); tmp = BASOP_Util_Divide3232_Scale( hMcMasa->prevMultiChEne_fx, L_add( hMcMasa->prevDownmixEne_fx, EPSILON_FX ), &scale ); - currEQ_e = scale + ( hMcMasa->prevMultiChEne_e - hMcMasa->prevDownmixEne_e ); + currEQ_e = add( scale, sub( hMcMasa->prevMultiChEne_e, hMcMasa->prevDownmixEne_e ) ); currEQ_fx = Sqrt32( L_deposit_h( tmp ), &currEQ_e ); hMcMasa->prevEQ_fx = currEQ_fx; + move32(); hMcMasa->prevEQ_e = currEQ_e; + move16(); FOR( i = 0; i < input_frame; i++ ) { L_tmp = Mpy_32_32( L_deposit_h( hMcMasa->interpolator_fx[i] ), currEQ_fx ); L_tmp1 = L_sub( 1073741824, L_lshr( L_deposit_h( hMcMasa->interpolator_fx[i] ), 1 ) ); L_tmp1 = Mpy_32_32( L_tmp1, prevEQ_fx ); - instEQ_fx = BASOP_Util_Add_Mant32Exp( L_tmp, currEQ_e, L_tmp1, prevEQ_e + 1, &instEQ_e ); + instEQ_fx = BASOP_Util_Add_Mant32Exp( L_tmp, currEQ_e, L_tmp1, add( prevEQ_e, 1 ), &instEQ_e ); FOR( j = 0; j < nchan_transport; j++ ) { data_f_fx[j][i] = Mpy_32_32( instEQ_fx, data_f_fx[j][i] ); - + move32(); + move32(); data_f_fx[j][i] = L_shl( data_f_fx[j][i], instEQ_e ); } } @@ -2031,12 +2226,14 @@ static void compute_cov_mtx_fx( d = si[j][freq]; norm_c = norm_l( c ); norm_d = norm_l( d ); - c = L_shl( c, norm_c ); /*inp_exp-norm_c*/ - d = L_shl( d, norm_d ); /*inp_exp-norm_d*/ - temp = BASOP_Util_Add_Mant32Exp( Mult_32_32( a, c ), 2 * inp_exp - norm_a - norm_c, Mult_32_32( b, d ), 2 * inp_exp - norm_b - norm_d, &shift ); /*exp=inp_exp-norm_ab+inp_exp-norm_cd*/ + c = L_shl( c, norm_c ); /*inp_exp-norm_c*/ + d = L_shl( d, norm_d ); /*inp_exp-norm_d*/ + temp = BASOP_Util_Add_Mant32Exp( Mult_32_32( a, c ), sub( shl( inp_exp, 1 ), add( norm_a, norm_c ) ), Mult_32_32( b, d ), sub( shl( inp_exp, 1 ), add( norm_b, norm_d ) ), &shift ); /*exp=inp_exp-norm_ab+inp_exp-norm_cd*/ COVls->xr_fx[i][j] = BASOP_Util_Add_Mant32Exp( COVls->xr_fx[i][j], COVls->xr_e[i][j], temp, shift, &COVls->xr_e[i][j] ); - temp = BASOP_Util_Add_Mant32Exp( Mult_32_32( b, c ), 2 * inp_exp - norm_b - norm_c, -Mult_32_32( a, d ), 2 * inp_exp - norm_a - norm_d, &shift ); + move32(); + temp = BASOP_Util_Add_Mant32Exp( Mult_32_32( b, c ), sub( shl( inp_exp, 1 ), add( norm_b, norm_c ) ), L_negate( Mult_32_32( a, d ) ), sub( shl( inp_exp, 1 ), add( norm_a, norm_d ) ), &shift ); COVls->xi_fx[i][j] = BASOP_Util_Add_Mant32Exp( COVls->xi_fx[i][j], COVls->xi_e[i][j], temp, shift, &COVls->xi_e[i][j] ); + move32(); } } @@ -2092,6 +2289,7 @@ static void computeVerticalDiffuseness_fx( Word32 energy_slow[MASA_FREQUENCY_BANDS]; Word16 i, k; Word32 tmp = 0; + move32(); const Word32 *p_tmp_c; Word16 intensity_slow_e[MASA_FREQUENCY_BANDS], energy_slow_e[MASA_FREQUENCY_BANDS]; @@ -2104,17 +2302,19 @@ static void computeVerticalDiffuseness_fx( FOR( i = 0; i < DIRAC_NO_COL_AVG_DIFF; ++i ) { /* Energy slow */ - p_tmp_c = buffer_energy + i * num_freq_bands; + p_tmp_c = buffer_energy + i_mult( i, num_freq_bands ); FOR( k = 0; k < num_freq_bands; k++ ) { - energy_slow[k] = BASOP_Util_Add_Mant32Exp( energy_slow[k], energy_slow_e[k], *( p_tmp_c ), 31 - buffer_energy_q[i], &energy_slow_e[k] ); /*q=min_q*/ + energy_slow[k] = BASOP_Util_Add_Mant32Exp( energy_slow[k], energy_slow_e[k], *( p_tmp_c ), sub( 31, buffer_energy_q[i] ), &energy_slow_e[k] ); /*q=min_q*/ + move32(); p_tmp_c++; } /* Intensity slow */ FOR( k = 0; k < num_freq_bands; k++ ) { - intensity_slow[k] = BASOP_Util_Add_Mant32Exp( intensity_slow[k], intensity_slow_e[k], buffer_intensity[i][k], 31 - buffer_intensity_q[i], &intensity_slow_e[k] ); /*q=min_q*/ + intensity_slow[k] = BASOP_Util_Add_Mant32Exp( intensity_slow[k], intensity_slow_e[k], buffer_intensity[i][k], sub( 31, buffer_intensity_q[i] ), &intensity_slow_e[k] ); /*q=min_q*/ + move32(); } } @@ -2122,30 +2322,34 @@ static void computeVerticalDiffuseness_fx( FOR( k = 0; k < num_freq_bands; k++ ) { intensity_slow_abs[k] = L_abs( intensity_slow[k] ); /*min_q*/ + move32(); } /* Compute Diffuseness */ FOR( i = 0; i < num_freq_bands; ++i ) { Word16 tmp_e1, tmp_e2; - tmp = BASOP_Util_Divide3232_Scale( intensity_slow_abs[i], ( energy_slow[i] + EPSILON_FX_SMALL ), &tmp_e1 ); - tmp_e1 += intensity_slow_e[i] - energy_slow_e[i]; - tmp = BASOP_Util_Divide3232_Scale( tmp - L_shr( VERTICAL_ENERGY_RATIO_OFFSET_FX, tmp_e1 ), ONE_IN_Q15 - VERTICAL_ENERGY_RATIO_OFFSET_FX, &tmp_e2 ); /* Tuned to avoid effect due to ambience of vertically un-even setups */ - tmp_e2 += tmp_e1; - tmp = L_sub( L_shl( 1, 15 - tmp_e2 ), tmp ); + tmp = BASOP_Util_Divide3232_Scale( intensity_slow_abs[i], L_add( energy_slow[i], EPSILON_FX_SMALL ), &tmp_e1 ); + tmp_e1 = add( tmp_e1, sub( intensity_slow_e[i], energy_slow_e[i] ) ); + tmp = BASOP_Util_Divide3232_Scale( L_sub( tmp, L_shr( VERTICAL_ENERGY_RATIO_OFFSET_FX, tmp_e1 ) ), L_sub( ONE_IN_Q15, VERTICAL_ENERGY_RATIO_OFFSET_FX ), &tmp_e2 ); /* Tuned to avoid effect due to ambience of vertically un-even setups */ + tmp_e2 = add( tmp_e2, tmp_e1 ); + tmp = L_sub( L_shl( 1, sub( 15, tmp_e2 ) ), tmp ); IF( tmp < 0 ) { tmp = 0; + move32(); } - ELSE IF( tmp >= L_shl( 1, 15 - tmp_e2 ) ) + ELSE IF( GE_32( tmp, L_shl( 1, sub( 15, tmp_e2 ) ) ) ) { tmp = ONE_IN_Q31; + move32(); } ELSE { - tmp = L_shl( tmp, 16 + tmp_e2 ); + tmp = L_shl( tmp, add( 16, tmp_e2 ) ); } diffuseness[i] = tmp; + move32(); } return; @@ -2225,25 +2429,32 @@ static void computeEvenLayout_fx( Word16 numChannelsHalf; lsSpacing = L_shl( L_mult0( 360, div_s( 1, numChannels ) ), 6 ); /*Q.21*/ - oddLayout = numChannels % 2; + oddLayout = (UWord8) s_and( numChannels, 1 ); + move16(); numChannelsHalf = shr( numChannels, 1 ); Copy32( ls_azimuth, ls_azimuth_temp, numChannels ); Scale_sig32( ls_azimuth_temp, numChannels, -1 ); /*Q.21*/ FOR( i = 0; i < numChannels; i++ ) { - smallestAzimuth = L_shl( 1000, 21 ); /*Q21*/ + smallestAzimuth = 1000 << 21; /*Q21*/ + move32(); smallestAzimuthIndex = 0; + move16(); FOR( j = 0; j < numChannels; j++ ) { IF( LT_32( ls_azimuth_temp[j], smallestAzimuth ) ) { smallestAzimuth = ls_azimuth_temp[j]; + move32(); smallestAzimuthIndex = j; + move16(); } } ls_azimuth_order[i] = smallestAzimuthIndex; - ls_azimuth_temp[smallestAzimuthIndex] = L_shl( 1000, 21 ); + move32(); + ls_azimuth_temp[smallestAzimuthIndex] = ( 1000 << 21 ); + move32(); } IF( oddLayout ) @@ -2258,11 +2469,13 @@ static void computeEvenLayout_fx( FOR( i = 0; i < numChannels; i++ ) { ls_azimuth_even_ordered[i] = W_extract_l( W_add( W_mult_32_16( lsSpacing, i ), startAzimuth ) ); /*Q.22*/ + move32(); } FOR( i = 0; i < numChannels; i++ ) { ls_azimuth_even[ls_azimuth_order[i]] = L_shl( L_shr( L_add( ls_azimuth_even_ordered[i], ONE_IN_Q21 ), 22 ), 22 ); /*((a+2^21)/2^22)*2^22*/ + move32(); } return; @@ -2432,64 +2645,83 @@ void ivas_create_masa_out_meta_fx( ) { - const uint8_t ivasmasaFormatDescriptor[8] = { 0x49, 0x56, 0x41, 0x53, 0x4D, 0x41, 0x53, 0x41 }; /* "IVASMASA" */ - int16_t i, sf, band; - uint8_t numFrequencyBands; - uint8_t numDirections; - uint16_t spherical_index; + const UWord8 ivasmasaFormatDescriptor[8] = { 0x49, 0x56, 0x41, 0x53, 0x4D, 0x41, 0x53, 0x41 }; /* "IVASMASA" */ + Word16 i, sf, band; + UWord8 numFrequencyBands; + UWord8 numDirections; + UWord16 spherical_index; numDirections = 1; + move16(); numFrequencyBands = MASA_FREQUENCY_BANDS; + move16(); /* Construct descriptive meta */ - for ( i = 0; i < 8; i++ ) + FOR( i = 0; i < 8; i++ ) { extOutMeta->descriptiveMeta.formatDescriptor[i] = ivasmasaFormatDescriptor[i]; + move16(); } - extOutMeta->descriptiveMeta.numberOfDirections = numDirections - 1; - extOutMeta->descriptiveMeta.numberOfChannels = (uint8_t) ( nchan_transport - 1 ); + extOutMeta->descriptiveMeta.numberOfDirections = (UWord8) sub( numDirections, 1 ); + move16(); + extOutMeta->descriptiveMeta.numberOfChannels = (UWord8) sub( nchan_transport, 1 ); + move16(); /* Following correspond to "unknown" values */ extOutMeta->descriptiveMeta.sourceFormat = 0x0u; + move16(); extOutMeta->descriptiveMeta.transportDefinition = 0x0u; + move16(); extOutMeta->descriptiveMeta.channelAngle = 0x0u; + move16(); extOutMeta->descriptiveMeta.channelDistance = 0x0u; + move16(); extOutMeta->descriptiveMeta.channelLayout = 0x0u; + move16(); /* Construct spatial metadata from estimated values */ - for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { /* Spherical index */ - for ( band = 0; band < numFrequencyBands; band++ ) + FOR( band = 0; band < numFrequencyBands; band++ ) { spherical_index = index_theta_phi_16_fx( &elevation_m_values[sf][band], &azimuth_m_values[sf][band], Sph_Grid16 ); + move16(); extOutMeta->directionIndex[0][sf][band] = spherical_index; + move16(); extOutMeta->directionIndex[1][sf][band] = SPH_IDX_FRONT; + move16(); } /* Direct-to-total ratio */ - for ( band = 0; band < numFrequencyBands; band++ ) + FOR( band = 0; band < numFrequencyBands; band++ ) { - extOutMeta->directToTotalRatio[0][sf][band] = (uint8_t) L_shr( energyRatio[sf][band], energyRatio_q - 8 ); + extOutMeta->directToTotalRatio[0][sf][band] = (UWord8) L_shr( energyRatio[sf][band], sub( energyRatio_q, 8 ) ); + move16(); extOutMeta->directToTotalRatio[1][sf][band] = 0; + move16(); } /* Spread coherence */ - for ( band = 0; band < numFrequencyBands; band++ ) + FOR( band = 0; band < numFrequencyBands; band++ ) { - extOutMeta->spreadCoherence[0][sf][band] = (uint8_t) L_shr( spreadCoherence[sf][band], spreadCoherence_q - 8 ); + extOutMeta->spreadCoherence[0][sf][band] = (UWord8) L_shr( spreadCoherence[sf][band], sub( spreadCoherence_q, 8 ) ); + move16(); extOutMeta->spreadCoherence[1][sf][band] = 0; + move16(); } /* Diffuse-to-total ratio = 1 - sum(direct-to-total ratios) */ - for ( band = 0; band < numFrequencyBands; band++ ) + FOR( band = 0; band < numFrequencyBands; band++ ) { - extOutMeta->diffuseToTotalRatio[sf][band] = UINT8_MAX - (uint8_t) L_shr( energyRatio[sf][band], energyRatio_q - 8 ); + extOutMeta->diffuseToTotalRatio[sf][band] = (UWord8) sub( UINT8_MAX, (UWord8) L_shr( energyRatio[sf][band], sub( energyRatio_q, 8 ) ) ); + move16(); } /* Surround coherence */ - for ( band = 0; band < numFrequencyBands; band++ ) + FOR( band = 0; band < numFrequencyBands; band++ ) { - extOutMeta->surroundCoherence[sf][band] = (uint8_t) L_shr( surroundingCoherence[sf][band], surroundingCoherence_q - 8 ); + extOutMeta->surroundCoherence[sf][band] = (UWord8) L_shr( surroundingCoherence[sf][band], sub( surroundingCoherence_q, 8 ) ); + move16(); } } diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 70a9cad10..b2ebebb87 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -130,33 +130,35 @@ ivas_error ivas_td_binaural_open_unwrap_fx( move16(); /* Mixer spatial setup */ pBinRendTd->TdRend_MixSpatSpec_p->UseCommonDistAttenModel = TRUE; + move16(); pBinRendTd->TdRend_MixSpatSpec_p->DistAttenModel = 0; /* 0=Turned off, else use TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED */ move16(); - IF( ( error = TDREND_MIX_Init_fx( pBinRendTd, hHrtfTD, pBinRendTd->TdRend_MixSpatSpec_p, output_Fs ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_MIX_Init_fx( pBinRendTd, hHrtfTD, pBinRendTd->TdRend_MixSpatSpec_p, output_Fs ) ), IVAS_ERR_OK ) ) { return error; } /* Set the attenuation (or can set MixSpatSpec.DistAttenModel above) */ - IF( ( error = TDREND_MIX_SetDistAttenModel( pBinRendTd, TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_MIX_SetDistAttenModel( pBinRendTd, TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED ) ), IVAS_ERR_OK ) ) { return error; } /* Add sources to module and mixer, headphones */ PosType = TDREND_POSTYPE_ABSOLUTE; /* or TDREND_POSTYPE_RELATIVE_TO_LISTENER */ - + move16(); nchan_rend = nchan_transport; move16(); - IF( EQ_16( ivas_format, MC_FORMAT ) && NE_16( transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + test(); + if ( EQ_16( ivas_format, MC_FORMAT ) && NE_16( transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - nchan_rend--; /* Skip LFE channel -- added to the others */ + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ } FOR( nS = 0; nS < nchan_rend; nS++ ) { - IF( ( error = TDREND_MIX_AddSrc_fx( pBinRendTd, &SrcInd[nS], PosType ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_MIX_AddSrc_fx( pBinRendTd, &SrcInd[nS], PosType ) ), IVAS_ERR_OK ) ) { return error; } @@ -216,26 +218,27 @@ ivas_error ivas_td_binaural_open_unwrap_fx( move32(); // TDREND_SRC_SPATIAL_t *SrcSpatial_p = pBinRendTd->Sources[nS]->SrcSpatial_p; - IF( ( error = TDREND_MIX_SRC_SetPos_fx( pBinRendTd, nS, Pos_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_MIX_SRC_SetPos_fx( pBinRendTd, nS, Pos_fx ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = TDREND_MIX_SRC_SetDir_fx( pBinRendTd, nS, Dir_fx, Q30 ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_MIX_SRC_SetDir_fx( pBinRendTd, nS, Dir_fx, Q30 ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = TDREND_MIX_SRC_SetPlayState( pBinRendTd, nS, TDREND_PLAYSTATUS_PLAYING ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_MIX_SRC_SetPlayState( pBinRendTd, nS, TDREND_PLAYSTATUS_PLAYING ) ), IVAS_ERR_OK ) ) { return error; } /*TDREND_SRC_SPATIAL_t **/ // SrcSpatial_p = pBinRendTd->Sources[nS]->SrcSpatial_p; - IF( ( error = TDREND_MIX_SRC_SetDirAtten_fx( pBinRendTd, nS, DirAtten_p ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_MIX_SRC_SetDirAtten_fx( pBinRendTd, nS, DirAtten_p ) ), IVAS_ERR_OK ) ) { return error; } } } - + test(); + test(); IF( EQ_16( ivas_format, ISM_FORMAT ) || EQ_16( ivas_format, MASA_ISM_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) { DirAtten_p = pBinRendTd->DirAtten_p; @@ -250,14 +253,14 @@ ivas_error ivas_td_binaural_open_unwrap_fx( } ELSE { - DirAtten_p->ConeInnerAngle_fx = L_deposit_h( directivity[nS * 3] ); // 9Q6 -> 9Q22 - DirAtten_p->ConeOuterAngle_fx = L_deposit_h( directivity[nS * 3 + 1] ); // 9Q6 -> 9Q22 - DirAtten_p->ConeOuterGain_fx = L_shr( L_deposit_h( directivity[nS * 3 + 2] ), 1 ); // 0Q15 -> 1Q30 + DirAtten_p->ConeInnerAngle_fx = L_deposit_h( directivity[nS * 3] ); // 9Q6 -> 9Q22 + DirAtten_p->ConeOuterAngle_fx = L_deposit_h( directivity[add( nS * 3, 1 )] ); // 9Q6 -> 9Q22 + DirAtten_p->ConeOuterGain_fx = L_shr( L_deposit_h( directivity[add( nS * 3, 2 )] ), 1 ); // 0Q15 -> 1Q30 } move32(); move32(); move32(); - IF( ( error = TDREND_MIX_SRC_SetDirAtten_fx( pBinRendTd, nS, DirAtten_p ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_MIX_SRC_SetDirAtten_fx( pBinRendTd, nS, DirAtten_p ) ), IVAS_ERR_OK ) ) { return error; } @@ -265,10 +268,11 @@ ivas_error ivas_td_binaural_open_unwrap_fx( } *hBinRendererTd = pBinRendTd; - + test(); IF( NE_16( ivas_format, MASA_ISM_FORMAT ) && NE_16( ivas_format, SBA_ISM_FORMAT ) ) { *binaural_latency_ns = Mult_32_32( ( *hBinRendererTd )->HrFiltSet_p->latency_s_fx, 1000000000 ); + move32(); } return error; @@ -398,49 +402,25 @@ ivas_error ivas_td_binaural_open_unwrap( DirAtten_p->ConeInnerAngle = 360.0f; DirAtten_p->ConeOuterAngle = 360.0f; DirAtten_p->ConeOuterGain = 1.0f; -#ifdef IVAS_FLOAT_FIXED - DirAtten_p->ConeInnerAngle_fx = DEG_360_IN_Q22; - DirAtten_p->ConeOuterAngle_fx = DEG_360_IN_Q22; - DirAtten_p->ConeOuterGain_fx = ONE_IN_Q30; -#endif if ( ( error = TDREND_MIX_SRC_SetPos( pBinRendTd, nS, Pos ) ) != IVAS_ERR_OK ) { return error; } -#ifdef IVAS_FLOAT_FIXED - // Can remove this once TDREND_MIX_SRC_SetPos_fx is integrated above. - pBinRendTd->Sources[nS]->SrcSpatial_p->Pos_p_fx[0] = float_to_fix( pBinRendTd->Sources[nS]->SrcSpatial_p->Pos_p[0], Q25 ); - pBinRendTd->Sources[nS]->SrcSpatial_p->Pos_p_fx[1] = float_to_fix( pBinRendTd->Sources[nS]->SrcSpatial_p->Pos_p[1], Q25 ); - pBinRendTd->Sources[nS]->SrcSpatial_p->Pos_p_fx[2] = float_to_fix( pBinRendTd->Sources[nS]->SrcSpatial_p->Pos_p[2], Q25 ); -#endif if ( ( error = TDREND_MIX_SRC_SetDir( pBinRendTd, nS, Dir ) ) != IVAS_ERR_OK ) { return error; } -#ifdef IVAS_FLOAT_FIXED - // Can remove this once TDREND_MIX_SRC_SetDir_fx is integrated above. - pBinRendTd->Sources[nS]->SrcSpatial_p->Front_p_fx[0] = float_to_fix( pBinRendTd->Sources[nS]->SrcSpatial_p->Front_p[0], Q30 ); - pBinRendTd->Sources[nS]->SrcSpatial_p->Front_p_fx[1] = float_to_fix( pBinRendTd->Sources[nS]->SrcSpatial_p->Front_p[1], Q30 ); - pBinRendTd->Sources[nS]->SrcSpatial_p->Front_p_fx[2] = float_to_fix( pBinRendTd->Sources[nS]->SrcSpatial_p->Front_p[2], Q30 ); -#endif if ( ( error = TDREND_MIX_SRC_SetPlayState( pBinRendTd, nS, TDREND_PLAYSTATUS_PLAYING ) ) != IVAS_ERR_OK ) { return error; } -#ifdef IVAS_FLOAT_FIXED - if ( ( error = TDREND_MIX_SRC_SetDirAtten_fx( pBinRendTd, nS, DirAtten_p ) ) != IVAS_ERR_OK ) - { - return error; - } -#else if ( ( error = TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ) ) != IVAS_ERR_OK ) { return error; } -#endif } } @@ -462,22 +442,10 @@ ivas_error ivas_td_binaural_open_unwrap( DirAtten_p->ConeOuterAngle = directivity[nS * 3 + 1]; DirAtten_p->ConeOuterGain = directivity[nS * 3 + 2]; } -#ifdef IVAS_FLOAT_FIXED - DirAtten_p->ConeInnerAngle_fx = float_to_fix( DirAtten_p->ConeInnerAngle, Q22 ); - DirAtten_p->ConeOuterAngle_fx = float_to_fix( DirAtten_p->ConeOuterAngle, Q22 ); - DirAtten_p->ConeOuterGain_fx = float_to_fix( DirAtten_p->ConeOuterGain, Q30 ); -#endif -#ifdef IVAS_FLOAT_FIXED - if ( ( error = TDREND_MIX_SRC_SetDirAtten_fx( pBinRendTd, nS, DirAtten_p ) ) != IVAS_ERR_OK ) - { - return error; - } -#else if ( ( error = TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ) ) != IVAS_ERR_OK ) { return error; } -#endif } } @@ -504,6 +472,7 @@ void ivas_td_binaural_close_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd /* i/o: TD binaural object renderer handle */ ) { + test(); IF( hBinRendererTd == NULL || *hBinRendererTd == NULL ) { return; @@ -599,7 +568,8 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( move16(); FOR( nS = 0; nS < num_src; nS++ ) { - IF( !( ivas_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ + test(); + IF( !( EQ_16( ivas_format, MC_FORMAT ) && EQ_16( nS, lfe_idx ) ) ) /* Skip LFE for MC */ { hBinRendererTd->Sources[c_indx]->InputFrame_p_fx = output_fx[nS]; /* Q11 */ hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; @@ -613,7 +583,7 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( IF( EQ_16( subframe_idx, ism_md_subframe_update ) ) { /* Update object position(s) */ - IF( ( error = TDREND_Update_object_positions_fx( hBinRendererTd, num_src, ivas_format, hIsmMetaData ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_Update_object_positions_fx( hBinRendererTd, num_src, ivas_format, hIsmMetaData ) ), IVAS_ERR_OK ) ) { return error; } @@ -623,13 +593,13 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( Word16 tmp_headRotEnabled; tmp_headRotEnabled = 0; move16(); - IF( enableCombinedOrientation != NULL ) + if ( enableCombinedOrientation != NULL ) { tmp_headRotEnabled = enableCombinedOrientation[hCombinedOrientationData->subframe_idx]; move16(); } - IF( ( error = TDREND_Update_listener_orientation_fx( hBinRendererTd, tmp_headRotEnabled, &Quaternions[hCombinedOrientationData->subframe_idx], &Pos[hCombinedOrientationData->subframe_idx] ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_Update_listener_orientation_fx( hBinRendererTd, tmp_headRotEnabled, &Quaternions[hCombinedOrientationData->subframe_idx], &Pos[hCombinedOrientationData->subframe_idx] ) ), IVAS_ERR_OK ) ) { return error; } @@ -643,7 +613,7 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( Scale_sig32( output_fx[i], L_FRAME48k, -4 ); } - IF( ( error = ivas_reverb_process_fx( hReverb, transport_config, 0, output_fx, p_reverb_signal_fx, subframe_idx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_reverb_process_fx( hReverb, transport_config, 0, output_fx, p_reverb_signal_fx, subframe_idx ) ), IVAS_ERR_OK ) ) { return error; } @@ -660,7 +630,7 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( } /* Render subframe */ - IF( ( error = TDREND_GetMix_fx( hBinRendererTd, output_fx, subframe_length, subframe_idx, ism_md_subframe_update ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_GetMix_fx( hBinRendererTd, output_fx, subframe_length, subframe_idx, ism_md_subframe_update ) ), IVAS_ERR_OK ) ) { return error; } @@ -671,7 +641,8 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( move16(); FOR( nS = 0; nS < num_src; nS++ ) { - IF( !( ivas_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ + test(); + IF( !( EQ_16( ivas_format, MC_FORMAT ) && EQ_16( nS, lfe_idx ) ) ) /* Skip LFE for MC */ { hBinRendererTd->Sources[c_indx]->InputFrame_p_fx += subframe_length; c_indx = add( c_indx, 1 ); @@ -829,11 +800,14 @@ ivas_error TDREND_GetMix_fx( Word16 intp_count; Word16 subframe_update_flag; Word16 hrf_left_delta_e = 0, hrf_right_delta_e = 0; + move16(); + move16(); subframe_update_flag = (Word16) EQ_16( subframe_idx, ism_md_subframe_update ); + move16(); error = IVAS_ERR_OK; - + move32(); /* Clear the output buffer to accumulate rendered sources */ set32_fx( output_buf[0], 0, subframe_length ); set32_fx( output_buf[1], 0, subframe_length ); @@ -855,7 +829,7 @@ ivas_error TDREND_GetMix_fx( /* Update rendering params if needed */ test(); test(); - IF( ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) && ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) ) + IF( EQ_16( SrcRend_p->PlayStatus, TDREND_PLAYSTATUS_PLAYING ) && ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) ) { TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev_fx, &Src_p->hrf_left_prev_e, Src_p->hrf_right_prev_fx, &Src_p->hrf_right_prev_e, @@ -866,7 +840,8 @@ ivas_error TDREND_GetMix_fx( } /* Render source if needed */ - IF( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) ) + test(); + IF( EQ_16( SrcRend_p->InputAvailable, TRUE ) && EQ_16( SrcRend_p->PlayStatus, TDREND_PLAYSTATUS_PLAYING ) ) { error = TDREND_REND_RenderSourceHRFilt_fx( Src_p, hrf_left_delta, &hrf_left_delta_e, hrf_right_delta, &hrf_right_delta_e, intp_count, output_buf, subframe_length ); @@ -966,7 +941,7 @@ static void TDREND_Clear_Update_flags_fx( hBinRendererTd->Listener_p->PoseUpdated = FALSE; move16(); - for ( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) + FOR( i = 0; i < hBinRendererTd->NumOfSrcs; i++ ) { hBinRendererTd->Sources[i]->SrcSpatial_p->Updated = FALSE; move16(); @@ -1022,7 +997,7 @@ ivas_error TDREND_Update_object_positions_fx( { test(); test(); - IF( in_format == ISM_FORMAT || in_format == MASA_ISM_FORMAT || in_format == SBA_ISM_FORMAT ) + IF( EQ_16( in_format, ISM_FORMAT ) || EQ_16( in_format, MASA_ISM_FORMAT ) || EQ_16( in_format, SBA_ISM_FORMAT ) ) { /* Update the source positions */ /* Source position and direction */ @@ -1030,15 +1005,18 @@ ivas_error TDREND_Update_object_positions_fx( angles_to_vec_fx( ONE_IN_Q14, hIsmMetaData[nS]->yaw_fx, hIsmMetaData[nS]->pitch_fx, Dir_fx ); DirAtten_p->ConeInnerAngle_fx = DEG_360_IN_Q22; + move32(); DirAtten_p->ConeOuterAngle_fx = DEG_360_IN_Q22; + move32(); DirAtten_p->ConeOuterGain_fx = ONE_IN_Q30; + move32(); - IF( ( error = TDREND_MIX_SRC_SetPos_fx( hBinRendererTd, nS, Pos_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_MIX_SRC_SetPos_fx( hBinRendererTd, nS, Pos_fx ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = TDREND_MIX_SRC_SetDirAtten_fx( hBinRendererTd, nS, DirAtten_p ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_MIX_SRC_SetDirAtten_fx( hBinRendererTd, nS, DirAtten_p ) ), IVAS_ERR_OK ) ) { return error; } @@ -1048,20 +1026,24 @@ ivas_error TDREND_Update_object_positions_fx( Pos_fx[0] = 0; /* Pos[1] = hIsmMetaData[nS]->azimuth / 90.f; */ Pos_fx[1] = L_shl( Mpy_32_32_r( hIsmMetaData[nS]->azimuth_fx, 23860929 /* 1 / 90.f in Q31 */ ), Q3 ); /* Q25 */ + move32(); Pos_fx[2] = 0; + move32(); - IF( ( error = TDREND_MIX_SRC_SetPos_fx( hBinRendererTd, nS, Pos_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_MIX_SRC_SetPos_fx( hBinRendererTd, nS, Pos_fx ) ), IVAS_ERR_OK ) ) { return error; } hBinRendererTd->Sources[nS]->SrcSpatial_p->PosType = TDREND_POSTYPE_NON_DIEGETIC; + move16(); } ELSE { hBinRendererTd->Sources[nS]->SrcSpatial_p->PosType = TDREND_POSTYPE_ABSOLUTE; + move16(); } - IF( ( error = TDREND_MIX_SRC_SetDir_fx( hBinRendererTd, nS, Dir_fx, Q30 ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_MIX_SRC_SetDir_fx( hBinRendererTd, nS, Dir_fx, Q30 ) ), IVAS_ERR_OK ) ) { return error; } @@ -1239,19 +1221,26 @@ ivas_error TDREND_Update_listener_orientation_fx( /* Obtain head rotation matrix */ QuatToRotMat_fx( *headPosition_fx, Rmat_fx ); // Rmat_fx Q: 2*Qx-32 - Rmat_q = 2 * headPosition_q - 32; + Rmat_q = sub( shl( headPosition_q, 1 ), 32 ); /* Apply rotation matrix to looking vector [1;0;0] */ FrontVec_fx[0] = Rmat_fx[0][0]; + move32(); FrontVec_fx[1] = Rmat_fx[0][1]; + move32(); FrontVec_fx[2] = Rmat_fx[0][2]; + move32(); /* Apply rotation matrix to up vector [0;0;1] */ UpVec_fx[0] = Rmat_fx[2][0]; + move32(); UpVec_fx[1] = Rmat_fx[2][1]; + move32(); UpVec_fx[2] = Rmat_fx[2][2]; + move32(); orient_q = Rmat_q; + move16(); IF( Pos_fx != NULL ) { @@ -1267,24 +1256,37 @@ ivas_error TDREND_Update_listener_orientation_fx( Pos_p_fx[1] = 0; Pos_p_fx[2] = 0; } + move32(); + move32(); + move32(); } ELSE { /* Oriented with looking vector along the x axis */ FrontVec_fx[0] = ONE_IN_Q30; + move32(); FrontVec_fx[1] = 0; + move32(); FrontVec_fx[2] = 0; + move32(); /* Oriented with up vector along the z axis */ UpVec_fx[0] = 0; + move32(); UpVec_fx[1] = 0; + move32(); UpVec_fx[2] = ONE_IN_Q30; + move32(); orient_q = Q30; + move32(); /* Listener at the origin */ Pos_p_fx[0] = 0; + move32(); Pos_p_fx[1] = 0; + move32(); Pos_p_fx[2] = 0; + move32(); } /* Set the listener position and orientation:*/ @@ -1321,7 +1323,7 @@ ivas_error ivas_td_binaural_open_ext_fx( IF( NE_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - IF( ( error = getAudioConfigNumChannels( inConfig, &nchan_transport ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAudioConfigNumChannels( inConfig, &nchan_transport ) ), IVAS_ERR_OK ) ) { return error; } @@ -1329,12 +1331,23 @@ ivas_error ivas_td_binaural_open_ext_fx( ELSE { nchan_transport = customLsInput->num_spk; + move16(); } *num_src = nchan_transport; + move16(); transport_config = inConfig; - ivas_format = ( EQ_16( getAudioConfigType( inConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) ? MC_FORMAT : ISM_FORMAT; - + move16(); + IF( ( getAudioConfigType( inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) + { + ivas_format = MC_FORMAT; + move16(); + } + ELSE + { + ivas_format = ISM_FORMAT; + move16(); + } hTransSetup.ls_azimuth_fx = NULL; hTransSetup.ls_elevation_fx = NULL; @@ -1344,7 +1357,7 @@ ivas_error ivas_td_binaural_open_ext_fx( hTransSetup.ls_elevation_fx = customLsInput->ls_elevation_fx; } - IF( NULL != hRendCfg ) + if ( NULL != hRendCfg ) { directivity_fx = hRendCfg->directivity_fx; } @@ -1423,7 +1436,7 @@ ivas_error ivas_td_binaural_renderer_ext_fx( { ISM_METADATA_FRAME hIsmMetaDataFrame; ISM_METADATA_HANDLE hIsmMetaData[1]; - Word16 lfe_idx; + Word16 lfe_idx, exp_tmp; Word16 num_src; IVAS_FORMAT ivas_format; IVAS_REND_AudioConfigType inConfigType; @@ -1434,7 +1447,6 @@ ivas_error ivas_td_binaural_renderer_ext_fx( FOR( Word16 i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { p_output_fx[i] = output[i]; - move32(); } push_wmops( "ivas_td_binaural_renderer_ext" ); @@ -1454,14 +1466,23 @@ ivas_error ivas_td_binaural_renderer_ext_fx( IF( NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - IF( ( error = getAudioConfigNumChannels( inConfig, &num_src ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAudioConfigNumChannels( inConfig, &num_src ) ), IVAS_ERR_OK ) ) { return error; } } ELSE { - lfe_idx = ( customLsInput->num_lfe > 0 ) ? customLsInput->lfe_idx[0] : -1; + IF( customLsInput->num_lfe > 0 ) + { + lfe_idx = customLsInput->lfe_idx[0]; + move16(); + } + ELSE + { + lfe_idx = -1; + move16(); + } num_src = add( customLsInput->num_spk, customLsInput->num_lfe ); } } @@ -1489,54 +1510,48 @@ ivas_error ivas_td_binaural_renderer_ext_fx( move16(); } - Word16 num_subframes = (int16_t) ( ( output_frame * FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) / output_Fs ); - for ( Word16 subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) + Word16 num_subframes = BASOP_Util_Divide3232_Scale( L_mult0( output_frame, FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ), output_Fs, &exp_tmp ); + IF( sub( 15, exp_tmp ) ) + { + num_subframes = shr( num_subframes, sub( 15, exp_tmp ) ); + } + FOR( Word16 subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) { Word16 idx = subframe_idx; + move16(); Word16 pos_q = Q25; + move16(); IF( ( *hCombinedOrientationData )->listenerPos != NULL ) { - ( *hCombinedOrientationData )->listenerPos[idx].x_fx = L_shr( ( *hCombinedOrientationData )->listenerPos[idx].x_fx, ( *hCombinedOrientationData )->listenerPos[idx].q_fact - pos_q ); - ( *hCombinedOrientationData )->listenerPos[idx].y_fx = L_shr( ( *hCombinedOrientationData )->listenerPos[idx].y_fx, ( *hCombinedOrientationData )->listenerPos[idx].q_fact - pos_q ); - ( *hCombinedOrientationData )->listenerPos[idx].z_fx = L_shr( ( *hCombinedOrientationData )->listenerPos[idx].z_fx, ( *hCombinedOrientationData )->listenerPos[idx].q_fact - pos_q ); + ( *hCombinedOrientationData )->listenerPos[idx].x_fx = L_shr( ( *hCombinedOrientationData )->listenerPos[idx].x_fx, sub( ( *hCombinedOrientationData )->listenerPos[idx].q_fact, pos_q ) ); + move32(); + ( *hCombinedOrientationData )->listenerPos[idx].y_fx = L_shr( ( *hCombinedOrientationData )->listenerPos[idx].y_fx, sub( ( *hCombinedOrientationData )->listenerPos[idx].q_fact, pos_q ) ); + move32(); + ( *hCombinedOrientationData )->listenerPos[idx].z_fx = L_shr( ( *hCombinedOrientationData )->listenerPos[idx].z_fx, sub( ( *hCombinedOrientationData )->listenerPos[idx].q_fact, pos_q ) ); + move32(); ( *hCombinedOrientationData )->listenerPos[idx].q_fact = pos_q; + move16(); } FOR( int i = 0; i < 3; i++ ) { - pTDRend->hBinRendererTd->Listener_p->Pos_fx[i] = L_shr( pTDRend->hBinRendererTd->Listener_p->Pos_fx[i], pTDRend->hBinRendererTd->Listener_p->Pos_q - pos_q ); + pTDRend->hBinRendererTd->Listener_p->Pos_fx[i] = L_shr( pTDRend->hBinRendererTd->Listener_p->Pos_fx[i], sub( pTDRend->hBinRendererTd->Listener_p->Pos_q, pos_q ) ); pTDRend->hBinRendererTd->Listener_p->Pos_q = pos_q; + move32(); move16(); } } - IF( ( error = ivas_td_binaural_renderer_unwrap_fx( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, *hCombinedOrientationData, - ism_md_subframe_update_ext, p_output_fx, output_frame, (Word16) ( ( output_frame * FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) / output_Fs ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_binaural_renderer_unwrap_fx( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, *hCombinedOrientationData, + ism_md_subframe_update_ext, p_output_fx, output_frame, num_subframes ) ), + IVAS_ERR_OK ) ) { return error; } - -#if 0 // TO-BE-REMOVED - for (Word16 subframe_idx = 0; subframe_idx < (int16_t)((output_frame * FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES) / output_Fs); subframe_idx++) - { - if (subframe_idx == ism_md_subframe_update_ext) - { - Word16 i = 0; - FOR(Word16 ns = 0; ns < num_src; ns++) - { - if(ns != lfe_idx){ - fixedToFloat_arrL(pTDRend->hBinRendererTd->Sources[i]->SrcSpatial_p->Front_p_fx, pTDRend->hBinRendererTd->Sources[i]->SrcSpatial_p->Front_p, Q30, 3 * SPAT_BIN_MAX_INPUT_CHANNELS); - fixedToFloat_arrL(pTDRend->hBinRendererTd->Sources[i]->SrcSpatial_p->Pos_p_fx, pTDRend->hBinRendererTd->Sources[i]->SrcSpatial_p->Pos_p, pTDRend->hBinRendererTd->Sources[i]->SrcSpatial_p->q_Pos_p, 3 * SPAT_BIN_MAX_INPUT_CHANNELS); - - i = add(i, 1); - } - } - } - } -#endif IF( hReverb != NULL ) { *exp = sub( *exp, 2 ); + move16(); } pop_wmops(); @@ -1646,10 +1661,15 @@ static void angles_to_vec_fx( { Word16 elevation_fx, azimuth_fx; elevation_fx = (Word16) L_shr( Mult_32_16( elevation, 91 ), 7 ); + move16(); azimuth_fx = (Word16) L_shr( Mult_32_16( azimuth, 91 ), 7 ); + move16(); vec[0] = L_mult( radius, mult( getCosWord16R2( elevation_fx ), getCosWord16R2( azimuth_fx ) ) ); + move32(); vec[1] = L_mult( radius, mult( getCosWord16R2( elevation_fx ), getSineWord16R2( azimuth_fx ) ) ); + move32(); vec[2] = L_mult( radius, getSineWord16R2( elevation_fx ) ); + move32(); return; } #else diff --git a/lib_rend/ivas_objectRenderer_hrFilt.c b/lib_rend/ivas_objectRenderer_hrFilt.c index 5f888df99..c2fe6a262 100644 --- a/lib_rend/ivas_objectRenderer_hrFilt.c +++ b/lib_rend/ivas_objectRenderer_hrFilt.c @@ -208,6 +208,7 @@ void GetFilterFromAngle_fx( { GenerateITD_fx( Elev_fx, Azim_fx, &HrFiltSet_p->ModelParamsITD, &HrFiltSet_p->ModelEval ); *itd = extract_l( HrFiltSet_p->ModelEval.itdMod_fx ); + move16(); } ELSE { @@ -223,7 +224,7 @@ static Word32 round_fixed( /* o : Output value Q0 */ Word16 q /* i : Input q-factor */ ) { - Word32 half = L_shl( 1, ( q - 1 ) ); + Word32 half = L_shl( 1, sub( q, 1 ) ); half = L_shr( half, 1 ); // one guard bit num = L_shr( num, 1 ); // one guard bit @@ -240,7 +241,7 @@ static Word32 round_fixed( /* o : Output value Q0 */ } WHILE( q != 0 ) { - num = num / 2; // using "/ 2" here because it rounds towards 0, whereas L_shr rounds towards -inf. + num = ( num / 2 ); // using "/ 2" here because it rounds towards 0, whereas L_shr rounds towards -inf. q = sub( q, 1 ); } return num; @@ -424,7 +425,7 @@ static void GenerateFilter_fx( move16(); knot_interval = L_deposit_h( BASOP_Util_Divide3216_Scale( L_sub( model->azimKSeq_fx[k][model->azimDim3[k]], model->azimKSeq_fx[k][0] ), model->azimDim3[k], &tmp_e ) ); - tmp_e = add( tmp_e, sub( 9, 15 ) ); + tmp_e = add( tmp_e, 9 - 15 ); knot_interval = L_shr( knot_interval, sub( 9, tmp_e ) ); // variable Q to Q22 getPeriodicBSplineSampVec_fx( modelEval->azimBfVec_fx[p], AzIdx[p], model->azimDim3[k], azim, &num_az_idx[p], @@ -440,8 +441,10 @@ static void GenerateFilter_fx( { FOR( i = 0; i < num_az_idx[p]; i++ ) { - modelEval->BM_fx[qp + i] = L_shl( Mpy_32_32( modelEval->elevBfVec_fx[p], modelEval->azimBfVec_fx[p][i] ), Q30 - ( Q30 * 2 - 31 ) ); // Q30 - BM_idx[qp + i] = add( model->azim_start_idx[EvIdx[p]], AzIdx[p][i] ); + modelEval->BM_fx[add( qp, i )] = L_shl( Mpy_32_32( modelEval->elevBfVec_fx[p], modelEval->azimBfVec_fx[p][i] ), 1 ); /*Q30 - ( Q30 * 2 - 31 )*/ // Q30 + move32(); + BM_idx[add( qp, i )] = add( model->azim_start_idx[EvIdx[p]], AzIdx[p][i] ); + move16(); } qp = add( qp, num_az_idx[p] ); } @@ -472,9 +475,10 @@ static void GenerateFilter_fx( /* Energy is precalculated part updated with square of BM value. Store index for sorting */ FOR( i = 0; i < qp; i++ ) { - modelEval->BMEnergiesL[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->EL_fx[iSec * model->AlphaN + BM_idx[i]] ); // exp: model->EL_e + 2 - modelEval->BMEnergiesR[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->ER_fx[iSec * model->AlphaN + BM_idx[i]] ); // exp: model->ER_e + 2 - + modelEval->BMEnergiesL[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->EL_fx[add( i_mult( iSec, model->AlphaN ), BM_idx[i] )] ); // exp: model->EL_e + 2 + modelEval->BMEnergiesR[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->ER_fx[add( i_mult( iSec, model->AlphaN ), BM_idx[i] )] ); // exp: model->ER_e + 2 + move32(); + move32(); modelEval->BMEnergiesL[i].i = i; move16(); modelEval->BMEnergiesR[i].i = i; @@ -486,8 +490,8 @@ static void GenerateFilter_fx( /* Number of basis components actually used. */ p = s_min( HRTF_MODEL_N_CPTS_VAR[iSec], qp ); - SkipSmallest_ValueIndex_fx( modelEval->UseIndsL, modelEval->BMEnergiesL, qp, qp - p ); - SkipSmallest_ValueIndex_fx( modelEval->UseIndsR, modelEval->BMEnergiesR, qp, qp - p ); + SkipSmallest_ValueIndex_fx( modelEval->UseIndsL, modelEval->BMEnergiesL, qp, sub( qp, p ) ); + SkipSmallest_ValueIndex_fx( modelEval->UseIndsR, modelEval->BMEnergiesR, qp, sub( qp, p ) ); /* Account for lost energy */ FOR( i = 0; i < p; i++ ) @@ -522,18 +526,23 @@ static void GenerateFilter_fx( index = L_add( BM_idx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i], imult3216( model->AlphaN, k ) ); tmp32 = Mpy_32_32( modelEval->BM_fx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i], model->AlphaL_fx[index] ); modelEval->hrfModL_fx[k] = BASOP_Util_Add_Mant32Exp( modelEval->hrfModL_fx[k], tmp_hrfModL_e, tmp32, add( model->AlphaL_e, 1 ), &tmp_hrfModL_e ); - + move32(); index = L_add( BM_idx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i], imult3216( model->AlphaN, k ) ); tmp32 = Mpy_32_32( modelEval->BM_fx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i], model->AlphaR_fx[index] ); modelEval->hrfModR_fx[k] = BASOP_Util_Add_Mant32Exp( modelEval->hrfModR_fx[k], tmp_hrfModR_e, tmp32, add( model->AlphaR_e, 1 ), &tmp_hrfModR_e ); + move32(); } /* Account for lost energy */ modelEval->hrfModL_fx[k] = Mpy_32_32( modelEval->hrfModL_fx[k], ScaleL ); + move32(); modelEval->hrfModR_fx[k] = Mpy_32_32( modelEval->hrfModR_fx[k], ScaleR ); + move32(); /* NOTE: Assuming that finally, hrfMod values will be <= 1. Hence making it Q30 */ modelEval->hrfModL_fx[k] = L_shl( modelEval->hrfModL_fx[k], sub( add( tmp_hrfModL_e, ScaleL_e ), 1 ) ); // assuming Q30 modelEval->hrfModR_fx[k] = L_shl( modelEval->hrfModR_fx[k], sub( add( tmp_hrfModR_e, ScaleR_e ), 1 ) ); // assuming Q30 + move32(); + move32(); } } @@ -693,7 +702,7 @@ static void GenerateITD_fx( { azim_fx = L_sub( azim_fx, DEG_360_IN_Q22 ); } - IF( azim_fx < 0 ) + if ( azim_fx < 0 ) { azim_fx = L_add( azim_fx, DEG_360_IN_Q22 ); } @@ -706,12 +715,12 @@ static void GenerateITD_fx( azim_itd_fx = azim_fx; move32(); - IF( GT_32( azim_fx, DEG_180_IN_Q22 ) ) + if ( GT_32( azim_fx, DEG_180_IN_Q22 ) ) { /* Flip spline functions around 180 deg */ azim_itd_fx = L_sub( DEG_360_IN_Q22, azim_fx ); } - getStandardBSplineSampVec_fx( modelEval->azimBfVecITD_fx, AzIdx, &num_az_idx, ( model->azimDim3 + 1 ) / 2, azim_itd_fx, model->azimKSeq_fx, + getStandardBSplineSampVec_fx( modelEval->azimBfVecITD_fx, AzIdx, &num_az_idx, shr( add( model->azimDim3, 1 ), 1 ), azim_itd_fx, model->azimKSeq_fx, model->azimSegSamples, model->azimBsLen, model->azimBsStart, model->azimBsShape_fx ); IF( GT_32( azim_fx, DEG_180_IN_Q22 ) ) { @@ -748,7 +757,7 @@ static void GenerateITD_fx( /* Compute BM_ITD */ elev_offset = 0; move16(); - IF( EQ_32( model->elevKSeq_fx[0], -DEG_90_IN_Q22 ) ) + if ( EQ_32( model->elevKSeq_fx[0], -DEG_90_IN_Q22 ) ) { elev_offset = sub( 1, model->azimDim3 ); } @@ -756,19 +765,25 @@ static void GenerateITD_fx( move16(); FOR( p = 0; p < num_ev_idx; p++ ) { + test(); + test(); + test(); test(); IF( EvIdx[p] == 0 && EQ_32( model->elevKSeq_fx[EvIdx[p]], -DEG_90_IN_Q22 ) ) { modelEval->BM_ITD_fx[qp] = modelEval->elevBfVecITD_fx[p]; // Q30 move32(); BM_idx[qp] = imult1616( EvIdx[p], model->azimDim3 ); + move16(); qp = add( qp, 1 ); } - ELSE IF( EQ_16( EvIdx[p], sub( model->elevDim3, 1 ) ) && EQ_32( model->elevKSeq_fx[EvIdx[p] - 2], DEG_90_IN_Q22 ) ) + ELSE IF( EQ_16( EvIdx[p], sub( model->elevDim3, 1 ) ) && EQ_32( model->elevKSeq_fx[sub( EvIdx[p], 2 )], DEG_90_IN_Q22 ) ) { /* NB: -2 in if() condition above as number of knot points is numBF-2 */ modelEval->BM_ITD_fx[qp] = modelEval->elevBfVecITD_fx[p]; // Q30 + move32(); BM_idx[qp] = add( imult1616( EvIdx[p], model->azimDim3 ), elev_offset ); + move16(); qp = add( qp, 1 ); } ELSE @@ -776,7 +791,9 @@ static void GenerateITD_fx( FOR( i = 0; i < num_az_idx; i++ ) { modelEval->BM_ITD_fx[qp + i] = L_shl( Mpy_32_32( modelEval->elevBfVecITD_fx[p], modelEval->azimBfVecITD_fx[i] ), 1 ); // Q30 + move32(); BM_idx[qp + i] = add( add( imult1616( EvIdx[p], model->azimDim3 ), elev_offset ), AzIdx[i] ); + move16(); } qp = add( qp, num_az_idx ); } @@ -784,7 +801,7 @@ static void GenerateITD_fx( /* Compute ITD */ AlphaN = add( imult1616( model->elevDim3, model->azimDim3 ), elev_offset ); - IF( EQ_32( model->elevKSeq_fx[model->elevDim3 - 3], DEG_90_IN_Q22 ) ) /* Constant azimuth basis function */ + if ( EQ_32( model->elevKSeq_fx[sub( model->elevDim3, 3 )], DEG_90_IN_Q22 ) ) /* Constant azimuth basis function */ { AlphaN = sub( AlphaN, sub( model->azimDim3, 1 ) ); } @@ -801,6 +818,7 @@ static void GenerateITD_fx( move32(); modelEval->itdMod_fx = BASOP_Util_Add_Mant32Exp( modelEval->itdMod_fx, itdMod_e, Mpy_32_32( modelEval->BM_ITD_fx[i], model->W_fx[index] ), add( model->W_e, 1 ), &tmp_e ); itdMod_e = tmp_e; + move16(); } Word32 tmp32 = Mpy_32_16_1( modelEval->itdMod_fx, model->resamp_factor_fx ); // Q = 31 - ( itdMod_e + 1 ) @@ -905,7 +923,7 @@ static void getPeriodicBSplineSampVec_fx( ELSE { tmp32 = L_deposit_h( BASOP_Util_Divide3216_Scale( knot_interval_fx, SegSamples, &tmp_e1 ) ); - tmp_e1 = add( tmp_e1, sub( 9, 15 ) ); + tmp_e1 = add( tmp_e1, 9 - 15 ); tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( L_sub( t_fx, azimKSeq_0_fx ), tmp32, &tmp_e2 ) ); tmp_e2 = add( tmp_e2, sub( 9, tmp_e1 ) ); tmp32 = L_shr( tmp32, sub( 9, tmp_e2 ) ); // Q22 (assuming tmp32 will be in range of Q22) @@ -926,14 +944,17 @@ static void getPeriodicBSplineSampVec_fx( IF( d0 % SegSamples == 0 ) { *num_az_idx = sub( *num_az_idx, 1 ); /* on the knot points, the last basis function is zero */ + move16(); } FOR( i = 0; i < *num_az_idx; i++ ) { d = sub( d0, imult1616( ( sub( add( i, nI ), 1 ) ), SegSamples ) ); /* offset of knot_interval */ d = sub( d0, imult1616( sub( add( i, nI ), 1 ), SegSamples ) ); - BfVec_fx[i] = azimBsShape_fx[abs_s( d ) * subSampFactor]; + BfVec_fx[i] = azimBsShape_fx[i_mult( abs_s( d ), subSampFactor )]; + move32(); AzIdx[i] = add( nI, i ) % NumBFs; + move16(); } return; @@ -1020,7 +1041,7 @@ static void getStandardBSplineSampVec_fx( /* assuming triple knot at the first knot */ knot_interval_fx = L_deposit_h( BASOP_Util_Divide3216_Scale( L_sub( KSeq_fx[NumBFs - 3], KSeq_fx[0] ), sub( NumBFs, 3 ), &tmp_e1 ) ); - tmp_e1 = add( tmp_e1, sub( 9, 15 ) ); + tmp_e1 = add( tmp_e1, 9 - 15 ); /* index of closest sample point */ tmp32 = L_deposit_h( BASOP_Util_Divide3216_Scale( knot_interval_fx, SegSamples, &tmp_e2 ) ); @@ -1043,6 +1064,7 @@ static void getStandardBSplineSampVec_fx( IF( d0 % SegSamples == 0 ) { *num_idx = sub( *num_idx, 1 ); /* on the knot points, the last basis function is zero */ + move16(); } FOR( i = 0; i < *num_idx; i++ ) @@ -1059,8 +1081,10 @@ static void getStandardBSplineSampVec_fx( { d = sub( shl( sub( BsLen[shape_idx], 1 ), 1 ), d ); } - BfVec_fx[i] = BsShape_fx[BsStart[shape_idx] + abs_s( d )]; /*TT, verify if abs is needed */ + BfVec_fx[i] = BsShape_fx[add( BsStart[shape_idx], abs_s( d ) )]; /*TT, verify if abs is needed */ + move32(); NzIdx[i] = add( nI, i ); + move16(); } return; @@ -1085,12 +1109,15 @@ void HRTF_model_precalc( FOR( i = 0; i < HRTF_MODEL_N_SECTIONS; i++ ) { model->iSecFirst[i] = imult1616( i, sec_length ); + move16(); } FOR( i = 0; i < HRTF_MODEL_N_SECTIONS - 1; i++ ) { model->iSecLast[i] = sub( imult1616( add( i, 1 ), sec_length ), 1 ); + move16(); } model->iSecLast[HRTF_MODEL_N_SECTIONS - 1] = sub( model->K, 1 ); /* Final section is longer if (K % nSec) > 0 */ + move16(); maximum_fx( model->azimDim3, model->elevDim3, &model->azimDim3Max ); return; } diff --git a/lib_rend/ivas_objectRenderer_mix.c b/lib_rend/ivas_objectRenderer_mix.c index e333a56b1..06a645622 100644 --- a/lib_rend/ivas_objectRenderer_mix.c +++ b/lib_rend/ivas_objectRenderer_mix.c @@ -83,7 +83,8 @@ void TDREND_MIX_LIST_SetPos_fx( TDREND_MIX_Listener_t *Listener_p; Listener_p = hBinRendererTd->Listener_p; - + test(); + test(); IF( NE_32( Pos_p[0], Listener_p->Pos_fx[0] ) || NE_32( Pos_p[1], Listener_p->Pos_fx[1] ) || NE_32( Pos_p[2], Listener_p->Pos_fx[2] ) ) { /* Set position */ @@ -181,6 +182,7 @@ ivas_error TDREND_MIX_LIST_SetOrient_fx( /* Evaluate the normalized orientation vectors and set pose update flag */ List_p->PoseUpdated = TDREND_SPATIAL_EvalOrthonormOrient_fx( List_p->Front_fx, List_p->Up_fx, List_p->Right_fx, FrontVec_p_fx, UpVec_p_fx, orient_q ); + move16(); return IVAS_ERR_OK; } @@ -326,17 +328,21 @@ ivas_error TDREND_MIX_Init_fx( IF( MixSpatSpec_p != NULL ) { hBinRendererTd->UseCommonDistAttenModel = MixSpatSpec_p->UseCommonDistAttenModel; + move16(); hBinRendererTd->DistAttenModel = MixSpatSpec_p->DistAttenModel; + move16(); } ELSE { hBinRendererTd->UseCommonDistAttenModel = TRUE; + move16(); hBinRendererTd->DistAttenModel = 0x0000; /* Distance attenuation not activated; */ + move16(); } - move16(); /* Init virtual and rendering listeners for spatial mixers */ TDREND_SPATIAL_VecInit_fx( hBinRendererTd->Listener_p->Pos_fx, 0, 0, 0 ); hBinRendererTd->Listener_p->Pos_q = Q25; + move16(); TDREND_SPATIAL_VecInit_fx( hBinRendererTd->Listener_p->Vel_fx, 0, 0, 0 ); TDREND_SPATIAL_VecInit_fx( hBinRendererTd->Listener_p->Front_fx, 0, 0, -ONE_IN_Q30 ); TDREND_SPATIAL_VecInit_fx( hBinRendererTd->Listener_p->Up_fx, 0, ONE_IN_Q30, 0 ); @@ -349,7 +355,7 @@ ivas_error TDREND_MIX_Init_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); } - IF( ( error = DefaultBSplineModel_fx( hBinRendererTd->HrFiltSet_p, output_Fs ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = DefaultBSplineModel_fx( hBinRendererTd->HrFiltSet_p, output_Fs ) ), IVAS_ERR_OK ) ) { return error; } @@ -365,7 +371,7 @@ ivas_error TDREND_MIX_Init_fx( } return IVAS_ERR_OK; } -#endif // IVAS_FLOAT_FIXED +#else // IVAS_FLOAT_FIXED ivas_error TDREND_MIX_Init( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ @@ -376,11 +382,7 @@ ivas_error TDREND_MIX_Init( { ivas_error error; -#ifdef IVAS_FLOAT_FIXED - hBinRendererTd->Gain_fx = ONE_IN_Q14; -#else hBinRendererTd->Gain = 1.0f; -#endif /* Init source list */ /* Spatial settings */ @@ -396,21 +398,12 @@ ivas_error TDREND_MIX_Init( } /* Init virtual and rendering listeners for spatial mixers */ -#ifndef IVAS_FLOAT_FIXED TDREND_SPATIAL_VecInit( hBinRendererTd->Listener_p->Pos, 0.0f, 0.0f, 0.0f ); TDREND_SPATIAL_VecInit( hBinRendererTd->Listener_p->Vel, 0.0f, 0.0f, 0.0f ); TDREND_SPATIAL_VecInit( hBinRendererTd->Listener_p->Front, 0.0f, 0.0f, -1.0f ); TDREND_SPATIAL_VecInit( hBinRendererTd->Listener_p->Up, 0.0f, 1.0f, 0.0f ); TDREND_SPATIAL_VecInit( hBinRendererTd->Listener_p->Right, 1.0f, 0.0f, 0.0f ); -#endif -#ifdef IVAS_FLOAT_FIXED - TDREND_SPATIAL_VecInit_fx( hBinRendererTd->Listener_p->Pos_fx, 0, 0, 0 ); - hBinRendererTd->Listener_p->Pos_q = Q25; - TDREND_SPATIAL_VecInit_fx( hBinRendererTd->Listener_p->Vel_fx, 0, 0, 0 ); - TDREND_SPATIAL_VecInit_fx( hBinRendererTd->Listener_p->Front_fx, 0, 0, -ONE_IN_Q30 ); - TDREND_SPATIAL_VecInit_fx( hBinRendererTd->Listener_p->Up_fx, 0, ONE_IN_Q30, 0 ); - TDREND_SPATIAL_VecInit_fx( hBinRendererTd->Listener_p->Right_fx, ONE_IN_Q30, 0, 0 ); -#endif + /* Init HR filter set */ if ( *hHrtfTD == NULL ) { @@ -419,17 +412,10 @@ ivas_error TDREND_MIX_Init( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); } -#ifdef IVAS_FLOAT_FIXED - if ( ( error = DefaultBSplineModel_fx( hBinRendererTd->HrFiltSet_p, output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } -#else if ( ( error = DefaultBSplineModel( hBinRendererTd->HrFiltSet_p, output_Fs ) ) != IVAS_ERR_OK ) { return error; } -#endif *hHrtfTD = hBinRendererTd->HrFiltSet_p; } else @@ -444,7 +430,7 @@ ivas_error TDREND_MIX_Init( return IVAS_ERR_OK; } - +#endif /*-------------------------------------------------------------------* * TDREND_MIX_SetDistAttenModel() @@ -459,6 +445,7 @@ ivas_error TDREND_MIX_SetDistAttenModel( ) { /* Value validation */ + test(); IF( LT_16( DistAttenModel, TDREND_DIST_ATTEN_MODEL_INV_DIST ) || GT_16( DistAttenModel, TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED ) ) { return ( IVAS_ERROR( IVAS_ERR_INTERNAL, "Invalid distance attenuation model!\n" ) ); @@ -467,6 +454,7 @@ ivas_error TDREND_MIX_SetDistAttenModel( { /* Set the common distance attenuation model */ hBinRendererTd->DistAttenModel = DistAttenModel; + move32(); /* If using common distance attenuation model, set it. */ IF( hBinRendererTd->UseCommonDistAttenModel ) @@ -474,6 +462,7 @@ ivas_error TDREND_MIX_SetDistAttenModel( hBinRendererTd->DistAttenEnabled = TRUE; move16(); hBinRendererTd->DistAttenModel = DistAttenModel; + move32(); } } return IVAS_ERR_OK; @@ -524,11 +513,14 @@ ivas_error TDREND_MIX_AddSrc_fx( ivas_error error; error = IVAS_ERR_OK; - + move32(); /* Get unique source index */ *SrcInd = add( hBinRendererTd->MaxSrcInd, 1 ); - hBinRendererTd->MaxSrcInd++; - hBinRendererTd->NumOfSrcs++; + move16(); + hBinRendererTd->MaxSrcInd = add( hBinRendererTd->MaxSrcInd, 1 ); + move16(); + hBinRendererTd->NumOfSrcs = add( hBinRendererTd->NumOfSrcs, 1 ); + move16(); IF( GT_16( hBinRendererTd->NumOfSrcs, MAX_NUM_TDREND_CHANNELS ) ) { @@ -536,6 +528,7 @@ ivas_error TDREND_MIX_AddSrc_fx( } ELSE { + test(); IF( LT_16( PosType, TDREND_POSTYPE_ABSOLUTE ) || GT_16( PosType, TDREND_POSTYPE_NON_DIEGETIC ) ) { return ( IVAS_ERROR( IVAS_ERR_INTERNAL, "Invalid position type!\n" ) ); @@ -543,7 +536,7 @@ ivas_error TDREND_MIX_AddSrc_fx( ELSE { /* Alloc and init a complete source: signal+spatial+rend components */ - IF( ( error = TDREND_SRC_Alloc( &Src_p ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_SRC_Alloc( &Src_p ) ), IVAS_ERR_OK ) ) { return error; } @@ -556,6 +549,7 @@ ivas_error TDREND_MIX_AddSrc_fx( Src_p->SrcSpatial_p->DistAttenEnabled = TRUE; move16(); Src_p->SrcSpatial_p->DistAtten.DistAttenModel = hBinRendererTd->DistAttenModel; + move32(); } /* Add source to mixer */ hBinRendererTd->Sources[*SrcInd] = Src_p; @@ -564,7 +558,7 @@ ivas_error TDREND_MIX_AddSrc_fx( return error; } -#endif // IVAS_FLOAT_FIXED +#else // IVAS_FLOAT_FIXED ivas_error TDREND_MIX_AddSrc( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ @@ -599,11 +593,7 @@ ivas_error TDREND_MIX_AddSrc( { return error; } -#ifdef IVAS_FLOAT_FIXED - TDREND_SRC_Init_fx( Src_p, PosType ); -#else TDREND_SRC_Init( Src_p, PosType ); -#endif /* Special OpenAL initialization due to a common distance attenuation model */ if ( hBinRendererTd->DistAttenModel != 0 ) @@ -618,7 +608,7 @@ ivas_error TDREND_MIX_AddSrc( return error; } - +#endif /*-------------------------------------------------------------------* * BSplineModelEvalAlloc() @@ -682,37 +672,23 @@ static ivas_error DefaultBSplineModel_fx( Word16 i, j; ivas_error error; HrFiltSet_p->FilterMethod = TDREND_HRFILT_Method_BSplineModel; + move16(); model = &( HrFiltSet_p->ModelParams ); modelITD = &( HrFiltSet_p->ModelParamsITD ); SWITCH( output_Fs ) { case 48000: -#if 0 /*To be removed later : floating point pointer initialization*/ - HrFiltSet_p->lr_energy_and_iac[0] = defaultHRIR_left_avg_power_48kHz; - HrFiltSet_p->lr_energy_and_iac[1] = defaultHRIR_right_avg_power_48kHz; - HrFiltSet_p->lr_energy_and_iac[2] = defaultHRIR_coherence_48kHz; -#endif HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_48kHz_fx; HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_48kHz_fx; HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_48kHz_fx; BREAK; case 32000: -#if 0 /*To be removed later : floating point pointer initialization*/ - HrFiltSet_p->lr_energy_and_iac[0] = defaultHRIR_left_avg_power_32kHz; - HrFiltSet_p->lr_energy_and_iac[1] = defaultHRIR_right_avg_power_32kHz; - HrFiltSet_p->lr_energy_and_iac[2] = defaultHRIR_coherence_32kHz; -#endif HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_32kHz_fx; HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_32kHz_fx; HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_32kHz_fx; BREAK; case 16000: -#if 0 /*To be removed later : floating point pointer initialization*/ - HrFiltSet_p->lr_energy_and_iac[0] = defaultHRIR_left_avg_power_16kHz; - HrFiltSet_p->lr_energy_and_iac[1] = defaultHRIR_right_avg_power_16kHz; - HrFiltSet_p->lr_energy_and_iac[2] = defaultHRIR_coherence_16kHz; -#endif HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_16kHz_fx; HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_16kHz_fx; HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_16kHz_fx; @@ -762,36 +738,9 @@ static ivas_error DefaultBSplineModel_fx( model->azimShapeIdx = defaultHRIR_rom_azimShapeIdx; model->azimShapeSampFactor = defaultHRIR_rom_azimShapeSampFactor; - /* float parameters */ -#if 0 /*To be removed later Floating point initializations */ - model->elevKSeq = (const float *) defaultHRIR_rom_elevKSeq; - model->elevBsShape = (const float *) defaultHRIR_rom_elevBsShape; -#endif // 1 model->elevKSeq_fx = defaultHRIR_rom_elevKSeq_fx; model->elevBsShape_fx = (const Word32 *) defaultHRIR_rom_elevBsShape_fx; -#if 0 /*To be removed later : Floating point memory allocation*/ - IF ( ( model->azimBsShape = (const float **) malloc( model->num_unique_azim_splines * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); - } - model->azimBsShape[0] = (const float *)defaultHRIR_rom_azimBsShape; - IF ( ( model->azimKSeq = (float **) malloc( 18 * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); - } - IF( ( model->azimKSeq[0] = (float *) malloc( 2 * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); - } - IF( ( model->azimKSeq[model->elevDim3 - 1] = (float *) malloc( 2 * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); - } - model->azimKSeq[0][0] = 0.0f; - model->azimKSeq[model->elevDim3 - 1][0] = 0.0f; - model->azimKSeq[0][1] = 360.0f; - model->azimKSeq[model->elevDim3 - 1][1] = 360.0f; -#endif + IF( ( model->azimBsShape_fx = (const Word32 **) malloc( model->num_unique_azim_splines * sizeof( Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); @@ -818,18 +767,8 @@ static ivas_error DefaultBSplineModel_fx( move32(); move32(); - FOR( i = 1; i < model->elevDim3 - 1; i++ ) + FOR( i = 1; i < sub( model->elevDim3, 1 ); i++ ) { -#if 0 /*To be removed later : Floating point initialization*/ - IF ( ( model->azimKSeq[i] = (float *) malloc( model->azimDim2[i] * sizeof( float * ) ) ) == NULL ) /* azimDim2[i] = 91, i=2..15 */ - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); - } - FOR ( j = 0; j < model->azimDim2[i]; j++ ) - { - model->azimKSeq[i][j] = (float) defaultHRIR_rom_azimSegSamples[0] * j; - } -#endif IF( ( model->azimKSeq_fx[i] = (Word32 *) malloc( model->azimDim2[i] * sizeof( Word32 * ) ) ) == NULL ) /* azimDim2[i] = 91, i=2..15 */ { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); @@ -837,23 +776,13 @@ static ivas_error DefaultBSplineModel_fx( FOR( j = 0; j < model->azimDim2[i]; j++ ) { model->azimKSeq_fx[i][j] = L_shl( L_mult0( defaultHRIR_rom_azimSegSamples[0], j ), Q22 ); + move32(); } - j = j; } SWITCH( output_Fs ) { case 48000: -#if 0 /*To be removed later : floating point pointer initialization*/ - model->AlphaL = (const float *) defaultHRIR_rom_AlphaL48; - model->AlphaR = (const float *) defaultHRIR_rom_AlphaR48; - model->EL = (const float *) defaultHRIR_rom_EL48; - model->ER = (const float *) defaultHRIR_rom_ER48; - IF ( HrFiltSet_p->ModelParams.UseItdModel ) - { - modelITD->resamp_factor = 1.0f; - } -#endif model->AlphaL_fx = (const Word32 *) defaultHRIR_rom_AlphaL48_fx; model->AlphaL_e = 1; move16(); @@ -875,16 +804,6 @@ static ivas_error DefaultBSplineModel_fx( } BREAK; case 32000: -#if 0 /*To be removed later : floating point pointer initialization*/ - model->AlphaL = (const float *) defaultHRIR_rom_AlphaL32; - model->AlphaR = (const float *) defaultHRIR_rom_AlphaR32; - model->EL = (const float *) defaultHRIR_rom_EL32; - model->ER = (const float *) defaultHRIR_rom_ER32; - IF ( HrFiltSet_p->ModelParams.UseItdModel ) - { - modelITD->resamp_factor = RESAMPLE_FACTOR_32_48; - } -#endif model->AlphaL_fx = (const Word32 *) defaultHRIR_rom_AlphaL32_fx; model->AlphaL_e = 1; move16(); @@ -906,16 +825,6 @@ static ivas_error DefaultBSplineModel_fx( } BREAK; case 16000: -#if 0 /*To be removed later : floating point pointer initialization*/ - model->AlphaL = (const float *) defaultHRIR_rom_AlphaL16; - model->AlphaR = (const float *) defaultHRIR_rom_AlphaR16; - model->EL = (const float *) defaultHRIR_rom_EL16; - model->ER = (const float *) defaultHRIR_rom_ER16; - IF ( HrFiltSet_p->ModelParams.UseItdModel ) - { - modelITD->resamp_factor = RESAMPLE_FACTOR_16_48; - } -#endif model->AlphaL_fx = (const Word32 *) defaultHRIR_rom_AlphaL16_fx; model->AlphaL_e = 1; move16(); @@ -968,9 +877,6 @@ static ivas_error DefaultBSplineModel_fx( move16(); modelITD->elevBsStart[3] = 21; move16(); -#if 0 /*To be removed later : floating point pointer initialization*/ - modelITD->elevKSeq = defaultHRIR_rom_ITD_elevKSeq; -#endif modelITD->elevKSeq_fx = defaultHRIR_rom_ITD_elevKSeq_fx; modelITD->azimBsLen[0] = 11; @@ -992,12 +898,6 @@ static ivas_error DefaultBSplineModel_fx( modelITD->azimSegSamples = 10; move16(); -#if 0 /*To be removed later : floating point pointer initialization*/ - modelITD->azimKSeq = defaultHRIR_rom_ITD_azimKSeq; - modelITD->W = (const float *) defaultHRIR_rom_ITD_W; - modelITD->azimBsShape = (const float *) defaultHRIR_rom_ITD_azimBsShape; - modelITD->elevBsShape = (const float *) defaultHRIR_rom_ITD_elevBsShape; -#endif modelITD->azimKSeq_fx = defaultHRIR_rom_ITD_azimKSeq_fx; modelITD->W_fx = (const Word32 *) defaultHRIR_rom_ITD_W_fx; // Q25 modelITD->W_e = 6; @@ -1014,7 +914,7 @@ static ivas_error DefaultBSplineModel_fx( HrFiltSet_p->FiltLength = HrFiltSet_p->ModelParams.K; move16(); - IF( ( error = BSplineModelEvalAlloc_fx( &HrFiltSet_p->ModelParams, &HrFiltSet_p->ModelEval ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = BSplineModelEvalAlloc_fx( &HrFiltSet_p->ModelParams, &HrFiltSet_p->ModelEval ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_rend/ivas_objectRenderer_sfx.c b/lib_rend/ivas_objectRenderer_sfx.c index a09455953..6bb4b0c44 100644 --- a/lib_rend/ivas_objectRenderer_sfx.c +++ b/lib_rend/ivas_objectRenderer_sfx.c @@ -200,7 +200,7 @@ void TDREND_Apply_ITD_fx( tlen3 = s_max( 0, sub( SFX_SPAT_BIN_SINC_M, currShift ) ); /* Make sure there is enough look-ahead for the sinc resampling */ transition_len = sub( length, tlen3 ); - IF( ( ( *previtd ) * itd ) < 0 ) + IF( i_mult( ( *previtd ), itd ) < 0 ) { /* ITD sign change - apply shift on both channels */ Word16 tmp1 = imult1616( transition_len, prevShift ); @@ -211,6 +211,7 @@ void TDREND_Apply_ITD_fx( Word16 tmp_e2 = BASOP_Util_Add_MantExp( tmp3, tmp_e, ONE_IN_Q14, 0, &tmp4 ); tmp4 = shr( tmp4, sub( 15, tmp_e2 ) ); // Q0 tlen1 = tmp4; + move16(); tlen2 = sub( transition_len, tlen1 ); pstart1_fx = p_input_fx - prevShift; @@ -374,7 +375,9 @@ static void sincResample_fx( // epsilon: 1e-15f const Word32 eps = 1208925824; + move32(); const Word16 eps_e = -49; + move16(); /* avoid division by 0 */ IF( 0 == length_out ) @@ -407,8 +410,8 @@ static void sincResample_fx( p_mid_fx = input_fx + t; p_forward_fx = p_mid_fx + 1; p_backward_fx = p_mid_fx - 1; - p_sinc_forward_fx = SincTable_fx + SFX_SPAT_BIN_NUM_SUBSAMPLES - snc0; - p_sinc_backward_fx = SincTable_fx + SFX_SPAT_BIN_NUM_SUBSAMPLES + snc0; + p_sinc_forward_fx = SincTable_fx + sub( SFX_SPAT_BIN_NUM_SUBSAMPLES, snc0 ); + p_sinc_backward_fx = SincTable_fx + add( SFX_SPAT_BIN_NUM_SUBSAMPLES, snc0 ); tmp_fx = Mpy_32_32( *p_mid_fx, SincTable_fx[snc0] ); /* Middle point */ @@ -554,8 +557,8 @@ void TDREND_firfilt_fx( /* Apply linear gain interpolation in case of abrupt gain changes */ gain_tmp_fx = add( gain_tmp_fx, step_fx ); signal_fx[i] = Mpy_32_16_1( tmp_fx, gain_tmp_fx ); - - IF( i < intp_count ) + move32(); + IF( LT_16( i, intp_count ) ) { v_add_fx( filter_fx, filter_delta_fx, filter_fx, filterlength ); } diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 4fb0b4734..15159cacf 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -85,10 +85,16 @@ ivas_error TDREND_MIX_SRC_SetPos_fx( ELSE { SrcSpatial_p = hBinRendererTd->Sources[SrcInd]->SrcSpatial_p; - SrcSpatial_p->Pos_p_fx[0] = L_shr( SrcSpatial_p->Pos_p_fx[0], SrcSpatial_p->q_Pos_p - Q25 ); - SrcSpatial_p->Pos_p_fx[1] = L_shr( SrcSpatial_p->Pos_p_fx[1], SrcSpatial_p->q_Pos_p - Q25 ); - SrcSpatial_p->Pos_p_fx[2] = L_shr( SrcSpatial_p->Pos_p_fx[2], SrcSpatial_p->q_Pos_p - Q25 ); + SrcSpatial_p->Pos_p_fx[0] = L_shr( SrcSpatial_p->Pos_p_fx[0], sub( SrcSpatial_p->q_Pos_p, Q25 ) ); + move32(); + SrcSpatial_p->Pos_p_fx[1] = L_shr( SrcSpatial_p->Pos_p_fx[1], sub( SrcSpatial_p->q_Pos_p, Q25 ) ); + move32(); + SrcSpatial_p->Pos_p_fx[2] = L_shr( SrcSpatial_p->Pos_p_fx[2], sub( SrcSpatial_p->q_Pos_p, Q25 ) ); + move32(); SrcSpatial_p->q_Pos_p = Q25; + move16(); + test(); + test(); IF( NE_32( SrcSpatial_p->Pos_p_fx[0], Vec_p[0] ) || NE_32( SrcSpatial_p->Pos_p_fx[1], Vec_p[1] ) || NE_32( SrcSpatial_p->Pos_p_fx[2], Vec_p[2] ) ) { Copy32( Vec_p, SrcSpatial_p->Pos_p_fx, 3 ); @@ -258,6 +264,7 @@ ivas_error TDREND_MIX_SRC_SetPlayState( ELSE { hBinRendererTd->Sources[SrcInd]->SrcRend_p->PlayStatus = PlayStatus; + move32(); } return IVAS_ERR_OK; } @@ -322,6 +329,7 @@ static void TDREND_SRC_REND_Init_fx( SrcRend_p->InputAvailable = FALSE; move16(); SrcRend_p->PlayStatus = TDREND_PLAYSTATUS_PLAYING; + move16(); /* SrcGain */ FOR( nC = 0; nC < SPAT_BIN_MAX_INPUT_CHANNELS; nC++ ) { @@ -357,33 +365,17 @@ static void TDREND_SRC_REND_Init( /* SrcGain */ for ( nC = 0; nC < SPAT_BIN_MAX_INPUT_CHANNELS; nC++ ) { -#ifndef IVAS_FLOAT_FIXED SrcRend_p->SrcGainMin_p[nC] = 0.0f; SrcRend_p->SrcGain_p[nC] = 1.0f; SrcRend_p->SrcGainMax_p[nC] = 1.0f; -#else - SrcRend_p->SrcGainMin_p_fx[nC] = ONE_IN_Q14; - move16(); - SrcRend_p->SrcGain_p_fx[nC] = ONE_IN_Q14; - move16(); - SrcRend_p->SrcGainMax_p_fx[nC] = ONE_IN_Q14; - move16(); -#endif } SrcRend_p->SrcGainUpdated = FALSE; /* Init directional and distance gains */ for ( nC = 0; nC < SPAT_BIN_MAX_INPUT_CHANNELS; nC++ ) { -#ifndef IVAS_FLOAT_FIXED SrcRend_p->DirGain_p[nC] = 1.0f; SrcRend_p->DistGain_p[nC] = 1.0f; -#else - SrcRend_p->DirGain_p_fx[nC] = ONE_IN_Q14; - move16(); - SrcRend_p->DistGain_p_fx[nC] = ONE_IN_Q14; - move16(); -#endif } @@ -560,13 +552,13 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( HrFiltSet_p = hBinRendererTd->HrFiltSet_p; *filterlength = s_min( HrFiltSet_p->FiltLength, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); - - IF( SrcSpatial_p->PosType == TDREND_POSTYPE_ABSOLUTE ) + move16(); + IF( EQ_16( SrcSpatial_p->PosType, TDREND_POSTYPE_ABSOLUTE ) ) { /* Absolute position */ TDREND_SPATIAL_VecMapToNewCoordSystem_fx( SrcSpatial_p->Pos_p_fx, Listener_p->Pos_fx, Listener_p->Front_fx, Listener_p->Up_fx, Listener_p->Right_fx, ListRelPos, ListRelPosAbs ); - ListRelPos_e = 62 - Q25 - Q30; // output q of above function is Q25 + Q30 - 31. so exp will be 62 - Q25 - Q30. + ListRelPos_e = 7; // output q of above function is Q25 + Q30 - 31. so exp will be 62 - Q25 - Q30. move16(); ListRelDist = TDREND_SPATIAL_VecNorm_fx( ListRelPos, ListRelPos_e, &ListRelDist_e ); @@ -616,139 +608,149 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( IF( hBinRendererTd->DistAttenEnabled ) { SrcSpatial_p->DistAtten.DistAttenModel = hBinRendererTd->DistAttenModel; + move32(); *SrcRend_p->DistGain_p_fx = TDREND_SRC_SPATIAL_GetDistGain_fx( &SrcSpatial_p->DistAtten, ListRelDist, ListRelDist_e ); + move32(); } } - ELSE{ - IF( SrcSpatial_p->DistAttenEnabled ){ - *SrcRend_p->DistGain_p_fx = TDREND_SRC_SPATIAL_GetDistGain_fx( &SrcSpatial_p->DistAtten, ListRelDist, ListRelDist_e ); - } -} + ELSE IF( SrcSpatial_p->DistAttenEnabled ) + { -/* Update total gains */ -*Gain = extract_h( L_shl( Mpy_32_32( L_shl( L_mult( *SrcRend_p->SrcGain_p_fx, *SrcRend_p->DirGain_p_fx ), 1 ), L_shl( L_mult( *SrcRend_p->DistGain_p_fx, hBinRendererTd->Gain_fx ), 1 ) ), 1 ) ); + *SrcRend_p->DistGain_p_fx = TDREND_SRC_SPATIAL_GetDistGain_fx( &SrcSpatial_p->DistAtten, ListRelDist, ListRelDist_e ); + move32(); + } -/* Delta for interpolation, in case the angular step exceeds MAX_ANGULAR_STEP */ -Word32 ele_tmp = Src_p->elev_prev_fx; -IF( GT_32( ele_tmp, DEG_180_IN_Q22 ) ) -{ - ele_tmp = L_sub( ele_tmp, DEG_360_IN_Q22 ); -} -ELSE IF( LT_32( ele_tmp, -DEG_180_IN_Q22 ) ) -{ - ele_tmp = L_add( ele_tmp, DEG_360_IN_Q22 ); -} -elev_delta = L_sub( Elev, ele_tmp ); -Word32 azi_tmp = Src_p->azim_prev_fx; -IF( GT_32( azi_tmp, DEG_180_IN_Q22 ) ) -{ - azi_tmp = L_sub( azi_tmp, DEG_360_IN_Q22 ); -} -ELSE IF( LT_32( azi_tmp, -DEG_180_IN_Q22 ) ) -{ - azi_tmp = L_add( azi_tmp, DEG_360_IN_Q22 ); -} -azim_delta = L_sub( Azim, azi_tmp ); + /* Update total gains */ + *Gain = extract_h( L_shl( Mpy_32_32( L_shl( L_mult( *SrcRend_p->SrcGain_p_fx, *SrcRend_p->DirGain_p_fx ), 1 ), L_shl( L_mult( *SrcRend_p->DistGain_p_fx, hBinRendererTd->Gain_fx ), 1 ) ), 1 ) ); + move16(); + /* Delta for interpolation, in case the angular step exceeds MAX_ANGULAR_STEP */ + Word32 ele_tmp = Src_p->elev_prev_fx; + move32(); + IF( GT_32( ele_tmp, DEG_180_IN_Q22 ) ) + { + ele_tmp = L_sub( ele_tmp, DEG_360_IN_Q22 ); + } + ELSE IF( LT_32( ele_tmp, -DEG_180_IN_Q22 ) ) + { + ele_tmp = L_add( ele_tmp, DEG_360_IN_Q22 ); + } + elev_delta = L_sub( Elev, ele_tmp ); -Src_p->elev_prev_fx = Elev; -move32(); -Src_p->azim_prev_fx = Azim; -move32(); + Word32 azi_tmp = Src_p->azim_prev_fx; + IF( GT_32( azi_tmp, DEG_180_IN_Q22 ) ) + { + azi_tmp = L_sub( azi_tmp, DEG_360_IN_Q22 ); + } + ELSE IF( LT_32( azi_tmp, -DEG_180_IN_Q22 ) ) + { + azi_tmp = L_add( azi_tmp, DEG_360_IN_Q22 ); + } + azim_delta = L_sub( Azim, azi_tmp ); -/* map to -180:180 range */ -IF( GT_32( azim_delta, DEG_180_IN_Q22 ) ) -{ - azim_delta = L_sub( azim_delta, DEG_360_IN_Q22 ); -} -ELSE IF( LT_32( azim_delta, -DEG_180_IN_Q22 ) ) -{ - azim_delta = L_add( azim_delta, DEG_360_IN_Q22 ); -} -Word16 tmp1 = extract_l( Mpy_32_32( L_abs( azim_delta ), 100 << Q9 ) ); // Q22 + Q9 - Q31 = Q0 -Word16 tmp2 = extract_l( Mpy_32_32( L_abs( elev_delta ), 100 << Q9 ) ); // Q22 + Q9 - Q31 = Q0 -*intp_count = s_min( MAX_INTERPOLATION_STEPS, s_max( tmp1, tmp2 ) ); -} -ELSE /* TDREND_POSTYPE_NON_DIEGETIC */ -{ - *itd = 0; - move16(); - *Gain = ONE_IN_Q14; - move16(); - set32_fx( hrf_left, 0, *filterlength ); - set32_fx( hrf_right, 0, *filterlength ); - hrf_left[0] = L_shr( L_add( SrcSpatial_p->Pos_p_fx[1], ONE_IN_Q25 ), 1 ); // Q25 - move32(); - hrf_right[0] = L_sub( ONE_IN_Q25, hrf_left[0] ); // Q25 - move32(); - hrf_left_e = 6; - move16(); - hrf_right_e = 6; - move16(); - *intp_count = MAX_INTERPOLATION_STEPS; - move16(); - Src_p->elev_prev_fx = 0; - move16(); - Src_p->azim_prev_fx = DEG_360_IN_Q22; /* Dummy angle -- sets max interpolation if switching to TDREND_POSTYPE_ABSOLUTE */ - move16(); -} + Src_p->elev_prev_fx = Elev; + move32(); + Src_p->azim_prev_fx = Azim; + move32(); -test(); -IF( ( *intp_count > 0 ) && subframe_update_flag ) -{ - /* Set deltas for interpolation */ - Word16 tmp_e; - tmp_e = s_max( *hrf_left_prev_e, hrf_left_e ); - FOR( Word16 i = 0; i < *filterlength; i++ ) + /* map to -180:180 range */ + IF( GT_32( azim_delta, DEG_180_IN_Q22 ) ) + { + azim_delta = L_sub( azim_delta, DEG_360_IN_Q22 ); + } + ELSE IF( LT_32( azim_delta, -DEG_180_IN_Q22 ) ) + { + azim_delta = L_add( azim_delta, DEG_360_IN_Q22 ); + } + Word16 tmp1 = extract_l( Mpy_32_32( L_abs( azim_delta ), 100 << Q9 ) ); // Q22 + Q9 - Q31 = Q0 + Word16 tmp2 = extract_l( Mpy_32_32( L_abs( elev_delta ), 100 << Q9 ) ); // Q22 + Q9 - Q31 = Q0 + *intp_count = s_min( MAX_INTERPOLATION_STEPS, s_max( tmp1, tmp2 ) ); + move16(); + } + ELSE /* TDREND_POSTYPE_NON_DIEGETIC */ { - hrf_left[i] = L_shr( hrf_left[i], sub( tmp_e, hrf_left_e ) ); - hrf_left_prev[i] = L_shr( hrf_left_prev[i], sub( tmp_e, *hrf_left_prev_e ) ); + *itd = 0; + move16(); + *Gain = ONE_IN_Q14; + move16(); + set32_fx( hrf_left, 0, *filterlength ); + set32_fx( hrf_right, 0, *filterlength ); + hrf_left[0] = L_shr( L_add( SrcSpatial_p->Pos_p_fx[1], ONE_IN_Q25 ), 1 ); // Q25 + move32(); + hrf_right[0] = L_sub( ONE_IN_Q25, hrf_left[0] ); // Q25 + move32(); + hrf_left_e = 6; + move16(); + hrf_right_e = 6; + move16(); + *intp_count = MAX_INTERPOLATION_STEPS; + move16(); + Src_p->elev_prev_fx = 0; + move16(); + Src_p->azim_prev_fx = DEG_360_IN_Q22; /* Dummy angle -- sets max interpolation if switching to TDREND_POSTYPE_ABSOLUTE */ + move16(); } - *hrf_left_prev_e = tmp_e; - move16(); - hrf_left_e = tmp_e; - move16(); - v_sub_32( hrf_left, hrf_left_prev, hrf_left_delta, *filterlength ); - *hrf_left_delta_e = tmp_e; - move16(); - Word32 fac = L_deposit_h( div_s( 1, *intp_count ) ); - v_multc_fixed( hrf_left_delta, fac, hrf_left_delta, *filterlength ); + test(); + IF( ( *intp_count > 0 ) && subframe_update_flag ) + { + /* Set deltas for interpolation */ + Word16 tmp_e; + tmp_e = s_max( *hrf_left_prev_e, hrf_left_e ); + FOR( Word16 i = 0; i < *filterlength; i++ ) + { + hrf_left[i] = L_shr( hrf_left[i], sub( tmp_e, hrf_left_e ) ); + move32(); + hrf_left_prev[i] = L_shr( hrf_left_prev[i], sub( tmp_e, *hrf_left_prev_e ) ); + move32(); + } + *hrf_left_prev_e = tmp_e; + move16(); + hrf_left_e = tmp_e; + move16(); + v_sub_32( hrf_left, hrf_left_prev, hrf_left_delta, *filterlength ); + *hrf_left_delta_e = tmp_e; + move16(); + + Word32 fac = L_deposit_h( div_s( 1, *intp_count ) ); + v_multc_fixed( hrf_left_delta, fac, hrf_left_delta, *filterlength ); - tmp_e = s_max( *hrf_right_prev_e, hrf_right_e ); - FOR( Word16 i = 0; i < *filterlength; i++ ) + tmp_e = s_max( *hrf_right_prev_e, hrf_right_e ); + FOR( Word16 i = 0; i < *filterlength; i++ ) + { + hrf_right[i] = L_shr( hrf_right[i], sub( tmp_e, hrf_right_e ) ); + move32(); + hrf_right_prev[i] = L_shr( hrf_right_prev[i], sub( tmp_e, *hrf_right_prev_e ) ); + move32(); + } + *hrf_right_prev_e = tmp_e; + move16(); + hrf_right_e = tmp_e; + move16(); + v_sub_32( hrf_right, hrf_right_prev, hrf_right_delta, *filterlength ); + *hrf_right_delta_e = tmp_e; + move16(); + + v_multc_fixed( hrf_right_delta, fac, hrf_right_delta, *filterlength ); + } + ELSE { - hrf_right[i] = L_shr( hrf_right[i], sub( tmp_e, hrf_right_e ) ); - hrf_right_prev[i] = L_shr( hrf_right_prev[i], sub( tmp_e, *hrf_right_prev_e ) ); + /* No interpolation, just set the new filters and reset deltas */ + Copy32( hrf_left, hrf_left_prev, *filterlength ); + *hrf_left_prev_e = hrf_left_e; + move16(); + Copy32( hrf_right, hrf_right_prev, *filterlength ); + *hrf_right_prev_e = hrf_right_e; + move16(); + set32_fx( hrf_left_delta, 0, *filterlength ); + set32_fx( hrf_right_delta, 0, *filterlength ); + *hrf_left_delta_e = 0; + move16(); + *hrf_right_delta_e = 0; + move16(); } - *hrf_right_prev_e = tmp_e; - move16(); - hrf_right_e = tmp_e; - move16(); - v_sub_32( hrf_right, hrf_right_prev, hrf_right_delta, *filterlength ); - *hrf_right_delta_e = tmp_e; - move16(); - v_multc_fixed( hrf_right_delta, fac, hrf_right_delta, *filterlength ); -} -ELSE -{ - /* No interpolation, just set the new filters and reset deltas */ - Copy32( hrf_left, hrf_left_prev, *filterlength ); - *hrf_left_prev_e = hrf_left_e; - move16(); - Copy32( hrf_right, hrf_right_prev, *filterlength ); - *hrf_right_prev_e = hrf_right_e; - move16(); - set32_fx( hrf_left_delta, 0, *filterlength ); - set32_fx( hrf_right_delta, 0, *filterlength ); - *hrf_left_delta_e = 0; - move16(); - *hrf_right_delta_e = 0; - move16(); -} - -return; + return; } #endif @@ -835,6 +837,7 @@ static void TDREND_SRC_SPATIAL_Init_fx( move16(); /* Source position, velocity and direction vectors */ SrcSpatial_p->PosType = PosType; + move32(); FOR( nC = 0; nC < SPAT_BIN_MAX_INPUT_CHANNELS; nC++ ) { /* Source position */ @@ -846,6 +849,7 @@ static void TDREND_SRC_SPATIAL_Init_fx( #ifdef MSAN_FIX SrcSpatial_p->q_Pos_p = Q31; + move16(); #endif /* Source directional attenuation */ @@ -862,6 +866,7 @@ static void TDREND_SRC_SPATIAL_Init_fx( SrcSpatial_p->DistAttenEnabled = FALSE; move16(); SrcSpatial_p->DistAtten.DistAttenModel = TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED; + move16(); SrcSpatial_p->DistAtten.RefDist_fx = ONE_IN_Q30; move32(); SrcSpatial_p->DistAtten.MaxDist_fx = 2113929216; /* Maximum radius (2^ISM_RADIUS_NBITS-1)*0.25 */ /*15.75 in Q27*/ @@ -888,15 +893,8 @@ static void TDREND_SRC_SPATIAL_Init( { /* Source position */ TDREND_SPATIAL_VecInit( SrcSpatial_p->Pos_p + nC * 3, 0.0f, 0.0f, 0.0f ); -#ifdef IVAS_FLOAT_FIXED - TDREND_SPATIAL_VecInit_fx( SrcSpatial_p->Pos_p_fx + nC * 3, 0, 0, 0 ); -#endif - /* Source direction */ TDREND_SPATIAL_VecInit( SrcSpatial_p->Front_p + nC * 3, 0.0f, 0.0f, 1.0f ); -#ifdef IVAS_FLOAT_FIXED - TDREND_SPATIAL_VecInit_fx( SrcSpatial_p->Front_p_fx + nC * 3, 0, 0, ONE_IN_Q30 ); -#endif } /* Source directional attenuation */ @@ -904,30 +902,13 @@ static void TDREND_SRC_SPATIAL_Init( SrcSpatial_p->DirAtten.ConeInnerAngle = 360.0f; SrcSpatial_p->DirAtten.ConeOuterAngle = 360.0f; SrcSpatial_p->DirAtten.ConeOuterGain = 1.0f; -#ifdef IVAS_FLOAT_FIXED - SrcSpatial_p->DirAtten.ConeInnerAngle_fx = DEG_360_IN_Q22; - move32(); - SrcSpatial_p->DirAtten.ConeOuterAngle_fx = DEG_360_IN_Q22; - move32(); - SrcSpatial_p->DirAtten.ConeOuterGain_fx = ONE_IN_Q30; - move32(); -#endif /* Source distance attenuation */ SrcSpatial_p->DistAttenEnabled = FALSE; SrcSpatial_p->DistAtten.DistAttenModel = TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED; -#ifndef IVAS_FLOAT_FIXED SrcSpatial_p->DistAtten.RefDist = 1.0f; SrcSpatial_p->DistAtten.MaxDist = 15.75f; /* Maximum radius (2^ISM_RADIUS_NBITS-1)*0.25 */ SrcSpatial_p->DistAtten.RollOffFactor = 1.0f; -#else - SrcSpatial_p->DistAtten.RefDist_fx = ONE_IN_Q30; - move32(); - SrcSpatial_p->DistAtten.MaxDist_fx = 2113929216; /* Maximum radius (2^ISM_RADIUS_NBITS-1)*0.25 */ /*15.75 in Q27*/ - move32(); - SrcSpatial_p->DistAtten.RollOffFactor_fx = ONE_IN_Q30; - move16(); -#endif return; } @@ -968,12 +949,6 @@ static void TDREND_SRC_SPATIAL_SetDirAtten( SrcSpatial_p->DirAtten.ConeOuterAngle = DirAtten_p->ConeOuterAngle; SrcSpatial_p->DirAtten.ConeOuterGain = DirAtten_p->ConeOuterGain; -#ifdef IVAS_FLOAT_FIXED - SrcSpatial_p->DirAtten.ConeInnerAngle_fx = DirAtten_p->ConeInnerAngle_fx; - SrcSpatial_p->DirAtten.ConeOuterAngle_fx = DirAtten_p->ConeOuterAngle_fx; - SrcSpatial_p->DirAtten.ConeOuterGain_fx = DirAtten_p->ConeOuterGain_fx; -#endif - return; } #endif @@ -1212,7 +1187,7 @@ static Word16 TDREND_SRC_SPATIAL_GetDistGain_fx( BREAK; } - DistGain_fx = shr( DistGain_fx, 1 - DistGain_e ); // Reducing it to Q14 + DistGain_fx = shr( DistGain_fx, sub( 1, DistGain_e ) ); // Reducing it to Q14 return DistGain_fx; } @@ -1223,7 +1198,7 @@ static Word16 TDREND_SRC_SPATIAL_GetDistGain_fx( * * Allocate a source. --------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED ivas_error TDREND_SRC_Alloc( TDREND_SRC_t **Src_pp /* i/o: Source */ ) @@ -1232,7 +1207,7 @@ ivas_error TDREND_SRC_Alloc( TDREND_SRC_t *Src_p; error = IVAS_ERR_OK; - + move32(); *Src_pp = NULL; /* Allocate the TDREND_SRC_t variable */ @@ -1243,12 +1218,12 @@ ivas_error TDREND_SRC_Alloc( Src_p->SrcSpatial_p = NULL; /* If source type is dynamic alloc the TDREND_SRC_SPATIAL_t variable */ - IF( ( error = TDREND_SRC_SPATIAL_Alloc( &Src_p->SrcSpatial_p ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_SRC_SPATIAL_Alloc( &Src_p->SrcSpatial_p ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = TDREND_SRC_REND_Alloc( &Src_p->SrcRend_p ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = TDREND_SRC_REND_Alloc( &Src_p->SrcRend_p ) ), IVAS_ERR_OK ) ) { return error; } @@ -1257,7 +1232,41 @@ ivas_error TDREND_SRC_Alloc( return error; } +#else +ivas_error TDREND_SRC_Alloc( + TDREND_SRC_t **Src_pp /* i/o: Source */ +) +{ + ivas_error error; + TDREND_SRC_t *Src_p; + + error = IVAS_ERR_OK; + *Src_pp = NULL; + + /* Allocate the TDREND_SRC_t variable */ + if ( ( Src_p = (TDREND_SRC_t *) malloc( sizeof( TDREND_SRC_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, " TDREND_SRC_Alloc: Allocation error\n" ) ); + } + + Src_p->SrcSpatial_p = NULL; + /* If source type is dynamic alloc the TDREND_SRC_SPATIAL_t variable */ + if ( ( error = TDREND_SRC_SPATIAL_Alloc( &Src_p->SrcSpatial_p ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = TDREND_SRC_REND_Alloc( &Src_p->SrcRend_p ) ) != IVAS_ERR_OK ) + { + return error; + } + + *Src_pp = Src_p; + + return error; +} +#endif /*-------------------------------------------------------------------* * TDREND_SRC_Dealloc() @@ -1378,16 +1387,9 @@ void TDREND_SRC_Init( Src_p->itd = 0; Src_p->previtd = 0; Src_p->filterlength = 1; /* Init to unit impulse of length 1 */ -#ifndef IVAS_FLOAT_FIXED set_f( Src_p->mem_itd, 0.0f, ITD_MEM_LEN ); set_f( Src_p->mem_hrf_left, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 ); set_f( Src_p->mem_hrf_right, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 ); -#endif -#ifdef IVAS_FLOAT_FIXED - set32_fx( Src_p->mem_itd_fx, 0, ITD_MEM_LEN ); - set32_fx( Src_p->mem_hrf_left_fx, 0, SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 ); - set32_fx( Src_p->mem_hrf_right_fx, 0, SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 ); -#else set_f( Src_p->hrf_left_prev, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); set_f( Src_p->hrf_right_prev, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); Src_p->hrf_left_prev[0] = 1; @@ -1396,19 +1398,6 @@ void TDREND_SRC_Init( Src_p->elev_prev = 0.0f; Src_p->Gain = 1; Src_p->prevGain = 1.0f; -#endif -#ifdef IVAS_FLOAT_FIXED - set32_fx( Src_p->hrf_left_prev_fx, 0, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); - set32_fx( Src_p->hrf_right_prev_fx, 0, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); - Src_p->hrf_left_prev_fx[0] = ONE_IN_Q30; - Src_p->hrf_left_prev_e = 1; - Src_p->hrf_right_prev_fx[0] = ONE_IN_Q30; - Src_p->hrf_right_prev_e = 1; - Src_p->azim_prev_fx = 0; - Src_p->elev_prev_fx = 0; - Src_p->Gain_fx = ONE_IN_Q14; - Src_p->prevGain_fx = ONE_IN_Q14; -#endif return; } diff --git a/lib_rend/ivas_output_init.c b/lib_rend/ivas_output_init.c index b224af672..a7c92ec70 100644 --- a/lib_rend/ivas_output_init.c +++ b/lib_rend/ivas_output_init.c @@ -527,6 +527,150 @@ void ivas_output_init( *-----------------------------------------------------------------*/ /*! r: number of decoder buffers */ +#ifndef IVAS_FLOAT_FIXED +int16_t ivas_get_nchan_buffers_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t sba_analysis_order, /* i : SBA order evaluated in SBA decoder */ + const int32_t ivas_total_brate /* i : total IVAS bitrate */ +) +{ + int16_t nchan_out_buff; + AUDIO_CONFIG output_config; + + output_config = st_ivas->hDecoderConfig->output_config; + + nchan_out_buff = MAX_OUTPUT_CHANNELS; + + if ( st_ivas->ivas_format == MONO_FORMAT ) + { + nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + nchan_out_buff = max( st_ivas->hDecoderConfig->nchan_out, CPE_CHANNELS ); + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + nchan_out_buff = st_ivas->nchan_ism; + + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + nchan_out_buff = max( nchan_out_buff, st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ); + } + else if ( output_config != IVAS_AUDIO_CONFIG_EXTERNAL ) + { + nchan_out_buff = max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( output_config ) ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT ) + { + int16_t nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata( sba_analysis_order, ivas_total_brate ); + nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; + + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + nchan_out_buff = max( nchan_out_buff, st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ); + } + else + { + nchan_out_buff = max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( output_config ) ); + } + nchan_out_buff = max( nchan_out_buff, nchan_internal ); + } + else if ( st_ivas->ivas_format == MASA_FORMAT ) + { + nchan_out_buff = CPE_CHANNELS; + + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + nchan_out_buff = max( nchan_out_buff, st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ); + } + else if ( output_config == IVAS_AUDIO_CONFIG_STEREO || output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + nchan_out_buff = 2 * CPE_CHANNELS; + } + else if ( output_config != IVAS_AUDIO_CONFIG_EXTERNAL ) + { + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( output_config ) ); + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + nchan_out_buff = st_ivas->nchan_ism + CPE_CHANNELS; + + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + nchan_out_buff = max( nchan_out_buff, st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ); + } + else if ( output_config != IVAS_AUDIO_CONFIG_EXTERNAL ) + { + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( output_config ) ); + } + } + else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) + { + int16_t nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata( sba_analysis_order, ivas_total_brate ); + nchan_out_buff = st_ivas->nchan_ism + st_ivas->nchan_transport; + + if ( st_ivas->hMCT != NULL ) + { + nchan_out_buff = ( ( nchan_out_buff + 1 ) >> 1 ) << 1; /* ensure odd number of channels in MCT */ + } + + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + nchan_out_buff = max( nchan_out_buff, st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ); + } + else if ( output_config != IVAS_AUDIO_CONFIG_EXTERNAL ) + { + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( output_config ) ); + + if ( st_ivas->renderer_type == RENDERER_OSBA_AMBI || st_ivas->renderer_type == RENDERER_OSBA_LS ) + { + nchan_out_buff = max( nchan_out_buff + st_ivas->nchan_ism, audioCfg2channels( output_config ) ); /* needed for ivas_sba_upmixer_renderer() */ + } + else + { + nchan_out_buff = max( nchan_out_buff + st_ivas->nchan_ism, audioCfg2channels( output_config ) ); /* needed for ivas_spar_dec_upmixer_sf() which is based on 'nchan_out' */ + } + } + else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + nchan_out_buff = st_ivas->hDecoderConfig->nchan_out + st_ivas->nchan_ism; /*take into account sba_ch_idx' in ivas_dec() */ + } + + if ( !( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + { + nchan_out_buff = max( nchan_out_buff, nchan_internal + st_ivas->nchan_ism ); + } + nchan_out_buff = min( nchan_out_buff, MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS ); + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; + + if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + nchan_out_buff = max( nchan_out_buff, st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ); + } + else + { + nchan_out_buff = max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = max( nchan_out_buff, audioCfg2channels( output_config ) ); + } + } + + + return nchan_out_buff; +} +#else Word16 ivas_get_nchan_buffers_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const Word16 sba_analysis_order, /* i : SBA order evaluated in SBA decoder */ @@ -680,7 +824,7 @@ Word16 ivas_get_nchan_buffers_dec( return nchan_out_buff; } - +#endif /*-------------------------------------------------------------------* * ivas_output_buff_dec() -- GitLab From 11b31e7aa371bf502ff6d85a2b4d00061b83a702 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 1 Jul 2024 12:35:14 +0530 Subject: [PATCH 018/110] Clang formatting changes --- lib_dec/FEC_HQ_core.c | 24 ++--- lib_dec/FEC_HQ_core_fx.c | 20 ++-- lib_dec/FEC_HQ_phase_ecu_fx.c | 176 ++++++++++++++++----------------- lib_dec/FEC_pitch_estim_fx.c | 4 +- lib_dec/FEC_scale_syn_fx.c | 4 +- lib_dec/gain_dec_fx.c | 6 +- lib_dec/gaus_dec_fx.c | 4 +- lib_dec/gs_dec_amr_wb_fx.c | 16 +-- lib_dec/gs_dec_fx.c | 26 ++--- lib_dec/hf_synth_fx.c | 14 +-- lib_dec/hq_classifier_dec_fx.c | 4 +- lib_dec/ivas_tcx_core_dec.c | 2 +- lib_dec/ivas_td_low_rate_dec.c | 4 +- 13 files changed, 152 insertions(+), 152 deletions(-) diff --git a/lib_dec/FEC_HQ_core.c b/lib_dec/FEC_HQ_core.c index e160a25fc..f87cc884f 100644 --- a/lib_dec/FEC_HQ_core.c +++ b/lib_dec/FEC_HQ_core.c @@ -1558,7 +1558,7 @@ void save_synthesis_hq_fec_fx( move16(); BREAK; case IVAS_CPE_DFT: - IF( EQ_16(hCPE->nchan_out , 1) && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) + IF( EQ_16( hCPE->nchan_out, 1 ) && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) { post_hq_delay = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); move16(); @@ -1582,10 +1582,10 @@ void save_synthesis_hq_fec_fx( test(); IF( ( EQ_16( st->codec_mode, MODE1 ) && st->hTcxDec != NULL ) && ( ( EQ_16( st->core, ACELP_CORE ) && !( EQ_16( st->bfi, 1 ) && EQ_16( st->con_tcx, 1 ) ) ) || EQ_16( st->core, HQ_CORE ) ) ) { - Copy( st->hTcxDec->synth_history_fx + output_frame, st->hTcxDec->synth_history_fx, add(sub(output_frame , post_hq_delay) , NS2SA( st->output_Fs, PH_ECU_MEM_NS )) ); + Copy( st->hTcxDec->synth_history_fx + output_frame, st->hTcxDec->synth_history_fx, add( sub( output_frame, post_hq_delay ), NS2SA( st->output_Fs, PH_ECU_MEM_NS ) ) ); FOR( Word16 i = 0; i < output_frame; i++ ) { - st->hTcxDec->old_synthFB_fx[sub(add(i , output_frame) , post_hq_delay)] = extract_h( output_fx[i] ); + st->hTcxDec->old_synthFB_fx[sub( add( i, output_frame ), post_hq_delay )] = extract_h( output_fx[i] ); move16(); } @@ -1594,27 +1594,27 @@ void save_synthesis_hq_fec_fx( /* reset the remaining buffer, which is read in TCX concealment the necessary samples to fill this buffer are not available for all cases, the impact on the output is limited */ - set16_fx( st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , post_hq_delay), 0, post_hq_delay ); + set16_fx( st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), post_hq_delay ), 0, post_hq_delay ); IF( GE_16( output_frame, L_FRAME16k ) ) { - Copy( st->prev_synth_buffer_fx, st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS )), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); + Copy( st->prev_synth_buffer_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ) ), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); } ELSE { - Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl(output_frame, 1), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl( output_frame, 1 ), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } IF( st->core != ACELP_CORE ) { IF( GE_16( output_frame, L_FRAME16k ) ) { - Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , NS2SA( st->output_Fs, DELAY_CLDFB_NS )), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); - Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl(output_frame, 1), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl( output_frame, 1 ), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } ELSE { - Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS )), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); - Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS )), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ) ), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } } } @@ -1622,8 +1622,8 @@ void save_synthesis_hq_fec_fx( { IF( st->core != ACELP_CORE ) { - Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , post_hq_delay), post_hq_delay ); - Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl(output_frame, 1), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), post_hq_delay ), post_hq_delay ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl( output_frame, 1 ), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } } } diff --git a/lib_dec/FEC_HQ_core_fx.c b/lib_dec/FEC_HQ_core_fx.c index d00b95109..418161ecd 100644 --- a/lib_dec/FEC_HQ_core_fx.c +++ b/lib_dec/FEC_HQ_core_fx.c @@ -496,7 +496,7 @@ void ivas_HQ_FEC_Mem_update_fx( IF( ( EQ_16( hqswb_clas, HQ_HVQ ) ) || ( EQ_16( hq_core_type, LOW_RATE_HQ_CORE ) ) ) { /* First group */ - logqnorm_fx( t_audio_q_fx, 12, ynrm, 32, WID_G1, (const Word16)EQ_16( hqswb_clas, HQ_HVQ ) ); + logqnorm_fx( t_audio_q_fx, 12, ynrm, 32, WID_G1, (const Word16) EQ_16( hqswb_clas, HQ_HVQ ) ); j = ynrm[0]; move16(); offset = WID_G1; @@ -504,14 +504,14 @@ void ivas_HQ_FEC_Mem_update_fx( FOR( i = 1; i < SFM_G1; i++ ) { - logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G1, (const Word16)EQ_16( hqswb_clas, HQ_HVQ ) ); + logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G1, (const Word16) EQ_16( hqswb_clas, HQ_HVQ ) ); offset = add( offset, WID_G1 ); } /* Second group */ FOR( i = SFM_G1; i < SFM_G1 + 2; i++ ) { - logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G2, (const Word16)EQ_16( hqswb_clas, HQ_HVQ ) ); + logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G2, (const Word16) EQ_16( hqswb_clas, HQ_HVQ ) ); offset = add( offset, WID_G2 ); } } @@ -796,7 +796,7 @@ void HQ_FEC_Mem_update_fx( IF( ( EQ_16( hqswb_clas, HQ_HVQ ) ) || ( EQ_16( hq_core_type, LOW_RATE_HQ_CORE ) ) ) { /* First group */ - logqnorm_fx( t_audio_q_fx, 12, ynrm, 32, WID_G1, (const Word16)EQ_16( hqswb_clas, HQ_HVQ ) ); + logqnorm_fx( t_audio_q_fx, 12, ynrm, 32, WID_G1, (const Word16) EQ_16( hqswb_clas, HQ_HVQ ) ); j = ynrm[0]; move16(); offset = WID_G1; @@ -804,14 +804,14 @@ void HQ_FEC_Mem_update_fx( FOR( i = 1; i < SFM_G1; i++ ) { - logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G1, (const Word16)EQ_16( hqswb_clas, HQ_HVQ ) ); + logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G1, (const Word16) EQ_16( hqswb_clas, HQ_HVQ ) ); offset = add( offset, WID_G1 ); } /* Second group */ FOR( i = SFM_G1; i < SFM_G1 + 2; i++ ) { - logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G2, (const Word16)EQ_16( hqswb_clas, HQ_HVQ ) ); + logqnorm_fx( &t_audio_q_fx[offset], 12, &ynrm[i], 40, WID_G2, (const Word16) EQ_16( hqswb_clas, HQ_HVQ ) ); offset = add( offset, WID_G2 ); } } @@ -1056,8 +1056,8 @@ void HQ_FEC_Mem_update_fx( FOR( i = 0; i < lin; i += delta ) { #ifdef BASOP_NOGLOB - accA_fx = L_add_sat( accA_fx, L_shr( L_mult_sat( mu_o_fx[add(d1 , i)], mu_o_fx[add(d1 , i)] ), 2 ) ); - accB_fx = L_add_sat( accB_fx, L_shr( L_mult_sat( mu_o_fx[add(d1 , i)], in_fx[i] ), 2 ) ); + accA_fx = L_add_sat( accA_fx, L_shr( L_mult_sat( mu_o_fx[add( d1, i )], mu_o_fx[add( d1, i )] ), 2 ) ); + accB_fx = L_add_sat( accB_fx, L_shr( L_mult_sat( mu_o_fx[add( d1, i )], in_fx[i] ), 2 ) ); #else accA_fx = L_add( accA_fx, L_shr( L_mult( mu_o_fx[d1 + i], mu_o_fx[d1 + i] ), 2 ) ); accB_fx = L_add( accB_fx, L_shr( L_mult( mu_o_fx[d1 + i], in_fx[i] ), 2 ) ); @@ -1262,7 +1262,7 @@ void HQ_FEC_Mem_update_fx( FOR( i = 0; i < L_overlap; i++ ) { - SmoothingWin_NB3_fx[i] = SmoothingWin_NB875_fx[imult1616(i , 3)]; + SmoothingWin_NB3_fx[i] = SmoothingWin_NB875_fx[imult1616( i, 3 )]; move16(); } @@ -1302,7 +1302,7 @@ void HQ_FEC_Mem_update_fx( pow22_fx = L_deposit_l( 0 ); FOR( i = 0; i < L; i++ ) { - pow1_fx = L_add( pow1_fx, shr( abs_s( st_fx->old_auOut_2fr_fx[add(L , i)] ), 1 ) ); + pow1_fx = L_add( pow1_fx, shr( abs_s( st_fx->old_auOut_2fr_fx[add( L, i )] ), 1 ) ); pow22_fx = L_add( pow22_fx, shr( abs_s( ImdctOutWin_fx[N_ZERO_NB + i] ), 1 ) ); } IF( pow22_fx != 0 ) diff --git a/lib_dec/FEC_HQ_phase_ecu_fx.c b/lib_dec/FEC_HQ_phase_ecu_fx.c index bd63131d1..7d75f0029 100644 --- a/lib_dec/FEC_HQ_phase_ecu_fx.c +++ b/lib_dec/FEC_HQ_phase_ecu_fx.c @@ -610,9 +610,9 @@ static void trans_ana_fx( #endif att_val = 32767; move16(); - IF ( *pGrPowRight > 0 ) + IF( *pGrPowRight > 0 ) { - IF ( LT_32( *pGrPowRight, *pGrPowLeft ) ) /* i.e., (gr_pow_right/gr_pow_left) < 1.0 */ + IF( LT_32( *pGrPowRight, *pGrPowLeft ) ) /* i.e., (gr_pow_right/gr_pow_left) < 1.0 */ { /* Compute sqrt(grp_pow_chg), where grp_pow_chg = gr_pow_right/gr_pow_left. */ tmp16 = ratio( *pGrPowRight, *pGrPowLeft, &expo ); /* tmp16 in Q14 */ @@ -666,7 +666,7 @@ static void trans_ana_fx( mag_chg[k] = mult_r( mag_chg_1st[k], att_val ); /* Q15 */ move16(); - IF ( GT_16( burst_len, BETA_MUTE_THR ) ) + IF( GT_16( burst_len, BETA_MUTE_THR ) ) { *beta_mute = shr( *beta_mute, 1 ); move16(); @@ -753,7 +753,7 @@ static void ivas_peakfinder_fx( pDx0 = pDx01 + 1; len = 0; move16(); - IF ( endpoints ) + IF( endpoints ) { *pX++ = *pX0++; move16(); @@ -769,7 +769,7 @@ static void ivas_peakfinder_fx( FOR( i = 0; i < len0Minus2; i++ ) { - IF ( s_xor( *pDx01++, *pDx0++ ) < 0 ) /* Detect sign change. */ + IF( s_xor( *pDx01++, *pDx0++ ) < 0 ) /* Detect sign change. */ { *pInd++ = add( i, 1 ); move16(); @@ -779,7 +779,7 @@ static void ivas_peakfinder_fx( } pX0++; } - IF ( endpoints ) + IF( endpoints ) { *pInd = len0Minus1; move16(); @@ -803,7 +803,7 @@ static void ivas_peakfinder_fx( move16(); threshold = add( leftMin, sel ); - IF ( len > 0 ) + IF( len > 0 ) { /* Deal with first point a little differently since tacked it on Calculate the sign of the derivative since we took the first point @@ -821,7 +821,7 @@ static void ivas_peakfinder_fx( { ii = -1; move16(); - IF ( GE_16( xAt1, xAt2 ) ) /* x[1] is not extremum -> overwrite with x[0] */ + IF( GE_16( xAt1, xAt2 ) ) /* x[1] is not extremum -> overwrite with x[0] */ { *pX = xAt0; /* x[1] = x[0] */ move16(); @@ -855,7 +855,7 @@ static void ivas_peakfinder_fx( // PMTE () ii = -1; /* First point is a peak */ move16(); - IF ( GE_16( len, 2 ) ) + IF( GE_16( len, 2 ) ) { if ( GE_16( x[1], x[0] ) ) { @@ -873,14 +873,14 @@ static void ivas_peakfinder_fx( ii = add( ii, 1 ); /* This is a peak */ /* Make sure we don't iterate past the length of our vector */ - IF ( GE_16( ii, lenMinus1 ) ) + IF( GE_16( ii, lenMinus1 ) ) { BREAK; } /*Reset peak finding if we had a peak and the next peak is bigger than the last or the left min was small enough to reset.*/ - IF ( foundPeak > 0 ) + IF( foundPeak > 0 ) { tempMag = minMag; move16(); @@ -890,9 +890,9 @@ static void ivas_peakfinder_fx( /* Found new peak that was larger than temp mag and selectivity larger than the minimum to its left. */ - IF ( GT_16( *( ++pX ), tempMag ) ) + IF( GT_16( *( ++pX ), tempMag ) ) { - IF ( GT_16( *pX, threshold ) ) /* threshold = leftMin + sel */ + IF( GT_16( *pX, threshold ) ) /* threshold = leftMin + sel */ { tempLoc = ii; move16(); @@ -905,9 +905,9 @@ static void ivas_peakfinder_fx( pX++; /* Come down at least sel from peak */ - IF ( foundPeak == 0 ) + IF( foundPeak == 0 ) { - IF ( GT_16( tempMag, add( sel, *pX ) ) ) + IF( GT_16( tempMag, add( sel, *pX ) ) ) { foundPeak = 1; /* We have found a peak */ move16(); @@ -922,9 +922,9 @@ static void ivas_peakfinder_fx( move16(); } } - IF ( foundPeak == 0 ) /* The above IF-block has not found the peak yet. */ + IF( foundPeak == 0 ) /* The above IF-block has not found the peak yet. */ { - IF ( LT_16( *pX, leftMin ) ) /* New left minimum */ + IF( LT_16( *pX, leftMin ) ) /* New left minimum */ { leftMin = *pX; move16(); @@ -934,9 +934,9 @@ static void ivas_peakfinder_fx( } /* Check end point */ - IF ( GT_16( x[lenMinus1], tempMag ) ) + IF( GT_16( x[lenMinus1], tempMag ) ) { - IF ( GT_16( x[lenMinus1], threshold ) ) /* threshold = leftMin + sel */ + IF( GT_16( x[lenMinus1], threshold ) ) /* threshold = leftMin + sel */ { peakLoc[*cInd] = lenMinus1; move16(); @@ -948,9 +948,9 @@ static void ivas_peakfinder_fx( move16(); } } - IF ( foundPeak == 0 ) /* Check if we still need to add the last point */ + IF( foundPeak == 0 ) /* Check if we still need to add the last point */ { - IF ( GT_16( tempMag, minMag ) ) + IF( GT_16( tempMag, minMag ) ) { peakLoc[*cInd] = tempLoc; move16(); @@ -1069,7 +1069,7 @@ static void peakfinder_fx( FOR( i = 0; i < len0Minus2; i++ ) { - IF ( s_xor( *pDx01++, *pDx0++ ) < 0 ) /* Detect sign change. */ + IF( s_xor( *pDx01++, *pDx0++ ) < 0 ) /* Detect sign change. */ { *pInd++ = add( i, 1 ); move16(); @@ -1188,7 +1188,7 @@ static void peakfinder_fx( /*Reset peak finding if we had a peak and the next peak is bigger than the last or the left min was small enough to reset.*/ - IF ( foundPeak > 0 ) + IF( foundPeak > 0 ) { tempMag = minMag; move16(); @@ -1198,9 +1198,9 @@ static void peakfinder_fx( /* Found new peak that was larger than temp mag and selectivity larger than the minimum to its left. */ - IF ( GT_16( *( ++pX ), tempMag ) ) + IF( GT_16( *( ++pX ), tempMag ) ) { - IF ( GT_16( *pX, threshold ) ) /* threshold = leftMin + sel */ + IF( GT_16( *pX, threshold ) ) /* threshold = leftMin + sel */ { tempLoc = ii; move16(); @@ -1213,9 +1213,9 @@ static void peakfinder_fx( pX++; /* Come down at least sel from peak */ - IF ( foundPeak == 0 ) + IF( foundPeak == 0 ) { - IF ( GT_16( tempMag, add( sel, *pX ) ) ) + IF( GT_16( tempMag, add( sel, *pX ) ) ) { foundPeak = 1; /* We have found a peak */ move16(); @@ -1230,9 +1230,9 @@ static void peakfinder_fx( move16(); } } - IF ( foundPeak == 0 ) /* The above IF-block has not found the peak yet. */ + IF( foundPeak == 0 ) /* The above IF-block has not found the peak yet. */ { - IF ( LT_16( *pX, leftMin ) ) /* New left minimum */ + IF( LT_16( *pX, leftMin ) ) /* New left minimum */ { leftMin = *pX; move16(); @@ -1242,9 +1242,9 @@ static void peakfinder_fx( } /* Check end point */ - IF ( GT_16( x[lenMinus1], tempMag ) ) + IF( GT_16( x[lenMinus1], tempMag ) ) { - IF ( GT_16( x[lenMinus1], threshold ) ) /* threshold = leftMin + sel */ + IF( GT_16( x[lenMinus1], threshold ) ) /* threshold = leftMin + sel */ { peakLoc[*cInd] = lenMinus1; move16(); @@ -1255,9 +1255,9 @@ static void peakfinder_fx( move16(); } } - IF ( foundPeak == 0 ) /* Check if we still need to add the last point */ + IF( foundPeak == 0 ) /* Check if we still need to add the last point */ { - IF ( GT_16( tempMag, minMag ) ) + IF( GT_16( tempMag, minMag ) ) { peakLoc[*cInd] = tempLoc; move16(); @@ -1354,11 +1354,11 @@ static Word16 imax_fx( /* o: The location, relative to the sign = L_xor( y3_y1, denom ); /* Preserve the sign since div_s() only takes positive arguments. */ numer = L_abs( y3_y1 ); denom = L_abs( denom ); - IF ( numer == 0 ) + IF( numer == 0 ) { return 0; } - IF ( denom == 0 ) + IF( denom == 0 ) { return 0; } @@ -1377,7 +1377,7 @@ static Word16 imax_fx( /* o: The location, relative to the /* For both edges (left and right), the extremum found above may be minimum. * It needs to reject the minimum. */ - IF ( special != 0 ) /* Either edge specical case. */ + IF( special != 0 ) /* Either edge specical case. */ { edge = 0x7fff; /* 1 in Q15 for the right edge special case */ move16(); @@ -1521,7 +1521,7 @@ static void ivas_spec_ana_fx( // PMTE() window_corr = w_hamm[0]; move16(); - window_corr_step = idiv1616(w_hamm[0] , hamm_len2); + window_corr_step = idiv1616( w_hamm[0], hamm_len2 ); FOR( i = 0; i < hamm_len2; i++ ) { xfp[i] = mult_r( shl( prevsynth[i], *Q ), sub( w_hamm[i], window_corr ) ); @@ -1546,12 +1546,12 @@ static void ivas_spec_ana_fx( // PMTE() window_corr = w_hamm[0]; move16(); - window_corr_step = idiv1616(w_hamm[0] , hamm_len2); + window_corr_step = idiv1616( w_hamm[0], hamm_len2 ); FOR( i = 0; i < hamm_len2; i++ ) { xfp[i] = mult_r( shl( prevsynth[i], *Q ), sub( w_hamm[i], window_corr ) ); move16(); - xfp[sub(sub(Lprot , i) , 1)] = mult_r( shl( prevsynth[sub(sub(Lprot , i) , 1)], *Q ), sub( w_hamm[i], window_corr ) ); + xfp[sub( sub( Lprot, i ), 1 )] = mult_r( shl( prevsynth[sub( sub( Lprot, i ), 1 )], *Q ), sub( w_hamm[i], window_corr ) ); move16(); window_corr = sub( window_corr, window_corr_step ); } @@ -1596,8 +1596,8 @@ static void ivas_spec_ana_fx( expo = norm_l( *pMagSq ); /* exponent */ man = extract_h( L_shl( *pMagSq++, expo ) ); /* mantissa */ man = sqrt2ndOrder( man ); - expoBy2 = shr( expo, 1 ); /* Divided by 2-- square root operation. */ - IF ( s_and( expo, 1 ) == 0 ) /* Check even or odd. */ + expoBy2 = shr( expo, 1 ); /* Divided by 2-- square root operation. */ + IF( s_and( expo, 1 ) == 0 ) /* Check even or odd. */ { man = mult_r( man, FEC_HQ_ECU_ROOT2 ); /* FEC_HQ_ECU_ROOT2 is sqrt(2) in Q14 */ expoBy2 = sub( expoBy2, 1 ); @@ -1636,7 +1636,7 @@ static void ivas_spec_ana_fx( pPlocs = plocs; n = sub( *num_plocs, 1 ); /* -1 so as to exclude the very last peak. */ /* Special case-- The very 1st peak if it is at 0 index position */ - IF ( *pPlocs == 0 ) /* Only the very 1st peak is possible the peak at 0 index position. */ + IF( *pPlocs == 0 ) /* Only the very 1st peak is possible the peak at 0 index position. */ { fraction = imax_fx( xfp, -1 ); /* -1 signifies special left edge case. */ acc = L_deposit_h( *pPlocs++ ); /* N.B., (*pPlocs) must be zero here. */ @@ -1654,7 +1654,7 @@ static void ivas_spec_ana_fx( *pPlocsi++ = L_mac( acc, fraction, 1 ); move32(); /* in Q16. Append the fractional part to the integral part. */ } - IF ( n >= 0 ) + IF( n >= 0 ) { /* Special case-- The very last peak */ pXfp = pXfp1 + *pPlocs; @@ -1718,7 +1718,7 @@ static void ivas_spec_ana_fx( endPlocs = sub( Lprot2_1, DELTA_CORR_F0_INT ); /* last *pPlocs position for Jacobsen */ /* precompute number of turns based on endpoint integer location and make into a proper for loop */ - IF ( n > 0 ) + IF( n > 0 ) { nJacob = n; move16(); @@ -1741,13 +1741,13 @@ static void ivas_spec_ana_fx( /* At this point there should at most two plocs left to process */ /* the position before fs/2 and fs/2 both use the same magnitude points */ - IF ( n > 0 ) + IF( n > 0 ) { /* [ . . . . . . . ] Lprot/2+1 positions */ /* | | | */ /* 0 (Lprot/2-2) (Lprot/2) */ - IF ( EQ_16( currPlocs, ( sub( Lprot2_1, DELTA_CORR_F0_INT ) ) ) ) /* Also 2nd last peak position uses fs/2 which makes jacobsen less suitable. */ + IF( EQ_16( currPlocs, ( sub( Lprot2_1, DELTA_CORR_F0_INT ) ) ) ) /* Also 2nd last peak position uses fs/2 which makes jacobsen less suitable. */ { fraction = imax_fx( &xfp[currPlocs - 1], 0 ); /* in Q15 */ acc = L_deposit_h( sub( currPlocs, 1 ) ); @@ -1761,7 +1761,7 @@ static void ivas_spec_ana_fx( /* Here the only remaining point would be a fs/2 plocs */ /* pXfp = xfp + sub(Lprot2,1); already set just a reminder where it * whould point */ - IF ( n > 0 ) /* fs/2 which makes special case . */ + IF( n > 0 ) /* fs/2 which makes special case . */ { fraction = imax_fx( &xfp[currPlocs - 2], 0 ); /* in Q15 */ acc = L_deposit_h( sub( currPlocs, 2 ) ); @@ -1784,7 +1784,7 @@ static void ivas_spec_ana_fx( { st_point = s_max( 0, sub( plocs[i], DELTA_CORR ) ); end_point = s_min( sub( Lprot2_1, 1 ), add( plocs[i], DELTA_CORR ) ); - set16_fx( &xfp[st_point], 0, extract_l(L_add( L_sub( end_point, st_point ), 1 )) ); + set16_fx( &xfp[st_point], 0, extract_l( L_add( L_sub( end_point, st_point ), 1 ) ) ); } noise = L_add( sum16_32_fx( xfp, Lprot2_1 ), 1 ); @@ -1934,7 +1934,7 @@ static void spec_ana_fx( } /* Apply zeroing of non-coded FFT spectrum */ - IF ( GT_16( output_frame, inner_frame_tbl[bwidth_fx] ) ) + IF( GT_16( output_frame, inner_frame_tbl[bwidth_fx] ) ) { stop_band_start = shl( 128, bwidth_fx ); stop_band_length = sub( Lprot, shl( stop_band_start, 1 ) ); @@ -1967,8 +1967,8 @@ static void spec_ana_fx( expo = norm_l( *pMagSq ); /* exponent */ man = extract_h( L_shl( *pMagSq++, expo ) ); /* mantissa */ man = sqrt2ndOrder( man ); - expoBy2 = shr( expo, 1 ); /* Divided by 2-- square root operation. */ - IF ( s_and( expo, 1 ) == 0 ) /* Check even or odd. */ + expoBy2 = shr( expo, 1 ); /* Divided by 2-- square root operation. */ + IF( s_and( expo, 1 ) == 0 ) /* Check even or odd. */ { man = mult_r( man, FEC_HQ_ECU_ROOT2 ); /* FEC_HQ_ECU_ROOT2 is sqrt(2) in Q14 */ expoBy2 = sub( expoBy2, 1 ); @@ -2021,7 +2021,7 @@ static void spec_ana_fx( pPlocs = plocs; n = sub( *num_plocs, 1 ); /* -1 so as to exclude the very last peak. */ /* Special case-- The very 1st peak if it is at 0 index position */ - IF ( *pPlocs == 0 ) /* Only the very 1st peak is possible the peak at 0 index position. */ + IF( *pPlocs == 0 ) /* Only the very 1st peak is possible the peak at 0 index position. */ { fraction = imax_fx( xfp, -1 ); /* -1 signifies special left edge case. */ acc = L_deposit_h( *pPlocs++ ); /* N.B., (*pPlocs) must be zero here. */ @@ -2039,7 +2039,7 @@ static void spec_ana_fx( *pPlocsi++ = L_mac( acc, fraction, 1 ); move32(); /* in Q16. Append the fractional part to the integral part. */ } - IF ( n >= 0 ) + IF( n >= 0 ) { /* Special case-- The very last peak */ pXfp = pXfp1 + *pPlocs; @@ -2266,7 +2266,7 @@ static void ivas_subst_spec_fx( } one_peak_flag_mask = 32767 /* 1.0f in Q15 */; /* all ones mask -> keep */ move16(); - IF ( element_mode != EVS_MONO ) + IF( element_mode != EVS_MONO ) { test(); if ( ( *num_plocs > 0 ) && ( sub( *num_plocs, 3 ) < 0 ) ) @@ -2274,7 +2274,7 @@ static void ivas_subst_spec_fx( one_peak_flag_mask = noise_fac; /* all zeroes mask -> zero */ move16(); } - IF ( *num_plocs == 0 ) + IF( *num_plocs == 0 ) { X[0] = 0; /* reset DC if there are no peaks */ move16(); @@ -2311,7 +2311,7 @@ static void ivas_subst_spec_fx( move16(); pkLocation1 = *pPlocs++; /* plocs[m + 1] */ move16(); - IF ( m > 0 ) + IF( m > 0 ) { delta_tmp = shr( sub( sub( pkLocation, pkLocation_1 ), 1 ), 1 ); if ( LT_16( delta_tmp, DELTA_CORR ) ) @@ -2321,7 +2321,7 @@ static void ivas_subst_spec_fx( } } - IF ( LT_16( m, lastPeak ) ) + IF( LT_16( m, lastPeak ) ) { delta_tmp = shr( sub( sub( pkLocation1, pkLocation ), 1 ), 1 ); if ( LT_16( delta_tmp, DELTA_CORR ) ) @@ -2420,7 +2420,7 @@ static void ivas_subst_spec_fx( { mag_chg_local = mag_chg[k]; move16(); - IF ( ph_dith != 0 ) + IF( ph_dith != 0 ) { Xph = *pCorrPhase; /* in Q16. 2*PI is not included. */ move32(); @@ -2429,7 +2429,7 @@ static void ivas_subst_spec_fx( acc = L_shr( acc, PHASE_DITH_SCALE_SHIFT ); Xph = L_add( Xph, acc ); /* in Q16. */ - IF ( ph_dith > 0 ) /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized ) */ + IF( ph_dith > 0 ) /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized ) */ { /* mag_chg_local *= 0.5 + (1.0 - ph_dith[i])/2 where 0.5~= sqrt((float)pow(10.0,-6/10.0)) and ph_dith=0..1.0--> scale=1.0 ...5 */ mag_chg_local = mult_r( mag_chg_local, sub( 32767, shr( ph_dith, 1 ) ) ); @@ -2485,7 +2485,7 @@ static void ivas_subst_spec_fx( expo = shr( expo, 1 ); beta_local = mult_r( beta_mute, round_fx( L_shl( acc, sub( 31, expo ) ) ) ); - IF ( GE_16( k, LGW32K - 1 ) ) + IF( GE_16( k, LGW32K - 1 ) ) { beta_local = mult_r( beta_local, 3277 ); /* 0.1 in Q15 */ } @@ -2713,7 +2713,7 @@ static void subst_spec_fx( move16(); pkLocation1 = *pPlocs++; /* plocs[m + 1] */ move16(); - IF ( m > 0 ) + IF( m > 0 ) { delta_tmp = shr( sub( sub( pkLocation, pkLocation_1 ), 1 ), 1 ); if ( LT_16( delta_tmp, DELTA_CORR ) ) @@ -2723,7 +2723,7 @@ static void subst_spec_fx( } } - IF ( LT_16( m, lastPeak ) ) + IF( LT_16( m, lastPeak ) ) { delta_tmp = shr( sub( sub( pkLocation1, pkLocation ), 1 ), 1 ); if ( LT_16( delta_tmp, DELTA_CORR ) ) @@ -2827,7 +2827,7 @@ static void subst_spec_fx( { mag_chg_local = mag_chg[k]; move16(); - IF ( ph_dith != 0 ) + IF( ph_dith != 0 ) { Xph = *pCorrPhase; /* in Q16. 2*PI is not included. */ move32(); @@ -2836,7 +2836,7 @@ static void subst_spec_fx( acc = L_shr( acc, PHASE_DITH_SCALE_SHIFT ); Xph = L_add( Xph, acc ); /* in Q16. */ - IF ( ph_dith > 0 ) /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized ) */ + IF( ph_dith > 0 ) /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized ) */ { /* mag_chg_local *= 0.5 + (1.0 - ph_dith[i])/2 where 0.5~= sqrt((float)pow(10.0,-6/10.0)) and ph_dith=0..1.0--> scale=1.0 ...5 */ mag_chg_local = mult_r( mag_chg_local, sub( 32767, shr( ph_dith, 1 ) ) ); @@ -3019,7 +3019,7 @@ static void ivas_rec_wtda_fx( Word16 copy_len; Word16 ola_len; - copy_len = NS2SA( output_frame * FRAMES_PER_SEC, ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* prototype fill on each side of xsubst to fill MDCT Frame */ + copy_len = NS2SA( output_frame * FRAMES_PER_SEC, ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* prototype fill on each side of xsubst to fill MDCT Frame */ move16(); ola_len = NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS - ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* remaining lengt of LA_ZEROS to overlap add decoded with xsubst */ move16(); @@ -3077,22 +3077,22 @@ static void ivas_rec_wtda_fx( } /* extract reconstructed frame with aldo window */ - timesh = sub(NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) , shr(sub( shl(output_frame, 1) , Lprot ) , 1)); + timesh = sub( NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ), shr( sub( shl( output_frame, 1 ), Lprot ), 1 ) ); - set16_fx( xsubst_, 0, add(sub(shl(output_frame, 1) , Lprot) , timesh) ); - Copy( X, xsubst_ + add(sub(shl(output_frame, 1) , Lprot) , timesh), sub(Lprot , timesh) ); + set16_fx( xsubst_, 0, add( sub( shl( output_frame, 1 ), Lprot ), timesh ) ); + Copy( X, xsubst_ + add( sub( shl( output_frame, 1 ), Lprot ), timesh ), sub( Lprot, timesh ) ); /* Copy and OLA look ahead zero part of MDCT window from decoded signal */ IF( element_mode != EVS_MONO ) { Copy( old_dec, xsubst_ + NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ), copy_len ); /* also need to scale to Q0 ?? */ pOld = old_dec + copy_len; - pNew = xsubst_ + add(copy_len , NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS )); + pNew = xsubst_ + add( copy_len, NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) ); tmp = div_s( 1, shl( ola_len, 1 ) ); // Q15 tmp = round_fx( L_shl( L_mult( tmp, EVS_PI_FX ), 2 ) ); // Q15 sinq_fx( tmp, 0, ola_len, xfwin ); v_mult16_fixed( xfwin, xfwin, xfwin, ola_len ); /* xfwin = sin^2 of 0..pi/4 */ - pOldW = xfwin + sub(ola_len , 1); + pOldW = xfwin + sub( ola_len, 1 ); pNewW = xfwin; FOR( i = 0; i < ola_len; i++ ) { @@ -3107,7 +3107,7 @@ static void ivas_rec_wtda_fx( ELSE { /* Smoothen onset of ECU frame */ - p_ecu = xsubst_ + add( sub( shl(output_frame, 1), Lprot ), timesh ); + p_ecu = xsubst_ + add( sub( shl( output_frame, 1 ), Lprot ), timesh ); FOR( i = 0; i < xf_len; ( i++, p_ecu++ ) ) { idx = extract_l( L_shr( L_mult0( i, tbl_delta ), 12 ) ); @@ -3268,7 +3268,7 @@ static void rec_wtda_fx( set16_fx( xsubst_ + add( output_frame, Lprot2 ), 0, l ); /* Smoothen onset of ECU frame */ - p_ecu = xsubst_ + sub( output_frame , Lprot2 ); + p_ecu = xsubst_ + sub( output_frame, Lprot2 ); FOR( i = 0; i < xf_len; i++ ) { idx = extract_l( L_shr( L_mult0( i, tbl_delta ), 12 ) ); @@ -3418,7 +3418,7 @@ static Word32 mult_32_32_q( const Word32 a, const Word32 b, const Word16 q ) Mpy_32_32_ss( a, b, &hi, &lo ); #ifdef BASOP_NOGLOB - return L_or( L_shl_o( hi, sub(32 - 1 , q ), &Overflow ), L_lshr( lo, add(q , 1) ) ); + return L_or( L_shl_o( hi, sub( 32 - 1, q ), &Overflow ), L_lshr( lo, add( q, 1 ) ) ); #else return L_or( L_shl( hi, 32 - q - 1 ), L_lshr( lo, q + 1 ) ); #endif @@ -3451,7 +3451,7 @@ static void fir_dwn_fx( { s = L_deposit_l( 0 ); ptr_h = h + 1; - ptr_x = x + sub(i , 1); + ptr_x = x + sub( i, 1 ); FOR( j = 1; j <= i; j++ ) { @@ -3473,7 +3473,7 @@ static void fir_dwn_fx( { s = L_deposit_l( 0 ); ptr_h = h + 1; - ptr_x = x + sub(i , 1); + ptr_x = x + sub( i, 1 ); move16(); FOR( j = 1; j <= K; j++ ) @@ -3653,7 +3653,7 @@ static void fec_ecu_pitch_fx( } - IF( EQ_16(HqVoicing , 1) ) + IF( EQ_16( HqVoicing, 1 ) ) { cb_start = 0; move16(); @@ -3677,7 +3677,7 @@ static void fec_ecu_pitch_fx( { accA = 0; move16(); - IF( EQ_16(i , cb_start) ) + IF( EQ_16( i, cb_start ) ) { accB = 0; move16(); @@ -3717,9 +3717,9 @@ static void fec_ecu_pitch_fx( accCisqrt = Isqrt( accC ); /* Q31 - 3 + tmpQLP*/ - Ryytmp = mult_32_32_q( accA, accCisqrt, sub(16 + 3 , tmpQLP) ); /*Q 6 -2*tmpQLP + Q31 - 3 + tmpQLP -16 -3 +tmpQLP = Q15*/ - Ryytmp = mult_32_32_q( Ryytmp, accBisqrt, add(15 - 3 , tmpQLP) ); /*Q15 + Q31 - 3 + tmpQLP -15 + 3- tmpQLP = Q31*/ - Ryy = extract_h( Ryytmp ); /* Q15 */ + Ryytmp = mult_32_32_q( accA, accCisqrt, sub( 16 + 3, tmpQLP ) ); /*Q 6 -2*tmpQLP + Q31 - 3 + tmpQLP -16 -3 +tmpQLP = Q15*/ + Ryytmp = mult_32_32_q( Ryytmp, accBisqrt, add( 15 - 3, tmpQLP ) ); /*Q15 + Q31 - 3 + tmpQLP -15 + 3- tmpQLP = Q31*/ + Ryy = extract_h( Ryytmp ); /* Q15 */ IF( GT_16( Ryy, *min_corr_fx ) ) @@ -4028,7 +4028,7 @@ static void fec_ecu_dft_fx( IF( EQ_16( *Nfft, N ) ) { - Copy( &target[1], &Tfr16[1], sub(*Nfft , 2) ); + Copy( &target[1], &Tfr16[1], sub( *Nfft, 2 ) ); } ELSE { @@ -4550,7 +4550,7 @@ static void ivas_fec_noise_filling_fx( Copy( synthesis_fx, synthesis_fx + kk, sub( 2 * L, kk ) ); Copy( synthesis_fx + L, gapsynth_fx, L ); - Copy( prevsynth_fx + sub(alignment_point , kk), synthesis_fx, kk ); + Copy( prevsynth_fx + sub( alignment_point, kk ), synthesis_fx, kk ); } #endif @@ -4918,7 +4918,7 @@ static void ivas_hq_phase_ecu_fx( lprot = L_PROT32k; /* 1024 */ move16(); } - ELSE IF( EQ_16(output_frame , L_FRAME16k) ) + ELSE IF( EQ_16( output_frame, L_FRAME16k ) ) { lprot = 512; move16(); @@ -4970,16 +4970,16 @@ static void ivas_hq_phase_ecu_fx( /* seed for own_rand2 */ seed = *time_offs; move16(); - IF ( *num_p > 0 ) + IF( *num_p > 0 ) { - seed = add( seed, plocs[sub(*num_p , 1)] ); + seed = add( seed, plocs[sub( *num_p, 1 )] ); } ivas_subst_spec_fx( plocs, plocsi, num_p, *time_offs, X, mag_chg, ph_dith, old_is_transient, output_frame, &seed, alpha, beta, *beta_mute, Xavg, element_mode, ph_ecu_lookahead, noise_fac ); /* reconstructed frame in tda domain */ - old_dec = prevsynth + sub( shl(output_frame, 1), NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) ); + old_dec = prevsynth + sub( shl( output_frame, 1 ), NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) ); ivas_rec_frame_fx( X, ecu_rec, output_frame, *Q_spec, old_dec, element_mode, num_p, plocs ); *last_fec = 0; @@ -5111,9 +5111,9 @@ static void hq_phase_ecu_fx( /* seed for own_rand2 */ seed = *time_offs; move16(); - IF ( *num_p > 0 ) + IF( *num_p > 0 ) { - seed = add( seed, plocs[sub(*num_p , 1)] ); + seed = add( seed, plocs[sub( *num_p, 1 )] ); } subst_spec_fx( plocs, plocsi, num_p, *time_offs, X, mag_chg, ph_dith, old_is_transient, output_frame, &seed, diff --git a/lib_dec/FEC_pitch_estim_fx.c b/lib_dec/FEC_pitch_estim_fx.c index 2e139334c..1305f1373 100644 --- a/lib_dec/FEC_pitch_estim_fx.c +++ b/lib_dec/FEC_pitch_estim_fx.c @@ -74,7 +74,7 @@ void FEC_pitch_estim_fx( test(); IF( ( ( element_mode == EVS_MONO ) && EQ_16( last_core, HQ_CORE ) ) || ( element_mode != EVS_MONO && ( EQ_16( last_core, HQ_CORE ) || EQ_16( last_core, TCX_20_CORE ) || EQ_16( last_core, TCX_10_CORE ) ) ) ) { - *bfi_pitch = pitch_buf[sub(shr( L_frame, 6 ) , 1)]; + *bfi_pitch = pitch_buf[sub( shr( L_frame, 6 ), 1 )]; move16(); *bfi_pitch_frame = L_frame; move16(); @@ -105,7 +105,7 @@ void FEC_pitch_estim_fx( ( EQ_16( L_frame, L_FRAME16k ) ) ) || ( EQ_16( coder_type, TRANSITION ) ) ) { - *bfi_pitch = pitch_buf[sub(shr( L_frame, 6 ) , 1)]; + *bfi_pitch = pitch_buf[sub( shr( L_frame, 6 ), 1 )]; move16(); *bfi_pitch_frame = L_frame; move16(); diff --git a/lib_dec/FEC_scale_syn_fx.c b/lib_dec/FEC_scale_syn_fx.c index ad0fcae88..9a8da8454 100644 --- a/lib_dec/FEC_scale_syn_fx.c +++ b/lib_dec/FEC_scale_syn_fx.c @@ -225,7 +225,7 @@ void FEC_scale_syn_fx( h1[0] = 1024; move16(); /*syn_filt( Aq+(3*(M+1)), M, h1, h1, L_FRAME/2, h1+(M+1), 0 );*/ - E_UTIL_synthesis( 1, Aq + (3 * ( M + 1 ) ), h1, h1, L_FRAME / 2, h1 + ( M + 1 ), 0, M ); + E_UTIL_synthesis( 1, Aq + ( 3 * ( M + 1 ) ), h1, h1, L_FRAME / 2, h1 + ( M + 1 ), 0, M ); /*Compute tilt */ /*rr0 = dotp( h1, h1, L_FRAME/2-1 ) + 0.1f;*/ @@ -272,7 +272,7 @@ void FEC_scale_syn_fx( ener_max = *lp_ener_FEC_max; move32(); test(); - if( EQ_16( clas, VOICED_TRANSITION ) || ( GE_16( clas, INACTIVE_CLAS ) ) ) + if ( EQ_16( clas, VOICED_TRANSITION ) || ( GE_16( clas, INACTIVE_CLAS ) ) ) { ener_max = *lp_ener_FEC_av; move32(); diff --git a/lib_dec/gain_dec_fx.c b/lib_dec/gain_dec_fx.c index cf4202907..ff97e81cd 100644 --- a/lib_dec/gain_dec_fx.c +++ b/lib_dec/gain_dec_fx.c @@ -875,7 +875,7 @@ void gain_dec_lbr_fx( /* retrieve the codebook index and calculate both gains */ index = (Word16) get_next_indice( st_fx, nBits ); - *gain_pit_fx = cdbk_fx[shl(index , 1)]; + *gain_pit_fx = cdbk_fx[shl( index, 1 )]; move16(); L_tmp = L_mult( cdbk_fx[add( shl( index, 1 ), 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ @@ -962,7 +962,7 @@ void gain_dec_lbr_fx( /* retrieve the codebook index and calculate both gains */ index = (Word16) get_next_indice( st_fx, nBits ); move16(); - *gain_pit_fx = cdbk_fx[shl(index , 1)]; + *gain_pit_fx = cdbk_fx[shl( index, 1 )]; move16(); L_tmp = L_mult( cdbk_fx[add( shl( index, 1 ), 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ @@ -1031,7 +1031,7 @@ void lp_gain_updt_fx( #endif IF( EQ_16( L_frame, L_FRAME ) ) { - IF( EQ_16(i_subfr , 0) ) + IF( EQ_16( i_subfr, 0 ) ) { *lp_gainp = mult( 3277, gain_pit ); move16(); /*0.1 in Q15 = 3277 , (15+14)-15 -> Q14*/ diff --git a/lib_dec/gaus_dec_fx.c b/lib_dec/gaus_dec_fx.c index b825af764..dc999e3f0 100644 --- a/lib_dec/gaus_dec_fx.c +++ b/lib_dec/gaus_dec_fx.c @@ -124,7 +124,7 @@ void gaus_dec_fx( FOR( i = 0; i < L_SUBFR; i++ ) { L_tmp = L_shl( L_mult( gain_code, code[i] ), 6 /*3*/ ); - exc[add(i , i_subfr)] = round_fx( L_tmp ); + exc[add( i, i_subfr )] = round_fx( L_tmp ); move16(); } @@ -239,7 +239,7 @@ static void dec_2pos_fx( move16(); *sign2 = *sign1; move16(); - IF ( GT_16( *ind1, *ind2 ) ) + IF( GT_16( *ind1, *ind2 ) ) { *sign2 = negate( *sign1 ); move16(); diff --git a/lib_dec/gs_dec_amr_wb_fx.c b/lib_dec/gs_dec_amr_wb_fx.c index f3645cc58..4ad733294 100644 --- a/lib_dec/gs_dec_amr_wb_fx.c +++ b/lib_dec/gs_dec_amr_wb_fx.c @@ -441,7 +441,7 @@ void improv_amr_wb_gs_fx( IF( ( locattack == 0 && LE_32( core_brate, ACELP_12k65 ) ) && ( ( LT_32( core_brate, ACELP_8k85 ) && NE_16( clas, AUDIO_CLAS ) && ( clas == UNVOICED_CLAS || EQ_16( clas, VOICED_TRANSITION ) ) ) || - ( coder_type == INACTIVE ) ) ) + ( coder_type == INACTIVE ) ) ) #endif { /*------------------------------------------------------------* @@ -463,18 +463,18 @@ void improv_amr_wb_gs_fx( { Copy( Aq_fx, Aq_orig, NB_SUBFR * ( M + 1 ) ); - exp_a = norm_s( Aq_fx[imult1616(i , ( M + 1 ))] ); - exp_b = norm_s( old_Aq_fx[imult1616(i , ( M + 1 ))] ); + exp_a = norm_s( Aq_fx[imult1616( i, ( M + 1 ) )] ); + exp_b = norm_s( old_Aq_fx[imult1616( i, ( M + 1 ) )] ); exp_diff = sub( exp_a, exp_b ); IF( exp_diff > 0 ) { - Scale_sig( &old_Aq_fx[imult1616(i , ( M + 1 ))], ( M + 1 ), negate( exp_diff ) ); + Scale_sig( &old_Aq_fx[imult1616( i, ( M + 1 ) )], ( M + 1 ), negate( exp_diff ) ); } ELSE { - Scale_sig( &Aq_fx[imult1616(i , ( M + 1 ))], ( M + 1 ), exp_diff ); + Scale_sig( &Aq_fx[imult1616( i, ( M + 1 ) )], ( M + 1 ), exp_diff ); } - FOR( j = imult1616(i , ( M + 1 )); j < imult1616(add( i , 1 ) , ( M + 1 )); j++ ) + FOR( j = imult1616( i, ( M + 1 ) ); j < imult1616( add( i, 1 ), ( M + 1 ) ); j++ ) { Aq_fx[j] = round_fx( L_mac( L_mult( ALP_FX, old_Aq_fx[j] ), MALP_FX, Aq_fx[j] ) ); @@ -490,12 +490,12 @@ void improv_amr_wb_gs_fx( FOR( i = 0; i < NB_SUBFR; i++ ) { #ifdef BASOP_NOGLOB - enr_LP_new = Enr_1_Az_fx_o( Aq_fx + imult1616(i , ( M + 1 )), L_SUBFR, &Overflow ); + enr_LP_new = Enr_1_Az_fx_o( Aq_fx + imult1616( i, ( M + 1 ) ), L_SUBFR, &Overflow ); #else enr_LP_new = Enr_1_Az_fx( Aq_fx + i * ( M + 1 ), L_SUBFR ); #endif test(); - IF( GT_16( shr( enr_LP_new, 7 ) , enr_LP_old ) || Overflow ) + IF( GT_16( shr( enr_LP_new, 7 ), enr_LP_old ) || Overflow ) { /* filter is unstable, do not modify the excitation */ Copy( Aq_orig, Aq_fx, NB_SUBFR * ( M + 1 ) ); diff --git a/lib_dec/gs_dec_fx.c b/lib_dec/gs_dec_fx.c index 01d791f28..bd5f9b7f8 100644 --- a/lib_dec/gs_dec_fx.c +++ b/lib_dec/gs_dec_fx.c @@ -484,7 +484,7 @@ void decod_audio_fx( * Update BWE excitation *--------------------------------------------------------------------------------------*/ - IF ( st_fx->hBWE_TD != NULL ) + IF( st_fx->hBWE_TD != NULL ) { set16_fx( voice_factors, 0, NB_SUBFR16k ); IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) @@ -568,7 +568,7 @@ void decod_audio_ivas_fx( GSC_DEC_HANDLE hGSCDec; hGSCDec = st_fx->hGSCDec; - move16(); //Es_pred + move16(); // Es_pred /*---------------------------------------------------------------* * Initialization @@ -632,7 +632,7 @@ void decod_audio_ivas_fx( hGSCDec->noise_lev = NOISE_LEVEL_SP3; move16(); #if 1 // def ADD_LRTD - IF ( GE_16( st_fx->GSC_IVAS_mode, 1 ) ) + IF( GE_16( st_fx->GSC_IVAS_mode, 1 ) ) { test(); if ( LT_32( st_fx->core_brate, GSC_L_RATE_STG ) && LT_32( st_fx->GSC_IVAS_mode, 3 ) ) @@ -690,7 +690,7 @@ void decod_audio_ivas_fx( nb_subfr = SWNB_SUBFR; move16(); - IF ( GE_32( st_fx->core_brate, ACELP_9k60 ) ) + IF( GE_32( st_fx->core_brate, ACELP_9k60 ) ) { nbits = 1; move16(); @@ -721,7 +721,7 @@ void decod_audio_ivas_fx( if ( EQ_16( shr( nb_frame_flg, 1 ), 1 ) ) { - nb_subfr = shl(nb_subfr, 1); + nb_subfr = shl( nb_subfr, 1 ); } #endif } @@ -766,7 +766,7 @@ void decod_audio_ivas_fx( pit_band_idx = (Word16) get_next_indice( st_fx, nbits ); } - IF ( pit_band_idx != 0 ) + IF( pit_band_idx != 0 ) { IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) { @@ -779,7 +779,7 @@ void decod_audio_ivas_fx( } /* detect bit errors in the bitstream */ - IF ( GT_16( pit_band_idx, 13 ) ) /* The maximum decodable index is 10 + BAND1k2 (3) = 13 */ + IF( GT_16( pit_band_idx, 13 ) ) /* The maximum decodable index is 10 + BAND1k2 (3) = 13 */ { pit_band_idx = 13; move16(); @@ -836,7 +836,7 @@ void decod_audio_ivas_fx( #else dec_pit_exc_fx( st_fx, Aq, st_fx->coder_type, Es_pred, pitch_buf, code, exc, bwe_exc, nb_subfr, gain_buf ); #endif - IF ( LT_32( st_fx->core_brate, ACELP_9k60 ) ) + IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) { minimum_fx( pitch_buf, shr( st_fx->L_frame, 6 ), &low_pit ); low_pit = shr( low_pit, 6 ); /*Q6 -> Q0 */ @@ -990,7 +990,7 @@ void decod_audio_ivas_fx( } #if 1 // ydef ADD_LRTD - IF ( EQ_16( st_fx->idchan, 1 ) ) + IF( EQ_16( st_fx->idchan, 1 ) ) { tmp_nb_bits_tot = add( tmp_nb_bits_tot, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ); if ( EQ_16( st_fx->tdm_LRTD_flag, 1 ) ) @@ -1017,7 +1017,7 @@ void decod_audio_ivas_fx( * Update BWE excitation *--------------------------------------------------------------------------------------*/ - IF ( st_fx->hBWE_TD != NULL ) + IF( st_fx->hBWE_TD != NULL ) { set16_fx( voice_factors, 0, NB_SUBFR16k ); IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) @@ -1288,7 +1288,7 @@ void gsc_dec_fx( { FOR( j = 0; j < shl( nb_subbands, 4 ); j++ ) { - IF ( concat_out[j] > 0 ) + IF( concat_out[j] > 0 ) { seed_init = extract_l( L_shl( seed_init, 3 ) ); } @@ -1490,7 +1490,7 @@ void gsc_dec_ivas_fx( move16(); WHILE( LT_16( i, SIZE_BRATE_INTERMED_TBL ) ) { - IF ( LE_32( st_fx->core_brate, brate_intermed_tbl[i] ) ) + IF( LE_32( st_fx->core_brate, brate_intermed_tbl[i] ) ) { break; } @@ -1570,7 +1570,7 @@ void gsc_dec_ivas_fx( st_fx->L_frame, st_fx->element_mode, st_fx->GSC_IVAS_mode ); #if 1 // def ADD_LRTD - IF ( bit == 0 ) + IF( bit == 0 ) { set16_fx( concat_out, 0, L_FRAME16k ); } diff --git a/lib_dec/hf_synth_fx.c b/lib_dec/hf_synth_fx.c index e32e5807c..a40ae1a30 100644 --- a/lib_dec/hf_synth_fx.c +++ b/lib_dec/hf_synth_fx.c @@ -116,7 +116,7 @@ void hf_synth_fx( p_Aq = Aq; FOR( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) { - hf_synthesis_fx( hBWE_zero, core_brate, output_subfr, p_Aq, &exc[i_subfr], Q_exc, &synth[i_subfr], &synth16k[imult3216((Word32)i_subfr , output_subfr) / L_SUBFR], + hf_synthesis_fx( hBWE_zero, core_brate, output_subfr, p_Aq, &exc[i_subfr], Q_exc, &synth[i_subfr], &synth16k[imult3216( (Word32) i_subfr, output_subfr ) / L_SUBFR], Q_syn2, delay_syn_hf, memExp1, mem_hp_interp, extl, CNG_mode ); p_Aq += ( M + 1 ); @@ -347,8 +347,8 @@ static void hf_synthesis_fx( /* delay by 5 samples @16kHz to compensate CLDFB resampling delay (20samples) and HP filtering delay (roughly 15 samples) */ delay = NS2SA( 16000, DELAY_CLDFB_NS ) - 15; - Copy( HF_syn + sub(L_SUBFR16k , delay), temp_buffer, delay ); - Copy( HF_syn, HF_syn + delay, sub(L_SUBFR16k , delay) ); + Copy( HF_syn + sub( L_SUBFR16k, delay ), temp_buffer, delay ); + Copy( HF_syn, HF_syn + delay, sub( L_SUBFR16k, delay ) ); Copy( delay_syn_hf, HF_syn, delay ); Copy( temp_buffer, delay_syn_hf, delay ); @@ -656,7 +656,7 @@ static void filt_6k_7k_scale_fx( Word16 j; L_tmp = 0; move32(); - FOR ( j = 0; j < 31; j++ ) + FOR( j = 0; j < 31; j++ ) { #ifdef BASOP_NOGLOB L_tmp = L_mac_o( L_tmp, x[i + j], fir_6k_7k_fx[j], &Overflow ); @@ -1150,7 +1150,7 @@ void hf_synth_amr_wb_fx( pt4 = signum; FOR( i = 0; i < L_SUBFR16k; i++ ) { - IF ( *pt1 > 0 ) + IF( *pt1 > 0 ) { *pt1 = mult_r( *pt1, g ); /*qdct */ move16(); @@ -1264,7 +1264,7 @@ void hf_synth_amr_wb_fx( FOR( i = 240; i < L_FRAME16k; i++ ) { *pt1 = mult_r( *pt1, scale ); /*qdct */ - IF ( GT_16( i, 255 ) ) + IF( GT_16( i, 255 ) ) { *pt1 = mult_r( 19505, *pt1 ); move16(); @@ -1674,7 +1674,7 @@ static void envelope_fx( } /* LPC envelope level estimate */ - L_tmp = 0 ; + L_tmp = 0; move32(); pt1 = Ap; pt2 = exp_tab_p_fx; diff --git a/lib_dec/hq_classifier_dec_fx.c b/lib_dec/hq_classifier_dec_fx.c index fa5c470be..3a2d3f511 100644 --- a/lib_dec/hq_classifier_dec_fx.c +++ b/lib_dec/hq_classifier_dec_fx.c @@ -39,7 +39,7 @@ Word16 ivas_hq_classifier_dec_fx( /* o : Consumed bits test(); IF( ( EQ_16( length, L_SPEC32k ) || EQ_16( length, L_SPEC48k ) ) && LE_32( core_brate, max_brate ) ) { - *hqswb_clas = (Word16)get_next_indice( st_fx, 2 ); + *hqswb_clas = (Word16) get_next_indice( st_fx, 2 ); move16(); bits = 2; move16(); @@ -70,7 +70,7 @@ Word16 ivas_hq_classifier_dec_fx( /* o : Consumed bits test(); IF( LE_32( st_fx->core_brate, HQ_32k ) && *hqswb_clas == HQ_NORMAL ) { - IF ( EQ_16( length, L_SPEC32k ) ) + IF( EQ_16( length, L_SPEC32k ) ) { *hqswb_clas = HQ_GEN_SWB; move16(); diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index cb3512374..d51543302 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -631,7 +631,7 @@ void stereo_tcx_core_dec_fx( IF( !bfi ) { st->stab_fac_fx = lsf_stab_fx( &lsf_fx[M], &lsf_fx[0], 0, st->L_frame ); - move16(); + move16(); } IF( hTcxDec->enableTcxLpc ) diff --git a/lib_dec/ivas_td_low_rate_dec.c b/lib_dec/ivas_td_low_rate_dec.c index 02eb8e9a0..feae9373c 100644 --- a/lib_dec/ivas_td_low_rate_dec.c +++ b/lib_dec/ivas_td_low_rate_dec.c @@ -296,7 +296,7 @@ void tdm_low_rate_dec_fx( move16(); move16(); - if( EQ_16( st->element_mode, IVAS_CPE_TD ) ) + if ( EQ_16( st->element_mode, IVAS_CPE_TD ) ) { tmp_nb_bits_tot = add( tmp_nb_bits_tot, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ); } @@ -306,7 +306,7 @@ void tdm_low_rate_dec_fx( tmp_nb_bits_tot = sub( tmp_nb_bits_tot, STEREO_BITS_TCA ); } - if( st->extl_brate_orig > 0 ) + if ( st->extl_brate_orig > 0 ) { /* subtract 1 bit for TBE/BWE BWE flag (bit counted in extl_brate) */ tmp_nb_bits_tot = sub( tmp_nb_bits_tot, 1 ); -- GitLab From 40be5f4f7fcd171b3becd3578d6906796bded372 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 1 Jul 2024 14:50:07 +0530 Subject: [PATCH 019/110] EVS BE fix --- lib_dec/FEC_HQ_core_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/FEC_HQ_core_fx.c b/lib_dec/FEC_HQ_core_fx.c index 418161ecd..2a375498e 100644 --- a/lib_dec/FEC_HQ_core_fx.c +++ b/lib_dec/FEC_HQ_core_fx.c @@ -1756,7 +1756,7 @@ void HQ_FEC_Mem_update_fx( /*ImdctOutWin[3*L/2 + i] = -ImdctOut[i] * win[(L/2-i-1)];*/ ImdctOutWin_fx[add( shr( L, 1 ), i )] = extract_l( L_shr( Mult_32_16( L_negate( ImdctOut_fx[sub( sub( L, 1 ), i )] ), win_fx[sub( ( sub( sub( shr( imult1616( 3, L ), 1 ), 1 ), i ) ), N_LEAD_O_NB )] ), 6 ) ); move16(); - ImdctOutWin_fx[add( idiv1616( imult1616( 3, L ), 1 ), i )] = extract_l( L_shr( Mult_32_16( L_negate( ImdctOut_fx[i] ), win_fx[sub( sub( shr( L, 1 ), i ), 1 )] ), 6 ) ); + ImdctOutWin_fx[add( idiv1616( imult1616( 3, L ), 2 ), i )] = extract_l( L_shr( Mult_32_16( L_negate( ImdctOut_fx[i] ), win_fx[sub( sub( shr( L, 1 ), i ), 1 )] ), 6 ) ); move16(); } } -- GitLab From de8b742c5f115afab96311e9b31ca1ee141936ec Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 2 Jul 2024 14:16:54 +0530 Subject: [PATCH 020/110] Re-enable encoder pytests in CI --- .gitlab-ci.yml | 54 +++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fb5645e8c..5c1f73e4c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -410,15 +410,15 @@ build-codec-linux-instrumented-make: # Short test jobs # --------------------------------------------------------------- -#ivas-pytest-mld-enc-dec: -# extends: -# - .rules-pytest-mld -# - .test-job-linux -# before_script: -# - USE_LTV=0 -# - TEST_SUITE="$SHORT_TEST_SUITE" -# - LEVEL_SCALING=1.0 -# <<: *ivas-pytest-anchor +ivas-pytest-mld-enc-dec: + extends: + - .rules-pytest-mld + - .test-job-linux + before_script: + - USE_LTV=0 + - TEST_SUITE="$SHORT_TEST_SUITE" + - LEVEL_SCALING=1.0 + <<: *ivas-pytest-anchor ivas-pytest-mld-dec: extends: @@ -431,15 +431,15 @@ ivas-pytest-mld-dec: - LEVEL_SCALING=1.0 <<: *ivas-pytest-anchor -#ivas-pytest-mld-enc-dec-lev-10: -# extends: -# - .rules-pytest-mld -# - .test-job-linux -# before_script: -# - USE_LTV=0 -# - TEST_SUITE="$SHORT_TEST_SUITE" -# - LEVEL_SCALING=0.3162 -# <<: *ivas-pytest-anchor +ivas-pytest-mld-enc-dec-lev-10: + extends: + - .rules-pytest-mld + - .test-job-linux + before_script: + - USE_LTV=0 + - TEST_SUITE="$SHORT_TEST_SUITE" + - LEVEL_SCALING=0.3162 + <<: *ivas-pytest-anchor ivas-pytest-mld-dec-lev-10: extends: @@ -452,15 +452,15 @@ ivas-pytest-mld-dec-lev-10: - LEVEL_SCALING=0.3162 <<: *ivas-pytest-anchor -#ivas-pytest-mld-enc-dec-lev+10: -# extends: -# - .rules-pytest-mld -# - .test-job-linux -# before_script: -# - USE_LTV=0 -# - TEST_SUITE="$SHORT_TEST_SUITE" -# - LEVEL_SCALING=3.162 -# <<: *ivas-pytest-anchor +ivas-pytest-mld-enc-dec-lev+10: + extends: + - .rules-pytest-mld + - .test-job-linux + before_script: + - USE_LTV=0 + - TEST_SUITE="$SHORT_TEST_SUITE" + - LEVEL_SCALING=3.162 + <<: *ivas-pytest-anchor ivas-pytest-mld-dec-lev+10: extends: -- GitLab From 31759cb44fec9b0fbea8acdc5c2f9079e37ffa37 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 2 Jul 2024 13:18:39 +0200 Subject: [PATCH 021/110] fix name of sceript in ci file --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fb5645e8c..c64f0ac77 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -243,7 +243,7 @@ stages: - python3 -m pytest $TEST_SUITE -v --create_cut --html=report.html --self-contained-html --junit-xml=report-junit.xml --mld --ssnr --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - - python3 scripts/parse_mld_xml.py report-junit.xml $MLD_ARTIFACT_NAME + - python3 scripts/parse_xml_report.py report-junit.xml $MLD_ARTIFACT_NAME - if [ $USE_LTV -eq 1 ] && [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH $CI_JOB_NAME $CI_PROJECT_ID) -- GitLab From 65452ddff95b32615bd8a1e5345423c75d34da19 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 2 Jul 2024 15:08:54 +0200 Subject: [PATCH 022/110] refactor ci file --- .gitlab-ci.yml | 114 ++++++++++++++++++++++--------------------------- 1 file changed, 51 insertions(+), 63 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5c1f73e4c..fc5c7edfd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,6 +12,8 @@ variables: TEST_SUITE: "" DUT_ENCODER_PATH: "./IVAS_cod" DUT_DECODER_PATH: "./IVAS_dec" + REF_ENCODER_PATH: "./IVAS_cod_ref" + REF_DECODER_PATH: "./IVAS_dec_ref" LEVEL_SCALING: "1.0" IVAS_PIPELINE_NAME: '' BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch" @@ -24,7 +26,6 @@ variables: options: - 'default' - 'pytest-mld' - - 'pytest-mld-interop' - 'pytest-mld-long' - 'pytest-saturation-smoke-test' - 'evs-26444' @@ -53,9 +54,6 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-mld' variables: IVAS_PIPELINE_NAME: 'Run MLD tool against float ref: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-mld-interop' - variables: - IVAS_PIPELINE_NAME: 'Run MLD tool agains float ref - interop: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-mld-long' variables: IVAS_PIPELINE_NAME: 'Run MLD tool against float ref (long test vectors): $CI_COMMIT_BRANCH' @@ -172,15 +170,6 @@ stages: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' when: never - -.rules-pytest-mld-interop: - rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-mld-interop" - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - when: never - .rules-pytest-saturation-smoke-test: rules: - if: $PYTEST_SMOKE_TEST # Set by scheduled pipeline @@ -240,7 +229,7 @@ stages: ### run pytest - exit_code=0 - - python3 -m pytest $TEST_SUITE -v --create_cut --html=report.html --self-contained-html --junit-xml=report-junit.xml --mld --ssnr --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || exit_code=$? + - python3 -m pytest --tb=no $TEST_SUITE -v --create_cut --html=report.html --self-contained-html --junit-xml=report-junit.xml --mld --ssnr --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - python3 scripts/parse_mld_xml.py report-junit.xml $MLD_ARTIFACT_NAME @@ -302,7 +291,7 @@ stages: - make -j CLANG=$CLANG_NUM - if [[ $CLANG_NUM == 3 ]]; then export UBSAN_OPTIONS="suppressions=scripts/ubsan.supp,report_error_type=1"; fi - testcase_timeout=$TESTCASE_TIMEOUT_STV - - python3 -m pytest $SHORT_TEST_SUITE -v --tb=no --update_ref 1 -m create_ref --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout $testcase_timeout --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec + - python3 -m pytest $SHORT_TEST_SUITE -v --tb=no --update_ref 1 -m create_ref --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout $testcase_timeout --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH artifacts: name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" when: always @@ -410,56 +399,85 @@ build-codec-linux-instrumented-make: # Short test jobs # --------------------------------------------------------------- -ivas-pytest-mld-enc-dec: +### jobs that test fx encoder -> flt decoder +ivas-pytest-mld-enc: extends: - .rules-pytest-mld - .test-job-linux before_script: - USE_LTV=0 + - DUT_DECODER_PATH=./IVAS_dec - TEST_SUITE="$SHORT_TEST_SUITE" - LEVEL_SCALING=1.0 <<: *ivas-pytest-anchor - -ivas-pytest-mld-dec: + +ivas-pytest-mld-enc-lev-10: extends: - .rules-pytest-mld - .test-job-linux before_script: - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref + - DUT_DECODER_PATH=./IVAS_dec - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=1.0 + - LEVEL_SCALING=0.3162 <<: *ivas-pytest-anchor - -ivas-pytest-mld-enc-dec-lev-10: + +ivas-pytest-mld-enc-lev+10: extends: - .rules-pytest-mld - .test-job-linux before_script: - - USE_LTV=0 + - USE_LTV=0 + - DUT_DECODER_PATH=./IVAS_dec - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=0.3162 + - LEVEL_SCALING=3.162 <<: *ivas-pytest-anchor + +ivas-pytest-enc-msan: + extends: + - .test-job-linux + before_script: + - CLANG_NUM=1 + - REF_ENCODER_PATH=./IVAS_cod + <<: *ivas-pytest-sanitizers-anchor + +ivas-pytest-enc-asan: + extends: + - .test-job-linux + before_script: + - CLANG_NUM=2 + - REF_ENCODER_PATH=./IVAS_cod + <<: *ivas-pytest-sanitizers-anchor + +ivas-pytest-enc-usan: + extends: + - .test-job-linux + before_script: + - CLANG_NUM=3 + - REF_ENCODER_PATH=./IVAS_cod + <<: *ivas-pytest-sanitizers-anchor -ivas-pytest-mld-dec-lev-10: +### jobs that test flt encoder -> fx decoder +ivas-pytest-mld-dec: extends: - .rules-pytest-mld - .test-job-linux before_script: - - USE_LTV=0 + - USE_LTV=0 - DUT_ENCODER_PATH=./IVAS_cod_ref - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=0.3162 + - LEVEL_SCALING=1.0 <<: *ivas-pytest-anchor - -ivas-pytest-mld-enc-dec-lev+10: + +ivas-pytest-mld-dec-lev-10: extends: - .rules-pytest-mld - .test-job-linux before_script: - USE_LTV=0 + - DUT_ENCODER_PATH=./IVAS_cod_ref - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=3.162 + - LEVEL_SCALING=0.3162 <<: *ivas-pytest-anchor ivas-pytest-mld-dec-lev+10: @@ -473,44 +491,12 @@ ivas-pytest-mld-dec-lev+10: - LEVEL_SCALING=3.162 <<: *ivas-pytest-anchor -ivas-pytest-mld-long-enc-fx-dec-flt-interop: - extends: - - .rules-pytest-mld-interop - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-anchor - -ivas-pytest-mld-long-enc-fx-dec-flt-lev-10-interop: - extends: - - .rules-pytest-mld-interop - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=0.3162 - <<: *ivas-pytest-anchor - -ivas-pytest-mld-long-enc-fx-dec-flt-lev+10-interop: - extends: - - .rules-pytest-mld-interop - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=3.162 - <<: *ivas-pytest-anchor - ivas-pytest-dec-msan: extends: - .test-job-linux before_script: - CLANG_NUM=1 + - REF_DECODER_PATH=./IVAS_dec <<: *ivas-pytest-sanitizers-anchor ivas-pytest-dec-asan: @@ -518,6 +504,7 @@ ivas-pytest-dec-asan: - .test-job-linux before_script: - CLANG_NUM=2 + - REF_DECODER_PATH=./IVAS_dec <<: *ivas-pytest-sanitizers-anchor ivas-pytest-dec-usan: @@ -525,6 +512,7 @@ ivas-pytest-dec-usan: - .test-job-linux before_script: - CLANG_NUM=3 + - REF_DECODER_PATH=./IVAS_dec <<: *ivas-pytest-sanitizers-anchor # --------------------------------------------------------------- -- GitLab From 26a3ad8fba60cb612ffec78a3aca4538d84b3258 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 2 Jul 2024 15:50:10 +0200 Subject: [PATCH 023/110] fix setting of decoder path in fxencoder test jobs --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fc5c7edfd..809ace31e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -406,7 +406,7 @@ ivas-pytest-mld-enc: - .test-job-linux before_script: - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec + - DUT_DECODER_PATH=./IVAS_dec_ref - TEST_SUITE="$SHORT_TEST_SUITE" - LEVEL_SCALING=1.0 <<: *ivas-pytest-anchor @@ -417,7 +417,7 @@ ivas-pytest-mld-enc-lev-10: - .test-job-linux before_script: - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec + - DUT_DECODER_PATH=./IVAS_dec_ref - TEST_SUITE="$SHORT_TEST_SUITE" - LEVEL_SCALING=0.3162 <<: *ivas-pytest-anchor @@ -428,7 +428,7 @@ ivas-pytest-mld-enc-lev+10: - .test-job-linux before_script: - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec + - DUT_DECODER_PATH=./IVAS_dec_ref - TEST_SUITE="$SHORT_TEST_SUITE" - LEVEL_SCALING=3.162 <<: *ivas-pytest-anchor -- GitLab From e4d1ddd76fb8face6f728472c93ae6b374aaa9a7 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 2 Jul 2024 15:53:58 +0200 Subject: [PATCH 024/110] use the DUT* vars in the sanitizer anchor, too this is now consistent with the other anchor --- .gitlab-ci.yml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 809ace31e..598173231 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,8 +12,6 @@ variables: TEST_SUITE: "" DUT_ENCODER_PATH: "./IVAS_cod" DUT_DECODER_PATH: "./IVAS_dec" - REF_ENCODER_PATH: "./IVAS_cod_ref" - REF_DECODER_PATH: "./IVAS_dec_ref" LEVEL_SCALING: "1.0" IVAS_PIPELINE_NAME: '' BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch" @@ -291,7 +289,7 @@ stages: - make -j CLANG=$CLANG_NUM - if [[ $CLANG_NUM == 3 ]]; then export UBSAN_OPTIONS="suppressions=scripts/ubsan.supp,report_error_type=1"; fi - testcase_timeout=$TESTCASE_TIMEOUT_STV - - python3 -m pytest $SHORT_TEST_SUITE -v --tb=no --update_ref 1 -m create_ref --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout $testcase_timeout --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH + - python3 -m pytest $SHORT_TEST_SUITE -v --tb=no --update_ref 1 -m create_ref --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout $testcase_timeout --ref_encoder_path $DUT_ENCODER_PATH --ref_decoder_path $DUT_DECODER_PATH artifacts: name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" when: always @@ -438,7 +436,7 @@ ivas-pytest-enc-msan: - .test-job-linux before_script: - CLANG_NUM=1 - - REF_ENCODER_PATH=./IVAS_cod + - DUT_DECODER_PATH=./IVAS_dec_ref <<: *ivas-pytest-sanitizers-anchor ivas-pytest-enc-asan: @@ -446,7 +444,7 @@ ivas-pytest-enc-asan: - .test-job-linux before_script: - CLANG_NUM=2 - - REF_ENCODER_PATH=./IVAS_cod + - DUT_DECODER_PATH=./IVAS_dec_ref <<: *ivas-pytest-sanitizers-anchor ivas-pytest-enc-usan: @@ -454,7 +452,7 @@ ivas-pytest-enc-usan: - .test-job-linux before_script: - CLANG_NUM=3 - - REF_ENCODER_PATH=./IVAS_cod + - DUT_DECODER_PATH=./IVAS_dec_ref <<: *ivas-pytest-sanitizers-anchor ### jobs that test flt encoder -> fx decoder @@ -496,7 +494,7 @@ ivas-pytest-dec-msan: - .test-job-linux before_script: - CLANG_NUM=1 - - REF_DECODER_PATH=./IVAS_dec + - DUT_ENCODER_PATH=./IVAS_cod_ref <<: *ivas-pytest-sanitizers-anchor ivas-pytest-dec-asan: @@ -504,7 +502,7 @@ ivas-pytest-dec-asan: - .test-job-linux before_script: - CLANG_NUM=2 - - REF_DECODER_PATH=./IVAS_dec + - DUT_ENCODER_PATH=./IVAS_cod_ref <<: *ivas-pytest-sanitizers-anchor ivas-pytest-dec-usan: @@ -512,7 +510,7 @@ ivas-pytest-dec-usan: - .test-job-linux before_script: - CLANG_NUM=3 - - REF_DECODER_PATH=./IVAS_dec + - DUT_ENCODER_PATH=./IVAS_cod_ref <<: *ivas-pytest-sanitizers-anchor # --------------------------------------------------------------- -- GitLab From cbf257c46a071fc8faedc7c1740f12e94c04c4ab Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 3 Jul 2024 08:52:56 +0530 Subject: [PATCH 025/110] Converted ivas_enc_cov_handler_process function and its subfunctions [x] Converted the following functions from float to fixed ivas_enc_cov_handler_process ivas_spar_get_activeW_flag ivas_band_cov [x] Integrated the function in SBA path. [x] Function to be integrated in MC path in a separate MR. --- lib_com/ivas_cnst.h | 3 + lib_com/ivas_cov_smooth.c | 72 ++-- lib_com/ivas_fb_mixer.c | 11 +- lib_com/ivas_prot.h | 69 ++-- lib_com/ivas_stat_com.h | 7 +- lib_enc/ivas_enc_cov_handler.c | 612 +++++++++++++++++++++++++-------- lib_enc/ivas_spar_encoder.c | 102 ++++++ lib_enc/ivas_stat_enc.h | 3 + 8 files changed, 683 insertions(+), 196 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index d82507787..126cc3d1c 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1068,6 +1068,9 @@ typedef enum #define IVAS_SPAR_DYN_ACTIVEW_THRESH (0.0039f) #define IVAS_SPAR_DYN_ACTIVEW_THRESH_FX (8375186) /* 0.0039f in Q31 */ #define IVAS_SPAR_SIDE_CH_DYN_ACTIVEW_THRESH (32.0f) +#ifdef IVAS_FLOAT_FIXED +#define IVAS_SPAR_SIDE_CH_DYN_ACTIVEW_THRESH_Q0 (32) +#endif #define MAX_QUANT_STRATS 3 #define MAX_CODING_STRATS 3 diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index 6a762cb95..b7f195b9c 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -206,6 +206,7 @@ static void ivas_set_up_cov_smoothing_fx( Word16 active_bins = pFb->fb_bin_to_band.pFb_active_bins_per_band[j]; update_factor = ivas_calculate_update_factor_fx( pFb->fb_bin_to_band.pFb_bin_to_band_fx[j], active_bins ); ivas_calculate_smoothning_factor_fx( &hCovState->pSmoothing_factor_fx[j], update_factor, min_pool_size, max_update_rate, smooth_mode, ivas_total_brate, j ); + hCovState->pSmoothing_factor[j] = fixedToFloat( hCovState->pSmoothing_factor_fx[j], Q31 ); } } ELSE @@ -216,6 +217,7 @@ static void ivas_set_up_cov_smoothing_fx( Word16 active_bins = pFb->fb_bin_to_band.p_short_stride_num_bins_per_band[j]; update_factor = ivas_calculate_update_factor_fx( p_bin_to_band, active_bins ); ivas_calculate_smoothning_factor_fx( &hCovState->pSmoothing_factor_fx[j], update_factor, min_pool_size, max_update_rate, smooth_mode, ivas_total_brate, j ); + hCovState->pSmoothing_factor[j] = fixedToFloat( hCovState->pSmoothing_factor_fx[j], Q31 ); } } @@ -297,12 +299,11 @@ ivas_error ivas_spar_covar_smooth_enc_open( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder" ); } -#else +#endif if ( ( hCovState->pSmoothing_factor = (float *) malloc( sizeof( float ) * cov_smooth_cfg->max_bands ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder" ); } -#endif for ( i = 0; i < nchan_inp; i++ ) { @@ -319,6 +320,13 @@ ivas_error ivas_spar_covar_smooth_enc_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder Fixed" ); } set_zero_fx( hCovState->pPrior_cov_real_fx[i][j], cov_smooth_cfg->max_bands ); +#endif +#ifdef IVAS_FLOAT_FIXED + if ( ( hCovState->q_cov_real_per_band[i][j] = (Word16 *) malloc( sizeof( Word16 ) * cov_smooth_cfg->max_bands ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder Fixed" ); + } + set_s( hCovState->q_cov_real_per_band[i][j], Q31, cov_smooth_cfg->max_bands ); #endif } } @@ -398,10 +406,9 @@ void ivas_spar_covar_smooth_enc_close( #ifdef IVAS_FLOAT_FIXED free( hCovState->pSmoothing_factor_fx ); hCovState->pSmoothing_factor_fx = NULL; -#else +#endif free( hCovState->pSmoothing_factor ); hCovState->pSmoothing_factor = NULL; -#endif for ( i = 0; i < nchan_inp; i++ ) { @@ -412,6 +419,10 @@ void ivas_spar_covar_smooth_enc_close( #ifdef IVAS_FLOAT_FIXED free( hCovState->pPrior_cov_real_fx[i][j] ); hCovState->pPrior_cov_real_fx[i][j] = NULL; +#endif +#ifdef IVAS_FLOAT_FIXED + free( hCovState->q_cov_real_per_band[i][j] ); + hCovState->q_cov_real_per_band[i][j] = NULL; #endif } } @@ -473,25 +484,35 @@ static void ivas_compute_smooth_cov_fx( const Word16 end_band, const Word16 num_ch, const Word16 transient_det[2], - Word16 q_cov[][IVAS_SPAR_MAX_CH] ) + Word16 *q_cov[IVAS_SPAR_MAX_CH] ) { Word16 i, j, k; Word16 prev_idx = hCovState->prior_bank_idx; Word32 factor = 0, L_tmp, L_tmp1; Word16 sm_b; Word16 non_sm_b_idx; + Word16 q_tmp[IVAS_MAX_NUM_BANDS]; + sm_b = BAND_SMOOTH_REST_START_IDX; + move16(); - assert( end_band <= pFb->filterbank_num_bands ); + assert( LE_16( end_band, pFb->filterbank_num_bands ) ); IF( EQ_16( prev_idx, -1 ) || EQ_16( transient_det[1], 1 ) ) { + FOR( i = 0; i < num_ch; i++ ) + { + FOR( j = 0; j < num_ch; j++ ) + { + set_s( hCovState->q_cov_real_per_band[i][j], q_cov[i][j], pFb->filterbank_num_bands ); + } + } FOR( i = 0; i < num_ch; i++ ) { 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( q_cov[i][i], 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 ) ) ); move32(); } } @@ -514,16 +535,20 @@ static void ivas_compute_smooth_cov_fx( move32(); } + set_s( 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, q_cov[i][j]) -> q_cov[i][j] - pCov_buf[i][j][k] = L_add( L_tmp, L_tmp1 ); + 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_cov_real_per_band[i][j][k] ), &q_tmp[k] ); move32(); - L_tmp = L_shl( Mpy_32_32( hCovState->pSmoothing_factor_fx[k], factor ), sub( q_cov[i][j], Q31 ) ); // ((Q31, Q31) -> Q31) -> q_cov[i][j] + q_tmp[k] = sub( Q31, q_tmp[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 ); move32(); } + mvs2s( q_tmp, hCovState->q_cov_real_per_band[i][j], pFb->filterbank_num_bands ); } } FOR( i = 0; i < num_ch; i++ ) @@ -531,7 +556,7 @@ static void ivas_compute_smooth_cov_fx( 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( q_cov[i][i], 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 ) ) ); move32(); } } @@ -556,20 +581,25 @@ 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], 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, q_cov[i][j]) -> q_cov[i][j] - pCov_buf[i][j][k] = L_add( L_tmp, L_tmp1 ); + 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_cov_real_per_band[i][j][k] ), &q_tmp[k] ); move32(); - L_tmp = L_shl( Mpy_32_32( hCovState->pSmoothing_factor_fx[k], factor ), sub( q_cov[i][j], Q31 ) ); // ((Q31, Q31) -> Q31) -> q_cov[i][j] + q_tmp[k] = sub( Q31, q_tmp[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 ); move32(); } + mvs2s( q_tmp, hCovState->q_cov_real_per_band[i][j], pFb->filterbank_num_bands ); } } } return; } -#else +#endif + + /*-----------------------------------------------------------------------------------------* * Function ivas_compute_smooth_cov() * @@ -661,7 +691,6 @@ static void ivas_compute_smooth_cov( return; } -#endif #ifdef IVAS_FLOAT_FIXED @@ -679,12 +708,12 @@ void ivas_cov_smooth_process_fx( const Word16 end_band, const Word16 num_ch, const Word16 transient_det[2], - Word16 q_cov[][IVAS_SPAR_MAX_CH] ) + Word16 *q_cov[IVAS_SPAR_MAX_CH] ) { Word16 i, j; - Word16 num_bands = end_band - start_band; + Word16 num_bands = sub( end_band, start_band ); - ivas_compute_smooth_cov_fx( hCovState, pFb, cov_real, hCovState->pPrior_cov_real_fx, (Word32) ( 1e-20f * ONE_IN_Q31 ), start_band, end_band, num_ch, transient_det, q_cov ); + 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 ); FOR( i = 0; i < num_ch; i++ ) { @@ -699,7 +728,9 @@ void ivas_cov_smooth_process_fx( return; } -#else +#endif + + /*-----------------------------------------------------------------------------------------* * Function ivas_cov_smooth_process() * @@ -732,4 +763,3 @@ void ivas_cov_smooth_process( return; } -#endif diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index 749952dfd..60caa2e17 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -62,6 +62,7 @@ static ivas_error ivas_fb_mixer_get_window_fx( const Word16 fade_len, const Word #endif +#ifdef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------------------------------* * Function ivas_get_num_bands_from_bw_idx() * @@ -69,7 +70,6 @@ static ivas_error ivas_fb_mixer_get_window_fx( const Word16 fade_len, const Word *-----------------------------------------------------------------------------------------*/ /*! r: number of spectral bands */ -#ifdef IVAS_FLOAT_FIXED Word16 ivas_get_num_bands_from_bw_idx( const Word16 bwidth /* i : audio bandwidth */ ) @@ -78,10 +78,18 @@ Word16 ivas_get_num_bands_from_bw_idx( assert( bwidth > 0 ); /*NB BW is not supported*/ num_active_bands = ivas_num_active_bands[bwidth - 1]; + move16(); return num_active_bands; } #else +/*-----------------------------------------------------------------------------------------* + * Function ivas_get_num_bands_from_bw_idx() + * + * Get number of bands from BW index + *-----------------------------------------------------------------------------------------*/ + +/*! r: number of spectral bands */ int16_t ivas_get_num_bands_from_bw_idx( const int16_t bwidth /* i : audio bandwidth */ ) @@ -95,6 +103,7 @@ int16_t ivas_get_num_bands_from_bw_idx( } #endif + /*-----------------------------------------------------------------------------------------* * Function ivas_get_num_bands() * diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 766ec38de..d085e06be 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5868,26 +5868,30 @@ void ivas_spar_covar_enc_close( ); #ifdef IVAS_FLOAT_FIXED -ivas_error ivas_enc_cov_handler_process( - ivas_enc_cov_handler_state_t *hCovEnc, /* i/o: SPAR Covar. encoder handle */ - float **ppIn_FR_real, - float **ppIn_FR_imag, - float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - ivas_filterbank_t *pFb, /* i/o: FB handle */ - const int16_t start_band, - const int16_t end_band, - const int16_t num_ch, - const int16_t dtx_vad, - const int16_t transient_det[2], - const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH], - int16_t *res_ind, - const int16_t *remix_order, - int16_t *dyn_active_w_flag, - const int16_t nchan_transport, - const int16_t is_sba +void ivas_enc_cov_handler_process_fx( + ivas_enc_cov_handler_state_t *hCovEnc, /* i/o: SPAR Covar. encoder handle */ + Word32 **ppIn_FR_real, + Word32 **ppIn_FR_imag, + Word16 *q_ppIn_FR, + Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + Word16 *q_cov_real[IVAS_SPAR_MAX_CH], + Word32 *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + Word16 *q_cov_dtx_real[IVAS_SPAR_MAX_CH], + ivas_filterbank_t *pFb, /* i/o: FB handle */ + const Word16 start_band, + const Word16 end_band, + const Word16 num_ch, + const Word16 dtx_vad, + const Word16 transient_det[2], + const Word16 HOA_md_ind[IVAS_SPAR_MAX_CH], + Word16 *res_ind, + const Word16 *remix_order, + Word16 *dyn_active_w_flag, + const Word16 nchan_transport, + const Word16 is_sba ); -#else +#endif + void ivas_enc_cov_handler_process( ivas_enc_cov_handler_state_t *hCovEnc, /* i/o: SPAR Covar. encoder handle */ float **ppIn_FR_real, @@ -5907,6 +5911,21 @@ void ivas_enc_cov_handler_process( const int16_t nchan_transport, const int16_t is_sba ); + +#ifdef IVAS_FLOAT_FIXED_ +ivas_error ivas_spar_covar_smooth_enc_open_fx( + ivas_cov_smooth_state_t **hCovState, /* i/o: SPAR Covar. smoothing handle */ + const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ + ivas_filterbank_t *pFb, /* i/o: FB handle */ + const Word16 nchan_inp, /* i : number of input channels */ + const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ +); + +void ivas_spar_covar_smooth_enc_close_fx( + ivas_cov_smooth_state_t **hCovState, /* i/o: SPAR Covar. encoder handle */ + const Word16 nchan_inp /* i : number of input channels */ +); #endif ivas_error ivas_spar_covar_smooth_enc_open( @@ -5932,9 +5951,10 @@ void ivas_cov_smooth_process_fx( const Word16 end_band, const Word16 num_ch, const Word16 transient_det[2], - Word16 q_cov[][IVAS_SPAR_MAX_CH] + Word16 *q_cov[IVAS_SPAR_MAX_CH] ); -#else +#endif + void ivas_cov_smooth_process( ivas_cov_smooth_state_t *hCovState, /* i/o: Covariance state handle */ float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], @@ -5944,7 +5964,6 @@ void ivas_cov_smooth_process( const int16_t num_ch, const int16_t transient_det[2] ); -#endif /* Transient detector module */ ivas_error ivas_transient_det_open( @@ -7591,9 +7610,15 @@ void ivas_fb_mixer_cross_fading( ); /*! r: number of spectral bands */ +#ifdef IVAS_FLOAT_FIXED +Word16 ivas_get_num_bands_from_bw_idx( + const Word16 bwidth /* i : audio bandwidth */ +); +#else int16_t ivas_get_num_bands_from_bw_idx( const int16_t bwidth /* i : audio bandwidth */ ); +#endif #ifdef IVAS_FLOAT_FIXED /*to be moved to prot_fx1.h*/ diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 34b7942d6..6e13c5f29 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -369,12 +369,12 @@ typedef struct ivas_cov_smooth_state_t { float *pPrior_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; int16_t prior_bank_idx; -#ifndef IVAS_FLOAT_FIXED float *pSmoothing_factor; -#endif int16_t num_bins; #ifdef IVAS_FLOAT_FIXED Word32 *pPrior_cov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + Word16 *q_cov_real[IVAS_SPAR_MAX_CH]; + Word16 *q_cov_real_per_band[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; Word32 *pSmoothing_factor_fx; /* Q31 */ #endif @@ -382,9 +382,8 @@ typedef struct ivas_cov_smooth_state_t typedef struct ivas_cov_smooth_cfg_t { -#ifndef IVAS_FLOAT_FIXED float max_update_rate; -#else +#ifdef IVAS_FLOAT_FIXED Word32 max_update_rate_fx; /* Q31 */ #endif int16_t min_pool_size; diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index d017a28bf..cda2b4676 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -48,12 +48,19 @@ #define MAX_UPDATE_RATE 0.8f #define MIN_POOL_SIZE_DTX 40 #define MAX_UPDATE_RATE_DTX 0.4f +#ifdef IVAS_FLOAT_FIXED +#define MAX_UPDATE_RATE_Q31 ( 1717986944 ) +#define MAX_UPDATE_RATE_DTX_Q31 ( 858993472 ) +#endif /*------------------------------------------------------------------------------------------* * Local functions declarations *------------------------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static void ivas_band_cov_fx( Word32 **ppIn_FR_real, Word32 **ppIn_FR_imag, Word16 *q_In_FR, const Word16 num_chans, const Word16 num_bins, Word16 stride, Word32 **pFb_bin_to_band, const Word16 *pFb_start_bin_per_band, const Word16 *pFb_active_bins_per_band, const Word16 start_band, const Word16 end_band, Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word16 *q_cov_real[IVAS_SPAR_MAX_CH], const Word16 HOA_md_ind[IVAS_SPAR_MAX_CH] ); +#endif static void ivas_band_cov( float **ppIn_FR_real, float **ppIn_FR_imag, const int16_t num_chans, const int16_t num_bins, int16_t stride, float **pFb_bin_to_band, const int16_t *pFb_start_bin_per_band, const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ); /*------------------------------------------------------------------------- @@ -84,19 +91,16 @@ ivas_error ivas_spar_covar_enc_open( cov_smooth_cfg.max_bands = IVAS_MAX_NUM_BANDS; #ifdef IVAS_FLOAT_FIXED - cov_smooth_cfg.max_update_rate_fx = (Word32) ( MAX_UPDATE_RATE * ONE_IN_Q31 ); // Q31 -#else - cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE; + cov_smooth_cfg.max_update_rate_fx = MAX_UPDATE_RATE_Q31; #endif + cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE; cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE; if ( smooth_mode == COV_SMOOTH_MC ) { #ifdef IVAS_FLOAT_FIXED - // Note: (Word32) ( 1.0f * ONE_IN_Q31 ) overflows to INT_MIN cov_smooth_cfg.max_update_rate_fx = ONE_IN_Q31; // Q31 -#else - cov_smooth_cfg.max_update_rate = 1.0f; #endif + cov_smooth_cfg.max_update_rate = 1.0f; cov_smooth_cfg.min_pool_size = 20; } @@ -106,10 +110,9 @@ ivas_error ivas_spar_covar_enc_open( } #ifdef IVAS_FLOAT_FIXED - cov_smooth_cfg.max_update_rate_fx = (Word32) ( MAX_UPDATE_RATE_DTX * ONE_IN_Q31 ); // Q31 -#else - cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE_DTX; + cov_smooth_cfg.max_update_rate_fx = MAX_UPDATE_RATE_DTX_Q31; #endif + cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE_DTX; cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE_DTX; if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_dtx_state, &cov_smooth_cfg, pFb, nchan_inp, smooth_mode, ivas_total_brate ) ) != IVAS_ERR_OK ) @@ -160,6 +163,171 @@ void ivas_spar_covar_enc_close( } +#ifdef IVAS_FLOAT_FIXED +/*-----------------------------------------------------------------------------------------* + * Function ivas_spar_get_activeW_flag_fx() + * + * + *-----------------------------------------------------------------------------------------*/ + +static Word16 ivas_spar_get_activeW_flag_fx( + ivas_enc_cov_handler_state_t *hCovEnc, + Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + Word32 *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + Word16 *q_cov_real[IVAS_SPAR_MAX_CH], + const Word16 dtx_vad, + const Word16 nchan_inp, + const Word16 nchan_transport, + Word16 *res_ind, + const Word16 *dmx_order ) +{ + Word16 b, ch, num_bands, num_chs, activeW_flag; + Word32 bb_var[FOA_CHANNELS], sm_fact, side_ch_var, en_ratio; + Word64 bb_var_64bit[FOA_CHANNELS]; + Word16 q_shift; + Word16 q_bb_var[FOA_CHANNELS]; + Word32 L_tmp, L_tmp1; + Word16 exp_diff, q_com, guard_bits; + + num_chs = s_min( nchan_inp, FOA_CHANNELS ); + num_bands = ivas_get_num_bands_from_bw_idx( SPAR_CONFIG_BW ); + + set_zero_fx( bb_var, FOA_CHANNELS ); + set_s( q_bb_var, Q31, FOA_CHANNELS ); + FOR( ch = 0; ch < FOA_CHANNELS; ch++ ) + { + bb_var_64bit[ch] = 0; + move64(); + } + + IF( EQ_16( dtx_vad, 1 ) ) + { + FOR( ch = 0; ch < num_chs; ch++ ) + { + FOR( b = 0; b < num_bands; b++ ) + { + bb_var_64bit[ch] = W_add_nosat( bb_var_64bit[ch], W_deposit32_l( cov_real[ch][ch][b] ) ); // q_cov_real[ch][ch] + move64(); + q_bb_var[ch] = q_cov_real[ch][ch]; + move16(); + } + } + } + ELSE + { + FOR( ch = 0; ch < num_chs; ch++ ) + { + FOR( b = 0; b < num_bands; b++ ) + { + bb_var_64bit[ch] = W_add_nosat( bb_var_64bit[ch], W_deposit32_l( cov_dtx_real[ch][ch][b] ) ); // q_cov_real[ch][ch] + move64(); + q_bb_var[ch] = q_cov_real[ch][ch]; + move16(); + } + } + } + + FOR( ch = 0; ch < num_chs; ch++ ) + { + q_shift = Q31; + move16(); + q_shift = W_norm( bb_var_64bit[ch] ); + bb_var[ch] = W_extract_l( W_shl_nosat( bb_var_64bit[ch], sub( q_shift, 32 ) ) ); + move32(); + q_bb_var[ch] = add( q_bb_var[ch], sub( q_shift, 32 ) ); + move16(); + } + + IF( EQ_16( hCovEnc->prior_var_flag, -1 ) ) + { + FOR( ch = 0; ch < num_chs; ch++ ) + { + hCovEnc->bb_var_lt_fx[ch] = bb_var[ch]; // q_bb_var[ch] + move32(); + } + } + ELSE + { + sm_fact = ONE_IN_Q30; // Q31 + move32(); + FOR( ch = 0; ch < num_chs; ch++ ) + { + L_tmp = Mpy_32_32( sm_fact, hCovEnc->bb_var_lt_fx[ch] ); // (Q31, q_bb_var[ch]) -> q_bb_var[ch] + L_tmp1 = Mpy_32_32( L_sub( ONE_IN_Q31, sm_fact ), bb_var[ch] ); // (Q31, q_bb_var[ch]) -> q_bb_var[ch] + hCovEnc->bb_var_lt_fx[ch] = L_add( L_tmp, L_tmp1 ); // q_bb_var[ch] + move32(); + } + } + + side_ch_var = L_deposit_l( EPSILLON_FX ); // Note: To handle divide-by-0 asserts + guard_bits = find_guarded_bits_fx( L_deposit_l( sub( num_chs, nchan_transport ) ) ); + q_com = Q20; + move16(); + FOR( ch = nchan_transport; ch < num_chs; ch++ ) + { + q_com = s_min( q_com, q_bb_var[dmx_order[ch]] ); + } + FOR( ch = nchan_transport; ch < num_chs; ch++ ) + { + side_ch_var = L_add( side_ch_var, L_shr( L_shl( hCovEnc->bb_var_lt_fx[dmx_order[ch]], sub( q_com, q_bb_var[dmx_order[ch]] ) ), guard_bits ) ); // Q(q_com - guard_bits) + } + + IF( LT_32( side_ch_var, L_shl( L_mult0( IVAS_SPAR_SIDE_CH_DYN_ACTIVEW_THRESH_Q0, IVAS_SPAR_SIDE_CH_DYN_ACTIVEW_THRESH_Q0 ), sub( q_com, guard_bits ) ) ) ) // LHS Q(q_com - guard_bits) :: RHS Q(q_com - guard_bits) + { + activeW_flag = 0; + move16(); + } + ELSE + { + L_tmp = BASOP_Util_Divide3232_Scale_cadence( hCovEnc->bb_var_lt_fx[0], side_ch_var, &exp_diff ); // (Q31 - exp_diff) + en_ratio = L_shl_sat( L_tmp, exp_diff ); // Q31 + IF( LT_32( en_ratio, Mpy_32_32( IVAS_SPAR_DYN_ACTIVEW_THRESH_FX, IVAS_SPAR_DYN_ACTIVEW_THRESH_FX ) ) ) // LHS Q31 :: RHS Q31 + { + activeW_flag = 1; + move16(); + } + ELSE + { + activeW_flag = 0; + move16(); + } + } + + IF( activeW_flag ) + { + *res_ind = 0; + move16(); + IF( EQ_16( nchan_transport, 2 ) ) + { + Word16 max_idx; + Word32 max_val; + max_idx = nchan_transport; + move16(); + max_val = hCovEnc->bb_var_lt_fx[max_idx]; // q_bb_var[max_idx] + move32(); + FOR( ch = nchan_transport; ch < num_chs; ch++ ){ + IF( GT_32( hCovEnc->bb_var_lt_fx[ch], max_val ) ){ + max_idx = ch; + move16(); + max_val = hCovEnc->bb_var_lt_fx[ch]; + move32(); + } + } + *res_ind = max_idx; + move16(); +} +ELSE IF( EQ_16( nchan_transport, 3 ) ) +{ + *res_ind = dmx_order[nchan_transport]; + move16(); +} +} + +return activeW_flag; +} +#endif + + /*-----------------------------------------------------------------------------------------* * Function ivas_spar_get_activeW_flag() * @@ -272,34 +440,173 @@ static int16_t ivas_spar_get_activeW_flag( } +#ifdef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------------------------------* - * Function ivas_enc_cov_handler_process() + * Function ivas_enc_cov_handler_process_fx() * * Encoder covariance handler process call *-----------------------------------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED -ivas_error ivas_enc_cov_handler_process( +void ivas_enc_cov_handler_process_fx( ivas_enc_cov_handler_state_t *hCovEnc, /* i/o: SPAR Covar. encoder handle */ - float **ppIn_FR_real, - float **ppIn_FR_imag, - float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + Word32 **ppIn_FR_real, + Word32 **ppIn_FR_imag, + Word16 *q_ppIn_FR, + Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + Word16 *q_cov_real[IVAS_SPAR_MAX_CH], + Word32 *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + Word16 *q_cov_dtx_real[IVAS_SPAR_MAX_CH], ivas_filterbank_t *pFb, /* i/o: FB handle */ - const int16_t start_band, - const int16_t end_band, - const int16_t num_ch, - const int16_t dtx_vad, - const int16_t transient_det[2], - const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH], - int16_t *res_ind, - const int16_t *remix_order, - int16_t *dyn_active_w_flag, - const int16_t nchan_transport, - const int16_t is_sba + const Word16 start_band, + const Word16 end_band, + const Word16 num_ch, + const Word16 dtx_vad, + const Word16 transient_det[2], + const Word16 HOA_md_ind[IVAS_SPAR_MAX_CH], + Word16 *res_ind, + const Word16 *remix_order, + Word16 *dyn_active_w_flag, + const Word16 nchan_transport, + const Word16 is_sba ) +{ + Word16 i, j; + Word16 dtx_cov_flag; + Word16 cov_real_zero[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + Word16 k; + + IF( EQ_16( dtx_vad, 1 ) ) + { + dtx_cov_flag = 0; + move16(); + } + ELSE + { + dtx_cov_flag = 1; + move16(); + } + + ivas_band_cov_fx( ppIn_FR_real, ppIn_FR_imag, q_ppIn_FR, num_ch, hCovEnc->num_bins, + pFb->fb_bin_to_band.short_stride, + pFb->fb_bin_to_band.pp_short_stride_bin_to_band_fx, // Q22 + pFb->fb_bin_to_band.p_short_stride_start_bin_per_band, + pFb->fb_bin_to_band.p_short_stride_num_bins_per_band, + start_band, end_band, cov_real, q_cov_real, HOA_md_ind ); + + FOR( i = 0; i < num_ch; i++ ) + { + set_s( cov_real_zero[i], 1, num_ch ); + } + // Check if a particular band array is zero + FOR( i = 0; i < num_ch; i++ ) + { + FOR( j = 0; j < num_ch; j++ ) + { + FOR( k = start_band; k < end_band; k++ ) + { + IF( cov_real[i][j][k] != 0 ) + { + cov_real_zero[i][j] = 0; + move16(); + BREAK; + } + } + } + } + // Set q_cov_real to Q31 for the zero band array + FOR( i = 0; i < num_ch; i++ ) + { + FOR( j = 0; j < num_ch; j++ ) + { + IF( EQ_16( cov_real_zero[i][j], 1 ) ) + { + q_cov_real[i][j] = Q31; + move16(); + } + } + } + + IF( is_sba ) + { + *res_ind = 0; + move16(); + IF( GT_16( nchan_transport, 1 ) && LE_16( nchan_transport, sub( FOA_CHANNELS, 1 ) ) ) + { + *dyn_active_w_flag = ivas_spar_get_activeW_flag_fx( hCovEnc, cov_real, cov_real, q_cov_real, dtx_vad, num_ch, nchan_transport, res_ind, remix_order ); + } + ELSE + { + *dyn_active_w_flag = 0; + move16(); + } + } + + FOR( i = 0; i < num_ch; i++ ) + { + FOR( j = 0; j < num_ch; j++ ) + { + mvl2l( cov_real[i][j], cov_dtx_real[i][j], pFb->filterbank_num_bands ); + q_cov_dtx_real[i][j] = q_cov_real[i][j]; + move16(); + } + } + + ivas_cov_smooth_process_fx( hCovEnc->pCov_state, cov_real, pFb, start_band, end_band, num_ch, transient_det, q_cov_real ); + + IF( dtx_cov_flag == 0 ) + { + FOR( i = 0; i < num_ch; i++ ) + { + FOR( j = 0; j < num_ch; j++ ) + { + mvl2l( cov_real[i][j], hCovEnc->pCov_dtx_state->pPrior_cov_real_fx[i][j], pFb->filterbank_num_bands ); + mvl2l( cov_real[i][j], cov_dtx_real[i][j], pFb->filterbank_num_bands ); + mvs2s( hCovEnc->pCov_state->q_cov_real_per_band[i][j], hCovEnc->pCov_dtx_state->q_cov_real_per_band[i][j], pFb->filterbank_num_bands ); + } + } + hCovEnc->prior_dtx_present = 1; + move16(); + } + ELSE + { + IF( transient_det[0] == 0 && transient_det[1] == 0 ) + { + ivas_cov_smooth_process_fx( hCovEnc->pCov_dtx_state, cov_dtx_real, pFb, start_band, end_band, num_ch, transient_det, q_cov_dtx_real ); + hCovEnc->prior_dtx_present = 1; + move16(); + } + ELSE + { + IF( hCovEnc->prior_dtx_present == 0 ) + { + ivas_cov_smooth_process_fx( hCovEnc->pCov_dtx_state, cov_dtx_real, pFb, start_band, end_band, num_ch, transient_det, q_cov_dtx_real ); + hCovEnc->prior_dtx_present = 1; + move16(); + } + ELSE + { + FOR( i = 0; i < num_ch; i++ ) + { + FOR( j = 0; j < num_ch; j++ ) + { + mvl2l( hCovEnc->pCov_dtx_state->pPrior_cov_real_fx[i][j], cov_dtx_real[i][j], pFb->filterbank_num_bands ); + } + } + hCovEnc->prior_dtx_present = 1; + move16(); + } + } + } + + return; +} +#endif + +/*-----------------------------------------------------------------------------------------* + * Function ivas_enc_cov_handler_process() + * + * Encoder covariance handler process call + *-----------------------------------------------------------------------------------------*/ -) -#else void ivas_enc_cov_handler_process( ivas_enc_cov_handler_state_t *hCovEnc, /* i/o: SPAR Covar. encoder handle */ float **ppIn_FR_real, @@ -320,14 +627,9 @@ void ivas_enc_cov_handler_process( const int16_t is_sba ) -#endif { int16_t i, j; int16_t dtx_cov_flag; -#ifdef IVAS_FLOAT_FIXED - Word32 *cov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], *cov_dtx_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; - Word16 q_cov[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; -#endif dtx_cov_flag = ( dtx_vad == 1 ) ? 0 : 1; @@ -359,53 +661,7 @@ void ivas_enc_cov_handler_process( } } -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < num_ch; i++ ) - { - for ( j = 0; j < num_ch; j++ ) - { - if ( ( cov_real_fx[i][j] = (Word32 *) malloc( sizeof( Word32 ) * pFb->filterbank_num_bands ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder Fixed" ); - } - set_zero_fx( cov_real_fx[i][j], pFb->filterbank_num_bands ); - if ( ( cov_dtx_real_fx[i][j] = (Word32 *) malloc( sizeof( Word32 ) * pFb->filterbank_num_bands ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder Fixed" ); - } - set_zero_fx( cov_dtx_real_fx[i][j], pFb->filterbank_num_bands ); - } - set_s( q_cov[i], 0, num_ch ); - } - - for ( i = 0; i < num_ch; i++ ) - { - for ( j = 0; j < num_ch; j++ ) - { - q_cov[i][j] = L_get_q_buf( hCovEnc->pCov_state->pPrior_cov_real[i][j], pFb->filterbank_num_bands ); - q_cov[i][j] = min( q_cov[i][j], L_get_q_buf( cov_real[i][j], pFb->filterbank_num_bands ) ); - floatToFixed_arrL( cov_real[i][j], cov_real_fx[i][j], q_cov[i][j], pFb->filterbank_num_bands ); - floatToFixed_arrL( hCovEnc->pCov_state->pPrior_cov_real[i][j], hCovEnc->pCov_state->pPrior_cov_real_fx[i][j], q_cov[i][j], pFb->filterbank_num_bands ); - } - } -#endif - -#ifdef IVAS_FLOAT_FIXED - ivas_cov_smooth_process_fx( hCovEnc->pCov_state, cov_real_fx, pFb, start_band, end_band, num_ch, transient_det, q_cov ); -#else ivas_cov_smooth_process( hCovEnc->pCov_state, cov_real, pFb, start_band, end_band, num_ch, transient_det ); -#endif - -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < num_ch; i++ ) - { - for ( j = 0; j < num_ch; j++ ) - { - fixedToFloat_arrL( cov_real_fx[i][j], cov_real[i][j], q_cov[i][j], pFb->filterbank_num_bands ); - fixedToFloat_arrL( hCovEnc->pCov_state->pPrior_cov_real_fx[i][j], hCovEnc->pCov_state->pPrior_cov_real[i][j], q_cov[i][j], pFb->filterbank_num_bands ); - } - } -#endif if ( dtx_cov_flag == 0 ) { @@ -424,110 +680,170 @@ void ivas_enc_cov_handler_process( { if ( ( transient_det[0] == 0 ) && ( transient_det[1] == 0 ) ) { -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < num_ch; i++ ) - { - set_s( q_cov[i], 0, num_ch ); - for ( j = 0; j < num_ch; j++ ) - { - q_cov[i][j] = L_get_q_buf( hCovEnc->pCov_dtx_state->pPrior_cov_real[i][j], pFb->filterbank_num_bands ); - q_cov[i][j] = min( q_cov[i][j], L_get_q_buf( cov_dtx_real[i][j], pFb->filterbank_num_bands ) ); - floatToFixed_arrL( cov_dtx_real[i][j], cov_dtx_real_fx[i][j], q_cov[i][j], pFb->filterbank_num_bands ); - floatToFixed_arrL( hCovEnc->pCov_dtx_state->pPrior_cov_real[i][j], hCovEnc->pCov_dtx_state->pPrior_cov_real_fx[i][j], q_cov[i][j], pFb->filterbank_num_bands ); - } - } -#endif - -#ifdef IVAS_FLOAT_FIXED - ivas_cov_smooth_process_fx( hCovEnc->pCov_dtx_state, cov_dtx_real_fx, pFb, start_band, end_band, num_ch, transient_det, q_cov ); -#else ivas_cov_smooth_process( hCovEnc->pCov_dtx_state, cov_dtx_real, pFb, start_band, end_band, num_ch, transient_det ); -#endif - -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < num_ch; i++ ) - { - for ( j = 0; j < num_ch; j++ ) - { - fixedToFloat_arrL( cov_dtx_real_fx[i][j], cov_dtx_real[i][j], q_cov[i][j], pFb->filterbank_num_bands ); - fixedToFloat_arrL( hCovEnc->pCov_dtx_state->pPrior_cov_real_fx[i][j], hCovEnc->pCov_dtx_state->pPrior_cov_real[i][j], q_cov[i][j], pFb->filterbank_num_bands ); - } - } -#endif - hCovEnc->prior_dtx_present = 1; } else { if ( hCovEnc->prior_dtx_present == 0 ) { -#ifdef IVAS_FLOAT_FIXED + ivas_cov_smooth_process( hCovEnc->pCov_dtx_state, cov_dtx_real, pFb, start_band, end_band, num_ch, transient_det ); + hCovEnc->prior_dtx_present = 1; + } + else + { for ( i = 0; i < num_ch; i++ ) { - set_s( q_cov[i], 0, num_ch ); for ( j = 0; j < num_ch; j++ ) { - q_cov[i][j] = L_get_q_buf( hCovEnc->pCov_dtx_state->pPrior_cov_real[i][j], pFb->filterbank_num_bands ); - q_cov[i][j] = min( q_cov[i][j], L_get_q_buf( cov_dtx_real[i][j], pFb->filterbank_num_bands ) ); - floatToFixed_arrL( cov_dtx_real[i][j], cov_dtx_real_fx[i][j], q_cov[i][j], pFb->filterbank_num_bands ); - floatToFixed_arrL( hCovEnc->pCov_dtx_state->pPrior_cov_real[i][j], hCovEnc->pCov_dtx_state->pPrior_cov_real_fx[i][j], q_cov[i][j], pFb->filterbank_num_bands ); + mvr2r( hCovEnc->pCov_dtx_state->pPrior_cov_real[i][j], cov_dtx_real[i][j], pFb->filterbank_num_bands ); } } -#endif -#ifdef IVAS_FLOAT_FIXED - ivas_cov_smooth_process_fx( hCovEnc->pCov_dtx_state, cov_dtx_real_fx, pFb, start_band, end_band, num_ch, transient_det, q_cov ); -#else - ivas_cov_smooth_process( hCovEnc->pCov_dtx_state, cov_dtx_real, pFb, start_band, end_band, num_ch, transient_det ); -#endif + hCovEnc->prior_dtx_present = 1; + } + } + } + + return; +} + #ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < num_ch; i++ ) +static void ivas_band_cov_fx( + Word32 **ppIn_FR_real, + Word32 **ppIn_FR_imag, + Word16 *q_In_FR, + const Word16 num_chans, + const Word16 num_bins, + Word16 stride, + Word32 **pFb_bin_to_band, + const Word16 *pFb_start_bin_per_band, + const Word16 *pFb_active_bins_per_band, + const Word16 start_band, + const Word16 end_band, + Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + Word16 *q_cov_real[IVAS_SPAR_MAX_CH], + const Word16 HOA_md_ind[IVAS_SPAR_MAX_CH] ) +{ + Word16 i, j, k; + Word32 pV_re[L_FRAME48k]; + Word64 pV_re_64bit[L_FRAME48k]; + Word64 cov_real_64bit[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + Word16 q_shift; + Word16 m, start_bin, active_bins; + + FOR( i = 0; i < num_chans; i++ ) + { + FOR( j = i; j < num_chans; j++ ) + { + Word16 i1 = HOA_md_ind[i]; + Word16 j1 = HOA_md_ind[j]; + move16(); + move16(); + + FOR( k = 0; k < num_bins; k++ ) + { + pV_re_64bit[k] = W_add( W_mult0_32_32( ppIn_FR_real[i1][k], ppIn_FR_real[j1][k] ), + W_mult0_32_32( ppIn_FR_imag[i1][k], ppIn_FR_imag[j1][k] ) ); //(q_In_FR[i1], q_In_FR[j1]) -> (q_In_FR[i1] + q_In_FR[j1]) + move64(); + } + + q_shift = 31; + move16(); + FOR( k = 0; k < num_bins; k++ ) + { + IF( pV_re_64bit[k] != 0 ) { - for ( j = 0; j < num_ch; j++ ) - { - fixedToFloat_arrL( cov_dtx_real_fx[i][j], cov_dtx_real[i][j], q_cov[i][j], pFb->filterbank_num_bands ); - fixedToFloat_arrL( hCovEnc->pCov_dtx_state->pPrior_cov_real_fx[i][j], hCovEnc->pCov_dtx_state->pPrior_cov_real[i][j], q_cov[i][j], pFb->filterbank_num_bands ); - } + q_shift = s_min( q_shift, W_norm( pV_re_64bit[k] ) ); } -#endif - - hCovEnc->prior_dtx_present = 1; } - else + FOR( k = 0; k < num_bins; k++ ) { - for ( i = 0; i < num_ch; i++ ) + pV_re[k] = W_extract_l( W_shl_nosat( pV_re_64bit[k], sub( q_shift, 32 ) ) ); //(q_In_FR[i1] + q_In_FR[j1]) + (q_shift - 32) + move32(); + /* perform rounding towards lower value for negative results */ + IF( pV_re[k] < 0 ) { - for ( j = 0; j < num_ch; j++ ) + pV_re[k] = L_add( pV_re[k], 1 ); + } + } + + FOR( k = start_band; k < end_band; k++ ) + { + Word64 temp; + const Word32 *p_bin_to_band = pFb_bin_to_band[k]; // Q22 + Word32 *cov_ptr = pV_re; + Word16 num_blocks; + Word16 blk; + + temp = 0; + move64(); + num_blocks = idiv1616( num_bins, stride ); + move16(); + start_bin = pFb_start_bin_per_band[k]; + move16(); + active_bins = pFb_active_bins_per_band[k]; + move16(); + + FOR( blk = 0; blk < num_blocks; blk++ ) + { + /* optional: add temporal weight here */ + FOR( m = start_bin; m < add( start_bin, active_bins ); m++ ) { - mvr2r( hCovEnc->pCov_dtx_state->pPrior_cov_real[i][j], cov_dtx_real[i][j], pFb->filterbank_num_bands ); + temp = W_add( temp, W_mult0_32_32( cov_ptr[m], p_bin_to_band[sub( m, start_bin )] ) ); // ((q_In_FR[i1] + q_In_FR[j1]) + (q_shift - 32), Q22) -> (q_In_FR[i1] + q_In_FR[j1] + (q_shift - 10) } + cov_ptr += stride; } + // What basop to add below???? + cov_real_64bit[i][j][k] = temp * (Word64) ( num_blocks ); // (q_In_FR[i1] + q_In_FR[j1] + (q_shift - 10) - guard_bits + move64(); + } + q_cov_real[i][j] = add( add( q_In_FR[i1], q_In_FR[j1] ), sub( q_shift, Q10 ) ); + move16(); + } + } - hCovEnc->prior_dtx_present = 1; + FOR( i = 0; i < num_chans; i++ ) + { + FOR( j = i; j < num_chans; j++ ) + { + q_shift = 31; + move16(); + FOR( k = start_band; k < end_band; k++ ) + { + IF( cov_real_64bit[i][j][k] != 0 ) + { + q_shift = s_min( q_shift, W_norm( cov_real_64bit[i][j][k] ) ); + } + } + FOR( k = start_band; k < end_band; k++ ) + { + cov_real[i][j][k] = W_extract_l( W_shl_nosat( cov_real_64bit[i][j][k], sub( q_shift, 32 ) ) ); + move32(); } + q_cov_real[i][j] = add( q_cov_real[i][j], sub( q_shift, 32 ) ); + move16(); } } -#ifdef IVAS_FLOAT_FIXED - for ( i = 0; i < num_ch; i++ ) + FOR( i = 0; i < num_chans; i++ ) { - for ( j = 0; j < num_ch; j++ ) + FOR( j = 0; j < i; j++ ) { - free( cov_real_fx[i][j] ); - cov_real_fx[i][j] = NULL; - free( cov_dtx_real_fx[i][j] ); - cov_dtx_real_fx[i][j] = NULL; + FOR( k = start_band; k < end_band; k++ ) + { + cov_real[i][j][k] = cov_real[j][i][k]; // q_cov_real[i][j] + move32(); + } + q_cov_real[i][j] = q_cov_real[j][i]; + move16(); } } -#endif -#ifdef IVAS_FLOAT_FIXED - return IVAS_ERR_OK; -#else return; -#endif } +#endif static void ivas_band_cov( diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 75c174481..238a9ff7b 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -635,6 +635,18 @@ static ivas_error ivas_spar_cov_md_process( float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; float cov_real_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; float cov_dtx_real_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; +#ifdef IVAS_FLOAT_FIXED + Word32 *cov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + Word32 *cov_dtx_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + Word16 *q_cov_real[IVAS_SPAR_MAX_CH]; + Word16 *q_cov_dtx_real[IVAS_SPAR_MAX_CH]; + Word32 cov_real_buf_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + Word32 cov_dtx_real_buf_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + Word32 *ppIn_FR_real_fx[IVAS_SPAR_MAX_CH], *ppIn_FR_imag_fx[IVAS_SPAR_MAX_CH]; + Word16 q_ppIn_FR[IVAS_SPAR_MAX_CH]; + Word16 input_frame; + Word16 nchan_fb_in; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -681,8 +693,98 @@ static ivas_error ivas_spar_cov_md_process( } } +#ifdef IVAS_FLOAT_FIXED + FOR( i = 0; i < nchan_inp; i++ ) + { + FOR( j = 0; j < nchan_inp; j++ ) + { + cov_real_fx[i][j] = cov_real_buf_fx[i][j]; + cov_dtx_real_fx[i][j] = cov_dtx_real_buf_fx[i][j]; + FOR( b = hSpar->hFbMixer->pFb->filterbank_num_bands; b < IVAS_MAX_NUM_BANDS; b++ ) + { + cov_real_fx[i][j][b] = 0; + move16(); + cov_dtx_real_fx[i][j][b] = 0; + move16(); + } + } + IF( ( q_cov_real[i] = (Word16 *) malloc( sizeof( Word16 ) * nchan_inp ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder Fixed" ); + } + set_s( q_cov_real[i], Q31, nchan_inp ); + IF( ( q_cov_dtx_real[i] = (Word16 *) malloc( sizeof( Word16 ) * nchan_inp ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder Fixed" ); + } + set_s( q_cov_dtx_real[i], Q31, nchan_inp ); + } +#endif + +#ifdef IVAS_FLOAT_FIXED + input_frame = extract_l( Mpy_32_32( hEncoderConfig->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + nchan_fb_in = hSpar->hFbMixer->fb_cfg->nchan_fb_in; + move16(); + + FOR( i = 0; i < nchan_fb_in; i++ ) + { + IF( ( ppIn_FR_real_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * input_frame ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR encoder Fixed" ); + } + set_zero_fx( ppIn_FR_real_fx[i], input_frame ); + IF( ( ppIn_FR_imag_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * input_frame ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR encoder Fixed" ); + } + set_zero_fx( ppIn_FR_imag_fx[i], input_frame ); + } + set_s( q_ppIn_FR, Q31, nchan_fb_in ); + + FOR( i = 0; i < nchan_fb_in; i++ ) + { + q_ppIn_FR[i] = L_get_q_buf1( ppIn_FR_real[i], input_frame ); + q_ppIn_FR[i] = min( q_ppIn_FR[i], L_get_q_buf1( ppIn_FR_imag[i], input_frame ) ); + floatToFixed_arrL( ppIn_FR_real[i], ppIn_FR_real_fx[i], q_ppIn_FR[i], input_frame ); + floatToFixed_arrL( ppIn_FR_imag[i], ppIn_FR_imag_fx[i], q_ppIn_FR[i], input_frame ); + } +#endif + +#ifdef IVAS_FLOAT_FIXED + ivas_enc_cov_handler_process_fx( hSpar->hCovEnc, ppIn_FR_real_fx, ppIn_FR_imag_fx, q_ppIn_FR, cov_real_fx, q_cov_real, cov_dtx_real_fx, q_cov_dtx_real, hSpar->hFbMixer->pFb, 0, hSpar->hFbMixer->pFb->filterbank_num_bands, nchan_inp, dtx_vad, transient_det, hSpar->hMdEnc->HOA_md_ind, + &hSpar->hMdEnc->spar_md.res_ind, remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order], dyn_active_w_flag, nchan_transport, 1 ); +#else ivas_enc_cov_handler_process( hSpar->hCovEnc, ppIn_FR_real, ppIn_FR_imag, cov_real, cov_dtx_real, hSpar->hFbMixer->pFb, 0, hSpar->hFbMixer->pFb->filterbank_num_bands, nchan_inp, dtx_vad, transient_det, hSpar->hMdEnc->HOA_md_ind, &hSpar->hMdEnc->spar_md.res_ind, remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order], dyn_active_w_flag, nchan_transport, 1 ); +#endif + +#ifdef IVAS_FLOAT_FIXED + FOR( i = 0; i < nchan_inp; i++ ) + { + FOR( j = 0; j < nchan_inp; j++ ) + { + Word16 k; + FOR( k = 0; k < hSpar->hFbMixer->pFb->filterbank_num_bands; k++ ) + { + cov_real[i][j][k] = me2f( cov_real_fx[i][j][k], sub( Q31, hSpar->hCovEnc->pCov_state->q_cov_real_per_band[i][j][k] ) ); + cov_dtx_real[i][j][k] = me2f( cov_dtx_real_fx[i][j][k], sub( Q31, hSpar->hCovEnc->pCov_dtx_state->q_cov_real_per_band[i][j][k] ) ); + } + } + free( q_cov_real[i] ); + q_cov_real[i] = NULL; + free( q_cov_dtx_real[i] ); + q_cov_dtx_real[i] = NULL; + } + // Note: No need to convert ppIn_FR_real_fx and ppIn_FR_imag_fx back to float as they are not used after ivas_spar_cov_md_process() + + FOR( i = 0; i < nchan_fb_in; i++ ) + { + free( ppIn_FR_real_fx[i] ); + ppIn_FR_real_fx[i] = NULL; + free( ppIn_FR_imag_fx[i] ); + ppIn_FR_imag_fx[i] = NULL; + } +#endif if ( nchan_transport > 1 && nchan_transport <= ( FOA_CHANNELS - 1 ) ) { diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index e804e272f..3e9ec271f 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -857,6 +857,9 @@ typedef struct ivas_enc_cov_handler_state_t int16_t prior_dtx_present; float bb_var_lt[FOA_CHANNELS]; int16_t prior_var_flag; +#ifdef IVAS_FLOAT_FIXED + Word32 bb_var_lt_fx[FOA_CHANNELS]; +#endif } ivas_enc_cov_handler_state_t; -- GitLab From 02f4dbe73dbd34a001b107c070bdd4e63ad2401a Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 3 Jul 2024 08:57:18 +0530 Subject: [PATCH 026/110] Clang formatting changes --- lib_com/ivas_stat_com.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 6e13c5f29..78227e56b 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -595,7 +595,7 @@ typedef struct ivas_masa_qmetadata_frame_struct #ifndef IVAS_FLOAT_FIXED float dir_comp_ratio; #else - Word16 dir_comp_ratio_fx; /* Q15 */ + Word16 dir_comp_ratio_fx; /* Q15 */ #endif uint8_t is_masa_ivas_format; -- GitLab From a9e94c0ee9419c9d1e827bb06361f9f435dcaabc Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 3 Jul 2024 11:02:16 +0530 Subject: [PATCH 027/110] BASOP and instrumentation changes in lib_com, lib_dec and lib_rend files --- lib_com/fill_spectrum.c | 20 +- lib_com/findpulse.c | 1 - lib_com/fine_gain_bits_fx.c | 7 +- lib_com/frame_ener.c | 18 +- lib_com/get_gain.c | 2 + lib_com/hp50.c | 191 +- lib_com/hq2_core_com_fx.c | 9 + lib_com/hq2_noise_inject_fx.c | 2 + lib_com/hq_bit_allocation_fx.c | 18 + lib_com/hq_conf.c | 5 + lib_com/hq_conf_fx.c | 8 + lib_com/hq_tools_fx.c | 17 + lib_com/hvq_pvq_bitalloc_fx.c | 3 + lib_com/ifft_rel.c | 68 +- lib_com/igf_base_fx.c | 88 +- lib_com/index_pvq_opt_fx.c | 27 + lib_com/ivas_cnst.h | 3 + lib_com/ivas_dirac_com.c | 3 + lib_com/ivas_fb_mixer.c | 3 + lib_com/ivas_lfe_com.c | 3 + lib_com/ivas_masa_com.c | 126 +- lib_com/ivas_mc_param_com.c | 6 +- lib_com/ivas_mcmasa_com.c | 34 +- lib_com/ivas_mct_com.c | 82 +- lib_com/ivas_mdct_core_com.c | 17 +- lib_com/ivas_mdct_imdct_fx.c | 113 +- lib_com/ivas_mdft_imdft.c | 98 +- lib_com/ivas_omasa_com.c | 69 +- lib_com/ivas_pca_tools.c | 119 +- lib_com/ivas_qmetadata_com.c | 66 +- lib_com/ivas_qspherical_com.c | 90 +- lib_com/ivas_rom_com.c | 3750 +----------------- lib_com/ivas_rom_com.h | 156 +- lib_com/ivas_rom_com_fx.c | 3728 +++++++++++++++++ lib_com/ivas_rom_com_fx.h | 199 +- lib_com/ivas_sba_config.c | 25 +- lib_com/ivas_sns_com_fx.c | 95 +- lib_com/ivas_spar_com.c | 3 + lib_com/ivas_spar_com_quant_util.c | 125 +- lib_com/ivas_stereo_ica_com_fx.c | 3 + lib_com/ivas_stereo_td_bit_alloc.c | 3 + lib_com/lsf_tools_fx.c | 23 +- lib_com/lsp_conv_poly_fx.c | 5 + lib_com/modif_fs.c | 66 +- lib_com/modif_fs_fx.c | 22 +- lib_com/mslvq_com_fx.c | 120 +- lib_com/nelp_fx.c | 6 + lib_com/phase_dispersion_fx.c | 1 + lib_com/pred_lt4_fx.c | 1 + lib_com/preemph.c | 4 + lib_com/preemph_fx.c | 6 +- lib_com/pvq_com_fx.c | 60 +- lib_com/range_com_fx.c | 3 + lib_com/residu.c | 10 +- lib_com/trans_inv_fx.c | 2 +- lib_dec/acelp_core_switch_dec_fx.c | 67 +- lib_dec/amr_wb_dec_fx.c | 100 +- lib_dec/ari_dec_fx.c | 10 +- lib_dec/ari_hm_dec.c | 4 +- lib_dec/arith_coder_dec.c | 15 +- lib_dec/arith_coder_dec_fx.c | 21 +- lib_dec/avq_dec_fx.c | 51 +- lib_dec/bass_psfilter.c | 27 +- lib_dec/bass_psfilter_fx.c | 56 +- lib_dec/cng_dec_fx.c | 165 +- lib_dec/core_dec_init_fx.c | 363 +- lib_dec/core_dec_reconf_fx.c | 23 +- lib_dec/core_dec_switch_fx.c | 41 +- lib_dec/ivas_lfe_plc_fx.c | 3 + lib_dec/ivas_mc_paramupmix_dec.c | 3 + lib_dec/ivas_qmetadata_dec.c | 3 + lib_dec/ivas_qspherical_dec.c | 3 + lib_dec/ivas_sns_dec_fx.c | 3 + lib_dec/ivas_spar_md_dec.c | 3 + lib_dec/ivas_stereo_cng_dec.c | 4 + lib_dec/ivas_stereo_icbwe_dec.c | 3 + lib_dec/ivas_stereo_switching_dec.c | 3 + lib_dec/ivas_stereo_td_dec.c | 3 + lib_enc/ivas_core_pre_proc_front.c | 3 +- lib_enc/ivas_ism_metadata_enc.c | 3 + lib_enc/ivas_ism_param_enc.c | 3 + lib_enc/ivas_masa_enc.c | 3 + lib_enc/ivas_qmetadata_enc.c | 3 + lib_rend/ivas_allrad_dec.c | 58 +- lib_rend/ivas_crend.c | 124 +- lib_rend/ivas_dirac_ana.c | 14 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 1203 ++++-- lib_rend/ivas_dirac_decorr_dec.c | 311 +- lib_rend/ivas_dirac_onsets_dec.c | 32 +- lib_rend/ivas_dirac_output_synthesis_dec.c | 3 + lib_rend/ivas_prot_rend.h | 4 +- lib_rend/ivas_reflections.c | 4 + lib_rend/ivas_shoebox.c | 129 +- lib_rend/ivas_td_decorr.c | 165 +- lib_rend/ivas_vbap.c | 286 +- lib_rend/lib_rend.c | 2317 ++++++----- lib_rend/lib_rend.h | 66 + 97 files changed, 9077 insertions(+), 6360 deletions(-) diff --git a/lib_com/fill_spectrum.c b/lib_com/fill_spectrum.c index 187ee475d..7571b03ba 100644 --- a/lib_com/fill_spectrum.c +++ b/lib_com/fill_spectrum.c @@ -352,13 +352,15 @@ void ivas_fill_spectrum_fx( IF( EQ_16( HQ_mode, HQ_HARMONIC ) ) { /*high_sfm = (core_brate == HQ_BWE_CROSSOVER_BRATE) ? HVQ_THRES_SFM_24k-1 : HVQ_THRES_SFM_32k-3; */ - high_sfm = sub( HVQ_THRES_SFM_32k, 1 ); - IF( LT_32( L_core_brate, HQ_BWE_CROSSOVER_BRATE ) ) + high_sfm = HVQ_THRES_SFM_32k - 1; + move16(); + if ( LT_32( L_core_brate, HQ_BWE_CROSSOVER_BRATE ) ) { - high_sfm = sub( HVQ_THRES_SFM_24k, 1 ); + high_sfm = HVQ_THRES_SFM_24k - 1; + move16(); } - IF( LT_16( last_sfm, high_sfm ) ) + if ( LT_16( last_sfm, high_sfm ) ) { last_sfm = high_sfm; move16(); @@ -381,7 +383,7 @@ void ivas_fill_spectrum_fx( test(); test(); IF( EQ_16( length, L_FRAME16k ) || - ( ( EQ_16( length, L_FRAME32k ) && NE_16( HQ_mode, HQ_HARMONIC ) && NE_16( HQ_mode, HQ_HVQ ) ) && EQ_16( *no_att_hangover, 0 ) ) ) + ( ( EQ_16( length, L_FRAME32k ) && NE_16( HQ_mode, HQ_HARMONIC ) && NE_16( HQ_mode, HQ_HVQ ) ) && ( *no_att_hangover == 0 ) ) ) { /* Norm adjustment function */ env_adj_fx( npulses, length, last_sfm, norm_adj, env_stab, sfmsize ); @@ -393,7 +395,7 @@ void ivas_fill_spectrum_fx( test(); test(); test(); - IF( EQ_16( length, L_FRAME32k ) && ( ( LT_16( env_stab, 16384 ) && *no_att_hangover == 0 ) || EQ_16( HQ_mode, HQ_HVQ ) ) ) + if ( EQ_16( length, L_FRAME32k ) && ( ( LT_16( env_stab, 16384 ) && *no_att_hangover == 0 ) || EQ_16( HQ_mode, HQ_HVQ ) ) ) { flag_32K_env_hangover = 1; move16(); @@ -426,7 +428,7 @@ void ivas_fill_spectrum_fx( *----------------------------------------------------------------*/ test(); - IF( NE_16( HQ_mode, HQ_HVQ ) && GT_16( cb_size, 0 ) ) + IF( NE_16( HQ_mode, HQ_HVQ ) && ( cb_size > 0 ) ) { apply_noisefill_HQ_fx( R, length, flag_32K_env_hangover, L_core_brate, last_sfm, CodeBook, CodeBook_mod, cb_size, sfm_start, sfm_end, sfmsize, coeff ); @@ -436,7 +438,7 @@ void ivas_fill_spectrum_fx( * Normal mode BWE *----------------------------------------------------------------*/ - IF( EQ_16( HQ_mode, HQ_NORMAL ) ) + IF( HQ_mode == HQ_NORMAL ) { hq_fold_bwe_fx( last_sfm, sfm_end, num_sfm, coeff ); } @@ -524,6 +526,7 @@ void ivas_fill_spectrum_fx( IF( EQ_16( length, L_FRAME32k ) && LE_32( L_core_brate, HQ_32k ) ) { *prev_R = R[SFM_N_WB - 1]; + move16(); Copy32( L_coeff_out + L_FRAME16k - L_HQ_WB_BWE, prev_coeff_out, L_HQ_WB_BWE ); } @@ -784,6 +787,7 @@ void fill_spectrum_fx( IF( EQ_16( length, L_FRAME32k ) && LE_32( L_core_brate, HQ_32k ) ) { *prev_R = R[SFM_N_WB - 1]; + move16(); Copy32( L_coeff_out + L_FRAME16k - L_HQ_WB_BWE, prev_coeff_out, L_HQ_WB_BWE ); } diff --git a/lib_com/findpulse.c b/lib_com/findpulse.c index be75d3c83..c04b13a4d 100644 --- a/lib_com/findpulse.c +++ b/lib_com/findpulse.c @@ -185,7 +185,6 @@ Word16 findpulse_fx( /* o : pulse position *------------------------------------------------------------------------*/ ptr = resf + L_frame - 1; - move16(); maxi = 0; move16(); diff --git a/lib_com/fine_gain_bits_fx.c b/lib_com/fine_gain_bits_fx.c index 1ffc69535..e2f1dd8c7 100644 --- a/lib_com/fine_gain_bits_fx.c +++ b/lib_com/fine_gain_bits_fx.c @@ -87,7 +87,6 @@ Word16 assign_gain_bits_fx( /* o : Number of assigned } /* Re-adjust bit budget for gain quantization */ - move16(); gain_bits_tot = 0; move16(); *Rcalc = 0; @@ -125,7 +124,7 @@ static void ivas_subband_gain_bits_fx( { /*bps = (short)(Rk[i]*((word16)min(32767, ceil(32767.0f/sfmsize[i]); inexact C-integer division approx. */ bps = extract_l( L_shr( L_mult0( Rk[i], fg_inv_tbl_fx[sfmsize[i] >> 3] ), 18 ) ); /* 3+15 */ - IF( EQ_32( L_shl( L_mult0( sfmsize[i], add( bps, 1 ) ), 3 ), Rk[i] ) ) + if ( EQ_32( L_shl( L_mult0( sfmsize[i], add( bps, 1 ) ), 3 ), Rk[i] ) ) { bps = add( bps, 1 ); } @@ -138,7 +137,7 @@ static void ivas_subband_gain_bits_fx( tot = add( tot, b ); } - IF( EQ_16( tot, 0 ) ) + if ( tot == 0 ) { /* If no gain bits were assigned, use one bit anyway for potential PVQ overage */ bits[0] = 1; @@ -177,7 +176,7 @@ Word16 ivas_assign_gain_bits_fx( /* o : Number of ass move16(); FOR( i = 0; i < BANDS; i++ ) { - IF( GT_16( Rk[i], 0 ) ) + IF( Rk[i] > 0 ) { Rk[i] = sub( Rk[i], shl( gain_bits_array[i], 3 ) ); move16(); diff --git a/lib_com/frame_ener.c b/lib_com/frame_ener.c index 46fcddfb3..4fa6e41ba 100644 --- a/lib_com/frame_ener.c +++ b/lib_com/frame_ener.c @@ -107,11 +107,12 @@ void fer_energy_fx( IF( EQ_16( clas, VOICED_CLAS ) || EQ_16( clas, ONSET ) || EQ_16( clas, SIN_ONSET ) ) /* Voiced or Onset current frame */ { len = ( pitch ); /* pitch value */ + move16(); pt_synth = synth; - IF( NE_16( offset, 0 ) ) + IF( offset != 0 ) { - pt_synth = synth + L_frame - len; + pt_synth = synth + sub( L_frame, len ); } emaximum_32fx( q_synth, pt_synth, len, enr ); /* pitch synchronous E */ @@ -119,22 +120,25 @@ void fer_energy_fx( ELSE { pt_synth = synth; - IF( NE_16( offset, 0 ) ) + IF( offset != 0 ) { pt_synth = synth + shr( L_frame, 1 ); } W_tmp = 0; - for ( int i = 0; i < shr( L_frame, 1 ); i++ ) + move64(); + FOR( int i = 0; i < L_frame / 2; i++ ) { W_tmp = W_add( W_tmp, W_mult0_32_32( pt_synth[i], pt_synth[i] ) ); // Q = q_synth * 2 } shift = W_norm( W_tmp ); W_tmp = W_shl( W_tmp, shift ); // Q = q_synth * 2 + shift *enr = W_extract_h( W_tmp ); // Q = q_synth * 2 + shift - 32 + move32(); enr_tmp = BASOP_Util_Divide3216_Scale( *enr, shr( L_frame, 1 ) /*Q0*/, &exp ); - *enr = L_shr( L_deposit_l( enr_tmp ), ( shift - 32 - exp - 1 ) ); + *enr = L_shr( L_deposit_l( enr_tmp ), sub( sub( sub( shift, 32 ), exp ), 1 ) ); + move32(); } return; } @@ -291,8 +295,10 @@ Word16 frame_ener_fx( IF( EQ_16( L_frame, 320 ) ) { *enr_q = Mult_32_16( *enr_q, 26214 ); /*x 0.8 to get /160*/ + move32(); i = norm_l( *enr_q ); *enr_q = L_shl( *enr_q, i ); + move32(); exp_enrq = add( i, exp_enrq ); } } @@ -301,6 +307,7 @@ Word16 frame_ener_fx( exp_enrq = sub( exp_enrq, add( Q_new, Q_new ) ); enr_q_tmp /*Q30 exp2+exp_enrq*/ = BASOP_Util_Divide3216_Scale( *enr_q /*Q31*/, L_frame2 /*Q0*/, &exp2 ); *enr_q = L_shr( L_deposit_l( enr_q_tmp ), sub( 30, add( exp2, exp_enrq ) ) ); /*Q0*/ + move32(); *enr_q = L_add( *enr_q, 1 ); move32(); exp_enrq = 0; @@ -331,6 +338,7 @@ Word16 frame_energy_fx( /* o : Frame energy in Q8 Word16 len, enern; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif diff --git a/lib_com/get_gain.c b/lib_com/get_gain.c index e6288ad01..43d39ae31 100644 --- a/lib_com/get_gain.c +++ b/lib_com/get_gain.c @@ -87,6 +87,7 @@ Word32 get_gain( /* output: codebook gain (adaptive or fixed) Word16 exp_c, exp_e, exp, tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif @@ -122,6 +123,7 @@ Word32 get_gain2( /* output: codebook gain (adaptive or fixed) Word16 m_corr, m_ener, negative, Q_corr, Q_ener; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif negative = 0; diff --git a/lib_com/hp50.c b/lib_com/hp50.c index 0e99e3203..288d690e3 100644 --- a/lib_com/hp50.c +++ b/lib_com/hp50.c @@ -438,7 +438,7 @@ void hp20( Word16 signal[], /* i/o: signal to filter any * } -#ifdef IVAS_FLOAT_FIXED +#if 0 void hp20_fix32( Word32 signal_fx[], const Word16 lg, @@ -590,3 +590,192 @@ void hp20_fix32( return; } #endif + +#ifdef IVAS_FLOAT_FIXED +void hp20_fix32( + Word32 signal_fx[], + const Word16 lg, + Word32 mem_fx[], + const Word32 Fs ) +{ + Word16 i; + Word32 a1_fx, a2_fx, b1_fx, b2_fx; + Word16 Qx0, Qx1, Qx2, Qy1, Qprev_y1, Qy2, Qprev_y2, Qmin; + Word64 x0_fx64, x1_fx64, x2_fx64, y0_fx64, y1_fx64, y2_fx64, R1, R2, R3, R4, R5; + + IF( EQ_32( Fs, 8000 ) ) + { + /* hp filter 20Hz at 3dB for 8000KHz input sampling rate + [b,a] = butter(2, 20.0/4000.0, 'high'); + b = [0.988954248067140 -1.977908496134280 0.988954248067140] + a =[1.000000000000000 -1.977786483776764 0.978030508491796]*/ + a1_fx = 1061816033l /* 1.977786483776764 Q29*/; + a2_fx = -525076131l /*-0.978030508491796 Q29*/; + b1_fx = -1061881538l /*-1.977908496134280 Q29*/; + b2_fx = 530940769l /* 0.988954248067140 Q29*/; + } + ELSE IF( EQ_32( Fs, 16000 ) ) + { + /* hp filter 20Hz at 3dB for 16000KHz sampling rate + [b,a] = butter(2, 20.0/8000.0, 'high'); + b =[ 0.994461788958195 -1.988923577916390 0.994461788958195] + a =[1.000000000000000 -1.988892905899653 0.988954249933127] */ + a1_fx = 1067778748l /* 1.988892905899653 Q29*/; + a2_fx = -530940770l /*-0.988954249933127 Q29*/; + b1_fx = -1067795215l /*-1.988923577916390 Q29*/; + b2_fx = 533897608l /* 0.994461788958195 Q29*/; + } + ELSE IF( EQ_32( Fs, 32000 ) ) + { + /* hp filter 20Hz at 3dB for 32000KHz sampling rate + [b,a] = butter(2, 20.0/16000.0, 'high'); + b =[0.997227049904470 -1.994454099808940 0.997227049904470] + a =[1.000000000000000 -1.994446410541927 0.994461789075954]*/ + a1_fx = 1070760263l /* 1.994446410541927 Q29*/; + a2_fx = -533897608l /*-0.994461789075954 Q29*/; + b1_fx = -1070764392l /*-1.994454099808940 Q29*/; + b2_fx = 535382196l /* 0.997227049904470 Q29*/; + } + ELSE + { + /* hp filter 20Hz at 3dB for 48000KHz sampling rate + [b,a] = butter(2, 20.0/24000.0, 'high'); + b =[ 0.998150511190452 -1.996301022380904 0.998150511190452] + a =[1.000000000000000 -1.996297601769122 0.996304442992686]*/ + a1_fx = 1071754114l /* 1.996297601769122 Q29*/; + a2_fx = -534886875l /*-0.996304442992686 Q29*/; + b1_fx = -1071755951l /*-1.996301022380904 Q29*/; + b2_fx = 535877975l /* 0.998150511190452 Q29*/; + } + move32(); + move32(); + move32(); + move32(); + + Qprev_y1 = extract_l( mem_fx[4] ); + Qprev_y2 = extract_l( mem_fx[5] ); + y1_fx64 = (Word64) mem_fx[0]; + y2_fx64 = (Word64) mem_fx[1]; + x0_fx64 = (Word64) mem_fx[2]; + x1_fx64 = (Word64) mem_fx[3]; + move64(); + move64(); + move64(); + move64(); + + FOR( i = 0; i < lg; i++ ) + { + x2_fx64 = x1_fx64; + x1_fx64 = x0_fx64; + x0_fx64 = (Word64) signal_fx[i]; + move64(); + move64(); + move64(); + + Qy1 = W_norm( y1_fx64 ); + if ( y1_fx64 == 0 ) + { + Qy1 = 62; + move16(); + } + Qy1 = sub( Qy1, 34 ); + R1 = W_mult0_32_32( W_extract_l( W_shl( y1_fx64, Qy1 ) ), a1_fx ); + Qy1 = add( Qy1, Qprev_y1 ); + + Qy2 = W_norm( y2_fx64 ); + if ( y2_fx64 == 0 ) + { + Qy2 = 62; + move16(); + } + Qy2 = sub( Qy2, 34 ); + R2 = W_mult0_32_32( W_extract_l( W_shl( y2_fx64, Qy2 ) ), a2_fx ); + Qy2 = add( Qy2, Qprev_y2 ); + + Qx0 = W_norm( x0_fx64 ); + if ( x0_fx64 == 0 ) + { + Qx0 = 62; + move16(); + } + Qx0 = sub( Qx0, 34 ); + R3 = W_mult0_32_32( W_extract_l( W_shl( x0_fx64, Qx0 ) ), b2_fx ); + + Qx1 = W_norm( x1_fx64 ); + if ( x1_fx64 == 0 ) + { + Qx1 = 62; + move16(); + } + Qx1 = sub( Qx1, 34 ); + R4 = W_mult0_32_32( W_extract_l( W_shl( x1_fx64, Qx1 ) ), b1_fx ); + + Qx2 = W_norm( x2_fx64 ); + if ( x2_fx64 == 0 ) + { + Qx2 = 62; + move16(); + } + Qx2 = sub( Qx2, 34 ); + R5 = W_mult0_32_32( W_extract_l( W_shl( x2_fx64, Qx2 ) ), b2_fx ); + + Qmin = s_min( Qy1, Qy2 ); + + y0_fx64 = W_add( W_shr( R1, sub( Qy1, Qmin ) ), W_shr( R2, sub( Qy2, Qmin ) ) ); + + Qmin = s_min( Qmin, Qx0 ); + Qmin = s_min( Qmin, Qx1 ); + Qmin = s_min( Qmin, Qx2 ); + + y0_fx64 = W_add( W_shr( y0_fx64, sub( s_min( Qy1, Qy2 ), Qmin ) ), W_add( W_shr( R3, sub( Qx0, Qmin ) ), W_add( W_shr( R4, sub( Qx1, Qmin ) ), W_shr( R5, sub( Qx2, Qmin ) ) ) ) ); + + y0_fx64 = W_shr( y0_fx64, 29 ); + + signal_fx[i] = W_extract_l( W_shr( y0_fx64, Qmin ) ); + IF( signal_fx[i] < 0 ) + { + signal_fx[i] = L_add( signal_fx[i], 1 ); + } + + y2_fx64 = y1_fx64; + y1_fx64 = y0_fx64; + Qprev_y2 = Qprev_y1; + Qprev_y1 = Qmin; + move64(); + move64(); + move16(); + move16(); + } + + Qy1 = W_norm( y1_fx64 ); + test(); + IF( y1_fx64 != 0 && LT_16( Qy1, 32 ) ) + { + y1_fx64 = W_shr( y1_fx64, sub( 32, Qy1 ) ); + Qprev_y1 = sub( Qprev_y1, sub( 32, Qy1 ) ); + } + + Qy2 = W_norm( y2_fx64 ); + test(); + IF( y2_fx64 != 0 && LT_16( Qy2, 32 ) ) + { + y2_fx64 = W_shr( y2_fx64, sub( 32, Qy2 ) ); + Qprev_y2 = sub( Qprev_y2, sub( 32, Qy2 ) ); + } + + mem_fx[0] = W_extract_l( y1_fx64 ); + mem_fx[1] = W_extract_l( y2_fx64 ); + mem_fx[2] = W_extract_l( x0_fx64 ); + mem_fx[3] = W_extract_l( x1_fx64 ); + mem_fx[4] = Qprev_y1; + mem_fx[5] = Qprev_y2; + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + + return; +} +#endif diff --git a/lib_com/hq2_core_com_fx.c b/lib_com/hq2_core_com_fx.c index c649e8d17..b00a25aaa 100644 --- a/lib_com/hq2_core_com_fx.c +++ b/lib_com/hq2_core_com_fx.c @@ -91,9 +91,11 @@ void mdct_spectrum_denorm_fx( #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move16(); /* allow overflow happen. */ #endif exp_safe = 4; /* safe bit for overflow */ + move16(); FOR( k = 0; k < bands; k++ ) { @@ -407,7 +409,9 @@ IF( is_transient ) bands_sh = *bands; move16(); *bands = shl( bands_sh, 2 ); + move16(); *length = shl( *length, 2 ); + move16(); FOR( i = 1; i <= 3; i++ ) { @@ -523,6 +527,7 @@ void spt_shorten_domain_pre_fx( } kpos = 0; + move16(); j = 0; move16(); FOR( k = sub( BANDS, SPT_SHORTEN_SBNUM ); k < BANDS; k++ ) @@ -702,9 +707,13 @@ void bit_allocation_second_fx( const Word16 input_frame ) { Word16 k, k2 = 0; + move16(); Word16 ever_bits[BANDS_MAX], ever_sort[BANDS_MAX]; /*Q12 */ Word16 class_flag = 0; + move16(); Word16 rk_temp = 32767, ever_temp = 32767; /*Q12 */ + move16(); + move16(); Word16 exp; Word16 tmp; Word32 L_tmp; diff --git a/lib_com/hq2_noise_inject_fx.c b/lib_com/hq2_noise_inject_fx.c index 9f787fde5..c47bb5cfd 100644 --- a/lib_com/hq2_noise_inject_fx.c +++ b/lib_com/hq2_noise_inject_fx.c @@ -82,6 +82,7 @@ void hq2_noise_inject_fx( Word16 sb = bands; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move16(); #endif satur = 0; @@ -194,6 +195,7 @@ void hq2_noise_inject_fx( } max_pos_pulse = k; + move16(); L_tmp2 = Ep_fx[k]; move32(); L_tmp = L_max( 1, L_tmp2 ); diff --git a/lib_com/hq_bit_allocation_fx.c b/lib_com/hq_bit_allocation_fx.c index 2b798c962..8b476fb07 100644 --- a/lib_com/hq_bit_allocation_fx.c +++ b/lib_com/hq_bit_allocation_fx.c @@ -61,6 +61,7 @@ void ivas_hq_bit_allocation_fx( { /* 'nf_idx' 2-bits index written later */ *num_bits = sub( *num_bits, 2 ); + move16(); } test(); @@ -74,10 +75,12 @@ void ivas_hq_bit_allocation_fx( { *num_bits = sub( *num_bits, HQ_GENERIC_SWB_NBITS ); } + move16(); IF( EQ_16( length, L_SPEC48k ) ) { *num_bits = sub( *num_bits, HQ_GENERIC_FB_NBITS ); + move16(); } } @@ -103,6 +106,7 @@ void ivas_hq_bit_allocation_fx( { /* classification and limit bandwidth for bit allocation */ sfm_limit = sub( sfm_limit, 2 ); + move16(); limit_band_noise_level_calc_fx( wnorm, &sfm_limit, core_brate, noise_level ); /* Detect important band in high frequency region */ @@ -150,6 +154,7 @@ void ivas_hq_bit_allocation_fx( ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || ( EQ_16( hqswb_clas, HQ_TRANSIENT ) && EQ_16( length, L_FRAME32k ) && LE_32( core_brate, HQ_32k ) ) ) { *sum = BitAllocF_fx( wnorm, core_brate, *num_bits, nb_sfm, R, Rsubband, hqswb_clas, num_env_bands ); + move16(); } ELSE IF( EQ_16( length, L_FRAME16k ) && LE_32( core_brate, HQ_32k ) ) { @@ -172,6 +177,7 @@ void ivas_hq_bit_allocation_fx( /* Estimate number of bits per band */ *sum = BitAllocWB_fx( wnorm, *num_bits, nb_sfm, R, Rsubband ); + move16(); } ELSE { @@ -201,22 +207,27 @@ ELSE /* Find last coded core band */ *core_sfm = sub( nb_sfm, 1 ); +move16(); test(); test(); IF( hqswb_clas == HQ_NORMAL || EQ_16( hqswb_clas, HQ_HARMONIC ) ) { *core_sfm = find_last_band_fx( R, nb_sfm ); + move16(); } ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) ) { *core_sfm = find_last_band_fx( R, nb_sfm ); + move16(); IF( LT_16( *core_sfm, num_env_bands ) ) { *core_sfm = sub( num_env_bands, 1 ); + move16(); } } *num_bits = sub( *num_bits, *sum ); +move16(); return; } @@ -352,6 +363,7 @@ void hq_bit_allocation_fx( ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || ( EQ_16( hqswb_clas, HQ_TRANSIENT ) && EQ_16( length, L_FRAME32k ) && LE_32( core_brate, HQ_32k ) ) ) { *sum = BitAllocF_fx( wnorm, core_brate, *num_bits, nb_sfm, R, Rsubband, hqswb_clas, num_env_bands ); + move16(); } ELSE IF( EQ_16( length, L_FRAME16k ) && EQ_32( core_brate, HQ_32k ) ) { @@ -376,6 +388,7 @@ void hq_bit_allocation_fx( /* Estimate number of bits per band */ *sum = BitAllocWB_fx( wnorm, *num_bits, nb_sfm, R, Rsubband ); + move16(); } ELSE { @@ -405,22 +418,27 @@ void hq_bit_allocation_fx( /* Find last coded core band */ *core_sfm = sub( nb_sfm, 1 ); + move16(); test(); test(); IF( hqswb_clas == HQ_NORMAL || EQ_16( hqswb_clas, HQ_HARMONIC ) ) { *core_sfm = find_last_band_fx( R, nb_sfm ); + move16(); } ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) ) { *core_sfm = find_last_band_fx( R, nb_sfm ); + move16(); IF( LT_16( *core_sfm, num_env_bands ) ) { *core_sfm = sub( num_env_bands, 1 ); + move16(); } } *num_bits = sub( *num_bits, *sum ); + move16(); return; } diff --git a/lib_com/hq_conf.c b/lib_com/hq_conf.c index c027eb700..4dfe55d80 100644 --- a/lib_com/hq_conf.c +++ b/lib_com/hq_conf.c @@ -277,6 +277,7 @@ void hq_configure_fx( Word16 i, bw_ext; bw_ext = 0; + move16(); *start_norm = 0; move16(); @@ -521,10 +522,13 @@ void hq_configure_fx( { /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/ sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 ); + move16(); /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/ sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 ); + move16(); /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/ sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 ); + move16(); } *nb_sfm = *num_sfm; *num_env_bands = *num_sfm; @@ -539,6 +543,7 @@ void hq_configure_fx( } *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) ); + move16(); return; } diff --git a/lib_com/hq_conf_fx.c b/lib_com/hq_conf_fx.c index 459665882..bed185ae1 100644 --- a/lib_com/hq_conf_fx.c +++ b/lib_com/hq_conf_fx.c @@ -285,10 +285,13 @@ void ivas_hq_configure_fx( { /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/ sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 ); + move16(); /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/ sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 ); + move16(); /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/ sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 ); + move16(); } *nb_sfm = *num_sfm; *num_env_bands = *num_sfm; @@ -303,6 +306,7 @@ void ivas_hq_configure_fx( } *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) ); + move16(); return; } @@ -577,10 +581,13 @@ void hq_configure_evs_fx( { /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/ sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 ); + move16(); /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/ sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 ); + move16(); /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/ sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 ); + move16(); } *nb_sfm = *num_sfm; *num_env_bands = *num_sfm; @@ -595,6 +602,7 @@ void hq_configure_evs_fx( } *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) ); + move16(); return; } diff --git a/lib_com/hq_tools_fx.c b/lib_com/hq_tools_fx.c index 7e6ab6dfb..ae3468c9a 100644 --- a/lib_com/hq_tools_fx.c +++ b/lib_com/hq_tools_fx.c @@ -125,6 +125,7 @@ void hq_swb_harmonic_calc_norm_envelop_fx( /* Apply MA filter */ L_envelope[env_index] = L_deposit_l( EPSILLON_FX ); + move32(); FOR( n_lag = 0; n_lag < n_lag_now; n_lag++ ) { L_tmp = L_abs( L_SWB_signal[add( n_freq, n_lag )] ); @@ -469,6 +470,7 @@ void apply_noisefill_HQ_fx( { /*coeff[j] = cb_buff[j - istart] * E_corr; */ coeff[j] = extract_h( L_shl( L_mult( cb_buff[j - istart], E_corr ), 2 ) ); /*Q12 (12+13+1+2-16) */ + move16(); } } ELSE @@ -542,6 +544,7 @@ void harm_bwe_fine_fx( FOR( i = sfm_start[sfm]; i < sfm_end[sfm]; i++ ) { coeff_out[i] = L_deposit_l( 0 ); + move16(); } } } @@ -765,6 +768,7 @@ void hq_fold_bwe_fx( src = coeff + sfm_end[last_sfm] - 1; first_coeff = sfm_end[last_sfm]; + move16(); dst = coeff + sfm_end[last_sfm]; end = coeff + sfm_end[num_sfm - 1]; @@ -851,6 +855,7 @@ void ivas_harm_bwe_fx( Word32 normq, L_tmp, L_tmp2; Word32 E_L; Word16 alfa = 16384; + move16(); Word16 tmp, tmp1, exp1; Word16 beta; Word32 *src, *dst; @@ -1035,6 +1040,7 @@ void harm_bwe_fx( Word32 normq, L_tmp, L_tmp2; Word32 E_L; Word16 alfa = 16384; + move16(); Word16 tmp, tmp1, exp1; Word16 beta; Word32 *src, *dst; @@ -1061,9 +1067,11 @@ void harm_bwe_fx( /* shaping the BWE spectrum further by envelopes and noise factors */ L_tmp = L_mult( 29491, prev_noise_level[0] ); /* 15 +1 +15 */ noise_level[0] = round_fx( L_mac( L_tmp, 3277, noise_level[0] ) ); /*15 */ + move16(); L_tmp = L_mult( 29491, prev_noise_level[1] ); noise_level[1] = round_fx( L_mac( L_tmp, 3277, noise_level[1] ) ); + move16(); test(); IF( prev_hq_mode == HQ_NORMAL || EQ_16( prev_hq_mode, HQ_GEN_SWB ) ) @@ -1221,7 +1229,9 @@ void hvq_bwe_fx( Word32 L_normq; Word32 L_E; Word32 L_tmp_norm = 0; + move32(); Word16 bwe_noise_th = 0; + move16(); Word16 peak_band, low, high, sel_norm; Word16 norm_ind; Word32 *L_src, *L_dst; @@ -1248,6 +1258,8 @@ void hvq_bwe_fx( /* shaping the BWE spectrum further by envelopes and noise factors */ noise_level[0] = round_fx( L_mac( L_mult( 29491, prev_noise_level[0] ), 3277, noise_level[0] ) ); /* Q15 (15+15+1-16) */ noise_level[1] = round_fx( L_mac( L_mult( 29491, prev_noise_level[1] ), 3277, noise_level[1] ) ); /* Q15 (15+15+1-16) */ + move16(); + move16(); test(); IF( prev_hq_mode == HQ_NORMAL || EQ_16( prev_hq_mode, HQ_GEN_SWB ) ) @@ -2116,7 +2128,9 @@ void hq_wb_nf_bwe_fx( } /* calculate the peak-average ratio of saturable subbands */ num = 0; + move16(); sharp_fx = 0; + move16(); FOR( sfm = last_sfm; sfm >= 8; sfm-- ) { tmp = shl( sfmsize[sfm], 9 ); /*Q9 */ @@ -2491,6 +2505,7 @@ void hq_wb_nf_bwe_fx( Copy32( L_normq_v, prev_normq_fx, SFM_N_WB ); Copy32( L_coeff_out + L_FRAME16k - L_HQ_WB_BWE, prev_coeff_out_fx, L_HQ_WB_BWE ); *prev_R = R[SFM_N_WB - 1]; + move16(); return; } @@ -2520,6 +2535,7 @@ void enforce_zero_for_min_envelope_fx( FOR( j = sfm_start[0]; j < sfm_end[0]; j++ ) { L_coefsq[j] = L_deposit_l( 0 ); + move32(); } } @@ -2530,6 +2546,7 @@ void enforce_zero_for_min_envelope_fx( FOR( j = sfm_start[i]; j < sfm_end[i]; j++ ) { L_coefsq[j] = L_deposit_l( 0 ); + move32(); } } } diff --git a/lib_com/hvq_pvq_bitalloc_fx.c b/lib_com/hvq_pvq_bitalloc_fx.c index 43e014ce9..487aaf2ea 100644 --- a/lib_com/hvq_pvq_bitalloc_fx.c +++ b/lib_com/hvq_pvq_bitalloc_fx.c @@ -50,6 +50,7 @@ Word16 hvq_pvq_bitalloc_fx( { num_sfm = SFM_N_HARM; } + move16(); IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) ) { @@ -159,6 +160,7 @@ Word16 hvq_pvq_bitalloc_fx( IF( EQ_16( band_len_harm[k_max], 96 ) ) { n = 61; + move16(); } ELSE { @@ -172,6 +174,7 @@ Word16 hvq_pvq_bitalloc_fx( sel_bands[*n_sel_bands] = k_max; move16(); *n_sel_bands = add( *n_sel_bands, 1 ); + move16(); R[k_max] = 1; /* Mark that the band has been encoded for fill_spectrum */ move16(); } diff --git a/lib_com/ifft_rel.c b/lib_com/ifft_rel.c index ff67fd3e4..c1e868716 100644 --- a/lib_com/ifft_rel.c +++ b/lib_com/ifft_rel.c @@ -309,6 +309,7 @@ void ifft_rel_fx( Word16 tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move16(); #endif @@ -1034,6 +1035,7 @@ void ifft_rel_fx32( const Word16 *idx; Word32 temp[512]; Word16 n_inv = 128; + move16(); SWITCH( n ) { @@ -1050,6 +1052,7 @@ void ifft_rel_fx32( assert( 0 ); BREAK; } + move16(); /*-----------------------------------------------------------------* * IFFT @@ -1060,11 +1063,13 @@ void ifft_rel_fx32( FOR( k = 1; k < m; k++ ) { is = 0; + move16(); id = n2; + move16(); n2 = shr( n2, 1 ); n4 = shr( n2, 2 ); n8 = shr( n4, 1 ); - WHILE( LT_16( is, n - 1 ) ) + WHILE( LT_16( is, sub( n, 1 ) ) ) { xi1 = x + is + 1; xi2 = xi1 + n4; @@ -1075,32 +1080,42 @@ void ifft_rel_fx32( { t1 = L_sub( *xi1, *xi3 ); *xi1 = L_add( *xi1, *xi3 ); + move32(); *xi2 = L_shl( *xi2, 1 ); + move32(); *xi3 = L_sub( t1, L_shl( *xi4, 1 ) ); + move32(); *xi4 = L_add( t1, L_shl( *xi4, 1 ) ); - IF( n4 != 1 ) + move32(); + IF( NE_16( n4, 1 ) ) { t1 = Mpy_32_16_1( L_sub( *( xi2 + n8 ), *( xi1 + n8 ) ), INV_SQRT_2_16 ); t2 = Mpy_32_16_1( L_add( *( xi4 + n8 ), *( xi3 + n8 ) ), INV_SQRT_2_16 ); *( xi1 + n8 ) = L_add( *( xi1 + n8 ), *( xi2 + n8 ) ); + move32(); *( xi2 + n8 ) = L_sub( *( xi4 + n8 ), *( xi3 + n8 ) ); + move32(); *( xi3 + n8 ) = L_shl( L_negate( L_add( t2, t1 ) ), 1 ); + move32(); *( xi4 + n8 ) = L_shl( L_sub( t1, t2 ), 1 ); + move32(); } xi1 += id; xi2 += id; xi3 += id; xi4 += id; } - is = 2 * id - n2; - id = 4 * id; + is = sub( shl( id, 1 ), n2 ); + id = shl( id, 2 ); } + /*Can be acheived with a shr */ step = N_MAX_FFT / n2; + move16(); s = sincos_t_ext_fx + step; c = s + N_MAX_FFT / 4; - s3 = sincos_t_ext_fx + 3 * step; + s3 = sincos_t_ext_fx + imult1616( 3, step ); c3 = s3 + N_MAX_FFT / 4; FOR( j = 2; j <= n8; j++ ) { @@ -1110,51 +1125,61 @@ void ifft_rel_fx32( ss3 = *s3; is = 0; - id = 2 * n2; + move16(); + id = shl( n2, 1 ); + move16(); c += step; s += step; - c3 += 3 * step; - s3 += 3 * step; - WHILE( LT_16( is, n - 1 ) ) + c3 += imult1616( 3, step ); + s3 += imult1616( 3, step ); + WHILE( LT_16( is, sub( n, 1 ) ) ) { - xup1 = x + j + is; - xup3 = xup1 + 2 * n4; - xdn6 = xup3 - 2 * j + 2; - xdn8 = xdn6 + 2 * n4; + xup1 = x + add( j, is ); + xup3 = xup1 + shl( n4, 1 ); + xdn6 = xup3 - sub( shl( j, 1 ), 2 ); + xdn8 = xdn6 + shl( n4, 1 ); FOR( i = is; i < n; i += id ) { t1 = L_sub( *xup1, *xdn6 ); *xup1 = L_add( *xup1, *xdn6 ); + move32(); xup1 += n4; xdn6 -= n4; t2 = L_sub( *xdn6, *xup1 ); *xdn6 = L_add( *xup1, *xdn6 ); + move32(); xdn6 += n4; t3 = L_add( *xdn8, *xup3 ); *xdn6 = L_sub( *xdn8, *xup3 ); + move32(); xup3 += n4; xdn8 -= n4; t4 = L_add( *xup3, *xdn8 ); *xup1 = L_sub( *xup3, *xdn8 ); + move32(); t5 = L_sub( t1, t4 ); t1 = L_add( t1, t4 ); t4 = L_sub( t2, t3 ); t2 = L_add( t2, t3 ); *xup3 = L_sub( Mpy_32_16_1( t1, cc3 ), Mpy_32_16_1( t2, ss3 ) ); + move32(); xup3 -= n4; *xup3 = L_add( Mpy_32_16_1( t5, cc1 ), Mpy_32_16_1( t4, ss1 ) ); + move32(); *xdn8 = L_sub( Mpy_32_16_1( t5, ss1 ), Mpy_32_16_1( t4, cc1 ) ); + move32(); xdn8 += n4; *xdn8 = L_add( Mpy_32_16_1( t2, cc3 ), Mpy_32_16_1( t1, ss3 ) ); + move32(); xup1 -= n4; xup1 += id; @@ -1162,7 +1187,7 @@ void ifft_rel_fx32( xdn6 += id; xdn8 += id; } - is = shl( id, 1 ) - n2; + is = sub( shl( id, 1 ), n2 ); id = shl( id, 2 ); } } @@ -1173,7 +1198,9 @@ void ifft_rel_fx32( *-----------------------------------------------------------------*/ is = 1; + move16(); id = 4; + move16(); WHILE( LT_16( is, n ) ) { xi0 = x + is; @@ -1182,12 +1209,15 @@ void ifft_rel_fx32( FOR( i0 = is; i0 <= n; i0 += id ) { r1 = *xi0; + move32(); *xi0 = L_add( r1, *xi1 ); + move32(); *xi1 = L_sub( r1, *xi1 ); + move32(); xi0 += id; xi1 += id; } - is = shl( id, 1 ) - 1; + is = sub( shl( id, 1 ), 1 ); id = shl( id, 2 ); } @@ -1203,6 +1233,7 @@ void ifft_rel_fx32( { j = *idx++; temp[i] = x[1 + shr( j, 1 )]; + move32(); } } ELSE IF( EQ_16( n, 256 ) ) @@ -1211,6 +1242,7 @@ void ifft_rel_fx32( { j = *idx++; temp[i] = x[1 + j]; + move32(); } } ELSE IF( EQ_16( n, 512 ) ) @@ -1219,7 +1251,9 @@ void ifft_rel_fx32( { j = *idx++; temp[i] = x[1 + 2 * j]; + move32(); temp[i + 256] = x[2 + 2 * j]; + move32(); } } ELSE @@ -1233,6 +1267,9 @@ void ifft_rel_fx32( xt = x[j]; x[j] = x[i]; x[i] = xt; + move32(); + move32(); + move32(); } k = shr( n, 1 ); WHILE( LT_16( k, j ) ) @@ -1251,6 +1288,7 @@ void ifft_rel_fx32( FOR( i = 1; i <= n; i++ ) { x[i] = Mpy_32_16_1( xi0[i], n_inv ); + move32(); } return; diff --git a/lib_com/igf_base_fx.c b/lib_com/igf_base_fx.c index 1b9f44d63..ac1a1bcde 100644 --- a/lib_com/igf_base_fx.c +++ b/lib_com/igf_base_fx.c @@ -455,8 +455,10 @@ static void IGF_gridSetUp( H_IGF_GRID hGrid, /**< ou tmp2 = norm_s( frameLength ); bandwidth = shl( frameLength, tmp2 ); hGrid->swb_offset_len = extract_l( L_shr( sampleRate, 2 ) ); + move16(); tmp1 = sub( norm_s( hGrid->swb_offset_len ), 1 ); hGrid->swb_offset_len = shl( hGrid->swb_offset_len, tmp1 ); + move16(); bandwidth = div_s( hGrid->swb_offset_len, bandwidth ); tmp2 = sub( add( tmp2, 1 ), tmp1 ); bandwidth = shr( bandwidth, sub( 15, tmp2 ) ); @@ -467,12 +469,15 @@ static void IGF_gridSetUp( H_IGF_GRID hGrid, /**< ou hGrid->startSfb = 0; move16(); hGrid->stopSfb = sub( hGrid->swb_offset_len, 1 ); + move16(); hGrid->startLine = hGrid->swb_offset[hGrid->startSfb]; move16(); hGrid->stopLine = hGrid->swb_offset[hGrid->stopSfb]; move16(); hGrid->startFrequency = imult1616( bandwidth, hGrid->startLine ); + move16(); hGrid->stopFrequency = imult1616( bandwidth, hGrid->stopLine ); + move16(); L_tmp1 = L_mult0( igfMinFq, frameLength ); tmp1 = sub( norm_l( L_tmp1 ), 1 ); @@ -484,10 +489,14 @@ static void IGF_gridSetUp( H_IGF_GRID hGrid, /**< ou hGrid->minSrcSubband = div_s( extract_h( L_tmp1 ), extract_h( L_tmp2 ) ); hGrid->minSrcSubband = shr( hGrid->minSrcSubband, tmp1 ); + move16(); + move16(); hGrid->minSrcSubband = add( hGrid->minSrcSubband, s_and( hGrid->minSrcSubband, 1 ) ); + move16(); hGrid->minSrcFrequency = imult1616( bandwidth, hGrid->minSrcSubband ); + move16(); hGrid->infoGranuleLen = frameLength; move16(); hGrid->infoTransFac = transFac; @@ -528,59 +537,91 @@ static void IGF_gridSetUp( H_IGF_GRID hGrid, /**< ou case IGF_BITRATE_RF_WB_13200: hGrid->nTiles = 2; + move16(); wrp_sfb = 2; + move16(); /*1st*/ hGrid->sfbWrap[0 + 1] = wrp_sfb; + move16(); hGrid->sbWrap[0] = hGrid->minSrcSubband; + move16(); hGrid->tile[0 + 1] = hGrid->swb_offset[wrp_sfb]; + move16(); /*2nd*/ hGrid->sfbWrap[1 + 1] = hGrid->stopSfb; + move16(); hGrid->sbWrap[1] = hGrid->minSrcSubband; + move16(); hGrid->tile[1 + 1] = hGrid->swb_offset[hGrid->stopSfb]; + move16(); BREAK; case IGF_BITRATE_SWB_9600: hGrid->nTiles = 3; + move16(); wrp_sfb = 1; + move16(); /*1st*/ hGrid->sfbWrap[0 + 1] = wrp_sfb; + move16(); hGrid->sbWrap[0] = hGrid->minSrcSubband; + move16(); hGrid->tile[0 + 1] = hGrid->swb_offset[wrp_sfb]; + move16(); /*2nd*/ wrp_sfb = 2; + move16(); hGrid->sfbWrap[1 + 1] = wrp_sfb; + move16(); hGrid->sbWrap[1] = hGrid->minSrcSubband + IGF_ApplyTransFac( 32, transFac ); + move16(); hGrid->tile[1 + 1] = hGrid->swb_offset[wrp_sfb]; + move16(); /*3rd*/ hGrid->sfbWrap[2 + 1] = hGrid->stopSfb; + move16(); hGrid->sbWrap[2] = hGrid->minSrcSubband + IGF_ApplyTransFac( 46, transFac ); + move16(); hGrid->tile[2 + 1] = hGrid->swb_offset[hGrid->stopSfb]; + move16(); BREAK; case IGF_BITRATE_RF_SWB_13200: hGrid->nTiles = 3; + move16(); wrp_sfb = 1; + move16(); /*1st*/ hGrid->sfbWrap[0 + 1] = wrp_sfb; + move16(); hGrid->sbWrap[0] = hGrid->minSrcSubband; + move16(); hGrid->tile[0 + 1] = hGrid->swb_offset[wrp_sfb]; + move16(); /*2nd*/ wrp_sfb = 2; + move16(); hGrid->sfbWrap[1 + 1] = wrp_sfb; + move16(); hGrid->sbWrap[1] = hGrid->minSrcSubband + IGF_ApplyTransFac( 32, transFac ); + move16(); hGrid->tile[1 + 1] = hGrid->swb_offset[wrp_sfb]; + move16(); /*3rd*/ hGrid->sfbWrap[2 + 1] = hGrid->stopSfb; + move16(); hGrid->sbWrap[2] = hGrid->minSrcSubband + IGF_ApplyTransFac( 46, transFac ); + move16(); hGrid->tile[2 + 1] = hGrid->swb_offset[hGrid->stopSfb]; + move16(); BREAK; @@ -869,19 +910,26 @@ static void IGF_gridSetUp_ivas_fx( /* inits */ swb_offset = NULL; swb_offset_len = 0; + move16(); + + test(); + test(); IF( EQ_16( transFac, 8192 ) && EQ_16( bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) ) { bitRateIndex = IGF_BITRATE_SWB_48000_CPE_TCX10; + move16(); } ELSE IF( EQ_16( transFac, 8192 ) && EQ_16( bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) { bitRateIndex = IGF_BITRATE_FB_48000_CPE_TCX10; + move16(); } IF( NE_16( bitRateIndex, IGF_BITRATE_UNKNOWN ) ) { swb_offset = &swb_offset_LB_new[bitRateIndex][1]; swb_offset_len = swb_offset_LB_new[bitRateIndex][0]; + move16(); Copy( &igf_whitening_TH_ivas_fx[bitRateIndex][0][0], &hGrid->whiteningThreshold[0][0], IGF_MAX_TILES * 2 ); } ELSE @@ -892,29 +940,41 @@ static void IGF_gridSetUp_ivas_fx( FOR( sfb = 0; sfb < swb_offset_len; sfb++ ) { hGrid->swb_offset[sfb] = IGF_ApplyTransFac( swb_offset[sfb], transFac ); + move16(); } FOR( sfb = swb_offset_len; sfb < IGF_MAX_SFB; sfb++ ) { hGrid->swb_offset[sfb] = 0; + move16(); } hGrid->infoIsRefined = 0; + move16(); frameLength = IGF_ApplyTransFac( frameLength, transFac ); tmp2 = norm_s( frameLength ); bandwidth_fx = shl( frameLength, tmp2 ); hGrid->swb_offset_len = extract_l( L_shr( sampleRate, 2 ) ); + move16(); tmp1 = sub( norm_s( hGrid->swb_offset_len ), 1 ); hGrid->swb_offset_len = shl( hGrid->swb_offset_len, tmp1 ); + move16(); bandwidth_fx = div_s( hGrid->swb_offset_len, bandwidth_fx ); tmp2 = sub( add( tmp2, 1 ), tmp1 ); bandwidth_fx = shr( bandwidth_fx, sub( 15, tmp2 ) ); hGrid->swb_offset_len = swb_offset_len; + move16(); hGrid->startSfb = 0; + move16(); hGrid->stopSfb = sub( hGrid->swb_offset_len, 1 ); + move16(); hGrid->startLine = hGrid->swb_offset[hGrid->startSfb]; + move16(); hGrid->stopLine = hGrid->swb_offset[hGrid->stopSfb]; + move16(); hGrid->startFrequency = imult1616( bandwidth_fx, hGrid->startLine ); + move16(); hGrid->stopFrequency = imult1616( bandwidth_fx, hGrid->stopLine ); + move16(); L_tmp1 = L_mult0( igfMinFq, frameLength ); tmp1 = sub( norm_l( L_tmp1 ), 1 ); L_tmp1 = L_shl( L_tmp1, tmp1 ); @@ -922,28 +982,44 @@ static void IGF_gridSetUp_ivas_fx( L_tmp2 = L_shl( sampleRate, tmp2 ); tmp1 = add( WORD16_BITS - 1, sub( tmp1, add( tmp2, 1 ) ) ); /* takes into account sampleRate >> 1 */ hGrid->minSrcSubband = div_s( extract_h( L_tmp1 ), extract_h( L_tmp2 ) ); + move16(); hGrid->minSrcSubband = shr( hGrid->minSrcSubband, tmp1 ); + move16(); hGrid->minSrcSubband = add( hGrid->minSrcSubband, s_and( hGrid->minSrcSubband, 1 ) ); + move16(); hGrid->minSrcFrequency = imult1616( bandwidth_fx, hGrid->minSrcSubband ); + move16(); hGrid->infoGranuleLen = frameLength; + move16(); hGrid->sfbWrap[0] = 0; + move16(); hGrid->tile[0] = hGrid->startLine; + move16(); igf_tile_offset = &igf_tile_offset_table[bitRateIndex][1]; hGrid->nTiles = igf_tile_offset_table[bitRateIndex][0]; + move16(); hGrid->tile[0] = hGrid->startLine; + move16(); hGrid->sfbWrap[0] = 0; + move16(); FOR( k = 0; k < hGrid->nTiles; k++ ) { hGrid->sfbWrap[k + 1] = igf_tile_offset[2 * k]; + move16(); hGrid->sbWrap[k] = add( hGrid->minSrcSubband, IGF_ApplyTransFac( igf_tile_offset[2 * k + 1], transFac ) ); + move16(); hGrid->tile[k + 1] = hGrid->swb_offset[igf_tile_offset[2 * k]]; + move16(); } FOR( t = hGrid->nTiles + 1; t < IGF_MAX_TILES; t++ ) { hGrid->tile[t] = 0; + move16(); hGrid->sbWrap[t - 1] = 0; + move16(); hGrid->sfbWrap[t] = 0; + move16(); } /* adapt level envelope: */ @@ -1008,7 +1084,6 @@ static void IGF_gridSetUp_ivas_fx( hGrid->gFactor = 16384 /*1.00f Q14*/; move16(); hGrid->fFactor = 0; /*0.00f Q30*/ - ; move16(); hGrid->lFactor = 16384 /*1.00f Q14*/; move16(); @@ -1047,11 +1122,14 @@ void IGFCommonFuncsCalcSfbEnergyPowerSpec( const Word16 startSfb, /**< in #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; Flag Carry = 0; + move16(); + move16(); #endif FOR( sfb = startSfb; sfb < stopSfb; sfb++ ) { sfbEnergy[sfb] = L_deposit_l( 0 ); + move16(); } IF( NULL == pPowerSpectrum ) { @@ -1064,6 +1142,7 @@ void IGFCommonFuncsCalcSfbEnergyPowerSpec( const Word16 startSfb, /**< in FOR( line = swb_offset[sfb]; line < swb_offset[sfb + 1]; line++ ) { Carry = 0; + move16(); #ifdef BASOP_NOGLOB sfbEnergy[sfb] = L_add_co( sfbEnergy[sfb], pPowerSpectrum[line], &Carry, &Overflow ); #else /* BASOP_NOGLOB */ @@ -1071,6 +1150,7 @@ void IGFCommonFuncsCalcSfbEnergyPowerSpec( const Word16 startSfb, /**< in #endif /* BASOP_NOGLOB */ move32(); Overflow = 0; + move16(); #ifdef BASOP_NOGLOB L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); #else /* BASOP_NOGLOB */ @@ -1233,7 +1313,9 @@ Word16 IGFCommonFuncsIGFConfiguration( //100820 temp fix #endif hIGFInfo->nfSeedBuf[0] = 0; + move16(); hIGFInfo->nfSeedBuf[1] = 0; + move16(); hIGFInfo->nfSeed = &hIGFInfo->nfSeedBuf[0]; move16(); @@ -1314,7 +1396,9 @@ Word16 IGFCommonFuncsIGFConfiguration_ivas_fx( //100820 temp fix #endif hIGFInfo->nfSeedBuf[0] = 0; + move16(); hIGFInfo->nfSeedBuf[1] = 0; + move16(); hIGFInfo->nfSeed = &hIGFInfo->nfSeedBuf[0]; move16(); @@ -1371,12 +1455,14 @@ Word16 IGFCommonFuncsIGFGetCFTables( Word16 bitRateIndex; retValue = 0; /* bitrate index is unknown -> error! */ + move16(); bitRateIndex = IGF_MapBitRateToIndex( total_brate, bwidth, element_mode, rf_mode ); IF( bitRateIndex != IGF_BITRATE_UNKNOWN ) { retValue = 1; /* no error */ + move16(); SWITCH( bitRateIndex ) { diff --git a/lib_com/index_pvq_opt_fx.c b/lib_com/index_pvq_opt_fx.c index 713c2afb0..2f75d8ac8 100644 --- a/lib_com/index_pvq_opt_fx.c +++ b/lib_com/index_pvq_opt_fx.c @@ -191,6 +191,7 @@ static UWord32 direct_msize_fx( Word16 dim_in, Word16 k_in ) UWord32 UL_msize, k, ksq; UL_msize = 1; /* k==0 or dim==1 , and base fot other dims */ + move32(); IF( k_in != 0 ) { k = UL_deposit_l( k_in ); /*k = (UWord32) k_in;*/ @@ -226,7 +227,9 @@ static void initOffsets_fx( Word16 dim_in, UWord32 *h_mem, Word16 k_val_in ) h_mem[0] = UL_deposit_l( 0 ); /* A(=>0,k=0) */ + move32(); h_mem[1] = UL_deposit_l( 1 ); /* A(*,k=1) */ + move32(); UL_k_val_in = UL_deposit_l( k_val_in ); IF( EQ_16( dim_in, 2 ) ) @@ -360,6 +363,7 @@ static void a_u_fwd_fx( UWord32 *a_u_in, u_kp1 = UL_lshr( a_u_in[k_val_in], 1 ); a_u_in[mem_size_m1] = UL_addNsD( 1U, UL_addNsD( u_kp1_prev, UL_addNsD( u_k_prev, u_kp1 ) ) ); + move32(); return; } @@ -381,7 +385,9 @@ static UWord32 nm_h_prep_opt_fx( /* o: msize for dim */ Word16 end_loop, add_last_odd; h[0] = UL_deposit_l( 0 ); /* % A(=>0,k=0) */ + move32(); h[1] = UL_deposit_l( 1 ); /* % A(*,k=1) */ + move32(); mem_size_m1 = add( k_val_in, 1 ); @@ -490,6 +496,7 @@ static Word16 find_amp_split_offset_func_mem_fx( /* o: found k_value */ UWord32 *UL_tmp_offset ) /* o: offset found */ { Word16 not_ready, low, k_test = 0; + move16(); UWord16 sgn; UWord32 UL_tmp; /* split over A(n,k) = h_mem(k), or use direct A function evaluation */ @@ -504,6 +511,7 @@ static Word16 find_amp_split_offset_func_mem_fx( /* o: found k_value */ { k_test = shr( add( low, high ), 1 ); /*% split range in half */ *UL_tmp_offset = ( *h_func_ptr )( UL_deposit_l( k_test ) ); /* call direct A offset-function */ + move32(); UL_tmp = UL_subNs( *UL_tmp_offset, ind_in, &sgn ); IF( sgn ) @@ -548,6 +556,7 @@ static Word16 get_lead_sign_fx( UWord32 *ind ) move16(); } ( *ind ) = UL_lshr( *ind, 1 ); + move32(); return leading_sign; } @@ -566,6 +575,7 @@ static void mind2vec_one_fx( /* NB input k_val_in can be zero */ /* *vec_out = leading_sign*k_val_in; */ *vec_out = (Word16) ind; /* dummy assignment to avoid gcc "unused parameter" warning for ind, i.e no move16() needed */ + move16(); /* *vec_out = extract_l(L_mult0(leading_sign,k_val_in)); move16(); // 3 ops */ if ( leading_sign < 0 ) @@ -623,6 +633,7 @@ static Word16 setval_update_sign_fx( Word16 k_delta, { mind2vec_one_fx( k_delta, *leading_sign, *ind_in, vec_out ); *leading_sign = get_lead_sign_fx( ind_in ); + move16(); k_max_local = sub( k_max_local, k_delta ); } return k_max_local; @@ -874,12 +885,16 @@ static void vec2mind_one_fx( ) { *ind = (Word32) ( *k_val_out_ptr ); /* dummy assignment to avoid gcc "unused parameter" warning for *k_val_out_ptr, i.e no move32 needed() */ + move32(); *ind = UL_deposit_l( 0 ); + move32(); *next_sign_ind = UL_deposit_l( 0 ); + move32(); if ( *vec_in < 0 ) { *next_sign_ind = UL_deposit_l( 1 ); /*single basicop */ + move32(); } return; } @@ -903,8 +918,10 @@ static void vec2mind_two_fx( *k_val_out_ptr = abs01; move16(); /* can be zero */ *ind = UL_deposit_l( 0 ); /* [KMAX 0 ] , and dual zeros */ + move32(); *next_sign_ind = UL_deposit_h( SIGNBIT_SHRT_FX ); /* "unset" sign flag set */ /* dual zeroes can happen in a recursive encoding call */ + move32(); IF( abs01 != 0 ) @@ -912,6 +929,7 @@ static void vec2mind_two_fx( sptr = 0; move16(); /*used as ptr to vec0 or vec1 value */ *next_sign_ind = UL_deposit_l( sptr ); + move32(); test(); IF( abs0 != 0 && abs1 != 0 ) @@ -933,6 +951,7 @@ static void vec2mind_two_fx( { /* [ 0 KMAX]*/ *ind = UL_deposit_l( (UWord16) sub( lshl( abs1, 1 ), 1 ) ); + move32(); sptr = 1; move16(); } @@ -942,6 +961,7 @@ static void vec2mind_two_fx( if ( vec_in[sptr] < 0 ) { *next_sign_ind = UL_deposit_l( 1 ); /*single instruction */ + move32(); } } return; @@ -958,6 +978,7 @@ static void enc_push_sign( Word16 val, UWord32 *next_sign_ind, UWord32 *index ) IF( ( UL_and( *next_sign_ind, SIGNBIT_FX ) == 0 ) && ( val != 0 ) ) { *index = UL_addNsD( UL_lshl( *index, 1 ), *next_sign_ind ); + move32(); } /* push sign to next non_zero position */ @@ -965,10 +986,12 @@ static void enc_push_sign( Word16 val, UWord32 *next_sign_ind, UWord32 *index ) if ( val < 0 ) { *next_sign_ind = UL_deposit_l( 1 ); /* single basicop */ + move32(); } if ( val > 0 ) { *next_sign_ind = UL_deposit_l( 0 ); /* single basicop */ + move32(); } } @@ -997,8 +1020,10 @@ static void vec2mind_gen345_fx( move32(); /* adaptive function call setup */ *index = UL_addNsD( *index, ( *a_func_ptr )( UL_deposit_l( *k_val_out_ptr ) ) ); + move32(); *k_val_out_ptr = add( *k_val_out_ptr, abs_s( tmp_val ) ); + move16(); return; } @@ -1075,6 +1100,7 @@ static void vec2mind_fx( Word16 dim_in, /* i : dim mem_size_m1 = add( k_val_in, 1 ); *next_sign_ind = UL_deposit_h( SIGNBIT_SHRT_FX ); /* highest bit set signals no sign found yet, should always be 0 or 1 out, */ + move32(); pos = sub( dim_in, 2 ); /* adress 2nd last sample */ vec2mind_two_fx( &vec_in[pos], &k_val_acc, next_sign_ind, index ); @@ -1090,6 +1116,7 @@ static void vec2mind_fx( Word16 dim_in, /* i : dim /* now add indexing offset up to this reverse (r_l) accumulated amplitude point */ *index = UL_addNsD( *index, tmp_h ); /* k_val_acc==0 ==>0 */ + move32(); /* k_val_acc = k_val_acc + vec_abs[pos];*/ /* now increase acc k value for next N */ k_val_acc = add( k_val_acc, abs_s( tmp_val ) ); diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 126cc3d1c..c8fa4f9e8 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1283,6 +1283,9 @@ enum #define MASA_NO_POINTS_EQUATOR 430 #define MASA_NO_CIRCLES 121 +#ifdef IVAS_FLOAT_FIXED +#define MASA_NO_CIRCLES_Q23 ( 1015021568 ) +#endif #define MASA_ASIN_OFFSET 0.0064471690266724975f #define MASA_ASIN_OFFSET_Q15 ( 211 ) #define MASA_NTOT2_FAC 32768.00566947353f diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 3b70fd7df..e2d4abf3f 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -43,6 +43,9 @@ #include "prot_fx1.h" #include "prot_fx2.h" #include "ivas_prot_fx.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*-----------------------------------------------------------------------* * Local function prototypes diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index 60caa2e17..a72aba04a 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -41,6 +41,9 @@ #include "ivas_prot_fx.h" #include "prot_fx1.h" #include "prot_fx2.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*------------------------------------------------------------------------------------------* diff --git a/lib_com/ivas_lfe_com.c b/lib_com/ivas_lfe_com.c index 123981394..99c7741c3 100644 --- a/lib_com/ivas_lfe_com.c +++ b/lib_com/ivas_lfe_com.c @@ -44,6 +44,9 @@ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*-----------------------------------------------------------------------------------------* diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c index 388dd6a60..dbcda4b56 100644 --- a/lib_com/ivas_masa_com.c +++ b/lib_com/ivas_masa_com.c @@ -195,7 +195,7 @@ void ivas_masa_set_elements_fx( *element_mode = IVAS_SCE; /* This is needed for the initialization phase to initialize codec mode to SCE, since it is written first to the file*/ move16(); } - ELSE IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) && NE_16( ism_mode, ISM_MODE_NONE ) ) + ELSE IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) && ism_mode != ISM_MODE_NONE ) { *nCPE = 1; move16(); @@ -234,6 +234,9 @@ void ivas_masa_set_elements_fx( } /* hQMetaData->bits_frame_nominal = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ); */ hQMetaData->bits_frame_nominal = extract_l( Mpy_32_32( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + test(); + test(); + test(); IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) && ( EQ_16( ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_16( ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) || EQ_16( ism_mode, ISM_MASA_MODE_DISC ) ) ) { /* hQMetaData->bits_frame_nominal -= (int16_t) ( ism_total_brate / FRAMES_PER_SEC ); */ @@ -270,8 +273,7 @@ void ivas_masa_set_elements_fx( } ELSE { - hQMetaData->bits_frame_nominal = (Word16) ( ivas_total_brate / FRAMES_PER_SEC ); - move16(); + hQMetaData->bits_frame_nominal = extract_l( Mpy_32_32( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); } *element_mode = IVAS_SCE; move16(); @@ -511,35 +513,35 @@ void ivas_masa_set_coding_config_fx( /* Setup coding parameters based on the bitrate, transport channel count, subframe metadata information, * and number of directions in metadata. */ nbands = 0; + move16(); nTwoDirBands = 0; + move16(); i = 0; move16(); /* First select correct bit budget table */ masa_bits_table = masa_bits; - move16(); test(); IF( isMcMasa ) { masa_bits_table = mcmasa_bits; - move16(); } ELSE IF( LT_32( ivas_total_brate, IVAS_48k ) && EQ_16( nchan_transport, 2 ) ) { masa_bits_table = masa_bits_LR_stereo; - move16(); } - WHILE( EQ_16( nbands, 0 ) && LT_16( i, IVAS_NUM_ACTIVE_BRATES ) ) + WHILE( nbands == 0 && LT_16( i, IVAS_NUM_ACTIVE_BRATES ) ) { + test(); IF( LE_32( ivas_total_brate, ivas_brate_tbl[i + SIZE_IVAS_BRATE_TBL - IVAS_NUM_ACTIVE_BRATES] ) ) { Word16 idx_bands; test(); test(); - IF( LT_32( ivas_total_brate, IVAS_48k ) && EQ_16( nchan_transport, 2 ) && GT_16( i, 3 ) ) + if ( LT_32( ivas_total_brate, IVAS_48k ) && EQ_16( nchan_transport, 2 ) && GT_16( i, 3 ) ) { /* because it uses the bitallocation for the lower bit rates from 'masa_bits_LR_stereo' and it has 4 elements */ i = 3; @@ -550,7 +552,16 @@ void ivas_masa_set_coding_config_fx( IF( GT_16( config->numberOfDirections, 1 ) ) { - nTwoDirBands = config->joinedSubframes ? masa_twodir_bands_joined[i] : masa_twodir_bands[i]; + IF( config->joinedSubframes ) + { + nTwoDirBands = masa_twodir_bands_joined[i]; + move16(); + } + ELSE + { + nTwoDirBands = masa_twodir_bands[i]; + move16(); + } test(); test(); @@ -564,20 +575,23 @@ void ivas_masa_set_coding_config_fx( IF( config->joinedSubframes ) { nbands = masa_joined_nbands[idx_bands]; + move16(); } ELSE { nbands = masa_nbands[idx_bands]; + move16(); } - config->max_metadata_bits = masa_bits_table[i]; + config->max_metadata_bits = (UWord16) masa_bits_table[i]; move16(); test(); IF( EQ_32( ivas_total_brate, IVAS_64k ) && GT_16( config->numberOfDirections, 1 ) ) { /* At 64k, we increase metadata bit budget when there is two directions present. */ - config->max_metadata_bits = (UWord16) L_add( config->max_metadata_bits, MASA_EXTRA_BAND_META_BITS ); + config->max_metadata_bits = (UWord16) add( config->max_metadata_bits, MASA_EXTRA_BAND_META_BITS ); + move16(); } test(); @@ -586,21 +600,26 @@ void ivas_masa_set_coding_config_fx( IF( ( ( EQ_32( ivas_total_brate, IVAS_32k ) && EQ_16( nchan_transport, 2 ) ) || EQ_32( ivas_total_brate, IVAS_48k ) ) && config->joinedSubframes ) { /* At 32k and 48k, we increase metadata bit budget when joinedSubframes. */ - config->max_metadata_bits = (UWord16) L_add( config->max_metadata_bits, MASA_SMALL_INC_META_BITS ); + config->max_metadata_bits = (UWord16) add( config->max_metadata_bits, MASA_SMALL_INC_META_BITS ); + move16(); } } i = add( i, 1 ); } config->numCodingBands = nbands; + move16(); config->numTwoDirBands = nTwoDirBands; + move16(); IF( EQ_16( config->joinedSubframes, TRUE ) ) { config->mergeRatiosOverSubframes = FALSE; + move16(); } ELSE { config->mergeRatiosOverSubframes = TRUE; + move16(); } /* Setup frequency band mapping based on the number of used coding bands */ @@ -620,7 +639,7 @@ void ivas_masa_set_coding_config_fx( BREAK; case MASA_FREQUENCY_BANDS: /* With input count of bands, no mapping is needed but for unified processing later, we store normal mapping */ - FOR( i = 0; i < add( MASA_FREQUENCY_BANDS, 1 ); i++ ) + FOR( i = 0; i < MASA_FREQUENCY_BANDS + 1; i++ ) { band_mapping[i] = i; move16(); @@ -631,12 +650,14 @@ void ivas_masa_set_coding_config_fx( } config->useCoherence = TRUE; + move16(); test(); test(); test(); IF( ( !isMcMasa && LT_32( ivas_total_brate, IVAS_48k ) ) || ( isMcMasa && LT_32( ivas_total_brate, IVAS_16k4 ) ) ) { config->useCoherence = FALSE; + move16(); } return; @@ -769,6 +790,7 @@ void masa_sample_rate_band_correction_fx( UWord8 numBands48k; numBands48k = config->numCodingBands; + move16(); FOR( band = 1; band < config->numCodingBands + 1; band++ ) { @@ -778,18 +800,22 @@ void masa_sample_rate_band_correction_fx( IF( GE_16( highBand, (Word16) maxBand ) ) { config->numCodingBands = band; + move16(); hQMetaData->numCodingBands = band; + move16(); IF( is_encoder ) { - test(); - IF( GT_16( hQMetaData->q_direction->cfg.nbands, (Word16) band ) ) + if ( GT_16( hQMetaData->q_direction->cfg.nbands, (Word16) band ) ) { hQMetaData->q_direction->cfg.nbands = band; + move16(); } - IF( EQ_16( (Word16) hQMetaData->no_directions, 2 ) && GT_16( hQMetaData->q_direction[1].cfg.nbands, (Word16) band ) ) + test(); + if ( EQ_16( (Word16) hQMetaData->no_directions, 2 ) && GT_16( hQMetaData->q_direction[1].cfg.nbands, (Word16) band ) ) { hQMetaData->q_direction[1].cfg.nbands = band; + move16(); } } @@ -812,9 +838,11 @@ void masa_sample_rate_band_correction_fx( hQMetaData->q_direction[0].band_data[band].energy_ratio_fx[sf] = 0; move32(); - IF( hQMetaData->coherence_flag && hQMetaData->q_direction[0].coherence_band_data != NULL ) + test(); + if ( hQMetaData->coherence_flag && hQMetaData->q_direction[0].coherence_band_data != NULL ) { hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = 0u; + move16(); } IF( EQ_16( (Word16) hQMetaData->no_directions, 2 ) ) @@ -826,21 +854,26 @@ void masa_sample_rate_band_correction_fx( hQMetaData->q_direction[1].band_data[band].energy_ratio_fx[sf] = 0; move32(); - IF( hQMetaData->coherence_flag && hQMetaData->q_direction[1].coherence_band_data != NULL ) + test(); + if ( hQMetaData->coherence_flag && hQMetaData->q_direction[1].coherence_band_data != NULL ) { hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf] = 0u; + move16(); } } - IF( hQMetaData->coherence_flag && hQMetaData->surcoh_band_data != NULL ) + test(); + if ( hQMetaData->coherence_flag && hQMetaData->surcoh_band_data != NULL ) { hQMetaData->surcoh_band_data[band].surround_coherence[sf] = 0u; + move16(); } } - IF( EQ_16( (Word16) hQMetaData->no_directions, 2 ) ) + if ( EQ_16( (Word16) hQMetaData->no_directions, 2 ) ) { hQMetaData->twoDirBands[band] = 0; + move16(); } } @@ -854,14 +887,21 @@ void masa_sample_rate_band_correction_fx( hExtOutMeta->directionIndex[0][sf][band] = SPH_IDX_FRONT; move16(); hExtOutMeta->directToTotalRatio[0][sf][band] = 0u; + move16(); hExtOutMeta->spreadCoherence[0][sf][band] = 0u; + move16(); hExtOutMeta->directionIndex[1][sf][band] = SPH_IDX_FRONT; + move16(); hExtOutMeta->directToTotalRatio[1][sf][band] = 0u; + move16(); hExtOutMeta->spreadCoherence[1][sf][band] = 0u; + move16(); hExtOutMeta->surroundCoherence[sf][band] = 0u; + move16(); hExtOutMeta->diffuseToTotalRatio[sf][band] = UINT8_MAX; + move16(); } } } @@ -992,7 +1032,7 @@ UWord16 index_theta_phi_16_fx( move32(); phi_fx = L_add( phi_fx, L_shl( 180, Q22 ) ); - IF( LT_32( theta_fx, 0 ) ) + IF( theta_fx < 0 ) { abs_theta_fx = L_negate( theta_fx ); sign_th = -1; @@ -1030,11 +1070,13 @@ UWord16 index_theta_phi_16_fx( IF( EQ_16( sign_th, -1 ) ) { *p_theta = L_negate( theta_hat_fx ); + move32(); } *p_phi = L_sub( phi_hat_fx, L_shl( 180, Q22 ) ); + move32(); /* Starting from Equator, alternating positive and negative */ - IF( EQ_16( id_th, 0 ) ) + IF( id_th == 0 ) { idx_sph = id_phi; move16(); @@ -1045,7 +1087,7 @@ UWord16 index_theta_phi_16_fx( { idx_sph = 65534; move16(); - IF( LT_16( sign_th, 0 ) ) + if ( sign_th < 0 ) { idx_sph = 65535; move16(); @@ -1058,7 +1100,7 @@ UWord16 index_theta_phi_16_fx( cum_n = (UWord16) L_add( cum_n, gridData->no_phi[0] ); - IF( GT_16( sign_th, 0 ) ) + IF( sign_th > 0 ) { cum_n = (UWord16) L_sub( cum_n, shl( gridData->no_phi[id_th], 1 ) ); } @@ -1076,7 +1118,7 @@ UWord16 index_theta_phi_16_fx( /*------------------------------------------------------------------------- - * quantize_phi_masa() + * quantize_theta_masa() * * *------------------------------------------------------------------------*/ @@ -1137,15 +1179,18 @@ static Word16 quantize_theta_masa_fx( { imin = sub( imin, 1 ); *xhat_fx = Mpy_32_16_1( MASA_ANGLE_AT_EQUATOR_DEG_Q31, shl( imin, 6 ) ); // 31 + 6 - 15 = Q22 + move32(); } ELSE { *xhat_fx = L_shl( 90, Q22 ); + move32(); } } ELSE { *xhat_fx = Mpy_32_16_1( MASA_ANGLE_AT_EQUATOR_DEG_Q31, shl( imin, 6 ) ); // 31 + 6 - 15 = Q22 + move32(); } return imin; @@ -1258,6 +1303,7 @@ static Word16 quantize_phi_masa_fx( } *phi_hat_fx = L_add( L_shl( Mpy_32_16_1( delta_phi_fx, id_phi ), 15 ), dd_fx ); // q22 + q0 - 15 = q7 -> q7 + 15 = q22 + move32(); return id_phi; } @@ -1440,6 +1486,19 @@ void deindex_sph_idx_fx( Word16 tmp16, tmp_e; move16(); move16(); + move16(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); IF( GE_32( sphIndex, limit_index1 ) ) { @@ -1482,9 +1541,9 @@ void deindex_sph_idx_fx( tmp32 = L_shr( tmp32, sub( Q8, tmp16 ) ); /* Q23 */ estim_fx = L_add( ba_crt_fx, tmp32 ); /* Q23 */ - if ( GT_32( estim_fx, MASA_NO_CIRCLES << Q23 ) ) + if ( GT_32( estim_fx, MASA_NO_CIRCLES_Q23 ) ) { - estim_fx = MASA_NO_CIRCLES << Q23; + estim_fx = MASA_NO_CIRCLES_Q23; move32(); } @@ -1537,7 +1596,7 @@ void deindex_sph_idx_fx( move16(); IF( LT_32( sphIndex, base_low ) ) { - id_th--; + id_th = sub( id_th, 1 ); n_crt = n[id_th]; move16(); IF( id_th == 0 ) @@ -1557,7 +1616,7 @@ void deindex_sph_idx_fx( } ELSE IF( GE_32( sphIndex, base_up ) ) { - id_th++; + id_th = add( id_th, 1 ); n_crt = n[id_th]; move16(); base_low = base_up; @@ -1693,7 +1752,7 @@ Word16 valid_ratio_index_fx( move16(); FOR( i = len - 1; i >= 0; i-- ) { - IF( EQ_16( index, 0 ) ) + IF( index == 0 ) { elem = 0; move16(); @@ -1768,7 +1827,7 @@ void reconstruct_ism_ratios_fx( sum = 0; move32(); - FOR( i = 0; i < sub( nchan_ism, 1 ); i++ ) + FOR( i = 0; i < nchan_ism - 1; i++ ) { q_energy_ratio_ism[i] = L_shl( L_mult( ratio_ism_idx[i], step ), 14 ); // q0 + q15 + 1 + 14 = q30; move32(); @@ -1779,7 +1838,7 @@ void reconstruct_ism_ratios_fx( q_energy_ratio_ism[nchan_ism - 1] = L_sub( ONE_IN_Q30, sum ); move32(); - IF( LT_32( q_energy_ratio_ism[nchan_ism - 1], 0 ) ) + if ( q_energy_ratio_ism[nchan_ism - 1] < 0 ) { q_energy_ratio_ism[nchan_ism - 1] = 0; move32(); @@ -1917,7 +1976,7 @@ void distribute_evenly_ism_fx( move16(); FOR( i = 0; i < nchan_ism; i++ ) { - IF( EQ_16( K, 0 ) ) + IF( K == 0 ) { idx[i] = 0; move16(); @@ -2011,6 +2070,7 @@ Word32 calculate_cpe_brate_MASA_ISM_fx( WHILE( LT_16( k, SIZE_IVAS_BRATE_TBL ) && NE_32( ivas_total_brate, ivas_brate_tbl[k] ) ) { + test(); k = add( k, 1 ); } diff --git a/lib_com/ivas_mc_param_com.c b/lib_com/ivas_mc_param_com.c index 07ab1f9b8..5297d332a 100644 --- a/lib_com/ivas_mc_param_com.c +++ b/lib_com/ivas_mc_param_com.c @@ -41,6 +41,9 @@ #include "ivas_stat_com.h" #include "ivas_rom_com.h" #include "wmc_auto.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*------------------------------------------------------------------------- @@ -313,7 +316,8 @@ void ivas_param_mc_set_coded_bands( FOR( i = 0; i < hMetadataPMC->nbands_coded; i++ ) { - hMetadataPMC->nbands_in_param_frame[hMetadataPMC->coding_band_mapping[i]]++; + hMetadataPMC->nbands_in_param_frame[hMetadataPMC->coding_band_mapping[i]] = add( hMetadataPMC->nbands_in_param_frame[hMetadataPMC->coding_band_mapping[i]], 1 ); + move16(); } return; diff --git a/lib_com/ivas_mcmasa_com.c b/lib_com/ivas_mcmasa_com.c index f8550d48e..c10c0d2dd 100644 --- a/lib_com/ivas_mcmasa_com.c +++ b/lib_com/ivas_mcmasa_com.c @@ -108,12 +108,14 @@ void ivas_mcmasa_set_separate_channel_mode_fx( IF( GE_32( ivas_total_brate, MCMASA_SEPARATE_BRATE ) ) { *separateChannelEnabled = 1; + move16(); *separateChannelIndex = 2; /* Center channel */ move16(); } ELSE { *separateChannelEnabled = 0; + move16(); *separateChannelIndex = 0; move16(); } @@ -165,23 +167,43 @@ void ivas_mcmasa_split_brate_fx( IF( LT_32( ivas_total_brate, IVAS_96k ) ) { *brate_sce = Mpy_32_32( MCMASA_MONOBITRATIO_64k_Q31, ivas_total_brate ); /* Q0 */ + move32(); } ELSE { *brate_sce = Mpy_32_32( MCMASA_MONOBITRATIO_Q31, ivas_total_brate ); /* Q0 */ + move32(); } *brate_cpe = L_sub( ivas_total_brate, *brate_sce ); + move32(); } ELSE { - Word16 tmp_e = 0; + Word16 tmp, tmp_e; + tmp_e = 0; move16(); - Word16 tmp = BASOP_Util_Divide3216_Scale( ivas_total_brate, ( add( nCPE, nSCE ) ), &tmp_e ); - *brate_sce = GT_16( nSCE, 0 ) ? ( L_shr( (Word32) tmp, negate( add( 1, tmp_e ) ) ) ) : 0; - move32(); - *brate_cpe = GT_16( nCPE, 0 ) ? ( L_shr( (Word32) tmp, negate( add( 1, tmp_e ) ) ) ) : 0; - move32(); + tmp = BASOP_Util_Divide3216_Scale( ivas_total_brate, ( add( nCPE, nSCE ) ), &tmp_e ); + IF( nSCE > 0 ) + { + *brate_sce = L_shr( (Word32) tmp, negate( add( 1, tmp_e ) ) ); + move32(); + } + ELSE + { + *brate_sce = 0; + move32(); + } + IF( nCPE > 0 ) + { + *brate_cpe = L_shr( (Word32) tmp, negate( add( 1, tmp_e ) ) ); + move32(); + } + ELSE + { + *brate_cpe = 0; + move32(); + } } return; diff --git a/lib_com/ivas_mct_com.c b/lib_com/ivas_mct_com.c index 6da936755..f68f576f9 100644 --- a/lib_com/ivas_mct_com.c +++ b/lib_com/ivas_mct_com.c @@ -210,20 +210,21 @@ void splitAvailableBitsMCT( Word16 core[MCT_MAX_CHANNELS]; MCT_CHAN_MODE mct_chan_mode[MCT_MAX_CHANNELS]; min_bits_tot = 0; + move16(); FOR( i = 0; i < nchan; i++ ) { IF( enc_dec == ENC ) { mct_chan_mode[i] = ( (Encoder_State *) sts[i] )->mct_chan_mode; - move16(); + move32(); core[i] = ( (Encoder_State *) sts[i] )->core; move16(); } ELSE { mct_chan_mode[i] = ( (Decoder_State *) sts[i] )->mct_chan_mode; - move16(); + move32(); core[i] = ( (Decoder_State *) sts[i] )->core; move16(); } @@ -231,24 +232,30 @@ void splitAvailableBitsMCT( FOR( i = 0; i < nchan; i++ ) { - IF( mct_chan_mode[i] != MCT_CHAN_MODE_IGNORE ) + IF( NE_32( mct_chan_mode[i], MCT_CHAN_MODE_IGNORE ) ) { min_chan_bits[i] = 0; move16(); - nSubframes = ( core[i] == TCX_20_CORE ) ? 1 : NB_DIV; - move16(); + IF( EQ_32( core[i], TCX_20_CORE ) ) + { + nSubframes = 1; + move16(); + } + ELSE + { + nSubframes = NB_DIV; + move16(); + } FOR( k = 0; k < nSubframes; k++ ) { - min_chan_bits[i] += SMDCT_MINIMUM_ARITH_BITS + MIN_SAFETY_BITS_MC; + min_chan_bits[i] = add( min_chan_bits[i], SMDCT_MINIMUM_ARITH_BITS + MIN_SAFETY_BITS_MC ); move16(); } - min_bits_tot += min_chan_bits[i]; - move16(); + min_bits_tot = add( min_bits_tot, min_chan_bits[i] ); } } - remaining_bits = total_bits - min_bits_tot; - move16(); + remaining_bits = sub( total_bits, min_bits_tot ); /*initial value of bits already given*/ bits_split = 0; @@ -263,25 +270,20 @@ void splitAvailableBitsMCT( IF( enc_dec == ENC ) { bits_frame_channel = &( (Encoder_State *) sts[i] )->bits_frame_channel; - move16(); } ELSE /* DEC */ { bits_frame_channel = &( (Decoder_State *) sts[i] )->bits_frame_channel; - move16(); } - IF( - mct_chan_mode[i] != MCT_CHAN_MODE_IGNORE ) + IF( NE_32( mct_chan_mode[i], MCT_CHAN_MODE_IGNORE ) ) { assert( split_ratio[i] >= 1 && split_ratio[i] < BITRATE_MCT_RATIO_RANGE ); - *bits_frame_channel = (Word16) L_shr( (Word32) split_ratio[i] * remaining_bits, NBBITS_MCT_RATIO ) + min_chan_bits[i]; - move16(); - bits_split += *bits_frame_channel; - move16(); + *bits_frame_channel = add( extract_l( L_shr( L_mult0( split_ratio[i], remaining_bits ), NBBITS_MCT_RATIO ) ), min_chan_bits[i] ); + bits_split = add( bits_split, *bits_frame_channel ); /*determine channel with most bits (energy)*/ - IF( *bits_frame_channel > tmp ) + IF( GT_16( *bits_frame_channel, tmp ) ) { tmp = *bits_frame_channel; move16(); @@ -292,10 +294,9 @@ void splitAvailableBitsMCT( } /*if bits distributed are more than available bits, substract the proportional amount of bits from all channels*/ - IF( bits_split != total_bits ) + IF( NE_16( bits_split, total_bits ) ) { - diff = bits_split - total_bits; - move16(); + diff = sub( bits_split, total_bits ); /*re-count bits distributed to each channel*/ bits_split = 0; @@ -306,68 +307,61 @@ void splitAvailableBitsMCT( IF( enc_dec == ENC ) { bits_frame_channel = &( (Encoder_State *) sts[i] )->bits_frame_channel; - move16(); } ELSE /* DEC */ { bits_frame_channel = &( (Decoder_State *) sts[i] )->bits_frame_channel; - move16(); } - IF( mct_chan_mode[i] != MCT_CHAN_MODE_IGNORE ) + IF( NE_32( mct_chan_mode[i], MCT_CHAN_MODE_IGNORE ) ) { - Word32 temp_res = (Word32) diff * split_ratio[i]; + Word32 temp_res; + temp_res = L_mult0( diff, split_ratio[i] ); IF( temp_res < 0 ) { - temp_res = -temp_res; - move16(); + temp_res = L_negate( temp_res ); temp_res = L_shr( temp_res, NBBITS_MCT_RATIO ); - move16(); - temp_res = -temp_res; - move16(); + temp_res = L_negate( temp_res ); } ELSE { temp_res = L_shr( temp_res, NBBITS_MCT_RATIO ); - move16(); } - *bits_frame_channel -= (Word16) temp_res; - move16(); - *bits_frame_channel = max( min_chan_bits[i], *bits_frame_channel ); + *bits_frame_channel = sub( *bits_frame_channel, extract_l( temp_res ) ); move16(); - bits_split += *bits_frame_channel; + *bits_frame_channel = s_max( min_chan_bits[i], *bits_frame_channel ); move16(); + bits_split = add( bits_split, *bits_frame_channel ); } } } /*if there any bits left assign them to the channel with the maximum energy (or more bits)*/ - IF( total_bits != bits_split ) + IF( NE_16( total_bits, bits_split ) ) { IF( enc_dec == ENC ) { bits_frame_channel = &( (Encoder_State *) sts[max_chn] )->bits_frame_channel; - move16(); } ELSE /* DEC */ { bits_frame_channel = &( (Decoder_State *) sts[max_chn] )->bits_frame_channel; - move16(); } - *bits_frame_channel += ( total_bits - bits_split ); - move16(); + *bits_frame_channel = add( *bits_frame_channel, sub( total_bits, bits_split ) ); /*if all channels are silent assign bits to ch 0*/ IF( enc_dec == ENC ) { - IF( ( (Encoder_State *) sts[max_chn] )->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + IF( EQ_32( ( (Encoder_State *) sts[max_chn] )->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { assert( bits_split == 0 ); ( (Encoder_State *) sts[max_chn] )->mct_chan_mode = MCT_CHAN_MODE_REGULAR; - ( (Encoder_State *) sts[max_chn] )->side_bits_frame_channel = ( ( (Encoder_State *) sts[max_chn] )->core ) * ( NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL ); - *bits_frame_channel -= ( (Encoder_State *) sts[max_chn] )->side_bits_frame_channel; + move32(); + ( (Encoder_State *) sts[max_chn] )->side_bits_frame_channel = imult1616( ( ( (Encoder_State *) sts[max_chn] )->core ), ( NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL ) ); + move16(); + *bits_frame_channel = sub( *bits_frame_channel, ( (Encoder_State *) sts[max_chn] )->side_bits_frame_channel ); move16(); } } diff --git a/lib_com/ivas_mdct_core_com.c b/lib_com/ivas_mdct_core_com.c index b98f3a470..a715790b8 100644 --- a/lib_com/ivas_mdct_core_com.c +++ b/lib_com/ivas_mdct_core_com.c @@ -55,14 +55,23 @@ void ivas_mdct_tcx10_bit_distribution_fx( ) { Word16 k; - Word16 min_required_bits = add( add( NBITS_TCX_GAIN, i_mult2( NOISE_FILL_RANGES, NBITS_NOISE_FILL_LEVEL ) ), SMDCT_MINIMUM_ARITH_BITS ); + Word16 min_required_bits; + min_required_bits = add( add( NBITS_TCX_GAIN, i_mult2( NOISE_FILL_RANGES, NBITS_NOISE_FILL_LEVEL ) ), SMDCT_MINIMUM_ARITH_BITS ); FOR( k = 0; k < 2; k++ ) { - IF( nbits_tcx & 1 ) + IF( s_and( nbits_tcx, 1 ) ) { - target_bitsTCX10[k] = sub( add( shr( nbits_tcx, 1 ), ( k == 0 ? 1 : 0 ) ), nTnsBitsTCX10[k] ); - move16(); + IF( k == 0 ) + { + target_bitsTCX10[k] = sub( add( shr( nbits_tcx, 1 ), 1 ), nTnsBitsTCX10[k] ); + move16(); + } + ELSE + { + target_bitsTCX10[k] = sub( add( shr( nbits_tcx, 1 ), 0 ), nTnsBitsTCX10[k] ); + move16(); + } } ELSE { diff --git a/lib_com/ivas_mdct_imdct_fx.c b/lib_com/ivas_mdct_imdct_fx.c index c14432c08..cb64739e8 100644 --- a/lib_com/ivas_mdct_imdct_fx.c +++ b/lib_com/ivas_mdct_imdct_fx.c @@ -69,7 +69,8 @@ void ivas_tda_fx( ) { Word16 i; - Word16 len_by_2 = shr( length, 1 ); + Word16 len_by_2; + len_by_2 = shr( length, 1 ); FOR( i = 0; i < len_by_2; i++ ) { @@ -101,19 +102,22 @@ void ivas_dct_windowing_fx( Word32 *pTemp_lfe ) { Word16 i; - Word16 rem_len = 0; + Word16 rem_len; + rem_len = 0; + move16(); Copy32( pBuffer_prev, pOut_buf + zero_pad_len, fade_len ); - Copy32( pTemp_lfe, ( pOut_buf + fade_len + zero_pad_len ), dct_len ); + Copy32( pTemp_lfe, ( pOut_buf + add( fade_len, zero_pad_len ) ), dct_len ); set32_fx( pOut_buf, 0, zero_pad_len ); - Copy32( ( pOut_buf + full_len - fade_len ), pBuffer_prev, fade_len ); + Copy32( ( pOut_buf + sub( full_len, fade_len ) ), pBuffer_prev, fade_len ); FOR( i = 0; i < fade_len; i++ ) { pOut_buf[add( zero_pad_len, i )] = Mult_32_32( pOut_buf[add( zero_pad_len, i )], pWindow_coeffs[i] ); + move32(); } rem_len = sub( full_len, ( add( i_mult( zero_pad_len, 3 ), fade_len ) ) ); @@ -121,6 +125,7 @@ void ivas_dct_windowing_fx( FOR( i = 0; i < rem_len; i++ ) { pOut_buf[add( add( i_mult( zero_pad_len, 3 ), fade_len ), i )] = Mult_32_32( pOut_buf[add( add( i_mult( zero_pad_len, 3 ), fade_len ), i )], pWindow_coeffs[sub( sub( fade_len, i ), 1 )] ); + move32(); } set32_fx( &pOut_buf[full_len], 0, sub( frame_len, full_len ) ); @@ -153,14 +158,18 @@ void ivas_mdct_fx( FOR( i = 0; i < len_by_2; i++ ) { - pOut[i] = L_sub( pIn[len_by_2 + i], pIn[len_by_2 - i - 1] ); - pOut[len_by_2 + i] = L_add( pIn[length * 2 - i - 1], pIn[length + i] ); + pOut[i] = L_sub( pIn[add( len_by_2, i )], pIn[sub( sub( len_by_2, i ), 1 )] ); + move32(); + pOut[add( len_by_2, i )] = L_add( pIn[sub( sub( imult1616( length, 2 ), i ), 1 )], pIn[add( length, i )] ); + move32(); } FOR( i = 0; i < len_by_2; i++ ) { - re[i] = L_negate( L_add( Mpy_32_16_1( pOut[2 * i], pTwid_re[i] ), Mpy_32_16_1( pOut[length - 1 - 2 * i], pTwid_im[i] ) ) ); - im[i] = L_sub( Mpy_32_16_1( pOut[length - 1 - 2 * i], pTwid_re[i] ), Mpy_32_16_1( pOut[2 * i], pTwid_im[i] ) ); + re[i] = L_negate( L_add( Mpy_32_16_1( pOut[2 * i], pTwid_re[i] ), Mpy_32_16_1( pOut[sub( sub( length, 1 ), imult1616( 2, i ) )], pTwid_im[i] ) ) ); + move32(); + im[i] = L_sub( Mpy_32_16_1( pOut[sub( sub( length, 1 ), imult1616( 2, i ) )], pTwid_re[i] ), Mpy_32_16_1( pOut[2 * i], pTwid_im[i] ) ); + move32(); } DoFFT_fx( &re[0], &im[0], len_by_2 ); @@ -168,21 +177,28 @@ void ivas_mdct_fx( FOR( i = 0; i < len_by_2; i++ ) { re[i] = Mult_32_32( re[i], ivas_mdct_scaling_gain ); + move32(); im[i] = Mult_32_32( im[i], ivas_mdct_scaling_gain ); + move32(); } - *q_out = *q_out + Q15; + *q_out = add( *q_out, Q15 ); + move16(); FOR( i = 0; i < len_by_2; i++ ) { Word32 tmp; tmp = L_sub( Mpy_32_16_1( re[i], pTwid_re[i] ), Mpy_32_16_1( im[i], pTwid_im[i] ) ); im[i] = L_add( Mpy_32_16_1( im[i], pTwid_re[i] ), Mpy_32_16_1( re[i], pTwid_im[i] ) ); + move32(); re[i] = tmp; + move32(); } FOR( i = 0; i < len_by_2; i++ ) { - pOut[length - 2 * i - 1] = re[i]; + pOut[sub( sub( length, imult1616( 2, i ) ), 1 )] = re[i]; + move32(); pOut[2 * i] = im[i]; + move32(); } return; @@ -201,23 +217,32 @@ static void ivas_ifft_cplx( const Word16 length ) { Word16 i; - Word32 ivas_imdct_one_by_powergain = IVAS_ONE_BY_IMDCT_SCALING_GAIN_Q16; + Word32 ivas_imdct_one_by_powergain; + ivas_imdct_one_by_powergain = IVAS_ONE_BY_IMDCT_SCALING_GAIN_Q16; + move32(); /*re-arrange inputs to use fft as ifft */ re[0] = Mult_32_32( re[0], ivas_imdct_one_by_powergain ); + move32(); im[0] = Mult_32_32( im[0], ivas_imdct_one_by_powergain ); + move32(); FOR( i = 1; i <= shr( length, 1 ); i++ ) { - Word32 tmp = Mult_32_32( re[length - i], ivas_imdct_one_by_powergain ); - re[length - i] = Mult_32_32( re[i], ivas_imdct_one_by_powergain ); + Word32 tmp; + tmp = Mult_32_32( re[sub( length, i )], ivas_imdct_one_by_powergain ); + re[sub( length, i )] = Mult_32_32( re[i], ivas_imdct_one_by_powergain ); + move32(); re[i] = tmp; + move32(); - tmp = Mult_32_32( im[length - i], ivas_imdct_one_by_powergain ); - im[length - i] = Mult_32_32( im[i], ivas_imdct_one_by_powergain ); + tmp = Mult_32_32( im[sub( length, i )], ivas_imdct_one_by_powergain ); + im[sub( length, i )] = Mult_32_32( im[i], ivas_imdct_one_by_powergain ); + move32(); im[i] = tmp; + move32(); } - DoFFT_fx( re, im, (Word16) length ); + DoFFT_fx( re, im, length ); return; } @@ -236,14 +261,19 @@ void ivas_itda_fx( ) { Word16 i; - Word16 len_by_2 = shr( length, 1 ); + Word16 len_by_2; + len_by_2 = shr( length, 1 ); FOR( i = 0; i < len_by_2; i++ ) { - pOut[i] = -re[len_by_2 - i - 1]; - pOut[len_by_2 + i] = re[i]; - pOut[length + i] = re[len_by_2 + i]; - pOut[3 * len_by_2 + i] = re[length - i - 1]; + pOut[i] = L_negate( re[sub( sub( len_by_2, i ), 1 )] ); + move32(); + pOut[add( len_by_2, i )] = re[i]; + move32(); + pOut[add( length, i )] = re[add( len_by_2, i )]; + move32(); + pOut[add( imult1616( 3, len_by_2 ), i )] = re[sub( sub( length, i ), 1 )]; + move32(); } return; @@ -263,23 +293,27 @@ void ivas_imdct_fx( Word16 *q_out ) { const Word16 *pTwid_re, *pTwid_im; - Word16 len_by_2 = shr( length, 1 ); + Word16 len_by_2; Word16 i; Word32 re[IVAS_480_PT_LEN]; Word32 im[IVAS_480_PT_LEN]; + len_by_2 = shr( length, 1 ); ivas_get_twid_factors_fx1( length, &pTwid_re, &pTwid_im ); FOR( i = 0; i < len_by_2; i++ ) { - re[i] = L_add( Mpy_32_16_1( pIn[length - 2 * i - 1], pTwid_re[i] ), Mpy_32_16_1( pIn[2 * i], pTwid_im[i] ) ); /*stl_arr_index*/ - im[i] = L_sub( Mpy_32_16_1( pIn[2 * i], pTwid_re[i] ), Mpy_32_16_1( pIn[length - 2 * i - 1], pTwid_im[i] ) ); /*stl_arr_index*/ + re[i] = L_add( Mpy_32_16_1( pIn[sub( sub( length, imult1616( 2, i ) ), 1 )], pTwid_re[i] ), Mpy_32_16_1( pIn[2 * i], pTwid_im[i] ) ); /*stl_arr_index*/ + move32(); + im[i] = L_sub( Mpy_32_16_1( pIn[2 * i], pTwid_re[i] ), Mpy_32_16_1( pIn[sub( sub( length, imult1616( 2, i ) ), 1 )], pTwid_im[i] ) ); /*stl_arr_index*/ + move32(); } ivas_ifft_cplx( &re[0], &im[0], len_by_2 ); - IF( GT_16( len_by_2, 0 ) ) + IF( len_by_2 > 0 ) { - *q_out = *q_out - Q15; + *q_out = sub( *q_out, Q15 ); + move16(); } FOR( i = 0; i < len_by_2; i++ ) @@ -287,21 +321,29 @@ void ivas_imdct_fx( Word32 tmp; tmp = L_add( Mpy_32_16_1( re[i], pTwid_re[i] ), Mpy_32_16_1( im[i], pTwid_im[i] ) ); im[i] = L_sub( Mpy_32_16_1( im[i], pTwid_re[i] ), Mpy_32_16_1( re[i], pTwid_im[i] ) ); + move32(); re[i] = tmp; + move32(); } FOR( i = ( len_by_2 - 1 ); i >= 0; i-- ) { - re[2 * i + 1] = im[( len_by_2 - 1 ) - i]; - re[2 * i] = -re[i]; + re[add( imult1616( 2, i ), 1 )] = im[sub( sub( len_by_2, 1 ), i )]; + move32(); + re[imult1616( 2, i )] = L_negate( re[i] ); + move32(); } FOR( i = 0; i < len_by_2; i++ ) { - pOut[i] = -re[len_by_2 - i - 1]; - pOut[len_by_2 + i] = re[i]; - pOut[length + i] = re[len_by_2 + i]; - pOut[3 * len_by_2 + i] = re[length - i - 1]; + pOut[i] = L_negate( re[sub( sub( len_by_2, i ), 1 )] ); + move32(); + pOut[add( len_by_2, i )] = re[i]; + move32(); + pOut[add( length, i )] = re[add( len_by_2, i )]; + move32(); + pOut[add( imult1616( 3, len_by_2 ), i )] = re[sub( sub( length, i ), 1 )]; + move32(); } return; @@ -357,23 +399,28 @@ void ivas_get_twid_factors_fx1( Word32 ivas_get_mdct_scaling_gain_fx( const Word16 dct_len_by_2 ) { - Word32 gain = 0; + Word32 gain; + gain = 0; + move32(); SWITCH( dct_len_by_2 ) { case L_FRAME48k >> 2: { gain = IVAS_MDCT_SCALING_GAIN_48k_Q46; + move32(); BREAK; } case L_FRAME32k >> 2: { gain = IVAS_MDCT_SCALING_GAIN_32k_Q46; + move32(); BREAK; } case L_FRAME16k >> 2: { gain = IVAS_MDCT_SCALING_GAIN_16k_Q46; + move32(); BREAK; } default: diff --git a/lib_com/ivas_mdft_imdft.c b/lib_com/ivas_mdft_imdft.c index ab9339523..2a785bd34 100644 --- a/lib_com/ivas_mdft_imdft.c +++ b/lib_com/ivas_mdft_imdft.c @@ -48,6 +48,9 @@ #define fix_to_float( n, factor ) ( (float) n / ( 1 << factor ) ) #define SHC( x ) ( (Word16) x ) #endif +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*-----------------------------------------------------------------------------------------* * Local constants @@ -77,14 +80,13 @@ static void ivas_get_mdft_twid_factors_fx( const Word16 length, const Word32 **ppTwid ) { - switch ( length ) + SWITCH( length ) { case L_FRAME48k: *ppTwid = &ivas_mdft_coeff_cos_twid_960_fx[0]; break; case L_FRAME32k: *ppTwid = &ivas_mdft_coeff_cos_twid_640_fx[0]; - break; case L_FRAME16k: *ppTwid = &ivas_mdft_coeff_cos_twid_320_fx[0]; @@ -104,7 +106,6 @@ static void ivas_get_mdft_twid_factors_fx( case IVAS_40_PT_LEN: *ppTwid = &ivas_mdft_coeff_cos_twid_40_fx[0]; break; - default: assert( !"Not supported FFT length!" ); break; @@ -122,7 +123,7 @@ static void ivas_get_imdft_twid_factors_fx( const Word16 length, const Word32 **ppTwid ) { - switch ( length ) + SWITCH( length ) { case L_FRAME48k: *ppTwid = ivas_mdft_coeff_cos_twid_960_fx; @@ -271,31 +272,37 @@ static void get_one_by_length_fx( Word32 *one_by_length, const Word16 length ) { - if ( length == L_FRAME48k ) + IF( EQ_16( length, L_FRAME48k ) ) { *one_by_length = IVAS_ONE_BY_960_Q37; + move32(); } - else if ( length == L_FRAME32k ) + ELSE IF( EQ_16( length, L_FRAME32k ) ) { *one_by_length = IVAS_ONE_BY_640_Q37; + move32(); } - else if ( length == L_FRAME16k ) + ELSE IF( EQ_16( length, L_FRAME16k ) ) { *one_by_length = IVAS_ONE_BY_320_Q37; + move32(); } - else if ( length == IVAS_240_PT_LEN ) + ELSE IF( EQ_16( length, IVAS_240_PT_LEN ) ) { *one_by_length = IVAS_ONE_BY_240_Q37; + move32(); } - else if ( length == IVAS_160_PT_LEN ) + ELSE IF( EQ_16( length, IVAS_160_PT_LEN ) ) { *one_by_length = IVAS_ONE_BY_160_Q37; + move32(); } - else if ( length == IVAS_80_PT_LEN ) + ELSE IF( EQ_16( length, IVAS_80_PT_LEN ) ) { *one_by_length = IVAS_ONE_BY_80_Q37; + move32(); } - else + ELSE { assert( !"Not supported FFT length!" ); } @@ -320,17 +327,23 @@ static void ivas_ifft_cplx1_fx( /* re-arrange inputs to use fft as ifft */ re[0] = Mpy_32_32( re[0], one_by_length ); + move32(); im[0] = Mpy_32_32( im[0], one_by_length ); + move32(); - for ( i = 1; i <= length >> 1; i++ ) + FOR( i = 1; i <= length >> 1; i++ ) { - tmp = Mpy_32_32( re[length - i], one_by_length ); /*stl_arr_index*/ - re[length - i] = Mpy_32_32( re[i], one_by_length ); /*stl_arr_index*/ + tmp = Mpy_32_32( re[sub( length, i )], one_by_length ); /*stl_arr_index*/ + re[sub( length, i )] = Mpy_32_32( re[i], one_by_length ); /*stl_arr_index*/ + move32(); re[i] = tmp; + move32(); - tmp = Mpy_32_32( im[length - i], one_by_length ); /*stl_arr_index*/ - im[length - i] = Mpy_32_32( im[i], one_by_length ); /*stl_arr_index*/ + tmp = Mpy_32_32( im[sub( length, i )], one_by_length ); /*stl_arr_index*/ + im[sub( length, i )] = Mpy_32_32( im[i], one_by_length ); /*stl_arr_index*/ + move32(); im[i] = tmp; + move32(); } fft_fx( re, im, length, 1 ); @@ -358,34 +371,42 @@ void ivas_mdft_fx( Word32 im[L_FRAME48k]; Word16 j, len_by_2; const Word32 *pTwid; - len_by_2 = mdft_length >> 1; + len_by_2 = shr( mdft_length, 1 ); ivas_get_mdft_twid_factors_fx( mdft_length, &pTwid ); - if ( mdft_length == input_length ) + IF( EQ_16( mdft_length, input_length ) ) { - for ( j = 0; j < mdft_length; j++ ) + FOR( j = 0; j < mdft_length; j++ ) { re[j] = Mpy_32_32( pIn[j], pTwid[j] ); - im[j] = Mpy_32_32( -pIn[j], pTwid[mdft_length - j] ); + move32(); + im[j] = Mpy_32_32( L_negate( pIn[j] ), pTwid[sub( mdft_length, j )] ); + move32(); } } - else + ELSE { - for ( j = 0; j < mdft_length; j++ ) + FOR( j = 0; j < mdft_length; j++ ) { - re[j] = Msub_32_32( Mpy_32_32( pIn[j], pTwid[j] ), pIn[j + mdft_length], pTwid[mdft_length - j] ); - im[j] = Msub_32_32( Mpy_32_32( -pIn[j], pTwid[mdft_length - j] ), pIn[j + mdft_length], pTwid[j] ); + re[j] = Msub_32_32( Mpy_32_32( pIn[j], pTwid[j] ), pIn[add( mdft_length, j )], pTwid[sub( mdft_length, j )] ); + move32(); + im[j] = Msub_32_32( Mpy_32_32( L_negate( pIn[j] ), pTwid[sub( mdft_length, j )] ), pIn[add( mdft_length, j )], pTwid[j] ); + move32(); } } fft_fx( re, im, mdft_length, 1 ); - for ( j = 0; j < len_by_2; j++ ) + FOR( j = 0; j < len_by_2; j++ ) { pOut_re[2 * j] = re[j]; - pOut_re[2 * j + 1] = re[mdft_length - j - 1]; + move32(); + pOut_re[add( imult1616( 2, j ), 1 )] = re[sub( sub( mdft_length, j ), 1 )]; + move32(); pOut_im[2 * j] = im[j]; - pOut_im[2 * j + 1] = -im[mdft_length - j - 1]; + move32(); + pOut_im[add( imult1616( 2, j ), 1 )] = L_negate( im[sub( sub( mdft_length, j ), 1 )] ); + move32(); } return; } @@ -408,28 +429,35 @@ void ivas_imdft_fx( Word32 *re_tmp = pOut; Word32 *im_tmp = pOut + length; Word32 tmp; - Word32 j; - Word32 len_by_2 = length >> 1; + Word16 j; + Word16 len_by_2; const Word32 *pTwid; + len_by_2 = shr( length, 1 ); ivas_get_imdft_twid_factors_fx( length, &pTwid ); - for ( j = 0; j < len_by_2; j++ ) + FOR( j = 0; j < len_by_2; j++ ) { re_tmp[j] = pRe[2 * j]; - re_tmp[j + len_by_2] = pRe[length - 2 * j - 1]; + move32(); + re_tmp[add( j, len_by_2 )] = pRe[sub( sub( length, imult1616( 2, j ) ), 1 )]; + move32(); im_tmp[j] = pIm[2 * j]; - im_tmp[j + len_by_2] = -pIm[length - 2 * j - 1]; + move32(); + im_tmp[add( j, len_by_2 )] = L_negate( pIm[sub( sub( length, imult1616( 2, j ) ), 1 )] ); + move32(); } ivas_ifft_cplx1_fx( re_tmp, im_tmp, length ); - for ( j = 0; j < length; j++ ) + FOR( j = 0; j < length; j++ ) { - tmp = Msub_32_32( Mpy_32_32( re_tmp[j] >> 6, pTwid[j] ), im_tmp[j] >> 6, pTwid[length - j] ); - im_tmp[j] = -( Madd_32_32( Mpy_32_32( re_tmp[j] >> 6, pTwid[length - j] ), im_tmp[j] >> 6, pTwid[j] ) ); + tmp = Msub_32_32( Mpy_32_32( L_shr( re_tmp[j], Q6 ), pTwid[j] ), L_shr( im_tmp[j], Q6 ), pTwid[sub( length, j )] ); + im_tmp[j] = L_negate( Madd_32_32( Mpy_32_32( L_shr( re_tmp[j], Q6 ), pTwid[sub( length, j )] ), L_shr( im_tmp[j], Q6 ), pTwid[j] ) ); + move32(); re_tmp[j] = tmp; + move32(); } return; } diff --git a/lib_com/ivas_omasa_com.c b/lib_com/ivas_omasa_com.c index afdac0d9b..d7f25bfbb 100644 --- a/lib_com/ivas_omasa_com.c +++ b/lib_com/ivas_omasa_com.c @@ -95,7 +95,7 @@ ISM_MODE ivas_omasa_ism_mode_select_fx( ) { ISM_MODE ism_mode = ISM_MODE_NONE; - move16(); + move32(); SWITCH( nchan_ism ) { @@ -103,73 +103,73 @@ ISM_MODE ivas_omasa_ism_mode_select_fx( IF( GE_32( ivas_total_brate, IVAS_24k4 ) ) { ism_mode = ISM_MASA_MODE_DISC; - move16(); + move32(); } ELSE { ism_mode = ISM_MODE_NONE; - move16(); + move32(); } BREAK; case 2: IF( GE_32( ivas_total_brate, IVAS_48k ) ) { ism_mode = ISM_MASA_MODE_DISC; - move16(); + move32(); } ELSE IF( GE_32( ivas_total_brate, IVAS_32k ) ) { ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ; - move16(); + move32(); } ELSE { ism_mode = ISM_MODE_NONE; - move16(); + move32(); } BREAK; case 3: IF( GE_32( ivas_total_brate, IVAS_96k ) ) { ism_mode = ISM_MASA_MODE_DISC; - move16(); + move32(); } ELSE IF( GE_32( ivas_total_brate, IVAS_64k ) ) { ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ; - move16(); + move32(); } ELSE IF( GE_32( ivas_total_brate, IVAS_32k ) ) { ism_mode = ISM_MASA_MODE_MASA_ONE_OBJ; - move16(); + move32(); } ELSE { ism_mode = ISM_MODE_NONE; - move16(); + move32(); } BREAK; case 4: IF( GE_32( ivas_total_brate, IVAS_128k ) ) { ism_mode = ISM_MASA_MODE_DISC; - move16(); + move32(); } ELSE IF( GE_32( ivas_total_brate, IVAS_64k ) ) { ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ; - move16(); + move32(); } ELSE IF( GE_32( ivas_total_brate, IVAS_32k ) ) { ism_mode = ISM_MASA_MODE_MASA_ONE_OBJ; - move16(); + move32(); } ELSE { ism_mode = ISM_MODE_NONE; - move16(); + move32(); } BREAK; } @@ -661,8 +661,10 @@ void ivas_combined_format_brate_sanity_fx( nBits = extract_l( Mpy_32_32( *core_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); *diff_nBits = sub( nBits, limit_high ); + move16(); IF( *diff_nBits > 0 ) { + test(); IF( EQ_16( core, TCX_20_CORE ) || EQ_16( core, TCX_10_CORE ) ) { *diff_nBits = 0; @@ -671,6 +673,7 @@ void ivas_combined_format_brate_sanity_fx( ELSE /* ACELP core */ { *core_brate = L_sub( *core_brate, L_mult0( *diff_nBits, FRAMES_PER_SEC ) ); + move32(); } } } @@ -883,6 +886,12 @@ void calculate_nbits_meta( static Word16 get_bits_ism( Word32 val ) { Word16 res; + test(); + test(); + test(); + test(); + test(); + test(); IF( LE_32( val, 536870912 ) && GT_32( val, 447750340 ) ) { res = 0; @@ -1038,19 +1047,22 @@ void get_panning_gain( const Word16 sinAngleMapped, Word16 *panningGains ) { - Word16 tbl_len = 601; - Word16 idx = shr( tbl_len, 1 ); + Word16 tbl_len, idx, lim_l, lim_r; const Word16 *ptr_sin = &ivas_sine_panning_tbl_fx[0]; const Word16 *ptr_tan_0 = ivas_tan_panning_gain_tbl_fx; - Word16 lim_l = 0; + tbl_len = 601; move16(); - Word16 lim_r = tbl_len; + idx = shr( tbl_len, 1 ); + lim_l = 0; + move16(); + lim_r = tbl_len; move16(); WHILE( 1 ) { idx = shr( add( lim_l, lim_r ), 1 ); + test(); IF( GE_16( idx, tbl_len ) ) { panningGains[0] = ptr_tan_0[tbl_len - 1]; @@ -1059,7 +1071,7 @@ void get_panning_gain( move16(); BREAK; } - ELSE IF( LT_16( idx, 0 ) ) + ELSE IF( idx < 0 ) { panningGains[0] = ptr_tan_0[0]; move16(); @@ -1073,7 +1085,7 @@ void get_panning_gain( { panningGains[0] = ptr_tan_0[idx + 1]; move16(); - panningGains[1] = ptr_tan_0[tbl_len - idx - 2]; + panningGains[1] = ptr_tan_0[sub( sub( tbl_len, idx ), 2 )]; move16(); BREAK; } @@ -1081,25 +1093,26 @@ void get_panning_gain( { panningGains[0] = ptr_tan_0[idx]; move16(); - panningGains[1] = ptr_tan_0[tbl_len - idx - 1]; + panningGains[1] = ptr_tan_0[sub( sub( tbl_len, idx ), 1 )]; move16(); BREAK; } ELSE { - Word16 mid = extract_l( L_shr( L_add( L_deposit_l( ptr_sin[idx] ), L_deposit_l( ptr_sin[idx + 1] ) ), 1 ) ); + Word16 mid; + mid = extract_l( L_shr( L_add( L_deposit_l( ptr_sin[idx] ), L_deposit_l( ptr_sin[idx + 1] ) ), 1 ) ); IF( LE_16( sinAngleMapped, mid ) ) { panningGains[0] = ptr_tan_0[idx]; move16(); - panningGains[1] = ptr_tan_0[tbl_len - idx - 1]; + panningGains[1] = ptr_tan_0[sub( sub( tbl_len, idx ), 1 )]; move16(); } ELSE { panningGains[0] = ptr_tan_0[idx + 1]; move16(); - panningGains[1] = ptr_tan_0[tbl_len - idx - 2]; + panningGains[1] = ptr_tan_0[sub( sub( tbl_len, idx ), 2 )]; move16(); } BREAK; @@ -1147,7 +1160,8 @@ void ivas_get_stereo_panning_gains_fx( azSubEl = add( azSubEl, 360 ); } // sin_az_cos_el = (ptr_sin_az[azAddEl] + ptr_sin_az[azSubEl])/2; - Word16 sin_az_cos_el = extract_l( L_shr( L_add( L_deposit_l( ptr_sin_az[azAddEl + 180] ), L_deposit_l( ptr_sin_az[azSubEl + 180] ) ), 1 ) ); + Word16 sin_az_cos_el; + sin_az_cos_el = extract_l( L_shr( L_add( L_deposit_l( ptr_sin_az[azAddEl + 180] ), L_deposit_l( ptr_sin_az[azSubEl + 180] ) ), 1 ) ); IF( GE_16( sin_az_cos_el, SIN_30_DEGREES_Q15 ) ) { /* Left side */ @@ -1198,13 +1212,14 @@ Word16 calculate_brate_limit_flag_fx( FOR( n = 0; n < nchan_ism; n++ ) { brate_limit_flag = add( brate_limit_flag, ism_imp[n] ); - if ( ism_imp[n] == 0 ) + IF( ism_imp[n] == 0 ) { nzeros = add( nzeros, 1 ); } } nchan_ism_sat = nchan_ism; - if ( EQ_16( nchan_ism & 1, 1 ) ) + move16(); + IF( EQ_16( s_and( nchan_ism, 1 ), 1 ) ) { nchan_ism_sat = sub( nchan_ism, 1 ); } diff --git a/lib_com/ivas_pca_tools.c b/lib_com/ivas_pca_tools.c index 98db76f4b..2fa1f11f0 100644 --- a/lib_com/ivas_pca_tools.c +++ b/lib_com/ivas_pca_tools.c @@ -82,7 +82,7 @@ void eye_matrix_fx( } FOR( i = 0; i < n; i++ ) { - mat[i * n + i] = d; + mat[add( imult1616( i, n ), i )] = d; move16(); } @@ -606,21 +606,37 @@ void dquat2mat_fx( dy = mult( d, y ); dz = mult( d, z ); m[0] = sub( sub( aw, bx ), add( cy, dz ) ); + move16(); m[1] = sub( sub( cz, dy ), add( ax, bw ) ); - m[2] = add( sub( sub( -ay, bz ), cw ), dx ); + move16(); + m[2] = add( sub( sub( negate( ay ), bz ), cw ), dx ); + move16(); m[3] = sub( sub( by, az ), add( cx, dw ) ); + move16(); m[4] = add( sub( add( bw, ax ), dy ), cz ); - m[5] = add( add( add( -bx, aw ), dz ), cy ); - m[6] = sub( sub( add( -by, az ), dw ), cx ); - m[7] = add( sub( sub( -bz, ay ), dx ), cw ); + move16(); + m[5] = add( add( add( negate( bx ), aw ), dz ), cy ); + move16(); + m[6] = sub( sub( add( negate( by ), az ), dw ), cx ); + move16(); + m[7] = add( sub( sub( negate( bz ), ay ), dx ), cw ); + move16(); m[8] = sub( add( add( cw, dx ), ay ), bz ); - m[9] = sub( sub( add( -cx, dw ), az ), by ); - m[10] = add( add( add( -cy, dz ), aw ), bx ); - m[11] = sub( add( sub( -cz, dy ), ax ), bw ); + move16(); + m[9] = sub( sub( add( negate( cx ), dw ), az ), by ); + move16(); + m[10] = add( add( add( negate( cy ), dz ), aw ), bx ); + move16(); + m[11] = sub( add( sub( negate( cz ), dy ), ax ), bw ); + move16(); m[12] = add( add( sub( dw, cx ), by ), az ); - m[13] = add( sub( sub( -dx, cw ), bz ), ay ); - m[14] = sub( add( sub( -dy, cz ), bw ), ax ); - m[15] = add( add( add( -dz, cy ), bx ), aw ); + move16(); + m[13] = add( sub( sub( negate( dx ), cw ), bz ), ay ); + move16(); + m[14] = sub( add( sub( negate( dy ), cz ), bw ), ax ); + move16(); + m[15] = add( add( add( negate( dz ), cy ), bx ), aw ); + move16(); return; } @@ -691,23 +707,28 @@ void quat_shortestpath_fx( { Word32 d0, d1; Word16 res, i; - Word16 exp1 = 0, exp2 = 0; + Word16 exp1, exp2; + exp1 = 0; + move16(); + exp2 = 0; + move16(); d0 = dotp_fx( q00, q01, IVAS_PCA_INTERP, &exp1 ); d1 = dotp_fx( q10, q11, IVAS_PCA_INTERP, &exp2 ); res = 0; move16(); - IF( LT_32( d0, 0 ) && LT_32( d1, 0 ) ) + test(); + IF( d0 < 0 && d1 < 0 ) { res = 1; move16(); } ELSE { - IF( LT_32( d0, 0 ) ) + IF( d0 < 0 ) { - IF( GT_32( ( -d0 ), d1 ) ) + if ( GT_32( L_negate( d0 ), d1 ) ) { res = 1; move16(); @@ -715,9 +736,9 @@ void quat_shortestpath_fx( } ELSE { - IF( LT_32( d1, 0 ) ) + IF( d1 < 0 ) { - IF( GT_32( ( -d1 ), d0 ) ) + if ( GT_32( L_negate( d1 ), d0 ) ) { res = 1; move16(); @@ -730,9 +751,9 @@ void quat_shortestpath_fx( { FOR( i = 0; i < IVAS_PCA_INTERP; i++ ) { - q01[i] = -q01[i]; + q01[i] = negate( q01[i] ); move16(); - q11[i] = -q11[i]; + q11[i] = negate( q11[i] ); move16(); } } @@ -802,14 +823,17 @@ static void norm_quat_fx( Word16 *q ) { Word32 norm_q; - Word16 i, exp1 = 0; + Word16 i, exp1; + exp1 = 0; + move16(); norm_q = dotp_fx( q, q, IVAS_PCA_INTERP, &exp1 ); - exp1 = ( 31 - ( exp1 + 2 ) ); + exp1 = sub( 31, add( exp1, 2 ) ); norm_q = ISqrt32( norm_q, &exp1 ); /*q(15 - exp)*/ FOR( i = 0; i < IVAS_PCA_INTERP; i++ ) { - q[i] = mult( q[i], (Word16) L_shr( norm_q, 15 ) ); // todo : recheck + q[i] = mult( q[i], extract_l( L_shr( norm_q, 15 ) ) ); // todo : recheck + move16(); } return; @@ -846,11 +870,15 @@ static void quat_nlerp_preproc_fx( FOR( i = 0; i < IVAS_PCA_INTERP; i++ ) { - tmp1 = mult( ( MAX_16 - alpha ), q1[i] ); + tmp1 = mult( sub( MAX_16, alpha ), q1[i] ); tmp2 = mult_r( alpha, q0[i] ); - IF( ( alpha == q0[i] ) && ( alpha == 32767 ) ) - tmp2 = 32767; + if ( EQ_16( alpha, q0[i] ) && EQ_16( alpha, 32767 ) ) + { + tmp2 = 32767; + move16(); + } q_slerp[i] = add( tmp1, tmp2 ); + move16(); } norm_quat_fx( q_slerp ); @@ -898,13 +926,15 @@ void pca_interp_preproc_fx( FOR( j = 0; j < len; j++ ) { tmp = sub( len, 1 ); - IF( EQ_16( j, 0 ) ) + IF( j == 0 ) { alpha = 0; move16(); } ELSE - alpha = idiv1616( j, tmp ); // the increment can be updated by simple delta //q15 + { + alpha = idiv1616( j, tmp ); // the increment can be updated by simple delta //q15 + } tmp2 = mult( EVS_PI_FX, alpha ); // q13 tmp3 = getCosWord16( tmp2 ); // q14 alpha = shr( sub( ONE_IN_Q14, tmp3 ), 1 ); // q15 @@ -960,9 +990,13 @@ static void sp2cart_fx( s2 = getSinWord16( ph2 ); // q15 s1s2 = mult( s1, s2 ); // q15 q[3] = mult( getSinWord16( ph3 ), s1s2 ); // q15 + move16(); q[2] = mult( getCosWord16( ph3 ), s1s2 ); // q15 - q[1] = mult( getCosWord16( ph2 ), s1 ); // q15 + move16(); + q[1] = mult( getCosWord16( ph2 ), s1 ); // q15 + move16(); q[0] = shl_sat( getCosWord16( ph1 ), 1 ); // q15 + move16(); return; } @@ -986,10 +1020,11 @@ static Word16 calc_n2_fx( const Word16 ph1 ) { Word16 n2; - Word32 temp = L_mult( 23040, getSinWord16( ph1 ) ); // q8 + Word32 temp; + temp = L_mult( 23040, getSinWord16( ph1 ) ); // q8 n2 = round_fx( temp ); n2 = shr( n2, 7 ); - IF( EQ_16( s_and( n2, 1 ), 0 ) ) + IF( s_and( n2, 1 ) == 0 ) { n2 = add( n2, 1 ); } @@ -1031,14 +1066,14 @@ static Word16 calc_n3_fx( n3 = shr( n3, 8 ); - IF( EQ_16( n3, 0 ) ) + IF( n3 == 0 ) { n3 = 1; move16(); } ELSE { - IF( ( s_and( n3, 1 ) ) == 1 ) + IF( EQ_16( s_and( n3, 1 ), 1 ) ) { n3 = add( n3, 1 ); } @@ -1215,7 +1250,7 @@ static Word16 get_pca_offset_n2_fx( } ELSE { - index2 = ivas_pca_offset_n2[IVAS_PCA_N1 - 1 - index1]; + index2 = ivas_pca_offset_n2[sub( sub( IVAS_PCA_N1, 1 ), index1 )]; move16(); } @@ -1436,11 +1471,11 @@ void pca_dec_s3_fx( move16(); FOR( i = 0; i < IVAS_PCA_N1; i++ ) { - IF( j < ivas_pca_offset_index1[i + 1] ) + IF( LT_32( j, ivas_pca_offset_index1[i + 1] ) ) { index1 = i; move16(); - break; + BREAK; } } @@ -1448,7 +1483,9 @@ void pca_dec_s3_fx( n1 = IVAS_PCA_N1; move16(); - Word16 num_fx = 12868; + Word16 num_fx; + num_fx = 12868; + move16(); d_fx = idiv1616( num_fx, n1 ); // Q12 ph1_q_fx = i_mult( index1, d_fx ); // Q12 @@ -1460,11 +1497,11 @@ void pca_dec_s3_fx( move16(); FOR( i = 0; i < n2; i++ ) { - IF( j < ivas_pca_offset_index2[i + get_pca_offset_n2_fx( index1 ) + 1] ) + IF( LT_32( j, L_deposit_l( ivas_pca_offset_index2[add( add( i, get_pca_offset_n2_fx( index1 ) ), 1 )] ) ) ) { index2 = i; move16(); - break; + BREAK; } } @@ -1484,10 +1521,10 @@ void pca_dec_s3_fx( ph2_q_fx = i_mult( index2, d_fx ); // Q12 } - j = L_sub( j, ivas_pca_offset_index2[index2 + get_pca_offset_n2_fx( index1 )] ); + j = L_sub( j, ivas_pca_offset_index2[add( index2, get_pca_offset_n2_fx( index1 ) )] ); + + index3 = extract_l( j ); - index3 = (Word16) j; - move16(); n3 = calc_n3_fx( ph1_q_fx, ph2_q_fx ); IF( EQ_16( n3, 1 ) ) diff --git a/lib_com/ivas_qmetadata_com.c b/lib_com/ivas_qmetadata_com.c index bc998fed5..dcd68f04b 100644 --- a/lib_com/ivas_qmetadata_com.c +++ b/lib_com/ivas_qmetadata_com.c @@ -45,8 +45,11 @@ #include "prot_fx2.h" #include "ivas_prot_fx.h" #endif +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif -//#include "debug.h" +// #include "debug.h" /*-----------------------------------------------------------------------* * Local constants @@ -139,6 +142,7 @@ ivas_error ivas_qmetadata_allocate_memory( ELSE { do_realloc = TRUE; + move16(); } IF( do_realloc ) @@ -146,6 +150,7 @@ ivas_error ivas_qmetadata_allocate_memory( ivas_qmetadata_free_memory( hQMetaData ); hQMetaData->numCodingBands = (UWord8) nbands; + move16(); hQMetaData->no_directions = ndirs; move16(); hQMetaData->coherence_flag = coherence_flag; @@ -160,7 +165,7 @@ ivas_error ivas_qmetadata_allocate_memory( { hQMetaData->q_direction[dir].cfg.nbands = nbands; move16(); - IF( EQ_16( nbands, 0 ) ) + IF( nbands == 0 ) { hQMetaData->q_direction[dir].band_data = NULL; } @@ -427,6 +432,7 @@ void ivas_qmetadata_close( IVAS_QMETADATA_HANDLE *hQMetaData /* i/o: q_metadata handle */ ) { + test(); IF( hQMetaData == NULL || *hQMetaData == NULL ) { return; @@ -547,10 +553,10 @@ ivas_error only_reduce_bits_direction_fx( delta = 1; move16(); - IF( GT_16( reduce_bits, 0 ) ) + IF( reduce_bits > 0 ) { - red_times = reduce_bits / ( coding_subbands * no_subframes ); /* number of complete reductions by 1 bit */ - IF( GT_16( red_times, 0 ) ) + red_times = idiv1616( reduce_bits, imult1616( coding_subbands, no_subframes ) ); /* number of complete reductions by 1 bit */ + IF( red_times > 0 ) { FOR( j = 0; j < coding_subbands; j++ ) { @@ -582,14 +588,15 @@ ivas_error only_reduce_bits_direction_fx( bits_dir0 = (Word16 *) q_direction->band_data[j].bits_sph_idx; FOR( k = 0; k < no_subframes; k++ ) { + test(); IF( LT_16( n, rem ) && GT_16( bits_dir0[k], sub( MASA_MIN_BITS_TF, delta ) ) ) { bits_dir0[k] = sub( bits_dir0[k], 1 ); move16(); - n++; + n = add( n, 1 ); } - IF( LT_16( max_nb, bits_dir0[k] ) ) + if ( LT_16( max_nb, bits_dir0[k] ) ) { max_nb = bits_dir0[k]; move16(); @@ -635,7 +642,9 @@ ivas_error only_reduce_bits_direction_fx( FOR( j = 0; j < m; j++ ) { index1 = ind_order[j]; + move16(); index2 = ind_order[j + 1]; + move16(); tmp = 0; move16(); FOR( k = 0; k < no_subframes; k++ ) @@ -643,6 +652,7 @@ ivas_error only_reduce_bits_direction_fx( tmp = add( tmp, sub( bits_sph_idx_orig[index1][k], q_direction->band_data[index1].bits_sph_idx[k] ) ); } penalty[0] = L_shr( W_extract_l( W_mult_32_16( tmp, bits_sph_idx_orig[index2][0] ) ), 1 ); + move32(); tmp = 0; move16(); FOR( k = 0; k < no_subframes; k++ ) @@ -650,6 +660,7 @@ ivas_error only_reduce_bits_direction_fx( tmp = add( tmp, sub( bits_sph_idx_orig[index2][k], q_direction->band_data[index2].bits_sph_idx[k] ) ); } penalty[1] = L_shr( W_extract_l( W_mult_32_16( tmp, bits_sph_idx_orig[index1][0] ) ), 1 ); + move32(); IF( LT_32( penalty[0], penalty[1] ) ) { sorted = 0; @@ -691,7 +702,7 @@ ivas_error only_reduce_bits_direction_fx( move16(); FOR( k = 0; k < no_subframes; k++ ) { - IF( GT_16( bits_sph_idx_orig[j][k], 0 ) ) + IF( bits_sph_idx_orig[j][k] > 0 ) { tmp = add( tmp, sub( bits_sph_idx_orig[j][k], q_direction->band_data[j].bits_sph_idx[k] ) ); } @@ -709,7 +720,7 @@ ivas_error only_reduce_bits_direction_fx( { FOR( k = 0; k < no_subframes; k++ ) { - IF( GT_16( bits_sph_idx_orig[j][k], 0 ) ) + IF( bits_sph_idx_orig[j][k] > 0 ) { tmp = BASOP_Util_Divide3232_Scale( extract_l( L_sub( bits_sph_idx_orig[j][k], q_direction->band_data[j].bits_sph_idx[k] ) ), bits_sph_idx_orig[j][k], &tmp_e ); tmp_32 = L_add( tmp_32, L_shl( tmp, tmp_e ) ); @@ -725,6 +736,7 @@ ivas_error only_reduce_bits_direction_fx( } *reduce_bits_out = negate( reduce_bits ); + move16(); return IVAS_ERR_OK; } @@ -856,32 +868,36 @@ void update_bits_next_block( Word16 k; diff = *p_diff; move16(); - IF( LT_16( diff, 0 ) ) + IF( diff < 0 ) { /* increase bits for next subbands */ k = 0; move16(); - WHILE( LT_16( diff, 0 ) && LT_16( j, max_i ) && LT_16( k, max_k ) ) + WHILE( diff < 0 && LT_16( j, max_i ) && LT_16( k, max_k ) ) { + test(); + test(); IF( LT_32( q_direction->band_data[j].bits_sph_idx[k], MASA_DIRECTION_MAX_BITS ) ) { q_direction->band_data[j].bits_sph_idx[k] = (UWord16) L_add( q_direction->band_data[j].bits_sph_idx[k], 1 ); move16(); - diff++; + diff = add( diff, 1 ); } - k++; + k = add( k, 1 ); } } ELSE { k = 0; - WHILE( GT_16( diff, 0 ) && LT_16( k, max_k ) ) + move16(); + WHILE( diff > 0 && LT_16( k, max_k ) ) { - IF( GT_32( q_direction->band_data[j].bits_sph_idx[k], 0 ) ) + test(); + IF( q_direction->band_data[j].bits_sph_idx[k] > 0 ) { q_direction->band_data[j].bits_sph_idx[k] = (UWord16) L_sub( q_direction->band_data[j].bits_sph_idx[k], 1 ); move16(); - diff--; + diff = sub( diff, 1 ); } } } @@ -990,8 +1006,8 @@ void invdct4_transform_fx( a_fx = L_add( v_fx[0], v_fx[2] ); b_fx = L_sub( v_fx[0], v_fx[2] ); - c_fx = L_shl( L_add( Mpy_32_32( 1402911360, v_fx[1] ), Mpy_32_32( 581104896, v_fx[3] ) ), 31 - 30 ); - d_fx = L_shl( L_sub( Mpy_32_32( 581104896, v_fx[1] ), Mpy_32_32( 1402911360, v_fx[3] ) ), 31 - 30 ); + c_fx = L_shl( L_add( Mpy_32_32( 1402911360, v_fx[1] ), Mpy_32_32( 581104896, v_fx[3] ) ), Q31 - Q30 ); + d_fx = L_shl( L_sub( Mpy_32_32( 581104896, v_fx[1] ), Mpy_32_32( 1402911360, v_fx[3] ) ), Q31 - Q30 ); f_invdct_v_fx[0] = L_shl( L_add( a_fx, c_fx ), 7 ); move32(); f_invdct_v_fx[1] = L_shl( L_add( b_fx, d_fx ), 7 ); @@ -1003,9 +1019,10 @@ void invdct4_transform_fx( FOR( i = 0; i < 4; i++ ) { - IF( LT_32( f_invdct_v_fx[i], 0 ) ) + IF( f_invdct_v_fx[i] < 0 ) { invdct_v[i] = 0; + move16(); } ELSE { @@ -1015,6 +1032,7 @@ void invdct4_transform_fx( move32(); } invdct_v[i] = (UWord8) L_shr( f_invdct_v_fx[i], q ); + move16(); } } @@ -1043,12 +1061,16 @@ void masa_compensate_two_dir_energy_ratio_index_fx( IF( hodirac_flag ) { *ratio_index_mod1 = masa_diffuse_ratios[ratio_index_1][ratio_index_2].hordiac_ratio1; + move16(); *ratio_index_mod2 = masa_diffuse_ratios[ratio_index_1][ratio_index_2].hoardia_ratio2; + move16(); } ELSE { *ratio_index_mod1 = masa_diffuse_ratios[ratio_index_1][ratio_index_2].ratio1; + move16(); *ratio_index_mod2 = masa_diffuse_ratios[ratio_index_1][ratio_index_2].ratio2; + move16(); } return; @@ -1222,8 +1244,10 @@ void ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( L_tmp = L_add( Mpy_32_32( dv[0], dv[0] ), Mpy_32_32( dv[1], dv[1] ) ); /* 2 * dv_q - 31 */ e_tmp = shl( sub( 31, dv_q ), 1 ); L_tmp = Sqrt32( L_tmp, &e_tmp ); - *el = L_mult0( BASOP_util_atan2( dv[2], L_tmp, 31 - dv_q - e_tmp ), 29335 ); /* Q22 */ - *az = L_mult0( BASOP_util_atan2( dv[1], dv[0], 0 ), 29335 ); /* Q22 */ + *el = L_mult0( BASOP_util_atan2( dv[2], L_tmp, sub( sub( 31, dv_q ), e_tmp ) ), 29335 ); /* Q22 */ + move32(); + *az = L_mult0( BASOP_util_atan2( dv[1], dv[0], 0 ), 29335 ); /* Q22 */ + move32(); return; } #endif diff --git a/lib_com/ivas_qspherical_com.c b/lib_com/ivas_qspherical_com.c index 9c2f5f643..0eb7f6a1c 100644 --- a/lib_com/ivas_qspherical_com.c +++ b/lib_com/ivas_qspherical_com.c @@ -41,6 +41,9 @@ #include "cnst.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*------------------------------------------------------------------------- @@ -78,7 +81,7 @@ Word16 ivas_qmetadata_dereorder_generic( const UWord16 uns_value /* i : unsigned value result of ReorderGeneric */ ) { - IF( NE_32( L_and( uns_value, 1 ), 0 ) ) + IF( L_and( uns_value, 1 ) != 0 ) { return sub( negate( extract_l( L_shr( uns_value, 1 ) ) ), 1 ); } @@ -121,7 +124,7 @@ Word16 ivas_dirac_project_elevation_index( Word16 el_idx_proj; /* evaluate floor((el_idx / (el_alph - 1)) * (el_alph_proj - 1) + 0.5) using only integer */ - el_idx_proj = ( 2 * el_idx * ( el_alph_proj - 1 ) + ( el_alph - 1 ) ) / ( 2 * ( el_alph - 1 ) ); + el_idx_proj = idiv1616( add( imult1616( imult1616( 2, el_idx ), sub( el_alph_proj, 1 ) ), sub( el_alph, 1 ) ), imult1616( 2, sub( el_alph, 1 ) ) ); return el_idx_proj; } @@ -161,11 +164,11 @@ Word16 ivas_chan_project_elevation_index( /* evaluate floor((el_idx / (el_alph - 1)) * (el_alph_proj - 1) + 0.5) using only integer */ IF( EQ_16( el_idx, sub( el_alph, 1 ) ) ) { - el_idx_proj = el_alph_proj - 1; + el_idx_proj = sub( el_alph_proj, 1 ); } ELSE { - el_idx_proj = ( 2 * el_idx * el_alph_proj + el_alph ) / ( 2 * el_alph ); + el_idx_proj = idiv1616( add( imult1616( imult1616( 2, el_idx ), el_alph_proj ), el_alph ), imult1616( 2, el_alph ) ); } return el_idx_proj; @@ -216,9 +219,9 @@ Word16 ivas_dirac_project_azimuth_index( } /* evaluate floor((az_idx / az_alph) * az_alph_proj + 0.5) using only integer */ - az_idx_proj = ( 2 * az_idx * az_alph_proj + az_alph ) / ( 2 * az_alph ); + az_idx_proj = idiv1616( add( imult1616( imult1616( 2, az_idx ), az_alph_proj ), az_alph ), imult1616( 2, az_alph ) ); - IF( EQ_16( az_idx_proj, az_alph_proj ) ) + if ( EQ_16( az_idx_proj, az_alph_proj ) ) { az_idx_proj = 0; move16(); @@ -280,6 +283,7 @@ void small_reduction_direction( IF( GT_32( bits_dir[i][j], MASA_MIN_BITS_TF ) ) { bits_dir[i][j] = (UWord16) L_sub( bits_dir[i][j], 1 ); + move16(); ( *diff )--; } } @@ -411,7 +415,9 @@ Word16 quantize_phi_fx( Word32 temp_res; delta_phi_fx = delta_phi_val[n]; + move32(); inv_delta_phi_fx = inv_delta_phi_val[n]; + move32(); IF( EQ_16( n, 1 ) ) { *phi_hat = 0; @@ -433,17 +439,17 @@ Word16 quantize_phi_fx( } temp_res = Mpy_32_32( L_sub( L_sub( phi, DEGREE_180_Q_22 ), dd_fx ), inv_delta_phi_fx ); - id_phi = round_fx( L_shr( temp_res, 22 - 16 ) ); + id_phi = round_fx( L_shr( temp_res, Q22 - Q16 ) ); assert( L_sub( L_abs( temp_res ), abs( id_phi ) * ONE_IN_Q22 ) <= ONE_IN_Q21 ); - IF( LT_16( add( id_phi, shr( n, 1 ) ), 0 ) ) + IF( add( id_phi, shr( n, 1 ) ) < 0 ) { id_phi = add( id_phi, 1 ); } - IF( GE_16( sub( id_phi, shr( n, 1 ) ), 0 ) ) + IF( sub( id_phi, shr( n, 1 ) ) >= 0 ) { id_phi = negate( shr( n, 1 ) ); } @@ -465,6 +471,7 @@ ELSE } *phi_hat = L_add( L_add( ( id_phi * delta_phi_fx ), dd_fx ), DEGREE_180_Q_22 ); +move32(); id_phi = add( id_phi, shr( n, 1 ) ); return id_phi; @@ -574,6 +581,66 @@ Word32 companding_azimuth_fx( Word32 comp_azi_fx; Word16 i, not_done, start; Word32 abs_azi_fx; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); test(); test(); @@ -628,6 +695,7 @@ Word32 companding_azimuth_fx( move16(); WHILE( not_done && ( LT_16( i, sub( no_points, 1 ) ) ) ) { + test(); IF( LE_32( abs_azi_fx, pA_fx[i + 1] ) ) { not_done = 0; @@ -669,11 +737,11 @@ Word32 companding_azimuth_fx( } ELSE { - i++; + i = add( i, 1 ); } } - IF( LT_32( azi_fx, 0 ) ) + IF( azi_fx < 0 ) { comp_azi_fx = L_negate( comp_azi_fx ); } diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index c3b7456f3..cc37a8565 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -557,18 +557,6 @@ const float ica_sincInterp2[2*SINC_ORDER1+1] = 1.0f, 0.634114f,0.0f,-0.204776f, 0.0f, 0.115220f,0.0f,-0.074578f, 0.0f, 0.050649f,0.0f,-0.034727f, 0.0f, 0.023503f,0.0f,-0.015447f, 0.0f, 0.009735f,0.0f,-0.005865f, 0.0f, 0.003486f,0.0f,-0.002323f, 0.0f }; -const Word32 ica_sincInterp2_fx[2 * SINC_ORDER1 + 1] = -{ - 0, -4988604, 0, 7486127, 0, --12594991, 0, 20905753, 0, -33172179, 0, -50472307, 0, -74575663, 0, 108767895, 0, --160155039, 0, 247433071, 0, -439753119, 0, -1361749503, 2147483647, 1361749503, 0, -439753119, 0, -247433071, 0, -160155039, 0, 108767895, 0, --74575663, 0, 50472307, 0, -33172179, 0, -20905753, 0, -12594991, 0, 7486127, 0, --4988604, 0 -}; const float ica_sincInterp4[2*SINC_ORDER1+1] = { 0.0f,-0.003285f,-0.005537f,-0.004930f, 0.0f, 0.008295f, 0.015189f, 0.013767f, 0.0f,-0.021845f,-0.038282f,-0.033239f, @@ -596,13 +584,6 @@ const float icbwe_gsMapping_tbl[16] = -0.1690688f, -0.0987095f, -0.0700000f, -0.0500000f, -0.0200000f, 0.0000000f, 0.0400000f, 0.0800000f }; -const Word16 pow_10_icbwe_gsMapping_tbl_fx[16] = //Q14 -{ - 164 ,733 ,1793 ,3195 ,4524 ,5875 ,7438 ,9155 ,11101 ,13053 ,13945 ,14602 ,15647 ,16384 , - 17965 ,19698 -}; - - const float icbwe_gsMappingDFT_tbl[128] = { -5.0000000f, -4.5000000f, -4.0000000f, -3.5000000f, -3.0000000f, -2.5000000f, -1.9000000f, -1.5474502f, @@ -623,20 +604,6 @@ const float icbwe_gsMappingDFT_tbl[128] = 0.0155180f, 0.0224511f, 0.0298570f, 0.0375954f, 0.0457853f, 0.0549424f, 0.0659733f, 0.0785186f }; -const Word16 pow_10_icbwe_gsMappingDFT_tbl_fx[128] = //Q14 -{ - 0 ,1 ,2 ,5 ,16 ,52 ,206 ,464 ,518 ,585 ,667 ,688 ,803 ,899 , - 1324 ,1349 ,1513 ,1534 ,1578 ,1625 ,1711 ,1756 ,1808 ,1879 ,1926 ,2001 ,2050 ,2130 , - 2191 ,2280 ,2366 ,2394 ,2456 ,2574 ,2643 ,2726 ,2796 ,2850 ,2869 ,2908 ,2962 ,2991 , - 3023 ,3051 ,3091 ,3130 ,3202 ,3233 ,3268 ,3342 ,3388 ,3429 ,3483 ,3519 ,3553 ,3595 , - 3651 ,3706 ,3738 ,3795 ,3844 ,3890 ,3946 ,3990 ,4028 ,4075 ,4119 ,4166 ,4214 ,4259 , - 4303 ,4350 ,4389 ,4441 ,4481 ,4540 ,4605 ,4684 ,4764 ,4854 ,4950 ,5068 ,5198 ,5348 , - 5519 ,5692 ,5881 ,6073 ,6273 ,6473 ,6676 ,6883 ,7124 ,7364 ,7616 ,7852 ,8097 ,8370 , - 8630 ,8916 ,9200 ,9496 ,9866 ,10252 ,10652 ,11052 ,11436 ,11813 ,12247 ,12697 ,13153 ,13611 , - 14072 ,14503 ,14936 ,15336 ,15702 ,16032 ,16384 ,16664 ,16980 ,17253 ,17550 ,17866 ,18206 ,18594 , - 19072 ,19631 -}; - /*----------------------------------------------------------------------------------* * TD Stereo ROM tables @@ -650,14 +617,6 @@ const float tdm_ratio_tabl[TDM_NQ+1] = 0.9045f, 0.9330f, 0.9568f, 0.9755f, 0.9891f, 1.0000f, 1.0000f, 1.0000f }; -const UWord32 tdm_ratio_tabl_fx[TDM_NQ + 1] = -{ 0, 0, 23407572, 52613348, 92771296, -143881408, 205084688, 275736896, 355193792, 442596384, 536870912, -636943680, 741955584, 850403520, 961428416, 1073741824, 1186055168, -1297080064, 1405528064, 1510540032, 1610612736, 1704887296, 1792289792, -1871746688, 1942398976, 2003602304, 2054712320, 2094870272, 2124076032, -2147483647, 2147483647, 2147483647 }; - const float tdm_den_ratio_tabl[TDM_NQ+1] = /* 1.0f/(2*LR_ratio*LR_ratio-2*LR_ratio+1) */ { 1.0000f, 1.0000f, 1.0221f, 1.0501f, 1.0902f, 1.1429f, 1.2088f, 1.2884f, @@ -666,14 +625,6 @@ const float tdm_den_ratio_tabl[TDM_NQ+1] = /* 1.0f/(2*LR_ratio*LR_ratio-2*LR_ra 1.2088f, 1.1429f, 1.0902f, 1.0501f, 1.0221f, 1.0000f, 1.0000f, 1.0000f }; -const UWord32 tdm_den_ratio_tabl_fx[TDM_NQ + 1] = -{ 1073741824, 1073741824, 1097471488, 1127536256, 1170593280, -1227179520, 1297939072, 1383409024, 1483374336, 1596009856, 1717986944, -1842648320, 1960330496, 2058470400, 2124290816, 2147483647, 2124290816, -2058470400, 1960330496, 1842648320, 1717986944, 1596009856, 1483374336, -1383409024, 1297939072, 1227179520, 1170593280, 1127536256, 1097471488, -1073741824, 1073741824, 1073741824 }; - const int16_t tdm_bit_allc_tbl[5][6] = { /* IC -- UC -- GC -- TM --AC */ @@ -683,59 +634,7 @@ const int16_t tdm_bit_allc_tbl[5][6] = { 1650, 6050, 0, 10000, 0, 10000 }, /* IVAS_32k */ { 1650, 6050, 0, 13000, 0, 14000 } /* IVAS_48k */ }; -#ifdef IVAS_FLOAT_FIXED -/* LSFs Intra-frame prediction tables */ -//2.56 -const Word16 tdm_LSF_MEAN_RE_USE_OUT_fx[M] = -{ - 771, 1335, 2229, 3431, 4383, 5354, 6371, 7273, 8183, 9198, 10133, 10991, 12058, 13104, 14200, 15152 -}; -//2.56 -const Word16 tdm_LSF_MEAN_RE_USE_IN_fx[M] = -{ - 733, 1337, 2271, 3451, 4418, 5382, 6430, 7304, 8221, 9247, 10165, 11079, 12115, 13197, 14266, 15269, -}; -//2.56 -const Word16 tdm_LSF_MEAN_RE_USE_fx[M] = -{ - 680, 1369, 2354, 3448, 4498, 5435, 6546, 7494, 8446, 9437, 10328, 11248, 12241, 13199, 14189, 15174 -}; - -const Word16 tdm_Beta_Q1bit_re_use_13k2_fx[2] = { 31784, 24576 };//Q15 -const Word16 tdm_Beta_Q1bit_re_use_16k4_fx[2] = { 31129, 23265 };//Q15 -const Word16 tdm_Beta_Q1bit_re_use_24k4_32k_fx[2] = { 30474, 23920 };//Q15 -const Word16 tdm_Beta_Q1bit_re_use_48k_fx[2] = { 31784, 25231 };//Q15 -//Q15 -const Word16 tdm_RE_USE_adaptive_beta_prd_diag_3_fx[15 + 16 + 15] = -{ - 29028, 6750, 1916, 27016, 7516, 1195, 26787, 5557, -196, 27796, 6753, 2172, 29434, 4446, 2175, 26053, 6337, 3063, 26043, 5521, 3633, 26082, - 5989, 3515, 25672, 5911, 4846, 24123, 6494, 4374, 24971, 6225, 6235, 24146, 5619, 5848, 23638, 5393, 6445, 22579, 4027, 6694, 20698, 1779, - 5789, 17681 -}; -//2.56 -const Word16 tdm_LSF_MEAN_PRED_QNT_fx[M] = -{ - 1002, 1558, 2478, 3467, 4377, 5326, 6274, 7160, 8182, 9099, 10022, 10967, 12051, 13081, 14148, 15113 -}; -//2.56 -const Word16 tdm_LSF_MEAN_PRED_QNT_IN_fx[M] = -{ - 739, 1371, 2303, 3436, 4431, 5394, 6378, 7321, 8293, 9282, 10221, 11153, 12166, 13193, 14252, 15290 -}; -//2.56 -const Word16 tdm_LSF_MEAN_PRED_QNT_OUT_fx[M] = -{ - 733, 1337, 2271, 3451, 4418, 5382, 6430, 7304, 8221, 9247, 10165, 11079, 12115, 13197, 14266, 15269 -}; -//Q15 -const Word16 tdm_PRED_QNT_fixed_beta_prd_diag_3_fx[15 + 16 + 15] = -{ - 23067, 3941, -3666, 24050, 5907, 829, 21960, 6229, -6052, 25859, 9862, -1369, 28559, 6019, 108, 22658, 7844, 697, 22045, 7998, 2310, 24735, - 6497, 2464, 23434, 7120, 2903, 20194, 10049, 711, 26610, 6622, 5190, 23955, 5721, 3945, 23906, 6481, 4033, 24581, 4043, 5599, 20879, 3473, - 3909, 21541 -}; -#endif /* LSFs Intra-frame prediction tables */ const float tdm_LSF_MEAN_RE_USE_OUT[M] = { @@ -903,30 +802,12 @@ const float dft_cng_coh_pred[STEREO_DFT_N_COH_PRED][STEREO_DFT_COH_PRED_COEFFS] { 0.202543f, 0.048819f, 0.263407f, 0.023538f, 0.092021f, 0.395655f, 0.013064f, -0.011127f, 0.035466f, 0.976055f, 0.009968f, 0.162957f, 0.383185f, -0.365493f, 2.534677f}, { 1.393664f, -0.131401f, 0.989429f, 0.738330f, 0.683865f, 0.001677f, -0.225448f, -0.012158f, 1.084608f, -0.115464f, 0.022371f, -0.045560f, -0.336230f, 0.422742f, 0.499163f} }; -#ifdef IVAS_FLOAT_FIXED -const Word16 dft_cng_coh_pred_fx[STEREO_DFT_N_COH_PRED][STEREO_DFT_COH_PRED_COEFFS] /*Q-13*/= { - { 4926, -827, 10396, 696, 2285, 5488, 668, 1547, -1416, 2633, 76, -690, 2967, -3495, 6212 }, - { 7007, 3446, 3385, -76, -3274, 11352, 101, -125, 1281, 4238, 1312, -2487, 3913, -4593, 11326 }, - { 1659, 399, 2157, 192, 753, 3241, 107, -91, 290, 7995, 81, 1334, 3139, -2994, 20764 }, - { 11416, -1076, 8105, 6048, 5602, 13, -1846, -99, 8885, -945, 183, -373, -2754, 3463, 4089 } -}; -#endif // IVAS_FLOAT_FIXED const int16_t dft_cng_coh_u2i[9] = { 4, 5, 3, 6, 2, 7, 1, 8, 0 }; /* Coherence unary codeword -> residual codeword conversion table */ const int16_t dft_cng_coh_i2u[9] = { 8, 6, 4, 2, 0, 1, 3, 5, 7 }; /* Coherence residual codeword -> unary codeword conversion table */ const int16_t dft_cng_coh_alpha_start[STEREO_DFT_N_COH_ALPHA_STEPS - 1] = { 15, 16, 17, 18 }; -#ifdef IVAS_FLOAT_FIXED -const Word16 dft_cng_alpha_bits_fx[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_COH_ALPHA_LEVELS]/*Q-15*/ = -{ - { 3277/*0.1f*/, 19661/*0.6f*/ }, - { 3277/*0.1f*/, 19661/*0.6f*/ }, - { 3277/*0.1f*/, 22938/*0.7f*/ }, - { 3277/*0.1f*/, 29491/*0.9f*/ }, - { 6554/*0.2f*/, 29491/*0.9f*/ } -}; -#endif // IVAS_FLOAT_FIXED const float dft_cng_alpha_bits[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_COH_ALPHA_LEVELS] = { @@ -954,13 +835,6 @@ const float diffuseness_reconstructions[DIRAC_DIFFUSE_LEVELS] = 0.85009765625f }; -#ifdef IVAS_FLOAT_FIXED -const Word32 diffuseness_reconstructions_fx[DIRAC_DIFFUSE_LEVELS] = // q = 30 -{ - 0, 42467328, 96206848, 170655744, 331087872, 508821504, 678952960, 912785408 -}; -#endif - const float diffuseness_thresholds[DIRAC_DIFFUSE_LEVELS + 1] = { 0.0f, @@ -974,21 +848,6 @@ const float diffuseness_thresholds[DIRAC_DIFFUSE_LEVELS + 1] = 2.0f /* out-of-range large value to make searching easier */ }; -#ifdef IVAS_FLOAT_FIXED -const Word32 diffuseness_thresholds_fx[DIRAC_DIFFUSE_LEVELS + 1] = -{ - 0, - 20447232, - 67633152, - 128188416, - 237502464, - 428605440, - 587988992, - 788791296, - MAX_32 /* out-of-range large value to make searching easier */ -}; -#endif // IVAS_FLOAT_FIXED - const int16_t DirAC_band_grouping_12[12 + 1] = { 0, 1, 2, 3, 4, 5, 6, 7, 11, 17, 25, 40, 60 @@ -1657,7 +1516,6 @@ const ivas_huff_models_t ivas_huff_decd_r_consts[TOTAL_DECD_QUANT_STRATS] = /* DTX quantization and bitstream constants */ const float dtx_pd_real_min_max[2] = { 0, 1.6f }; -const Word32 dtx_pd_real_min_max_fx[2] = { 0, 429496729 }; const int16_t dtx_pd_real_q_levels[3][3] = { { 7,7,7 },{ 7,7,0 },{ 3,0,0 } }; const int16_t dtx_pr_real_q_levels[3][3] = { { 9,9,9 },{ 9,7,9 },{ 9,5,7 } }; const int16_t pr_pr_idx_pairs[3][3][2] = { { { 0, 0 },{ 0, 0 },{ 0, 0 } },{ { 0, 0 },{ 0, 0 },{ 0, 0 } },{ { 0, 0 },{ 1, 3 },{ 0, 0 } } }; @@ -2783,28 +2641,12 @@ const float ivas_param_mc_quant_ild_5d1_48[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = -8.0f, -5.5f, -3.5f, -1.5f, 0.0f, 1.5f, 3.5f, 5.5f, 8.0f, 10.0f, 13.0f, 20.0f }; -#ifdef IVAS_FLOAT_FIXED -//Q8 -const Word16 ivas_param_mc_quant_ild_5d1_48_fx[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = -{ - -25600 ,-5120 ,-3328 ,-2560 ,-2048 ,-1408 ,-896 ,-384 ,0 ,384 ,896 ,1408 ,2048 ,2560 ,3328 ,5120 , -}; -#endif - /* Quantizer for ICCs in Parametric MC Processing */ const float ivas_param_mc_quant_icc[PARAM_MC_SZ_ICC_QUANTIZER] = { -0.99f, -0.589f, 0.0f, 0.36764f, 0.60092f, 0.84118f, 0.937f, 1.0f }; -#ifdef IVAS_FLOAT_FIXED -//Q15 -const Word16 ivas_param_mc_quant_icc_fx[PARAM_MC_SZ_ICC_QUANTIZER] = -{ - -32440,-19300,0,12046,19690,27563,30703,32767 -}; -#endif - /* Alphabet for delta coding for the ICCs in Parametric MC processing */ const uint16_t ivas_param_mc_cum_freq_icc_cicp6_48_16bits[PARAM_MC_SZ_ICC_QUANTIZER + 1] = { @@ -3110,29 +2952,6 @@ const float coherence_cb1_masa[MASA_NO_CV_COH1*MASA_MAXIMUM_CODING_SUBBANDS] = 0.0017f, 0.2521f, -0.2479f, 0.7217f, -0.7157f }; -#ifdef IVAS_FLOAT_FIXED - -const Word32 coherence_cb0_masa_fx[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH] = //q = 21 -{ - 100243, 534144, 1156579, 2068840, 2846464, 3531184, 4125936, 0, 253965, 864655, 1467377, - 2129448, 2977326, 3768791, 0, 0, 338480, 1189924, 2035915, 2872888, 3640026, 0, 0, 0, - 492621, 1532179, 2527278, 3470157, 0, 0, 0, 0, 499331, 1506803, 2465831, 3425697, 0, - 0, 0, 0, 503316, 1473668, 2392221, 3406404, 0, 0, 0, 0, 737778, 1970903, 3450654, 0, 0, - 0, 0, 0, 2097152, 0, 0, 0, 0, 0, 0, 0, 303038, 719742, 1122186, 1577897, 2117075, 2770337, - 3648834, 0, 419849, 932603, 1440533, 2011797, 2745172, 3571240, 0, 0, 548824, 1165177, - 1812987, 2555379, 3366138, 0, 0, 0, 695835, 1428160, 2190475, 3084910, 0, 0, 0, 0, 697093, - 1381603, 2092957, 2970406, 0, 0, 0, 0, 708417, 1396283, 2099039, 2992426, 0, 0, 0, 0, 835924, - 1728892, 2836607, 0, 0, 0, 0, 0, 2097152, 0, 0, 0, 0, 0, 0, 0 -}; - -const Word32 coherence_cb1_masa_fx[MASA_NO_CV_COH1*MASA_MAXIMUM_CODING_SUBBANDS] = // q = 21 -{ - -3984, 544630, -565392, 1314704, -1320157, -11534, 541484, -583847, 1357486, -1371118, - -6081, 525546, -551551, 1362729, -1371537, -838, 533934, -540855, 1436758, -1414109, - 3565, 528692, -519883, 1513514, -1500931 -}; -#endif - const int16_t len_cb_dct0_masa[DIRAC_DIFFUSE_LEVELS] = { 7, 6, 5, 4, 4, 4, 3, 2 }; const uint8_t sur_coherence_cb_masa[MASA_MAX_NO_CV_SUR_COH*MASA_NO_CB_SUR_COH] = @@ -3171,31 +2990,6 @@ const int16_t no_phi_masa[NO_SPHERICAL_GRIDS][MAX_NO_THETA] = /* from 1 to 11 bi { 60, 60, 58, 56, 54, 50, 46, 41, 36, 30, 23, 17, 10, 1 }, { 89, 89, 88, 86, 84, 81, 77, 73, 68, 63, 57, 51, 44, 38, 30, 23, 15, 8, 1 } }; -#ifdef IVAS_FLOAT_FIXED -const Word32 no_phi_masa_inv_fx[NO_SPHERICAL_GRIDS][MAX_NO_THETA] = /* from 1 to 11 bits*/ /*q factor = 8*/ -{ - {1073741824}, - {536870912}, - {536870912, 1073741824}, - {268435456, 536870912}, - {178956970, 306783378, 1073741824, 2147483647}, - {153391689, 165191049, 238609294, 1073741824, 2147483647}, - {97612893, 102261126, 126322567, 195225786, 715827882, 2147483647}, - {65075262, 67108864, 74051160, 93368854, 126322567, 238609294, 2147483647}, - {44739242, 45691141, 47721858, 52377649, 61356675, 76695844, 107374182, 178956970, 1073741824, 2147483647}, - {35791394, 35791394, 37025580, 38347922, 39768215, 42949672, 46684427, 52377649, 59652323, 71582788, 93368854, 126322567, 214748364, 2147483647}, - {24129029, 24129029, 24403223, 24970740, 25565281, 26512143, 27889398, 29417584, 31580641, 34087042, 37675151, 42107522, 48806446, 56512727, 71582788, 93368854, 143165576, 268435456, 2147483647} -}; - -const Word32 azimuth_cb_fx[8] = -{ - 0, -754974720, -377487360, 377487360, -188743680, 188743680, -566231040, 566231040 -}; - -const Word32 delta_theta_masa_fx[NO_SPHERICAL_GRIDS - 2] = -{ 188743680, 188743680, 150994944, 106954752, 83886080, 62914560, 45214596, 28101836, 20971520 }; - -#endif const float delta_theta_masa[NO_SPHERICAL_GRIDS - 2] = { /*180.0f, 90.0f,*/ 45.0f, 45.0f, 36.0f, 25.5f, 20.0f, /*14.9f*/ 15.0f, 10.78f, 6.7f, 5.0f }; @@ -3322,29 +3116,6 @@ const float ls_elevation_CICP16[9] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 35 const float ls_azimuth_CICP19[11] = { 30.0f, -30.0f, 0.0f, 135.0f, -135.0f, 90.0f, -90.0f, 30.0f, -30.0f, 135.0f, -135.0f }; const float ls_elevation_CICP19[11] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 35.0f, 35.0f, 35.0f, 35.0f }; -const float cb_azi_chan[] = { 0.0f, 30.0f, 110.0f, 135.0f }; - -#ifdef IVAS_FLOAT_FIXED -const int16_t ls_azimuth_CICP2_idx[2] = { 1, 2 }; -const int16_t ls_elevation_CICP2_idx[2] = { 0, 0 }; - -const int16_t ls_azimuth_CICP6_idx[5] = { 1, 2, 0, 7, 8 }; -const int16_t ls_elevation_CICP6_idx[5] = { 0, 0, 0, 0, 0 }; - -const int16_t ls_azimuth_CICP12_idx[7] = { 1, 2, 0, 7, 8, 9, 10 }; -const int16_t ls_elevation_CICP12_idx[7] = { 0, 0, 0, 0, 0, 0, 0 }; - -const int16_t ls_azimuth_CICP14_idx[7] = { 1, 2, 0, 7, 8, 1, 2 }; -const int16_t ls_elevation_CICP14_idx[7] = { 0, 0, 0, 0, 0, 3, 4 }; - -const int16_t ls_azimuth_CICP16_idx[9] = { 1, 2, 0, 7, 8, 1, 2, 7, 8 }; -const int16_t ls_elevation_CICP16_idx[9] = { 0, 0, 0, 0, 0, 3, 3, 3, 3 }; - - -const int16_t ls_azimuth_CICP19_idx[11] = { 1, 2, 0, 9, 10, 5, 6, 1, 2, 9, 10 }; -const int16_t ls_elevation_CICP19_idx[11] = { 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3 }; - - const float shoebox_sin_cos_tbl[11][2] ={{0.00000000f, 1.00000000f }, //0 {0.500000000f, 0.866025388f}, { -0.500000000f, 0.866025388f}, //30, -30 {0.573576450f , 0.819152057f}, {-0.573576450f, 0.819152057f}, //35, -35 @@ -3352,80 +3123,7 @@ const float shoebox_sin_cos_tbl[11][2] ={{0.00000000f, 1.00000000f }, //0 {0.939692616f , -0.342020124f}, {-0.939692616f,-0.342020124f},//110,-110 {0.707106769f , -0.707106769f}, {-0.707106769f,-0.707106769f}}; //135, -135 -const Word32 shoebox_sin_cos_tbl_fx[11][2] ={{0,1073741824} , //0 - {536870912, 929887680},{-536870912, 929887680}, //30, -30 - {615873024,879557824},{-615873024,879557824},//35, -35 - {1073741824,0}, {-1073741824,0},//90, -90 - {1008987264,-367241312}, {-1008987264,-367241312},//110,-110 - {759250112,-759250112},{-759250112,-759250112}}; //135, -135 //Q.30 - -#endif - - - -const Word32 delta_phi_val[90] = -{ 0, 1509949440, 754974720, 503316480, 377487360, 301989888, -251658240, 215707056, 188743680, 167772160, 150994944, -137268128, 125829120, 116149960, 107853528, 100663296, -94371840, 88820552, 83886080, 79471024, 75497472, -71902352, 68634064, 65649976, 62914560, 60397976, -58074980, 55924052, 53926764, 52067224, 50331648, -48708048, 47185920, 45756044, 44410276, 43141412, -41943040, 40809444, 39735512, 38716652, 37748736, -36828036, 35951176, 35115104, 34317032, 33554432, -32824988, 32126584, 31457280, 30815294, 30198988, -29606852, 29037490, 28489612, 27962026, 27453626, -26963382, 26490342, 26033612, 25592364, 25165824, -24753270, 24354024, 23967452, 23592960, 23229992, -22878022, 22536558, 22205138, 21883326, 21570706, -21266894, 20971520, 20684238, 20404722, 20132660, -19867756, 19609732, 19358326, 19113284, 18874368, -18641352, 18414018, 18192162, 17975588, 17764112, -17557552, 17355740, 17158516, 16965724 }; - -const Word32 inv_delta_phi_val[90] = -{ 0, 5965232, 11930464, 17895697, 23860929, 29826161, -35791394, 41756626, 47721858, 53687091, 59652323, -65617555, 71582788, 77548020, 83513252, 89478485, -95443717, 101408950, 107374182, 113339414, 119304647, -125269879, 131235111, 137200344, 143165576, 149130808, -155096041, 161061273, 167026505, 172991738, 178956970, -184922203, 190887435, 196852667, 202817900, 208783132, -214748364, 220713597, 226678829, 232644061, 238609294, -244574526, 250539758, 256504991, 262470223, 268435456, -274400688, 280365920, 286331153, 292296385, 298261617, -304226850, 310192082, 316157314, 322122547, 328087779, -334053011, 340018244, 345983476, 351948708, 357913941, -363879173, 369844406, 375809638, 381774870, 387740103, -393705335, 399670567, 405635800, 411601032, 417566264, -423531497, 429496729, 435461961, 441427194, 447392426, -453357659, 459322891, 465288123, 471253356, 477218588, -483183820, 489149053, 495114285, 501079517, 507044750, -513009982, 518975214, 524940447, 530905679, }; - -const Word32 dd_val[90] = -{ 0, 754974720, 377487360, 251658240, 188743680, 150994944, -125829120, 107853528, 94371840, 83886080, 75497472, -68634064, 62914560, 58074980, 53926764, 50331648, -47185920, 44410276, 41943040, 39735512, 37748736, -35951176, 34317032, 32824988, 31457280, 30198988, -29037490, 27962026, 26963382, 26033612, 25165824, -24354024, 23592960, 22878022, 22205138, 21570706, -20971520, 20404722, 19867756, 19358326, 18874368, -18414018, 17975588, 17557552, 17158516, 16777216, -16412494, 16063292, 15728640, 15407647, 15099494, -14803426, 14518745, 14244806, 13981013, 13726813, -13481691, 13245171, 13016806, 12796182, 12582912, -12376635, 12177012, 11983726, 11796480, 11614996, -11439011, 11268279, 11102569, 10941663, 10785353, -10633447, 10485760, 10342119, 10202361, 10066330, -9933878, 9804866, 9679163, 9556642, 9437184, -9320676, 9207009, 9096081, 8987794, 8882056, -8778776, 8677870, 8579258, 8482862 }; - -#ifdef IVAS_FLOAT_FIXED -const Word32 cb_azi_chan_fx[] = { 0, 125829120, 461373440, 566231040 }; -#endif +const float cb_azi_chan[] = { 0.0f, 30.0f, 110.0f, 135.0f }; const float McMASA_LFEGain_vectors[64] = { @@ -3515,53 +3213,6 @@ const float dct12[12*12]= 0.2887f, -0.4048f, 0.3943f, -0.3772f, 0.3536f, -0.3239f, 0.2887f, -0.2485f, 0.2041f, -0.1562f, 0.1057f, -0.0533f }; -#ifdef IVAS_FLOAT_FIXED -const Word32 dct4_fx[4*4] = -{ - 1073741824, 1402951040, 1073741824, 581109056, - 1073741824, 581109056, -1073741824, -1402951040, - 1073741824, -581109056, -1073741824, 1402951040, - 1073741824, -1402951040, 1073741824, -581109056 -}; - -const Word32 dct5_fx[5*5] = -{ - 960354688, 1291711360, 1098867328, 798219648, 419618304, - 960354688, 798219648, -419618304, -1291711360, -1098867328, - 960354688, 0, -1358283392, 0, 1358283392, - 960354688, -798219648, -419618304, 1291711360, -1098867328, - 960354688, -1291711360, 1098867328, -798219648, 419618304 -}; - -const Word32 dct8_fx[8*8] = -{ - 759350208, 1053125952, 991922688, 892708928, 759350208, 596570944, 410813632, 209379648, - 759350208, 892708928, 410813632, -209379648, -759350208, -1053125952, -991922688, -596570944, - 759350208, 596570944, -410813632, -1053125952, -759350208, 209379648, 991922688, 892708928, - 759350208, 209379648, -991922688, -596570944, 759350208, 892708928, -410813632, -1053125952, - 759350208, -209379648, -991922688, 596570944, 759350208, -892708928, -410813632, 1053125952, - 759350208, -596570944, -410813632, 1053125952, -759350208, -209379648, 991922688, -892708928, - 759350208, -892708928, 410813632, 209379648, -759350208, 1053125952, -991922688, 596570944, - 759350208, -1053125952, 991922688, -892708928, 759350208, -596570944, 410813632, -209379648 -}; - -const Word32 dct12_fx[12*12]= -{ - 619978560, 869301376, 846752832, 810030848, 759350208, 695569984, 619978560, 533649696, 438301408, 335436960, 226989024, 114460880, - 619978560, 810030848, 619978560, 335436960, 0, -335436960, -619978560, -810030848, -876602816, -810030848, -619978560, -335436960, - 619978560, 695569984, 226989024, -335436960, -759350208, -869301376, -619978560, -114460880, 438301408, 810030848, 846752832, 533649696, - 619978560, 533649696, -226989024, -810030848, -759350208, -114460880, 619978560, 869301376, 438301408, -335436960, -846752832, -695569984, - 619978560, 335436960, -619978560, -810030848, 0, 810030848, 619978560, -335436960, -876602816, -335436960, 619978560, 810030848, 619978560, - 114460880, -846752832, -335436960, 759350208, 533649696, -619978560, -695569984, 438301408, 810030848, -226989024, -869301376, 619978560, - -114460880, -846752832, 335436960, 759350208, -533649696, -619978560, 695569984, 438301408, -810030848, -226989024, 869301376, 619978560, - -335436960, -619978560, 810030848, 0, -810030848, 619978560, 335436960, -876602816, 335436960, 619978560, -810030848, 619978560, -533649696, - -226989024, 810030848, -759350208, 114460880, 619978560, -869301376, 438301408, 335436960, -846752832, 695569984, 619978560, -695569984, - 226989024, 335436960, -759350208, 869301376, -619978560, 114460880, 438301408, -810030848, 846752832, -533649696, 619978560, -810030848, - 619978560, -335436960, 0, 335436960, -619978560, 810030848, -876602816, 810030848, -619978560, 335436960, 619978560, -869301376, 846752832, - -810030848, 759350208, -695569984, 619978560, -533649696, 438301408, -335436960, 226989024, -114460880 -}; -#endif - /*----------------------------------------------------------------------------------* * ISM ROM tables *----------------------------------------------------------------------------------*/ @@ -3576,20 +3227,6 @@ const float ism_elevation_borders[4] = ISM_ELEVATION_MIN, ISM_ELEVATION_LOW_BORDER, ISM_ELEVATION_HIGH_BORDER, ISM_ELEVATION_MAX }; -#ifdef IVAS_FLOAT_FIXED -const Word32 ism_azimuth_borders_fx[4] = -{ - ISM_AZIMUTH_MIN_FX, ISM_AZIMUTH_LOW_BORDER_FX, ISM_AZIMUTH_HIGH_BORDER_FX, ISM_AZIMUTH_MAX_FX -}; - -const Word32 ism_elevation_borders_fx[4] = -{ - ISM_ELEVATION_MIN_FX, ISM_ELEVATION_LOW_BORDER_FX, ISM_ELEVATION_HIGH_BORDER_FX, ISM_ELEVATION_MAX_FX -}; - -#endif - - /*----------------------------------------------------------------------------------* * Param ISM ROM tables *----------------------------------------------------------------------------------*/ @@ -3703,11 +3340,6 @@ const float ivas_lfe_window_coeff_48k[IVAS_LFE_FADE_LEN_48K] = 0.999999941142332f, 0.999999966087832f, 0.999999983040042f, 0.999999993835372f }; -#ifdef IVAS_FLOAT_FIXED -const Word32 ivas_lfe_window_coeff_48k_fx[IVAS_LFE_FADE_LEN_48K] = { 0x0003a373, 0x000608f6, 0x000888a7, 0x000b3e1b, 0x000e34f1, 0x001174a2, 0x00150328, 0x0018e5e1, 0x001d21eb, 0x0021bc4d, 0x0026ba09, 0x002c202f, 0x0031f3dc, 0x00383a43, 0x003ef8ad, 0x0046347b, 0x004df325, 0x00563a3f, 0x005f0f74, 0x00687888, 0x00727b59, 0x007d1ddb, 0x0088661c, 0x00945a41, 0x00a10087, 0x00ae5f3d, 0x00bc7ccd, 0x00cb5fb3, 0x00db0e7d, 0x00eb8fd0, 0x00fcea61, 0x010f24f8, 0x0122466a, 0x013655a0, 0x014b598e, 0x01615936, 0x01785ba8, 0x01906800, 0x01a9855e, 0x01c3baf0, 0x01df0fee, 0x01fb8b90, 0x02193514, 0x023813c4, 0x02582ee4, 0x02798db8, 0x029c378c, 0x02c033a4, 0x02e58944, 0x030c3fa8, 0x03345e0c, 0x035deba0, 0x0388ef8c, 0x03b570f0, 0x03e376dc, 0x04130858, 0x04442c58, 0x0476e9b8, 0x04ab4760, 0x04e14c00, 0x0518fe48, 0x055264c8, 0x058d8600, 0x05ca6850, 0x06091200, 0x06498930, 0x068bd3f0, 0x06cff830, 0x0715fba8, 0x075de408, 0x07a7b6c8, 0x07f37940, 0x084130a0, 0x0890e200, 0x08e29220, 0x093645c0, 0x098c0150, 0x09e3c940, 0x0a3da180, 0x0a998e30, 0x0af792e0, 0x0b57b320, 0x0bb9f240, 0x0c1e5360, 0x0c84d940, 0x0ced8690, 0x0d585dc0, 0x0dc560f0, 0x0e349200, 0x0ea5f2b0, 0x0f198450, 0x0f8f4820, 0x10073f00, 0x10816980, 0x10fdc840, 0x117c5b00, 0x11fd21e0, 0x12801c60, 0x130549a0, 0x138ca8c0, 0x14163880, 0x14a1f740, 0x152fe320, 0x15bffa00, 0x16523980, 0x16e69ee0, 0x177d2700, 0x1815cec0, 0x18b09260, 0x194d6e00, 0x19ec5d60, 0x1a8d5c20, 0x1b306580, 0x1bd57440, 0x1c7c8300, 0x1d258c40, 0x1dd08a00, 0x1e7d7600, 0x1f2c49a0, 0x1fdcfe20, 0x208f8c40, 0x2143ed00, 0x21fa1840, 0x22b20680, 0x236baf40, 0x24270a00, 0x24e40e00, 0x25a2b280, 0x2662ee00, 0x2724b700, 0x27e80400, 0x28acca80, 0x297300c0, 0x2a3a9c00, 0x2b039180, 0x2bcdd680, 0x2c995fc0, 0x2d6621c0, 0x2e341140, 0x2f032240, 0x2fd34900, 0x30a47900, 0x3176a640, 0x3249c440, 0x331dc600, 0x33f29f40, 0x34c842c0, 0x359ea340, 0x3675b3c0, 0x374d66c0, 0x3825af00, 0x38fe7ec0, 0x39d7c880, 0x3ab17e40, 0x3b8b9240, 0x3c65f6c0, 0x3d409d80, 0x3e1b7880, 0x3ef679c0, 0x3fd19340, 0x40acb680, 0x4187d580, 0x4262e280, 0x433dce80, 0x44188c00, 0x44f30c80, 0x45cd4180, 0x46a71e00, 0x47809300, 0x48599300, 0x49320f80, 0x4a09fb80, 0x4ae14880, 0x4bb7e900, 0x4c8dcf80, 0x4d62ee80, 0x4e373880, 0x4f0aa080, 0x4fdd1900, 0x50ae9600, 0x517f0980, 0x524e6780, 0x531ca380, 0x53e9b100, 0x54b58400, 0x55801080, 0x56494b00, 0x57112800, 0x57d79c00, 0x589c9c00, 0x59601d00, 0x5a221480, 0x5ae27880, 0x5ba13e00, 0x5c5e5c00, 0x5d19c880, 0x5dd37a80, 0x5e8b6800, 0x5f418980, 0x5ff5d580, 0x60a84480, 0x6158ce00, 0x62076a80, 0x62b41280, 0x635ebf80, 0x64076a80, 0x64ae0d00, 0x6552a100, 0x65f52080, 0x66958680, 0x6733cd00, 0x67cff000, 0x6869ea80, 0x6901b880, 0x69975600, 0x6a2abf80, 0x6abbf200, 0x6b4aea80, 0x6bd7a680, 0x6c622300, 0x6cea5f80, 0x6d705900, 0x6df40f00, 0x6e758080, 0x6ef4ac80, 0x6f719300, 0x6fec3380, 0x70648f00, 0x70daa580, 0x714e7880, 0x71c00880, 0x722f5780, 0x729c6700, 0x73073980, 0x736fd100, 0x73d62f80, 0x743a5900, 0x749c5080, 0x74fc1880, 0x7559b600, 0x75b52b80, 0x760e7e80, 0x7665b280, 0x76bacc80, 0x770dd180, 0x775ec600, 0x77adb000, 0x77fa9480, 0x78457900, 0x788e6400, 0x78d55b80, 0x791a6500, 0x795d8780, 0x799ec900, 0x79de3100, 0x7a1bc580, 0x7a578d80, 0x7a919100, 0x7ac9d600, 0x7b006500, 0x7b354400, 0x7b687b80, 0x7b9a1300, 0x7bca1180, 0x7bf87f80, 0x7c256400, 0x7c50c780, 0x7c7ab180, 0x7ca32a00, 0x7cca3900, 0x7cefe600, 0x7d143900, 0x7d373a80, 0x7d58f280, 0x7d796800, 0x7d98a380, 0x7db6ad00, 0x7dd38c80, 0x7def4900, 0x7e09eb00, 0x7e237a00, 0x7e3bfd80, 0x7e537d80, 0x7e6a0180, 0x7e7f9080, 0x7e943200, 0x7ea7ed80, 0x7ebaca00, 0x7ecccf00, 0x7ede0300, 0x7eee6d00, 0x7efe1400, 0x7f0cfe80, 0x7f1b3380, 0x7f28b900, 0x7f359500, 0x7f41ce80, 0x7f4d6b80, 0x7f587180, 0x7f62e680, 0x7f6cd000, 0x7f763400, 0x7f7f1780, 0x7f878080, 0x7f8f7380, 0x7f96f580, 0x7f9e0b80, 0x7fa4bb00, 0x7fab0780, 0x7fb0f600, 0x7fb68b00, 0x7fbbca00, 0x7fc0b800, 0x7fc55880, 0x7fc9af80, 0x7fcdc080, 0x7fd18f00, 0x7fd51e80, 0x7fd87280, 0x7fdb8d80, 0x7fde7380, 0x7fe12700, 0x7fe3aa80, 0x7fe60100, 0x7fe82d00, 0x7fea3180, 0x7fec1000, 0x7fedcb00, 0x7fef6500, 0x7ff0e000, 0x7ff23e00, 0x7ff38080, 0x7ff4a980, 0x7ff5ba80, 0x7ff6b580, 0x7ff79c00, 0x7ff86e80, 0x7ff92f80, 0x7ff9e000, 0x7ffa8100, 0x7ffb1380, 0x7ffb9880, 0x7ffc1180, 0x7ffc7f80, 0x7ffce300, 0x7ffd3c80, 0x7ffd8d80, 0x7ffdd680, 0x7ffe1880, 0x7ffe5300, 0x7ffe8800, 0x7ffeb700, 0x7ffee100, 0x7fff0600, 0x7fff2700, 0x7fff4480, 0x7fff5e80, 0x7fff7500, 0x7fff8900, 0x7fff9a80, 0x7fffaa00, 0x7fffb780, 0x7fffc300, 0x7fffcd00, 0x7fffd580, 0x7fffdc80, 0x7fffe300, 0x7fffe880, 0x7fffec80, 0x7ffff080, 0x7ffff380, 0x7ffff680, 0x7ffff880, 0x7ffffa00, 0x7ffffb80, 0x7ffffc80, 0x7ffffd80, 0x7ffffe80, 0x7fffff00, 0x7fffff00, 0x7fffff80, 0x7fffff80, 0x7fffffff, 0x7fffffff }; -#endif - - const float ivas_lfe_window_coeff_32k[IVAS_LFE_FADE_LEN_32K] = { 0.000135992220705702f, 0.000243900754874608f, 0.000366502488193403f, 0.000507754555407233f, @@ -3776,11 +3408,6 @@ const float ivas_lfe_window_coeff_32k[IVAS_LFE_FADE_LEN_32K] = 0.999999871092647f, 0.999999932837961f, 0.999999970256211f, 0.999999990753058f }; -#ifdef IVAS_FLOAT_FIXED -const Word32 ivas_lfe_window_coeff_32k_fx[IVAS_LFE_FADE_LEN_32K] = { 0x000474c9, 0x0007fdfd, 0x000c0272, 0x0010a35b, 0x0015f4ae, 0x001c079e, 0x0022ecc2, 0x002ab4c6, 0x003370ac, 0x003d31e5, 0x00480a5f, 0x00540c87, 0x00614b4e, 0x006fda25, 0x007fccfb, 0x0091383a, 0x00a430c2, 0x00b8cbe7, 0x00cf1f67, 0x00e74167, 0x0101486c, 0x011d4b52, 0x013b614e, 0x015ba1d8, 0x017e24ae, 0x01a301c8, 0x01ca514e, 0x01f42b90, 0x0220a900, 0x024fe224, 0x0281ef88, 0x02b6e9c0, 0x02eee954, 0x032a06b4, 0x03685a34, 0x03a9fc00, 0x03ef0408, 0x043789f8, 0x0483a538, 0x04d36cd0, 0x0526f760, 0x057e5b20, 0x05d9adc0, 0x06390470, 0x069c73c0, 0x07040fa8, 0x076feb68, 0x07e01990, 0x0854abe0, 0x08cdb350, 0x094b4000, 0x09cd6120, 0x0a5424d0, 0x0adf9870, 0x0b6fc830, 0x0c04bf20, 0x0c9e8760, 0x0d3d29c0, 0x0de0ade0, 0x0e891a50, 0x0f367440, 0x0fe8bfa0, 0x109fff00, 0x115c33a0, 0x121d5d80, 0x12e37b00, 0x13ae8960, 0x147e8440, 0x155365c0, 0x162d26c0, 0x170bbe80, 0x17ef22e0, 0x18d74820, 0x19c42100, 0x1ab59f20, 0x1babb200, 0x1ca64840, 0x1da54e80, 0x1ea8b080, 0x1fb057e0, 0x20bc2d80, 0x21cc1800, 0x22dffd40, 0x23f7c1c0, 0x25134800, 0x26327200, 0x27552000, 0x287b30c0, 0x29a48280, 0x2ad0f180, 0x2c005940, 0x2d329440, 0x2e677c00, 0x2f9ee880, 0x30d8b100, 0x3214ac40, 0x3352afc0, 0x34929040, 0x35d421c0, 0x37173780, 0x385ba480, 0x39a13b00, 0x3ae7cc40, 0x3c2f2a00, 0x3d7724c0, 0x3ebf8d80, 0x40083400, 0x4150e980, 0x42997d80, 0x43e1c000, 0x45298180, 0x46709200, 0x47b6c280, 0x48fbe380, 0x4a3fc600, 0x4b823b80, 0x4cc31600, 0x4e022800, 0x4f3f4500, 0x507a4080, 0x51b2ee80, 0x52e92580, 0x541cba80, 0x554d8580, 0x567b5e00, 0x57a61d80, 0x58cd9e00, 0x59f1bb80, 0x5b125200, 0x5c2f3f00, 0x5d486280, 0x5e5d9d00, 0x5f6ecf80, 0x607bde00, 0x6184ad00, 0x62892280, 0x63892680, 0x6484a280, 0x657b8100, 0x666daf00, 0x675b1980, 0x6843b100, 0x69276680, 0x6a062d00, 0x6adff980, 0x6bb4c180, 0x6c847d80, 0x6d4f2680, 0x6e14b800, 0x6ed52e80, 0x6f908900, 0x7046c680, 0x70f7e880, 0x71a3f300, 0x724aea00, 0x72ecd300, 0x7389b680, 0x74219c80, 0x74b48f80, 0x75429b80, 0x75cbcc80, 0x76503100, 0x76cfd800, 0x774ad280, 0x77c13180, 0x78330780, 0x78a06880, 0x79096800, 0x796e1b80, 0x79ce9980, 0x7a2af880, 0x7a835000, 0x7ad7b800, 0x7b284980, 0x7b751c80, 0x7bbe4c00, 0x7c03f080, 0x7c462580, 0x7c850480, 0x7cc0a880, 0x7cf92c00, 0x7d2eaa80, 0x7d613e00, 0x7d910180, 0x7dbe0f80, 0x7de88300, 0x7e107600, 0x7e360300, 0x7e594280, 0x7e7a4f80, 0x7e994200, 0x7eb63280, 0x7ed13a00, 0x7eea6f00, 0x7f01e980, 0x7f17c000, 0x7f2c0800, 0x7f3ed780, 0x7f504280, 0x7f605d80, 0x7f6f3c00, 0x7f7cf100, 0x7f898e00, 0x7f952500, 0x7f9fc600, 0x7fa98200, 0x7fb26800, 0x7fba8680, 0x7fc1eb80, 0x7fc8a400, 0x7fcebd80, 0x7fd44380, 0x7fd94100, 0x7fddc180, 0x7fe1ce80, 0x7fe57180, 0x7fe8b400, 0x7feb9d80, 0x7fee3680, 0x7ff08600, 0x7ff29280, 0x7ff46300, 0x7ff5fc80, 0x7ff76500, 0x7ff8a180, 0x7ff9b600, 0x7ffaa780, 0x7ffb7900, 0x7ffc2e80, 0x7ffccb80, 0x7ffd5200, 0x7ffdc580, 0x7ffe2800, 0x7ffe7b80, 0x7ffec200, 0x7ffefd80, 0x7fff2f00, 0x7fff5880, 0x7fff7a80, 0x7fff9680, 0x7fffad80, 0x7fffc000, 0x7fffcf00, 0x7fffdb00, 0x7fffe480, 0x7fffeb80, 0x7ffff180, 0x7ffff580, 0x7ffff900, 0x7ffffb00, 0x7ffffd00, 0x7ffffe00, 0x7fffff00, 0x7fffff80, 0x7fffffff, 0x7fffffff }; -#endif - - const float ivas_lfe_window_coeff_16k[IVAS_LFE_FADE_LEN_16K] = { 0.000192322041967661f, 0.000432042541451336f, 0.000754275578824202f, 0.00117365342860051f, @@ -3817,11 +3444,6 @@ const float ivas_lfe_window_coeff_16k[IVAS_LFE_FADE_LEN_16K] = 0.999999311268578f, 0.999999715534135f, 0.999999906669617f, 0.999999981506116f }; -#ifdef IVAS_FLOAT_FIXED -const Word32 ivas_lfe_window_coeff_16k_fx[IVAS_LFE_FADE_LEN_16K] = { 0x00064d50, 0x000e283c, 0x0018b753, 0x00267552, 0x0037e397, 0x004d8c2b, 0x006801d2, 0x0087dfb9, 0x00adc8fc, 0x00da680b, 0x010e6df8, 0x014a91a0, 0x018f8ecc, 0x01de252a, 0x02371734, 0x029b2908, 0x030b1f1c, 0x0387bd00, 0x0411c3e8, 0x04a9f148, 0x0550fd60, 0x060799b0, 0x06ce6f88, 0x07a61e78, 0x088f3ad0, 0x098a4c30, 0x0a97cc00, 0x0bb82430, 0x0cebadd0, 0x0e32afe0, 0x0f8d5df0, 0x10fbd760, 0x127e2680, 0x14143f40, 0x15bdff00, 0x177b2bc0, 0x194b7440, 0x1b2e6f00, 0x1d239ae0, 0x1f2a5ee0, 0x21420ac0, 0x2369d700, 0x25a0e640, 0x27e64500, 0x2a38ebc0, 0x2c97bfc0, 0x2f019400, 0x31752b00, 0x33f13800, 0x36746180, 0x38fd42c0, 0x3b8a6cc0, 0x3e1a6a80, 0x40abc080, 0x433cf080, 0x45cc7c80, 0x4858e600, 0x4ae0b400, 0x4d627280, 0x4fdcb500, 0x524e1b00, 0x54b54e80, 0x57110880, 0x59601300, 0x5ba14800, 0x5dd39780, 0x5ff60500, 0x6207aa80, 0x6407ba80, 0x65f57e80, 0x67d05b00, 0x6997cc80, 0x6b4b6b00, 0x6ceae880, 0x6e761080, 0x6fecc980, 0x714f1280, 0x729d0480, 0x73d6ce80, 0x74fcb800, 0x760f1d80, 0x770e6e80, 0x77fb2f00, 0x78d5f280, 0x799f5b80, 0x7a581b80, 0x7b00ec80, 0x7b9a9480, 0x7c25df80, 0x7ca39e80, 0x7d14a680, 0x7d79ce00, 0x7dd3eb00, 0x7e23d180, 0x7e6a5180, 0x7ea83680, 0x7ede4580, 0x7f0d3a80, 0x7f35cb00, 0x7f58a180, 0x7f765e80, 0x7f8f9880, 0x7fa4db80, 0x7fb6a700, 0x7fc57100, 0x7fd1a400, 0x7fdb9f80, 0x7fe3b980, 0x7fea3e00, 0x7fef6f80, 0x7ff38900, 0x7ff6bc80, 0x7ff93500, 0x7ffb1780, 0x7ffc8300, 0x7ffd9080, 0x7ffe5500, 0x7ffee280, 0x7fff4580, 0x7fff8a00, 0x7fffb800, 0x7fffd580, 0x7fffe880, 0x7ffff400, 0x7ffffa00, 0x7ffffd80, 0x7fffff00, 0x7fffffff }; -#endif - - const float ivas_lpf_4_butter_16k_sos[IVAS_BIQUAD_FILT_LEN << 2] = { 3.97464794223146e-07f, 7.94929601777927e-07f, 3.97464788468481e-07f, 1.f, @@ -3829,16 +3451,6 @@ const float ivas_lpf_4_butter_16k_sos[IVAS_BIQUAD_FILT_LEN << 2] = 1.00000001447843f, 1.f, -1.95913666348268f, 0.961692382252710f }; -#ifdef IVAS_FLOAT_FIXED -const Word32 ivas_lpf_4_butter_16k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2] = -{ - 0x1ab, 0x356, 0x1ab, 0x40000000, - 0x85ec0b80, 0x3a3cb940, 0x40000000, 0x7fffffff, - 0x40000000, 0x40000000, 0x829d8180, 0x3d8c5e40 -}; -#endif - - const float ivas_lpf_4_butter_32k_sos[IVAS_BIQUAD_FILT_LEN << 2] = { 2.56674586654460e-08f, 5.13349181918215e-08f, 2.56674582938215e-08f, 1, @@ -3846,16 +3458,6 @@ const float ivas_lpf_4_butter_32k_sos[IVAS_BIQUAD_FILT_LEN << 2] = 1.00000001447843f, 1, -1.98000953138860f, 0.980654742275836f }; -#ifdef IVAS_FLOAT_FIXED -const Word32 ivas_lpf_4_butter_32k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2] = -{ - 0x1c, 0x37, 0x1c, 0x40000000, - 0x82fd4b80, 0x3d0d2280, 0x40000000, 0x7fffffff, - 0x40000000, 0x40000000, 0x81478600, 0x3ec30c00 -}; -#endif - - const float ivas_lpf_4_butter_48k_sos[IVAS_BIQUAD_FILT_LEN << 2] = { 5.12617881476274e-09f, 1.02523584294987e-08f, 5.12617879059970e-09f, @@ -3863,55 +3465,21 @@ const float ivas_lpf_4_butter_48k_sos[IVAS_BIQUAD_FILT_LEN << 2] = 1.00000000471366f, 1.f , -1.98677297369091f, 0.987060670205863f }; -#ifdef IVAS_FLOAT_FIXED -const Word32 ivas_lpf_4_butter_48k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2] = -{ - 0x6, 0xb, 0x6, 0x40000000, - 0x81ffd700, 0x3e04d500, 0x40000000, 0x7fffff80, - 0x40000000, 0x40000000, 0x80d8b600, 0x3f2c0080 -}; -#endif - - const float ivas_lpf_2_butter_16k[IVAS_BIQUAD_FILT_LEN << 1] = { 0.000628720643081143f, 0.00125744128616229f, 0.000628720643081143f, 1.f, -1.92783286977036f, 0.930347752342683f }; -#ifdef IVAS_FLOAT_FIXED -const Word32 ivas_lpf_2_butter_16k_fx[IVAS_BIQUAD_FILT_LEN << 1] = -{ - 0xa4d0c, 0x149a17, 0xa4d0c, 0x40000000, 0x849e6300, 0x3b8ad140 -}; -#endif - - const float ivas_lpf_2_butter_32k[IVAS_BIQUAD_FILT_LEN << 1] = { 0.000159990787823749f, 0.000319981575647499f, 0.000159990787823749f, 1.f, -1.96390539174033f, 0.964545354891623f }; -#ifdef IVAS_FLOAT_FIXED -const Word32 ivas_lpf_2_butter_32k_fx[IVAS_BIQUAD_FILT_LEN << 1] = -{ - 0x53e1a, 0x29f0d, 0x40000000, 0x824f6000, 0x3dbb1c80, 0x29f0d -}; -#endif - - const float ivas_lpf_2_butter_48k[IVAS_BIQUAD_FILT_LEN << 1] = { 7.15317998432330e-05f, 0.000143063599686466f, 7.15317998432330e-05f, 1.f, -1.97593552482925f, 0.976221652028620f }; -#ifdef IVAS_FLOAT_FIXED -const Word32 ivas_lpf_2_butter_48k_fx[IVAS_BIQUAD_FILT_LEN << 1] = -{ - 0x12c07, 0x2580d, 0x12c07, 0x40000000, 0x818a4580, 0x3e7a6a80 -}; -#endif - - const ivas_lfe_freq_models ivas_str_lfe_freq_models = { { 16384, 14924, 13463, 12003, 10542, 9082, 7622, 6161, @@ -3963,26 +3531,6 @@ const int16_t ivas_lfe_min_shift_tbl[IVAS_LFE_NUM_COEFFS_IN_SUBGRP] = { 1, 0 }; const float ivas_lfe_lpf_delay[2] = { 0.00175f, 0.0035f }; const Word16 ivas_lfe_lpf_delay_Q15[2] = { 57, 114 }; -#ifdef IVAS_FLOAT_FIXED -//Q31 -const UWord32 d_hamm_lfe_plc_fx[LFE_PLC_LENANA / 2] = { - 171798691, 172140039, 173163845, 174869403, 177255533, 180320587, 184062447, 188478526, - 193565772, 199320670, 205739242, 212817053, 220549212, 228930373, 237954746, 247616094, - 257907739, 268822570, 280353042, 292491188, 305228618, 318556530, 332465713, 346946555, - 361989047, 377582794, 393717019, 410380572, 427561937, 445249239, 463430255, 482092421, - 501222838, 520808286, 540835229, 561289828, 582157945, 603425159, 625076772, 647097821, - 669473086, 692187106, 715224182, 738568392, 762203605, 786113486, 810281510, 834690976, - 859325014, 884166600, 909198565, 934403610, 959764316, 985263157, 1010882509, 1036604668, - 1062411858, 1088286242, 1114209939, 1140165034, 1166133589, 1192097656, 1218039293, 1243940572, - 1269783591, 1295550491, 1321223465, 1346784770, 1372216740, 1397501800, 1422622476, 1447561406, - 1472301355, 1496825225, 1521116069, 1545157098, 1568931699, 1592423440, 1615616087, 1638493611, - 1661040202, 1683240277, 1705078494, 1726539762, 1747609248, 1768272390, 1788514910, 1808322817, - 1827682422, 1846580346, 1865003529, 1882939237, 1900375077, 1917298998, 1933699304, 1949564660, - 1964884103, 1979647046, 1993843284, 2007463009, 2020496806, 2032935668, 2044771000, 2055994621, - 2066598775, 2076576133, 2085919801, 2094623320, 2102680676, 2110086301, 2116835076, 2122922337, - 2128343877, 2133095950, 2137175272, 2140579023, 2143304850, 2145350871, 2146715671, 2147398307 -}; -#else const double d_hamm_lfe_plc[LFE_PLC_LENANA / 2] = { 0.08000000000000002, 0.08015895227847719, 0.08063569926248770, 0.08142991147368656, 0.08254104003450596, 0.08396831704748331, 0.08571075612595230, 0.08776715307573196, @@ -4001,7 +3549,6 @@ const double d_hamm_lfe_plc[LFE_PLC_LENANA / 2] = 0.96233504613317988, 0.96698111571154954, 0.97133209998031445, 0.97538499198789563, 0.97913699079334116, 0.98258550340204664, 0.98572814655776630, 0.98856274838967395, 0.99108734991333569, 0.99330020638455863, 0.99519978850517732, 0.99678478347994692, 0.99805409592381300, 0.99900684861892730, 0.99964238312089115, 0.99996026021380402 }; -#endif /*------------------------------------------------------------------------------------------* * MDFT/iMDFT ROM tables @@ -4605,687 +4152,7 @@ const float ivas_mdft_coeff_cos_twid_40[IVAS_40_PT_LEN + 1] = 0.3826834324f, 0.3461170571f, 0.3090169944f, 0.2714404499f, 0.2334453639f, 0.1950903220f, 0.1564344650f, 0.1175373975f, 0.0784590957f, 0.0392598158f, 0.000000000f }; -#ifdef IVAS_FLOAT_FIXED - const Word32 ivas_mdft_coeff_cos_twid_960_fx[IVAS_960_PT_LEN + 1] = -{ - 2147483647 , - 2147480832 ,2147472128 ,2147457792 ,2147437696 , - 2147411840 ,2147380096 ,2147342848 ,2147299712 , - 2147250816 ,2147196160 ,2147135872 ,2147069696 , - 2146997888 ,2146920192 ,2146836864 ,2146747776 , - 2146652928 ,2146552320 ,2146445952 ,2146333824 , - 2146216064 ,2146092416 ,2145963136 ,2145827968 , - 2145687168 ,2145540608 ,2145388288 ,2145230208 , - 2145066496 ,2144896896 ,2144721664 ,2144540544 , - 2144353792 ,2144161280 ,2143963008 ,2143759104 , - 2143549312 ,2143333888 ,2143112704 ,2142885760 , - 2142653056 ,2142414592 ,2142170496 ,2141920512 , - 2141664896 ,2141403648 ,2141136512 ,2140863616 , - 2140585088 ,2140300800 ,2140010752 ,2139715072 , - 2139413632 ,2139106432 ,2138793472 ,2138474752 , - 2138150400 ,2137820288 ,2137484544 ,2137142912 , - 2136795648 ,2136442624 ,2136083968 ,2135719552 , - 2135349376 ,2134973440 ,2134591872 ,2134204544 , - 2133811584 ,2133412864 ,2133008384 ,2132598272 , - 2132182400 ,2131760896 ,2131333632 ,2130900608 , - 2130461952 ,2130017536 ,2129567360 ,2129111680 , - 2128650112 ,2128182912 ,2127710080 ,2127231488 , - 2126747136 ,2126257152 ,2125761536 ,2125260160 , - 2124753152 ,2124240384 ,2123721984 ,2123197824 , - 2122668032 ,2122132608 ,2121591424 ,2121044608 , - 2120492032 ,2119933824 ,2119369984 ,2118800384 , - 2118225152 ,2117644288 ,2117057792 ,2116465536 , - 2115867648 ,2115264128 ,2114654848 ,2114039936 , - 2113419392 ,2112793216 ,2112161408 ,2111523840 , - 2110880640 ,2110231808 ,2109577344 ,2108917248 , - 2108251520 ,2107580032 ,2106903040 ,2106220288 , - 2105532032 ,2104838016 ,2104138496 ,2103433216 , - 2102722304 ,2102005888 ,2101283712 ,2100556032 , - 2099822592 ,2099083648 ,2098338944 ,2097588736 , - 2096832896 ,2096071424 ,2095304320 ,2094531712 , - 2093753344 ,2092969472 ,2092179968 ,2091384832 , - 2090584192 ,2089777920 ,2088966016 ,2088148480 , - 2087325440 ,2086496768 ,2085662464 ,2084822656 , - 2083977216 ,2083126272 ,2082269696 ,2081407488 , - 2080539776 ,2079666560 ,2078787712 ,2077903232 , - 2077013248 ,2076117632 ,2075216640 ,2074309888 , - 2073397760 ,2072479872 ,2071556608 ,2070627712 , - 2069693312 ,2068753408 ,2067807872 ,2066856832 , - 2065900288 ,2064938240 ,2063970560 ,2062997504 , - 2062018816 ,2061034624 ,2060044928 ,2059049728 , - 2058049024 ,2057042688 ,2056030976 ,2055013760 , - 2053990912 ,2052962688 ,2051928960 ,2050889728 , - 2049844992 ,2048794752 ,2047739008 ,2046677888 , - 2045611136 ,2044539008 ,2043461376 ,2042378368 , - 2041289728 ,2040195712 ,2039096192 ,2037991296 , - 2036880896 ,2035764992 ,2034643712 ,2033516928 , - 2032384768 ,2031247104 ,2030104064 ,2028955520 , - 2027801600 ,2026642176 ,2025477376 ,2024307200 , - 2023131520 ,2021950464 ,2020764032 ,2019572096 , - 2018374784 ,2017172096 ,2015964032 ,2014750592 , - 2013531648 ,2012307328 ,2011077760 ,2009842688 , - 2008602240 ,2007356416 ,2006105216 ,2004848640 , - 2003586816 ,2002319488 ,2001046912 ,1999768832 , - 1998485504 ,1997196800 ,1995902720 ,1994603264 , - 1993298560 ,1991988480 ,1990673152 ,1989352320 , - 1988026240 ,1986694912 ,1985358208 ,1984016128 , - 1982668800 ,1981316224 ,1979958272 ,1978595072 , - 1977226496 ,1975852672 ,1974473472 ,1973089152 , - 1971699456 ,1970304384 ,1968904192 ,1967498624 , - 1966087808 ,1964671872 ,1963250560 ,1961823872 , - 1960392064 ,1958955008 ,1957512704 ,1956065152 , - 1954612352 ,1953154304 ,1951691136 ,1950222592 , - 1948748928 ,1947270016 ,1945785856 ,1944296576 , - 1942801920 ,1941302272 ,1939797248 ,1938287104 , - 1936771840 ,1935251328 ,1933725568 ,1932194688 , - 1930658688 ,1929117440 ,1927571072 ,1926019584 , - 1924462848 ,1922900992 ,1921334016 ,1919761920 , - 1918184576 ,1916602112 ,1915014656 ,1913421952 , - 1911824128 ,1910221184 ,1908613248 ,1907000064 , - 1905381760 ,1903758464 ,1902130048 ,1900496512 , - 1898857856 ,1897214208 ,1895565312 ,1893911552 , - 1892252544 ,1890588544 ,1888919552 ,1887245440 , - 1885566208 ,1883881984 ,1882192768 ,1880498432 , - 1878799104 ,1877094656 ,1875385344 ,1873670912 , - 1871951488 ,1870227072 ,1868497536 ,1866763136 , - 1865023744 ,1863279232 ,1861529856 ,1859775360 , - 1858016000 ,1856251648 ,1854482304 ,1852707968 , - 1850928768 ,1849144448 ,1847355392 ,1845561216 , - 1843762176 ,1841958144 ,1840149248 ,1838335360 , - 1836516608 ,1834692864 ,1832864384 ,1831030784 , - 1829192448 ,1827349120 ,1825500928 ,1823647744 , - 1821789824 ,1819927040 ,1818059264 ,1816186624 , - 1814309248 ,1812426880 ,1810539776 ,1808647680 , - 1806750848 ,1804849152 ,1802942720 ,1801031296 , - 1799115136 ,1797194112 ,1795268352 ,1793337728 , - 1791402368 ,1789462144 ,1787517184 ,1785567360 , - 1783612800 ,1781653504 ,1779689344 ,1777720576 , - 1775746944 ,1773768576 ,1771785344 ,1769797504 , - 1767804928 ,1765807616 ,1763805440 ,1761798656 , - 1759787136 ,1757771008 ,1755750016 ,1753724416 , - 1751694080 ,1749659008 ,1747619328 ,1745574912 , - 1743525888 ,1741472128 ,1739413760 ,1737350784 , - 1735283072 ,1733210752 ,1731133696 ,1729052160 , - 1726965888 ,1724875008 ,1722779520 ,1720679424 , - 1718574720 ,1716465408 ,1714351616 ,1712233088 , - 1710109952 ,1707982336 ,1705850112 ,1703713280 , - 1701571968 ,1699426048 ,1697275648 ,1695120640 , - 1692961024 ,1690796928 ,1688628352 ,1686455296 , - 1684277632 ,1682095488 ,1679908864 ,1677717632 , - 1675522048 ,1673321984 ,1671117312 ,1668908288 , - 1666694656 ,1664476672 ,1662254208 ,1660027264 , - 1657795968 ,1655560192 ,1653319936 ,1651075200 , - 1648826240 ,1646572672 ,1644314752 ,1642052480 , - 1639785728 ,1637514752 ,1635239168 ,1632959360 , - 1630675200 ,1628386560 ,1626093568 ,1623796352 , - 1621494656 ,1619188736 ,1616878336 ,1614563712 , - 1612244736 ,1609921408 ,1607593856 ,1605261952 , - 1602925696 ,1600585216 ,1598240384 ,1595891328 , - 1593538048 ,1591180416 ,1588818560 ,1586452480 , - 1584082048 ,1581707520 ,1579328640 ,1576945536 , - 1574558336 ,1572166784 ,1569771136 ,1567371136 , - 1564967040 ,1562558720 ,1560146304 ,1557729664 , - 1555308800 ,1552883712 ,1550454656 ,1548021248 , - 1545583872 ,1543142272 ,1540696576 ,1538246656 , - 1535792768 ,1533334656 ,1530872448 ,1528406272 , - 1525935872 ,1523461376 ,1520982912 ,1518500224 , - 1516013568 ,1513522816 ,1511028096 ,1508529280 , - 1506026368 ,1503519488 ,1501008512 ,1498493568 , - 1495974656 ,1493451648 ,1490924672 ,1488393728 , - 1485858816 ,1483319936 ,1480777088 ,1478230144 , - 1475679360 ,1473124608 ,1470565888 ,1468003328 , - 1465436672 ,1462866176 ,1460291840 ,1457713536 , - 1455131264 ,1452545152 ,1449955200 ,1447361280 , - 1444763520 ,1442161920 ,1439556352 ,1436947072 , - 1434333824 ,1431716864 ,1429095936 ,1426471296 , - 1423842688 ,1421210368 ,1418574336 ,1415934336 , - 1413290624 ,1410643200 ,1407991808 ,1405336832 , - 1402678016 ,1400015488 ,1397349120 ,1394679040 , - 1392005248 ,1389327744 ,1386646528 ,1383961600 , - 1381272960 ,1378580608 ,1375884544 ,1373184768 , - 1370481408 ,1367774336 ,1365063552 ,1362349184 , - 1359631232 ,1356909440 ,1354184192 ,1351455232 , - 1348722688 ,1345986560 ,1343246720 ,1340503424 , - 1337756416 ,1335005952 ,1332251776 ,1329494144 , - 1326732928 ,1323968128 ,1321199744 ,1318427904 , - 1315652480 ,1312873600 ,1310091136 ,1307305216 , - 1304515712 ,1301722880 ,1298926464 ,1296126464 , - 1293323136 ,1290516352 ,1287705984 ,1284892288 , - 1282075136 ,1279254528 ,1276430464 ,1273603072 , - 1270772224 ,1267937920 ,1265100288 ,1262259200 , - 1259414784 ,1256567040 ,1253715840 ,1250861312 , - 1248003456 ,1245142272 ,1242277760 ,1239409920 , - 1236538624 ,1233664128 ,1230786432 ,1227905280 , - 1225020928 ,1222133248 ,1219242368 ,1216348160 , - 1213450624 ,1210550016 ,1207646080 ,1204738816 , - 1201828480 ,1198914816 ,1195998080 ,1193078016 , - 1190154752 ,1187228416 ,1184298752 ,1181366016 , - 1178430080 ,1175491072 ,1172548736 ,1169603456 , - 1166654976 ,1163703296 ,1160748544 ,1157790720 , - 1154829824 ,1151865728 ,1148898688 ,1145928448 , - 1142955136 ,1139978880 ,1136999552 ,1134017024 , - 1131031680 ,1128043136 ,1125051648 ,1122057088 , - 1119059584 ,1116059136 ,1113055616 ,1110049152 , - 1107039616 ,1104027264 ,1101011840 ,1097993600 , - 1094972288 ,1091948032 ,1088920960 ,1085890944 , - 1082857984 ,1079822208 ,1076783488 ,1073741824 , - 1070697344 ,1067649984 ,1064599744 ,1061546688 , - 1058490816 ,1055432064 ,1052370496 ,1049306112 , - 1046238912 ,1043168960 ,1040096192 ,1037020608 , - 1033942272 ,1030861120 ,1027777280 ,1024690624 , - 1021601280 ,1018509184 ,1015414336 ,1012316800 , - 1009216512 ,1006113536 ,1003007936 ,999899584 , - 996788544 ,993674880 ,990558528 ,987439552 , - 984317888 ,981193600 ,978066688 ,974937152 , - 971805056 ,968670336 ,965532992 ,962393088 , - 959250560 ,956105536 ,952957888 ,949807744 , - 946655040 ,943499776 ,940342016 ,937181696 , - 934018880 ,930853632 ,927685824 ,924515520 , - 921342784 ,918167552 ,914989888 ,911809792 , - 908627200 ,905442176 ,902254784 ,899064960 , - 895872704 ,892678080 ,889481024 ,886281600 , - 883079808 ,879875648 ,876669120 ,873460288 , - 870249088 ,867035584 ,863819712 ,860601536 , - 857381120 ,854158336 ,850933312 ,847705984 , - 844476352 ,841244544 ,838010432 ,834774080 , - 831535488 ,828294656 ,825051648 ,821806400 , - 818558976 ,815309376 ,812057536 ,808803520 , - 805547392 ,802289088 ,799028608 ,795766016 , - 792501312 ,789234496 ,785965504 ,782694464 , - 779421248 ,776146048 ,772868736 ,769589312 , - 766307840 ,763024320 ,759738816 ,756451200 , - 753161600 ,749870016 ,746576320 ,743280704 , - 739983104 ,736683520 ,733381952 ,730078400 , - 726772864 ,723465472 ,720156096 ,716844800 , - 713531520 ,710216384 ,706899392 ,703580480 , - 700259648 ,696936960 ,693612416 ,690286016 , - 686957760 ,683627648 ,680295744 ,676961984 , - 673626432 ,670289024 ,666949888 ,663608960 , - 660266240 ,656921728 ,653575488 ,650227520 , - 646877760 ,643526272 ,640173120 ,636818176 , - 633461568 ,630103296 ,626743296 ,623381568 , - 620018240 ,616653248 ,613286592 ,609918336 , - 606548352 ,603176832 ,599803648 ,596428864 , - 593052544 ,589674560 ,586295040 ,582913920 , - 579531264 ,576147072 ,572761280 ,569374016 , - 565985152 ,562594816 ,559203008 ,555809664 , - 552414848 ,549018560 ,545620736 ,542221504 , - 538820864 ,535418720 ,532015168 ,528610176 , - 525203776 ,521795968 ,518386752 ,514976160 , - 511564192 ,508150848 ,504736160 ,501320096 , - 497902720 ,494483968 ,491063936 ,487642560 , - 484219904 ,480795936 ,477370656 ,473944128 , - 470516320 ,467087264 ,463656960 ,460225408 , - 456792608 ,453358592 ,449923392 ,446486944 , - 443049344 ,439610528 ,436170528 ,432729376 , - 429287072 ,425843616 ,422399008 ,418953280 , - 415506432 ,412058464 ,408609376 ,405159232 , - 401707968 ,398255648 ,394802272 ,391347808 , - 387892320 ,384435776 ,380978208 ,377519648 , - 374060032 ,370599456 ,367137856 ,363675296 , - 360211744 ,356747232 ,353281760 ,349815360 , - 346348032 ,342879744 ,339410560 ,335940448 , - 332469472 ,328997568 ,325524800 ,322051168 , - 318576640 ,315101280 ,311625088 ,308148064 , - 304670208 ,301191520 ,297712032 ,294231776 , - 290750688 ,287268864 ,283786240 ,280302848 , - 276818752 ,273333888 ,269848288 ,266361952 , - 262874928 ,259387184 ,255898752 ,252409632 , - 248919840 ,245429392 ,241938272 ,238446512 , - 234954112 ,231461072 ,227967424 ,224473168 , - 220978304 ,217482848 ,213986816 ,210490208 , - 206993040 ,203495312 ,199997040 ,196498224 , - 192998896 ,189499040 ,185998688 ,182497840 , - 178996496 ,175494672 ,171992384 ,168489632 , - 164986416 ,161482768 ,157978704 ,154474192 , - 150969280 ,147463968 ,143958256 ,140452144 , - 136945680 ,133438832 ,129931632 ,126424088 , - 122916200 ,119407992 ,115899456 ,112390608 , - 108881464 ,105372032 ,101862312 ,98352320 , - 94842064 ,91331552 ,87820800 ,84309816 , - 80798600 ,77287168 ,73775528 ,70263696 , - 66751672 ,63239472 ,59727100 ,56214568 , - 52701888 ,49189064 ,45676112 ,42163032 , - 38649844 ,35136552 ,31623164 ,28109692 , - 24596146 ,21082532 ,17568864 ,14055147 , - 10541393 ,7027612 ,3513810 ,0 , -}; - - const Word32 ivas_mdft_coeff_cos_twid_640_fx[IVAS_640_PT_LEN + 1] = -{ - 2147483647 , - 2147477120 ,2147457792 ,2147425408 ,2147380096 , - 2147321984 ,2147250816 ,2147166720 ,2147069696 , - 2146959744 ,2146836864 ,2146701056 ,2146552320 , - 2146390656 ,2146216064 ,2146028416 ,2145827968 , - 2145614592 ,2145388288 ,2145149056 ,2144896896 , - 2144631808 ,2144353792 ,2144062848 ,2143759104 , - 2143442304 ,2143112704 ,2142770048 ,2142414592 , - 2142046208 ,2141664896 ,2141270784 ,2140863616 , - 2140443648 ,2140010752 ,2139565056 ,2139106432 , - 2138634880 ,2138150400 ,2137653120 ,2137142912 , - 2136619904 ,2136083968 ,2135535104 ,2134973440 , - 2134398976 ,2133811584 ,2133211392 ,2132598272 , - 2131972352 ,2131333632 ,2130681984 ,2130017536 , - 2129340288 ,2128650112 ,2127947264 ,2127231488 , - 2126502912 ,2125761536 ,2125007360 ,2124240384 , - 2123460608 ,2122668032 ,2121862656 ,2121044608 , - 2120213632 ,2119369984 ,2118513536 ,2117644288 , - 2116762368 ,2115867648 ,2114960128 ,2114039936 , - 2113107072 ,2112161408 ,2111202944 ,2110231808 , - 2109248000 ,2108251520 ,2107242240 ,2106220288 , - 2105185792 ,2104138496 ,2103078528 ,2102005888 , - 2100920576 ,2099822592 ,2098712064 ,2097588736 , - 2096452864 ,2095304320 ,2094143232 ,2092969472 , - 2091783168 ,2090584192 ,2089372672 ,2088148480 , - 2086911744 ,2085662464 ,2084400640 ,2083126272 , - 2081839360 ,2080539776 ,2079227776 ,2077903232 , - 2076566144 ,2075216640 ,2073854464 ,2072479872 , - 2071092864 ,2069693312 ,2068281344 ,2066856832 , - 2065420032 ,2063970560 ,2062508800 ,2061034624 , - 2059548032 ,2058049024 ,2056537600 ,2055013760 , - 2053477504 ,2051928960 ,2050368000 ,2048794752 , - 2047209088 ,2045611136 ,2044000896 ,2042378368 , - 2040743424 ,2039096192 ,2037436800 ,2035764992 , - 2034081024 ,2032384768 ,2030676224 ,2028955520 , - 2027222528 ,2025477376 ,2023720064 ,2021950464 , - 2020168704 ,2018374784 ,2016568704 ,2014750592 , - 2012920192 ,2011077760 ,2009223168 ,2007356416 , - 2005477632 ,2003586816 ,2001683840 ,1999768832 , - 1997841792 ,1995902720 ,1993951616 ,1991988480 , - 1990013440 ,1988026240 ,1986027264 ,1984016128 , - 1981993216 ,1979958272 ,1977911424 ,1975852672 , - 1973782016 ,1971699456 ,1969604992 ,1967498624 , - 1965380480 ,1963250560 ,1961108736 ,1958955008 , - 1956789632 ,1954612352 ,1952423424 ,1950222592 , - 1948010112 ,1945785856 ,1943549952 ,1941302272 , - 1939042816 ,1936771840 ,1934489088 ,1932194688 , - 1929888768 ,1927571072 ,1925241856 ,1922900992 , - 1920548608 ,1918184576 ,1915809024 ,1913421952 , - 1911023360 ,1908613248 ,1906191616 ,1903758464 , - 1901313920 ,1898857856 ,1896390400 ,1893911552 , - 1891421184 ,1888919552 ,1886406400 ,1883881984 , - 1881346176 ,1878799104 ,1876240640 ,1873670912 , - 1871089920 ,1868497536 ,1865894016 ,1863279232 , - 1860653184 ,1858016000 ,1855367552 ,1852707968 , - 1850037248 ,1847355392 ,1844662272 ,1841958144 , - 1839242880 ,1836516608 ,1833779200 ,1831030784 , - 1828271360 ,1825500928 ,1822719360 ,1819927040 , - 1817123584 ,1814309248 ,1811483904 ,1808647680 , - 1805800704 ,1802942720 ,1800073856 ,1797194112 , - 1794303616 ,1791402368 ,1788490240 ,1785567360 , - 1782633728 ,1779689344 ,1776734336 ,1773768576 , - 1770792064 ,1767804928 ,1764807168 ,1761798656 , - 1758779648 ,1755750016 ,1752709760 ,1749659008 , - 1746597760 ,1743525888 ,1740443520 ,1737350784 , - 1734247424 ,1731133696 ,1728009600 ,1724875008 , - 1721730048 ,1718574720 ,1715409024 ,1712233088 , - 1709046784 ,1705850112 ,1702643200 ,1699426048 , - 1696198656 ,1692961024 ,1689713280 ,1686455296 , - 1683187072 ,1679908864 ,1676620416 ,1673321984 , - 1670013312 ,1666694656 ,1663366016 ,1660027264 , - 1656678656 ,1653319936 ,1649951232 ,1646572672 , - 1643184128 ,1639785728 ,1636377472 ,1632959360 , - 1629531392 ,1626093568 ,1622646016 ,1619188736 , - 1615721600 ,1612244736 ,1608758144 ,1605261952 , - 1601756032 ,1598240384 ,1594715264 ,1591180416 , - 1587636096 ,1584082048 ,1580518656 ,1576945536 , - 1573363072 ,1569771136 ,1566169600 ,1562558720 , - 1558938496 ,1555308800 ,1551669760 ,1548021248 , - 1544363648 ,1540696576 ,1537020288 ,1533334656 , - 1529639808 ,1525935872 ,1522222592 ,1518500224 , - 1514768768 ,1511028096 ,1507278336 ,1503519488 , - 1499751552 ,1495974656 ,1492188672 ,1488393728 , - 1484589824 ,1480777088 ,1476955264 ,1473124608 , - 1469285120 ,1465436672 ,1461579520 ,1457713536 , - 1453838720 ,1449955200 ,1446062848 ,1442161920 , - 1438252160 ,1434333824 ,1430406912 ,1426471296 , - 1422527104 ,1418574336 ,1414612992 ,1410643200 , - 1406664832 ,1402678016 ,1398682752 ,1394679040 , - 1390667008 ,1386646528 ,1382617728 ,1378580608 , - 1374535168 ,1370481408 ,1366419456 ,1362349184 , - 1358270848 ,1354184192 ,1350089472 ,1345986560 , - 1341875584 ,1337756416 ,1333629312 ,1329494144 , - 1325350912 ,1321199744 ,1317040640 ,1312873600 , - 1308698624 ,1304515712 ,1300325120 ,1296126464 , - 1291920128 ,1287705984 ,1283484160 ,1279254528 , - 1275017216 ,1270772224 ,1266519552 ,1262259200 , - 1257991296 ,1253715840 ,1249432832 ,1245142272 , - 1240844160 ,1236538624 ,1232225664 ,1227905280 , - 1223577472 ,1219242368 ,1214899840 ,1210550016 , - 1206192896 ,1201828480 ,1197456896 ,1193078016 , - 1188691968 ,1184298752 ,1179898496 ,1175491072 , - 1171076480 ,1166654976 ,1162226304 ,1157790720 , - 1153348224 ,1148898688 ,1144442240 ,1139978880 , - 1135508608 ,1131031680 ,1126547712 ,1122057088 , - 1117559680 ,1113055616 ,1108544768 ,1104027264 , - 1099503104 ,1094972288 ,1090434944 ,1085890944 , - 1081340416 ,1076783488 ,1072219968 ,1067649984 , - 1063073600 ,1058490816 ,1053901632 ,1049306112 , - 1044704320 ,1040096192 ,1035481792 ,1030861120 , - 1026234304 ,1021601280 ,1016962112 ,1012316800 , - 1007665408 ,1003007936 ,998344384 ,993674880 , - 988999360 ,984317888 ,979630464 ,974937152 , - 970238016 ,965532992 ,960822144 ,956105536 , - 951383104 ,946655040 ,941921216 ,937181696 , - 932436544 ,927685824 ,922929472 ,918167552 , - 913400128 ,908627200 ,903848768 ,899064960 , - 894275648 ,889481024 ,884681024 ,879875648 , - 875065024 ,870249088 ,865427968 ,860601536 , - 855769984 ,850933312 ,846091456 ,841244544 , - 836392512 ,831535488 ,826673472 ,821806400 , - 816934464 ,812057536 ,807175744 ,802289088 , - 797397632 ,792501312 ,787600256 ,782694464 , - 777783936 ,772868736 ,767948864 ,763024320 , - 758095232 ,753161600 ,748223424 ,743280704 , - 738333568 ,733381952 ,728425856 ,723465472 , - 718500672 ,713531520 ,708558144 ,703580480 , - 698598528 ,693612416 ,688622080 ,683627648 , - 678629056 ,673626432 ,668619712 ,663608960 , - 658594176 ,653575488 ,648552832 ,643526272 , - 638495872 ,633461568 ,628423488 ,623381568 , - 618335936 ,613286592 ,608233536 ,603176832 , - 598116480 ,593052544 ,587985024 ,582913920 , - 577839360 ,572761280 ,567679744 ,562594816 , - 557506496 ,552414848 ,547319808 ,542221504 , - 537119936 ,532015168 ,526907136 ,521795968 , - 516681632 ,511564192 ,506443680 ,501320096 , - 496193504 ,491063936 ,485931392 ,480795936 , - 475657568 ,470516320 ,465372256 ,460225408 , - 455075776 ,449923392 ,444768288 ,439610528 , - 434450112 ,429287072 ,424121440 ,418953280 , - 413782592 ,408609376 ,403433728 ,398255648 , - 393075168 ,387892320 ,382707136 ,377519648 , - 372329856 ,367137856 ,361943648 ,356747232 , - 351548672 ,346348032 ,341145280 ,335940448 , - 330733632 ,325524800 ,320314016 ,315101280 , - 309886688 ,304670208 ,299451872 ,294231776 , - 289009856 ,283786240 ,278560896 ,273333888 , - 268105200 ,262874928 ,257643056 ,252409632 , - 247174704 ,241938272 ,236700384 ,231461072 , - 226220368 ,220978304 ,215734912 ,210490208 , - 205244240 ,199997040 ,194748624 ,189499040 , - 184248320 ,178996496 ,173743584 ,168489632 , - 163234656 ,157978704 ,152721792 ,147463968 , - 142205248 ,136945680 ,131685280 ,126424088 , - 121162136 ,115899456 ,110636072 ,105372032 , - 100107344 ,94842064 ,89576208 ,84309816 , - 79042912 ,73775528 ,68507704 ,63239472 , - 57970852 ,52701888 ,47432604 ,42163032 , - 36893208 ,31623164 ,26352928 ,21082532 , - 15812011 ,10541393 ,5270713 ,0 , - }; - - const Word32 ivas_mdft_coeff_cos_twid_320_fx[IVAS_320_PT_LEN + 1] = - { - 2147483647 , - 2147457792 ,2147380096 ,2147250816 ,2147069696 , - 2146836864 ,2146552320 ,2146216064 ,2145827968 , - 2145388288 ,2144896896 ,2144353792 ,2143759104 , - 2143112704 ,2142414592 ,2141664896 ,2140863616 , - 2140010752 ,2139106432 ,2138150400 ,2137142912 , - 2136083968 ,2134973440 ,2133811584 ,2132598272 , - 2131333632 ,2130017536 ,2128650112 ,2127231488 , - 2125761536 ,2124240384 ,2122668032 ,2121044608 , - 2119369984 ,2117644288 ,2115867648 ,2114039936 , - 2112161408 ,2110231808 ,2108251520 ,2106220288 , - 2104138496 ,2102005888 ,2099822592 ,2097588736 , - 2095304320 ,2092969472 ,2090584192 ,2088148480 , - 2085662464 ,2083126272 ,2080539776 ,2077903232 , - 2075216640 ,2072479872 ,2069693312 ,2066856832 , - 2063970560 ,2061034624 ,2058049024 ,2055013760 , - 2051928960 ,2048794752 ,2045611136 ,2042378368 , - 2039096192 ,2035764992 ,2032384768 ,2028955520 , - 2025477376 ,2021950464 ,2018374784 ,2014750592 , - 2011077760 ,2007356416 ,2003586816 ,1999768832 , - 1995902720 ,1991988480 ,1988026240 ,1984016128 , - 1979958272 ,1975852672 ,1971699456 ,1967498624 , - 1963250560 ,1958955008 ,1954612352 ,1950222592 , - 1945785856 ,1941302272 ,1936771840 ,1932194688 , - 1927571072 ,1922900992 ,1918184576 ,1913421952 , - 1908613248 ,1903758464 ,1898857856 ,1893911552 , - 1888919552 ,1883881984 ,1878799104 ,1873670912 , - 1868497536 ,1863279232 ,1858016000 ,1852707968 , - 1847355392 ,1841958144 ,1836516608 ,1831030784 , - 1825500928 ,1819927040 ,1814309248 ,1808647680 , - 1802942720 ,1797194112 ,1791402368 ,1785567360 , - 1779689344 ,1773768576 ,1767804928 ,1761798656 , - 1755750016 ,1749659008 ,1743525888 ,1737350784 , - 1731133696 ,1724875008 ,1718574720 ,1712233088 , - 1705850112 ,1699426048 ,1692961024 ,1686455296 , - 1679908864 ,1673321984 ,1666694656 ,1660027264 , - 1653319936 ,1646572672 ,1639785728 ,1632959360 , - 1626093568 ,1619188736 ,1612244736 ,1605261952 , - 1598240384 ,1591180416 ,1584082048 ,1576945536 , - 1569771136 ,1562558720 ,1555308800 ,1548021248 , - 1540696576 ,1533334656 ,1525935872 ,1518500224 , - 1511028096 ,1503519488 ,1495974656 ,1488393728 , - 1480777088 ,1473124608 ,1465436672 ,1457713536 , - 1449955200 ,1442161920 ,1434333824 ,1426471296 , - 1418574336 ,1410643200 ,1402678016 ,1394679040 , - 1386646528 ,1378580608 ,1370481408 ,1362349184 , - 1354184192 ,1345986560 ,1337756416 ,1329494144 , - 1321199744 ,1312873600 ,1304515712 ,1296126464 , - 1287705984 ,1279254528 ,1270772224 ,1262259200 , - 1253715840 ,1245142272 ,1236538624 ,1227905280 , - 1219242368 ,1210550016 ,1201828480 ,1193078016 , - 1184298752 ,1175491072 ,1166654976 ,1157790720 , - 1148898688 ,1139978880 ,1131031680 ,1122057088 , - 1113055616 ,1104027264 ,1094972288 ,1085890944 , - 1076783488 ,1067649984 ,1058490816 ,1049306112 , - 1040096192 ,1030861120 ,1021601280 ,1012316800 , - 1003007936 ,993674880 ,984317888 ,974937152 , - 965532992 ,956105536 ,946655040 ,937181696 , - 927685824 ,918167552 ,908627200 ,899064960 , - 889481024 ,879875648 ,870249088 ,860601536 , - 850933312 ,841244544 ,831535488 ,821806400 , - 812057536 ,802289088 ,792501312 ,782694464 , - 772868736 ,763024320 ,753161600 ,743280704 , - 733381952 ,723465472 ,713531520 ,703580480 , - 693612416 ,683627648 ,673626432 ,663608960 , - 653575488 ,643526272 ,633461568 ,623381568 , - 613286592 ,603176832 ,593052544 ,582913920 , - 572761280 ,562594816 ,552414848 ,542221504 , - 532015168 ,521795968 ,511564192 ,501320096 , - 491063936 ,480795936 ,470516320 ,460225408 , - 449923392 ,439610528 ,429287072 ,418953280 , - 408609376 ,398255648 ,387892320 ,377519648 , - 367137856 ,356747232 ,346348032 ,335940448 , - 325524800 ,315101280 ,304670208 ,294231776 , - 283786240 ,273333888 ,262874928 ,252409632 , - 241938272 ,231461072 ,220978304 ,210490208 , - 199997040 ,189499040 ,178996496 ,168489632 , - 157978704 ,147463968 ,136945680 ,126424088 , - 115899456 ,105372032 ,94842064 ,84309816 , - 73775528 ,63239472 ,52701888 ,42163032 , - 31623164 ,21082532 ,10541393 ,0 , - }; - - const Word32 ivas_mdft_coeff_cos_twid_240_fx[IVAS_240_PT_LEN + 1] = - { - 2147483647 , - 2147437696 ,2147299712 ,2147069696 ,2146747776 , - 2146333824 ,2145827968 ,2145230208 ,2144540544 , - 2143759104 ,2142885760 ,2141920512 ,2140863616 , - 2139715072 ,2138474752 ,2137142912 ,2135719552 , - 2134204544 ,2132598272 ,2130900608 ,2129111680 , - 2127231488 ,2125260160 ,2123197824 ,2121044608 , - 2118800384 ,2116465536 ,2114039936 ,2111523840 , - 2108917248 ,2106220288 ,2103433216 ,2100556032 , - 2097588736 ,2094531712 ,2091384832 ,2088148480 , - 2084822656 ,2081407488 ,2077903232 ,2074309888 , - 2070627712 ,2066856832 ,2062997504 ,2059049728 , - 2055013760 ,2050889728 ,2046677888 ,2042378368 , - 2037991296 ,2033516928 ,2028955520 ,2024307200 , - 2019572096 ,2014750592 ,2009842688 ,2004848640 , - 1999768832 ,1994603264 ,1989352320 ,1984016128 , - 1978595072 ,1973089152 ,1967498624 ,1961823872 , - 1956065152 ,1950222592 ,1944296576 ,1938287104 , - 1932194688 ,1926019584 ,1919761920 ,1913421952 , - 1907000064 ,1900496512 ,1893911552 ,1887245440 , - 1880498432 ,1873670912 ,1866763136 ,1859775360 , - 1852707968 ,1845561216 ,1838335360 ,1831030784 , - 1823647744 ,1816186624 ,1808647680 ,1801031296 , - 1793337728 ,1785567360 ,1777720576 ,1769797504 , - 1761798656 ,1753724416 ,1745574912 ,1737350784 , - 1729052160 ,1720679424 ,1712233088 ,1703713280 , - 1695120640 ,1686455296 ,1677717632 ,1668908288 , - 1660027264 ,1651075200 ,1642052480 ,1632959360 , - 1623796352 ,1614563712 ,1605261952 ,1595891328 , - 1586452480 ,1576945536 ,1567371136 ,1557729664 , - 1548021248 ,1538246656 ,1528406272 ,1518500224 , - 1508529280 ,1498493568 ,1488393728 ,1478230144 , - 1468003328 ,1457713536 ,1447361280 ,1436947072 , - 1426471296 ,1415934336 ,1405336832 ,1394679040 , - 1383961600 ,1373184768 ,1362349184 ,1351455232 , - 1340503424 ,1329494144 ,1318427904 ,1307305216 , - 1296126464 ,1284892288 ,1273603072 ,1262259200 , - 1250861312 ,1239409920 ,1227905280 ,1216348160 , - 1204738816 ,1193078016 ,1181366016 ,1169603456 , - 1157790720 ,1145928448 ,1134017024 ,1122057088 , - 1110049152 ,1097993600 ,1085890944 ,1073741824 , - 1061546688 ,1049306112 ,1037020608 ,1024690624 , - 1012316800 ,999899584 ,987439552 ,974937152 , - 962393088 ,949807744 ,937181696 ,924515520 , - 911809792 ,899064960 ,886281600 ,873460288 , - 860601536 ,847705984 ,834774080 ,821806400 , - 808803520 ,795766016 ,782694464 ,769589312 , - 756451200 ,743280704 ,730078400 ,716844800 , - 703580480 ,690286016 ,676961984 ,663608960 , - 650227520 ,636818176 ,623381568 ,609918336 , - 596428864 ,582913920 ,569374016 ,555809664 , - 542221504 ,528610176 ,514976160 ,501320096 , - 487642560 ,473944128 ,460225408 ,446486944 , - 432729376 ,418953280 ,405159232 ,391347808 , - 377519648 ,363675296 ,349815360 ,335940448 , - 322051168 ,308148064 ,294231776 ,280302848 , - 266361952 ,252409632 ,238446512 ,224473168 , - 210490208 ,196498224 ,182497840 ,168489632 , - 154474192 ,140452144 ,126424088 ,112390608 , - 98352320 ,84309816 ,70263696 ,56214568 , - 42163032 ,28109692 ,14055147 ,0 , - }; -const Word32 ivas_mdft_coeff_cos_twid_160_fx[IVAS_160_PT_LEN + 1] = -{ - 2147483647 , - 2147380096 ,2147069696 ,2146552320 ,2145827968 , - 2144896896 ,2143759104 ,2142414592 ,2140863616 , - 2139106432 ,2137142912 ,2134973440 ,2132598272 , - 2130017536 ,2127231488 ,2124240384 ,2121044608 , - 2117644288 ,2114039936 ,2110231808 ,2106220288 , - 2102005888 ,2097588736 ,2092969472 ,2088148480 , - 2083126272 ,2077903232 ,2072479872 ,2066856832 , - 2061034624 ,2055013760 ,2048794752 ,2042378368 , - 2035764992 ,2028955520 ,2021950464 ,2014750592 , - 2007356416 ,1999768832 ,1991988480 ,1984016128 , - 1975852672 ,1967498624 ,1958955008 ,1950222592 , - 1941302272 ,1932194688 ,1922900992 ,1913421952 , - 1903758464 ,1893911552 ,1883881984 ,1873670912 , - 1863279232 ,1852707968 ,1841958144 ,1831030784 , - 1819927040 ,1808647680 ,1797194112 ,1785567360 , - 1773768576 ,1761798656 ,1749659008 ,1737350784 , - 1724875008 ,1712233088 ,1699426048 ,1686455296 , - 1673321984 ,1660027264 ,1646572672 ,1632959360 , - 1619188736 ,1605261952 ,1591180416 ,1576945536 , - 1562558720 ,1548021248 ,1533334656 ,1518500224 , - 1503519488 ,1488393728 ,1473124608 ,1457713536 , - 1442161920 ,1426471296 ,1410643200 ,1394679040 , - 1378580608 ,1362349184 ,1345986560 ,1329494144 , - 1312873600 ,1296126464 ,1279254528 ,1262259200 , - 1245142272 ,1227905280 ,1210550016 ,1193078016 , - 1175491072 ,1157790720 ,1139978880 ,1122057088 , - 1104027264 ,1085890944 ,1067649984 ,1049306112 , - 1030861120 ,1012316800 ,993674880 ,974937152 , - 956105536 ,937181696 ,918167552 ,899064960 , - 879875648 ,860601536 ,841244544 ,821806400 , - 802289088 ,782694464 ,763024320 ,743280704 , - 723465472 ,703580480 ,683627648 ,663608960 , - 643526272 ,623381568 ,603176832 ,582913920 , - 562594816 ,542221504 ,521795968 ,501320096 , - 480795936 ,460225408 ,439610528 ,418953280 , - 398255648 ,377519648 ,356747232 ,335940448 , - 315101280 ,294231776 ,273333888 ,252409632 , - 231461072 ,210490208 ,189499040 ,168489632 , - 147463968 ,126424088 ,105372032 ,84309816 , - 63239472 ,42163032 ,21082532 ,0 , -}; - -const Word32 ivas_mdft_coeff_cos_twid_120_fx[IVAS_120_PT_LEN + 1] = -{ - 2147483647 , - 2147299712 ,2146747776 ,2145827968 ,2144540544 , - 2142885760 ,2140863616 ,2138474752 ,2135719552 , - 2132598272 ,2129111680 ,2125260160 ,2121044608 , - 2116465536 ,2111523840 ,2106220288 ,2100556032 , - 2094531712 ,2088148480 ,2081407488 ,2074309888 , - 2066856832 ,2059049728 ,2050889728 ,2042378368 , - 2033516928 ,2024307200 ,2014750592 ,2004848640 , - 1994603264 ,1984016128 ,1973089152 ,1961823872 , - 1950222592 ,1938287104 ,1926019584 ,1913421952 , - 1900496512 ,1887245440 ,1873670912 ,1859775360 , - 1845561216 ,1831030784 ,1816186624 ,1801031296 , - 1785567360 ,1769797504 ,1753724416 ,1737350784 , - 1720679424 ,1703713280 ,1686455296 ,1668908288 , - 1651075200 ,1632959360 ,1614563712 ,1595891328 , - 1576945536 ,1557729664 ,1538246656 ,1518500224 , - 1498493568 ,1478230144 ,1457713536 ,1436947072 , - 1415934336 ,1394679040 ,1373184768 ,1351455232 , - 1329494144 ,1307305216 ,1284892288 ,1262259200 , - 1239409920 ,1216348160 ,1193078016 ,1169603456 , - 1145928448 ,1122057088 ,1097993600 ,1073741824 , - 1049306112 ,1024690624 ,999899584 ,974937152 , - 949807744 ,924515520 ,899064960 ,873460288 , - 847705984 ,821806400 ,795766016 ,769589312 , - 743280704 ,716844800 ,690286016 ,663608960 , - 636818176 ,609918336 ,582913920 ,555809664 , - 528610176 ,501320096 ,473944128 ,446486944 , - 418953280 ,391347808 ,363675296 ,335940448 , - 308148064 ,280302848 ,252409632 ,224473168 , - 196498224 ,168489632 ,140452144 ,112390608 , - 84309816 ,56214568 ,28109692 ,0 , -}; - -const Word32 ivas_mdft_coeff_cos_twid_80_fx[IVAS_80_PT_LEN + 1] = -{ - 2147483647 , - 2147069696 ,2145827968 ,2143759104 ,2140863616 , - 2137142912 ,2132598272 ,2127231488 ,2121044608 , - 2114039936 ,2106220288 ,2097588736 ,2088148480 , - 2077903232 ,2066856832 ,2055013760 ,2042378368 , - 2028955520 ,2014750592 ,1999768832 ,1984016128 , - 1967498624 ,1950222592 ,1932194688 ,1913421952 , - 1893911552 ,1873670912 ,1852707968 ,1831030784 , - 1808647680 ,1785567360 ,1761798656 ,1737350784 , - 1712233088 ,1686455296 ,1660027264 ,1632959360 , - 1605261952 ,1576945536 ,1548021248 ,1518500224 , - 1488393728 ,1457713536 ,1426471296 ,1394679040 , - 1362349184 ,1329494144 ,1296126464 ,1262259200 , - 1227905280 ,1193078016 ,1157790720 ,1122057088 , - 1085890944 ,1049306112 ,1012316800 ,974937152 , - 937181696 ,899064960 ,860601536 ,821806400 , - 782694464 ,743280704 ,703580480 ,663608960 , - 623381568 ,582913920 ,542221504 ,501320096 , - 460225408 ,418953280 ,377519648 ,335940448 , - 294231776 ,252409632 ,210490208 ,168489632 , - 126424088 ,84309816 ,42163032 ,0 , -}; - -const Word32 ivas_mdft_coeff_cos_twid_40_fx[IVAS_40_PT_LEN + 1] = -{ - 2147483647 , - 2145827968 ,2140863616 ,2132598272 ,2121044608 , - 2106220288 ,2088148480 ,2066856832 ,2042378368 , - 2014750592 ,1984016128 ,1950222592 ,1913421952 , - 1873670912 ,1831030784 ,1785567360 ,1737350784 , - 1686455296 ,1632959360 ,1576945536 ,1518500224 , - 1457713536 ,1394679040 ,1329494144 ,1262259200 , - 1193078016 ,1122057088 ,1049306112 ,974937152 , - 899064960 ,821806400 ,743280704 ,663608960 , - 582913920 ,501320096 ,418953280 ,335940448 , - 252409632 ,168489632 ,84309816 ,0 , -}; -#endif const float ivas_sin_twiddle_480[IVAS_480_PT_LEN >> 1] = { -0.000818122995607253f, -0.00736304124977957f, -0.0139076440957708f, -0.0204516511845773f, @@ -5609,18 +4476,7 @@ const float dirac_gains_norm_term[9] = { 1.000000e+00f, 7.071068e-01f, 1.000000e+00f, 4.082483e-01f, 2.041242e-01f, 1.000000e+00f, 2.886751e-01f, 9.128709e-02f, 3.726780e-02f }; -#ifdef IVAS_FLOAT_FIXED -const Word32 dirac_gains_norm_term_int[9] = //Q30 -{ - 1073741824, 759250176, 1073741824, 438353280, 219176688, 1073741824, 309962528, 98018768, - 40015996 -}; -const Word32 dirac_gains_norm_term_fx[9] = //Q31 -{ - 2147483647, 1518500352, 2147483647, 876706560, 438353376, 2147483647, 619925056, 196037536, 80031992 -}; -#endif const float dirac_gains_Pnm[91][9] = { {-1.000000e+00f,-0.000000e+00f,1.000000e+00f,-0.000000e+00f,0.000000e+00f,-1.000000e+00f,-0.000000e+00f,0.000000e+00f,-0.000000e+00f}, @@ -5715,102 +4571,7 @@ const float dirac_gains_Pnm[91][9] = {-1.745235e-02f,9.998478e-01f,-4.995431e-01f,-5.234908e-02f,2.999086e+00f,2.616524e-02f,-1.497488e+00f,-2.617055e-01f,1.499315e+01f}, {-4.371139e-08f,1.000000e+00f,-5.000000e-01f,-1.311342e-07f,3.000000e+00f,6.556709e-08f,-1.500000e+00f,-6.556709e-07f,1.500000e+01f} }; -#ifdef IVAS_FLOAT_FIXED -const Word32 dirac_gains_Pnm_int[91][9] = //Q27 -{ - {-134217728, 0, 134217728, 0, 0, -134217728, 0, 0, 0}, - {-134197288, 2342396, 134156400, -7026119, 122639, -134095104, 14049026, -613106, 10701}, - {-134135976, 4684105, 133972536, -14043751, 490416, -133727536, 28061840, -2450586, 85575}, - {-134033784, 7024438, 133666264, -21044428, 1102895, -133115936, 42002312, -5506921, 288606}, - {-133890784, 9362478, 133238096, -28019012, 1959264, -132262040, 55833192, -9772457, 683351}, - {-133706992, 11697809, 132688440, -34959892, 3058584, -131167848, 69520408, -15234719, 1332861}, - {-133482480, 14029564, 132017976, -41858120, 4399464, -129836328, 83027720, -21876818, 2299344}, - {-133217280, 16357047, 131227600, -48705360, 5980272, -128270864, 96320208, -29678480, 3644062}, - {-132911536, 18679510, 130318176, -55493180, 7799064, -126475552, 109363520, -38615824, 5427104}, - {-132565296, 20996256, 129290928, -62213284, 9853607, -124455056, 122123976, -48661468, 7707213}, - {-132178656, 23306694, 128146968, -68857816, 12141505, -122214432, 134569248, -59785232, 10541761}, - {-131751776, 25609964, 126887800, -75418320, 14659851, -119759704, 146666688, -71952528, 13986158}, - {-131284736, 27905410, 125514928, -81886824, 17405570, -117097048, 158385376, -85126080, 18094094}, - {-130777744, 30192412, 124030024, -88255768, 20375446, -114233392, 169695776, -99266128, 22917396}, - {-130230888, 32470208, 122434848, -94517128, 23565774, -111176104, 180568608, -114328832, 28505376}, - {-129644368, 34738112, 120731408, -100663320, 26972664, -107933048, 190976128, -130267952, 34905200}, - {-129018344, 36995424, 118921736, -106686840, 30591964, -104512608, 200891728, -147034448, 42161440}, - {-128353056, 39241452, 117008088, -112580368, 34419264, -100923608, 210290720, -164576576, 50316080}, - {-127648640, 41475572, 114992728, -118336848, 38449984, -97175216, 219149232, -182840512, 59408524}, - {-126905360, 43697012, 112878208, -123949000, 42679048, -93277184, 227444688, -201769248, 69474696}, - {-126123408, 45905176, 110666976, -129410248, 47101484, -89239304, 235156848, -221304640, 80548296}, - {-125303040, 48099312, 108361848, -134713792, 51711740, -85072152, 242266352, -241385344, 92659128}, - {-124444528, 50278820, 105965584, -139853120, 56504308, -80786280, 248755776, -261949392, 105834368}, - {-123548080, 52443040, 103481048, -144822272, 61473384, -76392608, 254609280, -282932704, 120097808}, - {-122614016, 54591264, 100911328, -149614784, 66612780, -71902504, 259812912, -304269024, 135469312}, - {-121642584, 56722880, 98259536, -154225168, 71916384, -67327280, 264354304, -325891904, 151965872}, - {-120634104, 58837188, 95528944, -158647504, 77377552, -62678672, 268222720, -347732352, 169600480}, - {-119588872, 60933588, 92722800, -162876704, 82989840, -57968464, 271409984, -369722464, 188383040}, - {-118507224, 63011412, 89844624, -166907264, 88746208, -53208660, 273908992, -391791360, 208319200}, - {-117389480, 65070028, 86897888, -170734608, 94639696, -48411356, 275714624, -413868832, 229411120}, - {-116235952, 67108864, 83886096, -174353936, 100663296, -43588484, 276824064, -435884832, 251658240}, - {-115047032, 69127240, 80812992, -177760784, 106809472, -38752388, 277236128, -457767936, 275054816}, - {-113823072, 71124576, 77682296, -180951136, 113070880, -33915128, 276951296, -479447744, 299592224}, - {-112564464, 73100224, 74497888, -183920976, 119439696, -29088994, 275972448, -500852768, 325257600}, - {-111271560, 75053584, 71263600, -186666800, 125908272, -24285974, 274304128, -521913568, 352034976}, - {-109944736, 76984136, 67983320, -189185120, 132468856, -19517968, 271952224, -542560640, 379905024}, - {-108584440, 78891192, 64661120, -191472992, 139113184, -14796968, 268925472, -562724864, 408843424}, - {-107191040, 80774240, 61300996, -193527600, 145833472, -10134552, 265233552, -582338944, 438823936}, - {-105765016, 82632672, 57907084, -195346384, 152621264, -5542341, 260888528, -601335936, 469815200}, - {-104306760, 84465968, 54483472, -196927072, 159468512, -1031517, 255903808, -619651456, 501783968}, - {-102816736, 86273488, 51034412, -198267904, 166366624, 3386773, 250294992, -637221056, 534692032}, - {-101295408, 88054736, 47564080, -199367280, 173307296, 7701825, 244078832, -653983232, 568498944}, - {-99743224, 89809192, 44076620, -200223728, 180282192, 11903295, 237274256, -669879040, 603161856}, - {-98160648, 91536272, 40576356, -200836160, 187282720, 15980983, 229901280, -684849728, 638632640}, - {-96548144, 93235488, 37067500, -201203920, 194300432, 19925212, 221981760, -698840192, 674862144}, - {-94906272, 94906272, 33554432, -201326592, 201326592, 23726568, 213539056, -711796992, 711796992}, - {-93235488, 96548144, 30041364, -201203920, 208352752, 27376188, 204597888, -723670016, 749382016}, - {-91536272, 98160648, 26532496, -200836160, 215370464, 30865648, 195183856, -734411520, 787559936}, - {-89809200, 99743208, 23032272, -200223728, 222370864, 34186800, 185324752, -743976000, 826268864}, - {-88054736, 101295408, 19544786, -199367280, 229345888, 37332284, 175048640, -752322176, 865447872}, - {-86273488, 102816736, 16074439, -198268032, 236286560, 40294912, 164385440, -759410496, 905030144}, - {-84465944, 104306784, 12625336, -196927072, 243184800, 43068320, 153365504, -765205632, 944950528}, - {-82632672, 105765016, 9201773, -195346384, 250031920, 45646496, 142020480, -769675200, 985139200}, - {-80774256, 107191032, 5807891, -193527600, 256819584, 48024044, 130382952, -772789696, 1025526400}, - {-78891192, 108584440, 2447739, -191472992, 263540000, 50196224, 118485736, -774524480, 1066041600}, - {-76984120, 109944720, -874438, -189185120, 270184320, 52158672, 106363224, -774856768, 1106610176}, - {-75053584, 111271544, -4154720, -186666800, 276744864, 53907864, 94049432, -773768704, 1147159552}, - {-73100224, 112564464, -7389016, -183920976, 283213504, 55440728, 81579720, -771245696, 1187614080}, - {-71124568, 113823072, -10573435, -180951136, 289582400, 56754824, 68989160, -767276288, 1227898496}, - {-69127232, 115047064, -13704140, -177760784, 295843776, 57848416, 56313356, -761853888, 1267938048}, - {-67108880, 116235952, -16777203, -174353936, 301989888, 58720256, 43588536, -754974720, 1307654528}, - {-65070028, 117389472, -19788994, -170734608, 308013440, 59369844, 30850226, -746639232, 1346972928}, - {-63011400, 118507224, -22735772, -166907264, 313906944, 59797272, 18134762, -736851968, 1385816832}, - {-60933588, 119588872, -25613950, -162876704, 319663424, 60003204, 5477891, -725620736, 1424110464}, - {-58837172, 120634088, -28420080, -158647504, 325275584, 59989016, -7084927, -712957184, 1461778688}, - {-56722868, 121642576, -31150674, -154225168, 330736768, 59756660, -19517928, -698877184, 1498746240}, - {-54591276, 122613992, -33802452, -149614784, 336040384, 59308680, -31786382, -683399744, 1534940800}, - {-52443040, 123548064, -36372160, -144822272, 341179712, 58648260, -43855684, -666547776, 1570288384}, - {-50278848, 124444520, -38856688, -139853264, 346148864, 57779188, -55691916, -648348160, 1604717952}, - {-48099324, 125303040, -41252988, -134713792, 350941376, 56705796, -67261816, -628830848, 1638160896}, - {-45905160, 126123416, -43558124, -129410240, 355551744, 55433036, -78532848, -608029120, 1670546304}, - {-43697012, 126905360, -45769332, -123949000, 359974080, 53966400, -89473440, -585980480, 1701810944}, - {-41475560, 127648632, -47883864, -118336808, 364203168, 52311936, -100052728, -562724992, 1731889152}, - {-39241464, 128353048, -49899212, -112580408, 368233856, 50476188, -110241232, -538305984, 1760719104}, - {-36995424, 129018360, -51812888, -106686856, 372061216, 48466224, -120010336, -512769824, 1788240512}, - {-34738100, 129644368, -53622532, -100663280, 375680512, 46289628, -129332608, -486166400, 1814398208}, - {-32470208, 130230888, -55325984, -94517088, 379087360, 43954400, -138181984, -458547616, 1839134464}, - {-30192412, 130777744, -56921148, -88255752, 382277728, 41469052, -146533552, -429968768, 1862399872}, - {-27905450, 131284752, -58406064, -81886920, 385247552, 38842476, -154363936, -400487584, 1884144384}, - {-25609950, 131751776, -59778952, -75418272, 387993376, 36083912, -161651424, -370163232, 1904324096}, - {-23306666, 132178656, -61038128, -68857760, 390511712, 33203050, -168375472, -339058272, 1922894464}, - {-20996270, 132565280, -62182040, -62213328, 392799456, 30209874, -174517136, -307236864, 1939817984}, - {-18679498, 132911536, -63209344, -55493124, 394854208, 27114732, -180059392, -274765312, 1955057024}, - {-16357021, 133217280, -64118736, -48705292, 396672992, 23928188, -184986656, -241711232, 1968580864}, - {-14029578, 133482472, -64909128, -41858176, 398253664, 20661142, -189285248, -208144320, 1980359808}, - {-11697849, 133706992, -65579560, -34960012, 399594624, 17324636, -192943088, -174134880, 1990369664}, - {-9362556, 133890784, -66129224, -28019252, 400693888, 13929935, -195949824, -139755008, 1998589184}, - {-7024411, 134033784, -66557432, -21044346, 401550304, 10488515, -198297168, -105077560, 2004999424}, - {-4684126, 134135976, -66863648, -14043818, 402162752, 7011926, -199978640, -70176320, 2009588352}, - {-2342414, 134197304, -67047540, -7026174, 402530496, 3511839, -200989440, -35125516, 2012346496}, - {-5, 134217728, -67108864, -17, 402653184, 8, -201326592, -88, 2013265920} -}; -#endif + const float dirac_gains_trg_term[181][2] = { {-1.000000e+00f,8.742278e-08f}, @@ -5995,376 +4756,7 @@ const float dirac_gains_trg_term[181][2] = {9.998477e-01f,-1.745241e-02f}, {1.000000e+00f,0.000000e+00f} }; -#ifdef IVAS_FLOAT_FIXED -const Word32 dirac_gains_trg_term_int[181][2] = //Q30 -{ - {-1073741824, 93}, - {-1073578304, -18739436}, - {-1073087680, -37473000}, - {-1072270272, -56195404}, - {-1071126272, -74900440}, - {-1069655936, -93582656}, - {-1067859776, -112236624}, - {-1065738240, -130856168}, - {-1063292288, -149436080}, - {-1060522368, -167970160}, - {-1057429248, -186453440}, - {-1054014208, -204879600}, - {-1050278016, -223243376}, - {-1046221952, -241539408}, - {-1041847104, -259761664}, - {-1037154944, -277904896}, - {-1032146880, -295963392}, - {-1026824448, -313931616}, - {-1021189120, -331804480}, - {-1015242880, -349576096}, - {-1008987264, -367241408}, - {-1002424448, -384794592}, - {-995556160, -402230656}, - {-988384640, -419544416}, - {-980912000, -436730112}, - {-973140608, -453782944}, - {-965072832, -470697376}, - {-956710976, -487468704}, - {-948057792, -504091296}, - {-939115840, -520560224}, - {-929887680, -536871040}, - {-920376384, -553017856}, - {-910584576, -568996544}, - {-900515712, -584801664}, - {-890172480, -600428672}, - {-879557888, -615873088}, - {-868675520, -631129536}, - {-857528320, -646194048}, - {-846120128, -661061376}, - {-834454080, -675727744}, - {-822533888, -690187904}, - {-810363392, -704438016}, - {-797945664, -718473536}, - {-785285056, -732290112}, - {-772385152, -745883904}, - {-759250176, -759250176}, - {-745883904, -772385152}, - {-732290112, -785285056}, - {-718473600, -797945664}, - {-704438016, -810363392}, - {-690187904, -822533888}, - {-675727552, -834454144}, - {-661061376, -846120128}, - {-646194048, -857528320}, - {-631129536, -868675392}, - {-615873088, -879557760}, - {-600428672, -890172352}, - {-584801792, -900515712}, - {-568996544, -910584576}, - {-553017856, -920376384}, - {-536871040, -929887680}, - {-520560224, -939115776}, - {-504091296, -948057792}, - {-487468704, -956710976}, - {-470697376, -965072832}, - {-453782944, -973140608}, - {-436730208, -980911936}, - {-419544416, -988384640}, - {-402230784, -995556160}, - {-384794592, -1002424448}, - {-367241280, -1008987264}, - {-349576096, -1015242880}, - {-331804480, -1021189120}, - {-313931712, -1026824384}, - {-295963392, -1032146880}, - {-277904800, -1037154944}, - {-259761664, -1041847104}, - {-241539296, -1046221952}, - {-223243488, -1050278016}, - {-204879600, -1054014208}, - {-186453328, -1057429248}, - {-167970160, -1060522368}, - {-149435984, -1063292288}, - {-130856168, -1065738240}, - {-112236624, -1067859776}, - {-93582792, -1069655936}, - {-74900448, -1071126272}, - {-56195288, -1072270272}, - {-37473008, -1073087680}, - {-18739318, -1073578304}, - {-46, -1073741824}, - {18739350, -1073578304}, - {37473052, -1073087680}, - {56195320, -1072270272}, - {74900480, -1071126272}, - {93582824, -1069655936}, - {112236512, -1067859776}, - {130856168, -1065738240}, - {149435984, -1063292288}, - {167970272, -1060522368}, - {186453328, -1057429248}, - {204879504, -1054014208}, - {223243488, -1050278016}, - {241539296, -1046221952}, - {259761664, -1041847104}, - {277904896, -1037154944}, - {295963392, -1032146880}, - {313931712, -1026824448}, - {331804480, -1021189120}, - {349576096, -1015242880}, - {367241408, -1008987264}, - {384794720, -1002424320}, - {402230784, -995556160}, - {419544320, -988384640}, - {436730112, -980912000}, - {453782848, -973140608}, - {470697504, -965072832}, - {487468576, -956710976}, - {504091296, -948057792}, - {520560352, -939115776}, - {536870912, -929887680}, - {553017920, -920376384}, - {568996544, -910584704}, - {584801664, -900515712}, - {600428800, -890172224}, - {615873088, -879557888}, - {631129536, -868675392}, - {646193920, -857528320}, - {661061504, -846120064}, - {675727616, -834454144}, - {690187904, -822533888}, - {704438016, -810363136}, - {718473536, -797945792}, - {732290176, -785285056}, - {745883776, -772385216}, - {759250176, -759250176}, - {772385216, -745883776}, - {785285056, -732290112}, - {797945664, -718473536}, - {810363264, -704438016}, - {822533888, -690187904}, - {834454144, -675727616}, - {846120128, -661061504}, - {857528320, -646193920}, - {868675392, -631129536}, - {879557888, -615873088}, - {890172352, -600428800}, - {900515712, -584801792}, - {910584704, -568996544}, - {920376384, -553017920}, - {929887680, -536870912}, - {939115776, -520560352}, - {948057792, -504091296}, - {956710976, -487468576}, - {965072832, -470697504}, - {973140608, -453782944}, - {980911936, -436730112}, - {988384640, -419544320}, - {995556160, -402230784}, - {1002424320, -384794592}, - {1008987264, -367241280}, - {1015242880, -349576096}, - {1021189120, -331804480}, - {1026824448, -313931712}, - {1032146880, -295963392}, - {1037154944, -277904800}, - {1041847104, -259761664}, - {1046221952, -241539296}, - {1050278016, -223243488}, - {1054014208, -204879600}, - {1057429248, -186453328}, - {1060522368, -167970272}, - {1063292288, -149435984}, - {1065738240, -130856168}, - {1067859776, -112236624}, - {1069655936, -93582760}, - {1071126272, -74900440}, - {1072270272, -56195308}, - {1073087680, -37473052}, - {1073578304, -18739382}, - {1073741824, 0} -}; - -const Word32 dirac_gains_trg_term_fx[181][2] = //Q31 -{ - {(-2147483647 - 1),187}, - {-2147156608,-37478872}, - {-2146175360,-74946000}, - {-2144540544,-112390808}, - {-2142252544,-149800880}, - {-2139311872,-187165312}, - {-2135719552,-224473248}, - {-2131476480,-261712336}, - {-2126584576,-298872160}, - {-2121044736,-335940320}, - {-2114858496,-372906880}, - {-2108028416,-409759200}, - {-2100556032,-446486752}, - {-2092443904,-483078816}, - {-2083694208,-519523328}, - {-2074309888,-555809792}, - {-2064293760,-591926784}, - {-2053648896,-627863232}, - {-2042378240,-663608960}, - {-2030485760,-699152192}, - {-2017974528,-734482816}, - {-2004848896,-769589184}, - {-1991112320,-804461312}, - {-1976769280,-839088832}, - {-1961824000,-873460224}, - {-1946281216,-907565888}, - {-1930145664,-941394752}, - {-1913421952,-974937408}, - {-1896115584,-1008182592}, - {-1878231680,-1041120448}, - {-1859775360,-1073742080}, - {-1840752768,-1106035712}, - {-1821169152,-1137993088}, - {-1801031424,-1169603328}, - {-1780344960,-1200857344}, - {-1759115776,-1231746176}, - {-1737351040,-1262259072}, - {-1715056640,-1292388096}, - {-1692240256,-1322122752}, - {-1668908160,-1351455488}, - {-1645067776,-1380375808}, - {-1620726784,-1408876032}, - {-1595891328,-1436947072}, - {-1570570112,-1464580224}, - {-1544770304,-1491767808}, - {-1518500352,-1518500352}, - {-1491767808,-1544770304}, - {-1464580224,-1570570112}, - {-1436947200,-1595891328}, - {-1408876032,-1620726784}, - {-1380375808,-1645067776}, - {-1351455104,-1668908288}, - {-1322122752,-1692240256}, - {-1292388096,-1715056640}, - {-1262259072,-1737350784}, - {-1231746176,-1759115520}, - {-1200857344,-1780344704}, - {-1169603584,-1801031424}, - {-1137993088,-1821169152}, - {-1106035712,-1840752768}, - {-1073742080,-1859775360}, - {-1041120448,-1878231552}, - {-1008182592,-1896115584}, - {-974937408,-1913421952}, - {-941394752,-1930145664}, - {-907565888,-1946281216}, - {-873460416,-1961823872}, - {-839088832,-1976769280}, - {-804461568,-1991112320}, - {-769589184,-2004848896}, - {-734482560,-2017974528}, - {-699152192,-2030485760}, - {-663608960,-2042378240}, - {-627863424,-2053648768}, - {-591926784,-2064293760}, - {-555809600,-2074309888}, - {-519523328,-2083694208}, - {-483078592,-2092443904}, - {-446486976,-2100556032}, - {-409759200,-2108028416}, - {-372906656, -2114858496}, - { -335940320,-2121044736 }, - { -298871968,-2126584576 }, - { -261712336,-2131476480 }, - { -224473248,-2135719552 }, - { -187165584,-2139311872 }, - { -149800896,-2142252544 }, - { -112390576,-2144540544 }, - { -74946016,-2146175360 }, - { -37478636,-2147156608 }, - { -93,(-2147483647 - 1) }, - { 37478700,-2147156608 }, - { 74946104,-2146175360 }, - { 112390640,-2144540544 }, - { 149800960,-2142252544 }, - { 187165648,-2139311872 }, - { 224473024,-2135719552 }, - { 261712336,-2131476480 }, - { 298871968,-2126584576 }, - { 335940544,-2121044736 }, - { 372906656,-2114858496 }, - { 409759008,-2108028416 }, - { 446486976,-2100556032 }, - { 483078592,-2092443904 }, - { 519523328,-2083694208 }, - { 555809792,-2074309888 }, - { 591926784,-2064293760 }, - { 627863424,-2053648896 }, - { 663608960,-2042378240 }, - { 699152192,-2030485760 }, - { 734482816,-2017974528 }, - { 769589440,-2004848640 }, - { 804461568,-1991112320 }, - { 839088640,-1976769280 }, - { 873460224,-1961824000 }, - { 907565696,-1946281216 }, - { 941395008,-1930145664 }, - { 974937152,-1913421952 }, - { 1008182592,-1896115584 }, - { 1041120704,-1878231552 }, - { 1073741824,-1859775360 }, - { 1106035840,-1840752768 }, - { 1137993088,-1821169408 }, - { 1169603328,-1801031424 }, - { 1200857600,-1780344448 }, - { 1231746176,-1759115776 }, - { 1262259072,-1737350784 }, - { 1292387840,-1715056640 }, - { 1322123008,-1692240128 }, - { 1351455232,-1668908288 }, - { 1380375808,-1645067776 }, - { 1408876032,-1620726272 }, - { 1436947072,-1595891584 }, - { 1464580352,-1570570112 }, - { 1491767552,-1544770432 }, - { 1518500352,-1518500352 }, - { 1544770432,-1491767552 }, - { 1570570112,-1464580224 }, - { 1595891328,-1436947072 }, - { 1620726528,-1408876032 }, - { 1645067776,-1380375808 }, - { 1668908288,-1351455232 }, - { 1692240256,-1322123008 }, - { 1715056640,-1292387840 }, - { 1737350784,-1262259072 }, - { 1759115776,-1231746176 }, - { 1780344704,-1200857600 }, - { 1801031424,-1169603584 }, - { 1821169408,-1137993088 }, - { 1840752768,-1106035840 }, - { 1859775360,-1073741824 }, - { 1878231552,-1041120704 }, - { 1896115584,-1008182592 }, - { 1913421952,-974937152 }, - { 1930145664,-941395008 }, - { 1946281216,-907565888 }, - { 1961823872,-873460224 }, - { 1976769280,-839088640 }, - { 1991112320,-804461568 }, - { 2004848640,-769589184 }, - { 2017974528,-734482560 }, - { 2030485760,-699152192 }, - { 2042378240,-663608960 }, - { 2053648896,-627863424 }, - { 2064293760,-591926784 }, - { 2074309888,-555809600 }, - { 2083694208,-519523328 }, - { 2092443904,-483078592 }, - { 2100556032,-446486976 }, - { 2108028416,-409759200 }, - { 2114858496,-372906656 }, - { 2121044736,-335940544 }, - { 2126584576,-298871968 }, - { 2131476480,-261712336 }, - { 2135719552,-224473248 }, - { 2139311872,-187165520 }, - { 2142252544,-149800880 }, - { 2144540544,-112390616 }, - { 2146175360,-74946104 }, - { 2147156608,-37478764 }, - { 2147483647,0 } }; -#endif + /*----------------------------------------------------------------------------------* * FB ROM tables *----------------------------------------------------------------------------------*/ @@ -6429,24 +4821,6 @@ const float ivas_fb_cf_4ms_16k[IVAS_FB_4MS_16K_SAMP] = 0.9664963994f, 0.9747640903f, 0.9818880329f, 0.9878510650f, 0.9926388212f, 0.9962397673f, 0.9986452283f, 0.9998494093f, }; -#ifdef IVAS_FLOAT_FIXED -const Word16 ivas_fb_cf_4ms_48k_fx[IVAS_FB_4MS_48K_SAMP] = -{ -0, 4, 13, 26, 44, 66, 92, 123, 158, 197, 241, 289, 341, 398, 458, 524, 593, 667, 744, 826, 913, 1003, 1097, 1196, 1298, 1405, 1516, 1630, 1749, 1871, 1998, 2128, 2262, 2400, 2541, 2687, 2836, 2988, 3144, 3304, 3467, 3634, 3804, 3977, 4154, 4334, 4517, 4704, 4893, 5086, 5282, 5480, 5682, 5886, 6094, 6304, 6516, 6732, 6949, 7170, 7393, 7618, 7846, 8076, 8308, 8542, 8779, 9017, 9258, 9500, 9744, 9990, 10238, 10487, 10738, 10990, 11244, 11499, 11756, 12014, 12273, 12533, 12794, 13056, 13319, 13582, 13847, 14112, 14378, 14644, 14911, 15178, 15446, 15713, 15981, 16249, 16518, 16786, 17054, 17321, 17589, 17856, 18123, 18389, 18655, 18920, 19185, 19448, 19711, 19973, 20234, 20494, 20753, 21011, 21268, 21523, 21777, 22029, 22280, 22529, 22777, 23023, 23267, 23509, 23750, 23988, 24225, 24459, 24691, 24921, 25149, 25374, 25597, 25818, 26035, 26251, 26463, 26673, 26881, 27085, 27287, 27485, 27681, 27874, 28063, 28250, 28433, 28613, 28790, 28963, 29133, 29300, 29463, 29623, 29779, 29931, 30080, 30226, 30367, 30505, 30639, 30769, 30896, 31018, 31137, 31251, 31362, 31469, 31571, 31670, 31764, 31854, 31941, 32023, 32100, 32174, 32243, 32309, 32369, 32426, 32478, 32526, 32570, 32609, 32644, 32675, 32701, 32723, 32741, 32754, 32763, 32767, -}; - -const Word16 ivas_fb_cf_4ms_32k_fx[IVAS_FB_4MS_32K_SAMP] = -{ - 1, 11, 30, 60, 99, 149, 208, 276, 355, 443, 541, 648, 765, 891, 1026, 1171, 1325, 1488, 1660, 1840, 2030, 2228, 2435, 2650, 2873, 3105, 3345, 3592, 3847, 4110, 4380, 4657, 4941, 5233, 5530, 5835, 6146, 6463, 6786, 7115, 7449, 7789, 8134, 8483, 8838, 9197, 9561, 9928, 10300, 10675, 11054, 11435, 11820, 12208, 12598, 12990, 13385, 13781, 14179, 14578, 14978, 15379, 15780, 16182, 16585, 16987, 17388, 17789, 18189, 18588, 18986, 19382, 19777, 20169, 20559, 20947, 21332, 21713, 22092, 22467, 22839, 23206, 23570, 23929, 24284, 24633, 24978, 25318, 25652, 25981, 26304, 26621, 26932, 27237, 27534, 27826, 28110, 28387, 28657, 28920, 29175, 29422, 29662, 29894, 30117, 30332, 30539, 30737, 30927, 31107, 31279, 31442, 31596, 31741, 31876, 32002, 32119, 32226, 32324, 32412, 32491, 32559, 32618, 32668, 32707, 32737, 32756, 32766, -}; - -const Word16 ivas_fb_cf_4ms_16k_fx[IVAS_FB_4MS_16K_SAMP] = -{ -4, 44, 123, 241, 398, 593, 826, 1097, 1405, 1749, 2128, 2541, 2988, 3467, 3977, 4517, 5086, 5682, 6304, 6949, 7618, 8308, 9017, 9744, 10487, 11244, 12014, 12794, 13582, 14378, 15178, 15981, 16786, 17589, 18389, 19185, 19973, 20753, 21523, 22280, 23023, 23750, 24459, 25149, 25818, 26463, 27085, 27681, 28250, 28790, 29300, 29779, 30226, 30639, 31018, 31362, 31670, 31941, 32174, 32369, 32526, 32644, 32723, 32763, -}; -#endif - - const float ivas_fb_fcs_12band_1ms[IVAS_FB_BANDS_12] = { 0.0083333333f, 0.0250000000f, 0.0416666667f, 0.0583333333f, @@ -6573,24 +4947,6 @@ const float ivas_fb_cf_1ms_16k[IVAS_FB_1MS_16K_SAMP] = 0.5490085702f, 0.6451423386f, 0.7356983684f, 0.8171966421f, 0.8865052267f, 0.9409606322f, 0.9784701679f, 0.9975923633f, }; -#ifdef IVAS_FLOAT_FIXED -const Word16 ivas_fb_cf_1ms_48k_fx[IVAS_FB_1MS_48K_SAMP] = -{ - 8, 78, 218, 427, 705, 1050, 1460, 1934, 2470, 3066, 3718, 4425, 5184, 5990, 6840, 7732, 8660, 9622, 10612, 11627, 12663, 13715, 14778, 15847, 16920, 17989, 19052, 20104, 21140, 22155, 23145, 24107, 25035, 25927, 26777, 27583, 28342, 29049, 29701, 30297, 30833, 31307, 31717, 32062, 32340, 32549, 32689, 32759, -}; - -const Word16 ivas_fb_cf_1ms_32k_fx[IVAS_FB_1MS_32K_SAMP] = -{ - 19, 177, 491, 957, 1573, 2330, 3224, 4244, 5381, 6624, 7960, 9378, 10864, 12403, 13979, 15580, 17187, 18788, 20364, 21903, 23389, 24807, 26143, 27386, 28523, 29543, 30437, 31194, 31810, 32276, 32590, 32748, -}; - -const Word16 ivas_fb_cf_1ms_16k_fx[IVAS_FB_1MS_16K_SAMP] = -{ -78, 705, 1934, 3718, 5990, 8660, 11627, 14778, 17989, 21140, 24107, 26777, 29049, 30833, 32062, 32689, - }; - -#endif - const float ivas_fb_fr_12band_1ms_re[IVAS_FB_12_1MS_LEN] = { 0.9748788957f, 0.9427895242f, 0.8792742509f, 0.7856320394f, 0.6637543553f, 0.5159842697f, 0.3449612971f, 0.1523029468f, @@ -7634,22 +5990,6 @@ const float ivas_fb_resp_cheby_ramp_16del[IVAS_FB_1MS_16K_SAMP + 1] = 0.500000000000000f }; -#ifdef IVAS_FLOAT_FIXED -/* Q Factor is 31*/ -const Word32 ivas_fb_resp_cheby_ramp_32del_fx[IVAS_FB_1MS_32K_SAMP + 1] = { - 21970992, 16097417, 21859084, 28772960, 36989692, 46636088, 57839904, 70755400, 85490472, - 102165872, 120908192, 141807584, 164922576, 190321136, 218072144, 248214064, 280795872, - 315834176, 353276992, 393021664, 435109696, 479474528, 525959424, 574472512, 624859584, - 676981248, 730657728, 785668096, 841854208, 899002688, 956860544, 1015180800, 1073741824, -}; - -/* Q Factor is 31*/ -const Word32 ivas_fb_resp_cheby_ramp_16del_fx[IVAS_FB_1MS_16K_SAMP + 1] = { - 23460896, 29872362, 47814248, 71691184, 102337872, 140498880, 186843680, 241748256, 305433120, - 377921280, 458893152, 547769792, 643727232, 745668672, 852315136, 962208832, 1073741824, -}; -#endif - const int16_t ivas_num_active_bands[FB - WB + 1] = { IVAS_16K_12BANDS_ACTIVE_BANDS, IVAS_FB_BANDS_12, IVAS_FB_BANDS_12 @@ -7796,140 +6136,6 @@ const float ivas_sns_cdbk_tcx20_stage1[ 128 * 16 ] = 0.2253418f, 2.2539062f, 2.265625f, 0.57128906f, -0.7661133f, -0.6245117f, 0.21313477f, 1.2248535f, 0.8737793f, -0.12524414f, -0.9609375f, -2.416504f, -1.1223145f, -0.70532227f, -0.31469727f, -0.592041f, }; -#ifdef IVAS_FLOAT_FIXED -/*Q12*/ -const Word16 ivas_sns_cdbk_tcx20_stage1_fx[ 128 * 16 ] = -{ - -7498 , -8552 , -3948 , 11493 , 10929 , 4767 , 5696 , 4985 , 5673 , 1825 , -1927 , -2174 , -3321 , -4771 , -5964 , -7214 , - -10641 , -13643 , -7600 , -1477 , 6893 , 10597 , 4021 , 919 , -537 , 684 , 6146 , 1349 , 1375 , 4748 , 736 , -3571 , - 8121 , 9016 , 4721 , 3315 , 3543 , 4759 , 5279 , 5578 , 4435 , 3410 , 492 , -2942 , -8990 , -12493 , -13751 , -14493 , - 646 , 4522 , 1609 , -2654 , -4481 , -4275 , -4938 , -4698 , -4089 , -1547 , 1428 , 4430 , 5202 , 4974 , 3429 , 441 , - 1001 , -2898 , -4776 , -4824 , -1005 , 1623 , 4558 , 5049 , 5546 , 4459 , 3687 , 3688 , -126 , -3430 , -5243 , -7311 , - -3765 , -762 , -3030 , -6261 , -7149 , -5194 , -3869 , 997 , 5325 , 6801 , 5249 , 4107 , 2928 , 2308 , 1946 , 369 , - 10168 , 5956 , 3730 , 2771 , 2326 , 2853 , 3117 , 2884 , 1479 , -133 , -2832 , -4621 , -6076 , -6372 , -6981 , -8269 , - 9885 , 6118 , 4056 , 3729 , 2954 , 2262 , 382 , -887 , -2030 , -1996 , -3016 , -3773 , -4113 , -4045 , -4375 , -5152 , - -3335 , 5139 , 6949 , 5817 , 4078 , 4678 , 4112 , 3805 , 2705 , 921 , -2675 , -4919 , -5304 , -5636 , -7035 , -9300 , - -5726 , 774 , 1426 , -213 , -1582 , -1060 , -1381 , -448 , -337 , 307 , -78 , 485 , 1252 , 2090 , 2767 , 1723 , - 4376 , 8005 , 8723 , 8483 , 6453 , 4642 , 1740 , -811 , -3455 , -4423 , -5495 , -5697 , -5721 , -5357 , -5457 , -6006 , - 9786 , 10280 , 4686 , 1498 , -692 , -958 , 1101 , 3151 , 2236 , 2122 , -1101 , -3777 , -4952 , -6004 , -7796 , -9579 , - -5550 , 5500 , 6501 , 7932 , 2414 , 2004 , -724 , -797 , 465 , 79 , 1246 , -954 , -8806 , -5066 , -857 , -3387 , - 3592 , -6275 , -6564 , -5666 , -2347 , -3624 , -3711 , -4039 , -4858 , -5538 , -5004 , -2044 , 6173 , 16714 , 9046 , 14147 , - 16852 , 13619 , 9025 , 4301 , 605 , -1497 , -3065 , -3483 , -4472 , -4221 , -4897 , -5230 , -4820 , -4121 , -3894 , -4701 , - 3227 , 10297 , 4142 , -3143 , -5540 , -3558 , 1739 , 5927 , 5194 , 4741 , -1693 , -3809 , -3779 , -3780 , -3312 , -6653 , - -9100 , -5057 , -1642 , 2448 , -2023 , 4879 , 133 , 5593 , 1767 , 4924 , 6821 , 2411 , -1210 , -4078 , -4246 , -1619 , - -7619 , -11980 , 600 , 2505 , 2570 , -5562 , 1970 , -1802 , 2335 , 4846 , -4895 , 3392 , 5151 , 6508 , 2257 , -277 , - 8936 , 11845 , 11978 , 10584 , 9236 , 7186 , 3794 , 1874 , -708 , -3953 , -7322 , -9670 , -10750 , -10778 , -10917 , -11335 , - 8587 , 838 , -5142 , -8197 , -8172 , -5767 , -4419 , -1944 , -79 , 1853 , 3022 , 3823 , 4142 , 4618 , 3723 , 3112 , - -5283 , 568 , 1979 , 2570 , 2120 , 2234 , 1918 , 2247 , 1603 , 2038 , 1584 , -93 , -1478 , -3355 , -4339 , -4312 , - 3278 , 2345 , 280 , -2908 , -4330 , -3770 , -3036 , -1236 , 758 , 3245 , 3120 , 2288 , 1603 , 916 , -401 , -2152 , - 18828 , 10647 , 3579 , -3906 , -287 , 10855 , 5635 , -3673 , -6872 , -5289 , -2424 , -5462 , -6052 , -2769 , -4104 , -8707 , - -4121 , 2761 , 3751 , 4035 , 3218 , -38 , -1640 , -513 , -750 , -12 , -1597 , -1672 , -1522 , -637 , 42 , -1302 , - -5458 , 2924 , 6701 , 9084 , 6798 , 7952 , 4454 , 5450 , 5949 , 5277 , -2303 , -8307 , -11701 , -10523 , -8863 , -7432 , - 379 , 6294 , 8583 , 7842 , 6055 , 3554 , -1419 , -894 , -4610 , -4731 , -3777 , -2242 , -3681 , -3172 , -3323 , -4856 , - 9040 , 14426 , 8046 , 2314 , -89 , 612 , 655 , 895 , -4796 , -4631 , -1323 , -264 , -6051 , -6580 , -5728 , -6526 , - 10320 , 9632 , 5351 , 853 , -2496 , -4459 , -5580 , -5161 , -5476 , -4380 , -3281 , -1752 , -624 , 1835 , 2457 , 2762 , - 6230 , 4286 , 3054 , 2103 , 1411 , 882 , -116 , -345 , 353 , 511 , -1457 , -2334 , -2581 , -2840 , -3948 , -5209 , - -2351 , -845 , -4051 , -7663 , -8133 , -6619 , -6596 , -5580 , -3850 , -278 , 3739 , 7371 , 8632 , 9397 , 9551 , 7277 , - 14878 , 8087 , 1612 , -2811 , -4559 , -4173 , -3660 , -2457 , -1780 , -938 , -1082 , -880 , -541 , 40 , -680 , -1056 , - -357 , 6763 , 7507 , 2217 , 983 , 5824 , 3263 , 5362 , 4023 , 5140 , -7718 , -7703 , -6304 , -5528 , -5237 , -8233 , - -9056 , -2879 , 4548 , 9096 , 9567 , 8235 , 6713 , 5876 , 4240 , 2331 , -452 , -3615 , -6496 , -8240 , -9501 , -10367 , - -6591 , -10319 , -10037 , 1092 , 9508 , 10608 , 14496 , -4303 , -5138 , -1136 , 3886 , 5677 , 2912 , -4172 , -5188 , -1298 , - 3868 , 10098 , 10930 , 8191 , 5304 , 4169 , 3641 , 2883 , 1198 , -205 , -3154 , -5928 , -8536 , -10323 , -10806 , -11331 , - -580 , -1263 , -2402 , -5074 , -6014 , -4529 , -3202 , -2168 , -259 , 2212 , 3665 , 5339 , 5604 , 4695 , 3222 , 754 , - 1658 , -3851 , -5014 , -4529 , -1764 , -300 , 8217 , 16396 , 2000 , 824 , 665 , -1713 , -3175 , -3034 , -3057 , -3324 , - -11375 , -8634 , -6184 , -6208 , -4129 , -150 , 1519 , 4345 , 5629 , 5310 , 4007 , 4455 , 3926 , 3560 , 3104 , 823 , - 7473 , 12120 , 11294 , 4728 , 3568 , 5501 , 3688 , 3508 , 1692 , -1661 , -8566 , -9762 , -8843 , -8001 , -8086 , -8653 , - 8613 , 5171 , 4353 , 3298 , 925 , -530 , -1637 , -2214 , -3071 , -2941 , -3234 , -2961 , -2504 , -1211 , -880 , -1176 , - 621 , 10589 , 7196 , 3759 , 1529 , -659 , -1898 , -893 , -380 , -88 , -927 , -1736 , -2729 , -3606 , -4369 , -6410 , - -10687 , -7849 , -5755 , -6353 , -5913 , -3150 , -2865 , -1183 , -382 , 1696 , 2622 , 5191 , 7208 , 8842 , 10178 , 8401 , - -366 , 8121 , 9838 , 5330 , 503 , 3640 , 5493 , 4385 , 472 , -837 , -3977 , -9982 , -8797 , -5441 , -3061 , -5319 , - 10435 , 576 , -3431 , -5099 , -5048 , -3131 , -1414 , 1467 , 2492 , 2334 , 1243 , 257 , 1129 , 1454 , -1171 , -2093 , - -2408 , 4154 , 6243 , 5033 , 3118 , 2477 , 901 , 862 , 622 , 627 , -473 , -1897 , -2823 , -3803 , -5378 , -7253 , - 5751 , -3944 , -5457 , -3268 , 270 , -185 , -1373 , -2563 , -3758 , -4024 , -4052 , -3460 , -2709 , -237 , 9209 , 19800 , - 11172 , 15303 , 13936 , 10936 , 5606 , 374 , -3235 , -4534 , -5841 , -5872 , -6303 , -6525 , -6391 , -6176 , -6037 , -6414 , - 5173 , 10429 , 7690 , -211 , -4293 , -3886 , -1661 , 896 , 81 , -608 , -1808 , -2380 , -2191 , -1905 , -2123 , -3203 , - -8788 , -1052 , 5387 , 6699 , 5899 , 3671 , 3443 , 3830 , 4015 , 2746 , -536 , -2438 , -3985 , -4693 , -6124 , -8075 , - -8721 , -8773 , -1913 , 3002 , 5005 , -1141 , -1250 , 4860 , 3573 , -249 , 246 , 1790 , 3243 , 3739 , -189 , -3222 , - 12821 , 11330 , 7418 , 6142 , 4487 , 3660 , 3434 , 2422 , 898 , -805 , -4025 , -7013 , -9016 , -9871 , -10400 , -11484 , - 6459 , 1432 , -705 , -1814 , -2564 , -2337 , -2669 , -1789 , -1565 , -767 , -696 , -14 , 629 , 1614 , 2310 , 2475 , - 523 , 864 , 661 , 262 , 533 , 1619 , 2390 , 2554 , 2076 , 1532 , 248 , -542 , -1545 , -2462 , -3431 , -5282 , - 2754 , 7840 , 1531 , -5320 , -7337 , -5059 , -1828 , 2415 , 2801 , 2414 , 920 , -54 , -675 , 295 , 594 , -1290 , - 16459 , 9353 , 5397 , 5154 , 6401 , 4035 , 525 , -1206 , -2684 , -3963 , -5726 , -6290 , -6446 , -6516 , -6917 , -7575 , - 3331 , 2764 , 1820 , 1449 , 404 , 197 , -617 , -518 , -755 , -625 , -1250 , -1192 , -1278 , -978 , -1091 , -1661 , - 1202 , 10867 , 13999 , 10573 , 8667 , 5713 , 3901 , 1699 , -649 , -3697 , -6326 , -8102 , -9055 , -9334 , -9517 , -9940 , - 3105 , 10471 , 11637 , 9256 , 1588 , -4373 , -5838 , -3257 , -2501 , -2719 , -3963 , -4248 , -3642 , -2230 , -780 , -2506 , - 7036 , 12562 , 13320 , 10158 , 3016 , -3341 , -3328 , 586 , 1408 , -1129 , -5924 , -5878 , -5793 , -6843 , -7570 , -8279 , - 11292 , 4466 , 2522 , 790 , -1414 , -1946 , -1506 , -261 , 583 , 802 , -656 , -1773 , -2651 , -2250 , -3307 , -4691 , - 4319 , 4371 , 4567 , 4600 , 3221 , 2633 , 1994 , 1398 , 564 , -536 , -2662 , -3664 , -4402 , -4565 , -5348 , -6489 , - -7437 , -5416 , -5951 , -7745 , -7676 , -4554 , -4813 , -2349 , 668 , 6481 , 8239 , 7629 , 6574 , 6530 , 6295 , 3525 , - 13292 , 11390 , 5199 , 2139 , 489 , -271 , -644 , -427 , -1114 , -1854 , -3425 , -4756 , -5461 , -5211 , -4922 , -4424 , - 710 , 9953 , 9525 , 5612 , 1946 , 2958 , 298 , -154 , -1714 , -3333 , -6410 , -9882 , -5524 , -2172 , -432 , -1382 , - -10643 , -8047 , -2326 , 2007 , 3553 , 2546 , 4871 , 5435 , 4843 , 4106 , 2244 , 1050 , -497 , -1808 , -2878 , -4457 , - 294 , -9337 , -8427 , -1045 , 9093 , 10411 , 3417 , 3239 , 2068 , -534 , 1078 , -1517 , -2125 , -1732 , -2738 , -2145 , - 5432 , 12777 , 10582 , 2772 , -92 , 2136 , 2501 , 4105 , 2738 , 3539 , -1530 , -8480 , -9513 , -8753 , -8426 , -9787 , - 5972 , 8255 , 4335 , -524 , -2484 , -2872 , -3937 , -3518 , -3037 , -774 , 635 , 1891 , 1590 , 660 , -1520 , -4672 , - 6572 , 3645 , -218 , -1090 , 345 , 2321 , 3692 , 4654 , 4719 , 3041 , 2117 , 459 , -3402 , -7045 , -8640 , -11170 , - -5410 , -344 , -990 , -3893 , -5051 , -2311 , -77 , 3918 , 4679 , 4822 , 3303 , 1776 , 337 , 305 , 409 , -1472 , - 8389 , 11222 , 8707 , 4721 , 3131 , 2061 , 1130 , 791 , -354 , -651 , -3686 , -5202 , -6383 , -7339 , -7792 , -8746 , - 9298 , 9362 , 6305 , 3177 , 968 , -72 , -945 , -819 , -1079 , -725 , -2067 , -2739 , -3434 , -4331 , -5460 , -7441 , - 2704 , 6870 , 6571 , 6294 , 4511 , 3348 , 2296 , 2931 , 2159 , 954 , -1545 , -3421 , -5465 , -7201 , -9296 , -11710 , - 880 , -1826 , -3492 , -4233 , -3893 , -2425 , -1948 , -823 , -259 , 657 , 1000 , 2107 , 2906 , 3603 , 3958 , 3790 , - -196 , 6860 , 8581 , 9562 , 7277 , 7244 , 1471 , 1946 , -228 , -338 , -3115 , -7547 , -11656 , -9838 , -4686 , -5339 , - 8578 , 4837 , 2226 , 754 , -1817 , -2201 , 499 , 2914 , 3313 , 3158 , -527 , -4733 , -5791 , -4100 , -3403 , -3706 , - -4232 , 6556 , 1920 , 6615 , -946 , 4468 , 280 , 2157 , 766 , -524 , -922 , -1974 , -2072 , -1600 , -4968 , -5524 , - 7288 , 2936 , -1640 , -4588 , -6332 , -6285 , -6188 , -5571 , -5223 , -3844 , -1671 , 2013 , 5110 , 8289 , 8345 , 7362 , - 11493 , 11342 , 6954 , 1821 , -1692 , -2612 , -3300 , -3319 , -3814 , -2738 , -2931 , -2814 , -2479 , -1890 , -1719 , -2303 , - 8177 , 11903 , 6525 , -1422 , -3274 , 251 , 4220 , 4653 , 3045 , -303 , -5550 , -5079 , -5244 , -5314 , -5883 , -6703 , - -9438 , -3031 , 483 , 1317 , 1847 , 1874 , 3018 , 2956 , 788 , 3090 , 730 , -1912 , -1688 , 122 , 860 , -1017 , - -3693 , -4977 , -541 , 2877 , 3327 , -2337 , -4262 , -2189 , 699 , 2375 , 3310 , 1962 , 1504 , 1017 , 1319 , -390 , - 6065 , 7469 , 7234 , 10424 , 10658 , 7912 , 5388 , 4640 , 2156 , -733 , -4795 , -9010 , -11277 , -11766 , -11999 , -12365 , - 10932 , 2437 , -1845 , -3262 , -3753 , -3716 , -4031 , -3422 , -2848 , -1620 , -1167 , 176 , 1764 , 2966 , 3342 , 4047 , - -619 , -1377 , -1334 , -455 , -198 , 333 , 279 , 702 , 835 , 1061 , 505 , 476 , 127 , 254 , 270 , -859 , - 5215 , 1197 , -575 , -1227 , -2612 , -2325 , -649 , 1885 , 2691 , 2793 , 1163 , -765 , -1768 , -1371 , -1567 , -2082 , - 19164 , 11491 , 4615 , -1985 , -3389 , 3234 , 9530 , 1792 , -6657 , -7546 , -6135 , -3576 , -5395 , -6848 , -4207 , -4089 , - -5579 , 2618 , 4644 , 1302 , 270 , 4372 , 3748 , 1797 , -752 , -937 , -2728 , -2859 , -706 , -865 , -1022 , -3304 , - -1838 , 6025 , 10256 , 11080 , 7972 , 1492 , -1232 , 2649 , 3965 , 3980 , -6137 , -7448 , -7596 , -7566 , -6578 , -9023 , - 1944 , 6450 , 7024 , 8636 , 7062 , 1810 , -1661 , -772 , 542 , -13 , -3255 , -4851 , -5285 , -5086 , -5501 , -7043 , - 8123 , 16086 , 12234 , 5222 , 1088 , 112 , 327 , 1928 , -3259 , -5187 , -6713 , -7464 , -5697 , -5814 , -5336 , -5649 , - 859 , 7375 , 6059 , 2544 , 375 , -1579 , -3831 , -3783 , -3738 , -2686 , -2393 , -1129 , 29 , 1048 , 1033 , -183 , - 2101 , 4211 , 3442 , 2574 , 2178 , 2151 , 1104 , 386 , 135 , -216 , -2007 , -2668 , -2626 , -2609 , -3456 , -4701 , - -5046 , -336 , -968 , -3416 , -4451 , -3637 , -4472 , -3410 , -3255 , -1874 , -1058 , 1763 , 4855 , 7351 , 9606 , 8347 , - 19995 , 9006 , 2634 , -634 , -1483 , -1947 , -2216 , -805 , -298 , -446 , -2156 , -3518 , -3871 , -4075 , -4720 , -5467 , - -2272 , 8650 , 9022 , 2896 , -866 , 3555 , 4656 , 4146 , 4057 , 5105 , 893 , -7960 , -11942 , -9282 , -3999 , -6659 , - -3314 , 4163 , 6336 , 8539 , 7909 , 6703 , 4331 , 4759 , 3115 , 1223 , -1904 , -4488 , -6662 , -8210 , -10273 , -12228 , - -1219 , -6996 , -6238 , 5560 , 19256 , 6948 , 16806 , -1718 , -4399 , -4432 , 1743 , -4434 , -5576 , -4824 , -5420 , -5055 , - 7337 , 7092 , 7560 , 9007 , 7842 , 4106 , 2111 , 1823 , -310 , -2228 , -4758 , -6480 , -7636 , -7833 , -8350 , -9284 , - -127 , -7162 , -7239 , -8124 , -5968 , -3470 , -2064 , 167 , 1784 , 2556 , 3741 , 6051 , 7042 , 5293 , 3278 , 4242 , - -4837 , -8327 , -8445 , -7964 , -6737 , -3635 , 12584 , 10749 , 9489 , 14113 , 4466 , -818 , -963 , -2829 , -1662 , -5183 , - -9221 , -7856 , -8616 , -9610 , -8803 , -4648 , -2322 , 3345 , 7609 , 8661 , 7189 , 7848 , 6804 , 4876 , 3375 , 1368 , - 3370 , 8415 , 9491 , 3696 , 2112 , 4195 , 2535 , 1216 , -704 , -2599 , -4917 , -4773 , -4766 , -4924 , -5695 , -6652 , - 5033 , 6480 , 5225 , 2803 , 1389 , 388 , -1095 , -1930 , -1285 , -783 , -2330 , -2783 , -2299 , -2271 , -2847 , -3696 , - 6462 , 10974 , 9445 , 5632 , 3121 , 338 , -2526 , -3512 , -4157 , -4256 , -4496 , -3576 , -3213 , -3003 , -3042 , -4191 , - -8903 , -5489 , -3362 , -3932 , -2867 , -42 , -794 , 1047 , 1551 , 2990 , 1925 , 1809 , 2047 , 3857 , 5983 , 4180 , - -1078 , 5534 , 5668 , 8546 , 7579 , 7727 , 3515 , 2403 , 425 , -3939 , -7676 , -10486 , -4654 , -3810 , -5900 , -3854 , - 11241 , 2333 , -888 , -2668 , -601 , 2056 , 973 , -782 , -1134 , -628 , -1278 , -1464 , -1036 , -1025 , -2566 , -2532 , - 188 , 993 , 1510 , 3746 , 3964 , 4113 , 3912 , 3774 , 2904 , 1760 , -544 , -2262 , -3823 , -5032 , -6585 , -8617 , - 17244 , 5164 , -3514 , -5803 , -5740 , -3512 , -4264 , -5949 , -7105 , -7263 , -6297 , -4203 , 3488 , 882 , 9119 , 17753 , - 18572 , 16918 , 11329 , 8930 , 3706 , 2301 , -534 , -4811 , -6296 , -6264 , -6923 , -7015 , -7012 , -7183 , -7628 , -8090 , - 2776 , 9267 , 4870 , -2407 , -3332 , 1594 , 479 , 626 , -2334 , -2117 , -1714 , -1452 , -1892 , -1016 , -575 , -2774 , - -5418 , -1560 , 977 , 3118 , 4128 , 4683 , 3995 , 3168 , 1326 , 367 , -798 , -1786 , -2341 , -2513 , -3011 , -4334 , - -5417 , -6011 , -5325 , -2432 , 93 , 2347 , 2339 , 1497 , 2097 , 3182 , 2553 , 1778 , 1688 , 2154 , 997 , -1540 , - 9725 , 13565 , 12472 , 9916 , 5050 , 2613 , 1338 , 621 , -1049 , -4212 , -7066 , -8072 , -8504 , -8673 , -8645 , -9079 , - 3568 , 2083 , 779 , -447 , -1488 , -1526 , -2026 , -1584 , -1564 , -893 , -955 , -362 , 96 , 991 , 1665 , 1663 , - 4308 , 2100 , 967 , 1304 , 1477 , 1636 , 1557 , 2064 , 2234 , 1529 , -1013 , -2413 , -2782 , -3000 , -4202 , -5767 , - -2729 , 7254 , 5313 , 626 , -4368 , -3106 , 689 , 2051 , 1436 , 577 , 2137 , -551 , -4980 , -1408 , 137 , -3079 , - 15090 , 13574 , 8552 , 4879 , 2489 , 603 , 625 , 413 , -965 , -1853 , -5221 , -7106 , -7498 , -7482 , -7752 , -8349 , - 2370 , 3151 , 1957 , 225 , -516 , -337 , -392 , 223 , 813 , 1307 , 124 , -276 , -702 , -1169 , -2432 , -4348 , - -4031 , 4338 , 9696 , 9577 , 10361 , 8623 , 7730 , 5093 , 2251 , -518 , -3768 , -6931 , -9490 , -10533 , -10950 , -11448 , - 10303 , 15787 , 11780 , 8011 , -1234 , -5671 , -6127 , -5176 , -4588 , -3477 , -4783 , -2583 , -2036 , -3150 , -2990 , -4066 , - 1649 , 10539 , 12961 , 10244 , 5607 , -356 , -2601 , -488 , 30 , -2077 , -2877 , -8331 , -8515 , -7727 , -3810 , -4247 , - 8997 , 5275 , 2084 , -488 , -2018 , -2461 , -3081 , -2315 , -2223 , -1654 , -1778 , -1155 , -563 , 285 , 587 , 507 , - 2053 , 8908 , 7041 , 522 , -1083 , 1920 , 1555 , 2991 , 959 , 1714 , -3254 , -3680 , -2792 , -4401 , -4878 , -7576 , - -9455 , -8989 , -9057 , -10160 , -9541 , -6763 , -5661 , -3200 , -593 , 3501 , 6901 , 10117 , 10416 , 11442 , 11927 , 9115 , - 7190 , 11877 , 7889 , 1661 , -96 , 1823 , 1276 , 741 , -1950 , -1969 , -4935 , -5445 , -5084 , -4151 , -3666 , -5162 , - 923 , 9232 , 9280 , 2340 , -3138 , -2558 , 873 , 5017 , 3579 , -513 , -3936 , -9898 , -4597 , -2889 , -1289 , -2425 , -}; -#endif const float ivas_sns_cdbk_tcx20_stage2[ 64 * 16 ] = { -1.1569824f, -0.4765625f, 0.008056641f, 0.47802734f, 0.38330078f, -0.075683594f, -0.3737793f, -0.29516602f, -0.1352539f, 0.012939453f, 0.22241211f, 0.375f, 0.31689453f, 0.20874023f, 0.2541504f, 0.25439453f, @@ -7997,76 +6203,7 @@ const float ivas_sns_cdbk_tcx20_stage2[ 64 * 16 ] = 0.3227539f, -1.0678711f, -1.1435547f, 0.068603516f, 0.7546387f, 0.38745117f, 0.09008789f, -0.0007324219f, -0.12792969f, 0.076416016f, 0.24853516f, 0.28735352f, 0.076660156f, -0.041748047f, -0.01977539f, 0.08911133f, 0.6101074f, -0.22070312f, -0.5324707f, -0.119384766f, 0.10473633f, 0.16333008f, -0.15112305f, -0.34472656f, -0.39746094f, -0.43652344f, -0.23876953f, 0.0017089844f, 0.056152344f, 0.22973633f, 0.50024414f, 0.7751465f, }; -#ifdef IVAS_FLOAT_FIXED -/*Q12*/ -const Word16 ivas_sns_cdbk_tcx20_stage2_fx[ 64 * 16 ] = -{ - -4739 , -1952 , 33 , 1958 , 1570 , -310 , -1531 , -1209 , -554 , 53 , 911 , 1536 , 1298 , 855 , 1041 , 1042 , - -1663 , -904 , -175 , 651 , -1032 , -2713 , -1113 , 1177 , 1464 , 826 , 214 , -1494 , -1846 , 763 , 2736 , 3107 , - 112 , -859 , -1631 , -2224 , -1919 , -1030 , -1104 , -307 , 1536 , 3827 , 3753 , 1748 , 107 , -638 , -468 , -902 , - 46 , 1539 , 3454 , 2870 , 2388 , -2034 , -3447 , -1887 , -692 , -27 , -310 , -923 , -859 , -521 , 27 , 377 , - 1736 , 793 , 312 , 1806 , 467 , -1631 , -500 , 1432 , 2116 , -102 , -2181 , -280 , 2082 , -270 , -2800 , -2981 , - -499 , 628 , 1238 , 973 , 1115 , 3296 , 3147 , 1180 , -225 , -1217 , -1869 , -1759 , -1756 , -1809 , -1438 , -1005 , - -814 , -42 , -125 , -171 , 215 , 305 , 107 , -109 , 761 , 921 , 805 , 630 , 183 , -456 , -1018 , -1190 , - 3133 , 1965 , 1284 , 613 , 952 , 693 , 240 , -514 , -738 , -801 , -702 , -785 , -963 , -1364 , -1554 , -1460 , - -2540 , -1194 , -624 , 654 , 1697 , 2507 , 1824 , 793 , -441 , -1656 , -427 , 1665 , 1549 , -53 , -1580 , -2175 , - -2612 , -80 , 1350 , -1143 , -868 , 3411 , 1168 , -1279 , -1792 , -1401 , -43 , 224 , 407 , 470 , 941 , 1247 , - -3135 , -2208 , -1570 , -1618 , -898 , 791 , 778 , -354 , -184 , 553 , 1861 , 2776 , 2413 , 1232 , 177 , -614 , - 1427 , -894 , 74 , 274 , 1641 , 1416 , -2247 , -3524 , -984 , 2485 , 916 , -207 , 570 , 111 , -306 , -753 , - 567 , 223 , 845 , -469 , -3177 , -2357 , 2872 , 824 , -1392 , 757 , 1566 , -859 , -167 , 552 , 315 , -101 , - -1017 , -1966 , -2969 , -2645 , -1036 , 1791 , 2595 , 2648 , 2209 , 1368 , 569 , 1255 , 1349 , -305 , -1605 , -2241 , - -180 , -2117 , -1548 , 2748 , 1044 , -1910 , -2213 , -915 , 378 , 69 , 1015 , 1919 , 2044 , 1120 , -379 , -1075 , - 61 , 1450 , 1443 , -536 , -2041 , -2153 , -241 , 101 , -1208 , -1900 , -710 , 1553 , 1938 , 1209 , 785 , 249 , - -871 , -3584 , -3398 , -2068 , -1304 , -586 , 802 , 1195 , 1173 , 629 , 692 , 918 , 1136 , 1304 , 1676 , 2286 , - -5190 , 69 , 1485 , 2699 , 2450 , 2023 , 739 , 746 , 653 , -67 , -772 , -1497 , -1398 , -1046 , -609 , -285 , - 436 , 3227 , 395 , -2370 , -1678 , 289 , 1631 , 1271 , 450 , 574 , 1098 , 1346 , 176 , -1624 , -2479 , -2743 , - -2034 , 1082 , 2695 , 1685 , 1183 , 915 , 636 , -341 , -486 , 350 , 1164 , 625 , -760 , -1982 , -2380 , -2349 , - 914 , 1532 , 886 , -2080 , -3920 , -4687 , -1446 , 2800 , 2748 , 1303 , 524 , -634 , -11 , 747 , 691 , 632 , - 1084 , -467 , -438 , 1087 , 2116 , 2201 , 1470 , 691 , 853 , 987 , 574 , -224 , -1366 , -2404 , -3041 , -3123 , - 3022 , -593 , -1542 , -411 , 421 , 580 , 276 , -223 , -67 , -96 , -91 , -202 , -250 , -445 , -371 , -7 , - 4287 , 2796 , 539 , -861 , -426 , -868 , -1334 , -1937 , -2448 , -2081 , -837 , 139 , 474 , 386 , 738 , 1432 , - -3717 , -1050 , 587 , 144 , -312 , -549 , -30 , 857 , 1641 , 2410 , 2657 , 2049 , 788 , -915 , -1966 , -2594 , - 1656 , 90 , 245 , 2403 , 4979 , 1448 , -716 , -288 , -387 , -1023 , -1625 , -1371 , -1425 , -1584 , -1505 , -899 , - 2943 , -214 , -1605 , -563 , 565 , 838 , 558 , -616 , -919 , -1002 , 498 , 2396 , 2264 , -116 , -2465 , -2562 , - 29 , 1348 , 1688 , 136 , -859 , -273 , -627 , 84 , 1360 , 3635 , 2904 , -1691 , -2928 , -2031 , -1197 , -1576 , - -3472 , 1420 , 442 , -1499 , -1990 , -1702 , -1566 , -1104 , 78 , 1033 , 1640 , 1632 , 1574 , 1220 , 1212 , 1081 , - 1953 , -23 , -627 , -1383 , -1259 , 1004 , 3624 , 2500 , -1346 , -2634 , -1795 , -778 , -511 , -345 , 456 , 1163 , - 4332 , -964 , -3948 , -3470 , 1285 , 4835 , 3224 , 584 , -77 , -893 , -848 , -484 , -428 , -664 , -1430 , -1053 , - -117 , -1788 , -833 , 558 , 730 , 891 , -108 , -1659 , -2651 , -2745 , -1081 , 1583 , 2809 , 2204 , 1191 , 1018 , - -1345 , -373 , -461 , -1404 , -2370 , -2179 , -1860 , -1422 , -886 , -763 , -387 , 596 , 1341 , 2668 , 4449 , 4396 , - 703 , 1081 , 785 , 116 , -226 , 588 , 371 , 128 , -841 , -1511 , -2399 , -3059 , -3098 , -175 , 3474 , 4064 , - 2514 , -777 , -1994 , -1860 , -1724 , -1633 , -1409 , -1049 , -426 , 483 , 1396 , 1809 , 1677 , 1298 , 934 , 762 , - -2407 , 787 , 1259 , 1895 , 1549 , 339 , -1486 , -2126 , -2176 , -1736 , -1109 , -617 , -109 , 887 , 2228 , 2818 , - -2370 , -192 , 160 , -107 , 141 , -1165 , -2137 , 299 , 2936 , 3445 , -1416 , -1420 , 1045 , 1309 , 500 , -1029 , - -803 , 477 , 733 , 1105 , 1659 , 1199 , 396 , -525 , -596 , -699 , -668 , -547 , -466 , -585 , -527 , -153 , - -854 , -1179 , -969 , -484 , 67 , 243 , 278 , -137 , -55 , 12 , 281 , 514 , 599 , 462 , 461 , 759 , - -555 , 4717 , 2129 , -264 , -987 , -522 , -88 , -291 , -391 , -491 , -515 , -766 , -855 , -879 , -331 , 88 , - -1373 , -2671 , -1199 , 3480 , 2467 , 1443 , 608 , 260 , -542 , -1600 , -1685 , -1118 , -694 , -114 , 750 , 1987 , - 934 , 3323 , 1049 , -2373 , 769 , 3068 , 503 , -1591 , -2364 , -3449 , -3986 , -3071 , 844 , 5877 , 941 , -474 , - -425 , 228 , -1215 , -1583 , -1505 , -1579 , -934 , -791 , -484 , -477 , 1056 , 4177 , 4488 , 3123 , -786 , -3291 , - 1305 , -1331 , -1055 , 1844 , 3061 , 1077 , -2285 , -2600 , 230 , 4597 , 1138 , -3419 , -3967 , -827 , 2157 , 77 , - 997 , 210 , -659 , -997 , -624 , 153 , 286 , -62 , -2489 , 591 , 3868 , 1520 , -1263 , -1424 , -494 , 387 , - 550 , 1926 , -1797 , -3507 , -2499 , -447 , 586 , 751 , 425 , -141 , -276 , 149 , 519 , 762 , 1372 , 1626 , - 4225 , -2078 , 205 , 1305 , -229 , -2501 , -1305 , -231 , 298 , 233 , -219 , -284 , -355 , -157 , 196 , 896 , - 1933 , 2394 , 2521 , -320 , -2587 , -3794 , -3666 , -1887 , -607 , -128 , 189 , 577 , 518 , 1040 , 1956 , 1861 , - -4582 , -2223 , -1479 , -548 , -20 , 1204 , 1867 , 1627 , 992 , -767 , -2361 , -1057 , 474 , 2119 , 2744 , 2011 , - -3537 , -810 , -278 , -246 , 338 , 2203 , 3 , -278 , -22 , 2105 , 1761 , -1452 , -2749 , -633 , 2262 , 1334 , - 2549 , 1831 , 1526 , 633 , -570 , -1662 , -2041 , -1590 , -568 , 965 , 2087 , 1627 , 325 , -934 , -1811 , -2366 , - -2625 , 735 , 4126 , 1924 , -1352 , -1375 , -67 , -263 , -332 , -611 , -223 , 69 , -41 , -365 , -50 , 449 , - 1945 , -542 , 862 , 1501 , -463 , -3503 , -3203 , 3338 , 4340 , -1886 , -1472 , -176 , -899 , -1007 , 153 , 1012 , - 1176 , -2807 , 927 , 489 , -701 , -1222 , 1377 , 2025 , 1740 , 704 , 835 , 366 , -857 , -1584 , -1462 , -1007 , - 1374 , 1113 , 165 , -297 , -35 , -391 , -815 , -1221 , -716 , -497 , -249 , 51 , 360 , 245 , 279 , 635 , - 4741 , 2291 , -661 , -1808 , -1569 , -1013 , -23 , 449 , 899 , 914 , -15 , -826 , -1123 , -1159 , -870 , -227 , - -3095 , -3457 , -326 , 1213 , 999 , 1504 , 2296 , 1487 , 1074 , 733 , 257 , -216 , -595 , -863 , -635 , -376 , - 1313 , 1943 , 2320 , 2119 , 1731 , 1184 , 521 , -954 , -2164 , -2882 , -2594 , -1657 , -957 , -667 , -49 , 792 , - -225 , 2104 , 1245 , 2010 , 1467 , -381 , -1564 , -1777 , -2347 , -1964 , -723 , 1747 , 2298 , 1153 , -937 , -2106 , - 1110 , -1091 , -1843 , -326 , 890 , 1762 , 1723 , 1959 , 2404 , 1131 , -1081 , -2694 , -2783 , -1612 , -483 , 933 , - -3280 , 740 , 493 , -1621 , -2458 , -538 , 3182 , 2390 , 1740 , 648 , 349 , -246 , -677 , -725 , -96 , 98 , - 1151 , 1644 , 2333 , 571 , -841 , -749 , 1667 , 2880 , 2249 , 381 , -1951 , -2564 , -2038 , -1604 , -1690 , -1440 , - 1322 , -4374 , -4684 , 281 , 3091 , 1587 , 369 , -3 , -524 , 313 , 1018 , 1177 , 314 , -171 , -81 , 365 , - 2499 , -904 , -2181 , -489 , 429 , 669 , -619 , -1412 , -1628 , -1788 , -978 , 7 , 230 , 941 , 2049 , 3175 -}; -#endif + const float ivas_sns_cdbk_tcx20_stage3[ 32 * 16 ] = { -0.12109375f, -0.32348633f, -0.25976562f, 0.21435547f, 0.4814453f, 0.14819336f, -0.22363281f, -0.31030273f, -0.13256836f, 0.10107422f, 0.33276367f, 0.32495117f, 0.16577148f, -0.079833984f, -0.16210938f, -0.15527344f, @@ -8102,44 +6239,7 @@ const float ivas_sns_cdbk_tcx20_stage3[ 32 * 16 ] = 0.17895508f, -0.31396484f, -0.033203125f, -0.02734375f, -0.0637207f, -0.11791992f, -0.03466797f, 0.0061035156f, 0.07324219f, 0.072753906f, 0.14916992f, 0.13671875f, 0.12524414f, 0.017333984f, -0.08178711f, -0.08618164f, 0.13330078f, -0.15893555f, -0.22045898f, -0.032226562f, -0.07739258f, -0.25463867f, -0.32299805f, -0.2614746f, 0.039794922f, 0.18554688f, 0.1262207f, -0.04321289f, -0.010498047f, 0.13330078f, 0.31860352f, 0.44506836f, }; -#ifdef IVAS_FLOAT_FIXED -/*Q12*/ -const Word16 ivas_sns_cdbk_tcx20_stage3_fx[32 * 16] = -{ - -496 , -1325 , -1064 , 878 , 1972 , 607 , -916 , -1271 , -543 , 414 , 1363 , 1331 , 679 , -327 , -664 , -636 , - 362 , -60 , -548 , -1188 , 3577 , -1280 , -794 , 791 , -404 , 216 , -537 , -90 , -322 , -81 , -302 , 662 , - -474 , 1151 , 1105 , -431 , -442 , -1174 , -1503 , -1387 , -649 , 79 , 712 , 865 , 1105 , 707 , 299 , 37 , - 334 , 155 , -1060 , -1247 , -263 , 534 , 1502 , 1635 , 1393 , 587 , -48 , -494 , -698 , -945 , -853 , -533 , - -102 , -2580 , 3220 , -45 , -520 , -353 , 93 , 202 , 19 , -559 , -404 , 0 , 267 , 59 , 248 , 455 , - -1614 , 689 , 1170 , -355 , -659 , 214 , 1065 , 234 , -205 , -321 , 68 , 241 , 302 , -162 , -349 , -318 , - 49 , -471 , -419 , -290 , 40 , -128 , -639 , -61 , 432 , -165 , -1970 , -1140 , 2419 , 2709 , 567 , -934 , - 1995 , 749 , -847 , -723 , -809 , -1302 , -1034 , 36 , 1174 , 1053 , 777 , 479 , 202 , -226 , -725 , -798 , - 503 , -396 , 223 , 711 , 939 , 1443 , 1651 , 131 , -658 , -607 , -422 , -361 , -558 , -963 , -997 , -639 , - -2380 , -60 , -1779 , -303 , 1247 , 1476 , 787 , 528 , 535 , 131 , -102 , -243 , -199 , -125 , 129 , 359 , - -480 , 67 , 624 , 1594 , 1140 , -29 , -302 , -842 , -1229 , -1468 , -958 , -139 , 349 , 447 , 512 , 716 , - -441 , 257 , -20 , 524 , -98 , -901 , -345 , 1409 , 932 , -1626 , -1328 , 1998 , 1784 , -632 , -919 , -596 , - 13 , -162 , 276 , -73 , -1083 , 1249 , 1237 , -1331 , -2051 , 634 , 2497 , 636 , -778 , -595 , 73 , -539 , - 150 , -478 , -1380 , -2201 , -557 , 1248 , 1317 , -435 , -672 , -351 , 51 , 444 , 824 , 719 , 625 , 695 , - -1787 , -1936 , -691 , -455 , -726 , -586 , 62 , 521 , 559 , 532 , 788 , 935 , 953 , 717 , 592 , 523 , - -307 , 803 , 537 , -415 , -32 , -772 , -200 , 1387 , 1056 , -700 , -1667 , -1182 , -198 , 200 , 611 , 879 , - -1136 , -297 , 1067 , 1599 , 933 , 85 , -496 , -329 , 704 , 1505 , 440 , -791 , -926 , -846 , -811 , -698 , - 554 , 1640 , -641 , -1038 , 1272 , 2216 , -1350 , -1756 , 606 , 710 , -732 , -972 , -109 , -55 , -189 , -155 , - -1245 , 526 , 853 , -490 , -1359 , -1307 , -459 , 418 , 1330 , 1485 , 1076 , 66 , -528 , -675 , -21 , 330 , - 1408 , 1470 , 1952 , 558 , -474 , -218 , 330 , -50 , -91 , -404 , -330 , -556 , -753 , -1070 , -1056 , -717 , - 48 , -64 , 1098 , -961 , -1463 , 2614 , -1256 , 333 , -225 , 412 , -110 , -417 , -56 , -260 , 2 , 305 , - -416 , 207 , 378 , 157 , -143 , 675 , 352 , 15 , -633 , -373 , 108 , -981 , -1789 , -1138 , 895 , 2685 , - -658 , 135 , 341 , 217 , -171 , 367 , 678 , 235 , -334 , 875 , 199 , -2878 , -1134 , 2089 , 1114 , -1075 , - 2544 , 16 , 331 , 686 , 339 , -461 , -853 , -1260 , -1021 , -628 , 3 , 359 , 463 , 93 , -282 , -329 , - 1673 , -1600 , -1453 , 892 , 900 , -44 , 456 , 879 , 586 , -366 , -785 , -970 , -549 , -140 , 126 , 396 , - -901 , 3362 , -1315 , 487 , -27 , -544 , 32 , -54 , -225 , -100 , 268 , -6 , -228 , -277 , -289 , -183 , - -605 , -695 , -453 , 2594 , -1649 , -1440 , 1218 , 352 , 100 , -292 , 42 , 3 , -89 , 81 , 342 , 494 , - -276 , 125 , 78 , 668 , 688 , 152 , 243 , 303 , 145 , 226 , 286 , 252 , 795 , 844 , -1302 , -3227 , - 522 , -167 , -889 , -105 , 51 , -136 , -646 , 213 , -785 , -1079 , 132 , 3267 , -1969 , -884 , 1495 , 982 , - 1886 , 878 , 347 , -1000 , -2044 , -679 , 1235 , 203 , -306 , -879 , -543 , -38 , 273 , 119 , 160 , 390 , - 733 , -1286 , -136 , -112 , -261 , -483 , -142 , 25 , 300 , 298 , 611 , 560 , 513 , 71 , -335 , -353 , - 546 , -651 , -903 , -132 , -317 , -1043 , -1323 , -1071 , 163 , 760 , 517 , -177 , -43 , 546 , 1305 , 1823 -}; -#endif + const float ivas_sns_cdbk_tcx20_stage4[ 32 * 16 ] = { -0.0056152344f, -0.03955078f, 0.071777344f, 0.26879883f, 0.44140625f, -0.08203125f, -0.20092773f, -0.009277344f, 0.05810547f, -0.06347656f, -0.07910156f, -0.05126953f, -0.07006836f, -0.068847656f, -0.07885742f, -0.09082031f, @@ -8176,49 +6276,8 @@ const float ivas_sns_cdbk_tcx20_stage4[ 32 * 16 ] = -0.0017089844f, -0.014160156f, -0.048339844f, -0.037109375f, -0.0949707f, -0.005859375f, 0.48388672f, -0.17480469f, -0.19140625f, 0.5727539f, -0.18920898f, -0.26391602f, 0.0048828125f, 0.067871094f, -0.045654297f, -0.06201172f, }; -#ifdef IVAS_FLOAT_FIXED -/*Q12*/ -const Word16 ivas_sns_cdbk_tcx20_stage4_fx[ 32 * 16 ] = -{ - -23 , -162 , 294 , 1101 , 1808 , -336 , -823 , -38 , 238 , -260 , -324 , -210 , -287 , -282 , -323 , -372 , - -49 , -247 , 49 , 204 , -183 , 155 , 406 , 257 , 91 , -371 , 16 , 1575 , 421 , -2168 , -1339 , 1183 , - -1457 , 1563 , 444 , 336 , 129 , -10 , -15 , -113 , -128 , -394 , -382 , -424 , -287 , 33 , 271 , 436 , - 157 , 92 , -904 , 2169 , -1450 , 1225 , -665 , -162 , 218 , -301 , -211 , 88 , 190 , 121 , -213 , -353 , - 311 , -803 , 192 , -2 , -217 , -143 , 781 , 349 , -660 , -1220 , -924 , -287 , 221 , 635 , 780 , 987 , - 337 , 1084 , -628 , -576 , -28 , 247 , -210 , -956 , -1165 , -580 , 325 , 976 , 847 , 398 , 61 , -133 , - 843 , -807 , 219 , 110 , -49 , -191 , -461 , 246 , 1392 , 1370 , -584 , -1545 , -895 , 69 , 341 , -57 , - 1408 , -1582 , -268 , -301 , -440 , 153 , 593 , 65 , 11 , 367 , 796 , 421 , -129 , -246 , -411 , -437 , - 526 , 80 , 669 , 935 , -656 , -1721 , -781 , 354 , 349 , -93 , 46 , 56 , -14 , 78 , -24 , 196 , - 112 , 33 , -306 , 471 , 9 , -1712 , 2296 , -1177 , 94 , -317 , -118 , 790 , 230 , 22 , -199 , -227 , - -152 , 530 , -1584 , -390 , 9 , -51 , 806 , 1056 , 519 , -417 , -360 , 39 , 581 , 595 , -314 , -867 , - 1217 , 271 , -1536 , -330 , 608 , -3 , -86 , 55 , -58 , -462 , -331 , -230 , -564 , -248 , 434 , 1262 , - -103 , 98 , -113 , -4 , 335 , -551 , -94 , 2816 , -1630 , -504 , 276 , 178 , -221 , -60 , -186 , -238 , - 60 , 171 , -102 , 21 , -326 , -190 , -116 , 90 , -469 , -487 , -171 , -8 , -1140 , 1358 , 2645 , -1333 , - -573 , -82 , 1285 , -2182 , 1292 , 153 , -175 , -243 , -223 , -40 , -30 , 63 , 315 , 338 , 48 , 55 , - -204 , 94 , -337 , -350 , 51 , 63 , -918 , 640 , -809 , 2336 , -1509 , 298 , 1930 , -1470 , 602 , -418 , - -702 , -781 , -877 , -125 , 396 , -358 , -395 , 70 , 355 , 170 , 242 , 140 , 333 , 526 , 492 , 514 , - -184 , 25 , 155 , 70 , 264 , 34 , -841 , -103 , 303 , 255 , -655 , -1131 , 1838 , 578 , -1675 , 1067 , - -612 , 728 , 94 , -512 , 2 , 779 , 158 , -163 , 387 , 828 , 919 , 457 , -331 , -696 , -1030 , -1009 , - -383 , 115 , -175 , 222 , 65 , -691 , -1245 , -708 , 283 , 1251 , 953 , -372 , 549 , 1413 , 150 , -1428 , - -820 , -428 , 172 , 383 , 42 , 193 , 1079 , 977 , 557 , -176 , -262 , -564 , -744 , -413 , -138 , 143 , - 600 , 113 , 1392 , -21 , -405 , 175 , -764 , -1357 , -582 , 164 , 149 , -297 , -490 , -7 , 387 , 944 , - 977 , 1086 , 140 , 175 , 207 , 142 , 499 , 161 , -74 , -393 , -441 , -657 , -705 , -513 , -398 , -208 , - -335 , -210 , -840 , 473 , 592 , -45 , -670 , -209 , 154 , 998 , 1575 , 223 , -1650 , -900 , 325 , 520 , - -1044 , -1156 , 804 , 1184 , 196 , -140 , 51 , -475 , -858 , -334 , 550 , 669 , 323 , 208 , 55 , -32 , - -278 , 97 , -45 , -152 , -784 , 487 , -82 , -1620 , 2324 , -113 , -981 , 425 , -194 , 122 , 307 , 487 , - 390 , -32 , 1476 , -311 , -835 , 256 , 628 , 184 , 17 , -565 , -603 , 62 , 717 , 453 , -600 , -1235 , - 262 , -96 , 317 , -990 , 168 , 771 , -1790 , 1064 , 1028 , -1523 , 167 , 1061 , 15 , -183 , -130 , -142 , - 104 , 381 , 464 , -114 , -36 , -288 , 116 , -216 , -800 , -1336 , 2780 , -303 , -616 , -288 , -113 , 265 , - -203 , 637 , -66 , -1133 , -1244 , -550 , 336 , 402 , 307 , 157 , 228 , -16 , -76 , 160 , 435 , 626 , - -177 , -754 , -187 , -206 , 868 , 2171 , 398 , -527 , -386 , -355 , -360 , -395 , -185 , 90 , -54 , 58 , - -7 , -58 , -198 , -152 , -389 , -24 , 1982 , -716 , -784 , 2346 , -775 , -1081 , 20 , 278 , -187 , -254 -}; -#endif const float *const ivas_sns_cdbks_tcx20[SNS_MSVQ_NSTAGES_TCX20] = { ivas_sns_cdbk_tcx20_stage1, ivas_sns_cdbk_tcx20_stage2, ivas_sns_cdbk_tcx20_stage3, ivas_sns_cdbk_tcx20_stage4 }; -#ifdef IVAS_FLOAT_FIXED -const Word16 *const ivas_sns_cdbks_tcx20_fx[SNS_MSVQ_NSTAGES_TCX20] = { ivas_sns_cdbk_tcx20_stage1_fx, ivas_sns_cdbk_tcx20_stage2_fx, ivas_sns_cdbk_tcx20_stage3_fx, ivas_sns_cdbk_tcx20_stage4_fx }; -#endif const int16_t ivas_sns_cdbks_tcx10_levels[SNS_MSVQ_NSTAGES_TCX10] = { 128, 32, 8 }; const int16_t ivas_sns_cdbks_tcx10_bits[SNS_MSVQ_NSTAGES_TCX10] = { 7, 5, 3 }; @@ -8354,140 +6413,7 @@ const float ivas_sns_cdbk_tcx10_stage1[ 128 * 16 ] = 3.256836f, 3.5593262f, 2.2746582f, 1.1318359f, 0.3149414f, -0.02368164f, 0.27172852f, -0.19335938f, -0.48779297f, -0.9663086f, -0.9187012f, -1.0222168f, -1.512207f, -1.6816406f, -1.8964844f, -2.1069336f, -0.057617188f, -0.45092773f, -0.9638672f, -0.72143555f, 0.20703125f, 1.4692383f, 1.921875f, 1.6833496f, 1.3933105f, 0.6699219f, 0.17333984f, -0.43798828f, -0.9772949f, -1.1477051f, -1.3552246f, -1.4057617f, }; -#ifdef IVAS_FLOAT_FIXED -/*Q12*/ -const Word16 ivas_sns_cdbk_tcx10_stage1_fx[ 128 * 16 ] = -{ - 4155 , 4844 , 1339 , -2626 , -4982 , -4674 , -4721 , -3645 , -803 , 3032 , 4826 , 4436 , 3204 , 1104 , -1360 , -4129 , --1594 , -1284 , -4844 , -8342 , -8548 , -7606 , -6706 , -5389 , -1713 , 2074 , 5231 , 5641 , 7605 , 9627 , 9427 , 6422 , -1788 , 7725 , 11493 , 9169 , 6341 , 587 , 299 , -4595 , -4548 , -3005 , -1718 , -3671 , -4272 , -3268 , -4935 , -7392 , -6395 , 3818 , 2406 , 1897 , 897 , 256 , -693 , -1410 , -1832 , -2500 , -2621 , -2342 , -1577 , -1062 , -856 , -776 , -4150 , 7919 , 3439 , -2033 , -2704 , -1557 , 231 , 1278 , 3321 , 2731 , -93 , -3269 , -3781 , -2586 , -2807 , -4238 , --3449 , -354 , 2017 , 2387 , 4764 , 5609 , 2963 , 1108 , 1421 , 28 , -950 , -1353 , -2415 , -2770 , -4077 , -4929 , -8524 , 7457 , 4506 , 1934 , 338 , -1987 , -2756 , -2266 , -1957 , -2240 , -2375 , -2413 , -2097 , -1743 , -1348 , -1577 , -7090 , 5351 , 2190 , 948 , 174 , 15 , 389 , 653 , 810 , 817 , 897 , 265 , -1778 , -3881 , -6266 , -7674 , -6804 , 11715 , 7237 , -532 , -1146 , 4914 , 6089 , 4999 , 2534 , -5124 , -6431 , -5499 , -5543 , -5359 , -6419 , -8238 , -7709 , 2493 , -2143 , -6489 , -5196 , -3714 , -2590 , -832 , -1060 , 376 , 749 , 4940 , 4149 , -203 , -522 , 2334 , -2478 , 4656 , 6266 , 8166 , 8080 , 7910 , 7237 , 5633 , 3847 , 82 , -2972 , -5614 , -9294 , -11465 , -12330 , -12680 , --3763 , 439 , 1331 , -211 , -1125 , 837 , 3525 , 1259 , 263 , -714 , -2457 , -3123 , -445 , 2047 , 1650 , 487 , -4433 , 3075 , 1944 , 16 , -1183 , -2102 , -2546 , -2683 , -2426 , -1757 , -724 , 250 , 488 , 152 , 994 , 2067 , --9469 , -5101 , -2893 , -3433 , -2063 , 164 , 2573 , 3814 , 3385 , 1553 , 818 , -98 , 1471 , 3904 , 3575 , 1801 , -15946 , 17207 , 12819 , 11001 , 8646 , 8327 , 189 , -5678 , -6626 , -8191 , -8726 , -8916 , -9067 , -9108 , -8807 , -9017 , --5510 , -1763 , 1586 , 4321 , 5956 , 6915 , 5607 , 1816 , -152 , -948 , -2191 , -3237 , -3324 , -3026 , -2853 , -3196 , -8688 , 10873 , 8275 , 4634 , 1734 , -557 , -1294 , -1577 , -1538 , -3121 , -4044 , -4288 , -3973 , -4095 , -4377 , -5339 , -8314 , 381 , -4203 , -6906 , -2427 , 2895 , 4683 , -1276 , -3574 , -1537 , 382 , -1706 , -1536 , -1335 , 2670 , 5175 , -2014 , 6901 , 7450 , 8391 , 5660 , 5349 , 3318 , 632 , -1645 , -7184 , -11554 , -6162 , -2239 , -4081 , -3232 , -3618 , -2463 , 7959 , 4852 , -2086 , -2118 , 2942 , 2680 , 273 , -1971 , -3815 , -4209 , -3731 , -1973 , 228 , 710 , -2203 , -2203 , 1934 , 716 , -1238 , -808 , -125 , -35 , 38 , -139 , -93 , 845 , 1853 , 747 , -583 , -2071 , -3245 , --8428 , -9073 , -4283 , -324 , 6076 , 5438 , -488 , -2617 , -275 , 3550 , -1050 , -170 , 4675 , 4235 , 2065 , 669 , -11333 , 11955 , 6902 , 1934 , -1514 , -2879 , -3232 , -4238 , -3422 , -2837 , -2629 , -2898 , -2649 , -2035 , -2008 , -1783 , -426 , 4019 , 4713 , 3739 , 3356 , 3491 , 3050 , 1887 , 1284 , -268 , -2029 , -3494 , -4307 , -4440 , -5214 , -6212 , -2092 , 5801 , 8237 , 9551 , 6780 , 3678 , 2472 , 1019 , 1067 , -1082 , -3123 , -5119 , -7460 , -7403 , -7732 , -8778 , -961 , 1615 , -886 , -4376 , -5548 , -5310 , -4982 , -4885 , -3665 , -1478 , 1198 , 2863 , 4755 , 6850 , 7462 , 5426 , -12293 , 13814 , 11807 , 11074 , 9876 , 10313 , 5810 , 199 , -2989 , -7493 , -10043 , -10534 , -10988 , -11237 , -10950 , -10951 , -250 , 3000 , 5233 , 3533 , 1034 , 378 , -553 , -1707 , -2133 , -2878 , -2837 , -2353 , -1841 , -364 , 705 , 534 , -8771 , 7295 , 2905 , -1528 , -2797 , -2224 , -2434 , -3707 , -3996 , -3372 , -2464 , -2340 , 88 , 2453 , 2127 , 1224 , --5356 , -4080 , -3178 , -3415 , -3409 , -2987 , -2237 , -677 , 1836 , 4189 , 5902 , 5483 , 3659 , 2525 , 1749 , -4 , -8540 , 13122 , 10394 , 3057 , 1011 , 2922 , 1889 , -673 , -1284 , -4815 , -6548 , -6657 , -5605 , -4808 , -4643 , -5902 , --904 , 3036 , 3724 , 1024 , 621 , 2200 , 3068 , 4347 , 4727 , 939 , -3049 , -4688 , -4457 , -3259 , -3173 , -4155 , -7412 , 8540 , 3520 , -908 , -2046 , -2396 , -2247 , -1458 , -976 , 74 , -489 , 690 , 143 , -3498 , -4187 , -2172 , --9034 , -10692 , -9925 , -9020 , -3884 , 6891 , 9607 , 8744 , 7840 , 4174 , 2713 , 2569 , 3504 , 3316 , -948 , -5856 , -12528 , 15782 , 10788 , 3495 , -369 , -2158 , -2473 , -3242 , -3527 , -5125 , -5686 , -5358 , -4614 , -3620 , -2829 , -3594 , -3762 , 7050 , 3669 , -309 , -1556 , -2008 , -2380 , -2362 , -2016 , -1483 , -971 , -939 , -639 , 127 , 288 , -234 , -5466 , 5096 , 839 , -4326 , -4389 , -495 , 3962 , 6525 , 4641 , 474 , -1865 , -1808 , -2070 , -3368 , -3972 , -4710 , --7682 , -10419 , -8678 , 2804 , 7231 , 15597 , 6455 , -2426 , -908 , 2257 , 7253 , 5190 , -3489 , -5573 , -6505 , -1107 , -10313 , 8489 , 4954 , 1234 , -1203 , -393 , 1849 , 1910 , 915 , -2272 , -5380 , -5480 , -3449 , -3573 , -4108 , -3807 , -9010 , 7210 , 5020 , 3041 , 1855 , 1295 , 314 , -953 , -2075 , -2616 , -2829 , -2858 , -3271 , -3970 , -4378 , -4795 , -1460 , 6841 , 8628 , 3136 , 3143 , 6063 , 5972 , 3426 , 2223 , -5238 , -7341 , -6357 , -5904 , -3889 , -4715 , -7448 , -1449 , -1827 , -4550 , -6487 , -5713 , -2732 , -660 , 433 , 1307 , 2371 , 2794 , 3239 , 3158 , 2432 , 2376 , 2409 , -5243 , 9630 , 12091 , 11941 , 10590 , 7240 , 4378 , 1797 , -801 , -6201 , -9586 , -10323 , -9468 , -8915 , -8728 , -8887 , --6934 , -1067 , 786 , -193 , 251 , 625 , 700 , 418 , 356 , 314 , 163 , 106 , 6 , 1088 , 1894 , 1487 , -6060 , 3896 , 485 , -2939 , -4736 , -3436 , 282 , 2032 , 1869 , -523 , -3273 , -3045 , -833 , -16 , 1127 , 3049 , --6670 , -1890 , 358 , -230 , 447 , 2409 , 3909 , 6279 , 5449 , 1441 , -878 , -2018 , -2272 , -1424 , -1908 , -3000 , -11826 , 16636 , 13050 , 6279 , 1706 , 781 , 2337 , -3227 , -5169 , -7375 , -6710 , -5822 , -6503 , -6377 , -5089 , -6343 , -485 , 663 , 700 , 2165 , 1981 , 966 , 376 , 1834 , 2298 , 1627 , 1114 , 702 , -758 , -3039 , -4935 , -6179 , -15276 , 10241 , 6249 , 2873 , 783 , 322 , 994 , 1738 , 951 , -1804 , -4461 , -5446 , -5652 , -6733 , -7613 , -7717 , --4421 , -2251 , -2182 , -3670 , -3227 , -2064 , -1880 , -1860 , -609 , 307 , 1234 , 2129 , 3532 , 5592 , 5516 , 3853 , -3360 , 7922 , 10867 , 9394 , 6526 , 1053 , 1896 , 2883 , 1638 , -5507 , -7666 , -7210 , -7668 , -4745 , -5551 , -7191 , -2467 , 6411 , 8292 , 4274 , 2274 , 1209 , -243 , -1212 , -1185 , -2826 , -3570 , -3368 , -3512 , -3049 , -2692 , -3269 , -3028 , 7338 , 7308 , 4275 , 997 , -2048 , -3118 , -4094 , -3189 , -2517 , -1649 , -1480 , -692 , 504 , -1307 , -3355 , --13713 , -11806 , -7131 , -79 , 6455 , 6414 , -589 , -4681 , -1922 , 6331 , 330 , 637 , 6245 , 5108 , 4653 , 3749 , -14977 , 9830 , 6085 , 2938 , 1863 , 1059 , -553 , -2267 , -3180 , -4394 , -5086 , -4951 , -4163 , -4237 , -4011 , -3909 , --1081 , 3251 , 6408 , 7149 , 4954 , 5039 , 4478 , 4353 , 4522 , 680 , -6756 , -9382 , -7832 , -5831 , -3856 , -6094 , -7162 , 7991 , 4675 , 976 , 841 , 2948 , 4353 , 3456 , 2703 , 451 , -1709 , -4266 , -5937 , -7074 , -7860 , -8711 , -7238 , -605 , -4007 , 3 , 8333 , 1173 , -2176 , -5314 , -6069 , -5080 , -4591 , -4717 , -2795 , -241 , 5388 , 13461 , -10596 , 12578 , 13802 , 10908 , 7436 , 2231 , 2444 , 1872 , -2275 , -7177 , -9152 , -9171 , -8796 , -8290 , -8520 , -8488 , --737 , 2442 , 485 , -2808 , -3574 , -3229 , -2953 , -2353 , -857 , 704 , 1697 , 2241 , 2025 , 2311 , 2655 , 1952 , -12162 , 6690 , 2238 , -2622 , -4617 , -5816 , -5879 , -5236 , -4308 , -2961 , -1748 , -1607 , 1838 , 2753 , 3664 , 5448 , --3077 , 452 , 1966 , -389 , -1269 , 118 , 175 , 1055 , 3620 , 4579 , 1375 , -1234 , -1480 , -1197 , -1718 , -2974 , -15858 , 15042 , 10523 , 5569 , 4228 , 4314 , 3082 , 654 , -1725 , -5657 , -8057 , -9036 , -8888 , -8704 , -8514 , -8690 , -1704 , 1674 , 529 , 1843 , 4216 , 6144 , 6034 , 4105 , 2177 , -429 , -2012 , -2595 , -4212 , -5660 , -6417 , -7102 , -4241 , 3011 , -177 , -3536 , -4674 , -3686 , -1588 , 992 , 3180 , 2882 , 1972 , 1063 , 676 , -379 , -1461 , -2516 , --10246 , -9377 , -9897 , -10469 , -9129 , -5712 , -3574 , -1246 , 1237 , 4416 , 7620 , 7504 , 9023 , 11338 , 10287 , 8226 , -5873 , 10679 , 11753 , 7933 , 5561 , 2214 , 30 , -1608 , -3259 , -6151 , -6707 , -5993 , -5418 , -4939 , -4492 , -5477 , -1703 , 1720 , 48 , -171 , 92 , 1005 , 1475 , 1312 , 659 , -228 , -981 , -1903 , -1549 , -716 , -784 , -1681 , -534 , 4872 , 3894 , -2429 , -4953 , -2172 , 3168 , 2622 , 2251 , 1388 , -2147 , -4094 , -1110 , 1384 , -375 , -2832 , --10365 , -5877 , -612 , 3409 , 4994 , 5250 , 3856 , 2179 , 1532 , 1289 , 947 , 43 , -882 , -1327 , -1874 , -2562 , -7364 , 8825 , 6753 , 3174 , 1572 , 1020 , -1433 , -3832 , -4629 , -5540 , -5397 , -4403 , -2961 , -1278 , 255 , 511 , -3616 , 2982 , 2441 , 1531 , 2154 , 2980 , 1762 , 767 , 272 , -953 , -1744 , -2069 , -2225 , -2573 , -3790 , -5149 , -6016 , 10717 , 11396 , 4773 , 1867 , 5061 , 5183 , 3833 , 2366 , -3588 , -10444 , -10907 , -9023 , -5516 , -3941 , -7793 , -6375 , 1989 , -1308 , -3670 , -4356 , -4171 , -3980 , -3432 , -2043 , -587 , 591 , 1288 , 2794 , 3630 , 3600 , 3279 , -8179 , 11466 , 8560 , 3788 , 3482 , 5771 , 6843 , 5604 , 4908 , 1374 , -3903 , -8790 , -11546 , -12047 , -11857 , -11832 , --3090 , 661 , 1382 , -807 , 2129 , 5268 , 1730 , -823 , -481 , -2827 , -4904 , -3053 , -219 , 1606 , 3077 , 350 , -8949 , 4159 , 587 , -2658 , -2926 , -2276 , -1678 , -1050 , -331 , -65 , -22 , -396 , -501 , -142 , -463 , -1189 , --5048 , -1761 , -1240 , -3476 , -3747 , -2868 , 162 , 3168 , 4073 , 1904 , 569 , 468 , 1695 , 3016 , 2504 , 582 , -13457 , 16793 , 15820 , 10226 , 6095 , -181 , -2293 , -4895 , -6222 , -6960 , -7158 , -7267 , -7171 , -6955 , -6811 , -6477 , --1163 , 1485 , 2929 , 4720 , 6317 , 6894 , 3387 , -44 , -1981 , -2797 , -3233 , -2707 , -2580 , -3352 , -3680 , -4195 , -10024 , 13762 , 8664 , 2406 , 361 , 330 , 523 , -3418 , -2716 , 1302 , -192 , -7081 , -7539 , -6126 , -4791 , -5509 , -221 , -2249 , -2660 , -1660 , -613 , -278 , -544 , -655 , 183 , 1048 , 1304 , 660 , 1055 , 1496 , 1247 , 1445 , -846 , 5133 , 6934 , 10757 , 11411 , 9325 , 4488 , 1331 , -3265 , -7057 , -8303 , -5003 , -4657 , -8262 , -7258 , -6419 , -9482 , 12253 , 6534 , -607 , -2653 , -673 , 306 , -1178 , -1765 , -3207 , -3766 , -3761 , -3142 , -1768 , -2113 , -3942 , --550 , 1425 , 2011 , 157 , -1079 , -1413 , -1697 , -1610 , -686 , 39 , 810 , 288 , 848 , 1801 , 1010 , -1353 , --10109 , -11744 , -7706 , 379 , 8248 , 6559 , 38 , -828 , 2185 , 6885 , 844 , 754 , 4769 , 3153 , -890 , -2538 , -13503 , 12466 , 7450 , 1458 , -2178 , -4645 , -5771 , -6295 , -6474 , -5971 , -4508 , -2899 , 1290 , 560 , 405 , 1608 , -4667 , 8260 , 6596 , 1763 , 3540 , 6861 , 3573 , -969 , -5225 , -5388 , -4163 , -2503 , -3545 , -3940 , -3641 , -5886 , -5072 , 10057 , 11017 , 4484 , 3638 , 2703 , 2095 , 2224 , 2067 , -2996 , -4340 , -4397 , -7071 , -7750 , -8132 , -8671 , -7076 , 4469 , 996 , -4409 , -7469 , -8582 , -7901 , -7025 , -4868 , -1656 , 2572 , 4172 , 4462 , 5363 , 6290 , 6510 , -11515 , 12880 , 10465 , 3540 , 1874 , 6237 , 6698 , 3799 , -2308 , -7772 , -8623 , -8541 , -7869 , -7144 , -7664 , -7087 , -1889 , 3817 , 3520 , 1054 , -342 , -451 , -2129 , -3116 , -3726 , -5315 , -4316 , -2809 , 54 , 3440 , 4742 , 3688 , -12822 , 7564 , 3096 , -1375 , -2981 , -3502 , -2957 , -2787 , -2321 , -2052 , -2014 , -1157 , -656 , -1499 , -1036 , 856 , --7298 , -3128 , -1459 , -3766 , -3686 , -1244 , 669 , 2187 , 5005 , 6621 , 4491 , 1512 , 782 , 783 , -274 , -1196 , -12071 , 12166 , 10231 , 7547 , 4891 , 1997 , 167 , -1868 , -2940 , -5141 , -6998 , -7442 , -6793 , -6155 , -5653 , -6081 , --1753 , 1625 , 4228 , 3372 , 2337 , 4063 , 4415 , 1944 , 491 , -2688 , -5614 , -5677 , -3836 , -1216 , -247 , -1444 , -12512 , 6411 , 2980 , 101 , -359 , -558 , -915 , -211 , -81 , -568 , -1190 , -2006 , -2777 , -3666 , -4294 , -5379 , --9543 , -6774 , -6214 , -7549 , -7059 , -3854 , -1628 , 2101 , 5622 , 6976 , 6572 , 5418 , 5229 , 4875 , 3740 , 2087 , -8837 , 12535 , 11328 , 7255 , 2550 , -2526 , -4345 , -6428 , -5892 , -7230 , -7262 , -4485 , -1885 , -283 , -223 , -1946 , -9129 , 8498 , 4366 , 281 , -3607 , -5680 , -5660 , -5230 , -3574 , -1874 , -344 , -92 , 1479 , 1933 , 516 , -142 , -5256 , 9433 , 6759 , -793 , -3866 , -459 , 5206 , 4388 , 3690 , -2799 , -7970 , -5691 , -3094 , -697 , -2658 , -6706 , --2216 , -5889 , -3568 , 2955 , 9741 , 7436 , 239 , -1003 , 1111 , 4778 , -1103 , -1008 , 1967 , -1394 , -4972 , -7074 , -10789 , 7440 , 2779 , -665 , -2630 , -3084 , -1314 , 514 , 584 , -2094 , -4598 , -5089 , -1705 , -879 , -523 , 474 , -6838 , 5757 , 5081 , 5754 , 4886 , 2602 , 782 , 166 , -233 , -2235 , -3851 , -4886 , -4905 , -4949 , -5029 , -5777 , -3777 , 8672 , 7923 , 2766 , 875 , 3035 , 2111 , 256 , -660 , -3765 , -6885 , -7930 , -5724 , -1376 , 64 , -3141 , -1043 , 1116 , -2723 , -6588 , -6935 , -6723 , -5310 , 129 , 5099 , 4079 , 3612 , 2961 , 2573 , 4722 , 2989 , -43 , -1107 , 6435 , 9892 , 10493 , 10103 , 8530 , 4943 , 5882 , 5571 , -2662 , -9598 , -11372 , -11225 , -10110 , -8411 , -9579 , --5006 , -976 , 1744 , 1682 , 136 , -921 , -1278 , -2195 , -2395 , -1642 , 74 , 1034 , 1476 , 2263 , 2966 , 3036 , -5150 , 4553 , 3608 , 1262 , -1364 , -913 , 1595 , 2380 , 2112 , -469 , -3306 , -3879 , -2810 , -2832 , -2793 , -2294 , --3555 , -3199 , -1984 , -903 , 897 , 2488 , 1905 , 2582 , 2162 , 544 , 447 , 1148 , 647 , -112 , -935 , -2133 , -19565 , 17281 , 11036 , 5756 , 1904 , 520 , -2148 , -4844 , -5499 , -5875 , -6311 , -6526 , -6486 , -6349 , -6068 , -5956 , --4564 , 687 , 4457 , 4047 , 2491 , 1633 , 917 , 80 , 46 , 286 , -541 , -1798 , -2353 , -1410 , -1770 , -2208 , -10582 , 8739 , 6358 , 4552 , 5070 , 5384 , 3814 , 1464 , -830 , -3127 , -4787 , -5934 , -6628 , -7437 , -8195 , -9024 , --8243 , -6062 , -5955 , -6127 , -4538 , -1750 , -708 , 329 , 1275 , 2189 , 2653 , 2630 , 4348 , 7441 , 7186 , 5331 , -3524 , 8176 , 10617 , 11183 , 9097 , 4548 , 2951 , -138 , -2003 , -4822 , -9077 , -10737 , -10317 , -6266 , -1688 , -5048 , --160 , 2942 , 5298 , 6724 , 7063 , 1816 , -1506 , -2566 , -575 , -1613 , -6146 , -5214 , -2667 , -893 , -655 , -1848 , -1846 , 4832 , 4243 , 1910 , 516 , -856 , -1034 , -742 , -737 , -953 , -523 , -41 , -980 , -1924 , -2386 , -3170 , --15228 , -14072 , -7488 , 944 , 6245 , 6079 , 828 , -630 , 1680 , 6027 , 390 , 513 , 5448 , 5516 , 2111 , 1639 , -19563 , 12033 , 6609 , 1145 , -1338 , -2373 , -3214 , -3154 , -3135 , -3507 , -3551 , -3495 , -3191 , -3941 , -4145 , -4305 , --3621 , -2181 , 970 , 8464 , 10422 , 7881 , 6143 , 5042 , 3015 , 869 , -2539 , -3894 , -5022 , -7336 , -8360 , -9855 , -4589 , 9181 , 6169 , 1082 , 342 , 359 , 16 , 127 , 334 , -1624 , -2322 , -2546 , -2957 , -3264 , -4017 , -5471 , -3606 , -2296 , -3662 , -4758 , -3791 , -5478 , -4900 , -5253 , -5389 , -5139 , -4257 , -168 , 6209 , 6583 , 9851 , 18841 , -8752 , 12363 , 11875 , 8625 , 6928 , 5159 , 4395 , 2087 , 1077 , -2569 , -6852 , -9550 , -10394 , -10712 , -10636 , -10548 , -1860 , 2305 , -375 , -3366 , -3658 , -1668 , 102 , 33 , -397 , -793 , -1050 , -1026 , 612 , 3009 , 3141 , 1271 , -3601 , 5629 , 2769 , -909 , -3496 , -4488 , -4379 , -4804 , -4034 , -2723 , -478 , 276 , 2538 , 4467 , 3717 , 2316 , --1091 , -1227 , -3638 , -5036 , -2839 , 46 , 2252 , 4024 , 4850 , 4463 , 2408 , 276 , -365 , -206 , -1119 , -2800 , -13340 , 14579 , 9317 , 4636 , 1290 , -97 , 1113 , -792 , -1998 , -3958 , -3763 , -4187 , -6194 , -6888 , -7768 , -8630 , --236 , -1847 , -3948 , -2955 , 848 , 6018 , 7872 , 6895 , 5707 , 2744 , 710 , -1794 , -4003 , -4701 , -5551 , -5758 -}; -#endif + const float ivas_sns_cdbk_tcx10_stage2[ 32 * 16 ] = { 0.30615234f, 0.48828125f, -0.02709961f, -0.47680664f, -0.5300293f, -0.25463867f, -0.13305664f, -0.14941406f, -0.14819336f, 0.08666992f, 0.28833008f, 0.27514648f, 0.099365234f, -0.017578125f, 0.033203125f, 0.15893555f, @@ -8524,44 +6450,6 @@ const float ivas_sns_cdbk_tcx10_stage2[ 32 * 16 ] = -0.20361328f, -0.21557617f, -0.16308594f, -0.041748047f, -0.111083984f, -0.057617188f, 0.0390625f, 0.013183594f, 0.17358398f, 0.74902344f, 0.9448242f, 0.4477539f, -0.09423828f, -0.32739258f, -0.50634766f, -0.6467285f, }; -#ifdef IVAS_FLOAT_FIXED -/*Q12*/ -const Word16 ivas_sns_cdbk_tcx10_stage2_fx[ 32 * 16 ] = -{ - 1254 , 2000 , -111 , -1953 , -2171 , -1043 , -545 , -612 , -607 , 355 , 1181 , 1127 , 407 , -72 , 136 , 651 , - 1677 , -181 , -362 , 1586 , 2110 , 1730 , 1432 , 1098 , 154 , -818 , -1272 , -1336 , -1575 , -1560 , -1581 , -1103 , - -657 , -1538 , -1699 , -507 , 1053 , 1212 , 186 , -178 , -469 , -827 , 133 , 2395 , 4402 , 1302 , -1796 , -3012 , - -2950 , 352 , 1493 , 317 , -158 , -83 , 933 , 969 , -252 , -2462 , -2188 , -58 , 1292 , 1447 , 1121 , 226 , - 698 , -549 , -716 , -673 , -616 , -664 , 851 , 3231 , 3395 , 1140 , -408 , -1086 , -1210 , -1305 , -1243 , -845 , - 2743 , 2575 , 2092 , 1507 , 389 , -1102 , -1786 , -2168 , -2057 , -1183 , -331 , 322 , -167 , -615 , -313 , 93 , - -600 , -1922 , -1784 , -461 , 89 , -257 , -435 , -978 , -1404 , -863 , 41 , 1077 , 1513 , 1868 , 2050 , 2065 , - -2614 , -1550 , -493 , 1920 , 2469 , 1658 , 1322 , 891 , 120 , 39 , 375 , 58 , -816 , -1117 , -1258 , -1006 , - 4114 , 141 , -1496 , -667 , -717 , -670 , 81 , 172 , -377 , -514 , -566 , -636 , -562 , -172 , 483 , 1384 , - -1224 , -232 , 927 , 1449 , 1662 , 219 , -1358 , -2391 , -2453 , -568 , 1446 , 1748 , 514 , -215 , 94 , 381 , - -2542 , -2686 , -1605 , -961 , -430 , -99 , 429 , 1125 , 1378 , 1174 , 1221 , 1454 , 908 , 258 , 15 , 360 , - -990 , 1611 , 1860 , -56 , -115 , 132 , -143 , 570 , 2335 , 1232 , -117 , -340 , -953 , -1048 , -1653 , -2325 , - -1043 , 825 , 558 , 90 , 77 , 1451 , 1251 , -180 , -132 , 1996 , 1103 , -2372 , -3534 , -1902 , 879 , 933 , - 413 , -20 , 632 , 2414 , 2389 , 615 , -571 , -1252 , -1630 , -1721 , -1782 , -2012 , -990 , 319 , 1376 , 1819 , - -3559 , -518 , 1547 , 1324 , -401 , -1236 , -464 , 286 , 445 , 417 , 78 , -85 , -106 , 81 , 648 , 1542 , - 175 , 86 , 1305 , 954 , -1355 , -3290 , -3017 , -1397 , 49 , 1139 , 1881 , 2013 , 1238 , 580 , -71 , -289 , - -1374 , 310 , -1225 , -3016 , -2673 , -729 , 1486 , 1715 , 1031 , 429 , 124 , -461 , 110 , 1435 , 1736 , 1102 , - 1452 , 2766 , 1584 , 39 , -167 , 368 , 1002 , 674 , -710 , -1804 , -1906 , -1640 , -1156 , -768 , -151 , 418 , - 1743 , 660 , -478 , -657 , -589 , -842 , -315 , -227 , -806 , -1840 , -1270 , 444 , 2334 , 2275 , 464 , -895 , - -1221 , -2116 , -2089 , -944 , 1010 , 2035 , 1826 , 1844 , 652 , -1037 , -1405 , -1030 , -188 , 323 , 779 , 1560 , - 1345 , 1687 , 1678 , 945 , -1118 , -3020 , -1357 , 854 , 1198 , 98 , -913 , -918 , -434 , -448 , -201 , 605 , - -720 , 1466 , 2918 , 2271 , 1555 , 1037 , 3 , -715 , -816 , -748 , -566 , -552 , -1105 , -1496 , -1558 , -972 , - 769 , -1385 , -1653 , -673 , -1444 , -2353 , -1657 , 161 , 1159 , 991 , 469 , -49 , 638 , 1195 , 1616 , 2213 , - 921 , -1842 , -199 , 2419 , 2210 , -340 , -2057 , -988 , 955 , 653 , -182 , 179 , -79 , -812 , -707 , -130 , - 3529 , 896 , 163 , 98 , -379 , -690 , -478 , 329 , 251 , 506 , 958 , 943 , 23 , -1379 , -2370 , -2398 , - 2120 , 592 , -895 , -1916 , 1168 , 4037 , 176 , -2475 , -1664 , 291 , -325 , -455 , 71 , 89 , -566 , -249 , - 2005 , -2001 , -3131 , -1768 , -336 , 467 , 955 , 603 , 145 , 776 , 1259 , 1064 , 391 , -96 , -317 , -16 , - -458 , 921 , 2 , -1318 , -618 , 1762 , 2872 , 1443 , -494 , -954 , 625 , 807 , -263 , -885 , -1580 , -1861 , - -913 , -1382 , 280 , 380 , 190 , 897 , -146 , 150 , 2509 , 2072 , -1691 , -2832 , -2267 , 665 , 2229 , -140 , - -57 , 1690 , 1163 , -536 , -1436 , -1521 , -1073 , -1169 , -1491 , -1688 , -1247 , -678 , 313 , 1668 , 2955 , 3108 , - -3201 , 226 , 404 , -1437 , -1195 , 554 , 435 , -1440 , -1127 , 652 , 1406 , 1076 , 1635 , 1724 , 858 , -571 , - -834 , -883 , -668 , -171 , -455 , -236 , 160 , 54 , 711 , 3068 , 3870 , 1834 , -386 , -1341 , -2074 , -2649 -}; -#endif const float ivas_sns_cdbk_tcx10_stage3[ 8 * 16 ] = { 0.15209961f, -0.12768555f, 0.09375f, -0.083496094f, -0.25390625f, 0.12524414f, 0.2993164f, -0.09863281f, -0.34814453f, -0.2434082f, -0.11254883f, -0.060058594f, 0.032470703f, 0.15527344f, 0.23413086f, 0.2355957f, @@ -8574,27 +6462,8 @@ const float ivas_sns_cdbk_tcx10_stage3[ 8 * 16 ] = -0.1821289f, 0.060058594f, 0.24780273f, 0.41674805f, 0.2890625f, -0.1472168f, -0.20581055f, -0.083984375f, -0.060302734f, -0.19921875f, -0.17651367f, -0.08984375f, 0.011230469f, 0.13110352f, 0.080078125f, -0.09106445f, }; -#ifdef IVAS_FLOAT_FIXED -/*Q12*/ -const Word16 ivas_sns_cdbk_tcx10_stage3_fx[ 8 * 16 ] = -{ - 623 , -523 , 384 , -342 , -1040 , 513 , 1226 , -404 , -1426 , -997 , -461 , -246 , 133 , 636 , 959 , 965 , - -665 , -455 , -1300 , -1050 , 567 , 1223 , 430 , 481 , 1090 , 223 , -598 , -788 , 171 , 859 , 304 , -492 , - -208 , 605 , -411 , -1315 , -717 , -764 , -1112 , -319 , 15 , -176 , 415 , 1433 , 1263 , 414 , 315 , 561 , - -784 , -124 , 922 , 326 , -1112 , -803 , 1144 , 1435 , 427 , 25 , 268 , 478 , 151 , -534 , -930 , -887 , - 1087 , -853 , -1027 , 490 , 1117 , 729 , -10 , -523 , -934 , 31 , 874 , 798 , 188 , -485 , -729 , -753 , - 1051 , 1010 , 416 , -120 , -588 , -573 , -850 , -806 , 717 , 1704 , 536 , -841 , -665 , 167 , -153 , -1004 , - -357 , 94 , 2 , 303 , 589 , 278 , 15 , 480 , 358 , 5 , -311 , -465 , -1287 , -1594 , -94 , 1984 , - -746 , 246 , 1015 , 1707 , 1184 , -603 , -843 , -344 , -247 , -816 , -723 , -368 , 46 , 537 , 328 , -373 -}; -#endif - const float *const ivas_sns_cdbks_tcx10[SNS_MSVQ_NSTAGES_TCX10] = { ivas_sns_cdbk_tcx10_stage1, ivas_sns_cdbk_tcx10_stage2, ivas_sns_cdbk_tcx10_stage3}; -#ifdef IVAS_FLOAT_FIXED -const Word16 *const ivas_sns_cdbks_tcx10_fx[SNS_MSVQ_NSTAGES_TCX10] = { ivas_sns_cdbk_tcx10_stage1_fx, ivas_sns_cdbk_tcx10_stage2_fx, ivas_sns_cdbk_tcx10_stage3_fx}; -#endif - const int16_t ivas_sns_cdbks_side_tcx20_levels[SNS_MSVQ_NSTAGES_SIDE] = { 32, 32 }; const int16_t ivas_sns_cdbks_side_tcx20_bits[SNS_MSVQ_NSTAGES_SIDE] = { 5, 5 }; const int16_t ivas_sns_cdbks_side_tcx10_levels[SNS_MSVQ_NSTAGES_SIDE] = { 32, 8 }; @@ -8636,44 +6505,6 @@ const float ivas_sns_cdbks_side_tcx20_stage1[ 32 * 16 ] = -0.19580078f, -0.14624023f, -0.11303711f, -0.055908203f, -0.052001953f, -0.009033203f, 0.022949219f, -0.0068359375f, -0.032470703f, 0.0017089844f, 0.045410156f, 0.025146484f, 0.039794922f, 0.07543945f, 0.1574707f, 0.24267578f, }; -#ifdef IVAS_FLOAT_FIXED -/*Q15*/ -const Word16 ivas_sns_cdbks_side_tcx20_stage1_fx[ 32 * 16 ] = -{ - -3728 , -2160 , 1376 , 1464 , 5856 , -904 , -10680 , -6904 , -1608 , 416 , 424 , 496 , 2688 , 4152 , 4160 , 4952 , - -560 , 3056 , 7720 , 7344 , 3520 , 1648 , 1304 , -240 , -1584 , -2856 , -2792 , -3952 , -3656 , -3480 , -2920 , -2560 , - -8728 , 8968 , 14888 , 5968 , 21344 , 5920 , 4776 , -264 , 8624 , -1504 , -17040 , -5336 , 1256 , -10424 , -14160 , -14288 , - -1448 , -3424 , -3008 , -3480 , -3088 , 3056 , 8840 , 5432 , 2032 , 360 , 712 , -784 , -1200 , -1288 , -1424 , -1288 , - 13432 , 2072 , -720 , -472 , -456 , -608 , -1712 , -1696 , -1040 , -1144 , -904 , -1920 , -1488 , -1384 , -1248 , -704 , - 80 , 1008 , 664 , 448 , -296 , 424 , 312 , -992 , -1584 , -728 , 392 , -568 , -376 , -24 , 392 , 840 , - 5688 , 7336 , 6456 , -624 , -9016 , -17624 , -10056 , -1160 , 24 , -1624 , 2464 , 1712 , 4152 , 5344 , 3976 , 2960 , - -10488 , -9544 , -8104 , -5832 , -4608 , -3472 , -4152 , -3560 , -2824 , -2432 , 1000 , 5216 , 8184 , 10328 , 13400 , 16880 , - -16272 , -1104 , 2744 , 1400 , 1136 , 1768 , 1136 , 776 , 1232 , 1040 , 928 , 8 , 936 , 1008 , 1448 , 1816 , - -1328 , 736 , 320 , 1208 , 1824 , 1536 , 1064 , 2656 , 3136 , 1408 , -288 , -2120 , -1880 , -1544 , -3200 , -3528 , - 8896 , 12112 , 13000 , 12592 , 9880 , 7096 , 5096 , 3976 , -264 , -4192 , -7528 , -12816 , -14632 , -15344 , -11792 , -6072 , - -10376 , -9040 , -7304 , -6064 , -5168 , -3880 , -1520 , 1064 , 3592 , 5512 , 6664 , 5456 , 6560 , 6544 , 4664 , 3288 , - -920 , -896 , -2184 , -3256 , -3448 , -3456 , -1864 , 568 , 2016 , 2568 , 2880 , 1688 , 1776 , 1696 , 1400 , 1440 , - -4720 , -10120 , -2584 , 1744 , 2104 , 1056 , 1888 , 1904 , 1680 , 1368 , 1768 , 496 , 944 , 1104 , 768 , 608 , - 16256 , 14832 , 9552 , 5128 , 1712 , 576 , -1640 , -2176 , -3552 , -4936 , -5616 , -6728 , -6040 , -5752 , -6296 , -5320 , - -184 , -1008 , -3024 , -4136 , -5216 , -3936 , -3624 , -4376 , -4232 , -3232 , 576 , 4216 , 7160 , 8144 , 6144 , 6728 , - -368 , -2000 , -1056 , 5944 , 2240 , -4560 , -3328 , 56 , -152 , 320 , 1032 , -224 , 144 , 784 , 568 , 592 , - -1480 , -1800 , -1408 , 1760 , 6952 , 8256 , 2920 , -1120 , -1624 , -2040 , -2016 , -2568 , -1720 , -1448 , -1512 , -1160 , - 2664 , 6728 , 1408 , 3608 , 12192 , 14000 , 10448 , 6336 , 512 , -5864 , -6624 , -12560 , -8152 , -6744 , -8048 , -9928 , - -13144 , -6696 , -1600 , 616 , -2632 , 528 , 4400 , 8960 , 11480 , 11720 , 6280 , -1864 , -3816 , -5160 , -4912 , -4168 , - 9056 , 9144 , 7344 , 1176 , -3360 , -2016 , -2800 , -6504 , -8400 , -7448 , -6560 , -4112 , -88 , 2680 , 4856 , 7016 , - -3744 , -2248 , 8016 , -104 , -1416 , -1088 , 800 , -120 , -736 , 56 , 608 , -488 , -336 , 72 , 224 , 504 , - 2632 , 7816 , 5536 , 952 , -1432 , -3464 , -2552 , -1216 , -208 , -848 , -1208 , -2080 , -1416 , -1040 , -1064 , -408 , - -2368 , -5768 , -9744 , -11552 , -11408 , -8432 , -6872 , -6064 , -3680 , -1736 , 3160 , 10064 , 12880 , 18576 , 13312 , 9632 , - -7928 , -3608 , -1672 , 1288 , -2016 , -608 , 360 , 1408 , -7064 , -632 , 304 , 1576 , 8632 , 12056 , 4336 , -6424 , - 5312 , 5368 , 4720 , 3544 , 2936 , 3752 , 3848 , 3816 , 4296 , 3704 , 696 , -5192 , -6936 , -8968 , -11080 , -9816 , - -4792 , 2248 , 8104 , 12752 , 10440 , 8984 , 6280 , 4520 , 2280 , -616 , -3800 , -9336 , -11736 , -12464 , -8504 , -4352 , - -21240 , -19008 , -5088 , -2328 , -2720 , 320 , 3480 , 3464 , 4584 , 4256 , 5712 , 6032 , 3072 , 4104 , 6776 , 8592 , - 2568 , 5384 , -472 , -6848 , -2944 , 1408 , 2200 , 248 , -1216 , -960 , -656 , -1040 , 120 , 528 , 504 , 1176 , - -776 , -4680 , -12008 , -3696 , 1384 , 4616 , 1360 , 304 , 1304 , 1816 , 2016 , 1336 , 1840 , 2104 , 1720 , 1360 , - 7576 , 7056 , 5488 , 5128 , 4136 , 3440 , 2848 , 656 , -1136 , -4208 , -6088 , -9664 , -8864 , -5648 , -2272 , 1552 , - -6416 , -4792 , -3704 , -1832 , -1704 , -296 , 752 , -224 , -1064 , 56 , 1488 , 824 , 1304 , 2472 , 5160 , 7952 -}; -#endif const float ivas_sns_cdbks_side_tcx20_stage2[ 32 * 16 ] = { -0.013916016f, 0.0007324219f, 0.017089844f, 0.005859375f, 0.056152344f, -0.08178711f, -0.2927246f, 0.00390625f, 0.140625f, 0.03881836f, 0.010498047f, 0.038330078f, 0.042236328f, 0.020751953f, 0.005859375f, 0.0075683594f, @@ -8710,51 +6541,8 @@ const float ivas_sns_cdbks_side_tcx20_stage2[ 32 * 16 ] = 0.0847168f, 0.18920898f, -0.1796875f, -0.01586914f, -0.017822266f, -0.021728516f, 0.006591797f, -0.0075683594f, -0.019042969f, -0.0107421875f, -0.0146484375f, 0.014160156f, 0.0034179688f, -0.0056152344f, -0.0036621094f, -0.0017089844f, }; -#ifdef IVAS_FLOAT_FIXED -/*Q15*/ -const Word16 ivas_sns_cdbks_side_tcx20_stage2_fx[ 32 * 16 ] = -{ - -456 , 24 , 560 , 192 , 1840 , -2680 , -9592 , 128 , 4608 , 1272 , 344 , 1256 , 1384 , 680 , 192 , 248 , - -2328 , -3360 , 1248 , 3000 , 3896 , 4416 , 1664 , -3648 , -4536 , -6792 , -8432 , -4936 , 1064 , 2664 , 5760 , 10312 , - 2344 , 952 , 640 , 264 , 768 , 680 , 1056 , 720 , 1136 , 584 , -1240 , -4600 , -7104 , -3616 , 1888 , 5520 , - -3544 , -896 , -2704 , -2696 , -2592 , 1632 , 3360 , 7824 , 8416 , 1040 , -5184 , -4800 , -264 , -16 , -472 , 896 , - -744 , 920 , 4624 , -2216 , -2408 , 5328 , -240 , -2152 , -936 , -352 , -784 , 416 , -192 , -216 , -464 , -592 , - -3192 , -3016 , -2016 , -392 , 216 , 1368 , 272 , -576 , -2792 , -4120 , -2064 , 4488 , 8256 , 5024 , 64 , -1528 , - -6632 , 8864 , 1944 , 136 , 728 , -320 , -872 , -896 , -1072 , -552 , -848 , -48 , -248 , -312 , 152 , -32 , - 2112 , -8752 , 4024 , 840 , -208 , 144 , 280 , -56 , 200 , -232 , -616 , 392 , 280 , 328 , 664 , 600 , - -24 , -1232 , -1192 , -512 , 184 , -184 , -96 , 1072 , 1560 , 624 , -344 , 576 , 416 , 144 , -440 , -552 , - 2272 , 1736 , 2000 , 4384 , 4400 , 176 , -3256 , -6008 , -7160 , -2736 , 664 , 1928 , 440 , 376 , 640 , 136 , - 120 , -1656 , -168 , 6256 , -6160 , -1792 , 16 , -712 , -64 , 56 , 136 , 816 , 728 , 904 , 888 , 632 , - 808 , -136 , -872 , -2816 , -2072 , -2248 , -2456 , -1640 , -2000 , -200 , 1848 , 2896 , 1928 , 2208 , 2544 , 2208 , - 4488 , 2784 , 2328 , 1536 , 808 , 160 , -352 , -216 , 464 , -240 , -1360 , -888 , -1360 , -1992 , -3040 , -3120 , - -5496 , 2184 , 5968 , 2424 , -656 , 1816 , 1280 , -3936 , -3536 , 4040 , 12432 , 1072 , -5288 , -4992 , -3456 , -3848 , - -432 , -368 , -1224 , 88 , -1520 , -8008 , 3272 , 3624 , 280 , 336 , 432 , 1264 , 544 , 488 , 632 , 592 , - 1448 , 2544 , -1144 , -6016 , 5152 , 2008 , -968 , -616 , -784 , 24 , -344 , 288 , -184 , -304 , -488 , -616 , - 4488 , 368 , -1096 , -568 , -2544 , -4016 , -2504 , -568 , 4672 , 6984 , 4776 , 1056 , -2744 , -3944 , -2496 , -1880 , - 968 , -4008 , -8112 , 3112 , 6192 , 856 , 424 , 984 , 296 , -304 , -840 , 288 , -80 , -56 , 288 , -8 , - -1264 , -1272 , -2912 , -2256 , 728 , 3352 , 4208 , 2752 , 2152 , 2680 , 2488 , 1312 , -1568 , -3096 , -3392 , -3904 , - 304 , 1536 , 2680 , 1232 , 208 , -1256 , -384 , 9248 , 912 , -8256 , -4200 , 520 , 376 , -472 , -1448 , -1008 , - 2088 , 4072 , 3128 , -4384 , -8616 , -2072 , 1088 , 2160 , 1592 , 864 , 192 , 648 , -96 , -192 , -24 , -432 , - -552 , -1712 , -1880 , 264 , -384 , -2256 , -2816 , -536 , -400 , 1536 , 5952 , 8824 , 4416 , -800 , -4176 , -5480 , - -720 , -1768 , -744 , -16 , 2360 , 2736 , 1856 , -488 , 928 , 3080 , 2008 , -15984 , -608 , 5080 , 1920 , 352 , - 12608 , -1616 , -2600 , -824 , -760 , -680 , 880 , -16 , -1720 , -1112 , -1520 , -352 , -592 , -728 , -528 , -440 , - -7816 , -2128 , -592 , -112 , 1320 , 632 , 600 , 1008 , 984 , 936 , 336 , 1216 , 704 , 1144 , 1152 , 616 , - 1264 , 944 , 848 , 1416 , 1144 , -720 , -1136 , -640 , -776 , -3120 , -4552 , -1072 , 448 , 1928 , 2120 , 1896 , - -488 , 488 , 416 , 1488 , 240 , 2720 , 5832 , 1008 , -3848 , -2352 , -1576 , -232 , -528 , -800 , -1088 , -1272 , - 2264 , -1608 , -7672 , -10576 , -5000 , -928 , 1928 , 1832 , 2824 , 2688 , 1712 , 1792 , 728 , 2584 , 4280 , 3144 , - -4408 , -880 , 3512 , 5256 , 4360 , 1432 , 288 , 656 , 1312 , 576 , -984 , -816 , -2224 , -2840 , -2504 , -2744 , - -640 , -1960 , -2008 , 264 , 1048 , 2688 , -1480 , -8376 , -904 , 3448 , 2056 , 1536 , 952 , 1040 , 1392 , 936 , - -1640 , 2768 , 8904 , 1744 , -2096 , -4256 , -2392 , -1696 , -1200 , -48 , -32 , 712 , 296 , -24 , -432 , -608 , - 2776 , 6200 , -5888 , -520 , -584 , -712 , 216 , -248 , -624 , -352 , -480 , 464 , 112 , -184 , -120 , -56 -}; -#endif const float *const ivas_sns_cdbks_side_tcx20[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx20_stage1, ivas_sns_cdbks_side_tcx20_stage2 }; -#ifdef IVAS_FLOAT_FIXED -/*Q15*/ -const Word16 *const ivas_sns_cdbks_side_tcx20_fx[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx20_stage1_fx, ivas_sns_cdbks_side_tcx20_stage2_fx }; -#endif - const float ivas_sns_cdbks_side_tcx10_stage1[ 32 * 16 ] = { -0.23950195f, -0.203125f, -0.17822266f, -0.1315918f, -0.123291016f, -0.095947266f, -0.106933594f, -0.16552734f, -0.14941406f, -0.075683594f, 0.026367188f, 0.1015625f, 0.17041016f, 0.2770996f, 0.37890625f, 0.5148926f, @@ -8792,45 +6580,6 @@ const float ivas_sns_cdbks_side_tcx10_stage1[ 32 * 16 ] = } ; -#ifdef IVAS_FLOAT_FIXED -/*Q15*/ -const Word16 ivas_sns_cdbks_side_tcx10_stage1_fx[ 32 * 16 ] = -{ - - -7848 , -6656 , -5840 , -4312 , -4040 , -3144 , -3504 , -5424 , -4896 , -2480 , 864 , 3328 , 5584 , 9080 , 12416 , 16872 , - 4224 , 6824 , 7512 , 9824 , 7952 , 4744 , 2576 , 808 , -2496 , -6040 , -8736 , -10896 , -9040 , -4576 , -1000 , -1680 , - -4640 , -4360 , -3664 , -1224 , -1248 , 1688 , 2408 , 240 , 1472 , -768 , -4040 , -384 , 9208 , 7928 , 2304 , -4904 , - 1752 , 4024 , 4568 , 3272 , 2560 , 608 , 1128 , 3400 , 2144 , -992 , -3240 , -3264 , -1968 , -3920 , -5976 , -4080 , - -1424 , -1096 , -2184 , -2136 , -1600 , -3816 , -6736 , -6640 , -5104 , -32 , 3400 , 6944 , 8000 , 4760 , 3232 , 4416 , - 1904 , 7392 , 3336 , -2824 , -2448 , 1712 , 1720 , -1384 , -2312 , -1216 , -792 , -1032 , -1048 , -1328 , -1248 , -432 , - 656 , -1096 , -4768 , -13792 , -6424 , 1248 , 872 , 536 , 1256 , 1896 , 2216 , 2648 , 2992 , 3336 , 3928 , 4496 , - 4480 , 10016 , 15456 , 17952 , 13048 , 8872 , 5768 , 3016 , -432 , -5624 , -10376 , -13808 , -17456 , -15040 , -8984 , -6896 , - -12776 , -12320 , -12112 , -9552 , -8552 , -6528 , -4960 , -2968 , -1336 , 4376 , 9872 , 12640 , 13320 , 10192 , 9832 , 10872 , - 11504 , 17136 , 13720 , 4704 , -1232 , -4304 , -6024 , -5920 , -5168 , -5728 , -5584 , -4984 , -2704 , -2168 , -2112 , -1136 , - -21904 , -10168 , -7024 , -3928 , -3384 , 2632 , 7144 , 6840 , 3328 , 1080 , -1440 , 2560 , 2400 , 2544 , 6792 , 12520 , - -5624 , -3840 , -1144 , 1976 , 5928 , 11032 , 12960 , 8904 , 4208 , -1208 , -5624 , -6976 , -6816 , -5680 , -4096 , -4008 , - -6144 , -13096 , -584 , 3296 , 1888 , 928 , 1800 , 1400 , 1360 , 1536 , 1368 , 1792 , 2032 , 1032 , 440 , 936 , - 11408 , 7680 , -1800 , -5968 , -9432 , -10216 , -9208 , -6496 , -5136 , -2704 , 992 , 4472 , 7248 , 6808 , 5392 , 6960 , - -1896 , -3464 , 2944 , 9976 , 6208 , 4840 , 2976 , -688 , -1752 , -1456 , -2336 , -2912 , -2616 , -2816 , -3208 , -3800 , - 5776 , 8536 , 7128 , 6888 , 6600 , 9088 , 7080 , -40 , -360 , -3832 , -7640 , -5192 , -2648 , -2912 , -11704 , -16760 , - -12496 , -15912 , -11792 , -5288 , -856 , 296 , -416 , 1320 , 3128 , 5064 , 5352 , 6272 , 6928 , 6656 , 5896 , 5848 , - 1912 , 2064 , 1344 , 1048 , 2592 , 2200 , -944 , -1656 , -816 , -5840 , -10576 , -5456 , -176 , 1808 , 3912 , 8560 , - 1568 , -1384 , -7912 , -1256 , 1728 , 2248 , 1904 , 392 , -456 , -360 , 656 , 904 , 1016 , 760 , 464 , -264 , - -120 , 48 , 448 , 0 , 696 , 1096 , 488 , 152 , 1864 , 4400 , 2848 , -168 , -2384 , -3120 , -3592 , -2656 , - -5232 , -3632 , -4264 , -2352 , -2128 , -1848 , -1512 , -400 , 1592 , 1208 , -16 , -800 , -424 , 3016 , 7024 , 9784 , - 18344 , 5184 , -408 , -1416 , -1904 , -488 , -704 , -1256 , -1104 , -1232 , -2264 , -2504 , -2088 , -2120 , -2776 , -3272 , - -1304 , -1072 , -992 , -1688 , -1168 , -1344 , -1280 , 584 , 1688 , 456 , -1464 , -2000 , -400 , 2392 , 4040 , 3568 , - 14784 , 15304 , 12752 , 7616 , 5384 , 5928 , 6856 , 1112 , -4496 , -9040 , -13088 , -12584 , -10176 , -9328 , -9488 , -1528 , - -2888 , -7528 , -13744 , -16216 , -13232 , -9088 , -7384 , -4312 , -1464 , 3944 , 8176 , 10192 , 17080 , 15872 , 10728 , 9872 , - 10880 , 9704 , 5888 , 2192 , 3280 , 4544 , 1144 , -1072 , -3952 , -6872 , -9712 , -6848 , -2696 , -5512 , -5248 , 4304 , - -14480 , 576 , 2424 , 1096 , 1448 , 1544 , 992 , 1336 , 1344 , 752 , 152 , 616 , 936 , 616 , -16 , 680 , - -12000 , -7664 , -2680 , -496 , -1608 , 2592 , 7576 , 9280 , 12576 , 9576 , 3256 , -288 , -3216 , -5392 , -6208 , -5304 , - -5584 , -6016 , -6232 , -5184 , -6632 , -7168 , -4296 , 328 , 3936 , 8224 , 8200 , 6736 , 4760 , 4576 , 3400 , 952 , - 2288 , 2368 , 5984 , 832 , -8112 , -9376 , -3656 , -1216 , 120 , 1048 , 1440 , 1880 , 2560 , 2360 , 936 , 536 , - 2568 , 4440 , 5712 , 5072 , 4120 , -312 , -4944 , -6440 , -6424 , -3376 , -1504 , -856 , 664 , 784 , 432 , 48 , - 8304 , 7392 , 7344 , 5608 , 5952 , 5536 , 5408 , 6632 , 5584 , 848 , -5448 , -7904 , -10480 , -13136 , -12536 , -9104 -}; -#endif const float ivas_sns_cdbks_side_tcx10_stage2[ 8 * 16 ] = { -0.13989258f, -0.024658203f, 0.12670898f, 0.027832031f, 0.06689453f, 0.12817383f, 0.07495117f, -0.01977539f, -0.05834961f, -0.07543945f, -0.06542969f, -0.0546875f, -0.04345703f, -0.0063476562f, 0.034179688f, 0.029541016f, @@ -8843,25 +6592,8 @@ const float ivas_sns_cdbks_side_tcx10_stage2[ 8 * 16 ] = 0.20898438f, -0.011230469f, -0.08496094f, -0.010986328f, 0.032958984f, -0.013183594f, -0.057861328f, -0.07104492f, -0.06689453f, -0.056396484f, -0.047851562f, -0.03491211f, -0.011962891f, 0.032714844f, 0.08178711f, 0.11035156f, }; -#ifdef IVAS_FLOAT_FIXED -/*Q15*/ -const Word16 ivas_sns_cdbks_side_tcx10_stage2_fx[ 8 * 16 ] = -{ - -4584 , -808 , 4152 , 912 , 2192 , 4200 , 2456 , -648 , -1912 , -2472 , -2144 , -1792 , -1424 , -208 , 1120 , 968 , - -2200 , -3752 , -3208 , -2992 , -3992 , -328 , 3600 , 3784 , 1968 , 1248 , 672 , 568 , 792 , 928 , 1256 , 1656 , - 1808 , 1000 , 1280 , 1904 , 704 , 1064 , 1312 , -288 , -1832 , -784 , 1216 , 2080 , 888 , -2416 , -4176 , -3776 , - 3672 , 6576 , 1488 , -3552 , -4648 , -2792 , -1064 , 1112 , 1448 , 216 , -408 , -608 , -440 , -344 , -256 , -400 , - -1368 , -2416 , -4856 , 696 , 5248 , 3904 , 1832 , 2648 , 4112 , 1776 , -1008 , -1336 , -1976 , -2336 , -2544 , -2376 , - -2440 , -1352 , -1328 , -2248 , -1384 , -1264 , -1680 , -2912 , -1816 , 1208 , 2960 , 2192 , 2920 , 4296 , 2664 , 176 , - -1736 , 1104 , 5248 , 5632 , 808 , -4352 , -4568 , -1376 , 224 , 664 , 280 , 48 , -376 , -992 , -736 , 128 , - 6848 , -368 , -2784 , -360 , 1080 , -432 , -1896 , -2328 , -2192 , -1848 , -1568 , -1144 , -392 , 1072 , 2680 , 3616 -}; -#endif const float *const ivas_sns_cdbks_side_tcx10[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx10_stage1, ivas_sns_cdbks_side_tcx10_stage2 }; -#ifdef IVAS_FLOAT_FIXED -const Word16 *const ivas_sns_cdbks_side_tcx10_fx[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx10_stage1_fx, ivas_sns_cdbks_side_tcx10_stage2_fx }; -#endif const int16_t sns_1st_cdbk[2][2][8 * 32] = { { /* split 1 */ @@ -9105,1474 +6837,4 @@ const ACPL_QUANT_TABLE ivas_mc_paramupmix_beta_quant_table[9] = } }; -#ifdef IVAS_FLOAT_FIXED -const ACPL_QUANT_TABLE_FX ivas_mc_paramupmix_alpha_quant_table_fx = -{ - 33, /* nquant */ - 16, /* offset */ - { - -536870912, -485700416, -439563072, -398458880, -362387872, -331350016, -305345344, - -284373824, -268435456, -252497104, -231525584, -205520896, -174483040, -138412032, - -97307856, -51170508, 0, 51170508, 97307856, 138412032, 174483040, - 205520896, 231525584, 252497104, 268435456, 284373824, 305345344, 331350016, - 362387872, 398458880, 439563072, 485700416, 536870912, 0, 0 - } /* data in Q28 */ -}; - -const ACPL_QUANT_TABLE_FX ivas_mc_paramupmix_beta_quant_table_fx[9] = -{ - { - 9, /* nquant */ - 0, /* offset */ - { 0, 63753420, 147639504, 251658240, 375809632, 520093696, 684510400, 869059776, 1073741824 } /* data in Q28 */ - }, - { /* Beta #2 */ - 9, /* nquant */ - 0, /* offset */ - { 0, 54638668, 126531672, 215678976, 322080672, 445736544, 586646912, 744811456, 920230272 } /* data in Q28 */ - }, - { /* Beta #3 */ - 9, /* nquant */ - 0, /* offset */ - { 0, 46420464, 107500024, 183238656, 273636384, 378693184, 498409216, 632784256, 781818240 } /* data in Q28 */ - }, - { /* Beta #4 */ - 9, /* nquant */ - 0, /* offset */ - { 0, 39098780, 90544544, 154337280, 230477024, 318963584, 419797344, 532978048, 658505728 } /* data in Q28 */ - }, - { /* Beta #5 */ - 9, /* nquant */ - 0, /* offset */ - { 0, 32673642, 75665248, 128974864, 192602432, 266548032, 350811584, 445393216, 550292672 } /* data in Q28 */ - }, - { /* Beta #6 */ - 9, /* nquant */ - 0, /* offset */ - { 0, 27144998, 62862136, 107151352, 160012704, 221446144, 291451648, 370029408, 457179136 } /* data in Q28 */ - }, - { /* Beta #7 */ - 9, /* nquant */ - 0, /* offset */ - { 0, 22512928, 52135212, 88866816, 132707776, 183658096, 241717760, 306886688, 379165088 } /* data in Q28 */ - }, - { /* Beta #8 */ - 9, /* nquant */ - 0, /* offset */ - { 0, 18777374, 43484452, 74121200, 110687696, 153183840, 201609712, 255965264, 316250528 } /* data in Q28 */ - }, - { /* Beta #9 */ - 9, /* nquant */ - 0, /* offset */ - { 0, 15938355, 36909876, 62914560, 93952408, 130023424, 171127600, 217264944, 268435456 } /* data in Q28 */ - } -}; -#endif // IVAS_FLOAT_FIXED - -const Word32 one_by_q_level[64] = -{ 0, 2147483647, 1073741824, 715827904, 536870912, 429496736, -357913952, 306783392, 268435456, 238609296, 214748368, -195225792, 178956976, 165191056, 153391696, 143165584, -134217728, 126322568, 119304648, 113025456, 107374184, -102261128, 97612896, 93368856, 89478488, 85899344, -82595528, 79536432, 76695848, 74051160, 71582792, -69273664, 67108864, 65075264, 63161284, 61356676, -59652324, 58040100, 56512728, 55063684, 53687092, -52377648, 51130564, 49941480, 48806448, 47721860, -46684428, 45691140, 44739244, 43826196, 42949672, -42107524, 41297764, 40518560, 39768216, 39045156, -38347924, 37675152, 37025580, 36398028, 35791396, -35204648, 34636832, 34087044 }; - /* clang-format on */ - -#ifdef IVAS_FLOAT_FIXED - -/* Q Factor is 31*/ -const Word32 ivas_han_win_48k_fx[L_FRAME32k] = { - 5760, 22976, 51712, 91904, 143552, 206784, 281408, 367552, 465216, - 574272, 694912, 826944, 970496, 1125504, 1292032, 1470016, 1659456, - 1860352, 2072704, 2296576, 2531904, 2778624, 3036864, 3306560, 3587648, - 3880256, 4184256, 4499712, 4826624, 5164992, 5514752, 5875968, 6248576, - 6632640, 7028096, 7434944, 7853248, 8282880, 8723968, 9176448, 9640320, - 10115584, 10602176, 11100224, 11609536, 12130304, 12662400, 13205824, 13760576, - 14326720, 14904192, 15492928, 16093056, 16704512, 17327232, 17961216, 18606592, - 19263168, 19931072, 20610240, 21300672, 22002368, 22715328, 23439488, 24174912, - 24921600, 25679424, 26448512, 27228800, 28020288, 28822976, 29636864, 30461888, - 31298048, 32145344, 33003840, 33873472, 34754176, 35646016, 36548992, 37463040, - 38388224, 39324416, 40271680, 41230016, 42199424, 43179840, 44171264, 45173696, - 46187200, 47211648, 48247104, 49293504, 50350848, 51419200, 52498432, 53588608, - 54689664, 55801664, 56924544, 58058304, 59202944, 60358400, 61524736, 62701888, - 63889856, 65088640, 66298176, 67518528, 68749632, 69991488, 71244096, 72507392, - 73781440, 75066176, 76361536, 77667648, 78984384, 80311744, 81649728, 82998400, - 84357568, 85727424, 87107776, 88498688, 89900160, 91312128, 92734656, 94167680, - 95611136, 97065088, 98529472, 100004288, 101489536, 102985152, 104491200, 106007552, - 107534336, 109071424, 110618816, 112176512, 113744512, 115322816, 116911296, 118510080, - 120119040, 121738240, 123367552, 125007104, 126656768, 128316608, 129986496, 131666496, - 133356608, 135056768, 136766976, 138487232, 140217408, 141957632, 143707840, 145467968, - 147238016, 149017984, 150807872, 152607616, 154417216, 156236672, 158065920, 159904960, - 161753728, 163612352, 165480640, 167358720, 169246464, 171143808, 173050880, 174967552, - 176893888, 178829760, 180775296, 182730304, 184694848, 186668928, 188652480, 190645504, - 192648000, 194659904, 196681216, 198711936, 200752000, 202801344, 204860032, 206928064, - 209005376, 211091904, 213187648, 215292672, 217406784, 219530048, 221662528, 223804096, - 225954752, 228114496, 230283264, 232461056, 234647872, 236843584, 239048320, 241262016, - 243484544, 245716032, 247956288, 250205440, 252463424, 254730112, 257005632, 259289856, - 261582784, 263884416, 266194688, 268513664, 270841216, 273177344, 275522048, 277875264, - 280237056, 282607296, 284986048, 287373184, 289768768, 292172672, 294584960, 297005632, - 299434560, 301871808, 304317312, 306771072, 309233024, 311703040, 314181312, 316667712, - 319162240, 321664832, 324175424, 326694080, 329220672, 331755200, 334297728, 336848192, - 339406528, 341972672, 344546688, 347128448, 349718080, 352315328, 354920384, 357533120, - 360153536, 362781568, 365417152, 368060352, 370711168, 373369408, 376035200, 378708416, - 381389120, 384077120, 386772608, 389475456, 392185536, 394902976, 397627648, 400359552, - 403098624, 405844928, 408598400, 411358976, 414126592, 416901312, 419683008, 422471680, - 425267392, 428070016, 430879552, 433695936, 436519232, 439349312, 442186112, 445029696, - 447880064, 450737088, 453600832, 456471168, 459348160, 462231616, 465121600, 468018176, - 470921280, 473830784, 476746688, 479668928, 482597632, 485532608, 488473856, 491421376, - 494375168, 497335168, 500301184, 503273472, 506251840, 509236288, 512226752, 515223296, - 518225728, 521234048, 524248320, 527268608, 530294592, 533326528, 536364096, 539407552, - 542456576, 545511296, 548571712, 551637888, 554709440, 557786624, 560869376, 563957504, - 567051264, 570150272, 573254656, 576364544, 579479616, 582600064, 585725696, 588856704, - 591992704, 595134080, 598280256, 601431680, 604588160, 607749632, 610916224, 614087680, - 617264128, 620445312, 623631488, 626822336, 630017984, 633218496, 636423616, 639633408, - 642847872, 646067008, 649290624, 652518784, 655751552, 658988672, 662230400, 665476352, - 668726784, 671981504, 675240576, 678503808, 681771264, 685042944, 688318784, 691598848, - 694882880, 698171072, 701463168, 704759296, 708059392, 711363328, 714671296, 717982976, - 721298560, 724617728, 727940864, 731267392, 734597760, 737931776, 741269376, 744610624, - 747955200, 751303488, 754655040, 758009984, 761368512, 764730240, 768095360, 771463616, - 774835200, 778209792, 781587840, 784968832, 788352896, 791740160, 795130304, 798523584, - 801919616, 805318784, 808720640, 812125312, 815532928, 818943168, 822356288, 825771840, - 829190272, 832611200, 836034816, 839460928, 842889472, 846320640, 849754112, 853190080, - 856628352, 860068992, 863511808, 866957056, 870404352, 873853696, 877305408, 880759104, - 884215040, 887672832, 891132736, 894594496, 898058112, 901523840, 904991232, 908460544, - 911931456, 915404288, 918878528, 922354560, 925832384, 929311616, 932792512, 936274816, - 939758720, 943243904, 946730624, 950218560, 953707840, 957198528, 960690368, 964183488, - 967677568, 971172992, 974669440, 978166912, 981665536, 985164992, 988665600, 992166912, - 995669248, 999172288, 1002676288, 1006180864, 1009686208, 1013192384, 1016698880, 1020206336, - 1023714176, 1027222656, 1030731584, 1034241024, 1037750784, 1041260928, 1044771584, 1048282368, - 1051793600, 1055304896, 1058816512, 1062328192, 1065839872, 1069351872, 1072863808, 1076375808, - 1079887744, 1083399680, 1086911488, 1090423168, 1093934592, 1097445760, 1100956928, 1104467584, - 1107977984, 1111488000, 1114997504, 1118506624, 1122015232, 1125523456, 1129031040, 1132538112, - 1136044544, 1139550336, 1143055360, 1146559616, 1150063104, 1153565696, 1157067648, 1160568576, - 1164068480, 1167567488, 1171065600, 1174562560, 1178058496, 1181553408, 1185046912, 1188539520, - 1192030720, 1195520768, 1199009408, 1202496768, 1205982720, 1209467008, 1212950144, 1216431744, - 1219911936, 1223390336, 1226867328, 1230342528, 1233816192, 1237288064, 1240758144, 1244226560, - 1247693056, 1251157760, 1254620416, 1258081152, 1261539968, 1264996864, 1268451712, 1271904384, - 1275355008, 1278803456, 1282249728, 1285693696, 1289135488, 1292574848, 1296011904, 1299446784, - 1302878976, 1306308736, 1309736064, 1313160960, 1316583296, 1320002944, 1323420032, 1326834304, - 1330246144, 1333655040, 1337061120, 1340464512, 1343865088, 1347262592, 1350657152, 1354048768, - 1357437440, 1360823168, 1364205824, 1367585280, 1370961664, 1374334720, 1377704704, 1381071360, - 1384434816, 1387794944, 1391151616, 1394504960, 1397854976, 1401201152, 1404544000, 1407883520, - 1411219328, 1414551552, 1417880064, 1421204992, 1424526080, 1427843456, 1431157120, 1434466944, - 1437772928, 1441074944, 1444373120, 1447667072, 1450957312, 1454243328, 1457525248, 1460803328, - 1464077056, 1467346688, 1470612096, 1473873408, 1477130240, 1480382848, 1483630976, 1486874752, - 1490114048, 1493348992, 1496579584, 1499805440, 1503026944, 1506243584, 1509455744, 1512663296, - 1515866112, 1519064192, 1522257536, 1525446144, 1528629760, 1531808512, 1534982272, 1538151296, - 1541315328, 1544474368, 1547628288, 1550777216, 1553921024, 1557059840, 1560193152, 1563321472, - 1566444672, 1569562240, 1572674816, 1575782016, 1578883584, 1581980032, 1585070848, 1588156416, - 1591236352, 1594310912, 1597379584, 1600442880, 1603500544, 1606552576, 1609598592 -}; - -/* Q Factor is 31*/ -const Word32 ivas_han_win_32k_fx[L_FRAME32k] = { - 12928, 51648, 116224, 206656, 322880, 464960, 632832, 826496, 1046016, - 1291328, 1562496, 1859392, 2182080, 2530560, 2904832, 3304832, 3730560, - 4182080, 4659328, 5162304, 5690944, 6245312, 6825344, 7431104, 8062464, - 8719488, 9402112, 10110336, 10844160, 11603520, 12388480, 13198976, 14034944, - 14896448, 15783424, 16695808, 17633664, 18596928, 19585536, 20599552, 21638912, - 22703552, 23793472, 24908672, 26049088, 27214720, 28405504, 29621504, 30862592, - 32128704, 33419968, 34736192, 36077440, 37443712, 38834816, 40250880, 41691776, - 43157504, 44648064, 46163328, 47703360, 49268032, 50857408, 52471296, 54109824, - 55772928, 57460416, 59172416, 60908800, 62669568, 64454656, 66264064, 68097664, - 69955456, 71837440, 73743488, 75673600, 77627712, 79605824, 81607808, 83633664, - 85683392, 87756864, 89854080, 91974912, 94119360, 96287424, 98478976, 100694016, - 102932416, 105194240, 107479296, 109787648, 112119232, 114473856, 116851584, 119252352, - 121676096, 124122688, 126592192, 129084480, 131599488, 134137088, 136697408, 139280192, - 141885440, 144513152, 147163264, 149835584, 152530176, 155246848, 157985728, 160746560, - 163529408, 166334144, 169160704, 172009024, 174879040, 177770752, 180683904, 183618624, - 186574720, 189552128, 192550848, 195570752, 198611840, 201673920, 204756992, 207860992, - 210985792, 214131392, 217297600, 220484480, 223691840, 226919680, 230167936, 233436416, - 236725120, 240033984, 243362880, 246711744, 250080512, 253469120, 256877440, 260305472, - 263753024, 267220096, 270706496, 274212288, 277737280, 281281408, 284844672, 288426880, - 292027904, 295647808, 299286464, 302943744, 306619456, 310313728, 314026368, 317757248, - 321506304, 325273472, 329058688, 332861760, 336682688, 340521408, 344377664, 348251520, - 352142784, 356051456, 359977344, 363920448, 367880640, 371857792, 375851840, 379862656, - 383890112, 387934272, 391994880, 396071936, 400165248, 404274816, 408400384, 412542016, - 416699584, 420872960, 425062016, 429266688, 433486912, 437722368, 441973248, 446239360, - 450520576, 454816704, 459127808, 463453696, 467794112, 472149248, 476518784, 480902784, - 485300992, 489713344, 494139840, 498580032, 503034304, 507502208, 511983808, 516478848, - 520987392, 525509120, 530044032, 534592000, 539153088, 543726912, 548313600, 552912832, - 557524608, 562148736, 566785408, 571434048, 576094784, 580767616, 585452224, 590148608, - 594856576, 599576192, 604307072, 609049344, 613802752, 618567296, 623342592, 628128896, - 632925888, 637733504, 642551552, 647380096, 652218752, 657067648, 661926400, 666795264, - 671673856, 676562176, 681459968, 686367232, 691283648, 696209536, 701144320, 706088192, - 711040768, 716002176, 720972224, 725950656, 730937472, 735932480, 740935808, 745947008, - 750966144, 755992960, 761027456, 766069504, 771118976, 776175680, 781239680, 786310528, - 791388416, 796472896, 801564288, 806662080, 811766400, 816876928, 821993792, 827116544, - 832245248, 837379776, 842520064, 847665856, 852817152, 857973696, 863135424, 868302208, - 873474048, 878650560, 883831808, 889017728, 894207936, 899402624, 904601216, 909804160, - 915010944, 920221696, 925435904, 930653952, 935875200, 941099776, 946327616, 951558592, - 956792384, 962029120, 967268416, 972510272, 977754624, 983001344, 988250112, 993501120, - 998753856, 1004008576, 1009264704, 1014522624, 1019781888, 1025042560, 1030304256, 1035566976, - 1040830784, 1046095232, 1051360384, 1056626048, 1061892224, 1067158592, 1072425280, 1077691776, - 1082958208, 1088224512, 1093490560, 1098755968, 1104020736, 1109284864, 1114548224, 1119810432, - 1125071616, 1130331520, 1135590272, 1140847232, 1146102912, 1151356544, 1156608512, 1161858304, - 1167106048, 1172351616, 1177594624, 1182835200, 1188073344, 1193308544, 1198541056, 1203770368, - 1208996736, 1214219648, 1219439232, 1224655488, 1229867904, 1235076736, 1240281472, 1245482240, - 1250679040, 1255871360, 1261059456, 1266243072, 1271421952, 1276596224, 1281765504, 1286929920, - 1292089088, 1297243008, 1302391552, 1307534592, 1312672000, 1317803520, 1322929280, 1328049152, - 1333162752, 1338270336, 1343371264, 1348465920, 1353553920, 1358635264, 1363709568, 1368776960, - 1373837312, 1378890496, 1383936256, 1388974336, 1394004992, 1399028224, 1404043264, 1409050496, - 1414049792, 1419040640, 1424023424, 1428997632, 1433963392, 1438920448, 1443868672, 1448808064, - 1453738496, 1458659328, 1463571328, 1468473856, 1473366912, 1478250240, 1483124096, 1487987968, - 1492841856, 1497685632, 1502519296, 1507342592, 1512155392, 1516957696, 1521749504, 1526530176, - 1531299968, 1536059008, 1540806912, 1545543424, 1550268672, 1554982528, 1559684864, 1564375168, - 1569053952, 1573720832, 1578375680, 1583018240, 1587648640, 1592266496, 1596872192, 1601464960, - 1606045312, 1610612736, 1615167488, 1619708672, 1624237184, 1628752384, 1633254272, 1637742464, - 1642217216, 1646678400, 1651125504, 1655558784, 1659978240, 1664383616, 1668774784, 1673151488, - 1677513856, 1681861760, 1686194816, 1690513408, 1694817024, 1699105792, 1703379200, 1707637760, - 1711880960, 1716108800, 1720321152, 1724518144, 1728699392, 1732865024, 1737014400, 1741148160, - 1745265792, 1749367296, 1753452288, 1757521152, 1761573632, 1765609344, 1769628416, 1773630976, - 1777616640, 1781585408, 1785536768, 1789471488, 1793388800, 1797288832, 1801171328, 1805036544, - 1808883968, 1812713728, 1816525824, 1820320000, 1824096000, 1827854208, 1831594112, 1835315968, - 1839019520, 1842704384, 1846370944, 1850018944, 1853648256, 1857258624, 1860850432, 1864423168, - 1867976960, 1871511296, 1875026688, 1878522880, 1881999616, 1885456896, 1888894720, 1892312832, - 1895711488, 1899089920, 1902448896, 1905787904, 1909106688, 1912405504, 1915684096, 1918942592, - 1922180480, 1925398016, 1928595200, 1931771904, 1934927616, 1938062848, 1941177344, 1944270848, - 1947343360, 1950395136, 1953425664, 1956434944, 1959422976, 1962389632, 1965335040, 1968259072, - 1971161344, 1974042368, 1976901504, 1979739008, 1982554624, 1985348352, 1988120320, 1990870272, - 1993597952, 1996303616, 1998987264, 2001648384, 2004287104, 2006903552, 2009497728, 2012069376, - 2014618112, 2017144576, 2019648256, 2022129024, 2024587136, 2027022336, 2029434624, 2031823872, - 2034190080, 2036533120, 2038853120, 2041149696, 2043423232, 2045673344, 2047900160, 2050103296, - 2052283136, 2054439552, 2056572160, 2058681216, 2060766464, 2062828160, 2064865920, 2066879744, - 2068869888, 2070835968, 2072778240, 2074696192, 2076590336, 2078460160, 2080305792, 2082127360, - 2083924608, 2085697536, 2087446016, 2089170304, 2090870144, 2092545280, 2094196096, 2095822336, - 2097424128, 2099001088, 2100553472, 2102081024, 2103584000, 2105062144, 2106515456, 2107943936, - 2109347584, 2110726272, 2112080000, 2113408768, 2114712448, 2115991168, 2117244672, 2118473216, - 2119676672, 2120854912, 2122007936, 2123135744, 2124238336, 2125315584, 2126367616, 2127394304, - 2128395520, 2129371648, 2130322048, 2131247232, 2132146944, 2133021184, 2133869824, 2134693120, - 2135490816, 2136263040, 2137009664, 2137730688, 2138426112, 2139095936, 2139740160, 2140358656, - 2140951552, 2141518720, 2142060288, 2142576128, 2143066112, 2143530496, 2143969152, 2144382080, - 2144769280, 2145130496, 2145466112, 2145775872, 2146060032, 2146318208, 2146550528, 2146757120, - 2146937984, 2147092992, 2147222016, 2147325440, 2147403008, 2147454592, 2147480448 -}; - -/* Q Factor is 31*/ -const Word32 ivas_han_win_16k_fx[L_FRAME32k] = { - 51584, 206336, 464192, 825216, 1289344, 1856512, 2526592, 3299648, 4175552, - 5154240, 6235584, 7419520, 8705856, 10094592, 11585472, 13178432, 14873280, - 16669824, 18568000, 20567552, 22668288, 24869952, 27172480, 29575488, 32078848, - 34682304, 37385600, 40188480, 43090624, 46091840, 49191808, 52390144, 55686656, - 59081024, 62572800, 66161792, 69847552, 73629824, 77508160, 81482176, 85551552, - 89715904, 93974784, 98327808, 102774528, 107314560, 111947456, 116672768, 121490048, - 126398720, 131398528, 136488832, 141669184, 146939136, 152298048, 157745600, 163281088, - 168904064, 174614016, 180410304, 186292480, 192259904, 198312000, 204448256, 210667968, - 216970688, 223355584, 229822336, 236370112, 242998400, 249706432, 256493632, 263359424, - 270303040, 277323904, 284421184, 291594368, 298842688, 306165440, 313562048, 321031552, - 328573440, 336186944, 343871360, 351625792, 359449600, 367342144, 375302528, 383329984, - 391423744, 399583168, 407807232, 416095424, 424446720, 432860480, 441335680, 449871744, - 458467776, 467122752, 475836160, 484606976, 493434496, 502317568, 511255744, 520247936, - 529293184, 538390784, 547539840, 556739456, 565988800, 575286848, 584632832, 594025792, - 603464960, 612949248, 622477568, 632049536, 641663872, 651319808, 661016192, 670752128, - 680527040, 690339584, 700189056, 710074240, 719994624, 729948800, 739936128, 749955328, - 760005760, 770086400, 780196224, 790334336, 800499328, 810690816, 820907648, 831148608, - 841412992, 851699584, 862007680, 872335936, 882683648, 893049664, 903433024, 913832832, - 924248064, 934677504, 945120256, 955575552, 966042176, 976519040, 987005248, 997499904, - 1008001792, 1018510080, 1029023552, 1039541440, 1050062528, 1060585984, 1071110720, 1081635456, - 1092159616, 1102681984, 1113201664, 1123717504, 1134228480, 1144733696, 1155232256, 1165722752, - 1176204288, 1186676224, 1197137280, 1207586432, 1218022656, 1228445184, 1238852864, 1249244416, - 1259619328, 1269976192, 1280314368, 1290632832, 1300930304, 1311205888, 1321458432, 1331687552, - 1341891840, 1352070400, 1362221952, 1372346112, 1382441472, 1392506880, 1402541952, 1412545280, - 1422516224, 1432453632, 1442356608, 1452224000, 1462054912, 1471848832, 1481604480, 1491320832, - 1500997120, 1510632320, 1520225536, 1529775744, 1539282176, 1548744192, 1558160256, 1567529728, - 1576852096, 1586125824, 1595350272, 1604524800, 1613648128, 1622719872, 1631738624, 1640703744, - 1649614592, 1658469888, 1667269376, 1676011520, 1684695808, 1693321472, 1701887616, 1710393344, - 1718837760, 1727220480, 1735540352, 1743796480, 1751988480, 1760115200, 1768175616, 1776169856, - 1784096256, 1791954688, 1799744000, 1807463424, 1815112576, 1822690048, 1830195968, 1837629184, - 1844988928, 1852274688, 1859485440, 1866620672, 1873679872, 1880662016, 1887566976, 1894393600, - 1901141248, 1907809536, 1914397696, 1920904960, 1927330816, 1933674624, 1939936000, 1946114048, - 1952208256, 1958218240, 1964142848, 1969982336, 1975735552, 1981401984, 1986981376, 1992472832, - 1997876224, 2003190656, 2008415744, 2013551360, 2018596352, 2023550720, 2028413824, 2033185152, - 2037864192, 2042450688, 2046944256, 2051344128, 2055650048, 2059861888, 2063978752, 2068000512, - 2071926784, 2075757056, 2079491072, 2083128576, 2086668928, 2090112128, 2093457408, 2096705024, - 2099854080, 2102904832, 2105856512, 2108709120, 2111462144, 2114115584, 2116668928, 2119122176, - 2121475072, 2123727104, 2125878528, 2127928576, 2129877504, 2131724800, 2133470464, 2135114496, - 2136656384, 2138096128, 2139433728, 2140668928, 2141801472, 2142831616, 2143758848, 2144583424, - 2145304960, 2145923584, 2146439168, 2146851840, 2147161344, 2147367680, 2147470848, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0 -}; - -/* Q Factor is 30 */ -const Word32 ivas_sine_delay_32_fx[32] = { - 52686016, 105245104, 157550640, 209476640, 260898000, 311690784, 361732736, 410903232, 459083776, - 506158400, 552013632, 596539008, 639627264, 681174656, 721080960, 759250112, 795590272, - 830013632, 862437504, 892783744, 920979136, 946955776, 970651136, 992008064, 1010975232, - 1027506880, 1041563136, 1053110208, 1062120192, 1068571456, 1072448448, 1073741824 -}; - -/* Q Factor is 30 */ -const Word32 ivas_sine_frame_len_640_del_32_fx[577] = { - 1073737856, - 1073725888, 1073705984, 1073678144, 1073642368, 1073598592, 1073546880, 1073487168, 1073419584, - 1073343936, 1073260416, 1073168896, 1073069440, 1072962048, 1072846720, 1072723392, 1072592128, - 1072452928, 1072305792, 1072150656, 1071987648, 1071816640, 1071637696, 1071450816, 1071256000, - 1071053248, 1070842560, 1070623936, 1070397312, 1070162880, 1069920448, 1069670080, 1069411776, - 1069145536, 1068871424, 1068589376, 1068299392, 1068001472, 1067695680, 1067381952, 1067060288, - 1066730752, 1066393344, 1066047936, 1065694720, 1065333568, 1064964544, 1064587584, 1064202752, - 1063810048, 1063409472, 1063000960, 1062584576, 1062160384, 1061728256, 1061288320, 1060840448, - 1060384768, 1059921216, 1059449792, 1058970496, 1058483392, 1057988416, 1057485632, 1056974976, - 1056456512, 1055930240, 1055396096, 1054854144, 1054304384, 1053746816, 1053181440, 1052608256, - 1052027200, 1051438400, 1050841856, 1050237504, 1049625280, 1049005376, 1048377664, 1047742144, - 1047098944, 1046447936, 1045789184, 1045122624, 1044448384, 1043766400, 1043076672, 1042379200, - 1041674048, 1040961088, 1040240512, 1039512192, 1038776128, 1038032384, 1037280960, 1036521856, - 1035755008, 1034980544, 1034198464, 1033408640, 1032611200, 1031806016, 1030993280, 1030172864, - 1029344768, 1028509120, 1027665856, 1026814912, 1025956416, 1025090240, 1024216576, 1023335232, - 1022446400, 1021549888, 1020645824, 1019734208, 1018815104, 1017888384, 1016954112, 1016012288, - 1015062912, 1014106112, 1013141760, 1012169856, 1011190464, 1010203584, 1009209280, 1008207424, - 1007198144, 1006181376, 1005157120, 1004125440, 1003086336, 1002039744, 1000985792, 999924352, - 998855552, 997779328, 996695744, 995604736, 994506368, 993400640, 992287552, 991167104, - 990039296, 988904128, 987761664, 986611904, 985454784, 984290304, 983118592, 981939648, - 980753408, 979559872, 978359104, 977151040, 975935744, 974713216, 973483456, 972246528, - 971002304, 969750976, 968492480, 967226688, 965953792, 964673728, 963386496, 962092288, - 960790784, 959482176, 958166464, 956843648, 955513792, 954176832, 952832768, 951481600, - 950123456, 948758272, 947386048, 946006720, 944620480, 943227264, 941826944, 940419776, - 939005568, 937584384, 936156224, 934721152, 933279232, 931830336, 930374528, 928911808, - 927442176, 925965760, 924482432, 922992320, 921495296, 919991424, 918480832, 916963328, - 915439040, 913907968, 912370176, 910825600, 909274240, 907716160, 906151360, 904579840, - 903001664, 901416768, 899825216, 898226944, 896622016, 895010432, 893392256, 891767424, - 890136000, 888497984, 886853376, 885202176, 883544448, 881880128, 880209344, 878532032, - 876848192, 875157824, 873460992, 871757696, 870047872, 868331648, 866608960, 864879872, - 863144384, 861402496, 859654208, 857899584, 856138624, 854371264, 852597632, 850817600, - 849031296, 847238720, 845439808, 843634688, 841823296, 840005632, 838181760, 836351680, - 834515456, 832672960, 830824384, 828969600, 827108672, 825241600, 823368448, 821489152, - 819603840, 817712384, 815814912, 813911360, 812001728, 810086208, 808164608, 806237056, - 804303424, 802363904, 800418496, 798467072, 796509760, 794546560, 792577408, 790602432, - 788621568, 786634880, 784642368, 782644096, 780640000, 778630016, 776614336, 774592896, - 772565696, 770532864, 768494208, 766449856, 764399872, 762344192, 760282944, 758215936, - 756143424, 754065280, 751981504, 749892160, 747797248, 745696832, 743590848, 741479424, - 739362432, 737240000, 735112128, 732978752, 730839936, 728695744, 726546176, 724391168, - 722230784, 720065088, 717894080, 715717696, 713536000, 711349056, 709156864, 706959360, - 704756672, 702548672, 700335488, 698117184, 695893696, 693665024, 691431168, 689192192, - 686948224, 684699008, 682444864, 680185600, 677921280, 675651968, 673377536, 671098176, - 668813888, 666524608, 664230464, 661931328, 659627264, 657318400, 655004544, 652685952, - 650362432, 648034112, 645701056, 643363136, 641020480, 638673088, 636320896, 633964032, - 631602496, 629236224, 626865344, 624489792, 622109632, 619724800, 617335424, 614941504, - 612542976, 610139968, 607732352, 605320256, 602903680, 600482624, 598057152, 595627264, - 593192960, 590754240, 588311104, 585863680, 583411840, 580955712, 578495296, 576030528, - 573561536, 571088320, 568610816, 566129216, 563643264, 561153152, 558659008, 556160576, - 553658112, 551151488, 548640896, 546126144, 543607360, 541084480, 538557696, 536026848, - 533492096, 530953376, 528410656, 525864096, 523313568, 520759232, 518200960, 515638880, - 513073024, 510503328, 507929856, 505352608, 502771616, 500186880, 497598464, 495006400, - 492410624, 489811200, 487208128, 484601440, 481991200, 479377376, 476760000, 474139104, - 471514656, 468886720, 466255328, 463620448, 460982144, 458340480, 455695360, 453046880, - 450395040, 447739872, 445081408, 442419584, 439754496, 437086176, 434414624, 431739840, - 429061792, 426380672, 423696320, 421008864, 418318304, 415624576, 412927808, 410227968, - 407525120, 404819200, 402110304, 399398464, 396683616, 393965856, 391245120, 388521568, - 385795104, 383065760, 380333600, 377598592, 374860800, 372120256, 369376960, 366630848, - 363882080, 361130624, 358376480, 355619648, 352860192, 350098176, 347333536, 344566304, - 341796512, 339024192, 336249376, 333472064, 330692256, 327910016, 325125344, 322338304, - 319548832, 316756960, 313962784, 311166304, 308367488, 305566368, 302763008, 299957376, - 297149568, 294339552, 291527296, 288712928, 285896416, 283077792, 280257024, 277434208, - 274609376, 271782464, 268953568, 266122608, 263289760, 260454928, 257618144, 254779488, - 251938928, 249096480, 246252208, 243406128, 240558224, 237708512, 234857088, 232003888, - 229148976, 226292384, 223434080, 220574160, 217712592, 214849392, 211984608, 209118256, - 206250352, 203380944, 200510000, 197637584, 194763696, 191888352, 189011600, 186133440, - 183253936, 180373024, 177490800, 174607264, 171722416, 168836304, 165948944, 163060368, - 160170544, 157279584, 154387424, 151494128, 148599712, 145704176, 142807600, 139909920, - 137011232, 134111504, 131210816, 128309144, 125406504, 122502952, 119598480, 116693128, - 113786920, 110879856, 107971976, 105063288, 102153832, 99243616, 96332656, 93420992, - 90508624, 87595600, 84681920, 81767616, 78852704, 75937200, 73021144, 70104536, - 67187416, 64269804, 61351708, 58433156, 55514176, 52594776, 49674996, 46754840, - 43834344, 40913520, 37992392, 35070980, 32149316, 29227408, 26305284, 23382966, - 20460476, 17537830, 14615058, 11692176, 8769208, 5846174, 2923098, 0 -}; - - -const Word32 ivas_sine_frame_len_640_del_16_fx[289] = { - 1073725952, - 1073678400, 1073599104, 1073488064, 1073345344, 1073170880, 1072964736, 1072726912, 1072457408, 1072156160, 1071823296, - 1071458752, 1071062528, 1070634688, 1070175232, 1069684096, 1069161472, 1068607168, 1068021312, 1067403904, 1066755008, - 1066074560, 1065362624, 1064619200, 1063844352, 1063038016, 1062200320, 1061331264, 1060430848, 1059499072, 1058536000, - 1057541696, 1056516096, 1055459328, 1054371392, 1053252288, 1052102016, 1050920704, 1049708352, 1048465024, 1047190656, - 1045885376, 1044549184, 1043182208, 1041784320, 1040355712, 1038896320, 1037406272, 1035885568, 1034334272, 1032752448, - 1031140096, 1029497216, 1027824000, 1026120384, 1024386432, 1022622272, 1020827904, 1019003328, 1017148672, 1015264000, - 1013349248, 1011404608, 1009430080, 1007425792, 1005391680, 1003327872, 1001234432, 999111424, 996958848, 994776896, - 992565568, 990324864, 988054912, 985755712, 983427456, 981070144, 978683904, 976268672, 973824576, 971351808, - 968850240, 966320128, 963761408, 961174272, 958558720, 955914816, 953242752, 950542464, 947814144, 945057728, - 942273472, 939461440, 936621504, 933753984, 930858880, 927936192, 924986176, 922008896, 919004288, 915972544, - 912913664, 909827968, 906715264, 903575808, 900409728, 897217024, 893997760, 890752128, 887480128, 884181888, - 880857600, 877507328, 874131072, 870729024, 867301184, 863847744, 860368832, 856864448, 853334848, 849779968, - 846199936, 842594944, 838965120, 835310400, 831631104, 827927168, 824198848, 820446144, 816669184, 812868096, - 809043008, 805194048, 801321216, 797424768, 793504832, 789561344, 785594560, 781604608, 777591488, 773555456, - 769496640, 765414976, 761310656, 757183936, 753034880, 748863552, 744670080, 740454592, 736217216, 731958144, - 727677376, 723375232, 719051648, 714706752, 710340864, 705953920, 701546112, 697117632, 692668544, 688198976, - 683709056, 679198976, 674668864, 670118720, 665548800, 660959296, 656350208, 651721728, 647074048, 642407168, - 637721344, 633016704, 628293376, 623551488, 618791104, 614012480, 609215744, 604400960, 599568384, 594718080, - 589850176, 584964864, 580062272, 575142528, 570205824, 565252224, 560281984, 555295168, 550291904, 545272448, - 540236864, 535185280, 530117952, 525034944, 519936384, 514822496, 509693408, 504549248, 499390144, 494216384, - 489027968, 483825056, 478607904, 473376640, 468131360, 462872224, 457599424, 452313152, 447013472, 441700608, - 436374688, 431035904, 425684352, 420320224, 414943680, 409554848, 404153984, 398741152, 393316512, 387880320, - 382432576, 376973600, 371503488, 366022368, 360530464, 355027904, 349514848, 343991456, 338457920, 332914368, - 327360992, 321797952, 316225376, 310643520, 305052416, 299452352, 293843392, 288225792, 282599680, 276965152, - 271322528, 265671856, 260013344, 254347136, 248673408, 242992352, 237304096, 231608848, 225906752, 220197984, - 214482704, 208761088, 203033328, 197299552, 191559952, 185814672, 180063936, 174307856, 168546624, 162780432, - 157009424, 151233776, 145453648, 139669232, 133880696, 128088216, 122291928, 116492040, 110688704, 104882096, - 99072408, 93259768, 87444384, 81626424, 75806048, 69983424, 64158744, 58332160, 52503856, 46674000, - 40842768, 35010324, 29176854, 23342516, 17507490, 11671948, 5836060, 0 -}; - -/************************ Q30 *******************************/ -const Word32 ivas_fb_fr_12band_1ms_re_fx[IVAS_FB_12_1MS_LEN] = { - 1046768256, 1012312512, 944113536, 843565952, 712700800, 554033920, 370399360, 163534048, -67588040, - -313003296, -547361792, -745791424, -889130944, -964720960, -967822016, -901839040, -777730304, - -612432896, -426573984, -241764928, -77701744, 50405768, 134107528, 173698992, 183571312, - 181978912, 174963648, 163434880, 148881184, 132470640, 115304208, 98219512, 81912736, - 66862960, 53409868, 41724844, 31871182, 23797162, 17385436, 12455156, 8801240, - 6197829, 4427144, 3280128, 2575327, 2155348, 1897329, 1705752, 1516863, - 1289431, 1005694, 661856, 267796, -161263, -604780, -1043282, -1457411, - -1832285, -2155534, -2420027, -2621275, -2759126, -2835035, -2853297, -2818571, - -2737039, -2614376, -2456980, -2270381, -2060530, -1832512, -1591794, -1343094, - -1091494, -841376, -597362, -363290, -143021, 60510, 244561, 407408, - 547618, 664738, 758550, 829643, 878668, 906840, 915250, 905346, - 878343, 835721, 778738, 708948, 627794, 537107, 438729, 334948, - 228103, 120925, 16090, -83524, -175327, -256811, -326026, -381381, - -422046, -447703, -458837, -456405, -442013, -417522, -385138, -347000, - -305255, -261681, -217812, -174648, -132866, -92642, -53935, -16402, - 20279, 56463, 92235, 127494, 161728, 194173, 223691, 249012, - 268700, 281445, 286068, 281804, 268278, 245720, 214858, 177029, - 133974, 87839, 40901, -4492, -46220, -82436, -111817, -133546, - -147456, -153913, -153846, -148528, -139528, -128444, -116827, -105934, - -96699, -89563, -84536, -81138, -78561, -75704, -71400, -64501, - -54108, -39627, -20946, 1593, 27122, 54374, 81719, 107372, - 129497, 146446, 156855, 159848, 155068, 142780, 123803, 99496, - 71589, 42078, 8610925, 16407290, 31915518, 54983844, 85416624, 123087880, - 168063984, 221958576, 289536032, 364878560, 426914240, 455184448, 434995104, 358099712, - 224036640, 40240900, -178615296, -412308800, -637390400, -829991424, -968687232, -1037118016, - -1026013056, -934381184, -769721024, -547208704, -287987072, -16727445, 241188016, 462583776, - 629070144, 729071296, 758930560, 723116864, 633312128, 506752128, 363680000, 224696192, - 107612800, 25033840, -24212064, -54589336, -75035176, -87485160, -93580896, -94591848, - -91737704, -86038536, -78437624, -69711224, -60533488, -51423856, -42794000, -34920752, - -27987240, -22072318, -17188296, -13279352, -10254646, -7989723, -6353249, -5207335, - -4426934, -3897128, -3525509, -3236283, -2977071, -2710878, -2419337, -2094076, - -1738366, -1359253, -969076, -579170, -201992, 153445, 478767, 769398, - 1021418, 1233894, 1405828, 1538184, 1631253, 1686663, 1705249, 1689093, - 1639776, 1560317, 1453594, 1324024, 1175972, 1015086, 846649, 676618, - 509991, 351706, 205173, 73207, -43142, -143513, -229073, -301290, - -362531, -414799, -460247, -500043, -534968, -564551, -587849, -602888, - -607619, -599579, -576918, -538114, -482894, -411845, -327078, -231622, - -129783, -26319, 73437, 164513, 242258, 303205, 344935, 366711, - 369107, 354325, 325569, 287088, 243371, 199057, 158131, 123882, - 98274, 82114, 74715, 74333, 78122, 82791, 84734, 80757, - 68210, 45592, 12513, -29958, -79606, -133015, -186134, -234445, - -273650, -299897, -310406, -303565, -279332, -239075, -185665, -123028, - -55984, 10396, 12276729, 12693837, 13547048, 14871155, 16707203, 19094012, - 22050984, 25567530, 29581572, 33971516, 38534384, 42985632, 46940136, 49924776, - 51363228, 50604824, 46909464, 39493740, 27503144, 10070768, -13759776, -44999620, - -84980336, -136135984, -207135712, -303422240, -412817600, -514972896, -589851392, -619651584, - -591583168, -499579936, -345470464, -138966128, 103208400, 359174656, 604351488, 814326528, - 967700992, 1048627328, 1048680832, 967863296, 814603776, 604752128, 359708672, 103884792, - -138140928, -344495008, -498458752, -590328384, -618282624, -588395136, -513462144, -411289888, - -301917376, -205694144, -134796400, -83778624, -43967052, -12923312, 10688964, 27884292, - 39622020, 46770036, 50183460, 50644772, 48893804, 45580600, 41282912, 36475948, - 31549672, 26793770, 22418028, 18548592, 15250408, 12530037, 10357491, 8671122, - 7396225, 6448686, 5748701, 5221465, 4805724, 4451326, 4123487, 3798131, - 3463431, 3114322, 2752946, 2383612, 2013354, 1648090, 1293873, 954378, - 632818, 330406, 48532, -212349, -450755, -665332, -853410, -1012414, - -1138953, -1230412, -1284349, -1300013, -1277722, -1220043, -1130902, -1016282, - -883017, -739061, -592113, -449695, -317863, -201395, -102837, -23014, - 39453, 87271, 124545, 155673, 185224, 216854, 253275, 295449, - 342868, 393176, 442827, 487113, 521090, 539819, 539332, 516817, - 471355, 403816, 317194, 216106, 106711, -4112, -109126, -201659, - -275976, -328059, -355725, -359045, -340068, -302808, -252589, -195699, - -138533, -87141, -46428, -19866, -8984, -13439, -30918, -57611, - -88487, -118040, -140755, -151891, -147872, -126858, -88834, -35798, - 28549, 99021, 169585, 233841, 285797, 320360, 333987, 324942, - 293611, 242374, 175498, 98630, 18357, -58534, -125609, -177509, - -210361, -222240, -213241, -185532, -143021, -91031, -35654, 16794, - 60506, 90695, 104157, 99518, 77443, 40482, -7123, -59963, - -111945, -157005, -189668, -205697, -202469, -179335, -137639, -80671, - -13290, 58484, 128123, 189173, 235954, 264066, 270883, 255765, - 220174, 2505037, 2442157, 2316154, 2126672, 1874467, 1561489, 1192761, - 775600, 321304, -157412, -645618, -1131069, -1604363, -2065994, -2526609, - -3015154, -3577470, -4283816, -5223516, -6510031, -8269471, -10642073, -13763168, - -17761360, -22731886, -28733746, -35756756, -43722016, -52444716, -61644104, -70903304, - -79696304, -87342288, -93058336, -95895816, -94830640, -88641344, -76058616, -55443336, - -24863958, 24611116, 107440320, 224788944, 364047616, 507399776, 634242176, 724330048, - 760427264, 730852288, 631136576, 464936832, 243827808, -13803173, -284784032, -543737088, - -765995008, -930417472, -1021827456, -1032720576, -964074624, -825139200, -632243584, -406773696, - -172552176, 47020828, 231770176, 367063072, 445488224, 467504928, 441322720, 381553248, - 308519520, 243096544, 190940560, 146958368, 109144704, 76984176, 50110068, 28195132, - 10859917, -2331860, -11867127, -18267046, -22063578, -23780578, -23911906, -22907786, - -21160858, -19000796, -16689673, -14424574, -12340740, -10519832, -8997765, -7775391, - -6827615, -6113435, -5583605, -5187945, -4880011, -4620898, -4380691, -4139162, - -3884798, -3613535, -3326639, -3028821, -2726195, -2424818, -2129499, -1843272, - -1567228, -1300854, -1042591, -790584, -543428, -300799, -63891, 164435, - 379755, 576491, 748467, 889663, 994911, 1060624, 1085268, 1069727, - 1017300, 933554, 825817, 702603, 572797, 444929, 326372, 222801, - 137707, 72284, 25430, -5886, -26190, -40792, -55143, -74076, - -101256, -138661, -186386, -242548, -303550, -364410, -419384, -462555, - -488576, -493231, -474014, -430404, -364059, -278663, -179684, -73826, - 31531, 129079, 212203, 275656, 315980, 331857, 324141, 295780, - 251424, 196978, 138929, 83734, 37113, 3535, -14258, -15450, - -1229, 25423, 60045, 97246, 131265, 156654, 168829, 164631, - 142633, 103366, 49247, -15601, -85794, -155177, -217478, -266899, - -298743, -309847, -298949, -266783, -216054, -151145, -77727, -2174, - 69017, 702811, 654136, 559557, 424419, 255932, 62727, -146313, - -362395, -578054, -786994, -985086, -1169469, -1339221, -1493760, -1633415, - -1757450, -1864970, -1953010, -2018235, -2055396, -2060043, -2027296, -1955369, - -1844129, -1698799, -1527422, -1343910, -1163448, -1004247, -880298, -801810, - -765486, -754582, -727814, -620985, -336399, 251272, 1302991, 3002489, - 5560181, 9191239, 14115464, 20525480, 28584940, 38387408, 49958096, 63204572, - 77930464, 93777392, 110263472, 126708904, 142322784, 156083648, 166946144, 173586320, - 175308576, 166325584, 128680304, 48303544, -74757040, -231715952, -407042976, -580775616, - -731094848, -837272320, -882366976, -855569984, -753729472, -582012992, -353498368, -87845872, - 190881904, 456905760, 685667520, 856595200, 955419584, 975703808, 919454400, 796692096, - 624085824, 422776032, 215700912, 24714716, -132116288, -242736960, -302620672, -315365760, - -293500640, -258619744, -225315280, -194015376, -163910608, -135501680, -109209736, -85466480, - -64529184, -46551644, -31533836, -19377918, -9878438, -2769905, 2268515, 5573895, - 7492172, 8348992, 8445734, 8040905, 7351921, 6546074, 5747758, 5036624, - 4458304, 4026662, 3735443, 3561663, 3475902, 3444629, 3437763, 3428836, - 3399492, 3337488, 3238697, 3103696, 2938339, 2749967, 2547660, 2338971, - 2130630, 1926285, 1727949, 1534741, 1344902, 1155176, 962956, 765794, - 563232, 356016, 147339, -58398, -254956, -435840, -594040, -723684, - -819800, -879714, -902536, -890086, -845966, -775986, -686897, -586473, - -482133, -380953, -288451, -208799, -143979, -94350, -58234, -32830, - -14133, 1978, 19701, 42276, 72069, 109808, 154947, 205272, - 257581, 307614, 350943, 383061, 400284, 399785, 380309, 341971, - 286657, 217523, 139066, 56385, -24953, -99742, -163283, -212106, - -243951, -258230, -255733, -167174, -239722, -322173, -408810, -492821, - -566516, -622391, -653378, -653921, -619965, -549788, -443508, -303565, - -133727, 60691, 274135, 500595, 734943, 972407, 1209697, 1443978, - 1673718, 1897211, 2113333, 2319888, 2514652, 2693915, 2854207, 2991285, - 3102696, 3187122, 3247515, 3290252, 3328147, 3378477, 3464934, 3613501, - 3852565, 4205968, 4691138, 5309438, 6043184, 6844465, 7633047, 8285794, - 8638327, 8477588, 7550391, 5561188, 2190063, -2903797, -10053462, -19577218, - -31739716, -46747292, -64700276, -85602512, -109304912, -135555296, -163926944, -194002976, - -225285872, -258586768, -293477632, -315364832, -302650912, -242803328, -132218944, 24580560, - 215544720, 422611008, 623927680, 796557504, 919359168, 975661312, 955439360, 856681664, - 685819520, 457116384, 191139072, -87558504, -353200000, -581723904, -753469440, -855356160, - -882212736, -837186048, -731079168, -580827520, -407153984, -231873488, -74945544, 48100840, - 128479736, 166141328, 175151264, 173462112, 166856272, 156024384, 142286160, 126683672, - 110236760, 93736176, 77863432, 63103528, 49819328, 38212324, 28380444, 20303444, - 13891988, 8985083, 5391207, 2889572, 1262319, 294475, -203348, -398749, - -423662, -382151, -343523, -352875, -428668, -574135, -776792, -1018896, - -1276918, -1529859, -1757571, -1946540, -2086827, -2175642, -2213314, -2205436, - -2158564, -2081784, -1982822, -1869689, -1747600, -1621008, -1491391, -1359644, - -1224514, -1085096, -939557, -787433, -628324, -463767, -295726, -127991, - 35529, 189782, 330335, 452518, 553054, 629169, 679950, 705285, - 706896, 687113, 649626, 598183, 537192, 470470, 401849, 334088, - 269582, 209498, 154619, 104683, 59308, 17469, -21588, -58843, - -94673, -129406, -162639, -193876, -221997, -245959, -264363, -276167, - -280285, -276237, -263718, -243144, -215155, -181048, -225261, -273555, - -307889, -326103, -327476, -312684, -283609, -243038, -194256, -140631, - -85182, -30244, 22798, 73608, 122885, 172169, 223570, 279366, - 341593, 411622, 489814, 575248, 665622, 757256, 845294, 923987, - 987121, 1028456, 1042203, 1023430, 968397, 874758, 741642, 569587, - 360379, 116796, -157659, -459031, -783110, -1125546, -1481872, -1847416, - -2217186, -2585716, -2947037, -3294742, -3622346, -3923849, -4194709, -4432970, - -4640760, -4825675, -5002266, -5192922, -5428408, -5747161, -6193793, -6815752, - -7658969, -8761350, -10145511, -11809549, -13717971, -15791409, -17898084, -19845242, - -21374384, -22157722, -21800466, -19845174, -15783279, -9068449, 863064, 14571969, - 32592328, 55410852, 83458416, 117107272, 156758688, 202942128, 257651808, 325933440, - 402044000, 464971200, 494205696, 474891008, 398522784, 264288720, 79206760, -142533824, - -381224512, -613975168, -817483264, -970950784, -1058690624, -1072345920, -1012679872, -893613760, - -734287744, -546547584, -339769856, -124623176, 88170360, 288225568, 466194112, 614172160, - 726163904, 798321728, 829131584, 819397568, 772133120, 692285376, 586377152, 462039040, - 327503712, 191064064, 60554008, -57130884, -156432848, -233429280, -286014272, -313941504, - -318749984, -303544416, -272698496, -231426688, -185371904, -140057616, -100631488, -69996648, - -46622364, -28166424, -13810469, -2980571, 4834391, 10133794, 13384151, 15027667, - 15460742, 15036408, 14051635, 12751812, 11326396, 9916592, 8616869, 7484565, - 6544389, 5798046, 5229236, 4811721, 4513168, 4300801, 4143382, 4014381, - 3892172, 3761242, 3611156, 3436579, 3235728, 3009947, 2762235, 2496885, - 2218419, 1931526, 1640448, 1349202, 1061301, 780105, 508675, 250099, - 7326, -216639, -418984, -597023, -748502, -871609, -965247, -1029025, - -1063439, -1069768, -1050128, -1007269, -944511, -865478, -773983, -673761, - -568371, -460991, -354385, -250799, -152007, -59299, 26411, 104546, - 174730, 236744, 290418, 335608, 372145, 399853, 418548, 428095, - 428430, 419636, 401963, 375881, 342083, 301499, 255265, 204699, - 151239, 96397, 41685, -11436, -61625, -107696, -148661, -183744, - -212399, -234301, -249338, -257586, -259295, -171383, -167771, -160946, - -151648, -140875, -129741, -119346, -110602, -104127, -100108, -98276, - -97857, -97667, -96155, -91604, -82246, -66504, -43110, -11334, - 28976, 77253, 132282, 192171, 254555, 316653, 375561, 428343, - 472340, 505222, 525246, 531204, 522588, 499415, 462302, 412189, - 350367, 278167, 197008, 108113, 12645, -88501, -194453, -304491, - -417705, -533098, -649202, -764225, -875703, -980757, -1075829, -1157086, - -1220253, -1261142, -1275529, -1259757, -1210576, -1125738, -1003720, -844248, - -647867, -416383, -152288, 140834, 458975, 797247, 1150575, 1513140, - 1879071, 2241774, 2594688, 2930577, 3242477, 3523085, 3766061, 3965621, - 4118279, 4222622, 4281408, 4301274, 4294860, 4279931, 4280984, 4327080, - 4452293, 4691546, 5079427, 5643594, 6401946, 7353690, 8475606, 9711576, - 10969534, 12110916, 12950640, 13248182, 12713298, 10999818, 7719470, 2437137, - -5306709, -16007364, -30173754, -48382488, -71457888, -101754088, -140816912, -185763344, - -231466336, -272424224, -303010560, -318021792, -313081312, -285067456, -232401024, -155266144, - -55676148, 62564504, 194048000, 332049728, 468930560, 596597632, 707022848, 792757376, - 847434880, 866203136, 846081856, 786193920, 687883392, 554677120, 392130080, 207514704, - 9432382, -192707744, -389200480, -570675136, -728479808, -856350656, -952308800, -1015864832, - -1046220032, -1043342848, -1008126784, -942413952, -848923648, -731177152, -593366784, -440223744, - -276851936, -108565096, 59292484, 221513920, 373199296, 509904800, 627780928, 723682304, - 795257728, 841006144, 860308096, 853421632, 821452480, 766292160, 690533568, 597361024, - 490425248, 373702496, 251347920, 127544600, 6357648, -108405296, -213318272, -305445280, - -382425728, -442537280, -484731648, -508645408, -514583008, -503476768, -476822816, -436599136, - -385166592, -325160416, -259373680, -190640560, -121721768, -55198692, 6621388, 61783672, - 108746912, 146423216, 174197536, 191924704, 199906864, 198850976, 189810704, 174114128, - 153282784, 128943984, 102742896, 76256368, 50914548, 27932052, 8253544, -7485707, - -18981258, -26263536, -29686804, -29902128, -27874808, -24904632, -21873452, -18924710, - -16109369, -13513449, -11193274, -9184409, -7497119, -6124396, -5043505, -4222392, - -3622104, -3201531, -2919256, -2736657, -2618792, -2536063, -2464195, -2384826, - -2284834, -2156265, -1995319, -1801974, -1578908, -1331064, -1064692, -787000, - -505396, -227288, 40476, 291657, 521006, 724191, 898044, 1040397, - 1150221, 1227397, 1272778, 1287922, 1275099, 1237007, 1176756, 1097593, - 1002895, 895923, 779853, 657586, 531818, 404912, 279016, 155978, - 37491, -74965, -179989, -276315, -362698, -438012, -501167, -551237, - -587418, -609171, -616196, -608571, -586708, -551466, -504065, -446144, - -379632, -306754, -229859, -151391, -73706, 962, 70672, 133776, - 189046, 235630, 273114, 301432, 320873, 331952, 335393, 331988, - 322579, 307941, 288792, 265710, 239189, 209598, 177267, 142480, - 105576, 66945, 27114, -13271, -53400, -92348, -129065, -162474, - -191486, -215114, -232503, -243037, -246348, -242394, -231432, -214048, - -191082, -163619, -132881, -100182, -66814, -34004, -2809, 25897, - 51498, 73603, 92073, 106961, 118497, 127000, 132851, 136409, - 137987, 137791, 135930, 132384, 127051, 119749, 110286, 98485, - 84255, 67615, 48748, 27996, 5888, -16902, -39568, -61243, - -81031, -98099, -111715, -121326, -162998, -160088, -154357, -145969, - -135159, -122211, -107436, -91156, -73678, -55283, -36214, -16667, - 3198, 23260, 43411, 63547, 83543, 103238, 122414, 140790, - 158012, 173664, 187268, 198317, 206286, 210673, 211020, 206956, - 198214, 184663, 166317, 143347, 116078, 84982, 50655, 13802, - -24798, -64311, -103888, -142674, -179845, -214613, -246243, -274051, - -297418, -315773, -328608, -335464, -335942, -329700, -316476, -296086, - -268464, -233660, -191884, -143511, -89112, -29451, 34490, 101547, - 170354, 239401, 307043, 371566, 431212, 484258, 529040, 564034, - 587875, 599425, 597777, 582315, 552693, 508884, 451144, 380049, - 296447, 201490, 96577, -16612, -136189, -260017, -385787, -510997, - -633031, -749140, -856549, -952436, -1034059, -1098739, -1143998, -1167540, - -1167397, -1141901, -1089827, -1010351, -903194, -768558, -607272, -420711, - -210944, 19368, 266825, 527423, 796421, 1068545, 1337896, 1598264, - 1843121, 2066095, 2261075, 2422874, 2547443, 2632705, 2678810, 2689041, - 2669949, 2632165, 2590157, 2562709, 2571986, 2643435, 2803848, 3080521, - 3498078, 4076931, 4828788, 5754789, 6839761, 8050914, 9330877, 10598671, - 11740823, 12618964, 13055458, 12877144, 11632705, 8232321, 1712792, -8269488, - -21676128, -38124492, -56918448, -77081536, -97412152, -116545320, -133029752, -145407808, - -152301808, -152496656, -145019616, -129208872, -104771344, -71822984, -30912372, 16976826, - 70442824, 127704136, 186656480, 244947920, 300068000, 349448640, 390571840, 421080480, - 438886880, 442275104, 429992032, 401322976, 356148672, 294980192, 218969888, 129897104, - 30128484, -77446248, -189501472, -302382688, -412230048, -515113984, -607177664, -684781632, - -744644480, -783974400, -800586304, -792999936, -760514496, -703256576, -622199232, -519150624, - -396712160, -258207056, -107581408, 50718884, 211891600, 370936768, 522825024, 662669440, - 785895232, 888400000, 966700096, 1018056320, 1040574720, 1033278976, 996150976, 930138240, - 837128128, 719891072, 581993344, 427717504, 261968336, 89712808, -84335696, -255470448, - -419050304, -570668224, -706270592, -822273344, -915657792, -984053440, -1025798848, -1039984064, - -1026470080, -985886720, -919608064, -829707328, -718891392, -590417984, -447997504, -295682944, - -137750720, 21423548, 177490944, 326252736, 463778272, 586513216, 691375872, 775837824, - 837987456, 876574784, 891035520, 881494912, 848751424, 794240448, 719980032, 628500544, - 522760032, 406049152, 281887712, 153916800, 25789502, -98936256, -216899504, -325029824, - -420629824, -501444512, -565715328, -612217792, -640282304, -649796800, -641192896, -615415808, - -573878848, -518405728, -451161088, -374573216, -291251040, -203897664, -115224504, -27867474, - 55691216, 133193880, 202668432, 262478208, 311359200, 348444032, 373271968, 385785760, - 386315040, 375548096, 354492672, 324428128, 286850336, 243411744, 195858832, 145969024, - 95489384, 46079124, -742270, -43639588, -81497992, -113449472, -138889424, -157482720, - -169159888, -174103616, -172726688, -165642240, -153628176, -137586864, -118502264, -97395800, - -75283368, -53134364, -31835154, -12157406, 5266631, 19962188, 31621642, 40107016, - 45443876, 47808948, 47510056, 44961972, 40656428, 35131248, 28935710, 22599292, - 16597725, 11327856, 7077267, 4007588, 2004813, 698472, -159366, -668117, - -915026, -972592, -904574, -762742, -589613, -417127, -268777, -159451, - -97435, -84877, -119630, -195920, -305911, -440293, -589480, -743976, - -895177, -1035483, -1158746, -1260167, -1336478, -1385695, -1407139, -1401122, - -1368900, -1312362, -1233971, -1136502, -1023004, -896600, -760484, -617774, - -471538, -324684, -179997, -40056, 92731, 216208, 328430, 427747, - 512770, 582446, 636028, 673130, 693701, 698053, 686825, 660989, - 621793, 570758, 509593, 440184, 364504, 284586, 202444, 120043, - 39232, -38277, -110964, -177497, -236776, -287918, -330276, -363413, - -387116, -401358, -406302, -402269, -389735, -369301, -341693, -307732, - -268335, -224488, -177248, -127707, -76997, -26251, 23403, 70879, - 115146, 155262, 190393, 219846, 243073, 259708, 269557, 272617, - 269062, 259245, 243667, 222969, 197896, 169274, 137970, 104873, - 70854, 36751, 3337, -28682, -58696, -86176, -110690, -131889, - -149514, -163373, -173350, -179385, -181478, -179682, -174108, -164916, - -152331, -136632, -118169, -97351, -74653, -50603, -25781, -795, - 23721, 47148, 68883, 88374, 105138, 118782, 129014, 135661, - 138666, 138092, 134111, 126995, -72761, -56245, -38209, -19019, - 926, 21206, 41377, 60995, 79616, 96811, 112175, 125335, - 135964, 143783, 148571, 150171, 148491, 143510, 135276, 123908, - 109592, 92580, 73182, 51764, 28741, 4570, -20258, -45231, - -69817, -93477, -115679, -135902, -153653, -168473, -179953, -187739, - -191549, -191176, -186499, -177490, -164220, -146855, -125663, -101009, - -73349, -43220, -11236, 21933, 55569, 88924, 121238, 151753, - 179734, 204484, 225359, 241786, 253272, 259417, 259926, 254614, - 243416, 226386, 203704, 175675, 142727, 105408, 64381, 20414, - -25629, -72803, -120096, -166448, -210776, -251991, -289028, -320870, - -346577, -365309, -376354, -379149, -373302, -358603, -335043, -302817, - -262324, -214167, -159142, -98227, -32564, 36563, 107751, 179503, - 250256, 318414, 382371, 440551, 491426, 533563, 565640, 586488, - 595111, 590727, 572783, 540991, 495337, 436112, 363911, 279647, - 184541, 80117, -31824, -149225, -269813, -391137, -510624, -625621, - -733459, -831498, -917191, -988123, -1042078, -1077064, -1091376, -1083624, - -1052786, -998241, -919828, -817879, -693286, -547530, -382754, -201766, - -8088, 194084, 399903, 603998, 800600, 983813, 1147877, 1287596, - 1398749, 1478666, 1526731, 1545029, 1538843, 1517225, 1493308, 1484620, - 1512997, 1604428, 1788384, 2097022, 2563860, 3222329, 4104042, 5237042, - 6645377, 8348986, 10388584, 12857124, 15616492, 18195220, 20086854, 20833852, - 20030730, 17354698, 12586763, 5632648, -3464912, -14518786, -27198686, -41038776, - -55453300, -69758216, -83199240, -94984200, -104319184, -110446312, -112682200, -110454752, - -103337336, -91078120, -73623784, -51135812, -23998892, 7179643, 41579336, 78185368, - 115815920, 153157712, 188808416, 221324672, 249274288, 271290496, 286126560, 292708608, - 290184736, 277968256, 255773584, 223642784, 181961872, 131465504, 73229656, 8652162, - -60578956, -132528392, -205066832, -275933056, -342803008, -403363968, -455390976, -496823520, - -525839776, -540925440, -540935296, -525144960, -493290304, -445593920, -382776288, -306051584, - -217107424, -118068792, -11447024, 99925072, 212970192, 324453472, 431076864, 529578144, - 616831424, 689946368, 746362368, 783935232, 801012800, 796497984, 769895232, 721340928, - 651613760, 562127360, 454901984, 332518336, 198053008, 54997860, -92834592, -241417152, - -386622272, -524341152, -650604416, -761700160, -854286656, -925495040, -973019712, -995193152, - -991042688, -960327360, -903553472, -821968256, -717531648, -592866496, -451188992, -296220608, - -132085040, 36808156, 205888512, 370555840, 526312064, 668891968, 794386240, 899356480, - 980934400, 1036909248, 1065792000, 1066936320, 1040546496, 987467136, 909149824, 807691200, - 685777408, 546616256, 393851264, 231466848, 63682176, -105158952, -270702912, -428699744, - -575114688, -706232704, -818754752, -909882496, -977389312, -1019675904, -1035808896, -1025541568, - -989316224, -928248256, -844092096, -739190912, -616410240, -479058656, -330797152, -175539264, - -17346022, 139682832, 291517408, 434303488, 564462720, 678784448, 774506688, 849384640, - 901743936, 930519040, 935273728, 916205312, 874131520, 810461056, 727147968, 626633152, - 511772224, 385754272, 252012128, 114127448, -24266644, -159583088, -288375648, -407428352, - -513837376, -605083264, -679091392, -734279488, -769591104, -784513984, -779083840, -753872640, - -709962816, -648908288, -572682880, -483618976, -384336832, -277668320, -166575776, -54069264, - 56875640, 163397472, 262823600, 352738016, 431040544, 495996064, 546272512, 580966656, - 599617664, 602207872, 589151552, 561271552, 519765696, 466163232, 402273376, 330127520, - 251916672, 169926224, 86470040, 3825426, -75828792, -150469632, -218281248, -277698720, - -327443424, -366549120, -394378400, -410629056, -415330784, -408832544, -391780864, -365090688, - -329909184, -287574176, -239568528, -187472016, -132911848, -77513936, -22855780, 29577298, - 78431608, 122519032, 160844800, 192628240, 217316432, 234590304, 244363440, 246773968, - 242169824, 231088240, 214230352, 192431808, 166630544, 137832768, 107078304, 75406624, - 43824304, 13275079, -15386599, -41417940, -64205456, -83277544, -98311776, -109136888, - -115729656, -118206952, -116813448, -111905648, -103932808, -93415768, -80924248, -67053716, - -52402552, -37550280, -23037704, -9349536, 3099972, 13977919, 23039974, 30133750, - 35198404, 38260568, 39427008, 38874332, 36836352, 33589632, 29437968, 24696382, - 19675442, 14666438, 9928193, 5675861, 2072344, -777524, -2829749, -4100893, - -4665396, -4650187, -4237832, -3670417, -3111787, -2588999, -2111154, -1692910, - -1342761, -1064792, -858034, -718046, -637371, -606817, -616039, -654489, - -711863, -778707, -846654, -908726, -959364, -994500, -1011439, -1008780, - -986218, -944402, -884714, -809115, -719958, -619860, -511553, -397807, - -281326, -164706, -50372, 59439, 162717, 257679, 342798, 416803, - 478690, 527728, 563468, 585733, 594629, 590529, 574063, 546100, - 507723, 460200, 404950, 343501, 277458, 208453, 138112, 68013, - -346, -65582, -126442, -181831, -230824, -272671, -306807, -332846, - -350584, -359987, -361185, -354465, -340256, -319119, -291736, -258891, - -221458, -180384, -136669, -91350, -45474, -81, 43821, 85280, - 123419, 157461, 186741, 210730, 229036, 241421, 247797, 248224, - 242908, 232183, 216503, 196419, 172565, 145631, 116349, 85467, - 53736, 21886, -9380, -39409, -67596, -93402, -116356, -136059, - -152188, -164499, -172828, -177091, -177288, -173497, -165880, -154675, - -140195, -122823, -103005, -81242, -58073, -34073, -9827, 14076, - 37067, 58607, 78202, 95423, 109908, 121382, 129651, 134613, - 136254, 134645, 129937, 122348, -44011, -24892, -4829, 15720, - 36281, 56369, 75506, 93227, 109092, 122701, 133696, 141775, - 146697, 148290, 146451, 141157, 132459, 120486, 105445, 87616, - 67345, 45046, 21187, -3718, -29118, -54435, -79078, -102456, - -123992, -143137, -159380, -172271, -181421, -186524, -187359, -183802, - -175830, -163523, -147066, -126746, -102945, -76138, -46876, -15782, - 16466, 49153, 81535, 112860, 142385, 169387, 193186, 213156, - 228742, 239468, 244958, 244937, 239247, 227851, 210839, 188425, - 160956, 128901, 92851, 53506, 11664, -31790, -75908, -119691, - -162116, -202159, -238815, -271127, -298207, -319262, -333613, -340713, - -340163, -331730, -315348, -291129, -259362, -220512, -175214, -124263, - -68599, -9299, 52451, 115372, 178114, 239282, 297468, 351266, - 399319, 440334, 473120, 496614, 509913, 512295, 503248, 482484, - 449964, 405893, 350744, 285237, 210350, 127286, 37477, -57465, - -155750, -255468, -354592, -451046, -542708, -627478, -703289, -768173, - -820272, -857921, -879657, -884318, -871054, -839446, -789522, -721878, - -637689, -538829, -427837, -308012, -183306, -58351, 61766, 171575, - 265595, 338530, 385818, 403920, 391045, 347469, 276387, 184146, - 81162, -18121, -94264, -123407, -76036, 81568, 389991, 895519, - 1710701, 3002792, 4825273, 7109226, 9729646, 12512602, 15248433, 17702624, - 19630608, 20791430, 20963006, 19955790, 17626208, 13887624, 8719623, 2174045, - -5621665, -14464834, -24081046, -34131360, -44222504, -53920252, -62765096, -70290080, - -76039792, -79590136, -80567832, -78669104, -73676656, -65474260, -54058260, -39545472, - -22176940, -2317326, 19550376, 42834668, 66849928, 90834856, 113974736, 135426640, - 154347008, 169920736, 181390720, 188086896, 189453888, 185076096, 174699280, 158247904, - 135837376, 107780464, 74587640, 36960972, -4218522, -47909872, -92937136, -138019856, - -181808096, -222921312, -259989808, -291697568, -316825344, -334292320, -343195264, -342844000, - -332791264, -312856704, -283143456, -244046832, -196254272, -140736784, -78731208, -11714102, - 58632672, 130463552, 201817312, 270670080, 334992000, 392806176, 442247552, 481620896, - 509455360, 524554208, 526038368, 513381696, 486437344, 445453888, 391080448, 324360480, - 246714016, 159908576, 66019492, -32619810, -133476120, -233882016, -331106848, -422431424, - -505224224, -577016896, -635577152, -678976448, -705651136, -714454400, -704697856, -676181184, - -629208640, -564592384, -483640672, -388133216, -280282016, -162679760, -38236756, 89892360, - 218389968, 343862752, 462932736, 572329472, 668980864, 750100160, 813266368, 856496128, - 878304640, 877753856, 854486592, 808744960, 741372928, 653802560, 548023872, 426538944, - 292301664, 148644560, -806035, -152223392, -301680672, -445254848, -579131904, -699710144, - -803698816, -888209216, -950836352, -989727616, -1003637824, -991967616, -954785856, -892832832, - -807506624, -700830848, -575405568, -434342368, -281185056, -119818392, 45633172, 210913568, - 371747552, 523954144, 663558144, 786896576, 890717440, 972267648, 1029367616, 1060471360, - 1064709056, 1041912064, 992618752, 918061696, 820136128, 701350912, 564763136, 413905312, - 252702016, 85283768, -84153016, -251373152, -412193952, -562598208, -698834304, -817510976, - -915681728, -990918592, -1041372160, -1065817344, -1063683392, -1035067008, -980729024, -902074176, - -801114432, -680417408, -543040576, -392453440, -232449024, -67047936, 99603672, 263338768, - 420074528, 565914944, 697248640, 810838912, 903904448, 974187712, 1020010432, 1040314112, - 1034684224, 1003358720, 947219392, 867767552, 767083328, 647771264, 512892224, 365884480, - 210475200, 50585176, -109770824, -266585856, -415961728, -554206912, -677928256, -784115520, - -870214784, -934190464, -974573952, -990497408, -981711808, -948590080, -892113472, -813843264, - -715877760, -600795712, -471588352, -331581056, -184347104, -33615956, 116822016, 263211632, - 401927360, 529563904, 643020416, 739576448, 816957632, 873389632, 907638720, 919038784, - 907503104, 873521728, 818144448, 742948992, 649996672, 541776128, 421136352, 291211584, - 155339280, 16974000, -120401088, -253362480, -378632256, -493159552, -594195200, -679358336, - -746692608, -794711040, -822428992, -829383232, -815638016, -781777600, -728885632, -658512064, - -572628224, -473572352, -363985824, -246742688, -124873992, -1489180, 120303760, 237476976, - 347158464, 446702912, 533755744, 606308928, 662747520, 701884928, 722987456, 725786624, - 710479424, 677716736, 628580224, 564548800, 487455296, 399434400, 302864160, 200301680, - 94415504, -12084029, -116514408, -216288720, -308979968, -392380352, -464553824, -523880992, - -569095168, -599308544, -614028672, -613164032, -597019520, -566281600, -521994336, -465525920, - -398528192, -322889120, -240680240, -154100192, -65416176, 23095468, 109207648, 190798608, - 265904304, 332765472, 389868896, 435980928, 470173824, 491842976, 500715808, 496851904, - 480634304, 452752704, 414179264, 366137088, 310063456, 247567808, 180386464, 110334864, - 39258892, -31013516, -98719224, -162203968, -219962560, -270674336, -313232768, -346769088, - -370668672, -384580928, -388421408, -382367424, -366846528, -342518912, -310254080, -271102432, - -226263200, -177048848, -124847760, -71085712, -17187518, 35460372, 85545152, 131860032, - 173332944, 209050736, 238278608, 260474080, 275295552, 282605088, 282465888, 275134240, - 261046656, 240802480, 215142736, 184925744, 151100368, 114677616, 76701576, 38220244, - 257309, -36214540, -70298016, -101192744, -128213464, -150804368, -168549456, -181178720, - -188570000, -190746832, -187872144, -180238592, -168255376, -152432528, -133362752, -111701864, - -88148040, -63420712, -38239704, -13305140, 10721270, 33233146, 53694084, 71649704, - 86736888, 98689968, 107343928, 112634456, 114595192, 113352176, 109115832, 102170872, - 92864472, 81593048, 68788288, 54902676, 40395092, 25716910, 11298924, -2460449, - -15205434, -26631372, -36491212, -44599896, -50836640, -55145052, -57531268, -58060172, - -56849976, -54065368, -49909488, -44615140, -38435440, -31634326, -24477204, -17222048, - -10111227, -3364318, 2827930, 8308287, 12956318, 16690166, 19466890, 21281350, - 22163806, 22176328, 21408246, 19970784, 17991204, 15606606, 12957738, 10182934, - 7412561, 4764010, 2337587, 213264, -1551419, -2922471, -3889289, -4463602, - -4677182, -4578945, -4230953, -3704343, -3074240, -2415525, -1797252, -1280920, - -898770, -627791, -434755, -305164, -227603, -191690, -187557, -206218, - -239500, -280340, -322733, -361874, -394053, -416670, -428076, -427515, - -414945, -390943, -356535, -313106, -262250, -205705, -145243, -82626, - -19530, 42469, 101945, 157622, 208399, 253344, 291709, 322917, - 346571, 362440, 370466, 370745, 363530, 349215, 328325, 301500, - 269486, 233106, 193250, 150849, 106856, 62226, 17894, -25242, - -66343, -104637, -139433, -170137, -196253, -217395, -233281, -243746, - -248732, -248291, -242579, -231853, -216463, -196846, -173514, -147048, - -118082, -87293, -55383, -23069, 8934, 39937, 69279, 96351, - 120609, 141582, 158888, 172233, 181426, 186370, 187072, 183631, - 176235, 165155, 150734, 133374, 113527, 91685, 68363, 44092, - 19408, -5162, -29106, -51936, -73196, -92471, -109389, -123633, - -134942, -143118, -148026, -149603, -147856, -142863, -134772, -123799, - -110225, -94386, -76670, -57503, -37343, -16663, 4054, 24338, - 43732, 61811, 78191, 92535, 62535, 80267, 96515, 110869, - 122950, 132423, 139005, 142473, 142671, 139519, 133011, 123223, - 110309, 94503, 76111, 55508, 33131, 9465, -14962, -39597, - -63868, -87203, -109039, -128839, -146103, -160377, -171269, -178455, - -181688, -180805, -175730, -166482, -153172, -136001, -115264, -91340, - -64689, -35842, -5393, 26011, 57690, 88934, 119026, 147254, - 172929, 195397, 214061, 228390, 237937, 242348, 241373, 234879, - 222848, 205389, 182733, 155232, 123355, 87684, 48894, 7752, - -34905, -78188, -121168, -162899, -202440, -238873, -271320, -298971, - -321092, -337048, -346317, -348499, -343329, -330684, -310588, -283215, - -248890, -208087, -161430, -109684, -53754, 5325, 66401, 128208, - 189391, 248521, 304122, 354711, 398828, 435097, 462282, 479357, - 485586, 480607, 464520, 437982, 402277, 359398, 312090, 263877, - 219044, 182590, 160108, 157649, 181489, 237891, 332809, 471594, - 658900, 898625, 1197641, 1570523, 1996663, 2404745, 2717774, 2865679, - 2785718, 2427096, 1754169, 749686, -583221, -2219740, -4113328, -6196593, - -8383364, -10571665, -12647668, -14490343, -15976733, -16987568, -17413068, -17158614, - -16150145, -14338955, -11705745, -8263683, -4060347, 821616, 6265157, 12120884, - 18210488, 24331478, 30263100, 35773284, 40626432, 44591748, 47451940, 49011856, - 49106908, 47610828, 44442580, 39572032, 33024242, 24882062, 15286939, 4437778, - -7412170, -19960400, -32862134, -45739056, -58189596, -69800496, -80159352, -88867704, - -95554448, -99888904, -101593376, -100454560, -96333512, -89173816, -79007528, -65958664, - -50244076, -32171454, -12134525, 9394608, 31875820, 54713840, 77273336, 98895824, - 118918056, 136691248, 151600704, 163085296, 170656112, 173913744, 172563664, 166429120, - 155461200, 139745456, 119505000, 95099632, 67021116, 35884416, 2415097, -32566908, - -68166792, -103437232, -137402992, -169087216, -197538720, -221859376, -241231120, -254941424, - -262406848, -263193680, -257034992, -243843760, -223721280, -196960640, -164045024, -125640616, - -82584344, -35866404, 13391901, 63964612, 114551216, 163809728, 210391808, 252979168, - 290320064, 321265088, 344801344, 360083392, 366461088, 363502304, 351010944, 329038400, - 297889248, 258119712, 210529696, 156147840, 96210000, 32131786, -34524592, -102088152, - -168820816, -232961936, -292774464, -346591552, -392862560, -430196672, -457403712, -473530208, - -477890048, -470088800, -450040832, -417978368, -374452640, -320326336, -256757808, -185176992, - -107253736, -24859086, 59979564, 145128320, 228400464, 307612608, 380641824, 445482432, - 500300512, 543485312, 573695616, 589899584, 591407872, 577897856, 549428800, 506447456, - 449783328, 380634208, 300541536, 211356352, 115196864, 14397969, -88545520, -191040832, - -290462720, -384220896, -469827680, -544963968, -607541824, -655762304, -688166080, -703676928, - -701634816, -681819648, -644463424, -590250752, -520308160, -436181376, -339801440, -233440544, - -119658328, -1240033, 118872048, 237652048, 352067200, 459155616, 556103232, 640318080, - 709499520, 761700928, 795384128, 809463808, 803340864, 776923520, 730635776, 665412608, - 582681792, 484333184, 372675584, 250382144, 120426184, -13991622, -149522608, -282754144, - -410296096, -528867712, -635382464, -727028736, -801344512, -856283200, -890270272, -902247552, - -891705280, -858699904, -803857856, -728364736, -633940096, -522797984, -397595008, -261366368, - -117451720, 30587386, 179056320, 324220320, 462399104, 590061056, 703913984, 800990592, - 878726208, 935027008, 968326336, 977628096, 962536000, 923267520, 860652416, 776115520, - 671644160, 549741504, 413365632, 265857680, 110858864, -47779968, -206094880, -360108800, - -505932192, -639862208, -758477376, -858725824, -938004160, -994225728, -1025875712, -1032052032, - -1012490816, -967575808, -898331200, -806398464, -693996736, -563869056, -419215008, -263610912, - -100920864, 64800176, 229408368, 388775616, 538893952, 675977408, 796558208, 897575488, - 976453568, 1031168128, 1060298880, 1063066560, 1039353856, 989709440, 915335680, 818058560, - 700282816, 564931648, 415373344, 255336384, 88815592, -80029120, -246977680, -407857120, - -558646720, -695580608, -815240832, -914661376, -991426624, -1043686208, -1070172608, -1070248192, - -1043923520, -991857408, -915341120, -816266432, -697079168, -560719104, -410547744, -250265472, - -83820864, 84686600, 251107216, 411343136, 561449088, 697729408, 816829056, 915815936, - 992253184, 1044259072, 1070553344, 1070488704, 1044066752, 991938048, 915385920, 816295104, - 697105216, 560750656, 410588608, 250316144, 83879304, -84624008, -251044992, -411286048, - -561401792, -697695936, -816812672, -915819008, -992277056, -1044304128, -1070619200, -1070574144, - -1044169920, -992056576, -915517184, -816436096, -697252864, -560901952, -410740480, -250465744, - -84023984, 84486696, 250917232, 411169760, 561298496, 697607040, 816739008, 915761280, - 992235520, 1044278912, 1070609856, 1070580032, 1044190208, 992090048, 915562432, 816491584, - 697316864, 560972608, 410815936, 250544048, 84103240, -84408312, -250841440, -411098144, - -561232512, -697547840, -816687680, -915718464, -992201920, -1044254720, -1070595200, -1070574848, - -1044194112, -992102592, -915582912, -816519232, -697350784, -561011712, -410859200, -250590352, - -84151408, 84359424, 250792960, 411051168, 561188032, 697506752, 816650880, 915686656, - 992175616, 1044234432, 1070581248, 1070567360, 1044193024, 992107776, 915594112, 816535872, - 697372352, 561037568, 410888512, 250622304, 84185136, -84324824, -250758368, -411017408, - -561155904, -697477056, -816624192, -915663552, -992156544, -1044219712, -1070571008, -1070561728, - -1044192000, -992111168, -915601728, -816547392, -697387392, -561055616, -410909120, -250644896, - -84209144, 84299992, 250733312, 410992736, 561132224, 697454848, 816603968, 915645824, - 992141696, 1044208000, 1070562816, 1070557056, 1044191040, 992113920, 915607936, 816556928, - 697399936, 561070784, 410926464, 250663904, 84229272, -84279312, -250712656, -410972640, - -561113216, -697437440, -816588608, -915632832, -992131328, -1044200448, -1070558208, -1070555520, - -1044192384, -992118080, -915614784, -816566208, -697411328, -561084032, -410941184, -250679696, - -84245752, 84262552, 250696016, 410956544, 561098048, 697423552, 816576320, 915622464, - 992123200, 1044194816, 1070555200 -}; - -/************************ Q30 *******************************/ -const Word32 ivas_fb_fr_12band_1ms_im_fx[IVAS_FB_12_1MS_LEN] = { - -96495528, -286734272, -468692800, -637041216, -786562176, -912433280, -1009964416, -1075182976, -1098333440, - -1060972224, -954328512, -784950848, -567387776, -321857280, -71378072, 161019520, 355191072, - 496249664, 576290688, 595228096, 560553408, 486341472, 391112608, 296445024, 219833024, - 161425424, 113971872, 75074912, 43676944, 18947558, 106207, -13606639, -22959300, - -28697174, -31541624, -32158708, -31154358, -29054292, -26304144, -23261552, -20202826, - -17324756, -14756116, -12565362, -10774012, -9366401, -8302065, -7524551, -6970827, - -6577419, -6286071, -6046737, -5819771, -5576294, -5297871, -4975268, -4606808, - -4196583, -3752523, -3284873, -2804624, -2322651, -1848752, -1391471, -957667, - -552820, -180887, 155183, 453533, 712892, 932744, 1112922, 1253892, - 1356428, 1421957, 1452251, 1449752, 1417222, 1357998, 1275581, 1173833, - 1056523, 927513, 790325, 648358, 504521, 361522, 221574, 86743, - -41290, -160871, -270597, -368994, -454781, -526614, -583403, -624117, - -648145, -655120, -645267, -619210, -578251, -524110, -459110, -385841, - -307254, -226274, -145851, -68575, 3253, 67950, 124299, 171779, - 210318, 240423, 262847, 278659, 288884, 294565, 296445, 295082, - 290614, 282963, 271701, 256332, 236226, 210937, 180155, 143993, - 102888, 57812, 10083, -38529, -86081, -130429, -169562, -201608, - -225146, -239179, -243376, -237949, -223786, -202225, -175080, -144342, - -112142, -80430, -50955, -24990, -3380, 13628, 26240, 35170, - 41402, 46169, 50665, 56013, 62999, 72081, 83214, 95949, - 109364, 122266, 133211, 140767, 143575, 140609, 131207, 115267, - 93186, 65957, 34996, 2134, -30636, -61239, -87791, -108676, - -122781, -129495, 12356724, 36406252, 58390684, 76977432, 90719600, 98265728, - 98008264, 88608552, 62420976, 2547174, -98862584, -234978608, -391650304, -549723776, - -687929024, -785620992, -825677888, -796781568, -695135040, -525144384, -299188480, -36327380, - 239749920, 503413376, 729982272, 898556864, 994367488, 1010422464, 948197568, 817333696, - 634343104, 420516896, 199273200, -6719048, -178276784, -302004160, -371805248, -389615456, - -365008416, -315253344, -262675984, -217917568, -178521248, -143001072, -111343304, -83569488, - -59728692, -39750832, -23483756, -10668693, -980101, 5968707, 10589352, 13306198, - 14527738, 14637296, 13974127, 12830675, 11443325, 9996437, 8620832, 7402724, - 6386965, 5588127, 4995412, 4583292, 4315642, 4154179, 4060473, 4001515, - 3949354, 3884093, 3791711, 3665350, 3502261, 3304372, 3075215, 2820550, - 2545809, 2257129, 1959450, 1657946, 1356600, 1059795, 771079, 494646, - 234059, -6519, -223731, -414017, -575061, -704879, -803133, -870150, - -907983, -919252, -907936, -878057, -834296, -780659, -721070, -658192, - -594157, -529649, -464852, -398810, -330536, -258557, -182049, -100384, - -14134, 75538, 166137, 254665, 337160, 409716, 468199, 509317, - 530349, 530086, 508400, 466928, 408381, 336929, 257279, 174830, - 94651, 21581, -40724, -89563, -123905, -143909, -151339, -148811, - -139947, -128462, -118197, -112219, -112926, -121327, -137375, -159531, - -185372, -211440, -234054, -249316, -253979, -245431, -222426, -184880, - -134334, -73467, -6263, 62723, 128418, 186074, 231361, 261147, - 273444, 267948, 261810, 763373, 1198560, 1499796, 1578270, 1304628, - 517808, -987783, -3443484, -7111908, -12256820, -19143168, -27996048, -39000040, - -52248820, -67752040, -85376464, -104873664, -125808744, -147634944, -169591248, -190910720, - -210637232, -228834976, -242239792, -233744176, -184602112, -88256112, 52564248, 227312048, - 419154080, 607121280, 768828480, 883312000, 933778624, 909811200, 808862336, 636755584, - 407214048, 140391440, -139342896, -406167488, -635714880, -807834944, -908809408, -932820096, - -882419648, -768029696, -606446400, -418634368, -226977824, -52442412, 88143752, 184240560, - 233125792, 241364816, 227710480, 209276640, 189331712, 167814560, 145682224, 123701848, - 102633120, 83021960, 65302000, 49722020, 36415812, 25376218, 16511686, 9640718, - 4539034, 941445, -1420767, -2818065, -3495818, -3676385, -3542409, -3243683, - -2888735, -2555377, -2287831, -2108851, -2019462, -2010501, -2062586, -2155553, - -2267238, -2380241, -2479146, -2554886, -2600826, -2615545, -2598567, -2552488, - -2479078, -2381454, -2260948, -2119607, -1957826, -1777065, -1577959, -1362941, - -1134431, -897064, -655697, -417094, -187702, 25095, 215280, 377113, - 507239, 603471, 666470, 698219, 703186, 686502, 654728, 613906, - 570192, 528056, 491058, 460427, 436171, 416130, 397422, 375887, - 347709, 309014, 257411, 191469, 111939, 20899, -77459, -178052, - -274516, -360654, -430246, -478480, -501684, -498487, -469248, -416789, - -345433, -261310, -171090, -82033, -635, 67321, 117943, 148920, - 160318, 153895, 133448, 103776, 70703, 39859, 16616, 4954, - 7564, 25024, 56260, 98143, 146331, 195238, 239125, 272241, - 289930, 288679, 266989, 225117, 165550, 92349, 11219, -71466, - -148857, -214705, -263567, -291740, -297224, -280306, -243136, -189895, - -125985, -57873, 7933, 65157, 108741, 134971, 142193, 130597, - 102524, 61859, 13944, -35316, -79751, -113898, -133249, -135053, - -118286, -84087, -35339, 23302, 86186, 146930, 199365, 237874, - 258253, 257864, 236196, 194657, 136724, 67341, -7287, -80567, - -145896, -270343, -808574, -1340072, -1858807, -2358665, -2831742, -3270963, - -3669340, -4023521, -4333619, -4606985, -4857566, -5108708, -5390687, -5741295, - -6200425, -6807718, -7593886, -8575752, -9745172, -11063108, -12448231, -13772797, - -14853837, -15454158, -15279006, -13985197, -11185029, -6465256, 602227, 10431847, - 23410894, 39863840, 60045788, 84103768, 112100696, 143979968, 179711728, 219302416, - 264231232, 316950432, 366815488, 391499840, 373734272, 303947296, 180205328, 8607086, - -197450336, -418782432, -632721152, -815848960, -946877184, -1009294400, -993460928, -897898880, - -729596672, -503316064, -239947616, 35840880, 298430624, 524143840, 693923584, 795387200, - 824107840, 783846592, 685860544, 547189184, 388365568, 230527600, 92671240, -11219515, - -74492144, -105158200, -120261872, -127544112, -128388320, -124354624, -116661448, -106489408, - -94793200, -82429304, -70062176, -58237700, -47334588, -37619828, -29226616, -22202334, - -16501587, -12028281, -8635400, -6159899, -4423260, -3257870, -2504859, -2031762, - -1726474, -1507393, -1314142, -1112384, -883004, -624119, -340602, -45467, - 248842, 528315, 783713, 1007231, 1196662, 1351165, 1473983, 1568019, - 1637995, 1686519, 1716364, 1727429, 1719421, 1689696, 1636232, 1556028, - 1448006, 1311510, 1148760, 963094, 760758, 548770, 336091, 131254, - -56814, -221101, -355658, -457521, -525555, -561787, -569830, -555666, - -525766, -487535, -447411, -411297, -382938, -364634, -356100, -355594, - -359287, -362732, -360583, -348172, -321291, -277591, -216139, -138411, - -47457, 51579, 152676, 248783, 333218, 399646, 443388, 461240, - 452449, 418164, 361960, 288882, 205559, 118975, 36377, -35977, - -92851, -131037, -149092, -147929, -130154, -100234, -63486, -25973, - 6639, 29226, 38204, 31469, 9051, -27322, -73989, -126155, - -177996, -223678, -257577, -275273, -273644, -251592, -209808, -151108, - -79807, -1677, 76962, 149510, 210060, 253638, 277008, 278653, - 259231, -101021, -297456, -477733, -632297, -753728, -836696, -878615, - -879031, -839751, -763739, -654959, -517096, -353514, -166209, 43748, - 276781, 533724, 815969, 1123958, 1457300, 1813342, 2187857, 2574262, - 2965417, 3353797, 3734536, 4106324, 4475222, 4855377, 5272512, 5763051, - 6375849, 7168185, 8204533, 9548340, 11257436, 13371571, 15905385, 18833006, - 22081010, 25512624, 28924300, 32032662, 34478724, 35820256, 35546928, 33078728, - 27793346, 19027280, 6112874, -11628489, -34851840, -64232176, -100493888, -144608256, - -198909072, -270631488, -359662496, -448624032, -516131776, -543967680, -518454176, -432622496, - -287176640, -90768024, 140893552, 386715040, 622670976, 824595136, 971067648, 1045974272, - 1040467264, 954060352, 794731136, 578022784, 325234560, 60958056, -189791088, -404423968, - -565354624, -661869440, -691213888, -658569600, -576189312, -461441856, -334519392, -215323504, - -121182328, -57886044, -14972652, 16811060, 39759696, 55435020, 65035460, 69706136, - 70441104, 68189248, 63775032, 57948004, 51329736, 44447116, 37701544, 31399154, - 25736924, 20832988, 16723796, 13393488, 10776430, 8783249, 7304115, 6229334, - 5450365, 4874027, 4420041, 4029271, 3658127, 3282309, 2889391, 2480032, - 2060348, 1642421, 1237795, 858544, 512575, 205752, -60998, -288674, - -481834, -645256, -785054, -905653, -1011013, -1102347, -1179780, -1240896, - -1282805, -1301283, -1292960, -1254661, -1185341, -1085250, -957344, -806069, - -638185, -461195, -283738, -113885, 40607, 173836, 281340, 361227, - 413418, 440281, 445517, 434398, 412451, 385525, 358529, 335589, - 319068, 309999, 307515, 309612, 312947, 313829, 308220, 292759, - 264732, 222913, 167314, 99696, 23013, -58414, -139717, -215530, - -280898, -331372, -363803, -376281, -368659, -342216, -299851, -245477, - -183947, -120287, -59527, -210294, -218804, -207034, -170663, -107684, - -17542, 97483, 233628, 384636, 543572, 702055, 852320, 986414, - 1098210, 1182279, 1235630, 1256080, 1243695, 1198697, 1122785, 1016812, - 882318, 719277, 528144, 307851, 58485, -220576, -527549, -860384, - -1213683, -1581737, -1955989, -2329539, -2695405, -3052665, -3405215, -3769076, - -4170617, -4653891, -5276647, -6116192, -7261256, -8815022, -10881268, -13564073, - -16947616, -21093540, -26015144, -31675226, -37956612, -44665032, -51498380, -58060316, - -63829408, -68189520, -70395848, -69627624, -64938208, -55334156, -39669268, -16742548, - 15011598, 57892376, 121157856, 215274688, 334456672, 461378272, 576139200, 658546880, - 691230336, 661933376, 565469888, 404588960, 189999104, -60718748, -324979552, -577770304, - -794500352, -953869504, -1040332032, -1045906432, -971073600, -824675520, -622820672, -386923360, - -141145440, 90490632, 286893152, 432351840, 518213184, 543769536, 515984864, 448531552, - 359622208, 270636384, 198948336, 144668672, 100561448, 64293740, 34896780, 11649924, - -6117171, -19054578, -27836140, -33125540, -35583508, -35831208, -34449244, -31950346, - -28780702, -25304532, -21811144, -18510242, -15544263, -12991323, -10880449, -9198353, - -7904592, -6938712, -6232849, -5716818, -5326765, -5007114, -4715109, -4419761, - -4103101, -3757115, -3383050, -2987624, -2581751, -2177166, -1785567, -1416314, - -1076470, -769692, -497117, -257162, -46868, 137886, 301064, 446309, - 576003, 691438, 792390, 877665, 945087, 992265, 1016767, 1016861, - 991628, 941464, 867976, 774150, 663993, 542420, 414732, 286370, - 162380, 47204, -55707, -143950, -216326, -272693, -313915, -341561, - -357718, -364650, -364603, -359521, -350944, -339867, -326770, -311628, - -294057, -273429, -249069, -220397, -187092, -149183, -107127, -61803, - -14483, 33260, 79674, 122959, 161417, 193583, -137153, -86096, - -23462, 46165, 118296, 188311, 252569, 308033, 353183, 387345, - 411326, 426448, 434961, 438884, 440375, 440558, 440044, 437930, - 432614, 421046, 399869, 364878, 312384, 238720, 141646, 19702, - -126527, -295376, -483051, -684957, -894831, -1106337, -1312215, -1505978, - -1680884, -1831578, -1952736, -2040617, -2091372, -2102604, -2071473, -1996480, - -1875541, -1708206, -1493799, -1234127, -931547, -591976, -222473, 165877, - 561490, 950008, 1319512, 1659151, 1966270, 2245658, 2518227, 2819813, - 3210306, 3770160, 4608328, 5854141, 7662371, 10198175, 13638330, 18147660, - 23877010, 30930782, 39364468, 49144104, 60148836, 72123392, 84694024, 97312800, - 109298904, 119765360, 127705376, 131866912, 130934488, 123231464, 107234464, 75050672, - 9470806, -97677456, -239897616, -403333024, -569087680, -716066368, -823729024, -874943616, - -858298112, -769767616, -613463168, -401328448, -152012800, 111316600, 362752096, 579800640, - 754066560, 884317376, 967646720, 1002358976, 988932224, 930137792, 830908864, 698079680, - 539965760, 365883200, 185588480, 8720114, -155758112, -300047104, -417930816, -505075680, - -559213504, -580180096, -569826624, -531795520, -471193568, -394169856, -307444800, -217803664, - -131610264, -54348980, 9748328, 57999172, 89445504, 104945984, 107368432, 102279568, - 94596192, 85655480, 75877136, 65846368, 56016016, 46757852, 38321108, 30867838, - 24467266, 19124186, 14784349, 11357873, 8727069, 6764325, 5338255, 4325655, - 3614320, 3109507, 2733412, 2427369, 2148937, 1871452, 1580043, 1270071, - 943252, 606145, 267130, -64446, -380185, -672695, -936550, -1167777, - -1364195, -1524669, -1649207, -1738275, -1792904, -1814221, -1803670, -1762759, - -1693364, -1597596, -1478091, -1337881, -1180581, -1010189, -831132, -647987, - -465420, -287874, -119474, 36238, 176365, 298810, 402244, 486148, - 550683, 596630, 625208, 637968, 636614, 622900, 598511, 565006, - 523771, 476024, 422831, 365155, 303902, 239978, 174336, 108003, - 42099, -22177, -83566, -140800, -192647, -237981, -275829, -305435, - -326287, -338158, -341095, -335431, -321739, -300823, -273643, -241298, - -204944, -165780, -124974, -83660, -42880, 10137, 29849, 47985, - 63702, 76520, 86314, 93425, 98550, 102746, 107236, 113334, - 122202, 134769, 151505, 172398, 196816, 223585, 250966, 276853, - 298844, 314511, 321522, 317919, 302199, 273538, 231774, 177523, - 112040, 37218, -44643, -130911, -218896, -305922, -389579, -467717, - -538627, -600924, -653636, -695990, -727439, -747408, -755314, -750348, - -731559, -697715, -647504, -579487, -492405, -385195, -257342, -108895, - 59211, 245234, 446381, 659034, 878627, 1100007, 1317397, 1524851, - 1716231, 1885675, 2027510, 2136678, 2208531, 2239209, 2225330, 2164370, - 2054318, 1894140, 1683476, 1423258, 1115462, 763860, 373717, -47467, - -490570, -944379, -1396841, -1835173, -2248037, -2626382, -2966637, -3272111, - -3556917, -3847305, -4185583, -4630274, -5258922, -6165632, -7461554, -9268313, - -11715324, -14927984, -19021866, -24085232, -30171698, -37277344, -45335748, -54189964, - -63598244, -73198584, -82549584, -91078392, -98377112, -103118416, -100391208, -84628624, - -52954552, -4492618, 59827860, 137363792, 223933312, 314109568, 401591168, 479653696, - 541630720, 581410176, 593897728, 575427264, 524078976, 439891712, 324946016, 183315184, - 20883088, -154960944, -335730752, -512333504, -675605952, -816870016, -928462720, -1004220224, - -1039868736, -1033319296, -984830528, -897064000, -775182272, -627308096, -461708352, -284291552, - -100579392, 83598736, 262525088, 430732416, 583209600, 715532736, 824009920, 905775040, - 958871552, 982291840, 975995776, 940888192, 878773504, 792274432, 684731072, 560072576, - 422675872, 277208288, 128466608, -18787604, -159985744, -290901824, -407785088, -507474624, - -587489088, -646091776, -682326144, -696024192, -687785152, -658928000, -611418688, -547776704, - -470963680, -384259392, -291130144, -195094672, -99592464, -7860071, 77180528, 153017120, - 217622960, 269510560, 307761952, 332035072, 342546656, 340033376, 325693088, 301109632, - 268164672, 228941216, 185622192, 140390128, 95330560, 52345244, 13076479, -21151680, - -49376268, -71017224, -85881800, -94147080, -96327536, -93222768, -85856648, -75400496, - -63097824, -50176000, -37774988, -26857674, -18169908, -11863887, -7301392, -3914018, - -1479242, 185291, 1236420, 1817970, 2053955, 2052907, 1903852, 1679448, - 1434536, 1209401, 1029974, 911183, 857962, 868350, 934655, 1046022, - 1189342, 1351150, 1518125, 1678330, 1821294, 1938725, 2024278, 2073883, - 2085335, 2058391, 1994281, 1895693, 1766278, 1610593, 1433645, 1240831, - 1037545, 829139, 620601, 416556, 221024, 37473, -131344, -283279, - -416878, -531220, -625958, -701127, -757159, -794697, -814605, -817824, - -805400, -778384, -737905, -685103, -621229, -547610, -465741, -377252, - -283979, -187900, -91166, 4001, 95326, 180608, 257764, 324972, - 380709, 423871, 453787, 470280, 473637, 464613, 444338, 414280, - 376112, 331644, 282692, 231012, 178188, 125609, 74399, 25440, - -20646, -63433, -102670, -138199, -169921, -197722, -221454, -240892, - -255747, -265667, -270281, -269233, -262252, -249189, -230092, -205221, - -175099, -140492, -102411, -62059, -20785, 19997, 58880, 94556, - 125879, 151942, 172113, 186075, 193810, 195596, 191955, 183604, - 171377, 156168, 138843, 120200, 100900, 81458, 62216, 43368, - 24971, 6998, -10624, -27957, -45013, -61705, -77836, -93079, - -106999, -119067, -128714, -135370, -138532, -137806, -132971, -123999, - -111091, -94667, -75361, -53969, 10765, 32074, 52722, 72311, - 90486, 106963, 121523, 134027, 144392, 152600, 158658, 162605, - 164468, 164267, 161985, 157577, 150955, 142011, 130615, 116649, - 100019, 80692, 58704, 34200, 7431, -21221, -51265, -82083, - -112977, -143167, -171845, -198187, -221409, -240776, -255657, -265518, - -269970, -268744, -261725, -248915, -230452, -206572, -177616, -143996, - -106204, -64784, -20348, 26444, 74865, 124130, 173377, 221686, - 268054, 311432, 350709, 384766, 412472, 432751, 444591, 447117, - 439606, 421553, 392681, 352994, 302769, 242592, 173323, 96118, - 12366, -76299, -168083, -261025, -353085, -442152, -526117, -602884, - -670441, -726859, -770364, -799329, -812348, -808221, -786031, -745129, - -685209, -606288, -508783, -393474, -261578, -114689, 45155, 215561, - 393723, 576534, 760547, 942104, 1117306, 1282158, 1432549, 1564416, - 1673729, 1756688, 1809722, 1829726, 1814087, 1760970, 1669365, 1539414, - 1372449, 1171316, 940345, 685584, 414591, 136477, -138614, -399774, - -636264, -838162, -997771, -1110606, -1177191, -1204204, -1206433, -1207707, - -1242622, -1356751, -1607660, -2063815, -2804506, -3917005, -5495374, -7636020, - -10436517, -13992514, -18402674, -23818388, -30616280, -38795064, -47468192, -55465196, - -61624760, -64816688, -64030596, -58439904, -47471160, -30852034, -8650500, 18708296, - 50440096, 85421744, 122227560, 159185040, 194443776, 226058080, 252076752, 270638720, - 280067616, 278963616, 266285680, 241422224, 204245248, 155146128, 95049592, 25405990, - -51839956, -134302160, -219227456, -303587872, -384188544, -457786240, -521215424, -571515392, - -606054656, -622647040, -619654592, -596072512, -551593600, -486646944, -402411264, -300798944, - -184413264, -56477480, 79260352, 218645328, 357251200, 490529920, 613968768, 723250432, - 814409344, 883978944, 929123648, 947751552, 938601472, 901303104, 836405248, 745373248, - 630551936, 495099232, 342887840, 178382704, 6494100, -167583760, -338549120, -501169472, - -650463872, -781868416, -891402304, -975790912, -1032769600, -1061261696, -1060915456, -1031960960, - -975385600, -892916224, -786977856, -660620736, -517435968, -361449888, -197010624, -28662768, - 138980608, 301369056, 454141632, 593248768, 715063168, 816478784, 894992576, 948769664, - 976686784, 978356608, 954128576, 905069824, 832924288, 740053568, 629360000, 504194944, - 368255424, 225472400, 79893288, -64436384, -203589744, -333869568, -451910592, -554770112, - -640004160, -705727744, -750656768, -774131456, -776120512, -757206720, -718553856, -661857536, - -589281088, -503378688, -407008864, -303241088, -195258304, -86258672, 20640266, 122492392, - 216605760, 300615264, 372542752, 430843584, 474437952, 502727104, 515593600, 513386816, - 496894016, 467298720, 426127872, 375190336, 316508064, 252243568, 184625248, 115873648, - 48130852, -16604751, -76536328, -130117360, -176090096, -213512624, -241774240, -260598816, - -270036736, -270445792, -262462656, -246965456, -225030192, -197881696, -166842016, -133277536, - -98547200, -63953468, -30697916, 157309, 27720696, 51294532, 70389352, 84729480, - 94249824, 99084304, 99546808, 96105616, 89352656, 79969008, 68688296, 56259452, - 43410724, 30816176, 19066356, 8644033, -93590, -6926218, -11773978, -14694671, - -15872813, -15605618, -14280676, -12378042, -10430668, -8704424, -7182491, -5854782, - -4729147, -3804335, -3072066, -2516383, -2116394, -1847634, -1684290, -1600530, - -1572012, -1576721, -1595767, -1613665, -1618550, -1602016, -1558925, -1486975, - -1386301, -1258946, -1108416, -939180, -756297, -565028, -370575, -177839, - 8715, 185182, 348246, 495214, 623986, 733038, 821363, 888436, - 934161, 958831, 963086, 947887, 914478, 864367, 799293, 721209, - 632236, 534643, 430794, 323115, 214029, 105923, 1076, -98376, - -190504, -273617, -346304, -407458, -456294, -492355, -515505, -525917, - -524051, -510616, -486547, -452951, -411079, -362277, -307954, -249541, - -188465, -126117, -63839, -2894, 55536, 110376, 160649, 205502, - 244200, 276144, 300872, 318070, 327574, 329385, 323660, 310724, - 291059, 265298, 234214, 198698, 159739, 118393, 75754, 32922, - -9033, -49104, -86375, -120044, -149449, -174076, -193569, -207727, - -216503, -219983, -218381, -212007, -201261, -186599, -168524, -147564, - -124261, -99161, -72807, -45733, -18468, 8473, 34584, 59372, - 82359, 103090, 121141, 136131, 147730, 155680, 159803, 160015, - 156337, 148897, 137934, 123794, 106916, 87821, 67091, 45345, - 23216, 1326, -19743, -39465, 109887, 120382, 128416, 133765, - 136261, 135794, 132320, 125859, 116497, 104388, 89749, 72858, - 54047, 33695, 12222, -9922, -32266, -54329, -75626, -95683, - -114044, -130284, -144009, -154878, -162593, -166923, -167696, -164811, - -158239, -148026, -134294, -117244, -97153, -74370, -49314, -22469, - 5628, 34390, 63198, 91407, 118365, 143426, 165965, 185395, - 201183, 212860, 220042, 222435, 219848, 212195, 199508, 181929, - 159715, 133233, 102952, 69434, 33331, -4639, -43696, -83016, - -121744, -159013, -193957, -225733, -253530, -276597, -294249, -305894, - -311042, -309326, -300512, -284516, -261407, -231423, -194963, -152600, - -105060, -53228, 1881, 59128, 117284, 175043, 231069, 284005, - 332527, 375354, 411300, 439283, 458370, 467783, 466935, 455431, - 433101, 399985, 356360, 302726, 239820, 168592, 90219, 6068, - -82296, -173156, -264641, -354785, -441533, -522811, -596538, -660703, - -713385, -752830, -777471, -786003, -777391, -750944, -706300, -643488, - -562898, -465330, -351937, -224267, -84196, 66044, 223948, 386697, - 551263, 714370, 872609, 1022412, 1160192, 1282340, 1385409, 1466141, - 1521718, 1549819, 1548936, 1518450, 1458982, 1372447, 1262386, 1133907, - 993924, 850871, 714752, 596518, 507835, 460031, 463573, 526525, - 653821, 845263, 1094812, 1388217, 1702729, 2004387, 2248836, 2377871, - 2322716, 1997670, 1310909, 31361, -2276023, -5884963, -10790734, -16840258, - -23748608, -31120974, -38472224, -45255760, -50892408, -54804412, -56448304, -55348896, - -51129788, -43541476, -32483506, -18021422, -395893, 19975162, 42503072, 66442420, - 90913264, 114929960, 137436576, 157346768, 173587488, 185144144, 191106144, 190710336, - 183381248, 168765648, 146760624, 117533176, 81530704, 39481248, -7616625, -58514600, - -111745512, -165663824, -218494432, -268388400, -313484064, -351971232, -382156480, -402527424, - -411813344, -409040128, -393577504, -365176384, -323994752, -270611200, -206024384, -131639056, - -49237472, 39062252, 130860688, 223542656, 314352192, 400474784, 479124064, 547630784, - 603530816, 644649344, 669178624, 675746624, 663473536, 632014912, 581589056, 512987520, - 427568224, 327230528, 214373088, 91835128, -37177272, -169178032, -300498464, -427392512, - -546146752, -653191616, -745210944, -819245440, -872788352, -903868288, -911118272, -893827520, - -851974272, -786238976, -697996288, -589286400, -462766208, -321640832, -169578832, -10611593, - 150978672, 310780032, 464377088, 607478720, 736043264, 846397952, 935348160, 1000273472, - 1039207744, 1050900416, 1034856960, 991357632, 921452992, 826937088, 710298944, 574652800, - 423651328, 261382080, 92266240, -79072984, -248102448, -410503776, -562126720, -699092736, - -817911936, -915573376, -989624896, -1038234688, -1060238592, -1055167808, -1023259008, -965445760, - -883330880, -779142016, -655670144, -516193728, -364390176, -204236960, -39905496, 124349848, - 284304192, 435873248, 575219968, 698854144, 803721536, 887281600, 947570240, 983247040, - 993625152, 978684224, 939064256, 876042880, 791495168, 687838208, 567961280, 435144608, - 292968064, 145212944, -4240369, -151516576, -292848000, -424673056, -543728192, -647130176, - -732447680, -797759168, -841696640, -863474048, -862898880, -840368384, -796849536, -733844032, - -653339328, -557747648, -449833824, -332635680, -209377712, -83381528, 42024892, 163596368, - 278255872, 383173696, 475838368, 554117568, 616307264, 661168640, 687951104, 696401792, - 686761024, 659744256, 616512064, 558627584, 488004704, 406847392, 317582464, 222787984, - 125119136, 27233782, -68280144, -158973472, -242598960, -317167264, -380994112, -432737696, - -471425664, -496470656, -507674976, -505223904, -489668640, -461899200, -423108800, -374750624, - -318488480, -256143216, -189636144, -120931576, -51979948, 15336795, 79255984, 138179872, - 190714864, 235703648, 272249056, 299729728, 317807040, 326423456, 325792768, 316382656, - 298890368, 274212512, 243410272, 207670816, 168266608, 126513920, 83731472, 41200944, - 130175, -38379756, -73362784, -104010672, -129689920, -149952464, -164540112, -173382736, - -176590656, -174441552, -167362736, -155909328, -140739472, -122587248, -102234616, -80482928, - -58125464, -35921428, -14572560, 5297181, 23158150, 38587464, 51277008, 61037024, - 67795232, 71591800, 72570464, 70966328, 67090884, 61315048, 54050700, 45731812, - 36795552, 27664472, 18730052, 10338603, 2779584, -3722787, -9014984, -13015846, - -15715349, -17169656, -17493876, -16851572, -15443180, -13491852, -11229971, -8883501, - -6659666, -4731320, -3230436, -2179638, -1456508, -951706, -619736, -422906, - -328742, -307762, -334784, -388143, -450439, -507929, -550755, -572282, - -568989, -539768, -485654, -409163, -313997, -204481, -85334, 38748, - 163232, 284008, 397435, 500481, 590686, 666220, 725799, 768696, - 794640, 803805, 796717, 774237, 737483, 687817, 626774, 556060, - 477482, 392946, 304395, 213796, 123081, 34130, -51284, -131518, - -205101, -270753, -327424, -374293, -410797, -436619, -451696, -456198, - -450524, -435265, -411195, -379231, -340412, -295864, -246780, -194382, - -139908, -84576, -29579, 23948, 74940, 122415, 165488, 203392, - 235477, 261232, 280287, 292420, 297563, 295805, 287381, 272679, - 252217, 226642, 196699, 163225, 127113, 89298, 50723, 12319, - -25022, -60468, -93267, -122762, -148403, -169755, -186505, -198455, - -205529, -207755, -205269, -198296, -187147, -172200, -153899, -132733, - -109235, -83965, -57505, -30448, -3387, 23090, 48419, 72062, - 93519, 112344, 128152, 140629, 149540, 154739, 156171, 153875, - 147984, 138721, 126390, 111370, 94099, 75064, 54779, 33779, - 12593, -8262, -28303, -47084, 123494, 129971, 133493, 133924, - 131201, 125331, 116398, 104559, 90037, 73124, 54170, 33578, - 11793, -10702, -33406, -55797, -77356, -97567, -115939, -132009, - -145355, -155607, -162458, -165670, -165080, -160609, -152268, -140154, - -124457, -105454, -83508, -59060, -32622, -4767, 23884, 52680, - 80946, 108005, 133192, 155874, 175459, 191418, 203293, 210711, - 213394, 211167, 203964, 191828, 174916, 153495, 127939, 98723, - 66416, 31667, -4798, -42202, -79720, -116501, -151685, -184419, - -213882, -239294, -259946, -275209, -284560, -287590, -284024, -273728, - -256722, -233178, -203429, -167959, -127402, -82528, -34229, 16495, - 68562, 120826, 172104, 221199, 266929, 308151, 343787, 372847, - 394455, 407868, 412493, 407908, 393872, 370338, 337461, 295599, - 245318, 187388, 122773, 52620, -21757, -98901, -177232, -255084, - -330731, -402431, -468456, -527135, -576892, -616284, -644032, -659054, - -660495, -647746, -620468, -578601, -522379, -452338, -369318, -274467, - -169243, -55405, 64986, 189594, 315816, 440826, 561623, 675096, - 778120, 867669, 940959, 995619, 1029881, 1042792, 1034432, 1006137, - 960689, 902497, 837686, 774157, 721490, 690799, 694367, 745251, - 856581, 1040935, 1309312, 1670468, 2129651, 2688819, 3345656, 4105519, - 4976393, 5840188, 6459558, 6619945, 6147045, 4905821, 2810464, -169248, - -4002855, -8597662, -13799897, -19399282, -25136440, -30713178, -35805064, -40075928, - -43193604, -44846368, -44759276, -42709760, -38541820, -32178052, -23629058, -12999656, - -491521, 13597969, 28880844, 44887552, 61079704, 76866240, 91622528, 104711816, - 115508400, 123421568, 127919688, 128553392, 124977088, 116967832, 104440944, 87461480, - 66251100, 41189824, 12812431, -18200672, -51037968, -84776544, -118406512, -150859520, - -181040640, -207862576, -230281344, -247332144, -258164320, -262074240, -258534976, -247221616, - -228031216, -201096704, -166793872, -125740976, -78790864, -27015406, 28317512, 85773968, - 143790256, 200714592, 254853088, 304518720, 348082144, 384022272, 410975936, 427784064, - 433533952, 427595232, 409648832, 379707872, 338129120, 285614880, 223204848, 152257552, - 74422120, -8399482, -94098672, -180413920, -264990464, -345444480, -419429888, -484706304, - -539205312, -581094272, -608834752, -621234048, -617488768, -597217728, -560484416, -507806784, - -440154880, -358935456, -265963920, -163424032, -53816484, 60102860, 175393008, 289004832, - 397862624, 498948160, 589385088, 666520704, 728003904, 771855360, 796529472, 800965376, - 784625088, 747518528, 690213376, 613829888, 520020448, 410934048, 289166720, 157698512, - 19819390, -120954952, -260974400, -396551008, -524057792, -640027584, -741248576, -824854336, - -888405760, -929962176, -948139904, -942156672, -911859520, -857736896, -780912768, -683123584, - -566678912, -434405344, -289576544, -135830144, 22925716, 182614304, 339097376, 488284896, - 626244608, 749307648, 854168576, 937975616, 998409984, 1033750912, 1042925056, 1025539008, - 981893504, 912979136, 820453376, 706599552, 574268864, 426807104, 267967136, 101810936, - -67397744, -235305840, -397586848, -550055296, -688779008, -810183040, -911146880, -989084800, - -1042054592, -1068829184, -1068826112, -1042089792, -989328512, -911898304, -811770624, -691481728, - -554069376, -402995648, -242059584, -75301504, 93098968, 258928160, 418044256, 566481536, - 700549504, 816925696, 912738304, 985637504, 1033853888, 1056241408, 1052304960, 1022211200, - 966782848, 887476096, 786342208, 665974016, 529439200, 380201408, 222031488, 58911676, - -105065728, -265801808, -419294496, -561739072, -689623232, -799814720, -889638656, -956942720, - -1000149696, -1018294336, -1011044736, -978708096, -922219648, -843115968, -743493120, -625951040, - -493525056, -349607232, -197858608, -42115448, 113708584, 265721584, 410151424, 543440192, - 662332480, 763955904, 845890496, 906227200, 943612480, 957278400, 947058112, 913385664, - 857280704, 780318336, 684585088, 572622656, 447359776, 312035584, 170115056, 25199920, - -119063552, -259076960, -391380192, -512737632, -620217856, -711264960, -783759808, -836069184, - -867082944, -876236800, -863521472, -829477248, -775175296, -702184896, -612528832, -508627616, - -393234080, -269360256, -140198384, -9038325, 120816904, 246134720, 363834016, 471061440, - 565260864, 644234816, 706195520, 749805696, 774206528, 779033856, 764420928, 730989120, - 679825600, 612449984, 530770240, 437028800, 333741664, 223630656, 109551536, -5580210, - -118864264, -227488864, -328800992, -420371296, -500052800, -566030976, -616865088, -651519232, - -669382144, -670276608, -654456960, -622595968, -575760768, -515379648, -443199648, -361236896, - -271720576, -177032864, -79645232, 17945830, 113283088, 204010512, 287931712, 363063040, - 427680576, 480359328, 520004224, 545871936, 557583232, 555125952, 538848000, 509441632, - 467918976, 415579744, 353972064, 284847840, 210113616, 131778400, 51899980, -27469024, - -104333832, -176807568, -243157520, -301846336, -351567360, -391273184, -420196800, -437865024, - -444103968, -439036576, -423072480, -396890720, -361415584, -317786848, -267324960, -211492304, - -151851792, -90023688, -27642056, 33688092, 92431824, 147162464, 196595872, 239620272, - 275320544, 302996800, 322176864, 332622304, 334328064, 327516064, 312622880, 290282112, - 261301872, 226638432, 187366672, 144647984, 99697160, 53748436, 8022341, -36306296, - -78138080, -116475864, -150447968, -179327376, -202546304, -219706160, -230582416, -235124880, - -233452928, -225846496, -212732912, -194670144, -172327120, -146461568, -117896304, -87494416, - -56134348, -24685366, 6015840, 35186796, 62118600, 86192504, 106893400, 123819856, - 136690672, 145347696, 149755152, 149995552, 146262368, 138849824, 128140336, 114589888, - 98711832, 81059840, 62210316, 42744900, 23233612, 4218996, -13798199, -30371520, - -45119144, -57731856, -67978520, -75708944, -80854288, -83424880, -83505872, -81250776, - -76873240, -70637384, -62847076, -53834452, -43948188, -33541804, -22962404, -12540202, - -2579104, 6651381, 14922708, 22052188, 27906138, 32401252, 35504228, 37229756, - 37636996, 36824736, 34925464, 32098614, 28523208, 24390258, 19895138, 15230230, - 10578097, 6105390, 1957699, -1744518, -4908812, -7472372, -9402388, -10695210, - -11374340, -11487438, -11102430, -10302999, -9183557, -7844043, -6384651, -4900844, - -3478715, -2191066, -1094124, -225317, 398208, 779956, 943926, 936293, - 833844, 703157, 565034, 427621, 299915, 188242, 97070, 28671, - -16282, -38631, -40246, -23848, 7370, 49924, 100305, 155103, - 211184, 265743, 316398, 361188, 398601, 427542, 447320, 457596, - 458351, 449838, 432541, 407131, 374438, 335404, 291067, 242523, - 190911, 137380, 83081, 29131, -23391, -73477, -120193, -162709, - -200302, -232373, -258456, -278222, -291483, -298191, -298431, -292422, - -280496, -263099, -240767, -214119, -183837, -150654, -115335, -78667, - -41439, -4430, 31603, 65943, 97920, 126924, 152420, 173951, - 191152, 203753, 211586, 214590, 212809, 206390, 195581, 180724, - 162245, 140642, 116472, 90338, 62871, 34716, 6512, -21115, - -47577, -72327, -94874, -114790, -131717, -145374, -155554, -162130, - -165050, -164338, -160089, -152466, -141696, -128062, -111900, -93592, - -73557, -52247, -30134, -7706, 14546, 36139, 56604, 75501, - 92426, 107025, 118997, 128106, 134187, 137146, 136964, 133700, - 127480, 118502, 107020, 93345, 116040, 106373, 94004, 79158, - 62121, 43240, 22912, 1579, -20281, -42169, -63569, -83966, - -102856, -119760, -134234, -145882, -154369, -159426, -160859, -158557, - -152493, -142728, -129410, -112770, -93122, -70853, -46417, -20326, - 6860, 34548, 62118, 88942, 114393, 137861, 158767, 176575, - 190802, 201034, 206937, 208261, 204852, 196660, 183736, 166241, - 144442, 118709, 89511, 57407, 23039, -12886, -49603, -86311, - -122184, -156394, -188125, -216596, -241075, -260902, -275496, -284383, - -287194, -283688, -273753, -257415, -234835, -206316, -172290, -133320, - -90085, -43369, 5950, 56922, 108538, 159746, 209478, 256659, - 300236, 339190, 372562, 399462, 419103, 430808, 434043, 428427, - 413772, 390087, 357626, 316892, 268676, 214058, 154439, 91515, - 27295, -35962, -95765, -149503, -194502, -228208, -248287, -252875, - -240711, -211453, -165805, -105883, -35276, 40539, 114314, 176503, - 215759, 217978, 167946, 29216, -265669, -759935, -1454826, -2329191, - -3341857, -4434792, -5535889, -6563153, -7428902, -8044769, -8326572, -8199427, - -7602384, -6492797, -4849871, -2677498, -5997, 3107152, 6577829, 10296906, - 14133125, 17937022, 21545892, 24789544, 27496750, 29502072, 30652904, 30816402, - 29886096, 27787848, 24484978, 19982264, 14328683, 7618649, -8275, -8369346, - -17242212, -26370120, -35468600, -44233488, -52350068, -59503100, -65387360, -69718488, - -72243656, -72751784, -71082920, -67136432, -60877660, -52342804, -41641768, -28958772, - -14550630, 1257369, 18077938, 35470524, 52952152, 70010080, 86115976, 100741256, - 113373128, 123530864, 130781872, 134756976, 135164528, 131802696, 124569704, 113471440, - 98626208, 80266312, 58736392, 34488268, 8072537, -19873172, -48638900, -77459776, - -105535736, -132052984, -156206736, -177224544, -194389536, -207063008, -214705568, -216896176, - -213348592, -203924480, -188642880, -167685488, -141397504, -110283944, -75001352, -36344852, - 4768980, 47323316, 90225720, 132335712, 172494592, 209556688, 242421216, 270063936, - 291567712, 306150848, 313192864, 312256320, 303104480, 285713824, 260281152, 227224928, - 187180496, 140989248, 89681992, 34456540, -23349740, -82291968, -140853584, -197485040, - -250644464, -298839136, -340666720, -374855200, -400300192, -416098816, -421578912, -416322848, - -400184960, -373302304, -336098016, -289277056, -233814336, -170935472, -102090216, -28919474, - 46783608, 123117448, 198119696, 269817600, 336279616, 395667328, 446285568, 486630272, - 515431904, 531693952, 534724512, 524161024, 499986336, 462536352, 412498304, 350899776, - 279088736, 198704400, 111640296, 19999716, -73955136, -167859072, -259303504, -345898400, - -425334720, -495445856, -554266496, -600087168, -631503040, -647455744, -647266496, -630660352, - -597779904, -549188672, -485863232, -409174688, -320859648, -222981056, -117879984, -8119592, - 103577704, 214398032, 321507232, 422123680, 513590720, 593446784, 659491904, 709847616, - 743010112, 757894080, 753866240, 730767680, 688924608, 629145984, 552709376, 461334048, - 357142464, 242611072, 120511064, -6158985, -134247200, -260527344, -381780576, -494877952, - -596861632, -685022336, -756971776, -810707072, -844666432, -857773504, -849470528, -819737792, - -769099840, -698617600, -609866880, -504903104, -386213792, -256659104, -119402648, 22166518, - 164518080, 304069184, 437275360, 560721088, 671207872, 765837888, 842089984, 897887232, - 931653440, 942357376, 929543168, 893346752, 834496704, 754300416, 654615040, 537804480, - 406682912, 264446352, 114594352, -39157032, -192968032, -342971968, -485373120, -616543680, - -733116800, -832073664, -910822080, -967264896, -999856064, -1007642752, -990292800, -948106752, - -882013184, -793548800, -684822016, -558462848, -417558400, -265576992, -106281872, 56362708, - 218291040, 375438528, 523844608, 659753344, 779709440, 880646656, 959966976, 1015607872, - 1046096320, 1050588096, 1028890880, 981471296, 909444864, 814549696, 699104192, 565949568, - 418379808, 260058736, 94928648, -72889120, -239197984, -399832192, -550762240, -688196992, - -808680064, -909177600, -987155392, -1040643904, -1068288256, -1069383232, -1043891456, -992444800, - -916328960, -817451520, -698297344, -561877056, -411613792, -251225136, -84665176, 83959240, - 250492800, 410833184, 561032192, 697392512, 816558400, 915598016, 992075520, 1044110528, - 1070424512, 1070372096, 1043956672, 991830592, 915278784, 816187328, 696996800, 560642560, - 410482208, 250213232, 83781792, -84714288, -251126384, -411357152, -561461504, -697743552, - -816847808, -915841536, -992287296, -1044302592, -1070606528, -1070551232, -1044137856, -992016512, - -915470336, -816383744, -697196352, -560842560, -410679552, -250404528, -83963680, 84544936, - 250972336, 411220768, 561344576, 697647424, 816773248, 915788800, 992256192, 1044292480, - 1070616448, 1070579840, 1044183488, 992077376, 915544384, 816468800, 697290112, 560942720, - 410783712, 250510352, 84068912, -84442472, -250874656, -411129728, -561261824, -697574272, - -816710848, -915738048, -992217536, -1044266240, -1070602624, -1070578112, -1044193344, -992097920, - -915574656, -816507712, -697336256, -560994752, -410840192, -250569808, -84129840, 84381496, - 250815008, 411072672, 561208512, 697525760, 816667968, 915701504, 992187968, 1044243968, - 1070587840, 1070570944, 1044193664, 992105472, 915588992, 816528256, 697362432, 561025728, - 410875072, 250607648, 84169704, -84340632, -250774144, -411032768, -561170496, -697490560, - -816636288, -915674048, -992165248, -1044226432, -1070575744, -1070564352, -1044192576, -992109760, - -915598336, -816542272, -697380608, -561047424, -410899648, -250634432, -84197944, 84311648, - 250745136, 411004448, 561143488, 697465472, 816613632, 915654272, 992148736, 1044213504, - 1070566592, 1070559104, 1044191232, 992112320, 915604608, 816552064, 697393600, 561063296, - 410917984, 250654720, 84219640, -84289112, -250722352, -410981984, -561121984, -697445376, - -816595520, -915638656, -992135872, -1044203776, -1070560128, -1070556032, -1044191616, -992116032, - -915611456, -816561792, -697405888, -561077696, -410934112, -250672080, -84237752, 84270736, - 250704176, 410964480, 561105536, 697430400, 816582400, 915627520, 992127104, 1044197440, - 1070556416, 1070555008, 1044193216, 992120256, 915618176, 816570816, 697417024, 561090688, - 410948576, 250687680, 84254088 -}; - -#endif diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index e90ae83ac..85bd01c21 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -87,7 +87,6 @@ extern const uint16_t ECSQ_tab_inverse[1 + ECSQ_SEGMENT_SIZE]; *----------------------------------------------------------------------------------*/ extern const float ica_sincInterp2[]; -extern const Word32 ica_sincInterp2_fx[]; extern const float ica_sincInterp4[]; extern const float ica_sincInterp6[]; @@ -96,38 +95,17 @@ extern const float ica_sincInterp6[]; *----------------------------------------------------------------------------------*/ extern const float icbwe_gsMapping_tbl[]; -extern const Word16 pow_10_icbwe_gsMapping_tbl_fx[]; extern const float icbwe_gsMappingDFT_tbl[]; -extern const Word16 pow_10_icbwe_gsMappingDFT_tbl_fx[]; /*----------------------------------------------------------------------------------* * TD Stereo ROM tables *----------------------------------------------------------------------------------*/ extern const float tdm_ratio_tabl[]; -extern const UWord32 tdm_ratio_tabl_fx[TDM_NQ + 1]; extern const float tdm_den_ratio_tabl[]; -extern const UWord32 tdm_den_ratio_tabl_fx[]; extern const int16_t tdm_bit_allc_tbl[5][6]; /* LSFs Intra-frame prediction tables */ -#ifdef IVAS_FLOAT_FIXED -extern const Word16 tdm_LSF_MEAN_RE_USE_OUT_fx[M]; -extern const Word16 tdm_LSF_MEAN_RE_USE_IN_fx[M]; -extern const Word16 tdm_LSF_MEAN_RE_USE_fx[M]; - -extern const Word16 tdm_Beta_Q1bit_re_use_13k2_fx[2]; -extern const Word16 tdm_Beta_Q1bit_re_use_16k4_fx[2]; -extern const Word16 tdm_Beta_Q1bit_re_use_24k4_32k_fx[2]; -extern const Word16 tdm_Beta_Q1bit_re_use_48k_fx[2]; - -extern const Word16 tdm_RE_USE_adaptive_beta_prd_diag_3_fx[15 + 16 + 15]; - -extern const Word16 tdm_LSF_MEAN_PRED_QNT_OUT_fx[M]; -extern const Word16 tdm_LSF_MEAN_PRED_QNT_IN_fx[M]; -extern const Word16 tdm_LSF_MEAN_PRED_QNT_fx[M]; -extern const Word16 tdm_PRED_QNT_fixed_beta_prd_diag_3_fx[15 + 16 + 15]; -#endif extern const float tdm_LSF_MEAN_RE_USE_OUT[M]; extern const float tdm_LSF_MEAN_RE_USE_IN[M]; extern const float tdm_LSF_MEAN_RE_USE[M]; @@ -166,22 +144,12 @@ extern const float dft_cng_coh_pred[][STEREO_DFT_COH_PRED_COEFFS]; extern const int16_t dft_cng_coh_u2i[9]; extern const int16_t dft_cng_coh_i2u[9]; extern const float dft_cng_alpha_bits[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_COH_ALPHA_LEVELS]; -#ifdef IVAS_FLOAT_FIXED -extern const Word16 dft_cng_alpha_bits_fx[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_COH_ALPHA_LEVELS]; -extern const Word16 dft_cng_coh_pred_fx[][STEREO_DFT_COH_PRED_COEFFS]; -#endif // IVAS_FLOAT_FIXED extern const int16_t dft_cng_coh_alpha_start[STEREO_DFT_N_COH_ALPHA_STEPS - 1]; /*----------------------------------------------------------------------------------* * DirAC ROM tables *----------------------------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED -extern const Word32 diffuseness_reconstructions_fx[DIRAC_DIFFUSE_LEVELS]; -extern const Word32 diffuseness_thresholds_fx[DIRAC_DIFFUSE_LEVELS + 1]; -extern const Masa_Diffuseness_Ratios masa_diffuse_ratios[DIRAC_DIFFUSE_LEVELS][DIRAC_DIFFUSE_LEVELS]; -#endif - extern const float diffuseness_reconstructions[DIRAC_DIFFUSE_LEVELS]; extern const float diffuseness_thresholds[DIRAC_DIFFUSE_LEVELS + 1]; extern const int16_t DirAC_band_grouping_12[12 + 1]; @@ -215,12 +183,10 @@ extern const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH]; extern const int16_t HOA_keep_ind_spar512[IVAS_SPAR_MAX_CH]; extern const float dtx_pd_real_min_max[2]; -extern const Word32 dtx_pd_real_min_max_fx[2]; extern const int16_t dtx_pd_real_q_levels[3][3]; extern const int16_t dtx_pr_real_q_levels[3][3]; extern const int16_t pr_pr_idx_pairs[3][3][2]; extern const int16_t pr_pd_idx_pairs[3][3][2]; -extern const Word32 one_by_q_level[64]; /*----------------------------------------------------------------------* * PCA ROM tables @@ -254,8 +220,6 @@ extern const int16_t Param_MC_index[MAX_CICP_CHANNELS]; extern const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS]; extern const float ivas_param_mc_quant_ild_5d1_48[PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; extern const float ivas_param_mc_quant_icc[PARAM_MC_SZ_ICC_QUANTIZER]; -extern const Word16 ivas_param_mc_quant_ild_5d1_48_fx[PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; -extern const Word16 ivas_param_mc_quant_icc_fx[PARAM_MC_SZ_ICC_QUANTIZER]; extern const uint16_t ivas_param_mc_cum_freq_ild_cicp6_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS + 1]; extern const uint16_t ivas_param_mc_sym_freq_ild_cicp6_48_16bits[PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; extern const uint16_t ivas_param_mc_cum_freq_ild_delta_cicp6_48_16bits[2 * PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; @@ -301,14 +265,6 @@ extern const int16_t bits_direction_masa[DIRAC_DIFFUSE_LEVELS]; extern const int16_t no_theta_masa[NO_SPHERICAL_GRIDS - 2]; extern const int16_t no_phi_masa[NO_SPHERICAL_GRIDS][MAX_NO_THETA]; -#ifdef IVAS_FLOAT_FIXED -extern const Word32 no_phi_masa_inv_fx[NO_SPHERICAL_GRIDS][MAX_NO_THETA]; -extern const Word32 azimuth_cb_fx[8]; -extern const Word32 delta_theta_masa_fx[NO_SPHERICAL_GRIDS - 2]; -extern const Word32 coherence_cb0_masa_fx[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH]; -extern const Word32 coherence_cb1_masa_fx[MASA_NO_CV_COH1 * MASA_MAXIMUM_CODING_SUBBANDS]; /* 25 */ -#endif - extern const float delta_theta_masa[NO_SPHERICAL_GRIDS - 2]; extern const float azimuth_cb[8]; @@ -356,30 +312,9 @@ extern const float ls_azimuth_CICP16[9]; extern const float ls_elevation_CICP16[9]; extern const float ls_azimuth_CICP19[11]; extern const float ls_elevation_CICP19[11]; -#ifdef IVAS_FLOAT_FIXED -extern const Word16 ls_azimuth_CICP2_idx[2]; -extern const Word16 ls_elevation_CICP2_idx[2]; -extern const Word16 ls_azimuth_CICP6_idx[5]; -extern const Word16 ls_elevation_CICP6_idx[5]; -extern const Word16 ls_azimuth_CICP12_idx[7]; -extern const Word16 ls_elevation_CICP12_idx[7]; -extern const Word16 ls_azimuth_CICP14_idx[7]; -extern const Word16 ls_elevation_CICP14_idx[7]; -extern const Word16 ls_azimuth_CICP16_idx[9]; -extern const Word16 ls_elevation_CICP16_idx[9]; -extern const Word16 ls_azimuth_CICP19_idx[11]; -extern const Word16 ls_elevation_CICP19_idx[11]; extern const float shoebox_sin_cos_tbl[11][2]; -extern const Word32 shoebox_sin_cos_tbl_fx[11][2]; -#endif extern const float cb_azi_chan[]; -extern const Word32 delta_phi_val[90]; -extern const Word32 inv_delta_phi_val[90]; -extern const Word32 dd_val[90]; -#ifdef IVAS_FLOAT_FIXED -extern const Word32 cb_azi_chan_fx[]; -#endif extern const float McMASA_LFEGain_vectors[64]; @@ -393,12 +328,6 @@ extern const float dct5[]; extern const float dct8[]; extern const float dct12[]; -#ifdef IVAS_FLOAT_FIXED -extern const Word32 dct4_fx[]; -extern const Word32 dct5_fx[]; -extern const Word32 dct8_fx[]; -extern const Word32 dct12_fx[]; -#endif /*----------------------------------------------------------------------------------* * ISM ROM tables *----------------------------------------------------------------------------------*/ @@ -406,11 +335,6 @@ extern const Word32 dct12_fx[]; extern const float ism_azimuth_borders[4]; extern const float ism_elevation_borders[4]; -#ifdef IVAS_FLOAT_FIXED -extern const Word32 ism_azimuth_borders_fx[4]; -extern const Word32 ism_elevation_borders_fx[4]; -#endif - /*----------------------------------------------------------------------------------* * Param ISM ROM tables *----------------------------------------------------------------------------------*/ @@ -428,27 +352,10 @@ extern const float ivas_lpf_2_butter_16k[IVAS_BIQUAD_FILT_LEN << 1]; extern const float ivas_lpf_2_butter_32k[IVAS_BIQUAD_FILT_LEN << 1]; extern const float ivas_lpf_2_butter_48k[IVAS_BIQUAD_FILT_LEN << 1]; -#ifdef IVAS_FLOAT_FIXED -extern const Word32 ivas_lpf_4_butter_16k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; -extern const Word32 ivas_lpf_4_butter_32k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; -extern const Word32 ivas_lpf_4_butter_48k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; -extern const Word32 ivas_lpf_2_butter_16k_fx[IVAS_BIQUAD_FILT_LEN << 1]; -extern const Word32 ivas_lpf_2_butter_32k_fx[IVAS_BIQUAD_FILT_LEN << 1]; -extern const Word32 ivas_lpf_2_butter_48k_fx[IVAS_BIQUAD_FILT_LEN << 1]; -#endif - - extern const float ivas_lfe_window_coeff_48k[IVAS_LFE_FADE_LEN_48K]; extern const float ivas_lfe_window_coeff_32k[IVAS_LFE_FADE_LEN_32K]; extern const float ivas_lfe_window_coeff_16k[IVAS_LFE_FADE_LEN_16K]; -#ifdef IVAS_FLOAT_FIXED -extern const Word32 ivas_lfe_window_coeff_48k_fx[IVAS_LFE_FADE_LEN_48K]; -extern const Word32 ivas_lfe_window_coeff_32k_fx[IVAS_LFE_FADE_LEN_32K]; -extern const Word32 ivas_lfe_window_coeff_16k_fx[IVAS_LFE_FADE_LEN_16K]; -#endif - - extern const int16_t ivas_lfe_num_ele_in_coder_models[2][4]; extern const Word16 ivas_lfe_log2_num_ele_in_coder_models_fx[2][4]; extern const int16_t ivas_lfe_num_dct_pass_bins_tbl[IVAS_LFE_NUM_COEFFS_IN_SUBGRP]; @@ -456,11 +363,7 @@ extern const int16_t ivas_lfe_min_shift_tbl[IVAS_LFE_NUM_COEFFS_IN_SUBGRP]; extern const ivas_lfe_freq_models ivas_str_lfe_freq_models; extern const float ivas_lfe_lpf_delay[2]; extern const Word16 ivas_lfe_lpf_delay_Q15[2]; -#ifdef IVAS_FLOAT_FIXED -extern const UWord32 d_hamm_lfe_plc_fx[LFE_PLC_LENANA / 2]; -#else extern const double d_hamm_lfe_plc[LFE_PLC_LENANA / 2]; -#endif extern const float ivas_sin_twiddle_480[IVAS_480_PT_LEN >> 1]; extern const float ivas_cos_twiddle_480[IVAS_480_PT_LEN >> 1]; extern const float ivas_sin_twiddle_320[IVAS_320_PT_LEN >> 1]; @@ -482,27 +385,11 @@ extern const float ivas_mdft_coeff_cos_twid_40[IVAS_40_PT_LEN + 1]; extern const float ivas_mdft_coeff_cos_twid_960[IVAS_960_PT_LEN + 1]; extern const float ivas_mdft_coeff_cos_twid_640[IVAS_640_PT_LEN + 1]; extern const float ivas_mdft_coeff_cos_twid_320[IVAS_320_PT_LEN + 1]; -#ifdef IVAS_FLOAT_FIXED -extern const Word32 ivas_mdft_coeff_cos_twid_240_fx[IVAS_240_PT_LEN + 1]; -extern const Word32 ivas_mdft_coeff_cos_twid_160_fx[IVAS_160_PT_LEN + 1]; -extern const Word32 ivas_mdft_coeff_cos_twid_120_fx[IVAS_120_PT_LEN + 1]; -extern const Word32 ivas_mdft_coeff_cos_twid_80_fx[IVAS_80_PT_LEN + 1]; -extern const Word32 ivas_mdft_coeff_cos_twid_40_fx[IVAS_40_PT_LEN + 1]; -extern const Word32 ivas_mdft_coeff_cos_twid_960_fx[IVAS_960_PT_LEN + 1]; -extern const Word32 ivas_mdft_coeff_cos_twid_640_fx[IVAS_640_PT_LEN + 1]; -extern const Word32 ivas_mdft_coeff_cos_twid_320_fx[IVAS_320_PT_LEN + 1]; -#endif extern const int16_t dirac_gains_P_idx[16]; extern const float dirac_gains_norm_term[9]; extern const float dirac_gains_Pnm[91][9]; extern const float dirac_gains_trg_term[181][2]; -#ifdef IVAS_FLOAT_FIXED -extern const Word32 dirac_gains_norm_term_int[9]; -extern const Word32 dirac_gains_norm_term_fx[9]; -extern const Word32 dirac_gains_Pnm_int[91][9]; -extern const Word32 dirac_gains_trg_term_int[181][2]; -extern const Word32 dirac_gains_trg_term_fx[181][2]; -#endif + /*------------------------------------------------------------------------------------------* * FB ROM tables *------------------------------------------------------------------------------------------*/ @@ -525,23 +412,9 @@ extern const float ivas_fb_cf_1ms_32k[IVAS_FB_1MS_32K_SAMP]; extern const float ivas_fb_cf_4ms_16k[IVAS_FB_4MS_16K_SAMP]; extern const float ivas_fb_cf_1ms_16k[IVAS_FB_1MS_16K_SAMP]; -#ifdef IVAS_FLOAT_FIXED -extern const Word16 ivas_fb_cf_4ms_48k_fx[IVAS_FB_4MS_48K_SAMP]; -extern const Word16 ivas_fb_cf_1ms_48k_fx[IVAS_FB_1MS_48K_SAMP]; -extern const Word16 ivas_fb_cf_4ms_32k_fx[IVAS_FB_4MS_32K_SAMP]; -extern const Word16 ivas_fb_cf_1ms_32k_fx[IVAS_FB_1MS_32K_SAMP]; -extern const Word16 ivas_fb_cf_4ms_16k_fx[IVAS_FB_4MS_16K_SAMP]; -extern const Word16 ivas_fb_cf_1ms_16k_fx[IVAS_FB_1MS_16K_SAMP]; -#endif - extern const float ivas_fb_resp_cheby_ramp_32del[IVAS_FB_1MS_32K_SAMP + 1]; extern const float ivas_fb_resp_cheby_ramp_16del[IVAS_FB_1MS_16K_SAMP + 1]; -#ifdef IVAS_FLOAT_FIXED -extern const Word32 ivas_fb_resp_cheby_ramp_32del_fx[IVAS_FB_1MS_32K_SAMP + 1]; -extern const Word32 ivas_fb_resp_cheby_ramp_16del_fx[IVAS_FB_1MS_16K_SAMP + 1]; -#endif - extern const int16_t ivas_num_active_bands[FB - WB + 1]; /*------------------------------------------------------------------------------------------* @@ -556,10 +429,6 @@ extern const int16_t ivas_sns_cdbks_tcx10_bits[]; extern const float *const ivas_sns_cdbks_tcx20[]; extern const float *const ivas_sns_cdbks_tcx10[]; -#ifdef IVAS_FLOAT_FIXED -extern const Word16 *const ivas_sns_cdbks_tcx20_fx[]; -extern const Word16 *const ivas_sns_cdbks_tcx10_fx[]; -#endif extern const int16_t ivas_sns_cdbks_side_tcx20_levels[]; extern const int16_t ivas_sns_cdbks_side_tcx20_bits[]; @@ -568,10 +437,6 @@ extern const int16_t ivas_sns_cdbks_side_tcx10_bits[]; extern const float *const ivas_sns_cdbks_side_tcx20[]; extern const float *const ivas_sns_cdbks_side_tcx10[]; -#ifdef IVAS_FLOAT_FIXED -extern const Word16 *const ivas_sns_cdbks_side_tcx20_fx[]; -extern const Word16 *const ivas_sns_cdbks_side_tcx10_fx[]; -#endif /* means and codebooks for the split VQ in the 2-stage SNS VQ */ extern const int16_t sns_1st_cdbk[2][2][8 * 32]; @@ -588,24 +453,5 @@ extern const int16_t ivas_param_upmx_mx_qmap[33]; extern const ACPL_QUANT_TABLE ivas_mc_paramupmix_alpha_quant_table; extern const ACPL_QUANT_TABLE ivas_mc_paramupmix_beta_quant_table[9]; -#ifdef IVAS_FLOAT_FIXED -extern const ACPL_QUANT_TABLE_FX ivas_mc_paramupmix_alpha_quant_table_fx; -extern const ACPL_QUANT_TABLE_FX ivas_mc_paramupmix_beta_quant_table_fx[9]; -#endif // IVAS_FLOAT_FIXED - -#ifdef IVAS_FLOAT_FIXED -extern const Word32 ivas_han_win_48k_fx[L_FRAME32k]; -extern const Word32 ivas_han_win_32k_fx[L_FRAME32k]; -extern const Word32 ivas_han_win_16k_fx[L_FRAME32k]; - -extern const Word32 ivas_sine_delay_32_fx[32]; - -extern const Word32 ivas_sine_frame_len_640_del_32_fx[577]; -extern const Word32 ivas_sine_frame_len_640_del_16_fx[289]; - -extern const Word32 ivas_fb_fr_12band_1ms_re_fx[IVAS_FB_12_1MS_LEN]; -extern const Word32 ivas_fb_fr_12band_1ms_im_fx[IVAS_FB_12_1MS_LEN]; -#endif - /* IVAS_ROM_COM_H */ #endif diff --git a/lib_com/ivas_rom_com_fx.c b/lib_com/ivas_rom_com_fx.c index 0570d4f3c..d4a8ce6a9 100644 --- a/lib_com/ivas_rom_com_fx.c +++ b/lib_com/ivas_rom_com_fx.c @@ -1244,4 +1244,3732 @@ const Masa_Diffuseness_Ratios masa_diffuse_ratios[DIRAC_DIFFUSE_LEVELS][DIRAC_DI }; #endif +/*----------------------------------------------------------------------------------* + * Stereo ICA ROM tables + *----------------------------------------------------------------------------------*/ + +const Word32 ica_sincInterp2_fx[2 * SINC_ORDER1 + 1] = { + 0, -4988604, 0, 7486127, 0, + -12594991, 0, 20905753, 0, -33172179, 0, + 50472307, 0, -74575663, 0, 108767895, 0, + -160155039, 0, 247433071, 0, -439753119, 0, + 1361749503, 2147483647, 1361749503, 0, -439753119, 0, + 247433071, 0, -160155039, 0, 108767895, 0, + -74575663, 0, 50472307, 0, -33172179, 0, + 20905753, 0, -12594991, 0, 7486127, 0, + -4988604, 0 +}; + +/*----------------------------------------------------------------------------------* + * Stereo IC-BWE ROM tables + *----------------------------------------------------------------------------------*/ + +// Q14 +const Word16 pow_10_icbwe_gsMapping_tbl_fx[16] = { + 164, 733, 1793, 3195, 4524, 5875, 7438, 9155, 11101, 13053, 13945, 14602, 15647, 16384, + 17965, 19698 +}; + +// Q14 +const Word16 pow_10_icbwe_gsMappingDFT_tbl_fx[128] = { + 0, 1, 2, 5, 16, 52, 206, 464, 518, 585, 667, 688, 803, 899, + 1324, 1349, 1513, 1534, 1578, 1625, 1711, 1756, 1808, 1879, 1926, 2001, 2050, 2130, + 2191, 2280, 2366, 2394, 2456, 2574, 2643, 2726, 2796, 2850, 2869, 2908, 2962, 2991, + 3023, 3051, 3091, 3130, 3202, 3233, 3268, 3342, 3388, 3429, 3483, 3519, 3553, 3595, + 3651, 3706, 3738, 3795, 3844, 3890, 3946, 3990, 4028, 4075, 4119, 4166, 4214, 4259, + 4303, 4350, 4389, 4441, 4481, 4540, 4605, 4684, 4764, 4854, 4950, 5068, 5198, 5348, + 5519, 5692, 5881, 6073, 6273, 6473, 6676, 6883, 7124, 7364, 7616, 7852, 8097, 8370, + 8630, 8916, 9200, 9496, 9866, 10252, 10652, 11052, 11436, 11813, 12247, 12697, 13153, 13611, + 14072, 14503, 14936, 15336, 15702, 16032, 16384, 16664, 16980, 17253, 17550, 17866, 18206, 18594, + 19072, 19631 +}; + +/*----------------------------------------------------------------------------------* + * TD Stereo ROM tables + *----------------------------------------------------------------------------------*/ + +const UWord32 tdm_ratio_tabl_fx[TDM_NQ + 1] = { + 0, 0, 23407572, 52613348, 92771296, + 143881408, 205084688, 275736896, 355193792, 442596384, 536870912, + 636943680, 741955584, 850403520, 961428416, 1073741824, 1186055168, + 1297080064, 1405528064, 1510540032, 1610612736, 1704887296, 1792289792, + 1871746688, 1942398976, 2003602304, 2054712320, 2094870272, 2124076032, + 2147483647, 2147483647, 2147483647 +}; + +const UWord32 tdm_den_ratio_tabl_fx[TDM_NQ + 1] = { + 1073741824, 1073741824, 1097471488, 1127536256, 1170593280, + 1227179520, 1297939072, 1383409024, 1483374336, 1596009856, 1717986944, + 1842648320, 1960330496, 2058470400, 2124290816, 2147483647, 2124290816, + 2058470400, 1960330496, 1842648320, 1717986944, 1596009856, 1483374336, + 1383409024, 1297939072, 1227179520, 1170593280, 1127536256, 1097471488, + 1073741824, 1073741824, 1073741824 +}; + +/* LSFs Intra-frame prediction tables */ + +// 2.56 +const Word16 tdm_LSF_MEAN_RE_USE_OUT_fx[M] = { + 771, 1335, 2229, 3431, 4383, 5354, 6371, 7273, 8183, 9198, 10133, 10991, 12058, 13104, 14200, 15152 +}; + +// 2.56 +const Word16 tdm_LSF_MEAN_RE_USE_IN_fx[M] = { + 733, + 1337, + 2271, + 3451, + 4418, + 5382, + 6430, + 7304, + 8221, + 9247, + 10165, + 11079, + 12115, + 13197, + 14266, + 15269, +}; + +// 2.56 +const Word16 tdm_LSF_MEAN_RE_USE_fx[M] = { + 680, 1369, 2354, 3448, 4498, 5435, 6546, 7494, 8446, 9437, 10328, 11248, 12241, 13199, 14189, 15174 +}; + +// Q15 +const Word16 tdm_Beta_Q1bit_re_use_13k2_fx[2] = { 31784, 24576 }; + +// Q15 +const Word16 tdm_Beta_Q1bit_re_use_16k4_fx[2] = { 31129, 23265 }; + +// Q15 +const Word16 tdm_Beta_Q1bit_re_use_24k4_32k_fx[2] = { 30474, 23920 }; + +// Q15 +const Word16 tdm_Beta_Q1bit_re_use_48k_fx[2] = { 31784, 25231 }; + +// Q15 +const Word16 tdm_RE_USE_adaptive_beta_prd_diag_3_fx[15 + 16 + 15] = { + 29028, 6750, 1916, 27016, 7516, 1195, 26787, 5557, -196, 27796, 6753, 2172, 29434, 4446, 2175, 26053, 6337, 3063, 26043, 5521, 3633, 26082, + 5989, 3515, 25672, 5911, 4846, 24123, 6494, 4374, 24971, 6225, 6235, 24146, 5619, 5848, 23638, 5393, 6445, 22579, 4027, 6694, 20698, 1779, + 5789, 17681 +}; + +// 2.56 +const Word16 tdm_LSF_MEAN_PRED_QNT_fx[M] = { + 1002, 1558, 2478, 3467, 4377, 5326, 6274, 7160, 8182, 9099, 10022, 10967, 12051, 13081, 14148, 15113 +}; + +// 2.56 +const Word16 tdm_LSF_MEAN_PRED_QNT_IN_fx[M] = { + 739, 1371, 2303, 3436, 4431, 5394, 6378, 7321, 8293, 9282, 10221, 11153, 12166, 13193, 14252, 15290 +}; + +// 2.56 +const Word16 tdm_LSF_MEAN_PRED_QNT_OUT_fx[M] = { + 733, 1337, 2271, 3451, 4418, 5382, 6430, 7304, 8221, 9247, 10165, 11079, 12115, 13197, 14266, 15269 +}; + +// Q15 +const Word16 tdm_PRED_QNT_fixed_beta_prd_diag_3_fx[15 + 16 + 15] = { + 23067, 3941, -3666, 24050, 5907, 829, 21960, 6229, -6052, 25859, 9862, -1369, 28559, 6019, 108, 22658, 7844, 697, 22045, 7998, 2310, 24735, + 6497, 2464, 23434, 7120, 2903, 20194, 10049, 711, 26610, 6622, 5190, 23955, 5721, 3945, 23906, 6481, 4033, 24581, 4043, 5599, 20879, 3473, + 3909, 21541 +}; + +/*----------------------------------------------------------------------------------* + * Stereo DTX ROM tables + *----------------------------------------------------------------------------------*/ + +/*Q-13*/ +const Word16 dft_cng_coh_pred_fx[STEREO_DFT_N_COH_PRED][STEREO_DFT_COH_PRED_COEFFS] = { + { 4926, -827, 10396, 696, 2285, 5488, 668, 1547, -1416, 2633, 76, -690, 2967, -3495, 6212 }, + { 7007, 3446, 3385, -76, -3274, 11352, 101, -125, 1281, 4238, 1312, -2487, 3913, -4593, 11326 }, + { 1659, 399, 2157, 192, 753, 3241, 107, -91, 290, 7995, 81, 1334, 3139, -2994, 20764 }, + { 11416, -1076, 8105, 6048, 5602, 13, -1846, -99, 8885, -945, 183, -373, -2754, 3463, 4089 } +}; + +/*Q-15*/ +const Word16 dft_cng_alpha_bits_fx[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_COH_ALPHA_LEVELS] = { + { 3277 /*0.1f*/, 19661 /*0.6f*/ }, + { 3277 /*0.1f*/, 19661 /*0.6f*/ }, + { 3277 /*0.1f*/, 22938 /*0.7f*/ }, + { 3277 /*0.1f*/, 29491 /*0.9f*/ }, + { 6554 /*0.2f*/, 29491 /*0.9f*/ } +}; + +/*----------------------------------------------------------------------------------* + * DirAC ROM tables + *----------------------------------------------------------------------------------*/ + + // q = 30 +const Word32 diffuseness_reconstructions_fx[DIRAC_DIFFUSE_LEVELS] = { + 0, 42467328, 96206848, 170655744, 331087872, 508821504, 678952960, 912785408 +}; + +const Word32 diffuseness_thresholds_fx[DIRAC_DIFFUSE_LEVELS + 1] = { + 0, + 20447232, + 67633152, + 128188416, + 237502464, + 428605440, + 587988992, + 788791296, + MAX_32 /* out-of-range large value to make searching easier */ +}; + +/*------------------------------------------------------------------------------------------* + * SPAR ROM tables + *------------------------------------------------------------------------------------------*/ + +const Word32 dtx_pd_real_min_max_fx[2] = { + 0, 429496729 +}; + +const Word32 one_by_q_level[64] = { + 0, 2147483647, 1073741824, 715827904, 536870912, 429496736, + 357913952, 306783392, 268435456, 238609296, 214748368, + 195225792, 178956976, 165191056, 153391696, 143165584, + 134217728, 126322568, 119304648, 113025456, 107374184, + 102261128, 97612896, 93368856, 89478488, 85899344, + 82595528, 79536432, 76695848, 74051160, 71582792, + 69273664, 67108864, 65075264, 63161284, 61356676, + 59652324, 58040100, 56512728, 55063684, 53687092, + 52377648, 51130564, 49941480, 48806448, 47721860, + 46684428, 45691140, 44739244, 43826196, 42949672, + 42107524, 41297764, 40518560, 39768216, 39045156, + 38347924, 37675152, 37025580, 36398028, 35791396, + 35204648, 34636832, 34087044 +}; + +/*----------------------------------------------------------------------------------* + * Parametric MC ROM tables + *----------------------------------------------------------------------------------*/ + +// Q8 +const Word16 ivas_param_mc_quant_ild_5d1_48_fx[PARAM_MC_SZ_ILD_QUANTIZER_4BITS] = { + -25600, -5120, -3328, -2560, -2048, -1408, -896, -384, 0, 384, 896, 1408, 2048, 2560, 3328, 5120 +}; + +// Q15 +const Word16 ivas_param_mc_quant_icc_fx[PARAM_MC_SZ_ICC_QUANTIZER] = { + -32440, -19300, 0, 12046, 19690, 27563, 30703, 32767 +}; + +/*----------------------------------------------------------------------------------* + * MASA ROM tables + *----------------------------------------------------------------------------------*/ + +/* from 1 to 11 bits*/ /*q factor = 8*/ +const Word32 no_phi_masa_inv_fx[NO_SPHERICAL_GRIDS][MAX_NO_THETA] = { + { 1073741824 }, + { 536870912 }, + { 536870912, 1073741824 }, + { 268435456, 536870912 }, + { 178956970, 306783378, 1073741824, 2147483647 }, + { 153391689, 165191049, 238609294, 1073741824, 2147483647 }, + { 97612893, 102261126, 126322567, 195225786, 715827882, 2147483647 }, + { 65075262, 67108864, 74051160, 93368854, 126322567, 238609294, 2147483647 }, + { 44739242, 45691141, 47721858, 52377649, 61356675, 76695844, 107374182, 178956970, 1073741824, 2147483647 }, + { 35791394, 35791394, 37025580, 38347922, 39768215, 42949672, 46684427, 52377649, 59652323, 71582788, 93368854, 126322567, 214748364, 2147483647 }, + { 24129029, 24129029, 24403223, 24970740, 25565281, 26512143, 27889398, 29417584, 31580641, 34087042, 37675151, 42107522, 48806446, 56512727, 71582788, 93368854, 143165576, 268435456, 2147483647 } +}; + +const Word32 azimuth_cb_fx[8] = { + 0, -754974720, -377487360, 377487360, -188743680, 188743680, -566231040, 566231040 +}; + +const Word32 delta_theta_masa_fx[NO_SPHERICAL_GRIDS - 2] = { + 188743680, 188743680, 150994944, 106954752, 83886080, 62914560, 45214596, 28101836, 20971520 +}; + +// q = 21 +const Word32 coherence_cb0_masa_fx[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH] = { + 100243, 534144, 1156579, 2068840, 2846464, 3531184, 4125936, 0, 253965, 864655, 1467377, + 2129448, 2977326, 3768791, 0, 0, 338480, 1189924, 2035915, 2872888, 3640026, 0, 0, 0, + 492621, 1532179, 2527278, 3470157, 0, 0, 0, 0, 499331, 1506803, 2465831, 3425697, 0, + 0, 0, 0, 503316, 1473668, 2392221, 3406404, 0, 0, 0, 0, 737778, 1970903, 3450654, 0, 0, + 0, 0, 0, 2097152, 0, 0, 0, 0, 0, 0, 0, 303038, 719742, 1122186, 1577897, 2117075, 2770337, + 3648834, 0, 419849, 932603, 1440533, 2011797, 2745172, 3571240, 0, 0, 548824, 1165177, + 1812987, 2555379, 3366138, 0, 0, 0, 695835, 1428160, 2190475, 3084910, 0, 0, 0, 0, 697093, + 1381603, 2092957, 2970406, 0, 0, 0, 0, 708417, 1396283, 2099039, 2992426, 0, 0, 0, 0, 835924, + 1728892, 2836607, 0, 0, 0, 0, 0, 2097152, 0, 0, 0, 0, 0, 0, 0 +}; + +// q = 21 +const Word32 coherence_cb1_masa_fx[MASA_NO_CV_COH1 * MASA_MAXIMUM_CODING_SUBBANDS] = { + -3984, 544630, -565392, 1314704, -1320157, -11534, 541484, -583847, 1357486, -1371118, + -6081, 525546, -551551, 1362729, -1371537, -838, 533934, -540855, 1436758, -1414109, + 3565, 528692, -519883, 1513514, -1500931 +}; + +/* Multi-channel input and output setups */ +const int16_t ls_azimuth_CICP2_idx[2] = { 1, 2 }; +const int16_t ls_elevation_CICP2_idx[2] = { 0, 0 }; + +const int16_t ls_azimuth_CICP6_idx[5] = { 1, 2, 0, 7, 8 }; +const int16_t ls_elevation_CICP6_idx[5] = { 0, 0, 0, 0, 0 }; + +const int16_t ls_azimuth_CICP12_idx[7] = { 1, 2, 0, 7, 8, 9, 10 }; +const int16_t ls_elevation_CICP12_idx[7] = { 0, 0, 0, 0, 0, 0, 0 }; + +const int16_t ls_azimuth_CICP14_idx[7] = { 1, 2, 0, 7, 8, 1, 2 }; +const int16_t ls_elevation_CICP14_idx[7] = { 0, 0, 0, 0, 0, 3, 4 }; + +const int16_t ls_azimuth_CICP16_idx[9] = { 1, 2, 0, 7, 8, 1, 2, 7, 8 }; +const int16_t ls_elevation_CICP16_idx[9] = { 0, 0, 0, 0, 0, 3, 3, 3, 3 }; + +const int16_t ls_azimuth_CICP19_idx[11] = { 1, 2, 0, 9, 10, 5, 6, 1, 2, 9, 10 }; +const int16_t ls_elevation_CICP19_idx[11] = { 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3 }; + +const Word32 shoebox_sin_cos_tbl_fx[11][2] = { { 0, 1073741824 }, // 0 + { 536870912, 929887680 }, + { -536870912, 929887680 }, // 30, -30 + { 615873024, 879557824 }, + { -615873024, 879557824 }, // 35, -35 + { 1073741824, 0 }, + { -1073741824, 0 }, // 90, -90 + { 1008987264, -367241312 }, + { -1008987264, -367241312 }, // 110,-110 + { 759250112, -759250112 }, + { -759250112, -759250112 } }; // 135, -135 //Q.30 + +const Word32 delta_phi_val[90] = { + 0, 1509949440, 754974720, 503316480, 377487360, 301989888, + 251658240, 215707056, 188743680, 167772160, 150994944, + 137268128, 125829120, 116149960, 107853528, 100663296, + 94371840, 88820552, 83886080, 79471024, 75497472, + 71902352, 68634064, 65649976, 62914560, 60397976, + 58074980, 55924052, 53926764, 52067224, 50331648, + 48708048, 47185920, 45756044, 44410276, 43141412, + 41943040, 40809444, 39735512, 38716652, 37748736, + 36828036, 35951176, 35115104, 34317032, 33554432, + 32824988, 32126584, 31457280, 30815294, 30198988, + 29606852, 29037490, 28489612, 27962026, 27453626, + 26963382, 26490342, 26033612, 25592364, 25165824, + 24753270, 24354024, 23967452, 23592960, 23229992, + 22878022, 22536558, 22205138, 21883326, 21570706, + 21266894, 20971520, 20684238, 20404722, 20132660, + 19867756, 19609732, 19358326, 19113284, 18874368, + 18641352, 18414018, 18192162, 17975588, 17764112, + 17557552, 17355740, 17158516, 16965724 +}; + +const Word32 inv_delta_phi_val[90] = { + 0, 5965232, 11930464, 17895697, 23860929, 29826161, + 35791394, 41756626, 47721858, 53687091, 59652323, + 65617555, 71582788, 77548020, 83513252, 89478485, + 95443717, 101408950, 107374182, 113339414, 119304647, + 125269879, 131235111, 137200344, 143165576, 149130808, + 155096041, 161061273, 167026505, 172991738, 178956970, + 184922203, 190887435, 196852667, 202817900, 208783132, + 214748364, 220713597, 226678829, 232644061, 238609294, + 244574526, 250539758, 256504991, 262470223, 268435456, + 274400688, 280365920, 286331153, 292296385, 298261617, + 304226850, 310192082, 316157314, 322122547, 328087779, + 334053011, 340018244, 345983476, 351948708, 357913941, + 363879173, 369844406, 375809638, 381774870, 387740103, + 393705335, 399670567, 405635800, 411601032, 417566264, + 423531497, 429496729, 435461961, 441427194, 447392426, + 453357659, 459322891, 465288123, 471253356, 477218588, + 483183820, 489149053, 495114285, 501079517, 507044750, + 513009982, 518975214, 524940447, 530905679 +}; + +const Word32 dd_val[90] = { + 0, 754974720, 377487360, 251658240, 188743680, 150994944, + 125829120, 107853528, 94371840, 83886080, 75497472, + 68634064, 62914560, 58074980, 53926764, 50331648, + 47185920, 44410276, 41943040, 39735512, 37748736, + 35951176, 34317032, 32824988, 31457280, 30198988, + 29037490, 27962026, 26963382, 26033612, 25165824, + 24354024, 23592960, 22878022, 22205138, 21570706, + 20971520, 20404722, 19867756, 19358326, 18874368, + 18414018, 17975588, 17557552, 17158516, 16777216, + 16412494, 16063292, 15728640, 15407647, 15099494, + 14803426, 14518745, 14244806, 13981013, 13726813, + 13481691, 13245171, 13016806, 12796182, 12582912, + 12376635, 12177012, 11983726, 11796480, 11614996, + 11439011, 11268279, 11102569, 10941663, 10785353, + 10633447, 10485760, 10342119, 10202361, 10066330, + 9933878, 9804866, 9679163, 9556642, 9437184, + 9320676, 9207009, 9096081, 8987794, 8882056, + 8778776, 8677870, 8579258, 8482862 +}; + +const Word32 cb_azi_chan_fx[] = { 0, 125829120, 461373440, 566231040 }; + +/*----------------------------------------------------------------------------------* + * MASA and ISM (OMASA) combined format ROM tables + *----------------------------------------------------------------------------------*/ + +const Word32 dct4_fx[4 * 4] = { + 1073741824, 1402951040, 1073741824, 581109056, + 1073741824, 581109056, -1073741824, -1402951040, + 1073741824, -581109056, -1073741824, 1402951040, + 1073741824, -1402951040, 1073741824, -581109056 +}; + +const Word32 dct5_fx[5 * 5] = { + 960354688, 1291711360, 1098867328, 798219648, 419618304, + 960354688, 798219648, -419618304, -1291711360, -1098867328, + 960354688, 0, -1358283392, 0, 1358283392, + 960354688, -798219648, -419618304, 1291711360, -1098867328, + 960354688, -1291711360, 1098867328, -798219648, 419618304 +}; + +const Word32 dct8_fx[8 * 8] = { + 759350208, 1053125952, 991922688, 892708928, 759350208, 596570944, 410813632, 209379648, + 759350208, 892708928, 410813632, -209379648, -759350208, -1053125952, -991922688, -596570944, + 759350208, 596570944, -410813632, -1053125952, -759350208, 209379648, 991922688, 892708928, + 759350208, 209379648, -991922688, -596570944, 759350208, 892708928, -410813632, -1053125952, + 759350208, -209379648, -991922688, 596570944, 759350208, -892708928, -410813632, 1053125952, + 759350208, -596570944, -410813632, 1053125952, -759350208, -209379648, 991922688, -892708928, + 759350208, -892708928, 410813632, 209379648, -759350208, 1053125952, -991922688, 596570944, + 759350208, -1053125952, 991922688, -892708928, 759350208, -596570944, 410813632, -209379648 +}; + +const Word32 dct12_fx[12 * 12] = { + 619978560, 869301376, 846752832, 810030848, 759350208, 695569984, 619978560, 533649696, 438301408, 335436960, 226989024, 114460880, + 619978560, 810030848, 619978560, 335436960, 0, -335436960, -619978560, -810030848, -876602816, -810030848, -619978560, -335436960, + 619978560, 695569984, 226989024, -335436960, -759350208, -869301376, -619978560, -114460880, 438301408, 810030848, 846752832, 533649696, + 619978560, 533649696, -226989024, -810030848, -759350208, -114460880, 619978560, 869301376, 438301408, -335436960, -846752832, -695569984, + 619978560, 335436960, -619978560, -810030848, 0, 810030848, 619978560, -335436960, -876602816, -335436960, 619978560, 810030848, 619978560, + 114460880, -846752832, -335436960, 759350208, 533649696, -619978560, -695569984, 438301408, 810030848, -226989024, -869301376, 619978560, + -114460880, -846752832, 335436960, 759350208, -533649696, -619978560, 695569984, 438301408, -810030848, -226989024, 869301376, 619978560, + -335436960, -619978560, 810030848, 0, -810030848, 619978560, 335436960, -876602816, 335436960, 619978560, -810030848, 619978560, -533649696, + -226989024, 810030848, -759350208, 114460880, 619978560, -869301376, 438301408, 335436960, -846752832, 695569984, 619978560, -695569984, + 226989024, 335436960, -759350208, 869301376, -619978560, 114460880, 438301408, -810030848, 846752832, -533649696, 619978560, -810030848, + 619978560, -335436960, 0, 335436960, -619978560, 810030848, -876602816, 810030848, -619978560, 335436960, 619978560, -869301376, 846752832, + -810030848, 759350208, -695569984, 619978560, -533649696, 438301408, -335436960, 226989024, -114460880 +}; + +/*----------------------------------------------------------------------------------* + * ISM ROM tables + *----------------------------------------------------------------------------------*/ + +const Word32 ism_azimuth_borders_fx[4] = { + ISM_AZIMUTH_MIN_FX, ISM_AZIMUTH_LOW_BORDER_FX, ISM_AZIMUTH_HIGH_BORDER_FX, ISM_AZIMUTH_MAX_FX +}; + +const Word32 ism_elevation_borders_fx[4] = { + ISM_ELEVATION_MIN_FX, ISM_ELEVATION_LOW_BORDER_FX, ISM_ELEVATION_HIGH_BORDER_FX, ISM_ELEVATION_MAX_FX +}; + +/*----------------------------------------------------------------------------------* + * LFE coding ROM tables + *----------------------------------------------------------------------------------*/ + +const Word32 ivas_lpf_4_butter_16k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2] = { + 0x1ab, 0x356, 0x1ab, 0x40000000, + 0x85ec0b80, 0x3a3cb940, 0x40000000, 0x7fffffff, + 0x40000000, 0x40000000, 0x829d8180, 0x3d8c5e40 +}; + +const Word32 ivas_lpf_4_butter_32k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2] = { + 0x1c, 0x37, 0x1c, 0x40000000, + 0x82fd4b80, 0x3d0d2280, 0x40000000, 0x7fffffff, + 0x40000000, 0x40000000, 0x81478600, 0x3ec30c00 +}; + +const Word32 ivas_lpf_4_butter_48k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2] = { + 0x6, 0xb, 0x6, 0x40000000, + 0x81ffd700, 0x3e04d500, 0x40000000, 0x7fffff80, + 0x40000000, 0x40000000, 0x80d8b600, 0x3f2c0080 +}; + +const Word32 ivas_lpf_2_butter_16k_fx[IVAS_BIQUAD_FILT_LEN << 1] = { + 0xa4d0c, 0x149a17, 0xa4d0c, 0x40000000, 0x849e6300, 0x3b8ad140 +}; + +const Word32 ivas_lpf_2_butter_32k_fx[IVAS_BIQUAD_FILT_LEN << 1] = { + 0x53e1a, 0x29f0d, 0x40000000, 0x824f6000, 0x3dbb1c80, 0x29f0d +}; + +const Word32 ivas_lpf_2_butter_48k_fx[IVAS_BIQUAD_FILT_LEN << 1] = { + 0x12c07, 0x2580d, 0x12c07, 0x40000000, 0x818a4580, 0x3e7a6a80 +}; + +const Word32 ivas_lfe_window_coeff_48k_fx[IVAS_LFE_FADE_LEN_48K] = { + 0x0003a373, 0x000608f6, 0x000888a7, 0x000b3e1b, 0x000e34f1, 0x001174a2, 0x00150328, 0x0018e5e1, 0x001d21eb, 0x0021bc4d, 0x0026ba09, 0x002c202f, 0x0031f3dc, 0x00383a43, 0x003ef8ad, 0x0046347b, 0x004df325, 0x00563a3f, 0x005f0f74, 0x00687888, 0x00727b59, 0x007d1ddb, 0x0088661c, 0x00945a41, 0x00a10087, 0x00ae5f3d, 0x00bc7ccd, 0x00cb5fb3, 0x00db0e7d, 0x00eb8fd0, 0x00fcea61, 0x010f24f8, 0x0122466a, 0x013655a0, 0x014b598e, 0x01615936, 0x01785ba8, 0x01906800, 0x01a9855e, 0x01c3baf0, 0x01df0fee, 0x01fb8b90, 0x02193514, 0x023813c4, 0x02582ee4, 0x02798db8, 0x029c378c, 0x02c033a4, 0x02e58944, 0x030c3fa8, 0x03345e0c, 0x035deba0, 0x0388ef8c, 0x03b570f0, 0x03e376dc, 0x04130858, 0x04442c58, 0x0476e9b8, 0x04ab4760, 0x04e14c00, 0x0518fe48, 0x055264c8, 0x058d8600, 0x05ca6850, 0x06091200, 0x06498930, 0x068bd3f0, 0x06cff830, 0x0715fba8, 0x075de408, 0x07a7b6c8, 0x07f37940, 0x084130a0, 0x0890e200, 0x08e29220, 0x093645c0, 0x098c0150, 0x09e3c940, 0x0a3da180, 0x0a998e30, 0x0af792e0, 0x0b57b320, 0x0bb9f240, 0x0c1e5360, 0x0c84d940, 0x0ced8690, 0x0d585dc0, 0x0dc560f0, 0x0e349200, 0x0ea5f2b0, 0x0f198450, 0x0f8f4820, 0x10073f00, 0x10816980, 0x10fdc840, 0x117c5b00, 0x11fd21e0, 0x12801c60, 0x130549a0, 0x138ca8c0, 0x14163880, 0x14a1f740, 0x152fe320, 0x15bffa00, 0x16523980, 0x16e69ee0, 0x177d2700, 0x1815cec0, 0x18b09260, 0x194d6e00, 0x19ec5d60, 0x1a8d5c20, 0x1b306580, 0x1bd57440, 0x1c7c8300, 0x1d258c40, 0x1dd08a00, 0x1e7d7600, 0x1f2c49a0, 0x1fdcfe20, 0x208f8c40, 0x2143ed00, 0x21fa1840, 0x22b20680, 0x236baf40, 0x24270a00, 0x24e40e00, 0x25a2b280, 0x2662ee00, 0x2724b700, 0x27e80400, 0x28acca80, 0x297300c0, 0x2a3a9c00, 0x2b039180, 0x2bcdd680, 0x2c995fc0, 0x2d6621c0, 0x2e341140, 0x2f032240, 0x2fd34900, 0x30a47900, 0x3176a640, 0x3249c440, 0x331dc600, 0x33f29f40, 0x34c842c0, 0x359ea340, 0x3675b3c0, 0x374d66c0, 0x3825af00, 0x38fe7ec0, 0x39d7c880, 0x3ab17e40, 0x3b8b9240, 0x3c65f6c0, 0x3d409d80, 0x3e1b7880, 0x3ef679c0, 0x3fd19340, 0x40acb680, 0x4187d580, 0x4262e280, 0x433dce80, 0x44188c00, 0x44f30c80, 0x45cd4180, 0x46a71e00, 0x47809300, 0x48599300, 0x49320f80, 0x4a09fb80, 0x4ae14880, 0x4bb7e900, 0x4c8dcf80, 0x4d62ee80, 0x4e373880, 0x4f0aa080, 0x4fdd1900, 0x50ae9600, 0x517f0980, 0x524e6780, 0x531ca380, 0x53e9b100, 0x54b58400, 0x55801080, 0x56494b00, 0x57112800, 0x57d79c00, 0x589c9c00, 0x59601d00, 0x5a221480, 0x5ae27880, 0x5ba13e00, 0x5c5e5c00, 0x5d19c880, 0x5dd37a80, 0x5e8b6800, 0x5f418980, 0x5ff5d580, 0x60a84480, 0x6158ce00, 0x62076a80, 0x62b41280, 0x635ebf80, 0x64076a80, 0x64ae0d00, 0x6552a100, 0x65f52080, 0x66958680, 0x6733cd00, 0x67cff000, 0x6869ea80, 0x6901b880, 0x69975600, 0x6a2abf80, 0x6abbf200, 0x6b4aea80, 0x6bd7a680, 0x6c622300, 0x6cea5f80, 0x6d705900, 0x6df40f00, 0x6e758080, 0x6ef4ac80, 0x6f719300, 0x6fec3380, 0x70648f00, 0x70daa580, 0x714e7880, 0x71c00880, 0x722f5780, 0x729c6700, 0x73073980, 0x736fd100, 0x73d62f80, 0x743a5900, 0x749c5080, 0x74fc1880, 0x7559b600, 0x75b52b80, 0x760e7e80, 0x7665b280, 0x76bacc80, 0x770dd180, 0x775ec600, 0x77adb000, 0x77fa9480, 0x78457900, 0x788e6400, 0x78d55b80, 0x791a6500, 0x795d8780, 0x799ec900, 0x79de3100, 0x7a1bc580, 0x7a578d80, 0x7a919100, 0x7ac9d600, 0x7b006500, 0x7b354400, 0x7b687b80, 0x7b9a1300, 0x7bca1180, 0x7bf87f80, 0x7c256400, 0x7c50c780, 0x7c7ab180, 0x7ca32a00, 0x7cca3900, 0x7cefe600, 0x7d143900, 0x7d373a80, 0x7d58f280, 0x7d796800, 0x7d98a380, 0x7db6ad00, 0x7dd38c80, 0x7def4900, 0x7e09eb00, 0x7e237a00, 0x7e3bfd80, 0x7e537d80, 0x7e6a0180, 0x7e7f9080, 0x7e943200, 0x7ea7ed80, 0x7ebaca00, 0x7ecccf00, 0x7ede0300, 0x7eee6d00, 0x7efe1400, 0x7f0cfe80, 0x7f1b3380, 0x7f28b900, 0x7f359500, 0x7f41ce80, 0x7f4d6b80, 0x7f587180, 0x7f62e680, 0x7f6cd000, 0x7f763400, 0x7f7f1780, 0x7f878080, 0x7f8f7380, 0x7f96f580, 0x7f9e0b80, 0x7fa4bb00, 0x7fab0780, 0x7fb0f600, 0x7fb68b00, 0x7fbbca00, 0x7fc0b800, 0x7fc55880, 0x7fc9af80, 0x7fcdc080, 0x7fd18f00, 0x7fd51e80, 0x7fd87280, 0x7fdb8d80, 0x7fde7380, 0x7fe12700, 0x7fe3aa80, 0x7fe60100, 0x7fe82d00, 0x7fea3180, 0x7fec1000, 0x7fedcb00, 0x7fef6500, 0x7ff0e000, 0x7ff23e00, 0x7ff38080, 0x7ff4a980, 0x7ff5ba80, 0x7ff6b580, 0x7ff79c00, 0x7ff86e80, 0x7ff92f80, 0x7ff9e000, 0x7ffa8100, 0x7ffb1380, 0x7ffb9880, 0x7ffc1180, 0x7ffc7f80, 0x7ffce300, 0x7ffd3c80, 0x7ffd8d80, 0x7ffdd680, 0x7ffe1880, 0x7ffe5300, 0x7ffe8800, 0x7ffeb700, 0x7ffee100, 0x7fff0600, 0x7fff2700, 0x7fff4480, 0x7fff5e80, 0x7fff7500, 0x7fff8900, 0x7fff9a80, 0x7fffaa00, 0x7fffb780, 0x7fffc300, 0x7fffcd00, 0x7fffd580, 0x7fffdc80, 0x7fffe300, 0x7fffe880, 0x7fffec80, 0x7ffff080, 0x7ffff380, 0x7ffff680, 0x7ffff880, 0x7ffffa00, 0x7ffffb80, 0x7ffffc80, 0x7ffffd80, 0x7ffffe80, 0x7fffff00, 0x7fffff00, 0x7fffff80, 0x7fffff80, 0x7fffffff, 0x7fffffff +}; + +const Word32 ivas_lfe_window_coeff_32k_fx[IVAS_LFE_FADE_LEN_32K] = { + 0x000474c9, 0x0007fdfd, 0x000c0272, 0x0010a35b, 0x0015f4ae, 0x001c079e, 0x0022ecc2, 0x002ab4c6, 0x003370ac, 0x003d31e5, 0x00480a5f, 0x00540c87, 0x00614b4e, 0x006fda25, 0x007fccfb, 0x0091383a, 0x00a430c2, 0x00b8cbe7, 0x00cf1f67, 0x00e74167, 0x0101486c, 0x011d4b52, 0x013b614e, 0x015ba1d8, 0x017e24ae, 0x01a301c8, 0x01ca514e, 0x01f42b90, 0x0220a900, 0x024fe224, 0x0281ef88, 0x02b6e9c0, 0x02eee954, 0x032a06b4, 0x03685a34, 0x03a9fc00, 0x03ef0408, 0x043789f8, 0x0483a538, 0x04d36cd0, 0x0526f760, 0x057e5b20, 0x05d9adc0, 0x06390470, 0x069c73c0, 0x07040fa8, 0x076feb68, 0x07e01990, 0x0854abe0, 0x08cdb350, 0x094b4000, 0x09cd6120, 0x0a5424d0, 0x0adf9870, 0x0b6fc830, 0x0c04bf20, 0x0c9e8760, 0x0d3d29c0, 0x0de0ade0, 0x0e891a50, 0x0f367440, 0x0fe8bfa0, 0x109fff00, 0x115c33a0, 0x121d5d80, 0x12e37b00, 0x13ae8960, 0x147e8440, 0x155365c0, 0x162d26c0, 0x170bbe80, 0x17ef22e0, 0x18d74820, 0x19c42100, 0x1ab59f20, 0x1babb200, 0x1ca64840, 0x1da54e80, 0x1ea8b080, 0x1fb057e0, 0x20bc2d80, 0x21cc1800, 0x22dffd40, 0x23f7c1c0, 0x25134800, 0x26327200, 0x27552000, 0x287b30c0, 0x29a48280, 0x2ad0f180, 0x2c005940, 0x2d329440, 0x2e677c00, 0x2f9ee880, 0x30d8b100, 0x3214ac40, 0x3352afc0, 0x34929040, 0x35d421c0, 0x37173780, 0x385ba480, 0x39a13b00, 0x3ae7cc40, 0x3c2f2a00, 0x3d7724c0, 0x3ebf8d80, 0x40083400, 0x4150e980, 0x42997d80, 0x43e1c000, 0x45298180, 0x46709200, 0x47b6c280, 0x48fbe380, 0x4a3fc600, 0x4b823b80, 0x4cc31600, 0x4e022800, 0x4f3f4500, 0x507a4080, 0x51b2ee80, 0x52e92580, 0x541cba80, 0x554d8580, 0x567b5e00, 0x57a61d80, 0x58cd9e00, 0x59f1bb80, 0x5b125200, 0x5c2f3f00, 0x5d486280, 0x5e5d9d00, 0x5f6ecf80, 0x607bde00, 0x6184ad00, 0x62892280, 0x63892680, 0x6484a280, 0x657b8100, 0x666daf00, 0x675b1980, 0x6843b100, 0x69276680, 0x6a062d00, 0x6adff980, 0x6bb4c180, 0x6c847d80, 0x6d4f2680, 0x6e14b800, 0x6ed52e80, 0x6f908900, 0x7046c680, 0x70f7e880, 0x71a3f300, 0x724aea00, 0x72ecd300, 0x7389b680, 0x74219c80, 0x74b48f80, 0x75429b80, 0x75cbcc80, 0x76503100, 0x76cfd800, 0x774ad280, 0x77c13180, 0x78330780, 0x78a06880, 0x79096800, 0x796e1b80, 0x79ce9980, 0x7a2af880, 0x7a835000, 0x7ad7b800, 0x7b284980, 0x7b751c80, 0x7bbe4c00, 0x7c03f080, 0x7c462580, 0x7c850480, 0x7cc0a880, 0x7cf92c00, 0x7d2eaa80, 0x7d613e00, 0x7d910180, 0x7dbe0f80, 0x7de88300, 0x7e107600, 0x7e360300, 0x7e594280, 0x7e7a4f80, 0x7e994200, 0x7eb63280, 0x7ed13a00, 0x7eea6f00, 0x7f01e980, 0x7f17c000, 0x7f2c0800, 0x7f3ed780, 0x7f504280, 0x7f605d80, 0x7f6f3c00, 0x7f7cf100, 0x7f898e00, 0x7f952500, 0x7f9fc600, 0x7fa98200, 0x7fb26800, 0x7fba8680, 0x7fc1eb80, 0x7fc8a400, 0x7fcebd80, 0x7fd44380, 0x7fd94100, 0x7fddc180, 0x7fe1ce80, 0x7fe57180, 0x7fe8b400, 0x7feb9d80, 0x7fee3680, 0x7ff08600, 0x7ff29280, 0x7ff46300, 0x7ff5fc80, 0x7ff76500, 0x7ff8a180, 0x7ff9b600, 0x7ffaa780, 0x7ffb7900, 0x7ffc2e80, 0x7ffccb80, 0x7ffd5200, 0x7ffdc580, 0x7ffe2800, 0x7ffe7b80, 0x7ffec200, 0x7ffefd80, 0x7fff2f00, 0x7fff5880, 0x7fff7a80, 0x7fff9680, 0x7fffad80, 0x7fffc000, 0x7fffcf00, 0x7fffdb00, 0x7fffe480, 0x7fffeb80, 0x7ffff180, 0x7ffff580, 0x7ffff900, 0x7ffffb00, 0x7ffffd00, 0x7ffffe00, 0x7fffff00, 0x7fffff80, 0x7fffffff, 0x7fffffff +}; + +const Word32 ivas_lfe_window_coeff_16k_fx[IVAS_LFE_FADE_LEN_16K] = { + 0x00064d50, 0x000e283c, 0x0018b753, 0x00267552, 0x0037e397, 0x004d8c2b, 0x006801d2, 0x0087dfb9, 0x00adc8fc, 0x00da680b, 0x010e6df8, 0x014a91a0, 0x018f8ecc, 0x01de252a, 0x02371734, 0x029b2908, 0x030b1f1c, 0x0387bd00, 0x0411c3e8, 0x04a9f148, 0x0550fd60, 0x060799b0, 0x06ce6f88, 0x07a61e78, 0x088f3ad0, 0x098a4c30, 0x0a97cc00, 0x0bb82430, 0x0cebadd0, 0x0e32afe0, 0x0f8d5df0, 0x10fbd760, 0x127e2680, 0x14143f40, 0x15bdff00, 0x177b2bc0, 0x194b7440, 0x1b2e6f00, 0x1d239ae0, 0x1f2a5ee0, 0x21420ac0, 0x2369d700, 0x25a0e640, 0x27e64500, 0x2a38ebc0, 0x2c97bfc0, 0x2f019400, 0x31752b00, 0x33f13800, 0x36746180, 0x38fd42c0, 0x3b8a6cc0, 0x3e1a6a80, 0x40abc080, 0x433cf080, 0x45cc7c80, 0x4858e600, 0x4ae0b400, 0x4d627280, 0x4fdcb500, 0x524e1b00, 0x54b54e80, 0x57110880, 0x59601300, 0x5ba14800, 0x5dd39780, 0x5ff60500, 0x6207aa80, 0x6407ba80, 0x65f57e80, 0x67d05b00, 0x6997cc80, 0x6b4b6b00, 0x6ceae880, 0x6e761080, 0x6fecc980, 0x714f1280, 0x729d0480, 0x73d6ce80, 0x74fcb800, 0x760f1d80, 0x770e6e80, 0x77fb2f00, 0x78d5f280, 0x799f5b80, 0x7a581b80, 0x7b00ec80, 0x7b9a9480, 0x7c25df80, 0x7ca39e80, 0x7d14a680, 0x7d79ce00, 0x7dd3eb00, 0x7e23d180, 0x7e6a5180, 0x7ea83680, 0x7ede4580, 0x7f0d3a80, 0x7f35cb00, 0x7f58a180, 0x7f765e80, 0x7f8f9880, 0x7fa4db80, 0x7fb6a700, 0x7fc57100, 0x7fd1a400, 0x7fdb9f80, 0x7fe3b980, 0x7fea3e00, 0x7fef6f80, 0x7ff38900, 0x7ff6bc80, 0x7ff93500, 0x7ffb1780, 0x7ffc8300, 0x7ffd9080, 0x7ffe5500, 0x7ffee280, 0x7fff4580, 0x7fff8a00, 0x7fffb800, 0x7fffd580, 0x7fffe880, 0x7ffff400, 0x7ffffa00, 0x7ffffd80, 0x7fffff00, 0x7fffffff +}; + +// Q31 +const UWord32 d_hamm_lfe_plc_fx[LFE_PLC_LENANA / 2] = { + 171798691, 172140039, 173163845, 174869403, 177255533, 180320587, 184062447, 188478526, + 193565772, 199320670, 205739242, 212817053, 220549212, 228930373, 237954746, 247616094, + 257907739, 268822570, 280353042, 292491188, 305228618, 318556530, 332465713, 346946555, + 361989047, 377582794, 393717019, 410380572, 427561937, 445249239, 463430255, 482092421, + 501222838, 520808286, 540835229, 561289828, 582157945, 603425159, 625076772, 647097821, + 669473086, 692187106, 715224182, 738568392, 762203605, 786113486, 810281510, 834690976, + 859325014, 884166600, 909198565, 934403610, 959764316, 985263157, 1010882509, 1036604668, + 1062411858, 1088286242, 1114209939, 1140165034, 1166133589, 1192097656, 1218039293, 1243940572, + 1269783591, 1295550491, 1321223465, 1346784770, 1372216740, 1397501800, 1422622476, 1447561406, + 1472301355, 1496825225, 1521116069, 1545157098, 1568931699, 1592423440, 1615616087, 1638493611, + 1661040202, 1683240277, 1705078494, 1726539762, 1747609248, 1768272390, 1788514910, 1808322817, + 1827682422, 1846580346, 1865003529, 1882939237, 1900375077, 1917298998, 1933699304, 1949564660, + 1964884103, 1979647046, 1993843284, 2007463009, 2020496806, 2032935668, 2044771000, 2055994621, + 2066598775, 2076576133, 2085919801, 2094623320, 2102680676, 2110086301, 2116835076, 2122922337, + 2128343877, 2133095950, 2137175272, 2140579023, 2143304850, 2145350871, 2146715671, 2147398307 +}; + +/*------------------------------------------------------------------------------------------* + * MDFT/iMDFT ROM tables + *------------------------------------------------------------------------------------------*/ + +const Word32 ivas_mdft_coeff_cos_twid_960_fx[IVAS_960_PT_LEN + 1] = { + 2147483647, + 2147480832, 2147472128, 2147457792, 2147437696, + 2147411840, 2147380096, 2147342848, 2147299712, + 2147250816, 2147196160, 2147135872, 2147069696, + 2146997888, 2146920192, 2146836864, 2146747776, + 2146652928, 2146552320, 2146445952, 2146333824, + 2146216064, 2146092416, 2145963136, 2145827968, + 2145687168, 2145540608, 2145388288, 2145230208, + 2145066496, 2144896896, 2144721664, 2144540544, + 2144353792, 2144161280, 2143963008, 2143759104, + 2143549312, 2143333888, 2143112704, 2142885760, + 2142653056, 2142414592, 2142170496, 2141920512, + 2141664896, 2141403648, 2141136512, 2140863616, + 2140585088, 2140300800, 2140010752, 2139715072, + 2139413632, 2139106432, 2138793472, 2138474752, + 2138150400, 2137820288, 2137484544, 2137142912, + 2136795648, 2136442624, 2136083968, 2135719552, + 2135349376, 2134973440, 2134591872, 2134204544, + 2133811584, 2133412864, 2133008384, 2132598272, + 2132182400, 2131760896, 2131333632, 2130900608, + 2130461952, 2130017536, 2129567360, 2129111680, + 2128650112, 2128182912, 2127710080, 2127231488, + 2126747136, 2126257152, 2125761536, 2125260160, + 2124753152, 2124240384, 2123721984, 2123197824, + 2122668032, 2122132608, 2121591424, 2121044608, + 2120492032, 2119933824, 2119369984, 2118800384, + 2118225152, 2117644288, 2117057792, 2116465536, + 2115867648, 2115264128, 2114654848, 2114039936, + 2113419392, 2112793216, 2112161408, 2111523840, + 2110880640, 2110231808, 2109577344, 2108917248, + 2108251520, 2107580032, 2106903040, 2106220288, + 2105532032, 2104838016, 2104138496, 2103433216, + 2102722304, 2102005888, 2101283712, 2100556032, + 2099822592, 2099083648, 2098338944, 2097588736, + 2096832896, 2096071424, 2095304320, 2094531712, + 2093753344, 2092969472, 2092179968, 2091384832, + 2090584192, 2089777920, 2088966016, 2088148480, + 2087325440, 2086496768, 2085662464, 2084822656, + 2083977216, 2083126272, 2082269696, 2081407488, + 2080539776, 2079666560, 2078787712, 2077903232, + 2077013248, 2076117632, 2075216640, 2074309888, + 2073397760, 2072479872, 2071556608, 2070627712, + 2069693312, 2068753408, 2067807872, 2066856832, + 2065900288, 2064938240, 2063970560, 2062997504, + 2062018816, 2061034624, 2060044928, 2059049728, + 2058049024, 2057042688, 2056030976, 2055013760, + 2053990912, 2052962688, 2051928960, 2050889728, + 2049844992, 2048794752, 2047739008, 2046677888, + 2045611136, 2044539008, 2043461376, 2042378368, + 2041289728, 2040195712, 2039096192, 2037991296, + 2036880896, 2035764992, 2034643712, 2033516928, + 2032384768, 2031247104, 2030104064, 2028955520, + 2027801600, 2026642176, 2025477376, 2024307200, + 2023131520, 2021950464, 2020764032, 2019572096, + 2018374784, 2017172096, 2015964032, 2014750592, + 2013531648, 2012307328, 2011077760, 2009842688, + 2008602240, 2007356416, 2006105216, 2004848640, + 2003586816, 2002319488, 2001046912, 1999768832, + 1998485504, 1997196800, 1995902720, 1994603264, + 1993298560, 1991988480, 1990673152, 1989352320, + 1988026240, 1986694912, 1985358208, 1984016128, + 1982668800, 1981316224, 1979958272, 1978595072, + 1977226496, 1975852672, 1974473472, 1973089152, + 1971699456, 1970304384, 1968904192, 1967498624, + 1966087808, 1964671872, 1963250560, 1961823872, + 1960392064, 1958955008, 1957512704, 1956065152, + 1954612352, 1953154304, 1951691136, 1950222592, + 1948748928, 1947270016, 1945785856, 1944296576, + 1942801920, 1941302272, 1939797248, 1938287104, + 1936771840, 1935251328, 1933725568, 1932194688, + 1930658688, 1929117440, 1927571072, 1926019584, + 1924462848, 1922900992, 1921334016, 1919761920, + 1918184576, 1916602112, 1915014656, 1913421952, + 1911824128, 1910221184, 1908613248, 1907000064, + 1905381760, 1903758464, 1902130048, 1900496512, + 1898857856, 1897214208, 1895565312, 1893911552, + 1892252544, 1890588544, 1888919552, 1887245440, + 1885566208, 1883881984, 1882192768, 1880498432, + 1878799104, 1877094656, 1875385344, 1873670912, + 1871951488, 1870227072, 1868497536, 1866763136, + 1865023744, 1863279232, 1861529856, 1859775360, + 1858016000, 1856251648, 1854482304, 1852707968, + 1850928768, 1849144448, 1847355392, 1845561216, + 1843762176, 1841958144, 1840149248, 1838335360, + 1836516608, 1834692864, 1832864384, 1831030784, + 1829192448, 1827349120, 1825500928, 1823647744, + 1821789824, 1819927040, 1818059264, 1816186624, + 1814309248, 1812426880, 1810539776, 1808647680, + 1806750848, 1804849152, 1802942720, 1801031296, + 1799115136, 1797194112, 1795268352, 1793337728, + 1791402368, 1789462144, 1787517184, 1785567360, + 1783612800, 1781653504, 1779689344, 1777720576, + 1775746944, 1773768576, 1771785344, 1769797504, + 1767804928, 1765807616, 1763805440, 1761798656, + 1759787136, 1757771008, 1755750016, 1753724416, + 1751694080, 1749659008, 1747619328, 1745574912, + 1743525888, 1741472128, 1739413760, 1737350784, + 1735283072, 1733210752, 1731133696, 1729052160, + 1726965888, 1724875008, 1722779520, 1720679424, + 1718574720, 1716465408, 1714351616, 1712233088, + 1710109952, 1707982336, 1705850112, 1703713280, + 1701571968, 1699426048, 1697275648, 1695120640, + 1692961024, 1690796928, 1688628352, 1686455296, + 1684277632, 1682095488, 1679908864, 1677717632, + 1675522048, 1673321984, 1671117312, 1668908288, + 1666694656, 1664476672, 1662254208, 1660027264, + 1657795968, 1655560192, 1653319936, 1651075200, + 1648826240, 1646572672, 1644314752, 1642052480, + 1639785728, 1637514752, 1635239168, 1632959360, + 1630675200, 1628386560, 1626093568, 1623796352, + 1621494656, 1619188736, 1616878336, 1614563712, + 1612244736, 1609921408, 1607593856, 1605261952, + 1602925696, 1600585216, 1598240384, 1595891328, + 1593538048, 1591180416, 1588818560, 1586452480, + 1584082048, 1581707520, 1579328640, 1576945536, + 1574558336, 1572166784, 1569771136, 1567371136, + 1564967040, 1562558720, 1560146304, 1557729664, + 1555308800, 1552883712, 1550454656, 1548021248, + 1545583872, 1543142272, 1540696576, 1538246656, + 1535792768, 1533334656, 1530872448, 1528406272, + 1525935872, 1523461376, 1520982912, 1518500224, + 1516013568, 1513522816, 1511028096, 1508529280, + 1506026368, 1503519488, 1501008512, 1498493568, + 1495974656, 1493451648, 1490924672, 1488393728, + 1485858816, 1483319936, 1480777088, 1478230144, + 1475679360, 1473124608, 1470565888, 1468003328, + 1465436672, 1462866176, 1460291840, 1457713536, + 1455131264, 1452545152, 1449955200, 1447361280, + 1444763520, 1442161920, 1439556352, 1436947072, + 1434333824, 1431716864, 1429095936, 1426471296, + 1423842688, 1421210368, 1418574336, 1415934336, + 1413290624, 1410643200, 1407991808, 1405336832, + 1402678016, 1400015488, 1397349120, 1394679040, + 1392005248, 1389327744, 1386646528, 1383961600, + 1381272960, 1378580608, 1375884544, 1373184768, + 1370481408, 1367774336, 1365063552, 1362349184, + 1359631232, 1356909440, 1354184192, 1351455232, + 1348722688, 1345986560, 1343246720, 1340503424, + 1337756416, 1335005952, 1332251776, 1329494144, + 1326732928, 1323968128, 1321199744, 1318427904, + 1315652480, 1312873600, 1310091136, 1307305216, + 1304515712, 1301722880, 1298926464, 1296126464, + 1293323136, 1290516352, 1287705984, 1284892288, + 1282075136, 1279254528, 1276430464, 1273603072, + 1270772224, 1267937920, 1265100288, 1262259200, + 1259414784, 1256567040, 1253715840, 1250861312, + 1248003456, 1245142272, 1242277760, 1239409920, + 1236538624, 1233664128, 1230786432, 1227905280, + 1225020928, 1222133248, 1219242368, 1216348160, + 1213450624, 1210550016, 1207646080, 1204738816, + 1201828480, 1198914816, 1195998080, 1193078016, + 1190154752, 1187228416, 1184298752, 1181366016, + 1178430080, 1175491072, 1172548736, 1169603456, + 1166654976, 1163703296, 1160748544, 1157790720, + 1154829824, 1151865728, 1148898688, 1145928448, + 1142955136, 1139978880, 1136999552, 1134017024, + 1131031680, 1128043136, 1125051648, 1122057088, + 1119059584, 1116059136, 1113055616, 1110049152, + 1107039616, 1104027264, 1101011840, 1097993600, + 1094972288, 1091948032, 1088920960, 1085890944, + 1082857984, 1079822208, 1076783488, 1073741824, + 1070697344, 1067649984, 1064599744, 1061546688, + 1058490816, 1055432064, 1052370496, 1049306112, + 1046238912, 1043168960, 1040096192, 1037020608, + 1033942272, 1030861120, 1027777280, 1024690624, + 1021601280, 1018509184, 1015414336, 1012316800, + 1009216512, 1006113536, 1003007936, 999899584, + 996788544, 993674880, 990558528, 987439552, + 984317888, 981193600, 978066688, 974937152, + 971805056, 968670336, 965532992, 962393088, + 959250560, 956105536, 952957888, 949807744, + 946655040, 943499776, 940342016, 937181696, + 934018880, 930853632, 927685824, 924515520, + 921342784, 918167552, 914989888, 911809792, + 908627200, 905442176, 902254784, 899064960, + 895872704, 892678080, 889481024, 886281600, + 883079808, 879875648, 876669120, 873460288, + 870249088, 867035584, 863819712, 860601536, + 857381120, 854158336, 850933312, 847705984, + 844476352, 841244544, 838010432, 834774080, + 831535488, 828294656, 825051648, 821806400, + 818558976, 815309376, 812057536, 808803520, + 805547392, 802289088, 799028608, 795766016, + 792501312, 789234496, 785965504, 782694464, + 779421248, 776146048, 772868736, 769589312, + 766307840, 763024320, 759738816, 756451200, + 753161600, 749870016, 746576320, 743280704, + 739983104, 736683520, 733381952, 730078400, + 726772864, 723465472, 720156096, 716844800, + 713531520, 710216384, 706899392, 703580480, + 700259648, 696936960, 693612416, 690286016, + 686957760, 683627648, 680295744, 676961984, + 673626432, 670289024, 666949888, 663608960, + 660266240, 656921728, 653575488, 650227520, + 646877760, 643526272, 640173120, 636818176, + 633461568, 630103296, 626743296, 623381568, + 620018240, 616653248, 613286592, 609918336, + 606548352, 603176832, 599803648, 596428864, + 593052544, 589674560, 586295040, 582913920, + 579531264, 576147072, 572761280, 569374016, + 565985152, 562594816, 559203008, 555809664, + 552414848, 549018560, 545620736, 542221504, + 538820864, 535418720, 532015168, 528610176, + 525203776, 521795968, 518386752, 514976160, + 511564192, 508150848, 504736160, 501320096, + 497902720, 494483968, 491063936, 487642560, + 484219904, 480795936, 477370656, 473944128, + 470516320, 467087264, 463656960, 460225408, + 456792608, 453358592, 449923392, 446486944, + 443049344, 439610528, 436170528, 432729376, + 429287072, 425843616, 422399008, 418953280, + 415506432, 412058464, 408609376, 405159232, + 401707968, 398255648, 394802272, 391347808, + 387892320, 384435776, 380978208, 377519648, + 374060032, 370599456, 367137856, 363675296, + 360211744, 356747232, 353281760, 349815360, + 346348032, 342879744, 339410560, 335940448, + 332469472, 328997568, 325524800, 322051168, + 318576640, 315101280, 311625088, 308148064, + 304670208, 301191520, 297712032, 294231776, + 290750688, 287268864, 283786240, 280302848, + 276818752, 273333888, 269848288, 266361952, + 262874928, 259387184, 255898752, 252409632, + 248919840, 245429392, 241938272, 238446512, + 234954112, 231461072, 227967424, 224473168, + 220978304, 217482848, 213986816, 210490208, + 206993040, 203495312, 199997040, 196498224, + 192998896, 189499040, 185998688, 182497840, + 178996496, 175494672, 171992384, 168489632, + 164986416, 161482768, 157978704, 154474192, + 150969280, 147463968, 143958256, 140452144, + 136945680, 133438832, 129931632, 126424088, + 122916200, 119407992, 115899456, 112390608, + 108881464, 105372032, 101862312, 98352320, + 94842064, 91331552, 87820800, 84309816, + 80798600, 77287168, 73775528, 70263696, + 66751672, 63239472, 59727100, 56214568, + 52701888, 49189064, 45676112, 42163032, + 38649844, 35136552, 31623164, 28109692, + 24596146, 21082532, 17568864, 14055147, + 10541393, 7027612, 3513810, 0 +}; + +const Word32 ivas_mdft_coeff_cos_twid_640_fx[IVAS_640_PT_LEN + 1] = { + 2147483647, + 2147477120, 2147457792, 2147425408, 2147380096, + 2147321984, 2147250816, 2147166720, 2147069696, + 2146959744, 2146836864, 2146701056, 2146552320, + 2146390656, 2146216064, 2146028416, 2145827968, + 2145614592, 2145388288, 2145149056, 2144896896, + 2144631808, 2144353792, 2144062848, 2143759104, + 2143442304, 2143112704, 2142770048, 2142414592, + 2142046208, 2141664896, 2141270784, 2140863616, + 2140443648, 2140010752, 2139565056, 2139106432, + 2138634880, 2138150400, 2137653120, 2137142912, + 2136619904, 2136083968, 2135535104, 2134973440, + 2134398976, 2133811584, 2133211392, 2132598272, + 2131972352, 2131333632, 2130681984, 2130017536, + 2129340288, 2128650112, 2127947264, 2127231488, + 2126502912, 2125761536, 2125007360, 2124240384, + 2123460608, 2122668032, 2121862656, 2121044608, + 2120213632, 2119369984, 2118513536, 2117644288, + 2116762368, 2115867648, 2114960128, 2114039936, + 2113107072, 2112161408, 2111202944, 2110231808, + 2109248000, 2108251520, 2107242240, 2106220288, + 2105185792, 2104138496, 2103078528, 2102005888, + 2100920576, 2099822592, 2098712064, 2097588736, + 2096452864, 2095304320, 2094143232, 2092969472, + 2091783168, 2090584192, 2089372672, 2088148480, + 2086911744, 2085662464, 2084400640, 2083126272, + 2081839360, 2080539776, 2079227776, 2077903232, + 2076566144, 2075216640, 2073854464, 2072479872, + 2071092864, 2069693312, 2068281344, 2066856832, + 2065420032, 2063970560, 2062508800, 2061034624, + 2059548032, 2058049024, 2056537600, 2055013760, + 2053477504, 2051928960, 2050368000, 2048794752, + 2047209088, 2045611136, 2044000896, 2042378368, + 2040743424, 2039096192, 2037436800, 2035764992, + 2034081024, 2032384768, 2030676224, 2028955520, + 2027222528, 2025477376, 2023720064, 2021950464, + 2020168704, 2018374784, 2016568704, 2014750592, + 2012920192, 2011077760, 2009223168, 2007356416, + 2005477632, 2003586816, 2001683840, 1999768832, + 1997841792, 1995902720, 1993951616, 1991988480, + 1990013440, 1988026240, 1986027264, 1984016128, + 1981993216, 1979958272, 1977911424, 1975852672, + 1973782016, 1971699456, 1969604992, 1967498624, + 1965380480, 1963250560, 1961108736, 1958955008, + 1956789632, 1954612352, 1952423424, 1950222592, + 1948010112, 1945785856, 1943549952, 1941302272, + 1939042816, 1936771840, 1934489088, 1932194688, + 1929888768, 1927571072, 1925241856, 1922900992, + 1920548608, 1918184576, 1915809024, 1913421952, + 1911023360, 1908613248, 1906191616, 1903758464, + 1901313920, 1898857856, 1896390400, 1893911552, + 1891421184, 1888919552, 1886406400, 1883881984, + 1881346176, 1878799104, 1876240640, 1873670912, + 1871089920, 1868497536, 1865894016, 1863279232, + 1860653184, 1858016000, 1855367552, 1852707968, + 1850037248, 1847355392, 1844662272, 1841958144, + 1839242880, 1836516608, 1833779200, 1831030784, + 1828271360, 1825500928, 1822719360, 1819927040, + 1817123584, 1814309248, 1811483904, 1808647680, + 1805800704, 1802942720, 1800073856, 1797194112, + 1794303616, 1791402368, 1788490240, 1785567360, + 1782633728, 1779689344, 1776734336, 1773768576, + 1770792064, 1767804928, 1764807168, 1761798656, + 1758779648, 1755750016, 1752709760, 1749659008, + 1746597760, 1743525888, 1740443520, 1737350784, + 1734247424, 1731133696, 1728009600, 1724875008, + 1721730048, 1718574720, 1715409024, 1712233088, + 1709046784, 1705850112, 1702643200, 1699426048, + 1696198656, 1692961024, 1689713280, 1686455296, + 1683187072, 1679908864, 1676620416, 1673321984, + 1670013312, 1666694656, 1663366016, 1660027264, + 1656678656, 1653319936, 1649951232, 1646572672, + 1643184128, 1639785728, 1636377472, 1632959360, + 1629531392, 1626093568, 1622646016, 1619188736, + 1615721600, 1612244736, 1608758144, 1605261952, + 1601756032, 1598240384, 1594715264, 1591180416, + 1587636096, 1584082048, 1580518656, 1576945536, + 1573363072, 1569771136, 1566169600, 1562558720, + 1558938496, 1555308800, 1551669760, 1548021248, + 1544363648, 1540696576, 1537020288, 1533334656, + 1529639808, 1525935872, 1522222592, 1518500224, + 1514768768, 1511028096, 1507278336, 1503519488, + 1499751552, 1495974656, 1492188672, 1488393728, + 1484589824, 1480777088, 1476955264, 1473124608, + 1469285120, 1465436672, 1461579520, 1457713536, + 1453838720, 1449955200, 1446062848, 1442161920, + 1438252160, 1434333824, 1430406912, 1426471296, + 1422527104, 1418574336, 1414612992, 1410643200, + 1406664832, 1402678016, 1398682752, 1394679040, + 1390667008, 1386646528, 1382617728, 1378580608, + 1374535168, 1370481408, 1366419456, 1362349184, + 1358270848, 1354184192, 1350089472, 1345986560, + 1341875584, 1337756416, 1333629312, 1329494144, + 1325350912, 1321199744, 1317040640, 1312873600, + 1308698624, 1304515712, 1300325120, 1296126464, + 1291920128, 1287705984, 1283484160, 1279254528, + 1275017216, 1270772224, 1266519552, 1262259200, + 1257991296, 1253715840, 1249432832, 1245142272, + 1240844160, 1236538624, 1232225664, 1227905280, + 1223577472, 1219242368, 1214899840, 1210550016, + 1206192896, 1201828480, 1197456896, 1193078016, + 1188691968, 1184298752, 1179898496, 1175491072, + 1171076480, 1166654976, 1162226304, 1157790720, + 1153348224, 1148898688, 1144442240, 1139978880, + 1135508608, 1131031680, 1126547712, 1122057088, + 1117559680, 1113055616, 1108544768, 1104027264, + 1099503104, 1094972288, 1090434944, 1085890944, + 1081340416, 1076783488, 1072219968, 1067649984, + 1063073600, 1058490816, 1053901632, 1049306112, + 1044704320, 1040096192, 1035481792, 1030861120, + 1026234304, 1021601280, 1016962112, 1012316800, + 1007665408, 1003007936, 998344384, 993674880, + 988999360, 984317888, 979630464, 974937152, + 970238016, 965532992, 960822144, 956105536, + 951383104, 946655040, 941921216, 937181696, + 932436544, 927685824, 922929472, 918167552, + 913400128, 908627200, 903848768, 899064960, + 894275648, 889481024, 884681024, 879875648, + 875065024, 870249088, 865427968, 860601536, + 855769984, 850933312, 846091456, 841244544, + 836392512, 831535488, 826673472, 821806400, + 816934464, 812057536, 807175744, 802289088, + 797397632, 792501312, 787600256, 782694464, + 777783936, 772868736, 767948864, 763024320, + 758095232, 753161600, 748223424, 743280704, + 738333568, 733381952, 728425856, 723465472, + 718500672, 713531520, 708558144, 703580480, + 698598528, 693612416, 688622080, 683627648, + 678629056, 673626432, 668619712, 663608960, + 658594176, 653575488, 648552832, 643526272, + 638495872, 633461568, 628423488, 623381568, + 618335936, 613286592, 608233536, 603176832, + 598116480, 593052544, 587985024, 582913920, + 577839360, 572761280, 567679744, 562594816, + 557506496, 552414848, 547319808, 542221504, + 537119936, 532015168, 526907136, 521795968, + 516681632, 511564192, 506443680, 501320096, + 496193504, 491063936, 485931392, 480795936, + 475657568, 470516320, 465372256, 460225408, + 455075776, 449923392, 444768288, 439610528, + 434450112, 429287072, 424121440, 418953280, + 413782592, 408609376, 403433728, 398255648, + 393075168, 387892320, 382707136, 377519648, + 372329856, 367137856, 361943648, 356747232, + 351548672, 346348032, 341145280, 335940448, + 330733632, 325524800, 320314016, 315101280, + 309886688, 304670208, 299451872, 294231776, + 289009856, 283786240, 278560896, 273333888, + 268105200, 262874928, 257643056, 252409632, + 247174704, 241938272, 236700384, 231461072, + 226220368, 220978304, 215734912, 210490208, + 205244240, 199997040, 194748624, 189499040, + 184248320, 178996496, 173743584, 168489632, + 163234656, 157978704, 152721792, 147463968, + 142205248, 136945680, 131685280, 126424088, + 121162136, 115899456, 110636072, 105372032, + 100107344, 94842064, 89576208, 84309816, + 79042912, 73775528, 68507704, 63239472, + 57970852, 52701888, 47432604, 42163032, + 36893208, 31623164, 26352928, 21082532, + 15812011, 10541393, 5270713, 0 +}; + +const Word32 ivas_mdft_coeff_cos_twid_320_fx[IVAS_320_PT_LEN + 1] = { + 2147483647, + 2147457792, 2147380096, 2147250816, 2147069696, + 2146836864, 2146552320, 2146216064, 2145827968, + 2145388288, 2144896896, 2144353792, 2143759104, + 2143112704, 2142414592, 2141664896, 2140863616, + 2140010752, 2139106432, 2138150400, 2137142912, + 2136083968, 2134973440, 2133811584, 2132598272, + 2131333632, 2130017536, 2128650112, 2127231488, + 2125761536, 2124240384, 2122668032, 2121044608, + 2119369984, 2117644288, 2115867648, 2114039936, + 2112161408, 2110231808, 2108251520, 2106220288, + 2104138496, 2102005888, 2099822592, 2097588736, + 2095304320, 2092969472, 2090584192, 2088148480, + 2085662464, 2083126272, 2080539776, 2077903232, + 2075216640, 2072479872, 2069693312, 2066856832, + 2063970560, 2061034624, 2058049024, 2055013760, + 2051928960, 2048794752, 2045611136, 2042378368, + 2039096192, 2035764992, 2032384768, 2028955520, + 2025477376, 2021950464, 2018374784, 2014750592, + 2011077760, 2007356416, 2003586816, 1999768832, + 1995902720, 1991988480, 1988026240, 1984016128, + 1979958272, 1975852672, 1971699456, 1967498624, + 1963250560, 1958955008, 1954612352, 1950222592, + 1945785856, 1941302272, 1936771840, 1932194688, + 1927571072, 1922900992, 1918184576, 1913421952, + 1908613248, 1903758464, 1898857856, 1893911552, + 1888919552, 1883881984, 1878799104, 1873670912, + 1868497536, 1863279232, 1858016000, 1852707968, + 1847355392, 1841958144, 1836516608, 1831030784, + 1825500928, 1819927040, 1814309248, 1808647680, + 1802942720, 1797194112, 1791402368, 1785567360, + 1779689344, 1773768576, 1767804928, 1761798656, + 1755750016, 1749659008, 1743525888, 1737350784, + 1731133696, 1724875008, 1718574720, 1712233088, + 1705850112, 1699426048, 1692961024, 1686455296, + 1679908864, 1673321984, 1666694656, 1660027264, + 1653319936, 1646572672, 1639785728, 1632959360, + 1626093568, 1619188736, 1612244736, 1605261952, + 1598240384, 1591180416, 1584082048, 1576945536, + 1569771136, 1562558720, 1555308800, 1548021248, + 1540696576, 1533334656, 1525935872, 1518500224, + 1511028096, 1503519488, 1495974656, 1488393728, + 1480777088, 1473124608, 1465436672, 1457713536, + 1449955200, 1442161920, 1434333824, 1426471296, + 1418574336, 1410643200, 1402678016, 1394679040, + 1386646528, 1378580608, 1370481408, 1362349184, + 1354184192, 1345986560, 1337756416, 1329494144, + 1321199744, 1312873600, 1304515712, 1296126464, + 1287705984, 1279254528, 1270772224, 1262259200, + 1253715840, 1245142272, 1236538624, 1227905280, + 1219242368, 1210550016, 1201828480, 1193078016, + 1184298752, 1175491072, 1166654976, 1157790720, + 1148898688, 1139978880, 1131031680, 1122057088, + 1113055616, 1104027264, 1094972288, 1085890944, + 1076783488, 1067649984, 1058490816, 1049306112, + 1040096192, 1030861120, 1021601280, 1012316800, + 1003007936, 993674880, 984317888, 974937152, + 965532992, 956105536, 946655040, 937181696, + 927685824, 918167552, 908627200, 899064960, + 889481024, 879875648, 870249088, 860601536, + 850933312, 841244544, 831535488, 821806400, + 812057536, 802289088, 792501312, 782694464, + 772868736, 763024320, 753161600, 743280704, + 733381952, 723465472, 713531520, 703580480, + 693612416, 683627648, 673626432, 663608960, + 653575488, 643526272, 633461568, 623381568, + 613286592, 603176832, 593052544, 582913920, + 572761280, 562594816, 552414848, 542221504, + 532015168, 521795968, 511564192, 501320096, + 491063936, 480795936, 470516320, 460225408, + 449923392, 439610528, 429287072, 418953280, + 408609376, 398255648, 387892320, 377519648, + 367137856, 356747232, 346348032, 335940448, + 325524800, 315101280, 304670208, 294231776, + 283786240, 273333888, 262874928, 252409632, + 241938272, 231461072, 220978304, 210490208, + 199997040, 189499040, 178996496, 168489632, + 157978704, 147463968, 136945680, 126424088, + 115899456, 105372032, 94842064, 84309816, + 73775528, 63239472, 52701888, 42163032, + 31623164, 21082532, 10541393, 0 +}; + +const Word32 ivas_mdft_coeff_cos_twid_240_fx[IVAS_240_PT_LEN + 1] = { + 2147483647, + 2147437696, 2147299712, 2147069696, 2146747776, + 2146333824, 2145827968, 2145230208, 2144540544, + 2143759104, 2142885760, 2141920512, 2140863616, + 2139715072, 2138474752, 2137142912, 2135719552, + 2134204544, 2132598272, 2130900608, 2129111680, + 2127231488, 2125260160, 2123197824, 2121044608, + 2118800384, 2116465536, 2114039936, 2111523840, + 2108917248, 2106220288, 2103433216, 2100556032, + 2097588736, 2094531712, 2091384832, 2088148480, + 2084822656, 2081407488, 2077903232, 2074309888, + 2070627712, 2066856832, 2062997504, 2059049728, + 2055013760, 2050889728, 2046677888, 2042378368, + 2037991296, 2033516928, 2028955520, 2024307200, + 2019572096, 2014750592, 2009842688, 2004848640, + 1999768832, 1994603264, 1989352320, 1984016128, + 1978595072, 1973089152, 1967498624, 1961823872, + 1956065152, 1950222592, 1944296576, 1938287104, + 1932194688, 1926019584, 1919761920, 1913421952, + 1907000064, 1900496512, 1893911552, 1887245440, + 1880498432, 1873670912, 1866763136, 1859775360, + 1852707968, 1845561216, 1838335360, 1831030784, + 1823647744, 1816186624, 1808647680, 1801031296, + 1793337728, 1785567360, 1777720576, 1769797504, + 1761798656, 1753724416, 1745574912, 1737350784, + 1729052160, 1720679424, 1712233088, 1703713280, + 1695120640, 1686455296, 1677717632, 1668908288, + 1660027264, 1651075200, 1642052480, 1632959360, + 1623796352, 1614563712, 1605261952, 1595891328, + 1586452480, 1576945536, 1567371136, 1557729664, + 1548021248, 1538246656, 1528406272, 1518500224, + 1508529280, 1498493568, 1488393728, 1478230144, + 1468003328, 1457713536, 1447361280, 1436947072, + 1426471296, 1415934336, 1405336832, 1394679040, + 1383961600, 1373184768, 1362349184, 1351455232, + 1340503424, 1329494144, 1318427904, 1307305216, + 1296126464, 1284892288, 1273603072, 1262259200, + 1250861312, 1239409920, 1227905280, 1216348160, + 1204738816, 1193078016, 1181366016, 1169603456, + 1157790720, 1145928448, 1134017024, 1122057088, + 1110049152, 1097993600, 1085890944, 1073741824, + 1061546688, 1049306112, 1037020608, 1024690624, + 1012316800, 999899584, 987439552, 974937152, + 962393088, 949807744, 937181696, 924515520, + 911809792, 899064960, 886281600, 873460288, + 860601536, 847705984, 834774080, 821806400, + 808803520, 795766016, 782694464, 769589312, + 756451200, 743280704, 730078400, 716844800, + 703580480, 690286016, 676961984, 663608960, + 650227520, 636818176, 623381568, 609918336, + 596428864, 582913920, 569374016, 555809664, + 542221504, 528610176, 514976160, 501320096, + 487642560, 473944128, 460225408, 446486944, + 432729376, 418953280, 405159232, 391347808, + 377519648, 363675296, 349815360, 335940448, + 322051168, 308148064, 294231776, 280302848, + 266361952, 252409632, 238446512, 224473168, + 210490208, 196498224, 182497840, 168489632, + 154474192, 140452144, 126424088, 112390608, + 98352320, 84309816, 70263696, 56214568, + 42163032, 28109692, 14055147, 0 +}; + +const Word32 ivas_mdft_coeff_cos_twid_160_fx[IVAS_160_PT_LEN + 1] = { + 2147483647, + 2147380096, 2147069696, 2146552320, 2145827968, + 2144896896, 2143759104, 2142414592, 2140863616, + 2139106432, 2137142912, 2134973440, 2132598272, + 2130017536, 2127231488, 2124240384, 2121044608, + 2117644288, 2114039936, 2110231808, 2106220288, + 2102005888, 2097588736, 2092969472, 2088148480, + 2083126272, 2077903232, 2072479872, 2066856832, + 2061034624, 2055013760, 2048794752, 2042378368, + 2035764992, 2028955520, 2021950464, 2014750592, + 2007356416, 1999768832, 1991988480, 1984016128, + 1975852672, 1967498624, 1958955008, 1950222592, + 1941302272, 1932194688, 1922900992, 1913421952, + 1903758464, 1893911552, 1883881984, 1873670912, + 1863279232, 1852707968, 1841958144, 1831030784, + 1819927040, 1808647680, 1797194112, 1785567360, + 1773768576, 1761798656, 1749659008, 1737350784, + 1724875008, 1712233088, 1699426048, 1686455296, + 1673321984, 1660027264, 1646572672, 1632959360, + 1619188736, 1605261952, 1591180416, 1576945536, + 1562558720, 1548021248, 1533334656, 1518500224, + 1503519488, 1488393728, 1473124608, 1457713536, + 1442161920, 1426471296, 1410643200, 1394679040, + 1378580608, 1362349184, 1345986560, 1329494144, + 1312873600, 1296126464, 1279254528, 1262259200, + 1245142272, 1227905280, 1210550016, 1193078016, + 1175491072, 1157790720, 1139978880, 1122057088, + 1104027264, 1085890944, 1067649984, 1049306112, + 1030861120, 1012316800, 993674880, 974937152, + 956105536, 937181696, 918167552, 899064960, + 879875648, 860601536, 841244544, 821806400, + 802289088, 782694464, 763024320, 743280704, + 723465472, 703580480, 683627648, 663608960, + 643526272, 623381568, 603176832, 582913920, + 562594816, 542221504, 521795968, 501320096, + 480795936, 460225408, 439610528, 418953280, + 398255648, 377519648, 356747232, 335940448, + 315101280, 294231776, 273333888, 252409632, + 231461072, 210490208, 189499040, 168489632, + 147463968, 126424088, 105372032, 84309816, + 63239472, 42163032, 21082532, 0 +}; + +const Word32 ivas_mdft_coeff_cos_twid_120_fx[IVAS_120_PT_LEN + 1] = { + 2147483647, + 2147299712, 2146747776, 2145827968, 2144540544, + 2142885760, 2140863616, 2138474752, 2135719552, + 2132598272, 2129111680, 2125260160, 2121044608, + 2116465536, 2111523840, 2106220288, 2100556032, + 2094531712, 2088148480, 2081407488, 2074309888, + 2066856832, 2059049728, 2050889728, 2042378368, + 2033516928, 2024307200, 2014750592, 2004848640, + 1994603264, 1984016128, 1973089152, 1961823872, + 1950222592, 1938287104, 1926019584, 1913421952, + 1900496512, 1887245440, 1873670912, 1859775360, + 1845561216, 1831030784, 1816186624, 1801031296, + 1785567360, 1769797504, 1753724416, 1737350784, + 1720679424, 1703713280, 1686455296, 1668908288, + 1651075200, 1632959360, 1614563712, 1595891328, + 1576945536, 1557729664, 1538246656, 1518500224, + 1498493568, 1478230144, 1457713536, 1436947072, + 1415934336, 1394679040, 1373184768, 1351455232, + 1329494144, 1307305216, 1284892288, 1262259200, + 1239409920, 1216348160, 1193078016, 1169603456, + 1145928448, 1122057088, 1097993600, 1073741824, + 1049306112, 1024690624, 999899584, 974937152, + 949807744, 924515520, 899064960, 873460288, + 847705984, 821806400, 795766016, 769589312, + 743280704, 716844800, 690286016, 663608960, + 636818176, 609918336, 582913920, 555809664, + 528610176, 501320096, 473944128, 446486944, + 418953280, 391347808, 363675296, 335940448, + 308148064, 280302848, 252409632, 224473168, + 196498224, 168489632, 140452144, 112390608, + 84309816, 56214568, 28109692, 0 +}; + +const Word32 ivas_mdft_coeff_cos_twid_80_fx[IVAS_80_PT_LEN + 1] = { + 2147483647, + 2147069696, 2145827968, 2143759104, 2140863616, + 2137142912, 2132598272, 2127231488, 2121044608, + 2114039936, 2106220288, 2097588736, 2088148480, + 2077903232, 2066856832, 2055013760, 2042378368, + 2028955520, 2014750592, 1999768832, 1984016128, + 1967498624, 1950222592, 1932194688, 1913421952, + 1893911552, 1873670912, 1852707968, 1831030784, + 1808647680, 1785567360, 1761798656, 1737350784, + 1712233088, 1686455296, 1660027264, 1632959360, + 1605261952, 1576945536, 1548021248, 1518500224, + 1488393728, 1457713536, 1426471296, 1394679040, + 1362349184, 1329494144, 1296126464, 1262259200, + 1227905280, 1193078016, 1157790720, 1122057088, + 1085890944, 1049306112, 1012316800, 974937152, + 937181696, 899064960, 860601536, 821806400, + 782694464, 743280704, 703580480, 663608960, + 623381568, 582913920, 542221504, 501320096, + 460225408, 418953280, 377519648, 335940448, + 294231776, 252409632, 210490208, 168489632, + 126424088, 84309816, 42163032, 0 +}; + +const Word32 ivas_mdft_coeff_cos_twid_40_fx[IVAS_40_PT_LEN + 1] = { + 2147483647, + 2145827968, 2140863616, 2132598272, 2121044608, + 2106220288, 2088148480, 2066856832, 2042378368, + 2014750592, 1984016128, 1950222592, 1913421952, + 1873670912, 1831030784, 1785567360, 1737350784, + 1686455296, 1632959360, 1576945536, 1518500224, + 1457713536, 1394679040, 1329494144, 1262259200, + 1193078016, 1122057088, 1049306112, 974937152, + 899064960, 821806400, 743280704, 663608960, + 582913920, 501320096, 418953280, 335940448, + 252409632, 168489632, 84309816, 0 +}; + +// Q30 +const Word32 dirac_gains_norm_term_int[9] = { + 1073741824, 759250176, 1073741824, 438353280, 219176688, 1073741824, 309962528, 98018768, + 40015996 +}; + +// Q31 +const Word32 dirac_gains_norm_term_fx[9] = { + 2147483647, 1518500352, 2147483647, 876706560, 438353376, 2147483647, 619925056, 196037536, 80031992 +}; + +// Q27 +const Word32 dirac_gains_Pnm_int[91][9] = { + { -134217728, 0, 134217728, 0, 0, -134217728, 0, 0, 0 }, + { -134197288, 2342396, 134156400, -7026119, 122639, -134095104, 14049026, -613106, 10701 }, + { -134135976, 4684105, 133972536, -14043751, 490416, -133727536, 28061840, -2450586, 85575 }, + { -134033784, 7024438, 133666264, -21044428, 1102895, -133115936, 42002312, -5506921, 288606 }, + { -133890784, 9362478, 133238096, -28019012, 1959264, -132262040, 55833192, -9772457, 683351 }, + { -133706992, 11697809, 132688440, -34959892, 3058584, -131167848, 69520408, -15234719, 1332861 }, + { -133482480, 14029564, 132017976, -41858120, 4399464, -129836328, 83027720, -21876818, 2299344 }, + { -133217280, 16357047, 131227600, -48705360, 5980272, -128270864, 96320208, -29678480, 3644062 }, + { -132911536, 18679510, 130318176, -55493180, 7799064, -126475552, 109363520, -38615824, 5427104 }, + { -132565296, 20996256, 129290928, -62213284, 9853607, -124455056, 122123976, -48661468, 7707213 }, + { -132178656, 23306694, 128146968, -68857816, 12141505, -122214432, 134569248, -59785232, 10541761 }, + { -131751776, 25609964, 126887800, -75418320, 14659851, -119759704, 146666688, -71952528, 13986158 }, + { -131284736, 27905410, 125514928, -81886824, 17405570, -117097048, 158385376, -85126080, 18094094 }, + { -130777744, 30192412, 124030024, -88255768, 20375446, -114233392, 169695776, -99266128, 22917396 }, + { -130230888, 32470208, 122434848, -94517128, 23565774, -111176104, 180568608, -114328832, 28505376 }, + { -129644368, 34738112, 120731408, -100663320, 26972664, -107933048, 190976128, -130267952, 34905200 }, + { -129018344, 36995424, 118921736, -106686840, 30591964, -104512608, 200891728, -147034448, 42161440 }, + { -128353056, 39241452, 117008088, -112580368, 34419264, -100923608, 210290720, -164576576, 50316080 }, + { -127648640, 41475572, 114992728, -118336848, 38449984, -97175216, 219149232, -182840512, 59408524 }, + { -126905360, 43697012, 112878208, -123949000, 42679048, -93277184, 227444688, -201769248, 69474696 }, + { -126123408, 45905176, 110666976, -129410248, 47101484, -89239304, 235156848, -221304640, 80548296 }, + { -125303040, 48099312, 108361848, -134713792, 51711740, -85072152, 242266352, -241385344, 92659128 }, + { -124444528, 50278820, 105965584, -139853120, 56504308, -80786280, 248755776, -261949392, 105834368 }, + { -123548080, 52443040, 103481048, -144822272, 61473384, -76392608, 254609280, -282932704, 120097808 }, + { -122614016, 54591264, 100911328, -149614784, 66612780, -71902504, 259812912, -304269024, 135469312 }, + { -121642584, 56722880, 98259536, -154225168, 71916384, -67327280, 264354304, -325891904, 151965872 }, + { -120634104, 58837188, 95528944, -158647504, 77377552, -62678672, 268222720, -347732352, 169600480 }, + { -119588872, 60933588, 92722800, -162876704, 82989840, -57968464, 271409984, -369722464, 188383040 }, + { -118507224, 63011412, 89844624, -166907264, 88746208, -53208660, 273908992, -391791360, 208319200 }, + { -117389480, 65070028, 86897888, -170734608, 94639696, -48411356, 275714624, -413868832, 229411120 }, + { -116235952, 67108864, 83886096, -174353936, 100663296, -43588484, 276824064, -435884832, 251658240 }, + { -115047032, 69127240, 80812992, -177760784, 106809472, -38752388, 277236128, -457767936, 275054816 }, + { -113823072, 71124576, 77682296, -180951136, 113070880, -33915128, 276951296, -479447744, 299592224 }, + { -112564464, 73100224, 74497888, -183920976, 119439696, -29088994, 275972448, -500852768, 325257600 }, + { -111271560, 75053584, 71263600, -186666800, 125908272, -24285974, 274304128, -521913568, 352034976 }, + { -109944736, 76984136, 67983320, -189185120, 132468856, -19517968, 271952224, -542560640, 379905024 }, + { -108584440, 78891192, 64661120, -191472992, 139113184, -14796968, 268925472, -562724864, 408843424 }, + { -107191040, 80774240, 61300996, -193527600, 145833472, -10134552, 265233552, -582338944, 438823936 }, + { -105765016, 82632672, 57907084, -195346384, 152621264, -5542341, 260888528, -601335936, 469815200 }, + { -104306760, 84465968, 54483472, -196927072, 159468512, -1031517, 255903808, -619651456, 501783968 }, + { -102816736, 86273488, 51034412, -198267904, 166366624, 3386773, 250294992, -637221056, 534692032 }, + { -101295408, 88054736, 47564080, -199367280, 173307296, 7701825, 244078832, -653983232, 568498944 }, + { -99743224, 89809192, 44076620, -200223728, 180282192, 11903295, 237274256, -669879040, 603161856 }, + { -98160648, 91536272, 40576356, -200836160, 187282720, 15980983, 229901280, -684849728, 638632640 }, + { -96548144, 93235488, 37067500, -201203920, 194300432, 19925212, 221981760, -698840192, 674862144 }, + { -94906272, 94906272, 33554432, -201326592, 201326592, 23726568, 213539056, -711796992, 711796992 }, + { -93235488, 96548144, 30041364, -201203920, 208352752, 27376188, 204597888, -723670016, 749382016 }, + { -91536272, 98160648, 26532496, -200836160, 215370464, 30865648, 195183856, -734411520, 787559936 }, + { -89809200, 99743208, 23032272, -200223728, 222370864, 34186800, 185324752, -743976000, 826268864 }, + { -88054736, 101295408, 19544786, -199367280, 229345888, 37332284, 175048640, -752322176, 865447872 }, + { -86273488, 102816736, 16074439, -198268032, 236286560, 40294912, 164385440, -759410496, 905030144 }, + { -84465944, 104306784, 12625336, -196927072, 243184800, 43068320, 153365504, -765205632, 944950528 }, + { -82632672, 105765016, 9201773, -195346384, 250031920, 45646496, 142020480, -769675200, 985139200 }, + { -80774256, 107191032, 5807891, -193527600, 256819584, 48024044, 130382952, -772789696, 1025526400 }, + { -78891192, 108584440, 2447739, -191472992, 263540000, 50196224, 118485736, -774524480, 1066041600 }, + { -76984120, 109944720, -874438, -189185120, 270184320, 52158672, 106363224, -774856768, 1106610176 }, + { -75053584, 111271544, -4154720, -186666800, 276744864, 53907864, 94049432, -773768704, 1147159552 }, + { -73100224, 112564464, -7389016, -183920976, 283213504, 55440728, 81579720, -771245696, 1187614080 }, + { -71124568, 113823072, -10573435, -180951136, 289582400, 56754824, 68989160, -767276288, 1227898496 }, + { -69127232, 115047064, -13704140, -177760784, 295843776, 57848416, 56313356, -761853888, 1267938048 }, + { -67108880, 116235952, -16777203, -174353936, 301989888, 58720256, 43588536, -754974720, 1307654528 }, + { -65070028, 117389472, -19788994, -170734608, 308013440, 59369844, 30850226, -746639232, 1346972928 }, + { -63011400, 118507224, -22735772, -166907264, 313906944, 59797272, 18134762, -736851968, 1385816832 }, + { -60933588, 119588872, -25613950, -162876704, 319663424, 60003204, 5477891, -725620736, 1424110464 }, + { -58837172, 120634088, -28420080, -158647504, 325275584, 59989016, -7084927, -712957184, 1461778688 }, + { -56722868, 121642576, -31150674, -154225168, 330736768, 59756660, -19517928, -698877184, 1498746240 }, + { -54591276, 122613992, -33802452, -149614784, 336040384, 59308680, -31786382, -683399744, 1534940800 }, + { -52443040, 123548064, -36372160, -144822272, 341179712, 58648260, -43855684, -666547776, 1570288384 }, + { -50278848, 124444520, -38856688, -139853264, 346148864, 57779188, -55691916, -648348160, 1604717952 }, + { -48099324, 125303040, -41252988, -134713792, 350941376, 56705796, -67261816, -628830848, 1638160896 }, + { -45905160, 126123416, -43558124, -129410240, 355551744, 55433036, -78532848, -608029120, 1670546304 }, + { -43697012, 126905360, -45769332, -123949000, 359974080, 53966400, -89473440, -585980480, 1701810944 }, + { -41475560, 127648632, -47883864, -118336808, 364203168, 52311936, -100052728, -562724992, 1731889152 }, + { -39241464, 128353048, -49899212, -112580408, 368233856, 50476188, -110241232, -538305984, 1760719104 }, + { -36995424, 129018360, -51812888, -106686856, 372061216, 48466224, -120010336, -512769824, 1788240512 }, + { -34738100, 129644368, -53622532, -100663280, 375680512, 46289628, -129332608, -486166400, 1814398208 }, + { -32470208, 130230888, -55325984, -94517088, 379087360, 43954400, -138181984, -458547616, 1839134464 }, + { -30192412, 130777744, -56921148, -88255752, 382277728, 41469052, -146533552, -429968768, 1862399872 }, + { -27905450, 131284752, -58406064, -81886920, 385247552, 38842476, -154363936, -400487584, 1884144384 }, + { -25609950, 131751776, -59778952, -75418272, 387993376, 36083912, -161651424, -370163232, 1904324096 }, + { -23306666, 132178656, -61038128, -68857760, 390511712, 33203050, -168375472, -339058272, 1922894464 }, + { -20996270, 132565280, -62182040, -62213328, 392799456, 30209874, -174517136, -307236864, 1939817984 }, + { -18679498, 132911536, -63209344, -55493124, 394854208, 27114732, -180059392, -274765312, 1955057024 }, + { -16357021, 133217280, -64118736, -48705292, 396672992, 23928188, -184986656, -241711232, 1968580864 }, + { -14029578, 133482472, -64909128, -41858176, 398253664, 20661142, -189285248, -208144320, 1980359808 }, + { -11697849, 133706992, -65579560, -34960012, 399594624, 17324636, -192943088, -174134880, 1990369664 }, + { -9362556, 133890784, -66129224, -28019252, 400693888, 13929935, -195949824, -139755008, 1998589184 }, + { -7024411, 134033784, -66557432, -21044346, 401550304, 10488515, -198297168, -105077560, 2004999424 }, + { -4684126, 134135976, -66863648, -14043818, 402162752, 7011926, -199978640, -70176320, 2009588352 }, + { -2342414, 134197304, -67047540, -7026174, 402530496, 3511839, -200989440, -35125516, 2012346496 }, + { -5, 134217728, -67108864, -17, 402653184, 8, -201326592, -88, 2013265920 } +}; + +// Q30 +const Word32 dirac_gains_trg_term_int[181][2] = { + { -1073741824, 93 }, + { -1073578304, -18739436 }, + { -1073087680, -37473000 }, + { -1072270272, -56195404 }, + { -1071126272, -74900440 }, + { -1069655936, -93582656 }, + { -1067859776, -112236624 }, + { -1065738240, -130856168 }, + { -1063292288, -149436080 }, + { -1060522368, -167970160 }, + { -1057429248, -186453440 }, + { -1054014208, -204879600 }, + { -1050278016, -223243376 }, + { -1046221952, -241539408 }, + { -1041847104, -259761664 }, + { -1037154944, -277904896 }, + { -1032146880, -295963392 }, + { -1026824448, -313931616 }, + { -1021189120, -331804480 }, + { -1015242880, -349576096 }, + { -1008987264, -367241408 }, + { -1002424448, -384794592 }, + { -995556160, -402230656 }, + { -988384640, -419544416 }, + { -980912000, -436730112 }, + { -973140608, -453782944 }, + { -965072832, -470697376 }, + { -956710976, -487468704 }, + { -948057792, -504091296 }, + { -939115840, -520560224 }, + { -929887680, -536871040 }, + { -920376384, -553017856 }, + { -910584576, -568996544 }, + { -900515712, -584801664 }, + { -890172480, -600428672 }, + { -879557888, -615873088 }, + { -868675520, -631129536 }, + { -857528320, -646194048 }, + { -846120128, -661061376 }, + { -834454080, -675727744 }, + { -822533888, -690187904 }, + { -810363392, -704438016 }, + { -797945664, -718473536 }, + { -785285056, -732290112 }, + { -772385152, -745883904 }, + { -759250176, -759250176 }, + { -745883904, -772385152 }, + { -732290112, -785285056 }, + { -718473600, -797945664 }, + { -704438016, -810363392 }, + { -690187904, -822533888 }, + { -675727552, -834454144 }, + { -661061376, -846120128 }, + { -646194048, -857528320 }, + { -631129536, -868675392 }, + { -615873088, -879557760 }, + { -600428672, -890172352 }, + { -584801792, -900515712 }, + { -568996544, -910584576 }, + { -553017856, -920376384 }, + { -536871040, -929887680 }, + { -520560224, -939115776 }, + { -504091296, -948057792 }, + { -487468704, -956710976 }, + { -470697376, -965072832 }, + { -453782944, -973140608 }, + { -436730208, -980911936 }, + { -419544416, -988384640 }, + { -402230784, -995556160 }, + { -384794592, -1002424448 }, + { -367241280, -1008987264 }, + { -349576096, -1015242880 }, + { -331804480, -1021189120 }, + { -313931712, -1026824384 }, + { -295963392, -1032146880 }, + { -277904800, -1037154944 }, + { -259761664, -1041847104 }, + { -241539296, -1046221952 }, + { -223243488, -1050278016 }, + { -204879600, -1054014208 }, + { -186453328, -1057429248 }, + { -167970160, -1060522368 }, + { -149435984, -1063292288 }, + { -130856168, -1065738240 }, + { -112236624, -1067859776 }, + { -93582792, -1069655936 }, + { -74900448, -1071126272 }, + { -56195288, -1072270272 }, + { -37473008, -1073087680 }, + { -18739318, -1073578304 }, + { -46, -1073741824 }, + { 18739350, -1073578304 }, + { 37473052, -1073087680 }, + { 56195320, -1072270272 }, + { 74900480, -1071126272 }, + { 93582824, -1069655936 }, + { 112236512, -1067859776 }, + { 130856168, -1065738240 }, + { 149435984, -1063292288 }, + { 167970272, -1060522368 }, + { 186453328, -1057429248 }, + { 204879504, -1054014208 }, + { 223243488, -1050278016 }, + { 241539296, -1046221952 }, + { 259761664, -1041847104 }, + { 277904896, -1037154944 }, + { 295963392, -1032146880 }, + { 313931712, -1026824448 }, + { 331804480, -1021189120 }, + { 349576096, -1015242880 }, + { 367241408, -1008987264 }, + { 384794720, -1002424320 }, + { 402230784, -995556160 }, + { 419544320, -988384640 }, + { 436730112, -980912000 }, + { 453782848, -973140608 }, + { 470697504, -965072832 }, + { 487468576, -956710976 }, + { 504091296, -948057792 }, + { 520560352, -939115776 }, + { 536870912, -929887680 }, + { 553017920, -920376384 }, + { 568996544, -910584704 }, + { 584801664, -900515712 }, + { 600428800, -890172224 }, + { 615873088, -879557888 }, + { 631129536, -868675392 }, + { 646193920, -857528320 }, + { 661061504, -846120064 }, + { 675727616, -834454144 }, + { 690187904, -822533888 }, + { 704438016, -810363136 }, + { 718473536, -797945792 }, + { 732290176, -785285056 }, + { 745883776, -772385216 }, + { 759250176, -759250176 }, + { 772385216, -745883776 }, + { 785285056, -732290112 }, + { 797945664, -718473536 }, + { 810363264, -704438016 }, + { 822533888, -690187904 }, + { 834454144, -675727616 }, + { 846120128, -661061504 }, + { 857528320, -646193920 }, + { 868675392, -631129536 }, + { 879557888, -615873088 }, + { 890172352, -600428800 }, + { 900515712, -584801792 }, + { 910584704, -568996544 }, + { 920376384, -553017920 }, + { 929887680, -536870912 }, + { 939115776, -520560352 }, + { 948057792, -504091296 }, + { 956710976, -487468576 }, + { 965072832, -470697504 }, + { 973140608, -453782944 }, + { 980911936, -436730112 }, + { 988384640, -419544320 }, + { 995556160, -402230784 }, + { 1002424320, -384794592 }, + { 1008987264, -367241280 }, + { 1015242880, -349576096 }, + { 1021189120, -331804480 }, + { 1026824448, -313931712 }, + { 1032146880, -295963392 }, + { 1037154944, -277904800 }, + { 1041847104, -259761664 }, + { 1046221952, -241539296 }, + { 1050278016, -223243488 }, + { 1054014208, -204879600 }, + { 1057429248, -186453328 }, + { 1060522368, -167970272 }, + { 1063292288, -149435984 }, + { 1065738240, -130856168 }, + { 1067859776, -112236624 }, + { 1069655936, -93582760 }, + { 1071126272, -74900440 }, + { 1072270272, -56195308 }, + { 1073087680, -37473052 }, + { 1073578304, -18739382 }, + { 1073741824, 0 } +}; + +// Q31 +const Word32 dirac_gains_trg_term_fx[181][2] = { + { ( -2147483647 - 1 ), 187 }, + { -2147156608, -37478872 }, + { -2146175360, -74946000 }, + { -2144540544, -112390808 }, + { -2142252544, -149800880 }, + { -2139311872, -187165312 }, + { -2135719552, -224473248 }, + { -2131476480, -261712336 }, + { -2126584576, -298872160 }, + { -2121044736, -335940320 }, + { -2114858496, -372906880 }, + { -2108028416, -409759200 }, + { -2100556032, -446486752 }, + { -2092443904, -483078816 }, + { -2083694208, -519523328 }, + { -2074309888, -555809792 }, + { -2064293760, -591926784 }, + { -2053648896, -627863232 }, + { -2042378240, -663608960 }, + { -2030485760, -699152192 }, + { -2017974528, -734482816 }, + { -2004848896, -769589184 }, + { -1991112320, -804461312 }, + { -1976769280, -839088832 }, + { -1961824000, -873460224 }, + { -1946281216, -907565888 }, + { -1930145664, -941394752 }, + { -1913421952, -974937408 }, + { -1896115584, -1008182592 }, + { -1878231680, -1041120448 }, + { -1859775360, -1073742080 }, + { -1840752768, -1106035712 }, + { -1821169152, -1137993088 }, + { -1801031424, -1169603328 }, + { -1780344960, -1200857344 }, + { -1759115776, -1231746176 }, + { -1737351040, -1262259072 }, + { -1715056640, -1292388096 }, + { -1692240256, -1322122752 }, + { -1668908160, -1351455488 }, + { -1645067776, -1380375808 }, + { -1620726784, -1408876032 }, + { -1595891328, -1436947072 }, + { -1570570112, -1464580224 }, + { -1544770304, -1491767808 }, + { -1518500352, -1518500352 }, + { -1491767808, -1544770304 }, + { -1464580224, -1570570112 }, + { -1436947200, -1595891328 }, + { -1408876032, -1620726784 }, + { -1380375808, -1645067776 }, + { -1351455104, -1668908288 }, + { -1322122752, -1692240256 }, + { -1292388096, -1715056640 }, + { -1262259072, -1737350784 }, + { -1231746176, -1759115520 }, + { -1200857344, -1780344704 }, + { -1169603584, -1801031424 }, + { -1137993088, -1821169152 }, + { -1106035712, -1840752768 }, + { -1073742080, -1859775360 }, + { -1041120448, -1878231552 }, + { -1008182592, -1896115584 }, + { -974937408, -1913421952 }, + { -941394752, -1930145664 }, + { -907565888, -1946281216 }, + { -873460416, -1961823872 }, + { -839088832, -1976769280 }, + { -804461568, -1991112320 }, + { -769589184, -2004848896 }, + { -734482560, -2017974528 }, + { -699152192, -2030485760 }, + { -663608960, -2042378240 }, + { -627863424, -2053648768 }, + { -591926784, -2064293760 }, + { -555809600, -2074309888 }, + { -519523328, -2083694208 }, + { -483078592, -2092443904 }, + { -446486976, -2100556032 }, + { -409759200, -2108028416 }, + { -372906656, -2114858496 }, + { -335940320, -2121044736 }, + { -298871968, -2126584576 }, + { -261712336, -2131476480 }, + { -224473248, -2135719552 }, + { -187165584, -2139311872 }, + { -149800896, -2142252544 }, + { -112390576, -2144540544 }, + { -74946016, -2146175360 }, + { -37478636, -2147156608 }, + { -93, ( -2147483647 - 1 ) }, + { 37478700, -2147156608 }, + { 74946104, -2146175360 }, + { 112390640, -2144540544 }, + { 149800960, -2142252544 }, + { 187165648, -2139311872 }, + { 224473024, -2135719552 }, + { 261712336, -2131476480 }, + { 298871968, -2126584576 }, + { 335940544, -2121044736 }, + { 372906656, -2114858496 }, + { 409759008, -2108028416 }, + { 446486976, -2100556032 }, + { 483078592, -2092443904 }, + { 519523328, -2083694208 }, + { 555809792, -2074309888 }, + { 591926784, -2064293760 }, + { 627863424, -2053648896 }, + { 663608960, -2042378240 }, + { 699152192, -2030485760 }, + { 734482816, -2017974528 }, + { 769589440, -2004848640 }, + { 804461568, -1991112320 }, + { 839088640, -1976769280 }, + { 873460224, -1961824000 }, + { 907565696, -1946281216 }, + { 941395008, -1930145664 }, + { 974937152, -1913421952 }, + { 1008182592, -1896115584 }, + { 1041120704, -1878231552 }, + { 1073741824, -1859775360 }, + { 1106035840, -1840752768 }, + { 1137993088, -1821169408 }, + { 1169603328, -1801031424 }, + { 1200857600, -1780344448 }, + { 1231746176, -1759115776 }, + { 1262259072, -1737350784 }, + { 1292387840, -1715056640 }, + { 1322123008, -1692240128 }, + { 1351455232, -1668908288 }, + { 1380375808, -1645067776 }, + { 1408876032, -1620726272 }, + { 1436947072, -1595891584 }, + { 1464580352, -1570570112 }, + { 1491767552, -1544770432 }, + { 1518500352, -1518500352 }, + { 1544770432, -1491767552 }, + { 1570570112, -1464580224 }, + { 1595891328, -1436947072 }, + { 1620726528, -1408876032 }, + { 1645067776, -1380375808 }, + { 1668908288, -1351455232 }, + { 1692240256, -1322123008 }, + { 1715056640, -1292387840 }, + { 1737350784, -1262259072 }, + { 1759115776, -1231746176 }, + { 1780344704, -1200857600 }, + { 1801031424, -1169603584 }, + { 1821169408, -1137993088 }, + { 1840752768, -1106035840 }, + { 1859775360, -1073741824 }, + { 1878231552, -1041120704 }, + { 1896115584, -1008182592 }, + { 1913421952, -974937152 }, + { 1930145664, -941395008 }, + { 1946281216, -907565888 }, + { 1961823872, -873460224 }, + { 1976769280, -839088640 }, + { 1991112320, -804461568 }, + { 2004848640, -769589184 }, + { 2017974528, -734482560 }, + { 2030485760, -699152192 }, + { 2042378240, -663608960 }, + { 2053648896, -627863424 }, + { 2064293760, -591926784 }, + { 2074309888, -555809600 }, + { 2083694208, -519523328 }, + { 2092443904, -483078592 }, + { 2100556032, -446486976 }, + { 2108028416, -409759200 }, + { 2114858496, -372906656 }, + { 2121044736, -335940544 }, + { 2126584576, -298871968 }, + { 2131476480, -261712336 }, + { 2135719552, -224473248 }, + { 2139311872, -187165520 }, + { 2142252544, -149800880 }, + { 2144540544, -112390616 }, + { 2146175360, -74946104 }, + { 2147156608, -37478764 }, + { 2147483647, 0 } +}; + +/*------------------------------------------------------------------------------------------* + * FB ROM tables + *------------------------------------------------------------------------------------------*/ + +const Word16 ivas_fb_cf_4ms_48k_fx[IVAS_FB_4MS_48K_SAMP] = { + 0, 4, 13, 26, 44, 66, 92, 123, 158, 197, 241, 289, 341, 398, 458, 524, 593, 667, 744, 826, 913, 1003, 1097, 1196, 1298, 1405, 1516, 1630, 1749, 1871, 1998, 2128, 2262, 2400, 2541, 2687, 2836, 2988, 3144, 3304, 3467, 3634, 3804, 3977, 4154, 4334, 4517, 4704, 4893, 5086, 5282, 5480, 5682, 5886, 6094, 6304, 6516, 6732, 6949, 7170, 7393, 7618, 7846, 8076, 8308, 8542, 8779, 9017, 9258, 9500, 9744, 9990, 10238, 10487, 10738, 10990, 11244, 11499, 11756, 12014, 12273, 12533, 12794, 13056, 13319, 13582, 13847, 14112, 14378, 14644, 14911, 15178, 15446, 15713, 15981, 16249, 16518, 16786, 17054, 17321, 17589, 17856, 18123, 18389, 18655, 18920, 19185, 19448, 19711, 19973, 20234, 20494, 20753, 21011, 21268, 21523, 21777, 22029, 22280, 22529, 22777, 23023, 23267, 23509, 23750, 23988, 24225, 24459, 24691, 24921, 25149, 25374, 25597, 25818, 26035, 26251, 26463, 26673, 26881, 27085, 27287, 27485, 27681, 27874, 28063, 28250, 28433, 28613, 28790, 28963, 29133, 29300, 29463, 29623, 29779, 29931, 30080, 30226, 30367, 30505, 30639, 30769, 30896, 31018, 31137, 31251, 31362, 31469, 31571, 31670, 31764, 31854, 31941, 32023, 32100, 32174, 32243, 32309, 32369, 32426, 32478, 32526, 32570, 32609, 32644, 32675, 32701, 32723, 32741, 32754, 32763, 32767 +}; + +const Word16 ivas_fb_cf_4ms_32k_fx[IVAS_FB_4MS_32K_SAMP] = { + 1, 11, 30, 60, 99, 149, 208, 276, 355, 443, 541, 648, 765, 891, 1026, 1171, 1325, 1488, 1660, 1840, 2030, 2228, 2435, 2650, 2873, 3105, 3345, 3592, 3847, 4110, 4380, 4657, 4941, 5233, 5530, 5835, 6146, 6463, 6786, 7115, 7449, 7789, 8134, 8483, 8838, 9197, 9561, 9928, 10300, 10675, 11054, 11435, 11820, 12208, 12598, 12990, 13385, 13781, 14179, 14578, 14978, 15379, 15780, 16182, 16585, 16987, 17388, 17789, 18189, 18588, 18986, 19382, 19777, 20169, 20559, 20947, 21332, 21713, 22092, 22467, 22839, 23206, 23570, 23929, 24284, 24633, 24978, 25318, 25652, 25981, 26304, 26621, 26932, 27237, 27534, 27826, 28110, 28387, 28657, 28920, 29175, 29422, 29662, 29894, 30117, 30332, 30539, 30737, 30927, 31107, 31279, 31442, 31596, 31741, 31876, 32002, 32119, 32226, 32324, 32412, 32491, 32559, 32618, 32668, 32707, 32737, 32756, 32766 +}; + +const Word16 ivas_fb_cf_4ms_16k_fx[IVAS_FB_4MS_16K_SAMP] = { + 4, 44, 123, 241, 398, 593, 826, 1097, 1405, 1749, 2128, 2541, 2988, 3467, 3977, 4517, 5086, 5682, 6304, 6949, 7618, 8308, 9017, 9744, 10487, 11244, 12014, 12794, 13582, 14378, 15178, 15981, 16786, 17589, 18389, 19185, 19973, 20753, 21523, 22280, 23023, 23750, 24459, 25149, 25818, 26463, 27085, 27681, 28250, 28790, 29300, 29779, 30226, 30639, 31018, 31362, 31670, 31941, 32174, 32369, 32526, 32644, 32723, 32763 +}; + +const Word16 ivas_fb_cf_1ms_48k_fx[IVAS_FB_1MS_48K_SAMP] = { + 8, 78, 218, 427, 705, 1050, 1460, 1934, 2470, 3066, 3718, 4425, 5184, 5990, 6840, 7732, 8660, 9622, 10612, 11627, 12663, 13715, 14778, 15847, 16920, 17989, 19052, 20104, 21140, 22155, 23145, 24107, 25035, 25927, 26777, 27583, 28342, 29049, 29701, 30297, 30833, 31307, 31717, 32062, 32340, 32549, 32689, 32759 +}; + +const Word16 ivas_fb_cf_1ms_32k_fx[IVAS_FB_1MS_32K_SAMP] = { + 19, 177, 491, 957, 1573, 2330, 3224, 4244, 5381, 6624, 7960, 9378, 10864, 12403, 13979, 15580, 17187, 18788, 20364, 21903, 23389, 24807, 26143, 27386, 28523, 29543, 30437, 31194, 31810, 32276, 32590, 32748 +}; + +const Word16 ivas_fb_cf_1ms_16k_fx[IVAS_FB_1MS_16K_SAMP] = { + 78, 705, 1934, 3718, 5990, 8660, 11627, 14778, 17989, 21140, 24107, 26777, 29049, 30833, 32062, 32689 +}; + +/* Q Factor is 31*/ +const Word32 ivas_fb_resp_cheby_ramp_32del_fx[IVAS_FB_1MS_32K_SAMP + 1] = { + 21970992, 16097417, 21859084, 28772960, 36989692, 46636088, 57839904, 70755400, 85490472, + 102165872, 120908192, 141807584, 164922576, 190321136, 218072144, 248214064, 280795872, + 315834176, 353276992, 393021664, 435109696, 479474528, 525959424, 574472512, 624859584, + 676981248, 730657728, 785668096, 841854208, 899002688, 956860544, 1015180800, 1073741824 +}; + +/* Q Factor is 31*/ +const Word32 ivas_fb_resp_cheby_ramp_16del_fx[IVAS_FB_1MS_16K_SAMP + 1] = { + 23460896, 29872362, 47814248, 71691184, 102337872, 140498880, 186843680, 241748256, 305433120, + 377921280, 458893152, 547769792, 643727232, 745668672, 852315136, 962208832, 1073741824 +}; + +/*------------------------------------------------------------------------------------------* + * SNS MSVQ codebooks and means + *------------------------------------------------------------------------------------------*/ + +/*Q12*/ +const Word16 ivas_sns_cdbk_tcx20_stage1_fx[128 * 16] = { + -7498, -8552, -3948, 11493, 10929, 4767, 5696, 4985, 5673, 1825, -1927, -2174, -3321, -4771, -5964, -7214, + -10641, -13643, -7600, -1477, 6893, 10597, 4021, 919, -537, 684, 6146, 1349, 1375, 4748, 736, -3571, + 8121, 9016, 4721, 3315, 3543, 4759, 5279, 5578, 4435, 3410, 492, -2942, -8990, -12493, -13751, -14493, + 646, 4522, 1609, -2654, -4481, -4275, -4938, -4698, -4089, -1547, 1428, 4430, 5202, 4974, 3429, 441, + 1001, -2898, -4776, -4824, -1005, 1623, 4558, 5049, 5546, 4459, 3687, 3688, -126, -3430, -5243, -7311, + -3765, -762, -3030, -6261, -7149, -5194, -3869, 997, 5325, 6801, 5249, 4107, 2928, 2308, 1946, 369, + 10168, 5956, 3730, 2771, 2326, 2853, 3117, 2884, 1479, -133, -2832, -4621, -6076, -6372, -6981, -8269, + 9885, 6118, 4056, 3729, 2954, 2262, 382, -887, -2030, -1996, -3016, -3773, -4113, -4045, -4375, -5152, + -3335, 5139, 6949, 5817, 4078, 4678, 4112, 3805, 2705, 921, -2675, -4919, -5304, -5636, -7035, -9300, + -5726, 774, 1426, -213, -1582, -1060, -1381, -448, -337, 307, -78, 485, 1252, 2090, 2767, 1723, + 4376, 8005, 8723, 8483, 6453, 4642, 1740, -811, -3455, -4423, -5495, -5697, -5721, -5357, -5457, -6006, + 9786, 10280, 4686, 1498, -692, -958, 1101, 3151, 2236, 2122, -1101, -3777, -4952, -6004, -7796, -9579, + -5550, 5500, 6501, 7932, 2414, 2004, -724, -797, 465, 79, 1246, -954, -8806, -5066, -857, -3387, + 3592, -6275, -6564, -5666, -2347, -3624, -3711, -4039, -4858, -5538, -5004, -2044, 6173, 16714, 9046, 14147, + 16852, 13619, 9025, 4301, 605, -1497, -3065, -3483, -4472, -4221, -4897, -5230, -4820, -4121, -3894, -4701, + 3227, 10297, 4142, -3143, -5540, -3558, 1739, 5927, 5194, 4741, -1693, -3809, -3779, -3780, -3312, -6653, + -9100, -5057, -1642, 2448, -2023, 4879, 133, 5593, 1767, 4924, 6821, 2411, -1210, -4078, -4246, -1619, + -7619, -11980, 600, 2505, 2570, -5562, 1970, -1802, 2335, 4846, -4895, 3392, 5151, 6508, 2257, -277, + 8936, 11845, 11978, 10584, 9236, 7186, 3794, 1874, -708, -3953, -7322, -9670, -10750, -10778, -10917, -11335, + 8587, 838, -5142, -8197, -8172, -5767, -4419, -1944, -79, 1853, 3022, 3823, 4142, 4618, 3723, 3112, + -5283, 568, 1979, 2570, 2120, 2234, 1918, 2247, 1603, 2038, 1584, -93, -1478, -3355, -4339, -4312, + 3278, 2345, 280, -2908, -4330, -3770, -3036, -1236, 758, 3245, 3120, 2288, 1603, 916, -401, -2152, + 18828, 10647, 3579, -3906, -287, 10855, 5635, -3673, -6872, -5289, -2424, -5462, -6052, -2769, -4104, -8707, + -4121, 2761, 3751, 4035, 3218, -38, -1640, -513, -750, -12, -1597, -1672, -1522, -637, 42, -1302, + -5458, 2924, 6701, 9084, 6798, 7952, 4454, 5450, 5949, 5277, -2303, -8307, -11701, -10523, -8863, -7432, + 379, 6294, 8583, 7842, 6055, 3554, -1419, -894, -4610, -4731, -3777, -2242, -3681, -3172, -3323, -4856, + 9040, 14426, 8046, 2314, -89, 612, 655, 895, -4796, -4631, -1323, -264, -6051, -6580, -5728, -6526, + 10320, 9632, 5351, 853, -2496, -4459, -5580, -5161, -5476, -4380, -3281, -1752, -624, 1835, 2457, 2762, + 6230, 4286, 3054, 2103, 1411, 882, -116, -345, 353, 511, -1457, -2334, -2581, -2840, -3948, -5209, + -2351, -845, -4051, -7663, -8133, -6619, -6596, -5580, -3850, -278, 3739, 7371, 8632, 9397, 9551, 7277, + 14878, 8087, 1612, -2811, -4559, -4173, -3660, -2457, -1780, -938, -1082, -880, -541, 40, -680, -1056, + -357, 6763, 7507, 2217, 983, 5824, 3263, 5362, 4023, 5140, -7718, -7703, -6304, -5528, -5237, -8233, + -9056, -2879, 4548, 9096, 9567, 8235, 6713, 5876, 4240, 2331, -452, -3615, -6496, -8240, -9501, -10367, + -6591, -10319, -10037, 1092, 9508, 10608, 14496, -4303, -5138, -1136, 3886, 5677, 2912, -4172, -5188, -1298, + 3868, 10098, 10930, 8191, 5304, 4169, 3641, 2883, 1198, -205, -3154, -5928, -8536, -10323, -10806, -11331, + -580, -1263, -2402, -5074, -6014, -4529, -3202, -2168, -259, 2212, 3665, 5339, 5604, 4695, 3222, 754, + 1658, -3851, -5014, -4529, -1764, -300, 8217, 16396, 2000, 824, 665, -1713, -3175, -3034, -3057, -3324, + -11375, -8634, -6184, -6208, -4129, -150, 1519, 4345, 5629, 5310, 4007, 4455, 3926, 3560, 3104, 823, + 7473, 12120, 11294, 4728, 3568, 5501, 3688, 3508, 1692, -1661, -8566, -9762, -8843, -8001, -8086, -8653, + 8613, 5171, 4353, 3298, 925, -530, -1637, -2214, -3071, -2941, -3234, -2961, -2504, -1211, -880, -1176, + 621, 10589, 7196, 3759, 1529, -659, -1898, -893, -380, -88, -927, -1736, -2729, -3606, -4369, -6410, + -10687, -7849, -5755, -6353, -5913, -3150, -2865, -1183, -382, 1696, 2622, 5191, 7208, 8842, 10178, 8401, + -366, 8121, 9838, 5330, 503, 3640, 5493, 4385, 472, -837, -3977, -9982, -8797, -5441, -3061, -5319, + 10435, 576, -3431, -5099, -5048, -3131, -1414, 1467, 2492, 2334, 1243, 257, 1129, 1454, -1171, -2093, + -2408, 4154, 6243, 5033, 3118, 2477, 901, 862, 622, 627, -473, -1897, -2823, -3803, -5378, -7253, + 5751, -3944, -5457, -3268, 270, -185, -1373, -2563, -3758, -4024, -4052, -3460, -2709, -237, 9209, 19800, + 11172, 15303, 13936, 10936, 5606, 374, -3235, -4534, -5841, -5872, -6303, -6525, -6391, -6176, -6037, -6414, + 5173, 10429, 7690, -211, -4293, -3886, -1661, 896, 81, -608, -1808, -2380, -2191, -1905, -2123, -3203, + -8788, -1052, 5387, 6699, 5899, 3671, 3443, 3830, 4015, 2746, -536, -2438, -3985, -4693, -6124, -8075, + -8721, -8773, -1913, 3002, 5005, -1141, -1250, 4860, 3573, -249, 246, 1790, 3243, 3739, -189, -3222, + 12821, 11330, 7418, 6142, 4487, 3660, 3434, 2422, 898, -805, -4025, -7013, -9016, -9871, -10400, -11484, + 6459, 1432, -705, -1814, -2564, -2337, -2669, -1789, -1565, -767, -696, -14, 629, 1614, 2310, 2475, + 523, 864, 661, 262, 533, 1619, 2390, 2554, 2076, 1532, 248, -542, -1545, -2462, -3431, -5282, + 2754, 7840, 1531, -5320, -7337, -5059, -1828, 2415, 2801, 2414, 920, -54, -675, 295, 594, -1290, + 16459, 9353, 5397, 5154, 6401, 4035, 525, -1206, -2684, -3963, -5726, -6290, -6446, -6516, -6917, -7575, + 3331, 2764, 1820, 1449, 404, 197, -617, -518, -755, -625, -1250, -1192, -1278, -978, -1091, -1661, + 1202, 10867, 13999, 10573, 8667, 5713, 3901, 1699, -649, -3697, -6326, -8102, -9055, -9334, -9517, -9940, + 3105, 10471, 11637, 9256, 1588, -4373, -5838, -3257, -2501, -2719, -3963, -4248, -3642, -2230, -780, -2506, + 7036, 12562, 13320, 10158, 3016, -3341, -3328, 586, 1408, -1129, -5924, -5878, -5793, -6843, -7570, -8279, + 11292, 4466, 2522, 790, -1414, -1946, -1506, -261, 583, 802, -656, -1773, -2651, -2250, -3307, -4691, + 4319, 4371, 4567, 4600, 3221, 2633, 1994, 1398, 564, -536, -2662, -3664, -4402, -4565, -5348, -6489, + -7437, -5416, -5951, -7745, -7676, -4554, -4813, -2349, 668, 6481, 8239, 7629, 6574, 6530, 6295, 3525, + 13292, 11390, 5199, 2139, 489, -271, -644, -427, -1114, -1854, -3425, -4756, -5461, -5211, -4922, -4424, + 710, 9953, 9525, 5612, 1946, 2958, 298, -154, -1714, -3333, -6410, -9882, -5524, -2172, -432, -1382, + -10643, -8047, -2326, 2007, 3553, 2546, 4871, 5435, 4843, 4106, 2244, 1050, -497, -1808, -2878, -4457, + 294, -9337, -8427, -1045, 9093, 10411, 3417, 3239, 2068, -534, 1078, -1517, -2125, -1732, -2738, -2145, + 5432, 12777, 10582, 2772, -92, 2136, 2501, 4105, 2738, 3539, -1530, -8480, -9513, -8753, -8426, -9787, + 5972, 8255, 4335, -524, -2484, -2872, -3937, -3518, -3037, -774, 635, 1891, 1590, 660, -1520, -4672, + 6572, 3645, -218, -1090, 345, 2321, 3692, 4654, 4719, 3041, 2117, 459, -3402, -7045, -8640, -11170, + -5410, -344, -990, -3893, -5051, -2311, -77, 3918, 4679, 4822, 3303, 1776, 337, 305, 409, -1472, + 8389, 11222, 8707, 4721, 3131, 2061, 1130, 791, -354, -651, -3686, -5202, -6383, -7339, -7792, -8746, + 9298, 9362, 6305, 3177, 968, -72, -945, -819, -1079, -725, -2067, -2739, -3434, -4331, -5460, -7441, + 2704, 6870, 6571, 6294, 4511, 3348, 2296, 2931, 2159, 954, -1545, -3421, -5465, -7201, -9296, -11710, + 880, -1826, -3492, -4233, -3893, -2425, -1948, -823, -259, 657, 1000, 2107, 2906, 3603, 3958, 3790, + -196, 6860, 8581, 9562, 7277, 7244, 1471, 1946, -228, -338, -3115, -7547, -11656, -9838, -4686, -5339, + 8578, 4837, 2226, 754, -1817, -2201, 499, 2914, 3313, 3158, -527, -4733, -5791, -4100, -3403, -3706, + -4232, 6556, 1920, 6615, -946, 4468, 280, 2157, 766, -524, -922, -1974, -2072, -1600, -4968, -5524, + 7288, 2936, -1640, -4588, -6332, -6285, -6188, -5571, -5223, -3844, -1671, 2013, 5110, 8289, 8345, 7362, + 11493, 11342, 6954, 1821, -1692, -2612, -3300, -3319, -3814, -2738, -2931, -2814, -2479, -1890, -1719, -2303, + 8177, 11903, 6525, -1422, -3274, 251, 4220, 4653, 3045, -303, -5550, -5079, -5244, -5314, -5883, -6703, + -9438, -3031, 483, 1317, 1847, 1874, 3018, 2956, 788, 3090, 730, -1912, -1688, 122, 860, -1017, + -3693, -4977, -541, 2877, 3327, -2337, -4262, -2189, 699, 2375, 3310, 1962, 1504, 1017, 1319, -390, + 6065, 7469, 7234, 10424, 10658, 7912, 5388, 4640, 2156, -733, -4795, -9010, -11277, -11766, -11999, -12365, + 10932, 2437, -1845, -3262, -3753, -3716, -4031, -3422, -2848, -1620, -1167, 176, 1764, 2966, 3342, 4047, + -619, -1377, -1334, -455, -198, 333, 279, 702, 835, 1061, 505, 476, 127, 254, 270, -859, + 5215, 1197, -575, -1227, -2612, -2325, -649, 1885, 2691, 2793, 1163, -765, -1768, -1371, -1567, -2082, + 19164, 11491, 4615, -1985, -3389, 3234, 9530, 1792, -6657, -7546, -6135, -3576, -5395, -6848, -4207, -4089, + -5579, 2618, 4644, 1302, 270, 4372, 3748, 1797, -752, -937, -2728, -2859, -706, -865, -1022, -3304, + -1838, 6025, 10256, 11080, 7972, 1492, -1232, 2649, 3965, 3980, -6137, -7448, -7596, -7566, -6578, -9023, + 1944, 6450, 7024, 8636, 7062, 1810, -1661, -772, 542, -13, -3255, -4851, -5285, -5086, -5501, -7043, + 8123, 16086, 12234, 5222, 1088, 112, 327, 1928, -3259, -5187, -6713, -7464, -5697, -5814, -5336, -5649, + 859, 7375, 6059, 2544, 375, -1579, -3831, -3783, -3738, -2686, -2393, -1129, 29, 1048, 1033, -183, + 2101, 4211, 3442, 2574, 2178, 2151, 1104, 386, 135, -216, -2007, -2668, -2626, -2609, -3456, -4701, + -5046, -336, -968, -3416, -4451, -3637, -4472, -3410, -3255, -1874, -1058, 1763, 4855, 7351, 9606, 8347, + 19995, 9006, 2634, -634, -1483, -1947, -2216, -805, -298, -446, -2156, -3518, -3871, -4075, -4720, -5467, + -2272, 8650, 9022, 2896, -866, 3555, 4656, 4146, 4057, 5105, 893, -7960, -11942, -9282, -3999, -6659, + -3314, 4163, 6336, 8539, 7909, 6703, 4331, 4759, 3115, 1223, -1904, -4488, -6662, -8210, -10273, -12228, + -1219, -6996, -6238, 5560, 19256, 6948, 16806, -1718, -4399, -4432, 1743, -4434, -5576, -4824, -5420, -5055, + 7337, 7092, 7560, 9007, 7842, 4106, 2111, 1823, -310, -2228, -4758, -6480, -7636, -7833, -8350, -9284, + -127, -7162, -7239, -8124, -5968, -3470, -2064, 167, 1784, 2556, 3741, 6051, 7042, 5293, 3278, 4242, + -4837, -8327, -8445, -7964, -6737, -3635, 12584, 10749, 9489, 14113, 4466, -818, -963, -2829, -1662, -5183, + -9221, -7856, -8616, -9610, -8803, -4648, -2322, 3345, 7609, 8661, 7189, 7848, 6804, 4876, 3375, 1368, + 3370, 8415, 9491, 3696, 2112, 4195, 2535, 1216, -704, -2599, -4917, -4773, -4766, -4924, -5695, -6652, + 5033, 6480, 5225, 2803, 1389, 388, -1095, -1930, -1285, -783, -2330, -2783, -2299, -2271, -2847, -3696, + 6462, 10974, 9445, 5632, 3121, 338, -2526, -3512, -4157, -4256, -4496, -3576, -3213, -3003, -3042, -4191, + -8903, -5489, -3362, -3932, -2867, -42, -794, 1047, 1551, 2990, 1925, 1809, 2047, 3857, 5983, 4180, + -1078, 5534, 5668, 8546, 7579, 7727, 3515, 2403, 425, -3939, -7676, -10486, -4654, -3810, -5900, -3854, + 11241, 2333, -888, -2668, -601, 2056, 973, -782, -1134, -628, -1278, -1464, -1036, -1025, -2566, -2532, + 188, 993, 1510, 3746, 3964, 4113, 3912, 3774, 2904, 1760, -544, -2262, -3823, -5032, -6585, -8617, + 17244, 5164, -3514, -5803, -5740, -3512, -4264, -5949, -7105, -7263, -6297, -4203, 3488, 882, 9119, 17753, + 18572, 16918, 11329, 8930, 3706, 2301, -534, -4811, -6296, -6264, -6923, -7015, -7012, -7183, -7628, -8090, + 2776, 9267, 4870, -2407, -3332, 1594, 479, 626, -2334, -2117, -1714, -1452, -1892, -1016, -575, -2774, + -5418, -1560, 977, 3118, 4128, 4683, 3995, 3168, 1326, 367, -798, -1786, -2341, -2513, -3011, -4334, + -5417, -6011, -5325, -2432, 93, 2347, 2339, 1497, 2097, 3182, 2553, 1778, 1688, 2154, 997, -1540, + 9725, 13565, 12472, 9916, 5050, 2613, 1338, 621, -1049, -4212, -7066, -8072, -8504, -8673, -8645, -9079, + 3568, 2083, 779, -447, -1488, -1526, -2026, -1584, -1564, -893, -955, -362, 96, 991, 1665, 1663, + 4308, 2100, 967, 1304, 1477, 1636, 1557, 2064, 2234, 1529, -1013, -2413, -2782, -3000, -4202, -5767, + -2729, 7254, 5313, 626, -4368, -3106, 689, 2051, 1436, 577, 2137, -551, -4980, -1408, 137, -3079, + 15090, 13574, 8552, 4879, 2489, 603, 625, 413, -965, -1853, -5221, -7106, -7498, -7482, -7752, -8349, + 2370, 3151, 1957, 225, -516, -337, -392, 223, 813, 1307, 124, -276, -702, -1169, -2432, -4348, + -4031, 4338, 9696, 9577, 10361, 8623, 7730, 5093, 2251, -518, -3768, -6931, -9490, -10533, -10950, -11448, + 10303, 15787, 11780, 8011, -1234, -5671, -6127, -5176, -4588, -3477, -4783, -2583, -2036, -3150, -2990, -4066, + 1649, 10539, 12961, 10244, 5607, -356, -2601, -488, 30, -2077, -2877, -8331, -8515, -7727, -3810, -4247, + 8997, 5275, 2084, -488, -2018, -2461, -3081, -2315, -2223, -1654, -1778, -1155, -563, 285, 587, 507, + 2053, 8908, 7041, 522, -1083, 1920, 1555, 2991, 959, 1714, -3254, -3680, -2792, -4401, -4878, -7576, + -9455, -8989, -9057, -10160, -9541, -6763, -5661, -3200, -593, 3501, 6901, 10117, 10416, 11442, 11927, 9115, + 7190, 11877, 7889, 1661, -96, 1823, 1276, 741, -1950, -1969, -4935, -5445, -5084, -4151, -3666, -5162, + 923, 9232, 9280, 2340, -3138, -2558, 873, 5017, 3579, -513, -3936, -9898, -4597, -2889, -1289, -2425 +}; + +/*Q12*/ +const Word16 ivas_sns_cdbk_tcx20_stage2_fx[64 * 16] = { + -4739, -1952, 33, 1958, 1570, -310, -1531, -1209, -554, 53, 911, 1536, 1298, 855, 1041, 1042, + -1663, -904, -175, 651, -1032, -2713, -1113, 1177, 1464, 826, 214, -1494, -1846, 763, 2736, 3107, + 112, -859, -1631, -2224, -1919, -1030, -1104, -307, 1536, 3827, 3753, 1748, 107, -638, -468, -902, + 46, 1539, 3454, 2870, 2388, -2034, -3447, -1887, -692, -27, -310, -923, -859, -521, 27, 377, + 1736, 793, 312, 1806, 467, -1631, -500, 1432, 2116, -102, -2181, -280, 2082, -270, -2800, -2981, + -499, 628, 1238, 973, 1115, 3296, 3147, 1180, -225, -1217, -1869, -1759, -1756, -1809, -1438, -1005, + -814, -42, -125, -171, 215, 305, 107, -109, 761, 921, 805, 630, 183, -456, -1018, -1190, + 3133, 1965, 1284, 613, 952, 693, 240, -514, -738, -801, -702, -785, -963, -1364, -1554, -1460, + -2540, -1194, -624, 654, 1697, 2507, 1824, 793, -441, -1656, -427, 1665, 1549, -53, -1580, -2175, + -2612, -80, 1350, -1143, -868, 3411, 1168, -1279, -1792, -1401, -43, 224, 407, 470, 941, 1247, + -3135, -2208, -1570, -1618, -898, 791, 778, -354, -184, 553, 1861, 2776, 2413, 1232, 177, -614, + 1427, -894, 74, 274, 1641, 1416, -2247, -3524, -984, 2485, 916, -207, 570, 111, -306, -753, + 567, 223, 845, -469, -3177, -2357, 2872, 824, -1392, 757, 1566, -859, -167, 552, 315, -101, + -1017, -1966, -2969, -2645, -1036, 1791, 2595, 2648, 2209, 1368, 569, 1255, 1349, -305, -1605, -2241, + -180, -2117, -1548, 2748, 1044, -1910, -2213, -915, 378, 69, 1015, 1919, 2044, 1120, -379, -1075, + 61, 1450, 1443, -536, -2041, -2153, -241, 101, -1208, -1900, -710, 1553, 1938, 1209, 785, 249, + -871, -3584, -3398, -2068, -1304, -586, 802, 1195, 1173, 629, 692, 918, 1136, 1304, 1676, 2286, + -5190, 69, 1485, 2699, 2450, 2023, 739, 746, 653, -67, -772, -1497, -1398, -1046, -609, -285, + 436, 3227, 395, -2370, -1678, 289, 1631, 1271, 450, 574, 1098, 1346, 176, -1624, -2479, -2743, + -2034, 1082, 2695, 1685, 1183, 915, 636, -341, -486, 350, 1164, 625, -760, -1982, -2380, -2349, + 914, 1532, 886, -2080, -3920, -4687, -1446, 2800, 2748, 1303, 524, -634, -11, 747, 691, 632, + 1084, -467, -438, 1087, 2116, 2201, 1470, 691, 853, 987, 574, -224, -1366, -2404, -3041, -3123, + 3022, -593, -1542, -411, 421, 580, 276, -223, -67, -96, -91, -202, -250, -445, -371, -7, + 4287, 2796, 539, -861, -426, -868, -1334, -1937, -2448, -2081, -837, 139, 474, 386, 738, 1432, + -3717, -1050, 587, 144, -312, -549, -30, 857, 1641, 2410, 2657, 2049, 788, -915, -1966, -2594, + 1656, 90, 245, 2403, 4979, 1448, -716, -288, -387, -1023, -1625, -1371, -1425, -1584, -1505, -899, + 2943, -214, -1605, -563, 565, 838, 558, -616, -919, -1002, 498, 2396, 2264, -116, -2465, -2562, + 29, 1348, 1688, 136, -859, -273, -627, 84, 1360, 3635, 2904, -1691, -2928, -2031, -1197, -1576, + -3472, 1420, 442, -1499, -1990, -1702, -1566, -1104, 78, 1033, 1640, 1632, 1574, 1220, 1212, 1081, + 1953, -23, -627, -1383, -1259, 1004, 3624, 2500, -1346, -2634, -1795, -778, -511, -345, 456, 1163, + 4332, -964, -3948, -3470, 1285, 4835, 3224, 584, -77, -893, -848, -484, -428, -664, -1430, -1053, + -117, -1788, -833, 558, 730, 891, -108, -1659, -2651, -2745, -1081, 1583, 2809, 2204, 1191, 1018, + -1345, -373, -461, -1404, -2370, -2179, -1860, -1422, -886, -763, -387, 596, 1341, 2668, 4449, 4396, + 703, 1081, 785, 116, -226, 588, 371, 128, -841, -1511, -2399, -3059, -3098, -175, 3474, 4064, + 2514, -777, -1994, -1860, -1724, -1633, -1409, -1049, -426, 483, 1396, 1809, 1677, 1298, 934, 762, + -2407, 787, 1259, 1895, 1549, 339, -1486, -2126, -2176, -1736, -1109, -617, -109, 887, 2228, 2818, + -2370, -192, 160, -107, 141, -1165, -2137, 299, 2936, 3445, -1416, -1420, 1045, 1309, 500, -1029, + -803, 477, 733, 1105, 1659, 1199, 396, -525, -596, -699, -668, -547, -466, -585, -527, -153, + -854, -1179, -969, -484, 67, 243, 278, -137, -55, 12, 281, 514, 599, 462, 461, 759, + -555, 4717, 2129, -264, -987, -522, -88, -291, -391, -491, -515, -766, -855, -879, -331, 88, + -1373, -2671, -1199, 3480, 2467, 1443, 608, 260, -542, -1600, -1685, -1118, -694, -114, 750, 1987, + 934, 3323, 1049, -2373, 769, 3068, 503, -1591, -2364, -3449, -3986, -3071, 844, 5877, 941, -474, + -425, 228, -1215, -1583, -1505, -1579, -934, -791, -484, -477, 1056, 4177, 4488, 3123, -786, -3291, + 1305, -1331, -1055, 1844, 3061, 1077, -2285, -2600, 230, 4597, 1138, -3419, -3967, -827, 2157, 77, + 997, 210, -659, -997, -624, 153, 286, -62, -2489, 591, 3868, 1520, -1263, -1424, -494, 387, + 550, 1926, -1797, -3507, -2499, -447, 586, 751, 425, -141, -276, 149, 519, 762, 1372, 1626, + 4225, -2078, 205, 1305, -229, -2501, -1305, -231, 298, 233, -219, -284, -355, -157, 196, 896, + 1933, 2394, 2521, -320, -2587, -3794, -3666, -1887, -607, -128, 189, 577, 518, 1040, 1956, 1861, + -4582, -2223, -1479, -548, -20, 1204, 1867, 1627, 992, -767, -2361, -1057, 474, 2119, 2744, 2011, + -3537, -810, -278, -246, 338, 2203, 3, -278, -22, 2105, 1761, -1452, -2749, -633, 2262, 1334, + 2549, 1831, 1526, 633, -570, -1662, -2041, -1590, -568, 965, 2087, 1627, 325, -934, -1811, -2366, + -2625, 735, 4126, 1924, -1352, -1375, -67, -263, -332, -611, -223, 69, -41, -365, -50, 449, + 1945, -542, 862, 1501, -463, -3503, -3203, 3338, 4340, -1886, -1472, -176, -899, -1007, 153, 1012, + 1176, -2807, 927, 489, -701, -1222, 1377, 2025, 1740, 704, 835, 366, -857, -1584, -1462, -1007, + 1374, 1113, 165, -297, -35, -391, -815, -1221, -716, -497, -249, 51, 360, 245, 279, 635, + 4741, 2291, -661, -1808, -1569, -1013, -23, 449, 899, 914, -15, -826, -1123, -1159, -870, -227, + -3095, -3457, -326, 1213, 999, 1504, 2296, 1487, 1074, 733, 257, -216, -595, -863, -635, -376, + 1313, 1943, 2320, 2119, 1731, 1184, 521, -954, -2164, -2882, -2594, -1657, -957, -667, -49, 792, + -225, 2104, 1245, 2010, 1467, -381, -1564, -1777, -2347, -1964, -723, 1747, 2298, 1153, -937, -2106, + 1110, -1091, -1843, -326, 890, 1762, 1723, 1959, 2404, 1131, -1081, -2694, -2783, -1612, -483, 933, + -3280, 740, 493, -1621, -2458, -538, 3182, 2390, 1740, 648, 349, -246, -677, -725, -96, 98, + 1151, 1644, 2333, 571, -841, -749, 1667, 2880, 2249, 381, -1951, -2564, -2038, -1604, -1690, -1440, + 1322, -4374, -4684, 281, 3091, 1587, 369, -3, -524, 313, 1018, 1177, 314, -171, -81, 365, + 2499, -904, -2181, -489, 429, 669, -619, -1412, -1628, -1788, -978, 7, 230, 941, 2049, 3175 +}; + +/*Q12*/ +const Word16 ivas_sns_cdbk_tcx20_stage3_fx[32 * 16] = { + -496, -1325, -1064, 878, 1972, 607, -916, -1271, -543, 414, 1363, 1331, 679, -327, -664, -636, + 362, -60, -548, -1188, 3577, -1280, -794, 791, -404, 216, -537, -90, -322, -81, -302, 662, + -474, 1151, 1105, -431, -442, -1174, -1503, -1387, -649, 79, 712, 865, 1105, 707, 299, 37, + 334, 155, -1060, -1247, -263, 534, 1502, 1635, 1393, 587, -48, -494, -698, -945, -853, -533, + -102, -2580, 3220, -45, -520, -353, 93, 202, 19, -559, -404, 0, 267, 59, 248, 455, + -1614, 689, 1170, -355, -659, 214, 1065, 234, -205, -321, 68, 241, 302, -162, -349, -318, + 49, -471, -419, -290, 40, -128, -639, -61, 432, -165, -1970, -1140, 2419, 2709, 567, -934, + 1995, 749, -847, -723, -809, -1302, -1034, 36, 1174, 1053, 777, 479, 202, -226, -725, -798, + 503, -396, 223, 711, 939, 1443, 1651, 131, -658, -607, -422, -361, -558, -963, -997, -639, + -2380, -60, -1779, -303, 1247, 1476, 787, 528, 535, 131, -102, -243, -199, -125, 129, 359, + -480, 67, 624, 1594, 1140, -29, -302, -842, -1229, -1468, -958, -139, 349, 447, 512, 716, + -441, 257, -20, 524, -98, -901, -345, 1409, 932, -1626, -1328, 1998, 1784, -632, -919, -596, + 13, -162, 276, -73, -1083, 1249, 1237, -1331, -2051, 634, 2497, 636, -778, -595, 73, -539, + 150, -478, -1380, -2201, -557, 1248, 1317, -435, -672, -351, 51, 444, 824, 719, 625, 695, + -1787, -1936, -691, -455, -726, -586, 62, 521, 559, 532, 788, 935, 953, 717, 592, 523, + -307, 803, 537, -415, -32, -772, -200, 1387, 1056, -700, -1667, -1182, -198, 200, 611, 879, + -1136, -297, 1067, 1599, 933, 85, -496, -329, 704, 1505, 440, -791, -926, -846, -811, -698, + 554, 1640, -641, -1038, 1272, 2216, -1350, -1756, 606, 710, -732, -972, -109, -55, -189, -155, + -1245, 526, 853, -490, -1359, -1307, -459, 418, 1330, 1485, 1076, 66, -528, -675, -21, 330, + 1408, 1470, 1952, 558, -474, -218, 330, -50, -91, -404, -330, -556, -753, -1070, -1056, -717, + 48, -64, 1098, -961, -1463, 2614, -1256, 333, -225, 412, -110, -417, -56, -260, 2, 305, + -416, 207, 378, 157, -143, 675, 352, 15, -633, -373, 108, -981, -1789, -1138, 895, 2685, + -658, 135, 341, 217, -171, 367, 678, 235, -334, 875, 199, -2878, -1134, 2089, 1114, -1075, + 2544, 16, 331, 686, 339, -461, -853, -1260, -1021, -628, 3, 359, 463, 93, -282, -329, + 1673, -1600, -1453, 892, 900, -44, 456, 879, 586, -366, -785, -970, -549, -140, 126, 396, + -901, 3362, -1315, 487, -27, -544, 32, -54, -225, -100, 268, -6, -228, -277, -289, -183, + -605, -695, -453, 2594, -1649, -1440, 1218, 352, 100, -292, 42, 3, -89, 81, 342, 494, + -276, 125, 78, 668, 688, 152, 243, 303, 145, 226, 286, 252, 795, 844, -1302, -3227, + 522, -167, -889, -105, 51, -136, -646, 213, -785, -1079, 132, 3267, -1969, -884, 1495, 982, + 1886, 878, 347, -1000, -2044, -679, 1235, 203, -306, -879, -543, -38, 273, 119, 160, 390, + 733, -1286, -136, -112, -261, -483, -142, 25, 300, 298, 611, 560, 513, 71, -335, -353, + 546, -651, -903, -132, -317, -1043, -1323, -1071, 163, 760, 517, -177, -43, 546, 1305, 1823 +}; + +/*Q12*/ +const Word16 ivas_sns_cdbk_tcx20_stage4_fx[32 * 16] = { + -23, -162, 294, 1101, 1808, -336, -823, -38, 238, -260, -324, -210, -287, -282, -323, -372, + -49, -247, 49, 204, -183, 155, 406, 257, 91, -371, 16, 1575, 421, -2168, -1339, 1183, + -1457, 1563, 444, 336, 129, -10, -15, -113, -128, -394, -382, -424, -287, 33, 271, 436, + 157, 92, -904, 2169, -1450, 1225, -665, -162, 218, -301, -211, 88, 190, 121, -213, -353, + 311, -803, 192, -2, -217, -143, 781, 349, -660, -1220, -924, -287, 221, 635, 780, 987, + 337, 1084, -628, -576, -28, 247, -210, -956, -1165, -580, 325, 976, 847, 398, 61, -133, + 843, -807, 219, 110, -49, -191, -461, 246, 1392, 1370, -584, -1545, -895, 69, 341, -57, + 1408, -1582, -268, -301, -440, 153, 593, 65, 11, 367, 796, 421, -129, -246, -411, -437, + 526, 80, 669, 935, -656, -1721, -781, 354, 349, -93, 46, 56, -14, 78, -24, 196, + 112, 33, -306, 471, 9, -1712, 2296, -1177, 94, -317, -118, 790, 230, 22, -199, -227, + -152, 530, -1584, -390, 9, -51, 806, 1056, 519, -417, -360, 39, 581, 595, -314, -867, + 1217, 271, -1536, -330, 608, -3, -86, 55, -58, -462, -331, -230, -564, -248, 434, 1262, + -103, 98, -113, -4, 335, -551, -94, 2816, -1630, -504, 276, 178, -221, -60, -186, -238, + 60, 171, -102, 21, -326, -190, -116, 90, -469, -487, -171, -8, -1140, 1358, 2645, -1333, + -573, -82, 1285, -2182, 1292, 153, -175, -243, -223, -40, -30, 63, 315, 338, 48, 55, + -204, 94, -337, -350, 51, 63, -918, 640, -809, 2336, -1509, 298, 1930, -1470, 602, -418, + -702, -781, -877, -125, 396, -358, -395, 70, 355, 170, 242, 140, 333, 526, 492, 514, + -184, 25, 155, 70, 264, 34, -841, -103, 303, 255, -655, -1131, 1838, 578, -1675, 1067, + -612, 728, 94, -512, 2, 779, 158, -163, 387, 828, 919, 457, -331, -696, -1030, -1009, + -383, 115, -175, 222, 65, -691, -1245, -708, 283, 1251, 953, -372, 549, 1413, 150, -1428, + -820, -428, 172, 383, 42, 193, 1079, 977, 557, -176, -262, -564, -744, -413, -138, 143, + 600, 113, 1392, -21, -405, 175, -764, -1357, -582, 164, 149, -297, -490, -7, 387, 944, + 977, 1086, 140, 175, 207, 142, 499, 161, -74, -393, -441, -657, -705, -513, -398, -208, + -335, -210, -840, 473, 592, -45, -670, -209, 154, 998, 1575, 223, -1650, -900, 325, 520, + -1044, -1156, 804, 1184, 196, -140, 51, -475, -858, -334, 550, 669, 323, 208, 55, -32, + -278, 97, -45, -152, -784, 487, -82, -1620, 2324, -113, -981, 425, -194, 122, 307, 487, + 390, -32, 1476, -311, -835, 256, 628, 184, 17, -565, -603, 62, 717, 453, -600, -1235, + 262, -96, 317, -990, 168, 771, -1790, 1064, 1028, -1523, 167, 1061, 15, -183, -130, -142, + 104, 381, 464, -114, -36, -288, 116, -216, -800, -1336, 2780, -303, -616, -288, -113, 265, + -203, 637, -66, -1133, -1244, -550, 336, 402, 307, 157, 228, -16, -76, 160, 435, 626, + -177, -754, -187, -206, 868, 2171, 398, -527, -386, -355, -360, -395, -185, 90, -54, 58, + -7, -58, -198, -152, -389, -24, 1982, -716, -784, 2346, -775, -1081, 20, 278, -187, -254 +}; + +const Word16 *const ivas_sns_cdbks_tcx20_fx[SNS_MSVQ_NSTAGES_TCX20] = { + ivas_sns_cdbk_tcx20_stage1_fx, ivas_sns_cdbk_tcx20_stage2_fx, ivas_sns_cdbk_tcx20_stage3_fx, ivas_sns_cdbk_tcx20_stage4_fx +}; + +/*Q12*/ +const Word16 ivas_sns_cdbk_tcx10_stage1_fx[128 * 16] = { + 4155, 4844, 1339, -2626, -4982, -4674, -4721, -3645, -803, 3032, 4826, 4436, 3204, 1104, -1360, -4129, + -1594, -1284, -4844, -8342, -8548, -7606, -6706, -5389, -1713, 2074, 5231, 5641, 7605, 9627, 9427, 6422, + 1788, 7725, 11493, 9169, 6341, 587, 299, -4595, -4548, -3005, -1718, -3671, -4272, -3268, -4935, -7392, + 6395, 3818, 2406, 1897, 897, 256, -693, -1410, -1832, -2500, -2621, -2342, -1577, -1062, -856, -776, + 4150, 7919, 3439, -2033, -2704, -1557, 231, 1278, 3321, 2731, -93, -3269, -3781, -2586, -2807, -4238, + -3449, -354, 2017, 2387, 4764, 5609, 2963, 1108, 1421, 28, -950, -1353, -2415, -2770, -4077, -4929, + 8524, 7457, 4506, 1934, 338, -1987, -2756, -2266, -1957, -2240, -2375, -2413, -2097, -1743, -1348, -1577, + 7090, 5351, 2190, 948, 174, 15, 389, 653, 810, 817, 897, 265, -1778, -3881, -6266, -7674, + 6804, 11715, 7237, -532, -1146, 4914, 6089, 4999, 2534, -5124, -6431, -5499, -5543, -5359, -6419, -8238, + 7709, 2493, -2143, -6489, -5196, -3714, -2590, -832, -1060, 376, 749, 4940, 4149, -203, -522, 2334, + 2478, 4656, 6266, 8166, 8080, 7910, 7237, 5633, 3847, 82, -2972, -5614, -9294, -11465, -12330, -12680, + -3763, 439, 1331, -211, -1125, 837, 3525, 1259, 263, -714, -2457, -3123, -445, 2047, 1650, 487, + 4433, 3075, 1944, 16, -1183, -2102, -2546, -2683, -2426, -1757, -724, 250, 488, 152, 994, 2067, + -9469, -5101, -2893, -3433, -2063, 164, 2573, 3814, 3385, 1553, 818, -98, 1471, 3904, 3575, 1801, + 15946, 17207, 12819, 11001, 8646, 8327, 189, -5678, -6626, -8191, -8726, -8916, -9067, -9108, -8807, -9017, + -5510, -1763, 1586, 4321, 5956, 6915, 5607, 1816, -152, -948, -2191, -3237, -3324, -3026, -2853, -3196, + 8688, 10873, 8275, 4634, 1734, -557, -1294, -1577, -1538, -3121, -4044, -4288, -3973, -4095, -4377, -5339, + 8314, 381, -4203, -6906, -2427, 2895, 4683, -1276, -3574, -1537, 382, -1706, -1536, -1335, 2670, 5175, + 2014, 6901, 7450, 8391, 5660, 5349, 3318, 632, -1645, -7184, -11554, -6162, -2239, -4081, -3232, -3618, + 2463, 7959, 4852, -2086, -2118, 2942, 2680, 273, -1971, -3815, -4209, -3731, -1973, 228, 710, -2203, + 2203, 1934, 716, -1238, -808, -125, -35, 38, -139, -93, 845, 1853, 747, -583, -2071, -3245, + -8428, -9073, -4283, -324, 6076, 5438, -488, -2617, -275, 3550, -1050, -170, 4675, 4235, 2065, 669, + 11333, 11955, 6902, 1934, -1514, -2879, -3232, -4238, -3422, -2837, -2629, -2898, -2649, -2035, -2008, -1783, + 426, 4019, 4713, 3739, 3356, 3491, 3050, 1887, 1284, -268, -2029, -3494, -4307, -4440, -5214, -6212, + 2092, 5801, 8237, 9551, 6780, 3678, 2472, 1019, 1067, -1082, -3123, -5119, -7460, -7403, -7732, -8778, + 961, 1615, -886, -4376, -5548, -5310, -4982, -4885, -3665, -1478, 1198, 2863, 4755, 6850, 7462, 5426, + 12293, 13814, 11807, 11074, 9876, 10313, 5810, 199, -2989, -7493, -10043, -10534, -10988, -11237, -10950, -10951, + 250, 3000, 5233, 3533, 1034, 378, -553, -1707, -2133, -2878, -2837, -2353, -1841, -364, 705, 534, + 8771, 7295, 2905, -1528, -2797, -2224, -2434, -3707, -3996, -3372, -2464, -2340, 88, 2453, 2127, 1224, + -5356, -4080, -3178, -3415, -3409, -2987, -2237, -677, 1836, 4189, 5902, 5483, 3659, 2525, 1749, -4, + 8540, 13122, 10394, 3057, 1011, 2922, 1889, -673, -1284, -4815, -6548, -6657, -5605, -4808, -4643, -5902, + -904, 3036, 3724, 1024, 621, 2200, 3068, 4347, 4727, 939, -3049, -4688, -4457, -3259, -3173, -4155, + 7412, 8540, 3520, -908, -2046, -2396, -2247, -1458, -976, 74, -489, 690, 143, -3498, -4187, -2172, + -9034, -10692, -9925, -9020, -3884, 6891, 9607, 8744, 7840, 4174, 2713, 2569, 3504, 3316, -948, -5856, + 12528, 15782, 10788, 3495, -369, -2158, -2473, -3242, -3527, -5125, -5686, -5358, -4614, -3620, -2829, -3594, + 3762, 7050, 3669, -309, -1556, -2008, -2380, -2362, -2016, -1483, -971, -939, -639, 127, 288, -234, + 5466, 5096, 839, -4326, -4389, -495, 3962, 6525, 4641, 474, -1865, -1808, -2070, -3368, -3972, -4710, + -7682, -10419, -8678, 2804, 7231, 15597, 6455, -2426, -908, 2257, 7253, 5190, -3489, -5573, -6505, -1107, + 10313, 8489, 4954, 1234, -1203, -393, 1849, 1910, 915, -2272, -5380, -5480, -3449, -3573, -4108, -3807, + 9010, 7210, 5020, 3041, 1855, 1295, 314, -953, -2075, -2616, -2829, -2858, -3271, -3970, -4378, -4795, + 1460, 6841, 8628, 3136, 3143, 6063, 5972, 3426, 2223, -5238, -7341, -6357, -5904, -3889, -4715, -7448, + 1449, -1827, -4550, -6487, -5713, -2732, -660, 433, 1307, 2371, 2794, 3239, 3158, 2432, 2376, 2409, + 5243, 9630, 12091, 11941, 10590, 7240, 4378, 1797, -801, -6201, -9586, -10323, -9468, -8915, -8728, -8887, + -6934, -1067, 786, -193, 251, 625, 700, 418, 356, 314, 163, 106, 6, 1088, 1894, 1487, + 6060, 3896, 485, -2939, -4736, -3436, 282, 2032, 1869, -523, -3273, -3045, -833, -16, 1127, 3049, + -6670, -1890, 358, -230, 447, 2409, 3909, 6279, 5449, 1441, -878, -2018, -2272, -1424, -1908, -3000, + 11826, 16636, 13050, 6279, 1706, 781, 2337, -3227, -5169, -7375, -6710, -5822, -6503, -6377, -5089, -6343, + 485, 663, 700, 2165, 1981, 966, 376, 1834, 2298, 1627, 1114, 702, -758, -3039, -4935, -6179, + 15276, 10241, 6249, 2873, 783, 322, 994, 1738, 951, -1804, -4461, -5446, -5652, -6733, -7613, -7717, + -4421, -2251, -2182, -3670, -3227, -2064, -1880, -1860, -609, 307, 1234, 2129, 3532, 5592, 5516, 3853, + 3360, 7922, 10867, 9394, 6526, 1053, 1896, 2883, 1638, -5507, -7666, -7210, -7668, -4745, -5551, -7191, + 2467, 6411, 8292, 4274, 2274, 1209, -243, -1212, -1185, -2826, -3570, -3368, -3512, -3049, -2692, -3269, + 3028, 7338, 7308, 4275, 997, -2048, -3118, -4094, -3189, -2517, -1649, -1480, -692, 504, -1307, -3355, + -13713, -11806, -7131, -79, 6455, 6414, -589, -4681, -1922, 6331, 330, 637, 6245, 5108, 4653, 3749, + 14977, 9830, 6085, 2938, 1863, 1059, -553, -2267, -3180, -4394, -5086, -4951, -4163, -4237, -4011, -3909, + -1081, 3251, 6408, 7149, 4954, 5039, 4478, 4353, 4522, 680, -6756, -9382, -7832, -5831, -3856, -6094, + 7162, 7991, 4675, 976, 841, 2948, 4353, 3456, 2703, 451, -1709, -4266, -5937, -7074, -7860, -8711, + 7238, -605, -4007, 3, 8333, 1173, -2176, -5314, -6069, -5080, -4591, -4717, -2795, -241, 5388, 13461, + 10596, 12578, 13802, 10908, 7436, 2231, 2444, 1872, -2275, -7177, -9152, -9171, -8796, -8290, -8520, -8488, + -737, 2442, 485, -2808, -3574, -3229, -2953, -2353, -857, 704, 1697, 2241, 2025, 2311, 2655, 1952, + 12162, 6690, 2238, -2622, -4617, -5816, -5879, -5236, -4308, -2961, -1748, -1607, 1838, 2753, 3664, 5448, + -3077, 452, 1966, -389, -1269, 118, 175, 1055, 3620, 4579, 1375, -1234, -1480, -1197, -1718, -2974, + 15858, 15042, 10523, 5569, 4228, 4314, 3082, 654, -1725, -5657, -8057, -9036, -8888, -8704, -8514, -8690, + 1704, 1674, 529, 1843, 4216, 6144, 6034, 4105, 2177, -429, -2012, -2595, -4212, -5660, -6417, -7102, + 4241, 3011, -177, -3536, -4674, -3686, -1588, 992, 3180, 2882, 1972, 1063, 676, -379, -1461, -2516, + -10246, -9377, -9897, -10469, -9129, -5712, -3574, -1246, 1237, 4416, 7620, 7504, 9023, 11338, 10287, 8226, + 5873, 10679, 11753, 7933, 5561, 2214, 30, -1608, -3259, -6151, -6707, -5993, -5418, -4939, -4492, -5477, + 1703, 1720, 48, -171, 92, 1005, 1475, 1312, 659, -228, -981, -1903, -1549, -716, -784, -1681, + 534, 4872, 3894, -2429, -4953, -2172, 3168, 2622, 2251, 1388, -2147, -4094, -1110, 1384, -375, -2832, + -10365, -5877, -612, 3409, 4994, 5250, 3856, 2179, 1532, 1289, 947, 43, -882, -1327, -1874, -2562, + 7364, 8825, 6753, 3174, 1572, 1020, -1433, -3832, -4629, -5540, -5397, -4403, -2961, -1278, 255, 511, + 3616, 2982, 2441, 1531, 2154, 2980, 1762, 767, 272, -953, -1744, -2069, -2225, -2573, -3790, -5149, + 6016, 10717, 11396, 4773, 1867, 5061, 5183, 3833, 2366, -3588, -10444, -10907, -9023, -5516, -3941, -7793, + 6375, 1989, -1308, -3670, -4356, -4171, -3980, -3432, -2043, -587, 591, 1288, 2794, 3630, 3600, 3279, + 8179, 11466, 8560, 3788, 3482, 5771, 6843, 5604, 4908, 1374, -3903, -8790, -11546, -12047, -11857, -11832, + -3090, 661, 1382, -807, 2129, 5268, 1730, -823, -481, -2827, -4904, -3053, -219, 1606, 3077, 350, + 8949, 4159, 587, -2658, -2926, -2276, -1678, -1050, -331, -65, -22, -396, -501, -142, -463, -1189, + -5048, -1761, -1240, -3476, -3747, -2868, 162, 3168, 4073, 1904, 569, 468, 1695, 3016, 2504, 582, + 13457, 16793, 15820, 10226, 6095, -181, -2293, -4895, -6222, -6960, -7158, -7267, -7171, -6955, -6811, -6477, + -1163, 1485, 2929, 4720, 6317, 6894, 3387, -44, -1981, -2797, -3233, -2707, -2580, -3352, -3680, -4195, + 10024, 13762, 8664, 2406, 361, 330, 523, -3418, -2716, 1302, -192, -7081, -7539, -6126, -4791, -5509, + 221, -2249, -2660, -1660, -613, -278, -544, -655, 183, 1048, 1304, 660, 1055, 1496, 1247, 1445, + 846, 5133, 6934, 10757, 11411, 9325, 4488, 1331, -3265, -7057, -8303, -5003, -4657, -8262, -7258, -6419, + 9482, 12253, 6534, -607, -2653, -673, 306, -1178, -1765, -3207, -3766, -3761, -3142, -1768, -2113, -3942, + -550, 1425, 2011, 157, -1079, -1413, -1697, -1610, -686, 39, 810, 288, 848, 1801, 1010, -1353, + -10109, -11744, -7706, 379, 8248, 6559, 38, -828, 2185, 6885, 844, 754, 4769, 3153, -890, -2538, + 13503, 12466, 7450, 1458, -2178, -4645, -5771, -6295, -6474, -5971, -4508, -2899, 1290, 560, 405, 1608, + 4667, 8260, 6596, 1763, 3540, 6861, 3573, -969, -5225, -5388, -4163, -2503, -3545, -3940, -3641, -5886, + 5072, 10057, 11017, 4484, 3638, 2703, 2095, 2224, 2067, -2996, -4340, -4397, -7071, -7750, -8132, -8671, + 7076, 4469, 996, -4409, -7469, -8582, -7901, -7025, -4868, -1656, 2572, 4172, 4462, 5363, 6290, 6510, + 11515, 12880, 10465, 3540, 1874, 6237, 6698, 3799, -2308, -7772, -8623, -8541, -7869, -7144, -7664, -7087, + 1889, 3817, 3520, 1054, -342, -451, -2129, -3116, -3726, -5315, -4316, -2809, 54, 3440, 4742, 3688, + 12822, 7564, 3096, -1375, -2981, -3502, -2957, -2787, -2321, -2052, -2014, -1157, -656, -1499, -1036, 856, + -7298, -3128, -1459, -3766, -3686, -1244, 669, 2187, 5005, 6621, 4491, 1512, 782, 783, -274, -1196, + 12071, 12166, 10231, 7547, 4891, 1997, 167, -1868, -2940, -5141, -6998, -7442, -6793, -6155, -5653, -6081, + -1753, 1625, 4228, 3372, 2337, 4063, 4415, 1944, 491, -2688, -5614, -5677, -3836, -1216, -247, -1444, + 12512, 6411, 2980, 101, -359, -558, -915, -211, -81, -568, -1190, -2006, -2777, -3666, -4294, -5379, + -9543, -6774, -6214, -7549, -7059, -3854, -1628, 2101, 5622, 6976, 6572, 5418, 5229, 4875, 3740, 2087, + 8837, 12535, 11328, 7255, 2550, -2526, -4345, -6428, -5892, -7230, -7262, -4485, -1885, -283, -223, -1946, + 9129, 8498, 4366, 281, -3607, -5680, -5660, -5230, -3574, -1874, -344, -92, 1479, 1933, 516, -142, + 5256, 9433, 6759, -793, -3866, -459, 5206, 4388, 3690, -2799, -7970, -5691, -3094, -697, -2658, -6706, + -2216, -5889, -3568, 2955, 9741, 7436, 239, -1003, 1111, 4778, -1103, -1008, 1967, -1394, -4972, -7074, + 10789, 7440, 2779, -665, -2630, -3084, -1314, 514, 584, -2094, -4598, -5089, -1705, -879, -523, 474, + 6838, 5757, 5081, 5754, 4886, 2602, 782, 166, -233, -2235, -3851, -4886, -4905, -4949, -5029, -5777, + 3777, 8672, 7923, 2766, 875, 3035, 2111, 256, -660, -3765, -6885, -7930, -5724, -1376, 64, -3141, + 1043, 1116, -2723, -6588, -6935, -6723, -5310, 129, 5099, 4079, 3612, 2961, 2573, 4722, 2989, -43, + 1107, 6435, 9892, 10493, 10103, 8530, 4943, 5882, 5571, -2662, -9598, -11372, -11225, -10110, -8411, -9579, + -5006, -976, 1744, 1682, 136, -921, -1278, -2195, -2395, -1642, 74, 1034, 1476, 2263, 2966, 3036, + 5150, 4553, 3608, 1262, -1364, -913, 1595, 2380, 2112, -469, -3306, -3879, -2810, -2832, -2793, -2294, + -3555, -3199, -1984, -903, 897, 2488, 1905, 2582, 2162, 544, 447, 1148, 647, -112, -935, -2133, + 19565, 17281, 11036, 5756, 1904, 520, -2148, -4844, -5499, -5875, -6311, -6526, -6486, -6349, -6068, -5956, + -4564, 687, 4457, 4047, 2491, 1633, 917, 80, 46, 286, -541, -1798, -2353, -1410, -1770, -2208, + 10582, 8739, 6358, 4552, 5070, 5384, 3814, 1464, -830, -3127, -4787, -5934, -6628, -7437, -8195, -9024, + -8243, -6062, -5955, -6127, -4538, -1750, -708, 329, 1275, 2189, 2653, 2630, 4348, 7441, 7186, 5331, + 3524, 8176, 10617, 11183, 9097, 4548, 2951, -138, -2003, -4822, -9077, -10737, -10317, -6266, -1688, -5048, + -160, 2942, 5298, 6724, 7063, 1816, -1506, -2566, -575, -1613, -6146, -5214, -2667, -893, -655, -1848, + 1846, 4832, 4243, 1910, 516, -856, -1034, -742, -737, -953, -523, -41, -980, -1924, -2386, -3170, + -15228, -14072, -7488, 944, 6245, 6079, 828, -630, 1680, 6027, 390, 513, 5448, 5516, 2111, 1639, + 19563, 12033, 6609, 1145, -1338, -2373, -3214, -3154, -3135, -3507, -3551, -3495, -3191, -3941, -4145, -4305, + -3621, -2181, 970, 8464, 10422, 7881, 6143, 5042, 3015, 869, -2539, -3894, -5022, -7336, -8360, -9855, + 4589, 9181, 6169, 1082, 342, 359, 16, 127, 334, -1624, -2322, -2546, -2957, -3264, -4017, -5471, + 3606, -2296, -3662, -4758, -3791, -5478, -4900, -5253, -5389, -5139, -4257, -168, 6209, 6583, 9851, 18841, + 8752, 12363, 11875, 8625, 6928, 5159, 4395, 2087, 1077, -2569, -6852, -9550, -10394, -10712, -10636, -10548, + 1860, 2305, -375, -3366, -3658, -1668, 102, 33, -397, -793, -1050, -1026, 612, 3009, 3141, 1271, + 3601, 5629, 2769, -909, -3496, -4488, -4379, -4804, -4034, -2723, -478, 276, 2538, 4467, 3717, 2316, + -1091, -1227, -3638, -5036, -2839, 46, 2252, 4024, 4850, 4463, 2408, 276, -365, -206, -1119, -2800, + 13340, 14579, 9317, 4636, 1290, -97, 1113, -792, -1998, -3958, -3763, -4187, -6194, -6888, -7768, -8630, + -236, -1847, -3948, -2955, 848, 6018, 7872, 6895, 5707, 2744, 710, -1794, -4003, -4701, -5551, -5758 +}; + +/*Q12*/ +const Word16 ivas_sns_cdbk_tcx10_stage2_fx[32 * 16] = { + 1254, 2000, -111, -1953, -2171, -1043, -545, -612, -607, 355, 1181, 1127, 407, -72, 136, 651, + 1677, -181, -362, 1586, 2110, 1730, 1432, 1098, 154, -818, -1272, -1336, -1575, -1560, -1581, -1103, + -657, -1538, -1699, -507, 1053, 1212, 186, -178, -469, -827, 133, 2395, 4402, 1302, -1796, -3012, + -2950, 352, 1493, 317, -158, -83, 933, 969, -252, -2462, -2188, -58, 1292, 1447, 1121, 226, + 698, -549, -716, -673, -616, -664, 851, 3231, 3395, 1140, -408, -1086, -1210, -1305, -1243, -845, + 2743, 2575, 2092, 1507, 389, -1102, -1786, -2168, -2057, -1183, -331, 322, -167, -615, -313, 93, + -600, -1922, -1784, -461, 89, -257, -435, -978, -1404, -863, 41, 1077, 1513, 1868, 2050, 2065, + -2614, -1550, -493, 1920, 2469, 1658, 1322, 891, 120, 39, 375, 58, -816, -1117, -1258, -1006, + 4114, 141, -1496, -667, -717, -670, 81, 172, -377, -514, -566, -636, -562, -172, 483, 1384, + -1224, -232, 927, 1449, 1662, 219, -1358, -2391, -2453, -568, 1446, 1748, 514, -215, 94, 381, + -2542, -2686, -1605, -961, -430, -99, 429, 1125, 1378, 1174, 1221, 1454, 908, 258, 15, 360, + -990, 1611, 1860, -56, -115, 132, -143, 570, 2335, 1232, -117, -340, -953, -1048, -1653, -2325, + -1043, 825, 558, 90, 77, 1451, 1251, -180, -132, 1996, 1103, -2372, -3534, -1902, 879, 933, + 413, -20, 632, 2414, 2389, 615, -571, -1252, -1630, -1721, -1782, -2012, -990, 319, 1376, 1819, + -3559, -518, 1547, 1324, -401, -1236, -464, 286, 445, 417, 78, -85, -106, 81, 648, 1542, + 175, 86, 1305, 954, -1355, -3290, -3017, -1397, 49, 1139, 1881, 2013, 1238, 580, -71, -289, + -1374, 310, -1225, -3016, -2673, -729, 1486, 1715, 1031, 429, 124, -461, 110, 1435, 1736, 1102, + 1452, 2766, 1584, 39, -167, 368, 1002, 674, -710, -1804, -1906, -1640, -1156, -768, -151, 418, + 1743, 660, -478, -657, -589, -842, -315, -227, -806, -1840, -1270, 444, 2334, 2275, 464, -895, + -1221, -2116, -2089, -944, 1010, 2035, 1826, 1844, 652, -1037, -1405, -1030, -188, 323, 779, 1560, + 1345, 1687, 1678, 945, -1118, -3020, -1357, 854, 1198, 98, -913, -918, -434, -448, -201, 605, + -720, 1466, 2918, 2271, 1555, 1037, 3, -715, -816, -748, -566, -552, -1105, -1496, -1558, -972, + 769, -1385, -1653, -673, -1444, -2353, -1657, 161, 1159, 991, 469, -49, 638, 1195, 1616, 2213, + 921, -1842, -199, 2419, 2210, -340, -2057, -988, 955, 653, -182, 179, -79, -812, -707, -130, + 3529, 896, 163, 98, -379, -690, -478, 329, 251, 506, 958, 943, 23, -1379, -2370, -2398, + 2120, 592, -895, -1916, 1168, 4037, 176, -2475, -1664, 291, -325, -455, 71, 89, -566, -249, + 2005, -2001, -3131, -1768, -336, 467, 955, 603, 145, 776, 1259, 1064, 391, -96, -317, -16, + -458, 921, 2, -1318, -618, 1762, 2872, 1443, -494, -954, 625, 807, -263, -885, -1580, -1861, + -913, -1382, 280, 380, 190, 897, -146, 150, 2509, 2072, -1691, -2832, -2267, 665, 2229, -140, + -57, 1690, 1163, -536, -1436, -1521, -1073, -1169, -1491, -1688, -1247, -678, 313, 1668, 2955, 3108, + -3201, 226, 404, -1437, -1195, 554, 435, -1440, -1127, 652, 1406, 1076, 1635, 1724, 858, -571, + -834, -883, -668, -171, -455, -236, 160, 54, 711, 3068, 3870, 1834, -386, -1341, -2074, -2649 +}; + +/*Q12*/ +const Word16 ivas_sns_cdbk_tcx10_stage3_fx[8 * 16] = { + 623, -523, 384, -342, -1040, 513, 1226, -404, -1426, -997, -461, -246, 133, 636, 959, 965, + -665, -455, -1300, -1050, 567, 1223, 430, 481, 1090, 223, -598, -788, 171, 859, 304, -492, + -208, 605, -411, -1315, -717, -764, -1112, -319, 15, -176, 415, 1433, 1263, 414, 315, 561, + -784, -124, 922, 326, -1112, -803, 1144, 1435, 427, 25, 268, 478, 151, -534, -930, -887, + 1087, -853, -1027, 490, 1117, 729, -10, -523, -934, 31, 874, 798, 188, -485, -729, -753, + 1051, 1010, 416, -120, -588, -573, -850, -806, 717, 1704, 536, -841, -665, 167, -153, -1004, + -357, 94, 2, 303, 589, 278, 15, 480, 358, 5, -311, -465, -1287, -1594, -94, 1984, + -746, 246, 1015, 1707, 1184, -603, -843, -344, -247, -816, -723, -368, 46, 537, 328, -373 +}; + + +const Word16 *const ivas_sns_cdbks_tcx10_fx[SNS_MSVQ_NSTAGES_TCX10] = { + ivas_sns_cdbk_tcx10_stage1_fx, ivas_sns_cdbk_tcx10_stage2_fx, ivas_sns_cdbk_tcx10_stage3_fx +}; + +/*Q15*/ +const Word16 ivas_sns_cdbks_side_tcx20_stage1_fx[32 * 16] = { + -3728, -2160, 1376, 1464, 5856, -904, -10680, -6904, -1608, 416, 424, 496, 2688, 4152, 4160, 4952, + -560, 3056, 7720, 7344, 3520, 1648, 1304, -240, -1584, -2856, -2792, -3952, -3656, -3480, -2920, -2560, + -8728, 8968, 14888, 5968, 21344, 5920, 4776, -264, 8624, -1504, -17040, -5336, 1256, -10424, -14160, -14288, + -1448, -3424, -3008, -3480, -3088, 3056, 8840, 5432, 2032, 360, 712, -784, -1200, -1288, -1424, -1288, + 13432, 2072, -720, -472, -456, -608, -1712, -1696, -1040, -1144, -904, -1920, -1488, -1384, -1248, -704, + 80, 1008, 664, 448, -296, 424, 312, -992, -1584, -728, 392, -568, -376, -24, 392, 840, + 5688, 7336, 6456, -624, -9016, -17624, -10056, -1160, 24, -1624, 2464, 1712, 4152, 5344, 3976, 2960, + -10488, -9544, -8104, -5832, -4608, -3472, -4152, -3560, -2824, -2432, 1000, 5216, 8184, 10328, 13400, 16880, + -16272, -1104, 2744, 1400, 1136, 1768, 1136, 776, 1232, 1040, 928, 8, 936, 1008, 1448, 1816, + -1328, 736, 320, 1208, 1824, 1536, 1064, 2656, 3136, 1408, -288, -2120, -1880, -1544, -3200, -3528, + 8896, 12112, 13000, 12592, 9880, 7096, 5096, 3976, -264, -4192, -7528, -12816, -14632, -15344, -11792, -6072, + -10376, -9040, -7304, -6064, -5168, -3880, -1520, 1064, 3592, 5512, 6664, 5456, 6560, 6544, 4664, 3288, + -920, -896, -2184, -3256, -3448, -3456, -1864, 568, 2016, 2568, 2880, 1688, 1776, 1696, 1400, 1440, + -4720, -10120, -2584, 1744, 2104, 1056, 1888, 1904, 1680, 1368, 1768, 496, 944, 1104, 768, 608, + 16256, 14832, 9552, 5128, 1712, 576, -1640, -2176, -3552, -4936, -5616, -6728, -6040, -5752, -6296, -5320, + -184, -1008, -3024, -4136, -5216, -3936, -3624, -4376, -4232, -3232, 576, 4216, 7160, 8144, 6144, 6728, + -368, -2000, -1056, 5944, 2240, -4560, -3328, 56, -152, 320, 1032, -224, 144, 784, 568, 592, + -1480, -1800, -1408, 1760, 6952, 8256, 2920, -1120, -1624, -2040, -2016, -2568, -1720, -1448, -1512, -1160, + 2664, 6728, 1408, 3608, 12192, 14000, 10448, 6336, 512, -5864, -6624, -12560, -8152, -6744, -8048, -9928, + -13144, -6696, -1600, 616, -2632, 528, 4400, 8960, 11480, 11720, 6280, -1864, -3816, -5160, -4912, -4168, + 9056, 9144, 7344, 1176, -3360, -2016, -2800, -6504, -8400, -7448, -6560, -4112, -88, 2680, 4856, 7016, + -3744, -2248, 8016, -104, -1416, -1088, 800, -120, -736, 56, 608, -488, -336, 72, 224, 504, + 2632, 7816, 5536, 952, -1432, -3464, -2552, -1216, -208, -848, -1208, -2080, -1416, -1040, -1064, -408, + -2368, -5768, -9744, -11552, -11408, -8432, -6872, -6064, -3680, -1736, 3160, 10064, 12880, 18576, 13312, 9632, + -7928, -3608, -1672, 1288, -2016, -608, 360, 1408, -7064, -632, 304, 1576, 8632, 12056, 4336, -6424, + 5312, 5368, 4720, 3544, 2936, 3752, 3848, 3816, 4296, 3704, 696, -5192, -6936, -8968, -11080, -9816, + -4792, 2248, 8104, 12752, 10440, 8984, 6280, 4520, 2280, -616, -3800, -9336, -11736, -12464, -8504, -4352, + -21240, -19008, -5088, -2328, -2720, 320, 3480, 3464, 4584, 4256, 5712, 6032, 3072, 4104, 6776, 8592, + 2568, 5384, -472, -6848, -2944, 1408, 2200, 248, -1216, -960, -656, -1040, 120, 528, 504, 1176, + -776, -4680, -12008, -3696, 1384, 4616, 1360, 304, 1304, 1816, 2016, 1336, 1840, 2104, 1720, 1360, + 7576, 7056, 5488, 5128, 4136, 3440, 2848, 656, -1136, -4208, -6088, -9664, -8864, -5648, -2272, 1552, + -6416, -4792, -3704, -1832, -1704, -296, 752, -224, -1064, 56, 1488, 824, 1304, 2472, 5160, 7952 +}; + +/*Q15*/ +const Word16 ivas_sns_cdbks_side_tcx20_stage2_fx[32 * 16] = { + -456, 24, 560, 192, 1840, -2680, -9592, 128, 4608, 1272, 344, 1256, 1384, 680, 192, 248, + -2328, -3360, 1248, 3000, 3896, 4416, 1664, -3648, -4536, -6792, -8432, -4936, 1064, 2664, 5760, 10312, + 2344, 952, 640, 264, 768, 680, 1056, 720, 1136, 584, -1240, -4600, -7104, -3616, 1888, 5520, + -3544, -896, -2704, -2696, -2592, 1632, 3360, 7824, 8416, 1040, -5184, -4800, -264, -16, -472, 896, + -744, 920, 4624, -2216, -2408, 5328, -240, -2152, -936, -352, -784, 416, -192, -216, -464, -592, + -3192, -3016, -2016, -392, 216, 1368, 272, -576, -2792, -4120, -2064, 4488, 8256, 5024, 64, -1528, + -6632, 8864, 1944, 136, 728, -320, -872, -896, -1072, -552, -848, -48, -248, -312, 152, -32, + 2112, -8752, 4024, 840, -208, 144, 280, -56, 200, -232, -616, 392, 280, 328, 664, 600, + -24, -1232, -1192, -512, 184, -184, -96, 1072, 1560, 624, -344, 576, 416, 144, -440, -552, + 2272, 1736, 2000, 4384, 4400, 176, -3256, -6008, -7160, -2736, 664, 1928, 440, 376, 640, 136, + 120, -1656, -168, 6256, -6160, -1792, 16, -712, -64, 56, 136, 816, 728, 904, 888, 632, + 808, -136, -872, -2816, -2072, -2248, -2456, -1640, -2000, -200, 1848, 2896, 1928, 2208, 2544, 2208, + 4488, 2784, 2328, 1536, 808, 160, -352, -216, 464, -240, -1360, -888, -1360, -1992, -3040, -3120, + -5496, 2184, 5968, 2424, -656, 1816, 1280, -3936, -3536, 4040, 12432, 1072, -5288, -4992, -3456, -3848, + -432, -368, -1224, 88, -1520, -8008, 3272, 3624, 280, 336, 432, 1264, 544, 488, 632, 592, + 1448, 2544, -1144, -6016, 5152, 2008, -968, -616, -784, 24, -344, 288, -184, -304, -488, -616, + 4488, 368, -1096, -568, -2544, -4016, -2504, -568, 4672, 6984, 4776, 1056, -2744, -3944, -2496, -1880, + 968, -4008, -8112, 3112, 6192, 856, 424, 984, 296, -304, -840, 288, -80, -56, 288, -8, + -1264, -1272, -2912, -2256, 728, 3352, 4208, 2752, 2152, 2680, 2488, 1312, -1568, -3096, -3392, -3904, + 304, 1536, 2680, 1232, 208, -1256, -384, 9248, 912, -8256, -4200, 520, 376, -472, -1448, -1008, + 2088, 4072, 3128, -4384, -8616, -2072, 1088, 2160, 1592, 864, 192, 648, -96, -192, -24, -432, + -552, -1712, -1880, 264, -384, -2256, -2816, -536, -400, 1536, 5952, 8824, 4416, -800, -4176, -5480, + -720, -1768, -744, -16, 2360, 2736, 1856, -488, 928, 3080, 2008, -15984, -608, 5080, 1920, 352, + 12608, -1616, -2600, -824, -760, -680, 880, -16, -1720, -1112, -1520, -352, -592, -728, -528, -440, + -7816, -2128, -592, -112, 1320, 632, 600, 1008, 984, 936, 336, 1216, 704, 1144, 1152, 616, + 1264, 944, 848, 1416, 1144, -720, -1136, -640, -776, -3120, -4552, -1072, 448, 1928, 2120, 1896, + -488, 488, 416, 1488, 240, 2720, 5832, 1008, -3848, -2352, -1576, -232, -528, -800, -1088, -1272, + 2264, -1608, -7672, -10576, -5000, -928, 1928, 1832, 2824, 2688, 1712, 1792, 728, 2584, 4280, 3144, + -4408, -880, 3512, 5256, 4360, 1432, 288, 656, 1312, 576, -984, -816, -2224, -2840, -2504, -2744, + -640, -1960, -2008, 264, 1048, 2688, -1480, -8376, -904, 3448, 2056, 1536, 952, 1040, 1392, 936, + -1640, 2768, 8904, 1744, -2096, -4256, -2392, -1696, -1200, -48, -32, 712, 296, -24, -432, -608, + 2776, 6200, -5888, -520, -584, -712, 216, -248, -624, -352, -480, 464, 112, -184, -120, -56 +}; + +/*Q15*/ +const Word16 *const ivas_sns_cdbks_side_tcx20_fx[SNS_MSVQ_NSTAGES_SIDE] = { + ivas_sns_cdbks_side_tcx20_stage1_fx, ivas_sns_cdbks_side_tcx20_stage2_fx +}; + +/*Q15*/ +const Word16 ivas_sns_cdbks_side_tcx10_stage1_fx[32 * 16] = { + + -7848, -6656, -5840, -4312, -4040, -3144, -3504, -5424, -4896, -2480, 864, 3328, 5584, 9080, 12416, 16872, + 4224, 6824, 7512, 9824, 7952, 4744, 2576, 808, -2496, -6040, -8736, -10896, -9040, -4576, -1000, -1680, + -4640, -4360, -3664, -1224, -1248, 1688, 2408, 240, 1472, -768, -4040, -384, 9208, 7928, 2304, -4904, + 1752, 4024, 4568, 3272, 2560, 608, 1128, 3400, 2144, -992, -3240, -3264, -1968, -3920, -5976, -4080, + -1424, -1096, -2184, -2136, -1600, -3816, -6736, -6640, -5104, -32, 3400, 6944, 8000, 4760, 3232, 4416, + 1904, 7392, 3336, -2824, -2448, 1712, 1720, -1384, -2312, -1216, -792, -1032, -1048, -1328, -1248, -432, + 656, -1096, -4768, -13792, -6424, 1248, 872, 536, 1256, 1896, 2216, 2648, 2992, 3336, 3928, 4496, + 4480, 10016, 15456, 17952, 13048, 8872, 5768, 3016, -432, -5624, -10376, -13808, -17456, -15040, -8984, -6896, + -12776, -12320, -12112, -9552, -8552, -6528, -4960, -2968, -1336, 4376, 9872, 12640, 13320, 10192, 9832, 10872, + 11504, 17136, 13720, 4704, -1232, -4304, -6024, -5920, -5168, -5728, -5584, -4984, -2704, -2168, -2112, -1136, + -21904, -10168, -7024, -3928, -3384, 2632, 7144, 6840, 3328, 1080, -1440, 2560, 2400, 2544, 6792, 12520, + -5624, -3840, -1144, 1976, 5928, 11032, 12960, 8904, 4208, -1208, -5624, -6976, -6816, -5680, -4096, -4008, + -6144, -13096, -584, 3296, 1888, 928, 1800, 1400, 1360, 1536, 1368, 1792, 2032, 1032, 440, 936, + 11408, 7680, -1800, -5968, -9432, -10216, -9208, -6496, -5136, -2704, 992, 4472, 7248, 6808, 5392, 6960, + -1896, -3464, 2944, 9976, 6208, 4840, 2976, -688, -1752, -1456, -2336, -2912, -2616, -2816, -3208, -3800, + 5776, 8536, 7128, 6888, 6600, 9088, 7080, -40, -360, -3832, -7640, -5192, -2648, -2912, -11704, -16760, + -12496, -15912, -11792, -5288, -856, 296, -416, 1320, 3128, 5064, 5352, 6272, 6928, 6656, 5896, 5848, + 1912, 2064, 1344, 1048, 2592, 2200, -944, -1656, -816, -5840, -10576, -5456, -176, 1808, 3912, 8560, + 1568, -1384, -7912, -1256, 1728, 2248, 1904, 392, -456, -360, 656, 904, 1016, 760, 464, -264, + -120, 48, 448, 0, 696, 1096, 488, 152, 1864, 4400, 2848, -168, -2384, -3120, -3592, -2656, + -5232, -3632, -4264, -2352, -2128, -1848, -1512, -400, 1592, 1208, -16, -800, -424, 3016, 7024, 9784, + 18344, 5184, -408, -1416, -1904, -488, -704, -1256, -1104, -1232, -2264, -2504, -2088, -2120, -2776, -3272, + -1304, -1072, -992, -1688, -1168, -1344, -1280, 584, 1688, 456, -1464, -2000, -400, 2392, 4040, 3568, + 14784, 15304, 12752, 7616, 5384, 5928, 6856, 1112, -4496, -9040, -13088, -12584, -10176, -9328, -9488, -1528, + -2888, -7528, -13744, -16216, -13232, -9088, -7384, -4312, -1464, 3944, 8176, 10192, 17080, 15872, 10728, 9872, + 10880, 9704, 5888, 2192, 3280, 4544, 1144, -1072, -3952, -6872, -9712, -6848, -2696, -5512, -5248, 4304, + -14480, 576, 2424, 1096, 1448, 1544, 992, 1336, 1344, 752, 152, 616, 936, 616, -16, 680, + -12000, -7664, -2680, -496, -1608, 2592, 7576, 9280, 12576, 9576, 3256, -288, -3216, -5392, -6208, -5304, + -5584, -6016, -6232, -5184, -6632, -7168, -4296, 328, 3936, 8224, 8200, 6736, 4760, 4576, 3400, 952, + 2288, 2368, 5984, 832, -8112, -9376, -3656, -1216, 120, 1048, 1440, 1880, 2560, 2360, 936, 536, + 2568, 4440, 5712, 5072, 4120, -312, -4944, -6440, -6424, -3376, -1504, -856, 664, 784, 432, 48, + 8304, 7392, 7344, 5608, 5952, 5536, 5408, 6632, 5584, 848, -5448, -7904, -10480, -13136, -12536, -9104 +}; + +/*Q15*/ +const Word16 ivas_sns_cdbks_side_tcx10_stage2_fx[8 * 16] = { + -4584, -808, 4152, 912, 2192, 4200, 2456, -648, -1912, -2472, -2144, -1792, -1424, -208, 1120, 968, + -2200, -3752, -3208, -2992, -3992, -328, 3600, 3784, 1968, 1248, 672, 568, 792, 928, 1256, 1656, + 1808, 1000, 1280, 1904, 704, 1064, 1312, -288, -1832, -784, 1216, 2080, 888, -2416, -4176, -3776, + 3672, 6576, 1488, -3552, -4648, -2792, -1064, 1112, 1448, 216, -408, -608, -440, -344, -256, -400, + -1368, -2416, -4856, 696, 5248, 3904, 1832, 2648, 4112, 1776, -1008, -1336, -1976, -2336, -2544, -2376, + -2440, -1352, -1328, -2248, -1384, -1264, -1680, -2912, -1816, 1208, 2960, 2192, 2920, 4296, 2664, 176, + -1736, 1104, 5248, 5632, 808, -4352, -4568, -1376, 224, 664, 280, 48, -376, -992, -736, 128, + 6848, -368, -2784, -360, 1080, -432, -1896, -2328, -2192, -1848, -1568, -1144, -392, 1072, 2680, 3616 +}; + +const Word16 *const ivas_sns_cdbks_side_tcx10_fx[SNS_MSVQ_NSTAGES_SIDE] = { + ivas_sns_cdbks_side_tcx10_stage1_fx, ivas_sns_cdbks_side_tcx10_stage2_fx +}; + +/*----------------------------------------------------------------------* + * MC ParamUpmix ROM tables + *-----------------------------------------------------------------------*/ + +const ACPL_QUANT_TABLE_FX ivas_mc_paramupmix_alpha_quant_table_fx = { + 33, /* nquant */ + 16, /* offset */ + { + -536870912, -485700416, -439563072, -398458880, -362387872, -331350016, -305345344, + -284373824, -268435456, -252497104, -231525584, -205520896, -174483040, -138412032, + -97307856, -51170508, 0, 51170508, 97307856, 138412032, 174483040, + 205520896, 231525584, 252497104, 268435456, 284373824, 305345344, 331350016, + 362387872, 398458880, 439563072, 485700416, 536870912, 0, 0 } /* data in Q28 */ +}; + +const ACPL_QUANT_TABLE_FX ivas_mc_paramupmix_beta_quant_table_fx[9] = { + { + 9, /* nquant */ + 0, /* offset */ + { 0, 63753420, 147639504, 251658240, 375809632, 520093696, 684510400, 869059776, 1073741824 } /* data in Q28 */ + }, + { + /* Beta #2 */ + 9, /* nquant */ + 0, /* offset */ + { 0, 54638668, 126531672, 215678976, 322080672, 445736544, 586646912, 744811456, 920230272 } /* data in Q28 */ + }, + { + /* Beta #3 */ + 9, /* nquant */ + 0, /* offset */ + { 0, 46420464, 107500024, 183238656, 273636384, 378693184, 498409216, 632784256, 781818240 } /* data in Q28 */ + }, + { + /* Beta #4 */ + 9, /* nquant */ + 0, /* offset */ + { 0, 39098780, 90544544, 154337280, 230477024, 318963584, 419797344, 532978048, 658505728 } /* data in Q28 */ + }, + { + /* Beta #5 */ + 9, /* nquant */ + 0, /* offset */ + { 0, 32673642, 75665248, 128974864, 192602432, 266548032, 350811584, 445393216, 550292672 } /* data in Q28 */ + }, + { + /* Beta #6 */ + 9, /* nquant */ + 0, /* offset */ + { 0, 27144998, 62862136, 107151352, 160012704, 221446144, 291451648, 370029408, 457179136 } /* data in Q28 */ + }, + { + /* Beta #7 */ + 9, /* nquant */ + 0, /* offset */ + { 0, 22512928, 52135212, 88866816, 132707776, 183658096, 241717760, 306886688, 379165088 } /* data in Q28 */ + }, + { + /* Beta #8 */ + 9, /* nquant */ + 0, /* offset */ + { 0, 18777374, 43484452, 74121200, 110687696, 153183840, 201609712, 255965264, 316250528 } /* data in Q28 */ + }, + { + /* Beta #9 */ + 9, /* nquant */ + 0, /* offset */ + { 0, 15938355, 36909876, 62914560, 93952408, 130023424, 171127600, 217264944, 268435456 } /* data in Q28 */ + } +}; + +/* Q Factor is 31*/ +const Word32 ivas_han_win_48k_fx[L_FRAME32k] = { + 5760, 22976, 51712, 91904, 143552, 206784, 281408, 367552, 465216, + 574272, 694912, 826944, 970496, 1125504, 1292032, 1470016, 1659456, + 1860352, 2072704, 2296576, 2531904, 2778624, 3036864, 3306560, 3587648, + 3880256, 4184256, 4499712, 4826624, 5164992, 5514752, 5875968, 6248576, + 6632640, 7028096, 7434944, 7853248, 8282880, 8723968, 9176448, 9640320, + 10115584, 10602176, 11100224, 11609536, 12130304, 12662400, 13205824, 13760576, + 14326720, 14904192, 15492928, 16093056, 16704512, 17327232, 17961216, 18606592, + 19263168, 19931072, 20610240, 21300672, 22002368, 22715328, 23439488, 24174912, + 24921600, 25679424, 26448512, 27228800, 28020288, 28822976, 29636864, 30461888, + 31298048, 32145344, 33003840, 33873472, 34754176, 35646016, 36548992, 37463040, + 38388224, 39324416, 40271680, 41230016, 42199424, 43179840, 44171264, 45173696, + 46187200, 47211648, 48247104, 49293504, 50350848, 51419200, 52498432, 53588608, + 54689664, 55801664, 56924544, 58058304, 59202944, 60358400, 61524736, 62701888, + 63889856, 65088640, 66298176, 67518528, 68749632, 69991488, 71244096, 72507392, + 73781440, 75066176, 76361536, 77667648, 78984384, 80311744, 81649728, 82998400, + 84357568, 85727424, 87107776, 88498688, 89900160, 91312128, 92734656, 94167680, + 95611136, 97065088, 98529472, 100004288, 101489536, 102985152, 104491200, 106007552, + 107534336, 109071424, 110618816, 112176512, 113744512, 115322816, 116911296, 118510080, + 120119040, 121738240, 123367552, 125007104, 126656768, 128316608, 129986496, 131666496, + 133356608, 135056768, 136766976, 138487232, 140217408, 141957632, 143707840, 145467968, + 147238016, 149017984, 150807872, 152607616, 154417216, 156236672, 158065920, 159904960, + 161753728, 163612352, 165480640, 167358720, 169246464, 171143808, 173050880, 174967552, + 176893888, 178829760, 180775296, 182730304, 184694848, 186668928, 188652480, 190645504, + 192648000, 194659904, 196681216, 198711936, 200752000, 202801344, 204860032, 206928064, + 209005376, 211091904, 213187648, 215292672, 217406784, 219530048, 221662528, 223804096, + 225954752, 228114496, 230283264, 232461056, 234647872, 236843584, 239048320, 241262016, + 243484544, 245716032, 247956288, 250205440, 252463424, 254730112, 257005632, 259289856, + 261582784, 263884416, 266194688, 268513664, 270841216, 273177344, 275522048, 277875264, + 280237056, 282607296, 284986048, 287373184, 289768768, 292172672, 294584960, 297005632, + 299434560, 301871808, 304317312, 306771072, 309233024, 311703040, 314181312, 316667712, + 319162240, 321664832, 324175424, 326694080, 329220672, 331755200, 334297728, 336848192, + 339406528, 341972672, 344546688, 347128448, 349718080, 352315328, 354920384, 357533120, + 360153536, 362781568, 365417152, 368060352, 370711168, 373369408, 376035200, 378708416, + 381389120, 384077120, 386772608, 389475456, 392185536, 394902976, 397627648, 400359552, + 403098624, 405844928, 408598400, 411358976, 414126592, 416901312, 419683008, 422471680, + 425267392, 428070016, 430879552, 433695936, 436519232, 439349312, 442186112, 445029696, + 447880064, 450737088, 453600832, 456471168, 459348160, 462231616, 465121600, 468018176, + 470921280, 473830784, 476746688, 479668928, 482597632, 485532608, 488473856, 491421376, + 494375168, 497335168, 500301184, 503273472, 506251840, 509236288, 512226752, 515223296, + 518225728, 521234048, 524248320, 527268608, 530294592, 533326528, 536364096, 539407552, + 542456576, 545511296, 548571712, 551637888, 554709440, 557786624, 560869376, 563957504, + 567051264, 570150272, 573254656, 576364544, 579479616, 582600064, 585725696, 588856704, + 591992704, 595134080, 598280256, 601431680, 604588160, 607749632, 610916224, 614087680, + 617264128, 620445312, 623631488, 626822336, 630017984, 633218496, 636423616, 639633408, + 642847872, 646067008, 649290624, 652518784, 655751552, 658988672, 662230400, 665476352, + 668726784, 671981504, 675240576, 678503808, 681771264, 685042944, 688318784, 691598848, + 694882880, 698171072, 701463168, 704759296, 708059392, 711363328, 714671296, 717982976, + 721298560, 724617728, 727940864, 731267392, 734597760, 737931776, 741269376, 744610624, + 747955200, 751303488, 754655040, 758009984, 761368512, 764730240, 768095360, 771463616, + 774835200, 778209792, 781587840, 784968832, 788352896, 791740160, 795130304, 798523584, + 801919616, 805318784, 808720640, 812125312, 815532928, 818943168, 822356288, 825771840, + 829190272, 832611200, 836034816, 839460928, 842889472, 846320640, 849754112, 853190080, + 856628352, 860068992, 863511808, 866957056, 870404352, 873853696, 877305408, 880759104, + 884215040, 887672832, 891132736, 894594496, 898058112, 901523840, 904991232, 908460544, + 911931456, 915404288, 918878528, 922354560, 925832384, 929311616, 932792512, 936274816, + 939758720, 943243904, 946730624, 950218560, 953707840, 957198528, 960690368, 964183488, + 967677568, 971172992, 974669440, 978166912, 981665536, 985164992, 988665600, 992166912, + 995669248, 999172288, 1002676288, 1006180864, 1009686208, 1013192384, 1016698880, 1020206336, + 1023714176, 1027222656, 1030731584, 1034241024, 1037750784, 1041260928, 1044771584, 1048282368, + 1051793600, 1055304896, 1058816512, 1062328192, 1065839872, 1069351872, 1072863808, 1076375808, + 1079887744, 1083399680, 1086911488, 1090423168, 1093934592, 1097445760, 1100956928, 1104467584, + 1107977984, 1111488000, 1114997504, 1118506624, 1122015232, 1125523456, 1129031040, 1132538112, + 1136044544, 1139550336, 1143055360, 1146559616, 1150063104, 1153565696, 1157067648, 1160568576, + 1164068480, 1167567488, 1171065600, 1174562560, 1178058496, 1181553408, 1185046912, 1188539520, + 1192030720, 1195520768, 1199009408, 1202496768, 1205982720, 1209467008, 1212950144, 1216431744, + 1219911936, 1223390336, 1226867328, 1230342528, 1233816192, 1237288064, 1240758144, 1244226560, + 1247693056, 1251157760, 1254620416, 1258081152, 1261539968, 1264996864, 1268451712, 1271904384, + 1275355008, 1278803456, 1282249728, 1285693696, 1289135488, 1292574848, 1296011904, 1299446784, + 1302878976, 1306308736, 1309736064, 1313160960, 1316583296, 1320002944, 1323420032, 1326834304, + 1330246144, 1333655040, 1337061120, 1340464512, 1343865088, 1347262592, 1350657152, 1354048768, + 1357437440, 1360823168, 1364205824, 1367585280, 1370961664, 1374334720, 1377704704, 1381071360, + 1384434816, 1387794944, 1391151616, 1394504960, 1397854976, 1401201152, 1404544000, 1407883520, + 1411219328, 1414551552, 1417880064, 1421204992, 1424526080, 1427843456, 1431157120, 1434466944, + 1437772928, 1441074944, 1444373120, 1447667072, 1450957312, 1454243328, 1457525248, 1460803328, + 1464077056, 1467346688, 1470612096, 1473873408, 1477130240, 1480382848, 1483630976, 1486874752, + 1490114048, 1493348992, 1496579584, 1499805440, 1503026944, 1506243584, 1509455744, 1512663296, + 1515866112, 1519064192, 1522257536, 1525446144, 1528629760, 1531808512, 1534982272, 1538151296, + 1541315328, 1544474368, 1547628288, 1550777216, 1553921024, 1557059840, 1560193152, 1563321472, + 1566444672, 1569562240, 1572674816, 1575782016, 1578883584, 1581980032, 1585070848, 1588156416, + 1591236352, 1594310912, 1597379584, 1600442880, 1603500544, 1606552576, 1609598592 +}; + +/* Q Factor is 31*/ +const Word32 ivas_han_win_32k_fx[L_FRAME32k] = { + 12928, 51648, 116224, 206656, 322880, 464960, 632832, 826496, 1046016, + 1291328, 1562496, 1859392, 2182080, 2530560, 2904832, 3304832, 3730560, + 4182080, 4659328, 5162304, 5690944, 6245312, 6825344, 7431104, 8062464, + 8719488, 9402112, 10110336, 10844160, 11603520, 12388480, 13198976, 14034944, + 14896448, 15783424, 16695808, 17633664, 18596928, 19585536, 20599552, 21638912, + 22703552, 23793472, 24908672, 26049088, 27214720, 28405504, 29621504, 30862592, + 32128704, 33419968, 34736192, 36077440, 37443712, 38834816, 40250880, 41691776, + 43157504, 44648064, 46163328, 47703360, 49268032, 50857408, 52471296, 54109824, + 55772928, 57460416, 59172416, 60908800, 62669568, 64454656, 66264064, 68097664, + 69955456, 71837440, 73743488, 75673600, 77627712, 79605824, 81607808, 83633664, + 85683392, 87756864, 89854080, 91974912, 94119360, 96287424, 98478976, 100694016, + 102932416, 105194240, 107479296, 109787648, 112119232, 114473856, 116851584, 119252352, + 121676096, 124122688, 126592192, 129084480, 131599488, 134137088, 136697408, 139280192, + 141885440, 144513152, 147163264, 149835584, 152530176, 155246848, 157985728, 160746560, + 163529408, 166334144, 169160704, 172009024, 174879040, 177770752, 180683904, 183618624, + 186574720, 189552128, 192550848, 195570752, 198611840, 201673920, 204756992, 207860992, + 210985792, 214131392, 217297600, 220484480, 223691840, 226919680, 230167936, 233436416, + 236725120, 240033984, 243362880, 246711744, 250080512, 253469120, 256877440, 260305472, + 263753024, 267220096, 270706496, 274212288, 277737280, 281281408, 284844672, 288426880, + 292027904, 295647808, 299286464, 302943744, 306619456, 310313728, 314026368, 317757248, + 321506304, 325273472, 329058688, 332861760, 336682688, 340521408, 344377664, 348251520, + 352142784, 356051456, 359977344, 363920448, 367880640, 371857792, 375851840, 379862656, + 383890112, 387934272, 391994880, 396071936, 400165248, 404274816, 408400384, 412542016, + 416699584, 420872960, 425062016, 429266688, 433486912, 437722368, 441973248, 446239360, + 450520576, 454816704, 459127808, 463453696, 467794112, 472149248, 476518784, 480902784, + 485300992, 489713344, 494139840, 498580032, 503034304, 507502208, 511983808, 516478848, + 520987392, 525509120, 530044032, 534592000, 539153088, 543726912, 548313600, 552912832, + 557524608, 562148736, 566785408, 571434048, 576094784, 580767616, 585452224, 590148608, + 594856576, 599576192, 604307072, 609049344, 613802752, 618567296, 623342592, 628128896, + 632925888, 637733504, 642551552, 647380096, 652218752, 657067648, 661926400, 666795264, + 671673856, 676562176, 681459968, 686367232, 691283648, 696209536, 701144320, 706088192, + 711040768, 716002176, 720972224, 725950656, 730937472, 735932480, 740935808, 745947008, + 750966144, 755992960, 761027456, 766069504, 771118976, 776175680, 781239680, 786310528, + 791388416, 796472896, 801564288, 806662080, 811766400, 816876928, 821993792, 827116544, + 832245248, 837379776, 842520064, 847665856, 852817152, 857973696, 863135424, 868302208, + 873474048, 878650560, 883831808, 889017728, 894207936, 899402624, 904601216, 909804160, + 915010944, 920221696, 925435904, 930653952, 935875200, 941099776, 946327616, 951558592, + 956792384, 962029120, 967268416, 972510272, 977754624, 983001344, 988250112, 993501120, + 998753856, 1004008576, 1009264704, 1014522624, 1019781888, 1025042560, 1030304256, 1035566976, + 1040830784, 1046095232, 1051360384, 1056626048, 1061892224, 1067158592, 1072425280, 1077691776, + 1082958208, 1088224512, 1093490560, 1098755968, 1104020736, 1109284864, 1114548224, 1119810432, + 1125071616, 1130331520, 1135590272, 1140847232, 1146102912, 1151356544, 1156608512, 1161858304, + 1167106048, 1172351616, 1177594624, 1182835200, 1188073344, 1193308544, 1198541056, 1203770368, + 1208996736, 1214219648, 1219439232, 1224655488, 1229867904, 1235076736, 1240281472, 1245482240, + 1250679040, 1255871360, 1261059456, 1266243072, 1271421952, 1276596224, 1281765504, 1286929920, + 1292089088, 1297243008, 1302391552, 1307534592, 1312672000, 1317803520, 1322929280, 1328049152, + 1333162752, 1338270336, 1343371264, 1348465920, 1353553920, 1358635264, 1363709568, 1368776960, + 1373837312, 1378890496, 1383936256, 1388974336, 1394004992, 1399028224, 1404043264, 1409050496, + 1414049792, 1419040640, 1424023424, 1428997632, 1433963392, 1438920448, 1443868672, 1448808064, + 1453738496, 1458659328, 1463571328, 1468473856, 1473366912, 1478250240, 1483124096, 1487987968, + 1492841856, 1497685632, 1502519296, 1507342592, 1512155392, 1516957696, 1521749504, 1526530176, + 1531299968, 1536059008, 1540806912, 1545543424, 1550268672, 1554982528, 1559684864, 1564375168, + 1569053952, 1573720832, 1578375680, 1583018240, 1587648640, 1592266496, 1596872192, 1601464960, + 1606045312, 1610612736, 1615167488, 1619708672, 1624237184, 1628752384, 1633254272, 1637742464, + 1642217216, 1646678400, 1651125504, 1655558784, 1659978240, 1664383616, 1668774784, 1673151488, + 1677513856, 1681861760, 1686194816, 1690513408, 1694817024, 1699105792, 1703379200, 1707637760, + 1711880960, 1716108800, 1720321152, 1724518144, 1728699392, 1732865024, 1737014400, 1741148160, + 1745265792, 1749367296, 1753452288, 1757521152, 1761573632, 1765609344, 1769628416, 1773630976, + 1777616640, 1781585408, 1785536768, 1789471488, 1793388800, 1797288832, 1801171328, 1805036544, + 1808883968, 1812713728, 1816525824, 1820320000, 1824096000, 1827854208, 1831594112, 1835315968, + 1839019520, 1842704384, 1846370944, 1850018944, 1853648256, 1857258624, 1860850432, 1864423168, + 1867976960, 1871511296, 1875026688, 1878522880, 1881999616, 1885456896, 1888894720, 1892312832, + 1895711488, 1899089920, 1902448896, 1905787904, 1909106688, 1912405504, 1915684096, 1918942592, + 1922180480, 1925398016, 1928595200, 1931771904, 1934927616, 1938062848, 1941177344, 1944270848, + 1947343360, 1950395136, 1953425664, 1956434944, 1959422976, 1962389632, 1965335040, 1968259072, + 1971161344, 1974042368, 1976901504, 1979739008, 1982554624, 1985348352, 1988120320, 1990870272, + 1993597952, 1996303616, 1998987264, 2001648384, 2004287104, 2006903552, 2009497728, 2012069376, + 2014618112, 2017144576, 2019648256, 2022129024, 2024587136, 2027022336, 2029434624, 2031823872, + 2034190080, 2036533120, 2038853120, 2041149696, 2043423232, 2045673344, 2047900160, 2050103296, + 2052283136, 2054439552, 2056572160, 2058681216, 2060766464, 2062828160, 2064865920, 2066879744, + 2068869888, 2070835968, 2072778240, 2074696192, 2076590336, 2078460160, 2080305792, 2082127360, + 2083924608, 2085697536, 2087446016, 2089170304, 2090870144, 2092545280, 2094196096, 2095822336, + 2097424128, 2099001088, 2100553472, 2102081024, 2103584000, 2105062144, 2106515456, 2107943936, + 2109347584, 2110726272, 2112080000, 2113408768, 2114712448, 2115991168, 2117244672, 2118473216, + 2119676672, 2120854912, 2122007936, 2123135744, 2124238336, 2125315584, 2126367616, 2127394304, + 2128395520, 2129371648, 2130322048, 2131247232, 2132146944, 2133021184, 2133869824, 2134693120, + 2135490816, 2136263040, 2137009664, 2137730688, 2138426112, 2139095936, 2139740160, 2140358656, + 2140951552, 2141518720, 2142060288, 2142576128, 2143066112, 2143530496, 2143969152, 2144382080, + 2144769280, 2145130496, 2145466112, 2145775872, 2146060032, 2146318208, 2146550528, 2146757120, + 2146937984, 2147092992, 2147222016, 2147325440, 2147403008, 2147454592, 2147480448 +}; + +/* Q Factor is 31*/ +const Word32 ivas_han_win_16k_fx[L_FRAME32k] = { + 51584, 206336, 464192, 825216, 1289344, 1856512, 2526592, 3299648, 4175552, + 5154240, 6235584, 7419520, 8705856, 10094592, 11585472, 13178432, 14873280, + 16669824, 18568000, 20567552, 22668288, 24869952, 27172480, 29575488, 32078848, + 34682304, 37385600, 40188480, 43090624, 46091840, 49191808, 52390144, 55686656, + 59081024, 62572800, 66161792, 69847552, 73629824, 77508160, 81482176, 85551552, + 89715904, 93974784, 98327808, 102774528, 107314560, 111947456, 116672768, 121490048, + 126398720, 131398528, 136488832, 141669184, 146939136, 152298048, 157745600, 163281088, + 168904064, 174614016, 180410304, 186292480, 192259904, 198312000, 204448256, 210667968, + 216970688, 223355584, 229822336, 236370112, 242998400, 249706432, 256493632, 263359424, + 270303040, 277323904, 284421184, 291594368, 298842688, 306165440, 313562048, 321031552, + 328573440, 336186944, 343871360, 351625792, 359449600, 367342144, 375302528, 383329984, + 391423744, 399583168, 407807232, 416095424, 424446720, 432860480, 441335680, 449871744, + 458467776, 467122752, 475836160, 484606976, 493434496, 502317568, 511255744, 520247936, + 529293184, 538390784, 547539840, 556739456, 565988800, 575286848, 584632832, 594025792, + 603464960, 612949248, 622477568, 632049536, 641663872, 651319808, 661016192, 670752128, + 680527040, 690339584, 700189056, 710074240, 719994624, 729948800, 739936128, 749955328, + 760005760, 770086400, 780196224, 790334336, 800499328, 810690816, 820907648, 831148608, + 841412992, 851699584, 862007680, 872335936, 882683648, 893049664, 903433024, 913832832, + 924248064, 934677504, 945120256, 955575552, 966042176, 976519040, 987005248, 997499904, + 1008001792, 1018510080, 1029023552, 1039541440, 1050062528, 1060585984, 1071110720, 1081635456, + 1092159616, 1102681984, 1113201664, 1123717504, 1134228480, 1144733696, 1155232256, 1165722752, + 1176204288, 1186676224, 1197137280, 1207586432, 1218022656, 1228445184, 1238852864, 1249244416, + 1259619328, 1269976192, 1280314368, 1290632832, 1300930304, 1311205888, 1321458432, 1331687552, + 1341891840, 1352070400, 1362221952, 1372346112, 1382441472, 1392506880, 1402541952, 1412545280, + 1422516224, 1432453632, 1442356608, 1452224000, 1462054912, 1471848832, 1481604480, 1491320832, + 1500997120, 1510632320, 1520225536, 1529775744, 1539282176, 1548744192, 1558160256, 1567529728, + 1576852096, 1586125824, 1595350272, 1604524800, 1613648128, 1622719872, 1631738624, 1640703744, + 1649614592, 1658469888, 1667269376, 1676011520, 1684695808, 1693321472, 1701887616, 1710393344, + 1718837760, 1727220480, 1735540352, 1743796480, 1751988480, 1760115200, 1768175616, 1776169856, + 1784096256, 1791954688, 1799744000, 1807463424, 1815112576, 1822690048, 1830195968, 1837629184, + 1844988928, 1852274688, 1859485440, 1866620672, 1873679872, 1880662016, 1887566976, 1894393600, + 1901141248, 1907809536, 1914397696, 1920904960, 1927330816, 1933674624, 1939936000, 1946114048, + 1952208256, 1958218240, 1964142848, 1969982336, 1975735552, 1981401984, 1986981376, 1992472832, + 1997876224, 2003190656, 2008415744, 2013551360, 2018596352, 2023550720, 2028413824, 2033185152, + 2037864192, 2042450688, 2046944256, 2051344128, 2055650048, 2059861888, 2063978752, 2068000512, + 2071926784, 2075757056, 2079491072, 2083128576, 2086668928, 2090112128, 2093457408, 2096705024, + 2099854080, 2102904832, 2105856512, 2108709120, 2111462144, 2114115584, 2116668928, 2119122176, + 2121475072, 2123727104, 2125878528, 2127928576, 2129877504, 2131724800, 2133470464, 2135114496, + 2136656384, 2138096128, 2139433728, 2140668928, 2141801472, 2142831616, 2143758848, 2144583424, + 2145304960, 2145923584, 2146439168, 2146851840, 2147161344, 2147367680, 2147470848, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 +}; + +/* Q Factor is 30 */ +const Word32 ivas_sine_delay_32_fx[32] = { + 52686016, 105245104, 157550640, 209476640, 260898000, 311690784, 361732736, 410903232, 459083776, + 506158400, 552013632, 596539008, 639627264, 681174656, 721080960, 759250112, 795590272, + 830013632, 862437504, 892783744, 920979136, 946955776, 970651136, 992008064, 1010975232, + 1027506880, 1041563136, 1053110208, 1062120192, 1068571456, 1072448448, 1073741824 +}; + +/* Q Factor is 30 */ +const Word32 ivas_sine_frame_len_640_del_32_fx[577] = { + 1073737856, + 1073725888, 1073705984, 1073678144, 1073642368, 1073598592, 1073546880, 1073487168, 1073419584, + 1073343936, 1073260416, 1073168896, 1073069440, 1072962048, 1072846720, 1072723392, 1072592128, + 1072452928, 1072305792, 1072150656, 1071987648, 1071816640, 1071637696, 1071450816, 1071256000, + 1071053248, 1070842560, 1070623936, 1070397312, 1070162880, 1069920448, 1069670080, 1069411776, + 1069145536, 1068871424, 1068589376, 1068299392, 1068001472, 1067695680, 1067381952, 1067060288, + 1066730752, 1066393344, 1066047936, 1065694720, 1065333568, 1064964544, 1064587584, 1064202752, + 1063810048, 1063409472, 1063000960, 1062584576, 1062160384, 1061728256, 1061288320, 1060840448, + 1060384768, 1059921216, 1059449792, 1058970496, 1058483392, 1057988416, 1057485632, 1056974976, + 1056456512, 1055930240, 1055396096, 1054854144, 1054304384, 1053746816, 1053181440, 1052608256, + 1052027200, 1051438400, 1050841856, 1050237504, 1049625280, 1049005376, 1048377664, 1047742144, + 1047098944, 1046447936, 1045789184, 1045122624, 1044448384, 1043766400, 1043076672, 1042379200, + 1041674048, 1040961088, 1040240512, 1039512192, 1038776128, 1038032384, 1037280960, 1036521856, + 1035755008, 1034980544, 1034198464, 1033408640, 1032611200, 1031806016, 1030993280, 1030172864, + 1029344768, 1028509120, 1027665856, 1026814912, 1025956416, 1025090240, 1024216576, 1023335232, + 1022446400, 1021549888, 1020645824, 1019734208, 1018815104, 1017888384, 1016954112, 1016012288, + 1015062912, 1014106112, 1013141760, 1012169856, 1011190464, 1010203584, 1009209280, 1008207424, + 1007198144, 1006181376, 1005157120, 1004125440, 1003086336, 1002039744, 1000985792, 999924352, + 998855552, 997779328, 996695744, 995604736, 994506368, 993400640, 992287552, 991167104, + 990039296, 988904128, 987761664, 986611904, 985454784, 984290304, 983118592, 981939648, + 980753408, 979559872, 978359104, 977151040, 975935744, 974713216, 973483456, 972246528, + 971002304, 969750976, 968492480, 967226688, 965953792, 964673728, 963386496, 962092288, + 960790784, 959482176, 958166464, 956843648, 955513792, 954176832, 952832768, 951481600, + 950123456, 948758272, 947386048, 946006720, 944620480, 943227264, 941826944, 940419776, + 939005568, 937584384, 936156224, 934721152, 933279232, 931830336, 930374528, 928911808, + 927442176, 925965760, 924482432, 922992320, 921495296, 919991424, 918480832, 916963328, + 915439040, 913907968, 912370176, 910825600, 909274240, 907716160, 906151360, 904579840, + 903001664, 901416768, 899825216, 898226944, 896622016, 895010432, 893392256, 891767424, + 890136000, 888497984, 886853376, 885202176, 883544448, 881880128, 880209344, 878532032, + 876848192, 875157824, 873460992, 871757696, 870047872, 868331648, 866608960, 864879872, + 863144384, 861402496, 859654208, 857899584, 856138624, 854371264, 852597632, 850817600, + 849031296, 847238720, 845439808, 843634688, 841823296, 840005632, 838181760, 836351680, + 834515456, 832672960, 830824384, 828969600, 827108672, 825241600, 823368448, 821489152, + 819603840, 817712384, 815814912, 813911360, 812001728, 810086208, 808164608, 806237056, + 804303424, 802363904, 800418496, 798467072, 796509760, 794546560, 792577408, 790602432, + 788621568, 786634880, 784642368, 782644096, 780640000, 778630016, 776614336, 774592896, + 772565696, 770532864, 768494208, 766449856, 764399872, 762344192, 760282944, 758215936, + 756143424, 754065280, 751981504, 749892160, 747797248, 745696832, 743590848, 741479424, + 739362432, 737240000, 735112128, 732978752, 730839936, 728695744, 726546176, 724391168, + 722230784, 720065088, 717894080, 715717696, 713536000, 711349056, 709156864, 706959360, + 704756672, 702548672, 700335488, 698117184, 695893696, 693665024, 691431168, 689192192, + 686948224, 684699008, 682444864, 680185600, 677921280, 675651968, 673377536, 671098176, + 668813888, 666524608, 664230464, 661931328, 659627264, 657318400, 655004544, 652685952, + 650362432, 648034112, 645701056, 643363136, 641020480, 638673088, 636320896, 633964032, + 631602496, 629236224, 626865344, 624489792, 622109632, 619724800, 617335424, 614941504, + 612542976, 610139968, 607732352, 605320256, 602903680, 600482624, 598057152, 595627264, + 593192960, 590754240, 588311104, 585863680, 583411840, 580955712, 578495296, 576030528, + 573561536, 571088320, 568610816, 566129216, 563643264, 561153152, 558659008, 556160576, + 553658112, 551151488, 548640896, 546126144, 543607360, 541084480, 538557696, 536026848, + 533492096, 530953376, 528410656, 525864096, 523313568, 520759232, 518200960, 515638880, + 513073024, 510503328, 507929856, 505352608, 502771616, 500186880, 497598464, 495006400, + 492410624, 489811200, 487208128, 484601440, 481991200, 479377376, 476760000, 474139104, + 471514656, 468886720, 466255328, 463620448, 460982144, 458340480, 455695360, 453046880, + 450395040, 447739872, 445081408, 442419584, 439754496, 437086176, 434414624, 431739840, + 429061792, 426380672, 423696320, 421008864, 418318304, 415624576, 412927808, 410227968, + 407525120, 404819200, 402110304, 399398464, 396683616, 393965856, 391245120, 388521568, + 385795104, 383065760, 380333600, 377598592, 374860800, 372120256, 369376960, 366630848, + 363882080, 361130624, 358376480, 355619648, 352860192, 350098176, 347333536, 344566304, + 341796512, 339024192, 336249376, 333472064, 330692256, 327910016, 325125344, 322338304, + 319548832, 316756960, 313962784, 311166304, 308367488, 305566368, 302763008, 299957376, + 297149568, 294339552, 291527296, 288712928, 285896416, 283077792, 280257024, 277434208, + 274609376, 271782464, 268953568, 266122608, 263289760, 260454928, 257618144, 254779488, + 251938928, 249096480, 246252208, 243406128, 240558224, 237708512, 234857088, 232003888, + 229148976, 226292384, 223434080, 220574160, 217712592, 214849392, 211984608, 209118256, + 206250352, 203380944, 200510000, 197637584, 194763696, 191888352, 189011600, 186133440, + 183253936, 180373024, 177490800, 174607264, 171722416, 168836304, 165948944, 163060368, + 160170544, 157279584, 154387424, 151494128, 148599712, 145704176, 142807600, 139909920, + 137011232, 134111504, 131210816, 128309144, 125406504, 122502952, 119598480, 116693128, + 113786920, 110879856, 107971976, 105063288, 102153832, 99243616, 96332656, 93420992, + 90508624, 87595600, 84681920, 81767616, 78852704, 75937200, 73021144, 70104536, + 67187416, 64269804, 61351708, 58433156, 55514176, 52594776, 49674996, 46754840, + 43834344, 40913520, 37992392, 35070980, 32149316, 29227408, 26305284, 23382966, + 20460476, 17537830, 14615058, 11692176, 8769208, 5846174, 2923098, 0 +}; + + +const Word32 ivas_sine_frame_len_640_del_16_fx[289] = { + 1073725952, + 1073678400, 1073599104, 1073488064, 1073345344, 1073170880, 1072964736, 1072726912, 1072457408, 1072156160, 1071823296, + 1071458752, 1071062528, 1070634688, 1070175232, 1069684096, 1069161472, 1068607168, 1068021312, 1067403904, 1066755008, + 1066074560, 1065362624, 1064619200, 1063844352, 1063038016, 1062200320, 1061331264, 1060430848, 1059499072, 1058536000, + 1057541696, 1056516096, 1055459328, 1054371392, 1053252288, 1052102016, 1050920704, 1049708352, 1048465024, 1047190656, + 1045885376, 1044549184, 1043182208, 1041784320, 1040355712, 1038896320, 1037406272, 1035885568, 1034334272, 1032752448, + 1031140096, 1029497216, 1027824000, 1026120384, 1024386432, 1022622272, 1020827904, 1019003328, 1017148672, 1015264000, + 1013349248, 1011404608, 1009430080, 1007425792, 1005391680, 1003327872, 1001234432, 999111424, 996958848, 994776896, + 992565568, 990324864, 988054912, 985755712, 983427456, 981070144, 978683904, 976268672, 973824576, 971351808, + 968850240, 966320128, 963761408, 961174272, 958558720, 955914816, 953242752, 950542464, 947814144, 945057728, + 942273472, 939461440, 936621504, 933753984, 930858880, 927936192, 924986176, 922008896, 919004288, 915972544, + 912913664, 909827968, 906715264, 903575808, 900409728, 897217024, 893997760, 890752128, 887480128, 884181888, + 880857600, 877507328, 874131072, 870729024, 867301184, 863847744, 860368832, 856864448, 853334848, 849779968, + 846199936, 842594944, 838965120, 835310400, 831631104, 827927168, 824198848, 820446144, 816669184, 812868096, + 809043008, 805194048, 801321216, 797424768, 793504832, 789561344, 785594560, 781604608, 777591488, 773555456, + 769496640, 765414976, 761310656, 757183936, 753034880, 748863552, 744670080, 740454592, 736217216, 731958144, + 727677376, 723375232, 719051648, 714706752, 710340864, 705953920, 701546112, 697117632, 692668544, 688198976, + 683709056, 679198976, 674668864, 670118720, 665548800, 660959296, 656350208, 651721728, 647074048, 642407168, + 637721344, 633016704, 628293376, 623551488, 618791104, 614012480, 609215744, 604400960, 599568384, 594718080, + 589850176, 584964864, 580062272, 575142528, 570205824, 565252224, 560281984, 555295168, 550291904, 545272448, + 540236864, 535185280, 530117952, 525034944, 519936384, 514822496, 509693408, 504549248, 499390144, 494216384, + 489027968, 483825056, 478607904, 473376640, 468131360, 462872224, 457599424, 452313152, 447013472, 441700608, + 436374688, 431035904, 425684352, 420320224, 414943680, 409554848, 404153984, 398741152, 393316512, 387880320, + 382432576, 376973600, 371503488, 366022368, 360530464, 355027904, 349514848, 343991456, 338457920, 332914368, + 327360992, 321797952, 316225376, 310643520, 305052416, 299452352, 293843392, 288225792, 282599680, 276965152, + 271322528, 265671856, 260013344, 254347136, 248673408, 242992352, 237304096, 231608848, 225906752, 220197984, + 214482704, 208761088, 203033328, 197299552, 191559952, 185814672, 180063936, 174307856, 168546624, 162780432, + 157009424, 151233776, 145453648, 139669232, 133880696, 128088216, 122291928, 116492040, 110688704, 104882096, + 99072408, 93259768, 87444384, 81626424, 75806048, 69983424, 64158744, 58332160, 52503856, 46674000, + 40842768, 35010324, 29176854, 23342516, 17507490, 11671948, 5836060, 0 +}; + +/************************ Q30 *******************************/ +const Word32 ivas_fb_fr_12band_1ms_re_fx[IVAS_FB_12_1MS_LEN] = { + 1046768256, 1012312512, 944113536, 843565952, 712700800, 554033920, 370399360, 163534048, -67588040, + -313003296, -547361792, -745791424, -889130944, -964720960, -967822016, -901839040, -777730304, + -612432896, -426573984, -241764928, -77701744, 50405768, 134107528, 173698992, 183571312, + 181978912, 174963648, 163434880, 148881184, 132470640, 115304208, 98219512, 81912736, + 66862960, 53409868, 41724844, 31871182, 23797162, 17385436, 12455156, 8801240, + 6197829, 4427144, 3280128, 2575327, 2155348, 1897329, 1705752, 1516863, + 1289431, 1005694, 661856, 267796, -161263, -604780, -1043282, -1457411, + -1832285, -2155534, -2420027, -2621275, -2759126, -2835035, -2853297, -2818571, + -2737039, -2614376, -2456980, -2270381, -2060530, -1832512, -1591794, -1343094, + -1091494, -841376, -597362, -363290, -143021, 60510, 244561, 407408, + 547618, 664738, 758550, 829643, 878668, 906840, 915250, 905346, + 878343, 835721, 778738, 708948, 627794, 537107, 438729, 334948, + 228103, 120925, 16090, -83524, -175327, -256811, -326026, -381381, + -422046, -447703, -458837, -456405, -442013, -417522, -385138, -347000, + -305255, -261681, -217812, -174648, -132866, -92642, -53935, -16402, + 20279, 56463, 92235, 127494, 161728, 194173, 223691, 249012, + 268700, 281445, 286068, 281804, 268278, 245720, 214858, 177029, + 133974, 87839, 40901, -4492, -46220, -82436, -111817, -133546, + -147456, -153913, -153846, -148528, -139528, -128444, -116827, -105934, + -96699, -89563, -84536, -81138, -78561, -75704, -71400, -64501, + -54108, -39627, -20946, 1593, 27122, 54374, 81719, 107372, + 129497, 146446, 156855, 159848, 155068, 142780, 123803, 99496, + 71589, 42078, 8610925, 16407290, 31915518, 54983844, 85416624, 123087880, + 168063984, 221958576, 289536032, 364878560, 426914240, 455184448, 434995104, 358099712, + 224036640, 40240900, -178615296, -412308800, -637390400, -829991424, -968687232, -1037118016, + -1026013056, -934381184, -769721024, -547208704, -287987072, -16727445, 241188016, 462583776, + 629070144, 729071296, 758930560, 723116864, 633312128, 506752128, 363680000, 224696192, + 107612800, 25033840, -24212064, -54589336, -75035176, -87485160, -93580896, -94591848, + -91737704, -86038536, -78437624, -69711224, -60533488, -51423856, -42794000, -34920752, + -27987240, -22072318, -17188296, -13279352, -10254646, -7989723, -6353249, -5207335, + -4426934, -3897128, -3525509, -3236283, -2977071, -2710878, -2419337, -2094076, + -1738366, -1359253, -969076, -579170, -201992, 153445, 478767, 769398, + 1021418, 1233894, 1405828, 1538184, 1631253, 1686663, 1705249, 1689093, + 1639776, 1560317, 1453594, 1324024, 1175972, 1015086, 846649, 676618, + 509991, 351706, 205173, 73207, -43142, -143513, -229073, -301290, + -362531, -414799, -460247, -500043, -534968, -564551, -587849, -602888, + -607619, -599579, -576918, -538114, -482894, -411845, -327078, -231622, + -129783, -26319, 73437, 164513, 242258, 303205, 344935, 366711, + 369107, 354325, 325569, 287088, 243371, 199057, 158131, 123882, + 98274, 82114, 74715, 74333, 78122, 82791, 84734, 80757, + 68210, 45592, 12513, -29958, -79606, -133015, -186134, -234445, + -273650, -299897, -310406, -303565, -279332, -239075, -185665, -123028, + -55984, 10396, 12276729, 12693837, 13547048, 14871155, 16707203, 19094012, + 22050984, 25567530, 29581572, 33971516, 38534384, 42985632, 46940136, 49924776, + 51363228, 50604824, 46909464, 39493740, 27503144, 10070768, -13759776, -44999620, + -84980336, -136135984, -207135712, -303422240, -412817600, -514972896, -589851392, -619651584, + -591583168, -499579936, -345470464, -138966128, 103208400, 359174656, 604351488, 814326528, + 967700992, 1048627328, 1048680832, 967863296, 814603776, 604752128, 359708672, 103884792, + -138140928, -344495008, -498458752, -590328384, -618282624, -588395136, -513462144, -411289888, + -301917376, -205694144, -134796400, -83778624, -43967052, -12923312, 10688964, 27884292, + 39622020, 46770036, 50183460, 50644772, 48893804, 45580600, 41282912, 36475948, + 31549672, 26793770, 22418028, 18548592, 15250408, 12530037, 10357491, 8671122, + 7396225, 6448686, 5748701, 5221465, 4805724, 4451326, 4123487, 3798131, + 3463431, 3114322, 2752946, 2383612, 2013354, 1648090, 1293873, 954378, + 632818, 330406, 48532, -212349, -450755, -665332, -853410, -1012414, + -1138953, -1230412, -1284349, -1300013, -1277722, -1220043, -1130902, -1016282, + -883017, -739061, -592113, -449695, -317863, -201395, -102837, -23014, + 39453, 87271, 124545, 155673, 185224, 216854, 253275, 295449, + 342868, 393176, 442827, 487113, 521090, 539819, 539332, 516817, + 471355, 403816, 317194, 216106, 106711, -4112, -109126, -201659, + -275976, -328059, -355725, -359045, -340068, -302808, -252589, -195699, + -138533, -87141, -46428, -19866, -8984, -13439, -30918, -57611, + -88487, -118040, -140755, -151891, -147872, -126858, -88834, -35798, + 28549, 99021, 169585, 233841, 285797, 320360, 333987, 324942, + 293611, 242374, 175498, 98630, 18357, -58534, -125609, -177509, + -210361, -222240, -213241, -185532, -143021, -91031, -35654, 16794, + 60506, 90695, 104157, 99518, 77443, 40482, -7123, -59963, + -111945, -157005, -189668, -205697, -202469, -179335, -137639, -80671, + -13290, 58484, 128123, 189173, 235954, 264066, 270883, 255765, + 220174, 2505037, 2442157, 2316154, 2126672, 1874467, 1561489, 1192761, + 775600, 321304, -157412, -645618, -1131069, -1604363, -2065994, -2526609, + -3015154, -3577470, -4283816, -5223516, -6510031, -8269471, -10642073, -13763168, + -17761360, -22731886, -28733746, -35756756, -43722016, -52444716, -61644104, -70903304, + -79696304, -87342288, -93058336, -95895816, -94830640, -88641344, -76058616, -55443336, + -24863958, 24611116, 107440320, 224788944, 364047616, 507399776, 634242176, 724330048, + 760427264, 730852288, 631136576, 464936832, 243827808, -13803173, -284784032, -543737088, + -765995008, -930417472, -1021827456, -1032720576, -964074624, -825139200, -632243584, -406773696, + -172552176, 47020828, 231770176, 367063072, 445488224, 467504928, 441322720, 381553248, + 308519520, 243096544, 190940560, 146958368, 109144704, 76984176, 50110068, 28195132, + 10859917, -2331860, -11867127, -18267046, -22063578, -23780578, -23911906, -22907786, + -21160858, -19000796, -16689673, -14424574, -12340740, -10519832, -8997765, -7775391, + -6827615, -6113435, -5583605, -5187945, -4880011, -4620898, -4380691, -4139162, + -3884798, -3613535, -3326639, -3028821, -2726195, -2424818, -2129499, -1843272, + -1567228, -1300854, -1042591, -790584, -543428, -300799, -63891, 164435, + 379755, 576491, 748467, 889663, 994911, 1060624, 1085268, 1069727, + 1017300, 933554, 825817, 702603, 572797, 444929, 326372, 222801, + 137707, 72284, 25430, -5886, -26190, -40792, -55143, -74076, + -101256, -138661, -186386, -242548, -303550, -364410, -419384, -462555, + -488576, -493231, -474014, -430404, -364059, -278663, -179684, -73826, + 31531, 129079, 212203, 275656, 315980, 331857, 324141, 295780, + 251424, 196978, 138929, 83734, 37113, 3535, -14258, -15450, + -1229, 25423, 60045, 97246, 131265, 156654, 168829, 164631, + 142633, 103366, 49247, -15601, -85794, -155177, -217478, -266899, + -298743, -309847, -298949, -266783, -216054, -151145, -77727, -2174, + 69017, 702811, 654136, 559557, 424419, 255932, 62727, -146313, + -362395, -578054, -786994, -985086, -1169469, -1339221, -1493760, -1633415, + -1757450, -1864970, -1953010, -2018235, -2055396, -2060043, -2027296, -1955369, + -1844129, -1698799, -1527422, -1343910, -1163448, -1004247, -880298, -801810, + -765486, -754582, -727814, -620985, -336399, 251272, 1302991, 3002489, + 5560181, 9191239, 14115464, 20525480, 28584940, 38387408, 49958096, 63204572, + 77930464, 93777392, 110263472, 126708904, 142322784, 156083648, 166946144, 173586320, + 175308576, 166325584, 128680304, 48303544, -74757040, -231715952, -407042976, -580775616, + -731094848, -837272320, -882366976, -855569984, -753729472, -582012992, -353498368, -87845872, + 190881904, 456905760, 685667520, 856595200, 955419584, 975703808, 919454400, 796692096, + 624085824, 422776032, 215700912, 24714716, -132116288, -242736960, -302620672, -315365760, + -293500640, -258619744, -225315280, -194015376, -163910608, -135501680, -109209736, -85466480, + -64529184, -46551644, -31533836, -19377918, -9878438, -2769905, 2268515, 5573895, + 7492172, 8348992, 8445734, 8040905, 7351921, 6546074, 5747758, 5036624, + 4458304, 4026662, 3735443, 3561663, 3475902, 3444629, 3437763, 3428836, + 3399492, 3337488, 3238697, 3103696, 2938339, 2749967, 2547660, 2338971, + 2130630, 1926285, 1727949, 1534741, 1344902, 1155176, 962956, 765794, + 563232, 356016, 147339, -58398, -254956, -435840, -594040, -723684, + -819800, -879714, -902536, -890086, -845966, -775986, -686897, -586473, + -482133, -380953, -288451, -208799, -143979, -94350, -58234, -32830, + -14133, 1978, 19701, 42276, 72069, 109808, 154947, 205272, + 257581, 307614, 350943, 383061, 400284, 399785, 380309, 341971, + 286657, 217523, 139066, 56385, -24953, -99742, -163283, -212106, + -243951, -258230, -255733, -167174, -239722, -322173, -408810, -492821, + -566516, -622391, -653378, -653921, -619965, -549788, -443508, -303565, + -133727, 60691, 274135, 500595, 734943, 972407, 1209697, 1443978, + 1673718, 1897211, 2113333, 2319888, 2514652, 2693915, 2854207, 2991285, + 3102696, 3187122, 3247515, 3290252, 3328147, 3378477, 3464934, 3613501, + 3852565, 4205968, 4691138, 5309438, 6043184, 6844465, 7633047, 8285794, + 8638327, 8477588, 7550391, 5561188, 2190063, -2903797, -10053462, -19577218, + -31739716, -46747292, -64700276, -85602512, -109304912, -135555296, -163926944, -194002976, + -225285872, -258586768, -293477632, -315364832, -302650912, -242803328, -132218944, 24580560, + 215544720, 422611008, 623927680, 796557504, 919359168, 975661312, 955439360, 856681664, + 685819520, 457116384, 191139072, -87558504, -353200000, -581723904, -753469440, -855356160, + -882212736, -837186048, -731079168, -580827520, -407153984, -231873488, -74945544, 48100840, + 128479736, 166141328, 175151264, 173462112, 166856272, 156024384, 142286160, 126683672, + 110236760, 93736176, 77863432, 63103528, 49819328, 38212324, 28380444, 20303444, + 13891988, 8985083, 5391207, 2889572, 1262319, 294475, -203348, -398749, + -423662, -382151, -343523, -352875, -428668, -574135, -776792, -1018896, + -1276918, -1529859, -1757571, -1946540, -2086827, -2175642, -2213314, -2205436, + -2158564, -2081784, -1982822, -1869689, -1747600, -1621008, -1491391, -1359644, + -1224514, -1085096, -939557, -787433, -628324, -463767, -295726, -127991, + 35529, 189782, 330335, 452518, 553054, 629169, 679950, 705285, + 706896, 687113, 649626, 598183, 537192, 470470, 401849, 334088, + 269582, 209498, 154619, 104683, 59308, 17469, -21588, -58843, + -94673, -129406, -162639, -193876, -221997, -245959, -264363, -276167, + -280285, -276237, -263718, -243144, -215155, -181048, -225261, -273555, + -307889, -326103, -327476, -312684, -283609, -243038, -194256, -140631, + -85182, -30244, 22798, 73608, 122885, 172169, 223570, 279366, + 341593, 411622, 489814, 575248, 665622, 757256, 845294, 923987, + 987121, 1028456, 1042203, 1023430, 968397, 874758, 741642, 569587, + 360379, 116796, -157659, -459031, -783110, -1125546, -1481872, -1847416, + -2217186, -2585716, -2947037, -3294742, -3622346, -3923849, -4194709, -4432970, + -4640760, -4825675, -5002266, -5192922, -5428408, -5747161, -6193793, -6815752, + -7658969, -8761350, -10145511, -11809549, -13717971, -15791409, -17898084, -19845242, + -21374384, -22157722, -21800466, -19845174, -15783279, -9068449, 863064, 14571969, + 32592328, 55410852, 83458416, 117107272, 156758688, 202942128, 257651808, 325933440, + 402044000, 464971200, 494205696, 474891008, 398522784, 264288720, 79206760, -142533824, + -381224512, -613975168, -817483264, -970950784, -1058690624, -1072345920, -1012679872, -893613760, + -734287744, -546547584, -339769856, -124623176, 88170360, 288225568, 466194112, 614172160, + 726163904, 798321728, 829131584, 819397568, 772133120, 692285376, 586377152, 462039040, + 327503712, 191064064, 60554008, -57130884, -156432848, -233429280, -286014272, -313941504, + -318749984, -303544416, -272698496, -231426688, -185371904, -140057616, -100631488, -69996648, + -46622364, -28166424, -13810469, -2980571, 4834391, 10133794, 13384151, 15027667, + 15460742, 15036408, 14051635, 12751812, 11326396, 9916592, 8616869, 7484565, + 6544389, 5798046, 5229236, 4811721, 4513168, 4300801, 4143382, 4014381, + 3892172, 3761242, 3611156, 3436579, 3235728, 3009947, 2762235, 2496885, + 2218419, 1931526, 1640448, 1349202, 1061301, 780105, 508675, 250099, + 7326, -216639, -418984, -597023, -748502, -871609, -965247, -1029025, + -1063439, -1069768, -1050128, -1007269, -944511, -865478, -773983, -673761, + -568371, -460991, -354385, -250799, -152007, -59299, 26411, 104546, + 174730, 236744, 290418, 335608, 372145, 399853, 418548, 428095, + 428430, 419636, 401963, 375881, 342083, 301499, 255265, 204699, + 151239, 96397, 41685, -11436, -61625, -107696, -148661, -183744, + -212399, -234301, -249338, -257586, -259295, -171383, -167771, -160946, + -151648, -140875, -129741, -119346, -110602, -104127, -100108, -98276, + -97857, -97667, -96155, -91604, -82246, -66504, -43110, -11334, + 28976, 77253, 132282, 192171, 254555, 316653, 375561, 428343, + 472340, 505222, 525246, 531204, 522588, 499415, 462302, 412189, + 350367, 278167, 197008, 108113, 12645, -88501, -194453, -304491, + -417705, -533098, -649202, -764225, -875703, -980757, -1075829, -1157086, + -1220253, -1261142, -1275529, -1259757, -1210576, -1125738, -1003720, -844248, + -647867, -416383, -152288, 140834, 458975, 797247, 1150575, 1513140, + 1879071, 2241774, 2594688, 2930577, 3242477, 3523085, 3766061, 3965621, + 4118279, 4222622, 4281408, 4301274, 4294860, 4279931, 4280984, 4327080, + 4452293, 4691546, 5079427, 5643594, 6401946, 7353690, 8475606, 9711576, + 10969534, 12110916, 12950640, 13248182, 12713298, 10999818, 7719470, 2437137, + -5306709, -16007364, -30173754, -48382488, -71457888, -101754088, -140816912, -185763344, + -231466336, -272424224, -303010560, -318021792, -313081312, -285067456, -232401024, -155266144, + -55676148, 62564504, 194048000, 332049728, 468930560, 596597632, 707022848, 792757376, + 847434880, 866203136, 846081856, 786193920, 687883392, 554677120, 392130080, 207514704, + 9432382, -192707744, -389200480, -570675136, -728479808, -856350656, -952308800, -1015864832, + -1046220032, -1043342848, -1008126784, -942413952, -848923648, -731177152, -593366784, -440223744, + -276851936, -108565096, 59292484, 221513920, 373199296, 509904800, 627780928, 723682304, + 795257728, 841006144, 860308096, 853421632, 821452480, 766292160, 690533568, 597361024, + 490425248, 373702496, 251347920, 127544600, 6357648, -108405296, -213318272, -305445280, + -382425728, -442537280, -484731648, -508645408, -514583008, -503476768, -476822816, -436599136, + -385166592, -325160416, -259373680, -190640560, -121721768, -55198692, 6621388, 61783672, + 108746912, 146423216, 174197536, 191924704, 199906864, 198850976, 189810704, 174114128, + 153282784, 128943984, 102742896, 76256368, 50914548, 27932052, 8253544, -7485707, + -18981258, -26263536, -29686804, -29902128, -27874808, -24904632, -21873452, -18924710, + -16109369, -13513449, -11193274, -9184409, -7497119, -6124396, -5043505, -4222392, + -3622104, -3201531, -2919256, -2736657, -2618792, -2536063, -2464195, -2384826, + -2284834, -2156265, -1995319, -1801974, -1578908, -1331064, -1064692, -787000, + -505396, -227288, 40476, 291657, 521006, 724191, 898044, 1040397, + 1150221, 1227397, 1272778, 1287922, 1275099, 1237007, 1176756, 1097593, + 1002895, 895923, 779853, 657586, 531818, 404912, 279016, 155978, + 37491, -74965, -179989, -276315, -362698, -438012, -501167, -551237, + -587418, -609171, -616196, -608571, -586708, -551466, -504065, -446144, + -379632, -306754, -229859, -151391, -73706, 962, 70672, 133776, + 189046, 235630, 273114, 301432, 320873, 331952, 335393, 331988, + 322579, 307941, 288792, 265710, 239189, 209598, 177267, 142480, + 105576, 66945, 27114, -13271, -53400, -92348, -129065, -162474, + -191486, -215114, -232503, -243037, -246348, -242394, -231432, -214048, + -191082, -163619, -132881, -100182, -66814, -34004, -2809, 25897, + 51498, 73603, 92073, 106961, 118497, 127000, 132851, 136409, + 137987, 137791, 135930, 132384, 127051, 119749, 110286, 98485, + 84255, 67615, 48748, 27996, 5888, -16902, -39568, -61243, + -81031, -98099, -111715, -121326, -162998, -160088, -154357, -145969, + -135159, -122211, -107436, -91156, -73678, -55283, -36214, -16667, + 3198, 23260, 43411, 63547, 83543, 103238, 122414, 140790, + 158012, 173664, 187268, 198317, 206286, 210673, 211020, 206956, + 198214, 184663, 166317, 143347, 116078, 84982, 50655, 13802, + -24798, -64311, -103888, -142674, -179845, -214613, -246243, -274051, + -297418, -315773, -328608, -335464, -335942, -329700, -316476, -296086, + -268464, -233660, -191884, -143511, -89112, -29451, 34490, 101547, + 170354, 239401, 307043, 371566, 431212, 484258, 529040, 564034, + 587875, 599425, 597777, 582315, 552693, 508884, 451144, 380049, + 296447, 201490, 96577, -16612, -136189, -260017, -385787, -510997, + -633031, -749140, -856549, -952436, -1034059, -1098739, -1143998, -1167540, + -1167397, -1141901, -1089827, -1010351, -903194, -768558, -607272, -420711, + -210944, 19368, 266825, 527423, 796421, 1068545, 1337896, 1598264, + 1843121, 2066095, 2261075, 2422874, 2547443, 2632705, 2678810, 2689041, + 2669949, 2632165, 2590157, 2562709, 2571986, 2643435, 2803848, 3080521, + 3498078, 4076931, 4828788, 5754789, 6839761, 8050914, 9330877, 10598671, + 11740823, 12618964, 13055458, 12877144, 11632705, 8232321, 1712792, -8269488, + -21676128, -38124492, -56918448, -77081536, -97412152, -116545320, -133029752, -145407808, + -152301808, -152496656, -145019616, -129208872, -104771344, -71822984, -30912372, 16976826, + 70442824, 127704136, 186656480, 244947920, 300068000, 349448640, 390571840, 421080480, + 438886880, 442275104, 429992032, 401322976, 356148672, 294980192, 218969888, 129897104, + 30128484, -77446248, -189501472, -302382688, -412230048, -515113984, -607177664, -684781632, + -744644480, -783974400, -800586304, -792999936, -760514496, -703256576, -622199232, -519150624, + -396712160, -258207056, -107581408, 50718884, 211891600, 370936768, 522825024, 662669440, + 785895232, 888400000, 966700096, 1018056320, 1040574720, 1033278976, 996150976, 930138240, + 837128128, 719891072, 581993344, 427717504, 261968336, 89712808, -84335696, -255470448, + -419050304, -570668224, -706270592, -822273344, -915657792, -984053440, -1025798848, -1039984064, + -1026470080, -985886720, -919608064, -829707328, -718891392, -590417984, -447997504, -295682944, + -137750720, 21423548, 177490944, 326252736, 463778272, 586513216, 691375872, 775837824, + 837987456, 876574784, 891035520, 881494912, 848751424, 794240448, 719980032, 628500544, + 522760032, 406049152, 281887712, 153916800, 25789502, -98936256, -216899504, -325029824, + -420629824, -501444512, -565715328, -612217792, -640282304, -649796800, -641192896, -615415808, + -573878848, -518405728, -451161088, -374573216, -291251040, -203897664, -115224504, -27867474, + 55691216, 133193880, 202668432, 262478208, 311359200, 348444032, 373271968, 385785760, + 386315040, 375548096, 354492672, 324428128, 286850336, 243411744, 195858832, 145969024, + 95489384, 46079124, -742270, -43639588, -81497992, -113449472, -138889424, -157482720, + -169159888, -174103616, -172726688, -165642240, -153628176, -137586864, -118502264, -97395800, + -75283368, -53134364, -31835154, -12157406, 5266631, 19962188, 31621642, 40107016, + 45443876, 47808948, 47510056, 44961972, 40656428, 35131248, 28935710, 22599292, + 16597725, 11327856, 7077267, 4007588, 2004813, 698472, -159366, -668117, + -915026, -972592, -904574, -762742, -589613, -417127, -268777, -159451, + -97435, -84877, -119630, -195920, -305911, -440293, -589480, -743976, + -895177, -1035483, -1158746, -1260167, -1336478, -1385695, -1407139, -1401122, + -1368900, -1312362, -1233971, -1136502, -1023004, -896600, -760484, -617774, + -471538, -324684, -179997, -40056, 92731, 216208, 328430, 427747, + 512770, 582446, 636028, 673130, 693701, 698053, 686825, 660989, + 621793, 570758, 509593, 440184, 364504, 284586, 202444, 120043, + 39232, -38277, -110964, -177497, -236776, -287918, -330276, -363413, + -387116, -401358, -406302, -402269, -389735, -369301, -341693, -307732, + -268335, -224488, -177248, -127707, -76997, -26251, 23403, 70879, + 115146, 155262, 190393, 219846, 243073, 259708, 269557, 272617, + 269062, 259245, 243667, 222969, 197896, 169274, 137970, 104873, + 70854, 36751, 3337, -28682, -58696, -86176, -110690, -131889, + -149514, -163373, -173350, -179385, -181478, -179682, -174108, -164916, + -152331, -136632, -118169, -97351, -74653, -50603, -25781, -795, + 23721, 47148, 68883, 88374, 105138, 118782, 129014, 135661, + 138666, 138092, 134111, 126995, -72761, -56245, -38209, -19019, + 926, 21206, 41377, 60995, 79616, 96811, 112175, 125335, + 135964, 143783, 148571, 150171, 148491, 143510, 135276, 123908, + 109592, 92580, 73182, 51764, 28741, 4570, -20258, -45231, + -69817, -93477, -115679, -135902, -153653, -168473, -179953, -187739, + -191549, -191176, -186499, -177490, -164220, -146855, -125663, -101009, + -73349, -43220, -11236, 21933, 55569, 88924, 121238, 151753, + 179734, 204484, 225359, 241786, 253272, 259417, 259926, 254614, + 243416, 226386, 203704, 175675, 142727, 105408, 64381, 20414, + -25629, -72803, -120096, -166448, -210776, -251991, -289028, -320870, + -346577, -365309, -376354, -379149, -373302, -358603, -335043, -302817, + -262324, -214167, -159142, -98227, -32564, 36563, 107751, 179503, + 250256, 318414, 382371, 440551, 491426, 533563, 565640, 586488, + 595111, 590727, 572783, 540991, 495337, 436112, 363911, 279647, + 184541, 80117, -31824, -149225, -269813, -391137, -510624, -625621, + -733459, -831498, -917191, -988123, -1042078, -1077064, -1091376, -1083624, + -1052786, -998241, -919828, -817879, -693286, -547530, -382754, -201766, + -8088, 194084, 399903, 603998, 800600, 983813, 1147877, 1287596, + 1398749, 1478666, 1526731, 1545029, 1538843, 1517225, 1493308, 1484620, + 1512997, 1604428, 1788384, 2097022, 2563860, 3222329, 4104042, 5237042, + 6645377, 8348986, 10388584, 12857124, 15616492, 18195220, 20086854, 20833852, + 20030730, 17354698, 12586763, 5632648, -3464912, -14518786, -27198686, -41038776, + -55453300, -69758216, -83199240, -94984200, -104319184, -110446312, -112682200, -110454752, + -103337336, -91078120, -73623784, -51135812, -23998892, 7179643, 41579336, 78185368, + 115815920, 153157712, 188808416, 221324672, 249274288, 271290496, 286126560, 292708608, + 290184736, 277968256, 255773584, 223642784, 181961872, 131465504, 73229656, 8652162, + -60578956, -132528392, -205066832, -275933056, -342803008, -403363968, -455390976, -496823520, + -525839776, -540925440, -540935296, -525144960, -493290304, -445593920, -382776288, -306051584, + -217107424, -118068792, -11447024, 99925072, 212970192, 324453472, 431076864, 529578144, + 616831424, 689946368, 746362368, 783935232, 801012800, 796497984, 769895232, 721340928, + 651613760, 562127360, 454901984, 332518336, 198053008, 54997860, -92834592, -241417152, + -386622272, -524341152, -650604416, -761700160, -854286656, -925495040, -973019712, -995193152, + -991042688, -960327360, -903553472, -821968256, -717531648, -592866496, -451188992, -296220608, + -132085040, 36808156, 205888512, 370555840, 526312064, 668891968, 794386240, 899356480, + 980934400, 1036909248, 1065792000, 1066936320, 1040546496, 987467136, 909149824, 807691200, + 685777408, 546616256, 393851264, 231466848, 63682176, -105158952, -270702912, -428699744, + -575114688, -706232704, -818754752, -909882496, -977389312, -1019675904, -1035808896, -1025541568, + -989316224, -928248256, -844092096, -739190912, -616410240, -479058656, -330797152, -175539264, + -17346022, 139682832, 291517408, 434303488, 564462720, 678784448, 774506688, 849384640, + 901743936, 930519040, 935273728, 916205312, 874131520, 810461056, 727147968, 626633152, + 511772224, 385754272, 252012128, 114127448, -24266644, -159583088, -288375648, -407428352, + -513837376, -605083264, -679091392, -734279488, -769591104, -784513984, -779083840, -753872640, + -709962816, -648908288, -572682880, -483618976, -384336832, -277668320, -166575776, -54069264, + 56875640, 163397472, 262823600, 352738016, 431040544, 495996064, 546272512, 580966656, + 599617664, 602207872, 589151552, 561271552, 519765696, 466163232, 402273376, 330127520, + 251916672, 169926224, 86470040, 3825426, -75828792, -150469632, -218281248, -277698720, + -327443424, -366549120, -394378400, -410629056, -415330784, -408832544, -391780864, -365090688, + -329909184, -287574176, -239568528, -187472016, -132911848, -77513936, -22855780, 29577298, + 78431608, 122519032, 160844800, 192628240, 217316432, 234590304, 244363440, 246773968, + 242169824, 231088240, 214230352, 192431808, 166630544, 137832768, 107078304, 75406624, + 43824304, 13275079, -15386599, -41417940, -64205456, -83277544, -98311776, -109136888, + -115729656, -118206952, -116813448, -111905648, -103932808, -93415768, -80924248, -67053716, + -52402552, -37550280, -23037704, -9349536, 3099972, 13977919, 23039974, 30133750, + 35198404, 38260568, 39427008, 38874332, 36836352, 33589632, 29437968, 24696382, + 19675442, 14666438, 9928193, 5675861, 2072344, -777524, -2829749, -4100893, + -4665396, -4650187, -4237832, -3670417, -3111787, -2588999, -2111154, -1692910, + -1342761, -1064792, -858034, -718046, -637371, -606817, -616039, -654489, + -711863, -778707, -846654, -908726, -959364, -994500, -1011439, -1008780, + -986218, -944402, -884714, -809115, -719958, -619860, -511553, -397807, + -281326, -164706, -50372, 59439, 162717, 257679, 342798, 416803, + 478690, 527728, 563468, 585733, 594629, 590529, 574063, 546100, + 507723, 460200, 404950, 343501, 277458, 208453, 138112, 68013, + -346, -65582, -126442, -181831, -230824, -272671, -306807, -332846, + -350584, -359987, -361185, -354465, -340256, -319119, -291736, -258891, + -221458, -180384, -136669, -91350, -45474, -81, 43821, 85280, + 123419, 157461, 186741, 210730, 229036, 241421, 247797, 248224, + 242908, 232183, 216503, 196419, 172565, 145631, 116349, 85467, + 53736, 21886, -9380, -39409, -67596, -93402, -116356, -136059, + -152188, -164499, -172828, -177091, -177288, -173497, -165880, -154675, + -140195, -122823, -103005, -81242, -58073, -34073, -9827, 14076, + 37067, 58607, 78202, 95423, 109908, 121382, 129651, 134613, + 136254, 134645, 129937, 122348, -44011, -24892, -4829, 15720, + 36281, 56369, 75506, 93227, 109092, 122701, 133696, 141775, + 146697, 148290, 146451, 141157, 132459, 120486, 105445, 87616, + 67345, 45046, 21187, -3718, -29118, -54435, -79078, -102456, + -123992, -143137, -159380, -172271, -181421, -186524, -187359, -183802, + -175830, -163523, -147066, -126746, -102945, -76138, -46876, -15782, + 16466, 49153, 81535, 112860, 142385, 169387, 193186, 213156, + 228742, 239468, 244958, 244937, 239247, 227851, 210839, 188425, + 160956, 128901, 92851, 53506, 11664, -31790, -75908, -119691, + -162116, -202159, -238815, -271127, -298207, -319262, -333613, -340713, + -340163, -331730, -315348, -291129, -259362, -220512, -175214, -124263, + -68599, -9299, 52451, 115372, 178114, 239282, 297468, 351266, + 399319, 440334, 473120, 496614, 509913, 512295, 503248, 482484, + 449964, 405893, 350744, 285237, 210350, 127286, 37477, -57465, + -155750, -255468, -354592, -451046, -542708, -627478, -703289, -768173, + -820272, -857921, -879657, -884318, -871054, -839446, -789522, -721878, + -637689, -538829, -427837, -308012, -183306, -58351, 61766, 171575, + 265595, 338530, 385818, 403920, 391045, 347469, 276387, 184146, + 81162, -18121, -94264, -123407, -76036, 81568, 389991, 895519, + 1710701, 3002792, 4825273, 7109226, 9729646, 12512602, 15248433, 17702624, + 19630608, 20791430, 20963006, 19955790, 17626208, 13887624, 8719623, 2174045, + -5621665, -14464834, -24081046, -34131360, -44222504, -53920252, -62765096, -70290080, + -76039792, -79590136, -80567832, -78669104, -73676656, -65474260, -54058260, -39545472, + -22176940, -2317326, 19550376, 42834668, 66849928, 90834856, 113974736, 135426640, + 154347008, 169920736, 181390720, 188086896, 189453888, 185076096, 174699280, 158247904, + 135837376, 107780464, 74587640, 36960972, -4218522, -47909872, -92937136, -138019856, + -181808096, -222921312, -259989808, -291697568, -316825344, -334292320, -343195264, -342844000, + -332791264, -312856704, -283143456, -244046832, -196254272, -140736784, -78731208, -11714102, + 58632672, 130463552, 201817312, 270670080, 334992000, 392806176, 442247552, 481620896, + 509455360, 524554208, 526038368, 513381696, 486437344, 445453888, 391080448, 324360480, + 246714016, 159908576, 66019492, -32619810, -133476120, -233882016, -331106848, -422431424, + -505224224, -577016896, -635577152, -678976448, -705651136, -714454400, -704697856, -676181184, + -629208640, -564592384, -483640672, -388133216, -280282016, -162679760, -38236756, 89892360, + 218389968, 343862752, 462932736, 572329472, 668980864, 750100160, 813266368, 856496128, + 878304640, 877753856, 854486592, 808744960, 741372928, 653802560, 548023872, 426538944, + 292301664, 148644560, -806035, -152223392, -301680672, -445254848, -579131904, -699710144, + -803698816, -888209216, -950836352, -989727616, -1003637824, -991967616, -954785856, -892832832, + -807506624, -700830848, -575405568, -434342368, -281185056, -119818392, 45633172, 210913568, + 371747552, 523954144, 663558144, 786896576, 890717440, 972267648, 1029367616, 1060471360, + 1064709056, 1041912064, 992618752, 918061696, 820136128, 701350912, 564763136, 413905312, + 252702016, 85283768, -84153016, -251373152, -412193952, -562598208, -698834304, -817510976, + -915681728, -990918592, -1041372160, -1065817344, -1063683392, -1035067008, -980729024, -902074176, + -801114432, -680417408, -543040576, -392453440, -232449024, -67047936, 99603672, 263338768, + 420074528, 565914944, 697248640, 810838912, 903904448, 974187712, 1020010432, 1040314112, + 1034684224, 1003358720, 947219392, 867767552, 767083328, 647771264, 512892224, 365884480, + 210475200, 50585176, -109770824, -266585856, -415961728, -554206912, -677928256, -784115520, + -870214784, -934190464, -974573952, -990497408, -981711808, -948590080, -892113472, -813843264, + -715877760, -600795712, -471588352, -331581056, -184347104, -33615956, 116822016, 263211632, + 401927360, 529563904, 643020416, 739576448, 816957632, 873389632, 907638720, 919038784, + 907503104, 873521728, 818144448, 742948992, 649996672, 541776128, 421136352, 291211584, + 155339280, 16974000, -120401088, -253362480, -378632256, -493159552, -594195200, -679358336, + -746692608, -794711040, -822428992, -829383232, -815638016, -781777600, -728885632, -658512064, + -572628224, -473572352, -363985824, -246742688, -124873992, -1489180, 120303760, 237476976, + 347158464, 446702912, 533755744, 606308928, 662747520, 701884928, 722987456, 725786624, + 710479424, 677716736, 628580224, 564548800, 487455296, 399434400, 302864160, 200301680, + 94415504, -12084029, -116514408, -216288720, -308979968, -392380352, -464553824, -523880992, + -569095168, -599308544, -614028672, -613164032, -597019520, -566281600, -521994336, -465525920, + -398528192, -322889120, -240680240, -154100192, -65416176, 23095468, 109207648, 190798608, + 265904304, 332765472, 389868896, 435980928, 470173824, 491842976, 500715808, 496851904, + 480634304, 452752704, 414179264, 366137088, 310063456, 247567808, 180386464, 110334864, + 39258892, -31013516, -98719224, -162203968, -219962560, -270674336, -313232768, -346769088, + -370668672, -384580928, -388421408, -382367424, -366846528, -342518912, -310254080, -271102432, + -226263200, -177048848, -124847760, -71085712, -17187518, 35460372, 85545152, 131860032, + 173332944, 209050736, 238278608, 260474080, 275295552, 282605088, 282465888, 275134240, + 261046656, 240802480, 215142736, 184925744, 151100368, 114677616, 76701576, 38220244, + 257309, -36214540, -70298016, -101192744, -128213464, -150804368, -168549456, -181178720, + -188570000, -190746832, -187872144, -180238592, -168255376, -152432528, -133362752, -111701864, + -88148040, -63420712, -38239704, -13305140, 10721270, 33233146, 53694084, 71649704, + 86736888, 98689968, 107343928, 112634456, 114595192, 113352176, 109115832, 102170872, + 92864472, 81593048, 68788288, 54902676, 40395092, 25716910, 11298924, -2460449, + -15205434, -26631372, -36491212, -44599896, -50836640, -55145052, -57531268, -58060172, + -56849976, -54065368, -49909488, -44615140, -38435440, -31634326, -24477204, -17222048, + -10111227, -3364318, 2827930, 8308287, 12956318, 16690166, 19466890, 21281350, + 22163806, 22176328, 21408246, 19970784, 17991204, 15606606, 12957738, 10182934, + 7412561, 4764010, 2337587, 213264, -1551419, -2922471, -3889289, -4463602, + -4677182, -4578945, -4230953, -3704343, -3074240, -2415525, -1797252, -1280920, + -898770, -627791, -434755, -305164, -227603, -191690, -187557, -206218, + -239500, -280340, -322733, -361874, -394053, -416670, -428076, -427515, + -414945, -390943, -356535, -313106, -262250, -205705, -145243, -82626, + -19530, 42469, 101945, 157622, 208399, 253344, 291709, 322917, + 346571, 362440, 370466, 370745, 363530, 349215, 328325, 301500, + 269486, 233106, 193250, 150849, 106856, 62226, 17894, -25242, + -66343, -104637, -139433, -170137, -196253, -217395, -233281, -243746, + -248732, -248291, -242579, -231853, -216463, -196846, -173514, -147048, + -118082, -87293, -55383, -23069, 8934, 39937, 69279, 96351, + 120609, 141582, 158888, 172233, 181426, 186370, 187072, 183631, + 176235, 165155, 150734, 133374, 113527, 91685, 68363, 44092, + 19408, -5162, -29106, -51936, -73196, -92471, -109389, -123633, + -134942, -143118, -148026, -149603, -147856, -142863, -134772, -123799, + -110225, -94386, -76670, -57503, -37343, -16663, 4054, 24338, + 43732, 61811, 78191, 92535, 62535, 80267, 96515, 110869, + 122950, 132423, 139005, 142473, 142671, 139519, 133011, 123223, + 110309, 94503, 76111, 55508, 33131, 9465, -14962, -39597, + -63868, -87203, -109039, -128839, -146103, -160377, -171269, -178455, + -181688, -180805, -175730, -166482, -153172, -136001, -115264, -91340, + -64689, -35842, -5393, 26011, 57690, 88934, 119026, 147254, + 172929, 195397, 214061, 228390, 237937, 242348, 241373, 234879, + 222848, 205389, 182733, 155232, 123355, 87684, 48894, 7752, + -34905, -78188, -121168, -162899, -202440, -238873, -271320, -298971, + -321092, -337048, -346317, -348499, -343329, -330684, -310588, -283215, + -248890, -208087, -161430, -109684, -53754, 5325, 66401, 128208, + 189391, 248521, 304122, 354711, 398828, 435097, 462282, 479357, + 485586, 480607, 464520, 437982, 402277, 359398, 312090, 263877, + 219044, 182590, 160108, 157649, 181489, 237891, 332809, 471594, + 658900, 898625, 1197641, 1570523, 1996663, 2404745, 2717774, 2865679, + 2785718, 2427096, 1754169, 749686, -583221, -2219740, -4113328, -6196593, + -8383364, -10571665, -12647668, -14490343, -15976733, -16987568, -17413068, -17158614, + -16150145, -14338955, -11705745, -8263683, -4060347, 821616, 6265157, 12120884, + 18210488, 24331478, 30263100, 35773284, 40626432, 44591748, 47451940, 49011856, + 49106908, 47610828, 44442580, 39572032, 33024242, 24882062, 15286939, 4437778, + -7412170, -19960400, -32862134, -45739056, -58189596, -69800496, -80159352, -88867704, + -95554448, -99888904, -101593376, -100454560, -96333512, -89173816, -79007528, -65958664, + -50244076, -32171454, -12134525, 9394608, 31875820, 54713840, 77273336, 98895824, + 118918056, 136691248, 151600704, 163085296, 170656112, 173913744, 172563664, 166429120, + 155461200, 139745456, 119505000, 95099632, 67021116, 35884416, 2415097, -32566908, + -68166792, -103437232, -137402992, -169087216, -197538720, -221859376, -241231120, -254941424, + -262406848, -263193680, -257034992, -243843760, -223721280, -196960640, -164045024, -125640616, + -82584344, -35866404, 13391901, 63964612, 114551216, 163809728, 210391808, 252979168, + 290320064, 321265088, 344801344, 360083392, 366461088, 363502304, 351010944, 329038400, + 297889248, 258119712, 210529696, 156147840, 96210000, 32131786, -34524592, -102088152, + -168820816, -232961936, -292774464, -346591552, -392862560, -430196672, -457403712, -473530208, + -477890048, -470088800, -450040832, -417978368, -374452640, -320326336, -256757808, -185176992, + -107253736, -24859086, 59979564, 145128320, 228400464, 307612608, 380641824, 445482432, + 500300512, 543485312, 573695616, 589899584, 591407872, 577897856, 549428800, 506447456, + 449783328, 380634208, 300541536, 211356352, 115196864, 14397969, -88545520, -191040832, + -290462720, -384220896, -469827680, -544963968, -607541824, -655762304, -688166080, -703676928, + -701634816, -681819648, -644463424, -590250752, -520308160, -436181376, -339801440, -233440544, + -119658328, -1240033, 118872048, 237652048, 352067200, 459155616, 556103232, 640318080, + 709499520, 761700928, 795384128, 809463808, 803340864, 776923520, 730635776, 665412608, + 582681792, 484333184, 372675584, 250382144, 120426184, -13991622, -149522608, -282754144, + -410296096, -528867712, -635382464, -727028736, -801344512, -856283200, -890270272, -902247552, + -891705280, -858699904, -803857856, -728364736, -633940096, -522797984, -397595008, -261366368, + -117451720, 30587386, 179056320, 324220320, 462399104, 590061056, 703913984, 800990592, + 878726208, 935027008, 968326336, 977628096, 962536000, 923267520, 860652416, 776115520, + 671644160, 549741504, 413365632, 265857680, 110858864, -47779968, -206094880, -360108800, + -505932192, -639862208, -758477376, -858725824, -938004160, -994225728, -1025875712, -1032052032, + -1012490816, -967575808, -898331200, -806398464, -693996736, -563869056, -419215008, -263610912, + -100920864, 64800176, 229408368, 388775616, 538893952, 675977408, 796558208, 897575488, + 976453568, 1031168128, 1060298880, 1063066560, 1039353856, 989709440, 915335680, 818058560, + 700282816, 564931648, 415373344, 255336384, 88815592, -80029120, -246977680, -407857120, + -558646720, -695580608, -815240832, -914661376, -991426624, -1043686208, -1070172608, -1070248192, + -1043923520, -991857408, -915341120, -816266432, -697079168, -560719104, -410547744, -250265472, + -83820864, 84686600, 251107216, 411343136, 561449088, 697729408, 816829056, 915815936, + 992253184, 1044259072, 1070553344, 1070488704, 1044066752, 991938048, 915385920, 816295104, + 697105216, 560750656, 410588608, 250316144, 83879304, -84624008, -251044992, -411286048, + -561401792, -697695936, -816812672, -915819008, -992277056, -1044304128, -1070619200, -1070574144, + -1044169920, -992056576, -915517184, -816436096, -697252864, -560901952, -410740480, -250465744, + -84023984, 84486696, 250917232, 411169760, 561298496, 697607040, 816739008, 915761280, + 992235520, 1044278912, 1070609856, 1070580032, 1044190208, 992090048, 915562432, 816491584, + 697316864, 560972608, 410815936, 250544048, 84103240, -84408312, -250841440, -411098144, + -561232512, -697547840, -816687680, -915718464, -992201920, -1044254720, -1070595200, -1070574848, + -1044194112, -992102592, -915582912, -816519232, -697350784, -561011712, -410859200, -250590352, + -84151408, 84359424, 250792960, 411051168, 561188032, 697506752, 816650880, 915686656, + 992175616, 1044234432, 1070581248, 1070567360, 1044193024, 992107776, 915594112, 816535872, + 697372352, 561037568, 410888512, 250622304, 84185136, -84324824, -250758368, -411017408, + -561155904, -697477056, -816624192, -915663552, -992156544, -1044219712, -1070571008, -1070561728, + -1044192000, -992111168, -915601728, -816547392, -697387392, -561055616, -410909120, -250644896, + -84209144, 84299992, 250733312, 410992736, 561132224, 697454848, 816603968, 915645824, + 992141696, 1044208000, 1070562816, 1070557056, 1044191040, 992113920, 915607936, 816556928, + 697399936, 561070784, 410926464, 250663904, 84229272, -84279312, -250712656, -410972640, + -561113216, -697437440, -816588608, -915632832, -992131328, -1044200448, -1070558208, -1070555520, + -1044192384, -992118080, -915614784, -816566208, -697411328, -561084032, -410941184, -250679696, + -84245752, 84262552, 250696016, 410956544, 561098048, 697423552, 816576320, 915622464, + 992123200, 1044194816, 1070555200 +}; + +/************************ Q30 *******************************/ +const Word32 ivas_fb_fr_12band_1ms_im_fx[IVAS_FB_12_1MS_LEN] = { + -96495528, -286734272, -468692800, -637041216, -786562176, -912433280, -1009964416, -1075182976, -1098333440, + -1060972224, -954328512, -784950848, -567387776, -321857280, -71378072, 161019520, 355191072, + 496249664, 576290688, 595228096, 560553408, 486341472, 391112608, 296445024, 219833024, + 161425424, 113971872, 75074912, 43676944, 18947558, 106207, -13606639, -22959300, + -28697174, -31541624, -32158708, -31154358, -29054292, -26304144, -23261552, -20202826, + -17324756, -14756116, -12565362, -10774012, -9366401, -8302065, -7524551, -6970827, + -6577419, -6286071, -6046737, -5819771, -5576294, -5297871, -4975268, -4606808, + -4196583, -3752523, -3284873, -2804624, -2322651, -1848752, -1391471, -957667, + -552820, -180887, 155183, 453533, 712892, 932744, 1112922, 1253892, + 1356428, 1421957, 1452251, 1449752, 1417222, 1357998, 1275581, 1173833, + 1056523, 927513, 790325, 648358, 504521, 361522, 221574, 86743, + -41290, -160871, -270597, -368994, -454781, -526614, -583403, -624117, + -648145, -655120, -645267, -619210, -578251, -524110, -459110, -385841, + -307254, -226274, -145851, -68575, 3253, 67950, 124299, 171779, + 210318, 240423, 262847, 278659, 288884, 294565, 296445, 295082, + 290614, 282963, 271701, 256332, 236226, 210937, 180155, 143993, + 102888, 57812, 10083, -38529, -86081, -130429, -169562, -201608, + -225146, -239179, -243376, -237949, -223786, -202225, -175080, -144342, + -112142, -80430, -50955, -24990, -3380, 13628, 26240, 35170, + 41402, 46169, 50665, 56013, 62999, 72081, 83214, 95949, + 109364, 122266, 133211, 140767, 143575, 140609, 131207, 115267, + 93186, 65957, 34996, 2134, -30636, -61239, -87791, -108676, + -122781, -129495, 12356724, 36406252, 58390684, 76977432, 90719600, 98265728, + 98008264, 88608552, 62420976, 2547174, -98862584, -234978608, -391650304, -549723776, + -687929024, -785620992, -825677888, -796781568, -695135040, -525144384, -299188480, -36327380, + 239749920, 503413376, 729982272, 898556864, 994367488, 1010422464, 948197568, 817333696, + 634343104, 420516896, 199273200, -6719048, -178276784, -302004160, -371805248, -389615456, + -365008416, -315253344, -262675984, -217917568, -178521248, -143001072, -111343304, -83569488, + -59728692, -39750832, -23483756, -10668693, -980101, 5968707, 10589352, 13306198, + 14527738, 14637296, 13974127, 12830675, 11443325, 9996437, 8620832, 7402724, + 6386965, 5588127, 4995412, 4583292, 4315642, 4154179, 4060473, 4001515, + 3949354, 3884093, 3791711, 3665350, 3502261, 3304372, 3075215, 2820550, + 2545809, 2257129, 1959450, 1657946, 1356600, 1059795, 771079, 494646, + 234059, -6519, -223731, -414017, -575061, -704879, -803133, -870150, + -907983, -919252, -907936, -878057, -834296, -780659, -721070, -658192, + -594157, -529649, -464852, -398810, -330536, -258557, -182049, -100384, + -14134, 75538, 166137, 254665, 337160, 409716, 468199, 509317, + 530349, 530086, 508400, 466928, 408381, 336929, 257279, 174830, + 94651, 21581, -40724, -89563, -123905, -143909, -151339, -148811, + -139947, -128462, -118197, -112219, -112926, -121327, -137375, -159531, + -185372, -211440, -234054, -249316, -253979, -245431, -222426, -184880, + -134334, -73467, -6263, 62723, 128418, 186074, 231361, 261147, + 273444, 267948, 261810, 763373, 1198560, 1499796, 1578270, 1304628, + 517808, -987783, -3443484, -7111908, -12256820, -19143168, -27996048, -39000040, + -52248820, -67752040, -85376464, -104873664, -125808744, -147634944, -169591248, -190910720, + -210637232, -228834976, -242239792, -233744176, -184602112, -88256112, 52564248, 227312048, + 419154080, 607121280, 768828480, 883312000, 933778624, 909811200, 808862336, 636755584, + 407214048, 140391440, -139342896, -406167488, -635714880, -807834944, -908809408, -932820096, + -882419648, -768029696, -606446400, -418634368, -226977824, -52442412, 88143752, 184240560, + 233125792, 241364816, 227710480, 209276640, 189331712, 167814560, 145682224, 123701848, + 102633120, 83021960, 65302000, 49722020, 36415812, 25376218, 16511686, 9640718, + 4539034, 941445, -1420767, -2818065, -3495818, -3676385, -3542409, -3243683, + -2888735, -2555377, -2287831, -2108851, -2019462, -2010501, -2062586, -2155553, + -2267238, -2380241, -2479146, -2554886, -2600826, -2615545, -2598567, -2552488, + -2479078, -2381454, -2260948, -2119607, -1957826, -1777065, -1577959, -1362941, + -1134431, -897064, -655697, -417094, -187702, 25095, 215280, 377113, + 507239, 603471, 666470, 698219, 703186, 686502, 654728, 613906, + 570192, 528056, 491058, 460427, 436171, 416130, 397422, 375887, + 347709, 309014, 257411, 191469, 111939, 20899, -77459, -178052, + -274516, -360654, -430246, -478480, -501684, -498487, -469248, -416789, + -345433, -261310, -171090, -82033, -635, 67321, 117943, 148920, + 160318, 153895, 133448, 103776, 70703, 39859, 16616, 4954, + 7564, 25024, 56260, 98143, 146331, 195238, 239125, 272241, + 289930, 288679, 266989, 225117, 165550, 92349, 11219, -71466, + -148857, -214705, -263567, -291740, -297224, -280306, -243136, -189895, + -125985, -57873, 7933, 65157, 108741, 134971, 142193, 130597, + 102524, 61859, 13944, -35316, -79751, -113898, -133249, -135053, + -118286, -84087, -35339, 23302, 86186, 146930, 199365, 237874, + 258253, 257864, 236196, 194657, 136724, 67341, -7287, -80567, + -145896, -270343, -808574, -1340072, -1858807, -2358665, -2831742, -3270963, + -3669340, -4023521, -4333619, -4606985, -4857566, -5108708, -5390687, -5741295, + -6200425, -6807718, -7593886, -8575752, -9745172, -11063108, -12448231, -13772797, + -14853837, -15454158, -15279006, -13985197, -11185029, -6465256, 602227, 10431847, + 23410894, 39863840, 60045788, 84103768, 112100696, 143979968, 179711728, 219302416, + 264231232, 316950432, 366815488, 391499840, 373734272, 303947296, 180205328, 8607086, + -197450336, -418782432, -632721152, -815848960, -946877184, -1009294400, -993460928, -897898880, + -729596672, -503316064, -239947616, 35840880, 298430624, 524143840, 693923584, 795387200, + 824107840, 783846592, 685860544, 547189184, 388365568, 230527600, 92671240, -11219515, + -74492144, -105158200, -120261872, -127544112, -128388320, -124354624, -116661448, -106489408, + -94793200, -82429304, -70062176, -58237700, -47334588, -37619828, -29226616, -22202334, + -16501587, -12028281, -8635400, -6159899, -4423260, -3257870, -2504859, -2031762, + -1726474, -1507393, -1314142, -1112384, -883004, -624119, -340602, -45467, + 248842, 528315, 783713, 1007231, 1196662, 1351165, 1473983, 1568019, + 1637995, 1686519, 1716364, 1727429, 1719421, 1689696, 1636232, 1556028, + 1448006, 1311510, 1148760, 963094, 760758, 548770, 336091, 131254, + -56814, -221101, -355658, -457521, -525555, -561787, -569830, -555666, + -525766, -487535, -447411, -411297, -382938, -364634, -356100, -355594, + -359287, -362732, -360583, -348172, -321291, -277591, -216139, -138411, + -47457, 51579, 152676, 248783, 333218, 399646, 443388, 461240, + 452449, 418164, 361960, 288882, 205559, 118975, 36377, -35977, + -92851, -131037, -149092, -147929, -130154, -100234, -63486, -25973, + 6639, 29226, 38204, 31469, 9051, -27322, -73989, -126155, + -177996, -223678, -257577, -275273, -273644, -251592, -209808, -151108, + -79807, -1677, 76962, 149510, 210060, 253638, 277008, 278653, + 259231, -101021, -297456, -477733, -632297, -753728, -836696, -878615, + -879031, -839751, -763739, -654959, -517096, -353514, -166209, 43748, + 276781, 533724, 815969, 1123958, 1457300, 1813342, 2187857, 2574262, + 2965417, 3353797, 3734536, 4106324, 4475222, 4855377, 5272512, 5763051, + 6375849, 7168185, 8204533, 9548340, 11257436, 13371571, 15905385, 18833006, + 22081010, 25512624, 28924300, 32032662, 34478724, 35820256, 35546928, 33078728, + 27793346, 19027280, 6112874, -11628489, -34851840, -64232176, -100493888, -144608256, + -198909072, -270631488, -359662496, -448624032, -516131776, -543967680, -518454176, -432622496, + -287176640, -90768024, 140893552, 386715040, 622670976, 824595136, 971067648, 1045974272, + 1040467264, 954060352, 794731136, 578022784, 325234560, 60958056, -189791088, -404423968, + -565354624, -661869440, -691213888, -658569600, -576189312, -461441856, -334519392, -215323504, + -121182328, -57886044, -14972652, 16811060, 39759696, 55435020, 65035460, 69706136, + 70441104, 68189248, 63775032, 57948004, 51329736, 44447116, 37701544, 31399154, + 25736924, 20832988, 16723796, 13393488, 10776430, 8783249, 7304115, 6229334, + 5450365, 4874027, 4420041, 4029271, 3658127, 3282309, 2889391, 2480032, + 2060348, 1642421, 1237795, 858544, 512575, 205752, -60998, -288674, + -481834, -645256, -785054, -905653, -1011013, -1102347, -1179780, -1240896, + -1282805, -1301283, -1292960, -1254661, -1185341, -1085250, -957344, -806069, + -638185, -461195, -283738, -113885, 40607, 173836, 281340, 361227, + 413418, 440281, 445517, 434398, 412451, 385525, 358529, 335589, + 319068, 309999, 307515, 309612, 312947, 313829, 308220, 292759, + 264732, 222913, 167314, 99696, 23013, -58414, -139717, -215530, + -280898, -331372, -363803, -376281, -368659, -342216, -299851, -245477, + -183947, -120287, -59527, -210294, -218804, -207034, -170663, -107684, + -17542, 97483, 233628, 384636, 543572, 702055, 852320, 986414, + 1098210, 1182279, 1235630, 1256080, 1243695, 1198697, 1122785, 1016812, + 882318, 719277, 528144, 307851, 58485, -220576, -527549, -860384, + -1213683, -1581737, -1955989, -2329539, -2695405, -3052665, -3405215, -3769076, + -4170617, -4653891, -5276647, -6116192, -7261256, -8815022, -10881268, -13564073, + -16947616, -21093540, -26015144, -31675226, -37956612, -44665032, -51498380, -58060316, + -63829408, -68189520, -70395848, -69627624, -64938208, -55334156, -39669268, -16742548, + 15011598, 57892376, 121157856, 215274688, 334456672, 461378272, 576139200, 658546880, + 691230336, 661933376, 565469888, 404588960, 189999104, -60718748, -324979552, -577770304, + -794500352, -953869504, -1040332032, -1045906432, -971073600, -824675520, -622820672, -386923360, + -141145440, 90490632, 286893152, 432351840, 518213184, 543769536, 515984864, 448531552, + 359622208, 270636384, 198948336, 144668672, 100561448, 64293740, 34896780, 11649924, + -6117171, -19054578, -27836140, -33125540, -35583508, -35831208, -34449244, -31950346, + -28780702, -25304532, -21811144, -18510242, -15544263, -12991323, -10880449, -9198353, + -7904592, -6938712, -6232849, -5716818, -5326765, -5007114, -4715109, -4419761, + -4103101, -3757115, -3383050, -2987624, -2581751, -2177166, -1785567, -1416314, + -1076470, -769692, -497117, -257162, -46868, 137886, 301064, 446309, + 576003, 691438, 792390, 877665, 945087, 992265, 1016767, 1016861, + 991628, 941464, 867976, 774150, 663993, 542420, 414732, 286370, + 162380, 47204, -55707, -143950, -216326, -272693, -313915, -341561, + -357718, -364650, -364603, -359521, -350944, -339867, -326770, -311628, + -294057, -273429, -249069, -220397, -187092, -149183, -107127, -61803, + -14483, 33260, 79674, 122959, 161417, 193583, -137153, -86096, + -23462, 46165, 118296, 188311, 252569, 308033, 353183, 387345, + 411326, 426448, 434961, 438884, 440375, 440558, 440044, 437930, + 432614, 421046, 399869, 364878, 312384, 238720, 141646, 19702, + -126527, -295376, -483051, -684957, -894831, -1106337, -1312215, -1505978, + -1680884, -1831578, -1952736, -2040617, -2091372, -2102604, -2071473, -1996480, + -1875541, -1708206, -1493799, -1234127, -931547, -591976, -222473, 165877, + 561490, 950008, 1319512, 1659151, 1966270, 2245658, 2518227, 2819813, + 3210306, 3770160, 4608328, 5854141, 7662371, 10198175, 13638330, 18147660, + 23877010, 30930782, 39364468, 49144104, 60148836, 72123392, 84694024, 97312800, + 109298904, 119765360, 127705376, 131866912, 130934488, 123231464, 107234464, 75050672, + 9470806, -97677456, -239897616, -403333024, -569087680, -716066368, -823729024, -874943616, + -858298112, -769767616, -613463168, -401328448, -152012800, 111316600, 362752096, 579800640, + 754066560, 884317376, 967646720, 1002358976, 988932224, 930137792, 830908864, 698079680, + 539965760, 365883200, 185588480, 8720114, -155758112, -300047104, -417930816, -505075680, + -559213504, -580180096, -569826624, -531795520, -471193568, -394169856, -307444800, -217803664, + -131610264, -54348980, 9748328, 57999172, 89445504, 104945984, 107368432, 102279568, + 94596192, 85655480, 75877136, 65846368, 56016016, 46757852, 38321108, 30867838, + 24467266, 19124186, 14784349, 11357873, 8727069, 6764325, 5338255, 4325655, + 3614320, 3109507, 2733412, 2427369, 2148937, 1871452, 1580043, 1270071, + 943252, 606145, 267130, -64446, -380185, -672695, -936550, -1167777, + -1364195, -1524669, -1649207, -1738275, -1792904, -1814221, -1803670, -1762759, + -1693364, -1597596, -1478091, -1337881, -1180581, -1010189, -831132, -647987, + -465420, -287874, -119474, 36238, 176365, 298810, 402244, 486148, + 550683, 596630, 625208, 637968, 636614, 622900, 598511, 565006, + 523771, 476024, 422831, 365155, 303902, 239978, 174336, 108003, + 42099, -22177, -83566, -140800, -192647, -237981, -275829, -305435, + -326287, -338158, -341095, -335431, -321739, -300823, -273643, -241298, + -204944, -165780, -124974, -83660, -42880, 10137, 29849, 47985, + 63702, 76520, 86314, 93425, 98550, 102746, 107236, 113334, + 122202, 134769, 151505, 172398, 196816, 223585, 250966, 276853, + 298844, 314511, 321522, 317919, 302199, 273538, 231774, 177523, + 112040, 37218, -44643, -130911, -218896, -305922, -389579, -467717, + -538627, -600924, -653636, -695990, -727439, -747408, -755314, -750348, + -731559, -697715, -647504, -579487, -492405, -385195, -257342, -108895, + 59211, 245234, 446381, 659034, 878627, 1100007, 1317397, 1524851, + 1716231, 1885675, 2027510, 2136678, 2208531, 2239209, 2225330, 2164370, + 2054318, 1894140, 1683476, 1423258, 1115462, 763860, 373717, -47467, + -490570, -944379, -1396841, -1835173, -2248037, -2626382, -2966637, -3272111, + -3556917, -3847305, -4185583, -4630274, -5258922, -6165632, -7461554, -9268313, + -11715324, -14927984, -19021866, -24085232, -30171698, -37277344, -45335748, -54189964, + -63598244, -73198584, -82549584, -91078392, -98377112, -103118416, -100391208, -84628624, + -52954552, -4492618, 59827860, 137363792, 223933312, 314109568, 401591168, 479653696, + 541630720, 581410176, 593897728, 575427264, 524078976, 439891712, 324946016, 183315184, + 20883088, -154960944, -335730752, -512333504, -675605952, -816870016, -928462720, -1004220224, + -1039868736, -1033319296, -984830528, -897064000, -775182272, -627308096, -461708352, -284291552, + -100579392, 83598736, 262525088, 430732416, 583209600, 715532736, 824009920, 905775040, + 958871552, 982291840, 975995776, 940888192, 878773504, 792274432, 684731072, 560072576, + 422675872, 277208288, 128466608, -18787604, -159985744, -290901824, -407785088, -507474624, + -587489088, -646091776, -682326144, -696024192, -687785152, -658928000, -611418688, -547776704, + -470963680, -384259392, -291130144, -195094672, -99592464, -7860071, 77180528, 153017120, + 217622960, 269510560, 307761952, 332035072, 342546656, 340033376, 325693088, 301109632, + 268164672, 228941216, 185622192, 140390128, 95330560, 52345244, 13076479, -21151680, + -49376268, -71017224, -85881800, -94147080, -96327536, -93222768, -85856648, -75400496, + -63097824, -50176000, -37774988, -26857674, -18169908, -11863887, -7301392, -3914018, + -1479242, 185291, 1236420, 1817970, 2053955, 2052907, 1903852, 1679448, + 1434536, 1209401, 1029974, 911183, 857962, 868350, 934655, 1046022, + 1189342, 1351150, 1518125, 1678330, 1821294, 1938725, 2024278, 2073883, + 2085335, 2058391, 1994281, 1895693, 1766278, 1610593, 1433645, 1240831, + 1037545, 829139, 620601, 416556, 221024, 37473, -131344, -283279, + -416878, -531220, -625958, -701127, -757159, -794697, -814605, -817824, + -805400, -778384, -737905, -685103, -621229, -547610, -465741, -377252, + -283979, -187900, -91166, 4001, 95326, 180608, 257764, 324972, + 380709, 423871, 453787, 470280, 473637, 464613, 444338, 414280, + 376112, 331644, 282692, 231012, 178188, 125609, 74399, 25440, + -20646, -63433, -102670, -138199, -169921, -197722, -221454, -240892, + -255747, -265667, -270281, -269233, -262252, -249189, -230092, -205221, + -175099, -140492, -102411, -62059, -20785, 19997, 58880, 94556, + 125879, 151942, 172113, 186075, 193810, 195596, 191955, 183604, + 171377, 156168, 138843, 120200, 100900, 81458, 62216, 43368, + 24971, 6998, -10624, -27957, -45013, -61705, -77836, -93079, + -106999, -119067, -128714, -135370, -138532, -137806, -132971, -123999, + -111091, -94667, -75361, -53969, 10765, 32074, 52722, 72311, + 90486, 106963, 121523, 134027, 144392, 152600, 158658, 162605, + 164468, 164267, 161985, 157577, 150955, 142011, 130615, 116649, + 100019, 80692, 58704, 34200, 7431, -21221, -51265, -82083, + -112977, -143167, -171845, -198187, -221409, -240776, -255657, -265518, + -269970, -268744, -261725, -248915, -230452, -206572, -177616, -143996, + -106204, -64784, -20348, 26444, 74865, 124130, 173377, 221686, + 268054, 311432, 350709, 384766, 412472, 432751, 444591, 447117, + 439606, 421553, 392681, 352994, 302769, 242592, 173323, 96118, + 12366, -76299, -168083, -261025, -353085, -442152, -526117, -602884, + -670441, -726859, -770364, -799329, -812348, -808221, -786031, -745129, + -685209, -606288, -508783, -393474, -261578, -114689, 45155, 215561, + 393723, 576534, 760547, 942104, 1117306, 1282158, 1432549, 1564416, + 1673729, 1756688, 1809722, 1829726, 1814087, 1760970, 1669365, 1539414, + 1372449, 1171316, 940345, 685584, 414591, 136477, -138614, -399774, + -636264, -838162, -997771, -1110606, -1177191, -1204204, -1206433, -1207707, + -1242622, -1356751, -1607660, -2063815, -2804506, -3917005, -5495374, -7636020, + -10436517, -13992514, -18402674, -23818388, -30616280, -38795064, -47468192, -55465196, + -61624760, -64816688, -64030596, -58439904, -47471160, -30852034, -8650500, 18708296, + 50440096, 85421744, 122227560, 159185040, 194443776, 226058080, 252076752, 270638720, + 280067616, 278963616, 266285680, 241422224, 204245248, 155146128, 95049592, 25405990, + -51839956, -134302160, -219227456, -303587872, -384188544, -457786240, -521215424, -571515392, + -606054656, -622647040, -619654592, -596072512, -551593600, -486646944, -402411264, -300798944, + -184413264, -56477480, 79260352, 218645328, 357251200, 490529920, 613968768, 723250432, + 814409344, 883978944, 929123648, 947751552, 938601472, 901303104, 836405248, 745373248, + 630551936, 495099232, 342887840, 178382704, 6494100, -167583760, -338549120, -501169472, + -650463872, -781868416, -891402304, -975790912, -1032769600, -1061261696, -1060915456, -1031960960, + -975385600, -892916224, -786977856, -660620736, -517435968, -361449888, -197010624, -28662768, + 138980608, 301369056, 454141632, 593248768, 715063168, 816478784, 894992576, 948769664, + 976686784, 978356608, 954128576, 905069824, 832924288, 740053568, 629360000, 504194944, + 368255424, 225472400, 79893288, -64436384, -203589744, -333869568, -451910592, -554770112, + -640004160, -705727744, -750656768, -774131456, -776120512, -757206720, -718553856, -661857536, + -589281088, -503378688, -407008864, -303241088, -195258304, -86258672, 20640266, 122492392, + 216605760, 300615264, 372542752, 430843584, 474437952, 502727104, 515593600, 513386816, + 496894016, 467298720, 426127872, 375190336, 316508064, 252243568, 184625248, 115873648, + 48130852, -16604751, -76536328, -130117360, -176090096, -213512624, -241774240, -260598816, + -270036736, -270445792, -262462656, -246965456, -225030192, -197881696, -166842016, -133277536, + -98547200, -63953468, -30697916, 157309, 27720696, 51294532, 70389352, 84729480, + 94249824, 99084304, 99546808, 96105616, 89352656, 79969008, 68688296, 56259452, + 43410724, 30816176, 19066356, 8644033, -93590, -6926218, -11773978, -14694671, + -15872813, -15605618, -14280676, -12378042, -10430668, -8704424, -7182491, -5854782, + -4729147, -3804335, -3072066, -2516383, -2116394, -1847634, -1684290, -1600530, + -1572012, -1576721, -1595767, -1613665, -1618550, -1602016, -1558925, -1486975, + -1386301, -1258946, -1108416, -939180, -756297, -565028, -370575, -177839, + 8715, 185182, 348246, 495214, 623986, 733038, 821363, 888436, + 934161, 958831, 963086, 947887, 914478, 864367, 799293, 721209, + 632236, 534643, 430794, 323115, 214029, 105923, 1076, -98376, + -190504, -273617, -346304, -407458, -456294, -492355, -515505, -525917, + -524051, -510616, -486547, -452951, -411079, -362277, -307954, -249541, + -188465, -126117, -63839, -2894, 55536, 110376, 160649, 205502, + 244200, 276144, 300872, 318070, 327574, 329385, 323660, 310724, + 291059, 265298, 234214, 198698, 159739, 118393, 75754, 32922, + -9033, -49104, -86375, -120044, -149449, -174076, -193569, -207727, + -216503, -219983, -218381, -212007, -201261, -186599, -168524, -147564, + -124261, -99161, -72807, -45733, -18468, 8473, 34584, 59372, + 82359, 103090, 121141, 136131, 147730, 155680, 159803, 160015, + 156337, 148897, 137934, 123794, 106916, 87821, 67091, 45345, + 23216, 1326, -19743, -39465, 109887, 120382, 128416, 133765, + 136261, 135794, 132320, 125859, 116497, 104388, 89749, 72858, + 54047, 33695, 12222, -9922, -32266, -54329, -75626, -95683, + -114044, -130284, -144009, -154878, -162593, -166923, -167696, -164811, + -158239, -148026, -134294, -117244, -97153, -74370, -49314, -22469, + 5628, 34390, 63198, 91407, 118365, 143426, 165965, 185395, + 201183, 212860, 220042, 222435, 219848, 212195, 199508, 181929, + 159715, 133233, 102952, 69434, 33331, -4639, -43696, -83016, + -121744, -159013, -193957, -225733, -253530, -276597, -294249, -305894, + -311042, -309326, -300512, -284516, -261407, -231423, -194963, -152600, + -105060, -53228, 1881, 59128, 117284, 175043, 231069, 284005, + 332527, 375354, 411300, 439283, 458370, 467783, 466935, 455431, + 433101, 399985, 356360, 302726, 239820, 168592, 90219, 6068, + -82296, -173156, -264641, -354785, -441533, -522811, -596538, -660703, + -713385, -752830, -777471, -786003, -777391, -750944, -706300, -643488, + -562898, -465330, -351937, -224267, -84196, 66044, 223948, 386697, + 551263, 714370, 872609, 1022412, 1160192, 1282340, 1385409, 1466141, + 1521718, 1549819, 1548936, 1518450, 1458982, 1372447, 1262386, 1133907, + 993924, 850871, 714752, 596518, 507835, 460031, 463573, 526525, + 653821, 845263, 1094812, 1388217, 1702729, 2004387, 2248836, 2377871, + 2322716, 1997670, 1310909, 31361, -2276023, -5884963, -10790734, -16840258, + -23748608, -31120974, -38472224, -45255760, -50892408, -54804412, -56448304, -55348896, + -51129788, -43541476, -32483506, -18021422, -395893, 19975162, 42503072, 66442420, + 90913264, 114929960, 137436576, 157346768, 173587488, 185144144, 191106144, 190710336, + 183381248, 168765648, 146760624, 117533176, 81530704, 39481248, -7616625, -58514600, + -111745512, -165663824, -218494432, -268388400, -313484064, -351971232, -382156480, -402527424, + -411813344, -409040128, -393577504, -365176384, -323994752, -270611200, -206024384, -131639056, + -49237472, 39062252, 130860688, 223542656, 314352192, 400474784, 479124064, 547630784, + 603530816, 644649344, 669178624, 675746624, 663473536, 632014912, 581589056, 512987520, + 427568224, 327230528, 214373088, 91835128, -37177272, -169178032, -300498464, -427392512, + -546146752, -653191616, -745210944, -819245440, -872788352, -903868288, -911118272, -893827520, + -851974272, -786238976, -697996288, -589286400, -462766208, -321640832, -169578832, -10611593, + 150978672, 310780032, 464377088, 607478720, 736043264, 846397952, 935348160, 1000273472, + 1039207744, 1050900416, 1034856960, 991357632, 921452992, 826937088, 710298944, 574652800, + 423651328, 261382080, 92266240, -79072984, -248102448, -410503776, -562126720, -699092736, + -817911936, -915573376, -989624896, -1038234688, -1060238592, -1055167808, -1023259008, -965445760, + -883330880, -779142016, -655670144, -516193728, -364390176, -204236960, -39905496, 124349848, + 284304192, 435873248, 575219968, 698854144, 803721536, 887281600, 947570240, 983247040, + 993625152, 978684224, 939064256, 876042880, 791495168, 687838208, 567961280, 435144608, + 292968064, 145212944, -4240369, -151516576, -292848000, -424673056, -543728192, -647130176, + -732447680, -797759168, -841696640, -863474048, -862898880, -840368384, -796849536, -733844032, + -653339328, -557747648, -449833824, -332635680, -209377712, -83381528, 42024892, 163596368, + 278255872, 383173696, 475838368, 554117568, 616307264, 661168640, 687951104, 696401792, + 686761024, 659744256, 616512064, 558627584, 488004704, 406847392, 317582464, 222787984, + 125119136, 27233782, -68280144, -158973472, -242598960, -317167264, -380994112, -432737696, + -471425664, -496470656, -507674976, -505223904, -489668640, -461899200, -423108800, -374750624, + -318488480, -256143216, -189636144, -120931576, -51979948, 15336795, 79255984, 138179872, + 190714864, 235703648, 272249056, 299729728, 317807040, 326423456, 325792768, 316382656, + 298890368, 274212512, 243410272, 207670816, 168266608, 126513920, 83731472, 41200944, + 130175, -38379756, -73362784, -104010672, -129689920, -149952464, -164540112, -173382736, + -176590656, -174441552, -167362736, -155909328, -140739472, -122587248, -102234616, -80482928, + -58125464, -35921428, -14572560, 5297181, 23158150, 38587464, 51277008, 61037024, + 67795232, 71591800, 72570464, 70966328, 67090884, 61315048, 54050700, 45731812, + 36795552, 27664472, 18730052, 10338603, 2779584, -3722787, -9014984, -13015846, + -15715349, -17169656, -17493876, -16851572, -15443180, -13491852, -11229971, -8883501, + -6659666, -4731320, -3230436, -2179638, -1456508, -951706, -619736, -422906, + -328742, -307762, -334784, -388143, -450439, -507929, -550755, -572282, + -568989, -539768, -485654, -409163, -313997, -204481, -85334, 38748, + 163232, 284008, 397435, 500481, 590686, 666220, 725799, 768696, + 794640, 803805, 796717, 774237, 737483, 687817, 626774, 556060, + 477482, 392946, 304395, 213796, 123081, 34130, -51284, -131518, + -205101, -270753, -327424, -374293, -410797, -436619, -451696, -456198, + -450524, -435265, -411195, -379231, -340412, -295864, -246780, -194382, + -139908, -84576, -29579, 23948, 74940, 122415, 165488, 203392, + 235477, 261232, 280287, 292420, 297563, 295805, 287381, 272679, + 252217, 226642, 196699, 163225, 127113, 89298, 50723, 12319, + -25022, -60468, -93267, -122762, -148403, -169755, -186505, -198455, + -205529, -207755, -205269, -198296, -187147, -172200, -153899, -132733, + -109235, -83965, -57505, -30448, -3387, 23090, 48419, 72062, + 93519, 112344, 128152, 140629, 149540, 154739, 156171, 153875, + 147984, 138721, 126390, 111370, 94099, 75064, 54779, 33779, + 12593, -8262, -28303, -47084, 123494, 129971, 133493, 133924, + 131201, 125331, 116398, 104559, 90037, 73124, 54170, 33578, + 11793, -10702, -33406, -55797, -77356, -97567, -115939, -132009, + -145355, -155607, -162458, -165670, -165080, -160609, -152268, -140154, + -124457, -105454, -83508, -59060, -32622, -4767, 23884, 52680, + 80946, 108005, 133192, 155874, 175459, 191418, 203293, 210711, + 213394, 211167, 203964, 191828, 174916, 153495, 127939, 98723, + 66416, 31667, -4798, -42202, -79720, -116501, -151685, -184419, + -213882, -239294, -259946, -275209, -284560, -287590, -284024, -273728, + -256722, -233178, -203429, -167959, -127402, -82528, -34229, 16495, + 68562, 120826, 172104, 221199, 266929, 308151, 343787, 372847, + 394455, 407868, 412493, 407908, 393872, 370338, 337461, 295599, + 245318, 187388, 122773, 52620, -21757, -98901, -177232, -255084, + -330731, -402431, -468456, -527135, -576892, -616284, -644032, -659054, + -660495, -647746, -620468, -578601, -522379, -452338, -369318, -274467, + -169243, -55405, 64986, 189594, 315816, 440826, 561623, 675096, + 778120, 867669, 940959, 995619, 1029881, 1042792, 1034432, 1006137, + 960689, 902497, 837686, 774157, 721490, 690799, 694367, 745251, + 856581, 1040935, 1309312, 1670468, 2129651, 2688819, 3345656, 4105519, + 4976393, 5840188, 6459558, 6619945, 6147045, 4905821, 2810464, -169248, + -4002855, -8597662, -13799897, -19399282, -25136440, -30713178, -35805064, -40075928, + -43193604, -44846368, -44759276, -42709760, -38541820, -32178052, -23629058, -12999656, + -491521, 13597969, 28880844, 44887552, 61079704, 76866240, 91622528, 104711816, + 115508400, 123421568, 127919688, 128553392, 124977088, 116967832, 104440944, 87461480, + 66251100, 41189824, 12812431, -18200672, -51037968, -84776544, -118406512, -150859520, + -181040640, -207862576, -230281344, -247332144, -258164320, -262074240, -258534976, -247221616, + -228031216, -201096704, -166793872, -125740976, -78790864, -27015406, 28317512, 85773968, + 143790256, 200714592, 254853088, 304518720, 348082144, 384022272, 410975936, 427784064, + 433533952, 427595232, 409648832, 379707872, 338129120, 285614880, 223204848, 152257552, + 74422120, -8399482, -94098672, -180413920, -264990464, -345444480, -419429888, -484706304, + -539205312, -581094272, -608834752, -621234048, -617488768, -597217728, -560484416, -507806784, + -440154880, -358935456, -265963920, -163424032, -53816484, 60102860, 175393008, 289004832, + 397862624, 498948160, 589385088, 666520704, 728003904, 771855360, 796529472, 800965376, + 784625088, 747518528, 690213376, 613829888, 520020448, 410934048, 289166720, 157698512, + 19819390, -120954952, -260974400, -396551008, -524057792, -640027584, -741248576, -824854336, + -888405760, -929962176, -948139904, -942156672, -911859520, -857736896, -780912768, -683123584, + -566678912, -434405344, -289576544, -135830144, 22925716, 182614304, 339097376, 488284896, + 626244608, 749307648, 854168576, 937975616, 998409984, 1033750912, 1042925056, 1025539008, + 981893504, 912979136, 820453376, 706599552, 574268864, 426807104, 267967136, 101810936, + -67397744, -235305840, -397586848, -550055296, -688779008, -810183040, -911146880, -989084800, + -1042054592, -1068829184, -1068826112, -1042089792, -989328512, -911898304, -811770624, -691481728, + -554069376, -402995648, -242059584, -75301504, 93098968, 258928160, 418044256, 566481536, + 700549504, 816925696, 912738304, 985637504, 1033853888, 1056241408, 1052304960, 1022211200, + 966782848, 887476096, 786342208, 665974016, 529439200, 380201408, 222031488, 58911676, + -105065728, -265801808, -419294496, -561739072, -689623232, -799814720, -889638656, -956942720, + -1000149696, -1018294336, -1011044736, -978708096, -922219648, -843115968, -743493120, -625951040, + -493525056, -349607232, -197858608, -42115448, 113708584, 265721584, 410151424, 543440192, + 662332480, 763955904, 845890496, 906227200, 943612480, 957278400, 947058112, 913385664, + 857280704, 780318336, 684585088, 572622656, 447359776, 312035584, 170115056, 25199920, + -119063552, -259076960, -391380192, -512737632, -620217856, -711264960, -783759808, -836069184, + -867082944, -876236800, -863521472, -829477248, -775175296, -702184896, -612528832, -508627616, + -393234080, -269360256, -140198384, -9038325, 120816904, 246134720, 363834016, 471061440, + 565260864, 644234816, 706195520, 749805696, 774206528, 779033856, 764420928, 730989120, + 679825600, 612449984, 530770240, 437028800, 333741664, 223630656, 109551536, -5580210, + -118864264, -227488864, -328800992, -420371296, -500052800, -566030976, -616865088, -651519232, + -669382144, -670276608, -654456960, -622595968, -575760768, -515379648, -443199648, -361236896, + -271720576, -177032864, -79645232, 17945830, 113283088, 204010512, 287931712, 363063040, + 427680576, 480359328, 520004224, 545871936, 557583232, 555125952, 538848000, 509441632, + 467918976, 415579744, 353972064, 284847840, 210113616, 131778400, 51899980, -27469024, + -104333832, -176807568, -243157520, -301846336, -351567360, -391273184, -420196800, -437865024, + -444103968, -439036576, -423072480, -396890720, -361415584, -317786848, -267324960, -211492304, + -151851792, -90023688, -27642056, 33688092, 92431824, 147162464, 196595872, 239620272, + 275320544, 302996800, 322176864, 332622304, 334328064, 327516064, 312622880, 290282112, + 261301872, 226638432, 187366672, 144647984, 99697160, 53748436, 8022341, -36306296, + -78138080, -116475864, -150447968, -179327376, -202546304, -219706160, -230582416, -235124880, + -233452928, -225846496, -212732912, -194670144, -172327120, -146461568, -117896304, -87494416, + -56134348, -24685366, 6015840, 35186796, 62118600, 86192504, 106893400, 123819856, + 136690672, 145347696, 149755152, 149995552, 146262368, 138849824, 128140336, 114589888, + 98711832, 81059840, 62210316, 42744900, 23233612, 4218996, -13798199, -30371520, + -45119144, -57731856, -67978520, -75708944, -80854288, -83424880, -83505872, -81250776, + -76873240, -70637384, -62847076, -53834452, -43948188, -33541804, -22962404, -12540202, + -2579104, 6651381, 14922708, 22052188, 27906138, 32401252, 35504228, 37229756, + 37636996, 36824736, 34925464, 32098614, 28523208, 24390258, 19895138, 15230230, + 10578097, 6105390, 1957699, -1744518, -4908812, -7472372, -9402388, -10695210, + -11374340, -11487438, -11102430, -10302999, -9183557, -7844043, -6384651, -4900844, + -3478715, -2191066, -1094124, -225317, 398208, 779956, 943926, 936293, + 833844, 703157, 565034, 427621, 299915, 188242, 97070, 28671, + -16282, -38631, -40246, -23848, 7370, 49924, 100305, 155103, + 211184, 265743, 316398, 361188, 398601, 427542, 447320, 457596, + 458351, 449838, 432541, 407131, 374438, 335404, 291067, 242523, + 190911, 137380, 83081, 29131, -23391, -73477, -120193, -162709, + -200302, -232373, -258456, -278222, -291483, -298191, -298431, -292422, + -280496, -263099, -240767, -214119, -183837, -150654, -115335, -78667, + -41439, -4430, 31603, 65943, 97920, 126924, 152420, 173951, + 191152, 203753, 211586, 214590, 212809, 206390, 195581, 180724, + 162245, 140642, 116472, 90338, 62871, 34716, 6512, -21115, + -47577, -72327, -94874, -114790, -131717, -145374, -155554, -162130, + -165050, -164338, -160089, -152466, -141696, -128062, -111900, -93592, + -73557, -52247, -30134, -7706, 14546, 36139, 56604, 75501, + 92426, 107025, 118997, 128106, 134187, 137146, 136964, 133700, + 127480, 118502, 107020, 93345, 116040, 106373, 94004, 79158, + 62121, 43240, 22912, 1579, -20281, -42169, -63569, -83966, + -102856, -119760, -134234, -145882, -154369, -159426, -160859, -158557, + -152493, -142728, -129410, -112770, -93122, -70853, -46417, -20326, + 6860, 34548, 62118, 88942, 114393, 137861, 158767, 176575, + 190802, 201034, 206937, 208261, 204852, 196660, 183736, 166241, + 144442, 118709, 89511, 57407, 23039, -12886, -49603, -86311, + -122184, -156394, -188125, -216596, -241075, -260902, -275496, -284383, + -287194, -283688, -273753, -257415, -234835, -206316, -172290, -133320, + -90085, -43369, 5950, 56922, 108538, 159746, 209478, 256659, + 300236, 339190, 372562, 399462, 419103, 430808, 434043, 428427, + 413772, 390087, 357626, 316892, 268676, 214058, 154439, 91515, + 27295, -35962, -95765, -149503, -194502, -228208, -248287, -252875, + -240711, -211453, -165805, -105883, -35276, 40539, 114314, 176503, + 215759, 217978, 167946, 29216, -265669, -759935, -1454826, -2329191, + -3341857, -4434792, -5535889, -6563153, -7428902, -8044769, -8326572, -8199427, + -7602384, -6492797, -4849871, -2677498, -5997, 3107152, 6577829, 10296906, + 14133125, 17937022, 21545892, 24789544, 27496750, 29502072, 30652904, 30816402, + 29886096, 27787848, 24484978, 19982264, 14328683, 7618649, -8275, -8369346, + -17242212, -26370120, -35468600, -44233488, -52350068, -59503100, -65387360, -69718488, + -72243656, -72751784, -71082920, -67136432, -60877660, -52342804, -41641768, -28958772, + -14550630, 1257369, 18077938, 35470524, 52952152, 70010080, 86115976, 100741256, + 113373128, 123530864, 130781872, 134756976, 135164528, 131802696, 124569704, 113471440, + 98626208, 80266312, 58736392, 34488268, 8072537, -19873172, -48638900, -77459776, + -105535736, -132052984, -156206736, -177224544, -194389536, -207063008, -214705568, -216896176, + -213348592, -203924480, -188642880, -167685488, -141397504, -110283944, -75001352, -36344852, + 4768980, 47323316, 90225720, 132335712, 172494592, 209556688, 242421216, 270063936, + 291567712, 306150848, 313192864, 312256320, 303104480, 285713824, 260281152, 227224928, + 187180496, 140989248, 89681992, 34456540, -23349740, -82291968, -140853584, -197485040, + -250644464, -298839136, -340666720, -374855200, -400300192, -416098816, -421578912, -416322848, + -400184960, -373302304, -336098016, -289277056, -233814336, -170935472, -102090216, -28919474, + 46783608, 123117448, 198119696, 269817600, 336279616, 395667328, 446285568, 486630272, + 515431904, 531693952, 534724512, 524161024, 499986336, 462536352, 412498304, 350899776, + 279088736, 198704400, 111640296, 19999716, -73955136, -167859072, -259303504, -345898400, + -425334720, -495445856, -554266496, -600087168, -631503040, -647455744, -647266496, -630660352, + -597779904, -549188672, -485863232, -409174688, -320859648, -222981056, -117879984, -8119592, + 103577704, 214398032, 321507232, 422123680, 513590720, 593446784, 659491904, 709847616, + 743010112, 757894080, 753866240, 730767680, 688924608, 629145984, 552709376, 461334048, + 357142464, 242611072, 120511064, -6158985, -134247200, -260527344, -381780576, -494877952, + -596861632, -685022336, -756971776, -810707072, -844666432, -857773504, -849470528, -819737792, + -769099840, -698617600, -609866880, -504903104, -386213792, -256659104, -119402648, 22166518, + 164518080, 304069184, 437275360, 560721088, 671207872, 765837888, 842089984, 897887232, + 931653440, 942357376, 929543168, 893346752, 834496704, 754300416, 654615040, 537804480, + 406682912, 264446352, 114594352, -39157032, -192968032, -342971968, -485373120, -616543680, + -733116800, -832073664, -910822080, -967264896, -999856064, -1007642752, -990292800, -948106752, + -882013184, -793548800, -684822016, -558462848, -417558400, -265576992, -106281872, 56362708, + 218291040, 375438528, 523844608, 659753344, 779709440, 880646656, 959966976, 1015607872, + 1046096320, 1050588096, 1028890880, 981471296, 909444864, 814549696, 699104192, 565949568, + 418379808, 260058736, 94928648, -72889120, -239197984, -399832192, -550762240, -688196992, + -808680064, -909177600, -987155392, -1040643904, -1068288256, -1069383232, -1043891456, -992444800, + -916328960, -817451520, -698297344, -561877056, -411613792, -251225136, -84665176, 83959240, + 250492800, 410833184, 561032192, 697392512, 816558400, 915598016, 992075520, 1044110528, + 1070424512, 1070372096, 1043956672, 991830592, 915278784, 816187328, 696996800, 560642560, + 410482208, 250213232, 83781792, -84714288, -251126384, -411357152, -561461504, -697743552, + -816847808, -915841536, -992287296, -1044302592, -1070606528, -1070551232, -1044137856, -992016512, + -915470336, -816383744, -697196352, -560842560, -410679552, -250404528, -83963680, 84544936, + 250972336, 411220768, 561344576, 697647424, 816773248, 915788800, 992256192, 1044292480, + 1070616448, 1070579840, 1044183488, 992077376, 915544384, 816468800, 697290112, 560942720, + 410783712, 250510352, 84068912, -84442472, -250874656, -411129728, -561261824, -697574272, + -816710848, -915738048, -992217536, -1044266240, -1070602624, -1070578112, -1044193344, -992097920, + -915574656, -816507712, -697336256, -560994752, -410840192, -250569808, -84129840, 84381496, + 250815008, 411072672, 561208512, 697525760, 816667968, 915701504, 992187968, 1044243968, + 1070587840, 1070570944, 1044193664, 992105472, 915588992, 816528256, 697362432, 561025728, + 410875072, 250607648, 84169704, -84340632, -250774144, -411032768, -561170496, -697490560, + -816636288, -915674048, -992165248, -1044226432, -1070575744, -1070564352, -1044192576, -992109760, + -915598336, -816542272, -697380608, -561047424, -410899648, -250634432, -84197944, 84311648, + 250745136, 411004448, 561143488, 697465472, 816613632, 915654272, 992148736, 1044213504, + 1070566592, 1070559104, 1044191232, 992112320, 915604608, 816552064, 697393600, 561063296, + 410917984, 250654720, 84219640, -84289112, -250722352, -410981984, -561121984, -697445376, + -816595520, -915638656, -992135872, -1044203776, -1070560128, -1070556032, -1044191616, -992116032, + -915611456, -816561792, -697405888, -561077696, -410934112, -250672080, -84237752, 84270736, + 250704176, 410964480, 561105536, 697430400, 816582400, 915627520, 992127104, 1044197440, + 1070556416, 1070555008, 1044193216, 992120256, 915618176, 816570816, 697417024, 561090688, + 410948576, 250687680, 84254088 +}; + + /* clang-format on */ diff --git a/lib_com/ivas_rom_com_fx.h b/lib_com/ivas_rom_com_fx.h index 80f98bb35..26940e676 100644 --- a/lib_com/ivas_rom_com_fx.h +++ b/lib_com/ivas_rom_com_fx.h @@ -40,6 +40,8 @@ #include "stat_com.h" #include "ivas_stat_com.h" +#ifdef IVAS_FLOAT_FIXED + extern const Word16 ivas_sin_twiddle_480_fx[IVAS_480_PT_LEN >> 1]; extern const Word16 ivas_cos_twiddle_480_fx[IVAS_480_PT_LEN >> 1]; extern const Word16 ivas_sin_twiddle_320_fx[IVAS_320_PT_LEN >> 1]; @@ -81,10 +83,203 @@ extern const Word32 ls_elevation_CICP16_fx[9]; extern const Word32 ls_azimuth_CICP19_fx[11]; extern const Word32 ls_elevation_CICP19_fx[11]; extern const Word16 pow_10_q11[128]; -#ifdef IVAS_FLOAT_FIXED extern const Word32 pow_10_q23[14]; -#endif extern const Word16 ivas_sin_az_fx[361]; extern const Word16 ivas_sine_panning_tbl_fx[601]; extern const Word16 ivas_tan_panning_gain_dirac_tbl_fx[601]; + +/*----------------------------------------------------------------------------------* + * Stereo ICA ROM tables + *----------------------------------------------------------------------------------*/ + +extern const Word32 ica_sincInterp2_fx[]; + +/*----------------------------------------------------------------------------------* + * Stereo IC-BWE ROM tables + *----------------------------------------------------------------------------------*/ + +extern const Word16 pow_10_icbwe_gsMapping_tbl_fx[]; +extern const Word16 pow_10_icbwe_gsMappingDFT_tbl_fx[]; + +/*----------------------------------------------------------------------------------* + * TD Stereo ROM tables + *----------------------------------------------------------------------------------*/ + +extern const UWord32 tdm_ratio_tabl_fx[TDM_NQ + 1]; +extern const UWord32 tdm_den_ratio_tabl_fx[]; + +/* LSFs Intra-frame prediction tables */ +extern const Word16 tdm_LSF_MEAN_RE_USE_OUT_fx[M]; +extern const Word16 tdm_LSF_MEAN_RE_USE_IN_fx[M]; +extern const Word16 tdm_LSF_MEAN_RE_USE_fx[M]; + +extern const Word16 tdm_Beta_Q1bit_re_use_13k2_fx[2]; +extern const Word16 tdm_Beta_Q1bit_re_use_16k4_fx[2]; +extern const Word16 tdm_Beta_Q1bit_re_use_24k4_32k_fx[2]; +extern const Word16 tdm_Beta_Q1bit_re_use_48k_fx[2]; + +extern const Word16 tdm_RE_USE_adaptive_beta_prd_diag_3_fx[15 + 16 + 15]; + +extern const Word16 tdm_LSF_MEAN_PRED_QNT_OUT_fx[M]; +extern const Word16 tdm_LSF_MEAN_PRED_QNT_IN_fx[M]; +extern const Word16 tdm_LSF_MEAN_PRED_QNT_fx[M]; +extern const Word16 tdm_PRED_QNT_fixed_beta_prd_diag_3_fx[15 + 16 + 15]; + +/*----------------------------------------------------------------------------------* + * Stereo DTX ROM tables + *----------------------------------------------------------------------------------*/ + +extern const Word16 dft_cng_alpha_bits_fx[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_COH_ALPHA_LEVELS]; +extern const Word16 dft_cng_coh_pred_fx[][STEREO_DFT_COH_PRED_COEFFS]; + +/*----------------------------------------------------------------------------------* + * DirAC ROM tables + *----------------------------------------------------------------------------------*/ + +extern const Word32 diffuseness_reconstructions_fx[DIRAC_DIFFUSE_LEVELS]; +extern const Word32 diffuseness_thresholds_fx[DIRAC_DIFFUSE_LEVELS + 1]; +extern const Masa_Diffuseness_Ratios masa_diffuse_ratios[DIRAC_DIFFUSE_LEVELS][DIRAC_DIFFUSE_LEVELS]; + +/*------------------------------------------------------------------------------------------* + * SPAR ROM tables + *------------------------------------------------------------------------------------------*/ + +extern const Word32 dtx_pd_real_min_max_fx[2]; +extern const Word32 one_by_q_level[64]; + +/*----------------------------------------------------------------------------------* + * Parametric MC ROM tables + *----------------------------------------------------------------------------------*/ + +extern const Word16 ivas_param_mc_quant_ild_5d1_48_fx[PARAM_MC_SZ_ILD_QUANTIZER_4BITS]; +extern const Word16 ivas_param_mc_quant_icc_fx[PARAM_MC_SZ_ICC_QUANTIZER]; + +/*----------------------------------------------------------------------------------* + * MASA ROM tables + *----------------------------------------------------------------------------------*/ + +extern const Word32 no_phi_masa_inv_fx[NO_SPHERICAL_GRIDS][MAX_NO_THETA]; +extern const Word32 azimuth_cb_fx[8]; +extern const Word32 delta_theta_masa_fx[NO_SPHERICAL_GRIDS - 2]; +extern const Word32 coherence_cb0_masa_fx[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH]; +extern const Word32 coherence_cb1_masa_fx[MASA_NO_CV_COH1 * MASA_MAXIMUM_CODING_SUBBANDS]; /* 25 */ + +/* Multi-channel input and output setups */ +extern const Word16 ls_azimuth_CICP2_idx[2]; +extern const Word16 ls_elevation_CICP2_idx[2]; +extern const Word16 ls_azimuth_CICP6_idx[5]; +extern const Word16 ls_elevation_CICP6_idx[5]; +extern const Word16 ls_azimuth_CICP12_idx[7]; +extern const Word16 ls_elevation_CICP12_idx[7]; +extern const Word16 ls_azimuth_CICP14_idx[7]; +extern const Word16 ls_elevation_CICP14_idx[7]; +extern const Word16 ls_azimuth_CICP16_idx[9]; +extern const Word16 ls_elevation_CICP16_idx[9]; +extern const Word16 ls_azimuth_CICP19_idx[11]; +extern const Word16 ls_elevation_CICP19_idx[11]; + +extern const Word32 shoebox_sin_cos_tbl_fx[11][2]; + +extern const Word32 delta_phi_val[90]; +extern const Word32 inv_delta_phi_val[90]; +extern const Word32 dd_val[90]; +extern const Word32 cb_azi_chan_fx[]; + +/*----------------------------------------------------------------------------------* + * MASA and ISM (OMASA) combined format ROM tables + *----------------------------------------------------------------------------------*/ + +extern const Word32 dct4_fx[]; +extern const Word32 dct5_fx[]; +extern const Word32 dct8_fx[]; +extern const Word32 dct12_fx[]; + +/*----------------------------------------------------------------------------------* + * ISM ROM tables + *----------------------------------------------------------------------------------*/ + +extern const Word32 ism_azimuth_borders_fx[4]; +extern const Word32 ism_elevation_borders_fx[4]; + +/*----------------------------------------------------------------------------------* + * LFE coding ROM tables + *----------------------------------------------------------------------------------*/ + +extern const Word32 ivas_lpf_4_butter_16k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; +extern const Word32 ivas_lpf_4_butter_32k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; +extern const Word32 ivas_lpf_4_butter_48k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; +extern const Word32 ivas_lpf_2_butter_16k_fx[IVAS_BIQUAD_FILT_LEN << 1]; +extern const Word32 ivas_lpf_2_butter_32k_fx[IVAS_BIQUAD_FILT_LEN << 1]; +extern const Word32 ivas_lpf_2_butter_48k_fx[IVAS_BIQUAD_FILT_LEN << 1]; + +extern const Word32 ivas_lfe_window_coeff_48k_fx[IVAS_LFE_FADE_LEN_48K]; +extern const Word32 ivas_lfe_window_coeff_32k_fx[IVAS_LFE_FADE_LEN_32K]; +extern const Word32 ivas_lfe_window_coeff_16k_fx[IVAS_LFE_FADE_LEN_16K]; + +extern const UWord32 d_hamm_lfe_plc_fx[LFE_PLC_LENANA / 2]; + +/*------------------------------------------------------------------------------------------* + * MDFT/iMDFT ROM tables + *------------------------------------------------------------------------------------------*/ + +extern const Word32 ivas_mdft_coeff_cos_twid_240_fx[IVAS_240_PT_LEN + 1]; +extern const Word32 ivas_mdft_coeff_cos_twid_160_fx[IVAS_160_PT_LEN + 1]; +extern const Word32 ivas_mdft_coeff_cos_twid_120_fx[IVAS_120_PT_LEN + 1]; +extern const Word32 ivas_mdft_coeff_cos_twid_80_fx[IVAS_80_PT_LEN + 1]; +extern const Word32 ivas_mdft_coeff_cos_twid_40_fx[IVAS_40_PT_LEN + 1]; +extern const Word32 ivas_mdft_coeff_cos_twid_960_fx[IVAS_960_PT_LEN + 1]; +extern const Word32 ivas_mdft_coeff_cos_twid_640_fx[IVAS_640_PT_LEN + 1]; +extern const Word32 ivas_mdft_coeff_cos_twid_320_fx[IVAS_320_PT_LEN + 1]; +extern const Word32 dirac_gains_norm_term_int[9]; +extern const Word32 dirac_gains_norm_term_fx[9]; +extern const Word32 dirac_gains_Pnm_int[91][9]; +extern const Word32 dirac_gains_trg_term_int[181][2]; +extern const Word32 dirac_gains_trg_term_fx[181][2]; + +/*------------------------------------------------------------------------------------------* + * FB ROM tables + *------------------------------------------------------------------------------------------*/ + +extern const Word16 ivas_fb_cf_4ms_48k_fx[IVAS_FB_4MS_48K_SAMP]; +extern const Word16 ivas_fb_cf_1ms_48k_fx[IVAS_FB_1MS_48K_SAMP]; +extern const Word16 ivas_fb_cf_4ms_32k_fx[IVAS_FB_4MS_32K_SAMP]; +extern const Word16 ivas_fb_cf_1ms_32k_fx[IVAS_FB_1MS_32K_SAMP]; +extern const Word16 ivas_fb_cf_4ms_16k_fx[IVAS_FB_4MS_16K_SAMP]; +extern const Word16 ivas_fb_cf_1ms_16k_fx[IVAS_FB_1MS_16K_SAMP]; + +extern const Word32 ivas_fb_resp_cheby_ramp_32del_fx[IVAS_FB_1MS_32K_SAMP + 1]; +extern const Word32 ivas_fb_resp_cheby_ramp_16del_fx[IVAS_FB_1MS_16K_SAMP + 1]; + +/*------------------------------------------------------------------------------------------* + * SNS MSVQ codebooks and means + *------------------------------------------------------------------------------------------*/ + +extern const Word16 *const ivas_sns_cdbks_tcx20_fx[]; +extern const Word16 *const ivas_sns_cdbks_tcx10_fx[]; + +extern const Word16 *const ivas_sns_cdbks_side_tcx20_fx[]; +extern const Word16 *const ivas_sns_cdbks_side_tcx10_fx[]; + +/*----------------------------------------------------------------------* + * MC ParamUpmix ROM tables + *-----------------------------------------------------------------------*/ + +extern const ACPL_QUANT_TABLE_FX ivas_mc_paramupmix_alpha_quant_table_fx; +extern const ACPL_QUANT_TABLE_FX ivas_mc_paramupmix_beta_quant_table_fx[9]; + +extern const Word32 ivas_han_win_48k_fx[L_FRAME32k]; +extern const Word32 ivas_han_win_32k_fx[L_FRAME32k]; +extern const Word32 ivas_han_win_16k_fx[L_FRAME32k]; + +extern const Word32 ivas_sine_delay_32_fx[32]; + +extern const Word32 ivas_sine_frame_len_640_del_32_fx[577]; +extern const Word32 ivas_sine_frame_len_640_del_16_fx[289]; + +extern const Word32 ivas_fb_fr_12band_1ms_re_fx[IVAS_FB_12_1MS_LEN]; +extern const Word32 ivas_fb_fr_12band_1ms_im_fx[IVAS_FB_12_1MS_LEN]; + +#endif + + #endif diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index 23096223f..c5860c1c8 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -127,15 +127,15 @@ void ivas_sba_config_fx( ) { test(); - IF( ( LT_16( sba_order, 0 ) ) && ( LT_16( nb_channels, 0 ) ) ) + IF( sba_order < 0 && nb_channels < 0 ) { assert( 0 && "Either order or number of channels must be positive" ); } - ELSE IF( LT_16( sba_order, 0 ) ) + ELSE IF( sba_order < 0 ) { sba_order = ivas_sba_get_order_fx( nb_channels, sba_planar ); } - ELSE IF( LT_16( nb_channels, 0 ) ) + ELSE IF( nb_channels < 0 ) { nb_channels = ivas_sba_get_nchan_fx( sba_order, sba_planar ); } @@ -154,9 +154,12 @@ void ivas_sba_config_fx( IF( nchan_transport != NULL ) { *nchan_transport = ivas_get_sba_num_TCs_fx( sba_total_brate, sba_order ); + move16(); } /* Configure core coder number of elements*/ + test(); + test(); IF( nchan_transport != NULL && nSCE != NULL && nCPE != NULL ) { IF( EQ_16( *nchan_transport, 1 ) ) @@ -227,6 +230,22 @@ Word16 ivas_sba_get_order_fx( /* sba_order = (int16_t) sqrtf( (float) nb_channels ) - 1 */ Word16 sba_order_non_sba_planar[MAX_INPUT_CHANNELS] = { 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3 }; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); IF( sba_planar ) { diff --git a/lib_com/ivas_sns_com_fx.c b/lib_com/ivas_sns_com_fx.c index 12f546ef3..d053e957f 100644 --- a/lib_com/ivas_sns_com_fx.c +++ b/lib_com/ivas_sns_com_fx.c @@ -58,21 +58,29 @@ void sns_compute_scf_fx( Word32 *scf, Word16 q ) { - Word16 i, n, k; + Word16 i, n, k, exp; Word32 x[FDNS_NPTS], xs[FDNS_NPTS], mean, xl4[SNS_NPTS], nf, xl[FDNS_NPTS]; Word64 sum; Word32 L_tmp; const Word16 *pow_tilt; const UWord8 nBands = pPsychParams->nBands; + move16(); const UWord8 *bandLengths = pPsychParams->bandLengths; Word8 bw = 0; + move16(); const Word16 w_0 = 2730; // (1.0f / 12.0f) in Q15 + move16(); const Word16 w_1 = 5461; // (2.0f / 12.0f) in Q15 + move16(); const Word16 w_2 = 8192; // 0.25f ( 3.0f / 12.0f ) in Q15 + move16(); const Word16 w_3 = w_2; + move16(); const Word16 w_4 = w_1; + move16(); const Word16 w_5 = w_0; + move16(); assert( nBands == FDNS_NPTS ); @@ -81,42 +89,62 @@ void sns_compute_scf_fx( IF( bandLengths == NULL ) { bw = (Word8) shr( L_frame, 6 ); + move16(); /* Energy per band */ k = 0; + move16(); FOR( i = 0; i < nBands; ++i ) { x[i] = 0; + move32(); FOR( n = 0; n < bw; ( ++n, ++k ) ) { x[i] = L_add_sat( x[i], spectrum[k] ); + move32(); } - x[i] /= bw; + exp = 15; + move16(); + Word16 inv_bw = Invert16( bw, &exp ); + inv_bw = shl( inv_bw, exp ); + x[i] = Mpy_32_16_1( x[i], inv_bw ); + move32(); } } ELSE { /* Energy per band */ k = 0; + move32(); FOR( i = 0; i < nBands; ++i ) { x[i] = 0; + move32(); FOR( n = 0; n < bandLengths[i]; ( ++n, ++k ) ) { x[i] = L_add_sat( x[i], spectrum[k] ); + move32(); } - x[i] /= bandLengths[i]; + exp = 15; + move16(); + Word16 inv_bw = Invert16( bandLengths[i], &exp ); + inv_bw = shl( inv_bw, exp ); + x[i] = Mpy_32_16_1( x[i], inv_bw ); + move32(); } } /* Smoothing */ xs[0] = L_add( Mpy_32_16_1( x[0], 24576 /* 0.75 in Q15 */ ), Mpy_32_16_1( x[1], 8192 /* 0.25 in Q15 */ ) ); + move32(); FOR( i = 1; i < FDNS_NPTS - 1; i++ ) { xs[i] = L_add( L_add( Mpy_32_16_1( x[i], 16384 /* 0.5 in Q15 */ ), Mpy_32_16_1( x[i - 1], 8192 /* 0.25 in Q15 */ ) ), Mpy_32_16_1( x[i + 1], 8192 /* 0.25 in Q15 */ ) ); + move32(); } xs[FDNS_NPTS - 1] = L_add( Mpy_32_16_1( x[FDNS_NPTS - 1], 24576 /* 0.75 in Q15 */ ), Mpy_32_16_1( x[FDNS_NPTS - 2], 8192 /* 0.25 in Q15 */ ) ); + move32(); /* Pre-emphasis */ SWITCH( L_frame ) @@ -138,16 +166,20 @@ void sns_compute_scf_fx( FOR( i = 0; i < FDNS_NPTS; i++ ) { xs[i] = Mpy_32_16_1( xs[i], pow_tilt[i] ); + move32(); xs[i] = L_shl( xs[i], Q4 ); // xs => Q8 + move32(); } /* Noise floor at -40dB */ sum = 0; - for ( Word16 ind = 0; ind < FDNS_NPTS; ind++ ) + move64(); + FOR( Word16 ind = 0; ind < FDNS_NPTS; ind++ ) { - sum += (Word64) xs[ind]; + sum = W_add( sum, (Word64) xs[ind] ); } - mean = (Word32) ( sum >> 6 ); + mean = (Word32) W_shr( sum, 6 ); + move32(); nf = Mpy_32_16_1( mean, 3 ); // 3 => powf( 10.0f, -4.0f ) in Q15 nf = L_max( nf, 0 ); // 0 => powf( 2.0f, -32.0f ) in Q15 @@ -158,6 +190,7 @@ void sns_compute_scf_fx( if ( LT_32( xs[i], nf ) ) { xs[i] = nf; + move32(); } } @@ -169,6 +202,7 @@ void sns_compute_scf_fx( e_tmp = sub( sub( 30, e_tmp ), q ); /* Note: Mpy_32_16 is used temporarily for this computation, It needs to be replaced with appropriate BASOP. */ xl[i] = Mpy_32_16( e_tmp, f_tmp, 16384 ); /* Q16 */ + move32(); } /* Downsampling */ @@ -180,10 +214,11 @@ void sns_compute_scf_fx( L_tmp = Madd_32_16( L_tmp, xl[3], w_4 ); L_tmp = Madd_32_16( L_tmp, xl[4], w_5 ); xl4[0] = L_tmp; + move32(); FOR( n = 1; n < SNS_NPTS - 1; n++ ) { - int16_t n4 = 4 * n; + Word16 n4 = shl( n, 2 ); L_tmp = L_deposit_l( 0 ); L_tmp = Madd_32_16( L_tmp, xl[n4 - 1], w_0 ); @@ -193,6 +228,7 @@ void sns_compute_scf_fx( L_tmp = Madd_32_16( L_tmp, xl[n4 + 3], w_4 ); L_tmp = Madd_32_16( L_tmp, xl[n4 + 4], w_5 ); xl4[n] = L_tmp; + move32(); } L_tmp = L_deposit_l( 0 ); @@ -206,15 +242,17 @@ void sns_compute_scf_fx( /* Remove mean and scaling */ sum = 0; - for ( Word16 ind = 0; ind < SNS_NPTS; ind++ ) + move64(); + FOR( Word16 ind = 0; ind < SNS_NPTS; ind++ ) { - sum += (Word64) xl4[ind]; + sum = W_add( sum, (Word64) xl4[ind] ); } - mean = (Word32) ( sum >> 4 ); + mean = (Word32) W_shr( sum, 4 ); FOR( i = 0; i < SNS_NPTS; i++ ) { scf[i] = Mpy_32_16_1( L_sub( xl4[i], mean ), 27853 /* 0.85 in in Q15 */ ); + move32(); } return; @@ -242,10 +280,10 @@ void sns_interpolate_scalefactors_fx( FOR( n = 0; n <= M - 2; n++ ) { - scf_int[n * 4 + 2] = L_add( scf[n], Mpy_32_16_1( L_sub( scf[n + 1], scf[n] ), 4096 ) ); /* 4096 -> 1/8 in Q15 */ - scf_int[n * 4 + 3] = L_add( scf[n], Mpy_32_16_1( L_sub( scf[n + 1], scf[n] ), 12288 ) ); /* 12288 -> 3/8 in Q15 */ - scf_int[n * 4 + 4] = L_add( scf[n], Mpy_32_16_1( L_sub( scf[n + 1], scf[n] ), 20480 ) ); /* 20480 -> 5/8 in Q15 */ - scf_int[n * 4 + 5] = L_add( scf[n], Mpy_32_16_1( L_sub( scf[n + 1], scf[n] ), 28672 ) ); /* 28672 -> 7/8 in Q15 */ + scf_int[add( n * 4, 2 )] = L_add( scf[n], Mpy_32_16_1( L_sub( scf[n + 1], scf[n] ), 4096 ) ); /* 4096 -> 1/8 in Q15 */ + scf_int[add( n * 4, 3 )] = L_add( scf[n], Mpy_32_16_1( L_sub( scf[n + 1], scf[n] ), 12288 ) ); /* 12288 -> 3/8 in Q15 */ + scf_int[add( n * 4, 4 )] = L_add( scf[n], Mpy_32_16_1( L_sub( scf[n + 1], scf[n] ), 20480 ) ); /* 20480 -> 5/8 in Q15 */ + scf_int[add( n * 4, 5 )] = L_add( scf[n], Mpy_32_16_1( L_sub( scf[n + 1], scf[n] ), 28672 ) ); /* 28672 -> 7/8 in Q15 */ } scf_int[FDNS_NPTS - 2] = L_add( scf[M - 1], Mpy_32_16_1( L_sub( scf[M - 1], scf[M - 2] ), 4096 ) ); @@ -257,6 +295,7 @@ void sns_interpolate_scalefactors_fx( FOR( n = 0; n < FDNS_NPTS; n++ ) { scf_int[n] = L_negate( scf_int[n] ); + move32(); } } @@ -266,6 +305,7 @@ void sns_interpolate_scalefactors_fx( L_tmp = BASOP_util_Pow2( scf_int[n], Q15, &exp ); exp = sub( 15, exp ); scf_int[n] = L_shr( L_tmp, exp ); + move32(); } return; @@ -288,77 +328,98 @@ void sns_shape_spectrum_fx( Word16 *length ) { Word16 i, n, k, tmp_k, bw, q_tmp = 0, shift, min_shift = 63; + move16(); + move16(); Word64 L64_tmp[L_FRAME48k]; const UWord8 nBands = pPsychParams->nBands; + move16(); const UWord8 *bandLengths = pPsychParams->bandLengths; IF( bandLengths == NULL ) { - bw = L_frame / nBands; + bw = divide3216( shl( L_frame, 1 ), nBands ); /* Shape spectrum */ k = 0; + move16(); FOR( i = 0; i < nBands; ++i ) { FOR( n = 0; n < bw; ( ++n, ++k ) ) { L64_tmp[k] = W_mult_32_32( spectrum[k], scf_int[i] ); // Q = q_spectrum + q_scf_int + 1 + move64(); shift = W_norm( L64_tmp[k] ); IF( LT_16( shift, min_shift ) ) { min_shift = shift; + move16(); } } } tmp_k = k; + move16(); if ( length != NULL ) { *length = k; + move16(); } q_tmp = sub( add( add( *q_spectrum, q_scf_int ), min_shift ), 32 ); - IF( GT_16( q_tmp, 30 ) ) + if ( GT_16( q_tmp, 30 ) ) { q_tmp = 30; + move16(); } FOR( k = 0; k < tmp_k; k++ ) { L64_tmp[k] = W_shr( L64_tmp[k], sub( add( *q_spectrum, q_scf_int ), q_tmp ) ); + move64(); spectrum[k] = W_sat_l( L64_tmp[k] ); // Q = q_tmp + move64(); } *q_spectrum = q_tmp; + move16(); } ELSE { /* Shape spectrum */ k = 0; + move16(); FOR( i = 0; i < nBands; ++i ) { FOR( n = 0; n < bandLengths[i]; ( ++n, ++k ) ) { L64_tmp[k] = W_mult_32_32( spectrum[k], scf_int[i] ); // Q = q_spectrum + q_scf_int + 1 + move64(); shift = W_norm( L64_tmp[k] ); IF( LT_16( shift, min_shift ) && NE_64( L64_tmp[k], 0 ) ) { min_shift = shift; + move16(); } } } tmp_k = k; + move16(); if ( length != NULL ) { *length = k; + move16(); } q_tmp = sub( add( add( *q_spectrum, q_scf_int ), min_shift ), 32 ); - IF( GT_16( q_tmp, 30 ) ) + if ( GT_16( q_tmp, 30 ) ) { q_tmp = 30; + move16(); } FOR( k = 0; k < tmp_k; k++ ) { L64_tmp[k] = W_shr( L64_tmp[k], sub( add( *q_spectrum, q_scf_int ), q_tmp ) ); + move64(); spectrum[k] = W_sat_l( L64_tmp[k] ); // Q = q_tmp + move64(); } *q_spectrum = q_tmp; + move16(); } return; diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 0b4639a3e..36938507a 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -49,6 +49,9 @@ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*------------------------------------------------------------------------------------------* diff --git a/lib_com/ivas_spar_com_quant_util.c b/lib_com/ivas_spar_com_quant_util.c index 859f1ee24..667d21b7f 100644 --- a/lib_com/ivas_spar_com_quant_util.c +++ b/lib_com/ivas_spar_com_quant_util.c @@ -41,6 +41,9 @@ #include #include "wmc_auto.h" #include "prot_fx1.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*-----------------------------------------------------------------------------------------* @@ -91,44 +94,50 @@ void ivas_quantise_real_values( void ivas_quantise_real_values_fx( const Word32 *values_fx, - const int16_t q_levels, + const Word16 q_levels, const Word32 min_value_fx, const Word32 max_value_fx, - int16_t *index, + Word16 *index, Word32 *quant_fx, - const int16_t dim ) + const Word16 dim ) { - int16_t i; + Word16 i; Word32 q_step_fx, one_by_q_step_fx; - if ( q_levels == 1 ) + test(); + IF( EQ_16( q_levels, 1 ) ) { - for ( i = 0; i < dim; i++ ) + FOR( i = 0; i < dim; i++ ) { quant_fx[i] = 0; + move32(); index[i] = 0; + move16(); } } - else if ( q_levels && max_value_fx != min_value_fx ) + ELSE IF( q_levels && NE_32( max_value_fx, min_value_fx ) ) { - Word16 nor_q_level = norm_l( q_levels - 1 ); - Word32 one_by_q_levels = divide3232( L_shl( 1, ( nor_q_level ) ), L_shl( ( q_levels - 1 ), ( nor_q_level ) ) ); + Word16 nor_q_level = norm_l( sub( q_levels, 1 ) ); + Word32 one_by_q_levels = divide3232( L_shl( 1, ( nor_q_level ) ), L_shl( sub( q_levels, 1 ), ( nor_q_level ) ) ); one_by_q_levels = L_shl( one_by_q_levels, 16 ); - q_step_fx = Mpy_32_32( ( max_value_fx - min_value_fx ), one_by_q_levels ); - Word32 one_by_max_min = divide3232( ONE_IN_Q28, L_sub( max_value_fx, min_value_fx ) ); - one_by_q_step_fx = ( q_levels - 1 ) * one_by_max_min; + q_step_fx = Mpy_32_32( L_sub( max_value_fx, min_value_fx ), one_by_q_levels ); + Word16 one_by_max_min = divide3232( ONE_IN_Q28, L_sub( max_value_fx, min_value_fx ) ); + one_by_q_step_fx = L_mult0( sub( q_levels, 1 ), one_by_max_min ); Word32 val_fx; - for ( i = 0; i < dim; i++ ) + FOR( i = 0; i < dim; i++ ) { - val_fx = max( min_value_fx, min( values_fx[i], max_value_fx ) ); - index[i] = (int16_t) L_shr( Mpy_32_32( one_by_q_step_fx, val_fx ), 12 ); - quant_fx[i] = index[i] * q_step_fx; + val_fx = L_max( min_value_fx, L_min( values_fx[i], max_value_fx ) ); + index[i] = extract_l( L_shr( Mpy_32_32( one_by_q_step_fx, val_fx ), 12 ) ); + move16(); + quant_fx[i] = imult3216( q_step_fx, index[i] ); + move16(); } } - else + ELSE { - for ( i = 0; i < dim; i++ ) + FOR( i = 0; i < dim; i++ ) { quant_fx[i] = values_fx[i]; + move32(); } } return; @@ -242,13 +251,13 @@ void ivas_spar_get_uniform_quant_strat_fx( Pc_q_lvl = ivas_spar_br_table_consts[table_idx].q_lvls[i][3]; move16(); - if ( active_w ) + IF( active_w ) { pSpar_md_com_cfg->quant_strat[i].PR.q_levels[0] = PQ_q_lvl; move16(); pSpar_md_com_cfg->quant_strat[i].PR.q_levels[1] = PQ_q_lvl; move16(); - pSpar_md_com_cfg->quant_strat[i].PR.min_fx = L_negate( 322122547 ); // -1.2*Q28 + pSpar_md_com_cfg->quant_strat[i].PR.min_fx = -322122547; // -1.2*Q28 move32(); pSpar_md_com_cfg->quant_strat[i].PR.max_fx = 322122547; // 1.2*Q28 move32(); @@ -257,7 +266,7 @@ void ivas_spar_get_uniform_quant_strat_fx( move16(); pSpar_md_com_cfg->quant_strat[i].C.q_levels[1] = C_q_lvl; move16(); - pSpar_md_com_cfg->quant_strat[i].C.min_fx = L_negate( 214748364 ); //-.8*Q28 + pSpar_md_com_cfg->quant_strat[i].C.min_fx = -214748364; //-.8*Q28 move32(); pSpar_md_com_cfg->quant_strat[i].C.max_fx = 214748364; //.8*Q28 move32(); @@ -275,12 +284,12 @@ void ivas_spar_get_uniform_quant_strat_fx( move16(); pSpar_md_com_cfg->quant_strat[i].P_c.q_levels[1] = Pc_q_lvl; move16(); - pSpar_md_com_cfg->quant_strat[i].P_c.min_fx = L_negate( 214748364 ); //-.8*Q28 + pSpar_md_com_cfg->quant_strat[i].P_c.min_fx = -214748364; //-.8*Q28 move32(); pSpar_md_com_cfg->quant_strat[i].P_c.max_fx = 214748364; //.8*Q28 move32(); } - else + ELSE { pSpar_md_com_cfg->quant_strat[i].PR.q_levels[0] = PQ_q_lvl; move16(); @@ -288,7 +297,7 @@ void ivas_spar_get_uniform_quant_strat_fx( move16(); pSpar_md_com_cfg->quant_strat[i].PR.max_fx = ONE_IN_Q28; // Q28 move32(); - pSpar_md_com_cfg->quant_strat[i].PR.min_fx = L_negate( ONE_IN_Q28 ); // Q28 + pSpar_md_com_cfg->quant_strat[i].PR.min_fx = -ONE_IN_Q28; // Q28 move32(); pSpar_md_com_cfg->quant_strat[i].C.q_levels[0] = C_q_lvl; @@ -297,7 +306,7 @@ void ivas_spar_get_uniform_quant_strat_fx( move16(); pSpar_md_com_cfg->quant_strat[i].C.max_fx = ONE_IN_Q29; // Q28 move32(); - pSpar_md_com_cfg->quant_strat[i].C.min_fx = L_negate( ONE_IN_Q29 ); // Q28 + pSpar_md_com_cfg->quant_strat[i].C.min_fx = -ONE_IN_Q29; // Q28 move32(); pSpar_md_com_cfg->quant_strat[i].P_r.q_levels[0] = Pr_q_lvl; @@ -315,7 +324,7 @@ void ivas_spar_get_uniform_quant_strat_fx( move16(); pSpar_md_com_cfg->quant_strat[i].P_c.max_fx = ONE_IN_Q27; // Q28 move32(); - pSpar_md_com_cfg->quant_strat[i].P_c.min_fx = L_negate( ONE_IN_Q27 ); // Q28 + pSpar_md_com_cfg->quant_strat[i].P_c.min_fx = -ONE_IN_Q27; // Q28 move32(); } } @@ -334,58 +343,61 @@ void ivas_spar_get_uniform_quant_strat_fx( void ivas_map_prior_coeffs_quant( ivas_spar_md_prev_t *pSpar_md_prior, ivas_spar_md_com_cfg *pSpar_md_cfg, - const int16_t qsi, - const int16_t nB ) + const Word16 qsi, + const Word16 nB ) { - int16_t i, j; + Word16 i, j; - if ( qsi != pSpar_md_cfg->prev_quant_idx ) + IF( NE_16( qsi, pSpar_md_cfg->prev_quant_idx ) ) { ivas_quant_strat_t qs = pSpar_md_cfg->quant_strat[qsi]; ivas_quant_strat_t prev_qs = pSpar_md_cfg->quant_strat[pSpar_md_cfg->prev_quant_idx]; - // float one_by_q_lvl_PR = 1.0f / max( prev_qs.PR.q_levels[0] - 1, 1 ); - Word32 one_by_q_lvl_PR_fx = one_by_q_level[max( prev_qs.PR.q_levels[0] - 1, 1 )]; - // float one_by_q_lvl_C = 1.0f / max( prev_qs.C.q_levels[0] - 1, 1 ); - Word32 one_by_q_lvl_C_fx = one_by_q_level[max( prev_qs.C.q_levels[0] - 1, 1 )]; - // float one_by_q_lvl_P_r = 1.0f / max( prev_qs.P_r.q_levels[0] - 1, 1 ); - Word32 one_by_q_lvl_P_r_fx = one_by_q_level[max( prev_qs.P_r.q_levels[0] - 1, 1 )]; - for ( i = 0; i < nB; i++ ) + Word32 one_by_q_lvl_PR_fx = one_by_q_level[s_max( sub( prev_qs.PR.q_levels[0], 1 ), 1 )]; + move32(); + Word32 one_by_q_lvl_C_fx = one_by_q_level[s_max( sub( prev_qs.C.q_levels[0], 1 ), 1 )]; + move32(); + Word32 one_by_q_lvl_P_r_fx = one_by_q_level[s_max( sub( prev_qs.P_r.q_levels[0], 1 ), 1 )]; + move32(); + FOR( i = 0; i < nB; i++ ) { - for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) { - Word32 trial1 = ( qs.PR.q_levels[0] - 1 ) * pSpar_md_prior->band_coeffs_idx[i].pred_index_re[j]; - trial1 = trial1 << 16; + Word32 trial1 = L_mult0( sub( qs.PR.q_levels[0], 1 ), pSpar_md_prior->band_coeffs_idx[i].pred_index_re[j] ); + trial1 = L_shl( trial1, 16 ); trial1 = round_fx( Mpy_32_32( trial1, one_by_q_lvl_PR_fx ) ); - // pSpar_md_prior->band_coeffs_idx_mapped[i].pred_index_re[j] = (int16_t) round( ( qs.PR.q_levels[0] - 1 ) * pSpar_md_prior->band_coeffs_idx[i].pred_index_re[j] * one_by_q_lvl_PR ); pSpar_md_prior->band_coeffs_idx_mapped[i].pred_index_re[j] = extract_l( trial1 ); - Word32 trial2 = ( qs.P_r.q_levels[0] - 1 ) * pSpar_md_prior->band_coeffs_idx[i].decd_index_re[j]; - trial2 = trial2 << 16; + move16(); + Word32 trial2 = L_mult0( sub( qs.P_r.q_levels[0], 1 ), pSpar_md_prior->band_coeffs_idx[i].decd_index_re[j] ); + trial2 = L_shl( trial2, 16 ); trial2 = round_fx( Mpy_32_32( trial2, one_by_q_lvl_P_r_fx ) ); - // pSpar_md_prior->band_coeffs_idx_mapped[i].decd_index_re[j] = (int16_t) round( ( qs.P_r.q_levels[0] - 1 ) * pSpar_md_prior->band_coeffs_idx[i].decd_index_re[j] * one_by_q_lvl_P_r ); pSpar_md_prior->band_coeffs_idx_mapped[i].decd_index_re[j] = extract_l( trial2 ); + move16(); } - for ( j = 0; j < IVAS_SPAR_MAX_C_COEFF; j++ ) + FOR( j = 0; j < IVAS_SPAR_MAX_C_COEFF; j++ ) { - Word32 trial1 = ( qs.C.q_levels[0] - 1 ) * pSpar_md_prior->band_coeffs_idx[i].drct_index_re[j]; - trial1 = trial1 << 16; + Word32 trial1 = L_mult0( sub( qs.C.q_levels[0], 1 ), pSpar_md_prior->band_coeffs_idx[i].drct_index_re[j] ); + trial1 = L_shl( trial1, 16 ); trial1 = round_fx( Mpy_32_32( trial1, one_by_q_lvl_C_fx ) ); - // pSpar_md_prior->band_coeffs_idx_mapped[i].drct_index_re[j] = (int16_t) round( ( qs.C.q_levels[0] - 1 ) * pSpar_md_prior->band_coeffs_idx[i].drct_index_re[j] * one_by_q_lvl_C ); pSpar_md_prior->band_coeffs_idx_mapped[i].drct_index_re[j] = extract_l( trial1 ); + move16(); } } } - else + ELSE { - for ( i = 0; i < nB; i++ ) + FOR( i = 0; i < nB; i++ ) { - for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) { pSpar_md_prior->band_coeffs_idx_mapped[i].pred_index_re[j] = pSpar_md_prior->band_coeffs_idx[i].pred_index_re[j]; + move16(); pSpar_md_prior->band_coeffs_idx_mapped[i].decd_index_re[j] = pSpar_md_prior->band_coeffs_idx[i].decd_index_re[j]; + move16(); } - for ( j = 0; j < IVAS_SPAR_MAX_C_COEFF; j++ ) + FOR( j = 0; j < IVAS_SPAR_MAX_C_COEFF; j++ ) { pSpar_md_prior->band_coeffs_idx_mapped[i].drct_index_re[j] = pSpar_md_prior->band_coeffs_idx[i].drct_index_re[j]; + move16(); } } } @@ -461,7 +473,9 @@ void ivas_spar_quant_dtx_init_fx( Word32 *min_max ) { spar_md->min_max_fx[0] = min_max[0]; + move32(); spar_md->min_max_fx[1] = min_max[1]; + move32(); return; } @@ -549,7 +563,7 @@ void ivas_clear_band_coeffs_fx( { UWord16 i; - for ( i = 0; i < num_bands; i++ ) + FOR( i = 0; i < num_bands; i++ ) { set32_fx( (Word32 *) pband_coeffs[i].C_re_fx, 0, ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); set32_fx( (Word32 *) pband_coeffs[i].P_re_fx, 0, ( IVAS_SPAR_MAX_CH - 1 ) ); @@ -572,9 +586,8 @@ void ivas_clear_band_coeff_idx( ivas_band_coeffs_ind_t *pband_coeff_idx, const UWord16 num_bands ) { - UWord16 i = 0; - - for ( i = 0; i < num_bands; i++ ) + UWord16 i; + FOR( i = 0; i < num_bands; i++ ) { set16_fx( pband_coeff_idx[i].pred_index_re, 0, ( sub( IVAS_SPAR_MAX_CH, 1 ) ) ); set16_fx( pband_coeff_idx[i].drct_index_re, 0, IVAS_SPAR_MAX_C_COEFF ); diff --git a/lib_com/ivas_stereo_ica_com_fx.c b/lib_com/ivas_stereo_ica_com_fx.c index deee92b71..0b3920c8e 100644 --- a/lib_com/ivas_stereo_ica_com_fx.c +++ b/lib_com/ivas_stereo_ica_com_fx.c @@ -43,6 +43,9 @@ #include "wmc_auto.h" #include "rom_com.h" #include "ivas_rom_com.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*--------------------------------------------------------------- * interpTargetChannel_fx() diff --git a/lib_com/ivas_stereo_td_bit_alloc.c b/lib_com/ivas_stereo_td_bit_alloc.c index 2ca004b6e..737830827 100644 --- a/lib_com/ivas_stereo_td_bit_alloc.c +++ b/lib_com/ivas_stereo_td_bit_alloc.c @@ -45,6 +45,9 @@ #include "prot_fx2.h" #include "ivas_prot_fx.h" #endif +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*-------------------------------------------------------------------* diff --git a/lib_com/lsf_tools_fx.c b/lib_com/lsf_tools_fx.c index 9454e80f5..c0f7bd613 100644 --- a/lib_com/lsf_tools_fx.c +++ b/lib_com/lsf_tools_fx.c @@ -178,6 +178,7 @@ void E_LPC_a_isp_conversion( const Word16 a[], Word16 isp[], const Word16 old_is Word32 f[2][NC_MAX + 1]; Word32 t0, t1; Word16 scale = 1024; + move16(); #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; #endif @@ -437,10 +438,11 @@ void E_LPC_f_isp_a_conversion( const Word16 *isp, Word16 *a, const Word16 m ) DO { - + test(); /* a[0] = 1.0 */ a[0] = shl( 256, q ); move16(); + j = sub( m, 1 ); FOR( i = 1; i < nc; i++ ) { @@ -448,11 +450,13 @@ void E_LPC_f_isp_a_conversion( const Word16 *isp, Word16 *a, const Word16 m ) t0 = L_add( f1[i], f2[i] ); /* f1[i] + f2[i] */ t0 = L_shl( t0, q ); a[i] = round_fx( t0 ); /* from Q23 to Q12 and * 0.5 */ + move16(); /* a[j] = 0.5*(f1[i] - f2[i]) */ t0 = L_sub( f1[i], f2[i] ); /* f1[i] - f2[i] */ t0 = L_shl( t0, q ); a[j] = round_fx( t0 ); /* from Q23 to Q12 and * 0.5 */ + move16(); j = sub( j, 1 ); } @@ -478,11 +482,11 @@ void E_LPC_f_isp_a_conversion( const Word16 *isp, Word16 *a, const Word16 m ) WHILE( t0n == 0 || t0p == 0 ); /*in case of overflow, recalculate coefficients*/ a[nc] = round_fx( t0 ); /* from Q23 to Q12 and * 0.5 */ - + move16(); /* a[m] = isp[m-1] */ t0 = L_mult( a[0], isp[m - 1] ); /* from Q15 to Q12 */ a[m] = round_fx( t0 ); - + move16(); return; } @@ -1440,12 +1444,15 @@ void lsp_weights_fx( FOR( i = 0; i < lpcOrder; i++ ) { w[i] = round_fx( L_shl( Lsum1[i], sub( norm[i], n_max + 1 ) ) ); /* Q( 9-n_max) */ + move16(); } IF( lpcOrder != LPC_SHB_ORDER_WB ) { w[3] = round_fx( L_shl( L_mult( w[3], 18022 ), 1 ) ); /* Q( 9-n_max) */ w[4] = round_fx( L_shl( L_mult( w[4], 18022 ), 1 ) ); /* Q( 9-n_max) */ + move16(); + move16(); } *Qout = 9 - n_max; @@ -1700,6 +1707,7 @@ void a2rc_fx( const Word16 *a, /* i: can be any Q */ L_tmp1 = L_mac_o( L_tmp1, tmp, f_fx[j], &Overflow ); /* denom*f[j]+km*denom*f[j] in Q28 (floating with exp) */ L_tmp1 = L_shr_o( L_tmp1, exp, &Overflow ); /* bringing to true Q28 */ f_fx[j] = round_fx_o( L_tmp1, &Overflow ); /* extracting in q_a */ + move16(); #else L_tmp1 = L_mac( L_tmp1, tmp, f_fx[j] ); /* denom*f[j]+km*denom*f[j] in Q28 (floating with exp) */ L_tmp1 = L_shr( L_tmp1, exp ); /* bringing to true Q28 */ @@ -1842,6 +1850,7 @@ ivas_error lsf_allocate_fx( ivas_error error; error = IVAS_ERR_OK; + move16(); cumleft = nBits; move16(); @@ -1995,6 +2004,7 @@ ivas_error find_pred_mode( ivas_error error; error = IVAS_ERR_OK; + move16(); /* bwidth = 0(NB), 1 (WB), 2(WB2); line index in predmode_tab[][] */ idx = bwidth; @@ -2002,6 +2012,7 @@ ivas_error find_pred_mode( if ( GT_16( idx, 1 ) ) { idx = 1; + move16(); } IF( EQ_32( int_fs, INT_FS_16k ) ) { @@ -2048,10 +2059,12 @@ ivas_error find_pred_mode( IF( *predmode > 0 ) { *p_mode_lvq_p = *p_mode_lvq; + move16(); } ELSE { *p_mode_lvq_p = -1; + move16(); } } } @@ -2470,6 +2483,7 @@ void lsp2lsf_fx( L_tmp = L_shr( L_mult0( extract_l( L_tmp ), 5 ), 2 ); } lsf[i] = extract_l( L_tmp ); + move16(); } } /*===========================================================================*/ @@ -2878,9 +2892,12 @@ void lsf_syn_mem_backup_fx( *btilt_code_fx = hLPDmem->tilt_code; + move16(); *gc_threshold_fx = hLPDmem->gc_threshold; + move16(); Copy( st_fx->clip_var_fx, clip_var_bck_fx, 6 ); *next_force_sf_bck_fx = st_fx->next_force_safety_net_fx; + move16(); return; diff --git a/lib_com/lsp_conv_poly_fx.c b/lib_com/lsp_conv_poly_fx.c index 2685a127e..0cda281ea 100644 --- a/lib_com/lsp_conv_poly_fx.c +++ b/lib_com/lsp_conv_poly_fx.c @@ -561,6 +561,8 @@ static void spectautocorr_fx( *---------------------------------------------------------------------*/ r[1] = L_deposit_l( 0 ); + move32(); + r[2] = -G[imid]; move32(); @@ -569,6 +571,7 @@ static void spectautocorr_fx( r[i] = L_deposit_l( 0 ); r[i + 1] = -r[i - 1]; move32(); + move32(); } /*---------------------------------------------------------------------* @@ -738,8 +741,10 @@ static void zeros2poly_fx( { Mpy_32_16_ss( R[j - 1], xr, &mh, &ml ); R[j] = L_add( R[j], mh ); + move32(); Mpy_32_16_ss( S[j - 1], xs, &mh, &ml ); S[j] = L_add( S[j], mh ); + move32(); } } diff --git a/lib_com/modif_fs.c b/lib_com/modif_fs.c index e07eb02aa..b4552998d 100644 --- a/lib_com/modif_fs.c +++ b/lib_com/modif_fs.c @@ -541,34 +541,46 @@ void Interpolate_allpass_steep_32( FOR( k = 0; k < N; k++ ) { temp_fx[0] = L_add( mem_fx[0], Mpy_32_16_1( in_fx[k], AP2_STEEP_FX[0] ) ); + move32(); mem_fx[0] = L_sub( in_fx[k], Mpy_32_16_1( temp_fx[0], AP2_STEEP_FX[0] ) ); + move32(); /* for better performance, unroll this loop */ FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) { temp_fx[n] = L_add( mem_fx[n], Mpy_32_16_1( temp_fx[n - 1], AP2_STEEP_FX[n] ) ); + move32(); mem_fx[n] = L_sub( temp_fx[n - 1], Mpy_32_16_1( temp_fx[n], AP2_STEEP_FX[n] ) ); + move32(); } out_fx[2 * k + 1] = L_add( mem_fx[ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp_fx[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); + move32(); mem_fx[ALLPASSSECTIONS_STEEP - 1] = L_sub( temp_fx[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( out_fx[2 * k + 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); + move32(); } /* lower allpass filter chain */ FOR( k = 0; k < N; k++ ) { temp_fx[0] = L_add( mem_fx[ALLPASSSECTIONS_STEEP], Mpy_32_16_1( in_fx[k], AP1_STEEP_FX[0] ) ); + move32(); mem_fx[ALLPASSSECTIONS_STEEP] = L_sub( in_fx[k], Mpy_32_16_1( temp_fx[0], AP1_STEEP_FX[0] ) ); + move32(); /* for better performance, unroll this loop */ FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) { temp_fx[n] = L_add( mem_fx[ALLPASSSECTIONS_STEEP + n], Mpy_32_16_1( temp_fx[n - 1], AP1_STEEP_FX[n] ) ); + move32(); mem_fx[ALLPASSSECTIONS_STEEP + n] = L_sub( temp_fx[n - 1], Mpy_32_16_1( temp_fx[n], AP1_STEEP_FX[n] ) ); + move32(); } out_fx[2 * k] = L_add( mem_fx[2 * ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp_fx[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); + move32(); mem_fx[2 * ALLPASSSECTIONS_STEEP - 1] = L_sub( temp_fx[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( out_fx[2 * k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); + move32(); } return; @@ -676,54 +688,74 @@ void Decimate_allpass_steep_fx32( FOR( k = 0; k < N / 2; k++ ) { temp[0] = L_add( mem[0], Mpy_32_16_1( in[2 * k], AP1_STEEP_FX[0] ) ); + move32(); mem[0] = L_sub( in[2 * k], Mpy_32_16_1( temp[0], AP1_STEEP_FX[0] ) ); + move32(); temp[1] = L_add( mem[1], Mpy_32_16_1( temp[0], AP1_STEEP_FX[1] ) ); + move32(); mem[1] = L_sub( temp[0], Mpy_32_16_1( temp[1], AP1_STEEP_FX[1] ) ); + move32(); out[k] = L_add( mem[ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); + move32(); mem[ALLPASSSECTIONS_STEEP - 1] = L_sub( temp[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( out[k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); + move32(); } /* lower allpass filter chain */ temp[0] = L_add( mem[ALLPASSSECTIONS_STEEP], Mpy_32_16_1( mem[2 * ALLPASSSECTIONS_STEEP], AP2_STEEP_FX[0] ) ); + move32(); mem[ALLPASSSECTIONS_STEEP] = L_sub( mem[2 * ALLPASSSECTIONS_STEEP], Mpy_32_16_1( temp[0], AP2_STEEP_FX[0] ) ); + move32(); /* for better performance, unroll this loop */ FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) { temp[n] = L_add( mem[ALLPASSSECTIONS_STEEP + n], Mpy_32_16_1( temp[n - 1], AP2_STEEP_FX[n] ) ); + move32(); /*if ( fabs( temp[n] ) < 1e-12 ) { temp[n] = sign( temp[n] ) * 1e-12f; }*/ mem[ALLPASSSECTIONS_STEEP + 1] = L_sub( temp[n - 1], Mpy_32_16_1( temp[n], AP2_STEEP_FX[n] ) ); + move32(); } temp[ALLPASSSECTIONS_STEEP - 1] = L_add( mem[2 * ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); + move32(); mem[2 * ALLPASSSECTIONS_STEEP - 1] = L_sub( temp[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); out[0] = L_add( out[0], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 1], 16384 ) ); + move32(); + move32(); FOR( k = 1; k < N / 2; k++ ) { temp[0] = L_add( mem[ALLPASSSECTIONS_STEEP], Mpy_32_16_1( in[2 * k - 1], AP2_STEEP_FX[0] ) ); + move32(); mem[ALLPASSSECTIONS_STEEP] = L_sub( in[2 * k - 1], Mpy_32_16_1( temp[0], AP2_STEEP_FX[0] ) ); + move32(); /* for better performance, unroll this loop */ FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) { temp[n] = L_add( mem[ALLPASSSECTIONS_STEEP + n], Mpy_32_16_1( temp[n - 1], AP2_STEEP_FX[n] ) ); + move32(); /*if ( fabs( temp[n] ) < 1e-12 ) { temp[n] = sign( temp[n] ) * 1e-12f; }*/ mem[ALLPASSSECTIONS_STEEP + n] = L_sub( temp[n - 1], Mpy_32_16_1( temp[n], AP2_STEEP_FX[n - 1] ) ); + move32(); } temp[ALLPASSSECTIONS_STEEP - 1] = L_add( mem[2 * ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); + move32(); mem[2 * ALLPASSSECTIONS_STEEP - 1] = L_sub( temp[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); + move32(); out[k] = L_add( out[k], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 1], 16384 ) ); + move32(); } /* z^(-1) */ @@ -824,8 +856,11 @@ void interpolate_3_over_2_allpass_32( { /* Upper branch */ Vu[0] = L_add( mem[0], Mpy_32_16_1( ( input[i] - mem[1] ), filt_coeff[0] ) ); + move32(); Vu[1] = L_add( mem[1], Mpy_32_16_1( ( Vu[0] - mem[2] ), filt_coeff[1] ) ); + move32(); mem[3] = L_add( mem[2], Mpy_32_16_1( ( Vu[1] - mem[3] ), filt_coeff[2] ) ); + move32(); mem[1] = Vu[0]; move32(); @@ -836,8 +871,11 @@ void interpolate_3_over_2_allpass_32( /* Middle branch */ Vm[0] = L_add( mem[0], Mpy_32_16_1( ( input[i] - mem[4] ), filt_coeff[3] ) ); + move32(); Vm[1] = L_add( mem[4], Mpy_32_16_1( ( Vm[0] - mem[5] ), filt_coeff[4] ) ); + move32(); mem[6] = L_add( mem[5], Mpy_32_16_1( ( Vm[1] - mem[6] ), filt_coeff[5] ) ); + move32(); mem[4] = Vm[0]; move32(); @@ -848,8 +886,11 @@ void interpolate_3_over_2_allpass_32( /* Lower branch */ Vl[0] = L_add( mem[0], Mpy_32_16_1( ( input[i] - mem[7] ), filt_coeff[6] ) ); + move32(); Vl[1] = L_add( mem[7], Mpy_32_16_1( ( Vl[0] - mem[8] ), filt_coeff[7] ) ); + move32(); mem[9] = L_add( mem[8], Mpy_32_16_1( ( Vl[1] - mem[9] ), filt_coeff[8] ) ); + move32(); mem[0] = input[i]; move32(); @@ -1032,7 +1073,7 @@ void interpolate_3_over_1_allpass( return; } - +#ifdef IVAS_FLOAT_FIXED void interpolate_3_over_1_allpass_32( const Word32 *input, /* i : input signal */ const Word16 len, /* i : number of input samples */ @@ -1052,30 +1093,46 @@ void interpolate_3_over_1_allpass_32( { /* Upper branch */ Vu[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[1] ), filt_coeff[0] ) ); + move32(); Vu[1] = L_add_sat( mem[1], Mpy_32_16_1( L_sub( Vu[0], mem[2] ), filt_coeff[1] ) ); + move32(); mem[3] = L_add_sat( mem[2], Mpy_32_16_1( L_sub( Vu[1], mem[3] ), filt_coeff[2] ) ); + move32(); mem[1] = Vu[0]; + move32(); mem[2] = Vu[1]; + move32(); *out1++ = mem[3]; /* Middle branch */ Vm[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[4] ), filt_coeff[3] ) ); + move32(); Vm[1] = L_add_sat( mem[4], Mpy_32_16_1( L_sub( Vm[0], mem[5] ), filt_coeff[4] ) ); + move32(); mem[6] = L_add_sat( mem[5], Mpy_32_16_1( L_sub( Vm[1], mem[6] ), filt_coeff[5] ) ); + move32(); mem[4] = Vm[0]; + move32(); mem[5] = Vm[1]; + move32(); *out1++ = mem[6]; /* Lower branch */ Vl[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[7] ), filt_coeff[6] ) ); + move32(); Vl[1] = L_add_sat( mem[7], Mpy_32_16_1( L_sub( Vl[0], mem[8] ), filt_coeff[7] ) ); + move32(); mem[9] = L_add_sat( mem[8], Mpy_32_16_1( L_sub( Vl[1], mem[9] ), filt_coeff[8] ) ); + move32(); mem[0] = input[i]; + move32(); mem[7] = Vl[0]; + move32(); mem[8] = Vl[1]; + move32(); *out1++ = mem[9]; } @@ -1083,15 +1140,20 @@ void interpolate_3_over_1_allpass_32( FOR( i = 0; i < len * 3; i++ ) { mem_temp = out[i]; + move32(); out[i] = L_sub_sat( Mpy_32_16_1( L_add_sat( mem[12], mem[11] ), 18768 ), Mpy_32_16_1( L_add_sat( mem_temp, mem[10] ), 2424 ) ); + move32(); mem[10] = mem[11]; + move32(); mem[11] = mem[12]; + move32(); mem[12] = mem_temp; + move32(); } return; } - +#endif /*-------------------------------------------------------------------* * retro_interp4_5() diff --git a/lib_com/modif_fs_fx.c b/lib_com/modif_fs_fx.c index 85be57a43..5d0fc563f 100644 --- a/lib_com/modif_fs_fx.c +++ b/lib_com/modif_fs_fx.c @@ -68,9 +68,11 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ Word32 t0, t1, t2, L_tmp; /* temporary variables */ Word32 LepsP[M + 1]; Word16 flag_low_order = 0; + move16(); Word16 filt_len_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif const Resampling_cfg *cfg_ptr_fx; @@ -291,6 +293,7 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ IF( EQ_16( fac_num, 8 ) ) { num_den = 26214; + move16(); FOR( i = 0; i < lg_out; i++ ) { sigOut_fx[i] = mult_r( sigOut_fx[i], num_den ); /*Q-1*/ @@ -648,6 +651,7 @@ void Decimate_allpass_steep_fx( Word16 sum = 0; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif move16(); @@ -673,6 +677,7 @@ void Decimate_allpass_steep_fx( mem[0] = extract_h( Lacc1 ); /* Qx */ temp[0] = temp1; move16(); + move16(); Lacc1 = L_deposit_h( mem[1] ); /* Q16+Qx */ #ifdef BASOP_NOGLOB @@ -690,12 +695,15 @@ void Decimate_allpass_steep_fx( mem[1] = extract_h( Lacc ); /* Qx */ temp[1] = temp2; move16(); + move16(); Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */ #ifdef BASOP_NOGLOB out_fx[k] = extract_h( L_mac_o( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ) ); /* Qx format */ + move16(); mem[ALLPASSSECTIONS_STEEP - 1] = extract_h( L_msu_o( Lacc1, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[k], &Overflow ) ); /* Qx */ + move16(); #else out_fx[k] = extract_h( L_mac( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2 ) ); /* Qx format */ mem[ALLPASSSECTIONS_STEEP - 1] = extract_h( L_msu( Lacc1, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[k] ) ); /* Qx */ @@ -736,7 +744,7 @@ void Decimate_allpass_steep_fx( Lacc = L_msu( Lacc, AP2_STEEP_FX[1], temp2 ); /* Q(16+x) */ #endif mem[ALLPASSSECTIONS_STEEP + 1] = extract_h( Lacc ); /* Qx */ - + move16(); Lacc = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */ #ifdef BASOP_NOGLOB @@ -745,13 +753,14 @@ void Decimate_allpass_steep_fx( Lacc = L_mac( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2 ); /* Q(16+x) temp[ALLPASSSECTIONS_STEEP-1] */ #endif temp[2] = extract_h( Lacc ); /* temp[2] in Qx */ + move16(); #ifdef BASOP_NOGLOB Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[2], &Overflow ); /* Q(16+x) */ #else Lacc1 = L_msu( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[2] ); /* Q(16+x) */ #endif mem[2 * ALLPASSSECTIONS_STEEP - 1] = extract_h( Lacc1 ); /* Qx */ - + move16(); sum = mult_r( out_fx[0], 16384 ); /* Qx */ #ifdef BASOP_NOGLOB out_fx[0] = add_sat( sum, mult_r( temp[ALLPASSSECTIONS_STEEP - 1], 16384 ) ); /* Qx */ @@ -780,6 +789,7 @@ void Decimate_allpass_steep_fx( #endif mem[ALLPASSSECTIONS_STEEP] = extract_h( Lacc1 ); /* Qx */ + move16(); temp[0] = temp1; move16(); @@ -819,6 +829,7 @@ void Decimate_allpass_steep_fx( sum = mult_r( out_fx[k], 16384 ); /* Qx */ #ifdef BASOP_NOGLOB out_fx[k] = add_sat( sum, mult_r( temp[ALLPASSSECTIONS_STEEP - 1], 16384 ) ); + move16(); #else out_fx[k] = add( sum, mult_r( temp[ALLPASSSECTIONS_STEEP - 1], 16384 ) ); #endif @@ -850,6 +861,7 @@ void Interpolate_allpass_steep_fx( Word16 temp1, temp2; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif /*** State in Q0,in_fx Q0, AP1_STEEP in Q15 AP2_STEEP in Q15 OP in Q0 ************/ /*upper allpass filter chain */ @@ -869,6 +881,7 @@ void Interpolate_allpass_steep_fx( Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[0], temp1, &Overflow ); /* Q(16+x) */ mem[0] = round_fx_o( Lacc1, &Overflow ); + move16(); #else temp1 = round_fx( Lacc ); /* Qx */ Lacc1 = L_msu( Lacc1, AP2_STEEP_FX[0], temp1 ); /* Q(16+x) */ @@ -887,6 +900,7 @@ void Interpolate_allpass_steep_fx( temp2 = round_fx_o( Lacc1, &Overflow ); /* Qx */ Lacc = L_msu_o( Lacc, AP2_STEEP_FX[1], temp2, &Overflow ); /* Q(16+x) */ mem[1] = round_fx_o( Lacc, &Overflow ); /* Qx */ + move16(); #else temp2 = round_fx( Lacc1 ); /* Qx */ Lacc = L_msu( Lacc, AP2_STEEP_FX[1], temp2 ); /* Q(16+x) */ @@ -897,7 +911,9 @@ void Interpolate_allpass_steep_fx( Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */ #ifdef BASOP_NOGLOB out_fx[2 * k + 1] = round_fx_o( L_mac_o( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ), &Overflow ); /* Qx format */ + move16(); mem[ALLPASSSECTIONS_STEEP - 1] = round_fx_o( L_msu_o( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[2 * k + 1], &Overflow ), &Overflow ); /* Qx */ + move16(); #else out_fx[2 * k + 1] = round_fx( L_mac( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2 ) ); /* Qx format */ mem[ALLPASSSECTIONS_STEEP - 1] = round_fx( L_msu( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[2 * k + 1] ) ); /* Qx */ @@ -949,7 +965,9 @@ void Interpolate_allpass_steep_fx( Lacc1 = L_deposit_h( temp2 ); #ifdef BASOP_NOGLOB out_fx[2 * k] = round_fx_o( L_mac_o( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ), &Overflow ); /* Qx format */ + move16(); mem[2 * ALLPASSSECTIONS_STEEP - 1] = round_fx_o( L_msu_o( Lacc1, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[2 * k], &Overflow ), &Overflow ); /* Qx */ + move16(); #else out_fx[2 * k] = round_fx( L_mac( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2 ) ); /* Qx format */ mem[2 * ALLPASSSECTIONS_STEEP - 1] = round_fx( L_msu( Lacc1, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[2 * k] ) ); /* Qx */ diff --git a/lib_com/mslvq_com_fx.c b/lib_com/mslvq_com_fx.c index 9a5014b4f..b2e0e0b23 100644 --- a/lib_com/mslvq_com_fx.c +++ b/lib_com/mslvq_com_fx.c @@ -51,7 +51,7 @@ static void idx2c_fx( Word16 n, Word16 *p, Word16 k, Word16 val ); static void divide_64_32_fx( Word16 *xs, Word32 y, Word32 *result, Word32 *rem ); static Word16 decode_indexes_fx( Word16 *index, Word16 no_bits, const Word16 *p_scales, Word16 *p_no_scales, Word32 *p_offset_scale1, Word32 *p_offset_scale2, Word16 *x_lvq, Word16 mode_glb, Word16 *scales ); -static int16_t decode_indexes_ivas_fx( +static Word16 decode_indexes_ivas_fx( Word16 *index, const Word16 no_bits, const Word16 *p_scales, // Q11 @@ -62,7 +62,7 @@ static int16_t decode_indexes_ivas_fx( ); static Word32 divide_32_32_fx( Word32 y, Word32 x, Word32 *rem ); static Word16 divide_16_16_fx( Word16 y, Word16 x, Word16 *rem ); -static int16_t decode_indexes_ivas_fx( +static Word16 decode_indexes_ivas_fx( Word16 *index, const Word16 no_bits, const Word16 *p_scales, // Q11 @@ -180,6 +180,7 @@ static void make_offset_scale_fx( Word16 i; offset_scale[j][0] = L_deposit_l( 1 ); + move32(); FOR( i = 1; i <= no_scl; i++ ) { offset_scale[j][i] = L_add( offset_scale[j][sub( i, 1 )], tab_no_cv[no_ld[sub( i, 1 )]] ); @@ -239,7 +240,10 @@ decode_indexes_fx( ) { Word32 index1 = 0, index2 = 0; + move32(); + move32(); Word16 len_scales = MAX_NO_SCALES * 2, no_modes; + move16(); Word16 i, im1, idx_scale; Word16 tmp; @@ -264,8 +268,11 @@ decode_indexes_fx( { set16_fx( x_lvq, 0, 2 * LATTICE_DIM ); scales_mslvq[0] = 0; + move16(); scales_mslvq[1] = 0; + move16(); index[i] = 0; + move16(); return 1; } } @@ -290,6 +297,7 @@ decode_indexes_fx( move16(); } scales_mslvq[0] = 0; + move16(); } ELSE { @@ -298,7 +306,9 @@ decode_indexes_fx( /* safety check in case of bit errors */ set16_fx( x_lvq, 0, 2 * LATTICE_DIM ); scales_mslvq[0] = 0; + move16(); scales_mslvq[1] = 0; + move16(); return 1; } @@ -324,6 +334,7 @@ decode_indexes_fx( im1 = sub( i, 1 ); decode_comb_fx( L_sub( index1, table_no_cv_fx[im1] ), x_lvq, im1 ); scales_mslvq[0] = p_scales[mode_glb * len_scales + idx_scale]; + move16(); } /* second subvector */ @@ -365,7 +376,7 @@ decode_indexes_fx( return 0; } -static int16_t decode_indexes_ivas_fx( +static Word16 decode_indexes_ivas_fx( Word16 *index, const Word16 no_bits, const Word16 *p_scales, // Q11 @@ -375,31 +386,29 @@ static int16_t decode_indexes_ivas_fx( Word16 *scales_mslvq /* o: scale values for the decoded MSLVQ LSF codevector Q11*/ ) { - // UWord32 index1 = 0, index2, idx_scale; Word32 index1 = 0, index2, idx_scale; - // uint16_t i; + move32(); Word16 i; - // float scale; - // Word16 scale; Word16 len_scales = i_mult( MAX_NO_SCALES, 2 ); UWord32 offset_scale1[MAX_NO_SCALES + 1], offset_scale2[MAX_NO_SCALES + 1]; - if ( no_bits <= 2 * LEN_INDICE ) /* the third short is not used */ + IF( LE_16( no_bits, 2 * LEN_INDICE ) ) /* the third short is not used */ { index[2] = 0; - if ( no_bits <= LEN_INDICE ) + move16(); + if ( LE_16( no_bits, LEN_INDICE ) ) { index[1] = 0; + move16(); } } /* safety check in case of bit errors */ - for ( i = 0; i < 3; i++ ) + FOR( i = 0; i < 3; i++ ) { - if ( index[i] < 0 ) + IF( index[i] < 0 ) { - // set_f(x_lvq, 0.0f, 2 * LATTICE_DIM); set_s( x_lvq, 0, 2 * LATTICE_DIM ); #ifdef MSAN_FIX scales_mslvq[0] = 0; @@ -414,22 +423,22 @@ static int16_t decode_indexes_ivas_fx( create_offset( offset_scale1, offset_scale2, mode_glb, prediction_flag ); /* first subvector */ - if ( offset_scale2[MAX_NO_SCALES - 1] > 0 ) + IF( offset_scale2[MAX_NO_SCALES - 1] > 0 ) { - // divide_64_32(index, offset_scale2[MAX_NO_SCALES], &index1, &index2); divide_64_32_fx( index, offset_scale2[MAX_NO_SCALES], &index1, &index2 ); } - else + ELSE { index1 = (UWord32) ( index[0] ); /* this is for very low bitrates, so there is no loss in truncation */ + move32(); index2 = 0; + move32(); } - if ( index1 == 0 ) + IF( index1 == 0 ) { - for ( i = 0; i < LATTICE_DIM; i++ ) + FOR( i = 0; i < LATTICE_DIM; i++ ) { - // x_lvq[i] = 0.0; x_lvq[i] = 0; #ifdef MSAN_FIX scales_mslvq[0] = 0; @@ -437,12 +446,11 @@ static int16_t decode_indexes_ivas_fx( #endif } } - else + ELSE { - if ( index1 >= (Word32) offset_scale1[MAX_NO_SCALES] ) + IF( GE_32( index1, (Word32) offset_scale1[MAX_NO_SCALES] ) ) { /* safety check in case of bit errors */ - // set_f(x_lvq, 0.0f, 2 * LATTICE_DIM); set_s( x_lvq, 0, 2 * LATTICE_DIM ); #ifdef MSAN_FIX scales_mslvq[0] = 0; @@ -455,23 +463,25 @@ static int16_t decode_indexes_ivas_fx( /* find idx_scale */ i = 1; - while ( (int16_t) i <= MAX_NO_SCALES && index1 >= (Word32) offset_scale1[i] ) + test(); + WHILE( LE_16( (Word16) i, MAX_NO_SCALES ) && GE_32( index1, (Word32) offset_scale1[i] ) ) { i++; } idx_scale = i - 1; - index1 -= offset_scale1[idx_scale]; + index1 = L_sub( index1, offset_scale1[idx_scale] ); /* find idx_leader */ i = 1; - while ( index1 >= (Word32) table_no_cv[i] ) + move16(); + WHILE( GE_32( index1, (Word32) table_no_cv[i] ) ) { i++; } - // decode_comb((Word32)(index1 - table_no_cv[i - 1]), x_lvq, i - 1); decode_comb_fx( (Word32) ( index1 - table_no_cv[i - 1] ), x_lvq, i - 1 ); scales_mslvq[0] = p_scales[mode_glb * len_scales + idx_scale]; + move16(); // for (i = 0; i < LATTICE_DIM; i++) //{ // //x_lvq[i] *= scale; @@ -480,40 +490,44 @@ static int16_t decode_indexes_ivas_fx( } /* second subvector */ - if ( index2 == 0 ) + IF( index2 == 0 ) { - for ( i = LATTICE_DIM; i < 2 * LATTICE_DIM; i++ ) + FOR( i = LATTICE_DIM; i < 2 * LATTICE_DIM; i++ ) { // x_lvq[i] = 0.0; x_lvq[i] = 0; + move16(); } #ifdef MSAN_FIX scales_mslvq[1] = 0; move16(); #endif } - else + ELSE { /* find the index for the scale/truncation */ i = 1; - while ( index2 >= (Word32) offset_scale2[i] ) + move16(); + WHILE( GE_32( index2, (Word32) offset_scale2[i] ) ) { i++; } idx_scale = i - 1; - index2 -= offset_scale2[idx_scale]; + move16(); + index2 = L_sub( index2, offset_scale2[idx_scale] ); /* find the index of the leader vector */ i = 1; - while ( index2 >= (Word32) table_no_cv[i] ) + move16(); + WHILE( GE_32( index2, (Word32) table_no_cv[i] ) ) { i++; } - // decode_comb((Word32)(index2 - table_no_cv[i - 1]), &x_lvq[LATTICE_DIM], i - 1); decode_comb_fx( (Word32) ( index2 - table_no_cv[i - 1] ), &x_lvq[LATTICE_DIM], i - 1 ); scales_mslvq[1] = p_scales[mode_glb * len_scales + MAX_NO_SCALES + idx_scale]; + move16(); // for (i = LATTICE_DIM; i < 2 * LATTICE_DIM; i++) //{ // //x_lvq[i] *= scale; @@ -629,28 +643,26 @@ Word16 deindex_lvq_ivas_fx( IF( EQ_16( sf_flag, 1 ) ) { - // mode_glb = add(offset_lvq_modes_SN_fx[mode], offset_in_lvq_mode_SN_fx[mode][sub(no_bits, min_lat_bits_SN_fx[mode])]); - if ( mode < 6 ) /* for NB */ + IF( LT_16( mode, 6 ) ) /* for NB */ { - mode_glb = offset_lvq_modes_SN[mode] + offset_in_lvq_mode_SN[mode][no_bits - min_lat_bits_SN[mode]]; + mode_glb = add( offset_lvq_modes_SN[mode], offset_in_lvq_mode_SN[mode][sub( no_bits, min_lat_bits_SN[mode] )] ); } - else + ELSE { - mode_glb = offset_lvq_modes_SN[mode] + no_bits - min_lat_bits_SN[mode]; /* there is granularity of 1 bit */ + mode_glb = add( offset_lvq_modes_SN[mode], sub( no_bits, min_lat_bits_SN[mode] ) ); /* there is granularity of 1 bit */ } p_scales = &scales_ivas_fx[0][0]; // Q11 move16(); } ELSE { - // mode_glb = add(offset_lvq_modes_pred_fx[mode], offset_in_lvq_mode_pred_fx[mode][sub(no_bits,min_lat_bits_pred_fx[mode])]); - if ( ( mode < 6 ) || ( mode == 12 ) ) /* for NB */ + IF( ( LT_16( mode, 6 ) ) || ( EQ_16( mode, 12 ) ) ) /* for NB */ { - mode_glb = offset_lvq_modes_pred[mode] + offset_in_lvq_mode_pred[mode][no_bits - min_lat_bits_pred[mode]]; + mode_glb = add( offset_lvq_modes_pred[mode], offset_in_lvq_mode_pred[mode][sub( no_bits, min_lat_bits_pred[mode] )] ); } - else + ELSE { - mode_glb = offset_lvq_modes_pred[mode] + no_bits - min_lat_bits_pred[mode]; + mode_glb = add( offset_lvq_modes_pred[mode], sub( no_bits, min_lat_bits_pred[mode] ) ); } p_scales = &scales_p_ivas_fx[0][0]; // Q11 move16(); @@ -678,6 +690,7 @@ Word16 deindex_lvq_ivas_fx( /* Increase calculation accuracy by shifting more to the left and using rounding instead of truncation*/ L_tmp = L_shl( Mult_32_16( L_tmp, shl( sigma_MSLVQ_fx[mode][i], 3 ) ), 15 ); /* Q13 + Q2 +x2.56 -Q15 */ x_lvq[i] = round_fx( L_tmp ); + move16(); } } IF( scales_mslvq[1] ) @@ -687,6 +700,7 @@ Word16 deindex_lvq_ivas_fx( L_tmp = L_mult( x_lvq[i], scales_mslvq[1] ); /* Q1+Q11+Q1 = Q13 */ L_tmp = L_shl( Mult_32_16( L_tmp, shl( sigma_MSLVQ_fx[mode][i], 3 ) ), 15 ); /* Q13 + Q2 +x2.56 -Q15 */ x_lvq[i] = round_fx( L_tmp ); + move16(); } } } @@ -700,6 +714,7 @@ Word16 deindex_lvq_ivas_fx( L_tmp = L_mult( x_lvq[i], scales_mslvq[0] ); /* Q1+Q11+Q1 = Q13 */ L_tmp = L_shl( Mult_32_16( L_tmp, shl( sigma_p_ivas_fx[mode][i], 3 ) ), 15 ); /* Q13 + Q2 +x2.56 -Q15 */ x_lvq[i] = round_fx( L_tmp ); + move16(); } } IF( scales_mslvq[1] ) @@ -709,6 +724,7 @@ Word16 deindex_lvq_ivas_fx( L_tmp = L_mult( x_lvq[i], scales_mslvq[1] ); /* Q1+Q11+Q1 = Q13 */ L_tmp = L_shl( Mult_32_16( L_tmp, shl( sigma_p_ivas_fx[mode][i], 3 ) ), 15 ); /* Q13 + Q2 +x2.56 -Q15 */ x_lvq[i] = round_fx( L_tmp ); + move16(); } } } @@ -757,12 +773,14 @@ Word16 deindex_lvq_cng_fx( L_tmp = L_mult( x_lvq[i], scales_mslvq[0] ); /* Q1+Q11+Q1 = Q13 */ L_tmp = L_shl( Mult_32_16( L_tmp, shl( sigma_MSLVQ_fx[mode][i], 3 ) ), 15 ); /* Q13 + Q2 +x2.56 -Q15 */ x_lvq[i] = round_fx( L_tmp ); + move16(); } FOR( i = LATTICE_DIM; i < 2 * LATTICE_DIM; i++ ) { L_tmp = L_mult( x_lvq[i], scales_mslvq[1] ); /* Q1+Q11+Q1 = Q13 */ L_tmp = L_shl( Mult_32_16( L_tmp, shl( sigma_MSLVQ_fx[mode][i], 3 ) ), 15 ); /* Q13 + Q2 +x2.56 -Q15 */ x_lvq[i] = round_fx( L_tmp ); + move16(); } /* check if permutting needed */ @@ -815,12 +833,14 @@ Word16 deindex_lvq_cng_ivas_fx( L_tmp = L_mult( x_lvq[i], scales_mslvq[0] ); /* Q1+Q11+Q1 = Q13 */ L_tmp = L_shl( Mult_32_16( L_tmp, shl( sigma_MSLVQ_fx[mode][i], 3 ) ), 15 ); /* Q13 + Q2 +x2.56 -Q15 */ x_lvq[i] = round_fx( L_tmp ); + move16(); } FOR( i = LATTICE_DIM; i < 2 * LATTICE_DIM; i++ ) { L_tmp = L_mult( x_lvq[i], scales_mslvq[1] ); /* Q1+Q11+Q1 = Q13 */ L_tmp = L_shl( Mult_32_16( L_tmp, shl( sigma_MSLVQ_fx[mode][i], 3 ) ), 15 ); /* Q13 + Q2 +x2.56 -Q15 */ x_lvq[i] = round_fx( L_tmp ); + move16(); } /* check if permutting needed */ @@ -1248,29 +1268,31 @@ void deindex_lvq_SHB_fx( { /* create offsets */ offsets[0] = 0; + move32(); FOR( i = 0; i < MAX_NO_SCALES; i++ ) { offsets[i + 1] = table_no_cv[p_no_lead[i]] + offsets[i]; + move32(); } /* find idx_scale */ idx_scale = 0; WHILE( (Word16) i <= MAX_NO_SCALES && index >= offsets[idx_scale] ) { - idx_scale++; + idx_scale = add( idx_scale, 1 ); } - idx_scale--; - index -= offsets[idx_scale]; + idx_scale = sub( idx_scale, 1 ); + index = L_sub( index, offsets[idx_scale] ); /* find idx_leader */ i = 1; - WHILE( index > table_no_cv[i] ) + WHILE( GT_32( index, table_no_cv[i] ) ) { - i++; + i = add( i, 1 ); } - i = i - 1; + i = sub( i, 1 ); - decode_comb_fx( (Word32) ( index - table_no_cv[i] - 1 ), out, i ); + decode_comb_fx( (Word32) ( L_sub( L_sub( index, table_no_cv[i] ), 1 ) ), out, i ); scale = p_scales[idx_scale]; FOR( i = 0; i < LATTICE_DIM; i++ ) diff --git a/lib_com/nelp_fx.c b/lib_com/nelp_fx.c index 841280fa0..f0420e3db 100644 --- a/lib_com/nelp_fx.c +++ b/lib_com/nelp_fx.c @@ -71,7 +71,9 @@ Word16 dequantize_uvg_fx( Word16 frac, exp, sc; Word32 L_tmp; Word16 Q_gain = 0; + move16(); + test(); IF( EQ_16( bwidth_fx, NB ) ) { UVG1CB = UVG1CB_NB_FX; @@ -92,6 +94,7 @@ Word16 dequantize_uvg_fx( move16(); } + test(); IF( !do_scale ) { sc = 11; @@ -126,6 +129,7 @@ Word16 dequantize_uvg_fx( frac = L_Extract_lc( L_tmp, &exp ); frac = extract_l( Pow2( 14, frac ) ); G[i * 5 + k] = round_fx( L_shl( L_mult( frac, UVG2CB1[iG2[i]][k] ), exp - sc ) ); /* Q0 */ + move16(); } ELSE IF( EQ_16( i, 1 ) ) { @@ -134,6 +138,7 @@ Word16 dequantize_uvg_fx( frac = L_Extract_lc( L_tmp, &exp ); frac = extract_l( Pow2( 14, frac ) ); G[i * 5 + k] = round_fx( L_shl( L_mult( frac, UVG2CB2[iG2[i]][k] ), exp - sc ) ); /* Q0 */ + move16(); } } } @@ -235,6 +240,7 @@ void generate_nelp_excitation_fx( L16 = mult_r( L16, 0x6EDA ); /* Q13 */ output[i * 25 + I[j]] = round_fx( L_shl( L_mult( L16, Gains[i] ), 2 ) ); /* Q_exc */ + move16(); } FOR( ; j < len; j++ ) { diff --git a/lib_com/phase_dispersion_fx.c b/lib_com/phase_dispersion_fx.c index 5a1c3d510..74ae7708c 100644 --- a/lib_com/phase_dispersion_fx.c +++ b/lib_com/phase_dispersion_fx.c @@ -110,6 +110,7 @@ void phase_dispersion( FOR( i = 0; i < L_subfr; i++ ) { x32[i] = L_deposit_h( code[i] ); + move32(); } BASOP_rfft( x32, L_subfr, &j, -1 ); diff --git a/lib_com/pred_lt4_fx.c b/lib_com/pred_lt4_fx.c index 7047d643f..a6672c2b2 100644 --- a/lib_com/pred_lt4_fx.c +++ b/lib_com/pred_lt4_fx.c @@ -164,6 +164,7 @@ void pred_lt4_tc_fx( #ifdef BASOP_NOGLOB L_sum = L_shl_o( L_sum, 1, &Overflow ); /*Q0h */ excO[j] = round_fx_o( L_sum, &Overflow ); + move16(); #else L_sum = L_shl( L_sum, 1 ); /*Q0h */ diff --git a/lib_com/preemph.c b/lib_com/preemph.c index 89064782f..decc73f99 100644 --- a/lib_com/preemph.c +++ b/lib_com/preemph.c @@ -85,13 +85,17 @@ void preemph_ivas_fx( Word32 temp; temp = signal[L - 1]; + move32(); FOR( i = L - 1; i > 0; i-- ) { signal[i] = L_sub( signal[i], Mpy_32_16_1( signal[i - 1], mu ) ); + move32(); } signal[0] = L_sub( signal[0], Mpy_32_16_1( *mem, mu ) ); + move32(); *mem = temp; + move32(); return; } diff --git a/lib_com/preemph_fx.c b/lib_com/preemph_fx.c index 21dd047ce..e610e9fd7 100644 --- a/lib_com/preemph_fx.c +++ b/lib_com/preemph_fx.c @@ -66,6 +66,7 @@ void E_UTIL_f_preemph2( Word16 shift, Word16 *signal, const Word16 mu, const Wor Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif temp = signal[lg - 1]; move16(); @@ -77,6 +78,7 @@ void E_UTIL_f_preemph2( Word16 shift, Word16 *signal, const Word16 mu, const Wor L_tmp = L_msu0_o( L_tmp, signal[i - 1], mu, &Overflow ); L_tmp = L_shl_o( L_tmp, add( shift, 1 ), &Overflow ); signal[i] = round_fx_o( L_tmp, &Overflow ); + move16(); #else L_tmp = L_msu0( L_tmp, signal[i - 1], mu ); L_tmp = L_shl( L_tmp, add( shift, 1 ) ); @@ -89,6 +91,7 @@ void E_UTIL_f_preemph2( Word16 shift, Word16 *signal, const Word16 mu, const Wor L_tmp = L_msu0_o( L_tmp, *mem, mu, &Overflow ); L_tmp = L_shl_o( L_tmp, add( shift, 1 ), &Overflow ); signal[0] = round_fx_o( L_tmp, &Overflow ); + move16(); #else L_tmp = L_msu0( L_tmp, *mem, mu ); L_tmp = L_shl( L_tmp, add( shift, 1 ) ); @@ -143,13 +146,14 @@ Word16 E_UTIL_f_preemph3( Word16 *signal, const Word16 mu, const Word16 lg, Word L_tmp = L_msu( L_tmp, signal[i - 1], mus ); L_tmp = L_shl( L_tmp, Q_new ); signal[i] = round_fx( L_tmp ); + move16(); } L_tmp = L_mult( signal[0], QVal ); L_tmp = L_msu( L_tmp, *mem, mus ); L_tmp = L_shl( L_tmp, Q_new ); signal[0] = round_fx( L_tmp ); - + move16(); *mem = tmp_fixed; move16(); diff --git a/lib_com/pvq_com_fx.c b/lib_com/pvq_com_fx.c index fe4842a05..2a7e9a8ec 100644 --- a/lib_com/pvq_com_fx.c +++ b/lib_com/pvq_com_fx.c @@ -55,16 +55,21 @@ static void nearProjQ15_fx( ) { const Word16 a[4] = { 14967, -25518, 3415, 32351 }; + move16(); + move16(); + move16(); + move16(); Word32 b; UWord16 lsb; b = L_deposit_l( a[0] ); - b = L_shl( (Word32) add( a[1], extract_h( L_mult0( (Word16) b, x ) ) ), 1 ); + b = L_shl( L_deposit_l( add( a[1], extract_h( L_mult0( extract_l( b ), x ) ) ) ), 1 ); Mpy_32_16_ss( b, x, &b, &lsb ); - b = L_add( (Word32) a[2], b ); + b = L_add( L_deposit_l( a[2] ), b ); Mpy_32_16_ss( b, x, &b, &lsb ); - b = L_add( (Word32) a[3], b ); + b = L_add( L_deposit_l( a[3] ), b ); *result = extract_l( b ); + move16(); return; } @@ -82,13 +87,14 @@ void obtainEnergyQuantizerDensity_fx( Word16 Rnrg, den, n; den = sub( shl( L, 1 ), 1 ); - IF( den <= 67 ) + IF( LE_16( den, 67 ) ) { Rnrg = extract_l( intLimCDivPos_fx( L_deposit_l( R ), den ) ); } ELSE { n = norm_s( den ); + move16(); Rnrg = shr( div_s( R, shl( den, n ) ), sub( 15, n ) ); } Rnrg = add( Rnrg, 28 ); @@ -98,6 +104,7 @@ void obtainEnergyQuantizerDensity_fx( Rnrg = s_max( Rnrg, 3 ); *Density = obtainEnergyQuantizerDensity_f[Rnrg]; + move16(); return; } @@ -113,6 +120,7 @@ void dsDirac2Dirac_fx( ) { *diracs = dsDiracsTab[dsDiracIndex]; + move16(); return; } @@ -132,17 +140,17 @@ void dsDiracPerQuanta_fx( sv = frQuanta[td]; nsv = sv[0]; - + move16(); t_quanta_o = sub( t_quanta, QUANTAQ3OFFSET ); - IF( GE_16( t_quanta_o, sv[nsv] ) ) + if ( GE_16( t_quanta_o, sv[nsv] ) ) { *DsIdx = nsv; move16(); return; } - IF( LE_16( t_quanta_o, sv[1] ) ) + if ( LE_16( t_quanta_o, sv[1] ) ) { *DsIdx = 1; move16(); @@ -151,11 +159,11 @@ void dsDiracPerQuanta_fx( dsIndex = shl( 1, frQuanta[0][td] ); - if ( GT_16( t_quanta_o, sv[shr( nsv, 1 )] ) ) + IF( GT_16( t_quanta_o, sv[shr( nsv, 1 )] ) ) { dsIndex = sub( nsv, dsIndex ); } - FOR( i = sub( frQuanta[0][td], 1 ); i >= 0; i-- ) + FOR( i = frQuanta[0][td] - 1; i >= 0; i-- ) { dsIndex = add( dsIndex, shl( sub( shl( lshr( sub( sv[dsIndex], t_quanta_o ), 15 ), 1 ), 1 ), i ) ); } @@ -163,13 +171,14 @@ void dsDiracPerQuanta_fx( dsIndex = add( dsIndex, lshr( sub( sv[dsIndex], t_quanta_o ), 15 ) ); dsIndex = sub( dsIndex, lshr( sub( 1, dsIndex ), 15 ) ); - IF( EQ_16( dsm, PVQ_CONS ) ) + if ( EQ_16( dsm, PVQ_CONS ) ) { *DsIdx = dsIndex; move16(); return; } *DsIdx = add( dsIndex, lshr( sub( add( sv[add( dsIndex, 1 )], sv[dsIndex] ), shl( t_quanta_o, 1 ) ), 15 ) ); + move16(); return; } @@ -188,6 +197,7 @@ void QuantaPerDsDirac_fx( move16(); } *Quanta = add( *Quanta, QUANTAQ3OFFSET ); + move16(); return; } @@ -212,7 +222,7 @@ void conservativeL1Norm_fx( frQuantaL = hBitsN[L]; *Qreservplus = add( Qreserv, sub( Qvec, QUANTAQ3OFFSET ) ); - + move16(); dsDiracPerQuanta_fx( L, Qvec, Fcons, hBitsN, &Minit ); Mprime = Minit; @@ -222,6 +232,7 @@ void conservativeL1Norm_fx( Qtestminus = (short) frQuantaL[Mprime]; move16(); *Qspare = sub( Qavail, Qtestminus ); + move16(); Mprime = sub( Mprime, 1 ); } WHILE( ( Mprime >= 0 ) && LT_16( *Qspare, QUANTAQ3OFFSET ) ); @@ -229,12 +240,16 @@ void conservativeL1Norm_fx( if ( Mprime < 0 ) { *Qspare = add( Qavail, QUANTAQ3OFFSET ); /* single op */ + move16(); } dsDirac2Dirac_fx( add( Mprime, 1 ), Dvec ); *Dspecplus = add( Dspec, *Dvec ); + move16(); *Qreservplus = sub( *Qreservplus, (short) frQuantaL[Minit] ); + move16(); *Qspare = sub( *Qspare, QUANTAQ3OFFSET ); + move16(); return; } @@ -265,17 +280,23 @@ void bandBitsAdjustment_fx( L_tmp = L_deposit_l( sub( Breserv, Bff ) ); Btemp = extract_l( intLimCDivSigned_fx( L_tmp, s_min( D, 3 ) ) ); /* result always fits in Word16 */ *Breservplus = add( Bband, Breserv ); + move16(); } ELSE { Btemp = 0; move16(); *Breservplus = add( Bband, Bff ); + move16(); } *Bband_adj = s_min( extract_l( L_mult( L, 40 ) ), Bband ); + move16(); *Brem = sub( Bavail, Bff ); + move16(); *Bband_adj = s_min( *Brem, add( *Bband_adj, Btemp ) ); + move16(); *Bband_adj = s_max( 0, *Bband_adj ); + move16(); return; } @@ -315,6 +336,7 @@ static void Ratio_rQ3_fx( tmp = add( 1 << 7, Ratio_base2Q11_fx( opp, near ) ); *result = shr( tmp, 8 ); + move16(); return; } @@ -331,6 +353,7 @@ void densityAngle2RmsProjDec_fx( Word16 oppTail, nearTail; phiQ14q = (Word16) intLimCDivPos_fx( L_shl( L_deposit_l( indexphi ), 13 ), shr( D, 1 ) ); + move16(); if ( indexphi < 0 ) { phiQ14q = 1 << 13; /* one op */ @@ -343,8 +366,11 @@ void densityAngle2RmsProjDec_fx( IF( s_or( oppTail, nearTail ) < 0 ) { *oppQ15 = s_and( oppTail, ( 1 << 15 ) - 1 ); + move16(); *nearQ15 = s_and( nearTail, ( 1 << 15 ) - 1 ); + move16(); *oppRatioQ3 = shl( add( 1, shl( nearTail, 1 ) ), 14 ); + move16(); } ELSE { @@ -366,6 +392,7 @@ void densityAngle2RmsProjEnc_fx( ) { *indexphi = mult_r( shl( D, 1 ), phiQ14uq ); + move16(); if ( s_and( D, 1 ) > 0 ) { *indexphi = -1; /* one op */ @@ -409,7 +436,7 @@ void NearOppSplitAdjustment_fx( move16(); IF( GT_16( Nhead, 1 ) ) { - qavg = extract_h( L_shl( intLimCDivSigned_fx( (Word32) qboth, Np ), 16 ) ); /* qboth may be negative */ + qavg = extract_h( L_shl( intLimCDivSigned_fx( L_deposit_l( qboth ), Np ), 16 ) ); /* qboth may be negative */ dsDiracPerQuanta_fx( Ntail, qavg, FlagCons, hBitsN, &Midx ); QuantaPerDsDirac_fx( Nhead, Midx, hBitsN, &qmin ); qskew = sub( qavg, qmin ); @@ -425,6 +452,7 @@ void NearOppSplitAdjustment_fx( L_QIb = (Word32) intLimCDivPos_fx( L_qnum, QIa ); } *qnear = qboth; + move16(); #ifdef BASOP_NOGLOB QIb = extract_h( L_shl_o( L_QIb, 16, &Overflow ) ); /* may saturate */ #else @@ -433,9 +461,12 @@ void NearOppSplitAdjustment_fx( if ( LE_16( QIb, qboth ) ) { *qnear = QIb; + move16(); } *qopp = sub( qboth, *qnear ); + move16(); *qglobalupd = sub( qglobal, sub( qac, qzero ) ); + move16(); return; } @@ -462,7 +493,7 @@ void apply_gain_fx( FOR( band = 0; band < num_sfm; band++ ) { g = gains[ord[band]]; - + move16(); FOR( i = band_start[band]; i < band_end[band]; i++ ) { /*xq[i] *= g; */ @@ -500,11 +531,13 @@ void fine_gain_quant_fx( UWord16 lsb; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif FOR( band = 0; band < num_sfm; band++ ) { gbits = gain_bits[ord[band]]; + move16(); test(); IF( fg_pred[band] != 0 && gbits > 0 ) { @@ -539,6 +572,7 @@ void fine_gain_quant_fx( L_tmp = L_mult0( fg_pred[band], tmp1 ); /*12+exp1 */ fg_pred[band] = round_fx( L_shl( L_tmp, sub( 16, exp1 ) ) ); /*12+exp1+16-exp1-16=12 */ + move16(); } } diff --git a/lib_com/range_com_fx.c b/lib_com/range_com_fx.c index 4fb29bd58..0b46d7335 100644 --- a/lib_com/range_com_fx.c +++ b/lib_com/range_com_fx.c @@ -48,6 +48,7 @@ void rangeCoderFinalizationFBits_fx( if ( x >= 0 ) { L_Bq15 = (Word32) UL_lshr( INTrc, x ); + move32(); } E = 2; @@ -58,10 +59,12 @@ void rangeCoderFinalizationFBits_fx( UL_tmp = UL_lshl( UL_deposit_l( Bq15ui16 ), 1 ); Mpy_32_16_uu( UL_tmp, Bq15ui16, &h, &l ); L_Bq15 = (Word32) h; + move32(); E = add( shl( B, 1 ), extract_l( L_lshr( L_sub( ( ( 1L << 16 ) - 1L ), L_Bq15 ), 31 ) ) ); B = E; move16(); } *FBits = sub( *FBits, B ); + move16(); return; } diff --git a/lib_com/residu.c b/lib_com/residu.c index 0f1cdb33d..2a3ad964d 100644 --- a/lib_com/residu.c +++ b/lib_com/residu.c @@ -87,16 +87,18 @@ void residu_ivas_fx( ) { Word32 s; - int16_t i, j; + Word16 i, j; - for ( i = 0; i < l; i++ ) + FOR( i = 0; i < l; i++ ) { s = x[i]; - for ( j = 1; j <= m; j++ ) + move32(); + FOR( j = 1; j <= m; j++ ) { - s = L_add( s, L_shl( Mpy_32_16_1( x[i - j], a[j] ), Q15 - a_exp ) ); + s = L_add( s, L_shl( Mpy_32_16_1( x[sub( i, j )], a[j] ), sub( Q15, a_exp ) ) ); } y[i] = s; + move32(); } return; diff --git a/lib_com/trans_inv_fx.c b/lib_com/trans_inv_fx.c index 2cc68314e..70746dba9 100644 --- a/lib_com/trans_inv_fx.c +++ b/lib_com/trans_inv_fx.c @@ -104,7 +104,7 @@ void preecho_sb_fx( framelength_m1 = sub( framelength, 1 ); nb_flag = 0; move16(); - if ( EQ_16( bwidth, NB ) ) + if ( ( bwidth == NB ) ) { nb_flag = 1; move16(); diff --git a/lib_dec/acelp_core_switch_dec_fx.c b/lib_dec/acelp_core_switch_dec_fx.c index 31af985cb..76b8b8ed2 100644 --- a/lib_dec/acelp_core_switch_dec_fx.c +++ b/lib_dec/acelp_core_switch_dec_fx.c @@ -52,6 +52,7 @@ ivas_error acelp_core_switch_dec_fx( ivas_error error; error = IVAS_ERR_OK; + move32(); FOR( i = 0; i < CLDFB_NO_COL_MAX_SWITCH; i++ ) { @@ -72,7 +73,7 @@ ivas_error acelp_core_switch_dec_fx( Copy( st_fx->old_Aq_12_8_fx, Aq, M + 1 ); Copy( st_fx->old_Aq_12_8_fx, Aq + ( M + 1 ), M + 1 ); - set16_fx( mem_synth, 0, add( NS2SA( 16000, DELAY_CLDFB_NS ), 2 ) ); + set16_fx( mem_synth, 0, NS2SA( 16000, DELAY_CLDFB_NS ) + 2 ); set16_fx( synth_subfr_out, 0, SWITCH_MAX_GAP ); /* avoid valgrind complaining about uninitialized memory in core_switching_OLA_fx() */ /* set multiplication factor according to the sampling rate */ @@ -90,7 +91,7 @@ ivas_error acelp_core_switch_dec_fx( test(); test(); test(); - IF( core_switching_flag && EQ_16( st_fx->last_L_frame, st_fx->last_L_frame_ori ) && ( ( EQ_16( st_fx->last_core, ACELP_CORE ) ) || ( EQ_16( st_fx->last_core, AMR_WB_CORE ) ) ) ) + IF( core_switching_flag && EQ_16( st_fx->last_L_frame, st_fx->last_L_frame_ori ) && ( ( ( st_fx->last_core == ACELP_CORE ) ) || ( EQ_16( st_fx->last_core, AMR_WB_CORE ) ) ) ) { exc = old_exc + L_EXC_MEM_DEC; Copy( st_fx->old_exc_fx, old_exc, L_EXC_MEM_DEC ); /*scaling of exc from previous frame*/ @@ -139,7 +140,7 @@ ivas_error acelp_core_switch_dec_fx( Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, 4, &st_fx->mem_deemph_fx, hBPF->pst_old_syn_fx, &hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, 1, 0, NULL ); - syn_12k8_fx( shl( L_SUBFR, 1 ), Aq, exc, synth_intFreq, st_fx->mem_syn2_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); + syn_12k8_fx( 2 * L_SUBFR, Aq, exc, synth_intFreq, st_fx->mem_syn2_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); IF( st_fx->hPFstat->on && ( EQ_16( st_fx->last_bwidth, NB ) ) ) { @@ -150,20 +151,20 @@ ivas_error acelp_core_switch_dec_fx( pitch_buf_tmp[i] = L_SUBFR; move16(); } - nb_post_filt_fx( shl( L_SUBFR, 1 ), st_fx->hPFstat, &tmp_noise, 0, synth_intFreq, Aq, pitch_buf_tmp, AUDIO, st_fx->BER_detect, 0 ); + nb_post_filt_fx( 2 * L_SUBFR, st_fx->hPFstat, &tmp_noise, 0, synth_intFreq, Aq, pitch_buf_tmp, AUDIO, st_fx->BER_detect, 0 ); } IF( EQ_16( L_frame_for_cs, L_FRAME ) ) { - deemph_fx( synth_intFreq, PREEMPH_FAC, shl( L_SUBFR, 1 ), &( st_fx->mem_deemph_fx ) ); + deemph_fx( synth_intFreq, PREEMPH_FAC, 2 * L_SUBFR, &( st_fx->mem_deemph_fx ) ); } ELSE { - deemph_fx( synth_intFreq, PREEMPH_FAC_16k, shl( L_SUBFR, 1 ), &( st_fx->mem_deemph_fx ) ); + deemph_fx( synth_intFreq, PREEMPH_FAC_16k, 2 * L_SUBFR, &( st_fx->mem_deemph_fx ) ); } - unscale_AGC( synth_intFreq, st_fx->Q_syn, syn_fx_tmp + M, st_fx->agc_mem_fx, shl( L_SUBFR, 1 ) ); - Copy( syn_fx_tmp + M, synth_intFreq, shl( L_SUBFR, 1 ) ); + unscale_AGC( synth_intFreq, st_fx->Q_syn, syn_fx_tmp + M, st_fx->agc_mem_fx, 2 * L_SUBFR ); + Copy( syn_fx_tmp + M, synth_intFreq, 2 * L_SUBFR ); test(); IF( st_fx->hPFstat->on && ( NE_16( st_fx->last_bwidth, NB ) ) ) @@ -173,16 +174,16 @@ ivas_error acelp_core_switch_dec_fx( Residu3_fx( Aq, bpf_error_signal + M, exc, L_SUBFR, 1 ); E_UTIL_synthesis( 1, Aq, exc, bpf_error_signal, L_SUBFR, st_fx->hPFstat->mem_stp + L_SYN_MEM - M, 0, M ); scale_st_fx( synth_intFreq, bpf_error_signal, &st_fx->hPFstat->gain_prec, L_SUBFR ); - Copy( bpf_error_signal, synth_intFreq, shr( L_SUBFR, 1 ) ); - blend_subfr2_fx( bpf_error_signal + shr( L_SUBFR, 1 ), synth_intFreq + shr( L_SUBFR, 1 ), synth_intFreq + shr( L_SUBFR, 1 ) ); + Copy( bpf_error_signal, synth_intFreq, L_SUBFR / 2 ); + blend_subfr2_fx( bpf_error_signal + L_SUBFR / 2, synth_intFreq + L_SUBFR / 2, synth_intFreq + L_SUBFR / 2 ); } st_fx->hPFstat->on = 0; move16(); - IF( NE_16( st_fx->flag_cna, 0 ) ) + IF( st_fx->flag_cna ) { - generate_masking_noise_fx( synth_intFreq, st_fx->Q_syn, st_fx->hFdCngDec->hFdCngCom, shl( L_SUBFR, 1 ), 0 ); + generate_masking_noise_fx( synth_intFreq, st_fx->Q_syn, st_fx->hFdCngDec->hFdCngCom, 2 * L_SUBFR, 0 ); } /*----------------------------------------------------------------* @@ -190,11 +191,11 @@ ivas_error acelp_core_switch_dec_fx( * Bass post-filter *----------------------------------------------------------------*/ - bass_psfilter_fx( st_fx->hBPF, st_fx->Opt_AMR_WB, synth_intFreq, shl( L_SUBFR, 1 ), NULL, + bass_psfilter_fx( st_fx->hBPF, st_fx->Opt_AMR_WB, synth_intFreq, 2 * L_SUBFR, NULL, st_fx->bpf_off, st_fx->stab_fac_fx, &st_fx->stab_fac_smooth_fx, GENERIC, st_fx->Q_syn, bpf_error_signal ); - IF( ( error = cldfb_save_memory( st_fx->cldfbAna ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = cldfb_save_memory( st_fx->cldfbAna ) ), IVAS_ERR_OK ) ) { return error; } @@ -207,13 +208,13 @@ ivas_error acelp_core_switch_dec_fx( move16(); /* CLDFB analysis and add the BPF error signal */ - IF( ( error = cldfb_save_memory( st_fx->cldfbBPF ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = cldfb_save_memory( st_fx->cldfbBPF ) ), IVAS_ERR_OK ) ) { return error; } i = 0; move16(); - IF( EQ_16( st_fx->bpf_off, 0 ) ) + if ( st_fx->bpf_off == 0 ) { i = CLDFB_NO_COL_MAX_SWITCH; move16(); @@ -226,7 +227,7 @@ ivas_error acelp_core_switch_dec_fx( scaleFactor.hb_scale = scaleFactor.lb_scale; move16(); - IF( ( error = cldfb_save_memory( st_fx->cldfbSyn ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = cldfb_save_memory( st_fx->cldfbSyn ) ), IVAS_ERR_OK ) ) { return error; } @@ -249,7 +250,9 @@ ivas_error acelp_core_switch_dec_fx( { /* Decoding of BWE */ d1m = (Word16) get_next_indice( st_fx, AUDIODELAYBITS ); + move16(); ind1 = (Word16) get_next_indice( st_fx, NOOFGAINBITS1 ); + move16(); gain = usdequant_fx( ind1, MINVALUEOFFIRSTGAIN_FX, shr( DELTAOFFIRSTGAIN_FX, 3 ) ); /*Q13*/ decode_bwe = 1; move16(); @@ -260,7 +263,7 @@ ivas_error acelp_core_switch_dec_fx( test(); IF( decode_bwe && !( ( EQ_16( output_frame, L_FRAME16k ) && EQ_16( st_fx->last_L_frame, L_FRAME16k ) ) || EQ_16( output_frame, L_FRAME8k ) ) ) { - set16_fx( tmp_mem2, 0, shl( L_FILT48k, 1 ) ); + set16_fx( tmp_mem2, 0, 2 * L_FILT48k ); hp_filter = hp16000_48000_fx; fdelay = 48; @@ -299,7 +302,7 @@ ivas_error acelp_core_switch_dec_fx( /* safety check in case of bit errors */ i = MAX_D1M_16k; move16(); - IF( EQ_16( st_fx->last_L_frame, L_FRAME ) ) + if ( EQ_16( st_fx->last_L_frame, L_FRAME ) ) { i = MAX_D1M_12k8; move16(); @@ -314,7 +317,7 @@ ivas_error acelp_core_switch_dec_fx( move16(); } - i = NS2SA_fx2( st_fx->output_Fs, L_sub( FRAME_SIZE_NS, L_add( ACELP_LOOK_NS, DELAY_BWE_TOTAL_NS ) ) ); + i = NS2SA_fx2( st_fx->output_Fs, FRAME_SIZE_NS - ACELP_LOOK_NS - DELAY_BWE_TOTAL_NS ); move16(); Copy( st_fx->old_synth_sw_fx, hb_synth_tmp, i ); set16_fx( hb_synth_tmp + i, 0, NS2SA_fx2( st_fx->output_Fs, 10000000L ) - i ); @@ -331,6 +334,7 @@ ivas_error acelp_core_switch_dec_fx( { #ifdef BASOP_NOGLOB *pt1++ = round_fx_sat( L_shl_sat( L_mult_sat( ( *pt2++ ), gain ), 2 ) ); + move16(); #else *pt1++ = round_fx( L_shl( L_mult( ( *pt2++ ), gain ), 2 ) ); #endif @@ -391,6 +395,7 @@ ivas_error acelp_core_switch_dec_bfi_fx( hMusicPF = st_fx->hMusicPF; hBPF = st_fx->hBPF; error = IVAS_ERR_OK; + move32(); FOR( i = 0; i < CLDFB_NO_COL_MAX_SWITCH_BFI; i++ ) { @@ -425,8 +430,8 @@ ivas_error acelp_core_switch_dec_bfi_fx( exc2 = old_exc2 + L_EXC_MEM; IF( st_fx->hBWE_TD != NULL ) { - Copy( st_fx->hBWE_TD->old_bwe_exc_fx, old_bwe_exc, shl( PIT16k_MAX, 1 ) ); - bwe_exc = old_bwe_exc + shl( PIT16k_MAX, 1 ); + Copy( st_fx->hBWE_TD->old_bwe_exc_fx, old_bwe_exc, PIT16k_MAX * 2 ); + bwe_exc = old_bwe_exc + PIT16k_MAX * 2; } ELSE { @@ -439,7 +444,7 @@ ivas_error acelp_core_switch_dec_bfi_fx( move16(); /* SC-VBR */ - IF( EQ_16( st_fx->last_nelp_mode_dec, 1 ) ) + if ( EQ_16( st_fx->last_nelp_mode_dec, 1 ) ) { st_fx->nelp_mode_dec = 1; move16(); @@ -568,7 +573,7 @@ ivas_error acelp_core_switch_dec_bfi_fx( * Resamping to the output sampling frequency *----------------------------------------------------------------*/ /* CLDFB analysis of the synthesis at internal sampling rate */ - IF( ( error = cldfb_save_memory( st_fx->cldfbAna ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = cldfb_save_memory( st_fx->cldfbAna ) ), IVAS_ERR_OK ) ) { return error; } @@ -580,7 +585,7 @@ ivas_error acelp_core_switch_dec_bfi_fx( move16(); /* CLDFB synthesis of the combined signal */ - IF( ( error = cldfb_save_memory( st_fx->cldfbSyn ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = cldfb_save_memory( st_fx->cldfbSyn ) ), IVAS_ERR_OK ) ) { return error; } @@ -637,6 +642,7 @@ ivas_error acelp_core_switch_dec_bfi_ivas_fx( hMusicPF = st_fx->hMusicPF; hBPF = st_fx->hBPF; error = IVAS_ERR_OK; + move16(); FOR( i = 0; i < CLDFB_NO_COL_MAX_SWITCH_BFI; i++ ) { @@ -685,7 +691,7 @@ ivas_error acelp_core_switch_dec_bfi_ivas_fx( move16(); /* SC-VBR */ - IF( EQ_16( st_fx->last_nelp_mode_dec, 1 ) ) + if ( EQ_16( st_fx->last_nelp_mode_dec, 1 ) ) { st_fx->nelp_mode_dec = 1; move16(); @@ -815,7 +821,7 @@ ivas_error acelp_core_switch_dec_bfi_ivas_fx( /* CLDFB analysis of the synthesis at internal sampling rate */ Qtmp = sub( 11, st_fx->Q_syn ); Copy_Scale_sig_16_32( syn, syn32, L_FRAME16k, Qtmp ); - IF( ( error = cldfb_save_memory_ivas_fx( st_fx->cldfbAna ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = cldfb_save_memory_ivas_fx( st_fx->cldfbAna ) ), IVAS_ERR_OK ) ) { return error; } @@ -827,7 +833,7 @@ ivas_error acelp_core_switch_dec_bfi_ivas_fx( // scaleFactor.hb_scale = scaleFactor.lb_scale; /* CLDFB synthesis of the combined signal */ - IF( ( error = cldfb_save_memory_ivas_fx( st_fx->cldfbSyn ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = cldfb_save_memory_ivas_fx( st_fx->cldfbSyn ) ), IVAS_ERR_OK ) ) { return error; } @@ -916,7 +922,7 @@ static void decod_gen_voic_core_switch_fx( * Find the adaptive codebook vector. *--------------------------------------------------------------*/ - pred_lt4( &exc[0], &exc[0], T0, T0_frac, add( L_SUBFR, 1 ), pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4( &exc[0], &exc[0], T0, T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); /*--------------------------------------------------------------* * LP filtering of the adaptive excitation @@ -949,6 +955,7 @@ static void decod_gen_voic_core_switch_fx( /* _ (Word16*) gain_inov : gain of the innovation (used for normalization) (Q12) */ /* _ (Word32*) norm_gain_code : norm. gain of the codebook excitation (Q16) */ st_fx->tilt_code_fx = est_tilt_fx( exc, gain_pit, code, gain_code, &voice_fac, *Q_exc ); /*Q15*/ + move16(); /*----------------------------------------------------------------------* * Find the total excitation @@ -982,6 +989,7 @@ static void decod_gen_voic_core_switch_fx( /*exc2_fx[i+i_subfr] = round_fx(L_tmp);*/ /*Q_exc*/ L_tmp = L_add( L_tmp, L_shl( L_mult( gain_code16, code[i] ), 6 ) ); /*Q16+Q_exc*/ exc[i] = round_fx( L_tmp ); /*Q_exc*/ + move16(); } /*-----------------------------------------------------------------* @@ -994,6 +1002,7 @@ static void decod_gen_voic_core_switch_fx( FOR( i = 0; i < L_SUBFR; i++ ) { ( *pt1 ) = round_fx( L_shl( L_mult( *pt1, gain_pit ), 1 ) ); /*Q_exc + Q14 +1 +1 -16*/ + move16(); pt1++; } diff --git a/lib_dec/amr_wb_dec_fx.c b/lib_dec/amr_wb_dec_fx.c index 616b76093..e1ffd2adf 100644 --- a/lib_dec/amr_wb_dec_fx.c +++ b/lib_dec/amr_wb_dec_fx.c @@ -72,6 +72,7 @@ ivas_error amr_wb_dec_fx( Word8 flag_cna; Word8 waveadj_rec = 0; + move16(); Word16 avoid_lpc_burst_on_recovery; Word16 delta_mem_scale; @@ -155,7 +156,7 @@ ivas_error amr_wb_dec_fx( st_fx->fscale = sr2fscale_fx( st_fx->sr_core ); /* Initialization in case that the first frame is the good received AMR-WB (IO) frame */ - IF( EQ_16( st_fx->ini_frame, 0 ) ) + IF( st_fx->ini_frame == 0 ) { st_fx->last_core = AMR_WB_CORE; move16(); @@ -170,7 +171,7 @@ ivas_error amr_wb_dec_fx( } /* Updates in case of EVS -> AMR-WB IO switching */ - IF( ( error = core_switching_pre_dec_fx( st_fx, output_frame ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = core_switching_pre_dec_fx( st_fx, output_frame ) ), IVAS_ERR_OK ) ) { return error; } @@ -188,7 +189,7 @@ ivas_error amr_wb_dec_fx( Copy( st_fx->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); exc_fx = old_exc_fx + L_EXC_MEM_DEC; /* reset post-filter in case of switching */ - IF( EQ_16( st_fx->hPFstat->on, 0 ) ) + if ( st_fx->hPFstat->on == 0 ) { st_fx->hPFstat->reset = 1; move16(); @@ -196,6 +197,7 @@ ivas_error amr_wb_dec_fx( IF( GT_16( st_fx->bfi, 0 ) ) { st_fx->nbLostCmpt = add( st_fx->nbLostCmpt, 1 ); + move16(); } ELSE { @@ -216,6 +218,7 @@ ivas_error amr_wb_dec_fx( FOR( i = 0; i < hTcxDec->L_frameTCX; i++ ) { hHQ_core->old_out_fx[i] = shl( mult_r( hHQ_core->old_out_fx[i], st_fx->plcInfo.recovery_gain ), 1 ); + move16(); } } @@ -223,7 +226,7 @@ ivas_error amr_wb_dec_fx( move16(); test(); test(); - IF( st_fx->last_con_tcx && ( NE_16( st_fx->L_frameTCX_past, st_fx->L_frame ) ) && ( NE_16( st_fx->last_core, 0 ) ) ) + if ( st_fx->last_con_tcx && ( NE_16( st_fx->L_frameTCX_past, st_fx->L_frame ) ) && ( ( st_fx->last_core != 0 ) ) ) { avoid_lpc_burst_on_recovery = 1; move16(); @@ -242,7 +245,7 @@ ivas_error amr_wb_dec_fx( st_fx->bpf_off = 1; move16(); - IF( NE_16( st_fx->hPFstat->on, 0 ) ) + IF( st_fx->hPFstat->on ) { Word16 mem_syn_r_size_old, mem_syn_r_size_new; @@ -300,13 +303,13 @@ ivas_error amr_wb_dec_fx( FOR( i = sub( NB_SUBFR16k, NB_SUBFR ); i < NB_SUBFR16k; i++ ) { - st_fx->old_pitch_buf_fx[sub( i, 1 )] = Mpy_32_16_1( st_fx->old_pitch_buf_fx[i], tmp16 ); + st_fx->old_pitch_buf_fx[i - 1] = Mpy_32_16_1( st_fx->old_pitch_buf_fx[i], tmp16 ); move32(); } FOR( i = sub( shl( NB_SUBFR16k, 1 ), NB_SUBFR ); i < shl( NB_SUBFR16k, 1 ); i++ ) { - st_fx->old_pitch_buf_fx[sub( i, 2 )] = Mpy_32_16_1( st_fx->old_pitch_buf_fx[i], tmp16 ); + st_fx->old_pitch_buf_fx[i - 2] = Mpy_32_16_1( st_fx->old_pitch_buf_fx[i], tmp16 ); move32(); } } @@ -333,6 +336,7 @@ ivas_error amr_wb_dec_fx( move16(); } st_fx->bfi_pitch_fx = mult_r( tmp16, st_fx->bfi_pitch_fx ); + move16(); st_fx->bfi_pitch_frame = L_FRAME; move16(); } @@ -343,13 +347,13 @@ ivas_error amr_wb_dec_fx( { /* reset the unvoiced/audio signal improvement memories */ E_LPC_f_isp_a_conversion( st_fx->lsp_old_fx, st_fx->hAmrwb_IO->old_Aq_fx, M ); - Copy( st_fx->hAmrwb_IO->old_Aq_fx, st_fx->hAmrwb_IO->old_Aq_fx + add( M, 1 ), add( M, 1 ) ); - Copy( st_fx->hAmrwb_IO->old_Aq_fx, st_fx->hAmrwb_IO->old_Aq_fx + i_mult( 2, add( M, 1 ) ), add( M, 1 ) ); - Copy( st_fx->hAmrwb_IO->old_Aq_fx, st_fx->hAmrwb_IO->old_Aq_fx + i_mult( 3, add( M, 1 ) ), add( M, 1 ) ); + Copy( st_fx->hAmrwb_IO->old_Aq_fx, st_fx->hAmrwb_IO->old_Aq_fx + M + 1, M + 1 ); + Copy( st_fx->hAmrwb_IO->old_Aq_fx, st_fx->hAmrwb_IO->old_Aq_fx + i_mult( 2, M + 1 ), M + 1 ); + Copy( st_fx->hAmrwb_IO->old_Aq_fx, st_fx->hAmrwb_IO->old_Aq_fx + i_mult( 3, M + 1 ), M + 1 ); } /*End of _DIFF_FLOAT_FIX_*/ test(); - IF( EQ_16( st_fx->last_bwidth, NB ) && NE_16( st_fx->ini_frame, 0 ) ) + if ( EQ_16( st_fx->last_bwidth, NB ) && NE_16( st_fx->ini_frame, 0 ) ) { st_fx->rate_switching_reset = 1; move16(); @@ -390,7 +394,8 @@ ivas_error amr_wb_dec_fx( delta_mem_scale = 3; move16(); - IF( LT_32( st_fx->lp_ener_fx, 40 ) ) /* very low energy frames, less than 0.3125 */ + test(); + if ( LT_32( st_fx->lp_ener_fx, 40 ) ) /* very low energy frames, less than 0.3125 */ { delta_mem_scale = 0; move16(); @@ -405,8 +410,8 @@ ivas_error amr_wb_dec_fx( Copy_Scale_sig( exc2_fx, exc2_fx, st_fx->L_frame, sub( st_fx->Q_exc, i ) ); /* update past excitation signals for LD music post-filter */ - Copy( hMusicPF->dct_post_old_exc_fx + L_FRAME, hMusicPF->dct_post_old_exc_fx, sub( DCT_L_POST, add( L_FRAME, OFFSET2 ) ) ); - Copy( exc2_fx, hMusicPF->dct_post_old_exc_fx + sub( DCT_L_POST, add( L_FRAME, OFFSET2 ) ), L_FRAME ); + Copy( hMusicPF->dct_post_old_exc_fx + L_FRAME, hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); + Copy( exc2_fx, hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); /* synthesis at 12k8 Hz sampling rate */ syn_12k8_fx( L_FRAME, Aq_fx, exc2_fx, syn_fx, st_fx->mem_syn2_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); @@ -429,7 +434,7 @@ ivas_error amr_wb_dec_fx( st_fx->psf_lp_noise_fx = round_fx( L_mac( L_mult( 32440, st_fx->psf_lp_noise_fx ), 328, frame_e_fx ) ); /*Q8*/ } /* update old synthesis for classification */ - Copy( syn_fx + sub( L_FRAME, L_SYN_MEM_CLAS_ESTIM ), st_fx->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); + Copy( syn_fx + L_FRAME - L_SYN_MEM_CLAS_ESTIM, st_fx->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); /* Update music post processing values */ /* Filter energies update */ @@ -466,10 +471,11 @@ ivas_error amr_wb_dec_fx( *------------------------------------------------------------*/ vad_flag = (Word16) get_next_indice( st_fx, 1 ); + move16(); st_fx->coder_type = GENERIC; move16(); - IF( EQ_16( vad_flag, 0 ) ) + if ( vad_flag == 0 ) { st_fx->coder_type = INACTIVE; move16(); @@ -508,11 +514,13 @@ ivas_error amr_wb_dec_fx( { L_tmp = L_mult( 3277, lsp_new_fx[i] ); st_fx->lspCNG_fx[i] = round_fx( L_mac( L_tmp, 29491, st_fx->lspCNG_fx[i] ) ); + move16(); } } ELSE { st_fx->unv_cnt = add( st_fx->unv_cnt, 1 ); + move16(); } } ELSE @@ -552,9 +560,9 @@ ivas_error amr_wb_dec_fx( 0, 0, 0, st_fx->last_core_brate, -1 ); /* update past excitation signals for LD music post-filter */ - Copy( hMusicPF->dct_post_old_exc_fx + L_FRAME, hMusicPF->dct_post_old_exc_fx, sub( DCT_L_POST, add( L_FRAME, OFFSET2 ) ) ); - Copy( exc2_fx, hMusicPF->dct_post_old_exc_fx + sub( DCT_L_POST, add( L_FRAME, OFFSET2 ) ), L_FRAME ); - Copy( hMusicPF->dct_post_old_exc_fx, exc_buffer_fx, sub( DCT_L_POST, OFFSET2 ) ); + Copy( hMusicPF->dct_post_old_exc_fx + L_FRAME, hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); + Copy( exc2_fx, hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + Copy( hMusicPF->dct_post_old_exc_fx, exc_buffer_fx, DCT_L_POST - OFFSET2 ); IF( NE_16( output_frame, L_FRAME8k ) ) { @@ -563,12 +571,13 @@ ivas_error amr_wb_dec_fx( frame_energy_fx( L_FRAME, pitch_buf_fx, syn_fx, 0, &frame_e_fx, st_fx->Q_syn ); /*st->psf_lp_noise = 0.99f * st->psf_lp_noise + 0.01f * frame_e; */ st_fx->psf_lp_noise_fx = round_fx( L_mac( L_mult( 32440, st_fx->psf_lp_noise_fx ), 328, frame_e_fx ) ); /*Q8*/ + move16(); } } test(); test(); - IF( NE_16( amr_io_class, UNVOICED_CLAS ) && NE_16( st_fx->coder_type, INACTIVE ) && LT_16( st_fx->psf_lp_noise_fx, shl( 15, 8 ) ) ) + IF( NE_16( amr_io_class, UNVOICED_CLAS ) && NE_16( st_fx->coder_type, INACTIVE ) && LT_16( st_fx->psf_lp_noise_fx, 15 << 8 ) ) { tmp_coder_type = AUDIO; move16(); @@ -602,6 +611,7 @@ ivas_error amr_wb_dec_fx( { /*st->filt_lfE[i] = 0.3f + 0.7f * st->filt_lfE[i] ;*/ hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( L_deposit_h( 1229 ), 22938, hMusicPF->filt_lfE_fx[i] ) ); + move16(); } } @@ -639,7 +649,7 @@ ivas_error amr_wb_dec_fx( { /* long burst frame erasures */ test(); - IF( GT_16( st_fx->nbLostCmpt, 5 ) && GE_16( st_fx->clas_dec, VOICED_CLAS ) ) + if ( GT_16( st_fx->nbLostCmpt, 5 ) && GE_16( st_fx->clas_dec, VOICED_CLAS ) ) { st_fx->last_good = VOICED_TRANSITION; move16(); @@ -672,7 +682,7 @@ ivas_error amr_wb_dec_fx( /* Update circular buffer, keep last energy difference unchanged */ FOR( i = 1; i < MAX_LT; i++ ) { - hMusicPF->LDm_lt_diff_etot_fx[sub( i, 1 )] = hMusicPF->LDm_lt_diff_etot_fx[i]; + hMusicPF->LDm_lt_diff_etot_fx[i - 1] = hMusicPF->LDm_lt_diff_etot_fx[i]; move16(); } /* Filter energies update */ @@ -680,6 +690,7 @@ ivas_error amr_wb_dec_fx( { /*st->filt_lfE[i] = 0.3f + 0.7f * st->filt_lfE[i];*/ hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( L_deposit_h( 1229 ), 22938, hMusicPF->filt_lfE_fx[i] ) ); + move16(); } Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, 4, &st_fx->mem_deemph_fx, @@ -689,7 +700,7 @@ ivas_error amr_wb_dec_fx( syn_12k8_fx( L_FRAME, Aq_fx, exc2_fx, syn_fx, st_fx->mem_syn2_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); /* update old synthesis for classification */ - Copy( syn_fx + sub( L_FRAME, L_SYN_MEM_CLAS_ESTIM ), st_fx->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); + Copy( syn_fx + L_FRAME - L_SYN_MEM_CLAS_ESTIM, st_fx->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); FOR( i = 0; i < NB_SUBFR; i++ ) @@ -742,7 +753,7 @@ ivas_error amr_wb_dec_fx( *-----------------------------------------------------------------*/ /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ - Copy( syn_fx + sub( L_FRAME, L_SYN_MEM ), st_fx->mem_syn_r, L_SYN_MEM ); + Copy( syn_fx + L_FRAME - L_SYN_MEM, st_fx->mem_syn_r, L_SYN_MEM ); deemph_fx( syn_fx, PREEMPH_FAC, L_FRAME, &( st_fx->mem_deemph_fx ) ); @@ -750,8 +761,8 @@ ivas_error amr_wb_dec_fx( Copy( syn_fx_tmp2, syn_fx, L_FRAME ); /* TCX=Q-1, ACELP2 Q0 */ - Copy_Scale_sig( syn_fx + shr( L_FRAME, 1 ), hTcxDec->old_syn_Overl, shr( L_FRAME, 1 ), sub( -1, st_fx->Q_syn ) ); /*Q_syn*/ - Copy_Scale_sig( syn_fx + sub( L_FRAME, add( M, 1 ) ), st_fx->syn, add( M, 1 ), sub( 0, st_fx->Q_syn ) ); /*Q0*/ + Copy_Scale_sig( syn_fx + L_FRAME / 2, hTcxDec->old_syn_Overl, L_FRAME / 2, sub( -1, st_fx->Q_syn ) ); /*Q_syn*/ + Copy_Scale_sig( syn_fx + L_FRAME - M - 1, st_fx->syn, M + 1, sub( 0, st_fx->Q_syn ) ); /*Q0*/ /*------------------------------------------------------------------* * Formant post-filter @@ -763,7 +774,7 @@ ivas_error amr_wb_dec_fx( st_fx->hPFstat->on = 1; move16(); test(); - formant_post_filt_fx( st_fx->hPFstat, tmp_buffer_fx + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME, L_shl( st_fx->psf_lp_noise_fx, 15 ), st_fx->total_brate, (Word16) EQ_16( sub( amr_io_class, AUDIO_CLAS ), 0 ) ); + formant_post_filt_fx( st_fx->hPFstat, tmp_buffer_fx + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME, L_shl( st_fx->psf_lp_noise_fx, 15 ), st_fx->total_brate, sub( amr_io_class, AUDIO_CLAS ) == 0 ); } /*----------------------------------------------------------------* @@ -773,7 +784,7 @@ ivas_error amr_wb_dec_fx( flag_cna = 0; move16(); test(); - IF( ( GE_16( st_fx->psf_lp_noise_fx, shl( 15, 8 ) ) ) || EQ_16( st_fx->coder_type, INACTIVE ) ) + IF( ( GE_16( st_fx->psf_lp_noise_fx, ( 15 << 8 ) ) ) || EQ_16( st_fx->coder_type, INACTIVE ) ) { /*VAD only for non inactive frame*/ test(); @@ -809,7 +820,7 @@ ivas_error amr_wb_dec_fx( move16(); test(); - IF( st_fx->flag_cna && GE_16( st_fx->psf_lp_noise_fx, shl( 15, 8 ) ) ) + IF( st_fx->flag_cna && GE_16( st_fx->psf_lp_noise_fx, 15 << 8 ) ) { flag_cna = 1; move16(); @@ -828,14 +839,14 @@ ivas_error amr_wb_dec_fx( } - IF( EQ_16( flag_cna, 0 ) ) + IF( !flag_cna ) { test(); test(); test(); IF( EQ_16( st_fx->last_flag_cna, 1 ) && ( ( EQ_16( st_fx->last_core, ACELP_CORE ) && NE_16( st_fx->last_coder_type, AUDIO ) ) || EQ_16( st_fx->last_core, AMR_WB_CORE ) ) ) { - FOR( i = 0; i < shr( L_FRAME, 1 ); i++ ) + FOR( i = 0; i < L_FRAME / 2; i++ ) { syn_fx[i] = add( syn_fx[i], shr_r( st_fx->hFdCngDec->hFdCngCom->olapBufferSynth2[add( i, shr( i_mult( 5, L_FRAME ), 2 ) )], -st_fx->Q_syn ) ); move16(); @@ -858,9 +869,10 @@ ivas_error amr_wb_dec_fx( resampleCldfb( st_fx->cldfbAna, newCldfbBands, L_FRAME, 0 ); resampleCldfb( st_fx->cldfbBPF, newCldfbBands, L_FRAME, 0 ); - IF( GT_16( st_fx->ini_frame, 0 ) ) + if ( st_fx->ini_frame > 0 ) { st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, st_fx->cldfbAna->no_channels ); + move16(); } } @@ -876,7 +888,7 @@ ivas_error amr_wb_dec_fx( /* CLDFB analysis and add the BPF error signal */ i = 0; move16(); - IF( EQ_16( st_fx->bpf_off, 0 ) ) + if ( st_fx->bpf_off == 0 ) { i = CLDFB_NO_COL_MAX; move16(); @@ -947,7 +959,7 @@ ivas_error amr_wb_dec_fx( updt_dec_fx( st_fx, old_exc_fx, pitch_buf_fx, 0, Aq_fx, lsf_new_fx, lsp_new_fx, voice_factors_fx, dummy_buf_fx, gain_buf ); /* update old_Aq[] - needed in improv_amr_wb_gs_fx() */ - Copy( Aq_fx, st_fx->hAmrwb_IO->old_Aq_fx, NB_SUBFR * add( M, 1 ) ); + Copy( Aq_fx, st_fx->hAmrwb_IO->old_Aq_fx, NB_SUBFR * ( M + 1 ) ); test(); test(); @@ -957,7 +969,7 @@ ivas_error amr_wb_dec_fx( test(); test(); test(); - IF( !st_fx->bfi && st_fx->prev_bfi && GE_32( st_fx->last_total_brate, HQ_48k ) && EQ_16( st_fx->last_codec_mode, MODE2 ) && ( EQ_16( st_fx->last_core_bfi, TCX_20_CORE ) || EQ_16( st_fx->last_core_bfi, TCX_10_CORE ) ) && EQ_16( st_fx->plcInfo.concealment_method, TCX_NONTONAL ) && LT_32( st_fx->plcInfo.nbLostCmpt, 4 ) ) + if ( !st_fx->bfi && st_fx->prev_bfi && GE_32( st_fx->last_total_brate, HQ_48k ) && EQ_16( st_fx->last_codec_mode, MODE2 ) && ( EQ_16( st_fx->last_core_bfi, TCX_20_CORE ) || EQ_16( st_fx->last_core_bfi, TCX_10_CORE ) ) && EQ_16( st_fx->plcInfo.concealment_method, TCX_NONTONAL ) && LT_32( st_fx->plcInfo.nbLostCmpt, 4 ) ) { waveadj_rec = 1; move16(); @@ -1003,7 +1015,7 @@ ivas_error amr_wb_dec_fx( IF( st_fx->bfi ) { /* calculate another loss frame to fill gap in case of switching frame loss */ - IF( ( error = acelp_core_switch_dec_bfi_fx( st_fx, hHQ_core->fer_samples_fx, st_fx->coder_type ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = acelp_core_switch_dec_bfi_fx( st_fx, hHQ_core->fer_samples_fx, st_fx->coder_type ) ), IVAS_ERR_OK ) ) { return error; } @@ -1041,7 +1053,7 @@ ivas_error amr_wb_dec_fx( FOR( i = 0; i < tmps; i++ ) { #ifdef BASOP_NOGLOB - synth_out_fx[i + delay_comp] = msu_r_sat( L_mult( synth_out_fx[i + delay_comp], alpha ), hHQ_core->old_out_fx[i + nz], add( alpha, -32768 ) ); + synth_out_fx[add( i, delay_comp )] = msu_r_sat( L_mult( synth_out_fx[add( i, delay_comp )], alpha ), hHQ_core->old_out_fx[add( i, nz )], add( alpha, -32768 ) ); #else synth_out_fx[i + delay_comp] = msu_r( L_mult( synth_out_fx[i + delay_comp], alpha ), hHQ_core->old_out_fx[i + nz], add( alpha, -32768 ) ); #endif @@ -1058,7 +1070,7 @@ ivas_error amr_wb_dec_fx( /* Delay ACELP synthesis by DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS delay */ IF( GE_16( output_frame, L_FRAME16k ) ) { - tmps = NS2SA_fx2( st_fx->output_Fs, L_sub( DELAY_BWE_TOTAL_NS, DELAY_CLDFB_NS ) ); + tmps = NS2SA_fx2( st_fx->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ); Scale_sig( st_fx->prev_synth_buffer_fx, tmps, sub( st_fx->Q_syn2, st_fx->Qprev_synth_buffer_fx ) ); delay_signal( synth_out_fx, output_frame, st_fx->prev_synth_buffer_fx, tmps ); } @@ -1084,7 +1096,7 @@ ivas_error amr_wb_dec_fx( hp20( synth_out_fx, 1 /*stride*/, output_frame, st_fx->L_mem_hp_out_fx, L_mult0( output_frame, 50 ) ); /* save synthesis for core switching */ - Copy_Scale_sig( synth_out_fx + NS2SA_fx2( st_fx->output_Fs, L_add( ACELP_LOOK_NS, DELAY_BWE_TOTAL_NS ) ), st_fx->old_synth_sw_fx, NS2SA_fx2( st_fx->output_Fs, L_sub( FRAME_SIZE_NS, L_add( ACELP_LOOK_NS, DELAY_BWE_TOTAL_NS ) ) ), sub( hHQ_core->Q_old_postdec, st_fx->Q_syn2 ) ); + Copy_Scale_sig( synth_out_fx + NS2SA_fx2( st_fx->output_Fs, ACELP_LOOK_NS + DELAY_BWE_TOTAL_NS ), st_fx->old_synth_sw_fx, NS2SA_fx2( st_fx->output_Fs, FRAME_SIZE_NS - ACELP_LOOK_NS - DELAY_BWE_TOTAL_NS ), sub( hHQ_core->Q_old_postdec, st_fx->Q_syn2 ) ); { /* TCX-LTP Postfilter: used in AMR-WB IO to update memories and to avoid discontinuities when the past frame was TCX */ @@ -1121,17 +1133,17 @@ void amr_wb_dec_init_fx( /* Improvement of unvoiced and audio signals in AMR-WB IO mode */ hAmrwb_IO->UV_cnt_fx = 30; move16(); - hAmrwb_IO->LT_UV_cnt_fx = shl( 60, 6 ); + hAmrwb_IO->LT_UV_cnt_fx = ( 60 << 6 ); move16(); set16_fx( hAmrwb_IO->lt_diff_etot_fx, 0, MAX_LT ); hAmrwb_IO->Last_ener_fx = 0; move16(); - set16_fx( hAmrwb_IO->old_Aq_fx, 0, i_mult( NB_SUBFR, add( M, 1 ) ) ); + set16_fx( hAmrwb_IO->old_Aq_fx, 0, i_mult( NB_SUBFR, M + 1 ) ); hAmrwb_IO->old_Aq_fx[0] = 16384; - hAmrwb_IO->old_Aq_fx[add( M, 1 )] = 16384; - hAmrwb_IO->old_Aq_fx[i_mult( 2, add( M, 1 ) )] = 16384; - hAmrwb_IO->old_Aq_fx[i_mult( 3, add( M, 1 ) )] = 16384; + hAmrwb_IO->old_Aq_fx[M + 1] = 16384; + hAmrwb_IO->old_Aq_fx[2 * ( M + 1 )] = 16384; + hAmrwb_IO->old_Aq_fx[3 * ( M + 1 )] = 16384; move16(); move16(); move16(); diff --git a/lib_dec/ari_dec_fx.c b/lib_dec/ari_dec_fx.c index 26390d6e0..78d7b799c 100644 --- a/lib_dec/ari_dec_fx.c +++ b/lib_dec/ari_dec_fx.c @@ -34,6 +34,7 @@ void ari_start_decoding_14bits_fx( val = L_and( L_deposit_l( get_next_indice( st, cbitsnew ) ), 0xffffL ); s->low = L_deposit_l( 0 ); + move32(); s->high = L_add( ari_q4new, 1 ); move32(); s->value = val; @@ -62,6 +63,7 @@ Word16 ari_start_decoding_14bits_prm_fx( } } s->low = L_deposit_l( 0 ); + move32(); s->high = L_add( ari_q4new, 1 ); move32(); s->value = val; @@ -354,7 +356,7 @@ static Word16 ari_lookup_pow_fx( Tastat *s, Word16 base ) Word16 k; range = L_sub( s->high, s->low ); - cum = L_add( L_shl( L_sub( s->value, s->low ), stat_bitsnew ), sub( shl( 1, stat_bitsnew ), 1 ) ); + cum = L_add( L_shl( L_sub( s->value, s->low ), stat_bitsnew ), ( ( 1 << stat_bitsnew ) - 1 ) ); range_h = extract_l( L_shr( range, 15 ) ); range_l = extract_l( L_and( range, 0x7FFF ) ); @@ -377,11 +379,11 @@ static Word16 ari_lookup_pow_fx( Tastat *s, Word16 base ) { highlim = testval; move16(); - pows[k] = mult_r( pows[sub( k, 1 )], pows[sub( k, 1 )] ); + pows[k] = mult_r( pows[k - 1], pows[k - 1] ); move16(); testval = mult_r( pows[k], base ); - IF( LE_32( L_multi31x16_X2( range_h, range_l, shr( testval, 1 ) ), cum ) ) /* found! big range is [lowlim,testval], (now narrow it down) */ + IF( LE_32( L_multi31x16_X2( range_h, range_l, testval >> 1 ), cum ) ) /* found! big range is [lowlim,testval], (now narrow it down) */ { lowlim = testval; move16(); @@ -397,7 +399,7 @@ static Word16 ari_lookup_pow_fx( Tastat *s, Word16 base ) { testval = mult_r( highlim, pows[k + 1] ); - IF( LE_32( L_multi31x16_X2( range_h, range_l, shr( testval, 1 ) ), cum ) ) + IF( LE_32( L_multi31x16_X2( range_h, range_l, testval >> 1 ), cum ) ) { lowlim = testval; move16(); diff --git a/lib_dec/ari_hm_dec.c b/lib_dec/ari_hm_dec.c index e2d5e8de7..fc45166c1 100644 --- a/lib_dec/ari_hm_dec.c +++ b/lib_dec/ari_hm_dec.c @@ -99,6 +99,7 @@ DecodeIndex_fx( *PeriodicityIndex = kLtpHmFlag; move16(); *PeriodicityIndex = s_or( *PeriodicityIndex, get_next_indice_fx( st, NumRatioBits[Bandwidth][LtpPitchIndex] ) ); + move16(); *PeriodicityIndex = add( *PeriodicityIndex, 1 ); move16(); *PeriodicityIndex = s_or( *PeriodicityIndex, shl( LtpPitchIndex, 9 ) ); @@ -155,9 +156,10 @@ static Word16 tcx_hm_dequantize_gain_fx( /* safety check in case of bit errors */ test(); - IF( !( LE_16( 0, gain_idx ) && LT_16( gain_idx, shl( 1, kTcxHmNumGainBits ) ) ) ) + IF( !( 0 <= gain_idx && LT_16( gain_idx, ( 1 << kTcxHmNumGainBits ) ) ) ) { *gain = 0; + move16(); return 1; } diff --git a/lib_dec/arith_coder_dec.c b/lib_dec/arith_coder_dec.c index 367100965..0bffd6963 100644 --- a/lib_dec/arith_coder_dec.c +++ b/lib_dec/arith_coder_dec.c @@ -157,17 +157,20 @@ static Word16 tcx_arith_decode_ivas_fx( /* decode line magnitude */ bp = ari_decode_14bits_pow_ivas( prm, bp, target_bits, &q, &as, exp_k ); - IF( NE_16( q, 0 ) ) + IF( q ) { /* line is non-zero, decode sign */ bp = ari_decode_14bits_sign_ivas( prm, bp, target_bits, &s, &as ); q_spectrum[k] = L_mult( q, sub( 3, shl( s, 1 ) ) ); + move32(); q_spectrum[k] = L_shl( q_spectrum[k], 30 - SPEC_EXP_DEC ); + move32(); } ELSE { /* line is zero, no sign needed */ q_spectrum[k] = L_deposit_l( 0 ); + move32(); } IF( LE_32( as.high, as.low ) ) @@ -331,7 +334,7 @@ void tcx_arith_decode_envelope_ivas_fx( IF( GT_16( L_spec, N_MAX_ARI ) || ( EQ_16( st->element_mode, EVS_MONO ) && GT_16( target_bits, ( ACELP_13k20 / FRAMES_PER_SEC ) ) ) || ( EQ_16( st->element_mode, IVAS_SCE ) && ( GT_16( st->bits_frame_nominal, ( LPC_SHAPED_ARI_MAX_RATE / FRAMES_PER_SEC ) ) ) ) || ( GT_16( st->element_mode, IVAS_SCE ) && ( GT_16( st->bits_frame_nominal, ( LPC_SHAPED_ARI_MAX_RATE_CPE / FRAMES_PER_SEC ) ) ) ) || - ( LE_16( target_bits, 0 ) ) ) + ( target_bits <= 0 ) ) { /* this could happen in case of bit errors */ st->BER_detect = 1; @@ -362,13 +365,13 @@ void tcx_arith_decode_envelope_ivas_fx( tcx_arith_render_envelope_flt( A_ind, L_frame, L_spec, hTcxCfg->preemph_fac, gamma_w, gamma_uw, env ); #undef WMC_TOOL_SKIP - IF( NE_16( use_hm, 0 ) ) + IF( use_hm != 0 ) { IF( NE_16( prm_hm[0], 0 ) ) { tcx_hm_decode( L_spec, env, target_bits, st->coder_type, prm_hm, tcxltp_pitch, &hm_bits ); - IF( LT_16( hm_bits, 0 ) ) + IF( hm_bits < 0 ) { st->BER_detect = 1; move16(); @@ -381,7 +384,7 @@ void tcx_arith_decode_envelope_ivas_fx( return; } } - else + ELSE { hm_bits = 1; move16(); @@ -404,7 +407,7 @@ void tcx_arith_decode_envelope_ivas_fx( move16(); /* safety check in case of bit errors */ - IF( LT_16( *arith_bits, 0 ) ) + IF( *arith_bits < 0 ) { st->BER_detect = 1; move16(); diff --git a/lib_dec/arith_coder_dec_fx.c b/lib_dec/arith_coder_dec_fx.c index ee9208b4e..ddd4ac478 100644 --- a/lib_dec/arith_coder_dec_fx.c +++ b/lib_dec/arith_coder_dec_fx.c @@ -42,7 +42,7 @@ static Word16 tcx_arith_decode_fx( L_tmp = L_deposit_l( 0 ); FOR( k = 0; k < L_frame; k++ ) { - IF( EQ_16( envelope[k], 0 ) ) /* safety check in case of bit errors */ + IF( envelope[k] == 0 ) /* safety check in case of bit errors */ { set32_fx( q_spectrum, 0, L_frame ); return -1; @@ -54,11 +54,12 @@ static Word16 tcx_arith_decode_fx( /* decode line magnitude */ bp = ari_decode_14bits_pow_fx( prm, bp, target_bits, &q, &as, exp_k ); - IF( EQ_16( q, 0 ) ) + IF( q == 0 ) { q_spectrum[k] = L_deposit_l( 0 ); + move32(); } - IF( NE_16( q, 0 ) ) /* line is non-zero, decode sign */ + IF( q != 0 ) /* line is non-zero, decode sign */ { bp = ari_decode_14bits_sign_fx( prm, bp, target_bits, &s, &as ); @@ -77,7 +78,7 @@ static Word16 tcx_arith_decode_fx( IF( ari_decode_overflow_fx( &as ) ) { - IF( LT_16( bp, target_bits ) ) /* safety check in case of bit errors */ + if ( LT_16( bp, target_bits ) ) /* safety check in case of bit errors */ { bp = -1; move16(); @@ -92,7 +93,7 @@ static Word16 tcx_arith_decode_fx( /* noise filling seed */ *nf_seed = extract_l( L_tmp ); - + move16(); return bp; } @@ -137,7 +138,7 @@ void tcx_arith_decode_envelope_fx( IF( GT_16( L_spec, N_MAX_ARI ) || ( EQ_16( st->element_mode, EVS_MONO ) && GT_16( target_bits, ( ACELP_13k20 / FRAMES_PER_SEC ) ) ) || ( EQ_16( st->element_mode, IVAS_SCE ) && ( GT_16( st->bits_frame_nominal, ( LPC_SHAPED_ARI_MAX_RATE / FRAMES_PER_SEC ) ) ) ) || ( GT_16( st->element_mode, IVAS_SCE ) && ( GT_16( st->bits_frame_nominal, ( LPC_SHAPED_ARI_MAX_RATE_CPE / FRAMES_PER_SEC ) ) ) ) || - LE_16( target_bits, 0 ) ) + ( target_bits <= 0 ) ) { /* this could happen in case of bit errors */ st->BER_detect = 1; @@ -165,13 +166,13 @@ void tcx_arith_decode_envelope_fx( tcx_arith_render_envelope( A_ind, L_frame, L_spec, tcx_cfg->preemph_fac, gamma_w, gamma_uw, env ); - IF( NE_16( use_hm, 0 ) ) + IF( use_hm ) { - IF( NE_16( prm_hm[0], 0 ) ) + IF( prm_hm[0] ) { tcx_hm_decode( L_spec, env, target_bits, tcx_cfg->coder_type, prm_hm, tcxltp_pitch, &hm_bits ); - IF( LT_16( hm_bits, 0 ) ) + IF( hm_bits < 0 ) { st->BER_detect = 1; move16(); @@ -211,7 +212,7 @@ void tcx_arith_decode_envelope_fx( move16(); /* safety check in case of bit errors */ - IF( LT_16( *arith_bits, 0 ) ) + IF( *arith_bits < 0 ) { st->BER_detect = 1; move16(); diff --git a/lib_dec/avq_dec_fx.c b/lib_dec/avq_dec_fx.c index 68d3e9549..d4351b1a5 100644 --- a/lib_dec/avq_dec_fx.c +++ b/lib_dec/avq_dec_fx.c @@ -60,7 +60,7 @@ void AVQ_demuxdec_fx( move16(); dummy_bits = 0; move16(); - svOrder[Nsv - 1] = trgtSvPos; + svOrder[sub( Nsv, 1 )] = trgtSvPos; move16(); svOrder[0] = 0; move16(); @@ -133,6 +133,7 @@ void AVQ_demuxdec_fx( DO { nq[k] = add( nq[k], 1 ); + move16(); // IF ( 5 * nq[k] + 4 == bits ) IF( EQ_16( add( add( shl( nq[k], 2 ), nq[k] ), 4 ), bits ) ) @@ -142,7 +143,7 @@ void AVQ_demuxdec_fx( } WHILE( get_next_indice_1( st ) ); - IF( EQ_16( add( add( shl( nq[k], 2 ), nq[k] ), 4 ), bits ) ) /* check the overflow */ + if ( EQ_16( add( add( shl( nq[k], 2 ), nq[k] ), 4 ), bits ) ) /* check the overflow */ { bits = add( bits, 1 ); /* overflow stop bit */ } @@ -166,6 +167,7 @@ void AVQ_demuxdec_fx( IF( GT_16( nq[k], 0 ) ) { nq[k] = add( nq[k], 1 ); + move16(); } /* read codebook indices (rank I and event. Voronoi index kv) */ @@ -174,9 +176,9 @@ void AVQ_demuxdec_fx( } /* for */ /* Bit Saving Solution */ - IF( GT_16( avq_bit_sFlag, 0 ) && GT_16( bits, 8 ) ) + IF( ( avq_bit_sFlag > 0 ) && GT_16( bits, 8 ) ) { - i = svOrder[Nsv - 1]; + i = svOrder[sub( Nsv, 1 )]; nq[i] = 0; move16(); bitsMod = bits % 5; @@ -186,7 +188,7 @@ void AVQ_demuxdec_fx( move16(); FOR( j = i; j < sub( Nsv, 1 ); j++ ) { - IF( EQ_16( nq[svOrder[j]], 0 ) ) + if ( ( nq[svOrder[j]] == 0 ) ) { nullVec = add( nullVec, 1 ); } @@ -204,14 +206,14 @@ void AVQ_demuxdec_fx( test(); test(); test(); - IF( ( GT_16( bitsMod, 0 ) || ( EQ_16( nullVec, 4 ) && EQ_16( nq_est, 5 ) ) ) && NE_16( bitsMod, 4 ) && GE_16( add( bits, nullVec ), ( add( add( shl( nq_est, 2 ), nq_est ), 4 ) ) ) && EQ_16( nq[svOrder[sub( Nsv, 2 )]], 0 ) ) /* dummy bits */ + IF( ( ( bitsMod > 0 ) || ( EQ_16( nullVec, 4 ) && EQ_16( nq_est, 5 ) ) ) && NE_16( bitsMod, 4 ) && GE_16( add( bits, nullVec ), ( add( add( shl( nq_est, 2 ), nq_est ), 4 ) ) ) && ( nq[svOrder[sub( Nsv, 2 )]] == 0 ) ) /* dummy bits */ { dummy_bits = sub( 5, bitsMod ); bits = add( bits, dummy_bits ); /* add dummy bits */ bitsMod = 0; move16(); } - ELSE IF( GT_16( nq_est, 4 ) && ( ( EQ_16( bitsMod, 0 ) && GT_16( nullVec, 3 ) && LT_16( nullVec, 6 ) ) || ( EQ_16( bitsMod, 4 ) && EQ_16( nullVec, 5 ) ) ) && EQ_16( nq[svOrder[sub( Nsv, 2 )]], 0 ) ) /* wasted bits 4, 5 for nq 6,7..*/ + ELSE IF( GT_16( nq_est, 4 ) && ( ( ( bitsMod == 0 ) && GT_16( nullVec, 3 ) && LT_16( nullVec, 6 ) ) || ( EQ_16( bitsMod, 4 ) && EQ_16( nullVec, 5 ) ) ) && ( nq[svOrder[Nsv - 2]] == 0 ) ) /* wasted bits 4, 5 for nq 6,7..*/ { underflow = 0; move16(); @@ -252,13 +254,13 @@ void AVQ_demuxdec_fx( unusedbitsFlag = 0; move16(); - IF( EQ_16( dummy_bits, 0 ) ) + IF( ( dummy_bits == 0 ) ) { test(); test(); test(); test(); - IF( EQ_16( unused_bits_idx, 0 ) && GT_16( bits, BIT_SAVING_LOW_THR ) ) + IF( ( unused_bits_idx == 0 ) && GT_16( bits, BIT_SAVING_LOW_THR ) ) { unusedbitsFlag = 1; move16(); @@ -273,7 +275,7 @@ void AVQ_demuxdec_fx( /*Compute AVQ code book number from unused Bits */ tmp = (Word16) ( sub( bits, add( add( shl( add( unusedbitsFlag, unused_bits_idx ), 2 ), unusedbitsFlag ), unused_bits_idx ) ) ); nq_est = idiv1616( tmp, 5 ); - IF( EQ_16( ( tmp % 5 ), 0 ) ) + IF( ( ( tmp % 5 ) == 0 ) ) { nq_est = nq_est; move16(); @@ -282,7 +284,7 @@ void AVQ_demuxdec_fx( { nq_est = add( nq_est, 1 ); } - IF( EQ_16( nq_est, 1 ) ) + if ( EQ_16( nq_est, 1 ) ) { nq_est = 0; move16(); @@ -291,7 +293,7 @@ void AVQ_demuxdec_fx( bits = sub( bits, unused_bits_idx ); - IF( NE_16( nq_est, 0 ) ) + if ( ( nq_est != 0 ) ) { bits = sub( bits, 1 ); } @@ -299,11 +301,11 @@ void AVQ_demuxdec_fx( nq[i] = nq_est; move16(); /* read codebook indices (rank I and event. Voronoi index kv) */ - read_cv_fx( st, &I[i], &kv[shl( i, 3 )], nq[i], &bits ); + read_cv_fx( st, &I[i], &kv[i * 8], nq[i], &bits ); bits = sub( bits, dummy_bits ); - IF( NE_16( bitsMod, 4 ) ) + if ( NE_16( bitsMod, 4 ) ) { bits = add( bits, bitsMod ); } @@ -318,7 +320,8 @@ void AVQ_demuxdec_fx( /* write decoded RE8 vector to decoded subvector #i */ FOR( j = 0; j < 8; j++ ) { - xriq[add( shl( i, 3 ), j )] = code[j]; + xriq[add( i * 8, j )] = code[j]; + move16(); } } move16(); @@ -357,7 +360,7 @@ void AVQ_dec_lpc( /* decode all subvectors */ - FOR( l = sub( Nsv, 1 ); l >= 0; l-- ) + FOR( l = Nsv - 1; l >= 0; l-- ) { nq = indx[l]; /* quantizer number (0,2,3..n) */ move16(); @@ -389,8 +392,7 @@ void AVQ_dec_lpc( FOR( i = 7; i >= 0; i-- ) { - kv[i] = shl( kv[i], 1 ); - kv[i] = add( kv[i], s_and( ival, 0x01 ) ); + kv[i] = add( ( kv[i] << 1 ), s_and( ival, 0x01 ) ); move16(); ival = shr( ival, 1 ); } @@ -442,40 +444,47 @@ static void read_cv_fx( bits = *nbits; move16(); /* read codebook indices (rank I and event. Voronoi index kv) */ - IF( EQ_16( nq, 0 ) ) /* Q0 */ + IF( ( nq == 0 ) ) /* Q0 */ { /* nothing to read */ } ELSE IF( LT_16( nq, 5 ) ) /* Q2, Q3, Q4 */ { *I = get_next_indice( st, shl( nq, 2 ) ); + move32(); bits = sub( bits, shl( nq, 2 ) ); } - ELSE IF( EQ_16( s_and( nq, 1 ), 0 ) ) /* Q4 + Voronoi extensions r=1,2,3,... */ + ELSE IF( ( s_and( nq, 1 ) == 0 ) ) /* Q4 + Voronoi extensions r=1,2,3,... */ { *I = get_next_indice( st, 16 ); + move32(); bits = sub( bits, 16 ); order_v = (Word16) sub( shr( nq, 1 ), 2 ); + move32(); FOR( j = 0; j < 8; j++ ) { kv[j] = get_next_indice( st, order_v ); + move16(); } - bits = sub( bits, shl( order_v, 3 ) ); + bits = sub( bits, ( shl( order_v, 3 ) ) ); } ELSE /* Q3 + Voronoi extensions r=1,2,3,... */ { *I = get_next_indice( st, 12 ); + move32(); bits = sub( bits, 12 ); order_v = (Word16) sub( shr( nq, 1 ), 1 ); FOR( j = 0; j < 8; j++ ) { kv[j] = get_next_indice( st, order_v ); + move32(); } bits = sub( bits, shl( order_v, 3 ) ); } *nbits = bits; + move16(); return; } diff --git a/lib_dec/bass_psfilter.c b/lib_dec/bass_psfilter.c index b721487fb..13c822522 100644 --- a/lib_dec/bass_psfilter.c +++ b/lib_dec/bass_psfilter.c @@ -715,11 +715,7 @@ Word16 res_bpf_adapt_ivas_fx( shift = W_norm( W_tmp ); W_tmp = W_shl( W_tmp, shift ); res_hb_nrg = W_extract_h( W_tmp ); - IF( GT_16( add( Q24, shift ), 32 ) ) - { - res_hb_nrg = L_shr( res_hb_nrg, sub( add( Q24, shift ), 32 ) ); // Q0 - } - + res_hb_nrg = L_shr( res_hb_nrg, sub( add( Q24, shift ), 32 ) ); // Q0 res_hb_nrg = Mpy_32_16_1( res_hb_nrg, bw_inv ); res_hb_nrg = L_add( Mpy_32_16_1( res_hb_nrg, STEREO_DFT_BPF_ADAPT_ALPHA_FX ), Mpy_32_16_1( hStereoDft->res_hb_nrg_mem_fx, sub( MAX_16, STEREO_DFT_BPF_ADAPT_ALPHA_FX ) ) ); hStereoDft->res_hb_nrg_mem_fx = res_hb_nrg; @@ -732,26 +728,29 @@ Word16 res_bpf_adapt_ivas_fx( { tmp = L_sub( bpf_error_signal_8k[i], hStereoDft->bpf_error_signal_last_fx ); error_nrg = Madd_32_32( error_nrg, tmp, tmp ); - hStereoDft->bpf_error_signal_last_fx = bpf_error_signal_8k[add( i, sub( STEREO_DFT_L_SUBFR_8k, 1 ) )]; + hStereoDft->bpf_error_signal_last_fx = bpf_error_signal_8k[add( i, ( STEREO_DFT_L_SUBFR_8k - 1 ) )]; move32(); } - error_nrg = L_shr( error_nrg, 1 ); // Q0 + error_nrg = L_shl( error_nrg, 1 ); // Q0 error_nrg = Mpy_32_16_1( error_nrg, 6553 /* 0.2f in Q15 */ ); /* Division by 5 for average value */ /* Form decision variable and apply limit */ IF( LT_32( ( L_shr( error_nrg, 1 ) ), res_hb_nrg ) ) { - bpf_error_ratio = (Word16) ( L_shl( ( L_shl( error_nrg, Q5 ) / res_hb_nrg ), Q8 ) ); - move16(); + Word16 temp; + bpf_error_ratio = BASOP_Util_Divide3232_Scale( error_nrg, res_hb_nrg, &temp ); + bpf_error_ratio = shl( bpf_error_ratio, sub( 13, sub( 15, temp ) ) ); } ELSE { - bpf_error_ratio = shl( ONE_IN_Q12, 1 ); + bpf_error_ratio = ONE_IN_Q14; // Q13 + move16(); } - bpf_error_ratio = add( mult( STEREO_DFT_BPF_ADAPT_BETA_FX, bpf_error_ratio ), mult( sub( MAX_16, STEREO_DFT_BPF_ADAPT_BETA_FX ), hStereoDft->bpf_error_ratio_mem_fx ) ); + bpf_error_ratio = add( mult( STEREO_DFT_BPF_ADAPT_BETA_FX, bpf_error_ratio ), mult( ( MAX_16 - STEREO_DFT_BPF_ADAPT_BETA_FX ), hStereoDft->bpf_error_ratio_mem_fx ) ); hStereoDft->bpf_error_ratio_mem_fx = bpf_error_ratio; move16(); res_bpf_flag = (Word16) LT_16( bpf_error_ratio, ONE_IN_Q13 ); + move16(); return res_bpf_flag; } @@ -848,17 +847,17 @@ void bpf_pitch_coherence_ivas_fx( test(); IF( GT_16( st->clas_dec, UNVOICED_CLAS ) && NE_16( st->element_mode, EVS_MONO ) ) { - pc = L_abs( L_sub( L_add( st->old_pitch_buf_fx[add( nb_subfr, 3 )], st->old_pitch_buf_fx[add( nb_subfr, 2 )] ), L_add( st->old_pitch_buf_fx[nb_subfr], st->old_pitch_buf_fx[add( nb_subfr, 1 )] ) ) ); + pc = L_abs( L_sub( L_add( st->old_pitch_buf_fx[nb_subfr + 3], st->old_pitch_buf_fx[nb_subfr + 2] ), L_add( st->old_pitch_buf_fx[nb_subfr], st->old_pitch_buf_fx[nb_subfr + 1] ) ) ); pc = Mpy_32_32( pc, scaled_inv_L_frame ); pcn1 = L_add( Mpy_32_32( pc, K_PC_DEC_FX32 ), C_PC_DEC_FX ); pcn1 = L_max( L_min( pcn1, 4096 ), 0 ); - pc = L_abs( L_sub( L_add( pitch_buf[sub( nb_subfr, 1 )], pitch_buf[sub( nb_subfr, 2 )] ), L_add( pitch_buf[1], pitch_buf[0] ) ) ); + pc = L_abs( L_sub( L_add( pitch_buf[nb_subfr - 1], pitch_buf[nb_subfr - 2] ), L_add( pitch_buf[1], pitch_buf[0] ) ) ); pc = Mpy_32_32( pc, scaled_inv_L_frame ); pcn2 = L_add( Mpy_32_32( pc, K_PC_DEC_FX32 ), C_PC_DEC_FX ); pcn2 = L_max( L_min( pcn2, 4096 ), 0 ); - pc = L_abs( L_sub( L_add( st->old_pitch_buf_fx[add( nb_subfr, 3 )], st->old_pitch_buf_fx[add( nb_subfr, 2 )] ), L_add( pitch_buf[1], pitch_buf[0] ) ) ); + pc = L_abs( L_sub( L_add( st->old_pitch_buf_fx[nb_subfr + 3], st->old_pitch_buf_fx[nb_subfr + 2] ), L_add( pitch_buf[1], pitch_buf[0] ) ) ); pc = Mpy_32_32( pc, scaled_inv_L_frame ); pcn3 = L_add( Mpy_32_32( pc, K_PC_DEC_FX32 ), C_PC_DEC_FX ); pcn3 = L_max( L_min( pcn3, 4096 ), 0 ); diff --git a/lib_dec/bass_psfilter_fx.c b/lib_dec/bass_psfilter_fx.c index c8287c00c..d3984a7e4 100644 --- a/lib_dec/bass_psfilter_fx.c +++ b/lib_dec/bass_psfilter_fx.c @@ -107,6 +107,7 @@ void bass_psfilter_fx( Word16 nb_subfr; Word16 delta_v_stab; Word16 T_update = 0; + move16(); Word16 dist_pit_diff, idx_pit_min, idx_pit_max, vibrato, Track_on; Word16 loc_pit_max, loc_pit_min, diff_pit; Word16 TrackOnR, vibratR, alp_tmp; @@ -158,7 +159,7 @@ void bass_psfilter_fx( { FOR( i = L_TRACK_HIST - 1; i > 0; i-- ) { - hBPF->mem_mean_pit_fx[i] = hBPF->mem_mean_pit_fx[sub( i, 1 )]; + hBPF->mem_mean_pit_fx[i] = hBPF->mem_mean_pit_fx[i - 1]; move16(); /*Q6 */ } Ltmp = L_deposit_l( 0 ); @@ -190,7 +191,7 @@ void bass_psfilter_fx( test(); test(); test(); - IF( NE_16( coder_type, INACTIVE ) && GE_16( diff_pit, shl( 2, 4 ) ) && LT_16( diff_pit, shl( 10, 4 ) ) && GE_16( dist_pit_diff, 3 ) ) + IF( ( coder_type != INACTIVE ) && GE_16( diff_pit, ( 2 << 4 ) ) && LT_16( diff_pit, ( 10 << 4 ) ) && GE_16( dist_pit_diff, 3 ) ) { vibrato = 1; move16(); @@ -221,18 +222,21 @@ void bass_psfilter_fx( { /**psf_att = add(mult_r(1638,alp_tmp),mult_r(31130,*psf_att)); //Q15 */ hBPF->psf_att_fx = round_fx( L_mac( L_mult( 1638, alp_tmp ), 31130, hBPF->psf_att_fx ) ); /*Q15 */ + move16(); } ELSE { /**psf_att = add(mult_r(13107,alp_tmp),mult_r(19661,*psf_att)); //Q15 */ hBPF->psf_att_fx = round_fx( L_mac( L_mult( 13107, alp_tmp ), 19661, hBPF->psf_att_fx ) ); /*Q15 */ + move16(); } test(); IF( pitch_buf_fx == NULL || bpf_off ) { /* do not use BPF for HQ core */ T_update = 80; - IF( EQ_16( L_frame, L_FRAME8k ) ) + move16(); + if ( EQ_16( L_frame, L_FRAME8k ) ) { T_update = 40; move16(); @@ -260,6 +264,7 @@ void bass_psfilter_fx( tmp = add( shr( pitch_buf_fx[i], 1 ), 32 ); } T_sf[i] = shr( tmp, 6 ); + move16(); test(); IF( EQ_16( L_frame, L_FRAME16k ) || EQ_16( L_frame, L_FRAME8k ) ) { @@ -273,7 +278,7 @@ void bass_psfilter_fx( } } - T = T_sf[sub( i, 1 )]; + T = T_sf[i - 1]; move16(); syn_fx = &syn_buf_fx[add( nbpsf_pit_max, L_frame )]; sigPtr = syn_fx - T; @@ -295,14 +300,14 @@ void bass_psfilter_fx( syn_fx = &syn_buf_fx[add( nbpsf_pit_max, i_subfr )]; syn2_fx = &syn2_buf_fx[i_subfr]; - IF( NE_16( T, 0 ) ) + IF( T ) { test(); IF( GE_16( T, PIT_MIN ) && Opt_AMR_WB ) { T = Pit_track_fx( syn_fx, T ); - IF( NE_16( T, T_sf[subfr_pos] ) ) + if ( NE_16( T, T_sf[subfr_pos] ) ) { Track_on = 1; move16(); @@ -366,14 +371,14 @@ void bass_psfilter_fx( #else tmp2 = round_fx( L_shl( Lener, exp2 ) ); #endif - IF( GT_16( tmp, tmp2 ) ) + if ( GT_16( tmp, tmp2 ) ) { exp = sub( exp, 1 ); } exp2 = sub( exp, exp2 ); /* exponent num - exponent denom */ /* gain = corr / ener */ gain = div_s( round_fx( L_shl( Ltmp, exp ) ), tmp2 ); - IF( LT_32( Lcorr, 0 ) ) + if ( Lcorr < 0 ) { gain = sub( 0, gain ); } @@ -416,7 +421,7 @@ void bass_psfilter_fx( #else tmp2 = round_fx( L_shl( Lener, exp2 ) ); #endif - IF( GT_16( tmp, tmp2 ) ) + if ( GT_16( tmp, tmp2 ) ) { exp = sub( exp, 1 ); } @@ -427,7 +432,7 @@ void bass_psfilter_fx( #else alpha = shr( div_s( round_fx( L_shl( Ltmp, exp ) ), tmp2 ), exp2 ); /*Q15 */ #endif - IF( LT_32( Lcorr, 0 ) ) + if ( Lcorr < 0 ) { alpha = sub( 0, alpha ); } @@ -499,7 +504,7 @@ void bass_psfilter_fx( Lener = L_mac0( Lener, err[i], err[i] ); #endif } - exp2 = sub( -1, 2 ); + exp2 = -1 - 2; move16(); /* 'Lener' is divided by 2 */ IF( EQ_32( Lener, 2147483647L ) ) @@ -548,7 +553,7 @@ void bass_psfilter_fx( Track_on = 0; move16(); - IF( EQ_16( coder_type, AUDIO ) ) /* GSC mode without temporal component */ + if ( EQ_16( coder_type, AUDIO ) ) /* GSC mode without temporal component */ { Track_on = 1; move16(); @@ -601,14 +606,14 @@ void bass_psfilter_fx( exp2 = norm_l( Lener ); tmp2 = round_fx( L_shl( Lener, exp2 ) ); #endif - IF( GT_16( tmp, tmp2 ) ) + if ( GT_16( tmp, tmp2 ) ) { exp = sub( exp, 1 ); } exp2 = sub( exp, exp2 ); /* exponent num - exponent denom */ /* gain = corr / ener */ gain = div_s( round_fx( L_shl( Ltmp, exp ) ), tmp2 ); - IF( LT_32( Lcorr, 0 ) ) + if ( Lcorr < 0 ) { gain = sub( 0, gain ); } @@ -647,7 +652,7 @@ void bass_psfilter_fx( #else tmp2 = round_fx( L_shl( Lener, exp2 ) ); #endif - IF( GT_16( tmp, tmp2 ) ) + if ( GT_16( tmp, tmp2 ) ) { exp = sub( exp, 1 ); } @@ -684,14 +689,14 @@ void bass_psfilter_fx( Lener = L_mac0( Lener, err[i], err[i] ); #endif } - exp2 = sub( -1, 2 ); + exp2 = -1 - 2; move16(); /* 'Lener' is divided by 2 */ IF( EQ_32( Lener, 2147483647L ) ) { Lener = L_deposit_h( -32768 ); - sigPtr = err + shr( subfr_len, 1 ); - FOR( i = 0; i < shr( subfr_len, 1 ); i++ ) + sigPtr = err + subfr_len / 2; + FOR( i = 0; i < subfr_len / 2; i++ ) { Lener0 = L_mult0( sigPtr[i], sigPtr[i] ); #ifdef BASOP_NOGLOB @@ -729,11 +734,11 @@ void bass_psfilter_fx( * update memory for next frame *-------------------------------------------------------*/ - FOR( i = sub( L_TRACK_HIST, 1 ); i > 0; i-- ) + FOR( i = L_TRACK_HIST - 1; i > 0; i-- ) { - hBPF->Track_on_hist[i] = hBPF->Track_on_hist[sub( i, 1 )]; + hBPF->Track_on_hist[i] = hBPF->Track_on_hist[i - 1]; move16(); - hBPF->vibrato_hist[i] = hBPF->vibrato_hist[sub( i, 1 )]; + hBPF->vibrato_hist[i] = hBPF->vibrato_hist[i - 1]; move16(); } @@ -801,7 +806,7 @@ static Word16 Pit_track_fx( /* o : Pitch Lener0 = L_mult0( *v1, *v1 ); Ltmp0 = L_mult0( *v2, *v2 ); Lcorr0 = L_mult0( *v1++, *v2++ ); - FOR( i = 1; i < idiv1616( add( L_HALFR16k, NBPSF_L_EXTRA ), 14 ); i++ ) + FOR( i = 1; i < ( ( L_HALFR16k + NBPSF_L_EXTRA ) / 14 ); i++ ) { #ifdef BASOP_NOGLOB Lener0 = L_mac0_sat( Lener0, *v1, *v1 ); @@ -819,7 +824,7 @@ static Word16 Pit_track_fx( /* o : Pitch test(); IF( EQ_32( Lener0, 2147483647L ) || EQ_32( Ltmp0, 2147483647L ) || - EQ_32( Lcorr0, 2147483647L ) || EQ_32( Lcorr0, L_add( -2147483647, -1L ) ) ) + EQ_32( Lcorr0, 2147483647L ) || EQ_32( Lcorr0, ( -2147483647 - 1L ) ) ) { v1 -= i; move16(); @@ -879,7 +884,7 @@ static Word16 Pit_track_fx( /* o : Pitch Ltmp = L_shl( Ltmp, exp1 ); #endif /* cn = normalized correlation of pitch/2 */ - IF( GT_32( Ltmp, 2040109466L ) ) /* 0.95f in Q31 */ + if ( GT_32( Ltmp, 2040109466L ) ) /* 0.95f in Q31 */ { T = T2; move16(); @@ -920,6 +925,7 @@ void addBassPostFilter_fx( Word32 cldfbBufferImag[CLDFB_NO_COL_MAX][20]; nChan = cldfbBank_bpf_Fx->no_channels; + move16(); scale1 = scale2 = 0; move16(); move16(); @@ -947,7 +953,7 @@ void addBassPostFilter_fx( /* now do the subtraction */ - IF( GT_16( nTimeSlots, 0 ) ) + IF( nTimeSlots > 0 ) { /* Find common scale. */ b = s_max( cldfb_scale->lb_scale, scale.lb_scale ); diff --git a/lib_dec/cng_dec_fx.c b/lib_dec/cng_dec_fx.c index cfaf7af5e..09496f8e9 100644 --- a/lib_dec/cng_dec_fx.c +++ b/lib_dec/cng_dec_fx.c @@ -83,6 +83,7 @@ void CNG_dec_fx( TD_CNG_DEC_HANDLE hTdCngDec; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif hTdCngDec = st_fx->hTdCngDec; @@ -95,16 +96,16 @@ void CNG_dec_fx( IF( EQ_32( st_fx->core_brate, SID_1k75 ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) { /* de-quantize the LSF vector */ - IF( NE_16( st_fx->Opt_AMR_WB, 0 ) ) + IF( st_fx->Opt_AMR_WB != 0 ) { /* Flt function */ isf_dec_amr_wb_fx( st_fx, Aq, lsf_new, lsp_new ); /* check IF ISPs may trigger too much synthesis energy */ E_LPC_f_isp_a_conversion( lsp_new, Aq_tmp, M ); - enr_new = Enr_1_Az_fx( Aq_tmp, shl( L_SUBFR, 1 ) ); + enr_new = Enr_1_Az_fx( Aq_tmp, 2 * L_SUBFR ); - IF( GT_16( shr( enr_new, 14 ), 0 ) ) + IF( ( shr( enr_new, 14 ) > 0 ) ) { /* Use old LSP vector */ Copy( st_fx->lsp_old_fx, lsp_new, M ); @@ -122,9 +123,9 @@ void CNG_dec_fx( /* check IF LSPs may trigger too much synthesis energy */ E_LPC_f_lsp_a_conversion( lsp_new, Aq_tmp, M ); - enr_new = Enr_1_Az_fx( Aq_tmp, shl( L_SUBFR, 1 ) ); + enr_new = Enr_1_Az_fx( Aq_tmp, 2 * L_SUBFR ); - IF( GT_16( shr( enr_new, 14 ), 0 ) ) + IF( shr( enr_new, 14 ) > 0 ) { /* Use old LSP vector */ Copy( st_fx->lsp_old_fx, lsp_new, M ); @@ -140,7 +141,7 @@ void CNG_dec_fx( } /* Initialize the CNG spectral envelope in case of the very first CNG frame */ - IF( EQ_16( st_fx->first_CNG, 0 ) ) + IF( st_fx->first_CNG == 0 ) { Copy( st_fx->lsp_old_fx, st_fx->lspCNG_fx, M ); } @@ -156,7 +157,7 @@ void CNG_dec_fx( { istep = ISTEP_AMR_WB_SID_FX; move16(); - IF( EQ_32( st_fx->core_brate, SID_2k40 ) ) + if ( EQ_32( st_fx->core_brate, SID_2k40 ) ) { istep = ISTEP_SID_FX; move16(); @@ -165,7 +166,7 @@ void CNG_dec_fx( /* initialize the energy quantization parameters */ num_bits = 6; move16(); - IF( EQ_16( st_fx->Opt_AMR_WB, 0 ) ) + if ( st_fx->Opt_AMR_WB == 0 ) { num_bits = 7; move16(); @@ -187,7 +188,7 @@ void CNG_dec_fx( L_enr_index = tmp1; move16(); L_enr_index = s_min( L_enr_index, 127 ); - IF( NE_16( st_fx->Opt_AMR_WB, 0 ) ) + IF( st_fx->Opt_AMR_WB ) { L_enr_index = s_min( L_enr_index, 63 ); } @@ -207,7 +208,7 @@ void CNG_dec_fx( hTdCngDec->old_enr_index = L_enr_index; move16(); - IF( EQ_16( L_enr_index, 0 ) ) + if ( !L_enr_index ) { L_enr_index = -5; move16(); @@ -222,13 +223,15 @@ void CNG_dec_fx( /* find the new energy value */ hTdCngDec->Enew_fx = Pow2( ener_int, ener_fra ); + move32(); IF( EQ_32( st_fx->core_brate, SID_2k40 ) ) { burst_ho_cnt = get_next_indice( st_fx, 3 ); /* 3bit */ *sid_bw = get_next_indice( st_fx, 1 ); - IF( EQ_16( *sid_bw, 0 ) ) + move16(); + IF( *sid_bw == 0 ) { env_idx[0] = get_next_indice( st_fx, 6 ); move16(); @@ -237,6 +240,7 @@ void CNG_dec_fx( FOR( i = 0; i < NUM_ENV_CNG; i++ ) { q_env[i] = L_deposit_l( CNG_details_codebook_fx[env_idx[0]][i] ); + move32(); } } } @@ -259,8 +263,8 @@ void CNG_dec_fx( test(); IF( LE_32( st_fx->last_core_brate, SID_2k40 ) ) { - /* Reset hangover counter IF not first SID period */ - IF( GT_32( st_fx->core_brate, FRAME_NO_DATA ) ) + /* Reset hangover counter if not first SID period */ + if ( GT_32( st_fx->core_brate, FRAME_NO_DATA ) ) { hTdCngDec->num_ho = 0; move16(); @@ -272,7 +276,7 @@ void CNG_dec_fx( FOR( i = 0; i < M; i++ ) { /* AR low-pass filter */ - st_fx->lspCNG_fx[i] = mac_r( L_mult( CNG_ISF_FACT_FX, st_fx->lspCNG_fx[i] ), 3277, lsp_new[i] ); + st_fx->lspCNG_fx[i] = mac_r( L_mult( CNG_ISF_FACT_FX, st_fx->lspCNG_fx[i] ), 32768 - CNG_ISF_FACT_FX, lsp_new[i] ); move16(); /* Q15 (15+15+1-16) */ } } @@ -303,7 +307,7 @@ void CNG_dec_fx( move16(); s_ptr = add( sub( hTdCngDec->ho_circ_ptr, burst_ho_cnt ), 1 ); move16(); - IF( LT_16( s_ptr, 0 ) ) + IF( s_ptr < 0 ) { s_ptr = add( s_ptr, hTdCngDec->ho_circ_size ); } @@ -311,7 +315,8 @@ void CNG_dec_fx( FOR( ll = burst_ho_cnt; ll > 0; ll-- ) { hTdCngDec->ho_hist_ptr = add( hTdCngDec->ho_hist_ptr, 1 ); - IF( EQ_16( hTdCngDec->ho_hist_ptr, HO_HIST_SIZE ) ) + move16(); + if ( EQ_16( hTdCngDec->ho_hist_ptr, HO_HIST_SIZE ) ) { hTdCngDec->ho_hist_ptr = 0; move16(); @@ -330,25 +335,27 @@ void CNG_dec_fx( Copy( &( hTdCngDec->ho_lsp_circ_fx[i_mult( s_ptr, M )] ), &( hTdCngDec->ho_lsp_hist_fx[i_mult( hTdCngDec->ho_hist_ptr, M )] ), M ); Copy32( &( hTdCngDec->ho_ener_circ_fx[s_ptr] ), &( hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr] ), 1 ); hTdCngDec->ho_sid_bw = L_shl( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x3fffffffL ), 1 ); + move32(); Copy32( &( hTdCngDec->ho_env_circ_fx[i_mult( s_ptr, NUM_ENV_CNG )] ), &( hTdCngDec->ho_env_hist_fx[i_mult( hTdCngDec->ho_hist_ptr, NUM_ENV_CNG )] ), NUM_ENV_CNG ); hTdCngDec->ho_hist_size = add( hTdCngDec->ho_hist_size, 1 ); + move16(); - IF( GT_16( hTdCngDec->ho_hist_size, HO_HIST_SIZE ) ) + if ( GT_16( hTdCngDec->ho_hist_size, HO_HIST_SIZE ) ) { hTdCngDec->ho_hist_size = HO_HIST_SIZE; move16(); } s_ptr = add( s_ptr, 1 ); - IF( EQ_16( s_ptr, hTdCngDec->ho_circ_size ) ) + if ( EQ_16( s_ptr, hTdCngDec->ho_circ_size ) ) { s_ptr = 0; move16(); } } - IF( GT_16( hTdCngDec->ho_hist_size, 0 ) ) /* can be -1 at init MODE1_DTX_IN_CODEC_B_FIX */ + IF( hTdCngDec->ho_hist_size > 0 ) /* can be -1 at init MODE1_DTX_IN_CODEC_B_FIX */ { /* *allow_cn_step |= ( st_fx->ho_ener_hist[st_fx->ho_hist_ptr] > 4.0f * st_fx->lp_ener );*/ L_tmp1 = L_shr( hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr], 2 ); @@ -359,6 +366,7 @@ void CNG_dec_fx( IF( ( GT_32( L_tmp1, 0 ) && ( st_fx->first_CNG || EQ_16( st_fx->element_mode, EVS_MONO ) ) ) ) { *allow_cn_step = s_or( *allow_cn_step, 1 ); + move16(); } } IF( EQ_16( last_element_mode, IVAS_CPE_TD ) ) @@ -375,7 +383,7 @@ void CNG_dec_fx( Copy( &( hTdCngDec->ho_lsp_hist_fx[i_mult( ptr, M )] ), tmp, M ); m1 = 0; move16(); - IF( EQ_32( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x1 ), 0 ) ) + IF( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x1 ) == 0 ) { Copy32( &hTdCngDec->ho_env_hist_fx[i_mult( ptr, NUM_ENV_CNG )], tmp_env, NUM_ENV_CNG ); m1 = 1; @@ -390,7 +398,7 @@ void CNG_dec_fx( FOR( k = 1; k < hTdCngDec->ho_hist_size; k++ ) { ptr = sub( ptr, 1 ); - IF( LT_16( ptr, 0 ) ) + if ( ptr < 0 ) { ptr = sub( HO_HIST_SIZE, 1 ); move16(); @@ -424,7 +432,7 @@ void CNG_dec_fx( L_enr = L_shl( L_tmp1, add( exp, 1 ) ); /* Q6 */ st_fx->lp_ener_fx = L_enr; /* Q6 */ - + move32(); set32_fx( max_val, 0, 2 ); set16_fx( max_idx, 0, 2 ); @@ -434,9 +442,9 @@ void CNG_dec_fx( { lsp2lsf_fx( &tmp[i_mult( i, M )], lsf_tmp, M, INT_FS_FX ); ftmp_fx = 964; - move16(); /*X2.56 */ - tmpv = sub( 16384, add( lsf_tmp[sub( M, 1 )], ftmp_fx ) ); /*QX2.56*/ - L_tmp = L_mult0( tmpv, tmpv ); /*QX6.5536*/ + move16(); /*X2.56 */ + tmpv = sub( 16384, add( lsf_tmp[( M - 1 )], ftmp_fx ) ); /*QX2.56*/ + L_tmp = L_mult0( tmpv, tmpv ); /*QX6.5536*/ } ELSE { @@ -449,10 +457,10 @@ void CNG_dec_fx( tmpv = sub( lsf_tmp[0], ftmp_fx ); /*QX2.56*/ L_tmp = L_mac0( L_tmp, tmpv, tmpv ); /*QX6.5536*/ - FOR( j = 0; j < sub( M, 1 ); j++ ) + FOR( j = 0; j < M - 1; j++ ) { - tmpv = sub( sub( lsf_tmp[add( j, 1 )], lsf_tmp[j] ), ftmp_fx ); /*QX2.56*/ - L_tmp = L_mac0( L_tmp, tmpv, tmpv ); /*QX6.5536*/ + tmpv = sub( sub( lsf_tmp[j - 1], lsf_tmp[j] ), ftmp_fx ); /*QX2.56*/ + L_tmp = L_mac0( L_tmp, tmpv, tmpv ); /*QX6.5536*/ } C[i] = Mpy_32_16_1( L_tmp, 1928 ); /*QX6.5536*/ @@ -496,6 +504,7 @@ void CNG_dec_fx( tmpv = div_s( 1, sub( m, 1 ) ); /*Q15*/ L_tmp1 = Mpy_32_16_1( L_tmp1, tmpv ); /*Q15*/ lsp_tmp[i] = extract_l( L_tmp1 ); /*Q15*/ + move16(); } } ELSE @@ -513,6 +522,7 @@ void CNG_dec_fx( tmpv = div_s( 1, sub( m, 2 ) ); /*Q15*/ L_tmp1 = Mpy_32_16_1( L_tmp1, tmpv ); /*Q15*/ lsp_tmp[i] = extract_l( L_tmp1 ); /*Q15*/ + move16(); } } @@ -528,7 +538,7 @@ void CNG_dec_fx( #else dist = add( dist, dev ); /*Q15*/ #endif - IF( GT_16( dev, max_dev ) ) + if ( GT_16( dev, max_dev ) ) { max_dev = dev; move16(); @@ -550,9 +560,10 @@ void CNG_dec_fx( { /* AR low-pass filter */ st_fx->lspCNG_fx[i] = add( mult_r( 26214, lsp_tmp[i] ), mult_r( 6554, lsp_new[i] ) ); + move16(); } } - IF( GT_16( m1, 0 ) ) + IF( m1 > 0 ) { FOR( i = 0; i < NUM_ENV_CNG; i++ ) { @@ -605,14 +616,15 @@ void CNG_dec_fx( /* Update hangover memory during CNG */ test(); #ifdef BASOP_NOGLOB - IF( EQ_16( *allow_cn_step, 0 ) && LT_32( hTdCngDec->Enew_fx, L_add_sat( st_fx->lp_ener_fx, L_shr( st_fx->lp_ener_fx, 1 ) ) ) ) + IF( ( *allow_cn_step == 0 ) && LT_32( hTdCngDec->Enew_fx, L_add_sat( st_fx->lp_ener_fx, L_shr( st_fx->lp_ener_fx, 1 ) ) ) ) #else IF( *allow_cn_step == 0 && LT_32( hTdCngDec->Enew_fx, L_add( st_fx->lp_ener_fx, L_shr( st_fx->lp_ener_fx, 1 ) ) ) ) #endif { /* update the pointer to circular buffer of old LSP vectors */ hTdCngDec->ho_hist_ptr = add( hTdCngDec->ho_hist_ptr, 1 ); - IF( EQ_16( hTdCngDec->ho_hist_ptr, HO_HIST_SIZE ) ) + move16(); + if ( EQ_16( hTdCngDec->ho_hist_ptr, HO_HIST_SIZE ) ) { hTdCngDec->ho_hist_ptr = 0; move16(); @@ -625,7 +637,7 @@ void CNG_dec_fx( hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr] = hTdCngDec->Enew_fx; move32(); test(); - IF( EQ_32( st_fx->core_brate, SID_2k40 ) && EQ_16( *sid_bw, 0 ) ) + IF( EQ_32( st_fx->core_brate, SID_2k40 ) && ( *sid_bw == 0 ) ) { /* enr1 = (float)log10( st->Enew*L_frame + 0.1f ) / (float)log10( 2.0f );*/ exp = norm_l( hTdCngDec->Enew_fx ); @@ -658,16 +670,20 @@ void CNG_dec_fx( move32(); } hTdCngDec->ho_sid_bw = L_shl( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x3fffffffL ), 1 ); + move32(); Copy32( env, &( hTdCngDec->ho_env_hist_fx[i_mult( hTdCngDec->ho_hist_ptr, NUM_ENV_CNG )] ), NUM_ENV_CNG ); } - ELSE IF( NE_16( *sid_bw, 0 ) ) + ELSE IF( ( *sid_bw != 0 ) ) { hTdCngDec->ho_sid_bw = L_shl( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x3fffffffL ), 1 ); + move32(); hTdCngDec->ho_sid_bw = L_or( hTdCngDec->ho_sid_bw, 0x1L ); + move32(); } hTdCngDec->ho_hist_size = add( hTdCngDec->ho_hist_size, 1 ); - IF( GT_16( hTdCngDec->ho_hist_size, HO_HIST_SIZE ) ) + move16(); + if ( GT_16( hTdCngDec->ho_hist_size, HO_HIST_SIZE ) ) { hTdCngDec->ho_hist_size = HO_HIST_SIZE; move16(); @@ -677,7 +693,7 @@ void CNG_dec_fx( st_fx->last_CNG_L_frame = st_fx->L_frame; move16(); - IF( NE_32( st_fx->core_brate, SID_1k75 ) ) + if ( NE_32( st_fx->core_brate, SID_1k75 ) ) { hTdCngDec->num_ho = m; move16(); @@ -748,7 +764,8 @@ void swb_CNG_dec_fx( st_fx->last_vad_fx = 1; move16(); st_fx->hTdCngDec->burst_cnt = add( st_fx->hTdCngDec->burst_cnt, 1 ); - IF( GT_16( st_fx->hTdCngDec->burst_cnt, 10 ) ) + move16(); + if ( GT_16( st_fx->hTdCngDec->burst_cnt, 10 ) ) { st_fx->hTdCngDec->burst_cnt = 0; move16(); @@ -788,7 +805,7 @@ void swb_CNG_dec_ivas_fx( st_fx->last_vad_fx = 1; move16(); st_fx->hTdCngDec->burst_cnt = add_sat( st_fx->hTdCngDec->burst_cnt, 1 ); // saturation reached? - IF( GT_16( st_fx->hTdCngDec->burst_cnt, 10 ) ) + if ( GT_16( st_fx->hTdCngDec->burst_cnt, 10 ) ) { st_fx->hTdCngDec->burst_cnt = 0; move16(); @@ -836,18 +853,19 @@ static void shb_CNG_decod_fx( Word32 L_tmp; Word16 tmp2; Word16 allow_cn_step_fx = 0; + move16(); Word16 q; TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st_fx->hBWE_TD; - IF( EQ_16( st_fx->bfi, 0 ) ) + IF( st_fx->bfi == 0 ) { test(); IF( EQ_32( st_fx->core_brate, SID_2k40 ) && EQ_16( sid_bw, 1 ) ) { idx_ener_fx = get_next_indice( st_fx, 4 ); - IF( EQ_16( idx_ener_fx, 0 ) ) + if ( !idx_ener_fx ) { idx_ener_fx = -15; move16(); @@ -857,6 +875,7 @@ static void shb_CNG_decod_fx( /* de-quantization of SHB CNG parameters */ L_tmp = L_mult( idx_ener_fx, 27400 ); /*Q14 */ st_fx->last_shb_cng_ener_fx = extract_l( L_shr( L_sub( L_tmp, 295924 ), 6 ) ); /*Q8 */ + move16(); } ELSE { @@ -864,6 +883,7 @@ static void shb_CNG_decod_fx( /* de-quantization of SHB CNG parameters */ To be verified L_tmp = L_mult( idx_ener_fx, 17615 ); /*Q13*/ st_fx->last_shb_cng_ener_fx = extract_l( L_shr( L_sub( L_tmp, 147962 ), 5 ) ); /*Q8 */ + move16(); #endif } } @@ -888,15 +908,16 @@ static void shb_CNG_decod_fx( IF( NE_16( st_fx->element_mode, IVAS_CPE_DFT ) ) { - IF( LT_16( st_fx->shb_dtx_count_fx, 1000 ) ) + if ( LT_16( st_fx->shb_dtx_count_fx, 1000 ) ) { st_fx->shb_dtx_count_fx = add( st_fx->shb_dtx_count_fx, 1 ); + move16(); } } E_LPC_lsf_lsp_conversion( shb_lspCNG_fx, tmp_lsp, LPC_SHB_ORDER ); /*Q14*/ E_LPC_f_lsp_a_conversion( tmp_lsp, shb_lpcCNG_fx, LPC_SHB_ORDER ); - Copy_Scale_sig( shb_lpcCNG_fx, shb_lpcCNG_fx, add( LPC_SHB_ORDER, 1 ), sub( norm_s( shb_lpcCNG_fx[0] ), 2 ) ); /* Q12 */ + Copy_Scale_sig( shb_lpcCNG_fx, shb_lpcCNG_fx, LPC_SHB_ORDER + 1, sub( norm_s( shb_lpcCNG_fx[0] ), 2 ) ); /* Q12 */ #ifdef IVAS_CODE_CNG // mvr2r(shb_lpcCNG, st->hTdCngDec->shb_lpcCNG, LPC_SHB_ORDER + 1); @@ -912,12 +933,12 @@ static void shb_CNG_decod_fx( exp = sub( 30, add( exp, shl( Qsyn, 1 ) ) ); wb_ener_fx = Mpy_32_16( exp, fra, LG10 ); wb_ener16_fx = round_fx( L_shl( wb_ener_fx, 10 ) ); /*wb_ener_fx in Q8 */ - IF( EQ_16( st_fx->first_CNG, 0 ) ) + if ( !st_fx->first_CNG ) { st_fx->wb_cng_ener_fx = wb_ener16_fx; move16(); /*Q8 */ } - IF( GT_16( abs_s( sub( wb_ener16_fx, st_fx->wb_cng_ener_fx ) ), 3072 ) ) + if ( GT_16( abs_s( sub( wb_ener16_fx, st_fx->wb_cng_ener_fx ) ), 3072 ) ) { allow_cn_step_fx = 1; move16(); @@ -936,12 +957,12 @@ static void shb_CNG_decod_fx( } test(); test(); - IF( EQ_32( st_fx->core_brate, SID_2k40 ) && EQ_16( sid_bw, 1 ) && EQ_16( st_fx->bfi, 0 ) ) + IF( EQ_32( st_fx->core_brate, SID_2k40 ) && EQ_16( sid_bw, 1 ) && ( st_fx->bfi == 0 ) ) { st_fx->last_wb_cng_ener_fx = st_fx->wb_cng_ener_fx; move16(); - IF( EQ_16( st_fx->first_CNG, 0 ) ) + if ( !st_fx->first_CNG ) { st_fx->shb_cng_ener_fx = st_fx->last_shb_cng_ener_fx; move16(); @@ -949,7 +970,7 @@ static void shb_CNG_decod_fx( } gain_fx = sub( st_fx->wb_cng_ener_fx, st_fx->last_wb_cng_ener_fx ); /*8 */ - IF( GT_16( gain_fx, 15 ) ) + if ( GT_16( gain_fx, 15 ) ) { gain_fx = 15; move16(); @@ -959,10 +980,12 @@ static void shb_CNG_decod_fx( IF( EQ_16( allow_cn_step_fx, 1 ) || GT_32( st_fx->last_core_brate, SID_2k40 ) ) { st_fx->shb_cng_ener_fx = add( st_fx->shb_cng_ener_fx, step_fx ); + move16(); } ELSE { st_fx->shb_cng_ener_fx = add( st_fx->shb_cng_ener_fx, mult( 8192, step_fx ) ); /*Q8 */ + move16(); } /* generate white noise excitation */ FOR( i = 0; i < L_FRAME16k; i++ ) @@ -1000,7 +1023,7 @@ static void shb_CNG_decod_fx( ener_fx = st_fx->shb_cng_ener_fx; move16(); /*Q8 */ - IF( GT_16( st_fx->trans_cnt_fx, 0 ) ) + IF( st_fx->trans_cnt_fx > 0 ) { i = extract_l( L_mult0( st_fx->trans_cnt_fx, 17 ) ); /*Q0 */ #ifdef BASOP_NOGLOB @@ -1009,13 +1032,14 @@ static void shb_CNG_decod_fx( ener_fx = add( st_fx->shb_cng_ener_fx, mult( sin_table256_fx[i], sub( st_fx->last_shb_ener_fx, st_fx->shb_cng_ener_fx ) ) ); /*Q8 */ #endif st_fx->trans_cnt_fx = sub( st_fx->trans_cnt_fx, 1 ); + move16(); } tmp = mult( 3277, ener_fx ); /*Q8 */ L_tmp = L_mult( 27213, tmp ); /*Q22, 27213=3.321928 in Q13 */ L_tmp = L_shr( L_tmp, 6 ); /*Q16 */ L_tmp = L_add( L_tmp, 10 << 16 ); - IF( LT_32( L_tmp, 0 ) ) + if ( L_tmp < 0 ) { L_tmp = 0; move32(); @@ -1027,7 +1051,7 @@ static void shb_CNG_decod_fx( L_tmp = L_shl( Pow2( exp, fra ), 5 ); /*Q5 */ #endif L_tmp = L_shr( L_tmp, 10 ); - IF( EQ_32( L_tmp, 0 ) ) + if ( !L_tmp ) { L_tmp = 1; /*Q5 */ } @@ -1046,14 +1070,15 @@ static void shb_CNG_decod_fx( tmp = div_s( fra, tmp ); /*Q15*/ L_tmp = L_deposit_h( tmp ); /*Q31 */ - tmp = -( q + exp1 ) + ( 5 + exp ); + tmp = sub( add( 5, exp ), add( q, exp1 ) ); L_gain_fx = Isqrt_lc( L_tmp, &tmp ); /*Q31-Qtmp */ #ifdef IVAS_CODE_CNG st->hTdCngDec->shb_cng_gain = ener_fx; #endif FOR( i = 0; i < L_FRAME16k; i++ ) { - shb_syn16k_fx[i] = extract_l( L_shr( Mpy_32_16_1( L_gain_fx, excSHB_fx[i] ), 5 - tmp ) ); /*Q3 = 31-Qtmp-8-15-5+Qtmp */ + shb_syn16k_fx[i] = extract_l( L_shr( Mpy_32_16_1( L_gain_fx, excSHB_fx[i] ), sub( 5, tmp ) ) ); /*Q3 = 31-Qtmp-8-15-5+Qtmp */ + move16(); } test(); @@ -1066,9 +1091,10 @@ static void shb_CNG_decod_fx( move32(); } - FOR( i = 0; i < shl( ALLPASSSECTIONS_STEEP, 1 ); i++ ) + FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ ) { hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx[i] = shr( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx[i], st_fx->prev_Q_bwe_syn2 ); + move16(); } } GenSHBSynth_fx( shb_syn16k_fx, shb_synth_fx, hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, st_fx->L_frame, &( hBWE_TD->syn_dm_phase ) ); @@ -1116,6 +1142,7 @@ static void shb_CNG_decod_ivas_fx( Word16 fra; Word32 L_tmp; Word16 allow_cn_step_fx = 0; + move16(); Word16 q; TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st->hBWE_TD; @@ -1136,10 +1163,12 @@ static void shb_CNG_decod_ivas_fx( IF( EQ_16( st->element_mode, EVS_MONO ) ) { st->hTdCngDec->last_shb_cng_ener_fx_32 = L_sub( L_mult0( idx_ener, 6850 ), 36991 ); // Q11 + move32(); } ELSE { st->hTdCngDec->last_shb_cng_ener_fx_32 = L_sub( L_mult0( idx_ener, 8807 ), 36991 ); // Q11 + move32(); } } } @@ -1155,11 +1184,13 @@ static void shb_CNG_decod_ivas_fx( FOR( i = 0; i < LPC_SHB_ORDER; i++ ) { shb_lspCNG_fx[i] = add( mult_r( interp_fx, st->hTdCngDec->lsp_shb_prev_fx[i] ), mult_r( sub( 32767, interp_fx ), st->hTdCngDec->lsp_shb_prev_prev_fx[i] ) ); // Q14 + move16(); } IF( LE_16( st->hTdCngDec->shb_dtx_count, 1000 ) ) { st->hTdCngDec->shb_dtx_count = add( st->hTdCngDec->shb_dtx_count, 1 ); + move16(); } E_LPC_lsf_lsp_conversion( shb_lspCNG_fx, tmp_lsp, LPC_SHB_ORDER ); /*Q14*/ @@ -1186,12 +1217,12 @@ static void shb_CNG_decod_ivas_fx( wb_ener_fx = Mpy_32_16( exp, fra, LG10 ); wb_ener16_fx = round_fx( L_shl( wb_ener_fx, 10 ) ); /*wb_ener_fx in Q8 */ Word32 wb_ener32_fx = L_shl( wb_ener16_fx, 3 ); /*wb_ener_fx in Q11 */ - IF( EQ_16( st->first_CNG, 0 ) ) + if ( EQ_16( st->first_CNG, 0 ) ) { st->hTdCngDec->wb_cng_ener_fx_32 = wb_ener32_fx; move32(); /*Q11 */ } - IF( GT_32( L_abs( L_sub( wb_ener32_fx, st->hTdCngDec->wb_cng_ener_fx_32 ) ), 24576 ) ) + if ( GT_32( L_abs( L_sub( wb_ener32_fx, st->hTdCngDec->wb_cng_ener_fx_32 ) ), 24576 ) ) { allow_cn_step_fx = 1; move16(); @@ -1207,6 +1238,7 @@ static void shb_CNG_decod_ivas_fx( tmp = L_sub( wb_ener32_fx, st->hTdCngDec->wb_cng_ener_fx_32 ); /*Q11 */ tmp = Mpy_32_16_1( tmp, 29491 ); /*Q11 */ st->hTdCngDec->wb_cng_ener_fx_32 = L_add( st->hTdCngDec->wb_cng_ener_fx_32, tmp ); /*Q11 */ + move32(); } test(); test(); @@ -1215,7 +1247,7 @@ static void shb_CNG_decod_ivas_fx( st->hTdCngDec->last_wb_cng_ener_fx_32 = st->hTdCngDec->wb_cng_ener_fx_32; move32(); - IF( EQ_16( st->first_CNG, 0 ) ) + if ( !st->first_CNG ) { st->hTdCngDec->shb_cng_ener_fx_32 = st->hTdCngDec->last_shb_cng_ener_fx_32; move32(); @@ -1223,7 +1255,7 @@ static void shb_CNG_decod_ivas_fx( } gain_fx = L_sub( st->hTdCngDec->wb_cng_ener_fx_32, st->hTdCngDec->last_wb_cng_ener_fx_32 ); /*Q11 */ - IF( GT_32( gain_fx, 30720 ) ) + if ( GT_32( gain_fx, 30720 ) ) { gain_fx = 30720; move32(); @@ -1233,10 +1265,12 @@ static void shb_CNG_decod_ivas_fx( IF( EQ_16( allow_cn_step_fx, 1 ) || GT_32( st->last_core_brate, SID_2k40 ) ) { st->hTdCngDec->shb_cng_ener_fx_32 = L_add( st->hTdCngDec->shb_cng_ener_fx_32, step_fx ); + move32(); } ELSE { st->hTdCngDec->shb_cng_ener_fx_32 = L_add( st->hTdCngDec->shb_cng_ener_fx_32, L_shr( step_fx, 2 ) ); /*Q11 */ + move32(); } /* generate white noise excitation */ FOR( i = 0; i < L_FRAME16k; i++ ) @@ -1269,7 +1303,7 @@ static void shb_CNG_decod_ivas_fx( st->hTdCngDec->trans_cnt = 0; move16(); test(); - IF( GT_16( st->hTdCngDec->burst_cnt, 3 ) && NE_16( st->last_core, HQ_CORE ) ) + if ( GT_16( st->hTdCngDec->burst_cnt, 3 ) && NE_16( st->last_core, HQ_CORE ) ) { st->hTdCngDec->trans_cnt = 5; move16(); @@ -1283,6 +1317,7 @@ static void shb_CNG_decod_ivas_fx( i = extract_l( L_mult0( st->hTdCngDec->trans_cnt, 17 ) ); /*Q0 */ ener_fx = L_add( st->hTdCngDec->shb_cng_ener_fx_32, Mpy_32_16_1( L_sub( st->hTdCngDec->last_shb_ener_fx, st->hTdCngDec->shb_cng_ener_fx_32 ), sin_table256_fx[i] ) ); /*Q11 */ st->hTdCngDec->trans_cnt = sub( st->hTdCngDec->trans_cnt, 1 ); + move16(); } tmp = L_shr( Mpy_32_16_1( ener_fx, 3277 ), 3 ); /*Q8 */ @@ -1292,7 +1327,7 @@ static void shb_CNG_decod_ivas_fx( L_tmp = L_mult( 27213, tmp_16 ); /*Q22, 27213=3.321928 in Q13 */ L_tmp = L_shr( L_tmp, 6 ); /*Q16 */ L_tmp = L_add( L_tmp, L_shl( 10, 16 ) ); - IF( LT_32( L_tmp, 0 ) ) + if ( ( L_tmp < 0 ) ) { L_tmp = 0; move32(); @@ -1300,7 +1335,7 @@ static void shb_CNG_decod_ivas_fx( fra = L_Extract_lc( L_tmp, &exp ); L_tmp = L_shl( Pow2( exp, fra ), 5 ); /*Q5 */ L_tmp = L_shr( L_tmp, 10 ); - IF( EQ_32( L_tmp, 0 ) ) + if ( !L_tmp ) { L_tmp = 1; move32(); /*Q5 */ @@ -1320,13 +1355,14 @@ static void shb_CNG_decod_ivas_fx( tmp_16 = div_s( fra, tmp_16 ); /*Q15*/ L_tmp = L_deposit_h( tmp_16 ); /*Q31 */ - tmp_16 = -( q + exp1 ) + ( 5 + exp ); + tmp_16 = sub( add( 5, exp ), add( q, exp1 ) ); L_gain_fx = Isqrt_lc( L_tmp, &tmp_16 ); /*Q31-Qtmp */ st->hTdCngDec->shb_cng_gain_fx_32 = ener_fx; move32(); FOR( i = 0; i < L_FRAME16k; i++ ) { - shb_syn16k_fx[i] = extract_l( L_shr( Mpy_32_16_1( L_gain_fx, excSHB_fx[i] ), 5 - tmp_16 ) ); /*Q3 = 31-Qtmp-8-15-5+Qtmp */ + shb_syn16k_fx[i] = extract_l( L_shr( Mpy_32_16_1( L_gain_fx, excSHB_fx[i] ), sub( 5, tmp_16 ) ) ); /*Q3 = 31-Qtmp-8-15-5+Qtmp */ + move16(); } test(); @@ -1342,6 +1378,7 @@ static void shb_CNG_decod_ivas_fx( FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ ) { hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx[i] = shr( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx[i], st->prev_Q_bwe_syn2 ); + move16(); } } GenSHBSynth_fx( shb_syn16k_fx, shb_synth_fx, hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, st->L_frame, &( hBWE_TD->syn_dm_phase ) ); @@ -1381,6 +1418,7 @@ void td_cng_dec_init_fx( hTdCngDec->old_enr_index = -1; move16(); hTdCngDec->Enew_fx = L_deposit_l( 0 ); + move16(); hTdCngDec->last_allow_cn_step = 0; move16(); #ifdef IVAS_CODE_CNG @@ -1400,6 +1438,7 @@ void td_cng_dec_init_fx( hTdCngDec->ho_hist_ptr = -1; move16(); hTdCngDec->ho_sid_bw = L_deposit_l( 0 ); + move16(); set16_fx( hTdCngDec->ho_lsp_hist_fx, 0, HO_HIST_SIZE * M ); set32_fx( hTdCngDec->ho_ener_hist_fx, 0, HO_HIST_SIZE ); set32_fx( hTdCngDec->ho_env_hist_fx, 0, HO_HIST_SIZE * NUM_ENV_CNG ); @@ -1531,10 +1570,12 @@ void td_cng_dec_init_ivas_fx( IF( NE_16( st->element_mode, EVS_MONO ) ) { hTdCngDec->lsp_shb_prev_fx[i] = ivas_lsp_shb_prev_tbl_fx[i]; + move16(); } ELSE { hTdCngDec->lsp_shb_prev_fx[i] = lsp_shb_prev_tbl_fx[i]; + move16(); } hTdCngDec->lsp_shb_prev_prev_fx[i] = hTdCngDec->lsp_shb_prev_fx[i]; move16(); diff --git a/lib_dec/core_dec_init_fx.c b/lib_dec/core_dec_init_fx.c index 7acc450f9..684b21fb2 100644 --- a/lib_dec/core_dec_init_fx.c +++ b/lib_dec/core_dec_init_fx.c @@ -55,23 +55,29 @@ void open_decoder_LPD_fx( #ifndef NEW_IVAS_OPEN_DEC st->total_brate = total_brate; + move32(); #endif - IF( NE_16( st->codec_mode, MODE1 ) ) /*already updated in MODE1*/ + if ( NE_16( st->codec_mode, MODE1 ) ) /*already updated in MODE1*/ { st->fscale_old = st->fscale; + move16(); } st->sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, bwidth, st->flag_ACELP16k, st->rf_flag, st->is_ism_format ); + move32(); st->fscale = sr2fscale_fx( st->sr_core ); + move16(); fscaleFB = sr2fscale_fx( st->output_Fs ); /* initializing variables for frame lengths etc. right in the beginning */ st->L_frame = extract_l( Mult_32_16( st->sr_core, 0x0290 ) ); + move16(); #ifndef NEW_IVAS_OPEN_DEC hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); + move16(); #endif - IF( EQ_16( st->ini_frame, 0 ) ) + IF( st->ini_frame == 0 ) { st->last_L_frame = st->L_frame_past = st->L_frame; move16(); @@ -85,9 +91,10 @@ void open_decoder_LPD_fx( IF( st->hTcxDec != NULL ) { hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); - IF( EQ_16( st->ini_frame, 0 ) ) + IF( st->ini_frame == 0 ) { st->L_frameTCX_past = st->hTcxDec->L_frameTCX; + move16(); } } #endif @@ -114,7 +121,7 @@ void open_decoder_LPD_fx( IF( ( EQ_16( st->element_mode, EVS_MONO ) && EQ_16( st->L_frame, L_FRAME16k ) && LE_32( st->total_brate, 32000 ) ) || ( GT_16( st->element_mode, EVS_MONO ) && EQ_16( st->L_frame, L_FRAME16k ) && LE_32( total_brate, MAX_ACELP_BRATE ) ) || - ( NE_16( st->tcxonly, 0 ) && ( EQ_32( st->sr_core, 32000 ) || EQ_32( st->sr_core, 16000 ) ) ) ) + ( ( st->tcxonly != 0 ) && ( EQ_32( st->sr_core, 32000 ) || EQ_32( st->sr_core, 16000 ) ) ) ) { st->nb_subfr = NB_SUBFR16k; move16(); @@ -122,15 +129,17 @@ void open_decoder_LPD_fx( /* (float)st->L_frame/(float)st->fscale * (float)FSCALE_DENOM/128.0f * (float)st->total_brate */ st->bits_frame = extract_l( L_shr( Mpy_32_16_1( L_shl( st->total_brate, 1 ), 20972 ), 6 ) ); /* 20972 = 0.01 * 64 * 32768 */ + move16(); assert( FSCALE_DENOM == 512 ); assert( st->fscale == 2 * st->L_frame ); /* this assumption is true if operated in 20ms frames with FSCALE_DENOM == 512, which is the current default */ assert( st->bits_frame == (int) ( (float) st->L_frame / (float) st->fscale * (float) FSCALE_DENOM / 128.0f * (float) st->total_brate / 100.0f + 0.49f ) ); st->TcxBandwidth = getTcxBandwidth( bwidth ); + move16(); st->narrowBand = 0; move16(); - IF( EQ_16( bwidth, NB ) ) + if ( EQ_16( bwidth, NB ) ) { st->narrowBand = 1; move16(); @@ -149,22 +158,28 @@ void open_decoder_LPD_fx( #endif i = mult_r( hTcxDec->L_frameTCX, getInvFrameLen( L_FRAME ) ); hTcxDec->pit_max_TCX = extract_l( L_shr( L_mult( st->pit_max, i ), 7 ) ); + move16(); hTcxDec->pit_min_TCX = extract_l( L_shr( L_mult( st->pit_min, i ), 7 ) ); + move16(); } } ELSE { st->pit_res_max = initPitchLagParameters( st->sr_core, &st->pit_min, &st->pit_fr1, &st->pit_fr1b, &st->pit_fr2, &st->pit_max ); + move16(); IF( hTcxDec != NULL ) { i = mult_r( hTcxDec->L_frameTCX, getInvFrameLen( st->L_frame ) ); hTcxDec->pit_max_TCX = extract_l( L_shr( L_mult( st->pit_max, i ), 7 ) ); + move16(); hTcxDec->pit_min_TCX = extract_l( L_shr( L_mult( st->pit_min, i ), 7 ) ); + move16(); } } - IF( EQ_16( st->ini_frame, 0 ) ) + if ( !st->ini_frame ) { st->pit_res_max_past = st->pit_res_max; + move16(); } /*Preemphasis param*/ @@ -200,14 +215,15 @@ void open_decoder_LPD_fx( st->lpcQuantization = 0; move16(); test(); - IF( EQ_16( st->tcxonly, 0 ) && LE_32( st->sr_core, INT_FS_16k ) ) + if ( ( st->tcxonly == 0 ) && LE_32( st->sr_core, INT_FS_16k ) ) { st->lpcQuantization = 1; + move16(); } st->numlpc = 2; move16(); - IF( EQ_16( st->tcxonly, 0 ) ) + if ( st->tcxonly == 0 ) { st->numlpc = 1; move16(); @@ -215,11 +231,13 @@ void open_decoder_LPD_fx( /* Initialize TBE */ st->prev_coder_type = GENERIC; + move16(); IF( st->hBWE_TD != NULL ) { - set16_fx( hBWE_TD->prev_lsf_diff_fx, 16384, sub( LPC_SHB_ORDER, 2 ) ); + set16_fx( hBWE_TD->prev_lsf_diff_fx, 16384, LPC_SHB_ORDER - 2 ); hBWE_TD->prev_tilt_para_fx = 0; - set16_fx( hBWE_TD->cur_sub_Aq_fx, 0, add( M, 1 ) ); + move16(); + set16_fx( hBWE_TD->cur_sub_Aq_fx, 0, M + 1 ); } /*TCX config*/ @@ -229,7 +247,7 @@ void open_decoder_LPD_fx( st->hTcxCfg->tcx_mdct_window_length_old = st->hTcxCfg->tcx_mdct_window_length; move16(); init_TCX_config( st->hTcxCfg, st->L_frame, st->fscale, hTcxDec->L_frameTCX, fscaleFB ); // TEMPORARY should be rename to init_TCX_config - IF( EQ_16( st->ini_frame, 0 ) ) + IF( st->ini_frame == 0 ) { st->hTcxCfg->tcx_last_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode = ALDO_WINDOW; move16(); @@ -238,25 +256,31 @@ void open_decoder_LPD_fx( /* TCX Offset */ st->hTcxCfg->tcx_offset = shr( st->hTcxCfg->tcx_mdct_window_delay, 1 ); + move16(); st->hTcxCfg->tcx_offsetFB = shr( st->hTcxCfg->tcx_mdct_window_delayFB, 1 ); + move16(); /* Initialize FAC */ st->hTcxCfg->lfacNext = sub( st->hTcxCfg->tcx_offset, shr( st->L_frame, 2 ) ); + move16(); st->hTcxCfg->lfacNextFB = sub( st->hTcxCfg->tcx_offsetFB, shr( hTcxDec->L_frameTCX, 2 ) ); + move16(); /* set number of coded lines */ st->hTcxCfg->tcx_coded_lines = getNumTcxCodedLines( st->bwidth ); + move16(); /* TNS in TCX */ st->hTcxCfg->pCurrentTnsConfig = NULL; st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->total_brate, st->igf, st->element_mode ); + move16(); IF( st->hTcxCfg->fIsTNSAllowed != 0 ) { InitTnsConfigs( st->bwidth, st->hTcxCfg->tcx_coded_lines, st->hTcxCfg->tnsConfig, st->hIGFDec->infoIGFStopFreq, st->total_brate, st->element_mode, 0 /*is_mct*/ ); } /*Constraint for adaptive BPF, otherwise parameter estimation and post-processing not time aligned*/ - IF( EQ_16( st->tcxonly, 0 ) ) + if ( st->tcxonly == 0 ) { assert( 0 == ( st->hTcxCfg->lfacNext > 0 ? st->hTcxCfg->lfacNext : 0 ) ); } @@ -280,7 +304,8 @@ void open_decoder_LPD_fx( #else - IF( st->hIGFDec != NULL ){ + if ( st->hIGFDec != NULL ) + { PMT( "To be done" ) // IF (!is_init || st->element_mode != IVAS_CPE_MDCT) //{ @@ -308,20 +333,21 @@ void open_decoder_LPD_fx( /* Initialize decoder delay */ - IF( NE_16( st->element_mode, IVAS_SCE ) ) + if ( NE_16( st->element_mode, IVAS_SCE ) ) { st->flag_cna = 0; move16(); } - IF( EQ_16( st->ini_frame, 0 ) ) + IF( st->ini_frame == 0 ) { st->flag_cna = 0; st->last_flag_cna = 0; move16(); + move16(); } /* Static vectors to zero */ - IF( EQ_16( st->ini_frame, 0 ) ) + IF( st->ini_frame == 0 ) { st->last_is_cng = 0; @@ -360,6 +386,7 @@ void open_decoder_LPD_fx( { /* Reset old_synth in case of core sampling rate switching and codec switching*/ test(); + test(); IF( st->hTcxDec != NULL && ( ( NE_16( st->L_frame, st->last_L_frame ) ) || ( EQ_16( st->last_codec_mode, MODE1 ) ) ) ) { set16_fx( hTcxDec->old_synth, 0, OLD_SYNTH_INTERNAL_DEC ); @@ -407,14 +434,14 @@ void open_decoder_LPD_fx( test(); test(); test(); - IF( ( NE_16( st->element_mode, IVAS_CPE_DFT ) || ( EQ_16( st->element_mode, IVAS_CPE_DFT ) && st->prev_bfi ) ) && EQ_16( st->last_codec_mode, MODE1 ) && EQ_16( st->last_core, ACELP_CORE ) ) + IF( ( NE_16( st->element_mode, IVAS_CPE_DFT ) || ( EQ_16( st->element_mode, IVAS_CPE_DFT ) && st->prev_bfi ) ) && EQ_16( st->last_codec_mode, MODE1 ) && ( st->last_core == ACELP_CORE ) ) { st->last_core_bfi = ACELP_CORE; move16(); /*PLC*/ #ifndef NEW_IVAS_OPEN_DEC - IF( NE_16( st->prev_bfi, 0 ) ) + IF( st->prev_bfi != 0 ) { PWord16 const *w; Word16 W1, W2, nz, delay_comp; @@ -423,7 +450,6 @@ void open_decoder_LPD_fx( move16(); W2 = shr( st->hTcxCfg->tcx_mdct_window_lengthFB, 1 ); w = st->hTcxCfg->tcx_mdct_windowFB; /*pointer - no need to instrument*/ - move16(); nz = NS2SA_fx2( st->output_Fs, N_ZERO_MDCT_NS ); move16(); @@ -442,13 +468,15 @@ void open_decoder_LPD_fx( FOR( i = 0; i < W2; i++ ) { - hHQ_core->old_out_fx[add( i, nz )] = round_fx( Mpy_32_16_1( L_mult( w[i].v.re, w[i].v.re ), hHQ_core->old_out_fx[add( i, nz )] ) ); + hHQ_core->old_out_fx[i + nz] = round_fx( Mpy_32_16_1( L_mult( w[i].v.re, w[i].v.re ), hHQ_core->old_out_fx[i + nz] ) ); + move16(); } FOR( ; i < W1; i++ ) { - hHQ_core->old_out_fx[add( i, nz )] = round_fx( Mpy_32_16_1( L_mult( w[sub( W2, add( 1, sub( i, W2 ) ) )].v.im, w[sub( W2, add( 1, sub( i, W2 ) ) )].v.im ), hHQ_core->old_out_fx[add( i, nz )] ) ); + hHQ_core->old_out_fx[i + nz] = round_fx( Mpy_32_16_1( L_mult( w[sub( W2, add( 1, sub( i, W2 ) ) )].v.im, w[sub( W2, add( 1, sub( i, W2 ) ) )].v.im ), hHQ_core->old_out_fx[i + nz] ) ); + move16(); } - set16_fx( &hHQ_core->old_out_fx[add( W1, nz )], 0, nz ); + set16_fx( &hHQ_core->old_out_fx[W1 + nz], 0, nz ); lerp( hHQ_core->old_out_fx, hHQ_core->old_out_LB_fx, st->L_frame, hTcxDec->L_frameTCX ); @@ -474,8 +502,8 @@ void open_decoder_LPD_fx( test(); IF( EQ_16( st->last_codec_mode, MODE2 ) && NE_16( st->L_frame, st->last_L_frame ) && - ( ( EQ_16( st->m_frame_type, SID_FRAME ) && GT_16( st->last_core, ACELP_CORE ) ) || - ( GT_16( st->last_core, ACELP_CORE ) && GT_16( st->core, ACELP_CORE ) ) || + ( ( EQ_16( st->m_frame_type, SID_FRAME ) && ( st->last_core > ACELP_CORE ) ) || + ( ( st->last_core > ACELP_CORE ) && ( st->core > ACELP_CORE ) ) || st->prev_bfi ) ) { lerp( hHQ_core->old_out_LB_fx, hHQ_core->old_out_LB_fx, st->L_frame, st->last_L_frame ); @@ -501,10 +529,10 @@ void open_decoder_LPD_fx( /*OLA -> zero */ IF( st->hTcxDec != NULL ) { - set16_fx( hTcxDec->old_syn_Overl, 0, shr( L_FRAME32k, 1 ) ); /*HQ-CORE(bfi)->TCX don't need it*/ - set16_fx( hTcxDec->syn_Overl_TDAC, 0, shr( L_FRAME32k, 1 ) ); /*HQ-CORE(bfi)->TCX don't need it*/ - set16_fx( hTcxDec->syn_Overl_TDACFB, 0, shr( L_FRAME_MAX, 1 ) ); /*HQ-CORE(bfi)->TCX don't need it*/ - set16_fx( hTcxDec->syn_Overl, 0, shr( L_FRAME32k, 1 ) ); /*HQ-CORE(bfi)->TCX don't need it*/ + set16_fx( hTcxDec->old_syn_Overl, 0, L_FRAME32k / 2 ); /*HQ-CORE(bfi)->TCX don't need it*/ + set16_fx( hTcxDec->syn_Overl_TDAC, 0, L_FRAME32k / 2 ); /*HQ-CORE(bfi)->TCX don't need it*/ + set16_fx( hTcxDec->syn_Overl_TDACFB, 0, L_FRAME_MAX / 2 ); /*HQ-CORE(bfi)->TCX don't need it*/ + set16_fx( hTcxDec->syn_Overl, 0, L_FRAME32k / 2 ); /*HQ-CORE(bfi)->TCX don't need it*/ #if 0 PMT("to be moved to reset_tcx_overl_buf") #endif @@ -552,7 +580,7 @@ void open_decoder_LPD_fx( /* convert quantized LSP vector */ st->rate_switching_reset = lsp_convert_poly_fx( st->lsp_old_fx, st->L_frame, 0 ); - IF( EQ_16( st->tcxonly, 0 ) ) + IF( st->tcxonly == 0 ) { lsp2lsf_fx( st->lsp_old_fx, st->lsf_old_fx, M, st->sr_core ); } @@ -586,12 +614,12 @@ void open_decoder_LPD_fx( { set16_fx( st->old_exc_fx, 0, L_EXC_MEM_DEC ); } - set16_fx( st->old_Aq_12_8_fx, 0, add( M, 1 ) ); + set16_fx( st->old_Aq_12_8_fx, 0, M + 1 ); /*Resamp others memories*/ /*Size of LPC syn memory*/ lerp( st->mem_syn_r + sub( L_SYN_MEM, mem_syn_r_size_old ), st->mem_syn_r + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); - Copy( st->mem_syn_r + sub( L_SYN_MEM, M ), st->mem_syn2_fx, M ); + Copy( st->mem_syn_r + L_SYN_MEM - M, st->mem_syn2_fx, M ); /*Untouched memories : st->syn */ } @@ -611,7 +639,9 @@ void open_decoder_LPD_fx( IF( st->hTcxDec != NULL ) { hTcxDec->old_synth_len = shl( st->L_frame, 1 ); + move16(); hTcxDec->old_synth_lenFB = shl( hTcxDec->L_frameTCX, 1 ); + move16(); } /* bass pf reset */ st->bpf_gain_param = 0; @@ -621,18 +651,18 @@ void open_decoder_LPD_fx( set16_fx( hBPF->pst_old_syn_fx, 0, NBPSF_PIT_MAX ); } /* Formant postfilter */ - IF( EQ_16( st->ini_frame, 0 ) ) + IF( st->ini_frame == 0 ) { /*do nothing*/ } ELSE IF( EQ_16( st->last_codec_mode, MODE2 ) ) { - IF( EQ_16( st->tcxonly, 0 ) ) + IF( st->tcxonly == 0 ) { - IF( NE_16( st->hPFstat->on, 0 ) ) + IF( st->hPFstat->on != 0 ) { - lerp( st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); - lerp( st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); } ELSE { @@ -644,10 +674,10 @@ void open_decoder_LPD_fx( move16(); } } - ELSE IF( NE_16( st->hPFstat->on, 0 ) ) + ELSE IF( st->hPFstat->on != 0 ) { - lerp( st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); - lerp( st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); } } ELSE @@ -660,14 +690,14 @@ void open_decoder_LPD_fx( { st->hPFstat->reset = 1; move16(); - IF( NE_16( st->hPFstat->on, 0 ) ) + IF( st->hPFstat->on != 0 ) { st->hPFstat->reset = 0; move16(); Scale_sig( st->hPFstat->mem_pf_in, L_SUBFR, negate( st->Q_syn ) ); /* WB post_filter mem */ Scale_sig( st->hPFstat->mem_stp, L_SUBFR, negate( st->Q_syn ) ); /* WB post_filter mem */ - lerp( st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); - lerp( st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); } } } @@ -680,21 +710,21 @@ void open_decoder_LPD_fx( Scale_sig( st->hPFstat->mem_stp, L_SUBFR, negate( st->Q_syn ) ); /* NB post_filter mem */ } /*feed last value old_synth as it is used for pre-emphasis mem*/ - IF( st->hTcxDec != NULL ) + if ( st->hTcxDec != NULL ) { - hTcxDec->old_synth[sub( hTcxDec->old_synth_len, 1 )] = st->syn[M]; + hTcxDec->old_synth[hTcxDec->old_synth_len - 1] = st->syn[M]; + move16(); } - move16(); - IF( st->hBPF != NULL ) + if ( st->hBPF != NULL ) { - hBPF->pst_old_syn_fx[sub( NBPSF_PIT_MAX, 1 )] = st->syn[M]; + hBPF->pst_old_syn_fx[NBPSF_PIT_MAX - 1] = st->syn[M]; + move16(); } - move16(); } } /* lsf and lsp initialization */ - IF( EQ_16( st->ini_frame, 0 ) ) + IF( st->ini_frame == 0 ) { Copy( st->lsp_old_fx, st->lspold_uw, M ); Copy( st->lsf_old_fx, st->lsfold_uw, M ); @@ -707,7 +737,9 @@ void open_decoder_LPD_fx( st->past_gpit = 0; move16(); st->past_gcode = L_deposit_l( 0 ); + move32(); st->gc_threshold_fx = L_deposit_l( 0 ); + move32(); E_LPC_lsf_lsp_conversion( st->lsf_cng, st->lspold_cng, M ); E_LPC_f_lsp_a_conversion( st->lspold_cng, st->Aq_cng, M ); @@ -719,31 +751,31 @@ void open_decoder_LPD_fx( Copy( st->lsp_old_fx, st->old_lsp_q_cng, M ); set16_fx( st->mem_syn_unv_back, 0, M ); - st->last_gain_syn_deemph = 16384; + st->last_gain_syn_deemph = 32768 / 2; move16(); st->last_gain_syn_deemph_e = 1; move16(); test(); - IF( EQ_16( st->last_codec_mode, MODE1 ) || EQ_16( st->ini_frame, 0 ) ) + IF( EQ_16( st->last_codec_mode, MODE1 ) || st->ini_frame == 0 ) { /* this assumes that MODE1 fades out in the frequency domain - otherwise some data from MODE1 would be needed here */ - st->last_concealed_gain_syn_deemph = 16384; + st->last_concealed_gain_syn_deemph = 32768 / 2; move16(); st->last_concealed_gain_syn_deemph_e = 1; move16(); - IF( hTcxDec != NULL ) + if ( hTcxDec != NULL ) { - hTcxDec->conceal_eof_gain = 16384; /*Q14*/ + hTcxDec->conceal_eof_gain = 32768 / 2; /*Q14*/ move16(); } } /* Post processing */ - set16_fx( st->mem_Aq, 0, i_mult( NB_SUBFR16k, add( M, 1 ) ) ); + set16_fx( st->mem_Aq, 0, i_mult( NB_SUBFR16k, ( M + 1 ) ) ); st->lp_ener_FER_fx = 15360; move16(); /*60 in Q8*/ - IF( EQ_16( st->ini_frame, 0 ) ) + IF( st->ini_frame == 0 ) { st->prev_bfi = 0; move16(); @@ -762,7 +794,7 @@ void open_decoder_LPD_fx( st->clas_dec = UNVOICED_CLAS; move16(); move16(); - IF( !st->last_con_tcx ) + if ( !st->last_con_tcx ) { move16(); st->old_enr_LP = 0; /* LP filter E of last good voiced frame or local LP filter E in TD TCX PLC */ @@ -786,13 +818,16 @@ void open_decoder_LPD_fx( st->last_good = UNVOICED_CLAS; /* last good received frame for concealment */ move16(); st->enr_old_fx = L_deposit_l( 0 ); /* energy at the end of the previous frame */ + move32(); } st->Mode2_lp_gainc = L_deposit_l( 0 ); + move32(); st->Mode2_lp_gainp = L_deposit_l( 0 ); + move32(); st->prev_widow_left_rect = 0; move16(); - IF( st->hTcxDec != NULL ) + if ( st->hTcxDec != NULL ) { #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT /* Todo: should be considered for other stereo modes as well */ @@ -810,7 +845,8 @@ void open_decoder_LPD_fx( #else hTcxDec->conCngLevelBackgroundTrace = PLC_MIN_CNG_LEV_Q21; /*Q21*/ move16(); - hTcxDec->conNoiseLevelIndex = sub( PLC_MIN_STAT_BUFF_SIZE, 1 ); + hTcxDec->conNoiseLevelIndex = PLC_MIN_STAT_BUFF_SIZE - 1; + move16(); hTcxDec->conCurrLevelIndex = 0; move16(); hTcxDec->conLastFrameLevel = PLC_MIN_CNG_LEV; /*Q15*/ @@ -823,18 +859,20 @@ void open_decoder_LPD_fx( move16(); hTcxDec->cummulative_damping_tcx = 32767 /*1.0f Q15*/; + move16(); #endif } move16(); st->cummulative_damping = 32767 /*1.0f Q15*/; move16(); - FOR( i = 0; i < add( shl( NB_SUBFR16k, 1 ), 2 ); i++ ) + FOR( i = 0; i < 2 * NB_SUBFR16k + 2; i++ ) { st->old_pitch_buf_fx[i] = L_deposit_h( st->pit_min ); + move16(); } - FOR( i = 0; i < add( shl( NB_SUBFR16k, 1 ), 2 ); i++ ) + FOR( i = 0; i < 2 * NB_SUBFR16k + 2; i++ ) { st->mem_pitch_gain[i] = 16384 /*1.f Q14*/; /*Q14*/ move16(); @@ -842,8 +880,10 @@ void open_decoder_LPD_fx( st->old_fpitch = L_deposit_h( st->pit_min ); + move32(); #ifndef NEW_IVAS_OPEN_DEC st->old_fpitchFB = L_deposit_h( hTcxDec->pit_min_TCX ); + move32(); #endif st->rate_switching_init = 1; move16(); @@ -853,6 +893,7 @@ void open_decoder_LPD_fx( /* For phase dispersion */ st->dm_fx.prev_gain_code = L_deposit_l( 0 ); + move32(); set16_fx( st->dm_fx.prev_gain_pit, 0, 6 ); st->dm_fx.prev_state = 0; move16(); @@ -861,9 +902,10 @@ void open_decoder_LPD_fx( move16(); /* TCX-LTP */ - IF( hTcxLtpDec != NULL ) + if ( hTcxLtpDec != NULL ) { hTcxLtpDec->tcxltp = getTcxLtp( st->sr_core ); + move16(); } move16(); @@ -878,12 +920,13 @@ void open_decoder_LPD_fx( move16(); hTcxLtpDec->tcxltp_pitch_fr = 0; move16(); - IF( hTcxDec != NULL ) + if ( hTcxDec != NULL ) { hTcxDec->tcxltp_last_gain_unmodified = 0; + move16(); } move16(); - IF( EQ_16( st->ini_frame, 0 ) ) + IF( st->ini_frame == 0 ) { set16_fx( hTcxLtpDec->tcxltp_mem_in, 0, TCXLTP_MAX_DELAY ); set16_fx( hTcxLtpDec->tcxltp_mem_out, 0, L_FRAME48k ); @@ -903,6 +946,7 @@ void open_decoder_LPD_fx( { st->lp_error_ener = Mpy_32_16_1( L_shl( hBPF->pst_lp_ener_fx, 8 ), 0x2a86 ); /* convert from 7Q8 10*log10 -> 15Q16, log2 */ + move32(); } ELSE { @@ -910,7 +954,9 @@ void open_decoder_LPD_fx( move16(); } st->mem_error = L_deposit_l( 0 ); + move32(); st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, total_brate, st->rf_flag ); + move16(); st->last_ctx_hm_enabled = 0; move16(); @@ -922,13 +968,13 @@ void open_decoder_LPD_fx( IF( hTcxDec != NULL ) { hTcxDec->tcx_lpc_shaped_ari = getTcxLpcShapedAri( total_brate, st->rf_flag, st->element_mode ); - + move16(); hTcxDec->envWeighted = 0; + move16(); } - move16(); st->p_bpf_noise_buf = NULL; - IF( EQ_16( st->tcxonly, 0 ) ) + if ( st->tcxonly == 0 ) { st->p_bpf_noise_buf = st->bpf_noise_buf; } @@ -964,6 +1010,8 @@ void open_decoder_LPD_fx( st->enablePlcWaveadjust = 0; move16(); + test(); + test(); IF( st->hTcxDec != NULL && GE_32( st->total_brate, 48000 ) && EQ_16( st->element_mode, EVS_MONO ) ) { st->enablePlcWaveadjust = 1; @@ -982,6 +1030,8 @@ void open_decoder_LPD_fx( PMT("handle to tonalMDCTconceal is missing") #endif //#ifdef ADD_IVAS_HTONALMDCTCONC + test(); + test(); IF( /*st->ADD_IVAS_HTONALMDCTCONC != NULL &&*/ !( GT_16( st->element_mode, EVS_MONO ) && NE_16( st->ini_frame, 0 ) && EQ_16( st->tonalMDCTconceal.nSamples, st->hTcxDec->L_frameTCX ) ) ) { st->tonalMDCTconceal.nScaleFactors = 0; @@ -998,8 +1048,11 @@ void open_decoder_LPD_fx( TonalMDCTConceal_Init_ivas_fx( &st->tonalMDCTconceal, hTcxDec->L_frameTCX, st->L_frame, FDNS_NPTS, st->hTcxCfg ); } st->last_tns_active = 0; + move16(); st->second_last_tns_active = 0; + move16(); st->second_last_core = -1; + move16(); #ifdef NEW_IVAS_OPEN_DEC IF( st->hTcxCfg != NULL && NE_16( st->element_mode, EVS_MONO ) ) { @@ -1050,7 +1103,7 @@ void open_decoder_LPD_fx( st->hTcxCfg->na_scale = 32767 /*1.0f Q15*/; move16(); #endif - IF( hTcxLtpDec != NULL ) + if ( hTcxLtpDec != NULL ) { hTcxLtpDec->tcxltp_gain = 0; move16(); @@ -1080,7 +1133,7 @@ void tcxltp_dec_init_fx( hTcxLtpDec->tcxltp_pitch_fr = 0; move16(); - IF( EQ_16( ini_frame, 0 ) ) + IF( ini_frame == 0 ) { set16_fx( hTcxLtpDec->tcxltp_mem_in, 0, TCXLTP_MAX_DELAY ); set16_fx( hTcxLtpDec->tcxltp_mem_out, 0, L_FRAME48k ); @@ -1111,8 +1164,7 @@ void acelp_plc_mdct_transition_fx( Word16 i; /*PLC*/ - test(); - IF( NE_16( st->prev_bfi, 0 ) && st->hTcxCfg != NULL ) + IF( st->prev_bfi != 0 && st->hTcxCfg != NULL ) { W1 = st->hTcxCfg->tcx_mdct_window_lengthFB; move16(); @@ -1134,13 +1186,15 @@ void acelp_plc_mdct_transition_fx( FOR( i = 0; i < W2; i++ ) { - st->hHQ_core->old_out_fx[add( i, nz )] = round_fx( Mpy_32_16_1( L_mult( w[i].v.re, w[i].v.re ), st->hHQ_core->old_out_fx[add( i, nz )] ) ); + st->hHQ_core->old_out_fx[i + nz] = round_fx( Mpy_32_16_1( L_mult( w[i].v.re, w[i].v.re ), st->hHQ_core->old_out_fx[i + nz] ) ); + move16(); } FOR( ; i < W1; i++ ) { - st->hHQ_core->old_out_fx[add( i, nz )] = round_fx( Mpy_32_16_1( L_mult( w[sub( W2, add( 1, sub( i, W2 ) ) )].v.im, w[sub( W2, add( 1, sub( i, W2 ) ) )].v.im ), st->hHQ_core->old_out_fx[add( i, nz )] ) ); + st->hHQ_core->old_out_fx[i + nz] = round_fx( Mpy_32_16_1( L_mult( w[W2 - 1 - ( i - W2 )].v.im, w[W2 - 1 - ( i - W2 )].v.im ), st->hHQ_core->old_out_fx[i + nz] ) ); + move16(); } - set16_fx( &st->hHQ_core->old_out_fx[add( W1, nz )], 0, nz ); + set16_fx( &st->hHQ_core->old_out_fx[W1 + nz], 0, nz ); lerp( st->hHQ_core->old_out_fx, st->hHQ_core->old_out_LB_fx, st->L_frame, st->hTcxDec->L_frameTCX ); Copy( st->hHQ_core->old_out_fx + nz, st->hTcxDec->syn_Overl_TDACFB, shr( st->hTcxDec->L_frameTCX, 1 ) ); @@ -1149,6 +1203,7 @@ void acelp_plc_mdct_transition_fx( move16(); Copy( st->hHQ_core->old_out_LB_fx + nz, st->hTcxDec->syn_Overl_TDAC, shr( st->L_frame, 1 ) ); st->hHQ_core->Q_old_wtda_LB = st->hHQ_core->Q_old_wtda; + move16(); } return; @@ -1189,29 +1244,35 @@ void open_decoder_LPD_ivas_fx( hTcxLtpDec = st->hTcxLtpDec; hTcxDec = st->hTcxDec; - IF( NE_16( st->codec_mode, MODE1 ) ) /*already updated in MODE1*/ + if ( NE_16( st->codec_mode, MODE1 ) ) /*already updated in MODE1*/ { st->fscale_old = st->fscale; move16(); } st->sr_core = getCoreSamplerateMode2( st->element_mode, total_brate, bwidth, st->flag_ACELP16k, st->rf_flag, st->is_ism_format ); + move16(); st->fscale = sr2fscale_fx( st->sr_core ); + move16(); fscaleFB = sr2fscale_fx( st->output_Fs ); + move16(); /* initializing variables for frame lengths etc. right in the beginning */ st->L_frame = extract_l( Mult_32_16( st->sr_core, 0x0290 ) ); - IF( EQ_16( st->ini_frame, 0 ) ) + move16(); + if ( st->ini_frame == 0 ) { st->last_L_frame = st->L_frame_past = st->L_frame; move16(); + move16(); } IF( st->hTcxDec != NULL ) { st->hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); + move16(); st->output_frame_fx = st->hTcxDec->L_frameTCX; move16(); - IF( EQ_16( st->ini_frame, 0 ) ) + if ( ( st->ini_frame == 0 ) ) { st->L_frameTCX_past = st->hTcxDec->L_frameTCX; move16(); @@ -1233,7 +1294,7 @@ void open_decoder_LPD_ivas_fx( test(); IF( ( EQ_16( st->element_mode, EVS_MONO ) && EQ_16( st->L_frame, L_FRAME16k ) && LE_32( st->total_brate, 32000 ) ) || ( GT_16( st->element_mode, EVS_MONO ) && EQ_16( st->L_frame, L_FRAME16k ) && LE_32( total_brate, MAX_ACELP_BRATE ) ) || - ( NE_16( st->tcxonly, 0 ) && ( EQ_32( st->sr_core, 32000 ) || EQ_32( st->sr_core, 16000 ) ) ) ) + ( ( st->tcxonly != 0 ) && ( EQ_32( st->sr_core, 32000 ) || EQ_32( st->sr_core, 16000 ) ) ) ) { st->nb_subfr = NB_SUBFR16k; move16(); @@ -1243,14 +1304,16 @@ void open_decoder_LPD_ivas_fx( st->nb_subfr = NB_SUBFR; move16(); } + move16(); st->bits_frame = extract_l( L_shr( Mpy_32_16_1( L_shl( st->total_brate, 1 ), 20972 ), 6 ) ); /* 20972 = 0.01 * 64 * 32768 */ // assert(FSCALE_DENOM == 512); // assert(st->fscale == 2 * st->L_frame); /* this assumption is true if operated in 20ms frames with FSCALE_DENOM == 512, which is the current default */ // assert(st->bits_frame == (int16_t)(((float)st->L_frame / (float)st->fscale) * (float)FSCALE_DENOM / 128.0f * (float)total_brate / 100.0f + 0.49f)); st->TcxBandwidth = getTcxBandwidth( bwidth ); + move16(); st->narrowBand = 0; move16(); - IF( EQ_16( bwidth, NB ) ) + if ( EQ_16( bwidth, NB ) ) { st->narrowBand = 1; move16(); @@ -1259,11 +1322,14 @@ void open_decoder_LPD_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) { st->pit_res_max = initPitchLagParameters( INT_FS_12k8, &st->pit_min, &st->pit_fr1, &st->pit_fr1b, &st->pit_fr2, &st->pit_max ); + move16(); IF( hTcxDec != NULL ) { i = mult_r( hTcxDec->L_frameTCX, getInvFrameLen( L_FRAME ) ); hTcxDec->pit_max_TCX = extract_l( L_shr( L_mult( st->pit_max, i ), 7 ) ); + move16(); hTcxDec->pit_min_TCX = extract_l( L_shr( L_mult( st->pit_min, i ), 7 ) ); + move16(); } } ELSE @@ -1277,7 +1343,7 @@ void open_decoder_LPD_ivas_fx( } } - IF( EQ_16( st->ini_frame, 0 ) ) + if ( ( st->ini_frame == 0 ) ) { st->pit_res_max_past = st->pit_res_max; move16(); @@ -1337,7 +1403,7 @@ void open_decoder_LPD_ivas_fx( move16(); } - IF( EQ_16( st->tcxonly, 0 ) ) + IF( ( st->tcxonly == 0 ) ) { st->numlpc = 1; move16(); @@ -1353,10 +1419,9 @@ void open_decoder_LPD_ivas_fx( move16(); IF( st->hBWE_TD != NULL ) { - set16_fx( hBWE_TD->prev_lsf_diff_fx, 16384, sub( LPC_SHB_ORDER, 2 ) ); + set16_fx( hBWE_TD->prev_lsf_diff_fx, 16384, LPC_SHB_ORDER - 2 ); hBWE_TD->prev_tilt_para_fx = 0; - move16(); - set16_fx( hBWE_TD->cur_sub_Aq_fx, 0, add( M, 1 ) ); + set16_fx( hBWE_TD->cur_sub_Aq_fx, 0, M + 1 ); } IF( st->hIGFDec != NULL ) @@ -1378,7 +1443,7 @@ void open_decoder_LPD_ivas_fx( IF( st->hTECDec != NULL ) { /*constraint for adaptive bpf, otherwise parameter estimation and post-processing not time aligned*/ - IF( EQ_16( st->tcxonly, 0 ) ) + if ( ( st->tcxonly == 0 ) ) { // To be added later // assert(0 == (st->hTcxCfg->lfacnext > 0 ? st->hTcxCfg->lfacnext : 0)); @@ -1387,12 +1452,12 @@ void open_decoder_LPD_ivas_fx( resetTecDec_Fx( st->hTECDec ); } - IF( NE_16( st->element_mode, IVAS_SCE ) ) + if ( NE_16( st->element_mode, IVAS_SCE ) ) { st->flag_cna = 0; move16(); } - IF( EQ_16( st->ini_frame, 0 ) ) + IF( st->ini_frame == 0 ) { st->flag_cna = 0; move16(); @@ -1401,7 +1466,7 @@ void open_decoder_LPD_ivas_fx( } /* Static vectors to zero */ - IF( EQ_16( st->ini_frame, 0 ) ) + IF( ( st->ini_frame == 0 ) ) { st->last_is_cng = 0; move16(); @@ -1412,13 +1477,13 @@ void open_decoder_LPD_ivas_fx( IF( st->hTcxDec != NULL ) { reset_tcx_overl_buf_fx( st->hTcxDec ); - set16_fx( hTcxDec->syn_OverlFB, 0, shr( L_FRAME_MAX, 1 ) ); + set16_fx( hTcxDec->syn_OverlFB, 0, L_FRAME_MAX / 2 ); set16_fx( hTcxDec->old_synth, 0, OLD_SYNTH_INTERNAL_DEC ); - set16_fx( hTcxDec->synth_history_fx, 0, add( L_PROT48k, L_FRAME_MAX ) ); + set16_fx( hTcxDec->synth_history_fx, 0, L_PROT48k + L_FRAME_MAX ); hTcxDec->q_synth_history_fx = 0; move16(); } - set16_fx( st->syn, 0, add( M, 1 ) ); + set16_fx( st->syn, 0, M + 1 ); set16_fx( st->mem_syn_r, 0, L_SYN_MEM ); mem_syn_r_size_old = 0; /* just to avoid MSVC warnings */ @@ -1433,6 +1498,7 @@ void open_decoder_LPD_ivas_fx( { /* Reset old_synth in case of core sampling rate switching and Mode 1/2 switching*/ test(); + test(); IF( st->hTcxDec != NULL && ( NE_16( st->L_frame, st->last_L_frame ) || ( EQ_16( st->last_codec_mode, MODE1 ) && EQ_16( st->element_mode, EVS_MONO ) ) ) ) { set16_fx( hTcxDec->old_synth, 0, OLD_SYNTH_INTERNAL_DEC ); @@ -1480,7 +1546,7 @@ void open_decoder_LPD_ivas_fx( test(); test(); test(); - IF( ( NE_16( st->element_mode, IVAS_CPE_DFT ) || ( EQ_16( st->element_mode, IVAS_CPE_DFT ) && st->prev_bfi ) ) && EQ_16( st->last_codec_mode, MODE1 ) && EQ_16( st->last_core, ACELP_CORE ) ) + IF( ( NE_16( st->element_mode, IVAS_CPE_DFT ) || ( EQ_16( st->element_mode, IVAS_CPE_DFT ) && st->prev_bfi ) ) && EQ_16( st->last_codec_mode, MODE1 ) && ( st->last_core == ACELP_CORE ) ) { /* Switching from Mode 1 ACELP */ st->last_core_bfi = ACELP_CORE; @@ -1489,13 +1555,17 @@ void open_decoder_LPD_ivas_fx( { acelp_plc_mdct_transition_fx( st ); *Q_syn_Overl_TDAC = sub( *Q_fer_samples, 1 ); + move16(); *Q_syn_Overl = *Q_fer_samples; move16(); *Q_syn_Overl_TDACFB = sub( *Q_fer_samples, 1 ); + move16(); *Q_syn_OverlFB = *Q_fer_samples; move16(); *Q_old_out = sub( *Q_fer_samples, 1 ); + move16(); *Q_old_outLB = sub( *Q_fer_samples, 1 ); + move16(); } } test(); @@ -1504,8 +1574,8 @@ void open_decoder_LPD_ivas_fx( test(); test(); IF( EQ_16( st->last_codec_mode, MODE2 ) && NE_16( st->L_frame, st->last_L_frame ) && - ( ( EQ_16( st->m_frame_type, SID_FRAME ) && GT_16( st->last_core, ACELP_CORE ) ) || - ( GT_16( st->last_core, ACELP_CORE ) && GT_16( st->core, ACELP_CORE ) ) || st->prev_bfi ) ) + ( ( EQ_16( st->m_frame_type, SID_FRAME ) && ( st->last_core > ACELP_CORE ) ) || + ( ( st->last_core > ACELP_CORE ) && ( st->core > ACELP_CORE ) ) || st->prev_bfi ) ) { lerp( st->hHQ_core->old_out_LB_fx, st->hHQ_core->old_out_LB_fx, st->L_frame, st->last_L_frame ); } @@ -1527,7 +1597,7 @@ void open_decoder_LPD_ivas_fx( st->tilt_code_fx = TILT_CODE; move16(); set16_fx( st->old_exc_fx, 0, L_EXC_MEM_DEC ); - set16_fx( st->syn, 0, add( 1, M ) ); + set16_fx( st->syn, 0, 1 + M ); set16_fx( st->mem_syn2_fx, 0, M ); /*OLA -> zero */ @@ -1579,6 +1649,7 @@ void open_decoder_LPD_ivas_fx( /* convert quantized LSP vector */ st->rate_switching_reset = lsp_convert_poly_fx( st->lsp_old_fx, st->L_frame, 0 ); + move16(); IF( EQ_16( st->tcxonly, 0 ) ) { lsp2lsf_fx( st->lsp_old_fx, st->lsf_old_fx, M, st->sr_core ); @@ -1612,12 +1683,12 @@ void open_decoder_LPD_ivas_fx( { set16_fx( st->old_exc_fx, 0, L_EXC_MEM_DEC ); } - set16_fx( st->old_Aq_12_8_fx, 0, add( M, 1 ) ); + set16_fx( st->old_Aq_12_8_fx, 0, M + 1 ); /*Resamp others memories*/ /*Size of LPC syn memory*/ lerp( st->mem_syn_r + sub( L_SYN_MEM, mem_syn_r_size_old ), st->mem_syn_r + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); - Copy( st->mem_syn_r + sub( L_SYN_MEM, M ), st->mem_syn2_fx, M ); + Copy( st->mem_syn_r + L_SYN_MEM - M, st->mem_syn2_fx, M ); } /* update of lsf_old only needed in BASOP */ /* ELSE IF( !st->tcxonly && (st->L_frame == L_FRAME16k) && (st->last_total_brate > ACELP_32k) ) */ @@ -1627,7 +1698,7 @@ void open_decoder_LPD_ivas_fx( } test(); test(); - IF( EQ_16( st->last_bwidth, NB ) && NE_16( st->bwidth, NB ) && NE_16( st->ini_frame, 0 ) ) + if ( EQ_16( st->last_bwidth, NB ) && NE_16( st->bwidth, NB ) && ( st->ini_frame != 0 ) ) { st->rate_switching_reset = 1; move16(); @@ -1648,7 +1719,7 @@ void open_decoder_LPD_ivas_fx( } /* Formant postfilter */ - IF( EQ_16( st->ini_frame, 0 ) ) + IF( ( st->ini_frame == 0 ) ) { /* do nothing */ } @@ -1658,8 +1729,8 @@ void open_decoder_LPD_ivas_fx( { IF( st->hPFstat->on ) { - lerp( st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); - lerp( st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); } ELSE { @@ -1672,8 +1743,8 @@ void open_decoder_LPD_ivas_fx( } ELSE IF( st->hPFstat->on ) { - lerp( st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); - lerp( st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); } } ELSE @@ -1687,7 +1758,7 @@ void open_decoder_LPD_ivas_fx( { st->hPFstat->reset = 1; move16(); - IF( NE_16( st->hPFstat->on, 0 ) ) + IF( st->hPFstat->on != 0 ) { st->hPFstat->reset = 0; move16(); @@ -1695,8 +1766,8 @@ void open_decoder_LPD_ivas_fx( // Scale_sig(st->hPFstat->mem_pf_in, L_SUBFR, negate(st->Q_syn)); /* WB post_filter mem */ // Scale_sig(st->hPFstat->mem_stp, L_SUBFR, negate(st->Q_syn)); /* WB post_filter mem */ //-------------- - lerp( st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); - lerp( st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_old, st->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); } } } @@ -1711,19 +1782,21 @@ void open_decoder_LPD_ivas_fx( //} //------------------ /*feed last value old_synth as it is used for pre-emphasis mem*/ - IF( st->hTcxDec != NULL ) + if ( st->hTcxDec != NULL ) { - st->hTcxDec->old_synth[sub( st->hTcxDec->old_synth_len, 1 )] = st->syn[M]; + st->hTcxDec->old_synth[st->hTcxDec->old_synth_len - 1] = st->syn[M]; + move16(); } - IF( st->hBPF != NULL ) + if ( st->hBPF != NULL ) { - st->hBPF->pst_old_syn_fx[sub( NBPSF_PIT_MAX, 1 )] = st->syn[M]; + st->hBPF->pst_old_syn_fx[NBPSF_PIT_MAX - 1] = st->syn[M]; + move16(); } } } /* lsf and lsp initialization */ - IF( EQ_16( st->ini_frame, 0 ) ) + IF( ( st->ini_frame == 0 ) ) { Copy( st->lsp_old_fx, st->lspold_uw, M ); Copy( st->lsf_old_fx, st->lsfold_uw, M ); @@ -1735,7 +1808,9 @@ void open_decoder_LPD_ivas_fx( st->past_gpit = 0; move16(); st->past_gcode = L_deposit_l( 0 ); + move32(); st->gc_threshold_fx = L_deposit_l( 0 ); + move32(); E_LPC_lsf_lsp_conversion( st->lsf_cng, st->lspold_cng, M ); E_LPC_f_lsp_a_conversion( st->lspold_cng, st->Aq_cng, M ); @@ -1746,22 +1821,23 @@ void open_decoder_LPD_ivas_fx( Copy( st->lsp_old_fx, st->lsp_q_cng, M ); Copy( st->lsp_old_fx, st->old_lsp_q_cng, M ); set16_fx( st->mem_syn_unv_back, 0, M ); - st->last_gain_syn_deemph = 16384; /* 1.f Q14*/ - test(); - IF( EQ_16( st->last_codec_mode, MODE1 ) || EQ_16( st->ini_frame, 0 ) ) + st->last_gain_syn_deemph = 32768 / 2; /* 1.f Q14*/ + + IF( EQ_16( st->last_codec_mode, MODE1 ) || ( st->ini_frame == 0 ) ) { /* this assumes that MODE1 fades out in the frequency domain - otherwise some data from MODE1 would be needed here */ - st->last_concealed_gain_syn_deemph = 16384; + st->last_concealed_gain_syn_deemph = 32768 / 2; + move16(); st->last_concealed_gain_syn_deemph_e = 1; move16(); - IF( hTcxDec != NULL ) + if ( hTcxDec != NULL ) { - hTcxDec->conceal_eof_gain = 16384; /*Q14*/ + hTcxDec->conceal_eof_gain = 32768 / 2; /*Q14*/ } } /* Post processing */ - set16_fx( st->mem_Aq, 0, i_mult( NB_SUBFR16k, add( M, 1 ) ) ); + set16_fx( st->mem_Aq, 0, i_mult( NB_SUBFR16k, ( M + 1 ) ) ); st->lp_ener_FER_fx = 15360; /*60.0f Q8*/ move16(); @@ -1771,7 +1847,7 @@ void open_decoder_LPD_ivas_fx( move16(); st->last_core_bfi = -1; move16(); - IF( st->hTcxDec != NULL ) + if ( st->hTcxDec != NULL ) { hTcxDec->tcxConceal_recalc_exc = 0; move16(); @@ -1798,7 +1874,7 @@ void open_decoder_LPD_ivas_fx( st->clas_dec = UNVOICED_CLAS; move16(); - IF( !st->last_con_tcx ) + if ( !st->last_con_tcx ) { st->old_enr_LP = 0; move16(); /* LP filter E of last good voiced frame or local LP filter E in TD TCX PLC */ @@ -1819,11 +1895,16 @@ void open_decoder_LPD_ivas_fx( st->last_good = UNVOICED_CLAS; move16(); /* last good received frame for concealment */ st->enr_old_fx = L_deposit_l( 0 ); /* energy at the end of the previous frame */ + move32(); } st->Mode2_lp_gainc = L_deposit_l( 0 ); + move32(); st->Mode2_lp_gainp = L_deposit_l( 0 ); + move32(); st->lp_gainc_fx = (Word16) L_deposit_l( 0 ); + move16(); st->lp_gainp_fx = (Word16) L_deposit_l( 0 ); + move16(); IF( st->hTcxDec != NULL ) { @@ -1834,17 +1915,20 @@ void open_decoder_LPD_ivas_fx( test(); IF( is_init || MCT_flag || !( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && EQ_16( st->element_mode, last_element_mode ) ) ) { - st->hTcxDec->NoiseLevelIndex_bfi = sub( PLC_MIN_STAT_BUFF_SIZE, 1 ); + st->hTcxDec->NoiseLevelIndex_bfi = PLC_MIN_STAT_BUFF_SIZE - 1; + move16(); st->hTcxDec->CurrLevelIndex_bfi = 0; + move16(); st->hTcxDec->LastFrameLevel_bfi_fx = PLC_MIN_CNG_LEV; + move16(); set16_fx( st->hTcxDec->conNoiseLevelMemory, PLC_MIN_CNG_LEV, PLC_MIN_STAT_BUFF_SIZE ); set16_fx( st->hTcxDec->conNoiseLevelMemory_e, 0, PLC_MIN_STAT_BUFF_SIZE ); st->hTcxDec->cummulative_damping_tcx = 32767 /*1.0f Q15*/; - + move16(); hTcxDec->conCngLevelBackgroundTrace = PLC_MIN_CNG_LEV_Q21; /*Q21*/ move16(); - hTcxDec->conNoiseLevelIndex = sub( PLC_MIN_STAT_BUFF_SIZE, 1 ); + hTcxDec->conNoiseLevelIndex = PLC_MIN_STAT_BUFF_SIZE - 1; move16(); hTcxDec->conCurrLevelIndex = 0; move16(); @@ -1864,17 +1948,19 @@ void open_decoder_LPD_ivas_fx( st->cummulative_damping = 32767 /*1.0f Q15*/; move16(); - FOR( i = 0; i < add( shl( NB_SUBFR16k, 1 ), 2 ); i++ ) + FOR( i = 0; i < 2 * NB_SUBFR16k + 2; i++ ) { st->old_pitch_buf_fx[i] = L_deposit_h( st->pit_min ); + move32(); } - FOR( i = 0; i < add( shl( NB_SUBFR16k, 1 ), 2 ); i++ ) + FOR( i = 0; i < 2 * NB_SUBFR16k + 2; i++ ) { - st->mem_pitch_gain[i] = 16384 /*1.f Q14*/; - move16(); /*Q14*/ + st->mem_pitch_gain[i] = 16384 /*1.f Q14*/; /*Q14*/ + move16(); } st->old_fpitch = L_deposit_h( st->pit_min ); + move32(); st->rate_switching_init = 1; move16(); @@ -1883,10 +1969,12 @@ void open_decoder_LPD_ivas_fx( /* For phase dispersion */ st->dm_fx.prev_gain_code = L_deposit_l( 0 ); + move32(); set16_fx( st->dm_fx.prev_gain_pit, 0, 6 ); st->dm_fx.prev_state = 0; move16(); st->voice_fac = -1; + move16(); /* TCX-LTP */ IF( hTcxLtpDec != NULL ) @@ -1898,9 +1986,10 @@ void open_decoder_LPD_ivas_fx( IF( hTcxDec != NULL ) { st->old_fpitchFB = L_deposit_h( hTcxDec->pit_min_TCX ); + move32(); test(); test(); - IF( EQ_16( st->ini_frame, 0 ) || ( EQ_16( st->last_codec_mode, MODE1 ) && EQ_16( st->element_mode, EVS_MONO ) ) ) + IF( ( st->ini_frame == 0 ) || ( EQ_16( st->last_codec_mode, MODE1 ) && EQ_16( st->element_mode, EVS_MONO ) ) ) { hTcxDec->tcxltp_last_gain_unmodified = 0; move16(); @@ -1908,7 +1997,7 @@ void open_decoder_LPD_ivas_fx( /* TCX */ hTcxDec->tcx_lpc_shaped_ari = getTcxLpcShapedAri( total_brate, st->rf_flag, st->element_mode ); - + move16(); hTcxDec->envWeighted = 0; move16(); } @@ -1916,6 +2005,7 @@ void open_decoder_LPD_ivas_fx( IF( st->hBPF != NULL ) { st->lp_error_ener = Mpy_32_16_1( L_shl( hBPF->pst_lp_ener_fx, 8 ), 0x2a86 ); /* convert from 7Q8 10*log10 -> 15Q16, log2 */ + move32(); hBPF->pst_mem_deemp_err_fx = 0; move16(); } @@ -1990,7 +2080,7 @@ void open_decoder_LPD_ivas_fx( test(); test(); test(); - IF( st->hTonalMDCTConc != NULL && !( GT_16( st->element_mode, EVS_MONO ) && NE_16( st->ini_frame, 0 ) && EQ_16( st->hTonalMDCTConc->nSamples, st->hTcxDec->L_frameTCX ) ) ) + IF( st->hTonalMDCTConc != NULL && !( GT_16( st->element_mode, EVS_MONO ) && ( st->ini_frame != 0 ) && EQ_16( st->hTonalMDCTConc->nSamples, st->hTcxDec->L_frameTCX ) ) ) { st->hTonalMDCTConc->nScaleFactors = 0; move16(); @@ -2014,7 +2104,18 @@ void open_decoder_LPD_ivas_fx( IF( st->hTcxCfg != NULL && NE_16( st->element_mode, EVS_MONO ) ) { - st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( is_init ? total_brate : L_mult( st->bits_frame_nominal, ( FRAMES_PER_SEC >> 1 ) ), st->igf, st->element_mode ); + Word32 gettns_temp; + IF( is_init ) + { + gettns_temp = total_brate; + move32(); + } + ELSE + { + gettns_temp = L_mult( st->bits_frame_nominal, ( FRAMES_PER_SEC >> 1 ) ); + } + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( gettns_temp, st->igf, st->element_mode ); + move16(); } IF( hTcxDec != NULL ) { diff --git a/lib_dec/core_dec_reconf_fx.c b/lib_dec/core_dec_reconf_fx.c index 568280948..c347fbe8d 100644 --- a/lib_dec/core_dec_reconf_fx.c +++ b/lib_dec/core_dec_reconf_fx.c @@ -65,20 +65,22 @@ void reconfig_decoder_LPD_ivas_fx( IF( NE_16( st->element_mode, IVAS_SCE ) ) { st->flag_cna = getCnaPresent_fx( st->element_mode, st->element_brate, total_brate, bwidth ); + move16(); } /* TCX-LTP */ IF( hTcxLtpDec != NULL ) { hTcxLtpDec->tcxltp = getTcxLtp( st->sr_core ); + move16(); } - move16(); /*Scale TCX for non-active frames to adjust loudness with ACELP*/ IF( st->hTcxCfg != NULL ) { Word16 i; st->hTcxCfg->na_scale = 32767 /*1.0f Q15*/; + move16(); test(); IF( ( LT_16( bwidth, SWB ) ) && !( st->tcxonly ) ) { @@ -90,7 +92,7 @@ void reconfig_decoder_LPD_ivas_fx( ( GE_32( total_brate, scaleTcxTable[i].bitrateFrom ) ) && ( LT_32( total_brate, scaleTcxTable[i].bitrateTo ) ) ) { - IF( st->rf_flag ) + if ( st->rf_flag ) { i = sub( i, 1 ); } @@ -102,7 +104,7 @@ void reconfig_decoder_LPD_ivas_fx( } } /*if its not the first frame resample overlap buffer to new sampling rate */ - IF( NE_16( st->ini_frame, 0 ) ) + IF( ( st->ini_frame != 0 ) ) { test(); test(); @@ -135,7 +137,7 @@ void reconfig_decoder_LPD_ivas_fx( lerp( hTcxDec->syn_Overl, hTcxDec->syn_Overl, newLen, oldLen ); test(); - IF( st->prev_bfi && EQ_16( st->last_core_bfi, ACELP_CORE ) ) + IF( st->prev_bfi && ( st->last_core_bfi == ACELP_CORE ) ) { lerp( hTcxDec->syn_Overl_TDAC, hTcxDec->syn_Overl_TDAC, newLen, oldLen ); } @@ -177,14 +179,15 @@ void reconfig_decoder_LPD_ivas_fx( IF( GT_16( st->element_mode, IVAS_SCE ) ) { lowrate_tcxlpc_max_br = LOWRATE_TCXLPC_MAX_BR_CPE; + move32(); } hTcxDec->enableTcxLpc = EQ_16( st->numlpc, 1 ) && EQ_16( st->lpcQuantization, 1 ) && ( LE_32( total_brate, lowrate_tcxlpc_max_br ) /*LOWRATE_TCXLPC_MAX_BR*/ || st->rf_flag ); + move16(); - IF( EQ_16( st->ini_frame, 0 ) ) + IF( ( st->ini_frame == 0 ) ) { hTcxDec->envWeighted = 0; move16(); - move16(); } return; @@ -250,15 +253,15 @@ void reconfig_decoder_LPD_fx( IF( NE_16( st->element_mode, IVAS_SCE ) ) { st->flag_cna = (Word8) getCnaPresent_fx( st->element_mode, st->element_brate, total_brate, bwidth ); + move16(); } - move16(); /* TCX-LTP */ IF( hTcxLtpDec != NULL ) { hTcxLtpDec->tcxltp = getTcxLtp( st->sr_core ); + move16(); } - move16(); IF( st->hTcxCfg != NULL ) { @@ -282,6 +285,7 @@ void reconfig_decoder_LPD_fx( IF( st->rf_flag ) { i = sub( i, 1 ); + move16(); } st->hTcxCfg->na_scale = scaleTcxTable[i].scale; move16(); @@ -292,7 +296,7 @@ void reconfig_decoder_LPD_fx( } /*if its not the first frame resample overlap buffer to new sampling rate */ - IF( NE_16( st->ini_frame, 0 ) ) + IF( ( st->ini_frame != 0 ) ) { test(); test(); @@ -372,6 +376,7 @@ void reconfig_decoder_LPD_fx( move16(); } hTcxDec->enableTcxLpc = EQ_16( st->numlpc, 1 ) && EQ_16( st->lpcQuantization, 1 ) && ( LE_32( total_brate, lowrate_tcxlpc_max_br ) /*LOWRATE_TCXLPC_MAX_BR*/ || st->rf_flag ); + move16(); IF( EQ_16( st->ini_frame, 0 ) ) { hTcxDec->envWeighted = 0; diff --git a/lib_dec/core_dec_switch_fx.c b/lib_dec/core_dec_switch_fx.c index 2316e9c09..6aaad23ef 100644 --- a/lib_dec/core_dec_switch_fx.c +++ b/lib_dec/core_dec_switch_fx.c @@ -47,7 +47,7 @@ void mode_switch_decoder_LPD_fx( bSwitchFromAmrwbIO = 0; move16(); - IF( EQ_16( st->last_core, AMR_WB_CORE ) ) + if ( EQ_16( st->last_core, AMR_WB_CORE ) ) { bSwitchFromAmrwbIO = 1; move16(); @@ -60,6 +60,7 @@ void mode_switch_decoder_LPD_fx( /* set number of coded lines */ st->hTcxCfg->tcx_coded_lines = getNumTcxCodedLines( bwidth ); + move16(); test(); test(); IF( ( ( GE_16( bwidth, WB ) ) && ( EQ_16( fscale, 640 ) ) && ( EQ_16( fscale, st->fscale ) ) ) ) @@ -67,7 +68,7 @@ void mode_switch_decoder_LPD_fx( test(); test(); test(); - IF( ( ( GT_32( total_brate, 32000 ) ) && ( EQ_16( st->tcxonly, 0 ) ) ) || ( ( LE_32( total_brate, 32000 ) ) && ( NE_16( st->tcxonly, 0 ) ) ) ) + IF( ( ( GT_32( total_brate, 32000 ) ) && ( ( st->tcxonly == 0 ) ) ) || ( ( LE_32( total_brate, 32000 ) ) && ( ( st->tcxonly != 0 ) ) ) ) { switchWB = 1; move16(); @@ -75,17 +76,19 @@ void mode_switch_decoder_LPD_fx( } test(); - IF( GT_16( st->last_L_frame, L_FRAME16k ) && LE_32( total_brate, ACELP_32k ) ) + if ( GT_16( st->last_L_frame, L_FRAME16k ) && LE_32( total_brate, ACELP_32k ) ) { switchWB = 1; move16(); } st->igf = getIgfPresent_fx( st->element_mode, total_brate, bwidth, st->rf_flag ); + move16(); IF( st->hIGFDec != NULL ) { st->hIGFDec->infoIGFStopFreq = -1; + move16(); } move16(); test(); @@ -100,7 +103,7 @@ void mode_switch_decoder_LPD_fx( test(); test(); test(); - IF( NE_16( fscale, st->fscale ) || NE_16( switchWB, 0 ) || NE_16( bSwitchFromAmrwbIO, 0 ) || EQ_16( st->last_codec_mode, MODE1 ) || st->force_lpd_reset ) + IF( NE_16( fscale, st->fscale ) || ( switchWB != 0 ) || ( bSwitchFromAmrwbIO != 0 ) || EQ_16( st->last_codec_mode, MODE1 ) || st->force_lpd_reset ) { #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT open_decoder_LPD_fx( st, total_brate, last_total_brate, bwidth, MCT_flag, last_element_mode, 0 ); @@ -124,11 +127,14 @@ void mode_switch_decoder_LPD_fx( IF( hTcxDec != NULL ) { hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); + move16(); } IF( st->hTcxCfg != NULL ) { st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, total_brate, st->rf_flag ); + move16(); st->hTcxCfg->resq = getResq( total_brate ); + move16(); } move16(); @@ -136,20 +142,20 @@ void mode_switch_decoder_LPD_fx( st->narrowBand = 0; move16(); - IF( EQ_16( bwidth, NB ) ) + if ( EQ_16( bwidth, NB ) ) { st->narrowBand = 1; move16(); } st->TcxBandwidth = getTcxBandwidth( bwidth ); - + move16(); IF( st->hTcxCfg != NULL ) { st->hTcxCfg->pCurrentTnsConfig = NULL; st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( total_brate, st->igf, st->element_mode ); move16(); - IF( NE_16( st->hTcxCfg->fIsTNSAllowed, 0 ) && st->hIGFDec != NULL ) + IF( ( st->hTcxCfg->fIsTNSAllowed != 0 ) && st->hIGFDec != NULL ) { InitTnsConfigs( bwidth, st->hTcxCfg->tcx_coded_lines, st->hTcxCfg->tnsConfig, st->hIGFDec->infoIGFStopFreq, total_brate, st->element_mode, 0 /* 0 should be replaced with MCT_flag*/ ); #ifdef IVAS_CODE @@ -165,7 +171,7 @@ void mode_switch_decoder_LPD_fx( reconfig_decoder_LPD_fx( st, frame_size, bwidth, total_brate, st->last_L_frame ); test(); - IF( NE_16( hTcxDec->envWeighted, 0 ) && EQ_16( hTcxDec->enableTcxLpc, 0 ) ) + IF( hTcxDec->envWeighted != 0 && hTcxDec->enableTcxLpc == 0 ) { Copy( st->lspold_uw, st->lsp_old_fx, M ); Copy( st->lsfold_uw, st->lsf_old_fx, M ); @@ -174,7 +180,7 @@ void mode_switch_decoder_LPD_fx( } /* update PLC LSF memories */ - IF( EQ_16( st->tcxonly, 0 ) ) + IF( st->tcxonly == 0 ) { lsp2lsf_fx( st->lsp_old_fx, st->lsfoldbfi1_fx, M, extract_l( st->sr_core ) ); } @@ -185,7 +191,7 @@ void mode_switch_decoder_LPD_fx( Copy( st->lsfoldbfi1_fx, st->lsfoldbfi0_fx, M ); Copy( st->lsfoldbfi1_fx, st->lsf_adaptive_mean_fx, M ); - IF( NE_16( st->igf, 0 ) && hBWE_TD != NULL ) + IF( st->igf != 0 && hBWE_TD != NULL ) { test(); test(); @@ -213,11 +219,12 @@ void mode_switch_decoder_LPD_fx( } } + test(); test(); test(); IF( ( EQ_16( bwidth, SWB ) ) && ( EQ_32( total_brate, ACELP_16k40 ) || EQ_32( total_brate, ACELP_24k40 ) ) && EQ_16( st->element_mode, EVS_MONO ) ) { - IF( EQ_16( st->tec_tfa, 0 ) ) + if ( st->tec_tfa == 0 ) { set16_fx( st->hTECDec->loBuffer, 0, MAX_TEC_SMOOTHING_DEG ); } @@ -309,7 +316,7 @@ void mode_switch_decoder_LPD_ivas_fx( test(); test(); test(); - IF( ( ( GT_32( total_brate, ACELP_32k ) ) && ( EQ_16( st->tcxonly, 0 ) ) ) || ( ( LE_32( total_brate, ACELP_32k ) ) && EQ_16( st->tcxonly, 1 ) ) ) + IF( ( ( GT_32( total_brate, ACELP_32k ) ) && ( ( st->tcxonly == 0 ) ) ) || ( ( LE_32( total_brate, ACELP_32k ) ) && EQ_16( st->tcxonly, 1 ) ) ) { switchWB = 1; move16(); @@ -324,6 +331,7 @@ void mode_switch_decoder_LPD_ivas_fx( } st->igf = getIgfPresent_fx( st->element_mode, total_brate, bwidth, st->rf_flag ); + move16(); IF( st->hIGFDec != NULL ) { @@ -334,7 +342,7 @@ void mode_switch_decoder_LPD_ivas_fx( move16(); test(); test(); - IF( st->igf && ( EQ_16( st->idchan, 0 ) || EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) ) + IF( st->igf && ( ( st->idchan == 0 ) || EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) ) { /* switch IGF configuration */ IGFDecSetMode_ivas_fx( st->hIGFDec, total_brate, bwidth, st->element_mode, -1, -1, st->rf_flag ); @@ -357,9 +365,11 @@ void mode_switch_decoder_LPD_ivas_fx( st->fscale = fscale; move16(); st->L_frame = extract_l( Mult_32_16( st->sr_core, 0x0290 ) ); + move16(); IF( st->hTcxDec != NULL ) { st->hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); + move16(); st->output_frame_fx = st->hTcxDec->L_frameTCX; move16(); } @@ -367,7 +377,9 @@ void mode_switch_decoder_LPD_ivas_fx( IF( st->hTcxCfg != NULL ) { st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, total_brate, st->rf_flag ); + move16(); st->hTcxCfg->resq = getResq( total_brate ); + move16(); } move16(); @@ -383,8 +395,10 @@ void mode_switch_decoder_LPD_ivas_fx( ELSE { st->narrowBand = 0; + move16(); } st->TcxBandwidth = getTcxBandwidth( bwidth ); + move16(); IF( st->hTcxCfg != NULL ) { @@ -451,6 +465,7 @@ void mode_switch_decoder_LPD_ivas_fx( } test(); test(); + test(); IF( EQ_16( bwidth, SWB ) && ( EQ_32( total_brate, ACELP_16k40 ) || EQ_32( total_brate, ACELP_24k40 ) ) && EQ_16( st->element_mode, EVS_MONO ) ) { IF( EQ_16( st->tec_tfa, 0 ) && st->hTECDec != NULL ) diff --git a/lib_dec/ivas_lfe_plc_fx.c b/lib_dec/ivas_lfe_plc_fx.c index 25a3444ec..003392ca9 100644 --- a/lib_dec/ivas_lfe_plc_fx.c +++ b/lib_dec/ivas_lfe_plc_fx.c @@ -42,6 +42,9 @@ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*------------------------------------------------------------------------------------------* * Local constants diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index b8d3fac66..9b35fb7c9 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -49,6 +49,9 @@ #include "math.h" #include "wmc_auto.h" #include "rom_dec.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif #ifdef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------------* diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index cb1460ea2..7332f26f1 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -44,6 +44,9 @@ #include "prot_fx1.h" #include "prot_fx2.h" #include "ivas_prot_fx.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*-----------------------------------------------------------------------* * Local function prototypes diff --git a/lib_dec/ivas_qspherical_dec.c b/lib_dec/ivas_qspherical_dec.c index 40fdbdc5e..f64051f18 100644 --- a/lib_dec/ivas_qspherical_dec.c +++ b/lib_dec/ivas_qspherical_dec.c @@ -38,6 +38,9 @@ #include "ivas_stat_dec.h" #include "wmc_auto.h" #include "prot.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*-------------------------------------------------------------------* diff --git a/lib_dec/ivas_sns_dec_fx.c b/lib_dec/ivas_sns_dec_fx.c index 8d5e1f007..f240029b3 100644 --- a/lib_dec/ivas_sns_dec_fx.c +++ b/lib_dec/ivas_sns_dec_fx.c @@ -42,6 +42,9 @@ #ifdef IVAS_FLOAT_FIXED #include "prot_fx1.h" #include "prot_fx2.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*------------------------------------------------------------------- * sns_1st_dec_fx() diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 4d5d54195..50ca91a30 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -46,6 +46,9 @@ #include "ivas_prot_fx.h" #endif // IVAS_FLOAT_FIXED #ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif +#ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------------------------* * Local constants diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index 0e77aa9e4..48394bd86 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -44,6 +44,10 @@ #include "prot_fx1.h" #include "prot_fx2.h" #endif +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif + /*------------------------------------------------------------------- * Local constants *-------------------------------------------------------------------*/ diff --git a/lib_dec/ivas_stereo_icbwe_dec.c b/lib_dec/ivas_stereo_icbwe_dec.c index 80f9655bf..ca3159f3e 100644 --- a/lib_dec/ivas_stereo_icbwe_dec.c +++ b/lib_dec/ivas_stereo_icbwe_dec.c @@ -44,6 +44,9 @@ #include "wmc_auto.h" #include "rom_com.h" #include "ivas_rom_com.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif #define Q_icBWE 16 diff --git a/lib_dec/ivas_stereo_switching_dec.c b/lib_dec/ivas_stereo_switching_dec.c index 232675e4b..733708657 100644 --- a/lib_dec/ivas_stereo_switching_dec.c +++ b/lib_dec/ivas_stereo_switching_dec.c @@ -45,6 +45,9 @@ #include #include "prot_fx2.h" #include "ivas_prot_fx.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*-------------------------------------------------------------------* * Local constants diff --git a/lib_dec/ivas_stereo_td_dec.c b/lib_dec/ivas_stereo_td_dec.c index d9401f665..129857e0d 100644 --- a/lib_dec/ivas_stereo_td_dec.c +++ b/lib_dec/ivas_stereo_td_dec.c @@ -42,6 +42,9 @@ #include "ivas_rom_com.h" #include "ivas_cnst.h" #include "wmc_auto.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index 2dc9d607c..d08241540 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -928,8 +928,9 @@ static void calculate_energy_buffer( Word16 temp_q2 = norm_s( hCPE->hStereoDft->NFFT ); band_res_dft_fx = div_l( L_shl( input_Fs, temp_q1 ), shl( hCPE->hStereoDft->NFFT, temp_q2 ) ); + /* chan_width_f = 24000.f / CLDFB_NO_CHANNELS_MAX; */ chan_width_f_fx = 24000 / CLDFB_NO_CHANNELS_MAX; - chan_width_bins_fx = L_shl( (Word32) div_s( chan_width_f_fx, band_res_dft_fx ), ( sub( add( temp_q1, 1 ), temp_q2 ) ) ); // Q16 + chan_width_bins_fx = L_shl( (Word32) div_s( chan_width_f_fx, band_res_dft_fx ), ( sub( temp_q1, temp_q2 ) ) ); // Q16 pDFT_DMX = hCPE->hStereoDft->DFT[0]; // to be removed start = 1; diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 12f70c3b2..8eaf2d7a0 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -46,6 +46,9 @@ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*-----------------------------------------------------------------------* diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index c3a0881f6..10efa2f16 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -43,6 +43,9 @@ #include "ivas_cnst.h" #include "ivas_rom_com.h" #include "wmc_auto.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*------------------------------------------------------------------------- * Local function definitions diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 4cc597b98..6c2d569af 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -46,6 +46,9 @@ #include "prot_fx2.h" #include "ivas_prot_fx.h" #endif +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*-----------------------------------------------------------------------* diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index bc6e1f9de..37d72eda5 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -45,6 +45,9 @@ #include "prot_fx1.h" #include "prot_fx2.h" #include "ivas_prot_fx.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*-----------------------------------------------------------------------* * Local function prototypes diff --git a/lib_rend/ivas_allrad_dec.c b/lib_rend/ivas_allrad_dec.c index d99b2a1e7..448e257a9 100644 --- a/lib_rend/ivas_allrad_dec.c +++ b/lib_rend/ivas_allrad_dec.c @@ -182,6 +182,7 @@ ivas_error ivas_sba_get_hoa_dec_matrix_fx( ivas_error error; error = IVAS_ERR_OK; + move16(); /* Allocate memory */ assert( *hoa_dec_mtx == NULL && "hoa_dec_mtx != NULL" ); @@ -192,6 +193,7 @@ ivas_error ivas_sba_get_hoa_dec_matrix_fx( /* Initialization by zeroing all SH coeff up to 3rd order (IVAS convention) */ num_spk = hOutSetup.nchan_out_woLFE; + move16(); p_dec_mtx = *hoa_dec_mtx; FOR( i = 0; i < num_spk; i++ ) @@ -199,24 +201,30 @@ ivas_error ivas_sba_get_hoa_dec_matrix_fx( FOR( j = 0; j < SBA_NHARM_HOA3; j++ ) { *( p_dec_mtx++ ) = 0; + move32(); } } - IF( hOutSetup.output_config == IVAS_AUDIO_CONFIG_MONO ) + IF( EQ_32( hOutSetup.output_config, IVAS_AUDIO_CONFIG_MONO ) ) { ( *hoa_dec_mtx )[0] = ONE_IN_Q29; // 1.f in Q29 + move32(); } - ELSE IF( hOutSetup.output_config == IVAS_AUDIO_CONFIG_STEREO ) + ELSE IF( EQ_32( hOutSetup.output_config, IVAS_AUDIO_CONFIG_STEREO ) ) { ( *hoa_dec_mtx )[0] = ONE_IN_Q28; // 0.5f in Q29 ( *hoa_dec_mtx )[1] = ONE_IN_Q28; // 0.5f in Q29 ( *hoa_dec_mtx )[SBA_NHARM_HOA3] = ONE_IN_Q28; // 0.5f in Q29 ( *hoa_dec_mtx )[SBA_NHARM_HOA3 + 1] = -ONE_IN_Q28; // 0.5f in Q29 + move32(); + move32(); + move32(); + move32(); } ELSE IF( hOutSetup.is_loudspeaker_setup ) { /* init EFIP */ - IF( ( error = efap_init_data_fx( &( hEFAP ), hOutSetup.ls_azimuth_fx, hOutSetup.ls_elevation_fx, num_spk, EFAP_MODE_EFIP ) ) != IVAS_ERR_OK ) + IF( NE_16( ( error = efap_init_data_fx( &( hEFAP ), hOutSetup.ls_azimuth_fx, hOutSetup.ls_elevation_fx, num_spk, EFAP_MODE_EFIP ) ), IVAS_ERR_OK ) ) { return error; } @@ -225,6 +233,7 @@ ivas_error ivas_sba_get_hoa_dec_matrix_fx( /* Get t-design values */ num_td = SBA_T_DESIGN_11_SIZE; + move16(); t_design_azi = t_design_11_azimuth_int; t_design_ele = t_design_11_elevation_int; @@ -232,13 +241,39 @@ ivas_error ivas_sba_get_hoa_dec_matrix_fx( FOR( i = 0; i < num_td; i++ ) { /* spherical harmonics response for t-design, corresponding to ambisonic order */ - ivas_dirac_dec_get_response_fx( - ( (Word16) L_shr( t_design_azi[i], 22 ) ) > 0 ? ( (Word16) L_shr( t_design_azi[i], 22 ) ) : ( (Word16) L_shr( t_design_azi[i], 22 ) ) + 1, - ( (Word16) L_shr( t_design_ele[i], 22 ) ) > 0 ? ( (Word16) L_shr( t_design_ele[i], 22 ) ) : ( (Word16) L_shr( t_design_ele[i], 22 ) ) + 1, - Y_td_int, ambisonics_order, Q29 ); + IF( L_shr( t_design_azi[i], 22 ) > 0 ) + { + IF( L_shr( t_design_ele[i], 22 ) > 0 ) + { + ivas_dirac_dec_get_response_fx( extract_l( L_shr( t_design_azi[i], 22 ) ), extract_l( L_shr( t_design_ele[i], 22 ) ), Y_td_int, ambisonics_order, Q29 ); + } + ELSE + { + ivas_dirac_dec_get_response_fx( + extract_l( L_shr( t_design_azi[i], 22 ) ), add( extract_l( L_shr( t_design_ele[i], 22 ) ), 1 ), + Y_td_int, ambisonics_order, Q29 ); + } + } + ELSE + { + IF( L_shr( t_design_ele[i], 22 ) > 0 ) + { + ivas_dirac_dec_get_response_fx( add( extract_l( L_shr( t_design_azi[i], 22 ) ), 1 ), + extract_l( L_shr( t_design_ele[i], 22 ) ), + Y_td_int, ambisonics_order, Q29 ); + } + ELSE + { + ivas_dirac_dec_get_response_fx( + add( extract_l( L_shr( t_design_azi[i], 22 ) ), 1 ), + add( extract_l( L_shr( t_design_ele[i], 22 ) ), 1 ), + Y_td_int, ambisonics_order, Q29 ); + } + } FOR( j = 0; j < num_harm; j++ ) { Y_td_int[j] = L_shl( Mpy_32_32( Y_td_int[j], norm_sn3d_hoa3_int[j] ), Q1 ); // Q28 + move32(); } /* t-design to real LS panning gains */ @@ -248,29 +283,34 @@ ivas_error ivas_sba_get_hoa_dec_matrix_fx( FOR( j = 0; j < num_spk; j++ ) { Word32 dec_mtx_temp = 0; + move32(); FOR( k = 0; k < num_harm; k++ ) { dec_mtx_temp = Mpy_32_32( G_td_int[j], Y_td_int[k] ); // Q27 *p_dec_mtx = L_add( *p_dec_mtx, L_shr( dec_mtx_temp, 2 ) ); // Q25 + move32(); // printf( "\n%f", ((float)*p_dec_mtx)/ ONE_IN_Q25 ); p_dec_mtx++; } - p_dec_mtx += ( SBA_NHARM_HOA3 - num_harm ); + p_dec_mtx += sub( SBA_NHARM_HOA3 , num_harm ); } } tmp_val = TEMP_VAL; + move32(); p_dec_mtx = *hoa_dec_mtx; FOR( i = 0; i < num_spk; i++ ) { Word32 dec_mtx_temp_scale = 0; + move32(); FOR( j = 0; j < num_harm; j++ ) { dec_mtx_temp_scale = Mpy_32_32( tmp_val, norm_sn3d_hoa3_int[j] ); // Q35 *p_dec_mtx = Mpy_32_32( *p_dec_mtx, dec_mtx_temp_scale ); // Q29 + move32(); p_dec_mtx++; } - p_dec_mtx += ( SBA_NHARM_HOA3 - num_harm ); + p_dec_mtx += sub( SBA_NHARM_HOA3 , num_harm ); } /* free EFAP handle */ diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index c50a45f7b..a492c7b39 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -73,7 +73,7 @@ ivas_error ivas_hrtf_init( hHrtf->max_num_ir = 0; hHrtf->max_num_iterations = 0; hHrtf->index_frequency_max_diffuse = 0; - move16(); + move32(); move16(); move16(); move16(); @@ -229,7 +229,8 @@ static void ivas_hrtf_close( HRTFS_HANDLE *hHrtf /* i/o: HRTF handle */ ) { - if ( hHrtf == NULL || *hHrtf == NULL ) + test(); + IF( hHrtf == NULL || *hHrtf == NULL ) { return; } @@ -263,11 +264,14 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf = pCrend->hHrtfCrend; /* Do all error checks up front so that the nested if later is easier */ - IF( NE_16( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) && NE_16( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) + test(); + IF( inConfigType != IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED && NE_16( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Encountered unsupported input config in Crend" ); } + test(); + test(); IF( NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Encountered unsupported output type in Crend" ); @@ -288,16 +292,17 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->max_num_ir = nchan_in; move16(); - IF( LE_16( hHrtf->max_num_ir, 0 ) ) + IF( hHrtf->max_num_ir <= 0 ) { return IVAS_ERR_INTERNAL_FATAL; } IF( hSetOfHRTF == NULL ) { - IF( EQ_16( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) + IF( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { hHrtf->max_num_ir = sub( hHrtf->max_num_ir, 1 ); /* subtract LFE */ + move16(); hHrtf->gain_lfe_fx = GAIN_LFE_FX; move16(); @@ -975,9 +980,10 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE { - IF( EQ_16( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) + IF( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { - hHrtf->max_num_ir -= 1; /* subtract LFE */ + hHrtf->max_num_ir = sub( hHrtf->max_num_ir, 1 ); /* subtract LFE */ + move16(); hHrtf->gain_lfe_fx = GAIN_LFE_FX; move16(); @@ -2035,6 +2041,8 @@ static ivas_error ivas_shoebox_output_init( hShoeboxOutput->n_sources = 0; hShoeboxOutput->n_ref = 0; + move16(); + move16(); IF( ( error = ivas_shoebox_data_init( &hShoeboxOutput->times ) ) != IVAS_ERR_OK ) { @@ -2219,7 +2227,7 @@ static ivas_error ivas_shoebox_obj_init( hShoeboxObj->min_wall_dist_fx = 0; hShoeboxObj->soundspeed_fx = 0; hShoeboxObj->air_coeff_fx = 0; - move32(); + move16(); move32(); move32(); move32(); @@ -2315,6 +2323,8 @@ static ivas_error ivas_er_init_handle( move16(); move16(); move16(); + move16(); + move32(); move32(); move32(); FOR( i = 0; i < 75; i++ ) @@ -2325,11 +2335,11 @@ static ivas_error ivas_er_init_handle( FOR( i = 0; i < 3; i++ ) { reflections->user_origin_fx[i] = 0; - move16(); - IF( EQ_16( i, 2 ) ) + move32(); + if ( EQ_16( i, 2 ) ) { - reflections->user_origin_fx[i] = (Word32) ER_LIST_HEIGHT_FX; - move16(); + reflections->user_origin_fx[i] = ER_LIST_HEIGHT_FX; + move32(); } } reflections->circ_buffers = NULL; @@ -2555,6 +2565,7 @@ ivas_error ivas_rend_openCrend( ivas_error error; error = IVAS_ERR_OK; + move16(); IF( ( error = ivas_rend_initCrendWrapper( pCrend ) ) != IVAS_ERR_OK ) { @@ -2602,7 +2613,7 @@ ivas_error ivas_rend_openCrend( max_total_ir_len = imult1616( (Word16) hHrtf->num_iterations_diffuse[0], subframe_length ); - IF( GT_16( max_total_ir_len, 0 ) ) + IF( max_total_ir_len > 0 ) { IF( ( hCrend->freq_buffer_re_diffuse_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { @@ -2622,7 +2633,7 @@ ivas_error ivas_rend_openCrend( } max_total_ir_len = add( extract_l( L_shr( L_add( L_shl( Mult_32_32( hHrtf->latency_s_fx, output_Fs ), 1 ), 1 ), 1 ) ), subframe_length ); /*(int16_t) ( hHrtf->latency_s * output_Fs + 0.5f ) + subframe_length;*/ - IF( GT_16( max_total_ir_len, 0 ) ) + IF( max_total_ir_len > 0 ) { IF( ( hCrend->lfe_delay_line_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { @@ -2658,12 +2669,16 @@ ivas_error ivas_rend_openCrend( hCrend->reflections->use_er = hRendCfg->roomAcoustics.use_er; hCrend->reflections->lowComplexity = hRendCfg->roomAcoustics.lowComplexity; + move16(); + move32(); /* Set sample rate and frame size */ - hCrend->reflections->output_Fs_fx = (Word32) output_Fs; + hCrend->reflections->output_Fs_fx = output_Fs; + move32(); hCrend->reflections->max_frame_size = extract_l( Mult_32_16( output_Fs, INV_FRAME_PER_SEC_Q15 ) ); + move32(); /* Init Shoebox */ ivas_shoebox_config_init( &hCrend->reflections->shoebox_lib.cal, hRendCfg ); @@ -2685,6 +2700,7 @@ ivas_error ivas_rend_openCrend( } ( *pCrend )->binaural_latency_ns = Mult_32_32( ( *pCrend )->hHrtfCrend->latency_s_fx, (Word32) 1000000000 ); + move32(); } ( *pCrend )->hCrend = hCrend; @@ -3099,12 +3115,12 @@ static ivas_error ivas_rend_crendConvolver( hCrend = pCrend->hCrend; - IF( NE_32( ( error = getAudioConfigNumChannels( inConfig, &nchan_in ) ), IVAS_ERR_OK ) ) + IF( ( error = getAudioConfigNumChannels( inConfig, &nchan_in ) ) != IVAS_ERR_OK ) { return error; } - IF( NE_32( ( error = getAudioConfigNumChannels( outConfig, &nchan_out ) ), IVAS_ERR_OK ) ) + IF( ( error = getAudioConfigNumChannels( outConfig, &nchan_out ) ) != IVAS_ERR_OK ) { return error; } @@ -3114,7 +3130,7 @@ static ivas_error ivas_rend_crendConvolver( lfe_idx_in = -1; move16(); - IF( EQ_32( getAudioConfigType( inConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) + IF( getAudioConfigType( inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { IF( NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { @@ -3128,7 +3144,7 @@ static ivas_error ivas_rend_crendConvolver( } offset = imult1616( hCrend->delay_line_rw_index, subframe_length ); /* subframe_length * ( pCrend->hHrtfCrend->max_num_iterations - 1 ); */ - offset_diffuse = hCrend->diffuse_delay_line_rw_index * subframe_length; /* subframe_length *( pCrend->hHrtfCrend->num_iterations_diffuse[0] - 1 ); */ + offset_diffuse = imult1616( hCrend->diffuse_delay_line_rw_index, subframe_length ); /* subframe_length *( pCrend->hHrtfCrend->num_iterations_diffuse[0] - 1 ); */ IF( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) { @@ -3140,9 +3156,9 @@ static ivas_error ivas_rend_crendConvolver( move16(); FOR( idx_in = 0; idx_in < nchan_in; idx_in++ ) { - pIn = &pcm_in[idx_in][i_ts * subframe_length]; + pIn = &pcm_in[idx_in][imult1616( i_ts, subframe_length )]; - IF( idx_in != lfe_idx_in ) + IF( NE_16( idx_in, lfe_idx_in ) ) { IF( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) { @@ -3154,6 +3170,8 @@ static ivas_error ivas_rend_crendConvolver( { pFreq_buf_re[k] = L_add( Mpy_32_16_r( pFreq_filt_re[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[i] ), pFreq_buf_re[k] ); pFreq_buf_im[k] = L_add( Mpy_32_16_r( pFreq_filt_im[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[i] ), pFreq_buf_im[k] ); + move32(); + move32(); } } pFreq_buf_re = &hCrend->freq_buffer_re_fx[i][offset]; @@ -3185,6 +3203,7 @@ static ivas_error ivas_rend_crendConvolver( { offset_in = add( add( hCrend->delay_line_rw_index, sub( pCrend->hHrtfCrend->max_num_iterations, pCrend->hHrtfCrend->num_iterations[i][j] ) ), add( m, 1 ) ); offset_in = offset_in % ( pCrend->hHrtfCrend->max_num_iterations ); + move16(); offset_in = imult1616( offset_in, subframe_length ); pFreq_buf_re = &hCrend->freq_buffer_re_fx[i][offset_in]; pFreq_buf_im = &hCrend->freq_buffer_im_fx[i][offset_in]; @@ -3193,8 +3212,10 @@ static ivas_error ivas_rend_crendConvolver( FOR( k = 0; k < pCrend->hHrtfCrend->pIndex_frequency_max[i][j][m]; k++ ) { - tmp_out_re[k] = L_add( Msub_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_re[k] ), pFreq_buf_im[k], pFreq_filt_im[k] ) << 2, tmp_out_re[k] ); - tmp_out_im[k] = L_add( Madd_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_im[k] ), pFreq_buf_im[k], pFreq_filt_re[k] ) << 2, tmp_out_im[k] ); + tmp_out_re[k] = L_add( L_shl( Msub_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_re[k] ), pFreq_buf_im[k], pFreq_filt_im[k] ), 2 ), tmp_out_re[k] ); + tmp_out_im[k] = L_add( L_shl( Madd_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_im[k] ), pFreq_buf_im[k], pFreq_filt_re[k] ), 2 ), tmp_out_im[k] ); + move32(); + move32(); } offset = add( offset, k ); } @@ -3208,6 +3229,7 @@ static ivas_error ivas_rend_crendConvolver( { offset_diffuse = add( hCrend->diffuse_delay_line_rw_index, add( m, 1 ) ); offset_diffuse = offset_diffuse % pCrend->hHrtfCrend->num_iterations_diffuse[0]; + move16(); offset_diffuse = imult1616( offset_diffuse, subframe_length ); pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[offset_diffuse]; pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[offset_diffuse]; @@ -3217,6 +3239,8 @@ static ivas_error ivas_rend_crendConvolver( { tmp_out_re[k] = L_add( Msub_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_re[k] ), pFreq_buf_im[k], pFreq_filt_im[k] ), tmp_out_re[k] ); tmp_out_im[k] = L_add( Madd_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_im[k] ), pFreq_buf_im[k], pFreq_filt_re[k] ), tmp_out_im[k] ); + move32(); + move32(); } offset = add( offset, k ); } @@ -3226,20 +3250,26 @@ static ivas_error ivas_rend_crendConvolver( #ifdef DUMPS_ENABLED dbgwrite_txt( pOut, subframe_length << 1, "Fixed_imdft_out.txt", NULL ); #endif - pFreq_buf_re = &pcm_out[j][i_ts * subframe_length]; + pFreq_buf_re = &pcm_out[j][imult1616( i_ts, subframe_length )]; FOR( k = 0; k < subframe_length; k++ ) { pFreq_buf_re[k] = L_add( pOut[k], hCrend->prev_out_buffer_fx[j][k] ); - hCrend->prev_out_buffer_fx[j][k] = pOut[k + subframe_length]; + hCrend->prev_out_buffer_fx[j][k] = pOut[add( k, subframe_length )]; + move32(); + move32(); } } hCrend->delay_line_rw_index = add( hCrend->delay_line_rw_index, 1 ); hCrend->delay_line_rw_index = hCrend->delay_line_rw_index % ( pCrend->hHrtfCrend->max_num_iterations ); + move16(); + move16(); IF( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) { hCrend->diffuse_delay_line_rw_index = add( hCrend->diffuse_delay_line_rw_index, 1 ); hCrend->diffuse_delay_line_rw_index = hCrend->diffuse_delay_line_rw_index % ( pCrend->hHrtfCrend->num_iterations_diffuse[0] ); + move16(); + move16(); } return IVAS_ERR_OK; @@ -3448,13 +3478,15 @@ ivas_error ivas_rend_crendProcess( hCrend = pCrend->hCrend; combinedOrientationEnabled = 0; + move16(); IF( hCombinedOrientationData != NULL ) { FOR( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) { - IF( NE_16( hCombinedOrientationData->enableCombinedOrientation[subframe_idx], 0 ) ) + IF( hCombinedOrientationData->enableCombinedOrientation[subframe_idx] != 0 ) { combinedOrientationEnabled = 1; + move16(); BREAK; } } @@ -3505,13 +3537,14 @@ ivas_error ivas_rend_crendProcess( test(); IF( EQ_16( hCrend->reflections->use_er, 1 ) && EQ_16( hCrend->reflections->is_ready, 1 ) ) { - IF( NE_32( ( error = ivas_er_process( hCrend->reflections, subframe_len, subframe_idx, output_fx, inConfig ) ), IVAS_ERR_OK ) ) + IF( ( error = ivas_er_process( hCrend->reflections, subframe_len, subframe_idx, output_fx, inConfig ) ) != IVAS_ERR_OK ) { return error; } } } + test(); IF( hDecoderConfig && combinedOrientationEnabled ) { /* Orientation tracking */ @@ -3521,6 +3554,8 @@ ivas_error ivas_rend_crendProcess( SBA SPAR -> BINAURAL or BINAURAL_ROOM */ test(); + test(); + test(); IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_FOA ) || EQ_16( inConfig, IVAS_AUDIO_CONFIG_HOA2 ) || EQ_16( inConfig, IVAS_AUDIO_CONFIG_HOA3 ) ) { rotateFrame_shd( hCombinedOrientationData, output_fx, subframe_len, *hIntSetup, subframe_idx ); @@ -3556,7 +3591,7 @@ ivas_error ivas_rend_crendProcess( /* move to output */ FOR( i = 0; i < nchan_out; i++ ) { - mvr2r_Word32( pcm_tmp_fx[i], output_fx[i], num_subframes * subframe_len ); + mvr2r_Word32( pcm_tmp_fx[i], output_fx[i], imult1616( num_subframes, subframe_len ) ); } pop_wmops(); @@ -3722,23 +3757,25 @@ ivas_error ivas_rend_crendProcessSubframe( hCrend = pCrend->hCrend; combinedOrientationEnabled = 0; + move16(); IF( hCombinedOrientationData != NULL ) { - IF( NE_16( hCombinedOrientationData->enableCombinedOrientation[0], 0 ) ) + if ( hCombinedOrientationData->enableCombinedOrientation[0] != 0 ) { combinedOrientationEnabled = 1; + move16(); } } push_wmops( "ivas_rend_crendProcessSubframe" ); inConfigType = getAudioConfigType( inConfig ); - IF( NE_32( ( error = getAudioConfigNumChannels( outConfig, &nchan_out ) ), IVAS_ERR_OK ) ) + IF( ( error = getAudioConfigNumChannels( outConfig, &nchan_out ) ) != IVAS_ERR_OK ) { return error; } - IF( NE_32( ( error = getAudioConfigNumChannels( inConfig, &nchan_in ) ), IVAS_ERR_OK ) ) + IF( ( error = getAudioConfigNumChannels( inConfig, &nchan_in ) ) != IVAS_ERR_OK ) { return error; } @@ -3752,9 +3789,10 @@ ivas_error ivas_rend_crendProcessSubframe( p_pcm_tmp_fx[ch] = pcm_tmp_fx[ch]; } slot_size = hTcBuffer->n_samples_granularity; + move16(); /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ - slots_to_render = min( hTcBuffer->num_slots - hTcBuffer->slots_rendered, n_samples_to_render / slot_size ); + slots_to_render = s_min( sub( hTcBuffer->num_slots, hTcBuffer->slots_rendered ), idiv1616( n_samples_to_render, slot_size ) ); first_sf = hTcBuffer->subframes_rendered; move16(); last_sf = first_sf; @@ -3771,21 +3809,26 @@ ivas_error ivas_rend_crendProcessSubframe( /* Early Reflections */ IF( hCrend->reflections != NULL ) { - IF( hCrend->reflections->use_er == 1 && hCrend->reflections->is_ready == 1 ) + test(); + IF( EQ_32( hCrend->reflections->use_er, 1 ) && EQ_32( hCrend->reflections->is_ready, 1 ) ) { - IF( NE_32( ( error = ivas_er_process( hCrend->reflections, subframe_len, 0, tc_local_fx, inConfig ) ), IVAS_ERR_OK ) ) + IF( ( error = ivas_er_process( hCrend->reflections, subframe_len, 0, tc_local_fx, inConfig ) ) != IVAS_ERR_OK ) { return error; } } } + test(); IF( hDecoderConfig && combinedOrientationEnabled ) { /* Rotation in SHD for: MC with elevation (5_1_2 / 5_1_4 / 7_1_4) -> BINAURAL SBA SPAR -> BINAURAL or BINAURAL_ROOM */ + test(); + test(); + test(); IF( EQ_32( inConfig, IVAS_AUDIO_CONFIG_FOA ) || EQ_32( inConfig, IVAS_AUDIO_CONFIG_HOA2 ) || EQ_32( inConfig, IVAS_AUDIO_CONFIG_HOA3 ) ) { rotateFrame_shd( hCombinedOrientationData, tc_local_fx, subframe_len, *hIntSetup, 0 ); @@ -3797,10 +3840,11 @@ ivas_error ivas_rend_crendProcessSubframe( } } + test(); IF( EQ_32( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) || EQ_32( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) { - IF( NE_32( ( error = ivas_rend_crendConvolver( pCrend, inConfig, outConfig, tc_local_fx, p_pcm_tmp_fx, output_Fs, 0 ) ), IVAS_ERR_OK ) ) + IF( ( error = ivas_rend_crendConvolver( pCrend, inConfig, outConfig, tc_local_fx, p_pcm_tmp_fx, output_Fs, 0 ) ) != IVAS_ERR_OK ) { return error; @@ -3808,7 +3852,7 @@ ivas_error ivas_rend_crendProcessSubframe( IF( pCrend->hCrend->hReverb != NULL ) { - IF( NE_32( ( error = ivas_reverb_process_fx( pCrend->hCrend->hReverb, inConfig, 1, tc_local_fx, p_pcm_tmp_fx, 0 ) ), IVAS_ERR_OK ) ) + IF( ( error = ivas_reverb_process_fx( pCrend->hCrend->hReverb, inConfig, 1, tc_local_fx, p_pcm_tmp_fx, 0 ) ) != IVAS_ERR_OK ) { return error; } @@ -3822,6 +3866,7 @@ ivas_error ivas_rend_crendProcessSubframe( p_pcm_tmp_fx[ch] += subframe_len; } hTcBuffer->slots_rendered = add( hTcBuffer->subframe_nbslots[subframe_idx], hTcBuffer->slots_rendered ); + move16(); } ELSE { @@ -3832,12 +3877,14 @@ ivas_error ivas_rend_crendProcessSubframe( } IF( pCrend->hCrend->hReverb != NULL ) { - *pCrend->p_io_qfactor -= 2; + *pCrend->p_io_qfactor = sub( *pCrend->p_io_qfactor, 2 ); + move16(); FOR( Word16 i = nchan_out; i < nchan_in; i++ ) { FOR( Word16 j = 0; j < n_samples_to_render; j++ ) { - output[i][j] = (Word32) L_shr( output[i][j], 2 ); + output[i][j] = L_shr( output[i][j], 2 ); + move32(); } } } @@ -3848,6 +3895,7 @@ ivas_error ivas_rend_crendProcessSubframe( } hTcBuffer->subframes_rendered = last_sf; + move16(); pop_wmops(); return IVAS_ERR_OK; diff --git a/lib_rend/ivas_dirac_ana.c b/lib_rend/ivas_dirac_ana.c index 8e52a997a..534f59551 100644 --- a/lib_rend/ivas_dirac_ana.c +++ b/lib_rend/ivas_dirac_ana.c @@ -76,6 +76,7 @@ ivas_error ivas_dirac_ana_open_fx( ivas_error error; error = IVAS_ERR_OK; + move16(); IF( ( hDirAC = (DIRAC_ANA_HANDLE) malloc( sizeof( DIRAC_ANA_DATA ) ) ) == NULL ) { @@ -519,7 +520,7 @@ static void ivas_dirac_param_est_ana_fx( { io_q = Q7; // Input Q of data_fx move16(); - cldfbAnalysis_ts_fx_fixed_q( &( data_fx[i][l_ts * ts] ), Foa_RealBuffer_fx[i], Foa_ImagBuffer_fx[i], l_ts, hDirAC->cldfbAnaEnc[i], &io_q ); + cldfbAnalysis_ts_fx_fixed_q( &( data_fx[i][imult1616( l_ts, ts )] ), Foa_RealBuffer_fx[i], Foa_ImagBuffer_fx[i], l_ts, hDirAC->cldfbAnaEnc[i], &io_q ); } scale_fact = getScaleFactor32( (const Word32 *) Foa_RealBuffer_fx, FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX ); scale_fact = s_min( getScaleFactor32( (const Word32 *) Foa_ImagBuffer_fx, FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX ), scale_fact ); @@ -557,6 +558,7 @@ static void ivas_dirac_param_est_ana_fx( // exp2 = sub( shl( scale_fact, 1 ), 31 ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hDirAC->index_buffer_intensity = add( ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ), 1 ); /* averaging_length = 32 */ + move16(); index = hDirAC->index_buffer_intensity; move16(); Word16 guard_bits = find_guarded_bits_fx( DIRAC_NO_COL_AVG_DIFF ); @@ -608,7 +610,7 @@ static void ivas_dirac_param_est_ana_fx( q_factor_energy = add( sub( shl( scale_fact, 1 ), 31 ), sub( scale_fact2, guard_bits ) ); } - IF( NE_16( q_factor_intensity_old, 0 ) ) + IF( q_factor_intensity_old != 0 ) { IF( LT_16( q_factor_intensity_old, q_factor_intensity ) ) @@ -640,7 +642,7 @@ static void ivas_dirac_param_est_ana_fx( } } } - IF( NE_16( q_factor_energy_old, 0 ) ) + IF( q_factor_energy_old != 0 ) { IF( LT_16( q_factor_energy_old, q_factor_energy ) ) @@ -663,7 +665,7 @@ static void ivas_dirac_param_est_ana_fx( { FOR( Word16 k = 0; k < num_freq_bands; k++ ) { - hDirAC->buffer_energy_fx[i * j + k] = L_shr( hDirAC->buffer_energy_fx[i * j + k], sub( q_factor_energy_old, q_factor_energy_old ) ); + hDirAC->buffer_energy_fx[add( imult1616( i, j ), k )] = L_shr( hDirAC->buffer_energy_fx[add( imult1616( i, j ), k )], sub( q_factor_energy_old, q_factor_energy_old ) ); move32(); } } @@ -676,7 +678,7 @@ static void ivas_dirac_param_est_ana_fx( /* only real part needed */ Copy32( intensity_real_fx[i], &( hDirAC->buffer_intensity_real_fx[i][index - 1][0] ), num_freq_bands ); } - Copy32( reference_power_fx[ts], &( hDirAC->buffer_energy_fx[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + Copy32( reference_power_fx[ts], &( hDirAC->buffer_energy_fx[imult1616( sub( index, 1 ), num_freq_bands )] ), num_freq_bands ); computeDiffuseness_fx( hDirAC->buffer_intensity_real_fx, hDirAC->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, q_factor_intensity, q_factor_energy, diffuseness_vector_exp ); q_factor_intensity_old = q_factor_intensity; @@ -685,7 +687,7 @@ static void ivas_dirac_param_est_ana_fx( move16(); FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) { - IF( LT_16( diffuseness_vector_exp[j], 10 ) ) + if ( LT_16( diffuseness_vector_exp[j], 10 ) ) { diffuseness_vector_fx[j] = 0; move16(); diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 59b022eff..cb6ec1e3d 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -402,6 +402,7 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( nBins = st_ivas->hSpatParamRendCom->num_freq_bands; move16(); renderer_type = st_ivas->renderer_type; + move32(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { @@ -432,6 +433,7 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( set16_fx( hDiracDecBin->ChCrossReOutPrev_e, 0, nBins ); set16_fx( hDiracDecBin->ChCrossImOutPrev_e, 0, nBins ); hDiracDecBin->renderStereoOutputInsteadOfBinaural = 0; + move16(); hDiracDecBin->q_processMtx = Q15; hDiracDecBin->q_processMtxSCCR = Q15; @@ -439,6 +441,12 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( hDiracDecBin->q_processMtxPrevSCCR = Q15; hDiracDecBin->q_processMtxDec = Q15; hDiracDecBin->q_processMtxDecPrev = Q15; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); FOR( bin = 0; bin < nBins; bin++ ) { @@ -449,11 +457,14 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( { tmp = shl( tmp, tmp_e ); /*q15*/ tmp_e = 0; + move16(); } - tmpFloat_fx = s_max( 0, sub( shl_sat( 1, 15 - tmp_e ), tmp ) ) /*max( 0.0f, 1.0f - binCenterFreq / 2700.0f )*/; /*Q30*/ + tmpFloat_fx = s_max( 0, sub( shl_sat( 1, sub( 15, tmp_e ) ), tmp ) ) /*max( 0.0f, 1.0f - binCenterFreq / 2700.0f )*/; /*Q30*/ tmp2 = extract_l( Mult_32_32( binCenterFreq_fx, 1952258 /*=2^31*180/(550)/360*/ ) % 32767 ); //*binCenterFreq_fx * EVS_PI / 550.0f*/ hDiracDecBin->diffuseFieldCoherence_fx[bin] = L_shl( L_mult0( divide3232( tmpFloat_fx, Mult_32_16( binCenterFreq_fx, 187 /*2^15*pi/550*/ ) ), getSineWord16R2( tmp2 ) ), tmp_e ); /*tmpFloat * sinf( binCenterFreq * EVS_PI / 550.0f ) / ( binCenterFreq * EVS_PI / 550.0f );*/ hDiracDecBin->diffuseFieldCoherence_fx[bin] = L_shl( hDiracDecBin->diffuseFieldCoherence_fx[bin], 1 ); + move32(); + move32(); } FOR( bin = 0; bin < BINAURAL_COHERENCE_DIFFERENCE_BINS; bin++ ) @@ -461,21 +472,28 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( hDiracDecBin->diffuseFieldCoherenceX_fx[bin] = L_add( hDiracDecBin->diffuseFieldCoherence_fx[bin], diffuseFieldCoherenceDifferenceX_fx[bin] ); hDiracDecBin->diffuseFieldCoherenceY_fx[bin] = L_add( hDiracDecBin->diffuseFieldCoherence_fx[bin], diffuseFieldCoherenceDifferenceY_fx[bin] ); hDiracDecBin->diffuseFieldCoherenceZ_fx[bin] = L_add( hDiracDecBin->diffuseFieldCoherence_fx[bin], diffuseFieldCoherenceDifferenceZ_fx[bin] ); + move32(); + move32(); + move32(); } IF( EQ_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC ) ) /* Indication of binaural rendering without room effect */ { set32_fx( hDiracDecBin->earlyPartEneCorrection_fx, ONE_IN_Q28, CLDFB_NO_CHANNELS_MAX ); hDiracDecBin->q_earlyPartEneCorrection = Q28; + move16(); hDiracDecBin->hReverb = NULL; } ELSE IF( EQ_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) /* Indication of binaural rendering with room effect */ { Copy32( hHrtfParambin->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); hDiracDecBin->q_earlyPartEneCorrection = Q28; + move16(); /* reconfiguration needed when Reverb. parameters are changed -> close and open the handle again */ - IF( hDiracDecBin->hReverb != NULL && ( ( hDiracDecBin->hReverb->numBins != nBins ) || - ( hDiracDecBin->hReverb->blockSize != CLDFB_SLOTS_PER_SUBFRAME ) ) ) + test(); + test(); + IF( hDiracDecBin->hReverb != NULL && ( ( NE_16( hDiracDecBin->hReverb->numBins, nBins ) ) || + ( NE_16( hDiracDecBin->hReverb->blockSize, CLDFB_SLOTS_PER_SUBFRAME ) ) ) ) { ivas_binaural_reverb_close_fx( &( hDiracDecBin->hReverb ) ); } @@ -495,6 +513,8 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( hDiracDecBin->q_earlyPartEneCorrection = Q28; hDiracDecBin->hReverb = NULL; hDiracDecBin->renderStereoOutputInsteadOfBinaural = 1; + move16(); + move16(); } ELSE /* Not valid renderer type for this renderer */ { @@ -503,9 +523,10 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( hDiracDecBin->hDiffuseDist = NULL; /* Memory is allocated from stack during runtime when needed */ - IF( hDiracDecBin->hTdDecorr == NULL ) + if ( hDiracDecBin->hTdDecorr == NULL ) { hDiracDecBin->useTdDecorr = 0; + move16(); } IF( hDiracDecBin->h_freq_domain_decorr_ap_params != NULL ) @@ -518,6 +539,8 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( return error; } + test(); + test(); IF( !hDiracDecBin->useTdDecorr && !( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) ) { Word16 frequency_axis_fx[CLDFB_NO_CHANNELS_MAX]; @@ -538,6 +561,7 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( } hDiracDecBin->reqularizationFactor_fx = configure_reqularization_factor_fx( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); + move16(); st_ivas->hDiracDecBin = hDiracDecBin; @@ -548,15 +572,19 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( Word16 n_samples_granularity; nchan_to_allocate = 2 * BINAURAL_CHANNELS; - IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + move16(); + if ( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { nchan_to_allocate = 2 * BINAURAL_CHANNELS + 2; + move16(); } - n_samples_granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + n_samples_granularity = NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + test(); + test(); IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { - n_samples_granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); /* Use the same granularity as tdrend */ + n_samples_granularity = NS2SA_fx2( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); /* Use the same granularity as tdrend */ } IF( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, ivas_jbm_dec_get_num_tc_channels( st_ivas ), nchan_to_allocate, nchan_to_allocate, n_samples_granularity ) ) != IVAS_ERR_OK ) @@ -579,6 +607,7 @@ void ivas_dirac_dec_close_binaural_data( ) { + test(); IF( hBinaural == NULL || *hBinaural == NULL ) { return; @@ -640,6 +669,7 @@ ivas_error ivas_dirac_dec_binaural_copy_hrtfs_fx( ) { Word16 i, j; + test(); IF( hHrtfParambin != NULL && *hHrtfParambin != NULL ) { /* Tables already loaded from file */ @@ -676,25 +706,26 @@ ivas_error ivas_dirac_dec_binaural_copy_hrtfs( HRTFS_PARAMBIN_HANDLE *hHrtfParambin /* i/o: HRTF structure for rendering */ ) { - int16_t i, j; - if ( hHrtfParambin != NULL && *hHrtfParambin != NULL ) + Word16 i, j; + test(); + IF( hHrtfParambin != NULL && *hHrtfParambin != NULL ) { /* Tables already loaded from file */ return IVAS_ERR_OK; } - else + ELSE { /* Initialise tables from ROM */ HRTFS_PARAMBIN *hrtfParambin; - if ( ( hrtfParambin = (HRTFS_PARAMBIN *) malloc( sizeof( HRTFS_PARAMBIN ) ) ) == NULL ) + IF( ( hrtfParambin = (HRTFS_PARAMBIN *) malloc( sizeof( HRTFS_PARAMBIN ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for parametric binauralizer HRTF tables" ); } - for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) { - for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + FOR( j = 0; j < HRTF_SH_CHANNELS; j++ ) { Copy( hrtfShCoeffsRe_fx[i][j], hrtfParambin->hrtfShCoeffsRe_fx[i][j], HRTF_NUM_BINS ); Copy( hrtfShCoeffsIm_fx[i][j], hrtfParambin->hrtfShCoeffsIm_fx[i][j], HRTF_NUM_BINS ); @@ -850,6 +881,7 @@ void ivas_dirac_dec_binaural_render_fx( hSpatParamRendCom = st_ivas->hSpatParamRendCom; nchan_out = BINAURAL_CHANNELS; + move16(); FOR( ch = 0; ch < nchan_out; ch++ ) { output_fx_local[ch] = output_fx_local_buff[ch]; @@ -859,16 +891,20 @@ void ivas_dirac_dec_binaural_render_fx( /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ slots_to_render = s_min( sub( hSpatParamRendCom->num_slots, hSpatParamRendCom->slots_rendered ), idiv1616( (Word16) nSamplesAsked, (Word16) slot_size ) ); *nSamplesRendered = imult1616( slots_to_render, slot_size ); + move16(); first_sf = hSpatParamRendCom->subframes_rendered; last_sf = first_sf; + move16(); + move16(); WHILE( GT_16( slots_to_render, 0 ) ) { slots_to_render = sub( slots_to_render, hSpatParamRendCom->subframe_nbslots[last_sf] ); - last_sf++; + last_sf = add( last_sf, 1 ); } output_length = 0; + move16(); FOR( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { Word16 n_samples_sf = imult1616( slot_size, hSpatParamRendCom->subframe_nbslots[subframe_idx] ); @@ -893,9 +929,11 @@ void ivas_dirac_dec_binaural_render_fx( IF( EQ_16( hSpatParamRendCom->slots_rendered, hSpatParamRendCom->num_slots ) ) { hSpatParamRendCom->dirac_read_idx = add( hSpatParamRendCom->dirac_read_idx, DEFAULT_JBM_SUBFRAMES_5MS ) % hSpatParamRendCom->dirac_md_buffer_length; + move16(); } *nSamplesAvailable = imult1616( sub( hSpatParamRendCom->num_slots, hSpatParamRendCom->slots_rendered ), slot_size ); + move16(); return; } @@ -1219,6 +1257,7 @@ static void ivas_dirac_dec_binaural_internal_fx( { #if 1 Word16 q_input = 11; + move16(); #ifdef MSAN_FIX_ Word16 nchan_tc; @@ -1237,19 +1276,22 @@ static void ivas_dirac_dec_binaural_internal_fx( IF( st_ivas->hSCE[0] ) { Word16 shift = getScaleFactor32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); - IF( LT_16( sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ), 4 ) ) + if ( LT_16( sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ), 4 ) ) { shift = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 4 ); } scale_sig32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, shift ); st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ); + move16(); } Word16 q_cldfb[6][CLDFB_SLOTS_PER_SUBFRAME] = { 0 }; + move16(); FOR( Word16 ind = 0; ind < 6; ind++ ) { FOR( Word16 ind2 = 0; ind2 < 4; ind2++ ) { q_cldfb[ind][ind2] = q_input; + move16(); } } #endif @@ -1270,22 +1312,39 @@ static void ivas_dirac_dec_binaural_internal_fx( assert( hDiracDecBin ); hSpatParamRendCom = st_ivas->hSpatParamRendCom; nBins = hSpatParamRendCom->num_freq_bands; - offsetSamples = hSpatParamRendCom->slots_rendered * nBins; + move16(); + offsetSamples = imult1616( hSpatParamRendCom->slots_rendered, nBins ); /* Setup internal config */ config_data.separateCenterChannelRendering = st_ivas->hOutSetup.separateChannelEnabled; move16(); config_data.ivas_format = st_ivas->ivas_format; + move32(); config_data.mc_mode = st_ivas->mc_mode; + move32(); config_data.ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; move32(); config_data.nchan_transport = st_ivas->nchan_transport; move16(); - config_data.qualityBasedSmFactor_fx = st_ivas->hMasa != NULL ? L_deposit_h( st_ivas->hMasa->data.dir_decode_quality_fx ) : ONE_IN_Q31; + IF( st_ivas->hMasa != NULL ) + { + config_data.qualityBasedSmFactor_fx = L_deposit_h( st_ivas->hMasa->data.dir_decode_quality_fx ); + } + ELSE + { + config_data.qualityBasedSmFactor_fx = ONE_IN_Q31; + } move32(); - config_data.processReverb = st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ? 1 : 0; + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + config_data.processReverb = 1; + } + ELSE + { + config_data.processReverb = 0; + } move16(); - IF( st_ivas->ivas_format == MASA_ISM_FORMAT ) + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { config_data.ism_mode = st_ivas->ism_mode; } @@ -1293,14 +1352,22 @@ static void ivas_dirac_dec_binaural_internal_fx( { config_data.ism_mode = ISM_MODE_NONE; } + move32(); /* The input channel number at this processing function (not nchan_transport) */ numInChannels = BINAURAL_CHANNELS; - IF( config_data.separateCenterChannelRendering || ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) ) ) + move16(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( config_data.separateCenterChannelRendering || ( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && ( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) ) ) { numInChannels = add( numInChannels, 1 ); } - ELSE IF( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC && ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) { numInChannels = add( numInChannels, st_ivas->nchan_ism ); } @@ -1339,17 +1406,18 @@ static void ivas_dirac_dec_binaural_internal_fx( { FOR( ch = 0; ch < numInChannels; ch++ ) { - IF( ch == 0 || nchan_transport == 2 ) + test(); + IF( ch == 0 || EQ_16( nchan_transport, 2 ) ) { q_cldfb[ch][slot] = q_input; move16(); cldfbAnalysis_ts_fx_fixed_q( - &( st_ivas->hTcBuffer->tc_fx[ch][nBins * slot + offsetSamples] ), + &( st_ivas->hTcBuffer->tc_fx[ch][add(imult1616(nBins , slot) , offsetSamples)] ), Cldfb_RealBuffer_in_fx[ch][slot], Cldfb_ImagBuffer_in_fx[ch][slot], nBins, st_ivas->cldfbAnaDec[ch], &q_cldfb[ch][slot] ); } - ELSE IF( config_data.nchan_transport == 2 ) /* Stereo signal transmitted as mono with DFT stereo */ + ELSE IF( EQ_16( config_data.nchan_transport, 2 ) ) /* Stereo signal transmitted as mono with DFT stereo */ { /* At mono input duplicate the channel to dual-mono */ mvl2l( Cldfb_RealBuffer_in_fx[0][slot], Cldfb_RealBuffer_in_fx[1][slot], nBins ); @@ -1360,6 +1428,7 @@ static void ivas_dirac_dec_binaural_internal_fx( ELSE /* when nchan_transport == 1 and ch == 1 */ { /* CNA and HB FD-CNG*/ + test(); IF( st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) { Word16 numCoreBands, b; @@ -1390,15 +1459,19 @@ static void ivas_dirac_dec_binaural_internal_fx( /* LB: Copy first channel + LB-CNG to first and second channels with same scaling (dual-mono)*/ FOR( b = 0; b < numCoreBands; b++ ) { - Cldfb_RealBuffer_in_fx[0][slot][b] = Mpy_32_16_1( L_add( L_shr( Cldfb_RealBuffer_in_fx[0][slot][b], q_cldfb[0][slot] - q_input + 5 ), L_shr( Cldfb_RealBuffer_in_fx[2][slot][b], q_cldfb[2][slot] - q_input + 5 ) ), 23170 /* INV_SQRT2 in Q15*/ ); + Cldfb_RealBuffer_in_fx[0][slot][b] = Mpy_32_16_1( L_add( L_shr( Cldfb_RealBuffer_in_fx[0][slot][b], add( sub( q_cldfb[0][slot], q_input ), 5 ) ), L_shr( Cldfb_RealBuffer_in_fx[2][slot][b], add( sub( q_cldfb[2][slot], q_input ), 5 ) ) ), 23170 /* INV_SQRT2 in Q15*/ ); Cldfb_RealBuffer_in_fx[1][slot][b] = Cldfb_RealBuffer_in_fx[0][slot][b]; move32(); - Cldfb_ImagBuffer_in_fx[0][slot][b] = Mpy_32_16_1( L_add( L_shr( Cldfb_ImagBuffer_in_fx[0][slot][b], q_cldfb[0][slot] - q_input + 5 ), L_shr( Cldfb_ImagBuffer_in_fx[2][slot][b], q_cldfb[2][slot] - q_input + 5 ) ), 23170 ); + move32(); + Cldfb_ImagBuffer_in_fx[0][slot][b] = Mpy_32_16_1( L_add( L_shr( Cldfb_ImagBuffer_in_fx[0][slot][b], add( sub( q_cldfb[0][slot], q_input ), 5 ) ), L_shr( Cldfb_ImagBuffer_in_fx[2][slot][b], add( sub( q_cldfb[2][slot], q_input ), 5 ) ) ), 23170 ); Cldfb_ImagBuffer_in_fx[1][slot][b] = Cldfb_ImagBuffer_in_fx[0][slot][b]; move32(); + move32(); } - q_cldfb[1][slot] = q_input - 5; - q_cldfb[0][slot] = q_input - 5; + q_cldfb[1][slot] = sub( q_input, 5 ); + q_cldfb[0][slot] = sub( q_input, 5 ); + move16(); + move16(); /* HB: Copy first channel to second channel and add HB-CNGs with different scalings*/ FOR( ; b < nBins; b++ ) { @@ -1409,6 +1482,12 @@ static void ivas_dirac_dec_binaural_internal_fx( Cldfb_ImagBuffer_in_fx[0][slot][b] = Mpy_32_16_1( Cldfb_ImagBuffer_in_fx[0][slot][b], 23170 ); Cldfb_ImagBuffer_in_fx[1][slot][b] = L_add( Cldfb_ImagBuffer_in_fx[0][slot][b], L_shr( Cldfb_ImagBuffer_in_fx[1][slot][b], 1 ) ); Cldfb_ImagBuffer_in_fx[0][slot][b] = L_add( Cldfb_ImagBuffer_in_fx[0][slot][b], L_shr( Cldfb_ImagBuffer_in_fx[2][slot][b], 1 ) ); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); } } ELSE @@ -1431,13 +1510,16 @@ static void ivas_dirac_dec_binaural_internal_fx( FOR( ch = BINAURAL_CHANNELS; ch < ( 2 * BINAURAL_CHANNELS ); ch++ ) { q_cldfb[ch][slot] = q_input; + move16(); cldfbAnalysis_ts_fx_fixed_q( &( st_ivas->hTcBuffer->tc_fx[ch][nBins * slot + offsetSamples] ), Cldfb_RealBuffer_in_fx[ch][slot], Cldfb_ImagBuffer_in_fx[ch][slot], nBins, st_ivas->cldfbAnaDec[ch], &q_cldfb[ch][slot] ); - IF( config_data.nchan_transport == 1 && - ( config_data.ivas_format == SBA_FORMAT || config_data.ivas_format == SBA_ISM_FORMAT ) ) + test(); + test(); + IF( EQ_16( config_data.nchan_transport, 1 ) && + ( EQ_32( config_data.ivas_format, SBA_FORMAT ) || EQ_32( config_data.ivas_format, SBA_ISM_FORMAT ) ) ) { v_multc_fixed_16( Cldfb_RealBuffer_in_fx[ch][slot], 23170, Cldfb_RealBuffer_in_fx[ch][slot], nBins ); v_multc_fixed_16( Cldfb_ImagBuffer_in_fx[ch][slot], 23170, Cldfb_ImagBuffer_in_fx[ch][slot], nBins ); @@ -1446,7 +1528,8 @@ static void ivas_dirac_dec_binaural_internal_fx( } } - IF( config_data.ivas_format == SBA_FORMAT || config_data.ivas_format == SBA_ISM_FORMAT ) + test(); + IF( EQ_32( config_data.ivas_format, SBA_FORMAT ) || EQ_32( config_data.ivas_format, SBA_ISM_FORMAT ) ) { hDiracDecBin->hDiffuseDist = &diffuseDistData; ivas_spar_param_to_masa_param_mapping_fx( st_ivas, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_cldfb, subframe ); @@ -1455,17 +1538,18 @@ static void ivas_dirac_dec_binaural_internal_fx( FOR( int idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { - Scale_sig32( st_ivas->hSpar->hFbMixer->pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band_fx[idx], IVAS_MAX_NUM_FB_BANDS, sub( Q31, Q22 ) ); + Scale_sig32( st_ivas->hSpar->hFbMixer->pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band_fx[idx], IVAS_MAX_NUM_FB_BANDS, Q31 - Q22 ); } #endif ivas_sba_prototype_renderer_fx( st_ivas, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_cldfb, subframe ); FOR( int idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { - Scale_sig32( st_ivas->hSpar->hFbMixer->pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band_fx[idx], IVAS_MAX_NUM_FB_BANDS, sub( Q22, Q31 ) ); + Scale_sig32( st_ivas->hSpar->hFbMixer->pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band_fx[idx], IVAS_MAX_NUM_FB_BANDS, Q22 - Q31 ); } } Word16 q_inp = Q6; + move16(); FOR( Word16 cha = 0; cha < 6; cha++ ) { FOR( slot = 0; slot < 4; slot++ ) @@ -1475,7 +1559,10 @@ static void ivas_dirac_dec_binaural_internal_fx( } } - IF( st_ivas->ivas_format == MASA_ISM_FORMAT && nchan_transport == 2 && st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ ) + test(); + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_16( nchan_transport, 2 ) && NE_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && NE_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) { /* Un-tested function. No test-case is hitting.*/ ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( st_ivas, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, &q_inp, nBins, subframe ); @@ -1488,6 +1575,7 @@ static void ivas_dirac_dec_binaural_internal_fx( FOR( j = 0; j < 3; j++ ) { Rmat_fx[i][j] = hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx][i][j]; // Q30// + move32(); } } @@ -1499,6 +1587,7 @@ static void ivas_dirac_dec_binaural_internal_fx( } Word16 shift = 31; + move16(); Word32 Cldfb_RealBuffer_inTmp_fx[2][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Cldfb_ImagBuffer_inTmp_fx[2][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; FOR( i = 0; i < 2; i++ ) { @@ -1509,7 +1598,7 @@ static void ivas_dirac_dec_binaural_internal_fx( } } - Word16 q = q_inp + shift; + Word16 q = add( q_inp, shift ); FOR( i = 0; i < 2; i++ ) { @@ -1519,6 +1608,8 @@ static void ivas_dirac_dec_binaural_internal_fx( { Cldfb_RealBuffer_inTmp_fx[i][j][k] = L_shl( Cldfb_RealBuffer_in_fx[i][j][k], shift ); Cldfb_ImagBuffer_inTmp_fx[i][j][k] = L_shl( Cldfb_ImagBuffer_in_fx[i][j][k], shift ); + move32(); + move32(); } } } @@ -1526,7 +1617,7 @@ static void ivas_dirac_dec_binaural_internal_fx( ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, Cldfb_RealBuffer_inTmp_fx, Cldfb_ImagBuffer_inTmp_fx, Rmat_fx, subframe, hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, st_ivas->hMasaIsmData, q ); - IF( config_data.ivas_format == ISM_FORMAT ) + IF( EQ_32( config_data.ivas_format, ISM_FORMAT ) ) { max_band_decorr = 0; move16(); @@ -1545,12 +1636,18 @@ static void ivas_dirac_dec_binaural_internal_fx( nchanSeparateChannels = 0; move16(); - IF( config_data.separateCenterChannelRendering || ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) ) ) + test(); + test(); + test(); + test(); + test(); + test(); + IF( config_data.separateCenterChannelRendering || ( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && ( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) ) ) { nchanSeparateChannels = 1; move16(); } - ELSE IF( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC && ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) { nchanSeparateChannels = (UWord8) st_ivas->nchan_ism; move16(); @@ -1561,9 +1658,11 @@ static void ivas_dirac_dec_binaural_internal_fx( #if 1 q_inp = Q6; + move16(); FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q11; + move16(); } #endif @@ -1610,9 +1709,11 @@ static void ivas_dirac_dec_binaural_internal_fx( hSpatParamRendCom->slots_rendered = add( hSpatParamRendCom->slots_rendered, hSpatParamRendCom->subframe_nbslots[subframe] ); hSpatParamRendCom->subframes_rendered = add( hSpatParamRendCom->subframes_rendered, 1 ); + move16(); + move16(); FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - scale_sig32( output_fx[ch], imult1616( nBins, hSpatParamRendCom->subframe_nbslots[subframe] ), 11 - q_out ); // Scaling to Q11 + scale_sig32( output_fx[ch], imult1616( nBins, hSpatParamRendCom->subframe_nbslots[subframe] ), sub( 11, q_out ) ); // Scaling to Q11 scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_size, sub( Q11, st_ivas->cldfbSynDec[ch]->Q_cldfb_state ) ); st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q11; move16(); @@ -1696,15 +1797,19 @@ static void ivas_dirac_dec_decorrelate_slot_fx( Word32 protoFrame_fx[2 * BINAURAL_CHANNELS * CLDFB_NO_CHANNELS_MAX]; /* 2 ch, real + imag, 60 bins */ Word16 q_decorrelatedFrameInterleaved, q_protoFrame; const Word16 protoIndexDir[BINAURAL_CHANNELS] = { 0, 1 }; + move16(); q_protoFrame = q_inp; + move16(); /* Decorrelation needs interleaved data. Copy left and right signals to proto_frame_f */ FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { offset = imult1616( imult1616( num_freq_bands, BINAURAL_CHANNELS ), ch ); FOR( bin = 0; bin < num_freq_bands; bin++ ) { - protoFrame_fx[( bin * BINAURAL_CHANNELS ) + offset] = inRe[ch][slot][bin]; - protoFrame_fx[( bin * BINAURAL_CHANNELS ) + offset + 1] = inIm[ch][slot][bin]; + protoFrame_fx[add( imult1616( bin, BINAURAL_CHANNELS ), offset )] = inRe[ch][slot][bin]; + protoFrame_fx[add( imult1616( bin, BINAURAL_CHANNELS ), add( offset, 1 ) )] = inIm[ch][slot][bin]; + move32(); + move32(); } } @@ -1727,11 +1832,13 @@ static void ivas_dirac_dec_decorrelate_slot_fx( /* De-interleave decorrelated signals*/ FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - offset = num_freq_bands * BINAURAL_CHANNELS * ch; + offset = imult1616( imult1616( num_freq_bands, BINAURAL_CHANNELS ), ch ); FOR( bin = 0; bin < num_freq_bands; bin++ ) { - decRe[ch][bin] = decorrelatedFrameInterleaved_fx[( bin * BINAURAL_CHANNELS ) + offset]; - decIm[ch][bin] = decorrelatedFrameInterleaved_fx[( bin * BINAURAL_CHANNELS ) + offset + 1]; + decRe[ch][bin] = decorrelatedFrameInterleaved_fx[add( imult1616( bin, BINAURAL_CHANNELS ), offset )]; + decIm[ch][bin] = decorrelatedFrameInterleaved_fx[add( imult1616( bin, BINAURAL_CHANNELS ), add( offset, 1 ) )]; + move32(); + move32(); } } // q_decorrelatedFrameInterleaved will be same as q_inp/q_protoFrame // @@ -2242,12 +2349,15 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric separateCenterChannelRendering = hConfig->separateCenterChannelRendering; move16(); ivas_format = hConfig->ivas_format; + move32(); mc_mode = hConfig->mc_mode; + move32(); ivas_total_brate = hConfig->ivas_total_brate; move32(); nchan_transport = hConfig->nchan_transport; move16(); qualityBasedSmFactor_fx = hConfig->qualityBasedSmFactor_fx; + move32(); qualityBasedSmFactor_fx = Mpy_32_32( qualityBasedSmFactor_fx, qualityBasedSmFactor_fx ); nBins = hSpatParamRendCom->num_freq_bands; /* Actually bins */ @@ -2256,6 +2366,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric q_earlyPartEneCorrection = s_min( Q31, add( getScaleFactor32( hDiracDecBin->earlyPartEneCorrection_fx, nBins ), hDiracDecBin->q_earlyPartEneCorrection ) ); scale_sig32( hDiracDecBin->earlyPartEneCorrection_fx, nBins, sub( q_earlyPartEneCorrection, hDiracDecBin->q_earlyPartEneCorrection ) ); hDiracDecBin->q_earlyPartEneCorrection = q_earlyPartEneCorrection; + move16(); set32_fx( hDiracDecBin->ChCrossRe_fx, 0, nBins ); set32_fx( hDiracDecBin->ChCrossIm_fx, 0, nBins ); @@ -2286,14 +2397,19 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric /* Determine EQ for low bit rates (13.2 and 16.4 kbps) */ applyLowBitRateEQ = 0; - IF( ( ivas_format == MASA_FORMAT || ivas_format == MC_FORMAT ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) ) + move16(); + test(); + test(); + IF( ( EQ_32( ivas_format, MASA_FORMAT ) || EQ_32( ivas_format, MC_FORMAT ) ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) ) { applyLowBitRateEQ = 1; + move16(); IF( EQ_32( ivas_total_brate, IVAS_16k4 ) ) { FOR( bin = 0; bin < LOW_BIT_RATE_BINAURAL_EQ_BINS; bin++ ) { lowBitRateEQ_fx[bin + LOW_BIT_RATE_BINAURAL_EQ_OFFSET] = L_add( L_shr( lowBitRateBinauralEQ_fx[bin], 1 ), ONE_IN_Q30 ); // Q31 + move32(); } } ELSE @@ -2326,6 +2442,12 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric inIm_fx[0][slot][bin] = L_shr( inIm_fx[0][slot][bin], 2 ); inIm_fx[1][slot][bin] = L_shr( inIm_fx[1][slot][bin], 2 ); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { Word32 instEne_fx; @@ -2334,6 +2456,8 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric instEne_fx = L_add( instEne_fx, Mpy_32_32( inIm_fx[ch][slot][bin], inIm_fx[ch][slot][bin] ) ); // 2q - 31 hDiracDecBin->ChEne_fx[ch][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEne_fx[ch][bin], hDiracDecBin->ChEne_e[ch][bin], instEne_fx, sub( 66, shl( q, 1 ) ), &hDiracDecBin->ChEne_e[ch][bin] ); subFrameTotalEne_fx[bin] = L_add( subFrameTotalEne_fx[bin], instEne_fx ); // 2q - 31 + move32(); + move32(); } } } @@ -2342,21 +2466,25 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric q_subFrameTotalEne = sub( shl( q, 1 ), 31 ); /* Apply EQ at low bit rates */ - IF( NE_16( applyLowBitRateEQ, 0 ) ) + IF( applyLowBitRateEQ != 0 ) { Word16 lastEqBin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET + LOW_BIT_RATE_BINAURAL_EQ_BINS - 1; FOR( bin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET; bin < lastEqBin; bin++ ) { subFrameTotalEne_fx[bin] = Mpy_32_32( subFrameTotalEne_fx[bin], lowBitRateEQ_fx[bin] ); // 2q -31 + move32(); } FOR( ; bin < nBins; bin++ ) { subFrameTotalEne_fx[bin] = Mpy_32_32( subFrameTotalEne_fx[bin], lowBitRateEQ_fx[lastEqBin] ); // 2q -31 + move32(); } } - IF( ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) && nchan_transport == 2 ) + test(); + test(); + IF( ( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) && EQ_16( nchan_transport, 2 ) ) { Word32 tempRe, tempIm; Word32 subFrameSumEne_fx[CLDFB_NO_CHANNELS_MAX]; @@ -2372,11 +2500,13 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric tempRe = L_add( inRe_fx[0][slot][bin], inRe_fx[1][slot][bin] ); // q tempIm = L_add( inIm_fx[0][slot][bin], inIm_fx[1][slot][bin] ); // q subFrameSumEne_fx[bin] = L_add( subFrameSumEne_fx[bin], L_add( L_shr( Mpy_32_32( tempRe, tempRe ), 1 ), L_shr( Mpy_32_32( tempIm, tempIm ), 1 ) ) ); // 2q -31 + move32(); } } FOR( bin = 0; bin < nBins; bin++ ) { subFrameTotalEne_fx[bin] = L_max( subFrameTotalEne_fx[bin], subFrameSumEne_fx[bin] ); // 2q -31 + move32(); } } @@ -2392,6 +2522,10 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric Word16 q_meanEnePerCh; Word16 q_diffEne, q_dirEne; Word16 dirIndex; + move16(); + move16(); + move32(); + move32(); /* When BINAURAL_ROOM is not indicated, hBinaural->earlyPartEneCorrection[bin] values are all 1.0f. * When BINAURAL_ROOM is indicated, the binaural audio output is based on combined use of the @@ -2408,8 +2542,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric Word32 lRealpTmp_fx, lImagpTmp_fx, rRealpTmp_fx, rImagpTmp_fx; Word32 hrtfEne_fx[BINAURAL_CHANNELS], hrtfCrossRe_fx, hrtfCrossIm_fx, ratio_fx; UWord8 isIsmDirection = 0; + move16(); - IF( EQ_16( dirIndex, 0 ) ) /* For first of the two simultaneous directions */ + test(); + test(); + IF( dirIndex == 0 ) /* For first of the two simultaneous directions */ { aziDeg = hSpatParamRendCom->azimuth[dirac_read_idx][bin]; move16(); @@ -2422,7 +2559,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric gainCacheBaseIndex = 0; move16(); } - ELSE IF( ivas_format != MASA_ISM_FORMAT || ( ivas_format == MASA_ISM_FORMAT && LT_16( dirIndex, hSpatParamRendCom->numParametricDirections ) ) ) /* For second of the two simultaneous directions */ + ELSE IF( NE_32( ivas_format, MASA_ISM_FORMAT ) || ( EQ_32( ivas_format, MASA_ISM_FORMAT ) && LT_16( dirIndex, hSpatParamRendCom->numParametricDirections ) ) ) /* For second of the two simultaneous directions */ { IF( LT_32( ( ratio_fx = hSpatParamRendCom->energy_ratio2_fx[dirac_read_idx][bin] ), 10737418 /* 0.01 in Q30 */ ) ) { @@ -2471,7 +2608,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric diffuseness_fx = L_sub( diffuseness_fx, ratio_fx ); /* diffuseness = 1 - ratio1 - ratio2 */ - IF( LT_32( diffuseness_fx, 0 ) ) + if ( diffuseness_fx < 0 ) { diffuseness_fx = 0; move32(); @@ -2493,15 +2630,18 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric Word16 azi_scaled, ele_scaled; Word32 doaVectorX_fx, num, den; Word16 e = 0, spatialAngleDeg_fx, altSpreadCoh_fx; + move16(); azi_scaled = i_mult( aziDeg, 91 ); ele_scaled = i_mult( eleDeg, 91 ); doaVectorX_fx = L_mult( getCosWord16R2( azi_scaled ), getCosWord16R2( ele_scaled ) ); num = Sqrt32( L_sub( ONE_IN_Q31, Mpy_32_32( doaVectorX_fx, doaVectorX_fx ) ), &e ); den = doaVectorX_fx; + move32(); spatialAngleDeg_fx = BASOP_util_atan2( num, den, e ); // Q13 Word16 numr, num_e = 0, denr, den_e; - num_e = norm_s( spatialAngleDeg_fx ) - 1; + move16(); + num_e = sub( norm_s( spatialAngleDeg_fx ), 1 ); numr = shl( spatialAngleDeg_fx, num_e ); denr = 17157; move16(); @@ -2515,7 +2655,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric Word16 q_lr = Q28; move16(); - IF( hDiracDecBin->renderStereoOutputInsteadOfBinaural ) + if ( hDiracDecBin->renderStereoOutputInsteadOfBinaural ) { /* Synthesizing spread coherence is not needed for stereo loudspeaker output, * as directional sound is reproduced with two loudspeakers in any case */ @@ -2562,7 +2702,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric rImagp_fx = Mpy_32_32( rImagp_fx, centerMul_fx ); // Q25 /* Apply the gain for the left source of the three coherent sources */ - getDirectPartGains_fx( bin, aziDeg + 30, eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 1], isHeadtracked ); + getDirectPartGains_fx( bin, add( aziDeg, 30 ), eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 1], isHeadtracked ); hrtfEneSides_fx = L_add( Mpy_32_32( lRealpTmp_fx, lRealpTmp_fx ), // Q25 L_add( Mpy_32_32( lImagpTmp_fx, lImagpTmp_fx ), // Q25 @@ -2614,7 +2754,8 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric w3_fx = shl( sub( spreadCoh_fx, 16384 ), 1 ); } - IF( ( ivas_format == MC_FORMAT && mc_mode == MC_MODE_MCMASA ) ) + test(); + IF( ( EQ_32( ivas_format, MC_FORMAT ) && EQ_32( mc_mode, MC_MODE_MCMASA ) ) ) { idx = s_min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); @@ -2634,8 +2775,9 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric /* Equalize the spread coherent combined HRTFs */ Word16 tmp, tmp_e; tmp_e = eneCorrectionFactor_e; + move16(); tmp = Sqrt16( eneCorrectionFactor_fx, &tmp_e ); - IF( shr( tmp, sub( 15, tmp_e ) ) >= 4 ) + IF( GE_16( shr( tmp, sub( 15, tmp_e ) ), 4 ) ) { eq_fx = 32767; // Q13 move16(); @@ -2653,8 +2795,10 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric move16(); } - hrtfEne_fx[0] = L_add( Mpy_32_32( lRealp_fx, lRealp_fx ), Mpy_32_32( lImagp_fx, lImagp_fx ) ); // Q( 2*q_lr - 31 ) - hrtfEne_fx[1] = L_add( Mpy_32_32( rRealp_fx, rRealp_fx ), Mpy_32_32( rImagp_fx, rImagp_fx ) ); // Q( 2*q_lr - 31 ) + hrtfEne_fx[0] = L_add( Mpy_32_32( lRealp_fx, lRealp_fx ), Mpy_32_32( lImagp_fx, lImagp_fx ) ); // Q( 2*q_lr - 31 ) + hrtfEne_fx[1] = L_add( Mpy_32_32( rRealp_fx, rRealp_fx ), Mpy_32_32( rImagp_fx, rImagp_fx ) ); // Q( 2*q_lr - 31 ) + move32(); + move32(); hrtfCrossRe_fx = L_add( Mpy_32_32( lRealp_fx, rRealp_fx ), Mpy_32_32( lImagp_fx, rImagp_fx ) ); // Q( 2*q_lr - 31 ) hrtfCrossIm_fx = L_add( Mpy_32_32( -lImagp_fx, rRealp_fx ), Mpy_32_32( lRealp_fx, rImagp_fx ) ); // Q( 2*q_lr - 31 ) @@ -2664,10 +2808,14 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric dirEne_fx = L_shl( dirEne_fx, shift ); q_dirEne = add( sub( q_meanEnePerCh, 1 ), shift ); - hDiracDecBin->ChEneOut_fx[0][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEneOut_fx[0][bin], hDiracDecBin->ChEneOut_e[0][bin], Mpy_32_32( dirEne_fx, hrtfEne_fx[0] ), sub( 31, q_dirEne + shl( q_lr, 1 ) - 62 ), &hDiracDecBin->ChEneOut_e[0][bin] ); /* Dir ene part*/ - hDiracDecBin->ChEneOut_fx[1][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEneOut_fx[1][bin], hDiracDecBin->ChEneOut_e[1][bin], Mpy_32_32( dirEne_fx, hrtfEne_fx[1] ), sub( 31, q_dirEne + shl( q_lr, 1 ) - 62 ), &hDiracDecBin->ChEneOut_e[1][bin] ); - hDiracDecBin->ChCrossReOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossReOut_fx[bin], hDiracDecBin->ChCrossReOut_e[bin], Mpy_32_32( dirEne_fx, hrtfCrossRe_fx ), sub( 31, q_dirEne + shl( q_lr, 1 ) - 62 ), &hDiracDecBin->ChCrossReOut_e[bin] ); /* Dir cross re */ - hDiracDecBin->ChCrossImOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossImOut_fx[bin], hDiracDecBin->ChCrossImOut_e[bin], Mpy_32_32( dirEne_fx, hrtfCrossIm_fx ), sub( 31, q_dirEne + shl( q_lr, 1 ) - 62 ), &hDiracDecBin->ChCrossImOut_e[bin] ); /* Dir cross im */ + hDiracDecBin->ChEneOut_fx[0][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEneOut_fx[0][bin], hDiracDecBin->ChEneOut_e[0][bin], Mpy_32_32( dirEne_fx, hrtfEne_fx[0] ), sub( 31, sub( add( q_dirEne, shl( q_lr, 1 ) ), 62 ) ), &hDiracDecBin->ChEneOut_e[0][bin] ); /* Dir ene part*/ + hDiracDecBin->ChEneOut_fx[1][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEneOut_fx[1][bin], hDiracDecBin->ChEneOut_e[1][bin], Mpy_32_32( dirEne_fx, hrtfEne_fx[1] ), sub( 31, sub( add( q_dirEne, shl( q_lr, 1 ) ), 62 ) ), &hDiracDecBin->ChEneOut_e[1][bin] ); + hDiracDecBin->ChCrossReOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossReOut_fx[bin], hDiracDecBin->ChCrossReOut_e[bin], Mpy_32_32( dirEne_fx, hrtfCrossRe_fx ), sub( 31, sub( add( q_dirEne, shl( q_lr, 1 ) ), 62 ) ), &hDiracDecBin->ChCrossReOut_e[bin] ); /* Dir cross re */ + hDiracDecBin->ChCrossImOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossImOut_fx[bin], hDiracDecBin->ChCrossImOut_e[bin], Mpy_32_32( dirEne_fx, hrtfCrossIm_fx ), sub( 31, sub( add( q_dirEne, shl( q_lr, 1 ) ), 62 ) ), &hDiracDecBin->ChCrossImOut_e[bin] ); /* Dir cross im */ + move32(); + move32(); + move32(); + move32(); } /* Add diffuse / ambient part covariance matrix */ @@ -2684,7 +2832,8 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric diffEneValForDecorrelationReduction_fx = Mpy_32_32( diffusenessValForDecorrelationReduction_fx, meanEnePerCh_fx ); // Q(2q - 32) q_diffEneValForDecorrelationReduction = sub( shl( q, 1 ), 32 ); - IF( ( ivas_format == MC_FORMAT && mc_mode == MC_MODE_MCMASA ) ) + test(); + IF( ( EQ_32( ivas_format, MC_FORMAT ) && EQ_32( mc_mode, MC_MODE_MCMASA ) ) ) { IF( !hDiracDecBin->renderStereoOutputInsteadOfBinaural ) { @@ -2703,14 +2852,19 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric hDiracDecBin->ChEneOut_fx[0][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEneOut_fx[0][bin], hDiracDecBin->ChEneOut_e[0][bin], diffEne_fx, sub( 31, q_diffEne ), &hDiracDecBin->ChEneOut_e[0][bin] ); /* Diff ene part*/ hDiracDecBin->ChEneOut_fx[1][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEneOut_fx[1][bin], hDiracDecBin->ChEneOut_e[1][bin], diffEne_fx, sub( 31, q_diffEne ), &hDiracDecBin->ChEneOut_e[1][bin] ); + move32(); + move32(); IF( hDiracDecBin->renderStereoOutputInsteadOfBinaural ) { /* When rendering stereo, ambience (except for surround coherent sound) has zero ICC. */ hDiracDecBin->ChCrossReOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossReOut_fx[bin], hDiracDecBin->ChCrossReOut_e[bin], Mpy_32_16_1( diffEne_fx, surCoh_fx ), sub( 31, q_diffEne ), &hDiracDecBin->ChCrossReOut_e[bin] ); + move32(); } ELSE /* When rendering binaural, ambience has frequency dependent ICC. */ { - IF( ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) && LT_16( bin, BINAURAL_COHERENCE_DIFFERENCE_BINS ) ) + test(); + test(); + IF( ( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) && LT_16( bin, BINAURAL_COHERENCE_DIFFERENCE_BINS ) ) { Word32 diffuseFieldCoherence_fx; diffuseFieldCoherence_fx = L_add( L_add( Mpy_32_32( hDiracDecBin->hDiffuseDist->diffuseRatioX_fx[bin], hDiracDecBin->diffuseFieldCoherenceX_fx[bin] ), Mpy_32_32( hDiracDecBin->hDiffuseDist->diffuseRatioY_fx[bin], hDiracDecBin->diffuseFieldCoherenceY_fx[bin] ) ), Mpy_32_32( hDiracDecBin->hDiffuseDist->diffuseRatioZ_fx[bin], hDiracDecBin->diffuseFieldCoherenceZ_fx[bin] ) ); @@ -2720,11 +2874,14 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric { hDiracDecBin->ChCrossReOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossReOut_fx[bin], hDiracDecBin->ChCrossReOut_e[bin], Mpy_32_32( L_add( Mpy_32_16_1( hDiracDecBin->diffuseFieldCoherence_fx[bin], sub( 32767, surCoh_fx ) ), L_shl( surCoh_fx, 16 ) ), diffEne_fx ), sub( 31, q_diffEne ), &hDiracDecBin->ChCrossReOut_e[bin] ); } + move32(); } /* Store parameters for formulating average diffuseness over frame */ hDiracDecBin->frameMeanDiffuseness_fx[bin] = L_add( hDiracDecBin->frameMeanDiffuseness_fx[bin], L_shl( diffEneValForDecorrelationReduction_fx, sub( q_meanEnePerCh, q_diffEneValForDecorrelationReduction ) ) ); // Q(q_meanEnePerCh) frameMeanDiffusenessEneWeight_fx[bin] = L_add( frameMeanDiffusenessEneWeight_fx[bin], meanEnePerCh_fx ); + move32(); + move32(); } /* Formulate average diffuseness over frame */ @@ -2734,11 +2891,14 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric e = 0; move16(); hDiracDecBin->frameMeanDiffuseness_fx[bin] = BASOP_Util_Divide3232_Scale( hDiracDecBin->frameMeanDiffuseness_fx[bin], L_max( EPSILLON_FX, frameMeanDiffusenessEneWeight_fx[bin] ), &e ); - hDiracDecBin->frameMeanDiffuseness_fx[bin] = L_shl( hDiracDecBin->frameMeanDiffuseness_fx[bin], 14 + e ); // Q29 + hDiracDecBin->frameMeanDiffuseness_fx[bin] = L_shl( hDiracDecBin->frameMeanDiffuseness_fx[bin], add(14 , e) ); // Q29 + move32(); + move32(); } + test(); /* Temporal IIR-type smoothing of covariance matrices. Also apply encoding quality based smoothing factor. */ - IF( ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE ) + IF( EQ_32( ivas_format, MASA_FORMAT ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) ) { IIReneLimiterFactor_fx = L_add( L_shl( 16, Q26 ), L_sub( L_shl( 1, Q26 ), L_shr( qualityBasedSmFactor_fx, 5 ) ) ); // Q26 } @@ -2764,9 +2924,10 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric den = L_max( 1, den ); IIReneLimiter_fx = BASOP_Util_Divide3232_Scale_cadence( num, den, &e ); e = add( sub( num_e, den_e ), add( 5, e ) ); - IF( L_shr_sat( IIReneLimiter_fx, 31 - e ) > 0 ) + if ( L_shr_sat( IIReneLimiter_fx, sub( 31, e ) ) > 0 ) { IIReneLimiter_fx = ONE_IN_Q31; + move32(); } ELSE { @@ -2777,22 +2938,34 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric hDiracDecBin->ChCrossIm_fx[bin] = Mpy_32_32( hDiracDecBin->ChCrossIm_fx[bin], qualityBasedSmFactor_fx ); hDiracDecBin->ChCrossReOut_fx[bin] = Mpy_32_32( hDiracDecBin->ChCrossReOut_fx[bin], qualityBasedSmFactor_fx ); hDiracDecBin->ChCrossImOut_fx[bin] = Mpy_32_32( hDiracDecBin->ChCrossImOut_fx[bin], qualityBasedSmFactor_fx ); + move32(); + move32(); + move32(); + move32(); FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { hDiracDecBin->ChEne_fx[ch][bin] = Mpy_32_32( hDiracDecBin->ChEne_fx[ch][bin], qualityBasedSmFactor_fx ); hDiracDecBin->ChEneOut_fx[ch][bin] = Mpy_32_32( hDiracDecBin->ChEneOut_fx[ch][bin], qualityBasedSmFactor_fx ); + move32(); + move32(); } hDiracDecBin->ChCrossRe_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossRe_fx[bin], hDiracDecBin->ChCrossRe_e[bin], Mpy_32_32( hDiracDecBin->ChCrossRePrev_fx[bin], IIReneLimiter_fx ), hDiracDecBin->ChCrossRePrev_e[bin], &hDiracDecBin->ChCrossRe_e[bin] ); hDiracDecBin->ChCrossIm_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossIm_fx[bin], hDiracDecBin->ChCrossIm_e[bin], Mpy_32_32( hDiracDecBin->ChCrossImPrev_fx[bin], IIReneLimiter_fx ), hDiracDecBin->ChCrossImPrev_e[bin], &hDiracDecBin->ChCrossIm_e[bin] ); hDiracDecBin->ChCrossReOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossReOut_fx[bin], hDiracDecBin->ChCrossReOut_e[bin], Mpy_32_32( hDiracDecBin->ChCrossReOutPrev_fx[bin], IIReneLimiter_fx ), hDiracDecBin->ChCrossReOutPrev_e[bin], &hDiracDecBin->ChCrossReOut_e[bin] ); hDiracDecBin->ChCrossImOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossImOut_fx[bin], hDiracDecBin->ChCrossImOut_e[bin], Mpy_32_32( hDiracDecBin->ChCrossImOutPrev_fx[bin], IIReneLimiter_fx ), hDiracDecBin->ChCrossImOutPrev_e[bin], &hDiracDecBin->ChCrossImOut_e[bin] ); + move32(); + move32(); + move32(); + move32(); FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { hDiracDecBin->ChEne_fx[ch][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEne_fx[ch][bin], hDiracDecBin->ChEne_e[ch][bin], Mpy_32_32( hDiracDecBin->ChEnePrev_fx[ch][bin], IIReneLimiter_fx ), hDiracDecBin->ChEnePrev_e[ch][bin], &hDiracDecBin->ChEne_e[ch][bin] ); hDiracDecBin->ChEneOut_fx[ch][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEneOut_fx[ch][bin], hDiracDecBin->ChEneOut_e[ch][bin], Mpy_32_32( hDiracDecBin->ChEneOutPrev_fx[ch][bin], IIReneLimiter_fx ), hDiracDecBin->ChEneOutPrev_e[ch][bin], &hDiracDecBin->ChEneOut_e[ch][bin] ); + move32(); + move32(); } /* Store energy values and coefficients for next round */ @@ -3087,17 +3260,19 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( Word16 q_processMtx[CLDFB_NO_CHANNELS_MAX], q_processMtxPrev[CLDFB_NO_CHANNELS_MAX]; Word16 q_processMtx_SCCR[CLDFB_NO_CHANNELS_MAX], q_processMtxPrev_SCCR[CLDFB_NO_CHANNELS_MAX]; Word16 q_processMtxDec[CLDFB_NO_CHANNELS_MAX], q_processMtxDecPrev[CLDFB_NO_CHANNELS_MAX]; - set_s( q_processMtx, hDiracDecBin->q_processMtx, CLDFB_NO_CHANNELS_MAX ); - set_s( q_processMtxPrev, hDiracDecBin->q_processMtxPrev, CLDFB_NO_CHANNELS_MAX ); - set_s( q_processMtx_SCCR, hDiracDecBin->q_processMtx, CLDFB_NO_CHANNELS_MAX ); - set_s( q_processMtxPrev_SCCR, hDiracDecBin->q_processMtxPrev, CLDFB_NO_CHANNELS_MAX ); - set_s( q_processMtxDec, hDiracDecBin->q_processMtxDec, CLDFB_NO_CHANNELS_MAX ); - set_s( q_processMtxDecPrev, hDiracDecBin->q_processMtxDecPrev, CLDFB_NO_CHANNELS_MAX ); + set16_fx( q_processMtx, hDiracDecBin->q_processMtx, CLDFB_NO_CHANNELS_MAX ); + set16_fx( q_processMtxPrev, hDiracDecBin->q_processMtxPrev, CLDFB_NO_CHANNELS_MAX ); + set16_fx( q_processMtx_SCCR, hDiracDecBin->q_processMtx, CLDFB_NO_CHANNELS_MAX ); + set16_fx( q_processMtxPrev_SCCR, hDiracDecBin->q_processMtxPrev, CLDFB_NO_CHANNELS_MAX ); + set16_fx( q_processMtxDec, hDiracDecBin->q_processMtxDec, CLDFB_NO_CHANNELS_MAX ); + set16_fx( q_processMtxDecPrev, hDiracDecBin->q_processMtxDecPrev, CLDFB_NO_CHANNELS_MAX ); ivas_format = hConfig->ivas_format; + move32(); separateCenterChannelRendering = extract_l( GT_16( nchanSeparateChannels, 0 ) ); move16(); mc_mode = hConfig->mc_mode; + move32(); ivas_total_brate = hConfig->ivas_total_brate; move32(); nchan_transport = hConfig->nchan_transport; @@ -3106,6 +3281,7 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( move16(); ism_mode = hConfig->ism_mode; + move32(); dirac_read_idx = hSpatParamRendCom->render_to_md_map[subframe]; move16(); @@ -3125,7 +3301,9 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( Word32 CrCrossRe_fx, CrCrossIm_fx; Word32 Mre_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], Mim_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], MdecRe_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS], MdecIm_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; /* M = mixing matrix; Mdec = residual decorrelated signal mixing matrix */ Word32 prototypeMtx_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] = { { ONE_IN_Q31, 107374182 }, { 107374182, ONE_IN_Q31 } }; + move32(); Word16 q_M, q_Cx, q_tmp, q_res, q_CrEne, q_CrCross, q_Mdec = 0; + move16(); Word32 tmp1, tmp2, res1, res2; Word16 q_tmp1, q_tmp2, q_realizedOutputEne, q_targetOutputEne, q_missingOutputEne, q_gain; Word16 exp1, exp2, q_processMtx_bin, q_processMtxDec_bin; @@ -3140,52 +3318,62 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( IF( GT_16( hDiracDecBin->ChEne_e[0][bin], hDiracDecBin->ChEne_e[1][bin] ) ) { hDiracDecBin->ChEne_fx[1][bin] = L_shr( hDiracDecBin->ChEne_fx[1][bin], sub( hDiracDecBin->ChEne_e[0][bin], hDiracDecBin->ChEne_e[1][bin] ) ); - hDiracDecBin->q_ChEne = 31 - hDiracDecBin->ChEne_e[0][bin]; + hDiracDecBin->q_ChEne = sub( 31, hDiracDecBin->ChEne_e[0][bin] ); hDiracDecBin->ChEne_e[1][bin] = hDiracDecBin->ChEne_e[0][bin]; } ELSE { hDiracDecBin->ChEne_fx[0][bin] = L_shr( hDiracDecBin->ChEne_fx[0][bin], sub( hDiracDecBin->ChEne_e[1][bin], hDiracDecBin->ChEne_e[0][bin] ) ); - hDiracDecBin->q_ChEne = 31 - hDiracDecBin->ChEne_e[1][bin]; + hDiracDecBin->q_ChEne = sub( 31, hDiracDecBin->ChEne_e[1][bin] ); hDiracDecBin->ChEne_e[0][bin] = hDiracDecBin->ChEne_e[1][bin]; } + move32(); + move16(); + IF( GT_16( hDiracDecBin->ChEneOut_e[0][bin], hDiracDecBin->ChEneOut_e[1][bin] ) ) { hDiracDecBin->ChEneOut_fx[1][bin] = L_shr( hDiracDecBin->ChEneOut_fx[1][bin], sub( hDiracDecBin->ChEneOut_e[0][bin], hDiracDecBin->ChEneOut_e[1][bin] ) ); - hDiracDecBin->q_ChEneOut = 31 - hDiracDecBin->ChEneOut_e[0][bin]; + hDiracDecBin->q_ChEneOut = sub( 31, hDiracDecBin->ChEneOut_e[0][bin] ); hDiracDecBin->ChEneOut_e[1][bin] = hDiracDecBin->ChEneOut_e[0][bin]; } ELSE { hDiracDecBin->ChEneOut_fx[0][bin] = L_shr( hDiracDecBin->ChEneOut_fx[0][bin], sub( hDiracDecBin->ChEneOut_e[1][bin], hDiracDecBin->ChEneOut_e[0][bin] ) ); - hDiracDecBin->q_ChEneOut = 31 - hDiracDecBin->ChEneOut_e[1][bin]; + hDiracDecBin->q_ChEneOut = sub( 31, hDiracDecBin->ChEneOut_e[1][bin] ); hDiracDecBin->ChEneOut_e[0][bin] = hDiracDecBin->ChEneOut_e[1][bin]; } + move32(); + move16(); IF( GT_16( hDiracDecBin->ChCrossRe_e[bin], hDiracDecBin->ChCrossIm_e[bin] ) ) { hDiracDecBin->ChCrossIm_fx[bin] = L_shr( hDiracDecBin->ChCrossIm_fx[bin], sub( hDiracDecBin->ChCrossRe_e[bin], hDiracDecBin->ChCrossIm_e[bin] ) ); - hDiracDecBin->q_ChCross = 31 - hDiracDecBin->ChCrossRe_e[bin]; + hDiracDecBin->q_ChCross = sub( 31, hDiracDecBin->ChCrossRe_e[bin] ); hDiracDecBin->ChCrossIm_e[bin] = hDiracDecBin->ChCrossRe_e[bin]; } ELSE { hDiracDecBin->ChCrossRe_fx[bin] = L_shr( hDiracDecBin->ChCrossRe_fx[bin], sub( hDiracDecBin->ChCrossIm_e[bin], hDiracDecBin->ChCrossRe_e[bin] ) ); - hDiracDecBin->q_ChCross = 31 - hDiracDecBin->ChCrossIm_e[bin]; + hDiracDecBin->q_ChCross = sub( 31, hDiracDecBin->ChCrossIm_e[bin] ); hDiracDecBin->ChCrossRe_e[bin] = hDiracDecBin->ChCrossIm_e[bin]; } + move32(); + move16(); + IF( GT_16( hDiracDecBin->ChCrossReOut_e[bin], hDiracDecBin->ChCrossImOut_e[bin] ) ) { hDiracDecBin->ChCrossImOut_fx[bin] = L_shr( hDiracDecBin->ChCrossImOut_fx[bin], sub( hDiracDecBin->ChCrossReOut_e[bin], hDiracDecBin->ChCrossImOut_e[bin] ) ); - hDiracDecBin->q_ChCrossOut = 31 - hDiracDecBin->ChCrossReOut_e[bin]; + hDiracDecBin->q_ChCrossOut = sub( 31, hDiracDecBin->ChCrossReOut_e[bin] ); hDiracDecBin->ChCrossImOut_e[bin] = hDiracDecBin->ChCrossReOut_e[bin]; } ELSE { hDiracDecBin->ChCrossReOut_fx[bin] = L_shr( hDiracDecBin->ChCrossReOut_fx[bin], sub( hDiracDecBin->ChCrossImOut_e[bin], hDiracDecBin->ChCrossReOut_e[bin] ) ); - hDiracDecBin->q_ChCrossOut = 31 - hDiracDecBin->ChCrossImOut_e[bin]; + hDiracDecBin->q_ChCrossOut = sub( 31, hDiracDecBin->ChCrossImOut_e[bin] ); hDiracDecBin->ChCrossReOut_e[bin] = hDiracDecBin->ChCrossImOut_e[bin]; } + move32(); + move16(); formulate2x2MixingMatrix_fx( hDiracDecBin->ChEne_fx[0][bin], hDiracDecBin->ChEne_fx[1][bin], hDiracDecBin->q_ChEne, @@ -3309,6 +3497,7 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( * by determining an energy-suppressed residual covariance matrix that is a control parameter * that guides the processing of the decorrelated sound to a residual signal. * The procedure improves quality in e.g. double-talk 2-direction rendering situations.*/ + test(); IF( EQ_16( ivas_format, MASA_FORMAT ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) ) { decorrelationReductionFactor_fx = ONE_IN_Q30; @@ -3318,7 +3507,8 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( } ELSE IF( L_or( L_and( EQ_16( ivas_format, MC_FORMAT ), EQ_16( mc_mode, MC_MODE_MCMASA ) ), L_and( EQ_16( ivas_format, MASA_FORMAT ), EQ_16( nchan_transport, 1 ) ) ) ) { - exp = sub( 31, 29 ); + exp = 31 - 29; + move16(); decorrelationReductionFactor_fx = Sqrt32( L_max( 0, hDiracDecBin->frameMeanDiffuseness_fx[bin] ), &exp ); q_decorrelationReductionFactor = sub( 31, exp ); } @@ -3437,18 +3627,20 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( } q_M = sub( add( q_M, q_gain ), 31 ); - exp = s_min( L_norm_arr( Mre_fx[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ), L_norm_arr( Mim_fx[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ) ); - scale_sig32( Mre_fx[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), exp ); - scale_sig32( Mim_fx[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), exp ); + exp = s_min( L_norm_arr( Mre_fx[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS ), L_norm_arr( Mim_fx[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS ) ); + scale_sig32( Mre_fx[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS, exp ); + scale_sig32( Mim_fx[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS, exp ); q_M = add( q_M, exp ); - exp = s_min( L_norm_arr( MdecRe_fx[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ), L_norm_arr( MdecIm_fx[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ) ); - scale_sig32( MdecRe_fx[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), exp ); - scale_sig32( MdecIm_fx[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), exp ); + exp = s_min( L_norm_arr( MdecRe_fx[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS ), L_norm_arr( MdecIm_fx[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS ) ); + scale_sig32( MdecRe_fx[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS, exp ); + scale_sig32( MdecIm_fx[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS, exp ); q_Mdec = add( q_Mdec, exp ); q_processMtx_bin = q_processMtx[bin]; q_processMtxDec_bin = q_processMtxDec[bin]; + move16(); + move16(); /* Store processing matrices */ FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { @@ -3512,6 +3704,7 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( q_gain = sub( add( q_tmp_sq, 31 ), 31 ); q_processMtx_bin = q_processMtx_SCCR[bin]; + move16(); FOR( chB = 0; chB < nchanSeparateChannels; chB++ ) { @@ -3582,7 +3775,9 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( minimum_s( q_processMtxPrev_SCCR, nBins, &hDiracDecBin->q_processMtxPrevSCCR ); } hDiracDecBin->q_processMtx = s_min( hDiracDecBin->q_processMtx, hDiracDecBin->q_processMtxSCCR ); + move16(); hDiracDecBin->q_processMtxPrev = s_min( hDiracDecBin->q_processMtxPrev, hDiracDecBin->q_processMtxPrevSCCR ); + move16(); hDiracDecBin->q_processMtxSCCR = hDiracDecBin->q_processMtx; move16(); hDiracDecBin->q_processMtxPrevSCCR = hDiracDecBin->q_processMtxPrev; @@ -3658,6 +3853,9 @@ static void ivas_dirac_dec_binaural_process_output_fx( nBins = hSpatParamRendCom->num_freq_bands; offsetSamples = 0; nSlots = hSpatParamRendCom->subframe_nbslots[subframe]; + move16(); + move16(); + move16(); Word32 decSlotRe_fx[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX], decSlotIm_fx[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 outSlotRe_fx[CLDFB_NO_CHANNELS_MAX], outSlotIm_fx[CLDFB_NO_CHANNELS_MAX]; @@ -3668,6 +3866,7 @@ static void ivas_dirac_dec_binaural_process_output_fx( Word32 *decSlotRePointer_fx; Word32 *decSlotImPointer_fx; Word16 q_inp_mix, q_reverb = 31; + move16(); IF( processReverb ) @@ -3680,15 +3879,19 @@ static void ivas_dirac_dec_binaural_process_output_fx( // input scaling is to maintain precision in ivas_dirac_dec_decorrelate_slot fn// Word16 shift = s_min( L_norm_arr( cldfbSynDec[0]->cldfb_state_fx, cldfbSynDec[0]->p_filter_length ), L_norm_arr( cldfbSynDec[1]->cldfb_state_fx, cldfbSynDec[1]->p_filter_length ) ); q_inp_mix = 31; + move16(); FOR( Word16 i = 0; i < 6; i++ ) { FOR( Word16 j = 0; j < nSlots; j++ ) { q_inp[i][j] = s_min( L_norm_arr( inRe_fx[i][j], nBins ), L_norm_arr( inIm_fx[i][j], nBins ) ); - IF( ( processReverb ) && ( i < 2 ) ) + move16(); + test(); + IF( ( processReverb ) && LT_16( i, 2 ) ) { q_reverb = s_min( L_norm_arr( reverbRe_fx[i][j], CLDFB_NO_CHANNELS_MAX ), L_norm_arr( reverbIm_fx[i][j], CLDFB_NO_CHANNELS_MAX ) ); q_inp[i][j] = s_min( q_reverb, q_inp[i][j] ); + move16(); } q_inp_mix = s_min( q_inp[i][j], q_inp_mix ); } @@ -3699,8 +3902,9 @@ static void ivas_dirac_dec_binaural_process_output_fx( Word16 cldfb_state_shift = sub( add( add( q_inp_mix, q_mat ), sub( q_input, 16 ) ), cldfbSynDec[0]->Q_cldfb_state ); IF( GT_16( cldfb_state_shift, shift ) ) { - q_inp_mix = q_inp_mix + shift - cldfb_state_shift; + q_inp_mix = sub( add( q_inp_mix, shift ), cldfb_state_shift ); cldfb_state_shift = shift; + move16(); } FOR( Word16 i = 0; i < 6; i++ ) @@ -3710,7 +3914,8 @@ static void ivas_dirac_dec_binaural_process_output_fx( scale_sig32( inRe_fx[i][j], nBins, q_inp_mix ); scale_sig32( inIm_fx[i][j], nBins, q_inp_mix ); - IF( processReverb && ( i < 2 ) ) + test(); + IF( processReverb && LT_16( i, 2 ) ) { scale_sig32( reverbRe_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( add( q_inp_mix, q_mat ), 15 ) ); scale_sig32( reverbIm_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( add( q_inp_mix, q_mat ), 15 ) ); @@ -3723,13 +3928,18 @@ static void ivas_dirac_dec_binaural_process_output_fx( cldfbSynDec[0]->Q_cldfb_state = add( cldfbSynDec[0]->Q_cldfb_state, cldfb_state_shift ); scale_sig32( cldfbSynDec[1]->cldfb_state_fx, cldfbSynDec[1]->p_filter_length, cldfb_state_shift ); cldfbSynDec[1]->Q_cldfb_state = add( cldfbSynDec[1]->Q_cldfb_state, cldfb_state_shift ); + move16(); + move16(); q_inp_mix = add( q_inp_mix, q_input ); interpVal_fx = 0; + move16(); Word16 q_result = sub( add( q_inp_mix, q_mat ), 15 ); // setting it prior// cldfbSynDec[0]->Q_cldfb_state = sub( q_result, 1 ); cldfbSynDec[1]->Q_cldfb_state = sub( q_result, 1 ); + move16(); + move16(); FOR( slot = 0; slot < nSlots; slot++ ) { @@ -3740,7 +3950,9 @@ static void ivas_dirac_dec_binaural_process_output_fx( ELSE { interpVal_fx = 32767; + move16(); } + test(); IF( !hDiracDecBin->useTdDecorr && ( GT_16( max_band_decorr, 0 ) ) ) { ivas_dirac_dec_decorrelate_slot_fx( hDiracDecBin, nBins, slot, inRe_fx, inIm_fx, q_inp_mix, decSlotRe_fx, decSlotIm_fx ); @@ -3789,6 +4001,8 @@ static void ivas_dirac_dec_binaural_process_output_fx( outSlotRe_fx[bin] = L_add( outSlotRe_fx[bin], Mpy_32_16_1( inRe_fx[chB][slot][bin], gain ) ); // q_inp_mix-4//q_result outSlotIm_fx[bin] = L_add( outSlotIm_fx[bin], Mpy_32_16_1( inIm_fx[chB][slot][bin], gain ) ); // q_inp_mix-4//q_result + move32(); + move32(); gain = add( mult( sub( 32767, interpVal_fx ), hDiracDecBin->processMtxImPrev_fx[chA][chB][bin] ), mult( interpVal_fx, hDiracDecBin->processMtxIm_fx[chA][chB][bin] ) ); // Q11 @@ -3796,19 +4010,26 @@ static void ivas_dirac_dec_binaural_process_output_fx( outSlotRe_fx[bin] = L_sub( outSlotRe_fx[bin], Mpy_32_16_1( inIm_fx[chB][slot][bin], gain ) ); // q_inp_mix-4//q_result outSlotIm_fx[bin] = L_add( outSlotIm_fx[bin], Mpy_32_16_1( inRe_fx[chB][slot][bin], gain ) ); // q_inp_mix-4//q_result + move32(); + move32(); /* Mixing decorrelated signals using the formulated residual processing matrix Mdec */ - IF( bin < max_band_decorr && chB < 2 ) + test(); + IF( LT_16( bin, max_band_decorr ) && LT_16( chB, 2 ) ) { gain = add( mult( sub( 32767, interpVal_fx ), hDiracDecBin->processMtxDecRePrev_fx[chA][chB][bin] ), mult( interpVal_fx, hDiracDecBin->processMtxDecRe_fx[chA][chB][bin] ) ); // interpVal * hDiracDecBin->processMtxDecRe[chA][chB][bin]; outSlotRe_fx[bin] = L_add( outSlotRe_fx[bin], Mpy_32_16_1( decSlotRePointer_fx[bin], gain ) ); // q_inp_mix-4//q_result outSlotIm_fx[bin] = L_add( outSlotIm_fx[bin], Mpy_32_16_1( decSlotImPointer_fx[bin], gain ) ); // q_inp_mix-4//q_result + move32(); + move32(); gain = add( mult( sub( 32767, interpVal_fx ), hDiracDecBin->processMtxDecImPrev_fx[chA][chB][bin] ), mult( interpVal_fx, hDiracDecBin->processMtxDecIm_fx[chA][chB][bin] ) ); outSlotRe_fx[bin] = L_sub( outSlotRe_fx[bin], Mpy_32_16_1( decSlotImPointer_fx[bin], gain ) ); // q_inp_mix-4//q_result outSlotIm_fx[bin] = L_add( outSlotIm_fx[bin], Mpy_32_16_1( decSlotRePointer_fx[bin], gain ) ); // q_inp_mix-4//q_result + move32(); + move32(); } } } @@ -3827,9 +4048,11 @@ static void ivas_dirac_dec_binaural_process_output_fx( cldfbSynthesis_ivas_fx( &outSlotRePr_fx, &outSlotImPr_fx, &( output_fx[chA][nBins * slot + offsetSamples] ), nBins, cldfbSynDec[chA] ); cldfbSynDec[chA]->Q_cldfb_state = sub( q_result, 1 ); + move16(); } } *q_out = sub( q_result, 1 ); + move16(); return; } @@ -3980,6 +4203,8 @@ static void adaptTransportSignalsHeadtracked_fx( Word16 q_chEneIIR = 0, q_procChEneIIR = 0; Word32 temp_div; Word16 e_div; + move16(); + move16(); FOR( Word16 i = 0; i < 6; i++ ) { @@ -4005,11 +4230,13 @@ static void adaptTransportSignalsHeadtracked_fx( { mono_factor_rotation = L_shl( mono_factor_rotation, 3 ); // Q31 } + move32(); /* Adapt transport signals in frequency bands */ /* optimization grouping CLDFB bins into MASA bands (they are readily available in ROM and suitable for the task) AND group CLDFB slots into sub-frames */ max_band = 0; + move16(); WHILE( max_band < MASA_FREQUENCY_BANDS && MASA_band_grouping_24[max_band] < nBins ) { max_band = add( max_band, 1 ); @@ -4018,7 +4245,7 @@ static void adaptTransportSignalsHeadtracked_fx( shift = sub( shift, 5 ); // 5 is gaurded bits needed// Word32 re, img, temp; - Word16 q_temp = 2 * ( q_inp + shift ) - 31; + Word16 q_temp = sub( imult1616( 2, add( q_inp, shift ) ), 31 ); FOR( band_idx = 0; band_idx < max_band; band_idx++ ) { Word32 ch_nrg[2]; /* storage for input signal channel energies */ @@ -4028,6 +4255,7 @@ static void adaptTransportSignalsHeadtracked_fx( FOR( ch = 0; ch < 2; ch++ ) { ch_nrg[ch] = 0; + move32(); FOR( slot = 0; slot < nSlots; slot++ ) { FOR( bin = bin_lo; bin < bin_hi; bin++ ) @@ -4036,9 +4264,11 @@ static void adaptTransportSignalsHeadtracked_fx( img = L_shl( inIm_fx[ch][slot][bin], shift ); ch_nrg[ch] = L_add( ch_nrg[ch], ( L_add( Mpy_32_32( re, re ), Mpy_32_32( img, img ) ) ) ); // 2(q_inp +shift) -31 + move32(); } } hHeadTrackData->chEneIIR_fx[ch][band_idx] = Mpy_32_16_1( hHeadTrackData->chEneIIR_fx[ch][band_idx], ADAPT_HTPROTO_IIR_FAC_FX ); + move32(); temp = Mpy_32_16_1( ch_nrg[ch], sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); IF( LT_16( hHeadTrackData->q_chEneIIR, q_temp ) ) { @@ -4048,6 +4278,7 @@ static void adaptTransportSignalsHeadtracked_fx( { hHeadTrackData->chEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->chEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_chEneIIR, q_temp ) ), temp ); } + move32(); } q_chEneIIR = s_min( hHeadTrackData->q_chEneIIR, q_temp ); /* Determine ILD */ @@ -4055,16 +4286,21 @@ static void adaptTransportSignalsHeadtracked_fx( IF( EQ_32( L_max( 1, hHeadTrackData->chEneIIR_fx[0][band_idx] ), L_max( 1, hHeadTrackData->chEneIIR_fx[1][band_idx] ) ) ) { ILD = 0; + move32(); } ELSE { temp_div = L_deposit_h( BASOP_Util_Divide3232_Scale( L_max( 1, hHeadTrackData->chEneIIR_fx[0][band_idx] ), L_max( 1, hHeadTrackData->chEneIIR_fx[1][band_idx] ), &e_div ) ); temp = BASOP_Util_Log2( temp_div ); // Q25 - IF( GE_16( e_div, 0 ) ) - temp = L_add( temp, L_shl( e_div, 25 ) ); // Q25 + IF( e_div > 0 ) + { + temp = L_add( temp, L_shl( e_div, 25 ) ); // Q25 + } ELSE + { temp = L_sub( temp, L_shl( abs( e_div ), 25 ) ); // Q25 + } temp = Mpy_32_32( temp, 646462464 ); // logx base 10 = 0.30103* logx base 2// ILD = L_abs( Mpy_32_16_1( temp, 20480 ) ); // Q21 @@ -4077,6 +4313,7 @@ static void adaptTransportSignalsHeadtracked_fx( { louderCh = 0; } + move16(); /* Determine ILD-based mono factor */ mono_factor_ILD = Mpy_32_16_1( L_sub( ILD, ONE_IN_Q21 ), 10911 ); // Q23 @@ -4084,9 +4321,14 @@ static void adaptTransportSignalsHeadtracked_fx( mono_factor_ILD = L_max( 0, L_min( ONE_IN_Q21, mono_factor_ILD ) ); IF( EQ_32( mono_factor_ILD, ONE_IN_Q21 ) ) - mono_factor_ILD = ONE_IN_Q31; + { + mono_factor_ILD = ONE_IN_Q31; + move32(); + } ELSE + { mono_factor_ILD = L_shl( mono_factor_ILD, 10 ); // Q31 + } /* Combine mono factors */ mono_factor = Mpy_32_32( mono_factor_ILD, mono_factor_rotation ); // Q31 @@ -4097,6 +4339,7 @@ static void adaptTransportSignalsHeadtracked_fx( IF( NE_16( ch, louderCh ) ) { Word32 band_nrg = 0; + move32(); FOR( slot = 0; slot < nSlots; slot++ ) { @@ -4105,12 +4348,15 @@ static void adaptTransportSignalsHeadtracked_fx( /* mono sum signal with the computed weight + rest from the original channel */ inRe_fx[ch][slot][bin] = L_add( ( Mpy_32_32( mono_factor, L_add( inRe_fx[0][slot][bin], inRe_fx[1][slot][bin] ) ) ), ( Mpy_32_32( L_sub( ONE_IN_Q31, mono_factor ), inRe_fx[ch][slot][bin] ) ) ); inIm_fx[ch][slot][bin] = L_add( ( Mpy_32_32( mono_factor, L_add( inIm_fx[0][slot][bin], inIm_fx[1][slot][bin] ) ) ), ( Mpy_32_32( L_sub( ONE_IN_Q31, mono_factor ), inIm_fx[ch][slot][bin] ) ) ); + move32(); + move32(); re = L_shl( inRe_fx[ch][slot][bin], shift ); img = L_shl( inIm_fx[ch][slot][bin], shift ); band_nrg = L_add( band_nrg, ( L_add( Mpy_32_32( re, re ), Mpy_32_32( img, img ) ) ) ); // 2(q_inp +shift) -31 } } hHeadTrackData->procChEneIIR_fx[ch][band_idx] = Mpy_32_16_1( hHeadTrackData->procChEneIIR_fx[ch][band_idx], ADAPT_HTPROTO_IIR_FAC_FX ); + move32(); temp = Mpy_32_16_1( band_nrg, sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); IF( LT_16( hHeadTrackData->q_procChEneIIR, q_temp ) ) @@ -4121,11 +4367,13 @@ static void adaptTransportSignalsHeadtracked_fx( { hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->procChEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_procChEneIIR, q_temp ) ), temp ); } + move32(); } ELSE { /* processed signal is input. use the original channel, so no need to compute new signals or signal energy */ hHeadTrackData->procChEneIIR_fx[ch][band_idx] = Mpy_32_16_1( hHeadTrackData->procChEneIIR_fx[ch][band_idx], ADAPT_HTPROTO_IIR_FAC_FX ); + move32(); temp = Mpy_32_16_1( ch_nrg[ch], sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); IF( LT_16( hHeadTrackData->q_procChEneIIR, q_temp ) ) @@ -4136,6 +4384,7 @@ static void adaptTransportSignalsHeadtracked_fx( { hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->procChEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_procChEneIIR, q_temp ) ), temp ); } + move32(); } } @@ -4147,13 +4396,16 @@ static void adaptTransportSignalsHeadtracked_fx( ene_proc = L_add( hHeadTrackData->procChEneIIR_fx[0][band_idx], hHeadTrackData->procChEneIIR_fx[1][band_idx] ); // q_procChEneIIR// temp_div = L_deposit_h( BASOP_Util_Divide3232_Scale( ene_target, L_max( 1, ene_proc ), &e_div ) ); - e_div = e_div + ( q_procChEneIIR - q_chEneIIR ); + e_div = add( e_div, sub( q_procChEneIIR, q_chEneIIR ) ); eqVal = Sqrt32( temp_div, &e_div ); Word16 comp_flag = BASOP_Util_Cmp_Mant32Exp( 1073741824, 3, eqVal, e_div ); IF( EQ_16( comp_flag, -1 ) ) - eqVal = 1073741824; // 4inQ28 + { + eqVal = 1073741824; // 4inQ28 + move32(); + } ELSE { eqVal = L_shl( eqVal, sub( e_div, 3 ) ); // Q28 @@ -4165,10 +4417,14 @@ static void adaptTransportSignalsHeadtracked_fx( { FOR( bin = bin_lo; bin < bin_hi; bin++ ) { - if ( ( ch == 0 && slot == 0 ) ) + test(); + IF( ( ch == 0 && slot == 0 ) ) { - if ( bin == 1 ) + if ( EQ_16( bin, 1 ) ) + { bin = bin; + move16(); + } } Word16 temp_shift = s_min( norm_l( inRe_fx[ch][slot][bin] ), norm_l( inIm_fx[ch][slot][bin] ) ); @@ -4179,6 +4435,8 @@ static void adaptTransportSignalsHeadtracked_fx( img = L_shr( Mpy_32_32( img, eqVal ), sub( temp_shift, 3 ) ); inRe_fx[ch][slot][bin] = re; // q_inp inIm_fx[ch][slot][bin] = img; // q_inp + move32(); + move32(); } } } @@ -4187,6 +4445,8 @@ static void adaptTransportSignalsHeadtracked_fx( hHeadTrackData->q_chEneIIR = q_chEneIIR; hHeadTrackData->q_procChEneIIR = q_procChEneIIR; + move16(); + move16(); return; } @@ -4319,19 +4579,25 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( Word16 slot, bin, ch; Word32 tmpVal; Word16 norm, e_div, shift = 31; + move16(); Word32 Re, Im, temp_div; /* When not currently in prototype signal left-right switching procedure, check if such switching is needed */ - IF( EQ_16( (Word16) hHeadTrackData->lrSwitchedNext, (Word16) hHeadTrackData->lrSwitchedCurrent ) ) + IF( EQ_16( hHeadTrackData->lrSwitchedNext, hHeadTrackData->lrSwitchedCurrent ) ) { Word32 thresholdDotProduct = 182536112; // 0.17 in Q30// /* Corresponds to 10-degree switching threshold */ - IF( EQ_16( (Word16) hHeadTrackData->lrSwitchedCurrent, 0 ) && ( LT_32( Rmat_fx[1][1], L_negate( thresholdDotProduct ) ) ) ) + move32(); + test(); + if ( hHeadTrackData->lrSwitchedCurrent == 0 && ( LT_32( Rmat_fx[1][1], L_negate( thresholdDotProduct ) ) ) ) { hHeadTrackData->lrSwitchedNext = 1; + move16(); } - IF( EQ_16( (Word16) hHeadTrackData->lrSwitchedCurrent, 1 ) && ( GT_32( Rmat_fx[1][1], thresholdDotProduct ) ) ) + test(); + if ( EQ_16( hHeadTrackData->lrSwitchedCurrent, 1 ) && ( GT_32( Rmat_fx[1][1], thresholdDotProduct ) ) ) { hHeadTrackData->lrSwitchedNext = 0; + move16(); } } @@ -4346,7 +4612,7 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( shift = sub( shift, 3 ); // guard bits// /* When currently in interpolation */ - IF( NE_16( (Word16) hHeadTrackData->lrSwitchedNext, (Word16) hHeadTrackData->lrSwitchedCurrent ) ) + IF( NE_16( hHeadTrackData->lrSwitchedNext, hHeadTrackData->lrSwitchedCurrent ) ) { FOR( slot = 0; slot < nSlots; slot++ ) { @@ -4354,12 +4620,15 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( Word16 e_switchOrderFactor, e_origOrderFactor; hHeadTrackData->lrSwitchInterpVal_fx = L_add( hHeadTrackData->lrSwitchInterpVal_fx, 2684354 /* 0.0025f in Q30 */ ); /* Corresponds to 0.5 seconds interpolation time */ /* Q30 */ + move32(); IF( GT_32( hHeadTrackData->lrSwitchInterpVal_fx, 1072668096 /* 0.999f in Q30 */ ) ) { /* Stop interpolation, reset values */ hHeadTrackData->lrSwitchInterpVal_fx = 0; hHeadTrackData->lrSwitchedCurrent = hHeadTrackData->lrSwitchedNext; + move32(); + move16(); } /* Gains for determining portion of switched channel order and original channel order */ @@ -4368,8 +4637,13 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( e_switchOrderFactor = 0; e_origOrderFactor = 0; + move16(); + move16(); IF( EQ_32( tmpVal, 32768 ) ) - tmpVal = ONE_IN_Q31; + { + tmpVal = ONE_IN_Q31; + move32(); + } ELSE tmpVal = L_shl( tmpVal, 16 ); // Q31 switchOrderFactor = Sqrt32( tmpVal, &e_switchOrderFactor ); @@ -4387,6 +4661,10 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( re2[ch] = Mpy_32_32( inRe_fx[1 - ch][slot][bin], switchOrderFactor ); // q_inp im1[ch] = Mpy_32_32( inIm_fx[ch][slot][bin], origOrderFactor ); // q_inp im2[ch] = Mpy_32_32( inIm_fx[1 - ch][slot][bin], switchOrderFactor ); // q_inp + move32(); + move32(); + move32(); + move32(); } FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) @@ -4397,6 +4675,10 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( re2[ch] = L_shl( re2[ch], shift ); // q_inp+shift// im1[ch] = L_shl( im1[ch], shift ); // q_inp+shift// im2[ch] = L_shl( im2[ch], shift ); // q_inp+shift// + move32(); + move32(); + move32(); + move32(); /* Interpolate / mix original and switched order signals */ Re = L_add( re1[ch], re2[ch] ); // q_inp+shift// @@ -4413,7 +4695,10 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( Word16 comp_flag = BASOP_Util_Cmp_Mant32Exp( 1073741824, 3, eq, e_div ); IF( EQ_16( comp_flag, -1 ) ) - eq = 1073741824; // 4inQ28 + { + eq = 1073741824; // 4inQ28 + move32(); + } ELSE { eq = L_shl( eq, sub( e_div, 3 ) ); // Q28 @@ -4424,6 +4709,8 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( inRe_fx[ch][slot][bin] = Re; inIm_fx[ch][slot][bin] = Im; + move32(); + move32(); } } } @@ -4431,7 +4718,7 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( ELSE { /* If not in interpolation, but in switched prototype situation, then switch left and right channels */ - IF( hHeadTrackData->lrSwitchedCurrent == 1 ) + IF( EQ_16( hHeadTrackData->lrSwitchedCurrent, 1 ) ) { FOR( slot = 0; slot < nSlots; slot++ ) { @@ -4443,8 +4730,12 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( tmpVal = inIm_fx[0][slot][bin]; inIm_fx[0][slot][bin] = inIm_fx[1][slot][bin]; inIm_fx[1][slot][bin] = tmpVal; - } - } + move32(); + move32(); + move32(); + move32(); + } + } } } @@ -4650,6 +4941,8 @@ static void eig2x2_fx( Word16 q_crossSquare, q_tmp1, q_tmp2, exp_tmp3, exp, q_e, q_c, q_U_1, q_U_2; Word32 epsilon_mant = 1180591621; Word16 epsilon_exp = -39; + move32(); + move16(); pm_fx = 0; move32(); @@ -4684,7 +4977,7 @@ static void eig2x2_fx( pm_fx = 0.5f * sqrtf(max(0.0f, a_fx)) add_fx = 0.5f * (e1 + e2)*/ - IF( L_and( EQ_32( c_re, 0 ), EQ_32( c_im, 0 ) ) ) + IF( L_and( c_re == 0, c_im == 0 ) ) { /* if c_re = 0 and c_im = 0, then crossSquare_fx = (c_re * c_re) + (c_im * c_im) = 0 a_fx = (E1 - E2)^2 @@ -4705,17 +4998,21 @@ static void eig2x2_fx( { /* if e1 - e2 = 0, then a_fx = 4 * crossSquare_fx pm_fx = 0.5 * sqrt(max(0, 4 * crossSquare_fx)) = sqrt(0, crossSquare_fx)*/ + test(); + test(); IF( EQ_32( c_re, 0 ) || LT_32( abs( c_re ), ONE_IN_Q15 ) ) { /* if c_re = 0, then crossSquare_fx = c_im^2 => pm_fx = max(0, c_im) */ pm_fx = L_max( 0, L_abs( c_im ) ); q_tmp2 = q_c; + move16(); } - ELSE IF( EQ_32( c_im, 0 ) || LT_32( abs( c_im ), ONE_IN_Q15 ) ) + ELSE IF( c_im == 0 || LT_32( abs( c_im ), ONE_IN_Q15 ) ) { /* if c_im = 0, then crossSquare_fx = c_re^2 => pm_fx = max(0, c_re) */ pm_fx = L_max( 0, L_abs( c_re ) ); q_tmp2 = q_c; + move16(); } ELSE { @@ -4739,6 +5036,7 @@ static void eig2x2_fx( ELSE { tmp2 = crossSquare_fx; + move32(); q_tmp2 = sub( q_crossSquare, 2 ); // crossSquare_fx = 4 * crossSquare_fx; tmp1 = Mpy_32_32( L_sub( e1, e2 ), L_sub( e1, e2 ) ); @@ -4748,7 +5046,7 @@ static void eig2x2_fx( q_tmp2 = sub( 31, q_tmp2 ); exp = sub( 31, q_tmp2 ); - pm_fx = Sqrt32( L_max( 0, a_fx - 1 ), &exp ); + pm_fx = Sqrt32( L_max( 0, L_sub( a_fx, 1 ) ), &exp ); pm_fx = L_shr( pm_fx, 1 ); q_tmp2 = sub( 31, exp ); } @@ -4757,6 +5055,7 @@ static void eig2x2_fx( // add_fx = 0.5 * (e1 + e2) add_fx = L_shr( L_add( e1, e2 ), 1 ); q_tmp1 = q_e; + move16(); IF( LT_16( q_tmp1, q_tmp2 ) ) { @@ -4825,147 +5124,173 @@ static void eig2x2_fx( q_U_1 = 0; q_U_2 = 0; + move16(); + move16(); /* Eigenvectors */ - FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ){ - IF( LT_16( *q_D, q_e ) ){ + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + IF( LT_16( *q_D, q_e ) ) + { tmp1 = L_sub( D_fx[ch], L_shr( e1, sub( q_e, *q_D ) ) ); - tmp2 = L_sub( D_fx[ch], L_shr( e2, sub( q_e, *q_D ) ) ); - q_tmp1 = *q_D; - move16(); -} -ELSE -{ - tmp1 = L_sub( L_shr( D_fx[ch], sub( *q_D, q_e ) ), e1 ); - tmp2 = L_sub( L_shr( D_fx[ch], sub( *q_D, q_e ) ), e2 ); - q_tmp1 = q_e; - move16(); -} + tmp2 = L_sub( D_fx[ch], L_shr( e2, sub( q_e, *q_D ) ) ); + q_tmp1 = *q_D; + move16(); + } + ELSE + { + tmp1 = L_sub( L_shr( D_fx[ch], sub( *q_D, q_e ) ), e1 ); + tmp2 = L_sub( L_shr( D_fx[ch], sub( *q_D, q_e ) ), e2 ); + q_tmp1 = q_e; + move16(); + } -IF( GT_32( abs( tmp2 ), abs( tmp1 ) ) ) -{ - s_fx = tmp2; - move32(); - exp = sub( norm_l( s_fx ), 1 ); - tmp2 = Mpy_32_32( s_fx, s_fx ); - q_tmp2 = sub( add( q_tmp1, q_tmp1 ), 31 ); + IF( GT_32( abs( tmp2 ), abs( tmp1 ) ) ) + { + s_fx = tmp2; + move32(); + exp = sub( norm_l( s_fx ), 1 ); + tmp2 = Mpy_32_32( s_fx, s_fx ); + q_tmp2 = sub( add( q_tmp1, q_tmp1 ), 31 ); - tmp2 = BASOP_Util_Add_Mant32Exp( crossSquare_fx, sub( 31, q_crossSquare ), tmp2, sub( 31, q_tmp2 ), &q_tmp2 ); - q_tmp2 = sub( 31, q_tmp2 ); + tmp2 = BASOP_Util_Add_Mant32Exp( crossSquare_fx, sub( 31, q_crossSquare ), tmp2, sub( 31, q_tmp2 ), &q_tmp2 ); + q_tmp2 = sub( 31, q_tmp2 ); - tmp3 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), epsilon_mant, epsilon_exp, &exp_tmp3 ); + tmp3 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), epsilon_mant, epsilon_exp, &exp_tmp3 ); - tmp2 = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, tmp3, &exp ); - exp = sub( exp, sub( Q30, sub( 31, exp_tmp3 ) ) ); - normVal_fx = Sqrt32( tmp2, &exp ); - q_tmp2 = sub( 31, exp ); + tmp2 = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, tmp3, &exp ); + exp = sub( exp, sub( Q30, sub( 31, exp_tmp3 ) ) ); + normVal_fx = Sqrt32( tmp2, &exp ); + q_tmp2 = sub( 31, exp ); - IF( LT_16( q_tmp1, q_c ) ) - { - c_re = L_shr( c_re, sub( q_c, q_tmp1 ) ); - c_im = L_shr( c_im, sub( q_c, q_tmp1 ) ); - q_c = q_tmp1; - move16(); - } - ELSE - { - s_fx = L_shr( s_fx, sub( q_tmp1, q_c ) ); - q_tmp1 = q_c; - move16(); - } + IF( LT_16( q_tmp1, q_c ) ) + { + c_re = L_shr( c_re, sub( q_c, q_tmp1 ) ); + c_im = L_shr( c_im, sub( q_c, q_tmp1 ) ); + q_c = q_tmp1; + move16(); + } + ELSE + { + s_fx = L_shr( s_fx, sub( q_tmp1, q_c ) ); + q_tmp1 = q_c; + move16(); + } - Ure_fx[0][ch] = Mpy_32_32( s_fx, normVal_fx ); - move32(); - Ure_fx[1][ch] = Mpy_32_32( c_re, normVal_fx ); - move32(); - Uim_fx[1][ch] = Mpy_32_32( c_im, normVal_fx ); - move32(); - q_U_1 = sub( add( q_tmp1, q_tmp2 ), 31 ); + Ure_fx[0][ch] = Mpy_32_32( s_fx, normVal_fx ); + move32(); + Ure_fx[1][ch] = Mpy_32_32( c_re, normVal_fx ); + move32(); + Uim_fx[1][ch] = Mpy_32_32( c_im, normVal_fx ); + move32(); + q_U_1 = sub( add( q_tmp1, q_tmp2 ), 31 ); - IF( q_U_2 != 0 ) - { - IF( LT_16( q_U_1, q_U_2 ) ) - { - Ure_fx[1][ch - 1] = L_shr( Ure_fx[1][ch - 1], sub( q_U_2, q_U_1 ) ); - Ure_fx[0][ch - 1] = L_shr( Ure_fx[0][ch - 1], sub( q_U_2, q_U_1 ) ); - Uim_fx[0][ch - 1] = L_shr( Uim_fx[0][ch - 1], sub( q_U_2, q_U_1 ) ); + IF( q_U_2 != 0 ) + { + IF( LT_16( q_U_1, q_U_2 ) ) + { + Ure_fx[1][ch - 1] = L_shr( Ure_fx[1][ch - 1], sub( q_U_2, q_U_1 ) ); + Ure_fx[0][ch - 1] = L_shr( Ure_fx[0][ch - 1], sub( q_U_2, q_U_1 ) ); + Uim_fx[0][ch - 1] = L_shr( Uim_fx[0][ch - 1], sub( q_U_2, q_U_1 ) ); + q_U_2 = q_U_1; + move32(); + move32(); + move32(); + move16(); + } + ELSE IF( GT_16( q_U_1, q_U_2 ) ) + { + Ure_fx[1][ch] = L_shr( Ure_fx[1][ch], sub( q_U_1, q_U_2 ) ); + Ure_fx[0][ch] = L_shr( Ure_fx[0][ch], sub( q_U_1, q_U_2 ) ); + Uim_fx[1][ch] = L_shr( Uim_fx[1][ch], sub( q_U_1, q_U_2 ) ); + q_U_1 = q_U_2; + move32(); + move32(); + move32(); + move16(); + } + } q_U_2 = q_U_1; + move16(); } - ELSE IF( GT_16( q_U_1, q_U_2 ) ) + ELSE { - Ure_fx[1][ch] = L_shr( Ure_fx[1][ch], sub( q_U_1, q_U_2 ) ); - Ure_fx[0][ch] = L_shr( Ure_fx[0][ch], sub( q_U_1, q_U_2 ) ); - Uim_fx[1][ch] = L_shr( Uim_fx[1][ch], sub( q_U_1, q_U_2 ) ); - q_U_1 = q_U_2; - } - } - q_U_2 = q_U_1; -} -ELSE -{ - s_fx = tmp1; - move32(); + s_fx = tmp1; + move32(); - exp = sub( norm_l( s_fx ), 1 ); - tmp2 = Mpy_32_32( s_fx, s_fx ); - q_tmp2 = sub( add( q_tmp1, q_tmp1 ), 31 ); + exp = sub( norm_l( s_fx ), 1 ); + tmp2 = Mpy_32_32( s_fx, s_fx ); + q_tmp2 = sub( add( q_tmp1, q_tmp1 ), 31 ); - tmp2 = BASOP_Util_Add_Mant32Exp( crossSquare_fx, sub( 31, q_crossSquare ), tmp2, sub( 31, q_tmp2 ), &q_tmp2 ); - q_tmp2 = sub( 31, q_tmp2 ); + tmp2 = BASOP_Util_Add_Mant32Exp( crossSquare_fx, sub( 31, q_crossSquare ), tmp2, sub( 31, q_tmp2 ), &q_tmp2 ); + q_tmp2 = sub( 31, q_tmp2 ); - tmp3 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), epsilon_mant, epsilon_exp, &exp_tmp3 ); + tmp3 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), epsilon_mant, epsilon_exp, &exp_tmp3 ); - tmp2 = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, tmp3, &exp ); - exp = sub( exp, sub( Q30, sub( 31, exp_tmp3 ) ) ); - normVal_fx = Sqrt32( tmp2, &exp ); - q_tmp2 = sub( 31, exp ); + tmp2 = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, tmp3, &exp ); + exp = sub( exp, sub( Q30, sub( 31, exp_tmp3 ) ) ); + normVal_fx = Sqrt32( tmp2, &exp ); + q_tmp2 = sub( 31, exp ); - IF( LT_16( q_tmp1, q_c ) ) - { - c_re = L_shr( c_re, sub( q_c, q_tmp1 ) ); - c_im = L_shr( c_im, sub( q_c, q_tmp1 ) ); - q_c = q_tmp1; - move16(); - } - ELSE - { - s_fx = L_shr( s_fx, sub( q_tmp1, q_c ) ); - q_tmp1 = q_c; - move16(); - } + IF( LT_16( q_tmp1, q_c ) ) + { + c_re = L_shr( c_re, sub( q_c, q_tmp1 ) ); + c_im = L_shr( c_im, sub( q_c, q_tmp1 ) ); + q_c = q_tmp1; + move16(); + } + ELSE + { + s_fx = L_shr( s_fx, sub( q_tmp1, q_c ) ); + q_tmp1 = q_c; + move16(); + } - Ure_fx[1][ch] = Mpy_32_32( s_fx, normVal_fx ); - move32(); - Ure_fx[0][ch] = Mpy_32_32( c_re, normVal_fx ); - move32(); - Uim_fx[0][ch] = Mpy_32_32( -c_im, normVal_fx ); - move32(); - q_U_2 = sub( add( q_tmp1, q_tmp2 ), 31 ); + Ure_fx[1][ch] = Mpy_32_32( s_fx, normVal_fx ); + move32(); + Ure_fx[0][ch] = Mpy_32_32( c_re, normVal_fx ); + move32(); + Uim_fx[0][ch] = Mpy_32_32( -c_im, normVal_fx ); + move32(); + q_U_2 = sub( add( q_tmp1, q_tmp2 ), 31 ); - IF( q_U_1 != 0 ) - { - IF( LT_16( q_U_1, q_U_2 ) ) - { - Ure_fx[1][ch] = L_shr( Ure_fx[1][ch], sub( q_U_2, q_U_1 ) ); - Ure_fx[0][ch] = L_shr( Ure_fx[0][ch], sub( q_U_2, q_U_1 ) ); - Uim_fx[0][ch] = L_shr( Uim_fx[0][ch], sub( q_U_2, q_U_1 ) ); - q_U_2 = q_U_1; - } - ELSE IF( GT_16( q_U_1, q_U_2 ) ) - { - Ure_fx[1][ch - 1] = L_shr( Ure_fx[1][ch - 1], sub( q_U_1, q_U_2 ) ); - Ure_fx[0][ch - 1] = L_shr( Ure_fx[0][ch - 1], sub( q_U_1, q_U_2 ) ); - Uim_fx[1][ch - 1] = L_shr( Uim_fx[1][ch - 1], sub( q_U_1, q_U_2 ) ); + IF( q_U_1 != 0 ) + { + IF( LT_16( q_U_1, q_U_2 ) ) + { + Ure_fx[1][ch] = L_shr( Ure_fx[1][ch], sub( q_U_2, q_U_1 ) ); + Ure_fx[0][ch] = L_shr( Ure_fx[0][ch], sub( q_U_2, q_U_1 ) ); + Uim_fx[0][ch] = L_shr( Uim_fx[0][ch], sub( q_U_2, q_U_1 ) ); + q_U_2 = q_U_1; + move32(); + move32(); + move32(); + move16(); + } + ELSE IF( GT_16( q_U_1, q_U_2 ) ) + { + Ure_fx[1][ch - 1] = L_shr( Ure_fx[1][ch - 1], sub( q_U_1, q_U_2 ) ); + Ure_fx[0][ch - 1] = L_shr( Ure_fx[0][ch - 1], sub( q_U_1, q_U_2 ) ); + Uim_fx[1][ch - 1] = L_shr( Uim_fx[1][ch - 1], sub( q_U_1, q_U_2 ) ); + q_U_1 = q_U_2; + move32(); + move32(); + move32(); + move16(); + } + } q_U_1 = q_U_2; + move16(); } } - q_U_1 = q_U_2; -} -} -*q_U = q_U_1 != 0 ? q_U_1 : q_U_2; + IF ( q_U_1 != 0 ) + *q_U = q_U_1; + ELSE + *q_U = q_U_2; + move16(); -return; + return; } #endif // IVAS_FLOAT_FIXED @@ -5010,12 +5335,15 @@ static void matrixDiagMul_fx( { reOut_fx[chA][chB] = Mpy_32_32( reIn_fx[chA][chB], D_fx[chB] ); imOut_fx[chA][chB] = Mpy_32_32( imIn_fx[chA][chB], D_fx[chB] ); + move32(); + move32(); } } *q_Out = sub( add( q_In, q_D ), 31 ); + move16(); - IF( L_and( is_zero_arr( reOut_fx[0], size ), is_zero_arr( imOut_fx[0], size ) ) ) + if ( L_and( is_zero_arr( reOut_fx[0], size ), is_zero_arr( imOut_fx[0], size ) ) ) { *q_Out = Q31; move16(); @@ -5076,31 +5404,112 @@ static void matrixMul_fx( *q_A = add( *q_A, min_q_shift1 ); *q_B = add( *q_B, min_q_shift2 ); + move16(); + move16(); FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { FOR( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) { - tmp1 = ( Are_fx[chA][0] >= 0 && Bre_fx[0][chB] >= 0 ) || ( Are_fx[chA][0] < 0 && Bre_fx[0][chB] < 0 ) ? Mpy_32_32( Are_fx[chA][0], Bre_fx[0][chB] ) : L_negate( Mpy_32_32( abs( Are_fx[chA][0] ), abs( Bre_fx[0][chB] ) ) ); - tmp2 = ( Are_fx[chA][1] >= 0 && Bre_fx[1][chB] >= 0 ) || ( Are_fx[chA][1] < 0 && Bre_fx[1][chB] < 0 ) ? Mpy_32_32( Are_fx[chA][1], Bre_fx[1][chB] ) : L_negate( Mpy_32_32( abs( Are_fx[chA][1] ), abs( Bre_fx[1][chB] ) ) ); + test(); + test(); + test(); + IF( ( Are_fx[chA][0] >= 0 && Bre_fx[0][chB] >= 0 ) || ( Are_fx[chA][0] < 0 && Bre_fx[0][chB] < 0 ) ) + { + tmp1 = Mpy_32_32( Are_fx[chA][0], Bre_fx[0][chB] ); + } + ELSE + { + tmp1 = L_negate( Mpy_32_32( abs( Are_fx[chA][0] ), abs( Bre_fx[0][chB] ) ) ); + } + test(); + test(); + test(); + IF( ( Are_fx[chA][1] >= 0 && Bre_fx[1][chB] >= 0 ) || ( Are_fx[chA][1] < 0 && Bre_fx[1][chB] < 0 ) ) + { + tmp2 = Mpy_32_32( Are_fx[chA][1], Bre_fx[1][chB] ); + } + ELSE + { + tmp2 = L_negate( Mpy_32_32( abs( Are_fx[chA][1] ), abs( Bre_fx[1][chB] ) ) ); + } // outRe_fx[chA][chB] = Madd_32_32( Mpy_32_32( Are_fx[chA][0], Bre_fx[0][chB] ), Are_fx[chA][1], Bre_fx[1][chB] ); outRe_fx[chA][chB] = L_add( tmp1, tmp2 ); move32(); - tmp1 = ( Aim_fx[chA][0] >= 0 && Bim_fx[0][chB] >= 0 ) || ( Aim_fx[chA][0] < 0 && Bim_fx[0][chB] < 0 ) ? Mpy_32_32( Aim_fx[chA][0], Bim_fx[0][chB] ) : L_negate( Mpy_32_32( abs( Aim_fx[chA][0] ), abs( Bim_fx[0][chB] ) ) ); - tmp2 = ( Aim_fx[chA][1] >= 0 && Bim_fx[1][chB] >= 0 ) || ( Aim_fx[chA][1] < 0 && Bim_fx[1][chB] < 0 ) ? Mpy_32_32( Aim_fx[chA][1], Bim_fx[1][chB] ) : L_negate( Mpy_32_32( abs( Aim_fx[chA][1] ), abs( Bim_fx[1][chB] ) ) ); + test(); + test(); + test(); + IF( ( Aim_fx[chA][0] >= 0 && Bim_fx[0][chB] >= 0 ) || ( Aim_fx[chA][0] < 0 && Bim_fx[0][chB] < 0 ) ) + { + tmp1 = Mpy_32_32( Aim_fx[chA][0], Bim_fx[0][chB] ); + } + ELSE + { + tmp1 = L_negate( Mpy_32_32( abs( Aim_fx[chA][0] ), abs( Bim_fx[0][chB] ) ) ); + } + test(); + test(); + test(); + IF( ( Aim_fx[chA][1] >= 0 && Bim_fx[1][chB] >= 0 ) || ( Aim_fx[chA][1] < 0 && Bim_fx[1][chB] < 0 ) ) + { + tmp2 = Mpy_32_32( Aim_fx[chA][1], Bim_fx[1][chB] ); + } + ELSE + { + tmp2 = L_negate( Mpy_32_32( abs( Aim_fx[chA][1] ), abs( Bim_fx[1][chB] ) ) ); + } // outRe_fx[chA][chB] = L_sub( outRe_fx[chA][chB], Madd_32_32( Mpy_32_32( Aim_fx[chA][0], Bim_fx[0][chB] ), Aim_fx[chA][1], Bim_fx[1][chB] ) ); outRe_fx[chA][chB] = L_sub( outRe_fx[chA][chB], L_add( tmp1, tmp2 ) ); move32(); - - tmp1 = ( Aim_fx[chA][0] >= 0 && Bre_fx[0][chB] >= 0 ) || ( Aim_fx[chA][0] < 0 && Bre_fx[0][chB] < 0 ) ? Mpy_32_32( Aim_fx[chA][0], Bre_fx[0][chB] ) : L_negate( Mpy_32_32( abs( Aim_fx[chA][0] ), abs( Bre_fx[0][chB] ) ) ); - tmp2 = ( Aim_fx[chA][1] >= 0 && Bre_fx[1][chB] >= 0 ) || ( Aim_fx[chA][1] < 0 && Bre_fx[1][chB] < 0 ) ? Mpy_32_32( Aim_fx[chA][1], Bre_fx[1][chB] ) : L_negate( Mpy_32_32( abs( Aim_fx[chA][1] ), abs( Bre_fx[1][chB] ) ) ); + test(); + test(); + test(); + IF( ( Aim_fx[chA][0] >= 0 && Bre_fx[0][chB] >= 0 ) || ( Aim_fx[chA][0] < 0 && Bre_fx[0][chB] < 0 ) ) + { + tmp1 = Mpy_32_32( Aim_fx[chA][0], Bre_fx[0][chB] ); + } + ELSE + { + tmp1 = L_negate( Mpy_32_32( abs( Aim_fx[chA][0] ), abs( Bre_fx[0][chB] ) ) ); + } + test(); + test(); + test(); + IF( ( Aim_fx[chA][1] >= 0 && Bre_fx[1][chB] >= 0 ) || ( Aim_fx[chA][1] < 0 && Bre_fx[1][chB] < 0 ) ) + { + tmp2 = Mpy_32_32( Aim_fx[chA][1], Bre_fx[1][chB] ); + } + ELSE + { + tmp2 = L_negate( Mpy_32_32( abs( Aim_fx[chA][1] ), abs( Bre_fx[1][chB] ) ) ); + } // outIm_fx[chA][chB] = Madd_32_32( Mpy_32_32( Aim_fx[chA][0], Bre_fx[0][chB] ), Aim_fx[chA][1], Bre_fx[1][chB] ); outIm_fx[chA][chB] = L_add( tmp1, tmp2 ); move32(); - tmp1 = ( Are_fx[chA][0] >= 0 && Bim_fx[0][chB] >= 0 ) || ( Are_fx[chA][0] < 0 && Bim_fx[0][chB] < 0 ) ? Mpy_32_32( Are_fx[chA][0], Bim_fx[0][chB] ) : L_negate( Mpy_32_32( abs( Are_fx[chA][0] ), abs( Bim_fx[0][chB] ) ) ); - tmp2 = ( Are_fx[chA][1] >= 0 && Bim_fx[1][chB] >= 0 ) || ( Are_fx[chA][1] < 0 && Bim_fx[1][chB] < 0 ) ? Mpy_32_32( Are_fx[chA][1], Bim_fx[1][chB] ) : L_negate( Mpy_32_32( abs( Are_fx[chA][1] ), abs( Bim_fx[1][chB] ) ) ); + test(); + test(); + test(); + IF( ( Are_fx[chA][0] >= 0 && Bim_fx[0][chB] >= 0 ) || ( Are_fx[chA][0] < 0 && Bim_fx[0][chB] < 0 ) ) + { + tmp1 = Mpy_32_32( Are_fx[chA][0], Bim_fx[0][chB] ); + } + ELSE + { + tmp1 = L_negate( Mpy_32_32( abs( Are_fx[chA][0] ), abs( Bim_fx[0][chB] ) ) ); + } + test(); + test(); + test(); + IF( ( Are_fx[chA][1] >= 0 && Bim_fx[1][chB] >= 0 ) || ( Are_fx[chA][1] < 0 && Bim_fx[1][chB] < 0 ) ) + { + tmp2 = Mpy_32_32( Are_fx[chA][1], Bim_fx[1][chB] ); + } + ELSE + { + tmp2 = L_negate( Mpy_32_32( abs( Are_fx[chA][1] ), abs( Bim_fx[1][chB] ) ) ); + } // outIm_fx[chA][chB] = L_add( outIm_fx[chA][chB], Madd_32_32( Mpy_32_32( Are_fx[chA][0], Bim_fx[0][chB] ), Are_fx[chA][1], Bim_fx[1][chB] ) ); outIm_fx[chA][chB] = L_add( outIm_fx[chA][chB], L_add( tmp1, tmp2 ) ); move32(); @@ -5108,7 +5517,8 @@ static void matrixMul_fx( } *q_out = sub( add( *q_A, *q_B ), 31 ); - IF( L_and( is_zero_arr( outRe_fx[0], size ), is_zero_arr( outIm_fx[0], size ) ) ) + move16(); + if ( L_and( is_zero_arr( outRe_fx[0], size ), is_zero_arr( outIm_fx[0], size ) ) ) { *q_out = Q31; move16(); @@ -5162,24 +5572,73 @@ static void matrixTransp1Mul_fx( { FOR( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) { - tmp1 = ( ( ( Are_fx[0][chA] >= 0 ) && ( Bre_fx[0][chB] >= 0 ) ) || ( ( Are_fx[0][chA] < 0 ) && ( Bre_fx[0][chB] < 0 ) ) ) ? Mpy_32_32( Are_fx[0][chA], Bre_fx[0][chB] ) : L_negate( Mpy_32_32( abs( Are_fx[0][chA] ), abs( Bre_fx[0][chB] ) ) ); - tmp2 = ( ( ( Are_fx[1][chA] >= 0 ) && ( Bre_fx[1][chB] >= 0 ) ) || ( ( Are_fx[1][chA] < 0 ) && ( Bre_fx[1][chB] < 0 ) ) ) ? Mpy_32_32( Are_fx[1][chA], Bre_fx[1][chB] ) : L_negate( Mpy_32_32( abs( Are_fx[1][chA] ), abs( Bre_fx[1][chB] ) ) ); + test(); + test(); + test(); + IF( ( ( ( Are_fx[0][chA] >= 0 ) && ( Bre_fx[0][chB] >= 0 ) ) || ( ( Are_fx[0][chA] < 0 ) && ( Bre_fx[0][chB] < 0 ) ) ) ) + tmp1 = Mpy_32_32( Are_fx[0][chA], Bre_fx[0][chB] ); + ELSE + tmp1 = L_negate( Mpy_32_32( abs( Are_fx[0][chA] ), abs( Bre_fx[0][chB] ) ) ); + test(); + test(); + test(); + IF( ( ( ( Are_fx[1][chA] >= 0 ) && ( Bre_fx[1][chB] >= 0 ) ) || ( ( Are_fx[1][chA] < 0 ) && ( Bre_fx[1][chB] < 0 ) ) ) ) + tmp2 = Mpy_32_32( Are_fx[1][chA], Bre_fx[1][chB] ); + ELSE + tmp2 = L_negate( Mpy_32_32( abs( Are_fx[1][chA] ), abs( Bre_fx[1][chB] ) ) ); // outRe_fx[chA][chB] = Madd_32_32( Mpy_32_32( Are_fx[0][chA], Bre_fx[0][chB] ), Are_fx[1][chA], Bre_fx[1][chB] ); outRe_fx[chA][chB] = L_add( tmp1, tmp2 ); move32(); - tmp1 = ( ( ( L_negate( Aim_fx[0][chA] ) >= 0 ) && ( Bim_fx[0][chB] >= 0 ) ) || ( ( L_negate( Aim_fx[0][chA] ) < 0 ) && ( Bim_fx[0][chB] < 0 ) ) ) ? Mpy_32_32( -Aim_fx[0][chA], Bim_fx[0][chB] ) : L_negate( Mpy_32_32( abs( -Aim_fx[0][chA] ), abs( Bim_fx[0][chB] ) ) ); - tmp2 = ( ( ( Aim_fx[1][chA] >= 0 ) && ( Bim_fx[1][chB] >= 0 ) ) || ( ( Aim_fx[1][chA] < 0 ) && ( Bim_fx[1][chB] < 0 ) ) ) ? Mpy_32_32( Aim_fx[1][chA], Bim_fx[1][chB] ) : L_negate( Mpy_32_32( abs( Aim_fx[1][chA] ), abs( Bim_fx[1][chB] ) ) ); + test(); + test(); + test(); + IF( ( ( ( L_negate( Aim_fx[0][chA] ) >= 0 ) && ( Bim_fx[0][chB] >= 0 ) ) || ( ( L_negate( Aim_fx[0][chA] ) < 0 ) && ( Bim_fx[0][chB] < 0 ) ) ) ) + tmp1 = Mpy_32_32( -Aim_fx[0][chA], Bim_fx[0][chB] ); + ELSE + tmp1 = L_negate( Mpy_32_32( abs( -Aim_fx[0][chA] ), abs( Bim_fx[0][chB] ) ) ); + test(); + test(); + test(); + IF( ( ( ( Aim_fx[1][chA] >= 0 ) && ( Bim_fx[1][chB] >= 0 ) ) || ( ( Aim_fx[1][chA] < 0 ) && ( Bim_fx[1][chB] < 0 ) ) ) ) + tmp2 = Mpy_32_32( Aim_fx[1][chA], Bim_fx[1][chB] ); + ELSE + tmp2 = L_negate( Mpy_32_32( abs( Aim_fx[1][chA] ), abs( Bim_fx[1][chB] ) ) ); // outRe_fx[chA][chB] = L_sub( outRe_fx[chA][chB], Msub_32_32( Mpy_32_32( -Aim_fx[0][chA], Bim_fx[0][chB] ), Aim_fx[1][chA], Bim_fx[1][chB] ) ); outRe_fx[chA][chB] = L_sub( outRe_fx[chA][chB], L_sub( tmp1, tmp2 ) ); move32(); - tmp1 = ( ( ( L_negate( Aim_fx[0][chA] ) >= 0 ) && ( Bre_fx[0][chB] >= 0 ) ) || ( ( L_negate( Aim_fx[0][chA] ) < 0 ) && ( Bre_fx[0][chB] < 0 ) ) ) ? Mpy_32_32( -Aim_fx[0][chA], Bre_fx[0][chB] ) : L_negate( Mpy_32_32( abs( -Aim_fx[0][chA] ), abs( Bre_fx[0][chB] ) ) ); - tmp2 = ( ( ( Aim_fx[1][chA] >= 0 ) && ( Bre_fx[1][chB] >= 0 ) ) || ( ( Aim_fx[1][chA] < 0 ) && ( Bre_fx[1][chB] < 0 ) ) ) ? Mpy_32_32( Aim_fx[1][chA], Bre_fx[1][chB] ) : L_negate( Mpy_32_32( abs( Aim_fx[1][chA] ), abs( Bre_fx[1][chB] ) ) ); + test(); + test(); + test(); + IF( ( ( ( L_negate( Aim_fx[0][chA] ) >= 0 ) && ( Bre_fx[0][chB] >= 0 ) ) || ( ( L_negate( Aim_fx[0][chA] ) < 0 ) && ( Bre_fx[0][chB] < 0 ) ) ) ) + tmp1 = Mpy_32_32( -Aim_fx[0][chA], Bre_fx[0][chB] ); + ELSE + tmp1 = L_negate( Mpy_32_32( abs( -Aim_fx[0][chA] ), abs( Bre_fx[0][chB] ) ) ); + test(); + test(); + test(); + IF( ( ( ( Aim_fx[1][chA] >= 0 ) && ( Bre_fx[1][chB] >= 0 ) ) || ( ( Aim_fx[1][chA] < 0 ) && ( Bre_fx[1][chB] < 0 ) ) ) ) + tmp2 = Mpy_32_32( Aim_fx[1][chA], Bre_fx[1][chB] ); + ELSE + tmp2 = L_negate( Mpy_32_32( abs( Aim_fx[1][chA] ), abs( Bre_fx[1][chB] ) ) ); // outIm_fx[chA][chB] = Msub_32_32( Mpy_32_32( -Aim_fx[0][chA], Bre_fx[0][chB] ), Aim_fx[1][chA], Bre_fx[1][chB] ); outIm_fx[chA][chB] = L_sub( tmp1, tmp2 ); move32(); - tmp1 = ( ( ( Are_fx[0][chA] >= 0 ) && ( Bim_fx[0][chB] >= 0 ) ) || ( ( Are_fx[0][chA] < 0 ) && ( Bim_fx[0][chB] < 0 ) ) ) ? Mpy_32_32( Are_fx[0][chA], Bim_fx[0][chB] ) : L_negate( Mpy_32_32( abs( Are_fx[0][chA] ), abs( Bim_fx[0][chB] ) ) ); - tmp2 = ( ( ( Are_fx[1][chA] >= 0 ) && ( Bim_fx[1][chB] >= 0 ) ) || ( ( Are_fx[1][chA] < 0 ) && ( Bim_fx[1][chB] < 0 ) ) ) ? Mpy_32_32( Are_fx[1][chA], Bim_fx[1][chB] ) : L_negate( Mpy_32_32( abs( Are_fx[1][chA] ), abs( Bim_fx[1][chB] ) ) ); + + test(); + test(); + test(); + IF( ( ( ( Are_fx[0][chA] >= 0 ) && ( Bim_fx[0][chB] >= 0 ) ) || ( ( Are_fx[0][chA] < 0 ) && ( Bim_fx[0][chB] < 0 ) ) ) ) + tmp1 = Mpy_32_32( Are_fx[0][chA], Bim_fx[0][chB] ); + ELSE + tmp1 = L_negate( Mpy_32_32( abs( Are_fx[0][chA] ), abs( Bim_fx[0][chB] ) ) ); + test(); + test(); + test(); + IF( ( ( ( Are_fx[1][chA] >= 0 ) && ( Bim_fx[1][chB] >= 0 ) ) || ( ( Are_fx[1][chA] < 0 ) && ( Bim_fx[1][chB] < 0 ) ) ) ) + tmp2 = Mpy_32_32( Are_fx[1][chA], Bim_fx[1][chB] ); + ELSE + tmp2 = L_negate( Mpy_32_32( abs( Are_fx[1][chA] ), abs( Bim_fx[1][chB] ) ) ); // outIm_fx[chA][chB] = L_add( outIm_fx[chA][chB], Madd_32_32( Mpy_32_32( Are_fx[0][chA], Bim_fx[0][chB] ), Are_fx[1][chA], Bim_fx[1][chB] ) ); outIm_fx[chA][chB] = L_add( outIm_fx[chA][chB], L_add( tmp1, tmp2 ) ); move32(); @@ -5187,7 +5646,8 @@ static void matrixTransp1Mul_fx( } *q_out = sub( add( q_A, q_B ), 31 ); - IF( L_and( is_zero_arr( outRe_fx[0], size ), is_zero_arr( outIm_fx[0], size ) ) ) + move16(); + if ( L_and( is_zero_arr( outRe_fx[0], size ), is_zero_arr( outIm_fx[0], size ) ) ) { *q_out = Q31; move16(); @@ -5242,43 +5702,94 @@ static void matrixTransp2Mul_fx( scale_sig32( Are_fx[0], size, min_q_shift ); scale_sig32( Aim_fx[0], size, min_q_shift ); *q_A = add( *q_A, min_q_shift ); + move16(); min_q_shift = sub( s_min( L_norm_arr( Bre_fx[0], size ), L_norm_arr( Bim_fx[0], size ) ), 1 ); scale_sig32( Bre_fx[0], size, min_q_shift ); scale_sig32( Bim_fx[0], size, min_q_shift ); *q_B = add( *q_B, min_q_shift ); + move16(); FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { FOR( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) { - tmp1 = ( Are_fx[chA][0] >= 0 && Bre_fx[chB][0] >= 0 ) || ( Are_fx[chA][0] < 0 && Bre_fx[chB][0] < 0 ) ? Mpy_32_32( Are_fx[chA][0], Bre_fx[chB][0] ) : L_negate( Mpy_32_32( abs( Are_fx[chA][0] ), abs( Bre_fx[chB][0] ) ) ); - tmp2 = ( Are_fx[chA][1] >= 0 && Bre_fx[chB][1] >= 0 ) || ( Are_fx[chA][1] < 0 && Bre_fx[chB][1] < 0 ) ? Mpy_32_32( Are_fx[chA][1], Bre_fx[chB][1] ) : L_negate( Mpy_32_32( abs( Are_fx[chA][1] ), abs( Bre_fx[chB][1] ) ) ); + test(); + test(); + test(); + IF( ( Are_fx[chA][0] >= 0 && Bre_fx[chB][0] >= 0 ) || ( Are_fx[chA][0] < 0 && Bre_fx[chB][0] < 0 ) ) + tmp1 = Mpy_32_32( Are_fx[chA][0], Bre_fx[chB][0] ); + ELSE + tmp1 = L_negate( Mpy_32_32( abs( Are_fx[chA][0] ), abs( Bre_fx[chB][0] ) ) ); + test(); + test(); + test(); + IF( ( Are_fx[chA][1] >= 0 && Bre_fx[chB][1] >= 0 ) || ( Are_fx[chA][1] < 0 && Bre_fx[chB][1] < 0 ) ) + tmp2 = Mpy_32_32( Are_fx[chA][1], Bre_fx[chB][1] ); + ELSE + tmp2 = L_negate( Mpy_32_32( abs( Are_fx[chA][1] ), abs( Bre_fx[chB][1] ) ) ); // outRe_fx[chA][chB] = Madd_32_32( Mpy_32_32( Are_fx[chA][0], Bre_fx[chB][0] ), Are_fx[chA][1], Bre_fx[chB][1] ); outRe_fx[chA][chB] = L_add( tmp1, tmp2 ); move32(); - tmp1 = ( Aim_fx[chA][0] >= 0 && L_negate( Bim_fx[chB][0] ) >= 0 ) || ( Aim_fx[chA][0] < 0 && L_negate( Bim_fx[chB][0] ) < 0 ) ? Mpy_32_32( Aim_fx[chA][0], -Bim_fx[chB][0] ) : L_negate( Mpy_32_32( abs( Aim_fx[chA][0] ), abs( -Bim_fx[chB][0] ) ) ); - tmp2 = ( Aim_fx[chA][1] >= 0 && L_negate( Bim_fx[chB][1] ) >= 0 ) || ( Aim_fx[chA][1] < 0 && L_negate( Bim_fx[chB][1] ) < 0 ) ? Mpy_32_32( Aim_fx[chA][1], -Bim_fx[chB][1] ) : L_negate( Mpy_32_32( abs( Aim_fx[chA][1] ), abs( -Bim_fx[chB][1] ) ) ); + test(); + test(); + test(); + IF( ( Aim_fx[chA][0] >= 0 && L_negate( Bim_fx[chB][0] ) >= 0 ) || ( Aim_fx[chA][0] < 0 && L_negate( Bim_fx[chB][0] ) < 0 ) ) + tmp1 = Mpy_32_32( Aim_fx[chA][0], -Bim_fx[chB][0] ); + ELSE + tmp1 = L_negate( Mpy_32_32( abs( Aim_fx[chA][0] ), abs( -Bim_fx[chB][0] ) ) ); + test(); + test(); + test(); + IF( ( Aim_fx[chA][1] >= 0 && L_negate( Bim_fx[chB][1] ) >= 0 ) || ( Aim_fx[chA][1] < 0 && L_negate( Bim_fx[chB][1] ) < 0 ) ) + tmp2 = Mpy_32_32( Aim_fx[chA][1], -Bim_fx[chB][1] ); + ELSE + tmp2 = L_negate( Mpy_32_32( abs( Aim_fx[chA][1] ), abs( -Bim_fx[chB][1] ) ) ); // outRe_fx[chA][chB] = L_sub( outRe_fx[chA][chB], Madd_32_32( Mpy_32_32( Aim_fx[chA][0], -Bim_fx[chB][0] ), Aim_fx[chA][1], -Bim_fx[chB][1] ) ); outRe_fx[chA][chB] = L_sub( outRe_fx[chA][chB], L_add( tmp1, tmp2 ) ); move32(); - tmp1 = ( Aim_fx[chA][0] >= 0 && Bre_fx[chB][0] >= 0 ) || ( Aim_fx[chA][0] < 0 && Bre_fx[chB][0] < 0 ) ? Mpy_32_32( Aim_fx[chA][0], Bre_fx[chB][0] ) : L_negate( Mpy_32_32( abs( Aim_fx[chA][0] ), abs( Bre_fx[chB][0] ) ) ); - tmp2 = ( Aim_fx[chA][1] >= 0 && Bre_fx[chB][1] >= 0 ) || ( Aim_fx[chA][1] < 0 && Bre_fx[chB][1] < 0 ) ? Mpy_32_32( Aim_fx[chA][1], Bre_fx[chB][1] ) : L_negate( Mpy_32_32( abs( Aim_fx[chA][1] ), abs( Bre_fx[chB][1] ) ) ); + test(); + test(); + test(); + IF( ( Aim_fx[chA][0] >= 0 && Bre_fx[chB][0] >= 0 ) || ( Aim_fx[chA][0] < 0 && Bre_fx[chB][0] < 0 ) ) + tmp1 = Mpy_32_32( Aim_fx[chA][0], Bre_fx[chB][0] ); + ELSE + tmp1 = L_negate( Mpy_32_32( abs( Aim_fx[chA][0] ), abs( Bre_fx[chB][0] ) ) ); + test(); + test(); + test(); + IF( ( Aim_fx[chA][1] >= 0 && Bre_fx[chB][1] >= 0 ) || ( Aim_fx[chA][1] < 0 && Bre_fx[chB][1] < 0 ) ) + tmp2 = Mpy_32_32( Aim_fx[chA][1], Bre_fx[chB][1] ); + ELSE + tmp2 = L_negate( Mpy_32_32( abs( Aim_fx[chA][1] ), abs( Bre_fx[chB][1] ) ) ); // outIm_fx[chA][chB] = Madd_32_32( Mpy_32_32( Aim_fx[chA][0], Bre_fx[chB][0] ), Aim_fx[chA][1], Bre_fx[chB][1] ); outIm_fx[chA][chB] = L_add( tmp1, tmp2 ); move32(); - tmp1 = ( Are_fx[chA][0] >= 0 && L_negate( Bim_fx[chB][0] ) >= 0 ) || ( Are_fx[chA][0] < 0 && L_negate( Bim_fx[chB][0] ) < 0 ) ? Mpy_32_32( Are_fx[chA][0], -Bim_fx[chB][0] ) : L_negate( Mpy_32_32( abs( Are_fx[chA][0] ), abs( -Bim_fx[chB][0] ) ) ); - tmp2 = ( Are_fx[chA][1] >= 0 && L_negate( Bim_fx[chB][1] ) >= 0 ) || ( Are_fx[chA][1] < 0 && L_negate( Bim_fx[chB][1] ) < 0 ) ? Mpy_32_32( Are_fx[chA][1], -Bim_fx[chB][1] ) : L_negate( Mpy_32_32( abs( Are_fx[chA][1] ), abs( -Bim_fx[chB][1] ) ) ); + test(); + test(); + test(); + IF( ( Are_fx[chA][0] >= 0 && L_negate( Bim_fx[chB][0] ) >= 0 ) || ( Are_fx[chA][0] < 0 && L_negate( Bim_fx[chB][0] ) < 0 ) ) + tmp1 = Mpy_32_32( Are_fx[chA][0], -Bim_fx[chB][0] ); + ELSE + tmp1 = L_negate( Mpy_32_32( abs( Are_fx[chA][0] ), abs( -Bim_fx[chB][0] ) ) ); + test(); + test(); + test(); + IF( ( Are_fx[chA][1] >= 0 && L_negate( Bim_fx[chB][1] ) >= 0 ) || ( Are_fx[chA][1] < 0 && L_negate( Bim_fx[chB][1] ) < 0 ) ) + tmp2 = Mpy_32_32( Are_fx[chA][1], -Bim_fx[chB][1] ); + ELSE + tmp2 = L_negate( Mpy_32_32( abs( Are_fx[chA][1] ), abs( -Bim_fx[chB][1] ) ) ); // outIm_fx[chA][chB] = L_add( outIm_fx[chA][chB], Madd_32_32( Mpy_32_32( Are_fx[chA][0], -Bim_fx[chB][0] ), Are_fx[chA][1], -Bim_fx[chB][1] ) ); outIm_fx[chA][chB] = L_add( outIm_fx[chA][chB], L_add( tmp1, tmp2 ) ); move32(); } } *q_out = sub( add( *q_A, *q_B ), 31 ); + move16(); - IF( L_and( is_zero_arr( outRe_fx[0], size ), is_zero_arr( outIm_fx[0], size ) ) ) + if ( L_and( is_zero_arr( outRe_fx[0], size ), is_zero_arr( outIm_fx[0], size ) ) ) { *q_out = Q31; move16(); @@ -5336,7 +5847,7 @@ static void chol2x2_fx( q_re1 = sub( 31, exp ); // 4611686 = 1e-12 in Q62 - IF( EQ_32( outRe[0][0], 0 ) ) + IF( outRe[0][0] == 0 ) { outRe[1][0] = BASOP_Util_Divide3232_Scale_cadence( c_re, 4611686, &exp ); move32(); @@ -5356,12 +5867,12 @@ static void chol2x2_fx( move32(); q_im = add( sub( 31, exp ), sub( q_c, q_re1 ) ); } - IF( EQ_32( outRe[1][0], 0 ) ) + if ( outRe[1][0] == 0 ) { q_re2 = Q31; move16(); } - IF( EQ_32( outIm[1][0], 0 ) ) + if ( outIm[1][0] == 0 ) { q_im = Q31; move16(); @@ -5371,7 +5882,7 @@ static void chol2x2_fx( q_tmp = sub( add( q_c, q_c ), 31 ); // 4611686 = Q62 - IF( EQ_32( e1, 0 ) ) + IF( e1 == 0 ) { temp = BASOP_Util_Divide3232_Scale_cadence( temp, 4611686, &exp ); q_tmp = add( sub( 31, exp ), sub( q_tmp, 62 ) ); @@ -5381,7 +5892,7 @@ static void chol2x2_fx( temp = BASOP_Util_Divide3232_Scale_cadence( temp, e1, &exp ); q_tmp = add( sub( 31, exp ), sub( q_tmp, q_e ) ); } - IF( EQ_32( temp, 0 ) ) + if ( temp == 0 ) { q_tmp = Q31; move16(); @@ -5421,7 +5932,7 @@ static void chol2x2_fx( q_re1 = sub( 31, exp ); // 4611686 = Q62 - IF( EQ_32( outRe[1][1], 0 ) ) + IF( outRe[1][1] == 0 ) { outRe[0][1] = BASOP_Util_Divide3232_Scale_cadence( c_re, 4611686, &exp ); move32(); @@ -5441,12 +5952,12 @@ static void chol2x2_fx( move32(); q_im = add( sub( 31, exp ), sub( q_c, q_re1 ) ); } - IF( EQ_32( outRe[0][1], 0 ) ) + if ( outRe[0][1] == 0 ) { q_re2 = Q31; move16(); } - IF( EQ_32( outIm[0][1], 0 ) ) + if ( outIm[0][1] == 0 ) { q_im = Q31; move16(); @@ -5456,7 +5967,7 @@ static void chol2x2_fx( q_tmp = sub( add( q_c, q_c ), 31 ); // 4611686 = 1e-12 in Q62 - IF( EQ_32( e2, 0 ) ) + IF( e2 == 0 ) { temp = BASOP_Util_Divide3232_Scale_cadence( temp, 4611686, &exp ); q_tmp = add( sub( 31, exp ), sub( q_tmp, 62 ) ); @@ -5466,7 +5977,7 @@ static void chol2x2_fx( temp = BASOP_Util_Divide3232_Scale_cadence( temp, e2, &exp ); q_tmp = add( sub( 31, exp ), sub( q_tmp, q_e ) ); } - IF( EQ_32( temp, 0 ) ) + if ( temp == 0 ) { q_tmp = Q31; move16(); @@ -5489,6 +6000,7 @@ static void chol2x2_fx( q_re3 = sub( 31, exp ); *q_out = s_min( s_min( q_re1, q_re2 ), s_min( q_re3, q_im ) ); + move16(); outRe[1][1] = L_shr( outRe[1][1], sub( q_re1, *q_out ) ); move32(); outRe[0][1] = L_shr( outRe[0][1], sub( q_re2, *q_out ) ); @@ -5747,10 +6259,10 @@ static void formulate2x2MixingMatrix_fx( Word32 temp; Word16 q_Pre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], q_Pim[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; Word16 hdrm_re[BINAURAL_CHANNELS][BINAURAL_CHANNELS], hdrm_im[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; - set_s( hdrm_re[0], 63, i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ); - set_s( hdrm_im[0], 63, i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ); - set_s( q_Pre[0], Q31, i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ); - set_s( q_Pim[0], Q31, i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ); + set16_fx( hdrm_re[0], 63, i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ); + set16_fx( hdrm_im[0], 63, i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ); + set16_fx( q_Pre[0], Q31, i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ); + set16_fx( q_Pim[0], Q31, i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ); q_ky = 0; move16(); @@ -5799,7 +6311,7 @@ static void formulate2x2MixingMatrix_fx( } // 4611686 = Q62 - IF( EQ_32( maxEne_fx, 0 ) ) + IF( maxEne_fx == 0 ) { maxEneDiv_fx = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, 4611686, &exp ); // 4611686 = 1e-12f in Q62 q_maxEneDiv = add( sub( 31, exp ), sub( Q30, 62 ) ); @@ -5853,12 +6365,14 @@ static void formulate2x2MixingMatrix_fx( /* Regularize the diagonal Sx for matrix inversion */ Sx_fx[0] = L_max( L_shr( Sx_fx[0], 1 ), Mpy_32_16_1( Sx_fx[1], regularizationFactor_fx ) ); Sx_fx[1] = L_max( L_shr( Sx_fx[1], 1 ), L_shl( Mpy_32_16_1( Sx_fx[0], regularizationFactor_fx ), 1 ) ); + move32(); + move32(); q_Sx = sub( add( q_Sx, Q14 ), 15 ); temp = Mpy_32_32( E_in2, 2147484 ); // 2147484 = 0.001f in Q31 temp = L_max( temp, E_in1 ); - IF( EQ_32( temp, 0 ) ) + IF( temp == 0 ) { BASOP_Util_Divide3232_Scale_cadence( E_out1, 4611686, &exp ); // 4611686 = Q62 exp = sub( exp, sub( q_eout, 62 ) ); @@ -5875,7 +6389,7 @@ static void formulate2x2MixingMatrix_fx( temp = Mpy_32_32( E_in1, 2147484 ); // 2147484 = 0.001f in Q31 temp = L_max( temp, E_in2 ); - IF( EQ_32( temp, 0 ) ) + IF( temp == 0 ) { BASOP_Util_Divide3232_Scale_cadence( E_out2, 4611686, &exp1 ); // 4611686 = Q62 exp1 = sub( exp1, sub( q_eout, 62 ) ); @@ -5902,6 +6416,8 @@ static void formulate2x2MixingMatrix_fx( { GhatQ_fx[chA][0] = Mpy_32_32( Q_fx[chA][0], Ghat_fx[chA] ); GhatQ_fx[chA][1] = Mpy_32_32( Q_fx[chA][1], Ghat_fx[chA] ); + move32(); + move32(); } q_GhatQ = sub( add( Q31, q_Ghat ), 31 ); @@ -5916,6 +6432,8 @@ static void formulate2x2MixingMatrix_fx( { tmpRe_fx[chA][chB] = Madd_32_32( Mpy_32_32( KyRe_fx[0][chA], GhatQ_fx[0][chB] ), KyRe_fx[1][chA], GhatQ_fx[1][chB] ); tmpIm_fx[chA][chB] = Msub_32_32( Mpy_32_32( -KyIm_fx[0][chA], GhatQ_fx[0][chB] ), KyIm_fx[1][chA], GhatQ_fx[1][chB] ); + move32(); + move32(); } } @@ -5930,7 +6448,7 @@ static void formulate2x2MixingMatrix_fx( eig2x2_fx( tmpRe_fx[0][0], tmpRe_fx[1][1], q_temp, tmpRe_fx[1][0], tmpIm_fx[1][0], q_temp, Ure_fx, Uim_fx, &q_U, D_fx, &q_D ); - IF( EQ_32( D_fx[0], 0 ) ) + IF( D_fx[0] == 0 ) { temp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, 4611686, &exp ); // 4611686 = 1e-12 in Q62 exp = sub( exp, sub( Q30, 62 ) ); @@ -5943,7 +6461,7 @@ static void formulate2x2MixingMatrix_fx( div_fx[0] = Sqrt32( temp, &exp ); move32(); - IF( EQ_32( D_fx[1], 0 ) ) + IF( D_fx[1] == 0 ) { temp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, 4611686, &exp1 ); // 4611686 = 1e-12 in Q62 exp1 = sub( exp1, sub( Q30, 62 ) ); @@ -5994,13 +6512,15 @@ static void formulate2x2MixingMatrix_fx( Word64 W_tmp; W_tmp = W_mult0_32_32( tmpRe_fx[chA][chB], div_fx[chB] ); - IF( NE_64( W_tmp, 0 ) ) + IF( W_tmp != 0 ) { hdrm_re[chA][chB] = sub( W_norm( W_tmp ), 0 ); + move16(); W_tmp = W_shl( W_tmp, hdrm_re[chA][chB] ); tmpRe_fx[chA][chB] = W_extract_h( W_tmp ); move32(); hdrm_re[chA][chB] = sub( add( add( q_temp, q_div ), hdrm_re[chA][chB] ), 32 ); + move16(); } ELSE { @@ -6009,13 +6529,15 @@ static void formulate2x2MixingMatrix_fx( } W_tmp = W_mult0_32_32( tmpIm_fx[chA][chB], div_fx[chB] ); - IF( NE_64( W_tmp, 0 ) ) + IF( W_tmp != 0 ) { hdrm_im[chA][chB] = sub( W_norm( W_tmp ), 0 ); + move16(); W_tmp = W_shl( W_tmp, hdrm_im[chA][chB] ); tmpIm_fx[chA][chB] = W_extract_h( W_tmp ); move32(); hdrm_im[chA][chB] = sub( add( add( q_temp, q_div ), hdrm_im[chA][chB] ), 32 ); + move16(); } ELSE { @@ -6027,6 +6549,7 @@ static void formulate2x2MixingMatrix_fx( minimum_s( hdrm_re[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), &exp ); q_temp = exp; + move16(); minimum_s( hdrm_im[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), &exp ); q_temp = s_min( q_temp, exp ); @@ -6036,6 +6559,8 @@ static void formulate2x2MixingMatrix_fx( { tmpRe_fx[chA][chB] = L_shr( tmpRe_fx[chA][chB], sub( hdrm_re[chA][chB], q_temp ) ); tmpIm_fx[chA][chB] = L_shr( tmpIm_fx[chA][chB], sub( hdrm_im[chA][chB], q_temp ) ); + move32(); + move32(); } } @@ -6046,7 +6571,7 @@ static void formulate2x2MixingMatrix_fx( { FOR( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) { - IF( EQ_32( Sx_fx[chB], 0 ) ) + IF( Sx_fx[chB] == 0 ) { Pre_fx[chA][chB] = BASOP_Util_Divide3232_Scale_cadence( Pre_fx[chA][chB], 4611686, &exp ); // 4611686 = 1e-12 in Q62 q_Pre[chA][chB] = add( sub( q_P, 62 ), sub( 31, exp ) ); @@ -6062,6 +6587,10 @@ static void formulate2x2MixingMatrix_fx( Pim_fx[chA][chB] = BASOP_Util_Divide3232_Scale_cadence( Pim_fx[chA][chB], temp, &exp ); q_Pim[chA][chB] = add( sub( q_P, sub( 31, exp_temp ) ), sub( 31, exp ) ); } + move32(); + move32(); + move16(); + move16(); } } minimum_s( q_Pre[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), &exp ); @@ -6075,6 +6604,8 @@ static void formulate2x2MixingMatrix_fx( { Pre_fx[chA][chB] = L_shr( Pre_fx[chA][chB], sub( q_Pre[chA][chB], q_P ) ); Pim_fx[chA][chB] = L_shr( Pim_fx[chA][chB], sub( q_Pim[chA][chB], q_P ) ); + move32(); + move32(); } } @@ -6105,6 +6636,7 @@ static void getDirectPartGains_fx( Word32 y, mappedX; Word16 aziRadMapped, A, A2, A3; const Word16 LsAngleRad = 17157; // Q15 + move16(); Word32 *ptr_sin, *ptr_cos; Word32 sin_val, cos_val; Word16 e_mappedX; @@ -6127,6 +6659,7 @@ static void getDirectPartGains_fx( { cos_val = ptr_cos[abs_s( eleDeg )]; // Q31 } + move32(); IF( GT_16( aziDeg, 180 ) ) { @@ -6142,9 +6675,11 @@ static void getDirectPartGains_fx( { sin_val = ptr_sin[aziDeg]; // Q31 } + move32(); y = Mpy_32_32( sin_val, cos_val ); // Q31 e_mappedX = 0; + move16(); mappedX = Sqrt32( L_max( 0, L_sub( ONE_IN_Q31, Mpy_32_32( y, y ) ) ), &e_mappedX ); aziRadMapped = BASOP_util_atan2( y, mappedX, negate( e_mappedX ) ); // Q13 @@ -6152,46 +6687,60 @@ static void getDirectPartGains_fx( /* Determine the real valued amplitude panning gains */ *lImagp = 0; *rImagp = 0; + move32(); + move32(); IF( GE_16( aziRadMapped, shr( LsAngleRad, 2 ) ) ) { /* Left side */ *lRealp = ONE_IN_Q31; *rRealp = 0; + move32(); + move32(); } ELSE IF( LE_16( aziRadMapped, negate( shr( LsAngleRad, 2 ) ) ) ) { /* Right side */ *lRealp = 0; *rRealp = ONE_IN_Q31; + move32(); + move32(); } ELSE /* Tangent panning law */ { Word16 e_div, div, e_a, e_a3, temp_16_1, temp_16_2, e_num, e_den; div = BASOP_Util_Divide3232_Scale( y, mappedX, &e_div ); - e_div = e_div - e_mappedX; + e_div = sub( e_div, e_mappedX ); A = mult( div, INV_TAN30_FX ); - e_a = e_div + 1; + e_a = add( e_div, 1 ); e_num = BASOP_Util_Add_MantExp( A, e_a, -32767, 0, &temp_16_1 ); e_den = BASOP_Util_Add_MantExp( A, e_a, 32767, 0, &temp_16_2 ); - IF( LE_16( temp_16_2, 0 ) ) + IF( temp_16_2 <= 0 ) { temp_16_2 = 32; e_den = 0; + move16(); + move16(); } A2 = BASOP_Util_Divide1616_Scale( temp_16_1, temp_16_2, &e_div ); - e_div = e_div + sub( e_num, e_den ); + e_div = add( e_div, sub( e_num, e_den ) ); e_den = BASOP_Util_Add_MantExp( mult( A2, A2 ), add( e_div, e_div ), 32767, 0, &temp_16_2 ); A3 = BASOP_Util_Divide1616_Scale( 32767, temp_16_2, &e_a3 ); - e_a3 = e_a3 - e_den; + e_a3 = sub( e_a3, e_den ); // A3 = 1.0f / ( A2 * A2 + 1.0f ); // Q15 Word32 temp_32 = L_shr( L_deposit_h( A3 ), sub( 0, e_a3 ) ); Word16 temp_e = 0; e_a3 = 0; + move16(); + move16(); *lRealp = Sqrt32( temp_32, &e_a3 ); *rRealp = Sqrt32( L_sub( ONE_IN_Q31, temp_32 ), &temp_e ); *lRealp = L_shr( *lRealp, sub( 0, e_a3 ) ); // Q31 *rRealp = L_shr( *rRealp, sub( 0, temp_e ) ); // Q31 + move32(); + move32(); + move32(); + move32(); } /* Scaling to have the same expected gain as for the HRTF rendering */ @@ -6200,9 +6749,14 @@ static void getDirectPartGains_fx( *lRealp = L_shr( *lRealp, 2 ); // Q28 *rRealp = L_shr( *rRealp, 2 ); // Q28 + move32(); + move32(); + move32(); + move32(); } ELSE /* In regular binaural rendering mode */ { + test(); IF( EQ_16( aziDeg, gainCache->azi ) && EQ_16( eleDeg, gainCache->ele ) ) { hrtfShGetHrtf_fx( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, TRUE ); @@ -6211,6 +6765,8 @@ static void getDirectPartGains_fx( { gainCache->azi = aziDeg; gainCache->ele = eleDeg; + move16(); + move16(); IF( isHeadtracked ) { // Word32 aziDeg_32, eleDeg_32; @@ -6318,6 +6874,10 @@ static void hrtfShGetHrtf_fx( *lImagp = 0; *rRealp = 0; *rImagp = 0; + move32(); + move32(); + move32(); + move32(); IF( useCachedValue ) { @@ -6331,6 +6891,10 @@ static void hrtfShGetHrtf_fx( *lImagp = L_add( *lImagp, Mpy_32_16_1( shVec[k], hrtfShCoeffsIm_fx[0][k][bin] ) ); // Q28 *rRealp = L_add( *rRealp, L_shr( Mpy_32_16_1( shVec[k], hrtfShCoeffsRe_fx[1][k][bin] ), 1 ) ); // Q28 *rImagp = L_add( *rImagp, Mpy_32_16_1( shVec[k], hrtfShCoeffsIm_fx[1][k][bin] ) ); // Q28 + move32(); + move32(); + move32(); + move32(); } } ELSE @@ -6353,6 +6917,11 @@ static void hrtfShGetHrtf_fx( *rImagp = L_add( *rImagp, Mpy_32_16_1( shVec[k], hrtfShCoeffsIm_fx[1][k][bin] ) ); // Q28 gainCache->shVec_fx[k] = shVec[k]; // Q29 + move32(); + move32(); + move32(); + move32(); + move32(); } } @@ -6583,7 +7152,9 @@ void ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( hSpatParamRendCom = st_ivas->hSpatParamRendCom; hMasaIsmData = st_ivas->hMasaIsmData; - IF( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_FOA || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA2 || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_HOA3 ) + test(); + test(); + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_HOA2 ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_HOA3 ) ) { enableCentering = 0; move16(); @@ -6595,17 +7166,17 @@ void ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( } /* Bypass processing until first object is moved */ - IF( EQ_16( hMasaIsmData->objectsMoved, 0 ) ) + IF( hMasaIsmData->objectsMoved == 0 ) { FOR( ismDirIndex = 0; ismDirIndex < hSpatParamRendCom->numIsmDirections; ismDirIndex++ ) { - IF( hMasaIsmData->ism_is_edited[ismDirIndex] ) + if ( hMasaIsmData->ism_is_edited[ismDirIndex] ) { hMasaIsmData->objectsMoved = 1; move16(); } } - IF( EQ_16( hMasaIsmData->objectsMoved, 0 ) ) + IF( hMasaIsmData->objectsMoved == 0 ) { /* No objects have moved so far */ return; @@ -6633,21 +7204,21 @@ void ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( Word16 eneMove_q_fx[2], enePreserve_q_fx[2], temp1; Word32 temp; - set_s( ismPreprocMtxNew_fx[0], 0, 2 ); - set_s( ismPreprocMtxNew_fx[1], 0, 2 ); - set_s( ismPreprocMtxIncrement_fx[0], 0, 2 ); - set_s( ismPreprocMtxIncrement_fx[1], 0, 2 ); - set_s( eneMove_fx, 0, 2 ); - set_s( enePreserve_fx, 0, 2 ); + set16_fx( ismPreprocMtxNew_fx[0], 0, 2 ); + set16_fx( ismPreprocMtxNew_fx[1], 0, 2 ); + set16_fx( ismPreprocMtxIncrement_fx[0], 0, 2 ); + set16_fx( ismPreprocMtxIncrement_fx[1], 0, 2 ); + set16_fx( eneMove_fx, 0, 2 ); + set16_fx( enePreserve_fx, 0, 2 ); ismRatioAcc_fx = 0; move16(); subframeEne_fx = 0; move32(); - set_s( normEnes_fx, 0, 2 ); - set_l( Enes_fx, 0, 2 ); - set_s( normEnes_q_fx, Q31, 2 ); - set_s( eneMove_q_fx, Q31, 2 ); - set_s( enePreserve_q_fx, Q31, 2 ); + set16_fx( normEnes_fx, 0, 2 ); + set32_fx( Enes_fx, 0, 2 ); + set16_fx( normEnes_q_fx, Q31, 2 ); + set16_fx( eneMove_q_fx, Q31, 2 ); + set16_fx( enePreserve_q_fx, Q31, 2 ); /* Determine transport normalized energies and subframe energy */ FOR( slot = 0; slot < nSlots; slot++ ) @@ -6662,7 +7233,7 @@ void ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( subframeEne_fx = L_add( Enes_fx[0], Enes_fx[1] ); - IF( NE_32( subframeEne_fx, 0 ) ) + IF( subframeEne_fx != 0 ) { normEnes_fx[0] = BASOP_Util_Divide3232_Scale( Enes_fx[0], subframeEne_fx, &temp_q ); move32(); @@ -6699,7 +7270,6 @@ void ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( ratio = extract_l( hMasaIsmData->energy_ratio_ism_fx[ismDirIndex][dirac_read_idx][bin] ); // Q14 ismRatioAcc_fx = add( ismRatioAcc_fx, ratio ); - move16(); /* Get input and output panning gains */ ivas_get_stereo_panning_gains_fx( hMasaIsmData->azimuth_ism[ismDirIndex][dirac_read_idx], @@ -6763,7 +7333,7 @@ void ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( } /* Any remaining (non-object) energy is set to be preserved at both channels */ - remainderNormEne_fx = s_max( 0, sub( sub( shr( sub( ONE_IN_Q14, ismRatioAcc_fx ), sub( Q14, Q12 ) ), normEnes_fx[0] ), normEnes_fx[1] ) ); // Q12 + remainderNormEne_fx = s_max( 0, sub( sub( shr( sub( ONE_IN_Q14, ismRatioAcc_fx ), Q14 - Q12 ), normEnes_fx[0] ), normEnes_fx[1] ) ); // Q12 FOR( ch = 0; ch < 2; ch++ ) { @@ -6788,7 +7358,7 @@ void ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( move32(); normVal_fx = L_add( hMasaIsmData->eneMoveIIR_fx[ch][bin], hMasaIsmData->enePreserveIIR_fx[ch][bin] ); - IF( NE_32( normVal_fx, 0 ) ) + IF( normVal_fx != 0 ) { temp1 = BASOP_Util_Divide3232_Scale( hMasaIsmData->enePreserveIIR_fx[ch][bin], normVal_fx, &temp_q ); @@ -6827,6 +7397,8 @@ void ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( { Word16 eqVal_fx = 0; Word16 eqVal_q_fx = 0; + move16(); + move16(); Word32 outSlotRe_fx[2]; Word32 outSlotIm_fx[2]; @@ -6860,7 +7432,8 @@ void ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( } temp1 = BASOP_Util_Divide3232_Scale( hMasaIsmData->preprocEneTarget_fx[bin], L_max( EPSILON_FX, hMasaIsmData->preprocEneRealized_fx[bin] ), &eqVal_q_fx ); eqVal_fx = Sqrt16( temp1, &eqVal_q_fx ); - temp1 = shl( 4, Q12 ); + temp1 = 4 << Q12; + move16(); IF( LT_16( eqVal_q_fx, Q12 ) ) { IF( GT_16( eqVal_fx, shr( temp1, sub( Q12, eqVal_q_fx ) ) ) ) @@ -6873,7 +7446,7 @@ void ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( } ELSE { - IF( GT_16( shr( eqVal_fx, sub( eqVal_q_fx, Q12 ) ), temp1 ) ) + if ( GT_16( shr( eqVal_fx, sub( eqVal_q_fx, Q12 ) ), temp1 ) ) { eqVal_fx = temp1; move16(); @@ -6888,6 +7461,7 @@ void ivas_omasa_preProcessStereoTransportsForMovedObjects_fx( move32(); } *cldfb_buf_q = sub( add( *cldfb_buf_q, eqVal_q_fx ), 15 ); + move16(); } } @@ -7281,7 +7855,9 @@ static void ivas_masa_ext_rend_parambin_internal( config_data.separateCenterChannelRendering = 0; move16(); config_data.ivas_format = MASA_FORMAT; + move32(); config_data.mc_mode = MC_MODE_NONE; + move32(); config_data.ivas_total_brate = IVAS_512k; /* Maximum bitrate set for external renderer */ move32(); config_data.nchan_transport = hMasaExtRend->nchan_input; @@ -7291,6 +7867,7 @@ static void ivas_masa_ext_rend_parambin_internal( config_data.processReverb = hMasaExtRend->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ? 1 : 0; move16(); config_data.ism_mode = ISM_MODE_NONE; + move32(); /* Set nchan_transport to number of transport channels in MASA input */ nchan_transport = hMasaExtRend->nchan_input; @@ -7328,7 +7905,8 @@ static void ivas_masa_ext_rend_parambin_internal( { FOR( ch = 0; ch < numInChannels; ch++ ) { - IF( EQ_16( ch, 0 ) || EQ_16( nchan_transport, 2 ) ) + test(); + IF( ch == 0 || EQ_16( nchan_transport, 2 ) ) { cldfbAnalysis_ts_fx_fixed_q( &( output_fx[ch][nBins * slot] ), @@ -7356,6 +7934,7 @@ static void ivas_masa_ext_rend_parambin_internal( FOR( j = 0; j < 3; j++ ) { Rmat_fx[i][j] = hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx][i][j]; // Q30// + move32(); } } @@ -7367,6 +7946,7 @@ static void ivas_masa_ext_rend_parambin_internal( } Word16 shift = 31; + move16(); Word32 Cldfb_RealBuffer_inTmp_fx[2][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Cldfb_ImagBuffer_inTmp_fx[2][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; FOR( i = 0; i < 2; i++ ) { @@ -7377,7 +7957,7 @@ static void ivas_masa_ext_rend_parambin_internal( } } - Word16 q = q_inp + shift; + Word16 q = add( q_inp, shift ); FOR( i = 0; i < 2; i++ ) { @@ -7387,6 +7967,8 @@ static void ivas_masa_ext_rend_parambin_internal( { Cldfb_RealBuffer_inTmp_fx[i][j][k] = L_shl( Cldfb_RealBuffer_in_fx[i][j][k], shift ); Cldfb_ImagBuffer_inTmp_fx[i][j][k] = L_shl( Cldfb_ImagBuffer_in_fx[i][j][k], shift ); + move32(); + move32(); } } } @@ -7404,6 +7986,7 @@ static void ivas_masa_ext_rend_parambin_internal( #if 1 Word16 q_out; q_inp = Q6; + move16(); FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { output_fx[ch] = output_fx_buff[ch]; @@ -7411,10 +7994,12 @@ static void ivas_masa_ext_rend_parambin_internal( FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { hMasaExtRend->cldfbSynRend[ch]->Q_cldfb_state = Q11; + move16(); } #endif // Float to fix ends q_mat = hDiracDecBin->q_processMtx; + move16(); q_mat = s_min( q_mat, hDiracDecBin->q_processMtxPrev ); q_mat = s_min( q_mat, hDiracDecBin->q_processMtxDec ); q_mat = s_min( q_mat, hDiracDecBin->q_processMtxDecPrev ); @@ -7443,6 +8028,10 @@ static void ivas_masa_ext_rend_parambin_internal( hDiracDecBin->q_processMtxPrev = q_mat; hDiracDecBin->q_processMtxDec = q_mat; hDiracDecBin->q_processMtxDecPrev = q_mat; + move16(); + move16(); + move16(); + move16(); ivas_dirac_dec_binaural_process_output_fx( hDiracDecBin, hSpatParamRendCom, hMasaExtRend->cldfbSynRend, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, max_band_decorr, numInChannels, config_data.processReverb, subframe, q_mat ); @@ -7451,6 +8040,8 @@ static void ivas_masa_ext_rend_parambin_internal( hSpatParamRendCom->slots_rendered = add( hSpatParamRendCom->slots_rendered, hSpatParamRendCom->subframe_nbslots[subframe] ); hSpatParamRendCom->subframes_rendered = add( hSpatParamRendCom->subframes_rendered, 1 ); + move16(); + move16(); #if 1 // Fix to float FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) diff --git a/lib_rend/ivas_dirac_decorr_dec.c b/lib_rend/ivas_dirac_decorr_dec.c index 2e952223d..499573ec4 100644 --- a/lib_rend/ivas_dirac_decorr_dec.c +++ b/lib_rend/ivas_dirac_decorr_dec.c @@ -338,11 +338,12 @@ ivas_error ivas_dirac_dec_decorr_open_fx( const Word32 output_Fs /* i : output sampling rate */ ) { - int16_t k, l, m, n; - int16_t split_band_index_start; - int16_t k_in, k_out, num_bands, band_table_idx, buffer_size_decorr; - int16_t split_frequencies_bands[DIRAC_DECORR_NUM_SPLIT_BANDS + 1] = { 0, 0, 0, 23768 }; - int16_t *split_freq_ptr; + Word16 k, l, m, n; + Word16 split_band_index_start; + Word16 k_in, k_out, num_bands, band_table_idx, buffer_size_decorr; + Word16 split_frequencies_bands[DIRAC_DECORR_NUM_SPLIT_BANDS + 1] = { 0, 0, 0, 23768 }; + move16(); + Word16 *split_freq_ptr; Word16 cur_lattice_delta_phi_fx, lattice_coeffs_fx[2 * DIRAC_MAX_DECORR_FILTER_LEN]; ivas_error error; @@ -373,7 +374,7 @@ ivas_error ivas_dirac_dec_decorr_open_fx( assert( ( num_freq_bands > 0 ) && "Error: Number of frequency bands <= 0!" ); - IF( EQ_16( synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) + if ( EQ_16( synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { num_outputs_diff = sub( num_outputs_diff, nchan_transport ); } @@ -394,7 +395,7 @@ ivas_error ivas_dirac_dec_decorr_open_fx( } ELSE { - freq_domain_decorr_ap_params->max_frequency = ( min( num_freq_bands, DIRAC_MAX_DECORR_CLDFB_BANDS_AMBI ) * 24000 ) / CLDFB_NO_CHANNELS_MAX; + freq_domain_decorr_ap_params->max_frequency = imult1616( s_min( num_freq_bands, DIRAC_MAX_DECORR_CLDFB_BANDS_AMBI ), 400 ); /*24000 / 60=400*/ } } ELSE IF( EQ_16( synthesisConf, DIRAC_SYNTHESIS_COV_MC_LS ) ) @@ -409,8 +410,11 @@ ivas_error ivas_dirac_dec_decorr_open_fx( freq_domain_decorr_ap_params->add_back_onsets_on = 1; freq_domain_decorr_ap_params->max_frequency = ( DIRAC_MAX_DECORR_CLDFB_BANDS * 24000 ) / CLDFB_NO_CHANNELS_MAX; } + move16(); + move16(); freq_domain_decorr_ap_params->use_ducker = 1; + move16(); assert( ( freq_domain_decorr_ap_params->max_frequency >= 0 ) && ( freq_domain_decorr_ap_params->max_frequency <= output_Fs / 2 ) && "Error: max_frequency invalid!" ); @@ -419,8 +423,9 @@ ivas_error ivas_dirac_dec_decorr_open_fx( FOR( k = num_freq_bands - 1; k > 0; --k ) { freq_domain_decorr_ap_params->max_band_decorr = add( k, 1 ); /* outside "if" to avoid uninitialized variable */ + move16(); - IF( frequency_axis[k] < freq_domain_decorr_ap_params->max_frequency ) + IF( LT_16( frequency_axis[k], freq_domain_decorr_ap_params->max_frequency ) ) { BREAK; } @@ -431,7 +436,7 @@ ivas_error ivas_dirac_dec_decorr_open_fx( *-----------------------------------------------------------------*/ /* open onset detection module */ - IF( synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + IF( EQ_32( synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { /*Onset detector up to Nyquist and not only up to max_band_decorr*/ IF( ( error = ivas_dirac_dec_onset_detection_open_fx( num_protos_diff, num_freq_bands, num_freq_bands, &freq_domain_decorr_ap_params->h_onset_detection_power_params, &freq_domain_decorr_ap_state->h_onset_detection_power_state ) ) != IVAS_ERR_OK ) @@ -454,24 +459,32 @@ ivas_error ivas_dirac_dec_decorr_open_fx( /* calculate decorrelation split bands */ split_freq_ptr = &split_frequencies_bands[0]; split_freq_ptr[0] = 0; + move16(); Word16 temp = 0; + move16(); FOR( k = 1; k < DIRAC_DECORR_NUM_SPLIT_BANDS; k++ ) { temp = mult( CLDFB_NO_CHANNELS_MAX_FX, ap_split_frequencies_fx[k] ); // Q8 - temp = add( temp, (Word16) floatToFixed( 0.5, Q8 ) ); + temp = add( temp, ONE_IN_Q7 /*0.5 Q8*/ ); split_freq_ptr[k] = sub( temp, ONE_IN_Q8 ); + move16(); } split_band_index_start = 0; + move16(); split_frequencies_bands[k] = 0; + move16(); freq_domain_decorr_ap_params->num_split_frequency_bands = 0; + move16(); FOR( k = 1; k < DIRAC_DECORR_NUM_SPLIT_BANDS + 1; k++ ) { - freq_domain_decorr_ap_params->num_split_frequency_bands++; + freq_domain_decorr_ap_params->num_split_frequency_bands = add( freq_domain_decorr_ap_params->num_split_frequency_bands, 1 ); + move16(); IF( GE_16( split_frequencies_bands[k], shl( freq_domain_decorr_ap_params->max_band_decorr, Q8 ) ) ) { split_frequencies_bands[k] = shl( freq_domain_decorr_ap_params->max_band_decorr, Q8 ); + move16(); break; } } @@ -480,6 +493,7 @@ ivas_error ivas_dirac_dec_decorr_open_fx( FOR( k = 1; k < DIRAC_DECORR_NUM_SPLIT_BANDS; k++ ) { split_frequencies_bands[k] = shr( split_frequencies_bands[k], Q8 ); + move16(); } IF( ( freq_domain_decorr_ap_params->split_frequency_bands = (Word16 *) malloc( sizeof( Word16 ) * ( add( freq_domain_decorr_ap_params->num_split_frequency_bands, 1 ) ) ) ) == NULL ) @@ -503,41 +517,42 @@ ivas_error ivas_dirac_dec_decorr_open_fx( IF( num_outputs_diff > 0 ) { - buffer_size_decorr = ( ap_pre_delay[split_band_index_start] + ap_filter_length[split_band_index_start] ); - IF( ( freq_domain_decorr_ap_state->decorr_buffer_fx = (Word32 *) malloc( sizeof( Word32 ) * 2 * buffer_size_decorr * num_outputs_diff * freq_domain_decorr_ap_params->max_band_decorr ) ) == NULL ) + buffer_size_decorr = add( ap_pre_delay[split_band_index_start], ap_filter_length[split_band_index_start] ); + IF( ( freq_domain_decorr_ap_state->decorr_buffer_fx = (Word32 *) malloc( sizeof( Word32 ) * shl( imult1616( buffer_size_decorr, imult1616( num_outputs_diff, freq_domain_decorr_ap_params->max_band_decorr ) ), 1 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); } - freq_domain_decorr_ap_state->decorr_buffer_len = 2 * buffer_size_decorr * num_outputs_diff * freq_domain_decorr_ap_params->max_band_decorr; - set32_fx( freq_domain_decorr_ap_state->decorr_buffer_fx, 0, 2 * buffer_size_decorr * num_outputs_diff * freq_domain_decorr_ap_params->max_band_decorr ); + freq_domain_decorr_ap_state->decorr_buffer_len = imult1616( 2, imult1616( buffer_size_decorr, imult1616( num_outputs_diff, freq_domain_decorr_ap_params->max_band_decorr ) ) ); + set32_fx( freq_domain_decorr_ap_state->decorr_buffer_fx, 0, imult1616( 2, imult1616( buffer_size_decorr, imult1616( num_outputs_diff, freq_domain_decorr_ap_params->max_band_decorr ) ) ) ); freq_domain_decorr_ap_state->q_decorr_buffer = Q31; + move16(); - IF( ( freq_domain_decorr_ap_params->filter_coeff_num_real_fx = (Word16 *) malloc( sizeof( Word16 ) * ( ap_filter_length[split_band_index_start] + 1 ) * freq_domain_decorr_ap_params->max_band_decorr * num_outputs_diff ) ) == NULL ) + IF( ( freq_domain_decorr_ap_params->filter_coeff_num_real_fx = (Word16 *) malloc( sizeof( Word16 ) * imult1616( add( ap_filter_length[split_band_index_start], 1 ), imult1616( freq_domain_decorr_ap_params->max_band_decorr, num_outputs_diff ) ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); } - IF( ( freq_domain_decorr_ap_params->filter_coeff_den_real_fx = (Word16 *) malloc( sizeof( Word16 ) * ( ap_filter_length[split_band_index_start] + 1 ) * freq_domain_decorr_ap_params->max_band_decorr * num_outputs_diff ) ) == NULL ) + IF( ( freq_domain_decorr_ap_params->filter_coeff_den_real_fx = (Word16 *) malloc( sizeof( Word16 ) * imult1616( add( ap_filter_length[split_band_index_start], 1 ), imult1616( freq_domain_decorr_ap_params->max_band_decorr, num_outputs_diff ) ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); } - IF( ( freq_domain_decorr_ap_params->phase_coeff_real_fx = (Word16 *) malloc( sizeof( Word16 ) * freq_domain_decorr_ap_params->max_band_decorr * num_outputs_diff ) ) == NULL ) + IF( ( freq_domain_decorr_ap_params->phase_coeff_real_fx = (Word16 *) malloc( sizeof( Word16 ) * imult1616( freq_domain_decorr_ap_params->max_band_decorr, num_outputs_diff ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); } - IF( ( freq_domain_decorr_ap_params->phase_coeff_imag_fx = (Word16 *) malloc( sizeof( Word16 ) * freq_domain_decorr_ap_params->max_band_decorr * num_outputs_diff ) ) == NULL ) + IF( ( freq_domain_decorr_ap_params->phase_coeff_imag_fx = (Word16 *) malloc( sizeof( Word16 ) * imult1616( freq_domain_decorr_ap_params->max_band_decorr, num_outputs_diff ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); } - IF( ( freq_domain_decorr_ap_state->direct_energy_smooth_fx = (Word32 *) malloc( sizeof( Word32 ) * freq_domain_decorr_ap_params->max_band_decorr * num_outputs_diff ) ) == NULL ) + IF( ( freq_domain_decorr_ap_state->direct_energy_smooth_fx = (Word32 *) malloc( sizeof( Word32 ) * imult1616( freq_domain_decorr_ap_params->max_band_decorr, num_outputs_diff ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); } - IF( ( freq_domain_decorr_ap_state->reverb_energy_smooth_fx = (Word32 *) malloc( sizeof( Word32 ) * freq_domain_decorr_ap_params->max_band_decorr * num_outputs_diff ) ) == NULL ) + IF( ( freq_domain_decorr_ap_state->reverb_energy_smooth_fx = (Word32 *) malloc( sizeof( Word32 ) * imult1616( freq_domain_decorr_ap_params->max_band_decorr, num_outputs_diff ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); } @@ -551,9 +566,11 @@ ivas_error ivas_dirac_dec_decorr_open_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); } - set32_fx( freq_domain_decorr_ap_state->direct_energy_smooth_fx, 0, freq_domain_decorr_ap_params->max_band_decorr * num_outputs_diff ); - set32_fx( freq_domain_decorr_ap_state->reverb_energy_smooth_fx, 0, freq_domain_decorr_ap_params->max_band_decorr * num_outputs_diff ); + set32_fx( freq_domain_decorr_ap_state->direct_energy_smooth_fx, 0, imult1616( freq_domain_decorr_ap_params->max_band_decorr, num_outputs_diff ) ); + set32_fx( freq_domain_decorr_ap_state->reverb_energy_smooth_fx, 0, imult1616( freq_domain_decorr_ap_params->max_band_decorr, num_outputs_diff ) ); freq_domain_decorr_ap_state->q_direct_energy_smooth = freq_domain_decorr_ap_state->q_reverb_energy_smooth = Q31; + move16(); + move16(); /* compute filter coefficients */ FOR( k = 0; k < freq_domain_decorr_ap_params->num_split_frequency_bands; k++ ) @@ -564,20 +581,22 @@ ivas_error ivas_dirac_dec_decorr_open_fx( band_table_idx = add( k, split_band_index_start ); freq_domain_decorr_ap_params->filter_length[k] = add( ap_filter_length[band_table_idx], 1 ); freq_domain_decorr_ap_params->pre_delay[k] = ap_pre_delay[band_table_idx]; + move16(); + move16(); FOR( l = 0; l < num_outputs_diff; l++ ) { FOR( m = 0; m < num_bands; m++ ) { n = add( k_in, m ); - Word32 cur_lattice_delta_phi_32_fx = L_mult( ap_lattice_delta_phi_fx[l * DIRAC_MAX_DECORR_FILTER_LEN + ap_filter_length[k] - 1], (Word16) floatToFixed( n, 10 ) ); + Word32 cur_lattice_delta_phi_32_fx = L_mult( ap_lattice_delta_phi_fx[sub( add( imult1616( l, DIRAC_MAX_DECORR_FILTER_LEN ), ap_filter_length[k] ), 1 )], shl( n, 10 ) ); cur_lattice_delta_phi_fx = extract_h( cur_lattice_delta_phi_32_fx ); // Q10 - WHILE( GT_16( cur_lattice_delta_phi_fx, sub( ONE_IN_Q11, 1 ) ) ) + WHILE( GT_16( cur_lattice_delta_phi_fx, ONE_IN_Q11 - 1 ) ) { cur_lattice_delta_phi_fx = sub( cur_lattice_delta_phi_fx, 3217 ); } - WHILE( LT_16( cur_lattice_delta_phi_fx, negate( ONE_IN_Q11 ) ) ) + WHILE( LT_16( cur_lattice_delta_phi_fx, -ONE_IN_Q11 ) ) { cur_lattice_delta_phi_fx = add( cur_lattice_delta_phi_fx, 3217 ); } @@ -586,14 +605,16 @@ ivas_error ivas_dirac_dec_decorr_open_fx( Word16 temp_a = getCosWord16( cur_lattice_delta_phi_fx ); Word16 temp_b = negate( getCosWord16( sub( 12868 /*PI/2 in Q13*/, cur_lattice_delta_phi_fx ) ) ); - freq_domain_decorr_ap_params->phase_coeff_real_fx[l * freq_domain_decorr_ap_params->max_band_decorr + n] = temp_a; - freq_domain_decorr_ap_params->phase_coeff_imag_fx[l * freq_domain_decorr_ap_params->max_band_decorr + n] = temp_b; + freq_domain_decorr_ap_params->phase_coeff_real_fx[add( imult1616( l, freq_domain_decorr_ap_params->max_band_decorr ), n )] = temp_a; + freq_domain_decorr_ap_params->phase_coeff_imag_fx[add( imult1616( l, freq_domain_decorr_ap_params->max_band_decorr ), n )] = temp_b; + move16(); + move16(); /* calculate phase offset */ get_lattice_coeffs_fx( band_table_idx, l, lattice_coeffs_fx ); /* calcualte transfer function coefficients from the lattice coefficients */ - Word16 a = ( k_in + m ) * ( freq_domain_decorr_ap_params->filter_length[0] * num_outputs_diff ) + l * freq_domain_decorr_ap_params->filter_length[0]; + Word16 a = add( imult1616( add( k_in, m ), imult1616( freq_domain_decorr_ap_params->filter_length[0], num_outputs_diff ) ), imult1616( l, freq_domain_decorr_ap_params->filter_length[0] ) ); lattice2allpass_fx( freq_domain_decorr_ap_params->filter_length[k], lattice_coeffs_fx, &freq_domain_decorr_ap_params->filter_coeff_num_real_fx[a], &freq_domain_decorr_ap_params->filter_coeff_den_real_fx[a] ); } @@ -926,24 +947,26 @@ void ivas_dirac_dec_decorr_process_fx( Word16 max_band_decorr_temp = h_freq_domain_decorr_ap_params->h_onset_detection_power_params.max_band_decorr; Word16 q_shift, guarded_bits; Word32 max_abs_val = 0; - + move16(); + move32(); push_wmops( "dirac_decorr_process" ); /* check handles */ - IF( h_freq_domain_decorr_ap_params == NULL || h_freq_domain_decorr_ap_state == NULL ) + test(); + if( h_freq_domain_decorr_ap_params == NULL || h_freq_domain_decorr_ap_state == NULL ) { return; } /* check input data */ - IF( input_frame_fx == NULL ) + if( input_frame_fx == NULL ) { return; } /* check result arrays */ - IF( frame_dec_fx == NULL ) + if( frame_dec_fx == NULL ) { return; } @@ -957,7 +980,7 @@ void ivas_dirac_dec_decorr_process_fx( * collect some often used parameters *-----------------------------------------------------------------*/ - IF( synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + if ( EQ_32( synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { num_channels = sub( num_channels, nchan_transport ); } @@ -969,6 +992,7 @@ void ivas_dirac_dec_decorr_process_fx( /* compute power */ q_onset_dec = h_freq_domain_decorr_ap_state->h_onset_detection_power_state.q_onset_detector; + move16(); guarded_bits = find_guarded_bits_fx( 2 ); #if 0 FOR( ch_idx = 0; ch_idx < num_protos_dir; ch_idx++ ) @@ -985,61 +1009,68 @@ void ivas_dirac_dec_decorr_process_fx( } q_aux_buffer += q_shift; #else - (void) maximum_abs_32_fx( &input_frame_fx[0], 2 * num_protos_dir * num_freq_bands, &max_abs_val ); - q_shift = getScaleFactor32( &input_frame_fx[0], 2 * num_protos_dir * num_freq_bands ) - guarded_bits; - IF( LT_16( q_shift, sub( 0, guarded_bits ) ) && NE_32( max_abs_val, 0 ) ) + (void) maximum_abs_32_fx( &input_frame_fx[0], imult1616( 2, imult1616( num_protos_dir, num_freq_bands ) ), &max_abs_val ); + q_shift = sub( getScaleFactor32( &input_frame_fx[0], imult1616( 2, imult1616( num_protos_dir, num_freq_bands ) ) ), guarded_bits ); + test(); + IF( LT_16( q_shift, negate( guarded_bits ) ) && max_abs_val != 0 ) { q_shift = sub( 0, guarded_bits ); } - ELSE IF( EQ_32( max_abs_val, 0 ) ) + ELSE IF( max_abs_val == 0 ) { q_shift = 0; + move16(); } FOR( ch_idx = 0; ch_idx < num_protos_dir; ch_idx++ ) { - v_shr( &input_frame_fx[2 * ch_idx * num_freq_bands], negate( q_shift ), &aux_buffer_fx[2 * ch_idx * num_freq_bands], 2 * num_freq_bands ); + v_shr( &input_frame_fx[imult1616( 2, imult1616( ch_idx, num_freq_bands ) )], negate( q_shift ), &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, num_freq_bands ) )], imult1616( 2, num_freq_bands ) ); } FOR( ch_idx = 0; ch_idx < num_protos_dir; ch_idx++ ) { - v_mult_fixed( &aux_buffer_fx[2 * ch_idx * num_freq_bands], &aux_buffer_fx[2 * ch_idx * num_freq_bands], &aux_buffer_fx[2 * ch_idx * max_band_decorr_temp], 2 * max_band_decorr_temp ); + v_mult_fixed( &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, num_freq_bands ) )], &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, num_freq_bands ) )], &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, max_band_decorr_temp ) )], imult1616( 2, max_band_decorr_temp ) ); } - q_aux_buffer = q_input_frame + q_input_frame + q_shift + q_shift - 31; + q_aux_buffer = sub( add( add( add( q_input_frame, q_input_frame ), q_shift ), q_shift ), 31 ); #endif FOR( ch_idx = 0; ch_idx < num_protos_dir; ch_idx++ ) { - v_add_inc_fx( &aux_buffer_fx[2 * ch_idx * max_band_decorr_temp], 2, &aux_buffer_fx[2 * ch_idx * max_band_decorr_temp + 1], 2, &aux_buffer_fx[ch_idx * max_band_decorr_temp], 1, max_band_decorr_temp ); + v_add_inc_fx( &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, max_band_decorr_temp ) )], 2, &aux_buffer_fx[add( imult1616( 2, imult1616( ch_idx, max_band_decorr_temp ) ), 1 )], 2, &aux_buffer_fx[imult1616( ch_idx, max_band_decorr_temp )], 1, max_band_decorr_temp ); } /* compute onset filter */ max_band_decorr = h_freq_domain_decorr_ap_params->max_band_decorr; - set32_fx( onset_filter_fx, ONE_IN_Q31, num_protos_diff * num_freq_bands ); + set32_fx( onset_filter_fx, ONE_IN_Q31, imult1616( num_protos_diff, num_freq_bands ) ); Word16 q_temp = s_min( q_onset_dec, q_aux_buffer ); IF( NE_16( q_temp, q_onset_dec ) ) { - FOR( Word16 i = 0; i < num_protos_diff * max_band_decorr_temp; i++ ) + FOR( Word16 i = 0; i < imult1616(num_protos_diff , max_band_decorr_temp); i++ ) { - h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2_fx[i] = L_shr( h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2_fx[i], q_onset_dec - q_temp ); - h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1_fx[i] = L_shr( h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1_fx[i], q_onset_dec - q_temp ); + h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2_fx[i] = L_shr( h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2_fx[i], sub( q_onset_dec, q_temp ) ); + h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1_fx[i] = L_shr( h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1_fx[i], sub( q_onset_dec, q_temp ) ); + move32(); + move32(); } } IF( NE_16( q_temp, q_aux_buffer ) ) { - FOR( Word16 i = 0; i < 2 * num_protos_diff * max_band_decorr_temp; i++ ) + FOR( Word16 i = 0; i < shl( imult1616(num_protos_diff , max_band_decorr_temp),1); i++ ) { - aux_buffer_fx[i] = L_shr( aux_buffer_fx[i], q_aux_buffer - q_temp ); + aux_buffer_fx[i] = L_shr( aux_buffer_fx[i], sub( q_aux_buffer, q_temp ) ); + move32(); } } q_aux_buffer = q_temp; + move16(); h_freq_domain_decorr_ap_state->h_onset_detection_power_state.q_onset_detector = q_temp; + move16(); ivas_dirac_dec_onset_detection_process_fx( aux_buffer_fx, q_aux_buffer, onset_filter_fx, num_protos_diff, h_freq_domain_decorr_ap_params->h_onset_detection_power_params, h_freq_domain_decorr_ap_state->h_onset_detection_power_state ); /* Apply decorrelator if num_channels is greater than 0 */ - IF( GT_16( num_channels, 0 ) ) + IF( num_channels > 0 ) { /* remove onsets from prototype frame */ FOR( ch_idx = 0; ch_idx < num_protos_dir; ch_idx++ ) @@ -1050,6 +1081,7 @@ void ivas_dirac_dec_decorr_process_fx( v_mult_inc_fixed( &input_frame_fx[2 * ch_idx * num_freq_bands + 1], 2, &onset_filter_fx[ch_idx * num_freq_bands], 1, &aux_buffer_fx[2 * ch_idx * max_band_decorr + 1], 2, max_band_decorr ); } q_aux_buffer = q_input_frame; + move16(); /*-----------------------------------------------------------------* * all pass based decorrelation @@ -1059,6 +1091,7 @@ void ivas_dirac_dec_decorr_process_fx( /* output is the first frame of the state */ decorr_buffer_len = sub( add( h_freq_domain_decorr_ap_params->filter_length[0], h_freq_domain_decorr_ap_params->pre_delay[0] ), 1 ); Word16 q_decorr_buf = h_freq_domain_decorr_ap_state->q_decorr_buffer; + move16(); p_frame_dec_fx = frame_dec_fx; decorr_buffer_fx = h_freq_domain_decorr_ap_state->decorr_buffer_fx; phase_coeff_real_fx = h_freq_domain_decorr_ap_params->phase_coeff_real_fx; // Q14 @@ -1077,6 +1110,8 @@ void ivas_dirac_dec_decorr_process_fx( phase_coeff_imag_fx++; phase_coeff_real_fx++; decorr_buffer_fx += 2; + move32(); + move32(); } p_frame_dec_fx += incr_aux; } @@ -1085,41 +1120,42 @@ void ivas_dirac_dec_decorr_process_fx( FOR( time_idx = 0; time_idx < sub( decorr_buffer_len, 1 ); time_idx++ ) { - Copy32( &h_freq_domain_decorr_ap_state->decorr_buffer_fx[2 * ( time_idx + 1 ) * max_band_decorr * num_channels], &h_freq_domain_decorr_ap_state->decorr_buffer_fx[2 * (time_idx) *max_band_decorr * num_channels], 2 * max_band_decorr * num_channels ); + Copy32( &h_freq_domain_decorr_ap_state->decorr_buffer_fx[imult1616( 2, imult1616( imult1616( add( time_idx, 1 ), max_band_decorr ), num_channels ) )], &h_freq_domain_decorr_ap_state->decorr_buffer_fx[imult1616( imult1616( imult1616( 2, ( time_idx ) ), max_band_decorr ), num_channels )], imult1616( imult1616( 2, max_band_decorr ), num_channels ) ); } - set32_fx( &h_freq_domain_decorr_ap_state->decorr_buffer_fx[2 * ( decorr_buffer_len - 1 ) * max_band_decorr * num_channels], 0, 2 * max_band_decorr * num_channels ); + set32_fx( &h_freq_domain_decorr_ap_state->decorr_buffer_fx[imult1616( imult1616( imult1616( 2, sub( decorr_buffer_len, 1 ) ), max_band_decorr ), num_channels )], 0, imult1616( imult1616( 2, max_band_decorr ), num_channels ) ); Word16 decorr_buff_tot_len = imult1616( imult1616( shl( decorr_buffer_len, 1 ), max_band_decorr ), num_channels ); guarded_bits = s_max( find_guarded_bits_fx( 2 ), 3 ); - q_shift = getScaleFactor32( h_freq_domain_decorr_ap_state->decorr_buffer_fx, decorr_buff_tot_len ) - guarded_bits; + q_shift = sub( getScaleFactor32( h_freq_domain_decorr_ap_state->decorr_buffer_fx, decorr_buff_tot_len ), guarded_bits ); Scale_sig32( h_freq_domain_decorr_ap_state->decorr_buffer_fx, decorr_buff_tot_len, q_shift ); - q_decorr_buf = q_decorr_buf + q_shift; + q_decorr_buf = add( q_decorr_buf, q_shift ); - q_shift = getScaleFactor32( aux_buffer_fx, 2 * num_protos_dir * max_band_decorr_temp ); + q_shift = getScaleFactor32( aux_buffer_fx, imult1616( imult1616( 2, num_protos_dir ), max_band_decorr_temp ) ); - FOR( Word16 j = 0; j < 2 * num_protos_dir * max_band_decorr_temp; j++ ) + FOR( Word16 j = 0; j < shl( imult1616(num_protos_dir , max_band_decorr_temp),1); j++ ) { aux_buffer_fx[j] = L_shl( aux_buffer_fx[j], q_shift ); + move32(); } - q_aux_buffer += q_shift; + q_aux_buffer = add( q_aux_buffer, q_shift ); // q of aux buff must be greater than 3 than decorr buffer// IF( GE_16( q_decorr_buf, q_aux_buffer ) ) { - Scale_sig32( h_freq_domain_decorr_ap_state->decorr_buffer_fx, decorr_buff_tot_len, negate( q_decorr_buf - q_aux_buffer + 3 ) ); - q_decorr_buf = q_decorr_buf + negate( q_decorr_buf - q_aux_buffer + 3 ); + Scale_sig32( h_freq_domain_decorr_ap_state->decorr_buffer_fx, decorr_buff_tot_len, negate( add( sub( q_decorr_buf, q_aux_buffer ), 3 ) ) ); + q_decorr_buf = sub( q_decorr_buf, add( sub( q_decorr_buf, q_aux_buffer ), 3 ) ); } ELSE { IF( GT_16( sub( q_aux_buffer, q_decorr_buf ), 3 ) ) { - Scale_sig32( aux_buffer_fx, 2 * num_protos_dir * max_band_decorr_temp, negate( sub( sub( q_aux_buffer, q_decorr_buf ), 3 ) ) ); + Scale_sig32( aux_buffer_fx, shl( imult1616( num_protos_dir, max_band_decorr_temp ), 1 ), negate( sub( sub( q_aux_buffer, q_decorr_buf ), 3 ) ) ); } ELSE { - Scale_sig32( h_freq_domain_decorr_ap_state->decorr_buffer_fx, decorr_buff_tot_len, negate( 3 - ( q_aux_buffer - q_decorr_buf ) ) ); - q_decorr_buf = q_decorr_buf + negate( 3 - ( q_aux_buffer - q_decorr_buf ) ); + Scale_sig32( h_freq_domain_decorr_ap_state->decorr_buffer_fx, decorr_buff_tot_len, negate( sub( 3, sub( q_aux_buffer, q_decorr_buf ) ) ) ); + q_decorr_buf = sub( q_decorr_buf, sub( 3, sub( q_aux_buffer, q_decorr_buf ) ) ); } } @@ -1145,46 +1181,55 @@ void ivas_dirac_dec_decorr_process_fx( filter_coeff_num_real_fx = &h_freq_domain_decorr_ap_params->filter_coeff_num_real_fx[idx_filter]; // Q12 filter_coeff_den_real_fx = &h_freq_domain_decorr_ap_params->filter_coeff_den_real_fx[idx_filter]; // Q12 decorr_buffer_start_ptr_fx = &h_freq_domain_decorr_ap_state->decorr_buffer_fx[2 * ( ch_idx * max_band_decorr + band_idx )]; - input_real_fx = aux_buffer_fx[2 * ( proto_index_dir[ch_idx] * max_band_decorr + band_idx )]; // q_aux - input_imag_fx = aux_buffer_fx[2 * ( proto_index_dir[ch_idx] * max_band_decorr + band_idx ) + 1]; // q_aux + input_real_fx = aux_buffer_fx[shl( add( imult1616( proto_index_dir[ch_idx], max_band_decorr ), band_idx ), 1 )]; // q_aux + input_imag_fx = aux_buffer_fx[add( shl( add( imult1616( proto_index_dir[ch_idx], max_band_decorr ), band_idx ), 1 ), 1 )]; // q_aux /* MA part of filter impulse response */ FOR( l = 0; l < filter_length; l++ ) { frame_ma_fx[2 * l] = Mpy_32_16_1( input_real_fx, filter_coeff_num_real_fx[l] ); // Q_qux -3 = q_deorr // frame_ma_fx[2 * l] = L_shr(frame_ma_fx[2 * l],3); // scaling to q_decorr_buf - frame_ma_fx[2 * l + 1] = Mpy_32_16_1( input_imag_fx, filter_coeff_num_real_fx[l] ); // Q_qux - 3 = q_deorr - // frame_ma_fx[2 * l + 1] = L_shr(frame_ma_fx[2 * l + 1], 3); // scaling to q_decorr_buf + frame_ma_fx[add( shl( l, 1 ), 1 )] = Mpy_32_16_1( input_imag_fx, filter_coeff_num_real_fx[l] ); // Q_qux - 3 = q_deorr + // frame_ma_fx[2 * l + 1] = L_shr(frame_ma_fx[2 * l + 1], 3); // scaling to q_decorr_buf + move32(); + move32(); } - decorr_buffer_ptr_fx = decorr_buffer_start_ptr_fx + 2 * ( sub( pre_delay, 1 ) ) * decorr_buffer_step; + decorr_buffer_ptr_fx = decorr_buffer_start_ptr_fx + shl( imult1616( ( sub( pre_delay, 1 ) ), decorr_buffer_step ), 1 ); /*add MA part to state */ decorr_buffer_ptr_fx[0] = L_add( decorr_buffer_ptr_fx[0], frame_ma_fx[0] ); decorr_buffer_ptr_fx[1] = L_add( decorr_buffer_ptr_fx[1], frame_ma_fx[1] ); + move32(); + move32(); /*get values for AR part */ filter_frame_real_fx = decorr_buffer_ptr_fx[0]; // q_decorr filter_frame_imag_fx = decorr_buffer_ptr_fx[1]; // q_deocrr - decorr_buffer_ptr_fx += 2 * decorr_buffer_step; + decorr_buffer_ptr_fx += shl( decorr_buffer_step, 1 ); FOR( l = 1; l < filter_length; l++ ) { // q adjustment needed// - decorr_buffer_ptr_fx[0] = L_add( decorr_buffer_ptr_fx[0], frame_ma_fx[2 * l] ); // q_decorr - Word32 temp_1 = Mpy_32_16_1( filter_frame_real_fx, filter_coeff_den_real_fx[l] ); // q_decorr - 3 - temp_1 = L_shl( temp_1, 3 ); // q_decorr - decorr_buffer_ptr_fx[0] = L_sub( decorr_buffer_ptr_fx[0], temp_1 ); // q_deocor - decorr_buffer_ptr_fx[1] = L_add( decorr_buffer_ptr_fx[1], frame_ma_fx[2 * l + 1] ); // q_decorr - Word32 temp_2 = Mpy_32_16_1( filter_frame_imag_fx, filter_coeff_den_real_fx[l] ); // q_decorr - 3 - temp_2 = L_shl( temp_2, 3 ); // q_decorr - decorr_buffer_ptr_fx[1] = L_sub( decorr_buffer_ptr_fx[1], temp_2 ); // q_decorr + decorr_buffer_ptr_fx[0] = L_add( decorr_buffer_ptr_fx[0], frame_ma_fx[2 * l] ); // q_decorr + Word32 temp_1 = Mpy_32_16_1( filter_frame_real_fx, filter_coeff_den_real_fx[l] ); // q_decorr - 3 + temp_1 = L_shl( temp_1, 3 ); // q_decorr + decorr_buffer_ptr_fx[0] = L_sub( decorr_buffer_ptr_fx[0], temp_1 ); // q_deocor + decorr_buffer_ptr_fx[1] = L_add( decorr_buffer_ptr_fx[1], frame_ma_fx[add( shl( l, 1 ), 1 )] ); // q_decorr + Word32 temp_2 = Mpy_32_16_1( filter_frame_imag_fx, filter_coeff_den_real_fx[l] ); // q_decorr - 3 + temp_2 = L_shl( temp_2, 3 ); // q_decorr + decorr_buffer_ptr_fx[1] = L_sub( decorr_buffer_ptr_fx[1], temp_2 ); // q_decorr decorr_buffer_ptr_fx += imult1616( 2, decorr_buffer_step ); + move32(); + move32(); + move32(); + move32(); } } } } h_freq_domain_decorr_ap_state->q_decorr_buffer = q_decorr_buf; + move16(); /*-----------------------------------------------------------------* * onset/diffuse energy ratio conservation *-----------------------------------------------------------------*/ @@ -1194,6 +1239,7 @@ void ivas_dirac_dec_decorr_process_fx( Word16 e_reverb_energy_smooth, e_direct_energy_smooth; Word16 offset1, offset2; Word16 norm = 63; + move16(); e_reverb_energy_smooth = sub( 31, h_freq_domain_decorr_ap_state->q_reverb_energy_smooth ); e_direct_energy_smooth = sub( 31, h_freq_domain_decorr_ap_state->q_direct_energy_smooth ); @@ -1204,11 +1250,11 @@ void ivas_dirac_dec_decorr_process_fx( FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { q_shift = s_min( q_shift, - L_norm_arr( &frame_dec_fx[2 * ch_idx * num_freq_bands], shl( max_band_decorr, 1 ) ) ); + L_norm_arr( &frame_dec_fx[shl( imult1616( ch_idx, num_freq_bands ), 1 )], shl( max_band_decorr, 1 ) ) ); } FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { - Scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], shl( max_band_decorr, 1 ), q_shift ); + Scale_sig32( &frame_dec_fx[shl( imult1616( ch_idx, num_freq_bands ), 1 )], shl( max_band_decorr, 1 ), q_shift ); } #else q_shift = L_norm_arr( frame_dec_fx, ( 2 * max_band_decorr + incr_aux ) * num_channels ); @@ -1220,41 +1266,44 @@ void ivas_dirac_dec_decorr_process_fx( IF( h_freq_domain_decorr_ap_params->use_ducker ) { /* compute direct power w/o onsets for the energy ratio, signal is still in the aux buffer */ - v_mult_fixed( aux_buffer_fx, aux_buffer_fx, aux_buffer_fx, 2 * max_band_decorr * num_protos_dir ); // 2 *q_aux -31 + v_mult_fixed( aux_buffer_fx, aux_buffer_fx, aux_buffer_fx, shl( imult1616( max_band_decorr, num_protos_dir ), 1 ) ); // 2 *q_aux -31 q_aux_buffer = sub( imult1616( 2, q_aux_buffer ), 31 ); // if this scaling is eliminated overflow is happening fot v_add_inc_fix - q_shift = L_norm_arr( aux_buffer_fx, 2 * num_protos_dir * max_band_decorr ) - find_guarded_bits_fx( 2 ); - Scale_sig32( aux_buffer_fx, 2 * num_protos_dir * max_band_decorr_temp, q_shift ); + q_shift = sub( L_norm_arr( aux_buffer_fx, shl( imult1616( num_protos_dir, max_band_decorr ), 1 ) ), find_guarded_bits_fx( 2 ) ); + Scale_sig32( aux_buffer_fx, shl( imult1616( num_protos_dir, max_band_decorr_temp ), 1 ), q_shift ); q_aux_buffer = add( q_aux_buffer, q_shift ); v_add_inc_fx( &aux_buffer_fx[0], 2, &aux_buffer_fx[1], 2, direct_energy_fx, 1, imult1616( num_protos_dir, max_band_decorr ) ); q_direct_energy = q_aux_buffer; + move16(); /* calculate the power of the decorrelated signal */ FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { - offset1 = 2 * ch_idx * num_freq_bands; - offset2 = 2 * ch_idx * max_band_decorr; + offset1 = shl( imult1616( ch_idx, num_freq_bands ), 1 ); + offset2 = shl( imult1616( ch_idx, max_band_decorr ), 1 ); FOR( Word16 i = 0; i < 2 * max_band_decorr; i++ ) { - aux_64[offset2 + i] = W_mult0_32_32( frame_dec_fx[offset1 + i], frame_dec_fx[offset1 + i] ); - norm = s_min( norm, W_norm( aux_64[offset2 + i] ) ); + aux_64[add( offset2, i )] = W_mult0_32_32( frame_dec_fx[add( offset1, i )], frame_dec_fx[add( offset1, i )] ); + move64(); + norm = s_min( norm, W_norm( aux_64[add( offset2, i )] ) ); } } - FOR( Word16 i = 0; i < 2 * num_channels * max_band_decorr; i++ ) + FOR( Word16 i = 0; i < shl(imult1616(num_channels , max_band_decorr),1); i++ ) { - aux_buffer_fx[i] = W_extract_h( W_shl( aux_64[i], norm - find_guarded_bits_fx( 2 ) ) ); + aux_buffer_fx[i] = W_extract_h( W_shl( aux_64[i], sub( norm, find_guarded_bits_fx( 2 ) ) ) ); + move32(); } q_aux_buffer = add( imult1616( 2, q_frame_f ), sub( sub( norm, 1 ), 32 ) ); FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { - v_add_inc_fx( &aux_buffer_fx[2 * ch_idx * max_band_decorr], 2, &aux_buffer_fx[2 * ch_idx * max_band_decorr + 1], 2, &aux_buffer_fx[ch_idx * max_band_decorr], 1, max_band_decorr ); + v_add_inc_fx( &aux_buffer_fx[shl( imult1616( ch_idx, max_band_decorr ), 1 )], 2, &aux_buffer_fx[add( shl( imult1616( ch_idx, max_band_decorr ), 1 ), 1 )], 2, &aux_buffer_fx[imult1616( ch_idx, max_band_decorr )], 1, max_band_decorr ); } /* smooth energies */ @@ -1262,25 +1311,28 @@ void ivas_dirac_dec_decorr_process_fx( v_multc_fixed( h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx, DIRAC_DUCK_ALPHA_FX, h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx, imult1616( num_channels, max_band_decorr ) ); // same-q - v_add_fixed_me( aux_buffer_fx, 31 - q_aux_buffer, h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx, e_reverb_energy_smooth, h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx, &e_reverb_energy_smooth, imult1616( num_channels, max_band_decorr ), 0 ); + v_add_fixed_me( aux_buffer_fx, sub( 31, q_aux_buffer ), h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx, e_reverb_energy_smooth, h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx, &e_reverb_energy_smooth, imult1616( num_channels, max_band_decorr ), 0 ); h_freq_domain_decorr_ap_state->q_reverb_energy_smooth = sub( 31, e_reverb_energy_smooth ); v_multc_fixed( direct_energy_fx, ONE_M_DIRAC_DUCK_ALPHA, direct_energy_fx, imult1616( num_protos_dir, max_band_decorr ) ); // same q v_multc_fixed( h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, DIRAC_DUCK_ALPHA_FX, h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, imult1616( num_protos_dir, max_band_decorr ) ); // same q - v_add_fixed_me( direct_energy_fx, 31 - q_direct_energy, h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, e_direct_energy_smooth, h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, &e_direct_energy_smooth, imult1616( num_protos_dir, max_band_decorr ), 0 ); + v_add_fixed_me( direct_energy_fx, sub( 31, q_direct_energy ), h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, e_direct_energy_smooth, h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, &e_direct_energy_smooth, imult1616( num_protos_dir, max_band_decorr ), 0 ); h_freq_domain_decorr_ap_state->q_direct_energy_smooth = sub( 31, e_direct_energy_smooth ); + move16(); // scaling energy buffers for better precision for higher values// q_shift = L_norm_arr( h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, imult1616( num_protos_dir, max_band_decorr ) ); Scale_sig32( h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, imult1616( num_protos_dir, max_band_decorr ), q_shift ); - h_freq_domain_decorr_ap_state->q_direct_energy_smooth = h_freq_domain_decorr_ap_state->q_direct_energy_smooth + q_shift; + h_freq_domain_decorr_ap_state->q_direct_energy_smooth = add( h_freq_domain_decorr_ap_state->q_direct_energy_smooth, q_shift ); + move16(); q_shift = L_norm_arr( h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx, imult1616( num_channels, max_band_decorr ) ); Scale_sig32( h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx, imult1616( num_channels, max_band_decorr ), q_shift ); - h_freq_domain_decorr_ap_state->q_reverb_energy_smooth = h_freq_domain_decorr_ap_state->q_reverb_energy_smooth + q_shift; + h_freq_domain_decorr_ap_state->q_reverb_energy_smooth = add( h_freq_domain_decorr_ap_state->q_reverb_energy_smooth, q_shift ); + move16(); e_reverb_energy_smooth = sub( 31, h_freq_domain_decorr_ap_state->q_reverb_energy_smooth ); e_direct_energy_smooth = sub( 31, h_freq_domain_decorr_ap_state->q_direct_energy_smooth ); @@ -1292,12 +1344,12 @@ void ivas_dirac_dec_decorr_process_fx( FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { q_shift = s_min( q_shift, - sub( L_norm_arr( &frame_dec_fx[2 * ch_idx * num_freq_bands], shl( max_band_decorr, 1 ) ), + sub( L_norm_arr( &frame_dec_fx[shl( imult1616( ch_idx, num_freq_bands ), 1 )], shl( max_band_decorr, 1 ) ), Q2 ) ); } FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { - Scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], shl( max_band_decorr, 1 ), q_shift ); + Scale_sig32( &frame_dec_fx[shl( imult1616( ch_idx, num_freq_bands ), 1 )], shl( max_band_decorr, 1 ), q_shift ); } #else q_shift = sub( L_norm_arr( frame_dec_fx, ( 2 * max_band_decorr + incr_aux ) * num_channels ), 2 ); @@ -1307,7 +1359,7 @@ void ivas_dirac_dec_decorr_process_fx( FOR( ch_idx = 0; ch_idx < num_channels; ch_idx++ ) { - Word32 *frame_dec_fx_ptr = &frame_dec_fx[ch_idx * 2 * num_freq_bands]; + Word32 *frame_dec_fx_ptr = &frame_dec_fx[shl( imult1616( ch_idx, num_freq_bands ), 1 )]; Word16 cur_proto_index = imult1616( proto_index_dir[ch_idx], max_band_decorr ); Word16 cur_reverb_index = imult1616( ch_idx, max_band_decorr ); Word32 *reverb_energy_smooth_ptr = &h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx[cur_reverb_index]; // q_aux @@ -1316,43 +1368,52 @@ void ivas_dirac_dec_decorr_process_fx( FOR( band_idx = 0; band_idx < max_band_decorr; band_idx++ ) { Word16 duck_gain = 32767, e_duck_gain = 0; + move16(); + move16(); Word32 direct_energy_loc = direct_energy_smooth_ptr[band_idx]; Word32 reverb_energy_loc = reverb_energy_smooth_ptr[band_idx]; + move32(); + move32(); Word32 temp_1 = Mpy_32_32( direct_energy_loc, DIRAC_DUCK_GAMMA_FX ); // e+1 Word32 temp_2 = Mpy_32_32( reverb_energy_loc, DIRAC_DUCK_GAMMA_FX ); // e+1 - Word16 comp_flag_1 = BASOP_Util_Cmp_Mant32Exp( reverb_energy_loc, e_reverb_energy_smooth, temp_1, e_direct_energy_smooth + 1 ); - Word16 comp_flag_2 = BASOP_Util_Cmp_Mant32Exp( direct_energy_loc, e_direct_energy_smooth, temp_2, e_reverb_energy_smooth + 1 ); + Word16 comp_flag_1 = BASOP_Util_Cmp_Mant32Exp( reverb_energy_loc, e_reverb_energy_smooth, temp_1, add( e_direct_energy_smooth, 1 ) ); + Word16 comp_flag_2 = BASOP_Util_Cmp_Mant32Exp( direct_energy_loc, e_direct_energy_smooth, temp_2, add( e_reverb_energy_smooth, 1 ) ); IF( EQ_16( comp_flag_1, 1 ) ) { duck_gain = BASOP_Util_Divide3232_Scale( temp_1, L_add( reverb_energy_loc, EPSILON_FX ), &e_duck_gain ); - e_duck_gain = e_duck_gain + ( e_direct_energy_smooth + 1 - e_reverb_energy_smooth ); + e_duck_gain = add( e_duck_gain, sub( add( e_direct_energy_smooth, 1 ), e_reverb_energy_smooth ) ); duck_gain = Sqrt16( duck_gain, &e_duck_gain ); duck_gain = shl( duck_gain, sub( e_duck_gain, 1 ) ); // Q14 - frame_dec_fx_ptr[2 * band_idx] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[2 * band_idx], duck_gain ), 1 ); // q_frame_f - frame_dec_fx_ptr[2 * band_idx + 1] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[2 * band_idx + 1], duck_gain ), 1 ); // q_frame_f + frame_dec_fx_ptr[2 * band_idx] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[2 * band_idx], duck_gain ), 1 ); // q_frame_f + frame_dec_fx_ptr[add( shl( band_idx, 1 ), 1 )] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[add( shl( band_idx, 1 ), 1 )], duck_gain ), 1 ); // q_frame_f + move32(); + move32(); } ELSE IF( EQ_16( comp_flag_2, 1 ) ) { duck_gain = BASOP_Util_Divide3232_Scale( direct_energy_loc, L_add( temp_2, EPSILON_FX ), &e_duck_gain ); - e_duck_gain = e_duck_gain + ( e_direct_energy_smooth - e_reverb_energy_smooth - 1 ); + e_duck_gain = add( e_duck_gain, sub( e_direct_energy_smooth, add( e_reverb_energy_smooth, 1 ) ) ); duck_gain = Sqrt16( duck_gain, &e_duck_gain ); Word16 comp_flag = BASOP_Util_Cmp_Mant32Exp( duck_gain, e_duck_gain, 16384, 2 ); IF( EQ_16( comp_flag, 1 ) ) { duck_gain = 16384; // 2inQ13 + move16(); } ELSE { duck_gain = shl( duck_gain, sub( e_duck_gain, 2 ) ); // Q13 } - frame_dec_fx_ptr[2 * band_idx] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[2 * band_idx], duck_gain ), 2 ); // q_frame_dec - frame_dec_fx_ptr[2 * band_idx + 1] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[2 * band_idx + 1], duck_gain ), 2 ); // q_frame_dec + frame_dec_fx_ptr[2 * band_idx] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[2 * band_idx], duck_gain ), 2 ); // q_frame_dec + frame_dec_fx_ptr[add( shl( band_idx, 1 ), 1 )] = L_shl( Mpy_32_16_1( frame_dec_fx_ptr[add( shl( band_idx, 1 ), 1 )], duck_gain ), 2 ); // q_frame_dec + move32(); + move32(); } } } @@ -1362,18 +1423,18 @@ void ivas_dirac_dec_decorr_process_fx( * add back onsets *-----------------------------------------------------------------*/ - q_shift = q_input_frame - q_frame_f; + q_shift = sub( q_input_frame, q_frame_f ); #ifdef MSAN_FIX // scaling it to input q FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { - Scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], shl( max_band_decorr, 1 ), q_shift ); + Scale_sig32( &frame_dec_fx[shl( imult1616( ch_idx, num_freq_bands ), 1 )], shl( max_band_decorr, 1 ), q_shift ); } #else Scale_sig32( frame_dec_fx, ( 2 * max_band_decorr + incr_aux ) * num_channels, q_shift ); // scaling it to input q #endif q_frame_f = q_input_frame; - + move16(); IF( EQ_16( h_freq_domain_decorr_ap_params->add_back_onsets_on, 1 ) ) { @@ -1383,11 +1444,13 @@ void ivas_dirac_dec_decorr_process_fx( FOR( k = 0; k < max_band_decorr; ++k ) { - aux_buffer_fx[2 * k] = Mpy_32_32( input_frame_fx[2 * offset + 2 * k], L_sub( ONE_IN_Q31, onset_filter_fx[offset + k] ) ); - aux_buffer_fx[2 * k + 1] = Mpy_32_32( input_frame_fx[2 * offset + 2 * k + 1], L_sub( ONE_IN_Q31, onset_filter_fx[offset + k] ) ); // q_input_f + aux_buffer_fx[2 * k] = Mpy_32_32( input_frame_fx[add( shl( offset, 1 ), shl( k, 1 ) )], L_sub( ONE_IN_Q31, onset_filter_fx[add( offset, k )] ) ); + aux_buffer_fx[add( shl( k, 1 ), 1 )] = Mpy_32_32( input_frame_fx[add( add( shl( offset, 1 ), shl( k, 1 ) ), 1 )], L_sub( ONE_IN_Q31, onset_filter_fx[add( offset, k )] ) ); // q_input_f + move32(); + move32(); } - v_add_fx( &frame_dec_fx[ch_idx * 2 * num_freq_bands], aux_buffer_fx, &frame_dec_fx[ch_idx * 2 * num_freq_bands], 2 * max_band_decorr ); + v_add_fx( &frame_dec_fx[imult1616( ch_idx, shl( num_freq_bands, 1 ) )], aux_buffer_fx, &frame_dec_fx[imult1616( ch_idx, shl( num_freq_bands, 1 ) )], shl( max_band_decorr, 1 ) ); } } @@ -1395,12 +1458,13 @@ void ivas_dirac_dec_decorr_process_fx( FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { /* calc output indices */ - idx_in_out = 2 * ( add( imult1616( ch_idx, num_freq_bands ), h_freq_domain_decorr_ap_params->max_band_decorr ) ); + idx_in_out = shl( ( add( imult1616( ch_idx, num_freq_bands ), h_freq_domain_decorr_ap_params->max_band_decorr ) ), 1 ); /* copy to output signal */ - set32_fx( &frame_dec_fx[idx_in_out], 0, 2 * sub( num_freq_bands, h_freq_domain_decorr_ap_params->max_band_decorr ) ); + set32_fx( &frame_dec_fx[idx_in_out], 0, shl( sub( num_freq_bands, h_freq_domain_decorr_ap_params->max_band_decorr ), 1 ) ); } *q_frame_dec = q_frame_f; + move16(); } /*end of decorrelator*/ pop_wmops(); @@ -1427,12 +1491,14 @@ void ivas_dirac_dec_decorr_close_fx( * check input handles *-----------------------------------------------------------------*/ - if ( ph_freq_domain_decorr_ap_params == NULL || ph_freq_domain_decorr_ap_state == NULL ) + test(); + if( ph_freq_domain_decorr_ap_params == NULL || ph_freq_domain_decorr_ap_state == NULL ) { return; } - if ( *ph_freq_domain_decorr_ap_params == NULL || *ph_freq_domain_decorr_ap_state == NULL ) + test(); + if( *ph_freq_domain_decorr_ap_params == NULL || *ph_freq_domain_decorr_ap_state == NULL ) { return; } @@ -1443,7 +1509,6 @@ void ivas_dirac_dec_decorr_close_fx( dirac_onset_detection_state = &( *ph_freq_domain_decorr_ap_state )->h_onset_detection_power_state; -#ifdef IVAS_FLOAT_FIXED IF( dirac_onset_detection_state->onset_detector_1_fx != NULL ) { free( dirac_onset_detection_state->onset_detector_1_fx ); @@ -1455,13 +1520,11 @@ void ivas_dirac_dec_decorr_close_fx( free( dirac_onset_detection_state->onset_detector_2_fx ); dirac_onset_detection_state->onset_detector_2_fx = NULL; } -#endif /*-----------------------------------------------------------------* * memory deallocation *-----------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED IF( ( *ph_freq_domain_decorr_ap_state )->decorr_buffer_fx != NULL ) { free( ( *ph_freq_domain_decorr_ap_state )->decorr_buffer_fx ); @@ -1481,30 +1544,28 @@ void ivas_dirac_dec_decorr_close_fx( free( ( *ph_freq_domain_decorr_ap_state )->reverb_energy_smooth_fx ); ( *ph_freq_domain_decorr_ap_state )->reverb_energy_smooth_fx = NULL; } -#endif /* free pre-delay param buffer */ - if ( ( *ph_freq_domain_decorr_ap_params )->pre_delay != NULL ) + IF( ( *ph_freq_domain_decorr_ap_params )->pre_delay != NULL ) { free( ( *ph_freq_domain_decorr_ap_params )->pre_delay ); ( *ph_freq_domain_decorr_ap_params )->pre_delay = NULL; } /* free filter length param buffer */ - if ( ( *ph_freq_domain_decorr_ap_params )->filter_length != NULL ) + IF( ( *ph_freq_domain_decorr_ap_params )->filter_length != NULL ) { free( ( *ph_freq_domain_decorr_ap_params )->filter_length ); ( *ph_freq_domain_decorr_ap_params )->filter_length = NULL; } /* free pre-delay param buffer */ - if ( ( *ph_freq_domain_decorr_ap_params )->split_frequency_bands != NULL ) + IF( ( *ph_freq_domain_decorr_ap_params )->split_frequency_bands != NULL ) { free( ( *ph_freq_domain_decorr_ap_params )->split_frequency_bands ); ( *ph_freq_domain_decorr_ap_params )->split_frequency_bands = NULL; } -#ifdef IVAS_FLOAT_FIXED /* free filter coeff param buffers */ IF( ( *ph_freq_domain_decorr_ap_params )->filter_coeff_num_real_fx != NULL ) { @@ -1532,7 +1593,6 @@ void ivas_dirac_dec_decorr_close_fx( free( ( *ph_freq_domain_decorr_ap_params )->phase_coeff_real_fx ); ( *ph_freq_domain_decorr_ap_params )->phase_coeff_real_fx = NULL; } -#endif /* free pointers to state and parameter structs */ free( *ph_freq_domain_decorr_ap_params ); *ph_freq_domain_decorr_ap_params = NULL; @@ -1698,7 +1758,7 @@ static void get_lattice_coeffs_fx( FOR( k = 0; k < ap_filter_length[band_index]; k++ ) { - Word16 cur_lattice_coeff = ap_lattice_coeffs_fx[band_index][channel_index * ap_filter_length[band_index] + k]; + Word16 cur_lattice_coeff = ap_lattice_coeffs_fx[band_index][add( imult1616( channel_index, ap_filter_length[band_index] ), k )]; lattice_coeffs[k] = cur_lattice_coeff; move16(); move16(); @@ -1784,11 +1844,12 @@ static void lattice2allpass_fx( FOR( p = 1; p < filter_length; p++ ) { alpha_real_p_fx[p] = shr( lattice_coeffs_fx[( p - 1 )], 3 ); /* Q12 */ + move16(); FOR( i = 1; i < p; i++ ) { - lattice_alpha = mult( lattice_coeffs_fx[( p - 1 )], alpha_real_p_old_fx[p - i] ); /* Q12 */ - alpha_real_p_fx[i] = add( alpha_real_p_old_fx[i], lattice_alpha ); /* Q12 */ + lattice_alpha = mult( lattice_coeffs_fx[( p - 1 )], alpha_real_p_old_fx[sub( p, i )] ); /* Q12 */ + alpha_real_p_fx[i] = add( alpha_real_p_old_fx[i], lattice_alpha ); /* Q12 */ move16(); } /* switch pointers */ @@ -1801,7 +1862,7 @@ static void lattice2allpass_fx( { filter_coeffs_den_real_fx[i] = alpha_real_p_old_fx[i]; /* Q12 */ move16(); - filter_coeffs_num_real_fx[i] = alpha_real_p_old_fx[filter_length - i - 1]; /* Q12 */ + filter_coeffs_num_real_fx[i] = alpha_real_p_old_fx[sub( sub( filter_length, i ), 1 )]; /* Q12 */ move16(); } diff --git a/lib_rend/ivas_dirac_onsets_dec.c b/lib_rend/ivas_dirac_onsets_dec.c index 123c9aec4..7e2a59591 100644 --- a/lib_rend/ivas_dirac_onsets_dec.c +++ b/lib_rend/ivas_dirac_onsets_dec.c @@ -104,7 +104,7 @@ Word16 BASOP_Util_Cmp_Mant32Exp_sat /*!< o: flag: result of comparison */ } /* Check sign, exponent and mantissa to identify, whether a is greater b or not */ - result = sub( 0, 1 ); + result = -1; IF( a_m >= 0 ) { @@ -195,24 +195,27 @@ ivas_error ivas_dirac_dec_onset_detection_open_fx( /* check / set input parameters */ dirac_onset_detection_params->num_freq_bands = num_freq_bands; + move16(); assert( dirac_onset_detection_params->num_freq_bands > 0 && "Error: Number of frequency bands <= 0!" ); dirac_onset_detection_params->max_band_decorr = max_band_decorr; + move16(); /* memory allocation */ - IF( ( dirac_onset_detection_state->onset_detector_1_fx = (Word32 *) malloc( sizeof( Word32 ) * num_protos_diff * dirac_onset_detection_params->max_band_decorr ) ) == NULL ) + IF( ( dirac_onset_detection_state->onset_detector_1_fx = (Word32 *) malloc( sizeof( Word32 ) * imult1616( num_protos_diff, dirac_onset_detection_params->max_band_decorr ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for onset detection\n" ) ); } - IF( ( dirac_onset_detection_state->onset_detector_2_fx = (Word32 *) malloc( sizeof( Word32 ) * num_protos_diff * dirac_onset_detection_params->max_band_decorr ) ) == NULL ) + IF( ( dirac_onset_detection_state->onset_detector_2_fx = (Word32 *) malloc( sizeof( Word32 ) * imult1616( num_protos_diff, dirac_onset_detection_params->max_band_decorr ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for onset detection\n" ) ); } /* init to zero */ - set32_fx( dirac_onset_detection_state->onset_detector_1_fx, 0, num_protos_diff * dirac_onset_detection_params->max_band_decorr ); - set32_fx( dirac_onset_detection_state->onset_detector_2_fx, 0, num_protos_diff * dirac_onset_detection_params->max_band_decorr ); + set32_fx( dirac_onset_detection_state->onset_detector_1_fx, 0, imult1616( num_protos_diff, dirac_onset_detection_params->max_band_decorr ) ); + set32_fx( dirac_onset_detection_state->onset_detector_2_fx, 0, imult1616( num_protos_diff, dirac_onset_detection_params->max_band_decorr ) ); dirac_onset_detection_state->q_onset_detector = Q31; + move16(); return IVAS_ERR_OK; } @@ -293,6 +296,7 @@ void ivas_dirac_dec_onset_detection_process_fx( { /*detector 1: envelope max*/ *p_onset_detector_1_fx = Mpy_32_16_1( *p_onset_detector_1_fx, DIRAC_ONSET_ALPHA_FX ); /* Q(q_onset_detector) */ + move32(); UNUSED_PARAM( q_input_power ); IF( GT_32( *p_onset_detector_1_fx, *input_power_f ) ) { @@ -307,6 +311,7 @@ void ivas_dirac_dec_onset_detection_process_fx( /*detector 2: envelope min*/ *p_onset_detector_2_fx = L_add( Mpy_32_16_1( *p_onset_detector_2_fx, DIRAC_ONSET_BETA_FX ), Mpy_32_16_1( *p_onset_detector_1_fx, ONE_DIRAC_ONSET_BETA_FX ) ); /* Q(q_onset_detector) */ + move32(); IF( LT_32( *p_onset_detector_2_fx, *p_onset_detector_1_fx ) ) { *p_onset_detector_2_fx = *p_onset_detector_2_fx; @@ -318,25 +323,30 @@ void ivas_dirac_dec_onset_detection_process_fx( move32(); } - IF( EQ_32( *p_onset_detector_1_fx, 0 ) ) + IF( *p_onset_detector_1_fx == 0 ) { *p_onset_detector_1_fx = L_add( *p_onset_detector_1_fx, EPSILON_FX ); + move32(); } /*onset filter limited between 0 and 1*/ tmp_fx = BASOP_Util_Divide3232_Scale( *p_onset_detector_2_fx, *p_onset_detector_1_fx, &e_scale ); tmp32_fx = L_mult0( tmp_fx, DIRAC_ONSET_GAIN_FX ); - IF( LT_32( tmp32_fx, 0 ) ) + if ( tmp32_fx < 0 ) { tmp32_fx = 0; move32(); } - Word16 comp_flag = BASOP_Util_Cmp_Mant32Exp_sat( tmp32_fx, e_scale + 4, ONE_IN_Q30, 1 ); - IF( EQ_16( comp_flag, 1 ) || EQ_16( comp_flag, 0 ) ) - tmp32_fx = ONE_IN_Q31; + Word16 comp_flag = BASOP_Util_Cmp_Mant32Exp_sat( tmp32_fx, add( e_scale, 4 ), ONE_IN_Q30, 1 ); + test(); + IF( EQ_16( comp_flag, 1 ) || comp_flag == 0 ) + { + tmp32_fx = ONE_IN_Q31; + move32(); + } ELSE { - tmp32_fx = L_shl( tmp32_fx, e_scale + 4 ); + tmp32_fx = L_shl( tmp32_fx, add( e_scale, 4 ) ); } onset_filter[b] = tmp32_fx; move32(); diff --git a/lib_rend/ivas_dirac_output_synthesis_dec.c b/lib_rend/ivas_dirac_output_synthesis_dec.c index cc57f1a64..c5d73c231 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec.c @@ -47,6 +47,9 @@ #include "prot_fx1.h" /* Function prototypes */ #include "prot_fx2.h" /* Function prototypes */ #endif +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*------------------------------------------------------------------------- * Local constants diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 0334bdc33..11cb17e70 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -2216,8 +2216,8 @@ void ivas_shoebox_set_scene ( shoebox_output_t *ER_PARAMS, const Word32 list_pos[3], const Word32 src_pos_data[], - const uint16_t isCartesian, - const uint16_t isRelative + const UWord16 isCartesian, + const UWord16 isRelative ); #endif diff --git a/lib_rend/ivas_reflections.c b/lib_rend/ivas_reflections.c index b06de85c6..ea4b11418 100644 --- a/lib_rend/ivas_reflections.c +++ b/lib_rend/ivas_reflections.c @@ -49,6 +49,10 @@ #define float_to_fix( n, factor ) ( round( n * ( 1 << factor ) ) ) #define fix_to_float( n, factor ) ( (float) n / ( 1 << factor ) ) #endif +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif + /*-----------------------------------------------------------------------------------------* * Local constants/tabels *-----------------------------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_shoebox.c b/lib_rend/ivas_shoebox.c index 18ff7da30..c2df17819 100644 --- a/lib_rend/ivas_shoebox.c +++ b/lib_rend/ivas_shoebox.c @@ -39,6 +39,9 @@ #include "prot.h" #include "wmc_auto.h" #include "ivas_rom_com.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif /*------------------------------------------------------------------------- @@ -181,7 +184,7 @@ void ivas_shoebox_init( shoebox_obj_t *obj, shoebox_config_t *cal ) { - uint16_t i; + UWord16 i; /* Add cal to obj struct */ obj->cal = *cal; @@ -305,65 +308,86 @@ static void shoebox_bound_fx( { Word32 out_tmp, out_tmp1; Word32 i; - // assert( 0 ); out_tmp = L_sub( L_shr( obj->cal.room_L_fx, 1 ), obj->min_wall_dist_fx ); // Q.22 out_tmp1 = L_add( L_shr( L_negate( obj->cal.room_L_fx ), 1 ), obj->min_wall_dist_fx ); // Q.22 test(); IF( GT_32( out_pos[0], out_tmp ) || LT_32( out_pos[0], out_tmp1 ) ) { - test(); - IF( LT_32( out_pos[0], 0 ) ) + IF( out_pos[0] < 0 ) { i = -1; move32(); } ELSE { - i = ( out_pos[0] > 0 ) ? ( (Word32) 1 ) : ( (Word32) 0 ); - test(); + IF( out_pos[0] > 0 ) + { + i = (Word32) 1; + } + ELSE + { + i = (Word32) 0; + } move32(); } - out_pos[0] = ( out_tmp * ( i ) ); + out_pos[0] = W_extract_l( W_mult0_32_32( out_tmp, i ) ); + move32(); } out_tmp = L_sub( L_shr( obj->cal.room_W_fx, 1 ), obj->min_wall_dist_fx ); // Q.22 out_tmp1 = L_add( L_shr( L_negate( obj->cal.room_W_fx ), 1 ), obj->min_wall_dist_fx ); // Q.22 + test(); IF( GT_32( out_pos[1], out_tmp ) || LT_32( out_pos[1], out_tmp1 ) ) { - IF( LT_32( out_pos[1], 0 ) ) + IF( out_pos[1] < 0 ) { i = -1; move32(); } ELSE { - i = ( out_pos[1] > 0 ) ? ( (Word32) 1 ) : ( (Word32) 0 ); - test(); + IF( out_pos[1] > 0 ) + { + i = (Word32) 1; + } + ELSE + { + i = (Word32) 0; + } move32(); } - out_pos[1] = out_tmp * ( i ); + out_pos[1] = W_extract_l( W_mult0_32_32( out_tmp, i ) ); + move32(); } out_tmp = L_sub( L_shr( obj->cal.room_H_fx, 1 ), obj->min_wall_dist_fx ); // Q.22 out_tmp1 = L_add( L_shr( L_negate( obj->cal.room_H_fx ), 1 ), obj->min_wall_dist_fx ); // Q.22 + test(); IF( GT_32( out_pos[2], out_tmp ) || LT_32( out_pos[2], out_tmp1 ) ) { - IF( LT_32( out_pos[2], 0 ) ) + IF( out_pos[2] < 0 ) { i = -1; move32(); } ELSE { - i = ( out_pos[2] > 0 ) ? ( (Word32) 1 ) : ( (Word32) 0 ); - test(); + IF( out_pos[2] > 0 ) + { + i = (Word32) 1; + } + ELSE + { + i = (Word32) 0; + } move32(); } - out_pos[2] = out_tmp * ( i ); + out_pos[2] = (Word32) W_mult0_32_32( out_tmp, (Word32) i ); + move32(); } return; @@ -470,10 +494,10 @@ static void shoebox_get_coord_fx( Word32 rcoselev; Word32 tmp_size_idx_1; Word32 n; - // assert( 0 ); + tmp_size_idx_1 = 3; move32(); - IF( EQ_16( obj->isCartesian, 0 ) ) + IF( obj->isCartesian == 0 ) { /* Convert Spherical to Cartesian */ #if 0 @@ -503,28 +527,29 @@ static void shoebox_get_coord_fx( { /* CARTESIAN CASE */ tmp_size_idx_1 = loop_ub; + move32(); FOR( n = 0; n < loop_ub; n++ ) { tmp_data[n] = src_pos_data[k + n]; move32(); } - IF( NE_16( obj->isZHeight, 0 ) ) + IF( obj->isZHeight != 0 ) { /* FIX Z COORDINATE */ - tmp_data[2] = L_sub( src_pos_data[k + 2], L_shr( obj->cal.room_H_fx, 1 ) ); + tmp_data[2] = L_sub( src_pos_data[L_add( k, 2 )], L_shr( obj->cal.room_H_fx, 1 ) ); + move32(); } } FOR( k = 0; k < tmp_size_idx_1; k++ ) { - obj->src_pos_fx[( coord + k ) - 1] = tmp_data[k]; //.22 + obj->src_pos_fx[L_add( coord, k ) - 1] = tmp_data[k]; //.22 move32(); } /* CENTER TO LISTENER */ - k = ( out_tmp + 1 ); - + k = L_add( out_tmp, 1 ); tmp_pos[0] = obj->src_pos_fx[k - 1]; //.22 tmp_pos[1] = obj->src_pos_fx[k]; @@ -533,11 +558,15 @@ static void shoebox_get_coord_fx( move32(); move32(); - IF( NE_16( isRelative, 0 ) ) + IF( isRelative != 0 ) { tmp_pos[0] = L_add( tmp_pos[0], obj->list_pos_fx[0] ); //.22 tmp_pos[1] = L_add( tmp_pos[1], obj->list_pos_fx[1] ); tmp_pos[2] = L_add( tmp_pos[2], obj->list_pos_fx[2] ); + + move32(); + move32(); + move32(); } return; @@ -612,8 +641,6 @@ static Word32 shoebox_get_euclidian_distance_internal_fx( Word32 absxk, out_tmp, t; Word16 q; - // assert( 0 ); - absxk = L_abs( L_sub( obj->list_pos_fx[0], tmp_pos[0] ) ); // Q.22-Q22 IF( GT_32( absxk, ER_EUCLIDEAN_SCALE_FX ) ) @@ -625,9 +652,9 @@ static Word32 shoebox_get_euclidian_distance_internal_fx( } ELSE { - t = absxk * ER_RECIPROCAL_EUCLIDEAN_SCALE_FX; // Q22 - out_tmp = Mpy_32_32( t, t ); // Q13 - out_tmp = L_shl( out_tmp, 9 ); // Q22 + t = (Word32) W_mult0_32_32( absxk, ER_RECIPROCAL_EUCLIDEAN_SCALE_FX ); // Q22 + out_tmp = Mpy_32_32( t, t ); // Q13 + out_tmp = L_shl( out_tmp, 9 ); // Q22 } absxk = L_abs( L_sub( obj->list_pos_fx[1], tmp_pos[1] ) ); @@ -852,15 +879,15 @@ void ivas_shoebox_set_scene( shoebox_output_t *ER_PARAMS, const Word32 list_pos_fx[3], const Word32 src_pos_data[], - const uint16_t isCartesian, - const uint16_t isRelative ) + const UWord16 isCartesian, + const UWord16 isRelative ) { Word32 tmp_pos_fx[3]; Word32 out_tmp; - Word32 i, j, k, n; + Word32 k, n; Word32 loop_ub, out_tmp_fx; - Word16 q_format1, q_format; + Word16 q_format1, q_format, i, j; /* ------------- SET FLAGS ------------- */ obj->isCartesian = isCartesian; @@ -868,11 +895,11 @@ void ivas_shoebox_set_scene( move16(); move16(); /* ------------- CHECK DIMENSIONS ------------- */ - if ( GE_16( ER_PARAMS->n_sources, obj->MAX_SOURCES ) ) + IF( GE_16( ER_PARAMS->n_sources, obj->MAX_SOURCES ) ) { obj->nSrc = obj->MAX_SOURCES; } - else + ELSE { obj->nSrc = ER_PARAMS->n_sources; } @@ -887,9 +914,10 @@ void ivas_shoebox_set_scene( move32(); move32(); /* ---------- ADJUST LISTENER ------------- */ - IF( NE_16( obj->isZHeight, 0 ) ) + if ( obj->isZHeight != 0 ) { obj->list_pos_fx[2] = L_sub( list_pos_fx[2], L_shr( obj->cal.room_H_fx, 1 ) ); // Q.22 + move32(); } tmp_pos_fx[1] = obj->list_pos_fx[1]; tmp_pos_fx[2] = obj->list_pos_fx[2]; @@ -900,7 +928,7 @@ void ivas_shoebox_set_scene( /* ---------- SOURCE LOOP ------------- */ - i = (Word32) obj->nSrc; + i = obj->nSrc; move32(); FOR( j = 0; j < i; j++ ) { @@ -909,7 +937,7 @@ void ivas_shoebox_set_scene( Word32 coord; /* idx = single(i); */ - out_tmp = 3 * j; + out_tmp = L_mult0( 3, j ); /* GET COORDINATE IN CARTESIAN ABSOLUTE FORMAT */ k = out_tmp; move32(); @@ -920,7 +948,7 @@ void ivas_shoebox_set_scene( FOR( n = 0; n < loop_ub; n++ ) { - fcnOutput_data_fx[n] = src_pos_data[k + n]; + fcnOutput_data_fx[n] = src_pos_data[L_add( k, n )]; move32(); } @@ -930,7 +958,8 @@ void ivas_shoebox_set_scene( scale_fx = ER_EUCLIDEAN_SCALE_FX; move32(); out_tmp_fx = shoebox_get_euclidian_distance_internal_fx( obj, tmp_pos_fx, &scale_fx ); - q_format = sub( Q31, Q22 ); + q_format = Q31 - Q22; + move16(); out_tmp_fx = Sqrt32( out_tmp_fx, &q_format ); out_tmp_fx = Mpy_32_32( scale_fx, out_tmp_fx ); obj->src_dist_fx[j] = L_shl( out_tmp_fx, q_format ); // Q22 @@ -963,7 +992,7 @@ void ivas_shoebox_set_scene( /* Retrieve coordinate and surface sign */ coord = L_shr( loop_ub, 1 ); // tbl - rcoselev = L_add( L_add( loop_ub, 1 ), ( ER_PARAMS->n_ref * j ) ); + rcoselev = L_add( L_add( loop_ub, 1 ), L_mult( (Word16) ER_PARAMS->n_ref, j ) ); /* Initialize image position coordinates */ im_pos_fx[0] = tmp_pos_fx[0]; // Q:22 @@ -992,15 +1021,17 @@ void ivas_shoebox_set_scene( im_pos_fx[coord] = - tmp_pos_fx[coord] + - ( ( ( ( ( -( 1 - ( ( ( loop_ub + 1 ) & 1 ) << 1 ) ) ) * scale_fx ) >> 1 ) - tmp_pos_fx[coord] ) << 1 ); // Q:22 + L_add( tmp_pos_fx[coord], + L_shl( L_sub( L_shr( (Word32) W_mult0_32_32( ( L_negate( L_sub( 1, L_shl( L_and( L_add( loop_ub, 1 ), 1 ), 1 ) ) ) ), scale_fx ), 1 ), tmp_pos_fx[coord] ), 1 ) ); // Q:22 + move32(); /* 0. Get euclidean distance from IMAGE SOURCE [N,W] to LIST */ scale_fx = ER_EUCLIDEAN_SCALE_FX; // Q:22 move32(); path_dist_fx = shoebox_get_euclidian_distance_internal_fx( obj, im_pos_fx, &scale_fx ); // Uutput :Q:22 - q_format = sub( Q31, Q22 ); + q_format = Q31 - Q22; + move16(); path_dist_fx = Sqrt32( path_dist_fx, &q_format ); // Input: Q:22, Output : Q.30 path_dist_fx = Mpy_32_32( scale_fx, path_dist_fx ); // Q22 * Q = Q @@ -1009,11 +1040,13 @@ void ivas_shoebox_set_scene( /* 1. Compute time-of arrival (TOA) */ ER_PARAMS->times.data_fx[rcoselev - 1] = Mpy_32_32( path_dist_fx, obj->soundspeed_fx ); // Q.22 + move32(); /* 2./3. DOA */ sub_im_nd_list_pos_1 = L_sub( im_pos_fx[1], obj->list_pos_fx[1] ); // Q.22 sub_im_nd_list_pos_0 = L_sub( im_pos_fx[0], obj->list_pos_fx[0] ); // Q.22 - q_format = sub( Q22, Q22 ); + q_format = Q22 - Q22; + move16(); atan_pos = BASOP_util_atan2( sub_im_nd_list_pos_1, sub_im_nd_list_pos_0, q_format ); // Q.13 az_angle_d = rad2deg_fx( atan_pos ); // Q.23 ER_PARAMS->az_angle.data_fx[rcoselev - 1] = az_angle_d; @@ -1022,19 +1055,20 @@ void ivas_shoebox_set_scene( q_format = Q22; move16(); - sub_im_nd_list_div_path = BASOP_Util_Divide3232_Scale( ( im_pos_fx[2] - obj->list_pos_fx[2] ), path_dist_fx, &q_format ); + sub_im_nd_list_div_path = BASOP_Util_Divide3232_Scale( ( L_sub( im_pos_fx[2], obj->list_pos_fx[2] ) ), path_dist_fx, &q_format ); sub_im_nd_list_div_path = L_shl( sub_im_nd_list_div_path, q_format ); sub_im_nd_list_div_path = L_deposit_h( (Word16) sub_im_nd_list_div_path ); sub_im_nd_list_div_path_sq = Mpy_32_32( sub_im_nd_list_div_path, sub_im_nd_list_div_path ); sub_im_nd_list_div_path_sq = L_shr( sub_im_nd_list_div_path_sq, 1 ); one_minus_sub_im_nd_list_div_path_sq = L_sub( L_shl( 1, Q30 ), sub_im_nd_list_div_path_sq ); - q_format1 = sub( Q31, Q30 ); + q_format1 = Q31 - Q30; + move16(); one_minus_sub_im_nd_list_div_path_sq_rt = Sqrt32( one_minus_sub_im_nd_list_div_path_sq, &q_format1 ); one_minus_sub_im_nd_list_div_path_sq_rt = L_shl( one_minus_sub_im_nd_list_div_path_sq_rt, q_format1 ); - q_format_n = sub( Q31, Q31 ); + q_format_n = Q31 - Q31; asin_val = BASOP_util_atan2( sub_im_nd_list_div_path, one_minus_sub_im_nd_list_div_path_sq_rt, q_format_n ); // Q13 asin_val_deg = rad2deg_fx( asin_val ); // Q.23 @@ -1061,6 +1095,7 @@ void ivas_shoebox_set_scene( pro_pd_air_coeff = Mpy_32_32( path_dist_fx, obj->air_coeff_fx ); // Q.22 *Q.31 =Q.22 result_gain = L_sub( product, pro_pd_air_coeff ); ER_PARAMS->gains.data_fx[rcoselev - 1] = result_gain; + move32(); } } return; diff --git a/lib_rend/ivas_td_decorr.c b/lib_rend/ivas_td_decorr.c index a2aa03d69..2e14388f8 100644 --- a/lib_rend/ivas_td_decorr.c +++ b/lib_rend/ivas_td_decorr.c @@ -136,7 +136,12 @@ static Word16 ivas_get_APD_filt_orders_fx( const Word16 num_out_chans, const Wor #else static Word16 ivas_get_APD_filt_orders( const Word16 num_out_chans, const Word32 output_Fs, Word16 *APD_filt_orders ); #endif + +#ifdef IVAS_FLOAT_FIXED static void ivas_td_decorr_init( ivas_td_decorr_state_t *hTdDecorr, const Word16 num_out_chans, const Word16 ducking_flag ); +#else +static void ivas_td_decorr_init( ivas_td_decorr_state_t *hTdDecorr, const int16_t num_out_chans, const int16_t ducking_flag ); +#endif /*------------------------------------------------------------------------- * ivas_td_decorr_reconfig_dec() @@ -158,39 +163,51 @@ ivas_error ivas_td_decorr_reconfig_dec( ivas_error error; useTdDecorr_new = 0; - IF( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) + move16(); + + test(); + IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) { - IF( nchan_transport == 1 ) + if ( EQ_16( nchan_transport, 1 ) ) { useTdDecorr_new = 1; + move16(); } } - ELSE IF( ivas_format == MASA_FORMAT ) + ELSE IF( EQ_32( ivas_format, MASA_FORMAT ) ) { - IF( ( LT_32( ivas_total_brate, IVAS_48k ) && nchan_transport == 1 ) || LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) ) + test(); + test(); + if ( ( LT_32( ivas_total_brate, IVAS_48k ) && EQ_16( nchan_transport, 1 ) ) || LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) ) { useTdDecorr_new = 1; + move16(); } } - ELSE IF( ivas_format == MC_FORMAT ) + ELSE IF( EQ_32( ivas_format, MC_FORMAT ) ) { - IF( LT_32( ivas_total_brate, IVAS_48k ) && EQ_16( nchan_transport, 1 ) ) + test(); + if ( LT_32( ivas_total_brate, IVAS_48k ) && EQ_16( nchan_transport, 1 ) ) { useTdDecorr_new = 1; + move16(); } } - IF( *useTdDecorr != useTdDecorr_new ) + IF( NE_32( *useTdDecorr, useTdDecorr_new ) ) { *useTdDecorr = useTdDecorr_new; + move16(); IF( *useTdDecorr ) { - IF( GE_32( ivas_total_brate, IVAS_13k2 ) && ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) ) + test(); + test(); + IF( GE_32( ivas_total_brate, IVAS_13k2 ) && ( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) ) { IF( *hTdDecorr == NULL ) { - IF( ( error = ivas_td_decorr_dec_open_fx( hTdDecorr, output_Fs, 3, 1 ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_decorr_dec_open_fx( hTdDecorr, output_Fs, 3, 1 ) ), IVAS_ERR_OK ) ) { return error; } @@ -199,17 +216,19 @@ ivas_error ivas_td_decorr_reconfig_dec( IF( LT_32( ivas_total_brate, IVAS_24k4 ) ) { ( *hTdDecorr )->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR; + move32(); } ELSE { ( *hTdDecorr )->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN; + move32(); } } ELSE { IF( *hTdDecorr == NULL ) { - IF( ( error = ivas_td_decorr_dec_open_fx( hTdDecorr, output_Fs, 3, 0 ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_decorr_dec_open_fx( hTdDecorr, output_Fs, 3, 0 ) ), IVAS_ERR_OK ) ) { return error; } @@ -231,80 +250,80 @@ ivas_error ivas_td_decorr_reconfig_dec( #else ivas_error ivas_td_decorr_reconfig_dec( const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word32 ivas_total_brate, /* i : total IVAS bitrate */ - const Word16 nchan_transport, /* i : number of transport channels */ - const Word32 output_Fs, /* i : output sampling rate */ + const int32_t ivas_total_brate, /* i : total IVAS bitrate */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int32_t output_Fs, /* i : output sampling rate */ ivas_td_decorr_state_t **hTdDecorr, /* i/o: TD decorrelator handle */ - UWord16 *useTdDecorr /* i/o: TD decorrelator flag */ + uint16_t *useTdDecorr /* i/o: TD decorrelator flag */ ) { - UWord16 useTdDecorr_new; + uint16_t useTdDecorr_new; ivas_error error; useTdDecorr_new = 0; - IF( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) + if ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) { - IF( nchan_transport == 1 ) + if ( nchan_transport == 1 ) { useTdDecorr_new = 1; } } - ELSE IF( ivas_format == MASA_FORMAT ) + else if ( ivas_format == MASA_FORMAT ) { - IF( ( LT_32( ivas_total_brate, IVAS_48k ) && nchan_transport == 1 ) || LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) ) + if ( ( ivas_total_brate < IVAS_48k && nchan_transport == 1 ) || ivas_total_brate < MASA_STEREO_MIN_BITRATE ) { useTdDecorr_new = 1; } } - ELSE IF( ivas_format == MC_FORMAT ) + else if ( ivas_format == MC_FORMAT ) { - IF( LT_32( ivas_total_brate, IVAS_48k ) && EQ_16( nchan_transport, 1 ) ) + if ( ivas_total_brate < IVAS_48k && nchan_transport == 1 ) { useTdDecorr_new = 1; } } - IF( *useTdDecorr != useTdDecorr_new ) + if ( *useTdDecorr != useTdDecorr_new ) { *useTdDecorr = useTdDecorr_new; - IF( *useTdDecorr ) + if ( *useTdDecorr ) { - IF( GE_32( ivas_total_brate, IVAS_13k2 ) && ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) ) + if ( ivas_total_brate >= IVAS_13k2 && ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) ) { - IF( *hTdDecorr == NULL ) + if ( *hTdDecorr == NULL ) { - IF( ( error = ivas_td_decorr_dec_open( hTdDecorr, output_Fs, 3, 1 ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_decorr_dec_open( hTdDecorr, output_Fs, 3, 1 ) ) != IVAS_ERR_OK ) { return error; } } - IF( LT_32( ivas_total_brate, IVAS_24k4 ) ) + if ( ivas_total_brate < IVAS_24k4 ) { ( *hTdDecorr )->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR; } - ELSE + else { ( *hTdDecorr )->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN; } } - ELSE + else { - IF( *hTdDecorr == NULL ) + if ( *hTdDecorr == NULL ) { - IF( ( error = ivas_td_decorr_dec_open( hTdDecorr, output_Fs, 3, 0 ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_decorr_dec_open( hTdDecorr, output_Fs, 3, 0 ) ) != IVAS_ERR_OK ) { return error; } } - ELSE + else { ivas_td_decorr_init( *hTdDecorr, 3, 0 ); } } } - ELSE + else { ivas_td_decorr_dec_close( hTdDecorr ); } @@ -329,32 +348,39 @@ ivas_error ivas_td_decorr_dec_open_fx( ) { Word16 i, j, len; - Word16 num_out_chans; + Word16 num_out_chans, buf_len; ivas_td_decorr_state_t *hTdDecorr_loc; ivas_error error; - num_out_chans = nchan_internal - 1; + buf_len = extract_l( Mpy_32_32( output_Fs, 4294968 ) ); + // IVAS_DECORR_PARM_LOOKAHEAD_TAU * 2 ^ 31 -> 4294968 + + num_out_chans = sub( nchan_internal, 1 ); error = IVAS_ERR_OK; + move32(); IF( ( hTdDecorr_loc = (ivas_td_decorr_state_t *) malloc( sizeof( ivas_td_decorr_state_t ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory FOR SPAR COV decoder" ); } - IF( ( hTdDecorr_loc->look_ahead_buf = (Word32 *) malloc( sizeof( Word32 ) * (Word16) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ) ) ) == NULL ) + IF( ( hTdDecorr_loc->look_ahead_buf = (Word32 *) malloc( sizeof( Word32 ) * buf_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory FOR SPAR COV decoder" ); } - set32_fx( hTdDecorr_loc->look_ahead_buf, 0, (Word16) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ) ); - hTdDecorr_loc->offset = (Word16) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ); + set32_fx( hTdDecorr_loc->look_ahead_buf, 0, buf_len ); + hTdDecorr_loc->offset = buf_len; hTdDecorr_loc->num_apd_sections = ivas_get_APD_filt_orders_fx( num_out_chans, output_Fs, hTdDecorr_loc->APD_filt_state[0].order ); + move16(); + move16(); FOR( j = 0; j < num_out_chans; j++ ) { FOR( i = 0; i < hTdDecorr_loc->num_apd_sections; i++ ) { len = hTdDecorr_loc->APD_filt_state[0].order[i]; + move16(); IF( ( hTdDecorr_loc->APD_filt_state[j].state[i] = (Word32 *) malloc( sizeof( Word32 ) * len ) ) == NULL ) { @@ -369,7 +395,7 @@ ivas_error ivas_td_decorr_dec_open_fx( IF( ducking_flag ) { - IF( ( error = ivas_transient_det_open( &hTdDecorr_loc->pTrans_det, output_Fs ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_transient_det_open( &hTdDecorr_loc->pTrans_det, output_Fs ) ), IVAS_ERR_OK ) ) { return error; } @@ -466,6 +492,7 @@ void ivas_td_decorr_dec_close( { Word16 i, j; + test(); IF( hTdDecorr == NULL || *hTdDecorr == NULL ) { return; @@ -508,6 +535,7 @@ static Word16 ivas_get_APD_filt_orders_fx( { Word16 i; Word16 num_apd_sections = 0; + move16(); Word32 sum_R, R[IVAS_MAX_DECORR_APD_SECTIONS]; SWITCH( num_out_chans ) @@ -515,16 +543,19 @@ static Word16 ivas_get_APD_filt_orders_fx( case IVAS_TD_DECORR_OUT_1CH: case IVAS_TD_DECORR_OUT_2CH: num_apd_sections = IVAS_APD_2_SECT; + move16(); BREAK; case IVAS_TD_DECORR_OUT_3CH: case IVAS_TD_DECORR_OUT_4CH: num_apd_sections = IVAS_APD_4_SECT; + move16(); BREAK; case IVAS_TD_DECORR_OUT_5CH: case IVAS_TD_DECORR_OUT_6CH: case IVAS_TD_DECORR_OUT_7CH: case IVAS_TD_DECORR_OUT_8CH: num_apd_sections = IVAS_APD_8_SECT; + move16(); BREAK; default: assert( !"Invalid num out chans" ); @@ -532,15 +563,18 @@ static Word16 ivas_get_APD_filt_orders_fx( } sum_R = 0; + move32(); FOR( i = 0; i < num_apd_sections; i++ ) { R[i] = ivas_three_pow_frac[i]; + move32(); sum_R = L_add( sum_R, R[i] ); } FOR( i = 0; i < num_apd_sections; i++ ) { - APD_filt_orders[i] = (Word16) L_shr( Mpy_32_32( L_shl( output_Fs, Q15 ), Mpy_32_32( IVAS_DECORR_PARM_APD_TAU, L_shl( (Word32) divide3232( R[i], sum_R ), Q15 ) ) ), Q14 ) + 1; + APD_filt_orders[i] = (Word16) L_add( L_shr( Mpy_32_32( L_shl( output_Fs, Q15 ), Mpy_32_32( IVAS_DECORR_PARM_APD_TAU, L_shl( (Word32) divide3232( R[i], sum_R ), Q15 ) ) ), Q14 ), 1 ); + move16(); } return num_apd_sections; @@ -604,6 +638,7 @@ static int16_t ivas_get_APD_filt_orders( * TD decorr Initialisation function *-----------------------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void ivas_td_decorr_init( ivas_td_decorr_state_t *hTdDecorr, /* i/o: TD decorrelator handle */ const int16_t num_out_chans, /* i : number of channels */ @@ -627,6 +662,37 @@ static void ivas_td_decorr_init( return; } +#else +static void ivas_td_decorr_init( + ivas_td_decorr_state_t *hTdDecorr, /* i/o: TD decorrelator handle */ + const Word16 num_out_chans, /* i : number of channels */ + const Word16 ducking_flag /* i : TD ducking flag */ +) +{ + Word16 i, j; + + hTdDecorr->ducking_flag = ducking_flag; + hTdDecorr->num_apd_outputs = num_out_chans; + move16(); + move16(); + + FOR( i = 0; i < hTdDecorr->num_apd_outputs; i++ ) + { + FOR( j = 0; j < hTdDecorr->num_apd_sections; j++ ) + { + hTdDecorr->APD_filt_state[i].order[j] = hTdDecorr->APD_filt_state[0].order[j]; + hTdDecorr->APD_filt_state[i].coeffs[j] = ivas_hadamard_decorr_APD_coeff[i][j]; + hTdDecorr->APD_filt_state[i].idx[j] = 0; + + move16(); + move16(); + move16(); + } + } + + return; +} +#endif #ifndef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------------------------------* @@ -777,23 +843,31 @@ void ivas_td_decorr_APD_iir_filter_fx( Word32 *pFilt_state = filter_state->state[k]; Word16 filt_coeff = filter_state->coeffs[k]; Word16 order = filter_state->order[k]; + move16(); + move16(); idx = filter_state->idx[k]; + move16(); FOR( i = 0; i < length; i++ ) { tmp_pIn_buf_i = pIn[i]; + move32(); pOut[i] = Madd_32_16( pFilt_state[idx], pIn[i], filt_coeff ); + move32(); pFilt_state[idx++] = Msub_32_16( tmp_pIn_buf_i, pOut[i], filt_coeff ); + move32(); - IF( order == idx ) + if ( EQ_16( order, idx ) ) { idx = 0; + move16(); } } filter_state->idx[k] = idx; + move16(); } return; @@ -832,11 +906,12 @@ void ivas_td_decorr_process_fx( const Word16 output_frame, /* i : output frame length */ Word16 *q_format ) { + UNUSED_PARAM( *q_format ); Word16 i, j; Word32 in_duck_gain[L_FRAME48k], out_duck_gain[L_FRAME48k]; /* Look-ahead delay */ - mvl2l( pcm_in[0], ppOut_pcm[0], output_frame ); + Copy32( pcm_in[0], ppOut_pcm[0], output_frame ); delay_signal_fx( ppOut_pcm[0], output_frame, hTdDecorr->look_ahead_buf, hTdDecorr->offset ); /* In ducking gains */ @@ -847,13 +922,13 @@ void ivas_td_decorr_process_fx( FOR( j = 0; j < output_frame; j++ ) { ppOut_pcm[0][j] = L_shl( Mpy_32_32( ppOut_pcm[0][j], in_duck_gain[j] ), 1 ); + move32(); } - *q_format -= 0; } FOR( i = 1; i < hTdDecorr->num_apd_outputs; i++ ) { - mvl2l( ppOut_pcm[0], ppOut_pcm[i], output_frame ); + Copy32( ppOut_pcm[0], ppOut_pcm[i], output_frame ); } /* All pass delay section */ @@ -867,9 +942,9 @@ void ivas_td_decorr_process_fx( FOR( j = 0; j < output_frame; j++ ) { ppOut_pcm[i][j] = L_shl( Mpy_32_32( ppOut_pcm[i][j], out_duck_gain[j] ), 1 ); + move32(); } } - *q_format -= 0; } return; diff --git a/lib_rend/ivas_vbap.c b/lib_rend/ivas_vbap.c index a69c70609..bc8090c7a 100644 --- a/lib_rend/ivas_vbap.c +++ b/lib_rend/ivas_vbap.c @@ -141,7 +141,7 @@ static UWord8 vector_matrix_multiply_3x3_32_fx( const Word32 *src_vector, Word32 static void init_speaker_node_direction_data_fx( VBAP_SPEAKER_NODE *speaker_node_data, const Word32 *speaker_node_azi_deg_fx, const Word32 *speaker_node_ele_deg_fx, const int16_t num_speaker_nodes ); -static int16_t determine_virtual_surface_triplets_fx( const int16_t num_speaker_nodes, const VBAP_SPEAKER_NODE *speaker_node_data, int16_t connections[][2], const int16_t max_num_connections, VBAP_VS_TRIPLET *triplets, int16_t initial_search_indices[VBAP_NUM_SEARCH_SECTORS], enum SpeakerNodeGroup allowed_group ); +static Word16 determine_virtual_surface_triplets_fx( const Word16 num_speaker_nodes, const VBAP_SPEAKER_NODE *speaker_node_data, Word16 connections[][2], const Word16 max_num_connections, VBAP_VS_TRIPLET *triplets, Word16 initial_search_indices[VBAP_NUM_SEARCH_SECTORS], enum SpeakerNodeGroup allowed_group ); static void determine_initial_search_indices_fx( const int16_t num_triplets, const Word32 triplet_azidegs_fx[VBAP_MAX_NUM_TRIPLETS], int16_t initial_search_indices[VBAP_NUM_SEARCH_SECTORS] ); @@ -231,6 +231,7 @@ ivas_error vbap_init_data_fx( /* If the requested layout is invalid, hVBAPdata is set to NULL and the signal will * be distributed with an equal gain into all output channels. * The surrounding code needs to handle the NULL pointer properly. */ + test(); IF( GT_16( num_speaker_nodes, VBAP_MAX_NUM_SPEAKER_NODES ) || LT_16( num_speaker_nodes, 3 ) ) { hVBAPdata = NULL; @@ -238,6 +239,7 @@ ivas_error vbap_init_data_fx( return IVAS_ERR_OK; } + test(); IF( !speaker_node_azi_deg_fx || !speaker_node_ele_deg_fx ) { hVBAPdata = NULL; @@ -251,6 +253,7 @@ ivas_error vbap_init_data_fx( } is_success = 1; + move16(); vbap->bottom_virtual_speaker_node_index = -1; move16(); vbap->top_virtual_speaker_node_index = -1; @@ -299,6 +302,8 @@ ivas_error vbap_init_data_fx( } speaker_node_azi_deg_internal_fx[vbap->bottom_virtual_speaker_node_index] = 0; speaker_node_ele_deg_internal_fx[vbap->bottom_virtual_speaker_node_index] = -377487360; /*-90.0f in Q22*/ + move32(); + move32(); } test(); IF( is_success && NE_16( virtual_top_type, NO_VIRTUAL_SPEAKER_NODE ) ) @@ -321,6 +326,8 @@ ivas_error vbap_init_data_fx( } speaker_node_azi_deg_internal_fx[vbap->top_virtual_speaker_node_index] = 0; speaker_node_ele_deg_internal_fx[vbap->top_virtual_speaker_node_index] = 377487360; /*90.0f in Q22*/ + move32(); + move16(); } test(); IF( is_success && NE_16( virtual_back_type, NO_VIRTUAL_SPEAKER_NODE ) ) @@ -343,6 +350,9 @@ ivas_error vbap_init_data_fx( } speaker_node_azi_deg_internal_fx[vbap->back_virtual_speaker_node_index] = 754974720; speaker_node_ele_deg_internal_fx[vbap->back_virtual_speaker_node_index] = 0; + + move32(); + move16(); } init_speaker_node_direction_data_fx( speaker_node_data, speaker_node_azi_deg_internal_fx, speaker_node_ele_deg_internal_fx, vbap->num_speaker_nodes_internal ); #ifdef TRUE0 @@ -359,7 +369,7 @@ ivas_error vbap_init_data_fx( /* Allocate and determine node-node connections */ max_num_connections = mult0( ( sub( vbap->num_speaker_nodes_internal, 2 ) ), 3 ); /* Theoretical maximum */ - IF( ( error = determine_connections_fx( vbap->num_speaker_nodes_internal, speaker_node_data, connections, max_num_connections, &connection_group1_count, &connection_group2_start, &connection_group2_count ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = determine_connections_fx( vbap->num_speaker_nodes_internal, speaker_node_data, connections, max_num_connections, &connection_group1_count, &connection_group2_start, &connection_group2_count ) ), IVAS_ERR_OK ) ) { return error; } @@ -373,7 +383,7 @@ ivas_error vbap_init_data_fx( move16(); Word16 speaker_nodes_horiz_internal = 0; move16(); - uint8_t loop_done = 0; + UWord8 loop_done = 0; /* Count nodes in different groups to reserve correct memory */ FOR( ch = 0; ch < vbap->num_speaker_nodes_internal && !loop_done; ch++ ) @@ -409,7 +419,7 @@ ivas_error vbap_init_data_fx( } is_success &= vbap->search_struct[0].triplets != NULL; - IF( GT_16( speaker_nodes_group2_internal, 0 ) ) + IF( speaker_nodes_group2_internal > 0 ) { vbap->num_search_structs = 2; move16(); @@ -446,10 +456,12 @@ ivas_error vbap_init_data_fx( IF( is_success ) { Word16 max_exp = 31; + move16(); + determine_virtual_speaker_node_division_gains_fx( vbap->top_virtual_speaker_node_index, vbap->top_virtual_speaker_node_division_gains_fx, &max_exp, connections, virtual_top_type, max_num_connections, num_speaker_nodes, 0 ); determine_virtual_speaker_node_division_gains_fx( vbap->bottom_virtual_speaker_node_index, vbap->bottom_virtual_speaker_node_division_gains_fx, &max_exp, connections, virtual_bottom_type, max_num_connections, num_speaker_nodes, 0 ); determine_virtual_speaker_node_division_gains_fx( vbap->back_virtual_speaker_node_index, vbap->back_virtual_speaker_node_division_gains_fx, &max_exp, connections, virtual_back_type, max_num_connections, num_speaker_nodes, 0 ); - IF( ivas_format == MASA_ISM_FORMAT ) + IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) ) { determine_virtual_speaker_node_division_gains_fx( vbap->top_virtual_speaker_node_index, vbap->object_mode_top_virtual_speaker_node_division_gains_fx, &max_exp, connections, virtual_top_type == NO_VIRTUAL_SPEAKER_NODE ? NO_VIRTUAL_SPEAKER_NODE : VIRTUAL_SPEAKER_NODE_DISTRIBUTE_ENERGY, max_num_connections, num_speaker_nodes, 1 ); determine_virtual_speaker_node_division_gains_fx( vbap->bottom_virtual_speaker_node_index, vbap->object_mode_bottom_virtual_speaker_node_division_gains_fx, &max_exp, connections, virtual_bottom_type == NO_VIRTUAL_SPEAKER_NODE ? NO_VIRTUAL_SPEAKER_NODE : VIRTUAL_SPEAKER_NODE_DISTRIBUTE_ENERGY, max_num_connections, num_speaker_nodes, 1 ); @@ -731,6 +743,7 @@ void vbap_free_data_fx( VBAP_HANDLE *hVBAPdata /* i/o: VBAP handle to be freed */ ) { + test(); IF( hVBAPdata == NULL || *hVBAPdata == NULL ) { return; @@ -760,11 +773,13 @@ void vbap_free_data_fx( { free( ( *hVBAPdata )->object_mode_back_virtual_speaker_node_division_gains_fx ); } - if ( ( *hVBAPdata )->search_struct[0].triplets != NULL ) + IF( ( *hVBAPdata )->search_struct[0].triplets != NULL ) { free( ( *hVBAPdata )->search_struct[0].triplets ); } - if ( ( *hVBAPdata )->num_search_structs == 2 && ( *hVBAPdata )->search_struct[1].triplets != NULL ) + + test(); + IF( EQ_16( ( *hVBAPdata )->num_search_structs, 2 ) && ( *hVBAPdata )->search_struct[1].triplets != NULL ) { free( ( *hVBAPdata )->search_struct[1].triplets ); } @@ -889,9 +904,13 @@ void vbap_determine_gains_fx( panning_unit_vec_fx[0] = mult( getCosWord16R2( (Word16) azi_norm ), getCosWord16R2( (Word16) ele_norm ) ); panning_unit_vec_fx[1] = mult( getSineWord16R2( (Word16) azi_norm ), getCosWord16R2( (Word16) ele_norm ) ); panning_unit_vec_fx[2] = getSineWord16R2( (Word16) ele_norm ); + move16(); + move16(); + /* Find the best VS triplet and speaker node gains for the panning direction using the prepared search structures. */ - IF( EQ_16( hVBAPdata->num_search_structs, 2 ) && GT_16( ele_deg, 0 ) ) + test(); + IF( EQ_16( hVBAPdata->num_search_structs, 2 ) && ele_deg > 0 ) { triplet_index = determine_best_triplet_and_gains_fx( &( hVBAPdata->search_struct[1] ), panning_unit_vec_fx, azi_deg, gain_triplet_fx ); move16(); @@ -917,11 +936,13 @@ void vbap_determine_gains_fx( FOR( ch = 0; ch < 3; ch++ ) { gain_triplet_fx[ch] = Mpy_32_32( gain_triplet_fx[ch], norm_value_fx ); // Q16 + move32(); /* Sanity check for rounding issues */ - IF( LT_32( gain_triplet_fx[ch], 0 ) ) + if ( gain_triplet_fx[ch] < 0 ) { gain_triplet_fx[ch] = 0; + move32(); } } @@ -938,6 +959,7 @@ void vbap_determine_gains_fx( FOR( ch2 = 0; ch2 < num_speaker_nodes; ch2++ ) { gains_fx[ch2] = L_add( gains_fx[ch2], L_shl( Mpy_32_16_1( gain_triplet_fx[ch], bottom_virtual_speaker_node_division_gains_fx[ch2] ), 13 ) ); // Q29 + move32(); } } ELSE IF( EQ_16( triplet_ch, top_virtual_speaker_node_index ) ) @@ -945,6 +967,7 @@ void vbap_determine_gains_fx( FOR( ch2 = 0; ch2 < num_speaker_nodes; ch2++ ) { gains_fx[ch2] = L_add( gains_fx[ch2], L_shl( Mpy_32_16_1( gain_triplet_fx[ch], top_virtual_speaker_node_division_gains_fx[ch2] ), 13 ) ); // Q29 + move32(); } } ELSE IF( EQ_16( triplet_ch, back_virtual_speaker_node_index ) ) @@ -952,11 +975,13 @@ void vbap_determine_gains_fx( FOR( ch2 = 0; ch2 < num_speaker_nodes; ch2++ ) { gains_fx[ch2] = L_add( gains_fx[ch2], L_shl( Mpy_32_16_1( gain_triplet_fx[ch], back_virtual_speaker_node_division_gains_fx[ch2] ), 13 ) ); // Q29 + move32(); } } ELSE { gains_fx[triplet_ch] = L_add( gains_fx[triplet_ch], L_shl( gain_triplet_fx[ch], 13 ) ); // Q29 + move32(); } } @@ -1144,7 +1169,7 @@ static void vbap_crossp( #ifdef IVAS_FLOAT_FIXED /*! r: Status result if triplet is usable for panning. Allows early exit. */ -static uint8_t vector_matrix_multiply_3x3_fx( +static UWord8 vector_matrix_multiply_3x3_fx( const Word16 *src_vector, /* i : input vector */ Word32 matrix[3][3], /* i : input matrix */ Word32 *result, /* o : output vector */ @@ -1153,8 +1178,11 @@ static uint8_t vector_matrix_multiply_3x3_fx( result[0] = Mpy_32_16_1( matrix[0][0], src_vector[0] ); // q = q_matrix result[0] = L_add( result[0], Mpy_32_16_1( matrix[1][0], src_vector[1] ) ); result[0] = L_add( result[0], Mpy_32_16_1( matrix[2][0], src_vector[2] ) ); + move32(); + move32(); + move32(); - IF( result[0] < Mpy_32_16_1( 1 << q_matrix, -327 ) ) // 327 = 0.01 in Q = 15 + IF( LT_32( result[0], Mpy_32_16_1( L_lshl( 1, q_matrix ), -327 ) ) ) // 327 = 0.01 in Q = 15 { return 0; } @@ -1162,8 +1190,11 @@ static uint8_t vector_matrix_multiply_3x3_fx( result[1] = Mpy_32_16_1( matrix[0][1], src_vector[0] ); result[1] = L_add( result[1], Mpy_32_16_1( matrix[1][1], src_vector[1] ) ); result[1] = L_add( result[1], Mpy_32_16_1( matrix[2][1], src_vector[2] ) ); + move32(); + move32(); + move32(); - IF( result[1] < Mpy_32_16_1( 1 << q_matrix, -327 ) ) + IF( LT_32( result[1], Mpy_32_16_1( L_shl( 1, q_matrix ), -327 ) ) ) { return 0; } @@ -1171,8 +1202,11 @@ static uint8_t vector_matrix_multiply_3x3_fx( result[2] = Mpy_32_16_1( matrix[0][2], src_vector[0] ); result[2] = L_add( result[2], Mpy_32_16_1( matrix[1][2], src_vector[1] ) ); result[2] = L_add( result[2], Mpy_32_16_1( matrix[2][2], src_vector[2] ) ); + move32(); + move32(); + move32(); - IF( result[2] < Mpy_32_16_1( 1 << q_matrix, -327 ) ) + IF( LT_32( result[2], Mpy_32_16_1( L_shl( 1, q_matrix ), -327 ) ) ) { return 0; } @@ -1180,7 +1214,7 @@ static uint8_t vector_matrix_multiply_3x3_fx( return 1; } -static uint8_t vector_matrix_multiply_3x3_32_fx( +static UWord8 vector_matrix_multiply_3x3_32_fx( const Word32 *src_vector, /* i : input vector */ Word32 matrix[3][3], /* i : input matrix */ Word32 *result, /* o : output vector */ @@ -1189,8 +1223,10 @@ static uint8_t vector_matrix_multiply_3x3_32_fx( result[0] = Mpy_32_32( matrix[0][0], src_vector[0] ); // q = ( q_matrix + 30 ) - 31 result[0] = L_add( result[0], Mpy_32_32( matrix[1][0], src_vector[1] ) ); result[0] = L_add( result[0], Mpy_32_32( matrix[2][0], src_vector[2] ) ); - - IF( result[0] < Mpy_32_32( L_shl( 1, ( q_matrix - 1 ) ), -21474836 ) ) // 21474836 = 0.01 in Q = 31 + move32(); + move32(); + move32(); + IF( LT_32( result[0], Mpy_32_32( L_shl( 1, ( sub( q_matrix, 1 ) ) ), -21474836 ) ) ) // 21474836 = 0.01 in Q = 31 { return 0; } @@ -1198,7 +1234,11 @@ static uint8_t vector_matrix_multiply_3x3_32_fx( result[1] = Mpy_32_32( matrix[0][1], src_vector[0] ); result[1] = L_add( result[1], Mpy_32_32( matrix[1][1], src_vector[1] ) ); result[1] = L_add( result[1], Mpy_32_32( matrix[2][1], src_vector[2] ) ); - IF( result[1] < Mpy_32_32( L_shl( 1, ( q_matrix - 1 ) ), -21474836 ) ) // 21474836 = 0.01 in Q = 31 + + move32(); + move32(); + move32(); + IF( LT_32( result[1], Mpy_32_32( L_shl( 1, ( sub( q_matrix, 1 ) ) ), -21474836 ) ) ) // 21474836 = 0.01 in Q = 31 { return 0; } @@ -1207,7 +1247,10 @@ static uint8_t vector_matrix_multiply_3x3_32_fx( result[2] = L_add( result[2], Mpy_32_32( matrix[1][2], src_vector[1] ) ); result[2] = L_add( result[2], Mpy_32_32( matrix[2][2], src_vector[2] ) ); - IF( result[2] < Mpy_32_32( L_shl( 1, ( q_matrix - 1 ) ), -21474836 ) ) // 21474836 = 0.01 in Q = 31 + move32(); + move32(); + move32(); + IF( LT_32( result[2], Mpy_32_32( L_shl( 1, ( sub( q_matrix, 1 ) ) ), -21474836 ) ) ) // 21474836 = 0.01 in Q = 31 { return 0; } @@ -1327,14 +1370,14 @@ static Word16 determine_best_triplet_and_gains_fx( gains_fx[k] = unnormalized_gains_fx[k]; move32(); } - IF( !( best_min_gain_fx < 0 ) ) + IF( best_min_gain_fx >= 0 ) { return best_triplet; } } } tr = add( first_triplet, jump ); - IF( LT_16( tr, 0 ) ) + IF( tr < 0 ) { tr = add( tr, num_triplets ); } @@ -1344,7 +1387,7 @@ static Word16 determine_best_triplet_and_gains_fx( } jump = negate( jump ); - IF( GT_16( jump, 0 ) ) + IF( jump > 0 ) { jump = add( jump, 1 ); } @@ -1480,7 +1523,7 @@ static void determine_virtual_speaker_node_division_gains_fx( /* The second condition allows division gains only to actual loudspeakers */ test(); - IF( GE_16( connection_node, 0 ) && ( LT_16( connection_node, num_speaker_nodes ) ) ) + IF( connection_node > 0 && ( LT_16( connection_node, num_speaker_nodes ) ) ) { virtual_node_division_gains_fx[connection_node] = ONE_IN_Q14; move16(); @@ -1499,11 +1542,12 @@ static void determine_virtual_speaker_node_division_gains_fx( } Word16 final_exp = 0, res_exp; Word32 tmp_1, tmp_2, tmp_3; + move16(); FOR( ch = 0; ch < num_speaker_nodes; ch++ ) { - IF( NE_16( virtual_node_division_gains_fx[ch], 0 ) ) + IF( virtual_node_division_gains_fx[ch] != 0 ) { - BASOP_Util_Divide_MantExp( virtual_node_division_gains_fx[ch], 1, sum_val_fx, 1 + guard_bits, &virtual_node_division_gains_fx[ch], &final_exp ); // Q15 + BASOP_Util_Divide_MantExp( virtual_node_division_gains_fx[ch], 1, sum_val_fx, add( guard_bits, 1 ), &virtual_node_division_gains_fx[ch], &final_exp ); // Q15 } ELSE { @@ -1514,7 +1558,7 @@ static void determine_virtual_speaker_node_division_gains_fx( move16(); IF( use_object_mode ) { - IF( EQ_16( virtual_node_division_gains_fx[ch], 0 ) ) + IF( virtual_node_division_gains_fx[ch] == 0 ) { tmp_1 = 0; move16(); @@ -1530,6 +1574,7 @@ static void determine_virtual_speaker_node_division_gains_fx( exp_virtual_node_division_gains[ch] = res_exp; move16(); virtual_node_division_gains_fx[ch] = extract_h( tmp_3 ); + move16(); } } } @@ -1539,10 +1584,12 @@ static void determine_virtual_speaker_node_division_gains_fx( FOR( i = 0; i < num_speaker_nodes; i++ ) { *max_exp = s_max( *max_exp, exp_virtual_node_division_gains[i] ); + move16(); } FOR( i = 0; i < num_speaker_nodes; i++ ) { virtual_node_division_gains_fx[i] = shr( virtual_node_division_gains_fx[i], sub( *max_exp, exp_virtual_node_division_gains[i] ) ); + move16(); } } @@ -1631,6 +1678,7 @@ static enum VirtualSpeakerNodeType check_need_of_virtual_speaker_node_fx( Word16 ch; Word32 max_elevation_fx = 0; Word16 Flag1, Flag2, Flag3; + move32(); /* The following considers if SPEAKER_NODE_BACK virtual speaker is needed */ IF( EQ_16( group, SPEAKER_NODE_BACK ) ) @@ -1641,20 +1689,19 @@ static enum VirtualSpeakerNodeType check_need_of_virtual_speaker_node_fx( move16(); FOR( ch = 0; ch < hVBAPdata->num_speaker_nodes; ch++ ) { - Flag1 = BASOP_Util_Cmp_Mant32Exp( speaker_node_ele_deg_fx[ch], 31 - Q22, 23040 /*45.0f Q9*/, 31 - Q9 ); + Flag1 = BASOP_Util_Cmp_Mant32Exp( speaker_node_ele_deg_fx[ch], Q31 - Q22, 23040 /*45.0f Q9*/, Q31 - Q9 ); IF( EQ_16( Flag1, (Word16) -1 ) ) { Word16 azi_temp; azi_temp = extract_l( L_shr( Mpy_32_32( speaker_node_azi_deg_fx[ch], ONE_BY_180_Q31 ), Q8 ) ); /* Q15 */ - - Word16 cos_res = getCosWord16R2( azi_temp ); // Q15 + Word16 cos_res = getCosWord16R2( azi_temp ); // Q15 IF( LT_16( cos_res, virtual_back_epsilon_fx ) ) { virtual_back_needed = 0; move16(); - break; + BREAK; } } } @@ -1664,6 +1711,7 @@ static enum VirtualSpeakerNodeType check_need_of_virtual_speaker_node_fx( hVBAPdata->back_virtual_speaker_node_index = hVBAPdata->num_speaker_nodes_internal; move16(); hVBAPdata->num_speaker_nodes_internal = add( hVBAPdata->num_speaker_nodes_internal, 1 ); + move16(); return VIRTUAL_SPEAKER_NODE_DISTRIBUTE_ENERGY; } @@ -1675,7 +1723,7 @@ static enum VirtualSpeakerNodeType check_need_of_virtual_speaker_node_fx( { IF( EQ_16( group, SPEAKER_NODE_TOP_HALF ) ) { - IF( GT_32( speaker_node_ele_deg_fx[ch], max_elevation_fx ) ) + if ( GT_32( speaker_node_ele_deg_fx[ch], max_elevation_fx ) ) { max_elevation_fx = speaker_node_ele_deg_fx[ch]; move32(); @@ -1689,7 +1737,7 @@ static enum VirtualSpeakerNodeType check_need_of_virtual_speaker_node_fx( } } } - Flag2 = BASOP_Util_Cmp_Mant32Exp( max_elevation_fx, 31 - Q22, 23039 /*44.9990005 Q9*/, 31 - Q9 ); + Flag2 = BASOP_Util_Cmp_Mant32Exp( max_elevation_fx, Q31 - Q22, 23039 /*44.9990005 Q9*/, Q31 - Q9 ); IF( EQ_16( Flag2, 1 ) ) { return NO_VIRTUAL_SPEAKER_NODE; @@ -1708,7 +1756,8 @@ static enum VirtualSpeakerNodeType check_need_of_virtual_speaker_node_fx( } hVBAPdata->num_speaker_nodes_internal = add( hVBAPdata->num_speaker_nodes_internal, 1 ); - Flag3 = BASOP_Util_Cmp_Mant32Exp( max_elevation_fx, 31 - Q22, 20478 /*19.9990005 Q10*/, 31 - Q10 ); + move16(); + Flag3 = BASOP_Util_Cmp_Mant32Exp( max_elevation_fx, Q31 - Q22, 20478 /*19.9990005 Q10*/, Q31 - Q10 ); IF( EQ_16( Flag3, 1 ) ) { @@ -1821,7 +1870,10 @@ static void init_speaker_node_direction_data_fx( Word16 num_horiz = 0; UWord8 in_all_mode = TRUE; - + move32(); + move32(); + move32(); + move16(); FOR( ch = 0; ch < num_speaker_nodes; ch++ ) { speaker_node_data[ch].azi_deg_fx = speaker_node_azi_deg_fx[ch]; @@ -1845,7 +1897,7 @@ static void init_speaker_node_direction_data_fx( move32(); ele_rad_fx = extract_l( L_shr( Mpy_32_32( speaker_node_ele_deg_fx[ch], ONE_BY_180_Q31 ), Q8 ) ); - IF( LT_16( ele_rad_fx, 0 ) ) + IF( ele_rad_fx < 0 ) { speaker_node_data[ch].group = SPEAKER_NODE_BOTTOM_HALF; move16(); @@ -1874,6 +1926,7 @@ static void init_speaker_node_direction_data_fx( UWord16 temp; i = 0; + move16(); FOR( ch = 0; ch < num_speaker_nodes && i < num_horiz; ch++ ) { IF( EQ_16( speaker_node_data[ch].group, SPEAKER_NODE_HORIZONTAL ) ) @@ -1881,9 +1934,9 @@ static void init_speaker_node_direction_data_fx( Word16 exp1; Word32 Mant2 = BASOP_Util_Add_Mant32Exp( speaker_node_azi_deg_fx[ch], 31 - 22, 23040, 31 - 6, &exp1 ); - IF( LT_32( L_shr( speaker_node_azi_deg_fx[ch], 22 ), 0 ) ) + IF( L_shr( speaker_node_azi_deg_fx[ch], 22 ) < 0 ) { - horiz_azi[i] = (UWord16) L_shr( Mant2, 31 - exp1 ); + horiz_azi[i] = (UWord16) L_shr( Mant2, sub( 31, exp1 ) ); } ELSE { @@ -1902,7 +1955,7 @@ static void init_speaker_node_direction_data_fx( FOR( ch = 0; ch < sub( num_horiz, 1 ); ch++ ) { temp = sub( horiz_azi[ch + 1], horiz_azi[ch] ); - IF( GT_16( temp, largest_gap ) ) + if ( GT_16( temp, largest_gap ) ) { largest_gap = temp; move16(); @@ -1911,9 +1964,10 @@ static void init_speaker_node_direction_data_fx( /* If largest gap is small enough, we have definitive zero elevation plane. * Otherwise, we should assign all speaker nodes to one group. */ - IF( LE_16( largest_gap, VBAP_MAX_HORIZONTAL_GAP ) ) + if ( LE_16( largest_gap, VBAP_MAX_HORIZONTAL_GAP ) ) { in_all_mode = FALSE; + move16(); } } @@ -2047,12 +2101,16 @@ static void matrix_inverse_3x3_32_fx( vbap_crossp_fx( input_matrix_fx[1], input_matrix_fx[2], cross_vec_fx ); determinant_fx = dotp_fixed( input_matrix_fx[0], cross_vec_fx, 3 ); // Q30 + Q29 - Q31 = Q28 Word16 inv_mat_exp = 0; + move16(); FOR( k = 0; k < 3; k++ ) { inverse_matrix_fx[k][0] = L_deposit_h( BASOP_Util_Divide3232_Scale( cross_vec_fx[k], determinant_fx, &inv_mat_exp ) ); - inv_mat_exp = inv_mat_exp + ( ( 31 - 29 ) - ( 31 - 28 ) ); + inv_mat_exp = add( inv_mat_exp, ( ( 31 - 29 ) - ( 31 - 28 ) ) ); exp_inverse_matrix_fx[k][0] = inv_mat_exp; + + move32(); + move16(); } vbap_crossp_fx( input_matrix_fx[2], input_matrix_fx[0], cross_vec_fx ); @@ -2060,8 +2118,11 @@ static void matrix_inverse_3x3_32_fx( FOR( k = 0; k < 3; k++ ) { inverse_matrix_fx[k][1] = L_deposit_h( BASOP_Util_Divide3232_Scale( cross_vec_fx[k], determinant_fx, &inv_mat_exp ) ); - inv_mat_exp = inv_mat_exp + ( ( 31 - 29 ) - ( 31 - 28 ) ); + inv_mat_exp = add( inv_mat_exp, ( ( 31 - 29 ) - ( 31 - 28 ) ) ); exp_inverse_matrix_fx[k][1] = inv_mat_exp; + + move32(); + move16(); } vbap_crossp_fx( input_matrix_fx[0], input_matrix_fx[1], cross_vec_fx ); @@ -2069,8 +2130,10 @@ static void matrix_inverse_3x3_32_fx( FOR( k = 0; k < 3; k++ ) { inverse_matrix_fx[k][2] = L_deposit_h( BASOP_Util_Divide3232_Scale( cross_vec_fx[k], determinant_fx, &inv_mat_exp ) ); - inv_mat_exp = inv_mat_exp + ( ( 31 - 29 ) - ( 31 - 28 ) ); + move32(); + inv_mat_exp = add( inv_mat_exp, ( ( 31 - 29 ) - ( 31 - 28 ) ) ); exp_inverse_matrix_fx[k][2] = inv_mat_exp; + move16(); } /*make common exponant*/ @@ -2083,20 +2146,25 @@ static void matrix_inverse_3x3_32_fx( } } - *exp_inv_mat = max_exp + 1; + *exp_inv_mat = add( max_exp, 1 ); + move16(); FOR( i = 0; i < 3; i++ ) { FOR( j = 0; j < 3; j++ ) { - IF( exp_inverse_matrix_fx[i][j] < -15 && inverse_matrix_fx[i][j] != 0 ) + test(); + IF( LT_16( exp_inverse_matrix_fx[i][j], -15 ) && inverse_matrix_fx[i][j] != 0 ) { inverse_matrix_fx[i][j] = 1; exp_inverse_matrix_fx[i][j] = 0; + move32(); + move16(); } ELSE { inverse_matrix_fx[i][j] = L_shr( inverse_matrix_fx[i][j], *exp_inv_mat - exp_inverse_matrix_fx[i][j] ); + move32(); } } } @@ -2173,22 +2241,30 @@ static Word16 check_and_store_triplet_fx( speaker_node_triplet_unit_vec_matrix_fx[1] = speaker_node_data[chB].unit_vec_fx; speaker_node_triplet_unit_vec_matrix_fx[2] = speaker_node_data[chC].unit_vec_fx; Word16 exp_inv_mat = 31; + move16(); matrix_inverse_3x3_32_fx( speaker_node_triplet_unit_vec_matrix_fx, inverse_matrix_fx, &exp_inv_mat ); - triplets[*triplet_index].q_inverse_matrix = 31 - exp_inv_mat; + triplets[*triplet_index].q_inverse_matrix = sub( 31, exp_inv_mat ); /* Check through all speaker nodes that none of them are within the triplet. * Node within the triplet is identified by that all three panning gains are positive. * Epsilon-condition is for some small rounding issues.*/ speaker_node_found_inside_triplet = 0; + move16(); FOR( ch_check = 0; ch_check < num_speaker_nodes; ch_check++ ) { - IF( ( ch_check != chA ) && ( ch_check != chB ) && ( ch_check != chC ) ) + test(); + test(); + IF( ( NE_16( ch_check, chA ) ) && NE_16( ch_check, chB ) && NE_16( ch_check, chC ) ) { - triplet_ok = vector_matrix_multiply_3x3_32_fx( speaker_node_data[ch_check].unit_vec_fx, inverse_matrix_fx, unnormalized_gains_fx, 31 - exp_inv_mat ); - IF( triplet_ok && ( GT_32( unnormalized_gains_fx[0], ( VBAP_EPSILON_Q31 << ( 30 - exp_inv_mat ) ) ) ) && ( GT_32( unnormalized_gains_fx[1], ( VBAP_EPSILON_Q31 << ( 30 - exp_inv_mat ) ) ) ) && ( GT_32( unnormalized_gains_fx[2], ( VBAP_EPSILON_Q31 << ( 30 - exp_inv_mat ) ) ) ) ) + triplet_ok = vector_matrix_multiply_3x3_32_fx( speaker_node_data[ch_check].unit_vec_fx, inverse_matrix_fx, unnormalized_gains_fx, sub( 31, exp_inv_mat ) ); + test(); + test(); + test(); + IF( triplet_ok && ( GT_32( unnormalized_gains_fx[0], L_shl( VBAP_EPSILON_Q31, sub( Q30, exp_inv_mat ) ) ) ) && ( GT_32( unnormalized_gains_fx[1], L_shl( VBAP_EPSILON_Q31, sub( Q30, exp_inv_mat ) ) ) ) && ( GT_32( unnormalized_gains_fx[2], L_shl( VBAP_EPSILON_Q31, sub( Q30, exp_inv_mat ) ) ) ) ) { speaker_node_found_inside_triplet = 1; - break; + move16(); + BREAK; } } } @@ -2199,6 +2275,9 @@ static Word16 check_and_store_triplet_fx( triplets[*triplet_index].speaker_node[0] = (UWord8) chA; triplets[*triplet_index].speaker_node[1] = (UWord8) chB; triplets[*triplet_index].speaker_node[2] = (UWord8) chC; + move16(); + move16(); + move16(); FOR( k = 0; k < 3; k++ ) { Copy32( inverse_matrix_fx[k], triplets[*triplet_index].inverse_matrix_fx[k], 3 ); @@ -2206,18 +2285,21 @@ static Word16 check_and_store_triplet_fx( /* Get center azimuth for fast search use */ Word32 tmp_a = L_add( L_shr( L_add( speaker_node_data[chA].unit_vec_fx[1], speaker_node_data[chB].unit_vec_fx[1] ), 2 ), L_shr( speaker_node_data[chC].unit_vec_fx[1], 2 ) ); // Q28 /*Condition to make tmp_a 0 to adress precision loss seen*/ - IF( tmp_a == -8193 ) + if ( EQ_32( tmp_a, -8193 ) ) { tmp_a = 0; + move32(); } Word32 tmp_b = L_add( L_shr( L_add( speaker_node_data[chA].unit_vec_fx[0], speaker_node_data[chB].unit_vec_fx[0] ), 2 ), L_shr( speaker_node_data[chC].unit_vec_fx[0], 2 ) ); // Q28 Word16 tmp_tan = shr( BASOP_util_atan2( tmp_a, tmp_b, 0 ), Q13 - Q9 ); triplet_azidegs_fx[*triplet_index] = L_mult( tmp_tan, 29335 /*_180_OVER_PI in Q9*/ ); // Q3 - + move32(); /* Store increasing order indices for the later sorting step. */ triplet_order[*triplet_index] = *triplet_index; + move16(); *triplet_index = add( *triplet_index, 1 ); + move16(); return 1; } @@ -2321,6 +2403,7 @@ static Word16 determine_virtual_surface_triplets_fx( { Word16 chA, chB, chC, k, l, m; Word16 num_triplets = 0; + move16(); Word16 num_connected_to_chA; Word16 connected_to_chA[VBAP_MAX_NUM_SPEAKER_NODES]; Word16 connection_uses_left[VBAP_MAX_NUM_SPEAKER_NODES]; @@ -2335,7 +2418,7 @@ static Word16 determine_virtual_surface_triplets_fx( /* Early skip if not in correct group. */ IF( NE_16( speaker_node_data[chA].group, allowed_group ) ) { - continue; + CONTINUE; } /* Get all connections connected to current chA that have not been used by @@ -2346,7 +2429,7 @@ static Word16 determine_virtual_surface_triplets_fx( { test(); test(); - IF( ( EQ_16( connections[k][0], chA ) || EQ_16( connections[k][1], chA ) ) && ( GT_16( connection_uses_left[k], 0 ) ) ) + IF( ( EQ_16( connections[k][0], chA ) || EQ_16( connections[k][1], chA ) ) && ( connection_uses_left[k] > 0 ) ) { connected_to_chA[num_connected_to_chA] = k; move16(); @@ -2358,7 +2441,7 @@ static Word16 determine_virtual_surface_triplets_fx( * This can fail in later stages when all connections are already used. */ IF( LT_16( num_connected_to_chA, 2 ) ) { - continue; + CONTINUE; } /* Try to form triplets from each valid connection. */ @@ -2390,7 +2473,7 @@ static Word16 determine_virtual_surface_triplets_fx( move16(); connection_uses_left[m] = sub( connection_uses_left[m], 1 ); move16(); - break; + BREAK; } } } @@ -2400,7 +2483,7 @@ static Word16 determine_virtual_surface_triplets_fx( * connection. */ IF( LT_16( connection_uses_left[connect_index_k], 1 ) ) { - break; + BREAK; } } } @@ -2527,7 +2610,7 @@ static void determine_initial_search_indices_fx( Word32 sector_reference_azideg_fx; Word32 sector_border_start_azideg_fx; Word32 sector_border_end_azideg_fx; - int16_t best_index; + Word16 best_index; Word32 min_azideg_diff_fx; Word32 azideg_diff_fx; @@ -2642,6 +2725,7 @@ static ivas_error determine_connections_fx( Word16 num_non_crossing_planes; Word16 c; Word16 connection_write_index = 0; + move16(); Word32 non_crossing_plane_elevation_deg_fx[VBAP_MAX_PLANES]; ivas_error error; @@ -2661,7 +2745,7 @@ static ivas_error determine_connections_fx( /* Process in different mode based on the grouping. It is enough to check for first node. */ IF( EQ_16( speaker_node_data[0].group, SPEAKER_NODE_ALL ) ) { - IF( ( error = formulate_half_sphere_connections_fx( speaker_node_data, num_speaker_nodes, SPEAKER_NODE_ALL, connections, &connection_write_index, max_num_connections, num_non_crossing_planes, non_crossing_plane_elevation_deg_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = formulate_half_sphere_connections_fx( speaker_node_data, num_speaker_nodes, SPEAKER_NODE_ALL, connections, &connection_write_index, max_num_connections, num_non_crossing_planes, non_crossing_plane_elevation_deg_fx ) ), IVAS_ERR_OK ) ) { return error; } @@ -2669,7 +2753,7 @@ static ivas_error determine_connections_fx( ELSE { /* The node-node connections are determined in three stages: bottom, horizontal, and top. */ - IF( ( error = formulate_half_sphere_connections_fx( speaker_node_data, num_speaker_nodes, SPEAKER_NODE_BOTTOM_HALF, connections, &connection_write_index, max_num_connections, num_non_crossing_planes, non_crossing_plane_elevation_deg_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = formulate_half_sphere_connections_fx( speaker_node_data, num_speaker_nodes, SPEAKER_NODE_BOTTOM_HALF, connections, &connection_write_index, max_num_connections, num_non_crossing_planes, non_crossing_plane_elevation_deg_fx ) ), IVAS_ERR_OK ) ) { return error; } @@ -2680,12 +2764,13 @@ static ivas_error determine_connections_fx( *group1_count = connection_write_index; move16(); - IF( ( error = formulate_half_sphere_connections_fx( speaker_node_data, num_speaker_nodes, SPEAKER_NODE_TOP_HALF, connections, &connection_write_index, max_num_connections, num_non_crossing_planes, non_crossing_plane_elevation_deg_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = formulate_half_sphere_connections_fx( speaker_node_data, num_speaker_nodes, SPEAKER_NODE_TOP_HALF, connections, &connection_write_index, max_num_connections, num_non_crossing_planes, non_crossing_plane_elevation_deg_fx ) ), IVAS_ERR_OK ) ) { return error; } *group2_count = sub( connection_write_index, *group2_start ); + move16(); } return IVAS_ERR_OK; @@ -2781,6 +2866,7 @@ static enum ConnectionClass determine_connection_class_fx( * When this happens, unit vectors point in opposite directions. */ uvecdot_fx = L_add( L_shl( dotp_fixed( node_data[chA].unit_vec_fx, node_data[chB].unit_vec_fx, 3 ), 1 ), ONE_IN_Q30 ); // Q30 - adding one guard bit + test(); IF( LT_32( uvecdot_fx, VBAP_EPSILON_Q3O ) && GT_32( uvecdot_fx, L_negate( VBAP_EPSILON_Q3O ) ) ) { return CONNECTION_WITH_SPEAKER_NODE_BEHIND; @@ -2839,7 +2925,8 @@ static enum ConnectionClass determine_connection_class_fx( Word32 tmp5 = Mpy_32_32( L_negate( v1v2_fx ), v2p1_fx ); // q25 Word32 tmp6 = L_add( tmp4, tmp5 ); // q25 Word16 tmp7, exp = 0; - IF( EQ_32( determinant_fx, 0 ) ) + move16(); + if ( determinant_fx == 0 ) { determinant_fx = 1; move32(); @@ -2852,7 +2939,7 @@ static enum ConnectionClass determine_connection_class_fx( Word32 var1, var2; Word16 vTarget_fx_e[3], vec_diff_e[3]; test(); - IF( GT_32( norm_distance_on_v1_fx, 0 ) && LT_32( norm_distance_on_v1_fx, L_shr( ONE_IN_Q31, sub( 31, sub( Q25, exp ) ) ) ) ) + IF( norm_distance_on_v1_fx > 0 && LT_32( norm_distance_on_v1_fx, L_shr( ONE_IN_Q31, sub( 31, sub( Q25, exp ) ) ) ) ) { /* Formulate vTarget, that is an unit vector that goes through the determined point on chA-chB connection */ energy_sum_fx = 0; @@ -2860,7 +2947,7 @@ static enum ConnectionClass determine_connection_class_fx( FOR( k = 0; k < 3; k++ ) { var1 = Mpy_32_32( norm_distance_on_v1_fx, v1_fx[k] ); // Q(25 - exp) + Q28 - 31 - vTarget_fx[k] = BASOP_Util_Add_Mant32Exp( p1_fx[k], 1, var1, 31 - ( Q25 - exp + Q28 - 31 ), &exp_vTarget ); + vTarget_fx[k] = BASOP_Util_Add_Mant32Exp( p1_fx[k], 1, var1, Q31 - ( Q25 - exp + Q28 - Q31 ), &exp_vTarget ); move16(); vTarget_fx_e[k] = exp_vTarget; move16(); @@ -2873,6 +2960,7 @@ static enum ConnectionClass determine_connection_class_fx( move16(); } Word16 exp_eq = exp_energy_sum; + move16(); eq_value_fx = ISqrt32( energy_sum_fx, &exp_eq ); FOR( k = 0; k < 3; k++ ) { @@ -2883,6 +2971,8 @@ static enum ConnectionClass determine_connection_class_fx( } /*make a common exponent*/ Word16 max_vTarget_e = 0, max_vec_diff_e = 0; + move16(); + move16(); FOR( k = 0; k < 3; k++ ) { max_vTarget_e = s_max( vTarget_fx_e[k], max_vTarget_e ); @@ -2898,7 +2988,7 @@ static enum ConnectionClass determine_connection_class_fx( /* A check if the angle between vTarget and node_data[ch].unit_vec is less than 1 degree. Essentially reveals if there is a speaker node too close "behind" the connection. Such connections should be rejected.*/ - FOR( int i = 0; i < 3; i++ ) + FOR( Word16 i = 0; i < 3; i++ ) { vTarget_fx[i] = L_shr( vTarget_fx[i], 2 ); // add guard bits move32(); @@ -2919,7 +3009,7 @@ static enum ConnectionClass determine_connection_class_fx( Word32 vec_diff_dotp = dotp_fixed( vec_diff_fx, vec_diff_fx, 3 ); // exp : 2 * max_vec_diff_e + 4 move32(); Word32 var = Mpy_32_32( vec_diff_dotp, 51200 /*25.0f in Q11*/ ); // exp : 2 * max_vec_diff_e + 4 + 20 - Word16 Flag1 = BASOP_Util_Cmp_Mant32Exp( v1v1_fx, 31 - Q25, var, 2 * max_vec_diff_e + 4 + 20 ); + Word16 Flag1 = BASOP_Util_Cmp_Mant32Exp( v1v1_fx, Q31 - Q25, var, 2 * max_vec_diff_e + 4 + 20 ); IF( EQ_16( Flag1, 1 ) ) { IF( LT_32( L_abs( L_sub( node_data[chB].unit_vec_fx[2], node_data[chA].unit_vec_fx[2] ) ), 2147483 ) ) @@ -3072,15 +3162,16 @@ static void formulate_horizontal_connections_fx( FOR( chCheck = 0; chCheck < num_speaker_nodes; chCheck++ ) { + test(); IF( ( NE_16( ch, chCheck ) ) && ( EQ_16( speaker_node_data[chCheck].group, SPEAKER_NODE_HORIZONTAL ) ) ) { arc_diff_fx = L_sub( speaker_node_data[chCheck].azi_deg_fx, speaker_node_data[ch].azi_deg_fx ); // Q22 - WHILE( LT_32( arc_diff_fx, 0 ) ) + WHILE( arc_diff_fx < 0 ) { arc_diff_fx = L_add( arc_diff_fx, 1509949440 /*360.0f in Q22*/ ); } - IF( LT_32( L_shr( arc_diff_fx, 22 - Q_min_arc_diff ), min_arc_diff_fx ) ) + IF( LT_32( L_shr( arc_diff_fx, sub( 22, Q_min_arc_diff ) ), min_arc_diff_fx ) ) { min_arc_diff_fx = arc_diff_fx; move32(); @@ -3096,6 +3187,7 @@ static void formulate_horizontal_connections_fx( connections[*connection_write_index][1] = next_index; move16(); *connection_write_index = add( *connection_write_index, 1 ); + move16(); } } @@ -3167,10 +3259,12 @@ static Word16 check_plane_crossing_fx( FOR( plane = 0; plane < num_non_crossing_planes; plane++ ) { + test(); IF( ( GT_32( L_shr( ele1_deg_fx, 8 ), L_add( non_crossing_plane_elevation_deg_fx[plane], ONE_IN_Q14 ) ) ) && ( LT_32( L_shr( ele2_deg_fx, 8 ), L_sub( non_crossing_plane_elevation_deg_fx[plane], ONE_IN_Q14 ) ) ) ) { return 1; } + test(); IF( ( GT_32( L_shr( ele2_deg_fx, 8 ), L_add( non_crossing_plane_elevation_deg_fx[plane], ONE_IN_Q14 ) ) ) && ( LT_32( L_shr( ele1_deg_fx, 8 ), L_sub( non_crossing_plane_elevation_deg_fx[plane], ONE_IN_Q14 ) ) ) ) { return 1; @@ -3228,6 +3322,9 @@ static ivas_error get_half_sphere_connection_options_fx( Word16 node, chA, chB, c, c_cmp; ConnectionOption *c_options, *c_options_reorder; + move16(); + move16(); + /* Count max num connection options at the half sphere */ FOR( node = 0; node < num_speaker_nodes; node++ ) { @@ -3288,11 +3385,13 @@ static ivas_error get_half_sphere_connection_options_fx( unit_vec_dotp = dotp_fixed( speaker_node_data[chA].unit_vec_fx, speaker_node_data[chB].unit_vec_fx, 3 ); // Q29 unit_vec_dotp_sq = Mpy_32_32( unit_vec_dotp, unit_vec_dotp ); // Q27 one_minus_unit_vec_dotp_sq = L_sub( ONE_IN_Q27, unit_vec_dotp_sq ); - Word16 exp_uv = sub( 31, Q27 ); + Word16 exp_uv = Q31 - Q27; + move16(); one_minus_unit_vec_dotp_sq_root = Sqrt32( one_minus_unit_vec_dotp_sq, &exp_uv ); acos_val = BASOP_util_atan2( one_minus_unit_vec_dotp_sq_root, unit_vec_dotp, exp_uv - 2 ); // Q13 c_options[index].arc_fx = L_deposit_h( acos_val ); // Q29 - c_options[index].arc_weighted_fx = c_options[index].arc_fx; // Q29 + move32(); + c_options[index].arc_weighted_fx = c_options[index].arc_fx; // Q29 move32(); /* A special case, mainly accounting for ELEVATED L,R,C speaker nodes. @@ -3301,6 +3400,7 @@ static ivas_error get_half_sphere_connection_options_fx( IF( EQ_16( ConnectionClass, ELEVATED_PLANE_THIN_TRIANGLE_CONNECTION ) ) { c_options[index].arc_weighted_fx = L_shl( c_options[index].arc_weighted_fx, 1 ); + move32(); } /* If the connection passes a pre-determined plane of speaker nodes, then add further penalty */ @@ -3308,6 +3408,7 @@ static ivas_error get_half_sphere_connection_options_fx( IF( check_plane_crossing_fx( speaker_node_data[chA].ele_deg_fx /*q22*/, speaker_node_data[chB].ele_deg_fx, num_non_crossing_planes, non_crossing_plane_elevation_deg_fx ) ) { c_options[index].arc_weighted_fx = L_shl( c_options[index].arc_weighted_fx, 1 ); + move32(); } index = add( index, 1 ); } @@ -3339,11 +3440,13 @@ static ivas_error get_half_sphere_connection_options_fx( FOR( c_cmp = 0; c_cmp < *num_connection_options; c_cmp++ ) { res = BASOP_Util_Cmp_Mant32Exp( c_options[c_cmp].arc_weighted_fx, 31 - Q29, min_arc_weighted_fx_new, exp_min_arc_weighted_fx ); - IF( EQ_16( res, -1 ) || EQ_16( res, 0 ) ) + test(); + IF( EQ_16( res, -1 ) || res == 0 ) { min_arc_weighted_fx_new = c_options[c_cmp].arc_weighted_fx; move32(); - exp_min_arc_weighted_fx = sub( 31, Q29 ); + exp_min_arc_weighted_fx = Q31 - Q29; + move16(); min_arc_index = c_cmp; move16(); } @@ -3529,14 +3632,15 @@ static ivas_error formulate_half_sphere_connections_fx( /* Obtain all connection options (i.e., channel pairs) at the half sphere. The function orders them * in terms of which connection to keep if two connections would cross each other. */ - IF( ( error = get_half_sphere_connection_options_fx( - speaker_node_data, - group, - num_speaker_nodes, - num_non_crossing_planes, - non_crossing_plane_elevation_deg_fx, - &connection_options, - &num_connection_options ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = get_half_sphere_connection_options_fx( + speaker_node_data, + group, + num_speaker_nodes, + num_non_crossing_planes, + non_crossing_plane_elevation_deg_fx, + &connection_options, + &num_connection_options ) ), + IVAS_ERR_OK ) ) { return error; } @@ -3599,7 +3703,7 @@ static ivas_error formulate_half_sphere_connections_fx( } Word16 tmp_exp = sub( 31, Q23 ); - IF( tmpFloat_fx == 0 ) + if ( tmpFloat_fx == 0 ) { tmpFloat_fx = 1; move16(); @@ -3612,7 +3716,7 @@ static ivas_error formulate_half_sphere_connections_fx( move32(); } /*update Q for planeCrossingVec */ - Q_planeCrossingVec = sub( sub( add( Q27, Q31 ), tmp_exp ), Q31 ); + Q_planeCrossingVec = sub( sub( Q27 + Q31, tmp_exp ), Q31 ); /* If the plane intersection is between both connections, then the two connections cross. */ /* Study first if the crossing is between arc chA-chB */ @@ -3639,13 +3743,13 @@ static ivas_error formulate_half_sphere_connections_fx( } one_minus_var1_sq = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, L_negate( var1_sq ), exp_var1_sq, &final_exp_A ); var1_sqrt = Sqrt32( one_minus_var1_sq, &final_exp_A ); - var1_cos = BASOP_util_atan2( var1_sqrt, var1, final_exp_A - ( Q31 - ( Q_planeCrossingVec + Q30 - Q31 ) ) ); // Q13 + var1_cos = BASOP_util_atan2( var1_sqrt, var1, sub( final_exp_A, ( Q31 - ( Q_planeCrossingVec + Q30 - Q31 ) ) ) ); // Q13 angleCmp_fx = var1_cos; move16(); one_minus_var2_sq = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, L_negate( var2_sq ), exp_var2_sq, &final_exp_B ); var2_sqrt = Sqrt32( one_minus_var2_sq, &final_exp_B ); - var2_cos = BASOP_util_atan2( var2_sqrt, var2, final_exp_B - ( Q31 - ( Q_planeCrossingVec + Q30 - Q31 ) ) ); // Q13 + var2_cos = BASOP_util_atan2( var2_sqrt, var2, sub( final_exp_B, ( Q31 - ( Q_planeCrossingVec + Q30 - Q31 ) ) ) ); // Q13 final_exp = BASOP_Util_Add_MantExp( angleCmp_fx, Q15 - Q13, var2_cos, Q15 - Q13, &angleCmp_fx ); @@ -3679,7 +3783,7 @@ static ivas_error formulate_half_sphere_connections_fx( } /* Study if the crossing is also between arc cmp_chA-cmp_chB */ - IF( GT_16( within_first_arc, 0 ) ) + IF( within_first_arc > 0 ) { var1 = dotp_fixed( planeCrossingVec_fx, speaker_node_data[cmp_chA].unit_vec_fx, 3 ); move32(); @@ -3724,7 +3828,7 @@ static ivas_error formulate_half_sphere_connections_fx( var_a = BASOP_Util_Add_Mant32Exp( cmp_arc_fx, Q31 - Q29, L_negate( L_deposit_h( angleCmp_fx ) ), final_exp, &sub_exp ); comp1 = BASOP_Util_Cmp_Mant32Exp( L_abs( var_a ), sub_exp, 21474836, 0 ); - IF( EQ_16( comp1, -1 ) ) + if ( EQ_16( comp1, -1 ) ) { /* A crossing is detected. The new connection is not valid, because * the connections were ordered in order of preference (arc_weighted) */ @@ -3737,7 +3841,7 @@ static ivas_error formulate_half_sphere_connections_fx( } /* Store the new connection which has been confirmed valid */ - IF( GT_16( new_connection_is_valid, 0 ) ) + IF( new_connection_is_valid > 0 ) { connections[*connection_write_index][0] = chA; move16(); @@ -3948,6 +4052,8 @@ static Word16 determine_non_crossing_planes_fx( { tmp1 = L_add( ele_check_fx, 16 /*VBAP_EPSILON in Q14*/ ); tmp2 = L_sub( next_ele_check_fx, 16 /*VBAP_EPSILON in Q14*/ ); + test(); + test(); IF( ( node_data[ch].group != SPEAKER_NODE_HORIZONTAL ) && GT_32( L_shr( node_data[ch].ele_deg_fx, 8 ), tmp1 ) && LT_32( L_shr( node_data[ch].ele_deg_fx, 8 ), tmp2 ) ) { next_ele_check_fx = L_shr( node_data[ch].ele_deg_fx, 8 ); // shift due to comparision with 90.0f @@ -3959,7 +4065,7 @@ static Word16 determine_non_crossing_planes_fx( IF( GT_32( ele_check_fx, 1474560 ) /*90.0f in Q14*/ ) { /* When no next node elevation found, break loop */ - break; + BREAK; } max_gap_fx = -163838368; // Q14 @@ -3977,7 +4083,7 @@ static Word16 determine_non_crossing_planes_fx( IF( NE_16( ch_cmp, ch ) && LT_32( L_abs( L_sub( L_shr( node_data[ch_cmp].ele_deg_fx, 8 ), ele_check_fx ) ), 16 /*0.001f in Q14*/ ) ) { Word32 gap_fx = L_sub( node_data[ch_cmp].azi_deg_fx, node_data[ch].azi_deg_fx ); - WHILE( LT_32( gap_fx, 0 ) ) + WHILE( gap_fx < 0 ) { gap_fx = L_add( gap_fx, 1509949440 /*360.0f in Q22*/ ); } @@ -3997,15 +4103,17 @@ static Word16 determine_non_crossing_planes_fx( } /* If maximum gap is small enough, then a non-crossing plane is detected */ - IF( LT_32( max_gap_fx, 2293776 /*Q14*/ ) && GT_32( max_gap_fx, 0 ) ) + test(); + IF( LT_32( max_gap_fx, 2293776 /*Q14*/ ) && max_gap_fx > 0 ) { non_crossing_plane_elevation_deg_fx[num_planes] = ele_check_fx; // q14 + move32(); num_planes = add( num_planes, 1 ); IF( EQ_16( num_planes, VBAP_MAX_PLANES ) ) { /* Memory init limit. Does not happen with any real speaker node configuration. Triangulation succeeds even if number of non_crossing_planes are limited. */ - break; + BREAK; } } } diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 88706683c..f9eadb800 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -52,6 +52,7 @@ #include "debug.h" #define float_to_fix( n, factor ) ( round( n * ( 1 << factor ) ) ) #define fix_to_float( n, factor ) ( (float) n / ( 1 << factor ) ) +#define IVAS_FLOAT_FIXED_TO_BE_REMOVED #endif /*-------------------------------------------------------------------* * Local constants @@ -447,7 +448,7 @@ static ivas_error allocateMcLfeDelayBuffer_fx( const Word16 data_size ) { *lfeDelayBuffer = (Word32 *) malloc( data_size * sizeof( Word32 ) ); - if ( *lfeDelayBuffer == NULL ) + IF( *lfeDelayBuffer == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for LFE delay buffer" ); } @@ -515,7 +516,7 @@ static IVAS_QUATERNION quaternionInit_fx( move16(); move16(); -#ifndef IVAS_FLOAT_FIXED_TO_BE_REMOVED +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED q.w = 1.0f; q.x = q.y = q.z = 0.0f; #endif @@ -566,6 +567,7 @@ static void copyBufferTo2dArray_fx( FOR( smplIdx = 0; smplIdx < (UWord32) buffer.config.numSamplesPerChannel; ++smplIdx ) { array[chnlIdx][smplIdx] = *readPtr++; + move32(); } } @@ -605,7 +607,9 @@ static void accumulate2dArrayToBuffer_fx( { FOR( smplIdx = 0; smplIdx < buffer->config.numSamplesPerChannel; ++smplIdx ) { - *writePtr++ += array[chnlIdx][smplIdx]; + *writePtr = L_add( *writePtr, array[chnlIdx][smplIdx] ); + move32(); + writePtr++; } } @@ -651,6 +655,8 @@ static Word32 limitRendererOutput_fx( Word32 numClipping = 0; /* return early if given bad parameters */ + test(); + test(); IF( hLimiter == NULL || output == NULL || output_frame <= 0 ) { return 0; @@ -658,10 +664,11 @@ static Word32 limitRendererOutput_fx( channels = hLimiter->channel_ptrs_fx; num_channels = hLimiter->num_channels; + move16(); FOR( i = 0; i < num_channels; ++i ) { - channels[i] = output + i * output_frame; + channels[i] = output + imult1616( i, output_frame ); } limiter_process_fx( hLimiter, output_frame, threshold, 0, NULL, q_factor ); @@ -670,7 +677,8 @@ static Word32 limitRendererOutput_fx( FOR( i = 0; i < output_frame * num_channels; ++i ) { - output[i] = min( max( L_shl( INT16_MIN, q_factor ), output[i] ), L_shl( INT16_MAX, q_factor ) ); + output[i] = L_min( L_max( L_shl( INT16_MIN, q_factor ), output[i] ), L_shl( INT16_MAX, q_factor ) ); + move32(); } return numClipping; @@ -908,7 +916,7 @@ static ivas_error validateOutputSampleRate( const Word32 sampleRate, const AUDIO_CONFIG outConfig ) { - IF( getAudioConfigType( outConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) + IF( NE_32( getAudioConfigType( outConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) ) { /* If no binaural rendering, any sampling rate is supported */ return IVAS_ERR_OK; @@ -1087,7 +1095,9 @@ static ivas_error initLimiter( ivas_error error; /* If re-initializing with unchanged values, return early */ - IF( *phLimiter != NULL && ( *phLimiter )->num_channels == numChannels && ( *phLimiter )->sampling_rate == sampleRate ) + test(); + test(); + IF( *phLimiter != NULL && EQ_16( ( *phLimiter )->num_channels, numChannels ) && EQ_32( ( *phLimiter )->sampling_rate, sampleRate ) ) { return IVAS_ERR_OK; } @@ -1098,19 +1108,10 @@ static ivas_error initLimiter( ivas_limiter_close( phLimiter ); } - IF( ( error = ivas_limiter_open( phLimiter, numChannels, sampleRate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_limiter_open( phLimiter, numChannels, sampleRate ) ), IVAS_ERR_OK ) ) { return error; } - // The below code has to be deleted once whole conversion is completed - //( *phLimiter )->gain = 1.0f; - //( *phLimiter )->release_heuristic = 0.f; - //( *phLimiter )->attack_constant = powf( 0.01f, 1.0f / ( IVAS_LIMITER_ATTACK_SECONDS * sampleRate ) ); - for ( Word32 i = 0; i < numChannels; ++i ) - { - //( *phLimiter )->channel_ptrs[i] = NULL; - } - // Till this line. return IVAS_ERR_OK; } @@ -1156,13 +1157,25 @@ static LSSETUP_CUSTOM_STRUCT defaultCustomLs( since output config is never in an undefined state. */ ls.is_planar_setup = 1; ls.num_spk = 1; + move16(); + move16(); + +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED set_zero( ls.ls_azimuth, MAX_OUTPUT_CHANNELS ); +#endif + set_val_Word32( ls.ls_azimuth_fx, 0, MAX_OUTPUT_CHANNELS ); + +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED set_zero( ls.ls_elevation, MAX_OUTPUT_CHANNELS ); +#endif + set_val_Word32( ls.ls_elevation_fx, 0, MAX_OUTPUT_CHANNELS ); ls.num_lfe = 0; + move16(); set_s( ls.lfe_idx, 0, MAX_OUTPUT_CHANNELS ); ls.separate_ch_found = 0; + move16(); set_val_Word16( ls.separate_ch_gains_fx, 0, MAX_OUTPUT_CHANNELS ); return ls; @@ -1505,31 +1518,35 @@ static ivas_error getMcConfigValues_fx( *lfe_idx = -1; *is_planar = 1; + move16(); + move16(); SWITCH( inConfig ) { case IVAS_AUDIO_CONFIG_LS_CUSTOM: *azimuth = (const Word32 *) &pInCustomLs->ls_azimuth_fx; *elevation = (const Word32 *) &pInCustomLs->ls_azimuth_fx; - IF( GT_16( pInCustomLs->num_lfe, 0 ) ) + IF( pInCustomLs->num_lfe > 0 ) { *lfe_idx = pInCustomLs->lfe_idx[0]; + move16(); } FOR( i = 0; i < pInCustomLs->num_spk; i++ ) { - IF( NE_32( pInCustomLs->ls_elevation_fx[i], 0 ) ) + IF( pInCustomLs->ls_elevation_fx[i] != 0 ) { *is_planar = 0; + move16(); BREAK; } } BREAK; case IVAS_AUDIO_CONFIG_MONO: case IVAS_AUDIO_CONFIG_STEREO: - if ( ( error = getSpeakerAzimuths_fx( inConfig, azimuth ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getSpeakerAzimuths_fx( inConfig, azimuth ) ), IVAS_ERR_OK ) ) { return error; } - if ( ( error = getSpeakerElevations_fx( inConfig, elevation ) ) != IVAS_ERR_OK ) + IF( NE_32( error = getSpeakerElevations_fx( inConfig, elevation ), IVAS_ERR_OK ) ) { return error; } @@ -1539,16 +1556,28 @@ static ivas_error getMcConfigValues_fx( case IVAS_AUDIO_CONFIG_5_1_2: case IVAS_AUDIO_CONFIG_5_1_4: case IVAS_AUDIO_CONFIG_7_1_4: - IF( ( error = getSpeakerAzimuths_fx( inConfig, azimuth ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getSpeakerAzimuths_fx( inConfig, azimuth ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = getSpeakerElevations_fx( inConfig, elevation ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getSpeakerElevations_fx( inConfig, elevation ) ), IVAS_ERR_OK ) ) { return error; } *lfe_idx = LFE_CHANNEL; - *is_planar = ( inConfig == IVAS_AUDIO_CONFIG_5_1 || inConfig == IVAS_AUDIO_CONFIG_7_1 ) ? 1 : 0; + move16(); + + test(); + IF( EQ_32( inConfig, IVAS_AUDIO_CONFIG_5_1 ) || EQ_32( inConfig, IVAS_AUDIO_CONFIG_7_1 ) ) + { + *is_planar = 1; + move16(); + } + ELSE + { + *is_planar = 0; + move16(); + } BREAK; default: assert( !"Invalid speaker config" ); @@ -1635,13 +1664,16 @@ static ivas_error initEfap( const Word32 *elevations; Word16 numNonLfeChannels; - IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + test(); + IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { pEfapWrapper->speakerConfig = IVAS_AUDIO_CONFIG_7_1_4; + move32(); } ELSE { pEfapWrapper->speakerConfig = outConfig; + move32(); } pEfapWrapper->pCustomLsSetup = pCustomLsOut; @@ -1652,36 +1684,36 @@ static ivas_error initEfap( } /* Only initialize EFAP handle if output config is channel-based */ - IF( getAudioConfigType( pEfapWrapper->speakerConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + IF( NE_32( getAudioConfigType( pEfapWrapper->speakerConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) { pEfapWrapper->hEfap = NULL; return IVAS_ERR_OK; } - IF( outConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - IF( ( error = efap_init_data_fx( &pEfapWrapper->hEfap, pCustomLsOut->ls_azimuth_fx, pCustomLsOut->ls_elevation_fx, pCustomLsOut->num_spk, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = efap_init_data_fx( &pEfapWrapper->hEfap, pCustomLsOut->ls_azimuth_fx, pCustomLsOut->ls_elevation_fx, pCustomLsOut->num_spk, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) { return error; } } ELSE { - IF( ( error = getSpeakerAzimuths_fx( pEfapWrapper->speakerConfig, &azimuths ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getSpeakerAzimuths_fx( pEfapWrapper->speakerConfig, &azimuths ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = getSpeakerElevations_fx( pEfapWrapper->speakerConfig, &elevations ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getSpeakerElevations_fx( pEfapWrapper->speakerConfig, &elevations ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = getNumNonLfeChannelsInSpeakerLayout( pEfapWrapper->speakerConfig, &numNonLfeChannels ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getNumNonLfeChannelsInSpeakerLayout( pEfapWrapper->speakerConfig, &numNonLfeChannels ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = efap_init_data_fx( &pEfapWrapper->hEfap, azimuths, elevations, numNonLfeChannels, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = efap_init_data_fx( &pEfapWrapper->hEfap, azimuths, elevations, numNonLfeChannels, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) { return error; } @@ -1792,7 +1824,14 @@ static ivas_error getEfapGains_fx( } ELSE { - panGains[i] = EQ_32( *readPtr, ONE_IN_Q30 ) ? ONE_IN_Q31 : L_shl( *readPtr, 1 ); // Q31 + IF( EQ_32( *readPtr, ONE_IN_Q30 ) ) + { + panGains[i] = ONE_IN_Q31; + } + ELSE + { + panGains[i] = L_shl( *readPtr, 1 ); + } move32(); ++readPtr; } @@ -1800,7 +1839,7 @@ static ivas_error getEfapGains_fx( } ELSE { - IF( ( error = getAudioConfigNumChannels( efapWrapper.speakerConfig, &numChannels ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAudioConfigNumChannels( efapWrapper.speakerConfig, &numChannels ) ), IVAS_ERR_OK ) ) { return error; } @@ -1816,7 +1855,15 @@ static ivas_error getEfapGains_fx( } ELSE { - panGains[i] = GE_32( *readPtr, ONE_IN_Q30 ) ? ONE_IN_Q31 : L_shl( *readPtr, 1 ); // Q31 + IF( GE_32( *readPtr, ONE_IN_Q30 ) ) + { + panGains[i] = ONE_IN_Q31; + } + ELSE + { + panGains[i] = L_shl( *readPtr, 1 ); + } + move32(); ++readPtr; } @@ -1899,6 +1946,7 @@ static ivas_error initHeadRotation_fx( /* Head rotation is enabled by default */ hIvasRend->headRotData.headRotEnabled = 1; + move16(); /* Initialize 5ms crossfade */ crossfade_len = L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES; @@ -1924,7 +1972,7 @@ static ivas_error initHeadRotation_fx( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" ); } - IF( ( error = ivas_orient_trk_Init_fx( hIvasRend->headRotData.hOrientationTracker ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_orient_trk_Init_fx( hIvasRend->headRotData.hOrientationTracker ) ), IVAS_ERR_OK ) ) { return error; } @@ -2042,6 +2090,7 @@ static void initRotGains_fx( { set_val_Word16( rot_gains[i], 0, MAX_INPUT_CHANNELS ); rot_gains[i][i] = ONE_IN_Q14; + move16(); } return; @@ -2057,6 +2106,7 @@ static void initRotGainsWord32_fx( { set_val_Word32( rot_gains[i], 0, MAX_INPUT_CHANNELS ); rot_gains[i][i] = ONE_IN_Q30; + move16(); } return; @@ -2086,13 +2136,19 @@ static void initRendInputBase_fx( const Word16 dataBufSize ) { inputBase->inConfig = inConfig; + move32(); inputBase->id = id; + move16(); inputBase->gain_fx = ONE_IN_Q30; + move32(); inputBase->ctx = rendCtx; inputBase->numNewSamplesPerChannel = 0; + move32(); inputBase->inputBuffer.config.numSamplesPerChannel = 0; inputBase->inputBuffer.config.numChannels = 0; + move16(); + move16(); inputBase->inputBuffer.data_fx = dataBuf; IF( inputBase->inputBuffer.data_fx != NULL ) { @@ -2135,12 +2191,19 @@ static IVAS_ISM_METADATA defaultObjectPosition( IVAS_ISM_METADATA pos; pos.azimuth_fx = 0; + move32(); pos.elevation_fx = 0; + move32(); pos.radius_fx = ONE_IN_Q9; + move16(); pos.spread_fx = 0; + move32(); pos.gainFactor_fx = ONE_IN_Q31; + move32(); pos.yaw_fx = 0; + move32(); pos.pitch_fx = 0; + move32(); #if 0 /*TODO: To be removed*/ pos.azimuth = 0.0f; pos.elevation = 0.0f; @@ -2187,6 +2250,7 @@ static Word8 checkObjectPositionChanged_fx( IVAS_ISM_METADATA *currentPos, IVAS_ISM_METADATA *previousPos ) { + test(); return !( LT_32( abs( L_sub( currentPos->azimuth_fx, previousPos->azimuth_fx ) ), EPSILLON_FX ) && LT_32( abs( L_sub( currentPos->elevation_fx, previousPos->elevation_fx ) ), EPSILLON_FX ) ); } @@ -2288,7 +2352,7 @@ static ivas_error initIsmMasaRendering( ivas_reverb_close( &inputIsm->hReverb ); - IF( ( error = ivas_omasa_ana_open( &inputIsm->hOMasa, inSampleRate, inputIsm->total_num_objects ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_omasa_ana_open( &inputIsm->hOMasa, inSampleRate, inputIsm->total_num_objects ) ), IVAS_ERR_OK ) ) { return error; } @@ -2347,7 +2411,7 @@ static ivas_error setRendInputActiveIsm( return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; } - IF( ( error = allocateInputBaseBufferData_fx( &inputIsm->bufferData_fx, MAX_BUFFER_LENGTH ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = allocateInputBaseBufferData_fx( &inputIsm->bufferData_fx, MAX_BUFFER_LENGTH ) ), IVAS_ERR_OK ) ) { return error; } @@ -2368,17 +2432,19 @@ static ivas_error setRendInputActiveIsm( inputIsm->hOMasa = NULL; error = IVAS_ERR_OK; + move32(); + test(); IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { - IF( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) { return error; } } ELSE IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) { - IF( ( error = initIsmMasaRendering( inputIsm, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = initIsmMasaRendering( inputIsm, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) { return error; } @@ -2387,16 +2453,29 @@ static ivas_error setRendInputActiveIsm( { Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; Word16 num_src; - Word16 ivas_format = ( EQ_16( getAudioConfigType( inConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) ? MC_FORMAT : ISM_FORMAT; - IF( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ) != IVAS_ERR_OK ) + Word16 ivas_format; + IF( EQ_32( getAudioConfigType( inConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) + { + ivas_format = MC_FORMAT; + } + ELSE + { + ivas_format = ISM_FORMAT; + } + + move16(); + IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { return error; } Word16 nchan_rend = num_src; - IF( EQ_16( ivas_format, MC_FORMAT ) && NE_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + move16(); + + test(); + IF( EQ_16( ivas_format, MC_FORMAT ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - nchan_rend--; /* Skip LFE channel -- added to the others */ + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ } FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) { @@ -2406,15 +2485,17 @@ static ivas_error setRendInputActiveIsm( IF( Src_p->SrcSpatial_p != NULL ) { Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); } TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; SrcSpatial_p->q_Pos_p = Q31; + move16(); } } IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { - IF( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) { return error; } @@ -2444,20 +2525,12 @@ static ivas_error setRendInputActiveIsm( return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; } -#ifdef IVAS_FLOAT_FIXED - if ( ( error = allocateInputBaseBufferData_fx( &inputIsm->bufferData_fx, MAX_BUFFER_LENGTH ) ) != IVAS_ERR_OK ) - { - return error; - } - initRendInputBase_fx( &inputIsm->base, inConfig, id, rendCtx, inputIsm->bufferData_fx, MAX_BUFFER_LENGTH ); -#else if ( ( error = allocateInputBaseBufferData( &inputIsm->bufferData, MAX_BUFFER_LENGTH ) ) != IVAS_ERR_OK ) { return error; } initRendInputBase( &inputIsm->base, inConfig, id, rendCtx, inputIsm->bufferData, MAX_BUFFER_LENGTH ); -#endif inputIsm->firstFrameRendered = FALSE; @@ -2466,15 +2539,8 @@ static ivas_error setRendInputActiveIsm( inputIsm->crendWrapper = NULL; inputIsm->hReverb = NULL; inputIsm->tdRendWrapper = defaultTdRendWrapper(); -#ifndef IVAS_FLOAT_FIXED initRotMatrix( inputIsm->rot_mat_prev ); -#else - initRotMatrix_fx( inputIsm->rot_mat_prev ); -#endif set_zero( inputIsm->prev_pan_gains, MAX_OUTPUT_CHANNELS ); -#ifdef IVAS_FLOAT_FIXED - set_zero_fx( inputIsm->prev_pan_gains_fx, MAX_OUTPUT_CHANNELS ); -#endif inputIsm->hOMasa = NULL; @@ -2496,61 +2562,16 @@ static ivas_error setRendInputActiveIsm( } else { -#ifdef IVAS_FLOAT_FIXED - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; - Word16 num_src; - Word16 ivas_format = ( EQ_16( getAudioConfigType( inConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) ? MC_FORMAT : ISM_FORMAT; - IF( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ) != IVAS_ERR_OK ) - { - return error; - } - - Word16 nchan_rend = num_src; - IF( EQ_16( ivas_format, MC_FORMAT ) && NE_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_rend--; /* Skip LFE channel -- added to the others */ - } - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_SRC_t *Src_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; - IF( Src_p != NULL ) - { - IF( Src_p->SrcSpatial_p != NULL ) - { - FOR( Word16 nC = 0; nC < SPAT_BIN_MAX_INPUT_CHANNELS; nC++ ) - { - fixedToFloat_arrL( Src_p->SrcSpatial_p->Pos_p_fx + nC * 3, Src_p->SrcSpatial_p->Pos_p + nC * 3, Q31, 3 ); - fixedToFloat_arrL( Src_p->SrcSpatial_p->Front_p_fx + nC * 3, Src_p->SrcSpatial_p->Front_p + nC * 3, Q30, 3 ); - } - Src_p->SrcSpatial_p->q_Pos_p = Q31; - } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; - fixedToFloat_arrL( SrcSpatial_p->Pos_p_fx, SrcSpatial_p->Pos_p, Q31, 3 ); - fixedToFloat_arrL( SrcSpatial_p->Front_p_fx, SrcSpatial_p->Front_p, Q30, 3 ); - SrcSpatial_p->q_Pos_p = Q31; - } - } -#else if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } -#endif - if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { -#ifdef IVAS_FLOAT_FIXED - - if ( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) - { - return error; - } -#else if ( ( error = ivas_reverb_open( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac, hRendCfg, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } -#endif // IVAS_FLOAT_FIXED } } @@ -2576,7 +2597,7 @@ static void clearInputIsm( ivas_reverb_close( &inputIsm->hReverb ); - if ( inputIsm->tdRendWrapper.hBinRendererTd != NULL ) + IF( inputIsm->tdRendWrapper.hBinRendererTd != NULL ) { ivas_td_binaural_close_fx( &inputIsm->tdRendWrapper.hBinRendererTd ); inputIsm->tdRendWrapper.hHrtfTD = NULL; @@ -2597,10 +2618,6 @@ static void clearInputIsm( freeInputBaseBufferData( &inputIsm->base.inputBuffer.data ); initRendInputBase( &inputIsm->base, IVAS_AUDIO_CONFIG_INVALID, 0, rendCtx, NULL, 0 ); -#ifdef IVAS_FLOAT_FIXED - freeInputBaseBufferData_fx( &inputIsm->base.inputBuffer.data_fx ); - initRendInputBase_fx( &inputIsm->base, IVAS_AUDIO_CONFIG_INVALID, 0, rendCtx, NULL, 0 ); -#endif /* Free input's internal handles */ ivas_rend_closeCrend( &inputIsm->crendWrapper ); @@ -2609,11 +2626,7 @@ static void clearInputIsm( if ( inputIsm->tdRendWrapper.hBinRendererTd != NULL ) { -#ifdef IVAS_FLOAT_FIXED - ivas_td_binaural_close_fx( &inputIsm->tdRendWrapper.hBinRendererTd ); -#else ivas_td_binaural_close( &inputIsm->tdRendWrapper.hBinRendererTd ); -#endif inputIsm->tdRendWrapper.hHrtfTD = NULL; } @@ -2651,7 +2664,15 @@ static void copyLsConversionMatrixToPanMatrix_fx( // inCh = lsConvMatrix[i].index / numColumns; outCh = lsConvMatrix[i].index % numColumns; move16(); - panMatrix[inCh][outCh] = EQ_32( lsConvMatrix[i].value, ONE_IN_Q30 ) ? ONE_IN_Q31 : L_shl( lsConvMatrix[i].value, 1 ); // Q31 + + IF( EQ_32( lsConvMatrix[i].value, ONE_IN_Q30 ) ) + { + panMatrix[inCh][outCh] = ONE_IN_Q31; + } + ELSE + { + panMatrix[inCh][outCh] = L_shl( lsConvMatrix[i].value, 1 ); + } move32(); } @@ -2843,17 +2864,17 @@ static ivas_error initMcPanGainsWithEfap_fx( IF( NE_32( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - IF( ( error = getNumNonLfeChannelsInSpeakerLayout( inputMc->base.inConfig, &numNonLfeInChannels ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getNumNonLfeChannelsInSpeakerLayout( inputMc->base.inConfig, &numNonLfeInChannels ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = getSpeakerAzimuths_fx( inputMc->base.inConfig, &spkAzi ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getSpeakerAzimuths_fx( inputMc->base.inConfig, &spkAzi ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = getSpeakerElevations_fx( inputMc->base.inConfig, &spkEle ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getSpeakerElevations_fx( inputMc->base.inConfig, &spkEle ) ), IVAS_ERR_OK ) ) { return error; } @@ -2871,13 +2892,14 @@ static ivas_error initMcPanGainsWithEfap_fx( move32(); inLfeChIdx = -1; move16(); - IF( GT_16( inputMc->customLsInput.num_lfe, 0 ) ) + if ( inputMc->customLsInput.num_lfe > 0 ) { inLfeChIdx = inputMc->customLsInput.lfe_idx[0]; move16(); } } outChIdx = 0; + move16(); FOR( i = 0; i < numNonLfeInChannels; ++i ) { IF( EQ_16( i, inLfeChIdx ) ) @@ -2885,7 +2907,7 @@ static ivas_error initMcPanGainsWithEfap_fx( ++outChIdx; } - IF( ( error = getEfapGains_fx( *inputMc->base.ctx.pEfapOutWrapper, spkAzi[i], spkEle[i], inputMc->panGains_fx[outChIdx] ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getEfapGains_fx( *inputMc->base.ctx.pEfapOutWrapper, spkAzi[i], spkEle[i], inputMc->panGains_fx[outChIdx] ) ), IVAS_ERR_OK ) ) { return error; } @@ -2894,12 +2916,12 @@ static ivas_error initMcPanGainsWithEfap_fx( test(); test(); - IF( NE_32( outConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && GE_16( inLfeChIdx, 0 ) ) + IF( NE_32( outConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && inLfeChIdx >= 0 ) { inputMc->panGains_fx[inLfeChIdx][LFE_CHANNEL] = ONE_IN_Q31; move32(); } - ELSE IF( GT_16( inputMc->base.ctx.pCustomLsOut->num_lfe, 0 ) && GE_16( inLfeChIdx, 0 ) ) + ELSE IF( inputMc->base.ctx.pCustomLsOut->num_lfe > 0 && inLfeChIdx >= 0 ) { inputMc->panGains_fx[inLfeChIdx][inputMc->base.ctx.pCustomLsOut->lfe_idx[0]] = ONE_IN_Q31; move32(); @@ -2991,10 +3013,11 @@ static ivas_error getRendInputNumChannels( { pInputMc = (const input_mc *) rendInput; *numInChannels = add( pInputMc->customLsInput.num_spk, pInputMc->customLsInput.num_lfe ); + move16(); } ELSE { - IF( ( error = getAudioConfigNumChannels( pInputBase->inConfig, numInChannels ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAudioConfigNumChannels( pInputBase->inConfig, numInChannels ) ), IVAS_ERR_OK ) ) { return error; } @@ -3043,7 +3066,7 @@ static ivas_error initMcPanGainsWithMonoOut_fx( bool skipSideSpeakers; ivas_error error; - IF( ( error = getRendInputNumChannels( inputMc, &numInChannels ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getRendInputNumChannels( inputMc, &numInChannels ) ), IVAS_ERR_OK ) ) { return error; } @@ -3072,9 +3095,10 @@ static ivas_error initMcPanGainsWithMonoOut_fx( * These should be skipped with 5.1+X inputs. */ skipSideSpeakers = false; test(); - IF( EQ_32( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_5_1_2 ) || EQ_32( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_5_1_4 ) ) + if ( EQ_32( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_5_1_2 ) || EQ_32( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_5_1_4 ) ) { skipSideSpeakers = true; + move16(); } readIdx = 0; move16(); @@ -3085,10 +3109,26 @@ static ivas_error initMcPanGainsWithMonoOut_fx( { /* Skip gains for side speakers in lookup table */ readIdx = add( readIdx, 2 ); - move16(); } - inputMc->panGains_fx[writeIdx][0] = ( EQ_32( ls_conversion_cicpX_mono_fx[readIdx][0], ONE_IN_Q30 ) ) ? ONE_IN_Q31 : L_shl( ls_conversion_cicpX_mono_fx[readIdx][0], 1 ); // Q31 + IF( EQ_32( ls_conversion_cicpX_mono_fx[readIdx][0], ONE_IN_Q30 ) ) + { + inputMc->panGains_fx[writeIdx][0] = ONE_IN_Q31; + } + ELSE + { + inputMc->panGains_fx[writeIdx][0] = L_shl( ls_conversion_cicpX_mono_fx[readIdx][0], 1 ); + } + move32(); + + IF( EQ_32( ls_conversion_cicpX_mono_fx[readIdx][0], ONE_IN_Q30 ) ) + { + inputMc->panGains_fx[writeIdx][0] = ONE_IN_Q31; + } + ELSE + { + inputMc->panGains_fx[writeIdx][0] = L_shl( ls_conversion_cicpX_mono_fx[readIdx][0], 1 ); // Q31 + } move32(); ++readIdx; } @@ -3177,13 +3217,15 @@ static ivas_error initMcPanGainsWithStereoLookup_fx( /* ls_conversion_cicpX_stereo contains gains for side speakers. * These should be skipped with 5.1+X inputs. */ skipSideSpeakers = false; + move16(); test(); - IF( EQ_32( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_5_1_2 ) || EQ_32( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_5_1_4 ) ) + if ( EQ_32( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_5_1_2 ) || EQ_32( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_5_1_4 ) ) { skipSideSpeakers = true; + move16(); } - IF( ( error = getRendInputNumChannels( inputMc, &numInChannels ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getRendInputNumChannels( inputMc, &numInChannels ) ), IVAS_ERR_OK ) ) { return error; } @@ -3191,16 +3233,31 @@ static ivas_error initMcPanGainsWithStereoLookup_fx( move16(); FOR( writeIdx = 0; writeIdx < numInChannels; ++writeIdx ) { + test(); IF( skipSideSpeakers && EQ_16( readIdx, 4 ) ) { /* Skip gains for side speakers in lookup table */ readIdx = add( readIdx, 2 ); - move16(); } - inputMc->panGains_fx[writeIdx][0] = EQ_32( ls_conversion_cicpX_stereo_fx[readIdx][0], ONE_IN_Q30 ) ? ONE_IN_Q31 : L_shl( ls_conversion_cicpX_stereo_fx[readIdx][0], 1 ); // Q31 + IF( EQ_32( ls_conversion_cicpX_stereo_fx[readIdx][0], ONE_IN_Q30 ) ) + { + inputMc->panGains_fx[writeIdx][0] = ONE_IN_Q31; + } + ELSE + { + inputMc->panGains_fx[writeIdx][0] = L_shl( ls_conversion_cicpX_stereo_fx[readIdx][0], 1 ); + } move32(); - inputMc->panGains_fx[writeIdx][1] = EQ_32( ls_conversion_cicpX_stereo_fx[readIdx][1], ONE_IN_Q30 ) ? ONE_IN_Q31 : L_shl( ls_conversion_cicpX_stereo_fx[readIdx][1], 1 ); // Q31 + + IF( EQ_32( ls_conversion_cicpX_stereo_fx[readIdx][1], ONE_IN_Q30 ) ) + { + inputMc->panGains_fx[writeIdx][1] = ONE_IN_Q31; + } + ELSE + { + inputMc->panGains_fx[writeIdx][1] = L_shl( ls_conversion_cicpX_stereo_fx[readIdx][1], 1 ); + } move32(); ++readIdx; } @@ -3270,7 +3327,7 @@ static bool configsAreEqual( /* Both input and output are custom LS - compare structs */ test(); - IF( EQ_16( configA, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && EQ_16( configB, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + IF( EQ_32( configA, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && EQ_32( configB, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { IF( NE_16( customLsA.num_spk, customLsB.num_spk ) ) { @@ -3370,6 +3427,7 @@ static ivas_error updateLfePanGainsForMcOut( Word16 i, numLfeIn, numOutChannels; ivas_error error; error = IVAS_ERR_OK; + move32(); /* If panning is not required, simply return */ IF( !inputMc->lfeRouting.pan_lfe ) @@ -3385,7 +3443,7 @@ static ivas_error updateLfePanGainsForMcOut( } ELSE { - IF( ( error = getAudioConfigNumChannels( outConfig, &numOutChannels ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAudioConfigNumChannels( outConfig, &numOutChannels ) ), IVAS_ERR_OK ) ) { return error; } @@ -3394,7 +3452,7 @@ static ivas_error updateLfePanGainsForMcOut( FOR( i = 0; i < numLfeIn; i++ ) { /* panning gains */ - IF( ( error = getEfapGains_fx( *inputMc->base.ctx.pEfapOutWrapper, inputMc->lfeRouting.lfeOutputAzimuth_fx, inputMc->lfeRouting.lfeOutputElevation_fx, inputMc->lfeRouting.lfePanMtx_fx[i] ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getEfapGains_fx( *inputMc->base.ctx.pEfapOutWrapper, inputMc->lfeRouting.lfeOutputAzimuth_fx, inputMc->lfeRouting.lfeOutputElevation_fx, inputMc->lfeRouting.lfePanMtx_fx[i] ) ), IVAS_ERR_OK ) ) { return error; } @@ -3458,6 +3516,7 @@ static ivas_error updateLfePanGainsForAmbiOut( Word16 numLfeIn, outAmbiOrder; ivas_error error; error = IVAS_ERR_OK; + move32(); /* If panning is not required, simply return */ IF( !inputMc->lfeRouting.pan_lfe ) @@ -3465,7 +3524,7 @@ static ivas_error updateLfePanGainsForAmbiOut( return error; } - IF( ( error = getAmbisonicsOrder_fx( outConfig, &outAmbiOrder ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAmbisonicsOrder_fx( outConfig, &outAmbiOrder ) ), IVAS_ERR_OK ) ) { return error; } @@ -3543,18 +3602,26 @@ static ivas_error updateMcPanGainsForMcOut( { error = initMcPanGainsWithIdentMatrix( inputMc ); } - ELSE IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) || - EQ_16( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_MONO ) || - EQ_16( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + ELSE IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) || + EQ_32( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_MONO ) || + EQ_32( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { test(); - IF( EQ_16( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_MONO ) && ( inputMc->nonDiegeticPan ) ) + IF( EQ_32( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_MONO ) && ( inputMc->nonDiegeticPan ) ) { - inputMc->panGains_fx[0][0] = EQ_32( inputMc->nonDiegeticPanGain_fx, ONE_IN_Q31 ) ? ONE_IN_Q31 : L_add( L_shr( inputMc->nonDiegeticPanGain_fx, 1 ), ONE_IN_Q30 ); + IF( EQ_32( inputMc->nonDiegeticPanGain_fx, ONE_IN_Q31 ) ) + { + inputMc->panGains_fx[0][0] = ONE_IN_Q31; + } + ELSE + { + inputMc->panGains_fx[0][0] = L_add( L_shr( inputMc->nonDiegeticPanGain_fx, 1 ), ONE_IN_Q30 ); + } move32(); inputMc->panGains_fx[0][1] = L_sub( ONE_IN_Q31, inputMc->panGains_fx[0][0] ); move32(); error = IVAS_ERR_OK; + move32(); } ELSE { @@ -3575,7 +3642,7 @@ static ivas_error updateMcPanGainsForMcOut( } /* check for errors from above block */ - IF( error != IVAS_ERR_OK ) + IF( NE_32( error, IVAS_ERR_OK ) ) { return error; } @@ -3658,24 +3725,24 @@ static ivas_error updateMcPanGainsForAmbiOut( const Word32 *spkAzi_fx, *spkEle_fx; ivas_error error; - IF( ( error = getAmbisonicsOrder_fx( outConfig, &outAmbiOrder ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAmbisonicsOrder_fx( outConfig, &outAmbiOrder ) ), IVAS_ERR_OK ) ) { return error; } IF( NE_32( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - IF( ( error = getNumNonLfeChannelsInSpeakerLayout( inputMc->base.inConfig, &numNonLfeInChannels ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getNumNonLfeChannelsInSpeakerLayout( inputMc->base.inConfig, &numNonLfeInChannels ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = getSpeakerAzimuths_fx( inputMc->base.inConfig, &spkAzi_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getSpeakerAzimuths_fx( inputMc->base.inConfig, &spkAzi_fx ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = getSpeakerElevations_fx( inputMc->base.inConfig, &spkEle_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getSpeakerElevations_fx( inputMc->base.inConfig, &spkEle_fx ) ), IVAS_ERR_OK ) ) { return error; } @@ -3685,16 +3752,34 @@ static ivas_error updateMcPanGainsForAmbiOut( { IF( EQ_16( ch_in, LFE_CHANNEL ) ) { - ++ch_out; + ch_out = add( ch_out, 1 ); } + move16(); + move16(); // move for typecasting Word32 to Word16 ivas_dirac_dec_get_response_fx( (Word16) L_shr( spkAzi_fx[ch_in], 22 ), (Word16) L_shr( spkEle_fx[ch_in], 22 ), inputMc->panGains_fx[ch_out], outAmbiOrder, Q29 ); FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { Word32 temp = inputMc->panGains_fx[ch_out][i]; move32(); - inputMc->panGains_fx[ch_out][i] = GE_32( abs( temp ), ONE_IN_Q29 ) ? ( GT_32( temp, 0 ) ? ONE_IN_Q31 : L_negate( ONE_IN_Q31 ) ) - : L_shl( temp, 2 ); // Q31 - move32(); + + IF( GE_32( abs( temp ), ONE_IN_Q29 ) ) + { + IF( temp > 0 ) + { + inputMc->panGains_fx[ch_out][i] = ONE_IN_Q31; + move32(); + } + ELSE + { + inputMc->panGains_fx[ch_out][i] = L_negate( ONE_IN_Q31 ); + move32(); + } + } + ELSE + { + inputMc->panGains_fx[ch_out][i] = L_shl( temp, 2 ); + move32(); + } } ++ch_in; } @@ -3715,7 +3800,7 @@ static ivas_error updateMcPanGainsForAmbiOut( { IF( EQ_16( inputMc->customLsInput.lfe_idx[lfeIdx], ch_in ) ) { - ++ch_out; + ch_out = add( ch_out, 1 ); BREAK; } } @@ -3725,16 +3810,31 @@ static ivas_error updateMcPanGainsForAmbiOut( { Word32 temp = inputMc->panGains_fx[ch_out][i]; move32(); - inputMc->panGains_fx[ch_out][i] = GE_32( abs( temp ), ONE_IN_Q29 ) ? ( GT_32( temp, 0 ) ? ONE_IN_Q31 : L_negate( ONE_IN_Q31 ) ) - : L_shl( temp, 2 ); // Q31 - move32(); + IF( GE_32( abs( temp ), ONE_IN_Q29 ) ) + { + IF( temp > 0 ) + { + inputMc->panGains_fx[ch_out][i] = ONE_IN_Q31; + move32(); + } + ELSE + { + inputMc->panGains_fx[ch_out][i] = L_negate( ONE_IN_Q31 ); + move32(); + } + } + ELSE + { + inputMc->panGains_fx[ch_out][i] = L_shl( temp, 2 ); + move32(); + } } ++ch_in; } } /* update LFE panning */ - IF( ( error = updateLfePanGainsForAmbiOut( inputMc, outConfig ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = updateLfePanGainsForAmbiOut( inputMc, outConfig ) ), IVAS_ERR_OK ) ) { return error; } @@ -3824,6 +3924,7 @@ static ivas_error updateMcPanGains( setZeroPanMatrix_fx( inputMc->panGains_fx ); error = IVAS_ERR_OK; + move32(); SWITCH( getAudioConfigType( outConfig ) ) { case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: @@ -3852,7 +3953,7 @@ static ivas_error updateMcPanGains( return IVAS_ERR_INVALID_OUTPUT_FORMAT; } /* Check error here to keep switch statement more compact */ - IF( error != IVAS_ERR_OK ) + IF( NE_32( error, IVAS_ERR_OK ) ) { return error; } @@ -3952,8 +4053,10 @@ static ivas_error initMcBinauralRendering( /* Allocate TD binaural renderer for custom loudspeaker layouts (regardless of headrotation) or planar MC layouts with headrotation, CREND for the rest */ useTDRend = FALSE; + move16(); IF( NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { + test(); test(); test(); IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) @@ -4000,6 +4103,7 @@ static ivas_error initMcBinauralRendering( } outSampleRate = *inputMc->base.ctx.pOutSampleRate; + move32(); test(); test(); @@ -4007,14 +4111,17 @@ static ivas_error initMcBinauralRendering( { Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; Word16 num_src; - IF( ( error = ivas_td_binaural_open_ext_fx( &inputMc->tdRendWrapper, inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate, SrcInd, &num_src ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputMc->tdRendWrapper, inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { return error; } Word16 nchan_rend = num_src; + move16(); + + test(); IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && inputMc->hReverb == NULL ) { - nchan_rend--; /* Skip LFE channel -- added to the others */ + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ } FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) { @@ -4024,17 +4131,20 @@ static ivas_error initMcBinauralRendering( IF( Src_p->SrcSpatial_p != NULL ) { Src_p->SrcSpatial_p->q_Pos_p = 31; + move16(); } IF( inputMc->tdRendWrapper.hBinRendererTd->Sources[nS] != NULL ) { TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputMc->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; SrcSpatial_p->q_Pos_p = 31; + move16(); } } } - if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && inputMc->hReverb == NULL ) + test(); + IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && inputMc->hReverb == NULL ) { - IF( ( error = ivas_reverb_open_fx( &( inputMc->hReverb ), outConfig, NULL, inputMc->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, outSampleRate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_reverb_open_fx( &( inputMc->hReverb ), outConfig, NULL, inputMc->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, outSampleRate ) ), IVAS_ERR_OK ) ) { return error; } @@ -4043,30 +4153,45 @@ static ivas_error initMcBinauralRendering( ELSE IF( !useTDRend && inputMc->crendWrapper == NULL ) { /* open CREND */ - IF( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, NULL, outSampleRate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, NULL, outSampleRate ) ), IVAS_ERR_OK ) ) { return error; } } /* Initialise the EFAP handle for rotation on input layout */ - IF( NE_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && inputMc->base.ctx.pHeadRotData->headRotEnabled && inputMc->efapInWrapper.hEfap == NULL ) + test(); + test(); + IF( NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && inputMc->base.ctx.pHeadRotData->headRotEnabled && inputMc->efapInWrapper.hEfap == NULL ) { - IF( ( error = initEfap( &inputMc->efapInWrapper, inConfig, NULL ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = initEfap( &inputMc->efapInWrapper, inConfig, NULL ) ), IVAS_ERR_OK ) ) { return error; } } /* determine binaural delay ( used for aligning LFE to output signal ) */ - binauralDelayNs = max( ( inputMc->crendWrapper != NULL ) ? inputMc->crendWrapper->binaural_latency_ns : 0, inputMc->tdRendWrapper.binaural_latency_ns ); + + IF( ( inputMc->crendWrapper != NULL ) ) + { + binauralDelayNs = inputMc->crendWrapper->binaural_latency_ns; + } + ELSE + { + binauralDelayNs = 0; + } + move32(); + + binauralDelayNs = L_max( binauralDelayNs, inputMc->tdRendWrapper.binaural_latency_ns ); Word16 exp = 0; + move16(); Word16 var1 = BASOP_Util_Divide3232_Scale( *inputMc->base.ctx.pOutSampleRate, 1000000000, &exp ); - Word32 var2 = L_shr_r( Mpy_32_32( binauralDelayNs, L_deposit_h( var1 ) ), -exp ); // 31 + exp + Word32 var2 = L_shr_r( Mpy_32_32( binauralDelayNs, L_deposit_h( var1 ) ), negate( exp ) ); // 31 + exp inputMc->binauralDelaySmp = (Word16) var2; + move16(); // inputMc->binauralDelaySmp = (int16_t) roundf( (float) binauralDelayNs * *inputMc->base.ctx.pOutSampleRate / 1000000000.f ); - IF( inputMc->binauralDelaySmp > MAX_BIN_DELAY_SAMPLES ) + IF( GT_16( inputMc->binauralDelaySmp, MAX_BIN_DELAY_SAMPLES ) ) { return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid delay for LFE binaural rendering!)" ); } @@ -4105,12 +4230,7 @@ static ivas_error initMcBinauralRendering( /* if TD renderer was open and we need to use CREND, close it */ if ( !reconfigureFlag || ( !useTDRend && inputMc->tdRendWrapper.hBinRendererTd != NULL ) ) { -#ifdef IVAS_FLOAT_FIXED - ivas_td_binaural_close_fx( &inputMc->tdRendWrapper.hBinRendererTd ); -#else ivas_td_binaural_close( &inputMc->tdRendWrapper.hBinRendererTd ); -#endif - inputMc->tdRendWrapper.hHrtfTD = NULL; } @@ -4137,70 +4257,17 @@ static ivas_error initMcBinauralRendering( if ( useTDRend && inputMc->tdRendWrapper.hBinRendererTd == NULL ) { -#ifdef IVAS_FLOAT_FIXED - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; - Word16 num_src; - Word16 ivas_format = ( EQ_16( getAudioConfigType( inConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) ? MC_FORMAT : ISM_FORMAT; - IF( ( error = ivas_td_binaural_open_ext_fx( &inputMc->tdRendWrapper, inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate, SrcInd, &num_src ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_binaural_open_ext( &inputMc->tdRendWrapper, inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate ) ) != IVAS_ERR_OK ) { return error; } -#if 1 - Word16 nchan_rend = num_src; - IF( EQ_16( ivas_format, MC_FORMAT ) && NE_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_rend--; /* Skip LFE channel -- added to the others */ - } - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_SRC_t *Src_p = inputMc->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; - IF( Src_p != NULL ) - { - IF( Src_p->SrcSpatial_p != NULL ) - { - FOR( Word16 nC = 0; nC < SPAT_BIN_MAX_INPUT_CHANNELS; nC++ ) - { - fixedToFloat_arrL( Src_p->SrcSpatial_p->Pos_p_fx + nC * 3, Src_p->SrcSpatial_p->Pos_p + nC * 3, Q31, 3 ); - } - Src_p->SrcSpatial_p->q_Pos_p = Q31; - } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputMc->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; - fixedToFloat_arrL( SrcSpatial_p->Pos_p_fx, SrcSpatial_p->Pos_p, Q31, 3 ); - SrcSpatial_p->q_Pos_p = Q31; - } - } -#endif -#else - if ( ( error = ivas_td_binaural_open_ext( &inputMc->tdRendWrapper, inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && inputMc->hReverb == NULL ) { -#ifdef IVAS_FLOAT_FIXED - - if ( ( error = ivas_reverb_open_fx( &( inputMc->hReverb ), outConfig, NULL, inputMc->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, outSampleRate ) ) != IVAS_ERR_OK ) - { - return error; - } - -#if 0 /*Fixed to float conversions */ - FOR( Word16 k = 0; k < add( extract_l( L_shr( inputMc->hReverb->fft_size, 1 ) ), 1 ); k++ ) - { - ( inputMc->hReverb )->fft_filter_correl_0.fft_spectrum[k] = (float) ( inputMc->hReverb )->fft_filter_correl_0.fft_spectrum_fx[k] / ONE_IN_Q31; - ( inputMc->hReverb )->fft_filter_color_0.fft_spectrum[k] = (float) ( inputMc->hReverb )->fft_filter_color_0.fft_spectrum_fx[k] / ONE_IN_Q31; - ( inputMc->hReverb )->fft_filter_correl_1.fft_spectrum[k] = (float) ( inputMc->hReverb )->fft_filter_correl_1.fft_spectrum_fx[k] / ONE_IN_Q31; - ( inputMc->hReverb )->fft_filter_color_1.fft_spectrum[k] = (float) ( inputMc->hReverb )->fft_filter_color_1.fft_spectrum_fx[k] / ONE_IN_Q31; - } -#endif -#else if ( ( error = ivas_reverb_open( &( inputMc->hReverb ), outConfig, NULL, inputMc->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac, hRendCfg, outSampleRate ) ) != IVAS_ERR_OK ) { return error; } -#endif } } else if ( !useTDRend && inputMc->crendWrapper == NULL ) @@ -4257,7 +4324,7 @@ static ivas_error initMcMasaRendering( efap_free_data( &inputMc->efapInWrapper.hEfap ); } - IF( ( error = ivas_mcmasa_ana_open( &inputMc->hMcMasa, inConfig, inSampleRate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_mcmasa_ana_open( &inputMc->hMcMasa, inConfig, inSampleRate ) ), IVAS_ERR_OK ) ) { return error; } @@ -4274,11 +4341,7 @@ static ivas_error initMcMasaRendering( if ( inputMc->tdRendWrapper.hBinRendererTd != NULL ) { -#ifdef IVAS_FLOAT_FIXED - ivas_td_binaural_close_fx( &inputMc->tdRendWrapper.hBinRendererTd ); -#else ivas_td_binaural_close( &inputMc->tdRendWrapper.hBinRendererTd ); -#endif inputMc->tdRendWrapper.hHrtfTD = NULL; } @@ -4295,20 +4358,6 @@ static ivas_error initMcMasaRendering( { return error; } -#ifdef IVAS_FLOAT_FIXED -#if 0 /*Fixed to float conversion for ivas_mcmasa_ana_open (to be removed later)*/ - MCMASA_ANA_HANDLE hMcMasa = inputMc->hMcMasa; - Word16 i, j; - //fixedToFloat_arrL( hMcMasa->ls_azimuth_fx, hMcMasa->ls_azimuth, Q22, MCMASA_MAX_ANA_CHANS ); - /*FOR( i = 0; i < MCMASA_MAX_ANA_CHANS; i++ ) - { - FOR( j = 0; j < FOA_CHANNELS; j++ ) - { - hMcMasa->chnlToFoaMtx[j][i] = fixedToFloat( hMcMasa->chnlToFoaMtx_fx[j][i], Q31 ); - } - }*/ -#endif -#endif // IVAS_FLOAT_FIXED return IVAS_ERR_OK; } @@ -4330,6 +4379,7 @@ static lfe_routing defaultLfeRouting( set_val_Word32( routing.lfePanMtx_fx[i], 0, IVAS_MAX_OUTPUT_CHANNELS ); } routing.pan_lfe = false; + move16(); routing.lfeInputGain_fx = ONE_IN_Q31; move32(); @@ -4455,12 +4505,12 @@ static ivas_error setRendInputActiveMc( { return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; } - IF( ( error = allocateMcLfeDelayBuffer_fx( &inputMc->lfeDelayBuffer_fx, MAX_BIN_DELAY_SAMPLES ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = allocateMcLfeDelayBuffer_fx( &inputMc->lfeDelayBuffer_fx, MAX_BIN_DELAY_SAMPLES ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = allocateInputBaseBufferData_fx( &inputMc->bufferData_fx, MAX_BUFFER_LENGTH ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = allocateInputBaseBufferData_fx( &inputMc->bufferData_fx, MAX_BUFFER_LENGTH ) ), IVAS_ERR_OK ) ) { return error; } @@ -4480,24 +4530,28 @@ static ivas_error setRendInputActiveMc( inputMc->lfeRouting = defaultLfeRouting( inConfig, inputMc->customLsInput, outConfig, *inputMc->base.ctx.pCustomLsOut ); set_val_Word32( inputMc->lfeDelayBuffer_fx, 0, MAX_BIN_DELAY_SAMPLES ); inputMc->binauralDelaySmp = 0; + move16(); + test(); + test(); IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { - IF( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, FALSE ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, FALSE ) ), IVAS_ERR_OK ) ) { return error; } } + test(); IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) { - IF( ( error = initMcMasaRendering( inputMc, inConfig, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = initMcMasaRendering( inputMc, inConfig, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) { return error; } } - IF( ( error = updateMcPanGains( inputMc, outConfig ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = updateMcPanGains( inputMc, outConfig ) ), IVAS_ERR_OK ) ) { return error; } @@ -4581,9 +4635,6 @@ static void clearInputMc( rendCtx = inputMc->base.ctx; freeMcLfeDelayBuffer_fx( &inputMc->lfeDelayBuffer_fx ); freeInputBaseBufferData_fx( &inputMc->bufferData_fx ); -#if 0 - initRendInputBase( &inputMc->base, IVAS_AUDIO_CONFIG_INVALID, 0, rendCtx, NULL, 0 ); -#endif initRendInputBase_fx( &inputMc->base, IVAS_AUDIO_CONFIG_INVALID, 0, rendCtx, NULL, 0 ); /* Free input's internal handles */ @@ -4653,12 +4704,12 @@ static ivas_error initSbaPanGainsForMcOut( IVAS_OUTPUT_SETUP hOutSetup; ivas_error error; - IF( ( error = getAmbisonicsOrder_fx( inputSba->base.inConfig, &ambiOrderIn ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAmbisonicsOrder_fx( inputSba->base.inConfig, &ambiOrderIn ) ), IVAS_ERR_OK ) ) { return error; } - IF( getAudioConfigType( outConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + IF( NE_32( getAudioConfigType( outConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) { assert( !"Invalid configuration" ); return IVAS_ERR_WRONG_PARAMS; @@ -4690,7 +4741,7 @@ static ivas_error initSbaPanGainsForMcOut( /* obtain and copy over HOA decoding matrix */ tmpDecMtx = NULL; - IF( ( error = ivas_sba_get_hoa_dec_matrix_fx( hOutSetup, &tmpDecMtx, ambiOrderIn ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_sba_get_hoa_dec_matrix_fx( hOutSetup, &tmpDecMtx, ambiOrderIn ) ), IVAS_ERR_OK ) ) { return error; } @@ -4700,11 +4751,13 @@ static ivas_error initSbaPanGainsForMcOut( { FOR( chInIdx = 0; chInIdx < SBA_NHARM_HOA3; ++chInIdx ) { - IF( hOutSetup.num_lfe > 0 && chOutIdx == hOutSetup.index_lfe[0] ) + test(); + IF( hOutSetup.num_lfe > 0 && EQ_16( chOutIdx, hOutSetup.index_lfe[0] ) ) { - continue; /* nothing to be rendered to LFE */ + CONTINUE; /* nothing to be rendered to LFE */ } inputSba->hoaDecMtx_fx[chInIdx][chOutIdx] = L_shl_sat( *readPtr++, 2 ); + move32(); } } free( tmpDecMtx ); @@ -4750,11 +4803,7 @@ static ivas_error initSbaPanGainsForMcOut( ivas_output_init( &hOutSetup, outConfig ); break; case IVAS_AUDIO_CONFIG_LS_CUSTOM: -#ifdef IVAS_FLOAT_FIXED - ivas_ls_custom_setup( &hOutSetup, (LSSETUP_CUSTOM_STRUCT *) outSetupCustom ); -#else ivas_ls_custom_setup( &hOutSetup, outSetupCustom ); -#endif break; default: assert( !"Invalid speaker config" ); @@ -4794,6 +4843,7 @@ static ivas_error initSbaPanGainsForSbaOut( { ivas_error error; error = IVAS_ERR_OK; + move32(); IF( NE_32( getAudioConfigType( outConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) { @@ -4854,7 +4904,7 @@ static ivas_error updateSbaPanGains( { case IVAS_AUDIO_CONFIG_BINAURAL: { - IF( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) { return error; @@ -4863,12 +4913,12 @@ static ivas_error updateSbaPanGains( BREAK; case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: - IF( ( error = initSbaPanGainsForMcOut( inputSba, IVAS_AUDIO_CONFIG_7_1_4, NULL ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = initSbaPanGainsForMcOut( inputSba, IVAS_AUDIO_CONFIG_7_1_4, NULL ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) { return error; } @@ -4879,13 +4929,14 @@ static ivas_error updateSbaPanGains( BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: error = IVAS_ERR_OK; + move32(); BREAK; /* Do nothing */ default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } /* Check error here to keep switch statement more compact */ - IF( error != IVAS_ERR_OK ) + IF( NE_32( error, IVAS_ERR_OK ) ) { return error; } @@ -4970,7 +5021,7 @@ static ivas_error initSbaMasaRendering( ivas_rend_closeCrend( &inputSba->crendWrapper ); - IF( ( error = ivas_dirac_ana_open_fx( &inputSba->hDirAC, inSampleRate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_ana_open_fx( &inputSba->hDirAC, inSampleRate ) ), IVAS_ERR_OK ) ) { return error; } @@ -5017,13 +5068,14 @@ static ivas_error setRendInputActiveSba( inputSba = (input_sba *) input; rendCtx = inputSba->base.ctx; outConfig = *rendCtx.pOutConfig; + move32(); IF( !isIoConfigPairSupported( inConfig, outConfig ) ) { return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; } - IF( ( error = allocateInputBaseBufferData_fx( &inputSba->bufferData_fx, MAX_BUFFER_LENGTH ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = allocateInputBaseBufferData_fx( &inputSba->bufferData_fx, MAX_BUFFER_LENGTH ) ), IVAS_ERR_OK ) ) { return error; } @@ -5035,15 +5087,16 @@ static ivas_error setRendInputActiveSba( inputSba->hDirAC = NULL; initRotGains_fx( inputSba->rot_gains_prev_fx ); - IF( outConfig == IVAS_AUDIO_CONFIG_MASA1 || outConfig == IVAS_AUDIO_CONFIG_MASA2 ) + test(); + IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_32( outConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) { - IF( ( error = initSbaMasaRendering( inputSba, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = initSbaMasaRendering( inputSba, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) { return error; } } - IF( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg ) ), IVAS_ERR_OK ) ) { return error; } @@ -5211,6 +5264,7 @@ static ivas_error setRendInputActiveMasa( inputMasa = (input_masa *) input; rendCtx = inputMasa->base.ctx; outConfig = *rendCtx.pOutConfig; + move32(); (void) hRendCfg; /* Suppress warning */ IF( !isIoConfigPairSupported( inConfig, outConfig ) ) @@ -5218,34 +5272,45 @@ static ivas_error setRendInputActiveMasa( return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; } - IF( ( error = allocateInputBaseBufferData_fx( &inputMasa->bufferData_fx, MAX_BUFFER_LENGTH ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = allocateInputBaseBufferData_fx( &inputMasa->bufferData_fx, MAX_BUFFER_LENGTH ) ), IVAS_ERR_OK ) ) { return error; } #if 1 /*To be removed later:(contains malloc for inputMasa->bufferData)*/ - IF( ( error = allocateInputBaseBufferData( &inputMasa->bufferData, MAX_BUFFER_LENGTH ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = allocateInputBaseBufferData( &inputMasa->bufferData, MAX_BUFFER_LENGTH ) ), IVAS_ERR_OK ) ) { return error; } #endif initRendInputBase_fx( &inputMasa->base, inConfig, id, rendCtx, inputMasa->bufferData_fx, MAX_BUFFER_LENGTH ); - IF( ( error = getAudioConfigNumChannels( inConfig, &numInChannels ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAudioConfigNumChannels( inConfig, &numInChannels ) ), IVAS_ERR_OK ) ) { return error; } - IF( getAudioConfigType( outConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) + IF( EQ_32( getAudioConfigType( outConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) { inputMasa->metadataHasBeenFed = false; - IF( ( error = masaPrerendOpen_fx( &inputMasa->hMasaPrerend, EQ_16( inputMasa->base.inConfig, IVAS_AUDIO_CONFIG_MASA1 ) ? 1 : 2, *( inputMasa->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) + move16(); + Word16 temp; + IF( EQ_16( inputMasa->base.inConfig, IVAS_AUDIO_CONFIG_MASA1 ) ) + { + temp = 1; + } + ELSE + { + temp = 2; + } + move16(); + IF( NE_32( ( error = masaPrerendOpen_fx( &inputMasa->hMasaPrerend, temp, *( inputMasa->base.ctx.pOutSampleRate ) ) ), IVAS_ERR_OK ) ) { return error; } } ELSE { - IF( ( error = initMasaExtRenderer( inputMasa, outConfig ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = initMasaExtRenderer( inputMasa, outConfig ) ), IVAS_ERR_OK ) ) { return error; } @@ -5260,6 +5325,7 @@ static ivas_error setRendInputActiveMasa( } #endif // IVAS_FLOAT_FIXED +#ifdef IVAS_FLOAT_FIXED static void clearInputMasa( input_masa *inputMasa ) { @@ -5269,17 +5335,33 @@ static void clearInputMasa( freeInputBaseBufferData( &inputMasa->bufferData ); -#ifdef IVAS_FLOAT_FIXED masaPrerendClose_fx( &inputMasa->hMasaPrerend ); + + freeMasaExtRenderer( &inputMasa->hMasaExtRend ); + + initRendInputBase( &inputMasa->base, IVAS_AUDIO_CONFIG_INVALID, 0, rendCtx, NULL, 0 ); + + return; +} #else +static void clearInputMasa( + input_masa *inputMasa ) +{ + rendering_context rendCtx; + + rendCtx = inputMasa->base.ctx; + + freeInputBaseBufferData( &inputMasa->bufferData ); + masaPrerendClose( &inputMasa->hMasaPrerend ); -#endif + freeMasaExtRenderer( &inputMasa->hMasaExtRend ); initRendInputBase( &inputMasa->base, IVAS_AUDIO_CONFIG_INVALID, 0, rendCtx, NULL, 0 ); return; } +#endif #ifdef IVAS_FLOAT_FIXED @@ -5308,12 +5390,12 @@ ivas_error IVAS_REND_Open( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - IF( ( error = validateOutputAudioConfig( outConfig ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = validateOutputAudioConfig( outConfig ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = validateOutputSampleRate( outputSampleRate, outConfig ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = validateOutputSampleRate( outputSampleRate, outConfig ) ), IVAS_ERR_OK ) ) { return error; } @@ -5334,34 +5416,34 @@ ivas_error IVAS_REND_Open( hIvasRend->num_subframes = num_subframes; /* Initialize limiter */ - IF( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = initLimiter( &hIvasRend->hLimiter, numOutChannels, outputSampleRate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = initLimiter( &hIvasRend->hLimiter, numOutChannels, outputSampleRate ) ), IVAS_ERR_OK ) ) { return error; } /* Initialize headrotation data */ - IF( ( error = initHeadRotation_fx( hIvasRend ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = initHeadRotation_fx( hIvasRend ) ), IVAS_ERR_OK ) ) { return error; } /* Initialize external orientation data */ - IF( ( error = ivas_external_orientation_open( &( hIvasRend->hExternalOrientationData ), num_subframes ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_external_orientation_open( &( hIvasRend->hExternalOrientationData ), num_subframes ) ), IVAS_ERR_OK ) ) { return error; } /* Initilize combined orientation data */ - IF( ( error = ivas_combined_orientation_open( &( hIvasRend->hCombinedOrientationData ), outputSampleRate, num_subframes ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_combined_orientation_open( &( hIvasRend->hCombinedOrientationData ), outputSampleRate, num_subframes ) ), IVAS_ERR_OK ) ) { return error; } /* Initialize EFAP */ - IF( ( error = initEfap( &hIvasRend->efapOutWrapper, outConfig, &hIvasRend->customLsOut ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = initEfap( &hIvasRend->efapOutWrapper, outConfig, &hIvasRend->customLsOut ) ), IVAS_ERR_OK ) ) { return error; } @@ -5378,7 +5460,9 @@ ivas_error IVAS_REND_Open( hIvasRend->inputsIsm[i].bufferData = NULL; #endif hIvasRend->inputsIsm[i].nonDiegeticPan = nonDiegeticPan; + move16(); hIvasRend->inputsIsm[i].nonDiegeticPanGain_fx = nonDiegeticPanGain; + move32(); hIvasRend->inputsIsm[i].hOMasa = NULL; hIvasRend->inputsIsm[i].bufferData_fx = NULL; } @@ -5397,7 +5481,9 @@ ivas_error IVAS_REND_Open( hIvasRend->inputsMc[i].bufferData_fx = NULL; hIvasRend->inputsMc[i].lfeDelayBuffer_fx = NULL; hIvasRend->inputsMc[i].nonDiegeticPan = nonDiegeticPan; + move16(); hIvasRend->inputsMc[i].nonDiegeticPanGain_fx = nonDiegeticPanGain; + move32(); hIvasRend->inputsMc[i].hMcMasa = NULL; } @@ -5421,6 +5507,7 @@ ivas_error IVAS_REND_Open( hIvasRend->inputsMasa[i].bufferData = NULL; hIvasRend->inputsMasa[i].hMasaPrerend = NULL; hIvasRend->inputsMasa[i].hMasaExtRend = NULL; + move16(); } @@ -5569,12 +5656,13 @@ ivas_error IVAS_REND_Open( static LSSETUP_CUSTOM_STRUCT makeCustomLsSetup( const IVAS_CUSTOM_LS_DATA rendCustomLsLayout ) { - int16_t i; + Word16 i; LSSETUP_CUSTOM_STRUCT customLs; /* Copy layout description */ customLs.num_spk = rendCustomLsLayout.num_spk; - for ( i = 0; i < rendCustomLsLayout.num_spk; i++ ) + move16(); + FOR( i = 0; i < rendCustomLsLayout.num_spk; i++ ) { customLs.ls_azimuth_fx[i] = (Word32) ( rendCustomLsLayout.azimuth[i] * ONE_IN_Q22 ); customLs.ls_elevation_fx[i] = (Word32) ( rendCustomLsLayout.elevation[i] * ONE_IN_Q22 ); @@ -5583,16 +5671,19 @@ static LSSETUP_CUSTOM_STRUCT makeCustomLsSetup( mvr2r( rendCustomLsLayout.elevation, customLs.ls_elevation, rendCustomLsLayout.num_spk ); customLs.is_planar_setup = 1; - for ( i = 0; i < rendCustomLsLayout.num_spk; ++i ) + move16(); + FOR( i = 0; i < rendCustomLsLayout.num_spk; ++i ) { - if ( fabsf( rendCustomLsLayout.elevation[i] ) > EPSILON ) + IF( fabsf( rendCustomLsLayout.elevation[i] ) > EPSILON ) { customLs.is_planar_setup = 0; - break; + move16(); + BREAK; } } customLs.num_lfe = rendCustomLsLayout.num_lfe; + move16(); mvs2s( rendCustomLsLayout.lfe_idx, customLs.lfe_idx, rendCustomLsLayout.num_lfe ); return customLs; @@ -5635,13 +5726,13 @@ static ivas_error validateCustomLsLayout_fx( /* Negative number of speakers or LFEs makes no sense */ test(); - IF( LT_16( layout.num_spk, 0 ) || LT_16( layout.num_lfe, 0 ) ) + IF( layout.num_spk < 0 || layout.num_lfe < 0 ) { return IVAS_ERR_INVALID_CUSTOM_LS_LAYOUT; } /* There must be at least one speaker or LFE in the layout */ - IF( LE_16( add( layout.num_spk, layout.num_lfe ), 0 ) ) + IF( add( layout.num_spk, layout.num_lfe ) <= 0 ) { return IVAS_ERR_INVALID_CUSTOM_LS_LAYOUT; } @@ -5649,7 +5740,7 @@ static ivas_error validateCustomLsLayout_fx( /* LFE indices must be positive */ FOR( i = 0; i < layout.num_lfe; ++i ) { - IF( LT_16( layout.lfe_idx[i], 0 ) ) + IF( layout.lfe_idx[i] < 0 ) { return IVAS_ERR_INVALID_CUSTOM_LS_LAYOUT; } @@ -5695,6 +5786,7 @@ static ivas_error validateCustomLsLayout( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( IVAS_REND_HANDLE hIvasRend, const IVAS_CUSTOM_LS_DATA layout ) @@ -5716,17 +5808,10 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( return IVAS_ERR_INVALID_OUTPUT_FORMAT; } -#ifdef IVAS_FLOAT_FIXED - IF( ( error = validateCustomLsLayout_fx( layout ) ) != IVAS_ERR_OK ) - { - return error; - } -#else if ( ( error = validateCustomLsLayout( layout ) ) != IVAS_ERR_OK ) { return error; } -#endif hIvasRend->customLsOut = makeCustomLsSetup( layout ); @@ -5777,6 +5862,7 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( /* Input inactive, skip. */ continue; } + if ( ( error = updateSbaPanGains( inputSba, hIvasRend->outputConfig, hIvasRend->hRendererConfig ) ) != IVAS_ERR_OK ) { return error; @@ -5786,6 +5872,92 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( return IVAS_ERR_OK; } +#else +ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( + IVAS_REND_HANDLE hIvasRend, + const IVAS_CUSTOM_LS_DATA layout ) +{ + Word16 i, numOutChannels; + ivas_error error; + input_mc *inputMc; + input_sba *inputSba; + + /* Validate function arguments */ + IF( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( NE_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + /* Specifying details of custom speaker layout only makes sense if output config is set to custom speaker layout */ + return IVAS_ERR_INVALID_OUTPUT_FORMAT; + } + + IF( NE_32( ( error = validateCustomLsLayout_fx( layout ) ), IVAS_ERR_OK ) ) + { + return error; + } + + hIvasRend->customLsOut = makeCustomLsSetup( layout ); + + /* Re-initialize limiter - number of output channels may have changed */ + IF( NE_32( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = initLimiter( &hIvasRend->hLimiter, numOutChannels, hIvasRend->sampleRateOut ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /* Re-initialize EFAP - output layout has changed or has been fully defined for the first time */ + IF( NE_32( ( error = initEfap( &hIvasRend->efapOutWrapper, hIvasRend->outputConfig, &hIvasRend->customLsOut ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /* Re-initialize panning gains for each active MC input, This includes re-initializing + * LFE handling for the new output layout, which means custom LFE handling is overwritten, + * if previously set for any MC input. */ + FOR( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) + { + inputMc = &hIvasRend->inputsMc[i]; + IF( EQ_32( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + /* Input inactive, skip. */ + CONTINUE; + } + + inputMc->lfeRouting = defaultLfeRouting( inputMc->base.inConfig, inputMc->customLsInput, hIvasRend->outputConfig, *inputMc->base.ctx.pCustomLsOut ); + + IF( NE_32( ( error = updateMcPanGains( inputMc, hIvasRend->outputConfig ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /* Re-initialize panning gains for each active SBA input */ + FOR( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) + { + inputSba = &hIvasRend->inputsSba[i]; + + IF( EQ_32( inputSba->base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + /* Input inactive, skip. */ + CONTINUE; + } + IF( NE_32( ( error = updateSbaPanGains( inputSba, hIvasRend->outputConfig, hIvasRend->hRendererConfig ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + return IVAS_ERR_OK; +} +#endif + #ifdef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * IVAS_REND_NumOutChannels() @@ -5811,9 +5983,10 @@ ivas_error IVAS_REND_NumOutChannels( { case IVAS_AUDIO_CONFIG_LS_CUSTOM: *numOutChannels = add( hIvasRend->customLsOut.num_spk, hIvasRend->customLsOut.num_lfe ); + move16(); BREAK; default: - IF( ( error = getAudioConfigNumChannels( hIvasRend->outputConfig, numOutChannels ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAudioConfigNumChannels( hIvasRend->outputConfig, numOutChannels ) ), IVAS_ERR_OK ) ) { return error; } @@ -5898,7 +6071,7 @@ static ivas_error getInputById( configType = L_shr( L_and( inputId, 0xFF00 ), 8 ); /* Validate values derived from input ID */ - IF( LT_32( inputIndex, 0 ) ) + IF( inputIndex < 0 ) { return IVAS_ERR_INVALID_INPUT_ID; } @@ -6030,7 +6203,7 @@ static ivas_error getConstInputById( configType = L_shr( L_and( inputId, 0xFF00 ), 8 ); /* Validate values derived from input ID */ - IF( LT_32( inputIndex, 0 ) ) + IF( inputIndex < 0 ) { return IVAS_ERR_INVALID_INPUT_ID; } @@ -6207,6 +6380,7 @@ static ivas_error findFreeInputSlot_fx( const input_base *pInputBase; canAddInput = false; + move16(); /* Find first unused input in array */ FOR( ( i = 0, pByte = inputs ); i < maxInputs; ( ++i, pByte += inputStructSize ) ) @@ -6216,7 +6390,9 @@ static ivas_error findFreeInputSlot_fx( IF( EQ_32( pInputBase->inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { *inputIndex = i; + move32(); canAddInput = true; + move16(); BREAK; } } @@ -6317,6 +6493,7 @@ ivas_error IVAS_REND_AddInput_fx( Word32 inputIndex; /* Validate function arguments */ + test(); IF( hIvasRend == NULL || inputId == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -6330,38 +6507,47 @@ ivas_error IVAS_REND_AddInput_fx( inputsArray = hIvasRend->inputsIsm; inputStructSize = sizeof( *hIvasRend->inputsIsm ); activateInput = setRendInputActiveIsm; + move32(); + move32(); BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: maxNumInputsOfType = RENDERER_MAX_MC_INPUTS; inputsArray = hIvasRend->inputsMc; inputStructSize = sizeof( *hIvasRend->inputsMc ); activateInput = setRendInputActiveMc; + move32(); + move32(); BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: maxNumInputsOfType = RENDERER_MAX_SBA_INPUTS; inputsArray = hIvasRend->inputsSba; inputStructSize = sizeof( *hIvasRend->inputsSba ); activateInput = setRendInputActiveSba; + move32(); + move32(); BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: maxNumInputsOfType = RENDERER_MAX_MASA_INPUTS; inputsArray = hIvasRend->inputsMasa; inputStructSize = sizeof( *hIvasRend->inputsMasa ); activateInput = setRendInputActiveMasa; + move32(); + move32(); BREAK; default: return IVAS_ERR_INVALID_INPUT_FORMAT; } /* Find first free input in array corresponding to input type */ - IF( ( error = findFreeInputSlot_fx( inputsArray, inputStructSize, maxNumInputsOfType, &inputIndex ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = findFreeInputSlot_fx( inputsArray, inputStructSize, maxNumInputsOfType, &inputIndex ) ), IVAS_ERR_OK ) ) { return error; } *inputId = makeInputId( inConfig, inputIndex ); + move16(); - IF( ( error = activateInput( (uint8_t *) inputsArray + inputStructSize * inputIndex, inConfig, *inputId, hIvasRend->hRendererConfig ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = activateInput( (UWord8 *) inputsArray + inputStructSize * inputIndex, inConfig, *inputId, hIvasRend->hRendererConfig ) ), IVAS_ERR_OK ) ) { return error; } @@ -6393,17 +6579,17 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - IF( ( error = validateCustomLsLayout_fx( layout ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = validateCustomLsLayout_fx( layout ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = getInputById( hIvasRend, inputId, (void **) &inputMc ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getInputById( hIvasRend, inputId, (void **) &inputMc ) ), IVAS_ERR_OK ) ) { return error; } - IF( inputMc->base.inConfig != IVAS_AUDIO_CONFIG_LS_CUSTOM ) + IF( NE_32( inputMc->base.inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { /* Specifying details of custom speaker layout only makes sense if input config is set to custom speaker layout */ return IVAS_ERR_INVALID_INPUT_FORMAT; @@ -6416,20 +6602,22 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( inputMc->lfeRouting = defaultLfeRouting( inputMc->base.inConfig, inputMc->customLsInput, hIvasRend->outputConfig, *inputMc->base.ctx.pCustomLsOut ); - IF( ( error = initEfap( &inputMc->efapInWrapper, inputMc->base.inConfig, &inputMc->customLsInput ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = initEfap( &inputMc->efapInWrapper, inputMc->base.inConfig, &inputMc->customLsInput ) ), IVAS_ERR_OK ) ) { return error; } + test(); + test(); IF( EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { - IF( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, FALSE ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, FALSE ) ), IVAS_ERR_OK ) ) { return error; } } - IF( ( error = updateMcPanGains( inputMc, hIvasRend->outputConfig ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = updateMcPanGains( inputMc, hIvasRend->outputConfig ) ), IVAS_ERR_OK ) ) { return error; } @@ -6550,12 +6738,13 @@ ivas_error IVAS_REND_SetInputGain_fx( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - IF( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ), IVAS_ERR_OK ) ) { return error; } inputBase->gain_fx = gain; + move32(); return IVAS_ERR_OK; } @@ -6627,12 +6816,12 @@ ivas_error IVAS_REND_SetInputLfeMtx_fx( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - IF( ( error = getInputById( hIvasRend, inputId, (void **) &pInputBase ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getInputById( hIvasRend, inputId, (void **) &pInputBase ) ), IVAS_ERR_OK ) ) { return error; } - IF( getAudioConfigType( pInputBase->inConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + IF( NE_32( getAudioConfigType( pInputBase->inConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) { /* Custom LFE panning matrix only makes sense with channel-based input */ return IVAS_ERR_INVALID_INPUT_FORMAT; @@ -6645,7 +6834,7 @@ ivas_error IVAS_REND_SetInputLfeMtx_fx( Copy32( ( *lfePanMtx )[i], pInputMc->lfeRouting.lfePanMtx_fx[i], IVAS_MAX_OUTPUT_CHANNELS ); } - IF( ( error = updateMcPanGains( pInputMc, hIvasRend->outputConfig ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = updateMcPanGains( pInputMc, hIvasRend->outputConfig ) ), IVAS_ERR_OK ) ) { return error; } @@ -6679,12 +6868,12 @@ ivas_error IVAS_REND_SetInputLfePos_fx( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - IF( ( error = getInputById( hIvasRend, inputId, (void **) &pInputBase ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getInputById( hIvasRend, inputId, (void **) &pInputBase ) ), IVAS_ERR_OK ) ) { return error; } - IF( getAudioConfigType( pInputBase->inConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + IF( NE_32( getAudioConfigType( pInputBase->inConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) { /* Custom LFE routing only makes sense with channel-based input */ return IVAS_ERR_INVALID_INPUT_FORMAT; @@ -6692,11 +6881,15 @@ ivas_error IVAS_REND_SetInputLfePos_fx( pInputMc = (input_mc *) pInputBase; pInputMc->lfeRouting.pan_lfe = true; - pInputMc->lfeRouting.lfeInputGain_fx = inputGain; // Q31 - pInputMc->lfeRouting.lfeOutputAzimuth_fx = (Word16) ( outputAzimuth ); // Q0 + move16(); + pInputMc->lfeRouting.lfeInputGain_fx = inputGain; // Q31 + move32(); + pInputMc->lfeRouting.lfeOutputAzimuth_fx = (Word16) ( outputAzimuth ); // Q0 + move16(); pInputMc->lfeRouting.lfeOutputElevation_fx = (Word16) ( outputElevation ); // Q0 + move16(); - IF( ( error = updateMcPanGains( pInputMc, hIvasRend->outputConfig ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = updateMcPanGains( pInputMc, hIvasRend->outputConfig ) ), IVAS_ERR_OK ) ) { return error; } @@ -6763,30 +6956,30 @@ ivas_error IVAS_REND_RemoveInput( input_base *inputBase; /* Validate function arguments */ - if ( hIvasRend == NULL ) + IF( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - if ( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ), IVAS_ERR_OK ) ) { return error; } - switch ( getAudioConfigType( inputBase->inConfig ) ) + SWITCH( getAudioConfigType( inputBase->inConfig ) ) { case IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED: clearInputIsm( (input_ism *) inputBase ); - break; + BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: clearInputMc( (input_mc *) inputBase ); - break; + BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: clearInputSba( (input_sba *) inputBase ); - break; + BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: clearInputMasa( (input_masa *) inputBase ); - break; + BREAK; default: return IVAS_ERR_INVALID_INPUT_FORMAT; } @@ -6839,17 +7032,18 @@ ivas_error IVAS_REND_GetInputNumChannels( const input_base *pInput; /* Validate function arguments */ + test(); IF( hIvasRend == NULL || numChannels == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - IF( ( error = getConstInputById( hIvasRend, inputId, (const void **) &pInput ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getConstInputById( hIvasRend, inputId, (const void **) &pInput ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = getRendInputNumChannels( pInput, numChannels ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getRendInputNumChannels( pInput, numChannels ) ), IVAS_ERR_OK ) ) { return error; } @@ -6887,14 +7081,17 @@ ivas_error IVAS_REND_GetNumAllObjects( Word16 *numChannels /* o : number of all objects */ ) { + test(); IF( hIvasRend == NULL || numChannels == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } + test(); IF( EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) { *numChannels = (Word16) hIvasRend->inputsIsm[0].total_num_objects; + move16(); } return IVAS_ERR_OK; @@ -6993,23 +7190,37 @@ ivas_error IVAS_REND_GetDelay_fx( Word32 timescale_by_ns[7] = { 0, 17180, 34360, 0, 68719, 0, 103079 }; /* Validate function arguments */ + test(); + test(); IF( hIvasRend == NULL || nSamples == NULL || timeScale == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } *timeScale = hIvasRend->sampleRateOut; + move32(); assert( *timeScale == 8000 || *timeScale == 16000 || *timeScale == 32000 || *timeScale == 48000 ); *nSamples = 0; + move16(); max_latency_ns = 0; + move32(); /* Compute the maximum delay across all inputs */ FOR( i = 0; i < RENDERER_MAX_ISM_INPUTS; i++ ) { IF( NE_32( hIvasRend->inputsIsm[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { - latency_ns = L_max( ( hIvasRend->inputsIsm[i].crendWrapper != NULL ) ? hIvasRend->inputsIsm[i].crendWrapper->binaural_latency_ns : 0, - hIvasRend->inputsIsm[i].tdRendWrapper.binaural_latency_ns ); + IF( hIvasRend->inputsIsm[i].crendWrapper != NULL ) + { + latency_ns = hIvasRend->inputsIsm[i].crendWrapper->binaural_latency_ns; + } + ELSE + { + latency_ns = 0; + } + move32(); + + latency_ns = L_max( latency_ns, hIvasRend->inputsIsm[i].tdRendWrapper.binaural_latency_ns ); max_latency_ns = L_max( max_latency_ns, latency_ns ); } } @@ -7018,8 +7229,18 @@ ivas_error IVAS_REND_GetDelay_fx( { IF( NE_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { - latency_ns = L_max( ( hIvasRend->inputsMc[i].crendWrapper != NULL ) ? hIvasRend->inputsMc[i].crendWrapper->binaural_latency_ns : 0, - hIvasRend->inputsMc[i].tdRendWrapper.binaural_latency_ns ); + IF( ( hIvasRend->inputsMc[i].crendWrapper != NULL ) ) + { + latency_ns = hIvasRend->inputsMc[i].crendWrapper->binaural_latency_ns; + } + ELSE + { + latency_ns = 0; + } + + move32(); + + latency_ns = L_max( latency_ns, hIvasRend->inputsMc[i].tdRendWrapper.binaural_latency_ns ); max_latency_ns = L_max( max_latency_ns, latency_ns ); } } @@ -7029,24 +7250,37 @@ ivas_error IVAS_REND_GetDelay_fx( IF( NE_32( hIvasRend->inputsSba[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { { - latency_ns = ( hIvasRend->inputsSba[i].crendWrapper != NULL ) ? hIvasRend->inputsSba[i].crendWrapper->binaural_latency_ns : 0; - max_latency_ns = L_max( max_latency_ns, latency_ns ); - } - } + IF( hIvasRend->inputsSba[i].crendWrapper != NULL ) + { + latency_ns = hIvasRend->inputsSba[i].crendWrapper->binaural_latency_ns; + } + ELSE + { + latency_ns = 0; + } + move32(); + max_latency_ns = L_max( max_latency_ns, latency_ns ); + } + } } - FOR( i = 0; i < RENDERER_MAX_MASA_INPUTS; i++ ){ - IF( NE_32( hIvasRend->inputsMasa[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ){ + FOR( i = 0; i < RENDERER_MAX_MASA_INPUTS; i++ ) + { + IF( NE_32( hIvasRend->inputsMasa[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { latency_ns = (Word32) ( IVAS_FB_DEC_DELAY_NS ); - max_latency_ns = L_max( max_latency_ns, latency_ns ); -} -} + max_latency_ns = L_max( max_latency_ns, latency_ns ); + } + } -//*nSamples = (Word16) roundf( (float) max_latency_ns * *timeScale / 1000000000.f ); -*nSamples = extract_l( Mpy_32_32_r( max_latency_ns, timescale_by_ns[*timeScale / 8000] ) ); -return IVAS_ERR_OK; + //*nSamples = (Word16) roundf( (float) max_latency_ns * *timeScale / 1000000000.f ); + Word32 temp = Mpy_32_32( *timeScale, 268436 ); // Q0 + Q31 - Q31 -> Q0, ( 1 / 8000 ) * 2 ^ 31 + *nSamples = extract_l( Mpy_32_32_r( max_latency_ns, timescale_by_ns[temp] ) ); + move16(); + + return IVAS_ERR_OK; } #endif @@ -7068,40 +7302,47 @@ ivas_error IVAS_REND_FeedInputAudio_fx( Word16 numInputChannels; /* Validate function arguments */ + test(); IF( hIvasRend == NULL || inputAudio.data == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - IF( LE_16( inputAudio.config.numSamplesPerChannel, 0 ) || LT_16( MAX_BUFFER_LENGTH_PER_CHANNEL, inputAudio.config.numSamplesPerChannel ) ) + test(); + IF( inputAudio.config.numSamplesPerChannel <= 0 || LT_16( MAX_BUFFER_LENGTH_PER_CHANNEL, inputAudio.config.numSamplesPerChannel ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Buffer size outside of supported range" ); } - IF( LE_16( inputAudio.config.numChannels, 0 ) || LT_16( MAX_INPUT_CHANNELS, inputAudio.config.numChannels ) ) + test(); + IF( inputAudio.config.numChannels <= 0 || LT_16( MAX_INPUT_CHANNELS, inputAudio.config.numChannels ) ) { return IVAS_ERR_WRONG_NUM_CHANNELS; } - IF( getAudioConfigType( hIvasRend->outputConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL && - inputAudio.config.numSamplesPerChannel * 1000 != ( BINAURAL_RENDERING_FRAME_SIZE_MS * hIvasRend->num_subframes ) * hIvasRend->sampleRateOut ) + test(); + move32(); // move added for typecasting + IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) && + NE_32( L_mult0( inputAudio.config.numSamplesPerChannel, 1000 ), (Word32) W_mult0_32_32( L_mult0( BINAURAL_RENDERING_FRAME_SIZE_MS, hIvasRend->num_subframes ), hIvasRend->sampleRateOut ) ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Binaural rendering requires specific frame size" ); } - IF( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = getRendInputNumChannels( inputBase, &numInputChannels ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getRendInputNumChannels( inputBase, &numInputChannels ) ), IVAS_ERR_OK ) ) { return error; } - - IF( ( hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_MASA1 || hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_MASA2 ) && inputBase->inConfig == IVAS_AUDIO_CONFIG_OBA ) + test(); + test(); + IF( ( EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) && EQ_32( inputBase->inConfig, IVAS_AUDIO_CONFIG_OBA ) ) { numInputChannels = (Word16) hIvasRend->inputsIsm[0].total_num_objects; + move16(); } IF( NE_16( numInputChannels, inputAudio.config.numChannels ) ) @@ -7114,6 +7355,7 @@ ivas_error IVAS_REND_FeedInputAudio_fx( mvr2r_Word32( inputAudio.data_fx, inputBase->inputBuffer.data_fx, inputAudio.config.numSamplesPerChannel * inputAudio.config.numChannels ); inputBase->numNewSamplesPerChannel = inputAudio.config.numSamplesPerChannel; + move32(); return IVAS_ERR_OK; } @@ -7136,43 +7378,50 @@ ivas_error IVAS_REND_FeedInputAudio( int16_t numInputChannels; /* Validate function arguments */ - if ( hIvasRend == NULL || inputAudio.data == NULL ) + test(); + IF( hIvasRend == NULL || inputAudio.data == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - if ( inputAudio.config.numSamplesPerChannel <= 0 || MAX_BUFFER_LENGTH_PER_CHANNEL < inputAudio.config.numSamplesPerChannel ) + test(); + IF( inputAudio.config.numSamplesPerChannel <= 0 || LT_16( MAX_BUFFER_LENGTH_PER_CHANNEL, inputAudio.config.numSamplesPerChannel ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Buffer size outside of supported range" ); } - if ( inputAudio.config.numChannels <= 0 || MAX_INPUT_CHANNELS < inputAudio.config.numChannels ) + test(); + IF( inputAudio.config.numChannels <= 0 || MAX_INPUT_CHANNELS < inputAudio.config.numChannels ) { return IVAS_ERR_WRONG_NUM_CHANNELS; } - if ( getAudioConfigType( hIvasRend->outputConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL && - inputAudio.config.numSamplesPerChannel * 1000 != ( BINAURAL_RENDERING_FRAME_SIZE_MS * hIvasRend->num_subframes ) * hIvasRend->sampleRateOut ) + test(); + move32(); // move added for typecasting + IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) && + NE_32( L_mult0( inputAudio.config.numSamplesPerChannel, 1000 ), (Word32) W_mult0_32_32( L_mult0( BINAURAL_RENDERING_FRAME_SIZE_MS, hIvasRend->num_subframes ), hIvasRend->sampleRateOut ) ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Binaural rendering requires specific frame size" ); } - if ( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ), IVAS_ERR_OK ) ) { return error; } - if ( ( error = getRendInputNumChannels( inputBase, &numInputChannels ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getRendInputNumChannels( inputBase, &numInputChannels ) ), IVAS_ERR_OK ) ) { return error; } - if ( ( hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_MASA1 || hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_MASA2 ) && inputBase->inConfig == IVAS_AUDIO_CONFIG_OBA ) + test(); + test(); + IF( ( EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) && EQ_32( inputBase->inConfig, IVAS_AUDIO_CONFIG_OBA ) ) { - numInputChannels = (int16_t) hIvasRend->inputsIsm[0].total_num_objects; + numInputChannels = (Word16) hIvasRend->inputsIsm[0].total_num_objects; } - if ( numInputChannels != inputAudio.config.numChannels ) + IF( NE_16( numInputChannels, inputAudio.config.numChannels ) ) { return IVAS_ERR_WRONG_NUM_CHANNELS; } @@ -7185,6 +7434,7 @@ ivas_error IVAS_REND_FeedInputAudio( mvr2r( inputAudio.data, inputBase->inputBuffer.data, inputAudio.config.numSamplesPerChannel * inputAudio.config.numChannels ); inputBase->numNewSamplesPerChannel = inputAudio.config.numSamplesPerChannel; + move32(); return IVAS_ERR_OK; } @@ -7213,7 +7463,7 @@ ivas_error IVAS_REND_FeedInputObjectMetadata( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - IF( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ), IVAS_ERR_OK ) ) { return error; } @@ -7340,7 +7590,7 @@ ivas_error IVAS_REND_FeedInputMasaMetadata( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - IF( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getInputById( hIvasRend, inputId, (void **) &inputBase ) ), IVAS_ERR_OK ) ) { return error; } @@ -7354,6 +7604,7 @@ ivas_error IVAS_REND_FeedInputMasaMetadata( inputMasa = (input_masa *) inputBase; inputMasa->masaMetadata = *masaMetadata; inputMasa->metadataHasBeenFed = true; + move16(); return IVAS_ERR_OK; } @@ -7408,39 +7659,36 @@ ivas_error IVAS_REND_InitConfig( ivas_error error; bool rendererConfigEnabled; - rendererConfigEnabled = ( getAudioConfigType( outAudioConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ); + rendererConfigEnabled = EQ_32( getAudioConfigType( outAudioConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ); IF( rendererConfigEnabled ) { hIvasRend->rendererConfigEnabled = 1; + move16(); } ELSE { hIvasRend->rendererConfigEnabled = 0; + move16(); } - IF( rendererConfigEnabled ){ - IF( ( error = ivas_render_config_open( &( hIvasRend->hRendererConfig ) ) ) != IVAS_ERR_OK ){ + IF( rendererConfigEnabled ) + { + IF( NE_32( ( error = ivas_render_config_open( &( hIvasRend->hRendererConfig ) ) ), IVAS_ERR_OK ) ) + { return error; -} -#ifdef IVAS_FLOAT_FIXED -IF( ( error = ivas_render_config_init_from_rom_fx( &hIvasRend->hRendererConfig ) ) != IVAS_ERR_OK ) -{ - return error; -} -#else -IF( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig ) ) != IVAS_ERR_OK ) -{ - return error; -} -#endif -} -ELSE -{ - hIvasRend->hRendererConfig = NULL; -} + } + IF( NE_32( ( error = ivas_render_config_init_from_rom_fx( &hIvasRend->hRendererConfig ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE + { + hIvasRend->hRendererConfig = NULL; + } -return IVAS_ERR_OK; + return IVAS_ERR_OK; } #else ivas_error IVAS_REND_InitConfig( @@ -7569,13 +7817,15 @@ int16_t IVAS_REND_FeedRenderConfig( * *-------------------------------------------------------------------*/ -int16_t IVAS_REND_GetRenderConfig( +Word16 IVAS_REND_GetRenderConfig( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ const IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render configuration handle */ ) { RENDER_CONFIG_HANDLE hRCin; + test(); + test(); IF( hIvasRend == NULL || hIvasRend->hRendererConfig == NULL || hRCout == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -7587,6 +7837,10 @@ int16_t IVAS_REND_GetRenderConfig( hRCout->roomAcoustics.acousticPreDelay_fx = hRCin->roomAcoustics.acousticPreDelay_fx; hRCout->roomAcoustics.inputPreDelay_fx = hRCin->roomAcoustics.inputPreDelay_fx; Copy( hRCin->directivity_fx, hRCout->directivity_fx, 3 * MAX_NUM_OBJECTS ); + move16(); + move16(); + move32(); + move32(); Copy32( hRCin->roomAcoustics.pFc_input_fx, hRCout->roomAcoustics.pFc_input_fx, CLDFB_NO_CHANNELS_MAX ); Copy32( hRCin->roomAcoustics.pAcoustic_rt60_fx, hRCout->roomAcoustics.pAcoustic_rt60_fx, CLDFB_NO_CHANNELS_MAX ); @@ -7595,6 +7849,8 @@ int16_t IVAS_REND_GetRenderConfig( hRCout->roomAcoustics.use_er = hRCin->roomAcoustics.use_er; hRCout->roomAcoustics.lowComplexity = hRCin->roomAcoustics.lowComplexity; + move16(); + move32(); return IVAS_ERR_OK; } @@ -7606,33 +7862,41 @@ int16_t IVAS_REND_GetRenderConfig( * *-------------------------------------------------------------------*/ -int16_t IVAS_REND_FeedRenderConfig( +Word16 IVAS_REND_FeedRenderConfig( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ const IVAS_RENDER_CONFIG_DATA renderConfig /* i : Render configuration struct */ ) { RENDER_CONFIG_HANDLE hRenderConfig; - if ( hIvasRend == NULL || hIvasRend->hRendererConfig == NULL ) + test(); + IF( hIvasRend == NULL || hIvasRend->hRendererConfig == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } hRenderConfig = hIvasRend->hRendererConfig; hRenderConfig->roomAcoustics.override = renderConfig.roomAcoustics.override; + move16(); hRenderConfig->roomAcoustics.nBands = renderConfig.roomAcoustics.nBands; + move16(); hRenderConfig->roomAcoustics.acousticPreDelay_fx = renderConfig.roomAcoustics.acousticPreDelay_fx; + move32(); hRenderConfig->roomAcoustics.inputPreDelay_fx = renderConfig.roomAcoustics.inputPreDelay_fx; + move32(); Copy32( renderConfig.roomAcoustics.pFc_input_fx, hRenderConfig->roomAcoustics.pFc_input_fx, CLDFB_NO_CHANNELS_MAX ); Copy32( renderConfig.roomAcoustics.pAcoustic_rt60_fx, hRenderConfig->roomAcoustics.pAcoustic_rt60_fx, CLDFB_NO_CHANNELS_MAX ); Copy32( renderConfig.roomAcoustics.pAcoustic_dsr_fx, hRenderConfig->roomAcoustics.pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX ); Copy( renderConfig.directivity_fx, hRenderConfig->directivity_fx, 3 * MAX_NUM_OBJECTS ); hRenderConfig->roomAcoustics.use_er = 0; - if ( renderConfig.roomAcoustics.use_er == 1 ) + move16(); + IF( EQ_16( renderConfig.roomAcoustics.use_er, 1 ) ) { hRenderConfig->roomAcoustics.use_er = renderConfig.roomAcoustics.use_er; + move16(); hRenderConfig->roomAcoustics.lowComplexity = renderConfig.roomAcoustics.lowComplexity; + move32(); hRenderConfig->roomAcoustics.dimensions = renderConfig.roomAcoustics.dimensions; hRenderConfig->roomAcoustics.ListenerOrigin = renderConfig.roomAcoustics.ListenerOrigin; @@ -7667,20 +7931,21 @@ ivas_error IVAS_REND_SetHeadRotation( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - IF( getAudioConfigType( hIvasRend->outputConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) + IF( NE_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) ) { /* Head rotation can be set only with binaural output */ return IVAS_ERR_INVALID_OUTPUT_FORMAT; } hIvasRend->headRotData.headRotEnabled = 1; + move16(); /* reconfigure binaural rendering to allocate the necessary renderers and free unused ones */ FOR( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) { - IF( hIvasRend->inputsMc[i].base.inConfig != IVAS_AUDIO_CONFIG_INVALID ) + IF( NE_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { - IF( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, TRUE ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, TRUE ) ), IVAS_ERR_OK ) ) { return error; } @@ -7698,11 +7963,17 @@ ivas_error IVAS_REND_SetHeadRotation( } Word32 updateRate_fx = 1677721600; // value is 200 in Q23 - rotQuat.w_fx = L_shl( rotQuat.w_fx, Q29 - rotQuat.q_fact ); - rotQuat.x_fx = L_shl( rotQuat.x_fx, Q29 - rotQuat.q_fact ); - rotQuat.y_fx = L_shl( rotQuat.y_fx, Q29 - rotQuat.q_fact ); - rotQuat.z_fx = L_shl( rotQuat.z_fx, Q29 - rotQuat.q_fact ); - hIvasRend->headRotData.hOrientationTracker->refRot.w_fx = L_shl( hIvasRend->headRotData.hOrientationTracker->refRot.w_fx, Q29 - hIvasRend->headRotData.hOrientationTracker->refRot.q_fact ); + rotQuat.w_fx = L_shl( rotQuat.w_fx, sub( Q29, rotQuat.q_fact ) ); + rotQuat.x_fx = L_shl( rotQuat.x_fx, sub( Q29, rotQuat.q_fact ) ); + rotQuat.y_fx = L_shl( rotQuat.y_fx, sub( Q29, rotQuat.q_fact ) ); + rotQuat.z_fx = L_shl( rotQuat.z_fx, sub( Q29, rotQuat.q_fact ) ); + + move32(); + move32(); + move32(); + move32(); + + hIvasRend->headRotData.hOrientationTracker->refRot.w_fx = L_shl( hIvasRend->headRotData.hOrientationTracker->refRot.w_fx, sub( Q29, hIvasRend->headRotData.hOrientationTracker->refRot.q_fact ) ); hIvasRend->headRotData.hOrientationTracker->refRot.x_fx = L_shl( hIvasRend->headRotData.hOrientationTracker->refRot.x_fx, Q29 - hIvasRend->headRotData.hOrientationTracker->refRot.q_fact ); hIvasRend->headRotData.hOrientationTracker->refRot.y_fx = L_shl( hIvasRend->headRotData.hOrientationTracker->refRot.y_fx, Q29 - hIvasRend->headRotData.hOrientationTracker->refRot.q_fact ); hIvasRend->headRotData.hOrientationTracker->refRot.z_fx = L_shl( hIvasRend->headRotData.hOrientationTracker->refRot.z_fx, Q29 - hIvasRend->headRotData.hOrientationTracker->refRot.q_fact ); @@ -7711,11 +7982,23 @@ ivas_error IVAS_REND_SetHeadRotation( hIvasRend->headRotData.hOrientationTracker->absAvgRot.y_fx = L_shl( hIvasRend->headRotData.hOrientationTracker->absAvgRot.y_fx, Q29 - hIvasRend->headRotData.hOrientationTracker->absAvgRot.q_fact ); hIvasRend->headRotData.hOrientationTracker->absAvgRot.z_fx = L_shl( hIvasRend->headRotData.hOrientationTracker->absAvgRot.z_fx, Q29 - hIvasRend->headRotData.hOrientationTracker->absAvgRot.q_fact ); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + hIvasRend->headRotData.hOrientationTracker->refRot.q_fact = Q29; hIvasRend->headRotData.hOrientationTracker->absAvgRot.q_fact = Q29; + move16(); + move16(); rotQuat.q_fact = Q29; - IF( ( error = ivas_orient_trk_Process_fx( hIvasRend->headRotData.hOrientationTracker, rotQuat, updateRate_fx, &hIvasRend->headRotData.headPositions[sf_idx] ) ) != IVAS_ERR_OK ) + move16(); + IF( NE_32( ( error = ivas_orient_trk_Process_fx( hIvasRend->headRotData.hOrientationTracker, rotQuat, updateRate_fx, &hIvasRend->headRotData.headPositions[sf_idx] ) ), IVAS_ERR_OK ) ) { return error; } @@ -7762,39 +8045,6 @@ ivas_error IVAS_REND_SetHeadRotation( } } -#ifdef IVAS_FLOAT_FIXED - /* check for Euler angle signaling */ - IF( EQ_32( headRot.w_fx, -1610612736 /* -3.0f in Q29 */ ) ) - { - Euler2Quat_fx( deg2rad_fx( headRot.x_fx ), deg2rad_fx( headRot.y_fx ), deg2rad_fx( headRot.z_fx ), &rotQuat ); - } - ELSE - { - rotQuat = headRot; - } - Word32 updateRate_fx = 1677721600; // value is 200 in Q23 - rotQuat.w_fx = L_shl( rotQuat.w_fx, Q29 - rotQuat.q_fact ); - rotQuat.x_fx = L_shl( rotQuat.x_fx, Q29 - rotQuat.q_fact ); - rotQuat.y_fx = L_shl( rotQuat.y_fx, Q29 - rotQuat.q_fact ); - rotQuat.z_fx = L_shl( rotQuat.z_fx, Q29 - rotQuat.q_fact ); - hIvasRend->headRotData.hOrientationTracker->refRot.w_fx = L_shl( hIvasRend->headRotData.hOrientationTracker->refRot.w_fx, Q29 - hIvasRend->headRotData.hOrientationTracker->refRot.q_fact ); - hIvasRend->headRotData.hOrientationTracker->refRot.x_fx = L_shl( hIvasRend->headRotData.hOrientationTracker->refRot.x_fx, Q29 - hIvasRend->headRotData.hOrientationTracker->refRot.q_fact ); - hIvasRend->headRotData.hOrientationTracker->refRot.y_fx = L_shl( hIvasRend->headRotData.hOrientationTracker->refRot.y_fx, Q29 - hIvasRend->headRotData.hOrientationTracker->refRot.q_fact ); - hIvasRend->headRotData.hOrientationTracker->refRot.z_fx = L_shl( hIvasRend->headRotData.hOrientationTracker->refRot.z_fx, Q29 - hIvasRend->headRotData.hOrientationTracker->refRot.q_fact ); - hIvasRend->headRotData.hOrientationTracker->absAvgRot.w_fx = L_shl( hIvasRend->headRotData.hOrientationTracker->absAvgRot.w_fx, Q29 - hIvasRend->headRotData.hOrientationTracker->absAvgRot.q_fact ); - hIvasRend->headRotData.hOrientationTracker->absAvgRot.x_fx = L_shl( hIvasRend->headRotData.hOrientationTracker->absAvgRot.x_fx, Q29 - hIvasRend->headRotData.hOrientationTracker->absAvgRot.q_fact ); - hIvasRend->headRotData.hOrientationTracker->absAvgRot.y_fx = L_shl( hIvasRend->headRotData.hOrientationTracker->absAvgRot.y_fx, Q29 - hIvasRend->headRotData.hOrientationTracker->absAvgRot.q_fact ); - hIvasRend->headRotData.hOrientationTracker->absAvgRot.z_fx = L_shl( hIvasRend->headRotData.hOrientationTracker->absAvgRot.z_fx, Q29 - hIvasRend->headRotData.hOrientationTracker->absAvgRot.q_fact ); - - hIvasRend->headRotData.hOrientationTracker->refRot.q_fact = Q29; - hIvasRend->headRotData.hOrientationTracker->absAvgRot.q_fact = Q29; - rotQuat.q_fact = Q29; - - IF( ( error = ivas_orient_trk_Process_fx( hIvasRend->headRotData.hOrientationTracker, rotQuat, updateRate_fx, &hIvasRend->headRotData.headPositions[sf_idx] ) ) != IVAS_ERR_OK ) - { - return error; - } -#else /* check for Euler angle signaling */ if ( headRot.w == -3.0f ) { @@ -7809,7 +8059,6 @@ ivas_error IVAS_REND_SetHeadRotation( { return error; } -#endif hIvasRend->headRotData.Pos[sf_idx] = Pos; @@ -7838,15 +8087,16 @@ ivas_error IVAS_REND_DisableHeadRotation( } hIvasRend->headRotData.headRotEnabled = 0; + move32(); /* reconfigure binaural rendering to allocate the necessary renderers and free unused ones */ - IF( getAudioConfigType( hIvasRend->outputConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) + IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) ) { FOR( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) { - IF( hIvasRend->inputsMc[i].base.inConfig != IVAS_AUDIO_CONFIG_INVALID ) + IF( NE_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { - IF( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, TRUE ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, TRUE ) ), IVAS_ERR_OK ) ) { return error; @@ -7924,6 +8174,7 @@ ivas_error IVAS_REND_SetOrientationTrackingMode( * *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED ivas_error IVAS_REND_SetReferenceRotation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_QUATERNION refRot /* i : Reference rotation */ @@ -7937,25 +8188,39 @@ ivas_error IVAS_REND_SetReferenceRotation( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef IVAS_FLOAT_FIXED - error = ivas_orient_trk_SetReferenceRotation_fx( hIvasRend->headRotData.hOrientationTracker, refRot ); - IF( error != IVAS_ERR_OK ) + IF( NE_32( error, IVAS_ERR_OK ) ) { return error; } + return IVAS_ERR_OK; +} #else +ivas_error IVAS_REND_SetReferenceRotation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_QUATERNION refRot /* i : Reference rotation */ +) +{ + ivas_error error; + + /* Validate function arguments */ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + if ( ( error = ivas_orient_trk_SetReferenceRotation( hIvasRend->headRotData.hOrientationTracker, refRot ) ) != IVAS_ERR_OK ) { return error; } -#endif return IVAS_ERR_OK; } +#endif + /*-------------------------------------------------------------------* * IVAS_REND_GetMainOrientation() @@ -8028,6 +8293,7 @@ ivas_error IVAS_REND_SetReferenceVector( const IVAS_VECTOR3 refPos /* i : Reference position */ ) { + test(); IF( hIvasRend == NULL || hIvasRend->headRotData.hOrientationTracker == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -8069,6 +8335,7 @@ ivas_error IVAS_REND_SetExternalOrientation( ) { /* Validate function arguments */ + test(); IF( hIvasRend == NULL || hIvasRend->hExternalOrientationData == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; @@ -8077,6 +8344,7 @@ ivas_error IVAS_REND_SetExternalOrientation( IF( orientation == NULL ) { hIvasRend->hExternalOrientationData->enableExternalOrientation[sf_idx] = 0; + move16(); } ELSE { @@ -8086,6 +8354,10 @@ ivas_error IVAS_REND_SetExternalOrientation( hIvasRend->hExternalOrientationData->enableExternalOrientation[sf_idx] = enableExternalOrientation; hIvasRend->hExternalOrientationData->enableRotationInterpolation[sf_idx] = enableRotationInterpolation; hIvasRend->hExternalOrientationData->numFramesToTargetOrientation[sf_idx] = numFramesToTargetOrientation; + move16(); + move16(); + move16(); + move16(); } return IVAS_ERR_OK; @@ -8282,8 +8554,12 @@ static void renderBufferChannelLerp_fx( { currentGain = gainsCurrent[outChnlIdx]; previousGain = gainsPrev == NULL ? 0 : gainsPrev[outChnlIdx]; + move32(); + move32(); /* Process current output channel only if applying non-zero gains */ + test(); + test(); IF( GT_32( abs( currentGain ), EPSILON_FX ) || ( gainsPrev != NULL && GT_32( abs( previousGain ), EPSILON_FX ) ) ) { /* Reset input pointer to the beginning of input channel */ @@ -8292,12 +8568,14 @@ static void renderBufferChannelLerp_fx( /* Set output pointer to first output channel sample */ outSmpl = getSmplPtr_fx( outAudio, outChnlIdx, 0 ); + test(); IF( gainsPrev == NULL || LE_32( abs( L_sub( L_shr( previousGain, 1 ), L_shr( currentGain, 1 ) ) ), EPSILON_FX ) ) { /* If no interpolation from previous frame, apply current gain */ DO { *outSmpl = L_add( Mpy_32_32( currentGain, ( *inSmpl ) ), *outSmpl ); + move32(); ++outSmpl; ++inSmpl; } @@ -8307,31 +8585,41 @@ static void renderBufferChannelLerp_fx( { i = 0; Word32 tmp = Q31_BY_SUB_FRAME_240; + move32(); + move32(); SWITCH( outAudio.config.numSamplesPerChannel ) { case NUM_SAMPLES_960: tmp = Q31_BY_NUM_SAMPLES_960; + move32(); BREAK; case NUM_SAMPLES_720: tmp = Q31_BY_NUM_SAMPLES_720; + move32(); BREAK; case NUM_SAMPLES_320: tmp = Q31_BY_NUM_SAMPLES_320; + move32(); BREAK; case NUM_SAMPLES_160: tmp = Q31_BY_NUM_SAMPLES_160; + move32(); BREAK; case L_SUBFRAME_48k: tmp = Q31_BY_SUB_FRAME_240; + move32(); BREAK; case L_SUBFRAME_32k: tmp = Q31_BY_SUB_FRAME_180; + move32(); BREAK; case L_SUBFRAME_16k: tmp = Q31_BY_SUB_FRAME_80; + move32(); BREAK; case L_SUBFRAME_8k: tmp = Q31_BY_SUB_FRAME_40; + move32(); BREAK; default: BREAK; @@ -8340,9 +8628,10 @@ static void renderBufferChannelLerp_fx( DO { fadeIn = UL_Mpy_32_32( i, tmp ); - fadeOut = ONE_IN_Q31 - fadeIn; + fadeOut = L_sub( ONE_IN_Q31, fadeIn ); *outSmpl = L_add( Mpy_32_32( L_add( Mpy_32_32( fadeIn, currentGain ), Mpy_32_32( fadeOut, previousGain ) ), ( *inSmpl ) ), *outSmpl ); + move32(); ++outSmpl; ++inSmpl; ++i; @@ -8399,7 +8688,6 @@ static ivas_error chooseCrossfade_fx( const Word32 **pCrossfade ) { *pCrossfade = headRotData->crossfade_fx; - move32(); return IVAS_ERR_OK; } @@ -8435,16 +8723,23 @@ static ivas_error rotateFrameMc_fx( Word32 tmp_gains[MAX_INPUT_CHANNELS]; ivas_error error; push_wmops( "rotateFrameMc_fx" ); - IF( ( error = chooseCrossfade_fx( headRotData, &crossfade ) ) != IVAS_ERR_OK ) // Q31 + IF( NE_32( ( error = chooseCrossfade_fx( headRotData, &crossfade ) ), IVAS_ERR_OK ) ) // Q31 { return error; } - num_subframes = ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->num_subframes : MAX_PARAM_SPATIAL_SUBFRAMES; + IF( ( hCombinedOrientationData != NULL ) ) + { + num_subframes = ( *hCombinedOrientationData )->num_subframes; + } + ELSE + { + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + } move16(); IF( NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - IF( ( error = getAudioConfigNumChannels( inConfig, &nchan ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAudioConfigNumChannels( inConfig, &nchan ) ), IVAS_ERR_OK ) ) { return error; } @@ -8454,7 +8749,7 @@ static ivas_error rotateFrameMc_fx( nchan = add( pInCustomLs->num_spk, pInCustomLs->num_lfe ); } - IF( ( error = getMcConfigValues_fx( inConfig, pInCustomLs, &ls_azimuth, &ls_elevation, &lfe_idx, &is_planar_setup ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getMcConfigValues_fx( inConfig, pInCustomLs, &ls_azimuth, &ls_elevation, &lfe_idx, &is_planar_setup ) ), IVAS_ERR_OK ) ) { return error; } @@ -8472,6 +8767,7 @@ static ivas_error rotateFrameMc_fx( Word16 tmp = BASOP_Util_Divide3216_Scale( inAudio.config.numSamplesPerChannel, num_subframes, &tmp_e ); tmp = shr( tmp, negate( add( 1, tmp_e ) ) ); subframe_len = tmp; + move16(); FOR( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) { @@ -8504,11 +8800,24 @@ static ivas_error rotateFrameMc_fx( /* input channel index without LFE */ ch_in_woLFE = ( ( GT_16( lfe_idx, 0 ) ) && ( GE_16( ch_in, lfe_idx ) ) ) ? sub( ch_in, 1 ) : ch_in; - move16(); + + test(); + IF( ( GT_16( lfe_idx, 0 ) ) && ( GE_16( ch_in, lfe_idx ) ) ) + { + ch_in_woLFE = sub( ch_in, 1 ); + } + ELSE + { + ch_in_woLFE = ch_in; + move16(); + } + /* gains for current subframe rotation */ rotateAziEle_fixed( (Word16) L_shr( ls_azimuth[ch_in_woLFE], 22 ), (Word16) L_shr( ls_elevation[ch_in_woLFE], 22 ), &azimuth_fx, &elevation_fx, Rmat_fx, is_planar_setup ); + test(); + test(); IF( hEFAPdata != NULL && ( NE_32( ls_azimuth[ch_in_woLFE], azimuth_fx ) || NE_32( ls_elevation[ch_in_woLFE], elevation_fx ) ) ) { efap_determine_gains_fx( hEFAPdata, tmp_gains, azimuth_fx, elevation_fx, EFAP_MODE_EFAP ); @@ -8522,8 +8831,17 @@ static ivas_error rotateFrameMc_fx( } /* output channel index without LFE */ - ch_out_woLFE = ( ( lfe_idx > 0 ) && ( ch_out >= lfe_idx ) ) ? ch_out - 1 : ch_out; - move16(); + test(); + IF( ( lfe_idx > 0 ) && ( GE_16( ch_out, lfe_idx ) ) ) + { + ch_out_woLFE = sub( ch_out, 1 ); + } + ELSE + { + ch_out_woLFE = ch_out; + move16(); + } + gains[ch_in][ch_out] = tmp_gains[ch_out_woLFE]; // Q30 move32(); } @@ -8535,17 +8853,15 @@ static ivas_error rotateFrameMc_fx( { FOR( ch_in = 0; ch_in < nchan; ch_in++ ) { - writePtr = getSmplPtr_fx( outAudio, ch_out, subframe_idx * subframe_len ); - move32(); - readPtr = getSmplPtr_fx( inAudio, ch_in, subframe_idx * subframe_len ); - move32(); + writePtr = getSmplPtr_fx( outAudio, ch_out, imult1616( subframe_idx, subframe_len ) ); + readPtr = getSmplPtr_fx( inAudio, ch_in, imult1616( subframe_idx, subframe_len ) ); /* crossfade with previous rotation gains */ FOR( i = 0; i < subframe_len; i++ ) { *writePtr = L_add( *writePtr, L_add( Mpy_32_32( ( *readPtr ), Mpy_32_32( ( ONE_IN_Q31 - crossfade[i] ), gains_prev[ch_in][ch_out] ) ), Mpy_32_32( ( *readPtr ), Mpy_32_32( crossfade[i], gains[ch_in][ch_out] ) ) ) ); // Qinp -1 - + move32(); readPtr++; writePtr++; } @@ -8730,46 +9046,51 @@ static ivas_error rotateFrameSba_fx( Word32 temp; Word32 Rmat[3][3]; ivas_error error; - Word16 idx; + Word16 idx, exp; Word32 cf, oneminuscf; Word32 val; push_wmops( "rotateFrameSba" ); - if ( ( error = chooseCrossfade_fx( headRotData, &crossfade ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = chooseCrossfade_fx( headRotData, &crossfade ) ), IVAS_ERR_OK ) ) { return error; } num_subframes = ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->num_subframes : MAX_PARAM_SPATIAL_SUBFRAMES; + move16(); - if ( ( error = getAmbisonicsOrder_fx( inConfig, &shd_rot_max_order ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAmbisonicsOrder_fx( inConfig, &shd_rot_max_order ) ), IVAS_ERR_OK ) ) { return error; } - subframe_len = inAudio.config.numSamplesPerChannel / num_subframes; - for ( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) + // subframe_len = inAudio.config.numSamplesPerChannel / num_subframes; + subframe_len = BASOP_Util_Divide1616_Scale( inAudio.config.numSamplesPerChannel, num_subframes, &exp ); + subframe_len = shr( subframe_len, sub( 15, exp ) ); + FOR( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) { /* initialize rotation matrices with zeros */ - for ( i = 0; i < HEADROT_SHMAT_DIM; i++ ) + FOR( i = 0; i < HEADROT_SHMAT_DIM; i++ ) { set_val_Word16( gains[i], 0, HEADROT_SHMAT_DIM ); } - for ( i = 0; i < 3; i++ ) + FOR( i = 0; i < 3; i++ ) { - if ( hCombinedOrientationData != NULL ) + IF( hCombinedOrientationData != NULL ) { - for ( l = 0; l < 3; l++ ) + FOR( l = 0; l < 3; l++ ) { Rmat[i][l] = ( *hCombinedOrientationData )->Rmat_fx[subframe_idx][i][l]; // Q30 + move32(); } } - else + ELSE { /* Set to identity */ set_val_Word32( Rmat[i], 0, 3 ); Rmat[i][i] = ONE_IN_Q30; + move32(); } } /* calculate ambisonics rotation matrices for the previous and current frames */ @@ -8779,45 +9100,53 @@ static ivas_error rotateFrameSba_fx( dbgwrite_txt( gains, HEADROT_SHMAT_DIM * HEADROT_SHMAT_DIM, "Fixed_code_gains.txt", NULL ); dbgwrite_txt( Rmat, 3 * 3, "Fixed_code_Rmat.txt", NULL ); #endif - for ( i = 0; i < subframe_len; i++ ) + FOR( i = 0; i < subframe_len; i++ ) { - idx = subframe_idx * subframe_len + i; + idx = add( imult1616( subframe_idx, subframe_len ), i ); // cf = crossfade[i]; cf = crossfade[i]; - oneminuscf = ONE_IN_Q31 - cf; + move32(); + oneminuscf = L_sub( ONE_IN_Q31, cf ); /* As the rotation matrix becomes block diagonal in a SH basis, we can*/ /* apply each angular-momentum block individually to save complexity. */ /* loop over l blocks */ m1 = 1; m2 = 4; - for ( l = 1; l <= shd_rot_max_order; l++ ) + move16(); + move16(); + FOR( l = 1; l <= shd_rot_max_order; l++ ) { /* compute mtx-vector product for this l */ - for ( n = m1; n < m2; n++ ) + FOR( n = m1; n < m2; n++ ) { - tmpRot[n - m1] = 0; - for ( m = m1; m < m2; m++ ) + tmpRot[sub( n, m1 )] = 0; + move32(); + FOR( m = m1; m < m2; m++ ) { - val = inAudio.data_fx[m * inAudio.config.numSamplesPerChannel + idx]; + val = inAudio.data_fx[add( imult1616( m, inAudio.config.numSamplesPerChannel ), idx )]; /* crossfade with previous rotation gains */ temp = Mpy_32_32( L_add( Mpy_32_16_r( cf, gains[n][m] ), ( Mpy_32_16_r( oneminuscf, gains_prev[n][m] ) ) ), val ); - tmpRot[n - m1] = L_add( L_shl( temp, 1 ), tmpRot[n - m1] ); // Qexp + tmpRot[sub( n, m1 )] = L_add( L_shl( temp, 1 ), tmpRot[sub( n, m1 )] ); // Qexp + move32(); + move32(); } } /* write back the result */ - for ( n = m1; n < m2; n++ ) + FOR( n = m1; n < m2; n++ ) { writePtr = getSmplPtr_fx( outAudio, n, idx ); - ( *writePtr ) = tmpRot[n - m1]; + ( *writePtr ) = tmpRot[sub( n, m1 )]; + move32(); } m1 = m2; - m2 += 2 * ( l + 1 ) + 1; + move16(); + m2 = add( m2, 2 * ( l + 1 ) + 1 ); } } /* move SHrotmat to SHrotmat_prev */ - for ( i = 0; i < HEADROT_SHMAT_DIM; i++ ) + FOR( i = 0; i < HEADROT_SHMAT_DIM; i++ ) { Copy( gains[i], gains_prev[i], HEADROT_SHMAT_DIM ); // Q14 } @@ -8953,6 +9282,7 @@ static ivas_error renderIsmToBinaural( Word16 ism_md_subframe_update_ext; Word16 i; Word16 exp = *outAudio.pq_fact; + move16(); push_wmops( "renderIsmToBinaural" ); /* Metadata Delay to sync with audio delay converted from ms to 5ms (1000/50/4) subframe index */ ism_md_subframe_update_ext = extract_l( Mpy_32_32( ismInput->ism_metadata_delay_ms_fx, 429496730 /* 1000 / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES in Q31 */ ) ); @@ -8963,15 +9293,16 @@ static ivas_error renderIsmToBinaural( Scale_sig32( tmpTDRendBuffer[i], L_FRAME48k, sub( 11, exp ) ); } - IF( ( error = ivas_td_binaural_renderer_ext_fx( &ismInput->tdRendWrapper, ismInput->base.inConfig, NULL, ismInput->base.ctx.pCombinedOrientationData, &ismInput->currentPos, ismInput->hReverb, ism_md_subframe_update_ext, - *ismInput->base.ctx.pOutSampleRate, outAudio.config.numSamplesPerChannel, tmpTDRendBuffer, &exp ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_binaural_renderer_ext_fx( &ismInput->tdRendWrapper, ismInput->base.inConfig, NULL, ismInput->base.ctx.pCombinedOrientationData, &ismInput->currentPos, ismInput->hReverb, ism_md_subframe_update_ext, + *ismInput->base.ctx.pOutSampleRate, outAudio.config.numSamplesPerChannel, tmpTDRendBuffer, &exp ) ), + IVAS_ERR_OK ) ) { return error; } FOR( i = 0; i < MAX_OUTPUT_CHANNELS; ++i ) { - Scale_sig32( tmpTDRendBuffer[i], L_FRAME48k, -sub( 11, exp ) ); + Scale_sig32( tmpTDRendBuffer[i], L_FRAME48k, negate( sub( 11, exp ) ) ); } IF( ismInput->hReverb != NULL ) @@ -8979,7 +9310,10 @@ static ivas_error renderIsmToBinaural( FOR( i = 0; i < outAudio.config.numChannels; i++ ) { FOR( Word16 j = 0; j < outAudio.config.numSamplesPerChannel; j++ ) - tmpTDRendBuffer[i][j] = L_shl( tmpTDRendBuffer[i][j], 2 ); + { + tmpTDRendBuffer[i][j] = L_shl( tmpTDRendBuffer[i][j], 2 ); + move32(); + } } } accumulate2dArrayToBuffer_fx( tmpTDRendBuffer, &outAudio ); @@ -9028,7 +9362,10 @@ static Word16 getNumSubframesInBuffer( const IVAS_REND_AudioBuffer *buffer, const Word32 sampleRate ) { - return extract_l( buffer->config.numSamplesPerChannel / ( sampleRate / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES ) ); + Word16 scale, temp = extract_l( Mpy_32_32( sampleRate, 10737418 ) ); // Q0 + Q31 - Q31 -> Q0 + temp = BASOP_Util_Divide1616_Scale( buffer->config.numSamplesPerChannel, temp, &scale ); + temp = shr( temp, sub( 15, scale ) ); + return temp; } #else static int16_t getNumSubframesInBuffer( @@ -9076,6 +9413,7 @@ static ivas_error renderIsmToBinauralRoom( hCombinedOrientationData = ismInput->base.ctx.pCombinedOrientationData; combinedOrientationEnabled = 0; + move16(); IF( hCombinedOrientationData != NULL ) { FOR( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) @@ -9084,6 +9422,7 @@ static ivas_error renderIsmToBinauralRoom( IF( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) { combinedOrientationEnabled = 1; + move16(); BREAK; } } @@ -9095,6 +9434,7 @@ static ivas_error renderIsmToBinauralRoom( { FOR( i = 0; i < 3; i++ ) { + test(); IF( hCombinedOrientationData != NULL && ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] ) { FOR( j = 0; j < 3; j++ ) @@ -9151,7 +9491,7 @@ static ivas_error renderIsmToBinauralRoom( position_changed = !ismInput->firstFrameRendered || checkObjectPositionChanged_fx( &rotatedPos, &rotatedPosPrev ); /* set previous gains if this is the first frame */ - IF( ( error = getEfapGains_fx( *ismInput->base.ctx.pEfapOutWrapper, rotatedPosPrev.azimuth_fx, rotatedPosPrev.elevation_fx, ismInput->prev_pan_gains_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getEfapGains_fx( *ismInput->base.ctx.pEfapOutWrapper, rotatedPosPrev.azimuth_fx, rotatedPosPrev.elevation_fx, ismInput->prev_pan_gains_fx ) ), IVAS_ERR_OK ) ) { return error; } @@ -9159,10 +9499,11 @@ static ivas_error renderIsmToBinauralRoom( /* compute gains only if position changed */ IF( position_changed ) { - IF( ( error = getEfapGains_fx( *ismInput->base.ctx.pEfapOutWrapper, - rotatedPos.azimuth_fx, - rotatedPos.elevation_fx, - currentPanGains ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getEfapGains_fx( *ismInput->base.ctx.pEfapOutWrapper, + rotatedPos.azimuth_fx, + rotatedPos.elevation_fx, + currentPanGains ) ), + IVAS_ERR_OK ) ) { return error; } @@ -9171,15 +9512,16 @@ static ivas_error renderIsmToBinauralRoom( /* intermediate rendering to 7_1_4 */ tmpMcBuffer = ismInput->base.inputBuffer; - IF( ( error = getAudioConfigNumChannels( IVAS_AUDIO_CONFIG_7_1_4, &tmp ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAudioConfigNumChannels( IVAS_AUDIO_CONFIG_7_1_4, &tmp ) ), IVAS_ERR_OK ) ) { return error; } tmpMcBuffer.config.numChannels = tmp; move16(); - tmpMcBuffer.data_fx = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( Word32 ) ); - set_zero_fx( tmpMcBuffer.data_fx, tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels ); + tmpMcBuffer.data_fx = malloc( imult1616( tmpMcBuffer.config.numSamplesPerChannel, tmpMcBuffer.config.numChannels ) * sizeof( Word32 ) ); + set_zero_fx( tmpMcBuffer.data_fx, imult1616( tmpMcBuffer.config.numSamplesPerChannel, tmpMcBuffer.config.numChannels ) ); + renderBufferChannelLerp_fx( ismInput->base.inputBuffer, 0, position_changed ? currentPanGains : ismInput->prev_pan_gains_fx, @@ -9206,11 +9548,13 @@ static ivas_error renderIsmToBinauralRoom( move16(); IF( hCrend->reflections != NULL ) { - IF( hCrend->reflections->use_er == 1 && hCrend->reflections->is_ready == 1 ) + test(); + IF( EQ_32( hCrend->reflections->use_er, 1 ) && EQ_32( hCrend->reflections->is_ready, 1 ) ) { FOR( i = 0; i < 150; i++ ) { hCrend->reflections->shoebox_data.gains.data_fx[i] = L_shl( hCrend->reflections->shoebox_data.gains.data_fx[i], 9 ); + move32(); } } } @@ -9218,9 +9562,10 @@ static ivas_error renderIsmToBinauralRoom( move16(); /* render 7_1_4 with BRIRs */ - IF( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, - NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate, - getNumSubframesInBuffer( &outAudio, *ismInput->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, + NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate, + getNumSubframesInBuffer( &outAudio, *ismInput->base.ctx.pOutSampleRate ) ) ), + IVAS_ERR_OK ) ) { return error; @@ -9228,6 +9573,7 @@ static ivas_error renderIsmToBinauralRoom( IF( hCrend->hReverb != NULL ) { *exp = sub( *exp, 2 ); + move16(); } accumulate2dArrayToBuffer_fx( tmpRendBuffer, &outAudio ); @@ -9408,6 +9754,7 @@ static ivas_error renderIsmToBinauralReverb( ivas_error error; Word16 ism_md_subframe_update_ext, i; Word16 exp = *outAudio.pq_fact; + move16(); push_wmops( "renderIsmToBinauralRoom" ); @@ -9420,14 +9767,14 @@ static ivas_error renderIsmToBinauralReverb( Scale_sig32( tmpRendBuffer_fx[i], L_FRAME48k, sub( 11, exp ) ); } - IF( ( error = ivas_td_binaural_renderer_ext_fx( &ismInput->tdRendWrapper, ismInput->base.inConfig, NULL, ismInput->base.ctx.pCombinedOrientationData, &ismInput->currentPos, ismInput->hReverb, ism_md_subframe_update_ext, *ismInput->base.ctx.pOutSampleRate, outAudio.config.numSamplesPerChannel, tmpRendBuffer_fx, &exp ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_binaural_renderer_ext_fx( &ismInput->tdRendWrapper, ismInput->base.inConfig, NULL, ismInput->base.ctx.pCombinedOrientationData, &ismInput->currentPos, ismInput->hReverb, ism_md_subframe_update_ext, *ismInput->base.ctx.pOutSampleRate, outAudio.config.numSamplesPerChannel, tmpRendBuffer_fx, &exp ) ), IVAS_ERR_OK ) ) { return error; } FOR( i = 0; i < MAX_OUTPUT_CHANNELS; ++i ) { - Scale_sig32( tmpRendBuffer_fx[i], L_FRAME48k, -sub( 11, exp ) ); + Scale_sig32( tmpRendBuffer_fx[i], L_FRAME48k, negate( sub( 11, exp ) ) ); } IF( ismInput->hReverb != NULL ) @@ -9435,7 +9782,10 @@ static ivas_error renderIsmToBinauralReverb( FOR( i = 0; i < outAudio.config.numChannels; i++ ) { FOR( Word16 j = 0; j < outAudio.config.numSamplesPerChannel; j++ ) - tmpRendBuffer_fx[i][j] = L_shl( tmpRendBuffer_fx[i][j], 2 ); + { + tmpRendBuffer_fx[i][j] = L_shl( tmpRendBuffer_fx[i][j], 2 ); + move16(); + } } } accumulate2dArrayToBuffer_fx( tmpRendBuffer_fx, &outAudio ); @@ -9477,7 +9827,7 @@ static ivas_error renderIsmToMc( input_ism *ismInput, const IVAS_REND_AudioBuffer outAudio ) { - int8_t position_changed; + Word8 position_changed; pan_vector_fx currentPanGains_fx; ivas_error error; @@ -9489,7 +9839,8 @@ static ivas_error renderIsmToMc( ismInput->previousPos.elevation_fx = L_shl( L_shr( L_add( ismInput->previousPos.elevation_fx, ONE_IN_Q21 ), Q22 ), Q22 ); position_changed = !ismInput->firstFrameRendered || checkObjectPositionChanged( &ismInput->currentPos, &ismInput->previousPos ); - IF( *ismInput->base.ctx.pOutConfig == IVAS_AUDIO_CONFIG_STEREO ) + test(); + IF( EQ_32( *ismInput->base.ctx.pOutConfig, IVAS_AUDIO_CONFIG_STEREO ) ) { IF( ismInput->nonDiegeticPan ) { @@ -9497,6 +9848,10 @@ static ivas_error renderIsmToMc( currentPanGains_fx[1] = L_sub( ONE_IN_Q31, currentPanGains_fx[0] ); ismInput->prev_pan_gains_fx[0] = currentPanGains_fx[0]; // Q31 ismInput->prev_pan_gains_fx[1] = currentPanGains_fx[1]; // Q31 + move32(); + move32(); + move32(); + move32(); } ELSE { @@ -9511,6 +9866,8 @@ static ivas_error renderIsmToMc( ivas_ism_get_stereo_gains_fx( azimuth_tmp, elevation_tmp, &gains_fx[0], &gains_fx[1] ); currentPanGains_fx[0] = L_deposit_h( gains_fx[0] ); // Q31 currentPanGains_fx[1] = L_deposit_h( gains_fx[1] ); // Q31 + move32(); + move32(); azimuth_tmp = extract_l( L_shr( ismInput->previousPos.azimuth_fx, Q22 ) ); elevation_tmp = extract_l( L_shr( ismInput->previousPos.elevation_fx, Q22 ) ); @@ -9519,6 +9876,8 @@ static ivas_error renderIsmToMc( ivas_ism_get_stereo_gains_fx( azimuth_tmp, elevation_tmp, &gains_fx[0], &gains_fx[1] ); ismInput->prev_pan_gains_fx[0] = L_deposit_h( gains_fx[0] ); // Q31 ismInput->prev_pan_gains_fx[1] = L_deposit_h( gains_fx[1] ); // Q31 + move32(); + move32(); } } ELSE @@ -9527,10 +9886,11 @@ static ivas_error renderIsmToMc( IF( position_changed ) { // TODO tmu review when #215 is resolved - IF( ( error = getEfapGains_fx( *ismInput->base.ctx.pEfapOutWrapper, - ismInput->currentPos.azimuth_fx, - ismInput->currentPos.elevation_fx, - currentPanGains_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getEfapGains_fx( *ismInput->base.ctx.pEfapOutWrapper, + ismInput->currentPos.azimuth_fx, + ismInput->currentPos.elevation_fx, + currentPanGains_fx ) ), + IVAS_ERR_OK ) ) { return error; } @@ -9540,10 +9900,11 @@ static ivas_error renderIsmToMc( IF( !ismInput->firstFrameRendered ) { // TODO tmu review when #215 is resolved - IF( ( error = getEfapGains_fx( *ismInput->base.ctx.pEfapOutWrapper, - ismInput->previousPos.azimuth_fx, - ismInput->previousPos.elevation_fx, - ismInput->prev_pan_gains_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getEfapGains_fx( *ismInput->base.ctx.pEfapOutWrapper, + ismInput->previousPos.azimuth_fx, + ismInput->previousPos.elevation_fx, + ismInput->prev_pan_gains_fx ) ), + IVAS_ERR_OK ) ) { return error; } @@ -9662,20 +10023,25 @@ static ivas_error renderIsmToSba( ismInput->currentPos.elevation_fx = L_shl( L_shr( L_add( ismInput->currentPos.elevation_fx, ONE_IN_Q21 ), Q22 ), Q22 ); ismInput->previousPos.azimuth_fx = L_shl( L_shr( L_add( ismInput->previousPos.azimuth_fx, ONE_IN_Q21 ), Q22 ), Q22 ); ismInput->previousPos.elevation_fx = L_shl( L_shr( L_add( ismInput->previousPos.elevation_fx, ONE_IN_Q21 ), Q22 ), Q22 ); + move32(); + move32(); + move32(); + move32(); push_wmops( "renderIsmToSba" ); - IF( ( error = getAudioConfigNumChannels( outConfig, &numOutChannels ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAudioConfigNumChannels( outConfig, &numOutChannels ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = getAmbisonicsOrder( outConfig, &ambiOrderOut ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAmbisonicsOrder( outConfig, &ambiOrderOut ) ), IVAS_ERR_OK ) ) { return error; } position_changed = !ismInput->firstFrameRendered || checkObjectPositionChanged( &ismInput->currentPos, &ismInput->previousPos ); + test(); /* set previous gains if this is the first frame */ Word16 azimuth_tmp, elevation_tmp; @@ -9692,6 +10058,7 @@ static ivas_error renderIsmToSba( FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { ismInput->prev_pan_gains_fx[i] = L_shl_sat( ismInput->prev_pan_gains_fx[i], Q2 ); + move32(); } } @@ -9709,6 +10076,7 @@ static ivas_error renderIsmToSba( FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { currentPanGains_fx[i] = L_shl_sat( currentPanGains_fx[i], Q2 ); + move32(); } } @@ -9815,6 +10183,7 @@ static void renderIsmToMasa( Word16 guard_bits = find_guarded_bits_fx( L_FRAME48k ); max_e = input_e[0]; + move16(); FOR( i = 1; i < MAX_NUM_OBJECTS; i++ ) { @@ -9838,6 +10207,7 @@ static void renderIsmToMasa( ivas_omasa_ana_fx( ismInput->hOMasa, tmpRendBuffer_fx, &q_fact, ismInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels, ismInput->base.inputBuffer.config.numChannels ); *exp = q_fact; + move16(); accumulate2dArrayToBuffer_fx( tmpRendBuffer_fx, &outAudio ); @@ -9885,12 +10255,15 @@ static ivas_error renderInputIsm( return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); } ismInput->base.numNewSamplesPerChannel = 0; - + move32(); /* Apply input gain to new audio */ v_multc_fixed( inAudio.data_fx, ismInput->base.gain_fx, inAudio.data_fx, imult1616( inAudio.config.numSamplesPerChannel, inAudio.config.numChannels ) ); - *outAudio.pq_fact -= 1; + *outAudio.pq_fact = sub( *outAudio.pq_fact, 1 ); exp = *outAudio.pq_fact; + + move16(); + move16(); /* set combined orientation subframe info to start info */ ivas_combined_orientation_set_to_start_index( *ismInput->base.ctx.pCombinedOrientationData ); @@ -9904,7 +10277,7 @@ static ivas_error renderInputIsm( error = renderIsmToSba( ismInput, outConfig, outAudio ); BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: - switch ( outConfig ) + SWITCH( outConfig ) { case IVAS_AUDIO_CONFIG_BINAURAL: error = renderIsmToBinaural( ismInput, outAudio ); @@ -9923,7 +10296,8 @@ static ivas_error renderInputIsm( renderIsmToMasa( ismInput, outAudio, &exp ); FOR( Word16 block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) { - ismInput->hOMasa->energy_e[block_m_idx] = 31 - ismInput->hOMasa->energy_q; + ismInput->hOMasa->energy_e[block_m_idx] = sub( 31, ismInput->hOMasa->energy_q ); + move16(); } BREAK; default: @@ -9931,7 +10305,7 @@ static ivas_error renderInputIsm( } /* Check error here to keep switch statement more compact */ - IF( error != IVAS_ERR_OK ) + IF( NE_32( error, IVAS_ERR_OK ) ) { return error; } @@ -9939,6 +10313,9 @@ static ivas_error renderInputIsm( ismInput->firstFrameRendered = TRUE; *outAudio.pq_fact = exp; + + move16(); + move16(); return error; } #else @@ -9949,11 +10326,6 @@ static ivas_error renderInputIsm( { ivas_error error; IVAS_REND_AudioBuffer inAudio; -#ifdef IVAS_FLOAT_FIXED - Word16 exp = 8; - move16(); -#endif - error = IVAS_ERR_OK; inAudio = ismInput->base.inputBuffer; @@ -9963,64 +10335,19 @@ static ivas_error renderInputIsm( } ismInput->base.numNewSamplesPerChannel = 0; -#ifdef IVAS_FLOAT_FIXED - ismInput->base.gain = fix_to_float( ismInput->base.gain_fx, 30 ); -#endif // IVAS_FLOAT_FIXED - /* Apply input gain to new audio */ v_multc( inAudio.data, ismInput->base.gain, inAudio.data, inAudio.config.numSamplesPerChannel * inAudio.config.numChannels ); /* set combined orientation subframe info to start info */ ivas_combined_orientation_set_to_start_index( *ismInput->base.ctx.pCombinedOrientationData ); -#ifdef IVAS_FLOAT_FIXED - ismInput->previousPos.azimuth_fx = (Word32) ( ismInput->previousPos.azimuth * ONE_IN_Q22 ); - move32(); - ismInput->previousPos.elevation_fx = (Word32) ( ismInput->previousPos.elevation * ONE_IN_Q22 ); - move32(); - ismInput->currentPos.azimuth_fx = (Word32) ( ismInput->currentPos.azimuth * ONE_IN_Q22 ); - move32(); - ismInput->currentPos.elevation_fx = (Word32) ( ismInput->currentPos.elevation * ONE_IN_Q22 ); - move32(); - - fixedToFloat_arrL( ismInput->base.inputBuffer.data_fx, ismInput->base.inputBuffer.data, Q8, ismInput->base.inputBuffer.config.numSamplesPerChannel * ismInput->base.inputBuffer.config.numChannels ); - - floatToFixed_arrL( ismInput->prev_pan_gains, ismInput->prev_pan_gains_fx, Q31, MAX_OUTPUT_CHANNELS ); - ismInput->nonDiegeticPanGain_fx = floatToFixed_32( ismInput->nonDiegeticPanGain, Q31 ); - -#endif - switch ( getAudioConfigType( outConfig ) ) { case IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED: -#ifdef IVAS_FLOAT_FIXED - error = renderIsmToMc( ismInput, outAudio ); - FOR( Word32 i = 0; i < 16; i++ ) - { - ismInput->prev_pan_gains[i] = (float) ismInput->prev_pan_gains_fx[i] / ( ONE_IN_Q31 ); - } - FOR( Word32 i = 0; i < outAudio.config.numSamplesPerChannel * outAudio.config.numChannels; ++i ) - { - outAudio.data[i] = ( (float) outAudio.data_fx[i] / ONE_IN_Q8 ); - } -#else error = renderIsmToMc( ismInput, outAudio ); -#endif break; case IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS: -#ifdef IVAS_FLOAT_FIXED - error = renderIsmToSba( ismInput, outConfig, outAudio ); - FOR( Word32 i = 0; i < 16; i++ ) - { - ismInput->prev_pan_gains[i] = (float) ismInput->prev_pan_gains_fx[i] / ( ONE_IN_Q31 ); - } - FOR( Word32 i = 0; i < outAudio.config.numSamplesPerChannel * outAudio.config.numChannels; ++i ) - { - outAudio.data[i] = ( (float) outAudio.data_fx[i] / ONE_IN_Q8 ); - } -#else error = renderIsmToSba( ismInput, outConfig, outAudio ); -#endif break; case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: switch ( outConfig ) @@ -10029,19 +10356,7 @@ static ivas_error renderInputIsm( error = renderIsmToBinaural( ismInput, outAudio ); break; case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: -#ifdef IVAS_FLOAT_FIXED - error = renderIsmToBinauralRoom( ismInput, outAudio, &exp ); - FOR( Word32 i = 0; i < 16; i++ ) - { - ismInput->prev_pan_gains[i] = (float) ismInput->prev_pan_gains_fx[i] / ( ONE_IN_Q31 ); - } - FOR( Word32 i = 0; i < outAudio.config.numSamplesPerChannel * outAudio.config.numChannels; ++i ) - { - outAudio.data[i] = ( (float) outAudio.data_fx[i] / ( 1 << exp ) ); - } -#else error = renderIsmToBinauralRoom( ismInput, outAudio ); -#endif break; case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: error = renderIsmToBinauralReverb( ismInput, outAudio ); @@ -10051,22 +10366,7 @@ static ivas_error renderInputIsm( } break; case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: -#ifdef IVAS_FLOAT_FIXED - renderIsmToMasa( ismInput, outAudio, &exp ); - FOR( Word16 block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) - { - FOR( Word16 band_m_idx = 0; band_m_idx < ismInput->hOMasa->nbands; band_m_idx++ ) - { - ismInput->hOMasa->energy[block_m_idx][band_m_idx] = fixedToFloat( ismInput->hOMasa->energy_fx[block_m_idx][band_m_idx], ismInput->hOMasa->energy_q ); - } - } - FOR( Word32 i = 0; i < outAudio.config.numSamplesPerChannel * outAudio.config.numChannels; ++i ) - { - outAudio.data[i] = ( (float) outAudio.data_fx[i] / ( 1 << exp ) ); - } -#else renderIsmToMasa( ismInput, outAudio ); -#endif break; default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; @@ -10093,24 +10393,28 @@ static ivas_error renderActiveInputsIsm( input_ism *pCurrentInput; ivas_error error; Word16 input_q = Q8; - for ( i = 0, pCurrentInput = hIvasRend->inputsIsm; i < RENDERER_MAX_ISM_INPUTS; ++i, ++pCurrentInput ) + move16(); + FOR( ( i = 0, pCurrentInput = hIvasRend->inputsIsm ); i < RENDERER_MAX_ISM_INPUTS; ( ++i, ++pCurrentInput ) ) { - IF( pCurrentInput->base.inConfig == IVAS_AUDIO_CONFIG_INVALID ) + IF( EQ_32( pCurrentInput->base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { /* Skip inactive inputs */ - continue; + CONTINUE; } *outAudio.pq_fact = Q8; - if ( ( error = renderInputIsm( pCurrentInput, hIvasRend->outputConfig, outAudio ) ) != IVAS_ERR_OK ) + move16(); + IF( NE_32( ( error = renderInputIsm( pCurrentInput, hIvasRend->outputConfig, outAudio ) ), IVAS_ERR_OK ) ) { return error; } FOR( Word16 j = 0; j < outAudio.config.numSamplesPerChannel * outAudio.config.numChannels; ++j ) { outAudio.data_fx[j] = L_shl( outAudio.data_fx[j], sub( sub( input_q, 1 ), ( *outAudio.pq_fact ) ) ); + move32(); } *outAudio.pq_fact = sub( input_q, 1 ); + move16(); } #if 0 /*To be removed later when dependency on data is removed*/ FOR( Word16 j = 0; j < outAudio.config.numSamplesPerChannel * outAudio.config.numChannels; ++j ) @@ -10172,7 +10476,7 @@ static ivas_error renderLfeToBinaural_fx( lfe_idx = LFE_CHANNEL; move16(); } - ELSE IF( GT_16( mcInput->customLsInput.num_lfe, 0 ) ) + ELSE IF( mcInput->customLsInput.num_lfe > 0 ) { lfe_idx = mcInput->customLsInput.lfe_idx[0]; move16(); @@ -10190,8 +10494,7 @@ static ivas_error renderLfeToBinaural_fx( move16(); num_cpy_smpl_prev_frame = mcInput->binauralDelaySmp; move16(); - num_cpy_smpl_cur_frame = frame_size - num_cpy_smpl_prev_frame; - move16(); + num_cpy_smpl_cur_frame = sub( frame_size, num_cpy_smpl_prev_frame ); /* Assuming LFE should be delayed by less that the duration of one frame */ assert( mcInput->binauralDelaySmp < frame_size ); @@ -10205,8 +10508,8 @@ static ivas_error renderLfeToBinaural_fx( /* Save remaining LFE samples of current frame for next frame */ mvr2r_Word32( lfeInput + num_cpy_smpl_cur_frame, mcInput->lfeDelayBuffer_fx, num_cpy_smpl_prev_frame ); r_shift = sub( sub( in_q, 1 ), out_q ); - move16(); - IF( NE_16( r_shift, 0 ) ) + + IF( r_shift != 0 ) { FOR( i = 0; i < add( num_cpy_smpl_prev_frame, num_cpy_smpl_cur_frame ); i++ ) { @@ -10306,29 +10609,33 @@ static ivas_error renderMcToBinaural( Word32 *p_tmpRendBuffer_fx[MAX_OUTPUT_CHANNELS]; Word16 i; Word16 exp = *outAudio.pq_fact; - + move16(); FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { p_tmpRendBuffer_fx[i] = tmpRendBuffer_fx[i]; - move32(); } push_wmops( "renderMcToBinaural" ); inConfig = mcInput->base.inConfig; move32(); hCombinedOrientationData = mcInput->base.ctx.pCombinedOrientationData; combinedOrientationEnabled = 0; + move16(); IF( hCombinedOrientationData != NULL ) { FOR( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) { - IF( NE_16( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx], 0 ) ) + IF( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) { combinedOrientationEnabled = 1; + move16(); BREAK; } } } + test(); + test(); + test(); IF( ( EQ_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) || ( combinedOrientationEnabled && ( EQ_32( inConfig, IVAS_AUDIO_CONFIG_5_1 ) || EQ_32( inConfig, IVAS_AUDIO_CONFIG_7_1 ) ) ) ) { copyBufferTo2dArray_fx( mcInput->base.inputBuffer, tmpRendBuffer_fx ); @@ -10337,8 +10644,9 @@ static ivas_error renderMcToBinaural( { Scale_sig32( tmpRendBuffer_fx[i], L_FRAME48k, sub( 11, exp ) ); } - IF( ( error = ivas_td_binaural_renderer_ext_fx( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pCombinedOrientationData, NULL, mcInput->hReverb, - 0, *mcInput->base.ctx.pOutSampleRate, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer_fx, &exp ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_binaural_renderer_ext_fx( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pCombinedOrientationData, NULL, mcInput->hReverb, + 0, *mcInput->base.ctx.pOutSampleRate, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer_fx, &exp ) ), + IVAS_ERR_OK ) ) { return error; } @@ -10355,15 +10663,14 @@ static ivas_error renderMcToBinaural( { tmpRotBuffer = mcInput->base.inputBuffer; tmpRotBuffer.data_fx = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( Word32 ) ); - set_val_Word32( tmpRotBuffer.data_fx, 0, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); + set_val_Word32( tmpRotBuffer.data_fx, 0, imult1616( tmpRotBuffer.config.numSamplesPerChannel, tmpRotBuffer.config.numChannels ) ); - IF( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, mcInput->rot_gains_prev_fx, mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, mcInput->rot_gains_prev_fx, mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ), IVAS_ERR_OK ) ) { return error; } exp = sub( *outAudio.pq_fact, 1 ); - move16(); copyBufferTo2dArray_fx( tmpRotBuffer, tmpRendBuffer_fx ); @@ -10378,21 +10685,21 @@ static ivas_error renderMcToBinaural( hCrend = mcInput->crendWrapper->hCrend; /* call CREND */ - IF( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, p_tmpRendBuffer_fx, *mcInput->base.ctx.pOutSampleRate, - getNumSubframesInBuffer( &outAudio, *mcInput->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, p_tmpRendBuffer_fx, *mcInput->base.ctx.pOutSampleRate, + getNumSubframesInBuffer( &outAudio, *mcInput->base.ctx.pOutSampleRate ) ) ), + IVAS_ERR_OK ) ) { return error; } IF( hCrend->hReverb != NULL ) { exp = sub( exp, 2 ); - move16(); } } accumulate2dArrayToBuffer_fx( tmpRendBuffer_fx, &outAudio ); - IF( ( error = renderLfeToBinaural_fx( mcInput, outAudio, *outAudio.pq_fact, exp ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = renderLfeToBinaural_fx( mcInput, outAudio, *outAudio.pq_fact, exp ) ), IVAS_ERR_OK ) ) { return error; @@ -10512,7 +10819,6 @@ static ivas_error renderMcToBinauralRoom( FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { p_tmpRendBuffer[i] = tmpRendBuffer[i]; - move32(); } push_wmops( "renderMcToBinauralRoom" ); @@ -10526,15 +10832,21 @@ static ivas_error renderMcToBinauralRoom( { FOR( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) { - IF( NE_16( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx], 0 ) ) + IF( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) { combinedOrientationEnabled = 1; + move16(); BREAK; } } } - if ( ( mcInput->hReverb != NULL && EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) && ( EQ_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) || ( combinedOrientationEnabled && ( EQ_32( inConfig, IVAS_AUDIO_CONFIG_5_1 ) || EQ_32( inConfig, IVAS_AUDIO_CONFIG_7_1 ) ) ) ) ) + test(); + test(); + test(); + test(); + test(); + IF( ( mcInput->hReverb != NULL && EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) && ( EQ_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) || ( combinedOrientationEnabled && ( EQ_32( inConfig, IVAS_AUDIO_CONFIG_5_1 ) || EQ_32( inConfig, IVAS_AUDIO_CONFIG_7_1 ) ) ) ) ) { copyBufferTo2dArray_fx( mcInput->base.inputBuffer, tmpRendBuffer ); @@ -10543,8 +10855,9 @@ static ivas_error renderMcToBinauralRoom( Scale_sig32( tmpRendBuffer[i], L_FRAME48k, sub( 11, exp ) ); } - IF( ( error = ivas_td_binaural_renderer_ext_fx( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pCombinedOrientationData, NULL, mcInput->hReverb, - 0, *mcInput->base.ctx.pOutSampleRate, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer, &exp ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_binaural_renderer_ext_fx( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pCombinedOrientationData, NULL, mcInput->hReverb, + 0, *mcInput->base.ctx.pOutSampleRate, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer, &exp ) ), + IVAS_ERR_OK ) ) { return error; } @@ -10564,15 +10877,15 @@ static ivas_error renderMcToBinauralRoom( tmpRotBuffer.data_fx = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( Word32 ) ); set_val_Word32( tmpRotBuffer.data_fx, 0, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); - IF( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, - mcInput->rot_gains_prev_fx, - mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, + mcInput->rot_gains_prev_fx, + mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ), + IVAS_ERR_OK ) ) { return error; } exp = sub( *outAudio.pq_fact, 1 ); - move16(); copyBufferTo2dArray_fx( tmpRotBuffer, tmpRendBuffer ); free( tmpRotBuffer.data_fx ); @@ -10586,21 +10899,21 @@ static ivas_error renderMcToBinauralRoom( hCrend = mcInput->crendWrapper->hCrend; /* call CREND */ - IF( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, p_tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate, - getNumSubframesInBuffer( &outAudio, *mcInput->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, p_tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate, + getNumSubframesInBuffer( &outAudio, *mcInput->base.ctx.pOutSampleRate ) ) ), + IVAS_ERR_OK ) ) { return error; } IF( hCrend->hReverb != NULL ) { exp = sub( exp, 2 ); - move16(); } } accumulate2dArrayToBuffer_fx( tmpRendBuffer, &outAudio ); - IF( ( error = renderLfeToBinaural_fx( mcInput, outAudio, *outAudio.pq_fact, exp ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = renderLfeToBinaural_fx( mcInput, outAudio, *outAudio.pq_fact, exp ) ), IVAS_ERR_OK ) ) { return error; } @@ -10725,7 +11038,6 @@ static ivas_error renderMcCustomLsToBinauralRoom( FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; - move32(); } hCombinedOrientationData = mcInput->base.ctx.pCombinedOrientationData; @@ -10735,7 +11047,7 @@ static ivas_error renderMcCustomLsToBinauralRoom( { FOR( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) { - IF( NE_16( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx], 0 ) ) + IF( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) { combinedOrientationEnabled = 1; move16(); @@ -10751,30 +11063,37 @@ static ivas_error renderMcCustomLsToBinauralRoom( tmpRotBuffer.data_fx = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( Word32 ) ); set_val_Word32( tmpRotBuffer.data_fx, 0, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); - IF( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, - mcInput->rot_gains_prev_fx, - mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, + mcInput->rot_gains_prev_fx, + mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ), + IVAS_ERR_OK ) ) { return error; } exp = sub( *outAudio.pq_fact, 1 ); - move16(); } /* intermediate conversion to 7_1_4 */ tmpMcBuffer = mcInput->base.inputBuffer; - IF( ( error = getAudioConfigNumChannels( IVAS_AUDIO_CONFIG_7_1_4, &tmp ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAudioConfigNumChannels( IVAS_AUDIO_CONFIG_7_1_4, &tmp ) ), IVAS_ERR_OK ) ) { return error; } tmpMcBuffer.config.numChannels = tmp; move16(); - tmpMcBuffer.data_fx = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( Word32 ) ); - set_val_Word32( tmpMcBuffer.data_fx, 0, tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels ); + tmpMcBuffer.data_fx = malloc( imult1616( tmpMcBuffer.config.numSamplesPerChannel, tmpMcBuffer.config.numChannels ) * sizeof( Word32 ) ); + set_val_Word32( tmpMcBuffer.data_fx, 0, imult1616( tmpMcBuffer.config.numSamplesPerChannel, tmpMcBuffer.config.numChannels ) ); - tmpBufPtr = ( combinedOrientationEnabled ) ? &tmpRotBuffer : &mcInput->base.inputBuffer; + IF( combinedOrientationEnabled ) + { + tmpBufPtr = &tmpRotBuffer; + } + ELSE + { + tmpBufPtr = &mcInput->base.inputBuffer; + } FOR( i = 0; i < mcInput->base.inputBuffer.config.numChannels; i++ ) { renderBufferChannel_fx( *tmpBufPtr, i, mcInput->panGains_fx[i], tmpMcBuffer ); @@ -10784,20 +11103,20 @@ static ivas_error renderMcCustomLsToBinauralRoom( CREND_HANDLE hCrend; hCrend = mcInput->crendWrapper->hCrend; /* call CREND */ - IF( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, NULL, NULL, NULL, NULL, - p_tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate, getNumSubframesInBuffer( &outAudio, *mcInput->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, NULL, NULL, NULL, NULL, + p_tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate, getNumSubframesInBuffer( &outAudio, *mcInput->base.ctx.pOutSampleRate ) ) ), + IVAS_ERR_OK ) ) { return error; } IF( hCrend->hReverb != NULL ) { exp = sub( exp, 2 ); - move16(); } accumulate2dArrayToBuffer_fx( tmpCrendBuffer, &outAudio ); - IF( ( error = renderLfeToBinaural_fx( mcInput, outAudio, *outAudio.pq_fact, exp ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = renderLfeToBinaural_fx( mcInput, outAudio, *outAudio.pq_fact, exp ) ), IVAS_ERR_OK ) ) { return error; } @@ -11020,6 +11339,7 @@ static ivas_error renderInputMc( ivas_error error; IVAS_REND_AudioBuffer inAudio; error = IVAS_ERR_OK; + move32(); inAudio = mcInput->base.inputBuffer; @@ -11140,16 +11460,17 @@ static ivas_error renderActiveInputsMc( Word16 i; input_mc *pCurrentInput; ivas_error error; - for ( i = 0, pCurrentInput = hIvasRend->inputsMc; i < RENDERER_MAX_MC_INPUTS; ++i, ++pCurrentInput ) + FOR( ( i = 0, pCurrentInput = hIvasRend->inputsMc ); i < RENDERER_MAX_MC_INPUTS; ( ++i, ++pCurrentInput ) ) { - IF( pCurrentInput->base.inConfig == IVAS_AUDIO_CONFIG_INVALID ) + IF( EQ_32( pCurrentInput->base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { /* Skip inactive inputs */ CONTINUE; } *outAudio.pq_fact = Q8; - IF( ( error = renderInputMc( pCurrentInput, hIvasRend->outputConfig, outAudio ) ) != IVAS_ERR_OK ) + move16(); + IF( NE_32( ( error = renderInputMc( pCurrentInput, hIvasRend->outputConfig, outAudio ) ), IVAS_ERR_OK ) ) { return error; } @@ -11287,6 +11608,7 @@ static ivas_error renderSbaToBinaural( hCombinedOrientationData = sbaInput->base.ctx.pCombinedOrientationData; combinedOrientationEnabled = 0; + move16(); IF( hCombinedOrientationData != NULL ) { FOR( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) @@ -11294,6 +11616,7 @@ static ivas_error renderSbaToBinaural( IF( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) { combinedOrientationEnabled = 1; + move16(); BREAK; } } @@ -11308,8 +11631,9 @@ static ivas_error renderSbaToBinaural( mvr2r_Word32( sbaInput->base.inputBuffer.data_fx, tmpRotBuffer.data_fx, tmpRotBuffer.config.numChannels * tmpRotBuffer.config.numSamplesPerChannel ); - IF( ( error = rotateFrameSba_fx( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, - sbaInput->base.ctx.pCombinedOrientationData, sbaInput->rot_gains_prev_fx, tmpRotBuffer ) ) != IVAS_ERR_OK ) + IF( NE_16( ( error = rotateFrameSba_fx( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, + sbaInput->base.ctx.pCombinedOrientationData, sbaInput->rot_gains_prev_fx, tmpRotBuffer ) ), + IVAS_ERR_OK ) ) { return error; } @@ -11326,14 +11650,16 @@ static ivas_error renderSbaToBinaural( hCrend = sbaInput->crendWrapper->hCrend; /* call CREND */ - IF( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, sbaInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, output_fx, *sbaInput->base.ctx.pOutSampleRate, - getNumSubframesInBuffer( &outAudio, *sbaInput->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, sbaInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, output_fx, *sbaInput->base.ctx.pOutSampleRate, + getNumSubframesInBuffer( &outAudio, *sbaInput->base.ctx.pOutSampleRate ) ) ), + IVAS_ERR_OK ) ) { return error; } IF( hCrend->hReverb != NULL ) { - *outAudio.pq_fact -= 2; + *outAudio.pq_fact = sub( *outAudio.pq_fact, 2 ); + move16(); } accumulate2dArrayToBuffer_fx( output_buffer_fx, &outAudio ); } @@ -11440,43 +11766,46 @@ static ivas_error renderSbaToBinauralRoom( hCrend = sbaInput->crendWrapper->hCrend; - IF( ( error = getAudioConfigNumChannels( outConfig, &nchan_out ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAudioConfigNumChannels( outConfig, &nchan_out ) ), IVAS_ERR_OK ) ) { return error; } - for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; } hCombinedOrientationData = sbaInput->base.ctx.pCombinedOrientationData; combinedOrientationEnabled = 0; - if ( hCombinedOrientationData != NULL ) + move16(); + IF( hCombinedOrientationData != NULL ) { - for ( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) + FOR( subframe_idx = 0; subframe_idx < ( *hCombinedOrientationData )->num_subframes; subframe_idx++ ) { - if ( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) + IF( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) { combinedOrientationEnabled = 1; + move16(); break; } } } /* apply rotation */ - if ( combinedOrientationEnabled ) + IF( combinedOrientationEnabled ) { tmpRotBuffer = sbaInput->base.inputBuffer; - tmpRotBuffer.data_fx = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( Word32 ) ); + tmpRotBuffer.data_fx = malloc( imult1616( tmpRotBuffer.config.numSamplesPerChannel, tmpRotBuffer.config.numChannels ) * sizeof( Word32 ) ); /* copy input for in-place rotation */ mvr2r_Word32( sbaInput->base.inputBuffer.data_fx, tmpRotBuffer.data_fx, tmpRotBuffer.config.numChannels * tmpRotBuffer.config.numSamplesPerChannel ); - IF( ( error = rotateFrameSba_fx( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, - sbaInput->base.ctx.pCombinedOrientationData, - sbaInput->rot_gains_prev_fx, - tmpRotBuffer ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = rotateFrameSba_fx( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, + sbaInput->base.ctx.pCombinedOrientationData, + sbaInput->rot_gains_prev_fx, + tmpRotBuffer ) ), + IVAS_ERR_OK ) ) { return error; } @@ -11485,16 +11814,24 @@ static ivas_error renderSbaToBinauralRoom( /* intermediate rendering to 7_1_4 */ tmpMcBuffer = sbaInput->base.inputBuffer; - IF( ( error = getAudioConfigNumChannels( IVAS_AUDIO_CONFIG_7_1_4, &tmp ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAudioConfigNumChannels( IVAS_AUDIO_CONFIG_7_1_4, &tmp ) ), IVAS_ERR_OK ) ) { return error; } tmpMcBuffer.config.numChannels = tmp; + move16(); tmpMcBuffer.data_fx = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( Word32 ) ); set_val_Word32( tmpMcBuffer.data_fx, 0, tmpMcBuffer.config.numChannels * tmpMcBuffer.config.numSamplesPerChannel ); - tmpBufPtr = ( combinedOrientationEnabled ) ? &tmpRotBuffer : &sbaInput->base.inputBuffer; + IF( combinedOrientationEnabled ) + { + tmpBufPtr = &tmpRotBuffer; + } + ELSE + { + tmpBufPtr = &sbaInput->base.inputBuffer; + } FOR( i = 0; i < sbaInput->base.inputBuffer.config.numChannels; i++ ) { renderBufferChannel_fx( *tmpBufPtr, i, sbaInput->hoaDecMtx_fx[i], tmpMcBuffer ); @@ -11503,20 +11840,22 @@ static ivas_error renderSbaToBinauralRoom( // Porting Crend_process function /* call CREND */ - IF( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, - NULL, NULL, NULL, NULL, p_tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate, - getNumSubframesInBuffer( &outAudio, *sbaInput->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, + NULL, NULL, NULL, NULL, p_tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate, + getNumSubframesInBuffer( &outAudio, *sbaInput->base.ctx.pOutSampleRate ) ) ), + IVAS_ERR_OK ) ) { return error; } IF( hCrend->hReverb != NULL ) { - *outAudio.pq_fact -= 2; + *outAudio.pq_fact = sub( *outAudio.pq_fact, 2 ); + move16(); } accumulate2dArrayToBuffer_fx( tmpCrendBuffer, &outAudio ); - if ( combinedOrientationEnabled ) + IF( combinedOrientationEnabled ) { free( tmpRotBuffer.data_fx ); } @@ -11663,6 +12002,7 @@ static ivas_error renderInputSba( ivas_error error; IVAS_REND_AudioBuffer inAudio; error = IVAS_ERR_OK; + move32(); inAudio = sbaInput->base.inputBuffer; IF( NE_32( sbaInput->base.numNewSamplesPerChannel, outAudio.config.numSamplesPerChannel ) ) @@ -11670,10 +12010,13 @@ static ivas_error renderInputSba( return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); } sbaInput->base.numNewSamplesPerChannel = 0; + move32(); *outAudio.pq_fact = outAudio.q_factor; + move16(); /* Apply input gain to new audio */ v_multc_fixed( inAudio.data_fx, sbaInput->base.gain_fx, inAudio.data_fx, inAudio.config.numSamplesPerChannel * inAudio.config.numChannels ); - *outAudio.pq_fact -= 1; // to compensate for the qfactor reduction in gain multiplication. + *outAudio.pq_fact = sub( *outAudio.pq_fact, 1 ); // to compensate for the qfactor reduction in gain multiplication. + move16(); /* set combined orientation subframe info to start info */ ivas_combined_orientation_set_to_start_index( *( sbaInput->base.ctx.pCombinedOrientationData ) ); @@ -11687,7 +12030,7 @@ static ivas_error renderInputSba( renderSbaToSba( sbaInput, outAudio ); BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: - switch ( outConfig ) + SWITCH( outConfig ) { case IVAS_AUDIO_CONFIG_BINAURAL: error = renderSbaToBinaural( sbaInput, outConfig, outAudio ); @@ -11774,15 +12117,16 @@ static ivas_error renderActiveInputsSba( input_sba *pCurrentInput; ivas_error error; - for ( i = 0, pCurrentInput = hIvasRend->inputsSba; i < RENDERER_MAX_SBA_INPUTS; ++i, ++pCurrentInput ) + FOR( ( i = 0, pCurrentInput = hIvasRend->inputsSba ); i < RENDERER_MAX_SBA_INPUTS; ( ++i, ++pCurrentInput ) ) { - IF( pCurrentInput->base.inConfig == IVAS_AUDIO_CONFIG_INVALID ) + IF( EQ_32( pCurrentInput->base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { /* Skip inactive inputs */ CONTINUE; } *outAudio.pq_fact = Q8; - IF( ( error = renderInputSba( pCurrentInput, hIvasRend->outputConfig, outAudio ) ) != IVAS_ERR_OK ) + move16(); + IF( NE_32( ( error = renderInputSba( pCurrentInput, hIvasRend->outputConfig, outAudio ) ), IVAS_ERR_OK ) ) { return error; } @@ -11828,6 +12172,8 @@ static void copyMasaMetadataToDiracRenderer_fx( hSpatParamRendCom->numParametricDirections = add( meta->descriptive_meta.numberOfDirections, 1 ); hSpatParamRendCom->numSimultaneousDirections = add( meta->descriptive_meta.numberOfDirections, 1 ); + move16(); + move16(); FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { @@ -11868,6 +12214,7 @@ static void copyMasaMetadataToDiracRenderer_fx( } hSpatParamRendCom->dirac_bs_md_write_idx = ( hSpatParamRendCom->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % hSpatParamRendCom->dirac_md_buffer_length; + move16(); return; } @@ -11940,14 +12287,19 @@ static void renderMasaToMasa( Word16 q_cldfb_out = *outAudio.pq_fact; Word16 scale_factor = 31; move16(); + move16(); + move16(); /* Calculate energy */ l_ts = masaInput->base.inputBuffer.config.numSamplesPerChannel / CLDFB_NO_COL_MAX; numAnalysisChannels = masaInput->hMasaPrerend->num_Cldfb_instances; + move16(); /* do processing over all CLDFB time slots */ FOR( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) { mrange[0] = DirAC_block_grouping[block_m_idx]; mrange[1] = DirAC_block_grouping[block_m_idx + 1]; + move16(); + move16(); set_zero_fx( masaInput->hMasaPrerend->energy_fx[block_m_idx], MASA_FREQUENCY_BANDS ); @@ -11960,6 +12312,7 @@ static void renderMasaToMasa( masaInput->hMasaPrerend->cldfbAnaEnc[i]->Q_cldfb_state = q_cldfb; q_cldfb_out = q_cldfb; move16(); + move16(); cldfbAnalysis_ts_fx_fixed_q( &( tmpBuffer_fx[i][l_ts * ts] ), Chan_RealBuffer_fx[i], Chan_ImagBuffer_fx[i], l_ts, masaInput->hMasaPrerend->cldfbAnaEnc[i], &q_cldfb_out ); scale_factor = s_min( scale_factor, s_min( getScaleFactor32( Chan_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ), getScaleFactor32( Chan_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ) ); scale_factor = sub( scale_factor, 1 ); @@ -11981,6 +12334,7 @@ static void renderMasaToMasa( { Word32 temp = L_add( Mult_32_32( Chan_RealBuffer_fx[0][j], Chan_RealBuffer_fx[0][j] ), Mult_32_32( Chan_ImagBuffer_fx[0][j], Chan_ImagBuffer_fx[0][j] ) ); masaInput->hMasaPrerend->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( masaInput->hMasaPrerend->energy_fx[block_m_idx][band_m_idx], tmp_energy_e[block_m_idx][band_m_idx], temp, ( 2 * q_add ), &tmp_energy_e[block_m_idx][band_m_idx] ); + move32(); } } } @@ -12001,14 +12355,17 @@ static void renderMasaToMasa( { masaInput->hMasaPrerend->energy_fx[i][j] = L_shr( masaInput->hMasaPrerend->energy_fx[i][j], sub( max_e, tmp_energy_e[i][j] ) ); + move32(); } } /* Copy audio channels if mismatch in number of transports */ - IF( masaInput->base.inputBuffer.config.numChannels == 1 && outAudio.config.numChannels == 2 ) + test(); + test(); + IF( EQ_16( masaInput->base.inputBuffer.config.numChannels, 1 ) && EQ_16( outAudio.config.numChannels, 2 ) ) { mvr2r_Word32( tmpBuffer_fx[0], tmpBuffer_fx[1], masaInput->base.inputBuffer.config.numSamplesPerChannel ); } - ELSE IF( masaInput->base.inputBuffer.config.numChannels == 2 && outAudio.config.numChannels == 1 ) + ELSE IF( EQ_16( masaInput->base.inputBuffer.config.numChannels, 2 ) && EQ_16( outAudio.config.numChannels, 1 ) ) { // v_add( tmpBuffer[0], tmpBuffer[1], tmpBuffer[0], masaInput->base.inputBuffer.config.numSamplesPerChannel ); v_add_fixed( tmpBuffer_fx[0], tmpBuffer_fx[1], tmpBuffer_fx[0], masaInput->base.inputBuffer.config.numSamplesPerChannel, 0 ); @@ -12017,7 +12374,7 @@ static void renderMasaToMasa( /* Copy metadata */ outMeta = masaInput->hMasaPrerend->hMasaOut; inMeta = &masaInput->masaMetadata; - numDirs = inMeta->descriptive_meta.numberOfDirections + 1; + numDirs = add( inMeta->descriptive_meta.numberOfDirections, 1 ); FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { @@ -12036,13 +12393,15 @@ static void renderMasaToMasa( } ratioSum_fx = L_add( ratioSum_fx, inMeta->common_meta.diffuse_to_total_ratio_fx[sf][band] ); - IF( EQ_32( ratioSum_fx, 0 ) ) + IF( ratioSum_fx == 0 ) { FOR( dir = 0; dir < numDirs; dir++ ) { inMeta->directional_meta[dir].energy_ratio_fx[sf][band] = 0; + move32(); } inMeta->common_meta.diffuse_to_total_ratio_fx[sf][band] = ONE_IN_Q30; + move32(); } ELSE IF( NE_32( ratioSum_fx, ONE_IN_Q30 ) ) { @@ -12053,14 +12412,14 @@ static void renderMasaToMasa( FOR( dir = 0; dir < numDirs; dir++ ) { tmp = BASOP_Util_Divide3232_Scale_cadence( inMeta->directional_meta[dir].energy_ratio_fx[sf][band], ratioSum_fx, &tmp_e ); - inMeta->directional_meta[dir].energy_ratio_fx[sf][band] = L_shl( tmp, tmp_e - 1 ); // Q30 + inMeta->directional_meta[dir].energy_ratio_fx[sf][band] = L_shl( tmp, sub( tmp_e, 1 ) ); // Q30 } tmp_e = 0; move16(); tmp = 0; move32(); tmp = BASOP_Util_Divide3232_Scale_cadence( inMeta->common_meta.diffuse_to_total_ratio_fx[sf][band], ratioSum_fx, &tmp_e ); - inMeta->common_meta.diffuse_to_total_ratio_fx[sf][band] = L_shl( tmp, tmp_e - 1 ); // Q30 + inMeta->common_meta.diffuse_to_total_ratio_fx[sf][band] = L_shl( tmp, sub( tmp_e, 1 ) ); // Q30 } } } @@ -12070,14 +12429,21 @@ static void renderMasaToMasa( FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) { outMeta->diffuseToTotalRatio[sf][band] = UINT8_MAX; + move16(); FOR( dir = 0; dir < numDirs; dir++ ) { outMeta->directionIndex[dir][sf][band] = index_theta_phi_16_fx( &inMeta->directional_meta[dir].elevation_fx[sf][band], &inMeta->directional_meta[dir].azimuth_fx[sf][band], masaInput->hMasaPrerend->sph_grid16 ); - outMeta->directToTotalRatio[dir][sf][band] = (UWord8) L_shr( inMeta->directional_meta[dir].energy_ratio_fx[sf][band], 22 ); + outMeta->directToTotalRatio[dir][sf][band] = (UWord8) L_shr( inMeta->directional_meta[dir].energy_ratio_fx[sf][band], Q22 ); outMeta->diffuseToTotalRatio[sf][band] -= outMeta->directToTotalRatio[dir][sf][band]; outMeta->spreadCoherence[dir][sf][band] = (UWord8) shr( inMeta->directional_meta[dir].spread_coherence_fx[sf][band], Q7 ); + + move16(); + move16(); + move16(); + move16(); } outMeta->surroundCoherence[sf][band] = (UWord8) shr( inMeta->common_meta.surround_coherence_fx[sf][band], Q7 ); + move16(); } } @@ -12215,6 +12581,7 @@ static void renderMasaToMasa( } #endif +#ifdef IVAS_FLOAT_FIXED static ivas_error renderInputMasa( input_masa *masaInput, const AUDIO_CONFIG outConfig, @@ -12229,35 +12596,37 @@ static ivas_error renderInputMasa( Word32 *tmpBuffer_fx[MAX_OUTPUT_CHANNELS]; Word32 tmpBuffer_buff_fx[MAX_OUTPUT_CHANNELS][L_FRAME48k]; #endif - if ( !masaInput->metadataHasBeenFed ) + IF( !masaInput->metadataHasBeenFed ) { return IVAS_ERR_MISSING_METADATA; } inAudio = masaInput->base.inputBuffer; - if ( masaInput->base.numNewSamplesPerChannel != outAudio.config.numSamplesPerChannel ) + IF( NE_32( masaInput->base.numNewSamplesPerChannel, outAudio.config.numSamplesPerChannel ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); } masaInput->base.numNewSamplesPerChannel = 0; + move32(); #ifdef IVAS_FLOAT_FIXED masaInput->base.gain = fix_to_float( masaInput->base.gain_fx, Q30 ); *outAudio.pq_fact = outAudio.q_factor; + move16(); /* Apply input gain to new audio */ v_multc_fixed( inAudio.data_fx, masaInput->base.gain_fx, inAudio.data_fx, inAudio.config.numSamplesPerChannel * inAudio.config.numChannels ); - *outAudio.pq_fact -= 1; // to compensate for the qfactor reduction in gain multiplication. -#endif // IVAS_FLOAT_FIXED + *outAudio.pq_fact = sub( *outAudio.pq_fact, 1 ); // to compensate for the qfactor reduction in gain multiplication. +#endif // IVAS_FLOAT_FIXED /* Apply input gain to new audio */ v_multc( inAudio.data, masaInput->base.gain, inAudio.data, inAudio.config.numSamplesPerChannel * inAudio.config.numChannels ); - maxBin = (int16_t) ( *masaInput->base.ctx.pOutSampleRate * INV_CLDFB_BANDWIDTH ); + maxBin = (Word16) ( *masaInput->base.ctx.pOutSampleRate * INV_CLDFB_BANDWIDTH ); /* set combined orientation subframe info to start info */ ivas_combined_orientation_set_to_start_index( *( masaInput->base.ctx.pCombinedOrientationData ) ); - if ( getAudioConfigType( outConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) + if ( EQ_32( getAudioConfigType( outConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) { /* MASA prerendering path for MASA -> MASA */ renderMasaToMasa( masaInput, outAudio ); @@ -12338,45 +12707,119 @@ static ivas_error renderInputMasa( return IVAS_ERR_OK; } - -static ivas_error renderActiveInputsMasa( - IVAS_REND_HANDLE hIvasRend, +#else +static ivas_error renderInputMasa( + input_masa *masaInput, + const AUDIO_CONFIG outConfig, IVAS_REND_AudioBuffer outAudio ) { - int16_t i; - input_masa *pCurrentInput; - ivas_error error; -#ifdef IVAS_FLOAT_FIXED - if ( hIvasRend->inputsSba[0].base.inConfig != IVAS_AUDIO_CONFIG_INVALID ) + IVAS_REND_AudioBuffer inAudio; + int16_t ch; + int16_t maxBin; + float *tmpBuffer[MAX_OUTPUT_CHANNELS]; + float tmpBuffer_buff[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + + if ( !masaInput->metadataHasBeenFed ) { - for ( i = 0; i < outAudio.config.numChannels * outAudio.config.numSamplesPerChannel; i++ ) - { - outAudio.data[i] = (float) outAudio.data_fx[i] / ( 1 << *outAudio.pq_fact ); - } + return IVAS_ERR_MISSING_METADATA; } -#endif - for ( i = 0, pCurrentInput = hIvasRend->inputsMasa; i < RENDERER_MAX_MASA_INPUTS; ++i, ++pCurrentInput ) + + inAudio = masaInput->base.inputBuffer; + if ( masaInput->base.numNewSamplesPerChannel != outAudio.config.numSamplesPerChannel ) { - if ( pCurrentInput->base.inConfig == IVAS_AUDIO_CONFIG_INVALID ) - { - /* Skip inactive inputs */ - continue; - } + return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); + } + masaInput->base.numNewSamplesPerChannel = 0; -#ifdef IVAS_FLOAT_FIXED - *outAudio.pq_fact = Q8; -#endif // IVAS_FLOAT_FIXED - if ( ( error = renderInputMasa( pCurrentInput, hIvasRend->outputConfig, outAudio ) ) != IVAS_ERR_OK ) - { - return error; - } -#ifdef IVAS_FLOAT_FIXED - if ( ( hIvasRend->inputsSba[0].base.inConfig != IVAS_AUDIO_CONFIG_INVALID ) && ( getAudioConfigType( hIvasRend->outputConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) - { - for ( Word16 k = 0; k < outAudio.config.numChannels * outAudio.config.numSamplesPerChannel; k++ ) - { - outAudio.data_fx[k] = (Word32) outAudio.data[k] * ( 1 << *outAudio.pq_fact ); - } + /* Apply input gain to new audio */ + v_multc( inAudio.data, masaInput->base.gain, inAudio.data, inAudio.config.numSamplesPerChannel * inAudio.config.numChannels ); + + maxBin = (int16_t) ( *masaInput->base.ctx.pOutSampleRate * INV_CLDFB_BANDWIDTH ); + + /* set combined orientation subframe info to start info */ + ivas_combined_orientation_set_to_start_index( *( masaInput->base.ctx.pCombinedOrientationData ) ); + + if ( getAudioConfigType( outConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) + { + /* MASA prerendering path for MASA -> MASA */ + renderMasaToMasa( masaInput, outAudio ); + } + else + { + /* MASA external renderer -> other formats */ + int16_t num_subframes; + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) + { + tmpBuffer[ch] = tmpBuffer_buff[ch]; + } + + copyBufferTo2dArray( masaInput->base.inputBuffer, tmpBuffer_buff ); + + num_subframes = (int16_t) ( masaInput->base.inputBuffer.config.numSamplesPerChannel / ( *masaInput->base.ctx.pOutSampleRate / ( IVAS_NUM_FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) ); + + switch ( masaInput->hMasaExtRend->renderer_type ) + { + case RENDERER_DIRAC: + copyMasaMetadataToDiracRenderer( &masaInput->masaMetadata, masaInput->hMasaExtRend->hSpatParamRendCom, maxBin ); + ivas_masa_ext_dirac_render( masaInput->hMasaExtRend, tmpBuffer, num_subframes ); + break; + case RENDERER_STEREO_PARAMETRIC: + case RENDERER_BINAURAL_PARAMETRIC: + case RENDERER_BINAURAL_PARAMETRIC_ROOM: + copyMasaMetadataToDiracRenderer( &masaInput->masaMetadata, masaInput->hMasaExtRend->hSpatParamRendCom, maxBin ); + ivas_masa_ext_rend_parambin_render( masaInput->hMasaExtRend, *masaInput->base.ctx.pCombinedOrientationData, tmpBuffer, num_subframes ); + break; + case RENDERER_DISABLE: + break; /* This happens for 1TC MASA to MONO where we just copy input transport to output */ + default: + return ( IVAS_ERROR( IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED, "Wrong output config for MASA input in external renderer\n" ) ); + } + + accumulate2dArrayToBuffer( tmpBuffer_buff, &outAudio ); + } + + return IVAS_ERR_OK; +} +#endif + +static ivas_error renderActiveInputsMasa( + IVAS_REND_HANDLE hIvasRend, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t i; + input_masa *pCurrentInput; + ivas_error error; +#ifdef IVAS_FLOAT_FIXED + if ( hIvasRend->inputsSba[0].base.inConfig != IVAS_AUDIO_CONFIG_INVALID ) + { + for ( i = 0; i < outAudio.config.numChannels * outAudio.config.numSamplesPerChannel; i++ ) + { + outAudio.data[i] = (float) outAudio.data_fx[i] / ( 1 << *outAudio.pq_fact ); + } + } +#endif + for ( i = 0, pCurrentInput = hIvasRend->inputsMasa; i < RENDERER_MAX_MASA_INPUTS; ++i, ++pCurrentInput ) + { + if ( pCurrentInput->base.inConfig == IVAS_AUDIO_CONFIG_INVALID ) + { + /* Skip inactive inputs */ + continue; + } + +#ifdef IVAS_FLOAT_FIXED + *outAudio.pq_fact = Q8; +#endif // IVAS_FLOAT_FIXED + if ( ( error = renderInputMasa( pCurrentInput, hIvasRend->outputConfig, outAudio ) ) != IVAS_ERR_OK ) + { + return error; + } +#ifdef IVAS_FLOAT_FIXED + if ( ( hIvasRend->inputsSba[0].base.inConfig != IVAS_AUDIO_CONFIG_INVALID ) && ( getAudioConfigType( hIvasRend->outputConfig ) != IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) + { + for ( Word16 k = 0; k < outAudio.config.numChannels * outAudio.config.numSamplesPerChannel; k++ ) + { + outAudio.data_fx[k] = (Word32) outAudio.data[k] * ( 1 << *outAudio.pq_fact ); + } } #endif } @@ -12478,67 +12921,67 @@ ivas_error IVAS_REND_MergeMasaMetadata( Word16 *inEne1_e; Word16 *inEne2_e; - if ( hIvasRend == NULL ) + IF( hIvasRend == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } /* Input1 metadata and energy */ - if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) + IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) ) { *hMasaExtOutMeta = hIvasRend->inputsIsm->hOMasa->hMasaOut; inEne1_fx = &( hIvasRend->inputsIsm->hOMasa->energy_fx ); inEne1_e = ( hIvasRend->inputsIsm->hOMasa->energy_e ); } - else if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + ELSE IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) { *hMasaExtOutMeta = hIvasRend->inputsMc->hMcMasa->hMasaOut; inEne1_fx = &( hIvasRend->inputsMc->hMcMasa->energy_fx ); inEne1_e = ( hIvasRend->inputsMc->hMcMasa->energy_exp ); } - else if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) + ELSE IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) { *hMasaExtOutMeta = hIvasRend->inputsSba->hDirAC->hMasaOut; inEne1_fx = &( hIvasRend->inputsSba->hDirAC->energy_fx ); inEne1_e = ( hIvasRend->inputsSba->hDirAC->energy_exp ); } - else if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) + ELSE IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) { *hMasaExtOutMeta = hIvasRend->inputsMasa->hMasaPrerend->hMasaOut; inEne1_fx = &( hIvasRend->inputsMasa->hMasaPrerend->energy_fx ); inEne1_e = ( hIvasRend->inputsMasa->hMasaPrerend->energy_e ); } - else + ELSE { return IVAS_ERR_NOT_SUPPORTED_OPTION; } /* Input2 metadata and energy */ - if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) + IF( EQ_32( inputType2, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) ) { inMeta2 = hIvasRend->inputsIsm->hOMasa->hMasaOut; inEne2_fx = &( hIvasRend->inputsIsm->hOMasa->energy_fx ); inEne2_e = ( hIvasRend->inputsIsm->hOMasa->energy_e ); } - else if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + ELSE IF( EQ_32( inputType2, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) { inMeta2 = hIvasRend->inputsMc->hMcMasa->hMasaOut; inEne2_fx = &( hIvasRend->inputsMc->hMcMasa->energy_fx ); inEne2_e = ( hIvasRend->inputsMc->hMcMasa->energy_exp ); } - else if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) + ELSE IF( EQ_32( inputType2, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) { inMeta2 = hIvasRend->inputsSba->hDirAC->hMasaOut; inEne2_fx = &( hIvasRend->inputsSba->hDirAC->energy_fx ); inEne2_e = ( hIvasRend->inputsSba->hDirAC->energy_exp ); } - else if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) + ELSE IF( EQ_32( inputType2, IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) { inMeta2 = hIvasRend->inputsMasa->hMasaPrerend->hMasaOut; inEne2_fx = &( hIvasRend->inputsMasa->hMasaPrerend->energy_fx ); inEne2_e = ( hIvasRend->inputsMasa->hMasaPrerend->energy_e ); } - else + ELSE { return IVAS_ERR_NOT_SUPPORTED_OPTION; } @@ -12547,7 +12990,16 @@ ivas_error IVAS_REND_MergeMasaMetadata( ivas_prerend_merge_masa_metadata_fx( *hMasaExtOutMeta, *hMasaExtOutMeta, inputType1, *inEne1_fx, inEne1_e, inMeta2, inputType2, *inEne2_fx, inEne2_e ); - ( *hMasaExtOutMeta )->descriptiveMeta.numberOfChannels = hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_MASA1 ? 0u : 1u; + IF( EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_MASA1 ) ) + { + ( *hMasaExtOutMeta )->descriptiveMeta.numberOfChannels = 0u; + move16(); + } + ELSE + { + ( *hMasaExtOutMeta )->descriptiveMeta.numberOfChannels = 1u; + move16(); + } return IVAS_ERR_OK; } @@ -12562,9 +13014,7 @@ ivas_error IVAS_REND_MergeMasaMetadata( { MASA_DECODER_EXT_OUT_META_HANDLE inMeta2; float( *inEne1 )[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; -#ifndef IVAS_FLOAT_FIXED float( *inEne2 )[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; -#endif if ( hIvasRend == NULL ) { @@ -12576,57 +13026,21 @@ ivas_error IVAS_REND_MergeMasaMetadata( { *hMasaExtOutMeta = hIvasRend->inputsIsm->hOMasa->hMasaOut; inEne1 = &( hIvasRend->inputsIsm->hOMasa->energy ); -#ifdef IVAS_FLOAT_FIXED - inEne1_fx = &( hIvasRend->inputsIsm->hOMasa->energy_fx ); - inEne1_e = ( hIvasRend->inputsIsm->hOMasa->energy_e ); - - - for ( Word16 i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - f2me_buf( hIvasRend->inputsIsm->hOMasa->energy[i], hIvasRend->inputsIsm->hOMasa->energy_fx[i], &hIvasRend->inputsIsm->hOMasa->energy_e[i], MASA_FREQUENCY_BANDS ); - } -#endif } else if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { *hMasaExtOutMeta = hIvasRend->inputsMc->hMcMasa->hMasaOut; inEne1 = &( hIvasRend->inputsMc->hMcMasa->energy ); -#ifdef IVAS_FLOAT_FIXED - inEne1_fx = &( hIvasRend->inputsMc->hMcMasa->energy_fx ); - inEne1_e = ( hIvasRend->inputsMc->hMcMasa->energy_exp ); - - for ( Word16 i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - f2me_buf( hIvasRend->inputsMc->hMcMasa->energy[i], hIvasRend->inputsMc->hMcMasa->energy_fx[i], &hIvasRend->inputsMc->hMcMasa->energy_exp[i], MASA_FREQUENCY_BANDS ); - } -#endif } else if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) { *hMasaExtOutMeta = hIvasRend->inputsSba->hDirAC->hMasaOut; inEne1 = &( hIvasRend->inputsSba->hDirAC->energy ); -#ifdef IVAS_FLOAT_FIXED - inEne1_fx = &( hIvasRend->inputsSba->hDirAC->energy_fx ); - inEne1_e = ( hIvasRend->inputsSba->hDirAC->energy_exp ); - for ( Word16 i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - f2me_buf( hIvasRend->inputsSba->hDirAC->energy[i], hIvasRend->inputsSba->hDirAC->energy_fx[i], &hIvasRend->inputsSba->hDirAC->energy_exp[i], MASA_FREQUENCY_BANDS ); - } - -#endif } else if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) { *hMasaExtOutMeta = hIvasRend->inputsMasa->hMasaPrerend->hMasaOut; inEne1 = &( hIvasRend->inputsMasa->hMasaPrerend->energy ); -#ifdef IVAS_FLOAT_FIXED - inEne1_fx = &( hIvasRend->inputsMasa->hMasaPrerend->energy_fx ); - inEne1_e = ( hIvasRend->inputsMasa->hMasaPrerend->energy_e ); - for ( Word16 i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - f2me_buf( hIvasRend->inputsMasa->hMasaPrerend->energy[i], hIvasRend->inputsMasa->hMasaPrerend->energy_fx[i], &hIvasRend->inputsMasa->hMasaPrerend->energy_e[i], MASA_FREQUENCY_BANDS ); - } -#endif } else { @@ -12637,65 +13051,22 @@ ivas_error IVAS_REND_MergeMasaMetadata( if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) { inMeta2 = hIvasRend->inputsIsm->hOMasa->hMasaOut; -#ifndef IVAS_FLOAT_FIXED inEne2 = &( hIvasRend->inputsIsm->hOMasa->energy ); -#endif -#ifdef IVAS_FLOAT_FIXED - inEne2_fx = &( hIvasRend->inputsIsm->hOMasa->energy_fx ); - inEne2_e = ( hIvasRend->inputsIsm->hOMasa->energy_e ); - - for ( Word16 i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - f2me_buf( hIvasRend->inputsIsm->hOMasa->energy[i], hIvasRend->inputsIsm->hOMasa->energy_fx[i], &hIvasRend->inputsIsm->hOMasa->energy_e[i], MASA_FREQUENCY_BANDS ); - } - -#endif } else if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { inMeta2 = hIvasRend->inputsMc->hMcMasa->hMasaOut; -#ifndef IVAS_FLOAT_FIXED inEne2 = &( hIvasRend->inputsMc->hMcMasa->energy ); -#endif -#ifdef IVAS_FLOAT_FIXED - inEne2_fx = &( hIvasRend->inputsMc->hMcMasa->energy_fx ); - inEne2_e = ( hIvasRend->inputsMc->hMcMasa->energy_exp ); - for ( Word16 i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - f2me_buf( hIvasRend->inputsMc->hMcMasa->energy[i], hIvasRend->inputsMc->hMcMasa->energy_fx[i], &hIvasRend->inputsMc->hMcMasa->energy_exp[i], MASA_FREQUENCY_BANDS ); - } -#endif } else if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) { inMeta2 = hIvasRend->inputsSba->hDirAC->hMasaOut; -#ifndef IVAS_FLOAT_FIXED inEne2 = &( hIvasRend->inputsSba->hDirAC->energy ); -#endif -#ifdef IVAS_FLOAT_FIXED - inEne2_fx = &( hIvasRend->inputsSba->hDirAC->energy_fx ); - inEne2_e = ( hIvasRend->inputsSba->hDirAC->energy_exp ); - for ( Word16 i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - f2me_buf( hIvasRend->inputsSba->hDirAC->energy[i], hIvasRend->inputsSba->hDirAC->energy_fx[i], &hIvasRend->inputsSba->hDirAC->energy_exp[i], MASA_FREQUENCY_BANDS ); - } -#endif } else if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) { inMeta2 = hIvasRend->inputsMasa->hMasaPrerend->hMasaOut; -#ifndef IVAS_FLOAT_FIXED inEne2 = &( hIvasRend->inputsMasa->hMasaPrerend->energy ); -#endif -#ifdef IVAS_FLOAT_FIXED - inEne2_fx = &( hIvasRend->inputsMasa->hMasaPrerend->energy_fx ); - inEne2_e = ( hIvasRend->inputsMasa->hMasaPrerend->energy_e ); - for ( Word16 i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - f2me_buf( hIvasRend->inputsMasa->hMasaPrerend->energy[i], hIvasRend->inputsMasa->hMasaPrerend->energy_fx[i], &hIvasRend->inputsMasa->hMasaPrerend->energy_e[i], MASA_FREQUENCY_BANDS ); - } - -#endif } else { @@ -12703,22 +13074,12 @@ ivas_error IVAS_REND_MergeMasaMetadata( } /* Merge metadata */ -#ifdef IVAS_FLOAT_FIXED - ivas_prerend_merge_masa_metadata_fx( *hMasaExtOutMeta, *hMasaExtOutMeta, inputType1, *inEne1_fx, inEne1_e, inMeta2, inputType2, *inEne2_fx, inEne2_e ); - - FOR( Word32 i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - me2f_buf( ( *inEne1_fx )[i], inEne1_e[i], ( *inEne1 )[i], MASA_FREQUENCY_BANDS ); - } -#else ivas_prerend_merge_masa_metadata( *hMasaExtOutMeta, *hMasaExtOutMeta, inputType1, *inEne1, inMeta2, inputType2, *inEne2 ); ( *hMasaExtOutMeta )->descriptiveMeta.numberOfChannels = hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_MASA1 ? 0u : 1u; -#endif - - ( *hMasaExtOutMeta )->descriptiveMeta.numberOfChannels = hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_MASA1 ? 0u : 1u; return IVAS_ERR_OK; } + #endif // IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* @@ -12781,6 +13142,7 @@ ivas_error IVAS_REND_SetIsmMetadataDelay( FOR( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) { hIvasRend->inputsIsm[i].ism_metadata_delay_ms_fx = sync_md_delay; + move32(); } return IVAS_ERR_OK; @@ -12828,17 +13190,18 @@ static ivas_error getSamplesInternal( } test(); - IF( LE_16( outAudio.config.numSamplesPerChannel, 0 ) || LT_16( MAX_BUFFER_LENGTH_PER_CHANNEL, outAudio.config.numSamplesPerChannel ) ) + IF( outAudio.config.numSamplesPerChannel <= 0 || LT_16( MAX_BUFFER_LENGTH_PER_CHANNEL, outAudio.config.numSamplesPerChannel ) ) { return IVAS_ERR_INVALID_BUFFER_SIZE; } test(); - IF( LE_16( outAudio.config.numChannels, 0 ) || LT_16( MAX_OUTPUT_CHANNELS, outAudio.config.numChannels ) ) + IF( outAudio.config.numChannels <= 0 || LT_16( MAX_OUTPUT_CHANNELS, outAudio.config.numChannels ) ) { return IVAS_ERR_WRONG_NUM_CHANNELS; } + test(); IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) && NE_32( outAudio.config.numSamplesPerChannel * 1000, ( hIvasRend->num_subframes * BINAURAL_RENDERING_FRAME_SIZE_MS ) * hIvasRend->sampleRateOut ) ) { @@ -12857,26 +13220,58 @@ static ivas_error getSamplesInternal( FOR( i = 0; i < RENDERER_MAX_MASA_INPUTS; i++ ) { // numMasaInputs += hIvasRend->inputsMasa[i].base.inConfig == IVAS_AUDIO_CONFIG_INVALID ? 0 : 1; - numMasaInputs = EQ_32( L_add( numMasaInputs, hIvasRend->inputsMasa[i].base.inConfig ), IVAS_AUDIO_CONFIG_INVALID ) ? 0 : 1; + + IF( EQ_32( hIvasRend->inputsMasa[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + numMasaInputs = add( numMasaInputs, 0 ); + } + ELSE + { + numMasaInputs = add( numMasaInputs, 1 ); + } } FOR( i = 0; i < RENDERER_MAX_MC_INPUTS; i++ ) { // numOtherInputs += hIvasRend->inputsMc[i].base.inConfig == IVAS_AUDIO_CONFIG_INVALID ? 0 : 1; - numOtherInputs = EQ_32( L_add( numOtherInputs, hIvasRend->inputsMc[i].base.inConfig ), IVAS_AUDIO_CONFIG_INVALID ) ? 0 : 1; + + IF( EQ_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + numOtherInputs = add( numOtherInputs, 0 ); + } + ELSE + { + numOtherInputs = add( numOtherInputs, 1 ); + } } FOR( i = 0; i < RENDERER_MAX_SBA_INPUTS; i++ ) { // numOtherInputs += hIvasRend->inputsSba[i].base.inConfig == IVAS_AUDIO_CONFIG_INVALID ? 0 : 1; - numOtherInputs = EQ_32( L_add( numOtherInputs, hIvasRend->inputsSba[i].base.inConfig ), IVAS_AUDIO_CONFIG_INVALID ) ? 0 : 1; + + IF( EQ_32( hIvasRend->inputsSba[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + numOtherInputs = add( numOtherInputs, 0 ); + } + ELSE + { + numOtherInputs = add( numOtherInputs, 1 ); + } } /* For ISM, we check only first as all ISMs are handled together via OMASA when merging to MASA. */ // numOtherInputs += hIvasRend->inputsIsm[0].base.inConfig == IVAS_AUDIO_CONFIG_INVALID ? 0 : 1; - numOtherInputs = EQ_32( L_add( numOtherInputs, hIvasRend->inputsIsm[0].base.inConfig ), IVAS_AUDIO_CONFIG_INVALID ) ? 0 : 1; + IF( EQ_32( hIvasRend->inputsIsm[0].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) + { + numOtherInputs = add( numOtherInputs, 0 ); + } + ELSE + { + numOtherInputs = add( numOtherInputs, 1 ); + } + test(); - IF( EQ_16( numMasaInputs, 0 ) || EQ_16( numOtherInputs, 0 ) ) + IF( numMasaInputs == 0 || numOtherInputs == 0 ) { return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; } @@ -12893,8 +13288,8 @@ static ivas_error getSamplesInternal( } /* Clear original output buffer */ - set_zero( outAudio.data, outAudio.config.numChannels * outAudio.config.numSamplesPerChannel ); - set_val_Word32( outAudio.data_fx, 0, outAudio.config.numChannels * outAudio.config.numSamplesPerChannel ); + set_zero( outAudio.data, imult1616( outAudio.config.numChannels, outAudio.config.numSamplesPerChannel ) ); + set_val_Word32( outAudio.data_fx, 0, imult1616( outAudio.config.numChannels, outAudio.config.numSamplesPerChannel ) ); IF( NE_32( ( error = renderActiveInputsIsm( hIvasRend, outAudio ) ), IVAS_ERR_OK ) ) { @@ -12913,20 +13308,8 @@ static ivas_error getSamplesInternal( return error; } - /*IF( NE_32( hIvasRend->inputsSba[0].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) || NE_32( hIvasRend->inputsMc[0].base.inConfig, IVAS_AUDIO_CONFIG_INVALID )|| NE_32( hIvasRend->inputsIsm[0].base.inConfig, IVAS_AUDIO_CONFIG_INVALID )) - { -#ifndef DISABLE_LIMITER - Word32 limiter_thresold = L_lshl( IVAS_LIMITER_THRESHOLD, *outAudio.pq_fact ); - limitRendererOutput_fx( hIvasRend->hLimiter, outAudio.data_fx, outAudio.config.numSamplesPerChannel, limiter_thresold, *outAudio.pq_fact ); -#endif - } - ELSE - { -#ifndef DISABLE_LIMITER - limitRendererOutput( hIvasRend->hLimiter, outAudio.data, outAudio.config.numSamplesPerChannel, IVAS_LIMITER_THRESHOLD ); - *outAudio.pq_fact = 0; -#endif - }*/ + test(); + test(); IF( NE_32( hIvasRend->inputsSba[0].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) || NE_32( hIvasRend->inputsMc[0].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) || NE_32( hIvasRend->inputsIsm[0].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { Word32 limiter_thresold = L_lshl( IVAS_LIMITER_THRESHOLD, *outAudio.pq_fact ); @@ -13078,40 +13461,43 @@ ivas_error IVAS_REND_GetSamples( * * *-------------------------------------------------------------------*/ + + #ifdef IVAS_FLOAT_FIXED void IVAS_REND_Close( IVAS_REND_HANDLE *phIvasRend /* i/o: Pointer to renderer handle */ ) { - uint16_t i; + UWord16 i; IVAS_REND_HANDLE hIvasRend; /* Validate function arguments */ - if ( phIvasRend == NULL || *phIvasRend == NULL ) + test(); + IF( phIvasRend == NULL || *phIvasRend == NULL ) { return; } hIvasRend = *phIvasRend; - if ( hIvasRend->efapOutWrapper.hEfap != NULL ) + IF( hIvasRend->efapOutWrapper.hEfap != NULL ) { efap_free_data( &hIvasRend->efapOutWrapper.hEfap ); } /* clear inputs */ - for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) + FOR( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) { clearInputIsm( &hIvasRend->inputsIsm[i] ); } - for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) + FOR( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) { clearInputMc( &hIvasRend->inputsMc[i] ); } - for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) + FOR( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) { clearInputSba( &hIvasRend->inputsSba[i] ); } - for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) + FOR( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) { clearInputMasa( &hIvasRend->inputsMasa[i] ); } @@ -13178,8 +13564,8 @@ void IVAS_REND_Close( closeHeadRotation( hIvasRend ); - ivas_external_orientation_close( &hIvasRend->hExternalOrientationData ); - ivas_combined_orientation_close( &hIvasRend->hCombinedOrientationData ); + ivas_external_orientation_close_fx( &hIvasRend->hExternalOrientationData ); + ivas_combined_orientation_close_fx( &hIvasRend->hCombinedOrientationData ); free( hIvasRend ); *phIvasRend = NULL; @@ -13203,6 +13589,7 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; error = IVAS_ERR_OK; + move32(); hDirACRend = NULL; output_Fs = *( inputMasa->base.ctx.pOutSampleRate ); @@ -13219,7 +13606,16 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC renderer\n" ) ); } - nchan_transport = EQ_16( inputMasa->base.inConfig, IVAS_AUDIO_CONFIG_MASA2 ) ? 2 : 1; + IF( EQ_16( inputMasa->base.inConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) + { + nchan_transport = 2; + move16(); + } + ELSE + { + nchan_transport = 1; + move16(); + } /*-----------------------------------------------------------------* * output setup: for parametric binaural renderer, use output setup, otherwise internal setup @@ -13249,6 +13645,7 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( nchan_out_woLFE = hDirACRend->hOutSetup.nchan_out_woLFE; move16(); + test(); IF( hDirACRend->hOutSetup.ls_azimuth_fx != NULL && hDirACRend->hOutSetup.ls_elevation_fx != NULL ) { Copy32( hDirACRend->hOutSetup.ls_azimuth_fx, ls_azimuth_fx, nchan_out_woLFE ); @@ -13275,27 +13672,36 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( * set input parameters *-----------------------------------------------------------------*/ + test(); IF( EQ_16( hDirACRend->hOutSetup.output_config, IVAS_AUDIO_CONFIG_MONO ) ) { hDirACRend->synthesisConf = DIRAC_SYNTHESIS_MONO; hDirACRend->panningConf = DIRAC_PANNING_HOA3; nchan_out_woLFE = 1; + move32(); + move32(); move16(); } ELSE IF( hDirACRend->hOutSetup.is_loudspeaker_setup ) { hDirACRend->synthesisConf = DIRAC_SYNTHESIS_PSD_LS; hDirACRend->panningConf = DIRAC_PANNING_VBAP; + move32(); + move32(); } ELSE IF( !hDirACRend->hOutSetup.is_loudspeaker_setup && GT_16( nchan_transport, 1 ) ) { hDirACRend->synthesisConf = DIRAC_SYNTHESIS_PSD_SHD; hDirACRend->panningConf = DIRAC_PANNING_HOA3; + move32(); + move32(); } ELSE { hDirACRend->synthesisConf = DIRAC_SYNTHESIS_GAIN_SHD; hDirACRend->panningConf = DIRAC_PANNING_HOA3; + move32(); + move32(); } IF( ( hDirACRend->frequency_axis_fx = (Word16 *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( Word16 ) ) ) == NULL ) @@ -13306,6 +13712,7 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( ivas_dirac_dec_get_frequency_axis_fx( hDirACRend->frequency_axis_fx, output_Fs, hSpatParamRendCom->num_freq_bands ); + test(); IF( EQ_16( hDirACRend->panningConf, DIRAC_PANNING_HOA3 ) && EQ_16( nchan_transport, 2 ) ) { IF( ( hDirACRend->masa_stereo_type_detect = (MASA_STEREO_TYPE_DETECT *) malloc( sizeof( MASA_STEREO_TYPE_DETECT ) ) ) == NULL ) @@ -13333,23 +13740,31 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( /* Directional and diffuses components in output LS format */ hDirACRend->num_outputs_diff = nchan_out_woLFE; hDirACRend->num_outputs_dir = nchan_out_woLFE; + move16(); + move16(); } ELSE IF( EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { /* Directional and diffuses components in SHD */ /* Diffuseness components up to 1st order */ - hDirACRend->num_outputs_diff = ( min( hDirACRend->hOutSetup.ambisonics_order, 1 ) + 1 ) * ( min( hDirACRend->hOutSetup.ambisonics_order, 1 ) + 1 ); + hDirACRend->num_outputs_diff = imult1616( ( s_min( hDirACRend->hOutSetup.ambisonics_order, 1 ) + 1 ), ( add( s_min( hDirACRend->hOutSetup.ambisonics_order, 1 ), 1 ) ) ); hDirACRend->num_outputs_dir = ivas_sba_get_nchan_fx( hDirACRend->hOutSetup.ambisonics_order, 0 ); + move16(); + move16(); } ELSE IF( EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_SHD ) ) { hDirACRend->num_outputs_diff = DIRAC_HOA_RENDERING_NUM_VIRT_DECORR_LS; hDirACRend->num_outputs_dir = nchan_out_woLFE; + move16(); + move16(); } ELSE IF( EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_MONO ) ) { hDirACRend->num_outputs_diff = 1; /* There is one output channel in mono */ hDirACRend->num_outputs_dir = 2; /* Two channels are pre-rendered for stereo type detection */ + move16(); + move16(); } ELSE { @@ -13418,11 +13833,11 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( FOR( k = 0; k < hDirACRend->num_outputs_diff; k++ ) { - IF( GT_32( ls_azimuth_fx[k], 0 ) ) + IF( ls_azimuth_fx[k] > 0 ) { hDirACRend->proto_index_diff[k] = 1; } - ELSE IF( LT_32( ls_azimuth_fx[k], 0 ) ) + ELSE IF( ls_azimuth_fx[k] < 0 ) { hDirACRend->proto_index_diff[k] = 2; } @@ -13456,6 +13871,8 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); } + test(); + test(); IF( EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_LS ) || EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_SHD ) || EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_MONO ) ) { initDiffuseResponses_fx( hDirACRend->diffuse_response_function_fx, nchan_out_woLFE, hDirACRend->hOutSetup.output_config, @@ -13484,7 +13901,7 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( IF( EQ_16( hDirACRend->panningConf, DIRAC_PANNING_VBAP ) ) { - IF( ( error = vbap_init_data_fx( &( inputMasa->hMasaExtRend->hVBAPdata ), ls_azimuth_fx, ls_elevation_fx, nchan_out_woLFE, MASA_FORMAT ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = vbap_init_data_fx( &( inputMasa->hMasaExtRend->hVBAPdata ), ls_azimuth_fx, ls_elevation_fx, nchan_out_woLFE, MASA_FORMAT ) ), IVAS_ERR_OK ) ) { return error; } @@ -13496,7 +13913,7 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( { IF( hDirACRend->hOutSetup.is_loudspeaker_setup ) { - IF( ( error = ivas_sba_get_hoa_dec_matrix_fx( hDirACRend->hOutSetup, &inputMasa->hMasaExtRend->hoa_dec_mtx, hDirACRend->hOutSetup.ambisonics_order ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_sba_get_hoa_dec_matrix_fx( hDirACRend->hOutSetup, &inputMasa->hMasaExtRend->hoa_dec_mtx, hDirACRend->hOutSetup.ambisonics_order ) ), IVAS_ERR_OK ) ) { return error; } @@ -13507,35 +13924,39 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( /* decorrelation */ hDirACRend->proto_signal_decorr_on = 1; + move16(); IF( EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_MONO ) ) { hDirACRend->proto_signal_decorr_on = 0; + move16(); } IF( hDirACRend->proto_signal_decorr_on ) { - IF( ( error = ivas_dirac_dec_decorr_open_fx( &( hDirACRend->h_freq_domain_decorr_ap_params ), - &( hDirACRend->h_freq_domain_decorr_ap_state ), - hSpatParamRendCom->num_freq_bands, - hDirACRend->num_outputs_diff, - hDirACRend->num_protos_diff, - hDirACRend->synthesisConf, - hDirACRend->frequency_axis_fx, - nchan_transport, - output_Fs ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_dec_decorr_open_fx( &( hDirACRend->h_freq_domain_decorr_ap_params ), + &( hDirACRend->h_freq_domain_decorr_ap_state ), + hSpatParamRendCom->num_freq_bands, + hDirACRend->num_outputs_diff, + hDirACRend->num_protos_diff, + hDirACRend->synthesisConf, + hDirACRend->frequency_axis_fx, + nchan_transport, + output_Fs ) ), + IVAS_ERR_OK ) ) { return error; } } /* output synthesis */ - IF( ( ivas_dirac_dec_output_synthesis_open_fx( hSpatParamRendCom, hDirACRend, RENDERER_DIRAC, nchan_transport, output_Fs, 0 ) ) != IVAS_ERR_OK ) + IF( NE_32( ( ivas_dirac_dec_output_synthesis_open_fx( hSpatParamRendCom, hDirACRend, RENDERER_DIRAC, nchan_transport, output_Fs, 0 ) ), IVAS_ERR_OK ) ) { return error; } hDirACRend->h_output_synthesis_psd_params.use_onset_filters = hDirACRend->proto_signal_decorr_on; move16(); + test(); IF( EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_SHD ) || EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { hDirACRend->h_output_synthesis_psd_params.use_onset_filters = 0; @@ -13552,11 +13973,12 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( } ELSE { - IF( ( hDirACRend->proto_frame_f_fx = (Word32 *) malloc( sizeof( Word32 ) * 2 * hDirACRend->num_protos_diff * hSpatParamRendCom->num_freq_bands ) ) == NULL ) + IF( ( hDirACRend->proto_frame_f_fx = (Word32 *) malloc( sizeof( Word32 ) * shl( imult1616( hDirACRend->num_protos_diff, hSpatParamRendCom->num_freq_bands ), 1 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); } - hDirACRend->proto_frame_f_len = 2 * hDirACRend->num_protos_diff * hSpatParamRendCom->num_freq_bands; + hDirACRend->proto_frame_f_len = shl( imult1616( hDirACRend->num_protos_diff, hSpatParamRendCom->num_freq_bands ), 1 ); + move16(); } @@ -13573,7 +13995,7 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( ivas_dirac_dec_output_synthesis_init_fx( hSpatParamRendCom, hDirACRend, nchan_out_woLFE, 0 ); /* Allocate stack memory */ - IF( ( error = ivas_dirac_alloc_mem( hDirACRend, RENDERER_DIRAC, hSpatParamRendCom->num_freq_bands, &( hDirACRend->stack_mem ), 0 ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_alloc_mem( hDirACRend, RENDERER_DIRAC, hSpatParamRendCom->num_freq_bands, &( hDirACRend->stack_mem ), 0 ) ), IVAS_ERR_OK ) ) { return error; } @@ -13696,11 +14118,7 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); } -#ifdef IVAS_FLOAT_FIXED - ivas_masa_init_stereotype_detection_fx( hDirACRend->masa_stereo_type_detect ); -#else ivas_masa_init_stereotype_detection( hDirACRend->masa_stereo_type_detect ); -#endif } else { @@ -13912,20 +14330,10 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { -#ifdef IVAS_FLOAT_FIXED - hDirACRend->proto_frame_f_fx = NULL; -#endif hDirACRend->proto_frame_f = NULL; } else { -#ifdef IVAS_FLOAT_FIXED - IF( ( hDirACRend->proto_frame_f_fx = (Word32 *) malloc( sizeof( Word32 ) * 2 * hDirACRend->num_protos_diff * hSpatParamRendCom->num_freq_bands ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - hDirACRend->proto_frame_f_len = 2 * hDirACRend->num_protos_diff * hSpatParamRendCom->num_freq_bands; -#endif if ( ( hDirACRend->proto_frame_f = (float *) malloc( sizeof( float ) * 2 * hDirACRend->num_protos_diff * hSpatParamRendCom->num_freq_bands ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); @@ -14063,29 +14471,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( } /* Always open frequency domain decorrelator */ -#ifdef IVAS_FLOAT_FIXED - Word16 frequency_axis_fx[CLDFB_NO_CHANNELS_MAX]; - ivas_dirac_dec_get_frequency_axis_fx( frequency_axis_fx, output_Fs, nBins ); - - for ( int i = 0; i < nBins; i++ ) - { - frequency_axis[i] = (float) frequency_axis_fx[i]; - } - if ( ( error = ivas_dirac_dec_decorr_open_fx( &( hDiracDecBin->h_freq_domain_decorr_ap_params ), - &( hDiracDecBin->h_freq_domain_decorr_ap_state ), - nBins, - BINAURAL_CHANNELS, - BINAURAL_CHANNELS, - DIRAC_SYNTHESIS_PSD_LS, - frequency_axis_fx, - BINAURAL_CHANNELS, - output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } -#else ivas_dirac_dec_get_frequency_axis( frequency_axis, output_Fs, nBins ); - if ( ( error = ivas_dirac_dec_decorr_open( &( hDiracDecBin->h_freq_domain_decorr_ap_params ), &( hDiracDecBin->h_freq_domain_decorr_ap_state ), nBins, @@ -14098,14 +14484,8 @@ static ivas_error ivas_masa_ext_rend_parambin_init( { return error; } -#endif /* External renderer uses constant regularization factor */ -#ifdef IVAS_FLOAT_FIXED - hDiracDecBin->reqularizationFactor_fx = 6554; - move16(); -#else hDiracDecBin->reqularizationFactor = 0.4f; -#endif inputMasa->hMasaExtRend->hDiracDecBin = hDiracDecBin; @@ -14131,6 +14511,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( Word16 tmp2; error = IVAS_ERR_OK; + move32(); hHrtfParambin = inputMasa->hMasaExtRend->hHrtfParambin; @@ -14140,6 +14521,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( move32(); move16(); renderer_type = inputMasa->hMasaExtRend->renderer_type; + move32(); hDiracDecBin = inputMasa->hMasaExtRend->hDiracDecBin; @@ -14176,6 +14558,12 @@ static ivas_error ivas_masa_ext_rend_parambin_init( hDiracDecBin->q_processMtxPrevSCCR = Q15; hDiracDecBin->q_processMtxDec = Q15; hDiracDecBin->q_processMtxDecPrev = Q15; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); set_zero_fx( hDiracDecBin->ChEnePrev_fx[j], nBins ); set_zero_fx( hDiracDecBin->ChEneOutPrev_fx[j], nBins ); set16_fx( hDiracDecBin->ChEnePrev_e[j], 0, nBins ); @@ -14190,21 +14578,25 @@ static ivas_error ivas_masa_ext_rend_parambin_init( set16_fx( hDiracDecBin->ChCrossReOutPrev_e, 0, nBins ); set16_fx( hDiracDecBin->ChCrossImOutPrev_e, 0, nBins ); hDiracDecBin->renderStereoOutputInsteadOfBinaural = 0; + move16(); FOR( bin = 0; bin < nBins; bin++ ) { binCenterFreq_fx = L_mult0( extract_l( L_shr( output_Fs, 1 ) ), div_s( add( shl( bin, 1 ), 1 ), shl( nBins, 1 ) ) ) /*( (float) bin + 0.5f ) / (float) nBins * ( (float) output_Fs / 2.0f )*/; /*Q15*/ /* These formulas and values are from Christian Borss's publication for binaural diffuse field coherence */ - tmp = BASOP_Util_Divide3232_Scale( binCenterFreq_fx, 2700 << Q15, &tmp_e ); + tmp = BASOP_Util_Divide3232_Scale( binCenterFreq_fx, L_shl( 2700, Q15 ), &tmp_e ); IF( tmp_e < 0 ) { tmp = shl( tmp, tmp_e ); /*q15*/ tmp_e = 0; + move16(); } - tmpFloat_fx = s_max( 0, sub( shl_sat( 1, 15 - tmp_e ), tmp ) ) /*max( 0.0f, 1.0f - binCenterFreq / 2700.0f )*/; /*Q30*/ + tmpFloat_fx = s_max( 0, sub( shl_sat( 1, sub( 15, tmp_e ) ), tmp ) ) /*max( 0.0f, 1.0f - binCenterFreq / 2700.0f )*/; /*Q30*/ tmp2 = extract_l( Mult_32_32( binCenterFreq_fx, 1952258 /*=2^31*180/(550)/360*/ ) % 32767 ); //*binCenterFreq_fx * EVS_PI / 550.0f*/ hDiracDecBin->diffuseFieldCoherence_fx[bin] = L_shl( L_mult0( divide3232( tmpFloat_fx, Mult_32_16( binCenterFreq_fx, 187 /*2^15*pi/550*/ ) ), getSineWord16R2( tmp2 ) ), tmp_e ); /*tmpFloat * sinf( binCenterFreq * EVS_PI / 550.0f ) / ( binCenterFreq * EVS_PI / 550.0f );*/ hDiracDecBin->diffuseFieldCoherence_fx[bin] = L_shl( hDiracDecBin->diffuseFieldCoherence_fx[bin], 1 ); // Q31 + move32(); + move32(); } /* No SPAR in external renderer so set directive diffuse field coherence tables to zero */ @@ -14216,17 +14608,19 @@ static ivas_error ivas_masa_ext_rend_parambin_init( { set32_fx( hDiracDecBin->earlyPartEneCorrection_fx, ONE_IN_Q28 /*1.0f Q28*/, CLDFB_NO_CHANNELS_MAX ); hDiracDecBin->q_earlyPartEneCorrection = Q28; + move16(); hDiracDecBin->hReverb = NULL; } ELSE IF( EQ_16( renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) /* Indication of binaural rendering with room effect */ { Copy32( hHrtfParambin->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); hDiracDecBin->q_earlyPartEneCorrection = Q28; + move16(); IF( hDiracDecBin->hReverb == NULL ) { /* Todo Philips: Room acoustics should be passed here once the underlying part works. In this case, it probably should come from render context or somewhere else suitable. */ - IF( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, hHrtfParambin ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, hHrtfParambin ) ), IVAS_ERR_OK ) ) { return error; } @@ -14236,8 +14630,10 @@ static ivas_error ivas_masa_ext_rend_parambin_init( { set32_fx( hDiracDecBin->earlyPartEneCorrection_fx, ONE_IN_Q28 /*1.0f Q28*/, CLDFB_NO_CHANNELS_MAX ); hDiracDecBin->q_earlyPartEneCorrection = Q28; + move16(); hDiracDecBin->hReverb = NULL; hDiracDecBin->renderStereoOutputInsteadOfBinaural = 1; + move16(); } ELSE /* Not valid renderer type for this renderer */ { @@ -14247,15 +14643,16 @@ static ivas_error ivas_masa_ext_rend_parambin_init( /* Always open frequency domain decorrelator */ ivas_dirac_dec_get_frequency_axis_fx( frequency_axis_fx, output_Fs, nBins ); - IF( ( error = ivas_dirac_dec_decorr_open_fx( &( hDiracDecBin->h_freq_domain_decorr_ap_params ), - &( hDiracDecBin->h_freq_domain_decorr_ap_state ), - nBins, - BINAURAL_CHANNELS, - BINAURAL_CHANNELS, - DIRAC_SYNTHESIS_PSD_LS, - frequency_axis_fx, - BINAURAL_CHANNELS, - output_Fs ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_dec_decorr_open_fx( &( hDiracDecBin->h_freq_domain_decorr_ap_params ), + &( hDiracDecBin->h_freq_domain_decorr_ap_state ), + nBins, + BINAURAL_CHANNELS, + BINAURAL_CHANNELS, + DIRAC_SYNTHESIS_PSD_LS, + frequency_axis_fx, + BINAURAL_CHANNELS, + output_Fs ) ), + IVAS_ERR_OK ) ) { return error; } @@ -14353,17 +14750,12 @@ static ivas_error initMasaExtRenderer( if ( hMasaExtRend->renderer_type != RENDERER_DISABLE ) { int16_t subframe; -#ifdef IVAS_FLOAT_FIXED - IF( ( error = ivas_spat_hSpatParamRendCom_config_fx( &hMasaExtRend->hSpatParamRendCom, DIRAC_OPEN, 0, MASA_FORMAT, MC_MODE_NONE, *( inputMasa->base.ctx.pOutSampleRate ), 0, 1 ) ) != IVAS_ERR_OK ) - { - return error; - } -#else + if ( ( error = ivas_spat_hSpatParamRendCom_config( &hMasaExtRend->hSpatParamRendCom, DIRAC_OPEN, 0, MASA_FORMAT, MC_MODE_NONE, *( inputMasa->base.ctx.pOutSampleRate ), 0, 1 ) ) != IVAS_ERR_OK ) { return error; } -#endif + /* Simple population of the metadata index map as no adaptation is present */ set_s( hMasaExtRend->hSpatParamRendCom->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); for ( subframe = 0; subframe < MAX_PARAM_SPATIAL_SUBFRAMES; subframe++ ) @@ -14412,7 +14804,7 @@ static ivas_error initMasaExtRenderer( { for ( i = 0; i < hMasaExtRend->nchan_input; i++ ) { - if ( ( error = openCldfb_ivas( &( hMasaExtRend->cldfbAnaRend[i] ), CLDFB_ANALYSIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + if ( ( error = openCldfb( &( hMasaExtRend->cldfbAnaRend[i] ), CLDFB_ANALYSIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) { return error; } @@ -14420,7 +14812,7 @@ static ivas_error initMasaExtRenderer( for ( i = 0; i < hMasaExtRend->nchan_output; i++ ) { - if ( ( error = openCldfb_ivas( &( hMasaExtRend->cldfbSynRend[i] ), CLDFB_SYNTHESIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + if ( ( error = openCldfb( &( hMasaExtRend->cldfbSynRend[i] ), CLDFB_SYNTHESIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) { return error; } @@ -14431,7 +14823,6 @@ static ivas_error initMasaExtRenderer( return IVAS_ERR_OK; } - #else static ivas_error initMasaExtRenderer( input_masa *inputMasa, @@ -14442,6 +14833,7 @@ static ivas_error initMasaExtRenderer( MASA_EXT_REND_HANDLE hMasaExtRend; error = IVAS_ERR_OK; + move32(); IF( ( hMasaExtRend = (MASA_EXT_REND_HANDLE) malloc( sizeof( MASA_EXT_REND_DATA ) ) ) == NULL ) { @@ -14452,6 +14844,7 @@ static ivas_error initMasaExtRenderer( /* Default init */ hMasaExtRend->renderer_type = RENDERER_DISABLE; + move32(); hMasaExtRend->hDirACRend = NULL; hMasaExtRend->hSpatParamRendCom = NULL; hMasaExtRend->hDiracDecBin = NULL; @@ -14460,12 +14853,12 @@ static ivas_error initMasaExtRenderer( hMasaExtRend->hVBAPdata = NULL; hMasaExtRend->hoa_dec_mtx = NULL; - IF( ( error = getAudioConfigNumChannels( inputMasa->base.inConfig, &hMasaExtRend->nchan_input ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAudioConfigNumChannels( inputMasa->base.inConfig, &hMasaExtRend->nchan_input ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = getAudioConfigNumChannels( outConfig, &hMasaExtRend->nchan_output ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = getAudioConfigNumChannels( outConfig, &hMasaExtRend->nchan_output ) ), IVAS_ERR_OK ) ) { return error; } @@ -14476,16 +14869,19 @@ static ivas_error initMasaExtRenderer( IF( EQ_16( inputMasa->base.inConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) { hMasaExtRend->renderer_type = RENDERER_DIRAC; + move32(); } ELSE { /* 1TC MASA to mono does not need rendering. */ hMasaExtRend->renderer_type = RENDERER_DISABLE; + move32(); } BREAK; case IVAS_AUDIO_CONFIG_STEREO: hMasaExtRend->renderer_type = RENDERER_STEREO_PARAMETRIC; + move32(); BREAK; case IVAS_AUDIO_CONFIG_5_1: @@ -14498,15 +14894,18 @@ static ivas_error initMasaExtRenderer( case IVAS_AUDIO_CONFIG_HOA2: case IVAS_AUDIO_CONFIG_HOA3: hMasaExtRend->renderer_type = RENDERER_DIRAC; + move32(); BREAK; case IVAS_AUDIO_CONFIG_BINAURAL: hMasaExtRend->renderer_type = RENDERER_BINAURAL_PARAMETRIC; + move32(); BREAK; case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: hMasaExtRend->renderer_type = RENDERER_BINAURAL_PARAMETRIC_ROOM; + move32(); BREAK; default: @@ -14516,7 +14915,7 @@ static ivas_error initMasaExtRenderer( IF( NE_16( hMasaExtRend->renderer_type, RENDERER_DISABLE ) ) { Word16 subframe; - IF( ( error = ivas_spat_hSpatParamRendCom_config_fx( &hMasaExtRend->hSpatParamRendCom, DIRAC_OPEN, 0, MASA_FORMAT, MC_MODE_NONE, *( inputMasa->base.ctx.pOutSampleRate ), 0, 1 ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_spat_hSpatParamRendCom_config_fx( &hMasaExtRend->hSpatParamRendCom, DIRAC_OPEN, 0, MASA_FORMAT, MC_MODE_NONE, *( inputMasa->base.ctx.pOutSampleRate ), 0, 1 ) ), IVAS_ERR_OK ) ) { return error; } @@ -14533,29 +14932,31 @@ static ivas_error initMasaExtRenderer( IF( EQ_16( hMasaExtRend->renderer_type, RENDERER_DIRAC ) ) { - IF( ( error = ivas_masa_ext_rend_dirac_rend_init( inputMasa ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_masa_ext_rend_dirac_rend_init( inputMasa ) ), IVAS_ERR_OK ) ) { return error; } } + test(); + test(); IF( EQ_16( hMasaExtRend->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( hMasaExtRend->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_16( hMasaExtRend->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { IF( NE_16( hMasaExtRend->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { - IF( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( &inputMasa->hMasaExtRend->hHrtfParambin ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( &inputMasa->hMasaExtRend->hHrtfParambin ) ), IVAS_ERR_OK ) ) { return error; } #if 1 /*TODO: To be removed later after dependency on floating buffers in hHrtfParambin is removed*/ - if ( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &inputMasa->hMasaExtRend->hHrtfParambin ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &inputMasa->hMasaExtRend->hHrtfParambin ) ), IVAS_ERR_OK ) ) { return error; } #endif // IVAS_FLOAT_FIXED } - IF( ( error = ivas_masa_ext_rend_parambin_init( inputMasa ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_masa_ext_rend_parambin_init( inputMasa ) ), IVAS_ERR_OK ) ) { return error; } @@ -14572,11 +14973,11 @@ static ivas_error initMasaExtRenderer( hMasaExtRend->cldfbSynRend[i] = NULL; } - IF( hMasaExtRend->renderer_type != RENDERER_DISABLE ) + IF( NE_32( hMasaExtRend->renderer_type, RENDERER_DISABLE ) ) { FOR( i = 0; i < hMasaExtRend->nchan_input; i++ ) { - IF( ( error = openCldfb_ivas_fx( &( hMasaExtRend->cldfbAnaRend[i] ), CLDFB_ANALYSIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( hMasaExtRend->cldfbAnaRend[i] ), CLDFB_ANALYSIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) { return error; } @@ -14584,7 +14985,7 @@ static ivas_error initMasaExtRenderer( FOR( i = 0; i < hMasaExtRend->nchan_output; i++ ) { - IF( ( error = openCldfb_ivas_fx( &( hMasaExtRend->cldfbSynRend[i] ), CLDFB_SYNTHESIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( hMasaExtRend->cldfbSynRend[i] ), CLDFB_SYNTHESIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) { return error; } @@ -14604,6 +15005,7 @@ static void freeMasaExtRenderer( MASA_EXT_REND_HANDLE hMasaExtRend; Word16 i; + test(); IF( hMasaExtRendOut == NULL || *hMasaExtRendOut == NULL ) { return; @@ -14683,20 +15085,12 @@ static void freeMasaExtRenderer( if ( hMasaExtRend->hDirACRend != NULL ) { -#ifdef IVAS_FLOAT_FIXED - ivas_dirac_rend_close_fx( &hMasaExtRend->hDirACRend ); -#else ivas_dirac_rend_close( &hMasaExtRend->hDirACRend ); -#endif // IVAS_FLOAT_FIXED } if ( hMasaExtRend->hSpatParamRendCom != NULL ) { -#ifdef IVAS_FLOAT_FIXED - ivas_spat_hSpatParamRendCom_close_fx( &hMasaExtRend->hSpatParamRendCom ); -#else ivas_spat_hSpatParamRendCom_close( &hMasaExtRend->hSpatParamRendCom ); -#endif // IVAS_FLOAT_FIXED } if ( hMasaExtRend->hDiracDecBin != NULL ) @@ -14706,32 +15100,17 @@ static void freeMasaExtRenderer( if ( hMasaExtRend->hReverb != NULL ) { -#ifdef IVAS_FLOAT_FIXED - ivas_binaural_reverb_close_fx( &hMasaExtRend->hReverb ); -#else ivas_binaural_reverb_close( &hMasaExtRend->hReverb ); -#endif } -#ifdef IVAS_FLOAT_FIXED - IF( hMasaExtRend->hHrtfParambin != NULL ) - { - ivas_HRTF_parambin_binary_close_fx( &hMasaExtRend->hHrtfParambin ); - } -#else if ( hMasaExtRend->hHrtfParambin != NULL ) { ivas_HRTF_parambin_binary_close( &hMasaExtRend->hHrtfParambin ); } -#endif if ( hMasaExtRend->hVBAPdata != NULL ) { -#ifdef IVAS_FLOAT_FIXED - vbap_free_data_fx( &hMasaExtRend->hVBAPdata ); -#else vbap_free_data( &hMasaExtRend->hVBAPdata ); -#endif } if ( hMasaExtRend->hoa_dec_mtx != NULL ) diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index f10e35e09..af6e6d766 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -162,10 +162,17 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( /* Functions to be called before/during rendering */ +#ifndef IVAS_FLOAT_FIXED ivas_error IVAS_REND_NumOutChannels( IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ int16_t *numOutChannels /* o : number of output channels */ ); +#else +ivas_error IVAS_REND_NumOutChannels( + IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + Word16 *numOutChannels /* o : number of output channels */ +); +#endif ivas_error IVAS_REND_AddInput( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ @@ -231,17 +238,34 @@ ivas_error IVAS_REND_RemoveInput( const IVAS_REND_InputId inputId /* i : ID of the input */ ); +#ifdef IVAS_FLOAT_FIXED +ivas_error IVAS_REND_GetInputNumChannels( + IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + const IVAS_REND_InputId inputId, /* i : ID of the input */ + Word16 *numChannels /* o : number of channels of the input */ +); +#else ivas_error IVAS_REND_GetInputNumChannels( IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ const IVAS_REND_InputId inputId, /* i : ID of the input */ int16_t *numChannels /* o : number of channels of the input */ ); +#endif +#ifndef IVAS_FLOAT_FIXED ivas_error IVAS_REND_GetDelay( IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ int16_t *nSamples, /* o : Renderer delay in samples */ int32_t *timeScale /* o : Time scale of the delay, equal to renderer output sampling rate */ ); +#else +ivas_error IVAS_REND_GetDelay( + IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + Word16 *nSamples, /* o : Renderer delay in samples */ + Word32 *timeScale /* o : Time scale of the delay, equal to renderer output sampling rate */ +); +#endif + #ifdef IVAS_FLOAT_FIXED ivas_error IVAS_REND_GetDelay_fx( IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer state */ @@ -289,23 +313,46 @@ ivas_error IVAS_REND_InitConfig( const IVAS_AUDIO_CONFIG outAudioConfig /* i : output audioConfig */ ); +#ifndef IVAS_FLOAT_FIXED int16_t IVAS_REND_GetRenderConfig( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ const IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render configuration handle */ ); +#else +Word16 IVAS_REND_GetRenderConfig( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + const IVAS_RENDER_CONFIG_HANDLE hRCout /* o : Render configuration handle */ +); +#endif +#ifndef IVAS_FLOAT_FIXED int16_t IVAS_REND_FeedRenderConfig( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ const IVAS_RENDER_CONFIG_DATA renderConfig /* i : Render configuration struct */ ); +#else +Word16 IVAS_REND_FeedRenderConfig( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + const IVAS_RENDER_CONFIG_DATA renderConfig /* i : Render configuration struct */ +); +#endif +#ifndef IVAS_FLOAT_FIXED ivas_error IVAS_REND_SetHeadRotation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_QUATERNION headRot, /* i : head orientations for next rendering call */ const IVAS_VECTOR3 Pos, /* i : listener positions for next rendering call */ const int16_t sf_idx /* i : subframe index */ ); +#else +ivas_error IVAS_REND_SetHeadRotation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_QUATERNION headRot, /* i : head orientations for next rendering call */ + const IVAS_VECTOR3 Pos, /* i : listener positions for next rendering call */ + const Word16 sf_idx /* i : subframe index */ +); +#endif /* Head rotation becomes enabled by calling IVAS_REND_SetHeadRotation. Use this to disable. */ ivas_error IVAS_REND_DisableHeadRotation( @@ -339,6 +386,17 @@ ivas_error IVAS_REND_SetReferenceVector( ); +#ifdef IVAS_FLOAT_FIXED +ivas_error IVAS_REND_SetExternalOrientation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *orientation, /* i : external orientation data */ + Word8 enableHeadRotation, /* i : flag to enable head rotation for this frame */ + Word8 enableExternalOrientation, /* i : flag to enable external orientation for this frame */ + Word8 enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ + Word16 numFramesToTargetOrientation, /* i : number of frames until target orientation is reached */ + const Word16 sf_idx /* i : subframe index */ +); +#else ivas_error IVAS_REND_SetExternalOrientation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ IVAS_QUATERNION *orientation, /* i : external orientation data */ @@ -348,6 +406,7 @@ ivas_error IVAS_REND_SetExternalOrientation( int16_t numFramesToTargetOrientation, /* i : number of frames until target orientation is reached */ const int16_t sf_idx /* i : subframe index */ ); +#endif ivas_error IVAS_REND_CombineHeadAndExternalOrientation( IVAS_REND_HANDLE hIvasRend /* i/o: Renderer handle */ @@ -395,10 +454,17 @@ ivas_error IVAS_REND_SetIsmMetadataDelay( ); #endif +#ifdef IVAS_FLOAT_FIXED +ivas_error IVAS_REND_GetNumAllObjects( + IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + Word16 *numChannels /* o : number of all objects */ +); +#else ivas_error IVAS_REND_GetNumAllObjects( IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ int16_t *numChannels /* o : number of all objects */ ); +#endif ivas_error IVAS_REND_GetSamples( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ -- GitLab From 2cdd53fffc6729de3936e5c3bff66706f2b3f499 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 3 Jul 2024 11:05:14 +0530 Subject: [PATCH 028/110] clang formatting changes --- lib_com/ivas_rom_com_fx.c | 2 +- lib_com/modif_fs_fx.c | 6 +++--- lib_rend/ivas_allrad_dec.c | 4 ++-- lib_rend/ivas_crend.c | 2 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 8 ++++---- lib_rend/ivas_dirac_decorr_dec.c | 18 +++++++++--------- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lib_com/ivas_rom_com_fx.c b/lib_com/ivas_rom_com_fx.c index d4a8ce6a9..31e156bcd 100644 --- a/lib_com/ivas_rom_com_fx.c +++ b/lib_com/ivas_rom_com_fx.c @@ -1404,7 +1404,7 @@ const Word16 dft_cng_alpha_bits_fx[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_CO * DirAC ROM tables *----------------------------------------------------------------------------------*/ - // q = 30 +// q = 30 const Word32 diffuseness_reconstructions_fx[DIRAC_DIFFUSE_LEVELS] = { 0, 42467328, 96206848, 170655744, 331087872, 508821504, 678952960, 912785408 }; diff --git a/lib_com/modif_fs_fx.c b/lib_com/modif_fs_fx.c index 5d0fc563f..fa12252ad 100644 --- a/lib_com/modif_fs_fx.c +++ b/lib_com/modif_fs_fx.c @@ -700,7 +700,7 @@ void Decimate_allpass_steep_fx( Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */ #ifdef BASOP_NOGLOB - out_fx[k] = extract_h( L_mac_o( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ) ); /* Qx format */ + out_fx[k] = extract_h( L_mac_o( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ) ); /* Qx format */ move16(); mem[ALLPASSSECTIONS_STEEP - 1] = extract_h( L_msu_o( Lacc1, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[k], &Overflow ) ); /* Qx */ move16(); @@ -910,7 +910,7 @@ void Interpolate_allpass_steep_fx( Lacc1 = L_deposit_h( temp2 ); Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */ #ifdef BASOP_NOGLOB - out_fx[2 * k + 1] = round_fx_o( L_mac_o( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ), &Overflow ); /* Qx format */ + out_fx[2 * k + 1] = round_fx_o( L_mac_o( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ), &Overflow ); /* Qx format */ move16(); mem[ALLPASSSECTIONS_STEEP - 1] = round_fx_o( L_msu_o( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[2 * k + 1], &Overflow ), &Overflow ); /* Qx */ move16(); @@ -964,7 +964,7 @@ void Interpolate_allpass_steep_fx( Lacc = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */ Lacc1 = L_deposit_h( temp2 ); #ifdef BASOP_NOGLOB - out_fx[2 * k] = round_fx_o( L_mac_o( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ), &Overflow ); /* Qx format */ + out_fx[2 * k] = round_fx_o( L_mac_o( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ), &Overflow ); /* Qx format */ move16(); mem[2 * ALLPASSSECTIONS_STEEP - 1] = round_fx_o( L_msu_o( Lacc1, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[2 * k], &Overflow ), &Overflow ); /* Qx */ move16(); diff --git a/lib_rend/ivas_allrad_dec.c b/lib_rend/ivas_allrad_dec.c index 448e257a9..6ba37df9e 100644 --- a/lib_rend/ivas_allrad_dec.c +++ b/lib_rend/ivas_allrad_dec.c @@ -292,7 +292,7 @@ ivas_error ivas_sba_get_hoa_dec_matrix_fx( // printf( "\n%f", ((float)*p_dec_mtx)/ ONE_IN_Q25 ); p_dec_mtx++; } - p_dec_mtx += sub( SBA_NHARM_HOA3 , num_harm ); + p_dec_mtx += sub( SBA_NHARM_HOA3, num_harm ); } } @@ -310,7 +310,7 @@ ivas_error ivas_sba_get_hoa_dec_matrix_fx( move32(); p_dec_mtx++; } - p_dec_mtx += sub( SBA_NHARM_HOA3 , num_harm ); + p_dec_mtx += sub( SBA_NHARM_HOA3, num_harm ); } /* free EFAP handle */ diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index a492c7b39..2d737022c 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -3143,7 +3143,7 @@ static ivas_error ivas_rend_crendConvolver( } } - offset = imult1616( hCrend->delay_line_rw_index, subframe_length ); /* subframe_length * ( pCrend->hHrtfCrend->max_num_iterations - 1 ); */ + offset = imult1616( hCrend->delay_line_rw_index, subframe_length ); /* subframe_length * ( pCrend->hHrtfCrend->max_num_iterations - 1 ); */ offset_diffuse = imult1616( hCrend->diffuse_delay_line_rw_index, subframe_length ); /* subframe_length *( pCrend->hHrtfCrend->num_iterations_diffuse[0] - 1 ); */ IF( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index cb6ec1e3d..4c52699c9 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -1412,7 +1412,7 @@ static void ivas_dirac_dec_binaural_internal_fx( q_cldfb[ch][slot] = q_input; move16(); cldfbAnalysis_ts_fx_fixed_q( - &( st_ivas->hTcBuffer->tc_fx[ch][add(imult1616(nBins , slot) , offsetSamples)] ), + &( st_ivas->hTcBuffer->tc_fx[ch][add( imult1616( nBins, slot ), offsetSamples )] ), Cldfb_RealBuffer_in_fx[ch][slot], Cldfb_ImagBuffer_in_fx[ch][slot], nBins, st_ivas->cldfbAnaDec[ch], &q_cldfb[ch][slot] ); @@ -2891,7 +2891,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric e = 0; move16(); hDiracDecBin->frameMeanDiffuseness_fx[bin] = BASOP_Util_Divide3232_Scale( hDiracDecBin->frameMeanDiffuseness_fx[bin], L_max( EPSILLON_FX, frameMeanDiffusenessEneWeight_fx[bin] ), &e ); - hDiracDecBin->frameMeanDiffuseness_fx[bin] = L_shl( hDiracDecBin->frameMeanDiffuseness_fx[bin], add(14 , e) ); // Q29 + hDiracDecBin->frameMeanDiffuseness_fx[bin] = L_shl( hDiracDecBin->frameMeanDiffuseness_fx[bin], add( 14, e ) ); // Q29 move32(); move32(); } @@ -5284,8 +5284,8 @@ static void eig2x2_fx( } } - IF ( q_U_1 != 0 ) - *q_U = q_U_1; + IF( q_U_1 != 0 ) + *q_U = q_U_1; ELSE *q_U = q_U_2; move16(); diff --git a/lib_rend/ivas_dirac_decorr_dec.c b/lib_rend/ivas_dirac_decorr_dec.c index 499573ec4..de0253bb5 100644 --- a/lib_rend/ivas_dirac_decorr_dec.c +++ b/lib_rend/ivas_dirac_decorr_dec.c @@ -954,19 +954,19 @@ void ivas_dirac_dec_decorr_process_fx( /* check handles */ test(); - if( h_freq_domain_decorr_ap_params == NULL || h_freq_domain_decorr_ap_state == NULL ) + if ( h_freq_domain_decorr_ap_params == NULL || h_freq_domain_decorr_ap_state == NULL ) { return; } /* check input data */ - if( input_frame_fx == NULL ) + if ( input_frame_fx == NULL ) { return; } /* check result arrays */ - if( frame_dec_fx == NULL ) + if ( frame_dec_fx == NULL ) { return; } @@ -1046,7 +1046,7 @@ void ivas_dirac_dec_decorr_process_fx( IF( NE_16( q_temp, q_onset_dec ) ) { - FOR( Word16 i = 0; i < imult1616(num_protos_diff , max_band_decorr_temp); i++ ) + FOR( Word16 i = 0; i < imult1616( num_protos_diff, max_band_decorr_temp ); i++ ) { h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2_fx[i] = L_shr( h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2_fx[i], sub( q_onset_dec, q_temp ) ); h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1_fx[i] = L_shr( h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1_fx[i], sub( q_onset_dec, q_temp ) ); @@ -1056,7 +1056,7 @@ void ivas_dirac_dec_decorr_process_fx( } IF( NE_16( q_temp, q_aux_buffer ) ) { - FOR( Word16 i = 0; i < shl( imult1616(num_protos_diff , max_band_decorr_temp),1); i++ ) + FOR( Word16 i = 0; i < shl( imult1616( num_protos_diff, max_band_decorr_temp ), 1 ); i++ ) { aux_buffer_fx[i] = L_shr( aux_buffer_fx[i], sub( q_aux_buffer, q_temp ) ); move32(); @@ -1133,7 +1133,7 @@ void ivas_dirac_dec_decorr_process_fx( q_shift = getScaleFactor32( aux_buffer_fx, imult1616( imult1616( 2, num_protos_dir ), max_band_decorr_temp ) ); - FOR( Word16 j = 0; j < shl( imult1616(num_protos_dir , max_band_decorr_temp),1); j++ ) + FOR( Word16 j = 0; j < shl( imult1616( num_protos_dir, max_band_decorr_temp ), 1 ); j++ ) { aux_buffer_fx[j] = L_shl( aux_buffer_fx[j], q_shift ); move32(); @@ -1293,7 +1293,7 @@ void ivas_dirac_dec_decorr_process_fx( } } - FOR( Word16 i = 0; i < shl(imult1616(num_channels , max_band_decorr),1); i++ ) + FOR( Word16 i = 0; i < shl( imult1616( num_channels, max_band_decorr ), 1 ); i++ ) { aux_buffer_fx[i] = W_extract_h( W_shl( aux_64[i], sub( norm, find_guarded_bits_fx( 2 ) ) ) ); move32(); @@ -1492,13 +1492,13 @@ void ivas_dirac_dec_decorr_close_fx( *-----------------------------------------------------------------*/ test(); - if( ph_freq_domain_decorr_ap_params == NULL || ph_freq_domain_decorr_ap_state == NULL ) + if ( ph_freq_domain_decorr_ap_params == NULL || ph_freq_domain_decorr_ap_state == NULL ) { return; } test(); - if( *ph_freq_domain_decorr_ap_params == NULL || *ph_freq_domain_decorr_ap_state == NULL ) + if ( *ph_freq_domain_decorr_ap_params == NULL || *ph_freq_domain_decorr_ap_state == NULL ) { return; } -- GitLab From be1157fefd7f9c20b3c3c56c39384083438eb548 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 3 Jul 2024 12:22:35 +0530 Subject: [PATCH 029/110] EVS BE fix --- lib_dec/cng_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/cng_dec_fx.c b/lib_dec/cng_dec_fx.c index 09496f8e9..ab41059c5 100644 --- a/lib_dec/cng_dec_fx.c +++ b/lib_dec/cng_dec_fx.c @@ -459,7 +459,7 @@ void CNG_dec_fx( L_tmp = L_mac0( L_tmp, tmpv, tmpv ); /*QX6.5536*/ FOR( j = 0; j < M - 1; j++ ) { - tmpv = sub( sub( lsf_tmp[j - 1], lsf_tmp[j] ), ftmp_fx ); /*QX2.56*/ + tmpv = sub( sub( lsf_tmp[j + 1], lsf_tmp[j] ), ftmp_fx ); /*QX2.56*/ L_tmp = L_mac0( L_tmp, tmpv, tmpv ); /*QX6.5536*/ } -- GitLab From 7978f69067d993c8de0cef0f763ed85245838b4b Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 3 Jul 2024 09:15:16 +0200 Subject: [PATCH 030/110] Increase testcase timeout for sanitizer jobs --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cf4371096..82fc5d2ac 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -18,6 +18,7 @@ variables: PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" TESTCASE_TIMEOUT_STV: 900 TESTCASE_TIMEOUT_LTV: 2400 + TESTCASE_TIMEOUT_STV_SANITIZERS: 1800 MANUAL_PIPELINE_TYPE: description: "Type for the manual pipeline run. Use 'pytest-mld' to run MLD test against reference float codec." # Not implemented yet, but may be good to have a manual pipeline trigger value: 'default' @@ -288,7 +289,7 @@ stages: - make clean - make -j CLANG=$CLANG_NUM - if [[ $CLANG_NUM == 3 ]]; then export UBSAN_OPTIONS="suppressions=scripts/ubsan.supp,report_error_type=1"; fi - - testcase_timeout=$TESTCASE_TIMEOUT_STV + - testcase_timeout=$TESTCASE_TIMEOUT_STV_SANITIZERS - python3 -m pytest $SHORT_TEST_SUITE -v --tb=no --update_ref 1 -m create_ref --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout $testcase_timeout --ref_encoder_path $DUT_ENCODER_PATH --ref_decoder_path $DUT_DECODER_PATH artifacts: name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" -- GitLab From a038b9f180f288764a96bdc5f6785466d89f0dba Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 3 Jul 2024 15:01:23 +0530 Subject: [PATCH 031/110] Fix for issue 788: Distortion between 10k to 20k in fixe point OSBA Mono output [x] Updates made in TCX noise filling and IGF dec with which distortions are reduced. --- lib_dec/dec_tcx_fx.c | 2 +- lib_dec/igf_dec_fx.c | 42 +++++++++++++++++++++--------------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index ca3f1dca6..f521839cd 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -4482,7 +4482,7 @@ void decoder_tcx_noisefilling_fx( #else if ( st->igf ) { - pInfoTCXNoise = st->hIGFDec->infoTCXNoise_evs; + pInfoTCXNoise = st->hIGFDec->infoTCXNoise_ptr; move16(); } #endif diff --git a/lib_dec/igf_dec_fx.c b/lib_dec/igf_dec_fx.c index 8d846a794..cdcdfab1f 100644 --- a/lib_dec/igf_dec_fx.c +++ b/lib_dec/igf_dec_fx.c @@ -3507,12 +3507,12 @@ void IGFDecApplyMono_ivas( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in /*14 seems to be precise enough*/ hPrivateData->headroom_TCX_noise_white = IGF_getScaleFactor32Cond( - hInstance->infoTCXNoise_evs + hGrid->minSrcSubband, + hInstance->infoTCXNoise_ptr, igf_spec + hGrid->minSrcSubband, sub( hGrid->startLine, hGrid->minSrcSubband ) ); hPrivateData->n_noise_bands = IGF_replaceTCXNoise_1( igf_spec, hPrivateData->headroom_TCX_noise_white, - hInstance->infoTCXNoise_evs, + hInstance->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, &hPrivateData->totalNoiseNrg ); @@ -3529,13 +3529,13 @@ void IGFDecApplyMono_ivas( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in IF( EQ_16( hPrivateData->currWhiteningLevel[i], IGF_WHITENING_OFF ) ) { hPrivateData->headroom_TCX_noise = IGF_getScaleFactor32Cond( - hInstance->infoTCXNoise_evs + hGrid->minSrcSubband, + hInstance->infoTCXNoise_ptr, hPrivateData->pSpecFlat + hGrid->minSrcSubband, sub( hGrid->startLine, hGrid->minSrcSubband ) ); hPrivateData->n_noise_bands_off = IGF_replaceTCXNoise_1( hPrivateData->pSpecFlat, hPrivateData->headroom_TCX_noise, - hInstance->infoTCXNoise_evs, + hInstance->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, &hPrivateData->totalNoiseNrg_off ); @@ -3546,7 +3546,7 @@ void IGFDecApplyMono_ivas( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in IGF_prep_ivas( hPrivateData, igfGridIdx, - hInstance->infoTCXNoise_evs, + hInstance->infoTCXNoise_ptr, igf_spec, igf_spec_e, hPrivateData->pSpecFlat, @@ -3574,11 +3574,11 @@ void IGFDecApplyMono_ivas( const IGF_DEC_INSTANCE_HANDLE hInstance, /**< in /* reset TCX noise indicator vector */ IF( EQ_16( igfGridIdx, IGF_GRID_LB_SHORT ) ) { - set16_fx( hInstance->infoTCXNoise_evs, 0, IGF_START_MX / 2 ); + set16_fx( hInstance->infoTCXNoise_ptr, 0, IGF_START_MX / 2 ); } ELSE { - set16_fx( hInstance->infoTCXNoise_evs, 0, IGF_START_MX ); + set16_fx( hInstance->infoTCXNoise_ptr, 0, IGF_START_MX ); } } @@ -3726,12 +3726,12 @@ void IGFDecApplyStereo( move16(); } - hPrivateDataL->headroom_TCX_noise_white = IGF_getScaleFactor32Cond( hIGFDecL->infoTCXNoise_evs + hGrid->minSrcSubband, + hPrivateDataL->headroom_TCX_noise_white = IGF_getScaleFactor32Cond( hIGFDecL->infoTCXNoise_ptr + hGrid->minSrcSubband, igf_specL_fx + hGrid->minSrcSubband, sub( hGrid->startLine, hGrid->minSrcSubband ) ); hPrivateDataL->n_noise_bands = IGF_replaceTCXNoise_1( igf_specL_fx, hPrivateDataL->headroom_TCX_noise_white, - hIGFDecL->infoTCXNoise_evs, + hIGFDecL->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataL->totalNoiseNrg ); @@ -3758,12 +3758,12 @@ void IGFDecApplyStereo( move16(); } - hPrivateDataR->headroom_TCX_noise_white = IGF_getScaleFactor32Cond( hIGFDecR->infoTCXNoise_evs + hGrid->minSrcSubband, + hPrivateDataR->headroom_TCX_noise_white = IGF_getScaleFactor32Cond( hIGFDecR->infoTCXNoise_ptr, igf_specR_fx + hGrid->minSrcSubband, sub( hGrid->startLine, hGrid->minSrcSubband ) ); hPrivateDataR->n_noise_bands = IGF_replaceTCXNoise_1( igf_specR_fx, hPrivateDataR->headroom_TCX_noise_white, - hIGFDecR->infoTCXNoise_evs, + hIGFDecR->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataR->totalNoiseNrg ); @@ -3778,23 +3778,23 @@ void IGFDecApplyStereo( test(); IF( EQ_16( hPrivateDataL->currWhiteningLevel[i], IGF_WHITENING_OFF ) || EQ_16( hPrivateDataR->currWhiteningLevel[i], IGF_WHITENING_OFF ) ) { - hPrivateDataL->headroom_TCX_noise_white = IGF_getScaleFactor32Cond( hIGFDecL->infoTCXNoise_evs + hGrid->minSrcSubband, + hPrivateDataL->headroom_TCX_noise_white = IGF_getScaleFactor32Cond( hIGFDecL->infoTCXNoise_ptr + hGrid->minSrcSubband, hPrivateDataL->pSpecFlat + hGrid->minSrcSubband, sub( hGrid->startLine, hGrid->minSrcSubband ) ); hPrivateDataL->n_noise_bands_off = IGF_replaceTCXNoise_1( hPrivateDataL->pSpecFlat, hPrivateDataL->headroom_TCX_noise_white, - hIGFDecL->infoTCXNoise_evs, + hIGFDecL->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataL->totalNoiseNrg_off ); hPrivateDataL->totalNoiseNrg_off_exp = shl( sub( hPrivateDataL->pSpecFlat_exp, sub( hPrivateDataL->headroom_TCX_noise_white, 5 ) ), 1 ); - hPrivateDataR->headroom_TCX_noise_white = IGF_getScaleFactor32Cond( hIGFDecR->infoTCXNoise_evs + hGrid->minSrcSubband, + hPrivateDataR->headroom_TCX_noise_white = IGF_getScaleFactor32Cond( hIGFDecR->infoTCXNoise_ptr, hPrivateDataR->pSpecFlat + hGrid->minSrcSubband, sub( hGrid->startLine, hGrid->minSrcSubband ) ); hPrivateDataR->n_noise_bands_off = IGF_replaceTCXNoise_1( hPrivateDataR->pSpecFlat, hPrivateDataR->headroom_TCX_noise_white, - hIGFDecR->infoTCXNoise_evs, + hIGFDecR->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataR->totalNoiseNrg_off ); @@ -3818,8 +3818,8 @@ void IGFDecApplyStereo( IGF_prepStereo( hPrivateDataL, hPrivateDataR, igfGridIdx, - hIGFDecL->infoTCXNoise_evs, - hIGFDecR->infoTCXNoise_evs, + hIGFDecL->infoTCXNoise_ptr, + hIGFDecR->infoTCXNoise_ptr, igf_specL_fx, igf_specL_e_arr, igf_specR_fx, @@ -3887,13 +3887,13 @@ void IGFDecApplyStereo( /* reset TCX noise indicator vector */ IF( EQ_16( igfGridIdx, IGF_GRID_LB_SHORT ) ) { - set16_fx( hIGFDecL->infoTCXNoise_evs, 0, IGF_START_MX / 2 ); - set16_fx( hIGFDecR->infoTCXNoise_evs, 0, IGF_START_MX / 2 ); + set16_fx( hIGFDecL->infoTCXNoise_ptr, 0, IGF_START_MX / 2 ); + set16_fx( hIGFDecR->infoTCXNoise_ptr, 0, IGF_START_MX / 2 ); } ELSE { - set16_fx( hIGFDecL->infoTCXNoise_evs, 0, IGF_START_MX ); - set16_fx( hIGFDecR->infoTCXNoise_evs, 0, IGF_START_MX ); + set16_fx( hIGFDecL->infoTCXNoise_ptr, 0, IGF_START_MX ); + set16_fx( hIGFDecR->infoTCXNoise_ptr, 0, IGF_START_MX ); } return; -- GitLab From 44f7c969f0972eb7f93590fc38b6ef0b98507cd2 Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Wed, 3 Jul 2024 14:34:12 -0400 Subject: [PATCH 032/110] fix for #802/#1137, to ensure GSC float and fixed point have the same bit allocation --- lib_com/gs_bitallocation_ivas_fx.c | 318 ++++++++++++++++++++++++++++- lib_com/options.h | 3 +- 2 files changed, 317 insertions(+), 4 deletions(-) diff --git a/lib_com/gs_bitallocation_ivas_fx.c b/lib_com/gs_bitallocation_ivas_fx.c index 73cf88295..689fbdfaf 100644 --- a/lib_com/gs_bitallocation_ivas_fx.c +++ b/lib_com/gs_bitallocation_ivas_fx.c @@ -13,6 +13,35 @@ #include "stl.h" static void reajust_bits_fx( Word32 *bits_per_bands, const Word16 st_band, const Word16 end_band, const Word16 sum_bit_in, const Word16 bit_bdgt_in ); + +#ifdef FIX_802_1137_1137_GSC_IVAS_FXFLT_DECODING +/*-------------------------------------------------------------------* + * Local constants + *-------------------------------------------------------------------*/ +#define Q15_0_33 10922 /* 0.33 */ +#define Q18_0_1 26214 /* 0.1 */ +#define Q18_0_50 131072 /* 0.50 */ +#define Q18_0_75 196608 /* 0.75 */ +#define Q18_0_76 199229 /* 76/100 */ +#define Q18_1_0 262144 /* 1.0 */ +#define Q18_1_2 314573 /* 1.2 */ +#define Q18_112 29360128 /* 112 */ +#define Q18_DSR_NB_PULSE 1179648 /* 4.5 */ +#define Q18_1_5xDSR_NB_PULSE 1769472 /* 1.5x4.5 */ +#define Q18_2_0xDSR_NB_PULSE ( Q18_DSR_NB_PULSE << 1 ) /* 2.0x4.5 */ + +#define Q31_0_00125 2684355 /* 0.125/100 */ +#define Q31_0_0125 26843546 /* 0.0125 */ +#define Q31_0_015 32212255 /* 0.0125 */ +#define Q31_0_02 42949673 /* 0.02 */ +#define Q31_0_17 365072220 /* 0.17 */ +#define Q31_0_23 493921239 /* 0.23 */ +/*-----------------------------------------------------------------* + * Local functions + *-----------------------------------------------------------------*/ +static Word16 Find_norm_inv( const Word32 ToDivide, Word16 *e_div ); +static Word16 Find_bit_alloc_IVAS( const Word32 core_brate, const Word16 GSC_IVAS_mode, const Word16 Diff_len, const Word16 nb_tot_bands, Word16 *bit, Word16 *max_ener_band, Word16 *ener_vec, Word32 *bits_per_bands ); +#endif #ifdef FIX_802__NON_BE_DECODING static Word32 Find_bit_frac( const Word16 nb_band, const Word16 remaining_bits ); #endif @@ -83,11 +112,9 @@ void bands_and_bit_alloc_ivas_fx( Word32 bits_per_bands[MBANDS_GN_BITALLOC16k]; // Q18 Word16 w_sum_bit; Word16 fzero_val; +#ifndef FIX_802_1137_1137_GSC_IVAS_FXFLT_DECODING Word32 mp, mb, nb_bands_adj, bit_adj; Word16 nb_pulse_per_band[MBANDS_GN_BITALLOC16k]; -#ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING - (void) GSC_IVAS_mode; - (void) element_mode; #endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; @@ -218,6 +245,7 @@ void bands_and_bit_alloc_ivas_fx( { IF( GSC_IVAS_mode > 0 ) { +#ifndef FIX_802_1137_1137_GSC_IVAS_FXFLT_DECODING SWB_bit_budget = *bit; // Q0 st_band = 5; @@ -423,6 +451,10 @@ void bands_and_bit_alloc_ivas_fx( bits_per_bands[i] += sum_bit; } } +#else + nb_tot_bands = Find_bit_alloc_IVAS( core_brate, GSC_IVAS_mode, Diff_len, nb_tot_bands, bit, max_ener_band, ener_vec, bits_per_bands ); + nb_bands = nb_tot_bands; +#endif } ELSE #endif @@ -1081,5 +1113,285 @@ static Word32 Find_bit_frac( return ( L_out ); } #endif +#ifdef FIX_802_1137_1137_GSC_IVAS_FXFLT_DECODING +static Word16 Find_bit_alloc_IVAS( /*o: Number of band to encode */ + const Word32 core_brate, /* i : core bit rate */ + const Word16 GSC_IVAS_mode, /* i : GSC IVAS mode */ + const Word16 Diff_len, /* i : Length of the difference signal (before pure spectral)*/ + const Word16 nb_tot_bands_in, /* i : total number of band */ + Word16 *bit, /* i/o: Number of bit allowed for frequency quantization */ + Word16 *max_ener_band, /* i/o: Energy based sorted order */ + Word16 *ener_vec, /* i/o: Energy per band order */ + Word32 *bits_per_bands /* o : Number of bit allowed per allowed subband Q3 */ +) +{ + Word32 mp, mb, nb_bands_adj, bit_adj; + Word16 nb_pulse_per_band[MBANDS_GN_BITALLOC16k]; + Word32 SWB_bit_budget; // Q0 -> Q18 + Word16 i, j, nb_bands_max, st_band, nb_tot_bands_loc, etmp; + Word32 sum_bit /*Q18*/, bit_fracf /*Q18*/; + Word16 d_tmp, e_div, tmp16; + Word32 Ltmp, etmp_32fx; + + SWB_bit_budget = *bit; // Q0 + st_band = 5; + nb_bands_max = nb_tot_bands_in; + + move16(); + move16(); + move16(); + + set32_fx( bits_per_bands, 0, MBANDS_GN_BITALLOC16k ); + + /* Decide the percentage of bits allocated to LF (between 50-75%) depending of the temporal contribution in GSC */ + /* bit_fracf = ( -0.125f * Diff_len + 76.0f ) / 100; */ + bit_fracf = L_add( Mpy_32_32( -Q31_0_00125, L_shl( Diff_len, Q18 ) ), Q18_0_76 ); /* Q18 */ + + /* bit_fracf = check_bounds(bit_fracf, 0.50f, 0.75f); */ + bit_fracf = check_bounds_l( bit_fracf, Q18_0_50, Q18_0_75 ); /* Q18 */ + + /* Adjustment of the bitrate between LF and HF base on the content type */ + /* 1 = new GSC bit alloc + 2 = GSC bit alloc for tc frame + 3 = more music like (should not happen often given music is coded with dft) */ + + if ( LE_16( GSC_IVAS_mode, 3 ) ) + { + nb_bands_max = sub( nb_bands_max, 6 ); + } + IF( EQ_16( GSC_IVAS_mode, 2 ) ) + { + /* bit_fracf += 0.1f; */ + bit_fracf = L_add( bit_fracf, Q18_0_1 ); /* Q18*/ + nb_bands_max = sub( nb_bands_max, 1 ); + } + IF( EQ_16( GSC_IVAS_mode, 3 ) ) + { + /* bit_fracf -= 0.1f; */ + bit_fracf = L_sub( bit_fracf, Q18_0_1 ); /* Q18*/ + nb_bands_max = add( nb_bands_max, 3 ); + } + + /* First find how much we want to share between LF and HF, at low bitrate, a miminum of bits is needed in LF by limitating the number of bands*/ + /* Adjust the number of band based on the content type and bitrate */ + + /* nb_bands_adj = 1.0f; */ + nb_bands_adj = Q18_1_0; + move32(); + IF( EQ_16( GSC_IVAS_mode, 1 ) && LT_32( core_brate, GSC_L_RATE_STG ) ) + { + /* nb_bands_adj = 0.0125f * SWB_bit_budget - 0.75f;*/ + nb_bands_adj = L_sub( Mpy_32_32( Q31_0_0125, L_shl( SWB_bit_budget, Q18 ) ), Q18_0_75 ); // Q18 + } + ELSE IF( NE_16( GSC_IVAS_mode, 2 ) && GT_32( core_brate, GSC_H_RATE_STG ) ) + { + /*nb_bands_adj = 0.02f * SWB_bit_budget - 1.2f;*/ + nb_bands_adj = L_sub( Mpy_32_32( Q31_0_02, L_shl( SWB_bit_budget, Q18 ) ), Q18_1_2 ); // Q18 + } + /*nb_bands_max = (int16_t)(nb_bands_max * nb_bands_adj + 0.5f);*/ + + nb_bands_max = round_fx( Mpy_32_16_1( L_shl( nb_bands_adj, 5 ), shl( nb_bands_max, 10 - 2 ) ) ); /* Q0 */ + nb_bands_max = check_bounds_s( nb_bands_max, 5, nb_tot_bands_in ); + + /* bit_fracf *= SWB_bit_budget;*/ + + /* At this point bit_fracf has a value below 1.0 */ + bit_fracf = Mpy_32_16_1( L_shl( bit_fracf, 10 ), extract_l( L_shl( SWB_bit_budget, 5 ) ) ); /* (Q(18+10)*Q(0+5) + 1 - 16 = Q18 */ + + /* Estimation of the number of bit used in HF */ + /* with only the first weighting The number of bits in max_ener_band[st_band-1] = 17% of bit_fracf */ + /* mb = .17f * bit_fracf;*/ + mb = Mpy_32_32( Q31_0_17, bit_fracf ); /* Q18 */ + + /* mp = 2 * DSR_NB_PULSE;*/ + mp = Q18_2_0xDSR_NB_PULSE; + move32(); + + test(); + IF( LT_32( core_brate, GSC_L_RATE_STG ) && EQ_16( GSC_IVAS_mode, 3 ) ) + { + /* mp = 1.5f * DSR_NB_PULSE;*/ + mp = Q18_1_5xDSR_NB_PULSE; + move32(); + } + ELSE IF( LT_32( core_brate, GSC_L_RATE_STG ) ) + { + /* mp = DSR_NB_PULSE;*/ + mp = Q18_DSR_NB_PULSE; + move32(); + } + + /* We want max_ener_band[st_band] <= max_ener_band[st_band-1] and max_ener_band[nb_bands_max-1] <= max_ener_band[st_band]*/ + /* We will estimate the number of bits to allocate of HF and put the remaining bits, if any, back on LF */ + /* compute the total possible number of band to be coded */ + + /* nb_tot_bands = (int16_t)((SWB_bit_budget - bit_fracf) / (mp + (mb - mp) / 2.0f)); */ + d_tmp = Find_norm_inv( L_add( mp, mb ), &e_div ); + Ltmp = Mpy_32_16_1( L_sub( L_shl( SWB_bit_budget, Q18 ), bit_fracf ), d_tmp ); /* Perform mult by 1/den */ + nb_tot_bands_loc = extract_h( L_shl( Ltmp, sub( 1, e_div ) ) ); /* adjust exponent: 1 is to take into account the / 2.0f, and e_div for the num and den of the division*/ + mp = L_min( mp, mb ); + + tmp16 = sub( add( nb_tot_bands_loc, st_band ), nb_bands_max ); + IF( tmp16 > 0 ) + { + /* bit_adj = ( ( mb + mp ) / 2 ) * ( nb_tot_bands_loc + st_band - nb_bands_max ); */ + bit_adj = Mpy_32_16_1( L_shl( L_add( mb, mp ), 5 ), shl( tmp16, 10 - 1 ) ); /* Q18+5 * Q0+10 + 1 -1 - 16 = Q18 (-1 is to cover for the /2 in the equation) */ + bit_adj = L_max( 0, bit_adj ); + nb_tot_bands_loc = sub( nb_bands_max, st_band ); + /* bit_fracf += bit_adj; */ + bit_fracf = L_add( bit_fracf, bit_adj ); /* Q18 */ + } + nb_tot_bands_loc = add( nb_tot_bands_loc, st_band ); + + /* Allocate bits to LF */ + /* etmp = 0.23f; */ + etmp_32fx = Q31_0_23; + move32(); + FOR( j = 0; j < st_band; j++ ) + { + i = j; + move16(); + max_ener_band[j] = i; + move16(); + ener_vec[i] = MIN16B; + move16(); + /* bits_per_bands[j] = etmp * bit_fracf; */ + bits_per_bands[j] = Mpy_32_32( bit_fracf, etmp_32fx ); /* 18 + 31 + 1 - 32 = Q18 */ + move32(); + /* etmp -= 0.015f; */ + etmp_32fx = L_sub( etmp_32fx, Q31_0_015 ); /* Q18 */ + } + + /* SWB_bit_budget -= bit_fracf; */ + SWB_bit_budget = L_sub( L_shl( SWB_bit_budget, Q18 ), bit_fracf ); /* Q0->Q18 */ + /* Find low energy band in HF */ + set16_fx( nb_pulse_per_band, 2, MBANDS_GN_BITALLOC16k ); + FOR( i = st_band + 2; i < nb_tot_bands_loc - 1; i++ ) + { + test(); + if ( LT_16( ener_vec[i], ener_vec[i - 1] ) && LT_16( ener_vec[i], ener_vec[i + 1] ) ) /* i +1 and i -1 can be considered as 2 ptrs */ + { + nb_pulse_per_band[i] = 1; + move16(); + } + } + FOR( j = st_band; j < nb_tot_bands_loc; j++ ) + { + IF( GT_16( j, 6 ) ) + { + i = maximum_fx( ener_vec, nb_tot_bands_loc, &etmp ); + } + ELSE + { + i = j; + move16(); + } + max_ener_band[j] = i; + move16(); + ener_vec[i] = MIN16B; + move16(); + } + + /* Recompute the final bit distribution for HF */ + IF( GT_16( nb_tot_bands_loc, st_band ) ) + { + /* mb = ( SWB_bit_budget * 2 / ( nb_tot_bands_loc - st_band ) ) - mp; */ + /* bit_fracf = ( mb - mp ) / ( nb_tot_bands_loc - st_band ); */ + /* This is not bit exact because of the precision lost */ + + /* mb = ( SWB_bit_budget * 2 / ( nb_tot_bands_loc - st_band ) ) - mp; */ + d_tmp = Find_norm_inv( L_deposit_h( sub( nb_tot_bands_loc, st_band ) ), &e_div ); + mb = L_sub( L_shr( Mpy_32_16_1( L_shl( SWB_bit_budget, 1 ), d_tmp ), e_div ), mp ); /* Q18 */ + + /* bit_fracf = ( mb - mp ) / ( nb_tot_bands_loc - st_band ); */ + bit_fracf = L_shr( Mpy_32_16_1( L_sub( mb, mp ), d_tmp ), e_div ); /* Q18 */ + + mb = L_sub( mb, bit_fracf ); + /* Do the distribution */ + FOR( j = st_band; j < nb_tot_bands_loc; j++ ) + { + bits_per_bands[max_ener_band[j]] = Q18_DSR_NB_PULSE; + move32(); + if ( GT_16( nb_pulse_per_band[max_ener_band[j]], 1 ) ) + { + bits_per_bands[max_ener_band[j]] = mb; + move32(); + } + mb = L_sub( mb, bit_fracf ); + SWB_bit_budget = L_sub( SWB_bit_budget, bits_per_bands[max_ener_band[j]] ); // Q18 + } + } + + /* Series of verification in case bit allocated != the budget */ + IF( SWB_bit_budget > 0 ) + { + i = sub( st_band, 1 ); + WHILE( SWB_bit_budget > 0 ) + { + /* bits_per_bands[i]++; */ + bits_per_bands[i] = L_add( bits_per_bands[i], Q18_1_0 ); + move32(); + /* SWB_bit_budget--; */ + SWB_bit_budget = L_sub( SWB_bit_budget, Q18_1_0 ); + i--; + if ( EQ_16( i, -1 ) ) + { + i = sub( st_band, 1 ); + } + } + } + + /*nb_bands = nb_tot_bands_loc;*/ + + sum_bit = 0; + move32(); + j = 0; + move16(); + FOR( i = 0; i < nb_tot_bands_loc; i++ ) + { + /* if (bits_per_bands[i] > 112) */ + IF( GT_32( bits_per_bands[i], Q18_112 ) ) + { + /* sum_bit += bits_per_bands[i] - 112; */ + sum_bit = L_add( sum_bit, L_sub( bits_per_bands[i], Q18_112 ) ); + /* bits_per_bands[i] = 112; */ + bits_per_bands[i] = Q18_112; + move32(); + j = add( j, add( i, 1 ) ); + } + + /* safety check for overage bit reallocation */ + /* else if (bits_per_bands[i] + sum_bit / 3 > 112) */ + ELSE IF( GT_32( L_add( bits_per_bands[i], Mpy_32_16_1( sum_bit, Q15_0_33 ) ), Q18_112 ) ) + { + j = add( j, add( i, 1 ) ); + } + } + + IF( sum_bit != 0 ) + { + /* sum_bit /= (nb_bands - j); */ + d_tmp = Find_norm_inv( L_deposit_h( sub( nb_tot_bands_loc, j ) ), &e_div ); + sum_bit = L_shr( Mpy_32_16_1( sum_bit, d_tmp ), e_div ); /* Q18 */ + FOR( i = j; i < nb_tot_bands_loc; i++ ) + { + bits_per_bands[i] = L_add( bits_per_bands[i], sum_bit ); + move32(); + } + } + return nb_tot_bands_loc; +} + +static Word16 Find_norm_inv( const Word32 ToDivide, Word16 *e_div ) /* Find normalized 1 / ToDivide */ +{ + Word16 d_tmp, e_tmp; + e_tmp = norm_l( ToDivide ); + d_tmp = round_fx( L_shl( ToDivide, e_tmp ) ); + d_tmp = div_s( 16384, d_tmp ); /* 1.0 in Q14, dividend is normalize so >= 16384 as required for the division */ + *e_div = sub( 14, e_tmp ); + move16(); + return d_tmp; +} +#endif #endif diff --git a/lib_com/options.h b/lib_com/options.h index d9e3c29f4..7a446867d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -150,7 +150,8 @@ #define FIX_798_WRONG_CPY_OF_PITCH /* The copy of the pitch from primary to secondary channel was wrong AND safety check was really wrong */ #define FIX_800_PROPOSAL_HB_LPC_COEFFICIENT /* Proposal to fix wrong shape of TDBWE, #800 */ -#define FIX_802__NON_BE_DECODING /* Fix possible difference float and fixed point when computing the GSC bit allocation */ +#define FIX_802__NON_BE_DECODING /* Fix possible difference float and fixed point when computing the GSC bit allocation */ +#define FIX_802_1137_1137_GSC_IVAS_FXFLT_DECODING /* VA: ISSUES 802 and 1137 Made sure that float and fixed point GCS bit allocation is the same during IVAS modes */ /* ################## End DEVELOPMENT switches ######################### */ -- GitLab From bc7529bb9fe5e810021b72325a590ccd6c0bd7a2 Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Wed, 3 Jul 2024 14:47:03 -0400 Subject: [PATCH 033/110] fix clang format --- lib_com/gs_bitallocation_ivas_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/gs_bitallocation_ivas_fx.c b/lib_com/gs_bitallocation_ivas_fx.c index 689fbdfaf..107236eb6 100644 --- a/lib_com/gs_bitallocation_ivas_fx.c +++ b/lib_com/gs_bitallocation_ivas_fx.c @@ -454,7 +454,7 @@ void bands_and_bit_alloc_ivas_fx( #else nb_tot_bands = Find_bit_alloc_IVAS( core_brate, GSC_IVAS_mode, Diff_len, nb_tot_bands, bit, max_ener_band, ener_vec, bits_per_bands ); nb_bands = nb_tot_bands; -#endif +#endif } ELSE #endif -- GitLab From 567b85c3402bed6180fbdbe44d2faf9770fb6e15 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 4 Jul 2024 11:34:47 +0530 Subject: [PATCH 034/110] Fix for LTV crash issues observed with OMASA format after BASOP changes [x] Fix for ltv-OMASA 1Dir2TC 3ISM at br sw techs 13.2 to 512 kbps start 24.4 kbps, 32kHz in, 48kHz out, 5.1.4 out crash. --- lib_dec/ivas_stereo_td_dec.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_stereo_td_dec.c b/lib_dec/ivas_stereo_td_dec.c index 129857e0d..83b6d67a4 100644 --- a/lib_dec/ivas_stereo_td_dec.c +++ b/lib_dec/ivas_stereo_td_dec.c @@ -151,13 +151,22 @@ void tdm_configure_dec( Word16 mod_ct, core, bits_offset; Word16 idx_LRTD_pri_side, tdm_inst_ratio_idx; Word32 element_brate_adapt; - Word16 bstr_last_pos; + Word16 bstr_last_pos, temp; hStereoTD = hCPE->hStereoTD; sts = hCPE->hCoreCoder; element_brate_adapt = L_add( hCPE->element_brate, hCPE->brate_surplus ); - bstr_last_pos = add( sub( div_l( hCPE->element_brate, FRAMES_PER_SEC / 2 ), nb_bits_metadata ), div_l( hCPE->brate_surplus, FRAMES_PER_SEC / 2 ) ); + + IF( hCPE->brate_surplus < 0 ) + { + temp = extract_l( L_negate( Mpy_32_32( L_abs( hCPE->brate_surplus ), ONE_BY_FRAMES_PER_SEC_Q31 ) ) ); + } + ELSE + { + temp = extract_l( Mpy_32_32( hCPE->brate_surplus, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + } + bstr_last_pos = add( sub( div_l( hCPE->element_brate, FRAMES_PER_SEC / 2 ), nb_bits_metadata ), temp ); /*----------------------------------------------------------------* * Decode CoreCoder signaling -- GitLab From 6b6701f4736531481642c839533753d08416d941 Mon Sep 17 00:00:00 2001 From: norvell Date: Thu, 4 Jul 2024 06:08:44 +0000 Subject: [PATCH 035/110] Set GIT_CLEAN_FLAGS: -ffdxq --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index eea65d629..7e6dc41ad 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,6 +19,7 @@ variables: TESTCASE_TIMEOUT_STV: 900 TESTCASE_TIMEOUT_LTV: 2400 TESTCASE_TIMEOUT_STV_SANITIZERS: 1800 + GIT_CLEAN_FLAGS: -ffdxq MANUAL_PIPELINE_TYPE: description: "Type for the manual pipeline run. Use 'pytest-mld' to run MLD test against reference float codec." # Not implemented yet, but may be good to have a manual pipeline trigger value: 'default' -- GitLab From b2876d944cc18a6bed1dd3fa218124034c567b47 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 4 Jul 2024 11:56:48 +0530 Subject: [PATCH 036/110] BASOP and instrumentation changes for lib_com, lib_rend modules files --- lib_com/ari_hm_fx.c | 14 +- lib_com/arith_coder.c | 6 +- lib_com/arith_coder_fx.c | 3 + lib_com/basop_tcx_utils.c | 3 +- lib_com/bitalloc.c | 3 + lib_com/bitalloc_fx.c | 36 +- lib_com/ivas_cnst.h | 1 + lib_com/ivas_prot_fx.h | 18 + lib_com/lerp.c | 128 ++- lib_com/log2.c | 6 +- lib_com/logqnorm_fx.c | 9 +- lib_com/low_rate_band_att_fx.c | 10 +- lib_com/lpc_tools.c | 22 +- lib_com/lpc_tools_fx.c | 74 +- lib_com/lsf_dec_bfi_fx.c | 6 +- lib_com/lsf_msvq_ma_fx.c | 3 +- lib_com/lsf_tools.c | 150 +-- lib_com/prot.h | 11 - lib_com/tools.c | 108 +- lib_com/tools_fx.c | 201 +++- lib_com/trans_direct_fx.c | 34 +- lib_dec/ivas_dirac_dec.c | 2 +- lib_dec/ivas_init_dec.c | 8 +- lib_dec/ivas_ism_dec.c | 2 +- lib_dec/pit_dec.c | 2 + lib_rend/ivas_allrad_dec.c | 6 +- lib_rend/ivas_dirac_output_synthesis_dec.c | 1071 ++++++++++-------- lib_rend/ivas_dirac_rend.c | 1171 +++++++++++--------- lib_rend/ivas_efap.c | 686 ++++++++---- lib_rend/ivas_hrtf.c | 4 +- lib_rend/ivas_limiter.c | 200 ++-- lib_rend/ivas_masa_merge.c | 255 +++-- lib_rend/ivas_prot_rend.h | 108 +- lib_rend/ivas_stat_rend.h | 48 +- lib_rend/lib_rend.c | 20 +- 35 files changed, 2647 insertions(+), 1782 deletions(-) diff --git a/lib_com/ari_hm_fx.c b/lib_com/ari_hm_fx.c index e7032468b..425823d27 100644 --- a/lib_com/ari_hm_fx.c +++ b/lib_com/ari_hm_fx.c @@ -35,7 +35,7 @@ void UnmapIndex( *FractionalResolution = kLtpHmFractionalResolution; move16(); - *Lag = L_shr( L_mult0( LtpPitchLag, Ratios_fx[Bandwidth][LtpPitchIndex][Multiplier - 1] ), 8 ); + *Lag = L_shr( L_mult0( LtpPitchLag, Ratios_fx[Bandwidth][LtpPitchIndex][sub( Multiplier, 1 )] ), 8 ); move32(); } ELSE @@ -75,6 +75,7 @@ void UnmapIndex( } } *Lag = L_deposit_l( Lag16 ); + move32(); } } @@ -95,7 +96,7 @@ void ConfigureContextHm( Bandwidth = 0; move16(); - IF( GE_16( NumCoeffs, 256 ) ) + if ( GE_16( NumCoeffs, 256 ) ) { Bandwidth = 1; move16(); @@ -104,7 +105,7 @@ void ConfigureContextHm( SmallerLags = 0; move16(); test(); - IF( ( LE_16( TargetBits, kSmallerLagsTargetBitsThreshold ) ) || ( Bandwidth == 0 ) ) + if ( ( LE_16( TargetBits, kSmallerLagsTargetBitsThreshold ) ) || ( Bandwidth == 0 ) ) { SmallerLags = 1; move16(); @@ -134,6 +135,7 @@ void ConfigureContextHm( } } hm_cfg->numPeakIndices = (Word16) ( tmp - hm_cfg->indexBuffer ); + move16(); /* Set up and fill holeIndices */ hm_cfg->holeIndices = hm_cfg->indexBuffer + hm_cfg->numPeakIndices; @@ -161,6 +163,7 @@ void ConfigureContextHm( } } hm_cfg->numHoleIndices = (Word16) ( tmp - hm_cfg->holeIndices ); + move16(); *tmp++ = NumCoeffs; move16(); /* Add extremal element signaling the end of the buffer */ } @@ -186,7 +189,7 @@ Word16 CountIndexBits( } -int tcx_hm_render( +Word32 tcx_hm_render( Word32 lag, /* i: pitch lag Q0 */ Word16 fract_res, /* i: fractional resolution of the lag Q0 */ Word16 p[] /* o: harmonic model Q13 */ @@ -231,6 +234,7 @@ int tcx_hm_render( FOR( k = 1; k <= kTcxHmParabolaHalfWidth; ++k ) { p[kTcxHmParabolaHalfWidth + k] = round_fx( Mpy_32_16_1( BASOP_Util_InvLog2( L_shl( L_mult0( i_mult2( negate( k ), k ), tmp ), 10 ) ), height ) ); + move16(); } /* Mirror */ FOR( k = -kTcxHmParabolaHalfWidth; k < 0; ++k ) @@ -279,7 +283,7 @@ void tcx_hm_modify_envelope( l2 = s_min( add( k, kTcxHmParabolaHalfWidth ), L_frame_m1 ); FOR( x = l1; x <= l2; ++x ) { - env[x] = Mpy_32_16_1( env[x], inv_shape[x - k + kTcxHmParabolaHalfWidth] ); + env[x] = Mpy_32_16_1( env[x], inv_shape[add( sub( x, k ), kTcxHmParabolaHalfWidth )] ); move32(); } diff --git a/lib_com/arith_coder.c b/lib_com/arith_coder.c index 58729a004..08c972ea9 100644 --- a/lib_com/arith_coder.c +++ b/lib_com/arith_coder.c @@ -168,11 +168,11 @@ void powfp_odd2_evs( h = shl( 1, k ); /* highest bit of exp2 */ out2 = base; move16(); - out = mult_r( out, pows[k + 1] ); /* we already know that "exp" has the highest bit set to one since we calculated .. */ + out = mult_r( out, pows[add( k, 1 )] ); /* we already know that "exp" has the highest bit set to one since we calculated .. */ /* .. the effective length of "exp" earlier on, thus we omit the branch for out2 */ if ( s_and( exp2, h ) != 0 ) { - out2 = mult_r( out2, pows[k + 1] ); + out2 = mult_r( out2, pows[add( k, 1 )] ); } h = shr( h, 1 ); @@ -315,7 +315,7 @@ void tcx_arith_scale_envelope_flt( IF( tmp <= 0 ) { tmp = 0; - + move16(); FOR( k = 0; k < L_frame; k++ ) { s_env[k] = 0; diff --git a/lib_com/arith_coder_fx.c b/lib_com/arith_coder_fx.c index 69d646406..54533aaca 100644 --- a/lib_com/arith_coder_fx.c +++ b/lib_com/arith_coder_fx.c @@ -196,6 +196,7 @@ void tcx_arith_scale_envelope( Word16 mean_e, tmp, tmp2; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif @@ -264,6 +265,7 @@ void tcx_arith_scale_envelope( IF( tmp <= 0 ) { tmp = 0; + move16(); set16_fx( s_env, 0, L_frame ); } ELSE @@ -429,6 +431,7 @@ void tcx_arith_scale_envelope( L_tmp = Mpy_32_16_1( L_shl( env[k], tmp ), iscale ); L_tmp = L_min( L_tmp, a ); s_env[k] = round_fx( L_tmp ); + move16(); } } diff --git a/lib_com/basop_tcx_utils.c b/lib_com/basop_tcx_utils.c index f189a5752..5730b2212 100644 --- a/lib_com/basop_tcx_utils.c +++ b/lib_com/basop_tcx_utils.c @@ -73,7 +73,7 @@ void basop_lpc2mdct( Word16 *lpcCoeffs, Word16 lpcOrder, Word16 *mdct_gains, Wor /* short-cut, to avoid calling of BASOP_getTables() */ ptwiddle = SineTable512_fx; step = 8; - + move16(); /*ODFT*/ assert( lpcOrder < FDNS_NPTS ); @@ -106,6 +106,7 @@ void basop_lpc2mdct( Word16 *lpcCoeffs, Word16 lpcOrder, Word16 *mdct_gains, Wor j = FDNS_NPTS - 1; k = 0; move16(); + move16(); FOR( i = 0; i < FDNS_NPTS / 2; i++ ) { diff --git a/lib_com/bitalloc.c b/lib_com/bitalloc.c index 975740a9c..7e1c92f9c 100644 --- a/lib_com/bitalloc.c +++ b/lib_com/bitalloc.c @@ -849,6 +849,8 @@ int16_t BitAllocWB( factor_fx[0] = 16384; /*Q13 move16(); */ factor_fx[1] = 24576; /*Q13 move16(); */ + move16(); + move16(); { R_diff_32_fx[0] = L_sub( Ravg_sub_32_fx[0], Ravg_sub_32_fx[1] ); move32(); /*Q16 */ @@ -1013,6 +1015,7 @@ int16_t BitAllocWB( { L_tmp = L_add( L_tmp, Rsubband_buf[i] ); /*Q21 */ R[i] = extract_h( L_shr( Rsubband_buf[i], 5 ) ); /*Q0 */ + move16(); } t_fx = extract_h( L_shr( L_tmp, 5 ) ); /*Q0 */ diff --git a/lib_com/bitalloc_fx.c b/lib_com/bitalloc_fx.c index 8ae8a674f..78f6ac276 100644 --- a/lib_com/bitalloc_fx.c +++ b/lib_com/bitalloc_fx.c @@ -26,6 +26,7 @@ void bitalloc_fx( Word16 ii; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif Word16 SFM_thr = SFM_G1G2; move16(); @@ -294,7 +295,7 @@ Word16 BitAllocF_fx( t_fx = L_deposit_l( 0 ); n = 0; move16(); - tmp = add( band_end_HQ[num_env_bands - 1], shl( band_end_HQ[num_env_bands - 1], 1 ) ); + tmp = add( band_end_HQ[sub( num_env_bands, 1 )], shl( band_end_HQ[sub( num_env_bands, 1 )], 1 ) ); exp1 = norm_s( tmp ); tmp = div_s( 16384, shl( tmp, exp1 ) ); /*15 + 14 - exp1*/ exp2 = norm_s( tmp ); @@ -318,6 +319,7 @@ Word16 BitAllocF_fx( ELSE { Rsubband_w32_fx[i] = L_deposit_l( 0 ); + move32(); } } } @@ -338,7 +340,7 @@ Word16 BitAllocF_fx( t_fx = L_deposit_l( 0 ); n = 0; move16(); - tmp = add( band_end_HQ[N - 1], shl( band_end_HQ[N - 1], 1 ) ); + tmp = add( band_end_HQ[sub( N, 1 )], shl( band_end_HQ[sub( N, 1 )], 1 ) ); exp1 = norm_s( tmp ); tmp = div_s( 16384, shl( tmp, exp1 ) ); /*15 + 14 - exp1*/ exp2 = norm_s( tmp ); @@ -346,7 +348,7 @@ Word16 BitAllocF_fx( exp1 = add( 29, sub( exp2, exp1 ) ); FOR( i = 0; i < N; i++ ) { - L_tmp2 = L_sub( L_mult0( y[i], band_end_HQ[N - 1] ), L_tmp1 ); + L_tmp2 = L_sub( L_mult0( y[i], band_end_HQ[sub( N, 1 )] ), L_tmp1 ); Rsubband_w32_fx[i] = L_mult0( extract_l( L_tmp2 ), Nb[i] ); move32(); /*Q0*/ IF( Rsubband_w32_fx[i] > 0 ) @@ -361,6 +363,7 @@ Word16 BitAllocF_fx( ELSE { Rsubband_w32_fx[i] = L_deposit_l( 0 ); + move32(); } } } @@ -397,6 +400,7 @@ Word16 BitAllocF_fx( ELSE { Rsubband_w32_fx[i] = L_deposit_l( 0 ); + move32(); } } } @@ -416,6 +420,7 @@ Word16 BitAllocF_fx( IF( ( LT_32( Rsubband_w32_fx[i], L_shl( add( bs, LNb[i] ), 15 ) ) ) && ( EQ_16( low_rate, 1 ) ) ) { Rsubband_w32_fx[i] = L_deposit_l( 0 ); + move32(); } ELSE IF( LE_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) ) { @@ -437,7 +442,7 @@ Word16 BitAllocF_fx( L_tmp1 = L_sub( t_fx, L_shl( B, 15 ) ); L_tmp2 = L_abs( L_tmp1 ); - if ( n > 0 ) + IF( n > 0 ) { exp1 = sub( norm_l( L_tmp2 ), 1 ); exp2 = norm_s( n ); @@ -486,6 +491,7 @@ Word16 BitAllocF_fx( { B = add( B, Nb[i] ); Rsubband_w32_fx[i] = L_deposit_l( 0 ); + move32(); IF( B >= 0 ) { BREAK; @@ -502,6 +508,7 @@ Word16 BitAllocF_fx( FOR( i = 0; i < N; i++ ) { Rsubband_fx[i] = extract_l( L_shr( Rsubband_w32_fx[i], 12 ) ); + move16(); tmp = add( tmp, Rsubband_fx[i] ); } @@ -609,6 +616,7 @@ static void Bit_group_fx( tmp = sub( fac_fx[1], tmp ); /*Q13 */ L_tmp = L_mult( y_index[i], tmp ); /*Q14 */ y_index[i] = extract_h( L_shl( L_tmp, 2 ) ); /*Q0 */ + move16(); } } ELSE @@ -620,6 +628,7 @@ static void Bit_group_fx( tmp = sub( fac_fx[0], tmp ); /*Q13 */ L_tmp = L_mult( y_index[i], tmp ); /*Q14 */ y_index[i] = extract_h( L_shl( L_tmp, 2 ) ); /*Q0 */ + move16(); } } @@ -653,6 +662,7 @@ static void Bit_group_fx( FOR( k = 0; k <= i; k++ ) { R_temp_fx[k] = L_deposit_h( 0 ); /*Q21 */ + move32(); } } ELSE @@ -676,8 +686,9 @@ static void Bit_group_fx( IF( LT_32( R_temp_fx[i], L_tmp ) ) { R_temp_fx[i] = L_deposit_h( 0 ); + move32(); norm_sum = sub( norm_sum, y_index[i] ); - i--; + i = sub( i, 1 ); } ELSE { @@ -701,15 +712,18 @@ static void Bit_group_fx( FOR( j = bit_band; j < band_num; j++ ) { R_temp_fx[j] = L_deposit_l( 0 ); + move32(); } norm_sum = 0; + move16(); FOR( k = 0; k < bit_band; k++ ) { norm_sum = add( norm_sum, y_index[k] ); } i = bit_band; + move16(); FOR( j = 0; j < bit_band; j++ ) { IF( norm_sum == 0 ) @@ -717,6 +731,7 @@ static void Bit_group_fx( FOR( k = 0; k < i; k++ ) { R_temp_fx[k] = L_deposit_l( 0 ); /*Q21 */ + move32(); } } ELSE @@ -735,6 +750,7 @@ static void Bit_group_fx( } } R_sum_fx = 0; + move32(); L_tmp = L_shl( L_deposit_l( thr ), 21 ); /*Q21 */ FOR( k = 0; k < i; k++ ) { @@ -744,8 +760,10 @@ static void Bit_group_fx( { norm_sum = sub( norm_sum, y_index[m] ); R_temp_fx[m] = L_deposit_l( 0 ); /*Q21 */ + move32(); } i = k; + move16(); BREAK; } ELSE @@ -759,6 +777,7 @@ static void Bit_group_fx( } R_sum_org_fx = R_sum_fx; + move32(); } } @@ -796,6 +815,7 @@ Word16 BitAllocWB_fx( /* o : t Word16 BANDS; Word16 tmp, exp; Word16 Rsum_sub_fx_tmp = 0; /* initialize just to avoid compiler warning */ + move16(); Word32 L_tmp, L_tmp1; Word32 Rsubband_buf[NB_SFM]; @@ -845,7 +865,7 @@ Word16 BitAllocWB_fx( /* o : t } } Ravg_sub_32_fx[1] = L_mult( Rsum_sub_fx[1], 4096 ); /*16 0+15+1 //q15 1/8 =4096 */ - + move32(); Rsum_sub_fx[2] = 0; move16(); FOR( j = SFM_G1G2; j < BANDS; j++ ) @@ -870,6 +890,8 @@ Word16 BitAllocWB_fx( /* o : t factor_fx[0] = 16384; /*Q13 move16(); */ factor_fx[1] = 24576; /*Q13 move16(); */ + move16(); + move16(); { R_diff_32_fx[0] = L_sub( Ravg_sub_32_fx[0], Ravg_sub_32_fx[1] ); move32(); /*Q16 */ @@ -1030,6 +1052,7 @@ Word16 BitAllocWB_fx( /* o : t FOR( i = 0; i < BANDS; i++ ) { Rsubband_fx[i] = extract_l( L_shr( Rsubband_buf[i], 18 ) ); + move16(); } /* Calcuate total used bits and initialize R to be used for Noise Filling */ @@ -1038,6 +1061,7 @@ Word16 BitAllocWB_fx( /* o : t { L_tmp = L_add( L_tmp, Rsubband_buf[i] ); /*Q21 */ R[i] = extract_h( L_shr( Rsubband_buf[i], 5 ) ); /*Q0 */ + move16(); } t_fx = extract_h( L_shr( L_tmp, 5 ) ); /*Q0 */ diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index c8fa4f9e8..62183974c 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -991,6 +991,7 @@ typedef enum #define DIRAC_DIFF_NUM_AMBI_COMP 4 #define DIRAC_HOA_RENDERING_NUM_VIRT_DECORR_LS 8 #define DIRAC_GAIN_LIMIT 31.622776601683793f /* 30db gain limitiation */ +#define DIRAC_GAIN_LIMIT_Q26 ( 2122168614 ) /* 30db gain limitiation */ #define DIRAC_MAX_NUM_DECORR_FILTERS 22 #define DIRAC_MAX_DECORR_FILTER_LEN 20 #define DIRAC_DECORR_NUM_SPLIT_BANDS 3 diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index a96ef417a..56709404a 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -2393,4 +2393,22 @@ Word16 ism_quant_meta_fx( const Word16 cbsize /* i : codebook size */ ); +ivas_error ivas_limiter_open_fx( + IVAS_LIMITER_HANDLE *hLimiter_out, /* o : limiter struct handle */ + const Word16 max_num_channels, /* i : maximum number of I/O channels to be processed */ + const Word32 sampling_rate /* i : sampling rate for processing */ +); + +void ivas_limiter_close_fx( + IVAS_LIMITER_HANDLE *phLimiter /* i/o: pointer to limiter handle, can be NULL */ +); + +void copy_masa_descriptive_meta_fx( + MASA_DECRIPTIVE_META *outMeta, /* o : metadata to be written */ + MASA_DECRIPTIVE_META *inMeta /* i : input metadata */ +); + +void efap_free_data_fx( + EFAP_HANDLE *hEFAPdata /* i/o: EFAP handle to be freed */ +); #endif diff --git a/lib_com/lerp.c b/lib_com/lerp.c index ac11a17ce..eea745b81 100644 --- a/lib_com/lerp.c +++ b/lib_com/lerp.c @@ -213,8 +213,6 @@ void lerp( const Word16 *f, Word16 *f_out, Word16 bufferNewSize, Word16 bufferOl BASOP_Util_Divide_MantExp( bufferOldSize, 0, bufferNewSize, 0, &tmp2, &tmpexp ); tmp2 = shr( tmp2, 3 ); /*Q12*/ tmp2 = shl( tmp2, tmpexp ); - test(); - test(); IF( GT_16( tmp1, 16224 /*3,9609375 in Q12*/ ) ) { Word16 tmpNewSize = shl( bufferOldSize, 1 ); @@ -223,16 +221,17 @@ void lerp( const Word16 *f, Word16 *f_out, Word16 bufferNewSize, Word16 bufferOl BASOP_Util_Divide_MantExp( bufferNewSize, 0, bufferOldSize, 0, &tmp1, &tmpexp ); tmp1 = shr( tmp1, 3 ); /*Q12*/ tmp1 = shl( tmp1, tmpexp ); - test(); - IF( LE_16( tmp1, 16224 /*3,9609375 in Q12*/ ) ) + if ( LE_16( tmp1, 16224 /*3,9609375 in Q12*/ ) ) { tmpNewSize = bufferNewSize; + move16(); } lerp_proc( f, f_out, tmpNewSize, bufferOldSize ); f = f_out; bufferOldSize = tmpNewSize; + move16(); tmpNewSize = shl( tmpNewSize, 1 ); } } @@ -244,20 +243,22 @@ void lerp( const Word16 *f, Word16 *f_out, Word16 bufferNewSize, Word16 bufferOl BASOP_Util_Divide_MantExp( bufferOldSize, 0, bufferNewSize, 0, &tmp2, &tmpexp ); tmp2 = shr( tmp2, 3 ); /*Q12*/ tmp2 = shl( tmp2, tmpexp ); - test(); - IF( LE_16( tmp2, 16224 /*3,9609375 in Q12*/ ) ) + + if ( LE_16( tmp2, 16224 /*3,9609375 in Q12*/ ) ) { tmpNewSize = bufferNewSize; + move16(); } lerp_proc( f, f_out, tmpNewSize, bufferOldSize ); f = f_out; bufferOldSize = tmpNewSize; + move16(); tmpNewSize = shr( tmpNewSize, 1 ); } } - else + ELSE { lerp_proc( f, f_out, bufferNewSize, bufferOldSize ); } @@ -283,7 +284,6 @@ static void lerp_proc( const Word16 *f, Word16 *f_out, Word16 bufferNewSize, Wor if ( ( ( f <= f_out ) && ( f + bufferOldSize >= f_out ) ) || ( ( f_out <= f ) && ( f_out + bufferNewSize >= f ) ) ) { ptr = buf; - move16(); } IF( EQ_16( bufferNewSize, bufferOldSize ) ) @@ -396,10 +396,9 @@ static void lerp_proc32( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 test(); test(); test(); - IF( ( ( f <= f_out ) && ( f + bufferOldSize >= f_out ) ) || ( ( f_out <= f ) && ( f_out + bufferNewSize >= f ) ) ) + if ( ( ( f <= f_out ) && ( f + bufferOldSize >= f_out ) ) || ( ( f_out <= f ) && ( f_out + bufferNewSize >= f ) ) ) { ptr = buf; - move16(); } IF( EQ_16( bufferNewSize, bufferOldSize ) ) @@ -408,7 +407,7 @@ static void lerp_proc32( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 return; } - shift = L_shl( L_deposit_l( div_s( bufferOldSize, shl( bufferNewSize, 4 ) ) ), 4 - shift_e + 16 ); + shift = L_shl( L_deposit_l( div_s( bufferOldSize, shl( bufferNewSize, 4 ) ) ), add( sub( 4, shift_e ), Q16 ) ); pos = L_sub( L_shr( shift, 1 ), 32768l /*1.0f Q15*/ ); @@ -426,16 +425,16 @@ static void lerp_proc32( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 diff = shr( extract_l( pos ), 1 ); /*buf[0]=f[0]+pos*(f[1]-f[0]);*/ - move16(); *ptr++ = L_add_sat( f[0], Mpy_32_16_1( L_sub( f[1], f[0] ), diff ) ); + move32(); } ELSE { idx = extract_h( pos ); diff = lshr( extract_l( pos ), 1 ); - move16(); - *ptr++ = L_add_sat( f[idx], Mpy_32_16_1( L_sub( f[idx + 1], f[idx] ), diff ) ); + *ptr++ = L_add_sat( f[idx], Mpy_32_16_1( L_sub( f[add( idx, 1 )], f[idx] ), diff ) ); + move32(); } pos = L_add( pos, shift ); @@ -445,19 +444,19 @@ static void lerp_proc32( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 FOR( i = 1; i < n; i++ ) { diff = lshr( extract_l( pos ), 1 ); - IF( LT_32( pos, 0 ) ) + if ( pos < 0 ) { diff = sub( 16384 /*0.5f Q15*/, diff ); } - move16(); *ptr++ = L_add_sat( f[idx], Mpy_32_16_1( L_sub( f[idx + 1], f[idx] ), diff ) ); + move32(); pos = L_add( pos, shift ); idx = extract_h( pos ); } /* last point */ - IF( GT_32( pos, L_deposit_h( sub( bufferOldSize, 1 ) ) ) ) + if ( GT_32( pos, L_deposit_h( sub( bufferOldSize, 1 ) ) ) ) { idx = sub( bufferOldSize, 2 ); } @@ -466,8 +465,8 @@ static void lerp_proc32( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 /* diff = t - point;*/ diff = lshr( extract_l( L_shr( L_sub( pos, L_deposit_h( idx ) ), 1 ) ), 1 ); - move16(); - *ptr++ = L_add_sat( f[idx], L_shl_sat( Mpy_32_16_1( L_sub( f[idx + 1], f[idx] ), diff ), 1 ) ); + *ptr++ = L_add_sat( f[idx], L_shl_sat( Mpy_32_16_1( L_sub( f[add( idx, 1 )], f[idx] ), diff ), 1 ) ); + move32(); test(); test(); test(); @@ -489,50 +488,63 @@ static void L_lerp_proc_fx( const Word32 *f_fx, Word32 *f_out_fx, const Word16 b void L_lerp_fx( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 bufferOldSize, Word16 *q ) { Word16 tmpNewSize; - Word16 guard_bits = s_max( find_guarded_bits_fx( bufferNewSize / bufferOldSize ), find_guarded_bits_fx( bufferOldSize / bufferNewSize ) ) + 1; - IF( getScaleFactor32( f, bufferOldSize ) < guard_bits ) + Word16 tmp1, tmp2, tmp_e; + tmp1 = BASOP_Util_Divide1616_Scale( bufferNewSize, bufferOldSize, &tmp_e ); + tmp1 = shr( tmp1, sub( 15, tmp_e ) ); + + tmp2 = BASOP_Util_Divide1616_Scale( bufferOldSize, bufferNewSize, &tmp_e ); + tmp2 = shr( tmp2, sub( 15, tmp_e ) ); + Word16 guard_bits = add( s_max( tmp1, tmp2 ), 1 ); + IF( LT_16( getScaleFactor32( f, bufferOldSize ), guard_bits ) ) { - *q -= guard_bits; + *q = sub( *q, guard_bits ); FOR( Word16 ind = 0; ind < bufferNewSize; ind++ ) - f[ind] = L_shr( f[ind], guard_bits ); + { + f[ind] = L_shr( f[ind], guard_bits ); + move32(); + } #ifndef MSAN_FIX FOR( Word16 ind = 0; ind < bufferNewSize; ind++ ) f_out[ind] = L_shr( f_out[ind], guard_bits ); #endif } - IF( 128 * bufferNewSize > bufferOldSize * 507 ) + IF( GT_32( L_mult0( 128, bufferNewSize ), L_mult0( bufferOldSize, 507 ) ) ) { - tmpNewSize = bufferOldSize * 2; - WHILE( bufferNewSize > bufferOldSize ) + tmpNewSize = shl( bufferOldSize, 1 ); + WHILE( GT_16( bufferNewSize, bufferOldSize ) ) { - IF( 128 * bufferNewSize <= 507 * bufferOldSize ) + if ( LE_32( L_mult0( 128, bufferNewSize ), L_mult0( bufferOldSize, 507 ) ) ) { tmpNewSize = bufferNewSize; + move16(); } L_lerp_proc_fx( f, f_out, tmpNewSize, bufferOldSize ); f = f_out; bufferOldSize = tmpNewSize; - tmpNewSize *= 2; + move16(); + tmpNewSize = shl( tmpNewSize, 1 ); } } - ELSE IF( 128 * bufferOldSize > bufferNewSize * 507 ) + ELSE IF( GT_32( L_mult0( 128, bufferOldSize ), L_mult0( bufferNewSize, 507 ) ) ) { - tmpNewSize = bufferOldSize / 2; - WHILE( bufferNewSize < bufferOldSize ) + tmpNewSize = shr( bufferOldSize, 1 ); + WHILE( LT_16( bufferNewSize, bufferOldSize ) ) { - IF( 128 * bufferOldSize <= 507 * bufferNewSize ) + if ( LE_32( L_mult0( 128, bufferOldSize ), L_mult0( bufferNewSize, 507 ) ) ) { tmpNewSize = bufferNewSize; + move16(); } L_lerp_proc_fx( f, f_out, tmpNewSize, bufferOldSize ); f = f_out; bufferOldSize = tmpNewSize; - tmpNewSize /= 2; + move16(); + tmpNewSize = shr( tmpNewSize, 1 ); } } ELSE @@ -546,38 +558,42 @@ void L_lerp_fx_q11( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 buffe { Word16 tmpNewSize; - IF( 128 * bufferNewSize > bufferOldSize * 507 ) + IF( GT_32( L_mult0( 128, bufferNewSize ), L_mult0( bufferOldSize, 507 ) ) ) { - tmpNewSize = bufferOldSize * 2; - WHILE( bufferNewSize > bufferOldSize ) + tmpNewSize = shl( bufferOldSize, 1 ); + WHILE( GT_16( bufferNewSize, bufferOldSize ) ) { - IF( 128 * bufferNewSize <= 507 * bufferOldSize ) + if ( LE_32( L_mult0( 128, bufferNewSize ), L_mult0( bufferOldSize, 507 ) ) ) { tmpNewSize = bufferNewSize; + move16(); } lerp_proc32( f, f_out, tmpNewSize, bufferOldSize ); f = f_out; bufferOldSize = tmpNewSize; - tmpNewSize *= 2; + move16(); + tmpNewSize = shl( tmpNewSize, 1 ); } } - ELSE IF( 128 * bufferOldSize > bufferNewSize * 507 ) + ELSE IF( GT_32( L_mult0( 128, bufferOldSize ), L_mult0( bufferNewSize, 507 ) ) ) { - tmpNewSize = bufferOldSize / 2; - WHILE( bufferNewSize < bufferOldSize ) + tmpNewSize = shr( bufferOldSize, 1 ); + WHILE( LT_16( bufferNewSize, bufferOldSize ) ) { - IF( 128 * bufferOldSize <= 507 * bufferNewSize ) + if ( LE_32( L_mult0( 128, bufferOldSize ), L_mult0( bufferNewSize, 507 ) ) ) { tmpNewSize = bufferNewSize; + move16(); } lerp_proc32( f, f_out, tmpNewSize, bufferOldSize ); f = f_out; bufferOldSize = tmpNewSize; - tmpNewSize /= 2; + move16(); + tmpNewSize = shr( tmpNewSize, 1 ); } } ELSE @@ -604,7 +620,7 @@ static void L_lerp_proc_fx( Word32 buf_fx[2 * L_FRAME_MAX]; Word16 tmp; - IF( bufferNewSize == bufferOldSize ) + IF( EQ_16( bufferNewSize, bufferOldSize ) ) { Copy32( f_fx, buf_fx, bufferNewSize ); Copy32( buf_fx, f_out_fx, bufferNewSize ); @@ -616,7 +632,7 @@ static void L_lerp_proc_fx( shift_fx = L_shl( L_deposit_l( tmp ), 4 - 15 + 21 ); // q =21 pos_fx = Mpy_32_32( L_sub( shift_fx, 1 << 21 ), 1073741824 ); - IF( shift_fx < L_shr( 644245094, 31 - 21 ) ) + IF( LT_32( shift_fx, L_shr( 644245094, 31 - 21 ) ) ) { pos_fx = L_sub( pos_fx, L_shr( 279172874, 31 - 21 ) ); } @@ -625,37 +641,41 @@ static void L_lerp_proc_fx( IF( pos_fx < 0 ) { buf_fx[0] = L_add( f_fx[0], L_shl( Mpy_32_32( pos_fx, L_sub( f_fx[1], f_fx[0] ) ), 31 - 21 ) ); + move32(); } ELSE { - idx = (Word16) L_shr( pos_fx, 21 ); + idx = extract_l( L_shr( pos_fx, 21 ) ); diff_fx = L_sub( pos_fx, L_shl( idx, 21 ) ); - buf_fx[0] = L_add( f_fx[idx], L_shl( Mpy_32_32( diff_fx, L_sub( f_fx[idx + 1], f_fx[idx] ) ), 31 - 21 ) ); + buf_fx[0] = L_add( f_fx[idx], L_shl( Mpy_32_32( diff_fx, L_sub( f_fx[add( idx, 1 )], f_fx[idx] ) ), 31 - 21 ) ); + move32(); } pos_fx = L_add( pos_fx, shift_fx ); FOR( i = 1; i < bufferNewSize - 1; i++ ) { - idx = (Word16) L_shr( pos_fx, 21 ); - diff_fx = pos_fx - L_shl( idx, 21 ); + idx = extract_l( L_shr( pos_fx, 21 ) ); + diff_fx = L_sub( pos_fx, L_shl( idx, 21 ) ); buf_fx[i] = L_add( f_fx[idx], L_shl( Mpy_32_32( diff_fx, L_sub( f_fx[idx + 1], f_fx[idx] ) ), 31 - 21 ) ); + move32(); pos_fx = L_add( pos_fx, shift_fx ); } /* last point */ - idx = (Word16) L_shr( pos_fx, 21 ); + idx = extract_l( L_shr( pos_fx, 21 ) ); - IF( pos_fx > L_shl( bufferOldSize - 1, 21 ) ) + if ( GT_32( pos_fx, L_shl( sub( bufferOldSize, 1 ), 21 ) ) ) { - idx = bufferOldSize - 2; + idx = sub( bufferOldSize, 2 ); } - diff_fx = pos_fx - L_shl( idx, 21 ); + diff_fx = L_sub( pos_fx, L_shl( idx, 21 ) ); - buf_fx[bufferNewSize - 1] = L_add( f_fx[idx], L_shl( Mpy_32_32( diff_fx, L_sub( f_fx[idx + 1], f_fx[idx] ) ), 31 - 21 ) ); + buf_fx[sub( bufferNewSize, 1 )] = L_add( f_fx[idx], L_shl( Mpy_32_32( diff_fx, L_sub( f_fx[add( idx, 1 )], f_fx[idx] ) ), 31 - 21 ) ); + move32(); Copy32( buf_fx, f_out_fx, bufferNewSize ); diff --git a/lib_com/log2.c b/lib_com/log2.c index 739dd8e5e..4e70862d1 100644 --- a/lib_com/log2.c +++ b/lib_com/log2.c @@ -87,7 +87,9 @@ Word32 log10_fx( Word32 Linput ) frac = extract_l( Ltemp2 ); p1 = log2_tab[sub( extract_h( Ltemp2 ), 0x20 )]; + move16(); p2 = log2_tab[sub( extract_h( Ltemp2 ), 0x1F )]; + move16(); Ltemp2 = L_mult( n1, 0x200 ); n1 = extract_l( Ltemp2 ); @@ -124,10 +126,10 @@ Word32 pow_10( Word32 x, Word16 *Q ) Word16 count = 0; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif move16(); - ; xl = extract_l( x ); xh = extract_h( x ); @@ -193,7 +195,7 @@ Word32 pow_10( Word32 x, Word16 *Q ) #else L_tmp = L_shl( L_tmp, i ); #endif - IF( Overflow ) + if ( Overflow ) { count = add( count, 1 ); } diff --git a/lib_com/logqnorm_fx.c b/lib_com/logqnorm_fx.c index 678517ae2..902a120b4 100644 --- a/lib_com/logqnorm_fx.c +++ b/lib_com/logqnorm_fx.c @@ -66,6 +66,7 @@ void logqnorm_fx( Word16 offset = add( 3, shl( qx, 1 ) ); /* 3 + 2*qx */ lsb = 0U; /* to avoid compilation warnings */ + move16(); L_temp1 = L_deposit_l( 1 ); FOR( i = 0; i < N; i++ ) @@ -79,6 +80,7 @@ void logqnorm_fx( FOR( i = 0; i < N; i++ ) { coefs16[i] = extract_h( L_shl( L_x[i], coefs_shift ) ); + move16(); L_temp = L_mac0( L_temp, coefs16[i], coefs16[i] ); } @@ -95,14 +97,14 @@ void logqnorm_fx( m = add( offset, m ); test(); - IF( m < 5 && hvq_flag ) + IF( LT_16( m, 5 ) && hvq_flag ) { m = shl( m, 1 ); IF( LT_32( L_temp1, 1276901417L /* 2^0.25 Q30 */ ) ) { m = add( m, 2 ); } - ELSE if ( LT_32( L_temp1, 1805811301L /* 2^0.75 Q30 */ ) ) + ELSE IF( LT_32( L_temp1, 1805811301L /* 2^0.75 Q30 */ ) ) { m = add( m, 1 ); } @@ -119,8 +121,10 @@ void logqnorm_fx( } } *k = s_max( m, 0 ); + move16(); i = sub( L, 1 ); *k = s_min( *k, i ); + move16(); return; } @@ -149,6 +153,7 @@ void logqnorm_2_fx( ELSE IF( GT_32( thren[sub( L, 2 )], temp ) ) { *ynrm = sub( L, 1 ); + move16(); } ELSE { diff --git a/lib_com/low_rate_band_att_fx.c b/lib_com/low_rate_band_att_fx.c index 0df807523..a71311f38 100644 --- a/lib_com/low_rate_band_att_fx.c +++ b/lib_com/low_rate_band_att_fx.c @@ -46,6 +46,7 @@ void ivas_fine_gain_pred_fx( UWord16 lsb; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move16(); #endif FOR( band = 0; band < num_sfm; band++ ) @@ -53,7 +54,7 @@ void ivas_fine_gain_pred_fx( k = K[i_sort[band]]; move16(); - IF( GT_16( k, 0 ) ) + IF( k > 0 ) { /* bw, bw_idx only used if k>0 */ bw = sfm_size[i_sort[band]]; @@ -63,6 +64,7 @@ void ivas_fine_gain_pred_fx( move16(); /* bw_idx= 0: 8 */ xx = L_deposit_l( 0 ); shift = ivas_band_len_ener_shift[bw_idx]; + move16(); FOR( i = sfm_start[i_sort[band]]; i < sfm_end[i_sort[band]]; i++ ) { /*xx += xq[i] * xq[i]; */ @@ -70,7 +72,7 @@ void ivas_fine_gain_pred_fx( xx = L_mac0( xx, tmp, tmp ); /*30-2*shift */ } - IF( GT_32( xx, 0 ) ) + IF( xx > 0 ) { /* Normalize synthesis to RMS=1.0 */ /*gp = (float) sqrt(bw / xx); */ @@ -163,6 +165,7 @@ void fine_gain_pred_fx( UWord16 lsb; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif FOR( band = 0; band < num_sfm; band++ ) @@ -322,12 +325,14 @@ void fine_gain_dec_fx( FOR( band = 0; band < num_sfm; band++ ) { gbits = gain_bits[ord[band]]; + move16(); IF( gbits > 0 ) { IF( fg_pred[band] != 0 ) { idx = get_next_indice( st, gbits ); gain_dbq = finegain_fx[gbits - 1][idx]; + move16(); /* Update predicted gain with quantized correction */ L_tmp = L_mult0( gain_dbq, 21771 ); /* 21771=0.05*log2(10) */ /* 14+17=31 */ @@ -339,6 +344,7 @@ void fine_gain_dec_fx( L_tmp = L_mult0( fg_pred[band], tmp1 ); /*12+exp1 */ fg_pred[band] = round_fx_sat( L_shl_sat( L_tmp, sub( 16, exp1 ) ) ); /*12+exp1+16-exp1-16=12 */ + move16(); } } } diff --git a/lib_com/lpc_tools.c b/lib_com/lpc_tools.c index bcf0a5d9a..382ca06d8 100644 --- a/lib_com/lpc_tools.c +++ b/lib_com/lpc_tools.c @@ -207,12 +207,16 @@ Word16 lev_dur_fx( Word16 *rc_fx; /* reflection coefficients 0,...,m-1 */ Word32 at; Word32 s, err; - Word16 flag = 0; + Word16 flag = 0, tmp16; + move16(); rc_fx = &buf_fx[0]; rc_fx[0] = divide3232( L_negate( r_fx[1] ), r_fx[0] ); // Q(31) + move16(); a_fx[0] = L_shl( 1, q_a ); + move32(); a_fx[1] = L_shl( rc_fx[0], sub( q_a, 15 ) ); + move32(); err = L_add( r_fx[0], Mpy_32_16_1( r_fx[1], rc_fx[0] ) ); // Q(q_r) IF( epsP != NULL ) { @@ -225,36 +229,42 @@ Word16 lev_dur_fx( FOR( i = 2; i <= m; i++ ) { s = 0; // Q(q_a + q_r - 31) + move32(); FOR( j = 0; j < i; j++ ) { s = L_add( s, Mpy_32_32( r_fx[i - j], a_fx[j] ) ); } rc_fx[i - 1] = divide3232( L_negate( s ), L_shr( err, sub( 31, q_a ) ) ); + move16(); - IF( abs_s( rc_fx[i - 1] ) > 32749 ) // 32749 = 0.99945 in Q15 + if ( GT_16( abs_s( rc_fx[i - 1] ), 32749 ) ) // 32749 = 0.99945 in Q15 { flag = 1; /* Test for unstable filter. If unstable keep old A(z) */ + move16(); } - FOR( j = 1; j <= shr( i, 1 ); j++ ) + tmp16 = shr( i, 1 ); + FOR( j = 1; j <= tmp16; j++ ) { l = sub( i, j ); at = L_add( a_fx[j], Mpy_32_16_1( a_fx[l], rc_fx[i - 1] ) ); // Q(q_a) a_fx[l] = L_add( a_fx[l], Mpy_32_16_1( a_fx[j], rc_fx[i - 1] ) ); + move32(); a_fx[j] = at; move32(); } a_fx[i] = L_shl( rc_fx[i - 1], sub( q_a, 15 ) ); + move32(); err = L_add( err, L_shl( Mpy_32_16_1( s, rc_fx[i - 1] ), sub( 31, q_a ) ) ); // q_err - q_s - IF( LE_32( err, 0 ) ) + IF( err <= 0 ) { - err = L_shr( 327, 31 - q_r ); // 327 = 0.01 in Q15 + err = L_shr( 327, sub( 31, q_r ) ); // 327 = 0.01 in Q15 } - IF( epsP != NULL ) + if ( epsP != NULL ) { epsP[i] = err; move32(); diff --git a/lib_com/lpc_tools_fx.c b/lib_com/lpc_tools_fx.c index c5849e930..83b59079a 100644 --- a/lib_com/lpc_tools_fx.c +++ b/lib_com/lpc_tools_fx.c @@ -168,7 +168,7 @@ void autocorr_fx( void autocorr_fx_32( const Word16 x[], /* i : Input signal */ const Word16 m, /* i : LPC order Q0 */ - Word32 r[], /* o : Autocorrelations (msb) */ + Word32 r[], /* o : Autocorrelations */ Word16 *Q_r, /* o : normalisation shift of r Q0 */ const Word16 len, /* i : Frame lenght */ const Word16 *wind, /* i : Window used */ @@ -179,27 +179,29 @@ void autocorr_fx_32( Word16 i, j, norm, shift, y[MAX_LEN_LP]; Word16 fact; Word32 L_sum, L_tmp; + Word16 tmp16; IF( EQ_16( rev_flag, 1 ) ) { /* Windowing of signal */ FOR( i = 0; i < len; i++ ) { - y[i] = mult_r( x[i], wind[len - i - 1] ); + y[i] = mult_r( x[i], wind[sub( sub( len, i ), 1 )] ); move16(); } } ELSE IF( EQ_16( sym_flag, 1 ) ) { /* symmetric window of even length */ - FOR( i = 0; i < len / 2; i++ ) + tmp16 = shr( len, 1 ); + FOR( i = 0; i < tmp16; i++ ) { y[i] = mult_r( x[i], wind[i] ); move16(); } FOR( ; i < len; i++ ) { - y[i] = mult_r( x[i], wind[len - i - 1] ); + y[i] = mult_r( x[i], wind[sub( sub( len, i ), 1 )] ); move16(); } } @@ -258,7 +260,8 @@ void autocorr_fx_32( FOR( i = 1; i <= m; i++ ) { L_sum = L_mult( y[0], y[i] ); - FOR( j = 1; j < len - i; j++ ) + tmp16 = sub( len, i ); + FOR( j = 1; j < tmp16; j++ ) { L_sum = L_mac( L_sum, y[j], y[j + i] ); } @@ -479,6 +482,7 @@ Word16 E_LPC_lev_dur_stab( const Word16 Rh[], const Word16 Rl[], Word16 A[], Wor flag = 1; move16(); /* Test for unstable filter. If unstable keep old A(z) */ } + test(); if ( ( mem != NULL ) && ( ( LT_32( L_abs( t2 ), 5 ) ) ) ) { flag = 1; @@ -555,6 +559,7 @@ Word16 E_LPC_lev_dur_stab( const Word16 Rh[], const Word16 Rl[], Word16 A[], Wor #else A[i] = round_fx( L_shl( t0, k ) ); #endif + move16(); } BASOP_SATURATE_WARNING_ON_EVS @@ -563,11 +568,11 @@ Word16 E_LPC_lev_dur_stab( const Word16 Rh[], const Word16 Rl[], Word16 A[], Wor /* Enforce stable LPC filter - parcorr[0] and parcorr[1] are not LPC coeffiecients */ IF( flag ) { - Copy( mem, A, order + 1 ); + Copy( mem, A, add( order, 1 ) ); } ELSE /* If stable LPC filter, store into memories */ { - Copy( A, mem, order + 1 ); + Copy( A, mem, add( order, 1 ) ); } } @@ -592,6 +597,7 @@ Word16 E_LPC_lev_dur_stab_fx( const Word16 Rh[], const Word16 Rl[], Word32 A[], Word16 Ah[TCXLTP_LTP_ORDER + 1], Al[TCXLTP_LTP_ORDER + 1]; /* LPC coef. in double prec. */ #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif @@ -693,6 +699,7 @@ Word16 E_LPC_lev_dur_stab_fx( const Word16 Rh[], const Word16 Rl[], Word32 A[], flag = 1; move16(); /* Test for unstable filter. If unstable keep old A(z) */ } + test(); if ( ( mem != NULL ) && ( ( LT_32( L_abs( t2 ), 5 ) ) ) ) { flag = 1; @@ -767,8 +774,9 @@ Word16 E_LPC_lev_dur_stab_fx( const Word16 Rh[], const Word16 Rl[], Word32 A[], #ifdef BASOP_NOGLOB A[i] = L_shl_o( t0, k, &Overflow ); #else - A[i] = L_shl(t0, k)); + A[i] = L_shl(t0, k)); #endif + move16(); } BASOP_SATURATE_WARNING_ON_EVS @@ -777,11 +785,11 @@ Word16 E_LPC_lev_dur_stab_fx( const Word16 Rh[], const Word16 Rl[], Word32 A[], /* Enforce stable LPC filter - parcorr[0] and parcorr[1] are not LPC coeffiecients */ IF( flag ) { - Copy32( mem, A, order + 1 ); + Copy32( mem, A, add( order, 1 ) ); } ELSE /* If stable LPC filter, store into memories */ { - Copy32( A, mem, order + 1 ); + Copy32( A, mem, add( order, 1 ) ); } } @@ -821,15 +829,17 @@ void E_LPC_a_add_tilt( const Word16 *a, Word16 *ap, Word16 gamma, Word16 m ) } Atmp[m + 1] = L_negate( L_mult0( gamma, a[m] ) ); move32(); - Amax = L_max( Amax, L_abs( Atmp[m + 1] ) ); + Amax = L_max( Amax, L_abs( Atmp[add( m, 1 )] ) ); shift = norm_l( Amax ); ap[0] = shl( a[0], sub( shift, 1 ) ); move16(); FOR( i = 1; i <= m; i++ ) { ap[i] = round_fx( L_shl( Atmp[i], shift ) ); + move16(); } - ap[m + 1] = round_fx( L_shl( Atmp[m + 1], shift ) ); + ap[add( m, 1 )] = round_fx( L_shl( Atmp[add( m, 1 )], shift ) ); + move16(); } void E_LPC_int_lpc_tcx( const Word16 lsp_old[], /* input : LSPs from past frame Q15 */ @@ -844,6 +854,7 @@ void E_LPC_int_lpc_tcx( const Word16 lsp_old[], /* input : LSPs from past frame { /*lsp[i] = lsp_old[i]*0.125f + lsp_new[i]*0.875f;*/ lsp[i] = round_fx( L_mac( L_mult( lsp_old[i], 4096 ), lsp_new[i], 28672 ) ); + move16(); } E_LPC_f_lsp_a_conversion( lsp, a, M ); @@ -940,6 +951,7 @@ Word16 E_LPC_lsp_unweight( /* Approximate unweighting by 3-tap FIR */ lsp_uw[0] = add( lsp_w_orig[0], round_fx( L_shl( L_mac0( L_mult0( unw_coeffs[0][1], lsp_w_diff[0] ), unw_coeffs[0][2], lsp_w_diff[1] ), 2 ) ) ); + move16(); FOR( i = 1; i < lpcorder - 1; ++i ) { lsp_uw[i] = add( lsp_w_orig[i], round_fx( L_shl( L_mac0( L_mac0( L_mult0( unw_coeffs[i][0], lsp_w_diff[i - 1] ), unw_coeffs[i][1], lsp_w_diff[i] ), unw_coeffs[i][2], lsp_w_diff[i + 1] ), 2 ) ) ); @@ -1002,8 +1014,8 @@ Word32 E_LPC_schur( Word32 r[], Word16 reflCoeff[], Word32 epsP[], const Word16 temp16 = negate( divide3232( g0[0], g1[0] ) ); reflCoeff[0] = temp16; move16(); - move32(); epsP[0] = r[0]; + move32(); FOR( i = 0; i < mM1; i++ ) @@ -1075,24 +1087,24 @@ static void spec2isf( Word16 tmp, i; Word16 specix, lsfix; - move16(); - move16(); specix = lsfix = 0; move16(); + move16(); s = spec_r[specix++]; + move16(); WHILE( LT_16( specix, speclen ) && LE_16( lsfix, 15 ) ) { - + test(); /*check for next zero crossing*/ /*for (; s*spec_r[specix] >= 0; specix++);*/ WHILE( mult( s, spec_r[specix] ) >= 0 ) specix = add( specix, 1 ); tmp = divide1616( spec_r[specix - 1], sub( spec_r[specix - 1], spec_r[specix] ) ); - move16(); /*lsf[lsfix] = L_add(L_deposit_h(sub(specix,1)) , L_shl(L_deposit_l(tmp),1));*/ /*Q16*/ lsf[lsfix] = add( shl( sub( specix, 1 ), 7 ), shr( ( tmp ), 8 ) ); /*7Q8*/ + move16(); lsfix++; @@ -1103,9 +1115,9 @@ static void spec2isf( specix = add( specix, 1 ); tmp = divide1616( spec_i[specix - 1], sub( spec_i[specix - 1], spec_i[specix] ) ); - move16(); /*lsf[lsfix] = L_add(L_deposit_h(sub(specix,1)) , L_shl(L_deposit_l(tmp),1));*/ /*Q16*/ lsf[lsfix] = add( shl( sub( specix, 1 ), 7 ), shr( ( tmp ), 8 ) ); /*7Q8*/ + move16(); lsfix++; @@ -1144,9 +1156,11 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs, Word16 *lsf, const Word16 *o Word16 s[4]; Word32 L_tmp, L_tmp1, L_tmp3; Word16 lpc[19]; + move16(); #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif /* half length FFT */ @@ -1194,8 +1208,11 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs, Word16 *lsf, const Word16 *o move16(); } s[0] = shr( s[0], 1 ); + move16(); s[1] = shr( s[1], 1 ); + move16(); s[2] = shr( s[2], 1 ); + move16(); lpc[0] = mult_r( lpcCoeffs[0], s[0] ); move16(); L_tmp = L_mult( s[0], lpcCoeffs[1] ); @@ -1223,9 +1240,12 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs, Word16 *lsf, const Word16 *o FOR( j = 0; j < 9; j++ ) { ptrReal[j * 8] = L_shl( L_deposit_h( lpc[2 * j] ), scale ); + move32(); ptrImag[j * 8] = L_shl( L_deposit_h( lpc[2 * j + 1] ), scale ); + move32(); } ptrReal[j * 8] = L_shl( L_deposit_h( lpc[2 * j] ), scale ); + move32(); ptrImag[j * 8] = 0; move16(); j++; @@ -1233,7 +1253,9 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs, Word16 *lsf, const Word16 *o FOR( ; j < 16; j++ ) { ptrReal[j * 8] = L_deposit_h( 0 ); + move32(); ptrImag[j * 8] = L_deposit_h( 0 ); + move32(); } fft16( ptrReal, ptrImag, 8, 0 ); @@ -1246,7 +1268,9 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs, Word16 *lsf, const Word16 *o ptwiddle = w_a[i - 1]; ptrReal[0] = L_shl( L_deposit_h( lpc[0] ), scale ); + move32(); ptrImag[0] = L_shl( L_deposit_h( lpc[1] ), scale ); + move32(); FOR( j = 1; j < 9; j++ ) { @@ -1266,7 +1290,9 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs, Word16 *lsf, const Word16 *o FOR( ; j < 16; j++ ) { ptrReal[j * 8] = L_deposit_h( 0 ); + move32(); ptrImag[j * 8] = L_deposit_h( 0 ); + move32(); ptwiddle++; } @@ -1293,12 +1319,14 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs, Word16 *lsf, const Word16 *o pwn15i = &tmpw15; RealOut[0] = round_fx( 2 * L_add( RealFFT[0], ImagFFT[0] ) ); + move16(); ImagOut[0] = 0; move16(); RealOut[128] = 0; move16(); ImagOut[128] = round_fx( L_sub( L_add( RealFFT[0], RealFFT[0] ), L_add( ImagFFT[0], ImagFFT[0] ) ) ); + move16(); ptwiddle += 8; FOR( i = 1; i <= N / 2 / 4; i++ ) @@ -1310,7 +1338,9 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs, Word16 *lsf, const Word16 *o BASOP_SATURATE_WARNING_OFF_EVS #ifdef BASOP_NOGLOB tmpw15.v.re = mac_ro( L_mult( ptwiddle->v.re, pwn17->v.re ), ptwiddle->v.im, pwn17->v.im, &Overflow ); + move16(); tmpw15.v.im = msu_ro( L_mult( ptwiddle->v.re, pwn17->v.im ), ptwiddle->v.im, pwn17->v.re, &Overflow ); + move16(); #else /* BASOP_NOGLOB */ tmpw15.v.re = mac_r( L_mult( ptwiddle->v.re, pwn17->v.re ), ptwiddle->v.im, pwn17->v.im ); tmpw15.v.im = msu_r( L_mult( ptwiddle->v.re, pwn17->v.im ), ptwiddle->v.im, pwn17->v.re ); @@ -1323,7 +1353,9 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs, Word16 *lsf, const Word16 *o BASOP_SATURATE_WARNING_OFF_EVS #ifdef BASOP_NOGLOB tmpw15.v.re = msu_ro( L_mult( ptwiddle->v.im, pwn17i->v.im ), ptwiddle->v.re, pwn17i->v.re, &Overflow ); + move16(); tmpw15.v.im = mac_ro( L_mult( ptwiddle->v.re, pwn17i->v.im ), ptwiddle->v.im, pwn17i->v.re, &Overflow ); + move16(); #else /* BASOP_NOGLOB */ tmpw15.v.re = msu_r( L_mult( ptwiddle->v.im, pwn17i->v.im ), ptwiddle->v.re, pwn17i->v.re ); tmpw15.v.im = mac_r( L_mult( ptwiddle->v.re, pwn17i->v.im ), ptwiddle->v.im, pwn17i->v.re ); @@ -1350,7 +1382,9 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs, Word16 *lsf, const Word16 *o BASOP_SATURATE_WARNING_OFF_EVS #ifdef BASOP_NOGLOB tmpw15.v.re = mac_ro( L_mult( ptwiddle->v.im, pwn17->v.re ), ptwiddle->v.re, pwn17->v.im, &Overflow ); + move16(); tmpw15.v.im = msu_ro( L_mult( ptwiddle->v.im, pwn17->v.im ), ptwiddle->v.re, pwn17->v.re, &Overflow ); + move16(); #else /* BASOP_NOGLOB */ tmpw15.v.re = mac_r( L_mult( ptwiddle->v.im, pwn17->v.re ), ptwiddle->v.re, pwn17->v.im ); tmpw15.v.im = msu_r( L_mult( ptwiddle->v.im, pwn17->v.im ), ptwiddle->v.re, pwn17->v.re ); @@ -1363,7 +1397,9 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs, Word16 *lsf, const Word16 *o BASOP_SATURATE_WARNING_OFF_EVS #ifdef BASOP_NOGLOB tmpw15.v.re = msu_ro( L_mult( ptwiddle->v.re, pwn17i->v.im ), ptwiddle->v.im, pwn17i->v.re, &Overflow ); + move16(); tmpw15.v.im = mac_ro( L_mult( ptwiddle->v.im, pwn17i->v.im ), ptwiddle->v.re, pwn17i->v.re, &Overflow ); + move16(); #else /* BASOP_NOGLOB */ tmpw15.v.re = msu_r( L_mult( ptwiddle->v.re, pwn17i->v.im ), ptwiddle->v.im, pwn17i->v.re ); tmpw15.v.im = mac_r( L_mult( ptwiddle->v.im, pwn17i->v.im ), ptwiddle->v.re, pwn17i->v.re ); @@ -1387,7 +1423,9 @@ void E_LPC_a_lsf_isf_conversion( Word16 *lpcCoeffs, Word16 *lsf, const Word16 *o BASOP_SATURATE_WARNING_OFF_EVS #ifdef BASOP_NOGLOB tmpw15.v.re = mac_r_sat( L_mult( ptwiddle->v.im, pwn17->v.re ), ptwiddle->v.re, pwn17->v.im ); + move16(); tmpw15.v.im = msu_r_sat( L_mult( ptwiddle->v.im, pwn17->v.im ), ptwiddle->v.re, pwn17->v.re ); + move16(); #else tmpw15.v.re = mac_r( L_mult( ptwiddle->v.im, pwn17->v.re ), ptwiddle->v.re, pwn17->v.im ); tmpw15.v.im = msu_r( L_mult( ptwiddle->v.im, pwn17->v.im ), ptwiddle->v.re, pwn17->v.re ); diff --git a/lib_com/lsf_dec_bfi_fx.c b/lib_com/lsf_dec_bfi_fx.c index 147c40846..4c10059d0 100644 --- a/lib_com/lsf_dec_bfi_fx.c +++ b/lib_com/lsf_dec_bfi_fx.c @@ -65,7 +65,7 @@ void lsf_dec_bfi( { pt_meansForFading = GEWB_Ave_fx; - if ( EQ_16( bwidth, NB ) ) + if ( bwidth == NB ) { pt_meansForFading = GENB_Ave_fx; } @@ -206,18 +206,22 @@ ELSE IF( tcxonly != 0 ) IF( EQ_16( L_frame, 320 ) ) { gap = 143; + move16(); } ELSE IF( EQ_16( L_frame, 512 ) ) { gap = 90; + move16(); } ELSE IF( EQ_16( L_frame, 640 ) ) { gap = 72; + move16(); } ELSE { gap = 48; + move16(); } reorder_lsf_fx( lsf, gap, M, INT_FS_FX ); } diff --git a/lib_com/lsf_msvq_ma_fx.c b/lib_com/lsf_msvq_ma_fx.c index 179e644b6..a423cb951 100644 --- a/lib_com/lsf_msvq_ma_fx.c +++ b/lib_com/lsf_msvq_ma_fx.c @@ -38,8 +38,8 @@ void midlsf_dec( Word16 j; Word32 L_tmp; Word16 bad_spacing = 0; - move16(); + /* Select codebook */ IF( EQ_16( coder_type, UNVOICED ) ) { @@ -54,6 +54,7 @@ void midlsf_dec( L_tmp = L_mult( sub( 0x2000, ratio[idx * M + j] ), qlsf0[j] ); /*Q(x2.56+13+1)->Q(x2.56+14)*/ L_tmp = L_mac( L_tmp, ratio[idx * M + j], qlsf1[j] ); /*Q(x2.56+14)*/ qlsf[j] = round_fx( L_shl( L_tmp, 2 ) ); /*Q(x2.56)*/ + move16(); } diff --git a/lib_com/lsf_tools.c b/lib_com/lsf_tools.c index 127cee7e9..0b9223922 100644 --- a/lib_com/lsf_tools.c +++ b/lib_com/lsf_tools.c @@ -1616,37 +1616,6 @@ void lsp2lsf( return; } -#ifdef IVAS_FLOAT_FIXED -/*-----------------------------------------------------------------------* - * lsf2lsp_32_fx() - * - * Transformation of LSFs to LSPs - * - * LSP are line spectral pairs in cosine domain (-1 to 1). - * LSF are line spectral frequencies (0 to fs/2). - *-----------------------------------------------------------------------*/ - -void lsf2lsp_32_fx( - const Word32 lsf_fx[], /* i : isf[m] normalized (range: 0<=val<=fs/2) */ - Word16 lsf_q_fx, - Word16 lsp_fx[], /* o : isp[m] (range: -1<=val<1) */ - Word16 *lsp_q_fx, - const Word16 m, /* i : LPC order */ - const Word32 Fs /* i : sampling frequency */ -) -{ - Word16 i; - - /* convert LSFs to LSPs */ - FOR( i = 0; i < m; i++ ) - { - lsp_fx[i] = getCosWord16R2( div_l( L_shr( lsf_fx[i], lsf_q_fx - 13 ), div_l( Fs, shl( 2, 1 ) ) ) ); - } - *lsp_q_fx = 15; - return; -} -#endif - /*-----------------------------------------------------------------------* * lsf2lsp() * @@ -2101,7 +2070,6 @@ void dec_FDCNG_MSVQ_stage1( } #ifdef IVAS_FLOAT_FIXED - void dec_FDCNG_MSVQ_stage1_fx( Word16 j_full, /* i : index full range */ Word16 n, /* i : dimension to generate */ @@ -2111,7 +2079,7 @@ void dec_FDCNG_MSVQ_stage1_fx( Word16 *uq_ind /* o : synthesized stage1 vector in BASOP */ ) { - Word16 col, segm_ind, j; + Word16 col, segm_ind, j, i; Word32 dct_vec[FDCNG_VQ_MAX_LEN]; const Word8 *cbpW8; const Word16 *dct_col_shift_tab; @@ -2121,15 +2089,16 @@ void dec_FDCNG_MSVQ_stage1_fx( assert( n >= FDCNG_VQ_DCT_MINTRUNC ); segm_ind = 0; - for ( col = 1; col <= FDCNG_VQ_DCT_NSEGM; col++ ) + move16(); + FOR( col = 1; col <= FDCNG_VQ_DCT_NSEGM; col++ ) { - if ( j_full >= cdk1_ivas_cum_entries_per_segment[col] ) + if ( GE_16( j_full, cdk1_ivas_cum_entries_per_segment[col] ) ) { - segm_ind++; + segm_ind = add( segm_ind, 1 ); } } - j = j_full - cdk1_ivas_cum_entries_per_segment[segm_ind]; /* j is the local segment index */ + j = sub( j_full, cdk1_ivas_cum_entries_per_segment[segm_ind] ); /* j is the local segment index */ /* Word8 column variable Qx storage*/ @@ -2137,9 +2106,10 @@ void dec_FDCNG_MSVQ_stage1_fx( cbpW8 += j * cdk1_ivas_cols_per_segment[segm_ind]; /* adaptive ptr init */ dct_col_shift_tab = stage1_dct_col_syn_shift[segm_ind]; - for ( col = 0; col < cdk1_ivas_cols_per_segment[segm_ind]; col++ ) + FOR( col = 0; col < cdk1_ivas_cols_per_segment[segm_ind]; col++ ) { - dct_vec[col] = shl( (Word16) cbpW8[col], dct_col_shift_tab[col] ); + dct_vec[col] = shl( cbpW8[col], dct_col_shift_tab[col] ); + move32(); /* LOGIC( 1 ) , SHIFT( 1 ); in BASOP: s_and(for W8->W16), shl() */ @@ -2147,10 +2117,12 @@ void dec_FDCNG_MSVQ_stage1_fx( assert( j < cdk1_ivas_entries_per_segment[segm_ind] ); Word16 norm = 20; + move16(); - for ( int i = 0; i < cdk1_ivas_cols_per_segment[segm_ind]; i++ ) + FOR( i = 0; i < cdk1_ivas_cols_per_segment[segm_ind]; i++ ) { dct_vec_fx[i] = L_shl( dct_vec[i], norm ); + move32(); } dctT2_N_apply_matrix_fx( (const Word32 *) dct_vec_fx, idct_vec_fx, cdk1_ivas_cols_per_segment[segm_ind], n, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, idcttype ); @@ -2159,14 +2131,20 @@ void dec_FDCNG_MSVQ_stage1_fx( /*scale down to original fdcngvq domain and move to Q0 */ /* fdcng_dct_scaleF[1] --> Q15 conversion --> 860 */ // v_multc_att32( idct_vec_fx, 860, idct_vec_fx, n ); - for ( int i = 0; i < n; i++ ) + FOR( i = 0; i < n; i++ ) + { idct_vec_fx[i] = Mpy_32_32( idct_vec_fx[i], 56410112 ); /* norm + 31 - 31 = norm*/ + move32(); + } /* fdcng_dct_scaleF[1] --> 0.0625-->scale down from search Q4 domain to Q0 , not really relevant for BASOP loop */ /*add common mid fdcng vector, in fdcng bands domain */ - for ( int i = 0; i < n; i++ ) - uq[i] = L_add( idct_vec_fx[i], L_lshl( cdk1r_tr_midQ_truncQ_fx[i], norm - 10 ) ); // making the Q factors equal + FOR( i = 0; i < n; i++ ) + { + uq[i] = L_add( idct_vec_fx[i], L_lshl( cdk1r_tr_midQ_truncQ_fx[i], sub( norm, Q10 ) ) ); // making the Q factors equal + move32(); + } assert( uq_ind == NULL ); return; @@ -2255,7 +2233,6 @@ void msvq_dec_float( } #ifdef IVAS_FLOAT_FIXED - void msvq_dec_fx( const Word16 *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ const Word16 dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ @@ -2270,20 +2247,24 @@ void msvq_dec_fx( Word16 *uq_ind, /* o : quantized vector (fixed point) */ Word16 exp ) { - Word16 i, n, maxn, start; + Word16 i, n, maxn, start, k; Word16 j, max_size = 0; + move16(); FOR( i = 0; i < stages; i++ ) { IF( dims ) { - IF( max_size < dims[i] ) - max_size = dims[i]; + if ( LT_16( max_size, dims[i] ) ) + { + max_size = dims[i]; + move16(); + } } - ELSE { max_size = N; + move16(); } } @@ -2302,36 +2283,44 @@ void msvq_dec_fx( IF( dims ) { n = dims[i]; + move16(); maxn = n; + move16(); } ELSE { n = N; + move16(); maxn = maxN; + move16(); } IF( offs ) { start = offs[i]; + move16(); } ELSE { start = 0; + move16(); } Word16 guard_bits = find_guarded_bits_fx( max_size ); - if ( i == 0 ) + IF( i == 0 ) { - FOR( Word16 k = 0; k < N; k++ ) + FOR( k = 0; k < N; k++ ) { uq[k] = L_shr( uq[k], guard_bits ); + move32(); } } + test(); IF( i == 0 && applyIDCT_flag != 0 ) { assert( start == 0 ); dec_FDCNG_MSVQ_stage1_fx( Idx[0], N, invTrfMatrix, IDCT_T2_XX_24, uq, uq_ind ); /* IDCT_T2 N=24 used for all synthesis */ - FOR( Word16 k = 0; k < N; k++ ) + FOR( k = 0; k < N; k++ ) { uq[k] = L_shr( uq[k], guard_bits ); move32(); @@ -2341,9 +2330,10 @@ void msvq_dec_fx( { // v_add( uq + start, cb[i] + Idx[i] * maxn, uq + start, n ); - FOR( Word16 k = 0; k < n; k++ ) + FOR( k = 0; k < n; k++ ) { - uq[start + k] = L_add( uq[start + k], L_lshl( cb[i][Idx[i] * maxn + k], 20 - exp - guard_bits ) ); + uq[add( start, k )] = L_add( uq[add( start, k )], L_lshl( cb[i][add( imult1616( Idx[i], maxn ), k )], sub( sub( 20, exp ), guard_bits ) ) ); + move32(); } } @@ -2352,8 +2342,8 @@ void msvq_dec_fx( { FOR( j = 0; j < n; ++j ) { + uq_ind[add( start, j )] = add( uq_ind[add( start, j )], (Word16) ( mult( cb[i][add( imult1616( Idx[i], maxn ), j )], 20971 ), sub( add( 13, exp ), 15 ) ) ); move16(); - uq_ind[start + j] = add( uq_ind[start + j], (Word16) ( mult( cb[i][Idx[i] * maxn + j], 20971 ), ( 13 + exp ) - 15 ) ); } } #undef WMC_TOOL_SKIP @@ -2726,42 +2716,54 @@ void dctT2_N_apply_matrix_fx( assert( dct_dim <= FDCNG_VQ_DCT_MAXTRUNC ); assert( fdcngvq_dim <= FDCNG_VQ_MAX_LEN ); - if ( ( dcttype & 1 ) == 0 ) /* even entries are DCTs */ + IF( L_and( dcttype, 1 ) == 0 ) /* even entries are DCTs */ { /* DCT_typeII 24,21 -> XX in worst case */ dim_in = fdcngvq_dim; + move16(); dim_out = dct_dim; + move16(); mat_step_col = matrix_row_dim; /* matrix maximum storage size dependent, width of first row in matrix */ + move16(); mat_step_row = 0; + move16(); mat_step_col_flag = 1; + move16(); assert( dcttype == DCT_T2_21_XX || dcttype == DCT_T2_24_XX ); } - else + ELSE { assert( ( dcttype & 1 ) != 0 ); /* idct */ dim_in = dct_dim; + move16(); dim_out = fdcngvq_dim; + move16(); mat_step_col = 1; + move16(); mat_step_row = matrix_row_dim; + move16(); mat_step_col_flag = 0; + move16(); assert( dcttype == IDCT_T2_XX_24 ); } pt_y = tmp_y; - for ( i = 0; i < dim_out; i++ ) + FOR( i = 0; i < dim_out; i++ ) { pt_x = input; *pt_y = 0; + move32(); /* +i(DCT) or +i*maxTrunc(IDCT) */ #define WMC_TOOL_SKIP - pt_A = &( matrix[i * ( mat_step_row + mat_step_col_flag )] ); /* ptr indexing */ + pt_A = &( matrix[imult1616( i, add( mat_step_row, mat_step_col_flag ) )] ); /* ptr indexing */ PTR_INIT( 1 ); #undef WMC_TOOL_SKIP - for ( j = 0; j < dim_in; j++ ) + FOR( j = 0; j < dim_in; j++ ) { #define WMC_TOOL_SKIP - *pt_y += Mpy_32_32( ( *pt_x++ ), ( *pt_A ) ); + *pt_y = L_add( *pt_y, Mpy_32_32( ( *pt_x++ ), ( *pt_A ) ) ); + move32(); pt_A += mat_step_col; /* step +maxtrunc or +1 */ /* ptr indexing*/ MAC( 1 ); #undef WMC_TOOL_SKIP @@ -2916,7 +2918,7 @@ void create_IDCT_N_Matrix_fx( const Word16 alloc_size /* i : RAM buffer size in elements */ ) { - Word16 c, c1, r, r_flip, W16_val; + Word16 c, c1, r, r_flip, W16_val, tmp16; Word16 len; Word16 mat_cpy_size; const Word16 *absval_ptr; @@ -2927,20 +2929,23 @@ void create_IDCT_N_Matrix_fx( absval_ptr = unique_idctT2_24coeffsQ16; idx_ptr = idctT2_24_compressed_idx; len = FDCNG_VQ_MAX_LEN; + move16(); - IF( N == FDCNG_VQ_MAX_LEN_WB ) + IF( EQ_16( N, FDCNG_VQ_MAX_LEN_WB ) ) { absval_ptr = unique_idctT2_21coeffsQ16; idx_ptr = idctT2_21_compressed_idx; len = N; + move16(); } assert( alloc_size >= ( n_cols * len ) ); /* enough space for the full expanded IDCT matrix */ assert( N <= len ); - mat_cpy_size = ( n_cols ) * ( len >> 1 ); /* NB integer division of "len" */ + // mat_cpy_size = ( n_cols ) * ( len >> 1 ); /* NB integer division of "len" */ + mat_cpy_size = imult1616( n_cols, shr( len, 1 ) ); /* NB integer division of "len" */ - IF( NE_16( ( len & 1 ), 0 ) ) + IF( s_and( len, 1 ) != 0 ) { /* odd sized DCT with a non-reflected center row */ mat_cpy_size = add( mat_cpy_size, n_cols ); } @@ -2949,13 +2954,15 @@ void create_IDCT_N_Matrix_fx( { idx = (Word16) ( idx_ptr[c] ); W16_val = absval_ptr[abs( idx )]; + move16(); IF( idx < 0 ) { - W16_val = -( W16_val ); + W16_val = negate( W16_val ); } /* (+1.52587890625e-05f) * 2 ^ 31 is equal to 32768 */ - inv_matrixFloatQ[c] = 32768 * ( W16_val ); /* scaling to 2 ^ 31*/ + inv_matrixFloatQ[c] = L_shl( W16_val, Q15 ); /* scaling to 2 ^ 31*/ + move32(); } /* for even number of coeffs DCT24, @@ -2967,13 +2974,14 @@ void create_IDCT_N_Matrix_fx( FOR( c = 0; c < ( n_cols ); c += 2 ) { - c1 = c + 1; - r_flip = len - 1; - FOR( r = 0; r < ( len / 2 ); r_flip-- ) + c1 = add( c, 1 ); + r_flip = sub( len, 1 ); + tmp16 = shr( len, 1 ); + FOR( r = 0; r < tmp16; r_flip-- ) { #define WMC_TOOL_SKIP - ptr[r_flip][c] = ptr[r][c]; /* flipped */ - ptr[r_flip][c1] = -( ptr[r][c1] ); /* flipped and sign swapped */ + ptr[r_flip][c] = ptr[r][c]; /* flipped */ + ptr[r_flip][c1] = L_negate( ptr[r][c1] ); /* flipped and sign swapped */ MOVE( 2 ); MULT( 1 ); /* for negate */ #undef WMC_TOOL_SKIP diff --git a/lib_com/prot.h b/lib_com/prot.h index d33a84804..03ce573b9 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -931,17 +931,6 @@ void lsp2lsf( const int32_t Fs /* i : sampling frequency */ ); -#ifdef IVAS_FLOAT_FIXED -void lsf2lsp_32_fx( - const Word32 lsf_fx[], /* i : isf[m] normalized (range: 0<=val<=fs/2) */ - Word16 lsf_q_fx, - Word16 lsp_fx[], /* o : isp[m] (range: -1<=val<1) */ - Word16 *lsp_q_fx, - const Word16 m, /* i : LPC order */ - const Word32 Fs /* i : sampling frequency */ -); -#endif - void lsf2lsp( const float lsf[], /* i : isf[m] normalized (range: 0<=val<=fs/2) */ float lsp[], /* o : isp[m] (range: -1<=val<1) */ diff --git a/lib_com/tools.c b/lib_com/tools.c index 6a6ea3d42..2132eb9f5 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -185,10 +185,11 @@ Word32 sum2_f_16_fx( const Word16 lvec /* i : length of input vector */ ) { - int16_t i; + Word16 i; Word32 tmp; tmp = 0; + move32(); FOR( i = 0; i < lvec; i++ ) { tmp = L_add( tmp, L_mult0( vec[i], vec[i] ) ); @@ -217,15 +218,17 @@ float sum2_f( #ifdef IVAS_FLOAT_FIXED Word32 sum2_f_32_fx( const Word32 *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ + const Word16 lvec, /* i : length of input vector */ Word16 gb ) { - int16_t i; + Word16 i; Word32 tmp; tmp = 0; Word32 var_a = 0; - for ( i = 0; i < lvec; i++ ) + move32(); + move32(); + FOR( i = 0; i < lvec; i++ ) { var_a = Mpy_32_32( vec[i], vec[i] ); // 2x-31 tmp = L_add( tmp, L_shr( var_a, gb ) ); // 2x-31-gb @@ -239,12 +242,15 @@ Word32 sum2_32_fx( const Word16 lvec, /* i : length of input vector */ Word16 *e ) { - int16_t i; + Word16 i; Word32 tmp; tmp = 0; Word32 var_a = 0; Word16 exp = 0, exp_tmp; + move32(); + move32(); + move16(); FOR( i = 0; i < lvec; i++ ) { exp_tmp = norm_l( vec[i] ); @@ -254,6 +260,7 @@ Word32 sum2_32_fx( tmp = BASOP_Util_Add_Mant32Exp( tmp, exp, var_a, exp_tmp, &exp ); } *e = exp; + move16(); return tmp; } @@ -351,6 +358,7 @@ void set_zero_fx( FOR( i = 0; i < lvec; i++ ) { *vec++ = 0; + move32(); } return; @@ -516,7 +524,7 @@ uint32_t mvr2s( } #ifdef IVAS_FLOAT_FIXED -uint32_t mvl2s_r( +UWord32 mvl2s_r( const Word32 x[], /* i : input vector */ const Word16 q_x, Word16 y[], /* o : output vector */ @@ -525,7 +533,8 @@ uint32_t mvl2s_r( { Word16 i; Word32 temp; - uint32_t noClipping = 0; + UWord32 noClipping = 0; + move32(); IF( n <= 0 ) { @@ -537,21 +546,24 @@ uint32_t mvl2s_r( { FOR( i = 0; i < n; i++ ) { - temp = L_shr( x[i], q_x - 1 ); + temp = L_shr( x[i], sub( q_x, 1 ) ); temp = L_shr( L_add( temp, 1 ), 1 ); - IF( temp > MAX16B ) + IF( GT_32( temp, MAX16B ) ) { temp = MAX16B; - noClipping++; + move32(); + noClipping = L_add( (Word32) noClipping, 1 ); } - ELSE IF( temp < MIN16B ) + ELSE IF( LT_32( temp, MIN16B ) ) { temp = MIN16B; - noClipping++; + move32(); + noClipping = L_add( (Word32) noClipping, 1 ); } - y[i] = (Word16) temp; + y[i] = extract_l( temp ); + move16(); } } ELSE @@ -561,18 +573,21 @@ uint32_t mvl2s_r( temp = L_shr( x[i], q_x - 1 ); temp = L_shr( L_add( temp, 1 ), 1 ); - IF( temp > MAX16B ) + IF( GT_32( temp, MAX16B ) ) { temp = MAX16B; - noClipping++; + move32(); + noClipping = L_add( (Word32) noClipping, 1 ); } - ELSE IF( temp < MIN16B ) + ELSE IF( LT_32( temp, MIN16B ) ) { temp = MIN16B; - noClipping++; + move32(); + noClipping = L_add( (Word32) noClipping, 1 ); } - y[i] = (Word16) temp; + y[i] = extract_l( temp ); + move16(); } } @@ -710,7 +725,7 @@ Word16 maximum_s( } } - IF( max != NULL ) + if ( max != NULL ) { *max = tmp; move16(); @@ -761,19 +776,23 @@ Word16 maximum_l( ind = 0; tmp = vec[0]; - + move16(); + move32(); FOR( i = 1; i < lvec; i++ ) { IF( GT_32( vec[i], tmp ) ) { ind = i; tmp = vec[i]; + move16(); + move32(); } } IF( max_val != NULL ) { *max_val = tmp; + move32(); } return ind; @@ -883,7 +902,7 @@ Word16 minimum_s( } } - IF( min_val != NULL ) + if ( min_val != NULL ) { *min_val = tmp; move16(); @@ -939,19 +958,24 @@ Word16 minimum_l( ind = 0; tmp = vec[0]; + move16(); + move32(); - for ( i = 1; i < lvec; i++ ) + FOR( i = 1; i < lvec; i++ ) { - if ( LT_32( vec[i], tmp ) ) + IF( LT_32( vec[i], tmp ) ) { ind = i; tmp = vec[i]; + move16(); + move32(); } } if ( min_val != NULL ) { *min_val = tmp; + move32(); } return ind; @@ -1102,12 +1126,15 @@ Word32 dotp_fixed_o( suma = W_add( suma, W_shr( W_mult_32_32( x[i], y[i] ), log_len ) ); } *res_q = add( sub( *res_q, log_len ), 1 ); + move16(); + test(); WHILE( GT_64( suma, MAX_32 ) || GT_16( *res_q, 31 ) ) { suma = W_shr( suma, 1 ); *res_q = sub( *res_q, 1 ); + move16(); } - return (Word32) suma; + return W_extract_l( suma ); } /*---------------------------------------------------------------------* * inv_sqrt() @@ -1249,6 +1276,7 @@ void v_add_fixed( FOR( i = 0; i < N; i++ ) { y[i] = L_add( L_shr( x1[i], hdrm ), L_shr( x2[i], hdrm ) ); + move32(); } return; @@ -1266,15 +1294,17 @@ void v_add_fixed_me( ) { Word16 i; - Word16 x1_shift = s_max( x1_e, x2_e ) - x1_e; - Word16 x2_shift = s_max( x1_e, x2_e ) - x2_e; + Word16 x1_shift = sub( s_max( x1_e, x2_e ), x1_e ); + Word16 x2_shift = sub( s_max( x1_e, x2_e ), x2_e ); FOR( i = 0; i < N; i++ ) { y[i] = L_add( L_shr( x1[i], hdrm + x1_shift ), L_shr( x2[i], hdrm + x2_shift ) ); + move32(); } - *y_e = s_max( x1_e, x2_e ) + hdrm; + *y_e = add( s_max( x1_e, x2_e ), hdrm ); + move16(); return; } @@ -1299,6 +1329,7 @@ void v_add_w64( FOR( i = 0; i < N; i++ ) { y[i] = W_add( W_shr( x1[i], hdrm ), W_shr( x2[i], hdrm ) ); + move64(); } return; @@ -1347,6 +1378,7 @@ void v_sub_fixed( FOR( i = 0; i < N; i++ ) { y[i] = L_sub( L_shr( x1[i], hdrm ), L_shr( x2[i], hdrm ) ); + move32(); } return; @@ -1370,6 +1402,7 @@ void v_mult_fixed( FOR( i = 0; i < N; i++ ) { y[i] = Mpy_32_32( x1[i], x2[i] ); + move32(); } return; @@ -1434,6 +1467,7 @@ void v_multc_fixed( FOR( i = 0; i < N; i++ ) { y[i] = Mpy_32_32( c, x[i] ); + move32(); } return; @@ -1451,6 +1485,7 @@ void v_multc_fixed_16( FOR( i = 0; i < N; i++ ) { y[i] = Mpy_32_16_1( x[i], c ); + move32(); } return; @@ -1468,6 +1503,7 @@ void v_multc_fixed_16_16( FOR( i = 0; i < N; i++ ) { y[i] = mult_r( x[i], c ); + move16(); } return; @@ -1838,8 +1874,10 @@ void sort_l( FOR( j = i + 1; ( j < len ) && ( tempr > x[j] ); j++ ) { x[j - 1] = x[j]; + move32(); } x[j - 1] = tempr; + move32(); } return; @@ -2235,7 +2273,14 @@ Word32 anint_fixed( Word32 x, Word16 exp ) { return 0; } - return GE_32( x, 0 ) ? L_add( x, L_shl( 1, exp - 1 ) ) : L_sub( x, L_shl( 1, exp - 1 ) ); + IF( GE_32( x, 0 ) ) + { + return L_add( x, L_shl( 1, exp - 1 ) ); + } + ELSE + { + return L_sub( x, L_shl( 1, exp - 1 ) ); + } } /*-------------------------------------------------------------------* @@ -2246,10 +2291,11 @@ Word32 anint_fixed( Word32 x, Word16 exp ) Word32 ceil_fixed( Word32 x, Word16 exp ) { Word32 step; - step = x / L_shl( 1, exp ); - IF( GT_32( x % L_shl( 1, exp ), 0 ) ) + // step = x / L_shl( 1, exp ); + step = L_shr( x, exp ); + if ( ( x % L_shl( 1, exp ) ) > 0 ) { - step++; + step = L_add( step, 1 ); } return L_shl( step, exp ); } diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 98568a301..6369b678f 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -308,6 +308,7 @@ Word16 usquant_fx( /* o: index of the winning codeword */ Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif /* idx = (short)( (x - qlow)/delta + 0.5f); */ @@ -351,6 +352,7 @@ Word32 Dot_product( /* o : Sum */ Word64 L64_sum; L64_sum = 1; + move64(); FOR( i = 0; i < lg; i++ ) { L64_sum = W_mac_16_16( L64_sum, x[i], y[i] ); @@ -398,6 +400,7 @@ Word32 sum2_fx( /* o : sum of all squared vector elements Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif L_tmp = L_deposit_l( 0 ); FOR( i = 0; i < lvec; i++ ) @@ -421,6 +424,7 @@ Word32 sum2_fx_mod( /* o : sum of all squared vector element Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif L_tmp = L_deposit_l( 0 ); @@ -526,6 +530,7 @@ void Copy_pword( y[i].v.im = x[i].v.im; y[i].v.re = x[i].v.re; move16(); + move16(); } } ELSE @@ -535,6 +540,7 @@ void Copy_pword( y[i].v.im = x[i].v.im; y[i].v.re = x[i].v.re; move16(); + move16(); } } } @@ -603,6 +609,7 @@ void set32_fx( FOR( i = 0; i < N; i++ ) { y[i] = L_deposit_l( tmp ); + move32(); } } ELSE @@ -632,6 +639,7 @@ void Copy_Scale_sig( Word16 tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif IF( exp0 == 0 ) { @@ -678,6 +686,7 @@ void Copy_Scale_sig_16_32( Word16 tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif @@ -686,6 +695,7 @@ void Copy_Scale_sig_16_32( FOR( i = 0; i < lg; i++ ) { y[i] = L_deposit_l( x[i] ); + move32(); } return; } @@ -699,6 +709,7 @@ void Copy_Scale_sig_16_32( #else y[i] = L_deposit_l( shl( x[i], exp0 ) ); #endif + move32(); } return; } @@ -725,6 +736,7 @@ void Copy_Scale_sig_16_32_no_sat( Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif @@ -733,6 +745,7 @@ void Copy_Scale_sig_16_32_no_sat( FOR( i = 0; i < lg; i++ ) { y[i] = L_deposit_l( x[i] ); + move32(); } return; } @@ -746,6 +759,7 @@ void Copy_Scale_sig_16_32_no_sat( #else y[i] = L_deposit_l( shl( x[i], exp0 ) ); #endif + move32(); } return; } @@ -773,6 +787,7 @@ void Copy_Scale_sig_32_16( Word16 tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif tmp = add( 16, exp0 ); @@ -785,6 +800,7 @@ void Copy_Scale_sig_32_16( #else y[i] = round_fx( L_shl( x[i], tmp ) ); #endif + move16(); } } ELSE @@ -796,6 +812,7 @@ void Copy_Scale_sig_32_16( #else y[i] = round_fx( x[i] ); #endif + move16(); } } } @@ -814,6 +831,7 @@ void Scale_sig32( Word16 i; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif FOR( i = 0; i < lg; i++ ) @@ -1177,7 +1195,6 @@ Word16 maximum_abs_32_fx( /* o : index of the maximum abs va ind = 0; move16(); tmp = L_abs( vec[0] ); - move16(); FOR( j = 1; j < lvec; j++ ) { @@ -1347,6 +1364,7 @@ void conv_fx( Word32 L_sum; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif y[0] = mult_r( x[0], h[0] ); move16(); @@ -1427,6 +1445,7 @@ Word16 var_fx( /* o: variance of vector Qx*/ Word32 L_tmp; L_tmp = x[0]; + move32(); FOR( i = 1; i < len; i++ ) { L_tmp = L_add( L_tmp, x[i] ); /*Qx */ @@ -1591,7 +1610,7 @@ Word16 vquant_fx( /* o: index of the winning codevector FOR( c = 0; c < cbsize; c++ ) { L_dist = 0; - move16(); + move32(); FOR( d = 0; d < dim; d++ ) { @@ -1655,6 +1674,7 @@ Word16 w_vquant_fx( Word32 dist, minDist; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif @@ -1874,12 +1894,16 @@ Word16 emaximum_32fx( /* o : return index with max energy va { W_tmp = W_mult0_32_32( vec[j], vec[j] ); W_tmp1 = W_sub( W_tmp, emax ); - IF( GT_64( W_tmp1, 0 ) ) + if ( W_tmp1 > 0 ) { ind = j; move16(); } - emax = GT_64( emax, W_tmp ) ? emax : W_tmp; + if ( LE_64( emax, W_tmp ) ) + { + emax = W_tmp; + move64(); + } } #ifdef BASOP_NOGLOB @@ -1887,7 +1911,7 @@ Word16 emaximum_32fx( /* o : return index with max energy va #else /* BASOP_NOGLOB */ *ener_max = L_shr( emax, add( Qvec, Qvec ) ); #endif /* BASOP_NOGLOB */ - move64(); + move32(); return ind; } @@ -1969,7 +1993,7 @@ Word16 Random( /* o : output random value */ ) { *seed = extract_l( L_mac0( 13849L, *seed, 31821 ) ); - + move16(); return *seed; } @@ -2205,6 +2229,7 @@ void pz_filter_sp_fx( Ltemp1 = L_add( L_shr( Lacc, s ), 0x08000 ); /* Ltemp1 in Qc+Qa+Qn=Q(Qn) */ #endif y[i] = extract_h( Ltemp1 ); /* y[i] in Qn */ + move16(); } } @@ -2217,9 +2242,10 @@ Word32 root_a_fx( Word16 exp, tmp; Word32 L_tmp; - if ( a <= 0 ) + IF( a <= 0 ) { *exp_out = 0; + move16(); return 0; } @@ -2249,9 +2275,10 @@ Word32 root_a_over_b_fx( Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif test(); - if ( ( a <= 0 ) || ( b <= 0 ) ) + IF( ( a <= 0 ) || ( b <= 0 ) ) { *exp_out = 0; move16(); @@ -2334,6 +2361,7 @@ void fir_fx( const Word16 x[], /* i : input vector Word32 s; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif /* prepare the input buffer (copy and update memory) */ Copy( mem, buf_in, K ); @@ -2365,6 +2393,7 @@ void fir_fx( const Word16 x[], /* i : input vector s = L_shl( s, shift ); y[i] = round_fx( s ); /*Qx */ #endif + move16(); } } @@ -2386,6 +2415,7 @@ void v_add_32( for ( i = 0; i < N; i++ ) { y[i] = L_add( x1[i], x2[i] ); + move32(); } return; @@ -2403,6 +2433,7 @@ void v_shr_32( for ( i = 0; i < N; i++ ) { y[i] = L_shr( x1[i], shift ); + move32(); } return; @@ -2424,9 +2455,10 @@ void v_sub_32( { Word16 i; - for ( i = 0; i < N; i++ ) + FOR( i = 0; i < N; i++ ) { - y[i] = x1[i] - x2[i]; + y[i] = L_sub( x1[i], x2[i] ); + move32(); } return; @@ -2450,7 +2482,8 @@ void v_add_16( for ( i = 0; i < N; i++ ) { - y[i] = x1[i] + x2[i]; + y[i] = add_sat( x1[i], x2[i] ); + move16(); } return; @@ -2474,7 +2507,8 @@ void v_sub_16( for ( i = 0; i < N; i++ ) { - y[i] = x1[i] - x2[i]; + y[i] = sub_sat( x1[i], x2[i] ); + move16(); } return; @@ -2613,6 +2647,7 @@ void pz_filter_dp_fx( Ltemp1 = L_shr( Lacc, s ); /* Ltemp1 in Qc+Qa+Qn=Q(16+Qn) */ #endif y[i] = extract_h( Ltemp1 ); /* y[i] in Qn */ + move16(); } } @@ -2639,6 +2674,7 @@ void Copy_Scale_sig32_16( #else *dst++ = round_fx( *src++ ); #endif + move16(); } return; } @@ -2654,6 +2690,7 @@ void Copy_Scale_sig32_16( *dst++ = round_fx( L_temp ); #endif + move16(); } } @@ -2745,6 +2782,7 @@ void v_L_mult_1616( for ( i = 0; i < N; i++ ) { y[i] = L_mult( x1[i], x2[i] ); + move32(); } return; @@ -2768,6 +2806,7 @@ void v_L_mult_3216( for ( i = 0; i < N; i++ ) { y[i] = Mpy_32_16_1( x1[i], x2[i] ); + move32(); } return; @@ -2792,6 +2831,7 @@ void add_vec_fx( Word16 i, Qyx1, Qyx2; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif Qyx1 = sub( Qx1, Qy ); Qyx2 = sub( Qx2, Qy ); @@ -2929,6 +2969,7 @@ Word32 Calc_Energy_Autoscaled( /* o: Result (Energy) Word16 i, j; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif Overflow = 0; @@ -3158,6 +3199,7 @@ Word16 find_rem( Word16 n, Word16 m, Word16 *r ) q1 = extract_l( Lacc ); Ltemp2 = L_shr( Lacc, q2 ); *r = extract_h( Ltemp2 ); + move16(); return ( q1 ); } @@ -3205,6 +3247,7 @@ Word32 find_remd( Word32 n, Word32 m, Word32 *r ) } } *r = L_shr( Lacc, q2 ); + move16(); return ( qo ); } @@ -3224,11 +3267,11 @@ Word16 rint_new_fx( { a = add( extract_h( x ), 1 ); - if ( s_and( a, 1 ) == 0 ) + IF( s_and( a, 1 ) == 0 ) { return a; } - if ( s_and( a, 1 ) != 0 ) + IF( s_and( a, 1 ) != 0 ) { return extract_h( x ); } @@ -3381,6 +3424,8 @@ void Acelp_dec_total_exc( L_tmp = L_add( L_tmp, L_shl( L_mult( gain_code16, code_fx[i] ), 6 ) ); /*Q16+Q_exc*/ exc_fx[i + i_subfr] = round_fx( L_tmp ); /*Q_exc*/ #endif + move16(); + move16(); } } @@ -3394,9 +3439,11 @@ UWord32 UL_inverse( const UWord32 UL_val, Word16 *exp ) UWord32 UL_tmp; *exp = norm_ul( UL_val ); + move16(); UL_tmp = UL_lshl( UL_val, *exp ); /* Q32 */ *exp = add( 32, sub( 31, *exp ) ); + move16(); return UL_div( 0x80000000, UL_tmp ); } @@ -3446,7 +3493,7 @@ Word16 ratio( const Word32 numer, const Word32 denom, Word16 *expo ) quotient = div_s( manNumer, manDenom ); /* in Q14 */ *expo = sub( expNumer, expDenom ); - + move16(); return quotient; /* Q14 */ } @@ -3494,7 +3541,7 @@ void hp400_12k8_fx( L_tmp3 = L_mult( mem[4], b_hp400_fx[2] ); mem[5] = signal[lg - 2]; - + move16(); FOR( i = 1; i < lg; i++ ) { /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] */ @@ -3520,6 +3567,7 @@ void hp400_12k8_fx( /* signal is divided by 16 to avoid overflow in energy computation */ *signal++ = round_fx( L_tmp ); + move16(); } /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] */ @@ -3541,6 +3589,7 @@ void hp400_12k8_fx( /* signal is divided by 16 to avoid overflow in energy computation */ *signal++ = round_fx( L_tmp ); + move16(); return; } @@ -3631,6 +3680,7 @@ Word16 dot_prod_satcontr( const Word16 *x, const Word16 *y, Word16 qx, Word16 qy Word16 *pt1, *pt2; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif @@ -3675,7 +3725,7 @@ Word16 dot_prod_satcontr( const Word16 *x, const Word16 *y, Word16 qx, Word16 qy ener = extract_h( L_tmp ); /*Q(qx+qy-shift+q-16) */ q = add( q, add( qx, qy ) ); *qo = sub( q, add( shift, 16 ) ); - + move16(); return ener; } @@ -3706,12 +3756,14 @@ void E_UTIL_f_convolve( const Word16 x[], const Word16 h[], Word16 y[], const Wo FOR( n = 0; n < size; n++ ) { L64_sum = 0; + move64(); FOR( i = 0; i < n; i++ ) { L64_sum = W_mac_16_16( L64_sum, x[i], h[n - i] ); } L_sum = W_sat_l( L64_sum ); y[n] = mac_r( L_sum, x[i], h[0] ); + move16(); } return; } @@ -3737,7 +3789,7 @@ void floating_point_add( accY = L_shr( my, 1 ); /* First, align the Q-points of the two operands. Then, add. */ align = sub( *ex, ey ); - test(); + IF( align < 0 ) { accX = L_add( accX, L_shl( accY, align ) ); @@ -3752,6 +3804,8 @@ void floating_point_add( expo = norm_l( accX ); *mx = L_shl( accX, expo ); *ex = sub( add( *ex, expo ), 1 ); /* Subtract 1 due to 1-bit down-shift above ensuring 1 bit headroom before addition. */ + move32(); + move16(); return; } /*-------------------------------------------------------------------* @@ -3770,8 +3824,8 @@ void delay_signal( Word16 tmp_buffer[L_FRAME48k]; Copy( mem, tmp_buffer, delay ); - Copy( x + len - delay, mem, delay ); - Copy( x, x + delay, len - delay ); + Copy( x + sub( len, delay ), mem, delay ); + Copy( x, x + delay, sub( len, delay ) ); Copy( tmp_buffer, x, delay ); return; @@ -3781,15 +3835,15 @@ void delay_signal_fx( Word32 x[], /* i/o: signal to be delayed */ const Word16 len, /* i : length of the input signal */ Word32 mem[], /* i/o: synchronization memory */ - const int16_t delay /* i : delay in samples */ + const Word16 delay /* i : delay in samples */ ) { Word32 tmp_buffer[L_FRAME48k]; Copy32( mem, tmp_buffer, delay ); - Copy32( x + len - delay, mem, delay ); - Copy32( x, x + delay, len - delay ); + Copy32( x + sub( len, delay ), mem, delay ); + Copy32( x, x + delay, sub( len, delay ) ); Copy32( tmp_buffer, x, delay ); return; @@ -3797,9 +3851,9 @@ void delay_signal_fx( #ifdef IVAS_FLOAT_FIXED void delay_signal_q_adj_fx( Word32 x[], /* i/o: signal to be delayed */ - const int16_t len, /* i : length of the input signal */ + const Word16 len, /* i : length of the input signal */ Word32 mem[], /* i/o: synchronization memory */ - const int16_t delay, /* i : delay in samples */ + const Word16 delay, /* i : delay in samples */ const Word16 q_x, const Word16 q_mem ) { @@ -3807,8 +3861,8 @@ void delay_signal_q_adj_fx( Word32 tmp_buffer[L_FRAME48k]; Copy32( mem, tmp_buffer, delay ); - Copy32( x + len - delay, mem, delay ); - Copy32( x, x + delay, len - delay ); + Copy32( x + sub( len, delay ), mem, delay ); + Copy32( x, x + delay, sub( len, delay ) ); IF( EQ_16( q_x, q_mem ) ) @@ -3828,55 +3882,66 @@ void v_add_fx( const Word32 x1[], /* i : Input vector 1 */ const Word32 x2[], /* i : Input vector 2 */ Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ - const int16_t N /* i : Vector length */ + const Word16 N /* i : Vector length */ ) { - int16_t i; + Word16 i; - for ( i = 0; i < N; i++ ) + FOR( i = 0; i < N; i++ ) { y[i] = L_add_sat( x1[i], x2[i] ); + move32(); } return; } Word16 floor_log_2( Word32 num ) { - return num < 2 ? 0 : num < 4 ? 1 - : num < 8 ? 2 - : num < 16 ? 3 - : num < 32 ? 4 - : num < 64 ? 5 - : num < 128 ? 6 - : num < 256 ? 7 - : num < 512 ? 8 - : num < 1024 ? 9 - : num < 2048 ? 10 - : num < 4096 ? 11 - : num < 8192 ? 12 - : num < 16384 ? 13 - : num < 32768 ? 14 - : num < 65536 ? 15 - : num < 131072 ? 16 - : num < 262144 ? 17 - : num < 524288 ? 18 - : num < 1048576 ? 19 - : num < 2097152 ? 20 - : 21; +#if 0 + return num < 2 ? 0 : num < 4 ? 1 + : num < 8 ? 2 + : num < 16 ? 3 + : num < 32 ? 4 + : num < 64 ? 5 + : num < 128 ? 6 + : num < 256 ? 7 + : num < 512 ? 8 + : num < 1024 ? 9 + : num < 2048 ? 10 + : num < 4096 ? 11 + : num < 8192 ? 12 + : num < 16384 ? 13 + : num < 32768 ? 14 + : num < 65536 ? 15 + : num < 131072 ? 16 + : num < 262144 ? 17 + : num < 524288 ? 18 + : num < 1048576 ? 19 + : num < 2097152 ? 20 + : 21; +#endif + + IF( EQ_32( num, 0 ) ) + { + return 0; + } + + return ( sub( 30, norm_l( num ) ) ); } void v_shr( const Word32 x[], /* i : Input vector */ const Word16 shift, /* i : Constant */ - Word32 y[], /* o : Output vector that contains x >> shift */ + Word32 y[], /* o : Output vector that contains x >> shift */ const Word16 N /* i : Vector length */ ) { Word16 i; - for ( i = 0; i < N; i++ ) + FOR( i = 0; i < N; i++ ) { y[i] = L_shr( x[i], shift ); + move32(); } return; @@ -3891,9 +3956,10 @@ void v_shr_16( { Word16 i; - for ( i = 0; i < N; i++ ) + FOR( i = 0; i < N; i++ ) { y[i] = shr( x[i], shift ); + move16(); } return; @@ -3915,8 +3981,8 @@ void delay_signal32( Word32 tmp_buffer[L_FRAME48k]; Copy32( mem, tmp_buffer, delay ); - Copy32( x + len - delay, mem, delay ); - Copy32( x, x + delay, len - delay ); + Copy32( x + sub( len, delay ), mem, delay ); + Copy32( x, x + delay, sub( len, delay ) ); Copy32( tmp_buffer, x, delay ); return; @@ -3939,7 +4005,7 @@ Word16 lin_interp_fx( const Word16 flag_sat /* i : flag to indicate whether to apply saturation */ ) { - IF( EQ_16( sub( x2, x1 ), 0 ) ) + IF( sub( x2, x1 ) == 0 ) { return y1; } @@ -3947,11 +4013,25 @@ Word16 lin_interp_fx( { IF( GE_16( x, s_max( x1, x2 ) ) ) { - return GT_16( x1, x2 ) ? y1 : y2; + IF( GT_16( x1, x2 ) ) + { + return y1; + } + ELSE + { + return y2; + } } ELSE IF( LE_16( x, s_min( x1, x2 ) ) ) { - return LT_16( x1, x2 ) ? y1 : y2; + IF( LT_16( x1, x2 ) ) + { + return y1; + } + ELSE + { + return y2; + } } } @@ -3969,7 +4049,7 @@ Word32 sign_l( const Word32 x /* i : input value of x */ ) { - IF( LT_32( x, 0 ) ) + IF( x < 0 ) { return MIN_32; } @@ -3991,6 +4071,7 @@ void v_mult16_fixed( FOR( i = 0; i < N; i++ ) { y[i] = mult_r( x1[i], x2[i] ); + move16(); } return; diff --git a/lib_com/trans_direct_fx.c b/lib_com/trans_direct_fx.c index b088be832..32d94aa49 100644 --- a/lib_com/trans_direct_fx.c +++ b/lib_com/trans_direct_fx.c @@ -44,6 +44,7 @@ void direct_transform_fx( #ifdef REMOVE_IVAS_UNUSED_PARAMETERS_WARNING (void) ( element_mode ); #endif + move16(); segment_length = shr( L, 1 ); segment_length2 = shr( segment_length, 1 ); @@ -68,10 +69,8 @@ void direct_transform_fx( win_fx = wscw16q15_16_fx; } - sh_fx = &in32_fx[L - 1]; - add( 0, 0 ); - sl_fx = &in32_r16_fx[L - 1]; - add( 0, 0 ); + sh_fx = &in32_fx[sub( L, 1 )]; + sl_fx = &in32_r16_fx[sub( L, 1 )]; FOR( i = 0; i < segment_length; i++ ) { in32_r16_fx[i] = ( *sh_fx-- ); @@ -81,16 +80,13 @@ void direct_transform_fx( } iseg_fx = &in32_r16_fx[-segment_length4]; - add( 0, 0 ); oseg_fx = out32_fx; wh_fx = &win_fx[segment_length4]; - add( 0, 0 ); wl_fx = wh_fx - 1; shift = extract_l( L_mult0( 3, segment_length4 ) ); sh_fx = &iseg_fx[shift]; - add( 0, 0 ); sl_fx2 = sh_fx - 1; @@ -101,8 +97,7 @@ void direct_transform_fx( move32(); /*Q */ } - sl_fx2 = &iseg_fx[segment_length2 - 1]; - add( 0, 0 ); + sl_fx2 = &iseg_fx[sub( segment_length2, 1 )]; FOR( i = segment_length4; i < segment_length2; i++ ) { @@ -116,17 +111,13 @@ void direct_transform_fx( Qmin = s_min( Qs[0], Qmin ); iseg_fx += segment_length2; - add( 0, 0 ); oseg_fx += segment_length2; - add( 0, 0 ); FOR( seg = 1; seg < NUM_TIME_SWITCHING_BLOCKS - 1; seg++ ) { wh_fx = &win_fx[segment_length4]; - add( 0, 0 ); wl_fx = wh_fx - 1; sh_fx = &iseg_fx[shift]; - add( 0, 0 ); sl_fx2 = sh_fx - 1; FOR( i = 0; i < segment_length4; i++ ) { @@ -136,10 +127,8 @@ void direct_transform_fx( } sh_fx = iseg_fx; - sl_fx2 = &iseg_fx[segment_length2 - 1]; - add( 0, 0 ); - wh_fx = &win_fx[segment_length2 - 1]; - add( 0, 0 ); + sl_fx2 = &iseg_fx[sub( segment_length2, 1 )]; + wh_fx = &win_fx[sub( segment_length2, 1 )]; wl_fx = win_fx; FOR( i = segment_length4; i < segment_length2; i++ ) @@ -155,13 +144,10 @@ void direct_transform_fx( Qmin = s_min( Qs[seg], Qmin ); iseg_fx += segment_length2; - add( 0, 0 ); oseg_fx += segment_length2; - add( 0, 0 ); } - sh_fx = &iseg_fx[shift - 1]; - add( 0, 0 ); + sh_fx = &iseg_fx[sub( shift, 1 )]; FOR( i = 0; i < segment_length4; i++ ) { dctin32_fx[i] = L_negate( *sh_fx-- ); @@ -170,10 +156,8 @@ void direct_transform_fx( sh_fx = iseg_fx; - sl_fx2 = &iseg_fx[segment_length2 - 1]; - add( 0, 0 ); - wh_fx = &win_fx[segment_length2 - 1]; - add( 0, 0 ); + sl_fx2 = &iseg_fx[sub( segment_length2, 1 )]; + wh_fx = &win_fx[sub( segment_length2, 1 )]; wl_fx = win_fx; FOR( i = segment_length4; i < segment_length2; i++ ) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index f94faadc5..ae75fcf2f 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1005,7 +1005,7 @@ static ivas_error ivas_dirac_rend_config_fx( { ivas_dirac_free_mem_fx( &( hDirACRend->stack_mem ) ); } - IF( NE_32( ( error = ivas_dirac_alloc_mem( hDirACRend, st_ivas->renderer_type, hSpatParamRendCom->num_freq_bands, &( hDirACRend->stack_mem ), hodirac_flag ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_alloc_mem_fx( hDirACRend, st_ivas->renderer_type, hSpatParamRendCom->num_freq_bands, &( hDirACRend->stack_mem ), hodirac_flag ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 5dafca0bc..d844c7435 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2290,7 +2290,7 @@ ivas_error ivas_init_decoder_fx( } ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), - st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); } FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) @@ -3114,7 +3114,7 @@ ivas_error ivas_init_decoder_fx( * Allocate and initialize limiter struct *-----------------------------------------------------------------*/ - IF( NE_32( ( error = ivas_limiter_open( &st_ivas->hLimiter, hDecoderConfig->nchan_out, output_Fs ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_limiter_open_fx( &st_ivas->hLimiter, hDecoderConfig->nchan_out, output_Fs ) ), IVAS_ERR_OK ) ) { return error; } @@ -4890,7 +4890,7 @@ void ivas_destroy_dec_fx( ivas_param_mc_dec_close_fx( &st_ivas->hParamMC ); /* EFAP handle */ - efap_free_data( &st_ivas->hEFAPdata ); + efap_free_data_fx( &st_ivas->hEFAPdata ); /* VBAP handle */ vbap_free_data_fx( &( st_ivas->hVBAPdata ) ); @@ -4962,7 +4962,7 @@ void ivas_destroy_dec_fx( ivas_render_config_close( &( st_ivas->hRenderConfig ) ); /* Limiter struct */ - ivas_limiter_close( &( st_ivas->hLimiter ) ); + ivas_limiter_close_fx( &( st_ivas->hLimiter ) ); IF( st_ivas->hDecoderConfig != NULL ) { diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index b806bc79c..5a62afa9e 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -175,7 +175,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( IF( NE_16( st_ivas->ism_mode, last_ism_mode ) ) { /* EFAP handle */ - efap_free_data( &st_ivas->hEFAPdata ); + efap_free_data_fx( &st_ivas->hEFAPdata ); } /*-----------------------------------------------------------------* diff --git a/lib_dec/pit_dec.c b/lib_dec/pit_dec.c index 250571511..3574218f3 100644 --- a/lib_dec/pit_dec.c +++ b/lib_dec/pit_dec.c @@ -41,6 +41,7 @@ #include "prot.h" #include "rom_com.h" #include "wmc_auto.h" +#ifndef IVAS_FLOAT_FIXED /*----------------------------------------------------------* * pit_decode_flt() @@ -837,3 +838,4 @@ void Mode2_delta_pit_dec_flt( return; } +#endif diff --git a/lib_rend/ivas_allrad_dec.c b/lib_rend/ivas_allrad_dec.c index 6ba37df9e..ca405c01d 100644 --- a/lib_rend/ivas_allrad_dec.c +++ b/lib_rend/ivas_allrad_dec.c @@ -292,7 +292,7 @@ ivas_error ivas_sba_get_hoa_dec_matrix_fx( // printf( "\n%f", ((float)*p_dec_mtx)/ ONE_IN_Q25 ); p_dec_mtx++; } - p_dec_mtx += sub( SBA_NHARM_HOA3, num_harm ); + p_dec_mtx += sub( SBA_NHARM_HOA3 , num_harm ); } } @@ -310,11 +310,11 @@ ivas_error ivas_sba_get_hoa_dec_matrix_fx( move32(); p_dec_mtx++; } - p_dec_mtx += sub( SBA_NHARM_HOA3, num_harm ); + p_dec_mtx += sub( SBA_NHARM_HOA3 , num_harm ); } /* free EFAP handle */ - efap_free_data( &hEFAP ); + efap_free_data_fx( &hEFAP ); } ELSE { diff --git a/lib_rend/ivas_dirac_output_synthesis_dec.c b/lib_rend/ivas_dirac_output_synthesis_dec.c index c5d73c231..013051554 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec.c @@ -62,7 +62,7 @@ #define DIRAC_ALPHA_MAX_FAST 0.12f #define DIRAC_ALPHA_MAX_FAST_Q15 3932 #define DIRECTION_SMOOTHNESS_ALPHA 0.01f -#define DIRECTION_SMOOTHNESS_ALPHA_Q31 ( Word32 )( 0.01f * ONE_IN_Q31 ) +#define DIRECTION_SMOOTHNESS_ALPHA_Q31 ( 21474836 ) #ifdef IVAS_FLOAT_FIXED #define POINT_3679_Q31 790059234 @@ -83,8 +83,15 @@ static void computeTargetPSDs_diffuse_fx( const Word16 num_channels, const Word1 static void computeTargetPSDs_diffuse_subframe_fx( const Word16 num_channels, const Word16 num_freq_bands, const Word16 start_band, const Word32 *diffuse_power_factor, const Word32 *reference_power, const Word16 *q_reference_power, const Word32 *diffuse_responses_square, Word32 *cy_auto_diff_smooth, Word16 *q_cy_auto_diff_smooth ); static void computeTargetPSDs_diffuse_with_onsets_fx( const Word16 num_channels, const Word16 num_freq_bands, const Word16 num_decorr_freq_bands, const Word16 *proto_frame_diff_index, const Word32 *diffuse_power_factor, const Word32 *reference_power, const Word16 *q_reference_power, const Word32 *diffuse_responses_square, const Word32 *onset_filter, Word32 *cy_auto_diff_smooth, Word16 *q_cy_auto_diff_smooth ); -#else +static void computeAlphaSynthesis_fx( Word16 *alpha_synthesis_fx, const Word16 averaging_length_ms, const Word16 maxAlpha_fx, Word16 *numAlphas, const Word16 slot_size, const Word16 num_freq_bands, Word16 *frequency_axis_fx, const Word32 output_Fs ); + +static void spreadCoherencePanningHoa_fx( const Word16 azimuth, const Word16 elevation, const Word16 spreadCoh_fx, Word32 *direct_response_fx, Word16 *Q_direct_response_hoa, const Word16 num_channels_dir, const Word16 ambisonics_order ); + +static void spreadCoherencePanningVbap_fx( const Word16 azimuth, const Word16 elevation, const Word16 spreadCoh_fx, Word32 *direct_response_fx, Word16 *Q_direct_response, const Word16 num_channels_dir, const VBAP_HANDLE hVBAPdata ); + +static void normalizePanningGains_fx( Word32 *direct_response_fx, Word16 *q_direct_res, const Word16 num_channels_dir ); +#else static void computeTargetPSDs_direct( const int16_t num_channels, const int16_t num_freq_bands, const float *direct_power_factor, const float *reference_power, const float *direct_responses, const float *direct_responses_square, float *cy_auto_dir_smooth, float *cy_cross_dir_smooth ); static void computeTargetPSDs_direct_subframe( const int16_t num_channels, const int16_t num_freq_bands, const float *direct_power_factor, const float *reference_power, const float *direct_responses, const float *direct_responses_square, float *cy_auto_dir_smooth, float *cy_cross_dir_smooth ); @@ -94,29 +101,17 @@ static void computeTargetPSDs_diffuse( const int16_t num_channels, const int16_t static void computeTargetPSDs_diffuse_subframe( const int16_t num_channels, const int16_t num_freq_bands, const int16_t start_band, const float *diffuse_power_factor, const float *reference_power, const float *diffuse_responses_square, float *cy_auto_diff_smooth ); static void computeTargetPSDs_diffuse_with_onsets( const int16_t num_channels, const int16_t num_freq_bands, const int16_t num_decorr_freq_bands, const int16_t *proto_frame_diff_index, const float *diffuse_power_factor, const float *reference_power, const float *diffuse_responses_square, const float *onset_filter, float *cy_auto_diff_smooth ); -#endif -#ifndef IVAS_FLOAT_FIXED -static void computeAlphaSynthesis( float *alpha_synthesis, const int16_t averaging_length_ms, const float maxAlpha, int16_t *numAlphas, const int16_t slot_size, const int16_t num_freq_bands, const float *frequency_axis, const int32_t output_Fs ); -#endif - -#ifdef IVAS_FLOAT_FIXED -static void computeAlphaSynthesis_fx( Word16 *alpha_synthesis_fx, const int16_t averaging_length_ms, const Word16 maxAlpha_fx, int16_t *numAlphas, const int16_t slot_size, const int16_t num_freq_bands, Word16 *frequency_axis_fx, const int32_t output_Fs ); - -static void spreadCoherencePanningHoa_fx( const Word16 azimuth, const Word16 elevation, const Word16 spreadCoh_fx, Word32 *direct_response_fx, Word16 *Q_direct_response_hoa, const Word16 num_channels_dir, const Word16 ambisonics_order ); -static void spreadCoherencePanningVbap_fx( const int16_t azimuth, const int16_t elevation, const Word16 spreadCoh_fx, Word32 *direct_response_fx, Word16 *Q_direct_response, const int16_t num_channels_dir, const VBAP_HANDLE hVBAPdata ); +static void computeAlphaSynthesis( float *alpha_synthesis, const int16_t averaging_length_ms, const float maxAlpha, int16_t *numAlphas, const int16_t slot_size, const int16_t num_freq_bands, const float *frequency_axis, const int32_t output_Fs ); -static void normalizePanningGains_fx( Word32 *direct_response_fx, Word16 *q_direct_res, const Word16 num_channels_dir ); -#endif -#ifndef IVAS_FLOAT_FIXED static void spreadCoherencePanningHoa( const int16_t azimuth, const int16_t elevation, const float spreadCoh, float *direct_response, const int16_t num_channels_dir, const int16_t ambisonics_order ); -#ifndef IVAS_FLOAT_FIXED + static void spreadCoherencePanningVbap( const int16_t azimuth, const int16_t elevation, const float spreadCoh, float *direct_response, const int16_t num_channels_dir, const VBAP_HANDLE hVBAPdata ); -#endif // !IVAS_FLOAT_FIXED static void normalizePanningGains( float *direct_response, const int16_t num_channels_dir ); #endif + /*------------------------------------------------------------------------- * ivas_dirac_dec_output_synthesis_open() * @@ -124,23 +119,25 @@ static void normalizePanningGains( float *direct_response, const int16_t num_cha *------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -extern Word16 find_guarded_bits_fx( Word32 n ); - ivas_error ivas_dirac_dec_output_synthesis_open_fx( SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ RENDERER_TYPE renderer_type, /* i : renderer type */ - const int16_t nchan_transport, /* i : number of transport channels */ - const int32_t output_Fs, /* i : output sampling rate */ - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ + const Word16 nchan_transport, /* i : number of transport channels */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { - int16_t idx, ch_idx; - int16_t size; - uint16_t num_diffuse_responses; - Word16 tmp_fx; + Word16 idx, ch_idx; + Word16 size; + UWord16 num_diffuse_responses; + Word16 tmp_fx, tmp16; Word16 temp_alpha_synthesis_fx[CLDFB_NO_CHANNELS_MAX]; Word16 interpolator_tbl[JBM_CLDFB_SLOTS_IN_SUBFRAME] = { 8192, 16384, 24576, MAX16B }; /* idx / JBM_CLDFB_SLOTS_IN_SUBFRAME Q15 */ + move16(); + move16(); + move16(); + move16(); /* pointers to structs for allocation */ DIRAC_OUTPUT_SYNTHESIS_PARAMS *dirac_output_synthesis_params = &( hDirACRend->h_output_synthesis_psd_params ); @@ -157,10 +154,12 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( IF( hDirACRend->proto_signal_decorr_on ) { dirac_output_synthesis_params->max_band_decorr = hDirACRend->h_freq_domain_decorr_ap_params->max_band_decorr; + move16(); } ELSE { dirac_output_synthesis_params->max_band_decorr = 0; + move16(); } /*-----------------------------------------------------------------* @@ -169,7 +168,7 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( dirac_output_synthesis_state->diffuse_responses_square_fx = NULL; - IF( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_MONO ) + IF( EQ_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_MONO ) ) { IF( ( dirac_output_synthesis_state->diffuse_responses_square_fx = (Word32 *) malloc( 2 * sizeof( Word32 ) ) ) == NULL ) { @@ -187,21 +186,25 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( /* prototype power buffers */ dirac_output_synthesis_state->proto_power_smooth_prev_fx = NULL; - IF( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + IF( NE_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { IF( ( dirac_output_synthesis_state->proto_power_smooth_prev_fx = (Word32 *) malloc( hSpatParamRendCom->num_freq_bands * hDirACRend->num_protos_dir * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } - dirac_output_synthesis_state->proto_power_smooth_prev_len = hSpatParamRendCom->num_freq_bands * hDirACRend->num_protos_dir; + dirac_output_synthesis_state->proto_power_smooth_prev_len = imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->num_protos_dir ); + move16(); } - IF( dirac_output_synthesis_params->max_band_decorr > 0 && ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_LS || hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) ) + test(); + test(); + IF( dirac_output_synthesis_params->max_band_decorr > 0 && ( EQ_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_LS ) || EQ_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_SHD ) ) ) { IF( ( dirac_output_synthesis_state->proto_power_diff_smooth_prev_fx = (Word32 *) malloc( dirac_output_synthesis_params->max_band_decorr * hDirACRend->hOutSetup.nchan_out_woLFE * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } - dirac_output_synthesis_state->proto_power_diff_smooth_prev_len = dirac_output_synthesis_params->max_band_decorr * hDirACRend->hOutSetup.nchan_out_woLFE; + dirac_output_synthesis_state->proto_power_diff_smooth_prev_len = imult1616( dirac_output_synthesis_params->max_band_decorr, hDirACRend->hOutSetup.nchan_out_woLFE ); + move16(); } ELSE { @@ -217,25 +220,27 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( /* target PSD buffers */ IF( hodirac_flag ) { - size = hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir * DIRAC_HO_NUMSECTORS; + size = imult1616( imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ), DIRAC_HO_NUMSECTORS ); } ELSE { - size = hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir; + size = imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ); } IF( ( dirac_output_synthesis_state->cy_cross_dir_smooth_prev_fx = (Word32 *) malloc( size * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } dirac_output_synthesis_state->cy_cross_dir_smooth_prev_len = size; - IF( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + move16(); + IF( EQ_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { dirac_output_synthesis_state->cy_auto_dir_smooth_prev_fx = NULL; IF( ( dirac_output_synthesis_state->cy_auto_diff_smooth_prev_fx = (Word32 *) malloc( dirac_output_synthesis_params->max_band_decorr * hDirACRend->num_outputs_diff * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } - dirac_output_synthesis_state->cy_auto_dir_smooth_prev_len = dirac_output_synthesis_params->max_band_decorr * hDirACRend->num_outputs_diff; + dirac_output_synthesis_state->cy_auto_dir_smooth_prev_len = imult1616( dirac_output_synthesis_params->max_band_decorr, hDirACRend->num_outputs_diff ); + move16(); } ELSE { @@ -243,15 +248,17 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } - dirac_output_synthesis_state->cy_auto_dir_smooth_prev_len = hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir; + dirac_output_synthesis_state->cy_auto_dir_smooth_prev_len = imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ); + move16(); - IF( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) + IF( EQ_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_SHD ) ) { IF( ( dirac_output_synthesis_state->cy_auto_diff_smooth_prev_fx = (Word32 *) malloc( hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } - dirac_output_synthesis_state->cy_auto_diff_smooth_prev_len = hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir; + dirac_output_synthesis_state->cy_auto_diff_smooth_prev_len = imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ); + move16(); } ELSE { @@ -259,7 +266,8 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } - dirac_output_synthesis_state->cy_auto_diff_smooth_prev_len = hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_diff; + dirac_output_synthesis_state->cy_auto_diff_smooth_prev_len = imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_diff ); + move16(); } } @@ -269,21 +277,25 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } dirac_output_synthesis_state->gains_dir_prev_len = size; - IF( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + move16(); + test(); + IF( EQ_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { IF( ( dirac_output_synthesis_state->gains_diff_prev_fx = (Word32 *) malloc( dirac_output_synthesis_params->max_band_decorr * hDirACRend->num_outputs_diff * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } - dirac_output_synthesis_state->gains_diff_prev_len = dirac_output_synthesis_params->max_band_decorr * hDirACRend->num_outputs_diff; + dirac_output_synthesis_state->gains_diff_prev_len = imult1616( dirac_output_synthesis_params->max_band_decorr, hDirACRend->num_outputs_diff ); + move16(); } - ELSE IF( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_PSD_SHD && hDirACRend->synthesisConf != DIRAC_SYNTHESIS_MONO ) + ELSE IF( NE_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_SHD ) && NE_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_MONO ) ) { IF( ( dirac_output_synthesis_state->gains_diff_prev_fx = (Word32 *) malloc( hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_diff * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } - dirac_output_synthesis_state->gains_diff_prev_len = hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_diff; + dirac_output_synthesis_state->gains_diff_prev_len = imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_diff ); + move16(); } ELSE { @@ -291,7 +303,8 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } - dirac_output_synthesis_state->gains_diff_prev_len = hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir; + dirac_output_synthesis_state->gains_diff_prev_len = imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ); + move16(); } /*-----------------------------------------------------------------* @@ -299,7 +312,9 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( *-----------------------------------------------------------------*/ /* compute alpha */ - IF( !( renderer_type == RENDERER_BINAURAL_PARAMETRIC || renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) ) + test(); + test(); + IF( !( EQ_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) ) { computeAlphaSynthesis_fx( temp_alpha_synthesis_fx, DIRAC_AVG_LENGTH_SYNTH_MS, DIRAC_ALPHA_MAX_Q15, &dirac_output_synthesis_params->numAlphas, hSpatParamRendCom->slot_size, hSpatParamRendCom->num_freq_bands, hDirACRend->frequency_axis_fx, output_Fs ); @@ -323,6 +338,7 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( } set32_fx( dirac_output_synthesis_state->reference_power_smooth_prev_fx, 0, hSpatParamRendCom->num_freq_bands ); dirac_output_synthesis_state->reference_power_smooth_prev_q = Q31; + move16(); IF( ( dirac_output_synthesis_state->direction_smoothness_prev_fx = (Word32 *) malloc( hSpatParamRendCom->num_freq_bands * sizeof( Word32 ) ) ) == NULL ) { @@ -346,13 +362,15 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( } /* prepare diffuse response function */ - IF( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_MONO ) + IF( EQ_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_MONO ) ) { num_diffuse_responses = 2; + move16(); } ELSE { num_diffuse_responses = hDirACRend->hOutSetup.nchan_out_woLFE; + move16(); } IF( dirac_output_synthesis_state->diffuse_responses_square_fx != NULL ) @@ -369,47 +387,69 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( } - IF( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + IF( EQ_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { Word16 diff_compensation_order; Word32 diff_nrg_total_fx, diff_nrg_fx, diff_nrg_trans_fx, diff_nrg_decorr_fx; - diff_compensation_order = nchan_transport >= 3 ? 3 : 2; /* compensate missing diffuseness modelling up order 2, except for HR*/ + /* compensate missing diffuseness modelling up order 2, except for HR*/ + IF( GE_16( nchan_transport, 3 ) ) + { + diff_compensation_order = 3; + move16(); + } + ELSE + { + diff_compensation_order = 2; + move16(); + } diff_compensation_order = s_min( diff_compensation_order, hDirACRend->hOutSetup.ambisonics_order ); diff_nrg_total_fx = 0; + move32(); diff_nrg_trans_fx = 0; + move32(); diff_nrg_decorr_fx = 0; + move32(); - Word16 gaurd_bits = find_guarded_bits_fx( ( diff_compensation_order + 1 ) * ( diff_compensation_order + 1 ) ); - FOR( ch_idx = 0; ch_idx < ( diff_compensation_order + 1 ) * ( diff_compensation_order + 1 ); ch_idx++ ) + Word16 gaurd_bits = find_guarded_bits_fx( imult1616( add( diff_compensation_order, 1 ), add( diff_compensation_order, 1 ) ) ); + tmp16 = add( diff_compensation_order, 1 ); + tmp16 = imult1616( tmp16, tmp16 ); + FOR( ch_idx = 0; ch_idx < tmp16; ch_idx++ ) { diff_nrg_fx = L_shr( L_mult0( hDirACRend->diffuse_response_function_fx[ch_idx], hDirACRend->diffuse_response_function_fx[ch_idx] ), gaurd_bits ); // Q30 - gaurd_bits diff_nrg_total_fx = L_add( diff_nrg_total_fx, diff_nrg_fx ); /* is it a transport channel?*/ - IF( ch_idx == 0 || hDirACRend->proto_index_dir[ch_idx] != 0 ) + test(); + if ( ch_idx == 0 || hDirACRend->proto_index_dir[ch_idx] != 0 ) { diff_nrg_trans_fx = L_add( diff_nrg_trans_fx, diff_nrg_fx ); } /* is it a decorrelated or transport channel?*/ - IF( ch_idx < hDirACRend->num_outputs_diff ) + if ( LT_16( ch_idx, hDirACRend->num_outputs_diff ) ) { diff_nrg_decorr_fx = L_add( diff_nrg_decorr_fx, diff_nrg_fx ); } } Word16 exp_1 = 0, exp_2 = 0, tmp; + move16(); + move16(); tmp = BASOP_Util_Divide3232_Scale( diff_nrg_total_fx, diff_nrg_trans_fx, &exp_1 ); // (Q15 - exp_diff) dirac_output_synthesis_params->diffuse_compensation_factor_fx = L_shl( L_deposit_l( tmp ), add( Q12, exp_1 ) ); // Q27 + move32(); tmp = BASOP_Util_Divide3232_Scale( diff_nrg_total_fx, diff_nrg_decorr_fx, &exp_2 ); // (Q15 - exp_diff) dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx = L_shl( L_deposit_l( tmp ), add( Q14, exp_2 ) ); // Q29 + move32(); } ELSE { dirac_output_synthesis_params->diffuse_compensation_factor_fx = 0; + move32(); dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx = 0; + move32(); } return IVAS_ERR_OK; @@ -778,63 +818,71 @@ void ivas_dirac_dec_output_synthesis_init_fx( /* initialize buffers */ IF( h_dirac_output_synthesis_state->cy_auto_dir_smooth_prev_fx != NULL ) { - set32_fx( h_dirac_output_synthesis_state->cy_auto_dir_smooth_prev_fx, 0, hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir ); + set32_fx( h_dirac_output_synthesis_state->cy_auto_dir_smooth_prev_fx, 0, imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ) ); } h_dirac_output_synthesis_state->q_cy_auto_dir_smooth_prev = 0; + move16(); IF( hodirac_flag ) { - size = hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir * DIRAC_HO_NUMSECTORS; + size = imult1616( imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ), DIRAC_HO_NUMSECTORS ); } ELSE { - size = hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir; + size = imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ); } set32_fx( h_dirac_output_synthesis_state->cy_cross_dir_smooth_prev_fx, 0, size ); h_dirac_output_synthesis_state->q_cy_cross_dir_smooth_prev = 0; + move16(); - IF( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + IF( EQ_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { - set32_fx( h_dirac_output_synthesis_state->cy_auto_diff_smooth_prev_fx, 0, h_dirac_output_synthesis_params->max_band_decorr * hDirACRend->num_outputs_diff ); + set32_fx( h_dirac_output_synthesis_state->cy_auto_diff_smooth_prev_fx, 0, imult1616( h_dirac_output_synthesis_params->max_band_decorr, hDirACRend->num_outputs_diff ) ); } - ELSE IF( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_PSD_SHD ) + ELSE IF( NE_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_SHD ) ) { - set32_fx( h_dirac_output_synthesis_state->cy_auto_diff_smooth_prev_fx, 0, hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_diff ); + set32_fx( h_dirac_output_synthesis_state->cy_auto_diff_smooth_prev_fx, 0, imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_diff ) ); } ELSE { - set32_fx( h_dirac_output_synthesis_state->cy_auto_diff_smooth_prev_fx, 0, hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir ); + set32_fx( h_dirac_output_synthesis_state->cy_auto_diff_smooth_prev_fx, 0, imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ) ); } h_dirac_output_synthesis_state->q_cy_auto_diff_smooth_prev = 0; + move16(); IF( h_dirac_output_synthesis_state->proto_power_smooth_prev_fx != NULL ) { - set32_fx( h_dirac_output_synthesis_state->proto_power_smooth_prev_fx, 0, hSpatParamRendCom->num_freq_bands * hDirACRend->num_protos_dir ); + set32_fx( h_dirac_output_synthesis_state->proto_power_smooth_prev_fx, 0, imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->num_protos_dir ) ); h_dirac_output_synthesis_state->proto_power_smooth_prev_q = Q31; + move16(); } set32_fx( h_dirac_output_synthesis_state->gains_dir_prev_fx, 0, size ); h_dirac_output_synthesis_state->gains_dir_prev_q = 0; + move16(); - IF( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + IF( EQ_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { - set32_fx( h_dirac_output_synthesis_state->gains_diff_prev_fx, 0, h_dirac_output_synthesis_params->max_band_decorr * hDirACRend->num_outputs_diff ); + set32_fx( h_dirac_output_synthesis_state->gains_diff_prev_fx, 0, imult1616( h_dirac_output_synthesis_params->max_band_decorr, hDirACRend->num_outputs_diff ) ); } ELSE { - set32_fx( h_dirac_output_synthesis_state->gains_diff_prev_fx, 0, hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir ); + set32_fx( h_dirac_output_synthesis_state->gains_diff_prev_fx, 0, imult1616( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ) ); } h_dirac_output_synthesis_state->gains_diff_prev_q = 0; + move16(); IF( h_dirac_output_synthesis_state->proto_power_diff_smooth_prev_fx != NULL ) { - set32_fx( h_dirac_output_synthesis_state->proto_power_diff_smooth_prev_fx, 0, h_dirac_output_synthesis_params->max_band_decorr * nchan_out_woLFE ); + set32_fx( h_dirac_output_synthesis_state->proto_power_diff_smooth_prev_fx, 0, imult1616( h_dirac_output_synthesis_params->max_band_decorr, nchan_out_woLFE ) ); } h_dirac_output_synthesis_state->proto_power_diff_smooth_prev_q = Q31; + move16(); return; } #endif + /*------------------------------------------------------------------------- * ivas_dirac_dec_output_synthesis_close() * @@ -1036,6 +1084,7 @@ void ivas_dirac_dec_output_synthesis_close_fx( * * *------------------------------------------------------------------------*/ + #ifndef IVAS_FLOAT_FIXED void ivas_dirac_dec_output_synthesis_process_slot( const float *reference_power, /* i : Estimated power */ @@ -1293,7 +1342,7 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( Word16 num_freq_bands_diff, num_channels_diff; Word16 ch_idx; Word32 aux_buf[CLDFB_NO_CHANNELS_MAX]; - Word16 diff_start_band; + Word16 diff_start_band, tmp16; DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; @@ -1308,9 +1357,13 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( /* collect some often used parameters */ num_freq_bands = hSpatParamRendCom->num_freq_bands; + move16(); num_channels_dir = hDirACRend->num_outputs_dir; + move16(); num_channels_diff = hDirACRend->num_outputs_diff; + move16(); num_freq_bands_diff = h_dirac_output_synthesis_params->max_band_decorr; + move16(); IF( EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_LS ) ) { @@ -1318,6 +1371,7 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( move16(); } + test(); IF( EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) && hodirac_flag ) { ivas_dirac_dec_compute_directional_responses_fx( hSpatParamRendCom, @@ -1337,8 +1391,9 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( IF( h_dirac_output_synthesis_state->direct_responses_square_fx ) { - Scale_sig32( h_dirac_output_synthesis_state->direct_responses_square_fx, num_channels_dir * num_freq_bands, sub( 31, h_dirac_output_synthesis_state->direct_responses_square_q ) ); + Scale_sig32( h_dirac_output_synthesis_state->direct_responses_square_fx, imult1616( num_channels_dir, num_freq_bands ), sub( 31, h_dirac_output_synthesis_state->direct_responses_square_q ) ); h_dirac_output_synthesis_state->direct_responses_square_q = 31; + move16(); } Scale_sig32( hDirACRend->h_output_synthesis_psd_state.direct_responses_fx, i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ), sub( 31, h_dirac_output_synthesis_state->direct_responses_q ) ); IF( hodirac_flag ) @@ -1346,14 +1401,16 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( Scale_sig32( &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir )], i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ), sub( 31, h_dirac_output_synthesis_state->direct_responses_q ) ); } h_dirac_output_synthesis_state->direct_responses_q = 31; + move16(); } } - IF( EQ_16( dec_param_estim, FALSE ) && hodirac_flag ) + test(); + IF( dec_param_estim == FALSE && hodirac_flag ) { IF( EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { - v_multc_fixed( hSpatParamRendCom->energy_ratio1_fx[md_idx], L_negate( MAX_32 ), aux_buf, num_freq_bands ); + v_multc_fixed( hSpatParamRendCom->energy_ratio1_fx[md_idx], -MAX_32, aux_buf, num_freq_bands ); v_addc_fixed( aux_buf, ONE_IN_Q30, aux_buf, num_freq_bands ); Copy32( hSpatParamRendCom->energy_ratio1_fx[md_idx], h_dirac_output_synthesis_state->direct_power_factor_fx, @@ -1362,7 +1419,7 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( h_dirac_output_synthesis_state->diffuse_power_factor_fx, num_freq_bands ); - v_multc_fixed( hSpatParamRendCom->energy_ratio2_fx[md_idx], L_negate( MAX_32 ), aux_buf, num_freq_bands ); + v_multc_fixed( hSpatParamRendCom->energy_ratio2_fx[md_idx], -MAX_32, aux_buf, num_freq_bands ); v_addc_fixed( aux_buf, ONE_IN_Q30, aux_buf, num_freq_bands ); Copy32( hSpatParamRendCom->energy_ratio2_fx[md_idx], &h_dirac_output_synthesis_state->direct_power_factor_fx[hSpatParamRendCom->num_freq_bands], @@ -1372,7 +1429,9 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( num_freq_bands ); h_dirac_output_synthesis_state->diffuse_power_factor_q = 30; + move16(); h_dirac_output_synthesis_state->direct_power_factor_q = 30; + move16(); } ELSE { @@ -1404,8 +1463,9 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( { IF( h_dirac_output_synthesis_state->direct_responses_square_fx ) { - Scale_sig32( h_dirac_output_synthesis_state->direct_responses_square_fx, num_channels_dir * num_freq_bands, sub( 31, h_dirac_output_synthesis_state->direct_responses_square_q ) ); + Scale_sig32( h_dirac_output_synthesis_state->direct_responses_square_fx, imult1616( num_channels_dir, num_freq_bands ), sub( 31, h_dirac_output_synthesis_state->direct_responses_square_q ) ); h_dirac_output_synthesis_state->direct_responses_square_q = 31; + move16(); } Scale_sig32( hDirACRend->h_output_synthesis_psd_state.direct_responses_fx, i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ), sub( 31, h_dirac_output_synthesis_state->direct_responses_q ) ); IF( hodirac_flag ) @@ -1413,6 +1473,7 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( Scale_sig32( &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir )], i_mult( hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_dir ), sub( 31, h_dirac_output_synthesis_state->direct_responses_q ) ); } h_dirac_output_synthesis_state->direct_responses_q = 31; + move16(); } IF( EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) @@ -1439,7 +1500,8 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( Word16 *Q_temp_cy_cross_dir_smooth_fx = (Word16 *) malloc( num_freq_bands * num_channels_dir * sizeof( Word16 ) ); - FOR( Word16 kk = 0; kk < num_freq_bands * num_channels_dir; kk++ ) + tmp16 = imult1616( num_freq_bands, num_channels_dir ); + FOR( Word16 kk = 0; kk < tmp16; kk++ ) { Q_temp_cy_cross_dir_smooth_fx[kk] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; move16(); @@ -1448,7 +1510,7 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( FOR( ch_idx = 0; ch_idx < s_min( 4, nchan_transport ); ch_idx++ ) { Word16 k; - IF( NE_16( ch_idx, 0 ) ) + IF( ch_idx != 0 ) { Word32 a, c; Word16 b, b_exp, sqr_exp, q_diff_aab, q_diff_c; @@ -1459,14 +1521,17 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( FOR( k = 0; k < num_freq_bands_diff; k++ ) { a = h_dirac_output_synthesis_state->direct_responses_fx[add( i_mult( ch_idx, num_freq_bands ), k )]; // Q = h_dirac_output_synthesis_state->q_direct_responses - IF( EQ_32( reference_power[k + num_freq_bands], 0 ) ) + move32(); + IF( reference_power[add( k, num_freq_bands )] == 0 ) { b = 0; + move16(); b_exp = 0; + move16(); } ELSE { - b = BASOP_Util_Divide3232_Scale( reference_power[k + num_freq_bands], L_add( reference_power[k + ( ch_idx + 1 ) * num_freq_bands], EPSILON_FX ), &b_exp ); + b = BASOP_Util_Divide3232_Scale( reference_power[add( k, num_freq_bands )], L_add( reference_power[add( k, imult1616( add( ch_idx, 1 ), num_freq_bands ) )], EPSILON_FX ), &b_exp ); } c = L_add( ONE_IN_Q29, Mpy_32_16_1( L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx, ONE_IN_Q29 ), 5461 ) ); /*Diffuseness modellling nrg compensation*/ /* 1.0 / 6.0 = 5461 in Q15*/ @@ -1474,66 +1539,80 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( mpy_diff_aab = Mpy_32_32( L_sub( L_shl( 1, q_diffuseness ), diffuseness[k] ), mpy_a_a_b ); // Q = 2*(h_dirac_output_synthesis_state->q_direct_responses) - b_exp - 31 + q_diffuseness -31 mpy_diff_c = Mpy_32_32( diffuseness[k], c ); // Q = q_diffuseness - 2 - q_diff_aab = ( h_dirac_output_synthesis_state->direct_responses_q + ( 31 - b_exp ) - 31 ) + ( h_dirac_output_synthesis_state->direct_responses_q ) - 31 + q_diffuseness - 31; + q_diff_aab = add( sub( add( h_dirac_output_synthesis_state->direct_responses_q, sub( 31, b_exp ) ), 31 ), add( sub( h_dirac_output_synthesis_state->direct_responses_q, 31 ), sub( q_diffuseness, 31 ) ) ); q_diff_c = sub( q_diffuseness, 2 ); - IF( NE_32( mpy_diff_c, 0 ) && NE_32( mpy_diff_aab, 0 ) ) + test(); + IF( mpy_diff_c != 0 && mpy_diff_aab != 0 ) { sqr_inp = BASOP_Util_Add_Mant32Exp( mpy_diff_c, sub( 31, q_diff_c ), mpy_diff_aab, sub( 31, q_diff_aab ), &sqr_exp ); } ELSE { - IF( EQ_32( mpy_diff_c, 0 ) ) + IF( mpy_diff_c == 0 ) { sqr_inp = mpy_diff_aab; + move32(); sqr_exp = sub( 31, q_diff_aab ); } ELSE { sqr_inp = mpy_diff_c; + move32(); sqr_exp = sub( 31, q_diff_c ); } } sqr = Sqrt32( sqr_inp, &sqr_exp ); sqr = L_shr( sqr, 2 ); - IF( NE_32( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )], 0 ) ) + IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] != 0 ) { IF( LT_16( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ) { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )], sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, sub( 31, sqr_exp ) ) ); + move32(); Q_temp_cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = sub( 31, sqr_exp ); + move16(); } ELSE { sqr = L_shr( sqr, sub( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); Q_temp_cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; + move16(); } h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )], sqr ); + move32(); } ELSE { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )], sqr ); + move32(); Q_temp_cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = sub( 31, sqr_exp ); + move16(); } } FOR( ; k < num_freq_bands; k++ ) { a = h_dirac_output_synthesis_state->direct_responses_fx[add( i_mult( ch_idx, num_freq_bands ), k )]; // Q = h_dirac_output_synthesis_state->q_direct_responses - IF( EQ_32( reference_power[k + num_freq_bands], 0 ) ) + move32(); + IF( reference_power[k + num_freq_bands] == 0 ) { b = 0; + move16(); b_exp = 0; + move16(); } ELSE { - IF( EQ_32( reference_power[k + ( ch_idx + 1 ) * num_freq_bands], 0 ) ) + IF( reference_power[add( k, imult1616( add( ch_idx, 1 ), num_freq_bands ) )] == 0 ) { b = MAXVAL_WORD16; + move16(); b_exp = 40; + move16(); } ELSE { - b = BASOP_Util_Divide3232_Scale( reference_power[k + num_freq_bands], reference_power[k + ( ch_idx + 1 ) * num_freq_bands], &b_exp ); + b = BASOP_Util_Divide3232_Scale( reference_power[k + num_freq_bands], reference_power[add( k, imult1616( add( ch_idx, 1 ), num_freq_bands ) )], &b_exp ); } } c = L_add( ONE_IN_Q29, Mpy_32_16_1( L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx, ONE_IN_Q29 ), 5461 ) ); /*Diffuseness modellling nrg compensation*/ /* 1.0 / 6.0 = 5461 in Q15*/ @@ -1542,46 +1621,55 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( mpy_diff_aab = Mpy_32_32( L_sub( L_shl( 1, q_diffuseness ), diffuseness[k] ), mpy_a_a_b ); // Q = 2*(h_dirac_output_synthesis_state->q_direct_responses) - b_exp - 31 + q_diffuseness -31 mpy_diff_c = Mpy_32_32( diffuseness[k], c ); // Q = q_diffuseness - 2 - q_diff_aab = ( h_dirac_output_synthesis_state->direct_responses_q + ( 31 - b_exp ) - 31 ) + ( h_dirac_output_synthesis_state->direct_responses_q ) - 31 + q_diffuseness - 31; + q_diff_aab = add( h_dirac_output_synthesis_state->direct_responses_q + sub( sub( 31, b_exp ), 31 ), add( sub( h_dirac_output_synthesis_state->direct_responses_q, 31 ), sub( q_diffuseness, 31 ) ) ); q_diff_c = sub( q_diffuseness, 2 ); - IF( NE_32( mpy_diff_c, 0 ) && NE_32( mpy_diff_aab, 0 ) ) + test(); + IF( mpy_diff_c != 0 && mpy_diff_aab != 0 ) { sqr_inp = BASOP_Util_Add_Mant32Exp( mpy_diff_c, sub( 31, q_diff_c ), mpy_diff_aab, sub( 31, q_diff_aab ), &sqr_exp ); } ELSE { - IF( EQ_32( mpy_diff_c, 0 ) ) + IF( mpy_diff_c == 0 ) { sqr_inp = mpy_diff_aab; + move32(); sqr_exp = sub( 31, q_diff_aab ); } ELSE { sqr_inp = mpy_diff_c; + move32(); sqr_exp = sub( 31, q_diff_c ); } } sqr = Sqrt32( sqr_inp, &sqr_exp ); sqr = L_shr( sqr, 2 ); - IF( NE_32( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )], 0 ) ) + IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] != 0 ) { IF( LT_16( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ) { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )], sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, sub( 31, sqr_exp ) ) ); + move32(); Q_temp_cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = sub( 31, sqr_exp ); + move16(); } ELSE { sqr = L_shr( sqr, sub( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); Q_temp_cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; + move16(); } h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )], sqr ); + move32(); } ELSE { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )], sqr ); + move32(); Q_temp_cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = sub( 31, sqr_exp ); + move16(); } } } @@ -1597,24 +1685,30 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( sqr_exp = sub( 31, sub( q_diffuseness, 1 ) ); sqr = Sqrt32( sqr_inp, &sqr_exp ); sqr = L_shr( sqr, 2 ); - IF( NE_32( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )], 0 ) ) + IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] != 0 ) { IF( LT_16( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ) { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )], sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, sub( 31, sqr_exp ) ) ); + move32(); Q_temp_cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = sub( 31, sqr_exp ); + move16(); } ELSE { sqr = L_shr( sqr, sub( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); Q_temp_cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; + move16(); } h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )], sqr ); + move32(); } ELSE { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )], sqr ); + move32(); Q_temp_cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = sub( 31, sqr_exp ); + move16(); } } FOR( ; k < num_freq_bands; k++ ) @@ -1624,49 +1718,60 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( sqr_exp = sub( 31, sub( q_diffuseness, 1 ) ); sqr = Sqrt32( sqr_inp, &sqr_exp ); sqr = L_shr( sqr, 2 ); - IF( NE_32( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )], 0 ) ) + IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] != 0 ) { IF( LT_16( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ) { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )], sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, sub( 31, sqr_exp ) ) ); + move32(); Q_temp_cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = sub( 31, sqr_exp ); + move16(); } ELSE { sqr = L_shr( sqr, sub( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); Q_temp_cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; + move16(); } h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )], sqr ); + move32(); } ELSE { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )], sqr ); + move32(); Q_temp_cy_cross_dir_smooth_fx[L_add( i_mult( ch_idx, num_freq_bands ), k )] = sub( 31, sqr_exp ); + move16(); } } } } Word16 temp = MAX_16; - FOR( Word16 kk = 0; kk < num_freq_bands * num_channels_dir; kk++ ) + move16(); + tmp16 = imult1616( num_freq_bands, num_channels_dir ); + FOR( Word16 kk = 0; kk < tmp16; kk++ ) { temp = s_min( Q_temp_cy_cross_dir_smooth_fx[kk], temp ); } h_dirac_output_synthesis_state->q_cy_cross_dir_smooth = temp; move16(); - FOR( Word16 kk = 0; kk < num_freq_bands * num_channels_dir; kk++ ) + FOR( Word16 kk = 0; kk < tmp16; kk++ ) { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk] = L_shl( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk], sub( temp, Q_temp_cy_cross_dir_smooth_fx[kk] ) ); + move32(); } free( Q_temp_cy_cross_dir_smooth_fx ); /*Directional gain (panning)*/ Word16 temp_q = sub( add( h_dirac_output_synthesis_state->direct_power_factor_q, h_dirac_output_synthesis_state->direct_responses_q ), 31 ); IF( LT_16( temp_q, h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ) { - FOR( Word16 kk = 0; kk < num_freq_bands * num_channels_dir; kk++ ) + FOR( Word16 kk = 0; kk < tmp16; kk++ ) { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk] = L_shl( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk], sub( temp_q, h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); + move32(); } h_dirac_output_synthesis_state->q_cy_cross_dir_smooth = temp_q; + move16(); } FOR( ch_idx = s_min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) { @@ -1681,8 +1786,8 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( } v_add_fixed( aux_buf, - &h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], - &h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], + &h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[imult1616( ch_idx, num_freq_bands )], + &h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[imult1616( ch_idx, num_freq_bands )], num_freq_bands, 0 ); // Todo:Hdrm } @@ -1695,8 +1800,8 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( num_freq_bands_diff ); v_add_fixed( aux_buf, - &h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], - &h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], + &h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx[imult1616( ch_idx, num_freq_bands_diff )], + &h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx[imult1616( ch_idx, num_freq_bands_diff )], num_freq_bands_diff, 0 ); // Todo:Hdrm } @@ -1714,7 +1819,9 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( Scale_sig32( h_dirac_output_synthesis_state->direct_power_factor_fx, num_freq_bands, 2 ); Scale_sig32( h_dirac_output_synthesis_state->diffuse_power_factor_fx, num_freq_bands, 2 ); h_dirac_output_synthesis_state->diffuse_power_factor_q = 31; + move16(); h_dirac_output_synthesis_state->direct_power_factor_q = 31; + move16(); } } @@ -1748,13 +1855,15 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( return; } #endif -#ifdef IVAS_FLOAT_FIXED + + /*------------------------------------------------------------------------- - * ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx() + * ivas_dirac_dec_output_synthesis_process_subframe_gain_shd() * * *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( Word32 RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ Word32 ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ @@ -1820,30 +1929,30 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( /*Direct gain*/ FOR( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) { - v_multc_fixed( diffuseness, // Q30 - ONE_IN_Q31, // Q31 - &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q30 + v_multc_fixed( diffuseness, // Q30 + ONE_IN_Q31, // Q31 + &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[imult1616( ch_idx, num_freq_bands )], // Q30 num_freq_bands ); - v_multc_fixed( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q30 - L_sub( h_dirac_output_synthesis_params.diffuse_compensation_factor_fx, ONE_IN_Q27 ), // Q27 - &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q26 + v_multc_fixed( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[imult1616( ch_idx, num_freq_bands )], // Q30 + L_sub( h_dirac_output_synthesis_params.diffuse_compensation_factor_fx, ONE_IN_Q27 ), // Q27 + &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[imult1616( ch_idx, num_freq_bands )], // Q26 num_freq_bands ); FOR( l = 0; l < num_freq_bands; l++ ) { - exp = sub( Q31, Q26 ); - h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + l] = - Sqrt32( L_add( ONE_IN_Q26, h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + l] ), + exp = Q31 - Q26; + h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[add( imult1616( ch_idx, num_freq_bands ), l )] = + Sqrt32( L_add( ONE_IN_Q26, h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[add( imult1616( ch_idx, num_freq_bands ), l )] ), &exp ); // (Q31 - exp) move32(); } // Scale to bring in common Q-factor q_com = s_min( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, sub( Q31, exp ) ); - Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], + Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[imult1616( ch_idx, num_freq_bands )], num_freq_bands, sub( q_com, sub( Q31, exp ) ) ); - Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx[ch_idx * num_freq_bands], + Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx[imult1616( ch_idx, num_freq_bands )], num_freq_bands, sub( q_com, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ); } @@ -1855,36 +1964,36 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( { aux_buf[l] = L_sub( ONE_IN_Q30, diffuseness[l] ); // Q30 move32(); - ratio_float[l] = L_sub( ONE_IN_Q31, h_dirac_output_synthesis_state.direct_power_factor_fx[num_freq_bands + l] ); // Q31 + ratio_float[l] = L_sub( ONE_IN_Q31, h_dirac_output_synthesis_state.direct_power_factor_fx[add( num_freq_bands, l )] ); // Q31 move32(); - ratio_float[l + num_freq_bands] = L_sub( ONE_IN_Q31, ratio_float[l] ); // Q31 + ratio_float[add( l, num_freq_bands )] = L_sub( ONE_IN_Q31, ratio_float[l] ); // Q31 move32(); } v_mult_fixed( aux_buf, ratio_float, ratio_float, num_freq_bands ); //(Q30, Q31) -> Q30 v_mult_fixed( aux_buf, &ratio_float[num_freq_bands], &ratio_float[num_freq_bands], num_freq_bands ); //(Q30, Q31) -> Q30 - v_mult_fixed( ratio_float, // Q30 - &h_dirac_output_synthesis_state.direct_responses_fx[ch_idx * num_freq_bands], // Q31 - &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], //(Q30, Q31) -> Q30 + v_mult_fixed( ratio_float, // Q30 + &h_dirac_output_synthesis_state.direct_responses_fx[imult1616( ch_idx, num_freq_bands )], // Q31 + &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[imult1616( ch_idx, num_freq_bands )], //(Q30, Q31) -> Q30 num_freq_bands ); - v_mult_fixed( &ratio_float[num_freq_bands], // Q30 - &h_dirac_output_synthesis_state.direct_responses_fx[ch_idx * num_freq_bands + num_freq_bands * num_channels_dir], // Q31 - &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + num_freq_bands * num_channels_dir], //(Q30, Q31) -> Q30 + v_mult_fixed( &ratio_float[num_freq_bands], // Q30 + &h_dirac_output_synthesis_state.direct_responses_fx[add( imult1616( ch_idx, num_freq_bands ), imult1616( num_freq_bands, num_channels_dir ) )], // Q31 + &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[add( imult1616( ch_idx, num_freq_bands ), imult1616( num_freq_bands, num_channels_dir ) )], //(Q30, Q31) -> Q30 num_freq_bands ); // Scale to bring in common Q-factor q_com = s_min( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, Q30 ); - Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], + Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[imult1616( ch_idx, num_freq_bands )], num_freq_bands, sub( q_com, Q30 ) ); - Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + num_freq_bands * num_channels_dir], + Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[add( imult1616( ch_idx, num_freq_bands ), imult1616( num_freq_bands, num_channels_dir ) )], num_freq_bands, sub( q_com, Q30 ) ); - Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx[ch_idx * num_freq_bands], + Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx[imult1616( ch_idx, num_freq_bands )], num_freq_bands, sub( q_com, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ); - Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx[ch_idx * num_freq_bands + num_freq_bands * num_channels_dir], + Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx[add( imult1616( ch_idx, num_freq_bands ), imult1616( num_freq_bands, num_channels_dir ) )], num_freq_bands, sub( q_com, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ); } @@ -1897,17 +2006,17 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( /*Diffuse gain*/ FOR( ch_idx = nchan_transport_foa; ch_idx < num_channels_diff; ch_idx++ ) { - v_multc_fixed_16( h_dirac_output_synthesis_state.diffuse_power_factor_fx, // Q31 - hDirACRend->diffuse_response_function_fx[ch_idx], // Q15 - &h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], // Q31 + v_multc_fixed_16( h_dirac_output_synthesis_state.diffuse_power_factor_fx, // Q31 + hDirACRend->diffuse_response_function_fx[ch_idx], // Q15 + &h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx[imult1616( ch_idx, num_freq_bands_diff )], // Q31 num_freq_bands_diff ); // Scale to bring in common Q-factor q_com = s_min( h_dirac_output_synthesis_state.q_cy_auto_diff_smooth_prev, Q31 ); - Scale_sig32( &h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], + Scale_sig32( &h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx[imult1616( ch_idx, num_freq_bands_diff )], num_freq_bands_diff, sub( q_com, Q31 ) ); - Scale_sig32( &h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev_fx[ch_idx * num_freq_bands_diff], + Scale_sig32( &h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev_fx[imult1616( ch_idx, num_freq_bands_diff )], num_freq_bands_diff, sub( q_com, h_dirac_output_synthesis_state.q_cy_auto_diff_smooth_prev ) ); } @@ -1922,34 +2031,34 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( /*Direct gain*/ FOR( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) { - v_mult_fixed( h_dirac_output_synthesis_state.diffuse_power_factor_fx, // Q31 - h_dirac_output_synthesis_state.diffuse_power_factor_fx, // Q31 - &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q31 + v_mult_fixed( h_dirac_output_synthesis_state.diffuse_power_factor_fx, // Q31 + h_dirac_output_synthesis_state.diffuse_power_factor_fx, // Q31 + &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[imult1616( ch_idx, num_freq_bands )], // Q31 num_freq_bands ); - v_multc_fixed( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q31 + v_multc_fixed( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[imult1616( ch_idx, num_freq_bands )], // Q31 L_sub( L_shr( h_dirac_output_synthesis_params.diffuse_compensation_factor_decorr_fx, Q3 ), ONE_IN_Q26 ), // Q26 - &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q26 + &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[imult1616( ch_idx, num_freq_bands )], // Q26 num_freq_bands_diff ); - v_multc_fixed( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + num_freq_bands_diff], // Q31 - L_sub( L_shr( h_dirac_output_synthesis_params.diffuse_compensation_factor_fx, Q1 ), ONE_IN_Q26 ), // Q26 - &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + num_freq_bands_diff], // Q26 + v_multc_fixed( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[add( imult1616( ch_idx, num_freq_bands ), num_freq_bands_diff )], // Q31 + L_sub( L_shr( h_dirac_output_synthesis_params.diffuse_compensation_factor_fx, Q1 ), ONE_IN_Q26 ), // Q26 + &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[add( imult1616( ch_idx, num_freq_bands ), num_freq_bands_diff )], // Q26 num_freq_bands - num_freq_bands_diff ); FOR( l = 0; l < num_freq_bands; l++ ) { - exp = sub( Q31, Q26 ); - h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + l] = - Sqrt32( L_add( ONE_IN_Q26, h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + l] ), + exp = Q31 - Q26; + h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[add( imult1616( ch_idx, num_freq_bands ), l )] = + Sqrt32( L_add( ONE_IN_Q26, h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[add( imult1616( ch_idx, num_freq_bands ), l )] ), &exp ); // (Q31 - exp) move32(); } // Scale to bring in common Q-factor q_com = s_min( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, sub( Q31, exp ) ); - Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], + Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[imult1616( ch_idx, num_freq_bands )], num_freq_bands, sub( q_com, sub( Q31, exp ) ) ); - Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx[ch_idx * num_freq_bands], + Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx[imult1616( ch_idx, num_freq_bands )], num_freq_bands, sub( q_com, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ); } @@ -1957,17 +2066,17 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( /*Directional gain*/ FOR( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ ) { - v_mult_fixed( h_dirac_output_synthesis_state.direct_power_factor_fx, // Q31 - &h_dirac_output_synthesis_state.direct_responses_fx[ch_idx * num_freq_bands], // Q31 - &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], // Q31 + v_mult_fixed( h_dirac_output_synthesis_state.direct_power_factor_fx, // Q31 + &h_dirac_output_synthesis_state.direct_responses_fx[imult1616( ch_idx, num_freq_bands )], // Q31 + &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[imult1616( ch_idx, num_freq_bands )], // Q31 num_freq_bands ); // Scale to bring in common Q-factor q_com = s_min( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, Q31 ); - Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[ch_idx * num_freq_bands], + Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx[imult1616( ch_idx, num_freq_bands )], num_freq_bands, sub( q_com, Q31 ) ); - Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx[ch_idx * num_freq_bands], + Scale_sig32( &h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx[imult1616( ch_idx, num_freq_bands )], num_freq_bands, sub( q_com, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ); } @@ -1980,17 +2089,17 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( /*Diffuse gain*/ FOR( ch_idx = nchan_transport_foa; ch_idx < num_channels_diff; ch_idx++ ) { - v_multc_fixed_16( h_dirac_output_synthesis_state.diffuse_power_factor_fx, // Q31 - hDirACRend->diffuse_response_function_fx[ch_idx], // Q15 - &h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], // Q31 + v_multc_fixed_16( h_dirac_output_synthesis_state.diffuse_power_factor_fx, // Q31 + hDirACRend->diffuse_response_function_fx[ch_idx], // Q15 + &h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx[imult1616( ch_idx, num_freq_bands_diff )], // Q31 num_freq_bands_diff ); // Scale to bring in common Q-factor q_com = s_min( h_dirac_output_synthesis_state.q_cy_auto_diff_smooth_prev, Q31 ); - Scale_sig32( &h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], + Scale_sig32( &h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx[imult1616( ch_idx, num_freq_bands_diff )], num_freq_bands_diff, sub( q_com, Q31 ) ); - Scale_sig32( &h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev_fx[ch_idx * num_freq_bands_diff], + Scale_sig32( &h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev_fx[imult1616( ch_idx, num_freq_bands_diff )], num_freq_bands_diff, sub( q_com, h_dirac_output_synthesis_state.q_cy_auto_diff_smooth_prev ) ); } @@ -2017,12 +2126,12 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( { g1 = L_add( POINT_3679_Q31, Mpy_32_32( onset_filter[l], - L_sub( POINT_1175_Q31, POINT_3679_Q31 ) ) ); // Q31, (Q31, Q31) -> Q31 - g2 = Mpy_32_32( L_sub( ONE_IN_Q31, g1 ), *( p_gains_dir ) ); // (Q31, p_gains_dir_q) -> p_gains_dir_q - g2 = L_add_sat( g2, Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth++ ) ) ) ); // p_gains_diff_q, (Q31, p_gains_diff_q) -> p_gains_diff_q - g2 = L_max( g2, (Word32) ( 0.99f * L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ) ); // p_gains_dir_q - g2 = L_min( g2, (Word32) ( 2.0f * L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ) ); // p_gains_dir_q - *( p_gains_dir++ ) = g2; // p_gains_dir_q + POINT_1175_Q31 - POINT_3679_Q31 ) ); // Q31, (Q31, Q31) -> Q31 + g2 = Mpy_32_32( L_sub( ONE_IN_Q31, g1 ), *( p_gains_dir ) ); // (Q31, p_gains_dir_q) -> p_gains_dir_q + g2 = L_add_sat( g2, Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth++ ) ) ) ); // p_gains_diff_q, (Q31, p_gains_diff_q) -> p_gains_diff_q + g2 = L_max( g2, Mpy_32_32( 2126008812 /* 0.99f in Q31 */, L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ) ); // p_gains_dir_q + g2 = L_min( g2, Mpy_32_32( ONE_IN_Q31 /* 2.0f in Q30 */, L_shl( 1, add( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, 1 ) ) ) ); // p_gains_dir_q + *( p_gains_dir++ ) = g2; // p_gains_dir_q move32(); } } @@ -2035,12 +2144,12 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( { g1 = L_add( POINT_3679_Q31, Mpy_32_32( onset_filter[l], - L_sub( POINT_1175_Q31, POINT_3679_Q31 ) ) ); // Q31, (Q31, Q31) -> Q31 - g2 = Mpy_32_32( L_sub( ONE_IN_Q31, g1 ), *( p_gains_dir ) ); // (Q31, p_gains_dir_q) -> p_gains_dir_q - g2 = L_add_sat( g2, Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth++ ) ) ) ); // p_gains_diff_q, (Q31, p_gains_diff_q) -> p_gains_diff_q - g2 = L_max( g2, (Word32) ( 0.85f * L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ) ); // p_gains_dir_q - g2 = L_min( g2, (Word32) ( 1.15f * L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ) ); // p_gains_dir_q - *( p_gains_dir++ ) = g2; // p_gains_dir_q + POINT_1175_Q31 - POINT_3679_Q31 ) ); // Q31, (Q31, Q31) -> Q31 + g2 = Mpy_32_32( L_sub( ONE_IN_Q31, g1 ), *( p_gains_dir ) ); // (Q31, p_gains_dir_q) -> p_gains_dir_q + g2 = L_add_sat( g2, Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth++ ) ) ) ); // p_gains_diff_q, (Q31, p_gains_diff_q) -> p_gains_diff_q + g2 = L_max( g2, Mpy_32_32( 1825361101 /* 0.85f in Q31 */, L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ) ); // p_gains_dir_q + g2 = L_min( g2, Mpy_32_32( 1234803098 /* 1.15f in Q30 */, L_shl( 1, add( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, 1 ) ) ) ); // p_gains_dir_q + *( p_gains_dir++ ) = g2; // p_gains_dir_q move32(); } } @@ -2053,20 +2162,20 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( { g1 = L_add( POINT_3679_Q31, Mpy_32_32( onset_filter[l], - L_sub( POINT_1175_Q31, POINT_3679_Q31 ) ) ); // Q31, (Q31, Q31) -> Q31 - g2 = Mpy_32_32( L_sub( ONE_IN_Q31, g1 ), *( p_gains_dir ) ); // (Q31, p_gains_dir_q) -> p_gains_dir_q - g2 = L_add_sat( g2, Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth++ ) ) ) ); // p_gains_diff_q, (Q31, p_gains_diff_q) -> p_gains_diff_q - g2 = L_max( g2, (Word32) ( -DIRAC_GAIN_LIMIT * L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ) ); // p_gains_dir_q - g2 = L_min( g2, (Word32) ( DIRAC_GAIN_LIMIT * L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ) ); // p_gains_dir_q - *( p_gains_dir++ ) = g2; // p_gains_dir_q + POINT_1175_Q31 - POINT_3679_Q31 ) ); // Q31, (Q31, Q31) -> Q31 + g2 = Mpy_32_32( L_sub( ONE_IN_Q31, g1 ), *( p_gains_dir ) ); // (Q31, p_gains_dir_q) -> p_gains_dir_q + g2 = L_add_sat( g2, Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth++ ) ) ) ); // p_gains_diff_q, (Q31, p_gains_diff_q) -> p_gains_diff_q + g2 = L_max( g2, W_extract_h( W_shl( W_mult_32_32( -DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ), Q5 ) ) ); // p_gains_dir_q + g2 = L_min( g2, W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ), Q5 ) ) ); // p_gains_dir_q + *( p_gains_dir++ ) = g2; // p_gains_dir_q move32(); } } IF( hodirac_flag ) { - p_cy_cross_dir_smooth = h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx + num_freq_bands * num_channels_dir; - p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx + num_freq_bands * num_channels_dir; + p_cy_cross_dir_smooth = h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx + imult1616( num_freq_bands, num_channels_dir ); + p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx + imult1616( num_freq_bands, num_channels_dir ); /*Direct gains*/ FOR( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) @@ -2085,30 +2194,31 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( { g1 = L_add( POINT_3679_Q31, Mpy_32_32( onset_filter[l], - L_sub( POINT_1175_Q31, POINT_3679_Q31 ) ) ); // Q31, (Q31, Q31) -> Q31 - g2 = Mpy_32_32( L_sub( ONE_IN_Q31, g1 ), *( p_gains_dir ) ); // (Q31, p_gains_dir_q) -> p_gains_dir_q - g2 = L_add_sat( g2, Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth++ ) ) ) ); // (p_gains_diff_q, (Q31, p_gains_diff_q) -> p_gains_diff_q - g2 = L_max( g2, (Word32) ( -DIRAC_GAIN_LIMIT * L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ) ); // p_gains_dir_q - g2 = L_min( g2, (Word32) ( DIRAC_GAIN_LIMIT * L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ) ); // p_gains_dir_q - *( p_gains_dir++ ) = g2; // p_gains_dir_q + POINT_1175_Q31 - POINT_3679_Q31 ) ); // Q31, (Q31, Q31) -> Q31 + g2 = Mpy_32_32( L_sub( ONE_IN_Q31, g1 ), *( p_gains_dir ) ); // (Q31, p_gains_dir_q) -> p_gains_dir_q + g2 = L_add_sat( g2, Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth++ ) ) ) ); // (p_gains_diff_q, (Q31, p_gains_diff_q) -> p_gains_diff_q + g2 = L_max( g2, W_extract_h( W_shl( W_mult_32_32( -DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ), Q5 ) ) ); // p_gains_dir_q + g2 = L_min( g2, W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ), Q5 ) ) ); // p_gains_dir_q + *( p_gains_dir++ ) = g2; // p_gains_dir_q move32(); } } } /*Diffuse gains*/ - p_cy_auto_diff_smooth = h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx + nchan_transport_foa * num_freq_bands_diff; - p_gains_diff = h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev_fx + nchan_transport_foa * num_freq_bands_diff; + p_cy_auto_diff_smooth = h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx + imult1616( nchan_transport_foa, num_freq_bands_diff ); + p_gains_diff = h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev_fx + imult1616( nchan_transport_foa, num_freq_bands_diff ); FOR( ch_idx = nchan_transport_foa; ch_idx < num_channels_diff; ch_idx++ ) { FOR( l = 0; l < num_freq_bands_diff; l++ ) { - g1 = POINT_1175_Q31; // Q31 - g2 = Mpy_32_32( L_sub( ONE_IN_Q31, g1 ), *( p_gains_diff ) ); // (Q31, p_gains_dir_q) -> p_gains_dir_q - g2 = L_add_sat( g2, Mpy_32_32( g1, ( *( p_cy_auto_diff_smooth++ ) ) ) ); // p_gains_diff_q, (Q31, p_gains_diff_q) -> p_gains_diff_q - g2 = L_max( g2, 0 ); // p_gains_diff_q - g2 = L_min( g2, (Word32) ( DIRAC_GAIN_LIMIT * L_shl( 1, h_dirac_output_synthesis_state.q_cy_auto_diff_smooth_prev ) ) ); // p_gains_diff_q - *( p_gains_diff++ ) = g2; // p_gains_diff_q + g1 = POINT_1175_Q31; // Q31 + move32(); + g2 = Mpy_32_32( L_sub( ONE_IN_Q31, g1 ), *( p_gains_diff ) ); // (Q31, p_gains_dir_q) -> p_gains_dir_q + g2 = L_add_sat( g2, Mpy_32_32( g1, ( *( p_cy_auto_diff_smooth++ ) ) ) ); // p_gains_diff_q, (Q31, p_gains_diff_q) -> p_gains_diff_q + g2 = L_max( g2, 0 ); // p_gains_diff_q + g2 = L_min( g2, W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state.q_cy_auto_diff_smooth_prev ) ), Q5 ) ) ); // p_gains_diff_q + *( p_gains_diff++ ) = g2; // p_gains_diff_q move32(); } } @@ -2127,11 +2237,12 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( p_gains_dir_prev = h_dirac_output_synthesis_state.gains_dir_prev_fx; FOR( ch_idx = 0; ch_idx < num_channels_dir; ch_idx++ ) { - Scale_sig32( &h_dirac_output_synthesis_state.gains_dir_prev_fx[ch_idx * num_freq_bands], + Scale_sig32( &h_dirac_output_synthesis_state.gains_dir_prev_fx[imult1616( ch_idx, num_freq_bands )], num_freq_bands, sub( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev_q ) ); } h_dirac_output_synthesis_state.gains_dir_prev_q = h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev; + move16(); FOR( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) { @@ -2143,9 +2254,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( g = L_add( Mpy_32_32( g1, ( *( p_gains_dir++ ) ) ), Mpy_32_32( g2, ( *( p_gains_dir_prev++ ) ) ) ); // (Q31, p_gains_dir_q) -> (p_gains_dir_q) - output_real[l * num_channels_dir + ch_idx] = Mpy_32_32( g, ( *( p_proto_diff++ ) ) ); // (p_gains_dir_q, p_proto_diff_q) -> (p_gains_dir_q + p_proto_diff_q - 31) + output_real[add( imult1616( l, num_channels_dir ), ch_idx )] = Mpy_32_32( g, ( *( p_proto_diff++ ) ) ); // (p_gains_dir_q, p_proto_diff_q) -> (p_gains_dir_q + p_proto_diff_q - 31) move32(); - output_imag[l * num_channels_dir + ch_idx] = Mpy_32_32( g, ( *( p_proto_diff++ ) ) ); // (p_gains_dir_q, p_proto_diff_q) -> (p_gains_dir_q + p_proto_diff_q - 31) + output_imag[add( imult1616( l, num_channels_dir ), ch_idx )] = Mpy_32_32( g, ( *( p_proto_diff++ ) ) ); // (p_gains_dir_q, p_proto_diff_q) -> (p_gains_dir_q + p_proto_diff_q - 31) move32(); } } @@ -2155,7 +2266,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( { IF( hodirac_flag ) { - IF( EQ_16( proto_direct_index[ch_idx], 0 ) ) + IF( proto_direct_index[ch_idx] == 0 ) { Word32 *p_proto2; Word32 gs1, gs2; @@ -2169,29 +2280,29 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( { gs1 = L_add( Mpy_32_32( g1, ( *( p_gains_dir ) ) ), Mpy_32_32( g2, ( *( p_gains_dir_prev ) ) ) ); // (Q31, p_gains_dir_q) -> (p_gains_dir_q) - gs2 = L_add( Mpy_32_32( g1, ( *( p_gains_dir + num_freq_bands * num_channels_dir ) ) ), - Mpy_32_32( g2, ( *( p_gains_dir_prev + num_freq_bands * num_channels_dir ) ) ) ); // (Q31, p_gains_dir_q) -> (p_gains_dir_q) + gs2 = L_add( Mpy_32_32( g1, ( *( p_gains_dir + imult1616( num_freq_bands, num_channels_dir ) ) ) ), + Mpy_32_32( g2, ( *( p_gains_dir_prev + imult1616( num_freq_bands, num_channels_dir ) ) ) ) ); // (Q31, p_gains_dir_q) -> (p_gains_dir_q) p_gains_dir++; p_gains_dir_prev++; // ((p_gains_dir_q, p_proto_dir_q) >> 1) -> (p_gains_dir_q + p_proto_dir_q - 31) - output_real[l * num_channels_dir + ch_idx] = + output_real[add( imult1616( l, num_channels_dir ), ch_idx )] = L_add( - Mpy_32_32( gs1, ( L_add( Mpy_32_32( (Word32) ( 1903158016 ), ( *p_proto ) ), - Mpy_32_32( (Word32) ( 1098788992 ), ( *p_proto2 ) ) ) ) ), /* s1 */ - Mpy_32_32( gs2, ( L_sub( Mpy_32_32( (Word32) ( 1903158016 ), ( *p_proto ) ), - Mpy_32_32( (Word32) ( 1098788992 ), ( *p_proto2 ) ) ) ) ) ); /* s2 */ + Mpy_32_32( gs1, ( L_add( Mpy_32_32( 1903158016 /* 1.772454e+00f / 2 in Q31 */, ( *p_proto ) ), + Mpy_32_32( 1098788992 /* 1.023327e+00f / 2 in Q31 */, ( *p_proto2 ) ) ) ) ), /* s1 */ + Mpy_32_32( gs2, ( L_sub( Mpy_32_32( 1903158016 /* 1.772454e+00f / 2 in Q31 */, ( *p_proto ) ), + Mpy_32_32( 1098788992 /* 1.023327e+00f / 2 in Q31 */, ( *p_proto2 ) ) ) ) ) ); /* s2 */ move32(); p_proto++; p_proto2++; // ((p_gains_dir_q, p_proto_dir_q) >> 1) -> (p_gains_dir_q + p_proto_dir_q - 31) - output_imag[l * num_channels_dir + ch_idx] = + output_imag[add( imult1616( l, num_channels_dir ), ch_idx )] = L_add( - Mpy_32_32( gs1, ( L_add( Mpy_32_32( (Word32) ( 1903158016 ), ( *p_proto ) ), - Mpy_32_32( (Word32) ( 1098788992 ), ( *p_proto2 ) ) ) ) ), - Mpy_32_32( gs2, ( L_sub( Mpy_32_32( (Word32) ( 1903158016 ), ( *p_proto ) ), - Mpy_32_32( (Word32) ( 1098788992 ), ( *p_proto2 ) ) ) ) ) ); + Mpy_32_32( gs1, ( L_add( Mpy_32_32( 1903158016 /* 1.772454e+00f / 2 in Q31 */, ( *p_proto ) ), + Mpy_32_32( 1098788992 /* 1.023327e+00f / 2 in Q31 */, ( *p_proto2 ) ) ) ) ), + Mpy_32_32( gs2, ( L_sub( Mpy_32_32( 1903158016 /* 1.772454e+00f / 2 in Q31 */, ( *p_proto ) ), + Mpy_32_32( 1098788992 /* 1.023327e+00f / 2 in Q31 */, ( *p_proto2 ) ) ) ) ) ); move32(); p_proto++; p_proto2++; @@ -2207,9 +2318,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( p_gains_dir++; p_gains_dir_prev++; - output_real[l * num_channels_dir + ch_idx] = L_shl( *( p_proto++ ), sub( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, 31 ) ); // p_proto_dir_q -> (p_gains_dir_q + p_proto_dir_q - 31) + output_real[add( imult1616( l, num_channels_dir ), ch_idx )] = L_shl( *( p_proto++ ), sub( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, 31 ) ); // p_proto_dir_q -> (p_gains_dir_q + p_proto_dir_q - 31) move32(); - output_imag[l * num_channels_dir + ch_idx] = L_shl( *( p_proto++ ), sub( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, 31 ) ); // p_proto_dir_q -> (p_gains_dir_q + p_proto_dir_q - 31) + output_imag[add( imult1616( l, num_channels_dir ), ch_idx )] = L_shl( *( p_proto++ ), sub( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, 31 ) ); // p_proto_dir_q -> (p_gains_dir_q + p_proto_dir_q - 31) move32(); } } @@ -2226,9 +2337,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( g = L_add( Mpy_32_32( g1, ( *( p_gains_dir++ ) ) ), Mpy_32_32( g2, ( *( p_gains_dir_prev++ ) ) ) ); // (Q31, p_gains_dir_q) -> (p_gains_dir_q) - output_real[l * num_channels_dir + ch_idx] = Mpy_32_32( g, ( *( p_proto++ ) ) ); // (p_gains_dir_q, p_proto_dir_q) -> (p_gains_dir_q + p_proto_dir_q - 31) + output_real[add( imult1616( l, num_channels_dir ), ch_idx )] = Mpy_32_32( g, ( *( p_proto++ ) ) ); // (p_gains_dir_q, p_proto_dir_q) -> (p_gains_dir_q + p_proto_dir_q - 31) move32(); - output_imag[l * num_channels_dir + ch_idx] = Mpy_32_32( g, ( *( p_proto++ ) ) ); // (p_gains_dir_q, p_proto_dir_q) -> (p_gains_dir_q + p_proto_dir_q - 31) + output_imag[add( imult1616( l, num_channels_dir ), ch_idx )] = Mpy_32_32( g, ( *( p_proto++ ) ) ); // (p_gains_dir_q, p_proto_dir_q) -> (p_gains_dir_q + p_proto_dir_q - 31) move32(); } } @@ -2239,9 +2350,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( p_gains_dir++; p_gains_dir_prev++; - output_real[l * num_channels_dir + ch_idx] = L_shl( *( p_proto++ ), sub( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, 31 ) ); // p_proto_dir_q -> (p_gains_dir_q + p_proto_dir_q - 31) + output_real[add( imult1616( l, num_channels_dir ), ch_idx )] = L_shl( *( p_proto++ ), sub( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, 31 ) ); // p_proto_dir_q -> (p_gains_dir_q + p_proto_dir_q - 31) move32(); - output_imag[l * num_channels_dir + ch_idx] = L_shl( *( p_proto++ ), sub( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, 31 ) ); // p_proto_dir_q -> (p_gains_dir_q + p_proto_dir_q - 31) + output_imag[add( imult1616( l, num_channels_dir ), ch_idx )] = L_shl( *( p_proto++ ), sub( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, 31 ) ); // p_proto_dir_q -> (p_gains_dir_q + p_proto_dir_q - 31) move32(); } } @@ -2253,17 +2364,18 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( p_gains_diff_prev = h_dirac_output_synthesis_state.gains_diff_prev_fx + i_mult( nchan_transport_foa, num_freq_bands_diff ); FOR( ch_idx = nchan_transport_foa; ch_idx < num_channels_diff; ch_idx++ ) { - Scale_sig32( &h_dirac_output_synthesis_state.gains_diff_prev_fx[ch_idx * num_freq_bands_diff], + Scale_sig32( &h_dirac_output_synthesis_state.gains_diff_prev_fx[imult1616( ch_idx, num_freq_bands_diff )], num_freq_bands_diff, sub( h_dirac_output_synthesis_state.q_cy_auto_diff_smooth_prev, h_dirac_output_synthesis_state.gains_diff_prev_q ) ); } h_dirac_output_synthesis_state.gains_diff_prev_q = h_dirac_output_synthesis_state.q_cy_auto_diff_smooth_prev; + move16(); ch_idx_diff = nchan_transport_foa; move16(); FOR( ch_idx = nchan_transport_foa; ch_idx < num_channels_diff; ch_idx++ ) { - IF( EQ_16( proto_direct_index[ch_idx], 0 ) ) + IF( proto_direct_index[ch_idx] == 0 ) { p_proto = h_dirac_output_synthesis_state.proto_diffuse_buffer_f_fx + shl( i_mult( buf_idx, i_mult( num_freq_bands, num_channels_diff ) ), Q1 ) + @@ -2275,14 +2387,14 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( Mpy_32_32( g2, ( *( p_gains_diff_prev++ ) ) ) ); // (Q31, p_gains_diff_q) -> p_gains_diff_q // ((p_gains_diff_q, p_proto_diff_q) >> Q1) -> (p_gains_diff_q + p_proto_diff_q - 31) - output_real[l * num_channels_dir + hDirACRend->sba_map_tc[ch_idx]] = - L_add( output_real[l * num_channels_dir + hDirACRend->sba_map_tc[ch_idx]], + output_real[add( imult1616( l, num_channels_dir ), hDirACRend->sba_map_tc[ch_idx] )] = + L_add( output_real[add( imult1616( l, num_channels_dir ), hDirACRend->sba_map_tc[ch_idx] )], Mpy_32_32( g, ( *( p_proto++ ) ) ) ); move32(); // ((p_gains_diff_q, p_proto_diff_q) >> Q1) -> (p_gains_diff_q + p_proto_diff_q - 31) - output_imag[l * num_channels_dir + hDirACRend->sba_map_tc[ch_idx]] = - L_add( output_imag[l * num_channels_dir + hDirACRend->sba_map_tc[ch_idx]], + output_imag[add( imult1616( l, num_channels_dir ), hDirACRend->sba_map_tc[ch_idx] )] = + L_add( output_imag[add( imult1616( l, num_channels_dir ), hDirACRend->sba_map_tc[ch_idx] )], Mpy_32_32( g, ( *( p_proto++ ) ) ) ); move32(); } @@ -2301,6 +2413,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( * Copy output or HOA decoder *-----------------------------------------------------------------*/ + test(); IF( hDirACRend->hOutSetup.is_loudspeaker_setup && hDirACRend->hoa_decoder != NULL ) { Word32 *p_real, *p_imag; @@ -2338,9 +2451,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( { FOR( l = 0; l < num_freq_bands; l++ ) { - RealBuffer[ch_idx][buf_idx][l] = L_shr( output_real[l * num_channels_dir + ch_idx], Q2 ); + RealBuffer[ch_idx][buf_idx][l] = L_shr( output_real[add( imult1616( l, num_channels_dir ), ch_idx )], Q2 ); move32(); - ImagBuffer[ch_idx][buf_idx][l] = L_shr( output_imag[l * num_channels_dir + ch_idx], Q2 ); + ImagBuffer[ch_idx][buf_idx][l] = L_shr( output_imag[add( imult1616( l, num_channels_dir ), ch_idx )], Q2 ); move32(); } } @@ -2354,42 +2467,34 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( /* store estimates for next synthesis block */ IF( hodirac_flag ) { - mvl2l( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx, h_dirac_output_synthesis_state.gains_dir_prev_fx, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS ); + Copy32( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx, h_dirac_output_synthesis_state.gains_dir_prev_fx, imult1616( num_freq_bands, num_channels_dir ) * DIRAC_HO_NUMSECTORS ); } ELSE { - mvl2l( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx, h_dirac_output_synthesis_state.gains_dir_prev_fx, num_freq_bands * num_channels_dir ); + Copy32( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx, h_dirac_output_synthesis_state.gains_dir_prev_fx, imult1616( num_freq_bands, num_channels_dir ) ); } *q_cy_cross_dir_smooth_prev = h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev; move16(); - mvl2l( h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev_fx, h_dirac_output_synthesis_state.gains_diff_prev_fx, num_freq_bands_diff * num_channels_diff ); + Copy32( h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev_fx, h_dirac_output_synthesis_state.gains_diff_prev_fx, imult1616( num_freq_bands_diff, num_channels_diff ) ); *q_cy_auto_diff_smooth_prev = h_dirac_output_synthesis_state.q_cy_auto_diff_smooth_prev; move16(); /* reset values */ IF( hodirac_flag ) { - set_zero_fx( h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS ); + set_zero_fx( h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx, imult1616( num_freq_bands, num_channels_dir ) * DIRAC_HO_NUMSECTORS ); } ELSE { - set_zero_fx( h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx, num_freq_bands * num_channels_dir ); + set_zero_fx( h_dirac_output_synthesis_state.cy_cross_dir_smooth_fx, imult1616( num_freq_bands, num_channels_dir ) ); } - set_zero_fx( h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx, num_freq_bands_diff * num_channels_diff ); + set_zero_fx( h_dirac_output_synthesis_state.cy_auto_diff_smooth_fx, imult1616( num_freq_bands_diff, num_channels_diff ) ); return; } #else - - -/*------------------------------------------------------------------------- - * ivas_dirac_dec_output_synthesis_process_subframe_gain_shd() - * - * - *------------------------------------------------------------------------*/ - void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ @@ -2830,13 +2935,13 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( } #endif -#ifdef IVAS_FLOAT_FIXED + /*------------------------------------------------------------------------- - * ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx() + * ivas_dirac_dec_output_synthesis_process_subframe_psd_ls() * * *------------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( Word32 RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ Word32 ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ @@ -2904,10 +3009,18 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( * compute target PSDs *-----------------------------------------------------------------*/ - IF( EQ_16( enc_param_start_band, 0 ) ) + IF( enc_param_start_band == 0 ) { - diff_start_band = EQ_16( h_dirac_output_synthesis_params->use_onset_filters, 1 ) ? h_dirac_output_synthesis_params->max_band_decorr : 0; - move16(); + IF( EQ_16( h_dirac_output_synthesis_params->use_onset_filters, 1 ) ) + { + diff_start_band = h_dirac_output_synthesis_params->max_band_decorr; + move16(); + } + ELSE + { + diff_start_band = 0; + move16(); + } IF( EQ_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_MONO ) ) { @@ -2932,7 +3045,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( &h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ); // Scale cy_auto_diff_smooth_fx if required - IF( NE_32( diff_start_band, 0 ) ) + IF( diff_start_band != 0 ) { q_com = s_min( *q_reference_power_smooth, h_dirac_output_synthesis_state->q_cy_auto_diff_smooth ); scale_sig32( reference_power_smooth, num_freq_bands, sub( q_com, *q_reference_power_smooth ) ); @@ -2941,9 +3054,10 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( i_mult( num_freq_bands, nchan_target_psds ), sub( q_com, h_dirac_output_synthesis_state->q_cy_auto_diff_smooth ) ); *q_reference_power_smooth = q_com; + move16(); h_dirac_output_synthesis_state->reference_power_smooth_prev_q = q_com; - move16(); + h_dirac_output_synthesis_state->q_cy_auto_diff_smooth = q_com; move16(); } @@ -2971,29 +3085,30 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( IF( EQ_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_MONO ) ) { - exp = sub( Q31, Q31 ); + exp = Q31 - Q31; + move16(); exp1 = 0; move16(); tmp32 = BASOP_Util_Divide3232_Scale_cadence( L_shl( p_cy_auto_dir_smooth[num_freq_bands], sub( q_com, h_dirac_output_synthesis_state->q_cy_auto_dir_smooth ) ), ( L_add( Sqrt32( h_dirac_output_synthesis_state->direct_power_factor_fx[0], &exp ), EPSILON_FX ) ), // (Q31 - exp) &exp1 ); target_power_y = L_shr( tmp32, 1 ); // Q31 + (q_com - (31 - exp)) - q_target_power_y = add( Q31 - exp1, sub( q_com, sub( Q31, exp ) ) ); + q_target_power_y = add( sub( Q31, exp1 ), sub( q_com, sub( Q31, exp ) ) ); q_target_power_y = sub( q_target_power_y, 1 ); - exp = sub( Q31, Q31 ); + exp = Q31 - Q31; + move16(); exp1 = 0; move16(); tmp32 = BASOP_Util_Divide3232_Scale_cadence( L_shl( p_cy_auto_diff_smooth[num_freq_bands], sub( q_com, h_dirac_output_synthesis_state->q_cy_auto_diff_smooth ) ), ( L_add( Sqrt32( h_dirac_output_synthesis_state->diffuse_power_factor_fx[0], &exp ), EPSILON_FX ) ), // (Q31 - exp) &exp1 ); target_power_y1 = L_shr( tmp32, 1 ); // Q31 + (q_com - (31 - exp)) - q_target_power_y1 = add( Q31 - exp1, sub( q_com, sub( Q31, exp ) ) ); + q_target_power_y1 = add( sub( Q31, exp1 ), sub( q_com, sub( Q31, exp ) ) ); q_target_power_y1 = sub( q_target_power_y1, 1 ); target_power_y = L_add( L_shl( target_power_y, sub( s_min( q_target_power_y1, q_target_power_y ), q_target_power_y ) ), L_shl( target_power_y1, sub( s_min( q_target_power_y1, q_target_power_y ), q_target_power_y1 ) ) ); - exp = s_min( q_target_power_y1 - 1, q_target_power_y - 1 ); - move16(); + exp = s_min( sub( q_target_power_y1, 1 ), sub( q_target_power_y, 1 ) ); } ELSE { @@ -3007,25 +3122,29 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( subtract_power_y = masa_stereo_type_detect->subtract_power_y_fx; // q_subtract_power_y move32(); - a = 858993; /* ( 0.0004f in Q31 ); Temporal smoothing coefficient */ + a = 858993; /* ( 0.0004f in Q31 ); Temporal smoothing coefficient */ + move32(); b = L_sub( ONE_IN_Q31, a ); /* Temporal smoothing coefficient */ q_com = s_min( exp, masa_stereo_type_detect->q_target_power_y_smooth ); target_power_y = L_shl( target_power_y, sub( q_com, exp ) ); masa_stereo_type_detect->target_power_y_smooth_fx = L_shl( masa_stereo_type_detect->target_power_y_smooth_fx, sub( q_com, masa_stereo_type_detect->q_target_power_y_smooth ) ); + move32(); masa_stereo_type_detect->target_power_y_smooth_fx = L_add( Mpy_32_32( a, target_power_y ), Mpy_32_32( b, masa_stereo_type_detect->target_power_y_smooth_fx ) ); //(Q31, q_com) -> q_com + move32(); masa_stereo_type_detect->q_target_power_y_smooth = q_com; move16(); masa_stereo_type_detect->subtract_power_y_smooth_fx = L_add( Mpy_32_32( a, subtract_power_y ), Mpy_32_32( b, masa_stereo_type_detect->subtract_power_y_smooth_fx ) ); //(Q31, q_subtract_power_y) -> q_subtract_power_y + move32(); exp = 0; move16(); - IF( NE_32( masa_stereo_type_detect->target_power_y_smooth_fx, 0 ) ) + IF( masa_stereo_type_detect->target_power_y_smooth_fx != 0 ) { subtract_target_ratio = L_sub( BASOP_Util_Log2( masa_stereo_type_detect->subtract_power_y_smooth_fx ), BASOP_Util_Log2( masa_stereo_type_detect->target_power_y_smooth_fx ) ); // Q25 @@ -3036,7 +3155,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( { subtract_target_ratio = BASOP_Util_Log2( masa_stereo_type_detect->subtract_power_y_smooth_fx ); // Q25 exp = sub( 31, masa_stereo_type_detect->q_subtract_power_y ); - L_tmp = L_sub( Mpy_32_32( L_add( subtract_target_ratio, L_shl( exp, 25 ) ), LOG10_2_Q31 ), L_shl( -15, 25 ) /*log(EPSILON)*/ ); // Q25 + L_tmp = L_sub( Mpy_32_32( L_add( subtract_target_ratio, L_shl( exp, 25 ) ), LOG10_2_Q31 ), -503316480 /* L_shl( -15, 25 ) */ /*log(EPSILON)*/ ); // Q25 } subtract_target_ratio_db = Mpy_32_32( 1342177280 /* 10.0f * in Q27*/, L_tmp ); // (Q27, (Q25, Q31)) -> (Q27, Q25) -> Q21 @@ -3117,7 +3236,8 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( { FOR( l = 0; l < num_freq_bands; l++ ) { - g1 = alpha[l]; // Q31 + g1 = alpha[l]; // Q31 + move32(); g2 = L_sub( ONE_IN_Q31, g1 ); // Q31 *p_power_smooth_prev = L_add( EPSILON_FX, Mpy_32_32( g2, ( *p_power_smooth_prev ) ) ); //(Q31, q_proto_power_smooth) -> q_proto_power_smooth move32(); @@ -3172,11 +3292,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( FOR( l = 0; l < num_freq_bands; l++ ) { *p_power_smooth = L_shr( *p_power_smooth, sub( min_exp, exp_arr[add( i_mult( k, num_freq_bands ), l )] ) ); - p_power_smooth++; move32(); + p_power_smooth++; IF( EQ_32( *( p_power_smooth_prev ), EPSILON_FX ) ) { - q_tmp = add( sub( Q31, min_exp ), sub( Q31, 62 ) ); + q_tmp = add( sub( Q31, min_exp ), Q31 - 62 ); } ELSE { @@ -3187,7 +3307,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( // Update the Q-factor h_dirac_output_synthesis_state->proto_power_smooth_prev_q = h_dirac_output_synthesis_state->proto_power_smooth_q; + move16(); h_dirac_output_synthesis_state->proto_power_smooth_q = q_tmp; + move16(); /*Direct gains and diffuse gains on number of output channels*/ p_power_diff_smooth_prev = h_dirac_output_synthesis_state->proto_power_diff_smooth_prev_fx; @@ -3202,6 +3324,8 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( scale_sig32( p_cy_auto_dir_smooth, imult1616( nchan_out_woLFE, num_freq_bands ), sub( q_com, h_dirac_output_synthesis_state->q_cy_auto_dir_smooth ) ); scale_sig32( p_cy_auto_dir_smooth_prev, imult1616( nchan_out_woLFE, num_freq_bands ), sub( q_com, h_dirac_output_synthesis_state->q_cy_auto_dir_smooth_prev ) ); h_dirac_output_synthesis_state->q_cy_auto_dir_smooth = h_dirac_output_synthesis_state->q_cy_auto_dir_smooth_prev = q_com; + move16(); + move16(); p_cy_cross_dir_smooth = h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx; p_cy_cross_dir_smooth_prev = h_dirac_output_synthesis_state->cy_cross_dir_smooth_prev_fx; @@ -3209,6 +3333,8 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( scale_sig32( p_cy_cross_dir_smooth, imult1616( nchan_out_woLFE, num_freq_bands ), sub( q_com, h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); scale_sig32( p_cy_cross_dir_smooth_prev, imult1616( nchan_out_woLFE, num_freq_bands ), sub( q_com, h_dirac_output_synthesis_state->q_cy_cross_dir_smooth_prev ) ); h_dirac_output_synthesis_state->q_cy_cross_dir_smooth = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth_prev = q_com; + move16(); + move16(); p_cy_auto_diff_smooth = h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx; p_cy_auto_diff_smooth_prev = h_dirac_output_synthesis_state->cy_auto_diff_smooth_prev_fx; @@ -3216,6 +3342,8 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( scale_sig32( p_cy_auto_diff_smooth, imult1616( nchan_out_woLFE, num_freq_bands ), sub( q_com, h_dirac_output_synthesis_state->q_cy_auto_diff_smooth ) ); scale_sig32( p_cy_auto_diff_smooth_prev, imult1616( nchan_out_woLFE, num_freq_bands ), sub( q_com, h_dirac_output_synthesis_state->q_cy_auto_diff_smooth_prev ) ); h_dirac_output_synthesis_state->q_cy_auto_diff_smooth = h_dirac_output_synthesis_state->q_cy_auto_diff_smooth_prev = q_com; + move16(); + move16(); FOR( k = 0; k < nchan_out_woLFE; k++ ) { @@ -3246,20 +3374,21 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( *( p_gains_dir ) = L_shl_sat( *( p_gains_dir ), sub( h_dirac_output_synthesis_state->gains_dir_prev_q, sub( Q31, exp ) ) ); // gains_dir_prev_q move32(); - IF( LT_32( *( p_gains_dir ), 0 ) ) + IF( *( p_gains_dir ) < 0 ) { *( p_gains_dir ) = 0; move32(); } - ELSE IF( GT_32( *( p_gains_dir ), (Word32) ( DIRAC_GAIN_LIMIT * L_shl( 1U, h_dirac_output_synthesis_state->gains_dir_prev_q ) ) ) ) + ELSE IF( GT_32( *( p_gains_dir ), W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_dir_prev_q ) ), Q5 ) ) ) ) { - *( p_gains_dir ) = (Word32) ( DIRAC_GAIN_LIMIT * L_shl( 1U, h_dirac_output_synthesis_state->gains_dir_prev_q ) ); + *( p_gains_dir ) = W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_dir_prev_q ) ), Q5 ) ); move32(); } - IF( LT_32( *( p_cy_cross_dir_smooth_prev++ ), 0 ) ) + IF( *( p_cy_cross_dir_smooth_prev++ ) < 0 ) { *( p_gains_dir ) = L_negate( *( p_gains_dir ) ); + move32(); } p_gains_dir++; @@ -3267,8 +3396,10 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( *p_power_diff_smooth_prev = L_add( L_add( Mpy_32_32( g1, ( *( p_power_smooth_diff++ ) ) ), Mpy_32_32( g2, ( *( p_power_diff_smooth_prev ) ) ) ), EPSILLON_FX ); // (Q31, q_power_diff_smooth_prev) -> q_power_diff_smooth_prev + move32(); *( p_cy_auto_diff_smooth_prev ) = L_add( Mpy_32_32( g1, ( *( p_cy_auto_diff_smooth++ ) ) ), Mpy_32_32( g2, ( *( p_cy_auto_diff_smooth_prev ) ) ) ); // (Q31, q_cy_auto_diff_smooth_prev) -> q_cy_auto_diff_smooth_prev + move32(); exp = 0; move16(); @@ -3280,14 +3411,14 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( *( p_gains_diff ) = L_shl_sat( *( p_gains_diff ), sub( h_dirac_output_synthesis_state->gains_diff_prev_q, sub( Q31, exp ) ) ); // gains_diff_prev_q move32(); - IF( LT_32( *( p_gains_diff ), 0 ) ) + IF( *( p_gains_diff ) < 0 ) { *( p_gains_diff ) = 0; move32(); } - ELSE IF( GT_32( *( p_gains_diff ), (Word32) ( DIRAC_GAIN_LIMIT * L_shl( 1U, h_dirac_output_synthesis_state->gains_diff_prev_q ) ) ) ) + ELSE IF( GT_32( *( p_gains_diff ), W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_diff_prev_q ) ), Q5 ) ) ) ) { - *( p_gains_diff ) = (Word32) ( DIRAC_GAIN_LIMIT * L_shl( 1U, h_dirac_output_synthesis_state->gains_diff_prev_q ) ); + *( p_gains_diff ) = W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_diff_prev_q ) ), Q5 ) ); move32(); } p_gains_diff++; @@ -3297,7 +3428,8 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( FOR( ; l < num_freq_bands; l++ ) { /*Direct*/ - g1 = alpha[l]; // Q31 + g1 = alpha[l]; // Q31 + move32(); g2 = L_sub( ONE_IN_Q31, g1 ); // Q31 *( p_cy_auto_dir_smooth_prev ) = L_add( Mpy_32_32( g1, ( *( p_cy_auto_dir_smooth++ ) ) ), Mpy_32_32( g2, ( *( p_cy_auto_dir_smooth_prev ) ) ) ); // (Q31, q_cy_auto_dir_smooth_prev) -> q_cy_auto_dir_smooth_prev @@ -3317,20 +3449,21 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( *( p_gains_dir ) = L_shl_sat( *( p_gains_dir ), sub( h_dirac_output_synthesis_state->gains_dir_prev_q, sub( Q31, exp ) ) ); // gains_dir_prev_q move32(); - IF( LT_32( *( p_gains_dir ), 0 ) ) + IF( *( p_gains_dir ) < 0 ) { *( p_gains_dir ) = 0; move32(); } - ELSE IF( GT_32( *( p_gains_dir ), (Word32) ( DIRAC_GAIN_LIMIT * L_shl( 1U, h_dirac_output_synthesis_state->gains_dir_prev_q ) ) ) ) + ELSE IF( GT_32( *( p_gains_dir ), W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_dir_prev_q ) ), Q5 ) ) ) ) { - *( p_gains_dir ) = (Word32) ( DIRAC_GAIN_LIMIT * L_shl( 1U, h_dirac_output_synthesis_state->gains_dir_prev_q ) ); + *( p_gains_dir ) = W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_dir_prev_q ) ), Q5 ) ); move32(); } - IF( LT_32( *( p_cy_cross_dir_smooth_prev++ ), 0 ) ) + IF( *( p_cy_cross_dir_smooth_prev++ ) < 0 ) { *( p_gains_dir ) = L_negate( *( p_gains_dir ) ); + move32(); } p_gains_dir++; @@ -3351,14 +3484,14 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( *( p_gains_diff ) = L_shl_sat( *( p_gains_diff ), sub( h_dirac_output_synthesis_state->gains_diff_prev_q, sub( Q31, exp ) ) ); // gains_diff_prev_q move32(); - IF( LT_32( *( p_gains_diff ), 0 ) ) + IF( *( p_gains_diff ) < 0 ) { *( p_gains_diff ) = 0; move32(); } - ELSE IF( GT_32( *( p_gains_diff ), (Word32) ( DIRAC_GAIN_LIMIT * L_shl( 1U, h_dirac_output_synthesis_state->gains_diff_prev_q ) ) ) ) + ELSE IF( GT_32( *( p_gains_diff ), W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_diff_prev_q ) ), Q5 ) ) ) ) { - *( p_gains_diff ) = (Word32) ( DIRAC_GAIN_LIMIT * L_shl( 1U, h_dirac_output_synthesis_state->gains_diff_prev_q ) ); + *( p_gains_diff ) = W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_diff_prev_q ) ), Q5 ) ); move32(); } p_gains_diff++; @@ -3393,7 +3526,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( } /*Diffuse stream*/ - IF( NE_16( h_dirac_output_synthesis_params->max_band_decorr, 0 ) ) + IF( h_dirac_output_synthesis_params->max_band_decorr != 0 ) { p_power_smooth_diff = h_dirac_output_synthesis_state->proto_diffuse_buffer_f_fx + shl( i_mult( buf_idx, i_mult( h_dirac_output_synthesis_params->max_band_decorr, nchan_out_woLFE ) ), Q1 ); @@ -3431,39 +3564,32 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( } } *q_Cldfb = sub( sub( add( h_dirac_output_synthesis_state->proto_direct_buffer_f_q, h_dirac_output_synthesis_state->gains_dir_prev_q ), Q31 ), Q1 ); + move16(); /*-----------------------------------------------------------------* * update buffers *-----------------------------------------------------------------*/ /* store estimates for next synthesis block */ - mvl2l( gains_dir, h_dirac_output_synthesis_state->gains_dir_prev_fx, num_freq_bands * nchan_out_woLFE ); - mvl2l( gains_diff, h_dirac_output_synthesis_state->gains_diff_prev_fx, num_freq_bands * nchan_out_woLFE ); + Copy32( gains_dir, h_dirac_output_synthesis_state->gains_dir_prev_fx, imult1616( num_freq_bands, nchan_out_woLFE ) ); + Copy32( gains_diff, h_dirac_output_synthesis_state->gains_diff_prev_fx, imult1616( num_freq_bands, nchan_out_woLFE ) ); /* reset values */ - set_zero_fx( h_dirac_output_synthesis_state->proto_power_smooth_fx, num_freq_bands * num_protos_dir ); + set_zero_fx( h_dirac_output_synthesis_state->proto_power_smooth_fx, imult1616( num_freq_bands, num_protos_dir ) ); IF( h_dirac_output_synthesis_state->proto_power_diff_smooth_fx != NULL ) { set_zero_fx( h_dirac_output_synthesis_state->proto_power_diff_smooth_fx, h_dirac_output_synthesis_params->max_band_decorr * nchan_out_woLFE ); } - set_zero_fx( h_dirac_output_synthesis_state->cy_auto_dir_smooth_fx, num_freq_bands * nchan_out_woLFE ); - set_zero_fx( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx, num_freq_bands * nchan_out_woLFE ); - set_zero_fx( h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, num_freq_bands * nchan_out_woLFE ); + set_zero_fx( h_dirac_output_synthesis_state->cy_auto_dir_smooth_fx, imult1616( num_freq_bands, nchan_out_woLFE ) ); + set_zero_fx( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx, imult1616( num_freq_bands, nchan_out_woLFE ) ); + set_zero_fx( h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, imult1616( num_freq_bands, nchan_out_woLFE ) ); pop_wmops(); return; } #else - - -/*------------------------------------------------------------------------- - * ivas_dirac_dec_output_synthesis_process_subframe_psd_ls() - * - * - *------------------------------------------------------------------------*/ - void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ @@ -3818,13 +3944,14 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( } #endif -#ifdef IVAS_FLOAT_FIXED + /*------------------------------------------------------------------------- - * ivas_dirac_dec_get_response_split_order_fx() + * ivas_dirac_dec_get_response_split_order() * * calculate reponse, 1 degree resolution *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED static void ivas_dirac_dec_get_response_split_order_fx( const Word16 azimuth, const Word16 elevation, @@ -3848,7 +3975,16 @@ static void ivas_dirac_dec_get_response_split_order_fx( push_wmops( "ivas_dirac_dec_get_response_split_order" ); - tmp = idiv1616( add( azimuth, 180 ), 360 ); + /* Corner case for handling crash in idiv1616 when numerator is 0 */ + IF( EQ_16( azimuth, -180 ) ) + { + tmp = 0; + move16(); + } + ELSE + { + tmp = idiv1616( add( azimuth, 180 ), 360 ); + } index_azimuth = sub( add( azimuth, 180 ), i_mult( tmp, 360 ) ); // index_azimuth = (azimuth + 180) % 360 index_elevation = add( elevation, 90 ); @@ -3944,7 +4080,7 @@ static void ivas_dirac_dec_get_response_split_order_fx( move16(); c = L_shl( Mpy_32_32( dirac_gains_norm_term_int[a], dirac_gains_Pnm_int[el][a] ), 3 ); // Q29 - IF( EQ_16( sub( l, i_mult( idiv1616( l, 2 ), 2 ) ), 1 ) ) + IF( EQ_16( l % 2, 1 ) ) { c = L_shl( Mpy_32_16_1( c, e ), 1 ); // Q29 } @@ -3954,8 +4090,7 @@ static void ivas_dirac_dec_get_response_split_order_fx( } /*Conversion spherical to cartesian coordinates*/ - w = -dirac_gains_trg_term_int[el][1]; // Q30 - move32(); + w = L_negate( dirac_gains_trg_term_int[el][1] ); // Q30 dv_0 = Mpy_32_32( w, cos_1 ); // Q28 dv_1 = Mpy_32_32( w, sin_1 ); // Q28 dv_2 = L_shr( Mpy_32_16_1( dirac_gains_trg_term_int[el][0], e ), 1 ); // Q28 @@ -4077,7 +4212,7 @@ static void ivas_dirac_dec_get_response_split_order_fx( c = L_shl( Mpy_32_32( dirac_gains_norm_term_int[a], dirac_gains_Pnm_int[el][a] ), 3 ); // Q29 - IF( EQ_16( sub( l, i_mult( idiv1616( l, 2 ), 2 ) ), 1 ) ) + IF( EQ_16( l % 2, 1 ) ) { c = L_shl( Mpy_32_16_1( c, e ), 1 ); // Q29 } @@ -4087,19 +4222,13 @@ static void ivas_dirac_dec_get_response_split_order_fx( } *q_response = Q29; - move32(); + move16(); pop_wmops(); return; } #else -/*------------------------------------------------------------------------- - * ivas_dirac_dec_get_response_split_order() - * - * calculate reponse, 1 degree resolution - *------------------------------------------------------------------------*/ - static void ivas_dirac_dec_get_response_split_order( const int16_t azimuth, const int16_t elevation, @@ -4262,6 +4391,7 @@ static void ivas_dirac_dec_get_response_split_order( * * *------------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED void ivas_dirac_dec_compute_directional_responses_fx( SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ @@ -4319,7 +4449,7 @@ void ivas_dirac_dec_compute_directional_responses_fx( azimuth2 = NULL; elevation2 = NULL; transport_signal_type = MASA_STEREO_NOT_DEFINED; - move16(); + move32(); IF( hDirACRend->masa_stereo_type_detect != NULL ) { @@ -4341,13 +4471,13 @@ void ivas_dirac_dec_compute_directional_responses_fx( move16(); } - codingBand = negate( 1 ); + codingBand = -1; assert( num_channels_dir <= MAX_OUTPUT_CHANNELS && "Number of channels is too high" ); FOR( k = 0; k < hSpatParamRendCom->num_freq_bands; ++k ) { - IF( masa_band_mapping != NULL && EQ_16( k, MASA_band_grouping_24[masa_band_mapping[add( codingBand, 1 )]] ) ) + if ( masa_band_mapping != NULL && EQ_16( k, MASA_band_grouping_24[masa_band_mapping[add( codingBand, 1 )]] ) ) { codingBand = add( codingBand, 1 ); } @@ -4404,6 +4534,10 @@ void ivas_dirac_dec_compute_directional_responses_fx( } } + test(); + test(); + test(); + test(); IF( masa_band_mapping == NULL && EQ_16( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { mvr2r_inc_fixed( direct_response_hoa_fx, 1, &hDirACRend->h_output_synthesis_psd_state.direct_responses_fx[k], hSpatParamRendCom->num_freq_bands, num_channels_dir ); @@ -4423,13 +4557,11 @@ void ivas_dirac_dec_compute_directional_responses_fx( Q_direct_response_hoa = Q29; move16(); exp_direct_response_hoa = sub( 31, Q_direct_response_hoa ); - move16(); } spreadCoherencePanningHoa_fx( azimuth[k], elevation[k], hSpatParamRendCom->spreadCoherence_fx[md_idx][k], direct_response_hoa_fx, &Q_direct_response_hoa, num_channels_dir, hDirACRend->hOutSetup.ambisonics_order ); exp_direct_response_hoa = sub( 31, Q_direct_response_hoa ); - move16(); /* Synthesize the second direction and combine the gains */ IF( EQ_16( hSpatParamRendCom->numParametricDirections, 2 ) ) { @@ -4439,22 +4571,20 @@ void ivas_dirac_dec_compute_directional_responses_fx( Q_direct_response_dir2 = Q29; move16(); exp_direct_response_dir2 = sub( 31, Q_direct_response_dir2 ); - move16(); } spreadCoherencePanningHoa_fx( azimuth2[k], elevation2[k], hSpatParamRendCom->spreadCoherence2_fx[md_idx][k], direct_response_dir2_fx, &Q_direct_response_dir2, num_channels_dir, hDirACRend->hOutSetup.ambisonics_order ); exp_direct_response_hoa = sub( 31, Q_direct_response_hoa ); - move16(); /* Combine gains from the two directions */ totalDirect_fx = L_add( hSpatParamRendCom->energy_ratio1_fx[md_idx][k], hSpatParamRendCom->energy_ratio2_fx[md_idx][k] ); - IF( EQ_32( totalDirect_fx, 0 ) ) + IF( totalDirect_fx == 0 ) { totalDirect_fx = EPSILON_FIX; move32(); } - Word16 var_a = 0, var_b = 0, exp_1 = 0, exp_2 = 0; + Word16 var_a, var_b, exp_1, exp_2; var_a = BASOP_Util_Divide3232_Scale( hSpatParamRendCom->energy_ratio1_fx[md_idx][k], totalDirect_fx, &exp_1 ); var_b = BASOP_Util_Divide3232_Scale( hSpatParamRendCom->energy_ratio2_fx[md_idx][k], totalDirect_fx, &exp_2 ); @@ -4463,11 +4593,10 @@ void ivas_dirac_dec_compute_directional_responses_fx( directRatio_fx[1] = L_deposit_h( var_b ); move32(); - Word32 temp_a = 0; - Word16 exp_arr[MAX_OUTPUT_CHANNELS], exp_temp_a = 0, final_exp = 0; + Word32 temp_a; + Word16 exp_arr[MAX_OUTPUT_CHANNELS], exp_temp_a, final_exp; set16_fx( exp_arr, exp_direct_response_hoa, MAX_OUTPUT_CHANNELS ); exp_direct_response_hoa = sub( 31, Q_direct_response_hoa ); - move16(); FOR( l = 0; l < num_channels_dir; l++ ) { @@ -4476,9 +4605,7 @@ void ivas_dirac_dec_compute_directional_responses_fx( exp_arr[l] = add( exp_1, sub( 31, Q_direct_response_hoa ) ); move16(); temp_a = Mpy_32_32( directRatio_fx[1], direct_response_dir2_fx[l] ); - move32(); exp_temp_a = add( exp_2, sub( 31, Q_direct_response_dir2 ) ); - move16(); direct_response_hoa_fx[l] = BASOP_Util_Add_Mant32Exp( direct_response_hoa_fx[l], exp_arr[l], temp_a, exp_temp_a, &final_exp ); move32(); exp_arr[l] = final_exp; @@ -4490,23 +4617,23 @@ void ivas_dirac_dec_compute_directional_responses_fx( maximum_fx( exp_arr, MAX_OUTPUT_CHANNELS, &max_exp ); FOR( l = 0; l < MAX_OUTPUT_CHANNELS; l++ ) { - direct_response_hoa_fx[l] = L_shr( direct_response_hoa_fx[l], max_exp - exp_arr[l] ); + direct_response_hoa_fx[l] = L_shr( direct_response_hoa_fx[l], sub( max_exp, exp_arr[l] ) ); move32(); } exp_direct_response_hoa = max_exp; move16(); Q_direct_response_hoa = sub( 31, max_exp ); - move16(); } - IF( GT_16( hSpatParamRendCom->numIsmDirections, 0 ) ) + IF( hSpatParamRendCom->numIsmDirections > 0 ) { Word16 dir; Word32 direct_response_temp_fx[MAX_OUTPUT_CHANNELS]; Word32 direct_response_ism_fx[MAX_OUTPUT_CHANNELS]; - Word16 exp_direct_response_ism = 0, exp_direct_response_temp = 0; + Word16 exp_direct_response_ism = 0, exp_direct_response_temp; Word32 masaDirect_fx; Word32 ismDirect_fx; + move16(); set32_fx( direct_response_ism_fx, 0, num_channels_dir ); @@ -4525,6 +4652,8 @@ void ivas_dirac_dec_compute_directional_responses_fx( Word32 temp_1 = 0; Word16 exp_temp = 0, exp_arr[MAX_OUTPUT_CHANNELS]; + move16(); + move16(); set16_fx( exp_arr, 0, MAX_OUTPUT_CHANNELS ); FOR( l = 0; l < num_channels_dir; l++ ) { @@ -4535,6 +4664,7 @@ void ivas_dirac_dec_compute_directional_responses_fx( move16(); } Word16 max_exp = MIN16B; + move16(); maximum_fx( exp_arr, num_channels_dir, &max_exp ); FOR( l = 0; l < num_channels_dir; l++ ) { @@ -4544,14 +4674,14 @@ void ivas_dirac_dec_compute_directional_responses_fx( exp_direct_response_ism = max_exp; move16(); } - Word16 exp_1 = 0, exp_2 = 0; + Word16 exp_1, exp_2; masaDirect_fx = hSpatParamRendCom->energy_ratio1_fx[md_idx][k]; move32(); - IF( EQ_32( masaDirect_fx, 0 ) ) + if ( masaDirect_fx == 0 ) { masaDirect_fx = L_add( masaDirect_fx, EPSILLON_FX ); } - IF( EQ_16( hSpatParamRendCom->numParametricDirections, 2 ) ) + if ( EQ_16( hSpatParamRendCom->numParametricDirections, 2 ) ) { masaDirect_fx = L_add( masaDirect_fx, hSpatParamRendCom->energy_ratio2_fx[md_idx][k] ); } @@ -4572,14 +4702,14 @@ void ivas_dirac_dec_compute_directional_responses_fx( directRatio_fx[1] = L_deposit_h( var_b ); move32(); - Word32 temp_2 = 0, temp_3 = 0; - Word16 exp_arr[MAX_OUTPUT_CHANNELS], exp_temp_3 = 0; + Word32 temp_2, temp_3; + Word16 exp_arr[MAX_OUTPUT_CHANNELS], exp_temp_3; set16_fx( exp_arr, exp_direct_response_hoa, MAX_OUTPUT_CHANNELS ); FOR( l = 0; l < num_channels_dir; l++ ) { direct_response_hoa_fx[l] = Mpy_32_32( direct_response_hoa_fx[l], directRatio_fx[0] ); move32(); - exp_arr[l] = exp_direct_response_hoa + exp_1; + exp_arr[l] = add( exp_direct_response_hoa, exp_1 ); move16(); temp_2 = Mpy_32_32( directRatio_fx[1], direct_response_ism_fx[l] ); temp_3 = BASOP_Util_Add_Mant32Exp( direct_response_hoa_fx[l], exp_arr[l], temp_2, exp_2 + exp_direct_response_ism, &exp_temp_3 ); @@ -4595,7 +4725,7 @@ void ivas_dirac_dec_compute_directional_responses_fx( maximum_fx( exp_arr, num_channels_dir, &max_exp ); FOR( l = 0; l < num_channels_dir; l++ ) { - direct_response_hoa_fx[l] = L_shr( direct_response_hoa_fx[l], max_exp - exp_arr[l] ); + direct_response_hoa_fx[l] = L_shr( direct_response_hoa_fx[l], sub( max_exp, exp_arr[l] ) ); move32(); } Q_direct_response_hoa = sub( 31, max_exp ); @@ -4604,27 +4734,29 @@ void ivas_dirac_dec_compute_directional_responses_fx( } /* Synthesize surrounding coherence */ - IF( surCohRatio_fx != NULL && GT_32( surCohRatio_fx[k], 0 ) ) + IF( surCohRatio_fx != NULL && surCohRatio_fx[k] > 0 ) { - Word32 var_a = 0, var_b = 0; - Word16 exp_arr[MAX_OUTPUT_CHANNELS], exp = 0; + Word32 var_a, var_b; + Word16 exp_arr[MAX_OUTPUT_CHANNELS], exp; set16_fx( exp_arr, exp_direct_response_hoa, MAX_OUTPUT_CHANNELS ); FOR( l = 1; l < num_channels_dir; l++ ) { exp = 0; + move16(); var_a = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, L_negate( surCohRatio_fx[k] ), exp_surCohRatio, &exp ); var_b = Sqrt32( var_a, &exp ); direct_response_hoa_fx[l] = Mpy_32_32( direct_response_hoa_fx[l], var_b ); move32(); - exp_arr[l] = 31 - Q_direct_response_hoa + exp; + exp_arr[l] = add( sub( 31, Q_direct_response_hoa ), exp ); move16(); } Word16 max_exp = MIN_16; + move16(); maximum_fx( exp_arr, MAX_OUTPUT_CHANNELS, &max_exp ); FOR( l = 0; l < MAX_OUTPUT_CHANNELS; l++ ) { - direct_response_hoa_fx[l] = L_shr( direct_response_hoa_fx[l], max_exp - exp_arr[l] ); + direct_response_hoa_fx[l] = L_shr( direct_response_hoa_fx[l], sub( max_exp, exp_arr[l] ) ); move32(); } Q_direct_response_hoa = sub( 31, max_exp ); @@ -4639,7 +4771,7 @@ void ivas_dirac_dec_compute_directional_responses_fx( move16(); direct_response_fx = direct_response_hoa_fx; - IF( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + IF( NE_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { v_mult_fixed( direct_response_fx, direct_response_fx, direct_response_square_fx, num_channels_dir ); direct_response_square_q = sub( add( direct_response_q, direct_response_q ), 31 ); @@ -4650,6 +4782,7 @@ void ivas_dirac_dec_compute_directional_responses_fx( { direct_response_fx[0] = ONE_IN_Q29; move32(); + test(); IF( GE_16( k, dipole_freq_range[0] ) && LT_16( k, dipole_freq_range[1] ) ) { direct_response_fx[1] = ONE_IN_Q29; @@ -4669,7 +4802,6 @@ void ivas_dirac_dec_compute_directional_responses_fx( assert( 0 && "Not supported synthesis method!" ); } } - ELSE IF( EQ_16( hDirACRend->panningConf, DIRAC_PANNING_VBAP ) ) /*VBAP*/ { /* Synthesize the first direction */ @@ -4687,7 +4819,7 @@ void ivas_dirac_dec_compute_directional_responses_fx( /* Combine gains from the two directions */ Word32 test = L_add( hSpatParamRendCom->energy_ratio1_fx[md_idx][k], hSpatParamRendCom->energy_ratio2_fx[md_idx][k] ); - IF( EQ_32( test, 0 ) ) + IF( test == 0 ) { totalDirect_fx = L_add( test, EPSILON_FIX ); // Q30 } @@ -4696,12 +4828,7 @@ void ivas_dirac_dec_compute_directional_responses_fx( totalDirect_fx = test; move32(); } - Word16 exp_1 = 0, exp_2 = 0; - move16(); - move16(); - Word16 var_1 = 0, var_2 = 0; - move16(); - move16(); + Word16 var_1, var_2, exp_1, exp_2; var_1 = BASOP_Util_Divide3232_Scale( hSpatParamRendCom->energy_ratio1_fx[md_idx][k], totalDirect_fx, &exp_1 ); var_2 = BASOP_Util_Divide3232_Scale( hSpatParamRendCom->energy_ratio2_fx[md_idx][k], totalDirect_fx, &exp_2 ); @@ -4710,21 +4837,24 @@ void ivas_dirac_dec_compute_directional_responses_fx( directRatio_fx[1] = L_deposit_h( var_2 ); move32(); - Word32 var_a = 0; - Word16 exp_tmp = 0; + Word32 var_a; + Word16 exp_tmp; Word16 exp_max = MIN16B, exp_table[MAX_OUTPUT_CHANNELS]; + move16(); set16_fx( exp_table, exp_direct_response_ls, MAX_OUTPUT_CHANNELS ); exp_direct_response_ls = sub( 31, Q_direct_response_ls ); exp_direct_response_dir2 = sub( 31, Q_direct_response_dir2 ); Word32 temp = 0; + move32(); FOR( l = 0; l < num_channels_dir; l++ ) { temp = Mpy_32_32( direct_response_ls_fx[l], directRatio_fx[0] ); // exp_direct_response_ls + exp_1 var_a = Mpy_32_32( directRatio_fx[1], direct_response_dir2_fx[l] ); // exp_direct_response_dir2 + exp_2 exp_tmp = 0; - direct_response_ls_fx[l] = BASOP_Util_Add_Mant32Exp( temp, exp_direct_response_ls + exp_1, var_a, exp_direct_response_dir2 + exp_2, &exp_tmp ); + move16(); + direct_response_ls_fx[l] = BASOP_Util_Add_Mant32Exp( temp, add( exp_direct_response_ls, exp_1 ), var_a, add( exp_direct_response_dir2, exp_2 ), &exp_tmp ); move32(); exp_table[l] = exp_tmp; move16(); @@ -4734,7 +4864,7 @@ void ivas_dirac_dec_compute_directional_responses_fx( FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { - direct_response_ls_fx[i] = L_shr( direct_response_ls_fx[i], exp_max - exp_table[i] ); + direct_response_ls_fx[i] = L_shr( direct_response_ls_fx[i], sub( exp_max, exp_table[i] ) ); move32(); } Q_direct_response_ls = sub( 31, exp_max ); @@ -4745,13 +4875,14 @@ void ivas_dirac_dec_compute_directional_responses_fx( exp_direct_response_ls = sub( 31, Q_direct_response_ls ); } - IF( GT_16( hSpatParamRendCom->numIsmDirections, 0 ) ) + IF( hSpatParamRendCom->numIsmDirections > 0 ) { Word16 dir; Word32 direct_response_temp_fx[MAX_OUTPUT_CHANNELS]; set32_fx( direct_response_temp_fx, 0, MAX_OUTPUT_CHANNELS ); Word16 Q_direct_response_temp = Q31; + move16(); Word32 direct_response_ism_fx[MAX_OUTPUT_CHANNELS]; set32_fx( direct_response_ism_fx, 0, num_channels_dir ); Word32 masaDirect_fx; @@ -4769,17 +4900,17 @@ void ivas_dirac_dec_compute_directional_responses_fx( } Word32 tmp = 0; move32(); - Word16 Q_arr[MAX_OUTPUT_CHANNELS], exp_tmp = 0; - move16(); + Word16 Q_arr[MAX_OUTPUT_CHANNELS], exp_tmp; FOR( l = 0; l < num_channels_dir; l++ ) { tmp = Mpy_32_32( direct_response_temp_fx[l], hMasaIsm->energy_ratio_ism_fx[dir][md_idx][k] ); // Q30 * 2 - 31 - direct_response_ism_fx[l] = BASOP_Util_Add_Mant32Exp( direct_response_ism_fx[l], 0, tmp, sub( 31, sub( 60, 31 ) ), &exp_tmp ); + direct_response_ism_fx[l] = BASOP_Util_Add_Mant32Exp( direct_response_ism_fx[l], 0, tmp, 31 - ( 60 - 31 ), &exp_tmp ); move32(); Q_arr[l] = sub( 31, exp_tmp ); move16(); } Word16 Q_min = MAX16B; + move32(); minimum_fx( Q_arr, num_channels_dir, &Q_min ); FOR( i = 0; i < num_channels_dir; i++ ) { @@ -4791,11 +4922,10 @@ void ivas_dirac_dec_compute_directional_responses_fx( normalizePanningGains_fx( direct_response_ism_fx, &Q_direct_response_temp, num_channels_dir ); } - Word16 exp_1 = 0, exp_2 = 0; - move16(); + Word16 exp_1, exp_2; masaDirect_fx = hSpatParamRendCom->energy_ratio1_fx[md_idx][k]; move32(); - IF( EQ_32( masaDirect_fx, 0 ) ) + IF( masaDirect_fx == 0 ) { masaDirect_fx = L_add( masaDirect_fx, EPSILLON_FX ); } @@ -4812,8 +4942,7 @@ void ivas_dirac_dec_compute_directional_responses_fx( } totalDirect_fx = L_add_sat( masaDirect_fx, ismDirect_fx ); // saturating as 1.0 (Q30) + 1.0 (Q30) is observed - Word16 var_a = 0, var_b = 0; - move16(); + Word16 var_a, var_b; var_a = BASOP_Util_Divide3232_Scale( masaDirect_fx, totalDirect_fx, &exp_1 ); var_b = BASOP_Util_Divide3232_Scale( ismDirect_fx, totalDirect_fx, &exp_2 ); directRatio_fx[0] = L_deposit_h( var_a ); @@ -4821,12 +4950,8 @@ void ivas_dirac_dec_compute_directional_responses_fx( directRatio_fx[1] = L_deposit_h( var_b ); move32(); - Word32 temp_2 = 0, temp_3 = 0; - move16(); - move16(); - Word16 exp_arr[MAX_OUTPUT_CHANNELS], exp_temp_3 = 0; - move16(); - // set16_fx( exp_arr, 0, MAX_OUTPUT_CHANNELS); + Word32 temp_2, temp_3; + Word16 exp_arr[MAX_OUTPUT_CHANNELS], exp_temp_3; set16_fx( exp_arr, exp_direct_response_ls, MAX_OUTPUT_CHANNELS ); FOR( l = 0; l < num_channels_dir; l++ ) { @@ -4844,10 +4969,11 @@ void ivas_dirac_dec_compute_directional_responses_fx( } Word16 max_exp = MIN16B; + move16(); maximum_fx( exp_arr, num_channels_dir, &max_exp ); FOR( l = 0; l < num_channels_dir; l++ ) { - direct_response_ls_fx[l] = L_shr( direct_response_ls_fx[l], max_exp - exp_arr[l] ); + direct_response_ls_fx[l] = L_shr( direct_response_ls_fx[l], sub( max_exp, exp_arr[l] ) ); move16(); } Q_direct_response_ls = sub( 31, max_exp ); @@ -4859,7 +4985,7 @@ void ivas_dirac_dec_compute_directional_responses_fx( } /* Synthesize surrounding coherence */ - IF( surCohRatio_fx != NULL && GT_32( surCohRatio_fx[k], 0 ) ) + IF( surCohRatio_fx != NULL && surCohRatio_fx[k] > 0 ) { Word16 num_channels_surrCoh; @@ -4867,20 +4993,15 @@ void ivas_dirac_dec_compute_directional_responses_fx( move16(); num_channels_surrCoh = sub( num_channels_surrCoh, hDirACRend->num_ele_spk_no_diffuse_rendering ); - Word32 temp = 0, final = 0; - move32(); - move32(); - Word16 exp_temp = 0, exp_temp_a = 0, temp_a = 0, final_exp = 0; - move16(); - move16(); - move16(); - move16(); + Word32 temp, final; + Word16 exp_temp, exp_temp_a, temp_a, final_exp; Word16 exp_arr[MAX_OUTPUT_CHANNELS], max_exp = MIN16B; move16(); set16_fx( exp_arr, exp_direct_response_ls, MAX_OUTPUT_CHANNELS ); FOR( l = 0; l < num_channels_dir; l++ ) { exp_temp = 0; + move16(); temp = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, L_negate( surCohRatio_fx[k] ), exp_surCohRatio, &exp_temp ); temp = Sqrt32( temp, &exp_temp ); direct_response_ls_fx[l] = Mpy_32_32( direct_response_ls_fx[l], temp ); // exp_direct_response_ls + exp_temp @@ -4888,13 +5009,15 @@ void ivas_dirac_dec_compute_directional_responses_fx( exp_arr[l] = add( exp_direct_response_ls, exp_temp ); move16(); - IF( GT_16( hDirACRend->diffuse_response_function_fx[l], 0 ) ) + IF( hDirACRend->diffuse_response_function_fx[l] > 0 ) { exp_temp_a = 0; + move16(); temp_a = BASOP_Util_Divide3216_Scale( surCohRatio_fx[k], num_channels_surrCoh, &exp_temp_a ); exp_temp_a = add( exp_temp_a, sub( exp_surCohRatio, 15 ) ); temp_a = Sqrt16( temp_a, &exp_temp_a ); final_exp = 0; + move16(); final = BASOP_Util_Add_Mant32Exp( direct_response_ls_fx[l], exp_arr[l], L_deposit_h( temp_a ), exp_temp_a, &final_exp ); direct_response_ls_fx[l] = final; move32(); @@ -4908,7 +5031,7 @@ void ivas_dirac_dec_compute_directional_responses_fx( maximum_fx( exp_arr, MAX_OUTPUT_CHANNELS, &max_exp ); FOR( l = 0; l < MAX_OUTPUT_CHANNELS; l++ ) { - direct_response_ls_fx[l] = L_shr( direct_response_ls_fx[l], max_exp - exp_arr[l] ); + direct_response_ls_fx[l] = L_shr( direct_response_ls_fx[l], sub( max_exp, exp_arr[l] ) ); move32(); } @@ -5192,10 +5315,6 @@ void ivas_dirac_dec_compute_directional_responses( { int16_t dir; float direct_response_temp[MAX_OUTPUT_CHANNELS]; -#ifdef IVAS_FLOAT_FIXED - Word32 direct_response_temp_fx[MAX_OUTPUT_CHANNELS]; - set32_fx( direct_response_temp_fx, 0, MAX_OUTPUT_CHANNELS ); -#endif float direct_response_ism[MAX_OUTPUT_CHANNELS]; float masaDirect; float ismDirect; @@ -5206,27 +5325,11 @@ void ivas_dirac_dec_compute_directional_responses( { if ( hMasaIsm->ism_is_edited[dir] ) { -#ifdef IVAS_FLOAT_FIXED - vbap_determine_gains_fx( hVBAPdata, direct_response_temp_fx, hMasaIsm->azimuth_ism_edited[dir], hMasaIsm->elevation_ism_edited[dir], 1 ); - FOR( int i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) - { - direct_response_temp[i] = fix_to_float( direct_response_temp_fx[i], Q29 ); - } -#else vbap_determine_gains( hVBAPdata, direct_response_temp, hMasaIsm->azimuth_ism_edited[dir], hMasaIsm->elevation_ism_edited[dir], 1 ); -#endif } else { -#ifdef IVAS_FLOAT_FIXED - vbap_determine_gains_fx( hVBAPdata, direct_response_temp_fx, hMasaIsm->azimuth_ism[dir][md_idx], hMasaIsm->elevation_ism[dir][md_idx], 1 ); - FOR( int i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) - { - direct_response_temp[i] = fix_to_float( direct_response_temp_fx[i], Q29 ); - } -#else vbap_determine_gains( hVBAPdata, direct_response_temp, hMasaIsm->azimuth_ism[dir][md_idx], hMasaIsm->elevation_ism[dir][md_idx], 1 ); -#endif } for ( l = 0; l < num_channels_dir; l++ ) @@ -5295,6 +5398,8 @@ void ivas_dirac_dec_compute_directional_responses( return; } #endif + + /*------------------------------------------------------------------------- * ivas_dirac_dec_compute_gain_factors() * @@ -5317,7 +5422,9 @@ void ivas_dirac_dec_compute_gain_factors_fx( FOR( i = 0; i < num_freq_bands; i++ ) { exp1 = 1; + move16(); exp2 = 1; + move16(); direct_gain_factor[i] = Sqrt32( L_sub( ONE_IN_Q30, diffuseness_fx[i] ), &exp1 ); move32(); diffuse_gain_factor[i] = Sqrt32( diffuseness_fx[i], &exp2 ); @@ -5346,15 +5453,16 @@ void ivas_dirac_dec_compute_gain_factors_fx( FOR( i = 0; i < num_freq_bands; i++ ) { - direct_gain_factor[i] = L_shr( direct_gain_factor[i], max_exp_direct - exp_direct_gain_factor[i] ); - diffuse_gain_factor[i] = L_shr( diffuse_gain_factor[i], max_exp_diffuse - exp_diffuse_gain_factor[i] ); + direct_gain_factor[i] = L_shr( direct_gain_factor[i], sub( max_exp_direct, exp_direct_gain_factor[i] ) ); + move32(); + diffuse_gain_factor[i] = L_shr( diffuse_gain_factor[i], sub( max_exp_diffuse, exp_diffuse_gain_factor[i] ) ); + move32(); } return; } -#endif - +#else void ivas_dirac_dec_compute_gain_factors( const int16_t num_freq_bands, const float *diffuseness, @@ -5377,6 +5485,7 @@ void ivas_dirac_dec_compute_gain_factors( return; } +#endif /*------------------------------------------------------------------------- @@ -5385,6 +5494,7 @@ void ivas_dirac_dec_compute_gain_factors( * *------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ivas_dirac_dec_compute_power_factors( const int16_t num_freq_bands, const float *diffuseness, @@ -5404,8 +5514,7 @@ void ivas_dirac_dec_compute_power_factors( return; } - -#ifdef IVAS_FLOAT_FIXED +#else void ivas_dirac_dec_compute_power_factors_fx( const Word16 num_freq_bands, const Word32 *diffuseness_fx, // Q3O @@ -5413,6 +5522,8 @@ void ivas_dirac_dec_compute_power_factors_fx( Word32 *direct_power_factor, Word32 *diffuse_power_factor ) { + Word16 i; + v_multc_fixed( diffuseness_fx, L_negate( ( ONE_IN_Q31 ) ), direct_power_factor, num_freq_bands ); // Q30 v_addc_fixed( direct_power_factor, ONE_IN_Q30, direct_power_factor, num_freq_bands ); // Q30 @@ -5424,14 +5535,18 @@ void ivas_dirac_dec_compute_power_factors_fx( v_mult_fixed( &diffuse_power_factor[max_band_decorr], &diffuse_power_factor[max_band_decorr], &diffuse_power_factor[max_band_decorr], num_freq_bands - max_band_decorr ); // Q29 - FOR( int i = 0; i < max_band_decorr; i++ ) + FOR( i = 0; i < max_band_decorr; i++ ) { - direct_power_factor[i] = L_shr( direct_power_factor[i], 1 ); // Q29 + direct_power_factor[i] = L_shr( direct_power_factor[i], 1 ); // Q29 + move32(); diffuse_power_factor[i] = L_shr( diffuse_power_factor[i], 1 ); // Q29 + move32(); } return; } #endif + + /*------------------------------------------------------------------------- * ivas_lfe_synth_with_filters() * @@ -5451,16 +5566,16 @@ void ivas_lfe_synth_with_filters_fx( Word16 i, j; Word32 lowPassSignal_fx[L_FRAME48k]; Word32 highPassSignal_fx[L_FRAME48k]; - int16_t slot_index; - int16_t subframe_index; - int16_t slotSize; + Word16 slot_index; + Word16 subframe_index; + Word16 slotSize; Word32 transportEne_fx, targetEneLfe_fx, targetEneTrans_fx; - int16_t mrange[2]; + Word16 mrange[2]; Word16 lfeGain_fx; Word16 lfeGain_fx_exp; Word16 transportGain_fx; Word16 transportGain_fx_exp; - int16_t delay; + Word16 delay; /* Delay the separated channel to sync the LFE synthesis with the DirAC rendering */ delay = hMasaLfeSynth->delayBuffer_syncDirAC_size; @@ -5481,16 +5596,20 @@ void ivas_lfe_synth_with_filters_fx( hMasaLfeSynth->lfeSynthRingBuffer_fx[hMasaLfeSynth->ringBufferLoPointer] = data_fx[separateChannelIndex][i]; // Q11 move32(); - hMasaLfeSynth->ringBufferLoPointer--; - IF( LT_16( hMasaLfeSynth->ringBufferLoPointer, 0 ) ) + hMasaLfeSynth->ringBufferLoPointer = sub( hMasaLfeSynth->ringBufferLoPointer, 1 ); + move16(); + IF( hMasaLfeSynth->ringBufferLoPointer < 0 ) { hMasaLfeSynth->ringBufferLoPointer = sub( hMasaLfeSynth->ringBufferSize, 1 ); + move16(); } - hMasaLfeSynth->ringBufferHiPointer--; - IF( LT_16( hMasaLfeSynth->ringBufferHiPointer, 0 ) ) + hMasaLfeSynth->ringBufferHiPointer = sub( hMasaLfeSynth->ringBufferHiPointer, 1 ); + move16(); + IF( hMasaLfeSynth->ringBufferHiPointer < 0 ) { hMasaLfeSynth->ringBufferHiPointer = sub( hMasaLfeSynth->ringBufferSize, 1 ); + move16(); } } @@ -5515,31 +5634,37 @@ void ivas_lfe_synth_with_filters_fx( } Word16 tmp_shift = W_norm( W_tmp ); - move16(); W_tmp = W_shl( W_tmp, tmp_shift ); - move64(); - Word16 tmp_q = Q22 + tmp_shift - 32; - move16(); + Word16 tmp_q = sub( add( Q22, tmp_shift ), 32 ); Word16 tmp_exp; transportEne_fx = W_extract_h( W_tmp ); /* Q22 + tmp_shift - 32 */ targetEneLfe_fx = W_extract_l( W_shr( W_mult0_32_32( transportEne_fx, hMasaLfeSynth->lfeToTotalEnergyRatio_fx[subframe_index] ), Q14 ) ); /* Q22 + tmp_shift - 32 */ targetEneTrans_fx = W_extract_l( W_shr( W_mult0_32_32( transportEne_fx, s_max( sub( ONE_IN_Q14, hMasaLfeSynth->lfeToTotalEnergyRatio_fx[subframe_index] ), 168 ) ), Q14 ) ); /* Q22 + tmp_shift - 32 */ - hMasaLfeSynth->transportEneSmooth_fx = Mpy_32_16_1( hMasaLfeSynth->transportEneSmooth_fx, MCMASA_LFE_SYNTH_ALPHA_Q15 ); /* transportEneSmooth_q */ - hMasaLfeSynth->targetEneLfeSmooth_fx = Mpy_32_16_1( hMasaLfeSynth->targetEneLfeSmooth_fx, MCMASA_LFE_SYNTH_ALPHA_Q15 ); /* targetEneLfeSmooth_q */ + hMasaLfeSynth->transportEneSmooth_fx = Mpy_32_16_1( hMasaLfeSynth->transportEneSmooth_fx, MCMASA_LFE_SYNTH_ALPHA_Q15 ); /* transportEneSmooth_q */ + move32(); + hMasaLfeSynth->targetEneLfeSmooth_fx = Mpy_32_16_1( hMasaLfeSynth->targetEneLfeSmooth_fx, MCMASA_LFE_SYNTH_ALPHA_Q15 ); /* targetEneLfeSmooth_q */ + move32(); hMasaLfeSynth->targetEneTransSmooth_fx = Mpy_32_16_1( hMasaLfeSynth->targetEneTransSmooth_fx, MCMASA_LFE_SYNTH_ALPHA_Q15 ); /* targetEneTransSmooth_q */ + move32(); - hMasaLfeSynth->transportEneSmooth_fx = BASOP_Util_Add_Mant32Exp( hMasaLfeSynth->transportEneSmooth_fx, ( Q31 - hMasaLfeSynth->transportEneSmooth_q ), transportEne_fx, ( Q31 - tmp_q ), &tmp_exp ); /* Q31 - tmp_exp */ + hMasaLfeSynth->transportEneSmooth_fx = BASOP_Util_Add_Mant32Exp( hMasaLfeSynth->transportEneSmooth_fx, sub( Q31, hMasaLfeSynth->transportEneSmooth_q ), transportEne_fx, sub( Q31, tmp_q ), &tmp_exp ); /* Q31 - tmp_exp */ + move32(); hMasaLfeSynth->transportEneSmooth_q = sub( Q31, tmp_exp ); - hMasaLfeSynth->targetEneLfeSmooth_fx = BASOP_Util_Add_Mant32Exp( hMasaLfeSynth->targetEneLfeSmooth_fx, ( Q31 - hMasaLfeSynth->targetEneLfeSmooth_q ), targetEneLfe_fx, ( Q31 - tmp_q ), &tmp_exp ); /* Q31 - tmp_exp */ + move16(); + hMasaLfeSynth->targetEneLfeSmooth_fx = BASOP_Util_Add_Mant32Exp( hMasaLfeSynth->targetEneLfeSmooth_fx, sub( Q31, hMasaLfeSynth->targetEneLfeSmooth_q ), targetEneLfe_fx, sub( Q31, tmp_q ), &tmp_exp ); /* Q31 - tmp_exp */ + move32(); hMasaLfeSynth->targetEneLfeSmooth_q = sub( Q31, tmp_exp ); - hMasaLfeSynth->targetEneTransSmooth_fx = BASOP_Util_Add_Mant32Exp( hMasaLfeSynth->targetEneTransSmooth_fx, ( Q31 - hMasaLfeSynth->targetEneTransSmooth_q ), targetEneTrans_fx, ( Q31 - tmp_q ), &tmp_exp ); /* Q31 - tmp_exp */ + move16(); + hMasaLfeSynth->targetEneTransSmooth_fx = BASOP_Util_Add_Mant32Exp( hMasaLfeSynth->targetEneTransSmooth_fx, sub( Q31, hMasaLfeSynth->targetEneTransSmooth_q ), targetEneTrans_fx, sub( Q31, tmp_q ), &tmp_exp ); /* Q31 - tmp_exp */ + move32(); hMasaLfeSynth->targetEneTransSmooth_q = sub( Q31, tmp_exp ); + move16(); - IF( BASOP_Util_Cmp_Mant32Exp( hMasaLfeSynth->targetEneLfeSmooth_fx, ( Q31 - hMasaLfeSynth->targetEneLfeSmooth_q ), /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, ( Q31 - hMasaLfeSynth->transportEneSmooth_q ) ) == 1 ) + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( hMasaLfeSynth->targetEneLfeSmooth_fx, sub( Q31, hMasaLfeSynth->targetEneLfeSmooth_q ), /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, sub( Q31, hMasaLfeSynth->transportEneSmooth_q ) ), 1 ) ) { lfeGain_fx = MAX_16; move16(); @@ -5551,7 +5676,7 @@ void ivas_lfe_synth_with_filters_fx( lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); lfeGain_fx = shl_r( lfeGain_fx, lfeGain_fx_exp ); // Q15 } - IF( BASOP_Util_Cmp_Mant32Exp( hMasaLfeSynth->targetEneTransSmooth_fx, ( Q31 - hMasaLfeSynth->targetEneTransSmooth_q ), /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, ( Q31 - hMasaLfeSynth->transportEneSmooth_q ) ) == 1 ) + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( hMasaLfeSynth->targetEneTransSmooth_fx, sub( Q31, hMasaLfeSynth->targetEneTransSmooth_q ), /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, sub( Q31, hMasaLfeSynth->transportEneSmooth_q ) ), 1 ) ) { transportGain_fx = MAX_16; move16(); @@ -5564,6 +5689,7 @@ void ivas_lfe_synth_with_filters_fx( transportGain_fx = shl_r( transportGain_fx, transportGain_fx_exp ); // Q15 } j = 0; + move16(); FOR( i = mrange[0]; i < mrange[1]; i++ ) { Word32 L_tmp1 = L_mult( transportGain_fx, hMasaLfeSynth->interpolator_fx[j] ); // Q31 @@ -5574,7 +5700,7 @@ void ivas_lfe_synth_with_filters_fx( Word32 L_tmp4 = L_mult( hMasaLfeSynth->lfeGainPrev_fx, sub( MAX_16, hMasaLfeSynth->interpolator_fx[j] ) ); data_fx[lfeChannelIndex][i] = Mpy_32_32( L_add( L_tmp3, L_tmp4 ), lowPassSignal_fx[i] ); move32(); - j++; + j = add( j, 1 ); } hMasaLfeSynth->lfeGainPrev_fx = lfeGain_fx; @@ -5593,13 +5719,16 @@ void ivas_lfe_synth_with_filters_fx( L_shl_r( L_sub( Mpy_32_16_1( data_fx[lfeChannelIndex][i], lowpassCoef_fx ), Mpy_32_16_1( hMasaLfeSynth->lfeSynthRingBuffer2_fx[hMasaLfeSynth->ringBufferLoPointer2], lowpassCoef_fx ) ), lowpassCoef_fx_exp ) ); + move32(); hMasaLfeSynth->lfeSynthRingBuffer2_fx[hMasaLfeSynth->ringBufferLoPointer2] = data_fx[lfeChannelIndex][i]; move32(); - hMasaLfeSynth->ringBufferLoPointer2--; - IF( LT_16( hMasaLfeSynth->ringBufferLoPointer2, 0 ) ) + hMasaLfeSynth->ringBufferLoPointer2 = sub( hMasaLfeSynth->ringBufferLoPointer2, 1 ); + move16(); + IF( hMasaLfeSynth->ringBufferLoPointer2 < 0 ) { hMasaLfeSynth->ringBufferLoPointer2 = sub( hMasaLfeSynth->ringBufferSize2, 1 ); + move16(); } data_fx[lfeChannelIndex][i] = hMasaLfeSynth->lowpassSum2_fx; @@ -5779,7 +5908,6 @@ static void computeTargetPSDs_direct_fx( return; } #else - static void computeTargetPSDs_direct( const int16_t num_channels, const int16_t num_freq_bands, @@ -5814,6 +5942,8 @@ static void computeTargetPSDs_direct( return; } #endif + + #ifdef IVAS_FLOAT_FIXED static void computeTargetPSDs_direct_subframe_fx( const Word16 num_channels, @@ -5853,8 +5983,6 @@ static void computeTargetPSDs_direct_subframe_fx( return; } #else - - static void computeTargetPSDs_direct_subframe( const int16_t num_channels, const int16_t num_freq_bands, @@ -5886,6 +6014,7 @@ static void computeTargetPSDs_direct_subframe( } #endif + #ifdef IVAS_FLOAT_FIXED static void computeTargetPSDs_diffuse_fx( const Word16 num_channels, @@ -5914,10 +6043,10 @@ static void computeTargetPSDs_diffuse_fx( { cur_idx = imult1616( ch_idx, num_freq_bands ); - v_multc_fixed( &diffuse_power[start_band], diffuse_responses_square[ch_idx], aux_buffer_res, num_freq_bands - start_band ); /* Q31 + Q(q_reference_power) - Q31 = Q(q_reference_power) */ - scale_sig32( aux_buffer_res, num_freq_bands - start_band, sub( common_q, *q_reference_power ) ); /* Q(common_q) */ - scale_sig32( &cy_auto_diff_smooth[cur_idx + start_band], num_freq_bands - start_band, sub( common_q, *q_cy_auto_diff_smooth ) ); /* Q(common_q) */ - v_add_fixed( &cy_auto_diff_smooth[cur_idx + start_band], aux_buffer_res, &cy_auto_diff_smooth[cur_idx + start_band], num_freq_bands - start_band, Q1 ); /* Q(common_q) - Q1 */ + v_multc_fixed( &diffuse_power[start_band], diffuse_responses_square[ch_idx], aux_buffer_res, sub( num_freq_bands, start_band ) ); /* Q31 + Q(q_reference_power) - Q31 = Q(q_reference_power) */ + scale_sig32( aux_buffer_res, sub( num_freq_bands, start_band ), sub( common_q, *q_reference_power ) ); /* Q(common_q) */ + scale_sig32( &cy_auto_diff_smooth[add( cur_idx, start_band )], sub( num_freq_bands, start_band ), sub( common_q, *q_cy_auto_diff_smooth ) ); /* Q(common_q) */ + v_add_fixed( &cy_auto_diff_smooth[add( cur_idx, start_band )], aux_buffer_res, &cy_auto_diff_smooth[add( cur_idx, start_band )], sub( num_freq_bands, start_band ), Q1 ); /* Q(common_q) - Q1 */ } /* Q adjustment */ @@ -5927,7 +6056,6 @@ static void computeTargetPSDs_diffuse_fx( return; } #else - static void computeTargetPSDs_diffuse( const int16_t num_channels, const int16_t num_freq_bands, @@ -5957,6 +6085,8 @@ static void computeTargetPSDs_diffuse( return; } #endif + + #ifdef IVAS_FLOAT_FIXED static void computeTargetPSDs_diffuse_subframe_fx( const Word16 num_channels, @@ -5980,7 +6110,7 @@ static void computeTargetPSDs_diffuse_subframe_fx( { cur_idx = imult1616( ch_idx, num_freq_bands ); - v_multc_fixed( &diffuse_power[start_band], diffuse_responses_square[ch_idx], &cy_auto_diff_smooth[cur_idx + start_band], num_freq_bands - start_band ); // (q_reference_power, Q31) -> q_reference_power + v_multc_fixed( &diffuse_power[start_band], diffuse_responses_square[ch_idx], &cy_auto_diff_smooth[add( cur_idx, start_band )], sub( num_freq_bands, start_band ) ); // (q_reference_power, Q31) -> q_reference_power } *q_cy_auto_diff_smooth = *q_reference_power; @@ -5989,8 +6119,6 @@ static void computeTargetPSDs_diffuse_subframe_fx( return; } #else - - static void computeTargetPSDs_diffuse_subframe( const int16_t num_channels, const int16_t num_freq_bands, @@ -6018,6 +6146,7 @@ static void computeTargetPSDs_diffuse_subframe( } #endif + #ifdef IVAS_FLOAT_FIXED static void computeTargetPSDs_diffuse_with_onsets_fx( const Word16 num_channels, @@ -6090,8 +6219,6 @@ static void computeTargetPSDs_diffuse_with_onsets_fx( return; } #else - - static void computeTargetPSDs_diffuse_with_onsets( const int16_t num_channels, const int16_t num_freq_bands, @@ -6132,6 +6259,8 @@ static void computeTargetPSDs_diffuse_with_onsets( return; } #endif + + #ifdef IVAS_FLOAT_FIXED static void computeAlphaSynthesis_fx( Word16 *alpha_synthesis_fx, const Word16 averaging_length_ms, const Word16 maxAlpha_fx, Word16 *numAlphas, const Word16 slot_size, const Word16 num_freq_bands, Word16 *frequency_axis_fx, const Word32 output_Fs ) { @@ -6158,32 +6287,39 @@ static void computeAlphaSynthesis_fx( Word16 *alpha_synthesis_fx, const Word16 a Word16 tmp_1 = BASOP_Util_Divide1616_Scale( averaging_length_ms, frequency_axis_fx[faxis_idx], &tmp_exp ); Word16 tmp_2 = mult( tmp_1, 1000 ); // 15 - tmp_exp + 0 -15 = -tmp_exp (Q-fac) avg_length_f_ms_fx = tmp_2; + move16(); + move16(); Word32 tmp_3 = Mpy_32_16_1( output_Fs, avg_length_f_ms_fx ); // 0 - tmp_exp - 15 (Q-fac) - Word16 tmp_exp_3 = 0; + Word16 tmp_exp_3; Word16 tmp_4 = BASOP_Util_Divide3232_Scale( tmp_3, 1000, &tmp_exp_3 ); - Word16 tmp_exp_4 = tmp_exp_3 + ( 31 + tmp_exp + 15 ) - 31; - Word16 tmp_exp_5 = 0; + Word16 tmp_exp_4 = sub( add( tmp_exp_3, add( add( 31, tmp_exp ), 15 ) ), 31 ); + Word16 tmp_exp_5; Word16 tmp_5 = BASOP_Util_Divide1616_Scale( slot_size, tmp_4, &tmp_exp_5 ); - Word16 res_exp = tmp_exp_5 + 15 - tmp_exp_4; + Word16 res_exp = sub( add( tmp_exp_5, 15 ), tmp_exp_4 ); Word16 flag = BASOP_Util_Cmp_Mant32Exp( L_deposit_h( tmp_5 ), res_exp, 1, 31 ); - IF( flag == -1 ) + IF( EQ_16( flag, -1 ) ) { alpha_synthesis_fx[k] = shr( tmp_5, negate( res_exp ) ); // q15 + move16(); } ELSE { alpha_synthesis_fx[k] = MAX16B; + move16(); } Word16 flag2 = BASOP_Util_Cmp_Mant32Exp( L_deposit_h( alpha_synthesis_fx[k] ), 0, L_deposit_h( maxAlpha_fx ), 0 ); - IF( flag2 == 0 || flag2 == 1 ) + test(); + IF( flag2 == 0 || EQ_16( flag2, 1 ) ) { alpha_synthesis_fx[k] = maxAlpha_fx; - *numAlphas = k + 1; - break; + move16(); + *numAlphas = add( k, 1 ); + move16(); + BREAK; } } } @@ -6191,7 +6327,6 @@ static void computeAlphaSynthesis_fx( Word16 *alpha_synthesis_fx, const Word16 a return; } #else - static void computeAlphaSynthesis( float *alpha_synthesis, const int16_t averaging_length_ms, @@ -6234,6 +6369,8 @@ static void computeAlphaSynthesis( return; } #endif + + #ifdef IVAS_FLOAT_FIXED static void spreadCoherencePanningHoa_fx( const Word16 azimuth, @@ -6253,14 +6390,14 @@ static void spreadCoherencePanningHoa_fx( ivas_dirac_dec_get_response_fx( azimuth, elevation, direct_response_fx, ambisonics_order, *Q_direct_response ); - Word16 exp_Gain_side = 0, exp_Gain_center = 0; - IF( GT_32( spreadCoh_fx, 0 ) ) + Word16 exp_Gain_side, exp_Gain_center; + IF( spreadCoh_fx > 0 ) { - ivas_dirac_dec_get_response_fx( azimuth + 30, elevation, direct_response_left_fx, ambisonics_order, *Q_direct_response ); - ivas_dirac_dec_get_response_fx( azimuth + 330, elevation, direct_response_right_fx, ambisonics_order, *Q_direct_response ); + ivas_dirac_dec_get_response_fx( add( azimuth, 30 ), elevation, direct_response_left_fx, ambisonics_order, *Q_direct_response ); + ivas_dirac_dec_get_response_fx( add( azimuth, 330 ), elevation, direct_response_right_fx, ambisonics_order, *Q_direct_response ); - Word16 var_a, var_b, exp_a = 0; + Word16 var_a, var_b, exp_a; IF( LT_16( spreadCoh_fx, ONE_IN_Q14 ) ) { @@ -6271,49 +6408,58 @@ static void spreadCoherencePanningHoa_fx( gainCenter_fx = L_deposit_h( shr( var_a, 2 ) ); // Q11 + 16 = Q27 gainSide_fx = L_deposit_h( mult( spreadCoh_fx, ONE_BY_THREE_Q15 ) ); // Q14 + 16 (reduce Q by 1 to *2) = Q30 exp_Gain_side = 31 - Q30; + move16(); exp_Gain_center = 31 - Q27; + move16(); } ELSE { var_a = shl( sub( 16384 /*2 in Q13*/, shr( spreadCoh_fx, 2 ) ), 1 ); exp_a = 15 - Q13; + move16(); var_a = Inv16( var_a, &exp_a ); gainSide_fx = L_deposit_h( var_a ); // Q14 + 16 = Q30 //exp_a exp_Gain_side = exp_a; + move16(); var_b = sub( 8192 /*2 in Q12*/, shr( spreadCoh_fx, 2 ) /*Q14*/ ); // exp => 3 gainCenter_fx = L_deposit_h( mult( var_b, var_a ) ); // Q13 + 16 = Q29 // 3 + exp_a - exp_Gain_center = 3 + exp_a; + exp_Gain_center = add( 3, exp_a ); } Word32 mpy1, mpy2; - Word16 exp_arr[16], exp = 0; - set16_fx( exp_arr, 31 - *Q_direct_response, 16 ); + Word16 exp_arr[16], exp; + set16_fx( exp_arr, sub( 31, *Q_direct_response ), 16 ); FOR( i = 0; i < num_channels_dir; i++ ) { mpy1 = Mpy_32_32( L_add( direct_response_left_fx[i], direct_response_right_fx[i] ), gainSide_fx ); // 31 - Q_direct_response + exp_Gain_Side mpy2 = Mpy_32_32( direct_response_fx[i], gainCenter_fx ); // 31 - Q_direct_response + exp_Gain_Center exp = 0; - direct_response_fx[i] = BASOP_Util_Add_Mant32Exp( mpy1, 31 - *Q_direct_response + exp_Gain_side, mpy2, 31 - *Q_direct_response + exp_Gain_center, &exp ); + move16(); + direct_response_fx[i] = BASOP_Util_Add_Mant32Exp( mpy1, 31 - *Q_direct_response + exp_Gain_side, mpy2, add( sub( 31, *Q_direct_response ), exp_Gain_center ), &exp ); + move32(); exp_arr[i] = exp; + move16(); } Word16 max_val = MIN_16; + move16(); FOR( i = 0; i < 16; i++ ) { - max_val = max( max_val, exp_arr[i] ); + max_val = s_max( max_val, exp_arr[i] ); } FOR( i = 0; i < 16; i++ ) { - direct_response_fx[i] = L_shr( direct_response_fx[i], max_val - exp_arr[i] ); + direct_response_fx[i] = L_shr( direct_response_fx[i], sub( max_val, exp_arr[i] ) ); + move32(); } - *Q_direct_response = 31 - max_val; + *Q_direct_response = sub( 31, max_val ); + move16(); } return; } #else - static void spreadCoherencePanningHoa( const int16_t azimuth, const int16_t elevation, @@ -6356,6 +6502,8 @@ static void spreadCoherencePanningHoa( return; } #endif + + #ifdef IVAS_FLOAT_FIXED static void spreadCoherencePanningVbap_fx( const Word16 azimuth, @@ -6366,7 +6514,7 @@ static void spreadCoherencePanningVbap_fx( const Word16 num_channels_dir, const VBAP_HANDLE hVBAPdata ) { - int16_t i; + Word16 i; Word32 direct_response_left_fx[MAX_OUTPUT_CHANNELS]; Word32 direct_response_right_fx[MAX_OUTPUT_CHANNELS]; set32_fx( direct_response_left_fx, 0, MAX_OUTPUT_CHANNELS ); @@ -6382,6 +6530,7 @@ static void spreadCoherencePanningVbap_fx( Word16 var_temp = ISqrt16( num_channels_dir, &exp_tmp ); set32_fx( direct_response_fx, var_temp, num_channels_dir ); *Q_direct_response = sub( 31, exp_tmp ); + move16(); return; } @@ -6391,10 +6540,10 @@ static void spreadCoherencePanningVbap_fx( *Q_direct_response = Q29; move16(); - IF( GT_16( spreadCoh_fx, 0 ) ) + IF( spreadCoh_fx > 0 ) { - vbap_determine_gains_fx( hVBAPdata, direct_response_left_fx, azimuth + 30, elevation, 0 ); - vbap_determine_gains_fx( hVBAPdata, direct_response_right_fx, azimuth - 30, elevation, 0 ); + vbap_determine_gains_fx( hVBAPdata, direct_response_left_fx, add( azimuth, 30 ), elevation, 0 ); + vbap_determine_gains_fx( hVBAPdata, direct_response_right_fx, sub( azimuth, 30 ), elevation, 0 ); Word32 var1 = 0; move32(); @@ -6436,7 +6585,6 @@ static void spreadCoherencePanningVbap_fx( return; } #else - static void spreadCoherencePanningVbap( const int16_t azimuth, const int16_t elevation, @@ -6485,26 +6633,29 @@ static void spreadCoherencePanningVbap( return; } #endif + + #ifdef IVAS_FLOAT_FIXED static void normalizePanningGains_fx( Word32 *direct_response_fx, Word16 *q_direct_res, - const int16_t num_channels_dir ) + const Word16 num_channels_dir ) { Word32 energySum_fx; Word16 exp_energySum = 0; Word32 normVal_fx; - int16_t i; + Word16 i; + move16(); Word16 gb = find_guarded_bits_fx( num_channels_dir ); energySum_fx = sum2_f_32_fx( direct_response_fx, num_channels_dir, gb ); - if ( *q_direct_res > 31 ) + IF( GT_16( *q_direct_res, Q31 ) ) { - exp_energySum = ( 31 - *q_direct_res ) * 2 + gb; + exp_energySum = add( shl( sub( Q31, *q_direct_res ), 1 ), gb ); } - exp_energySum = 31 - ( ( 2 * ( *q_direct_res ) - 31 ) - gb ); + exp_energySum = sub( Q31, sub( sub( shl( *q_direct_res, 1 ), Q31 ), gb ) ); - IF( GT_32( energySum_fx, 0 ) ) + IF( energySum_fx > 0 ) { normVal_fx = ISqrt32( energySum_fx, &exp_energySum ); } @@ -6517,14 +6668,14 @@ static void normalizePanningGains_fx( FOR( i = 0; i < num_channels_dir; i++ ) { direct_response_fx[i] = Mpy_32_32( direct_response_fx[i], normVal_fx ); + move32(); } - Word16 exp = 31 - *q_direct_res + exp_energySum; - *q_direct_res = 31 - exp; + Word16 exp = add( sub( Q31, *q_direct_res ), exp_energySum ); + *q_direct_res = sub( Q31, exp ); return; } #else - static void normalizePanningGains( float *direct_response, const int16_t num_channels_dir ) diff --git a/lib_rend/ivas_dirac_rend.c b/lib_rend/ivas_dirac_rend.c index eadb0f81d..e96aec922 100644 --- a/lib_rend/ivas_dirac_rend.c +++ b/lib_rend/ivas_dirac_rend.c @@ -46,7 +46,7 @@ #include "ivas_prot_fx.h" #include "ivas_rom_binaural_crend_head.h" -#define IVAS_FLOAT_FIXED_TO_BE_REMOVED + /*------------------------------------------------------------------------- * ivas_dirac_allocate_parameters() * @@ -208,10 +208,12 @@ ivas_error ivas_dirac_allocate_parameters_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); } + IF( ( hSpatParamRendCom->energy_ratio1_fx = (Word32 **) malloc( hSpatParamRendCom->dirac_md_buffer_length * sizeof( Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); } + IF( ( hSpatParamRendCom->spreadCoherence_fx = (Word16 **) malloc( hSpatParamRendCom->dirac_md_buffer_length * sizeof( Word16 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); @@ -338,8 +340,10 @@ ivas_error ivas_spat_hSpatParamRendCom_config_fx( DIRAC_CONFIG_FLAG flag_config; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; - flag_config = ( flag_config_inp == DIRAC_RECONFIGURE_MODE ) ? DIRAC_RECONFIGURE : flag_config_inp; + flag_config = EQ_32( flag_config_inp, DIRAC_RECONFIGURE_MODE ) ? DIRAC_RECONFIGURE : flag_config_inp; + move32(); error = IVAS_ERR_OK; + move32(); hSpatParamRendCom = NULL; @@ -347,7 +351,7 @@ ivas_error ivas_spat_hSpatParamRendCom_config_fx( { hSpatParamRendCom = *hSpatParamRendCom_out; } - ELSE IF( EQ_32( flag_config, DIRAC_OPEN ) ) + ELSE IF( flag_config == DIRAC_OPEN ) { /*-----------------------------------------------------------------* * prepare library opening @@ -375,6 +379,7 @@ ivas_error ivas_spat_hSpatParamRendCom_config_fx( hSpatParamRendCom->slots_rendered = 0; move16(); hSpatParamRendCom->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; + move16(); /* hSpatParamRendCom->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); */ hSpatParamRendCom->num_freq_bands = extract_l( Mpy_32_32( output_Fs, 2684355 /* INV_CLDFB_BANDWIDTH in Q31 */ ) ); move16(); @@ -390,8 +395,12 @@ ivas_error ivas_spat_hSpatParamRendCom_config_fx( * set input parameters *-----------------------------------------------------------------*/ + test(); + test(); IF( ( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) && EQ_32( flag_config, DIRAC_RECONFIGURE ) ) { + test(); + test(); IF( hodirac_flag && hSpatParamRendCom->azimuth2 == NULL ) { IF( NE_32( ( error = ivas_dirac_allocate_parameters_fx( hSpatParamRendCom, 2 ) ), IVAS_ERR_OK ) ) @@ -405,7 +414,7 @@ ivas_error ivas_spat_hSpatParamRendCom_config_fx( } } - IF( EQ_32( flag_config, DIRAC_OPEN ) ) + IF( flag_config == DIRAC_OPEN ) { hSpatParamRendCom->dirac_md_buffer_length = 0; move16(); @@ -413,6 +422,8 @@ ivas_error ivas_spat_hSpatParamRendCom_config_fx( move16(); hSpatParamRendCom->dirac_read_idx = 0; move16(); + test(); + test(); IF( EQ_32( mc_mode, MC_MODE_MCMASA ) || EQ_16( masa_ext_rend_flag, 1 ) ) { hSpatParamRendCom->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; @@ -441,9 +452,9 @@ ivas_error ivas_spat_hSpatParamRendCom_config_fx( } ELSE { - Word16 num_slots_in_subfr; + Word16 num_slots_in_subfr, tmp = 1; num_slots_in_subfr = dec_param_estim_flag ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; - hSpatParamRendCom->dirac_md_buffer_length = add( MAX_PARAM_SPATIAL_SUBFRAMES, DELAY_DIRAC_PARAM_DEC_SFR ); + hSpatParamRendCom->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR; move16(); hSpatParamRendCom->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR; move16(); @@ -451,9 +462,17 @@ ivas_error ivas_spat_hSpatParamRendCom_config_fx( move16(); set16_fx( hSpatParamRendCom->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + + if ( EQ_16( num_slots_in_subfr, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ) ) + { + tmp = 2; + move16(); + } + FOR( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS * num_slots_in_subfr; map_idx++ ) { - hSpatParamRendCom->render_to_md_map[map_idx] = hSpatParamRendCom->dirac_read_idx + map_idx / num_slots_in_subfr; + hSpatParamRendCom->render_to_md_map[map_idx] = add( hSpatParamRendCom->dirac_read_idx, shr( map_idx, tmp ) ); + move16(); } } @@ -462,6 +481,10 @@ ivas_error ivas_spat_hSpatParamRendCom_config_fx( return error; } + test(); + test(); + test(); + test(); IF( EQ_32( ivas_format, MASA_FORMAT ) || EQ_32( ivas_format, MASA_ISM_FORMAT ) || ( ( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) && hodirac_flag ) ) { IF( NE_32( ( error = ivas_dirac_allocate_parameters_fx( hSpatParamRendCom, 2 ) ), IVAS_ERR_OK ) ) @@ -593,10 +616,12 @@ ivas_error ivas_spat_hSpatParamRendCom_config( hSpatParamRendCom->render_to_md_map[map_idx] = hSpatParamRendCom->dirac_read_idx + map_idx / num_slots_in_subfr; } } + if ( ( error = ivas_dirac_allocate_parameters( hSpatParamRendCom, 1 ) ) != IVAS_ERR_OK ) { return error; } + if ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT || ( ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) && hodirac_flag ) ) { if ( ( error = ivas_dirac_allocate_parameters( hSpatParamRendCom, 2 ) ) != IVAS_ERR_OK ) @@ -617,6 +642,7 @@ ivas_error ivas_spat_hSpatParamRendCom_config( } #endif + /*------------------------------------------------------------------------- * ivas_spat_hSpatParamRendCom_close() * @@ -658,6 +684,7 @@ void ivas_spat_hSpatParamRendCom_close_fx( } #endif + /*------------------------------------------------------------------------- * ivas_dirac_rend_close() * @@ -671,6 +698,7 @@ void ivas_dirac_rend_close_fx( Word16 i, j; DIRAC_REND_HANDLE hDirACRend; + test(); IF( hDirACRend_out == NULL || *hDirACRend_out == NULL ) { return; @@ -679,11 +707,7 @@ void ivas_dirac_rend_close_fx( hDirACRend = *hDirACRend_out; /* close Output synthesis sub-module */ -#ifdef IVAS_FLOAT_FIXED ivas_dirac_dec_output_synthesis_close_fx( hDirACRend ); -#else - ivas_dirac_dec_output_synthesis_close( hDirACRend ); -#endif /* close Decorrelator sub-module */ IF( hDirACRend->proto_signal_decorr_on ) @@ -693,31 +717,30 @@ void ivas_dirac_rend_close_fx( /* Params */ -#ifdef IVAS_FLOAT_FIXED /* free frequency axis buffer */ IF( hDirACRend->frequency_axis_fx != NULL ) { free( hDirACRend->frequency_axis_fx ); hDirACRend->frequency_axis_fx = NULL; } + IF( hDirACRend->diffuse_response_function_fx != NULL ) { free( hDirACRend->diffuse_response_function_fx ); hDirACRend->diffuse_response_function_fx = NULL; } + IF( hDirACRend->hoa_encoder_fx != NULL ) { free( hDirACRend->hoa_encoder_fx ); hDirACRend->hoa_encoder_fx = NULL; } -#endif -#ifdef IVAS_FLOAT_FIXED + IF( hDirACRend->hoa_encoder_fx != NULL ) { free( hDirACRend->hoa_encoder_fx ); hDirACRend->hoa_encoder_fx = NULL; } -#endif /* prototype indexing */ IF( hDirACRend->proto_index_dir != NULL ) @@ -764,6 +787,7 @@ void ivas_dirac_rend_close_fx( free( hDirACRend->masa_stereo_type_detect ); hDirACRend->masa_stereo_type_detect = NULL; } + ivas_dirac_free_mem_fx( &( hDirACRend->stack_mem ) ); free( *hDirACRend_out ); @@ -885,20 +909,21 @@ void ivas_dirac_deallocate_parameters_fx( Word16 i; Word16 md_buffer_length; - if ( hSpatParamRendCom == NULL ) + IF( hSpatParamRendCom == NULL ) { return; } md_buffer_length = hSpatParamRendCom->dirac_md_buffer_length; + move16(); - if ( params_flag == 1 ) + IF( EQ_16( params_flag, 1 ) ) { - if ( hSpatParamRendCom->azimuth != NULL ) + IF( hSpatParamRendCom->azimuth != NULL ) { - for ( i = 0; i < md_buffer_length; i++ ) + FOR( i = 0; i < md_buffer_length; i++ ) { - if ( hSpatParamRendCom->azimuth[i] != NULL ) + IF( hSpatParamRendCom->azimuth[i] != NULL ) { free( hSpatParamRendCom->azimuth[i] ); hSpatParamRendCom->azimuth[i] = NULL; @@ -909,11 +934,11 @@ void ivas_dirac_deallocate_parameters_fx( hSpatParamRendCom->azimuth = NULL; } - if ( hSpatParamRendCom->elevation != NULL ) + IF( hSpatParamRendCom->elevation != NULL ) { - for ( i = 0; i < md_buffer_length; i++ ) + FOR( i = 0; i < md_buffer_length; i++ ) { - if ( hSpatParamRendCom->elevation[i] != NULL ) + IF( hSpatParamRendCom->elevation[i] != NULL ) { free( hSpatParamRendCom->elevation[i] ); hSpatParamRendCom->elevation[i] = NULL; @@ -924,11 +949,11 @@ void ivas_dirac_deallocate_parameters_fx( hSpatParamRendCom->elevation = NULL; } - if ( hSpatParamRendCom->energy_ratio1_fx != NULL ) + IF( hSpatParamRendCom->energy_ratio1_fx != NULL ) { - for ( i = 0; i < md_buffer_length; i++ ) + FOR( i = 0; i < md_buffer_length; i++ ) { - if ( hSpatParamRendCom->energy_ratio1_fx[i] != NULL ) + IF( hSpatParamRendCom->energy_ratio1_fx[i] != NULL ) { free( hSpatParamRendCom->energy_ratio1_fx[i] ); hSpatParamRendCom->energy_ratio1_fx[i] = NULL; @@ -938,11 +963,11 @@ void ivas_dirac_deallocate_parameters_fx( hSpatParamRendCom->energy_ratio1_fx = NULL; } - if ( hSpatParamRendCom->diffuseness_vector_fx != NULL ) + IF( hSpatParamRendCom->diffuseness_vector_fx != NULL ) { - for ( i = 0; i < md_buffer_length; i++ ) + FOR( i = 0; i < md_buffer_length; i++ ) { - if ( hSpatParamRendCom->diffuseness_vector_fx[i] != NULL ) + IF( hSpatParamRendCom->diffuseness_vector_fx[i] != NULL ) { free( hSpatParamRendCom->diffuseness_vector_fx[i] ); hSpatParamRendCom->diffuseness_vector_fx[i] = NULL; @@ -953,11 +978,11 @@ void ivas_dirac_deallocate_parameters_fx( hSpatParamRendCom->diffuseness_vector_fx = NULL; } - if ( hSpatParamRendCom->spreadCoherence_fx != NULL ) + IF( hSpatParamRendCom->spreadCoherence_fx != NULL ) { - for ( i = 0; i < md_buffer_length; i++ ) + FOR( i = 0; i < md_buffer_length; i++ ) { - if ( hSpatParamRendCom->spreadCoherence_fx[i] != NULL ) + IF( hSpatParamRendCom->spreadCoherence_fx[i] != NULL ) { free( hSpatParamRendCom->spreadCoherence_fx[i] ); hSpatParamRendCom->spreadCoherence_fx[i] = NULL; @@ -967,11 +992,11 @@ void ivas_dirac_deallocate_parameters_fx( hSpatParamRendCom->spreadCoherence_fx = NULL; } - if ( hSpatParamRendCom->surroundingCoherence_fx != NULL ) + IF( hSpatParamRendCom->surroundingCoherence_fx != NULL ) { - for ( i = 0; i < md_buffer_length; i++ ) + FOR( i = 0; i < md_buffer_length; i++ ) { - if ( hSpatParamRendCom->surroundingCoherence_fx[i] != NULL ) + IF( hSpatParamRendCom->surroundingCoherence_fx[i] != NULL ) { free( hSpatParamRendCom->surroundingCoherence_fx[i] ); hSpatParamRendCom->surroundingCoherence_fx[i] = NULL; @@ -981,13 +1006,13 @@ void ivas_dirac_deallocate_parameters_fx( hSpatParamRendCom->surroundingCoherence_fx = NULL; } } - else if ( params_flag == 2 ) + ELSE IF( EQ_16( params_flag, 2 ) ) { - if ( hSpatParamRendCom->azimuth2 != NULL ) + IF( hSpatParamRendCom->azimuth2 != NULL ) { - for ( i = 0; i < md_buffer_length; i++ ) + FOR( i = 0; i < md_buffer_length; i++ ) { - if ( hSpatParamRendCom->azimuth2[i] != NULL ) + IF( hSpatParamRendCom->azimuth2[i] != NULL ) { free( hSpatParamRendCom->azimuth2[i] ); hSpatParamRendCom->azimuth2[i] = NULL; @@ -997,11 +1022,11 @@ void ivas_dirac_deallocate_parameters_fx( hSpatParamRendCom->azimuth2 = NULL; } - if ( hSpatParamRendCom->elevation2 != NULL ) + IF( hSpatParamRendCom->elevation2 != NULL ) { - for ( i = 0; i < md_buffer_length; i++ ) + FOR( i = 0; i < md_buffer_length; i++ ) { - if ( hSpatParamRendCom->elevation2[i] != NULL ) + IF( hSpatParamRendCom->elevation2[i] != NULL ) { free( hSpatParamRendCom->elevation2[i] ); hSpatParamRendCom->elevation2[i] = NULL; @@ -1011,11 +1036,11 @@ void ivas_dirac_deallocate_parameters_fx( hSpatParamRendCom->elevation2 = NULL; } - if ( hSpatParamRendCom->energy_ratio2_fx != NULL ) + IF( hSpatParamRendCom->energy_ratio2_fx != NULL ) { - for ( i = 0; i < md_buffer_length; i++ ) + FOR( i = 0; i < md_buffer_length; i++ ) { - if ( hSpatParamRendCom->energy_ratio2_fx[i] != NULL ) + IF( hSpatParamRendCom->energy_ratio2_fx[i] != NULL ) { free( hSpatParamRendCom->energy_ratio2_fx[i] ); hSpatParamRendCom->energy_ratio2_fx[i] = NULL; @@ -1025,11 +1050,11 @@ void ivas_dirac_deallocate_parameters_fx( hSpatParamRendCom->energy_ratio2_fx = NULL; } - if ( hSpatParamRendCom->spreadCoherence2_fx != NULL ) + IF( hSpatParamRendCom->spreadCoherence2_fx != NULL ) { - for ( i = 0; i < md_buffer_length; i++ ) + FOR( i = 0; i < md_buffer_length; i++ ) { - if ( hSpatParamRendCom->spreadCoherence2_fx[i] != NULL ) + IF( hSpatParamRendCom->spreadCoherence2_fx[i] != NULL ) { free( hSpatParamRendCom->spreadCoherence2_fx[i] ); hSpatParamRendCom->spreadCoherence2_fx[i] = NULL; @@ -1217,240 +1242,163 @@ void ivas_dirac_deallocate_parameters( * Allocate stack memory for DirAC renderer *------------------------------------------------------------------------*/ -ivas_error ivas_dirac_alloc_mem( +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_dirac_alloc_mem_fx( DIRAC_REND_HANDLE hDirACRend, const RENDERER_TYPE renderer_type, - const int16_t num_freq_bands, + const Word16 num_freq_bands, DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem, - const int16_t hodirac_flag ) + const Word16 hodirac_flag ) { - int16_t num_freq_bands_diff, size; - int16_t size_ho; - int16_t size_pf; - int16_t num_outputs_dir, num_outputs_diff; - int16_t num_protos_dir; + Word16 num_freq_bands_diff, size; + Word16 size_ho; + Word16 size_pf; + Word16 num_outputs_dir, num_outputs_diff; + Word16 num_protos_dir; num_protos_dir = hDirACRend->num_protos_dir; + move16(); num_freq_bands_diff = hDirACRend->h_output_synthesis_psd_params.max_band_decorr; + move16(); num_outputs_dir = hDirACRend->num_outputs_dir; + move16(); num_outputs_diff = hDirACRend->num_outputs_diff; + move16(); - size = num_freq_bands * num_outputs_dir; - if ( hodirac_flag ) + size = imult1616( num_freq_bands, num_outputs_dir ); + IF( hodirac_flag ) { - size_ho = size * DIRAC_HO_NUMSECTORS; - size_pf = num_freq_bands * DIRAC_HO_NUMSECTORS; + size_ho = imult1616( size, DIRAC_HO_NUMSECTORS ); + size_pf = imult1616( num_freq_bands, DIRAC_HO_NUMSECTORS ); } - else + ELSE { size_ho = size; + move16(); size_pf = num_freq_bands; + move16(); } /* PSD related buffers */ -#ifdef IVAS_FLOAT_FIXED hDirAC_mem->cy_auto_dir_smooth_fx = NULL; hDirAC_mem->proto_power_smooth_fx = NULL; hDirAC_mem->proto_power_diff_smooth_fx = NULL; hDirAC_mem->direct_responses_square_fx = NULL; -#else - hDirAC_mem->cy_auto_dir_smooth = NULL; - hDirAC_mem->direct_responses_square = NULL; -#endif -#ifdef IVAS_FLOAT_FIXED hDirAC_mem->frame_dec_f_fx = NULL; -#else - hDirAC_mem->proto_power_smooth = NULL; - hDirAC_mem->proto_power_diff_smooth = NULL; - hDirAC_mem->direct_responses_square = NULL; - hDirAC_mem->frame_dec_f = NULL; -#endif - if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + IF( NE_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { -#ifndef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->cy_auto_dir_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } - set_zero( hDirAC_mem->cy_auto_dir_smooth, size ); -#else - if ( ( hDirAC_mem->cy_auto_dir_smooth_fx = (Word32 *) malloc( sizeof( Word32 ) * size ) ) == NULL ) + IF( ( hDirAC_mem->cy_auto_dir_smooth_fx = (Word32 *) malloc( sizeof( Word32 ) * size ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } set_zero_fx( hDirAC_mem->cy_auto_dir_smooth_fx, size ); hDirACRend->h_output_synthesis_psd_state.cy_auto_dir_smooth_len = size; -#endif - -#ifndef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->proto_power_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } - set_zero( hDirAC_mem->proto_power_smooth, size ); + move16(); - if ( ( hDirAC_mem->proto_power_diff_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } - set_zero( hDirAC_mem->proto_power_diff_smooth, size ); -#else - if ( ( hDirAC_mem->proto_power_smooth_fx = (Word32 *) malloc( sizeof( Word32 ) * size ) ) == NULL ) + IF( ( hDirAC_mem->proto_power_smooth_fx = (Word32 *) malloc( sizeof( Word32 ) * size ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } set_zero_fx( hDirAC_mem->proto_power_smooth_fx, size ); hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len = size; - if ( ( hDirAC_mem->proto_power_diff_smooth_fx = (Word32 *) malloc( sizeof( Word32 ) * size ) ) == NULL ) + move16(); + + IF( ( hDirAC_mem->proto_power_diff_smooth_fx = (Word32 *) malloc( sizeof( Word32 ) * size ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } set_zero_fx( hDirAC_mem->proto_power_diff_smooth_fx, size ); hDirAC_mem->proto_power_diff_smooth_len = size; + move16(); hDirAC_mem->proto_power_diff_smooth_q = Q31; -#endif + move16(); -#ifndef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->direct_responses_square = (float *) malloc( sizeof( float ) * size ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } - set_zero( hDirAC_mem->direct_responses_square, size ); -#else - if ( ( hDirAC_mem->direct_responses_square_fx = (Word32 *) malloc( sizeof( Word32 ) * size ) ) == NULL ) + IF( ( hDirAC_mem->direct_responses_square_fx = (Word32 *) malloc( sizeof( Word32 ) * size ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } set32_fx( hDirAC_mem->direct_responses_square_fx, 0, size ); -#endif - if ( hDirACRend->proto_signal_decorr_on && ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) ) + test(); + test(); + test(); + IF( hDirACRend->proto_signal_decorr_on && ( NE_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && NE_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) && NE_32( renderer_type, RENDERER_STEREO_PARAMETRIC ) ) ) { -#ifndef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->frame_dec_f = (float *) malloc( sizeof( float ) * 2 * num_outputs_diff * num_freq_bands ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } -#else - if ( ( hDirAC_mem->frame_dec_f_fx = (Word32 *) malloc( sizeof( Word32 ) * 2 * num_outputs_diff * num_freq_bands ) ) == NULL ) + IF( ( hDirAC_mem->frame_dec_f_fx = (Word32 *) malloc( sizeof( Word32 ) * 2 * num_outputs_diff * num_freq_bands ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } #ifdef MSAN_FIX set_zero_fx( hDirAC_mem->frame_dec_f_fx, 2 * num_outputs_diff * num_freq_bands ); #endif - hDirAC_mem->frame_dec_f_len = 2 * num_outputs_diff * num_freq_bands; -#endif + hDirAC_mem->frame_dec_f_len = imult1616( imult1616( 2, num_outputs_diff ), num_freq_bands ); } } -#ifndef IVAS_FLOAT_FIXED - hDirACRend->h_output_synthesis_psd_state.proto_power_smooth = hDirAC_mem->proto_power_smooth; - hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth = hDirAC_mem->proto_power_diff_smooth; - hDirACRend->h_output_synthesis_psd_state.cy_auto_dir_smooth = hDirAC_mem->cy_auto_dir_smooth; - hDirACRend->h_output_synthesis_psd_state.direct_responses_square = hDirAC_mem->direct_responses_square; -#else - hDirACRend->h_output_synthesis_psd_state.direct_responses_square_fx = hDirAC_mem->direct_responses_square_fx; - hDirACRend->h_output_synthesis_psd_state.direct_responses_square_q = Q31; hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx = hDirAC_mem->proto_power_smooth_fx; hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q = Q31; + move16(); hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q = Q31; + move16(); hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_fx = hDirAC_mem->proto_power_diff_smooth_fx; hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q = hDirAC_mem->proto_power_diff_smooth_q; + move16(); hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_len = hDirAC_mem->proto_power_diff_smooth_len; + move16(); hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q = Q31; + move16(); hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_q = Q31; + move16(); hDirACRend->h_output_synthesis_psd_state.cy_auto_dir_smooth_fx = hDirAC_mem->cy_auto_dir_smooth_fx; hDirACRend->h_output_synthesis_psd_state.q_cy_auto_dir_smooth = 0; move16(); -#endif + hDirACRend->h_output_synthesis_psd_state.direct_responses_square_fx = hDirAC_mem->direct_responses_square_fx; + hDirACRend->h_output_synthesis_psd_state.direct_responses_square_q = Q31; + move16(); + move16(); /* Target and smoothed nrg factors/gains */ -#ifndef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size_ho ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } -#ifdef MSAN_FIX - set_zero( hDirAC_mem->cy_cross_dir_smooth, size_ho ); -#else - set_zero( hDirAC_mem->cy_cross_dir_smooth, size ); -#endif -#endif -#ifdef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->cy_cross_dir_smooth_fx = (Word32 *) malloc( sizeof( Word32 ) * size_ho ) ) == NULL ) + IF( ( hDirAC_mem->cy_cross_dir_smooth_fx = (Word32 *) malloc( sizeof( Word32 ) * size_ho ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } hDirACRend->h_output_synthesis_psd_state.cy_cross_dir_smooth_len = size_ho; + move16(); #ifdef MSAN_FIX set_zero_fx( hDirAC_mem->cy_cross_dir_smooth_fx, size_ho ); #else set_zero_fx( hDirAC_mem->cy_cross_dir_smooth_fx, size ); hDirACRend->h_output_synthesis_psd_state.cy_cross_dir_smooth_len = size_ho; -#endif #endif - if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + IF( NE_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { -#ifndef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->cy_auto_diff_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } - set_zero( hDirAC_mem->cy_auto_diff_smooth, size ); -#else - if ( ( hDirAC_mem->cy_auto_diff_smooth_fx = (Word32 *) malloc( sizeof( Word32 ) * size ) ) == NULL ) + IF( ( hDirAC_mem->cy_auto_diff_smooth_fx = (Word32 *) malloc( sizeof( Word32 ) * size ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } set_zero_fx( hDirAC_mem->cy_auto_diff_smooth_fx, size ); hDirACRend->h_output_synthesis_psd_state.cy_auto_diff_smooth_len = size; -#endif + move16(); } - else + ELSE { -#ifndef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->cy_auto_diff_smooth = (float *) malloc( sizeof( float ) * num_outputs_diff * num_freq_bands_diff ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } - set_zero( hDirAC_mem->cy_auto_diff_smooth, num_outputs_diff * num_freq_bands_diff ); -#else - if ( ( hDirAC_mem->cy_auto_diff_smooth_fx = (Word32 *) malloc( sizeof( Word32 ) * num_outputs_diff * num_freq_bands_diff ) ) == NULL ) + IF( ( hDirAC_mem->cy_auto_diff_smooth_fx = (Word32 *) malloc( sizeof( Word32 ) * num_outputs_diff * num_freq_bands_diff ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } - set_zero_fx( hDirAC_mem->cy_auto_diff_smooth_fx, num_outputs_diff * num_freq_bands_diff ); - hDirACRend->h_output_synthesis_psd_state.cy_auto_diff_smooth_len = num_outputs_diff * num_freq_bands_diff; -#endif + set_zero_fx( hDirAC_mem->cy_auto_diff_smooth_fx, imult1616( num_outputs_diff, num_freq_bands_diff ) ); + hDirACRend->h_output_synthesis_psd_state.cy_auto_diff_smooth_len = imult1616( num_outputs_diff, num_freq_bands_diff ); } -#ifdef IVAS_FLOAT_FIXED hDirACRend->h_output_synthesis_psd_state.cy_cross_dir_smooth_fx = hDirAC_mem->cy_cross_dir_smooth_fx; - hDirACRend->h_output_synthesis_psd_state.cy_auto_diff_smooth_fx = hDirAC_mem->cy_auto_diff_smooth_fx; hDirACRend->h_output_synthesis_psd_state.q_cy_cross_dir_smooth = 31; move16(); + hDirACRend->h_output_synthesis_psd_state.cy_auto_diff_smooth_fx = hDirAC_mem->cy_auto_diff_smooth_fx; hDirACRend->h_output_synthesis_psd_state.q_cy_auto_diff_smooth = 0; move16(); -#else - hDirACRend->h_output_synthesis_psd_state.cy_cross_dir_smooth = hDirAC_mem->cy_cross_dir_smooth; - hDirACRend->h_output_synthesis_psd_state.cy_auto_diff_smooth = hDirAC_mem->cy_auto_diff_smooth; -#endif - - /*Responses (gains/factors)*/ -#ifndef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size_ho ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } - set_zero( hDirAC_mem->direct_responses, size ); - - - hDirACRend->h_output_synthesis_psd_state.direct_responses = hDirAC_mem->direct_responses; -#else /*Responses (gains/factors)*/ - if ( ( hDirAC_mem->direct_responses_fx = (Word32 *) malloc( sizeof( Word32 ) * size_ho ) ) == NULL ) + IF( ( hDirAC_mem->direct_responses_fx = (Word32 *) malloc( sizeof( Word32 ) * size_ho ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } @@ -1459,100 +1407,59 @@ ivas_error ivas_dirac_alloc_mem( hDirACRend->h_output_synthesis_psd_state.direct_responses_fx = hDirAC_mem->direct_responses_fx; hDirACRend->h_output_synthesis_psd_state.direct_responses_q = Q31; -#endif + move16(); /* Prototypes */ -#ifndef IVAS_FLOAT_FIXED - hDirAC_mem->proto_direct_buffer_f = NULL; - hDirAC_mem->proto_diffuse_buffer_f = NULL; -#else hDirAC_mem->proto_direct_buffer_f_fx = NULL; hDirAC_mem->proto_diffuse_buffer_f_fx = NULL; -#endif - if ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) + test(); + test(); + IF( NE_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && NE_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) && NE_32( renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { -#ifndef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->proto_direct_buffer_f = (float *) malloc( sizeof( float ) * 2 * MAX_PARAM_SPATIAL_SUBFRAMES * num_protos_dir * num_freq_bands ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } -#else IF( ( hDirAC_mem->proto_direct_buffer_f_fx = (Word32 *) malloc( sizeof( Word32 ) * 2 * MAX_PARAM_SPATIAL_SUBFRAMES * num_protos_dir * num_freq_bands ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_len = imult1616( imult1616( 2 * MAX_PARAM_SPATIAL_SUBFRAMES, num_protos_dir ), num_freq_bands ); - hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_len = 2 * MAX_PARAM_SPATIAL_SUBFRAMES * num_protos_dir * num_freq_bands; -#endif - - if ( hDirACRend->proto_signal_decorr_on ) + IF( hDirACRend->proto_signal_decorr_on ) { - if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) + IF( EQ_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_SHD ) ) { -#ifndef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->proto_diffuse_buffer_f = (float *) malloc( sizeof( float ) * 2 * MAX_PARAM_SPATIAL_SUBFRAMES * size ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } -#else IF( ( hDirAC_mem->proto_diffuse_buffer_f_fx = (Word32 *) malloc( sizeof( Word32 ) * 2 * MAX_PARAM_SPATIAL_SUBFRAMES * size ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } - hDirAC_mem->proto_diffuse_buffer_f_len = 2 * MAX_PARAM_SPATIAL_SUBFRAMES * size; -#endif + hDirAC_mem->proto_diffuse_buffer_f_len = imult1616( 2 * MAX_PARAM_SPATIAL_SUBFRAMES, size ); } - else + ELSE { -#ifndef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->proto_diffuse_buffer_f = (float *) malloc( sizeof( float ) * 2 * MAX_PARAM_SPATIAL_SUBFRAMES * num_outputs_diff * num_freq_bands ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } -#else IF( ( hDirAC_mem->proto_diffuse_buffer_f_fx = (Word32 *) malloc( sizeof( Word32 ) * 2 * MAX_PARAM_SPATIAL_SUBFRAMES * num_outputs_diff * num_freq_bands ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } - hDirAC_mem->proto_diffuse_buffer_f_len = 2 * MAX_PARAM_SPATIAL_SUBFRAMES * num_outputs_diff * num_freq_bands; -#endif + hDirAC_mem->proto_diffuse_buffer_f_len = imult1616( imult1616( 2 * MAX_PARAM_SPATIAL_SUBFRAMES, num_outputs_diff ), num_freq_bands ); } #ifdef MSAN_FIX set_zero_fx( hDirAC_mem->proto_diffuse_buffer_f_fx, hDirAC_mem->proto_diffuse_buffer_f_len ); #endif } } -#ifdef IVAS_FLOAT_FIXED hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_fx = hDirAC_mem->proto_direct_buffer_f_fx; hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_fx = hDirAC_mem->proto_diffuse_buffer_f_fx; hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_len = hDirAC_mem->proto_diffuse_buffer_f_len; + move16(); hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q = Q31; -#else - hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f = hDirAC_mem->proto_diffuse_buffer_f; - hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f = hDirAC_mem->proto_direct_buffer_f; -#endif - /* Gains/power factors*/ + move16(); -#ifdef IVAS_FLOAT_FIXED + /* Gains/power factors*/ hDirAC_mem->direct_power_factor_fx = NULL; hDirAC_mem->diffuse_power_factor_fx = NULL; -#else - hDirAC_mem->direct_power_factor = NULL; - hDirAC_mem->diffuse_power_factor = NULL; -#endif - if ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) + test(); + test(); + IF( NE_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && NE_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) && NE_32( renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { -#ifndef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * size_pf ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } - if ( ( hDirAC_mem->diffuse_power_factor = (float *) malloc( sizeof( float ) * size_pf ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } -#else IF( ( hDirAC_mem->direct_power_factor_fx = (Word32 *) malloc( sizeof( Word32 ) * size_pf ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); @@ -1561,10 +1468,8 @@ ivas_error ivas_dirac_alloc_mem( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } -#endif } -#ifdef IVAS_FLOAT_FIXED hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx = hDirAC_mem->direct_power_factor_fx; hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_fx = hDirAC_mem->diffuse_power_factor_fx; set_zero_fx( hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx, size_pf ); @@ -1573,107 +1478,267 @@ ivas_error ivas_dirac_alloc_mem( move16(); hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_q = Q31; move16(); -#else - hDirACRend->h_output_synthesis_psd_state.direct_power_factor = hDirAC_mem->direct_power_factor; - hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor = hDirAC_mem->diffuse_power_factor; - set_zero( hDirACRend->h_output_synthesis_psd_state.direct_power_factor, size_pf ); - set_zero( hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor, size_pf ); -#endif -#ifndef IVAS_FLOAT_FIXED - hDirAC_mem->reference_power = NULL; - hDirAC_mem->onset_filter = NULL; -#endif -#ifdef IVAS_FLOAT_FIXED hDirAC_mem->reference_power_fx = NULL; hDirAC_mem->onset_filter_fx = NULL; -#endif - if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + IF( NE_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { - if ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) + test(); + test(); + IF( NE_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && NE_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) && NE_32( renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { -#ifndef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->reference_power = (float *) malloc( sizeof( float ) * 2 * num_freq_bands ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } -#else - if ( ( hDirAC_mem->reference_power_fx = (Word32 *) malloc( sizeof( Word32 ) * 2 * num_freq_bands ) ) == NULL ) + IF( ( hDirAC_mem->reference_power_fx = (Word32 *) malloc( sizeof( Word32 ) * 2 * num_freq_bands ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } - hDirAC_mem->reference_power_len = 2 * num_freq_bands; + hDirAC_mem->reference_power_len = imult1616( 2, num_freq_bands ); hDirAC_mem->reference_power_q = Q31; + move16(); hDirAC_mem->reference_power_smooth_q = Q31; -#endif - if ( hDirACRend->proto_signal_decorr_on ) + move16(); + IF( hDirACRend->proto_signal_decorr_on ) { -#ifndef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->onset_filter = (float *) malloc( sizeof( float ) * num_outputs_diff * num_freq_bands ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } -#endif -#ifdef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->onset_filter_fx = (Word32 *) malloc( sizeof( Word32 ) * num_outputs_diff * num_freq_bands ) ) == NULL ) + IF( ( hDirAC_mem->onset_filter_fx = (Word32 *) malloc( sizeof( Word32 ) * num_outputs_diff * num_freq_bands ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } #ifdef MSAN_FIX -#ifndef IVAS_FLOAT_FIXED - set_zero( hDirAC_mem->onset_filter, num_outputs_diff * num_freq_bands ); -#endif - set_zero_fx( hDirAC_mem->onset_filter_fx, num_outputs_diff * num_freq_bands ); -#endif + set_zero_fx( hDirAC_mem->onset_filter_fx, imult1616( num_outputs_diff, num_freq_bands ) ); #endif } } } - else + ELSE { - if ( num_protos_dir > 2 ) + IF( GT_16( num_protos_dir, 2 ) ) { -#ifndef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->reference_power = (float *) malloc( sizeof( float ) * 5 * num_freq_bands ) ) == NULL ) + IF( ( hDirAC_mem->reference_power_fx = (Word32 *) malloc( sizeof( Word32 ) * 5 * num_freq_bands ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } + + hDirAC_mem->reference_power_len = imult1616( 5, num_freq_bands ); + } + + IF( hDirACRend->proto_signal_decorr_on ) + { + IF( ( hDirAC_mem->onset_filter_fx = (Word32 *) malloc( sizeof( Word32 ) * 2 * num_freq_bands ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } +#ifdef MSAN_FIX + set_zero_fx( hDirAC_mem->onset_filter_fx, imult1616( 2, num_freq_bands ) ); +#endif + } + } + + return IVAS_ERR_OK; +} #else - if ( ( hDirAC_mem->reference_power_fx = (Word32 *) malloc( sizeof( Word32 ) * 5 * num_freq_bands ) ) == NULL ) +ivas_error ivas_dirac_alloc_mem( + DIRAC_REND_HANDLE hDirACRend, + const RENDERER_TYPE renderer_type, + const int16_t num_freq_bands, + DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem, + const int16_t hodirac_flag ) +{ + int16_t num_freq_bands_diff, size; + int16_t size_ho; + int16_t size_pf; + int16_t num_outputs_dir, num_outputs_diff; + int16_t num_protos_dir; + + num_protos_dir = hDirACRend->num_protos_dir; + + num_freq_bands_diff = hDirACRend->h_output_synthesis_psd_params.max_band_decorr; + + num_outputs_dir = hDirACRend->num_outputs_dir; + num_outputs_diff = hDirACRend->num_outputs_diff; + + size = num_freq_bands * num_outputs_dir; + if ( hodirac_flag ) + { + size_ho = size * DIRAC_HO_NUMSECTORS; + size_pf = num_freq_bands * DIRAC_HO_NUMSECTORS; + } + else + { + size_ho = size; + size_pf = num_freq_bands; + } + + /* PSD related buffers */ + hDirAC_mem->cy_auto_dir_smooth = NULL; + hDirAC_mem->proto_power_smooth = NULL; + hDirAC_mem->proto_power_diff_smooth = NULL; + hDirAC_mem->direct_responses_square = NULL; + hDirAC_mem->frame_dec_f = NULL; + if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + if ( ( hDirAC_mem->cy_auto_dir_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->cy_auto_dir_smooth, size ); + + if ( ( hDirAC_mem->proto_power_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->proto_power_smooth, size ); + + if ( ( hDirAC_mem->proto_power_diff_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->proto_power_diff_smooth, size ); + + if ( ( hDirAC_mem->direct_responses_square = (float *) malloc( sizeof( float ) * size ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->direct_responses_square, size ); + if ( hDirACRend->proto_signal_decorr_on && ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) ) + { + if ( ( hDirAC_mem->frame_dec_f = (float *) malloc( sizeof( float ) * 2 * num_outputs_diff * num_freq_bands ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } + } + } + hDirACRend->h_output_synthesis_psd_state.proto_power_smooth = hDirAC_mem->proto_power_smooth; + hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth = hDirAC_mem->proto_power_diff_smooth; + hDirACRend->h_output_synthesis_psd_state.cy_auto_dir_smooth = hDirAC_mem->cy_auto_dir_smooth; + hDirACRend->h_output_synthesis_psd_state.direct_responses_square = hDirAC_mem->direct_responses_square; - hDirAC_mem->reference_power_len = 5 * num_freq_bands; -#endif + /* Target and smoothed nrg factors/gains */ + if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size_ho ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->cy_cross_dir_smooth, size ); + + if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + if ( ( hDirAC_mem->cy_auto_diff_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->cy_auto_diff_smooth, size ); + } + else + { + if ( ( hDirAC_mem->cy_auto_diff_smooth = (float *) malloc( sizeof( float ) * num_outputs_diff * num_freq_bands_diff ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->cy_auto_diff_smooth, num_outputs_diff * num_freq_bands_diff ); + } + hDirACRend->h_output_synthesis_psd_state.cy_cross_dir_smooth = hDirAC_mem->cy_cross_dir_smooth; + hDirACRend->h_output_synthesis_psd_state.cy_auto_diff_smooth = hDirAC_mem->cy_auto_diff_smooth; + + /*Responses (gains/factors)*/ + if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size_ho ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->direct_responses, size ); + + + hDirACRend->h_output_synthesis_psd_state.direct_responses = hDirAC_mem->direct_responses; + + /* Prototypes */ + hDirAC_mem->proto_direct_buffer_f = NULL; + hDirAC_mem->proto_diffuse_buffer_f = NULL; + if ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + if ( ( hDirAC_mem->proto_direct_buffer_f = (float *) malloc( sizeof( float ) * 2 * MAX_PARAM_SPATIAL_SUBFRAMES * num_protos_dir * num_freq_bands ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } if ( hDirACRend->proto_signal_decorr_on ) { -#ifndef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->onset_filter = (float *) malloc( sizeof( float ) * 2 * num_freq_bands ) ) == NULL ) + if ( hDirACRend->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) + { + if ( ( hDirAC_mem->proto_diffuse_buffer_f = (float *) malloc( sizeof( float ) * 2 * MAX_PARAM_SPATIAL_SUBFRAMES * size ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + } + else + { + if ( ( hDirAC_mem->proto_diffuse_buffer_f = (float *) malloc( sizeof( float ) * 2 * MAX_PARAM_SPATIAL_SUBFRAMES * num_outputs_diff * num_freq_bands ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + } + } + } + hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f = hDirAC_mem->proto_direct_buffer_f; + hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f = hDirAC_mem->proto_diffuse_buffer_f; + + /* Gains/power factors*/ + hDirAC_mem->direct_power_factor = NULL; + hDirAC_mem->diffuse_power_factor = NULL; + + if ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + if ( ( hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * size_pf ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + if ( ( hDirAC_mem->diffuse_power_factor = (float *) malloc( sizeof( float ) * size_pf ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + } + + hDirACRend->h_output_synthesis_psd_state.direct_power_factor = hDirAC_mem->direct_power_factor; + hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor = hDirAC_mem->diffuse_power_factor; + + hDirAC_mem->reference_power = NULL; + hDirAC_mem->onset_filter = NULL; + if ( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + if ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + if ( ( hDirAC_mem->reference_power = (float *) malloc( sizeof( float ) * 2 * num_freq_bands ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } -#endif -#ifdef IVAS_FLOAT_FIXED - if ( ( hDirAC_mem->onset_filter_fx = (Word32 *) malloc( sizeof( Word32 ) * 2 * num_freq_bands ) ) == NULL ) + if ( hDirACRend->proto_signal_decorr_on ) + { + if ( ( hDirAC_mem->onset_filter = (float *) malloc( sizeof( float ) * num_outputs_diff * num_freq_bands ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + } + } + } + else + { + if ( num_protos_dir > 2 ) + { + if ( ( hDirAC_mem->reference_power = (float *) malloc( sizeof( float ) * 5 * num_freq_bands ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + } + + if ( hDirACRend->proto_signal_decorr_on ) + { + if ( ( hDirAC_mem->onset_filter = (float *) malloc( sizeof( float ) * 2 * num_freq_bands ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } -#ifdef MSAN_FIX -#ifndef IVAS_FLOAT_FIXED - set_zero( hDirAC_mem->onset_filter, 2 * num_freq_bands ); -#endif - set_zero_fx( hDirAC_mem->onset_filter_fx, 2 * num_freq_bands ); -#endif -#endif } } return IVAS_ERR_OK; } +#endif /*------------------------------------------------------------------------- @@ -1698,10 +1763,6 @@ void ivas_dirac_free_mem_fx( { free( hDirAC_mem->proto_power_diff_smooth_fx ); } - /*IF( hDirAC_mem->direct_responses_square != NULL ) - { - free( hDirAC_mem->direct_responses_square ); - }*/ IF( hDirAC_mem->direct_responses_square_fx != NULL ) { free( hDirAC_mem->direct_responses_square_fx ); @@ -1710,12 +1771,6 @@ void ivas_dirac_free_mem_fx( { free( hDirAC_mem->frame_dec_f_fx ); } -#if 0 /* TODO: remove float free */ - IF (hDirAC_mem->frame_dec_f != NULL) - { - free( hDirAC_mem->frame_dec_f ); - } -#endif IF( hDirAC_mem->cy_cross_dir_smooth_fx != NULL ) { free( hDirAC_mem->cy_cross_dir_smooth_fx ); @@ -1724,42 +1779,18 @@ void ivas_dirac_free_mem_fx( { free( hDirAC_mem->cy_auto_diff_smooth_fx ); } -#ifndef IVAS_FLOAT_FIXED_TO_BE_REMOVED - IF( hDirAC_mem->direct_responses != NULL ) - { - free( hDirAC_mem->direct_responses ); - } -#endif - if ( hDirAC_mem->direct_responses_fx != NULL ) + IF( hDirAC_mem->direct_responses_fx != NULL ) { free( hDirAC_mem->direct_responses_fx ); } - /*IF( hDirAC_mem->proto_direct_buffer_f != NULL ) - { - free( hDirAC_mem->proto_direct_buffer_f ); - }*/ IF( hDirAC_mem->proto_direct_buffer_f_fx != NULL ) { free( hDirAC_mem->proto_direct_buffer_f_fx ); } - /*IF( hDirAC_mem->proto_diffuse_buffer_f != NULL ) - { - free( hDirAC_mem->proto_diffuse_buffer_f ); - }*/ IF( hDirAC_mem->proto_diffuse_buffer_f_fx != NULL ) { free( hDirAC_mem->proto_diffuse_buffer_f_fx ); } -#ifndef IVAS_FLOAT_FIXED - IF( hDirAC_mem->direct_power_factor != NULL ) - { - free( hDirAC_mem->direct_power_factor ); - } - IF( hDirAC_mem->diffuse_power_factor != NULL ) - { - free( hDirAC_mem->diffuse_power_factor ); - } -#endif IF( hDirAC_mem->direct_power_factor_fx != NULL ) { free( hDirAC_mem->direct_power_factor_fx ); @@ -1856,21 +1887,20 @@ void compute_hoa_encoder_mtx_fx( const Word32 *azimuth, const Word32 *elevation, Word32 *response_fx, - const int16_t num_responses, - const int16_t ambisonics_order ) + const Word16 num_responses, + const Word16 ambisonics_order ) { Word16 k, num_sh; num_sh = ivas_sba_get_nchan_fx( ambisonics_order, 0 ); FOR( k = 0; k < num_responses; k++ ) { - ivas_dirac_dec_get_response_fx( shr( extract_h( azimuth[k] ), Q22 - Q16 ), shr( extract_h( elevation[k] ), Q22 - Q16 ), &response_fx[k * num_sh], ambisonics_order, Q31 ); // Q29 + ivas_dirac_dec_get_response_fx( shr( extract_h( azimuth[k] ), Q22 - Q16 ), shr( extract_h( elevation[k] ), Q22 - Q16 ), &response_fx[imult1616( k, num_sh )], ambisonics_order, Q31 ); /* Q31 */ } return; } #else - void compute_hoa_encoder_mtx( const float *azimuth, const float *elevation, @@ -1890,11 +1920,14 @@ void compute_hoa_encoder_mtx( return; } #endif + + /*------------------------------------------------------------------------- * ivas_dirac_dec_get_frequency_axis() * * DirAC decoding initialization *------------------------------------------------------------------------*/ + #ifndef IVAS_FLOAT_FIXED void ivas_dirac_dec_get_frequency_axis( float *frequency_axis, @@ -1923,22 +1956,25 @@ void ivas_dirac_dec_get_frequency_axis_fx( /* calc cldfb frequency axis */ const_part = BASOP_Util_Divide3216_Scale( output_Fs, shl( num_freq_bands, 1 ), &scale ); - const_part = shr( const_part, ( -1 - scale ) ); - for ( k = 0; k < num_freq_bands; k++ ) + const_part = shr( const_part, sub( -1, scale ) ); + FOR( k = 0; k < num_freq_bands; k++ ) { /* frequency_axis[k] = ((float)k + 0.5f) * const_part; */ frequency_axis[k] = add( i_mult( k, const_part ), shr( const_part, 1 ) ); + move16(); } return; } #endif + /*------------------------------------------------------------------------- * initDiffuseResponses() * * *-------------------------------------------------------------------------*/ + #ifndef IVAS_FLOAT_FIXED void initDiffuseResponses( float *diffuse_response_function, @@ -2061,66 +2097,99 @@ void initDiffuseResponses_fx( Word16 var1, exp_var1, res; - IF( output_config == IVAS_AUDIO_CONFIG_MONO ) + test(); + test(); + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_MONO ) ) { diffuse_response_function_fx[0] = MAX16B; + move16(); diffuse_response_function_fx[1] = 18918 /*inv_sqrt(3.0f) oin Q15*/; + move16(); } - ELSE IF( !( output_config == IVAS_AUDIO_CONFIG_FOA || output_config == IVAS_AUDIO_CONFIG_HOA2 || output_config == IVAS_AUDIO_CONFIG_HOA3 ) ) + ELSE IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_FOA ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_HOA2 ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_HOA3 ) ) ) { /* set diffuse response function */ - IF( ivas_format == MC_FORMAT && ( transport_config == IVAS_AUDIO_CONFIG_5_1 || transport_config == IVAS_AUDIO_CONFIG_7_1 ) && output_config == IVAS_AUDIO_CONFIG_5_1_4 ) + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( EQ_32( ivas_format, MC_FORMAT ) && ( EQ_32( transport_config, IVAS_AUDIO_CONFIG_5_1 ) || EQ_32( transport_config, IVAS_AUDIO_CONFIG_7_1 ) ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_5_1_4 ) ) { - num_horizontal_speakers = num_channels - NUM_ELEVATED_SPEAKERS; + num_horizontal_speakers = sub( num_channels, NUM_ELEVATED_SPEAKERS ); Copy( diffuse_response_CICP6_fx, diffuse_response_function_fx, num_horizontal_speakers ); set16_fx( &diffuse_response_function_fx[num_horizontal_speakers], 0, NUM_ELEVATED_SPEAKERS ); *num_ele_spk_no_diffuse_rendering = NUM_ELEVATED_SPEAKERS; + move16(); } - ELSE IF( ivas_format == MC_FORMAT && ( transport_config == IVAS_AUDIO_CONFIG_5_1 || transport_config == IVAS_AUDIO_CONFIG_7_1 ) && output_config == IVAS_AUDIO_CONFIG_7_1_4 ) + ELSE IF( EQ_32( ivas_format, MC_FORMAT ) && ( EQ_32( transport_config, IVAS_AUDIO_CONFIG_5_1 ) || EQ_32( transport_config, IVAS_AUDIO_CONFIG_7_1 ) ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_7_1_4 ) ) { - num_horizontal_speakers = num_channels - NUM_ELEVATED_SPEAKERS; + num_horizontal_speakers = sub( num_channels, NUM_ELEVATED_SPEAKERS ); exp_var1 = 15; + move16(); var1 = ISqrt16( num_horizontal_speakers, &exp_var1 ); var1 = shr( var1, negate( exp_var1 ) ); // Q15 set16_fx( diffuse_response_function_fx, var1, num_horizontal_speakers ); set16_fx( &diffuse_response_function_fx[num_horizontal_speakers], 0, NUM_ELEVATED_SPEAKERS ); *num_ele_spk_no_diffuse_rendering = NUM_ELEVATED_SPEAKERS; + move16(); } - ELSE IF( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT || ivas_format == MC_FORMAT ) && output_config == IVAS_AUDIO_CONFIG_5_1 && num_channels == 5 ) + ELSE IF( ( EQ_32( ivas_format, MASA_FORMAT ) || EQ_32( ivas_format, MASA_ISM_FORMAT ) || EQ_32( ivas_format, MC_FORMAT ) ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_5_1 ) && EQ_16( num_channels, 5 ) ) { Copy( diffuse_response_CICP6_fx, diffuse_response_function_fx, num_channels ); } - ELSE IF( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT || ivas_format == MC_FORMAT ) && output_config == IVAS_AUDIO_CONFIG_5_1_2 && num_channels == 7 ) + ELSE IF( ( EQ_32( ivas_format, MASA_FORMAT ) || EQ_32( ivas_format, MASA_ISM_FORMAT ) || EQ_32( ivas_format, MC_FORMAT ) ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_5_1_2 ) && EQ_16( num_channels, 7 ) ) { Copy( diffuse_response_CICP14_fx, diffuse_response_function_fx, num_channels ); } - ELSE IF( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT || ivas_format == MC_FORMAT ) && ( output_config == IVAS_AUDIO_CONFIG_5_1_4 ) && ( num_channels == 9 ) ) + ELSE IF( ( EQ_32( ivas_format, MASA_FORMAT ) || EQ_32( ivas_format, MASA_ISM_FORMAT ) || EQ_32( ivas_format, MC_FORMAT ) ) && ( EQ_32( output_config, IVAS_AUDIO_CONFIG_5_1_4 ) ) && EQ_16( num_channels, 9 ) ) { Copy( diffuse_response_CICP16_fx, diffuse_response_function_fx, num_channels ); } - ELSE IF( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT || ivas_format == MC_FORMAT ) && ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + ELSE IF( ( EQ_32( ivas_format, MASA_FORMAT ) || EQ_32( ivas_format, MASA_ISM_FORMAT ) || EQ_32( ivas_format, MC_FORMAT ) ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - IF( transport_config == IVAS_AUDIO_CONFIG_5_1 || transport_config == IVAS_AUDIO_CONFIG_7_1 ) + IF( EQ_32( transport_config, IVAS_AUDIO_CONFIG_5_1 ) || EQ_32( transport_config, IVAS_AUDIO_CONFIG_7_1 ) ) { /* Detect loudspeakers with elevation */ num_horizontal_speakers = 0; + move16(); FOR( i = 0; i < num_channels; i++ ) { IF( LE_32( abs( hOutSetup.ls_elevation_fx[i] ), 20971520 ) /*5 in Q22*/ ) { num_horizontal_speakers = add( num_horizontal_speakers, 1 ); diffuse_response_function_fx[i] = MAX16B; + move16(); } ELSE { *num_ele_spk_no_diffuse_rendering = add( *num_ele_spk_no_diffuse_rendering, 1 ); + move16(); diffuse_response_function_fx[i] = 0; + move16(); } } /* Diffuse only to horizontal plane IF enough loudspeakers */ IF( GT_16( num_horizontal_speakers, 2 ) ) { exp_var1 = 15; + move16(); Word16 num_horizontal_speakers_isq = ISqrt16( num_horizontal_speakers, &exp_var1 ); num_horizontal_speakers_isq = shr( num_horizontal_speakers_isq, negate( exp_var1 ) ); assert( 0 ); @@ -2128,20 +2197,26 @@ void initDiffuseResponses_fx( FOR( i = 0; i < num_channels; i++ ) { diffuse_response_function_fx[i] = shr( mult( diffuse_response_function_fx[i], num_horizontal_speakers_isq ), Q15 ); + move16(); } } ELSE { var1 = num_channels, exp_var1 = 15; + move16(); + move16(); res = ISqrt16( var1, &exp_var1 ); res = shr( res, negate( exp_var1 ) ); set16_fx( diffuse_response_function_fx, res, num_channels ); *num_ele_spk_no_diffuse_rendering = 0; + move16(); } } ELSE { var1 = num_channels, exp_var1 = 15; + move16(); + move16(); res = ISqrt16( var1, &exp_var1 ); res = shr( res, negate( exp_var1 ) ); set16_fx( diffuse_response_function_fx, res, num_channels ); @@ -2150,6 +2225,8 @@ void initDiffuseResponses_fx( ELSE { var1 = num_channels, exp_var1 = 15; + move16(); + move16(); res = ISqrt16( var1, &exp_var1 ); res = shr( res, negate( exp_var1 ) ); set16_fx( diffuse_response_function_fx, res, num_channels ); @@ -2158,6 +2235,7 @@ void initDiffuseResponses_fx( ELSE { idx = 0; + move16(); Word16 j; FOR( l = 0; l <= ambisonics_order; l++ ) { @@ -2165,6 +2243,8 @@ void initDiffuseResponses_fx( FOR( k = 0; k < j; k++ ) { var1 = j, exp_var1 = 15; + move16(); + move16(); res = ISqrt16( var1, &exp_var1 ); diffuse_response_function_fx[idx] = shr( res, negate( exp_var1 ) ); idx = add( idx, 1 ); @@ -2176,13 +2256,14 @@ void initDiffuseResponses_fx( } #endif -#ifdef IVAS_FLOAT_FIXED + /*------------------------------------------------------------------------- - * protoSignalComputation_shd_fx() + * protoSignalComputation_shd() * * *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED void protoSignalComputation_shd_fx( Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], Word32 ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], @@ -2225,9 +2306,9 @@ void protoSignalComputation_shd_fx( { FOR( l = 0; l < num_freq_bands; l++ ) { - p_proto_direct_buffer_fx[i_mult( 2, l )] = RealBuffer_fx[0][0][l]; + p_proto_direct_buffer_fx[2 * l] = RealBuffer_fx[0][0][l]; move32(); - p_proto_direct_buffer_fx[add( i_mult( 2, l ), 1 )] = ImagBuffer_fx[0][0][l]; + p_proto_direct_buffer_fx[add( 2 * l, 1 )] = ImagBuffer_fx[0][0][l]; move32(); } *proto_direct_buffer_f_q = q_cldfb; @@ -2247,9 +2328,9 @@ void protoSignalComputation_shd_fx( re2 = L_sub( RealBuffer_fx[0][0][l], RealBuffer_fx[1][0][l] ); im2 = L_sub( ImagBuffer_fx[0][0][l], ImagBuffer_fx[1][0][l] ); - p_proto_direct_buffer_fx[i_mult( 2, l )] = re1; + p_proto_direct_buffer_fx[2 * l] = re1; move32(); - p_proto_direct_buffer_fx[add( i_mult( 2, l ), 1 )] = im1; + p_proto_direct_buffer_fx[add( 2 * l, 1 )] = im1; move32(); p_proto_direct_buffer_fx[i_mult( 2, add( num_freq_bands, l ) )] = L_shl( Mpy_32_32( p_Rmat_fx[0], re2 ), Q1 ); // left shift is done to maintain constant Q factor for p_proto_direct_buffer_fx move32(); @@ -2266,9 +2347,9 @@ void protoSignalComputation_shd_fx( re1 = L_add( RealBuffer_fx[0][0][l], RealBuffer_fx[1][0][l] ); im1 = L_add( ImagBuffer_fx[0][0][l], ImagBuffer_fx[1][0][l] ); - p_proto_direct_buffer_fx[i_mult( 2, l )] = re1; + p_proto_direct_buffer_fx[2 * l] = re1; move32(); - p_proto_direct_buffer_fx[add( i_mult( 2, l ), 1 )] = im1; + p_proto_direct_buffer_fx[add( 2 * l, 1 )] = im1; move32(); p_proto_direct_buffer_fx[i_mult( 2, add( num_freq_bands, l ) )] = L_sub( RealBuffer_fx[0][0][l], RealBuffer_fx[1][0][l] ); move32(); @@ -2395,6 +2476,7 @@ void protoSignalComputation_shd_fx( *proto_direct_buffer_f_q = q_cldfb; move16(); *reference_power_q = sub( add( add( q_cldfb, min_q_shift ), add( q_cldfb, min_q_shift ) ), 31 ); + move16(); } /* Additional transport channels = planar SBA components of degree higher than 1*/ @@ -2431,12 +2513,6 @@ void protoSignalComputation_shd_fx( return; } #else -/*------------------------------------------------------------------------- - * protoSignalComputation_shd() - * - * - *-------------------------------------------------------------------------*/ - void protoSignalComputation_shd( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], @@ -2593,13 +2669,14 @@ void protoSignalComputation_shd( } #endif -#ifdef IVAS_FLOAT_FIXED + /*------------------------------------------------------------------------- - * protoSignalComputation1_fx() + * protoSignalComputation1() * * *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED void protoSignalComputation1_fx( Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], Word32 ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], @@ -2653,6 +2730,7 @@ void protoSignalComputation1_fx( reference_power_fx[l] = Madd_32_32( Mpy_32_32( re, re ), im, im ); move32(); *reference_power_q = sub( add( add( q_cldfb, min_q_shift ), add( q_cldfb, min_q_shift ) ), 31 ); + move16(); IF( LT_16( *reference_power_q, *proto_power_smooth_q ) ) { @@ -2695,12 +2773,6 @@ void protoSignalComputation1_fx( return; } #else -/*------------------------------------------------------------------------- - * protoSignalComputation1() - * - * - *-------------------------------------------------------------------------*/ - void protoSignalComputation1( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], @@ -2734,13 +2806,15 @@ void protoSignalComputation1( return; } #endif -#ifdef IVAS_FLOAT_FIXED + + /*------------------------------------------------------------------------- - * protoSignalComputation2_fx() + * protoSignalComputation2() * * *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED void protoSignalComputation2_fx( Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], Word32 ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], @@ -2821,6 +2895,7 @@ void protoSignalComputation2_fx( scale_sig32( proto_power_smooth_fx, i_mult( 2, num_freq_bands ), sub( q_shift, 1 ) ); } *q_proto_power_smooth = add( *q_proto_power_smooth, sub( q_shift, 1 ) ); + move16(); IF( isloudspeaker ) { @@ -2918,24 +2993,31 @@ void protoSignalComputation2_fx( p_proto_buffer_fx = proto_direct_buffer_f_fx + i_mult( i_mult( i_mult( slot_index, 2 ), num_freq_bands ), 2 ); left_bb_power_fx = 0; + move32(); right_bb_power_fx = 0; + move32(); total_bb_power_fx = 0; + move32(); left_hi_power_fx = 0; + move32(); right_hi_power_fx = 0; + move32(); total_hi_power_fx = 0; + move32(); dipole_freq_range[0] = stereo_type_detect->dipole_freq_range[0]; + move16(); dipole_freq_range[1] = stereo_type_detect->dipole_freq_range[1]; + move16(); a_fx = 21474836; /*0.01 in Q31*/ /* Temporal smoothing coefficient */ move32(); b_fx = L_sub( ONE_IN_Q31, a_fx ); /* Temporal smoothing coefficient */ // a2_fx = 214748365; /*0.1 in Q31*/ /* Temporal smoothing coefficient */ - move32(); // b2_fx = L_sub( ONE_IN_Q31, a2_fx ); /* Temporal smoothing coefficient */ - IF( GT_16( stereo_type_detect->interpolator, 0 ) ) + IF( stereo_type_detect->interpolator > 0 ) { IF( EQ_16( stereo_type_detect->type_change_direction, MASA_STEREO_SPACED_MICS ) ) { @@ -2954,9 +3036,7 @@ void protoSignalComputation2_fx( min_q_shift = sub( min_q_shift, idiv1616( find_guarded_bits_fx( num_freq_bands ), 2 ) ); q_temp = sub( add( add( q_cldfb, min_q_shift ), add( q_cldfb, min_q_shift ) ), 31 ); - move16(); q_temp2 = sub( add( add( q_cldfb, temp_q_shift ), add( q_cldfb, temp_q_shift ) ), 31 ); - move16(); FOR( l = 0; l < num_freq_bands; l++ ) { @@ -3025,7 +3105,7 @@ void protoSignalComputation2_fx( move32(); } - IF( EQ_16( l, 0 ) ) + IF( l == 0 ) { RealSubtract_fx = L_sub( re1, re2 ); ImagSubtract_fx = L_sub( im1, im2 ); @@ -3034,19 +3114,21 @@ void protoSignalComputation2_fx( IF( LT_16( q_temp, stereo_type_detect->q_subtract_power_y ) ) { stereo_type_detect->subtract_power_y_fx = L_add( L_shr( stereo_type_detect->subtract_power_y_fx, sub( stereo_type_detect->q_subtract_power_y, q_temp ) ), temp ); + move32(); stereo_type_detect->q_subtract_power_y = q_temp; move16(); } ELSE { stereo_type_detect->subtract_power_y_fx = L_add( stereo_type_detect->subtract_power_y_fx, L_shr( temp, sub( q_temp, stereo_type_detect->q_subtract_power_y ) ) ); + move32(); } } /* Compute protos (and their power) for direct sound rendering */ /* W prototype */ - IF( GT_16( stereo_type_detect->interpolator, 0 ) ) + IF( stereo_type_detect->interpolator > 0 ) { IF( L_or( LT_16( l, sub( dipole_freq_range[1], 1 ) ), GE_16( l, MASA_SUM_PROTO_START_BIN ) ) ) { @@ -3065,9 +3147,9 @@ void protoSignalComputation2_fx( move32(); } - p_proto_buffer_fx[i_mult( 2, l )] = Real_aux_fx; + p_proto_buffer_fx[2 * l] = Real_aux_fx; move32(); - p_proto_buffer_fx[add( i_mult( 2, l ), 1 )] = Imag_aux_fx; + p_proto_buffer_fx[add( 2 * l, 1 )] = Imag_aux_fx; move32(); } ELSE @@ -3087,9 +3169,9 @@ void protoSignalComputation2_fx( move32(); } - p_proto_buffer_fx[i_mult( 2, l )] = Madd_32_16( Mpy_32_16_1( re1, interpolatorSpaced_fx ), Real_aux_fx, interpolatorDmx_fx ); + p_proto_buffer_fx[2 * l] = Madd_32_16( Mpy_32_16_1( re1, interpolatorSpaced_fx ), Real_aux_fx, interpolatorDmx_fx ); move32(); - p_proto_buffer_fx[add( i_mult( 2, l ), 1 )] = Madd_32_16( Mpy_32_16_1( im1, interpolatorSpaced_fx ), Imag_aux_fx, interpolatorDmx_fx ); + p_proto_buffer_fx[add( 2 * l, 1 )] = Madd_32_16( Mpy_32_16_1( im1, interpolatorSpaced_fx ), Imag_aux_fx, interpolatorDmx_fx ); move32(); } } @@ -3112,9 +3194,9 @@ void protoSignalComputation2_fx( move32(); } - p_proto_buffer_fx[i_mult( 2, l )] = Real_aux_fx; + p_proto_buffer_fx[2 * l] = Real_aux_fx; move32(); - p_proto_buffer_fx[add( i_mult( 2, l ), 1 )] = Imag_aux_fx; + p_proto_buffer_fx[add( 2 * l, 1 )] = Imag_aux_fx; move32(); } ELSE @@ -3131,9 +3213,9 @@ void protoSignalComputation2_fx( move32(); } - p_proto_buffer_fx[i_mult( 2, l )] = re1; + p_proto_buffer_fx[2 * l] = re1; move32(); - p_proto_buffer_fx[add( i_mult( 2, l ), 1 )] = im1; + p_proto_buffer_fx[add( 2 * l, 1 )] = im1; move32(); } } @@ -3151,20 +3233,20 @@ void protoSignalComputation2_fx( move32(); } - p_proto_buffer_fx[i_mult( 2, l )] = Real_aux_fx; + p_proto_buffer_fx[2 * l] = Real_aux_fx; move32(); - p_proto_buffer_fx[add( i_mult( 2, l ), 1 )] = Imag_aux_fx; + p_proto_buffer_fx[add( 2 * l, 1 )] = Imag_aux_fx; move32(); } /* Y prototype */ - IF( GT_16( stereo_type_detect->interpolator, 0 ) ) + IF( stereo_type_detect->interpolator > 0 ) { IF( LT_16( l, dipole_freq_range[0] ) ) { - p_proto_buffer_fx[i_mult( 2, add( num_freq_bands, l ) )] = Madd_32_16( Mpy_32_16_1( p_proto_buffer_fx[i_mult( 2, l )], interpolatorSpaced_fx ), L_sub( re1, re2 ), interpolatorDmx_fx ); + p_proto_buffer_fx[i_mult( 2, add( num_freq_bands, l ) )] = Madd_32_16( Mpy_32_16_1( p_proto_buffer_fx[2 * l], interpolatorSpaced_fx ), L_sub( re1, re2 ), interpolatorDmx_fx ); move32(); - p_proto_buffer_fx[add( i_mult( 2, add( num_freq_bands, l ) ), 1 )] = Madd_32_16( Mpy_32_16_1( p_proto_buffer_fx[add( i_mult( 2, l ), 1 )], interpolatorSpaced_fx ), L_sub( im1, im2 ), interpolatorDmx_fx ); + p_proto_buffer_fx[add( i_mult( 2, add( num_freq_bands, l ) ), 1 )] = Madd_32_16( Mpy_32_16_1( p_proto_buffer_fx[add( 2 * l, 1 )], interpolatorSpaced_fx ), L_sub( im1, im2 ), interpolatorDmx_fx ); move32(); } ELSE IF( LT_16( l, dipole_freq_range[1] ) ) @@ -3176,9 +3258,9 @@ void protoSignalComputation2_fx( } ELSE { - p_proto_buffer_fx[i_mult( 2, add( num_freq_bands, l ) )] = Madd_32_16( Mpy_32_16_1( p_proto_buffer_fx[i_mult( 2, l )], interpolatorSpaced_fx ), L_sub( re1, re2 ), interpolatorDmx_fx ); + p_proto_buffer_fx[i_mult( 2, add( num_freq_bands, l ) )] = Madd_32_16( Mpy_32_16_1( p_proto_buffer_fx[2 * l], interpolatorSpaced_fx ), L_sub( re1, re2 ), interpolatorDmx_fx ); move32(); - p_proto_buffer_fx[add( i_mult( 2, add( num_freq_bands, l ) ), 1 )] = Madd_32_16( Mpy_32_16_1( p_proto_buffer_fx[add( i_mult( 2, l ), 1 )], interpolatorSpaced_fx ), L_sub( im1, im2 ), interpolatorDmx_fx ); + p_proto_buffer_fx[add( i_mult( 2, add( num_freq_bands, l ) ), 1 )] = Madd_32_16( Mpy_32_16_1( p_proto_buffer_fx[add( 2 * l, 1 )], interpolatorSpaced_fx ), L_sub( im1, im2 ), interpolatorDmx_fx ); move32(); } @@ -3198,9 +3280,9 @@ void protoSignalComputation2_fx( { IF( LT_16( l, dipole_freq_range[0] ) ) /* proto = W */ { - p_proto_buffer_fx[i_mult( 2, add( num_freq_bands, l ) )] = p_proto_buffer_fx[i_mult( 2, l )]; + p_proto_buffer_fx[i_mult( 2, add( num_freq_bands, l ) )] = p_proto_buffer_fx[2 * l]; move32(); - p_proto_buffer_fx[add( i_mult( 2, add( num_freq_bands, l ) ), 1 )] = p_proto_buffer_fx[add( i_mult( 2, l ), 1 )]; + p_proto_buffer_fx[add( i_mult( 2, add( num_freq_bands, l ) ), 1 )] = p_proto_buffer_fx[add( 2 * l, 1 )]; move32(); proto_power_smooth_fx[add( l, num_freq_bands )] = proto_power_smooth_fx[l]; move32(); @@ -3226,9 +3308,9 @@ void protoSignalComputation2_fx( } ELSE /* proto = W */ { - p_proto_buffer_fx[i_mult( 2, add( num_freq_bands, l ) )] = p_proto_buffer_fx[i_mult( 2, l )]; + p_proto_buffer_fx[i_mult( 2, add( num_freq_bands, l ) )] = p_proto_buffer_fx[2 * l]; move32(); - p_proto_buffer_fx[add( i_mult( 2, add( num_freq_bands, l ) ), 1 )] = p_proto_buffer_fx[add( i_mult( 2, l ), 1 )]; + p_proto_buffer_fx[add( i_mult( 2, add( num_freq_bands, l ) ), 1 )] = p_proto_buffer_fx[add( 2 * l, 1 )]; move32(); proto_power_smooth_fx[add( l, num_freq_bands )] = proto_power_smooth_fx[l]; move32(); @@ -3255,9 +3337,9 @@ void protoSignalComputation2_fx( } /* Compute protos for decorrelation */ - proto_frame_f_fx[i_mult( 2, l )] = Real_aux_fx; + proto_frame_f_fx[2 * l] = Real_aux_fx; move32(); - proto_frame_f_fx[i_mult( 2, l ) + 1] = Imag_aux_fx; + proto_frame_f_fx[add( 2 * l, 1 )] = Imag_aux_fx; move32(); proto_frame_f_fx[add( i_mult( 2, num_freq_bands ), i_mult( 2, l ) )] = re1; move32(); @@ -3270,11 +3352,13 @@ void protoSignalComputation2_fx( } stereo_type_detect->q_sum_power = s_min( stereo_type_detect->q_sum_power, q_temp2 ); + move16(); stereo_type_detect->q_total_power = s_min( stereo_type_detect->q_total_power, q_temp ); + move16(); q_sum_total_ratio = Q15; move16(); - IF( GT_16( stereo_type_detect->interpolator, 0 ) ) + IF( stereo_type_detect->interpolator > 0 ) { stereo_type_detect->interpolator++; IF( EQ_16( stereo_type_detect->interpolator, MASA_STEREO_INTERPOLATION_SLOTS ) ) @@ -3282,6 +3366,7 @@ void protoSignalComputation2_fx( stereo_type_detect->interpolator = 0; move16(); stereo_type_detect->current_stereo_type = stereo_type_detect->type_change_direction; + move32(); } } @@ -3289,47 +3374,57 @@ void protoSignalComputation2_fx( IF( LT_16( q_temp, stereo_type_detect->q_left_bb_power ) ) { stereo_type_detect->left_bb_power_fx = L_add( temp, L_shr( Mpy_32_32( b_fx, stereo_type_detect->left_bb_power_fx ), sub( stereo_type_detect->q_left_bb_power, q_temp ) ) ); + move32(); stereo_type_detect->q_left_bb_power = q_temp; move16(); } ELSE { stereo_type_detect->left_bb_power_fx = L_add( L_shr( temp, sub( q_temp, stereo_type_detect->q_left_bb_power ) ), Mpy_32_32( b_fx, stereo_type_detect->left_bb_power_fx ) ); + move32(); } temp = Mpy_32_32( a_fx, right_bb_power_fx ); IF( LT_16( q_temp, stereo_type_detect->q_right_bb_power ) ) { stereo_type_detect->right_bb_power_fx = L_add( temp, L_shr( Mpy_32_32( b_fx, stereo_type_detect->right_bb_power_fx ), sub( stereo_type_detect->q_right_bb_power, q_temp ) ) ); + move32(); stereo_type_detect->q_right_bb_power = q_temp; move16(); } ELSE { stereo_type_detect->right_bb_power_fx = L_add( L_shr( temp, sub( q_temp, stereo_type_detect->q_right_bb_power ) ), Mpy_32_32( b_fx, stereo_type_detect->right_bb_power_fx ) ); + move32(); } temp = Mpy_32_32( a_fx, total_bb_power_fx ); IF( LT_16( q_temp, stereo_type_detect->q_total_bb_power ) ) { stereo_type_detect->total_bb_power_fx = L_add( temp, L_shr( Mpy_32_32( b_fx, stereo_type_detect->total_bb_power_fx ), sub( stereo_type_detect->q_total_bb_power, q_temp ) ) ); + move32(); stereo_type_detect->q_total_bb_power = q_temp; move16(); } ELSE { stereo_type_detect->total_bb_power_fx = L_add( L_shr( temp, sub( q_temp, stereo_type_detect->q_total_bb_power ) ), Mpy_32_32( b_fx, stereo_type_detect->total_bb_power_fx ) ); + move32(); } IF( LT_16( stereo_type_detect->q_left_bb_power, stereo_type_detect->q_right_bb_power ) ) { lr_bb_power_fx = L_min( stereo_type_detect->left_bb_power_fx, L_shr( stereo_type_detect->right_bb_power_fx, sub( stereo_type_detect->q_right_bb_power, stereo_type_detect->q_left_bb_power ) ) ); + move32(); q_lr_bb_power = stereo_type_detect->q_left_bb_power; + move16(); } ELSE { lr_bb_power_fx = L_min( L_shr( stereo_type_detect->left_bb_power_fx, sub( stereo_type_detect->q_left_bb_power, stereo_type_detect->q_right_bb_power ) ), stereo_type_detect->right_bb_power_fx ); + move32(); q_lr_bb_power = stereo_type_detect->q_right_bb_power; + move16(); } q_lr_bb_power = sub( q_lr_bb_power, 1 ); /* = (lr_bb_power_fx * 2) */ @@ -3347,46 +3442,54 @@ void protoSignalComputation2_fx( IF( LT_16( q_temp, stereo_type_detect->q_left_hi_power ) ) { stereo_type_detect->left_hi_power_fx = L_add( temp, L_shr( Mpy_32_32( b_fx, stereo_type_detect->left_hi_power_fx ), sub( stereo_type_detect->q_left_hi_power, q_temp ) ) ); + move32(); stereo_type_detect->q_left_hi_power = q_temp; move16(); } ELSE { stereo_type_detect->left_hi_power_fx = L_add( L_shr( temp, sub( q_temp, stereo_type_detect->q_left_hi_power ) ), Mpy_32_32( b_fx, stereo_type_detect->left_hi_power_fx ) ); + move32(); } temp = Mpy_32_32( a_fx, right_hi_power_fx ); IF( LT_16( q_temp, stereo_type_detect->q_right_hi_power ) ) { stereo_type_detect->right_hi_power_fx = L_add( temp, L_shr( Mpy_32_32( b_fx, stereo_type_detect->right_hi_power_fx ), sub( stereo_type_detect->q_right_hi_power, q_temp ) ) ); + move32(); stereo_type_detect->q_right_hi_power = q_temp; move16(); } ELSE { stereo_type_detect->right_hi_power_fx = L_add( L_shr( temp, sub( q_temp, stereo_type_detect->q_right_hi_power ) ), Mpy_32_32( b_fx, stereo_type_detect->right_hi_power_fx ) ); + move32(); } temp = Mpy_32_32( a_fx, total_hi_power_fx ); IF( LT_16( q_temp, stereo_type_detect->q_total_hi_power ) ) { stereo_type_detect->total_hi_power_fx = L_add( temp, L_shr( Mpy_32_32( b_fx, stereo_type_detect->total_hi_power_fx ), sub( stereo_type_detect->q_total_hi_power, q_temp ) ) ); + move32(); stereo_type_detect->q_total_hi_power = q_temp; move16(); } ELSE { stereo_type_detect->total_hi_power_fx = L_add( L_shr( temp, sub( q_temp, stereo_type_detect->q_total_hi_power ) ), Mpy_32_32( b_fx, stereo_type_detect->total_hi_power_fx ) ); + move32(); } IF( LT_16( stereo_type_detect->q_left_hi_power, stereo_type_detect->q_right_hi_power ) ) { lr_hi_power_fx = L_min( stereo_type_detect->left_hi_power_fx, L_shr( stereo_type_detect->right_hi_power_fx, sub( stereo_type_detect->q_right_hi_power, stereo_type_detect->q_left_hi_power ) ) ); + move32(); q_lr_hi_power = stereo_type_detect->q_left_hi_power; } ELSE { lr_hi_power_fx = L_min( L_shr( stereo_type_detect->left_hi_power_fx, sub( stereo_type_detect->q_left_hi_power, stereo_type_detect->q_right_hi_power ) ), stereo_type_detect->right_hi_power_fx ); + move32(); q_lr_hi_power = stereo_type_detect->q_right_hi_power; } q_lr_hi_power = sub( q_lr_hi_power, 1 ); /* = (q_lr_hi_power * 2) */ @@ -3425,7 +3528,6 @@ void protoSignalComputation2_fx( p_proto_buffer_fx = proto_direct_buffer_f_fx + i_mult( i_mult( i_mult( slot_index, 2 ), num_freq_bands ), 2 ); q_temp = sub( add( add( q_cldfb, min_q_shift ), add( q_cldfb, min_q_shift ) ), 31 ); - move16(); FOR( l = 0; l < num_freq_bands; l++ ) { @@ -3438,6 +3540,7 @@ void protoSignalComputation2_fx( Imag_aux_fx = L_add( im1, im2 ); reference_power_fx[l] = Madd_32_32( Mpy_32_32( Real_aux_fx, Real_aux_fx ), Imag_aux_fx, Imag_aux_fx ); + move32(); IF( LT_16( q_temp, *q_proto_power_smooth ) ) { @@ -3450,9 +3553,9 @@ void protoSignalComputation2_fx( move32(); } - p_proto_buffer_fx[i_mult( 2, l )] = Real_aux_fx; + p_proto_buffer_fx[2 * l] = Real_aux_fx; move32(); - p_proto_buffer_fx[add( i_mult( 2, l ), 1 )] = Imag_aux_fx; + p_proto_buffer_fx[add( 2 * l, 1 )] = Imag_aux_fx; move32(); p_proto_buffer_fx[i_mult( 2, add( num_freq_bands, l ) )] = L_sub( re1, re2 ); @@ -3472,9 +3575,9 @@ void protoSignalComputation2_fx( move32(); } - proto_frame_f_fx[i_mult( 2, l )] = Real_aux_fx; + proto_frame_f_fx[2 * l] = Real_aux_fx; move32(); - proto_frame_f_fx[add( i_mult( 2, l ), 1 )] = Imag_aux_fx; + proto_frame_f_fx[add( 2 * l, 1 )] = Imag_aux_fx; move32(); proto_frame_f_fx[add( i_mult( 2, num_freq_bands ), i_mult( 2, l ) )] = re1; @@ -3489,20 +3592,17 @@ void protoSignalComputation2_fx( } *q_proto_frame_f = add( q_cldfb, min_q_shift ); + move16(); *q_proto_direct_buffer_f = add( q_cldfb, min_q_shift ); + move16(); *q_proto_power_smooth = s_min( *q_proto_power_smooth, q_temp ); + move16(); *q_reference_power = q_temp; move16(); return; } #else -/*------------------------------------------------------------------------- - * protoSignalComputation2() - * - * - *-------------------------------------------------------------------------*/ - void protoSignalComputation2( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], @@ -3823,13 +3923,15 @@ void protoSignalComputation2( return; } #endif -#ifdef IVAS_FLOAT_FIXED + + /*------------------------------------------------------------------------- - * protoSignalComputation4_fx() + * protoSignalComputation4() * * *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED void protoSignalComputation4_fx( Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], Word32 ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], @@ -3892,6 +3994,7 @@ void protoSignalComputation4_fx( } sq_tmp_q = sub( add( add( q_cldfb, min_q_shift ), add( q_cldfb, min_q_shift ) ), 31 ); *reference_power_q = sub( add( sq_tmp_q, Q15 ), 15 ); + move16(); min_q_shift = sub( q_shift, find_guarded_bits_fx( 2 ) ); @@ -3920,6 +4023,7 @@ void protoSignalComputation4_fx( } } *proto_frame_f_q = sub( add( add( min_q_shift, q_cldfb ), Q29 ), 31 ); + move16(); /* calculate the shift possible to up scale the buffer proto_power_smooth_fx*/ min_q_shift = getScaleFactor32( proto_power_smooth_fx, i_mult( num_outputs_diff, num_freq_bands ) ); @@ -3927,6 +4031,7 @@ void protoSignalComputation4_fx( Scale_sig32( proto_power_smooth_fx, i_mult( num_outputs_diff, num_freq_bands ), min_q_shift ); *proto_power_smooth_q = add( *proto_power_smooth_q, min_q_shift ); + move16(); proto_power_smooth_fx_q = *proto_power_smooth_q; move16(); @@ -3936,6 +4041,7 @@ void protoSignalComputation4_fx( Scale_sig32( proto_frame_f_fx, i_mult( 2, i_mult( num_outputs_diff, num_freq_bands ) ), min_q_shift ); *proto_frame_f_q = add( *proto_frame_f_q, min_q_shift ); + move16(); offset = i_mult( i_mult( slot_index, 2 ), i_mult( num_freq_bands, num_outputs_diff ) ); p_proto_buffer_fx = proto_direct_buffer_f_fx + offset; @@ -3979,12 +4085,6 @@ void protoSignalComputation4_fx( return; } #else -/*------------------------------------------------------------------------- - * protoSignalComputation4() - * - * - *-------------------------------------------------------------------------*/ - void protoSignalComputation4( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], @@ -4045,6 +4145,7 @@ void protoSignalComputation4( } #endif + /*------------------------------------------------------------------------- * ivas_dirac_dec_compute_diffuse_proto() * @@ -4095,7 +4196,7 @@ void ivas_dirac_dec_compute_diffuse_proto_fx( smooth_e = sub( 31, h_dirac_output_synthesis_state->proto_power_diff_smooth_q ); proto_e = sub( 31, hDirACRend->proto_frame_dec_f_q ); - IF( hDirACRend->synthesisConf != DIRAC_SYNTHESIS_PSD_SHD ) + IF( NE_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_PSD_SHD ) ) { diff_square_e = add( shl( proto_e, 1 ), 1 ); max_e = add( s_max( diff_square_e, smooth_e ), 1 ); @@ -4106,13 +4207,16 @@ void ivas_dirac_dec_compute_diffuse_proto_fx( FOR( l = 0; l < num_freq_bands_diff; l++ ) { *p_diff_buffer_fx = *( p_proto_diff_fx++ ); + move32(); *p_diff_buffer_1_fx = *( p_proto_diff_fx++ ); + move32(); - diff_square = Mpy_32_32( *p_diff_buffer_fx, *p_diff_buffer_fx ) >> 1; // 2 * proto_e + 1 - diff_square_1 = Mpy_32_32( *p_diff_buffer_1_fx, *p_diff_buffer_1_fx ) >> 1; // 2 * proto_e + 1 + diff_square = L_shr( Mpy_32_32( *p_diff_buffer_fx, *p_diff_buffer_fx ), 1 ); // 2 * proto_e + 1 + diff_square_1 = L_shr( Mpy_32_32( *p_diff_buffer_1_fx, *p_diff_buffer_1_fx ), 1 ); // 2 * proto_e + 1 diff_square_sum = L_add( diff_square, diff_square_1 ); diff_square_sum = L_shr( diff_square_sum, sub( max_e, diff_square_e ) ); *p_power_smooth_fx = L_add( *p_power_smooth_fx, diff_square_sum ); + move32(); p_power_smooth_fx++; p_diff_buffer_fx += 2; @@ -4120,6 +4224,7 @@ void ivas_dirac_dec_compute_diffuse_proto_fx( } } diff_e = proto_e; + move16(); } ELSE { @@ -4136,13 +4241,17 @@ void ivas_dirac_dec_compute_diffuse_proto_fx( p_proto_diff_fx = proto_frame_dec_f_fx + shl( l, 1 ); *p_diff_buffer_fx = 0; + move32(); *p_diff_buffer_1_fx = 0; + move32(); /*LS to HOA*/ FOR( m = 0; m < hDirACRend->num_outputs_diff; m++ ) { *p_diff_buffer_fx = L_add( *p_diff_buffer_fx, L_shr( Mpy_32_32( *p_hoa_enc_fx, *p_proto_diff_fx ), gb ) ); + move32(); *p_diff_buffer_1_fx = L_add( *p_diff_buffer_1_fx, L_shr( Mpy_32_32( *p_hoa_enc_fx, *( p_proto_diff_fx + 1 ) ), gb ) ); + move32(); p_hoa_enc_fx += hDirACRend->hOutSetup.nchan_out_woLFE; p_proto_diff_fx += shl( num_freq_bands, 1 ); } @@ -4150,8 +4259,9 @@ void ivas_dirac_dec_compute_diffuse_proto_fx( diff_square = L_shr( Mpy_32_32( *p_diff_buffer_fx, *p_diff_buffer_fx ), 1 ); // 2*(2 + proto_e + gb) + 1 diff_square_1 = L_shr( Mpy_32_32( *p_diff_buffer_1_fx, *p_diff_buffer_1_fx ), 1 ); // 2*(2 + proto_e + gb) + 1 diff_square_sum = L_add( diff_square, diff_square_1 ); - diff_square_sum = L_shr( diff_square_sum, max_e - diff_square_e ); + diff_square_sum = L_shr( diff_square_sum, sub( max_e, diff_square_e ) ); *p_power_smooth_fx = L_add( *p_power_smooth_fx, diff_square_sum ); + move32(); p_power_smooth_fx++; @@ -4162,6 +4272,7 @@ void ivas_dirac_dec_compute_diffuse_proto_fx( diff_e = add( proto_e, gb ); } h_dirac_output_synthesis_state->proto_power_diff_smooth_q = sub( 31, max_e ); + move16(); Word16 new_diff_e = s_max( diff_e, old_diff_e ); Scale_sig32( h_dirac_output_synthesis_state->proto_diffuse_buffer_f_fx, diffuse_start, sub( old_diff_e, new_diff_e ) ); @@ -4173,6 +4284,7 @@ void ivas_dirac_dec_compute_diffuse_proto_fx( sub( h_dirac_output_synthesis_state->proto_diffuse_buffer_f_len, diffuse_start ), sub( diff_e, new_diff_e ) ); #endif h_dirac_output_synthesis_state->proto_diffuse_buffer_f_q = sub( 31, new_diff_e ); + move16(); return; } @@ -4254,12 +4366,13 @@ void ivas_dirac_dec_compute_diffuse_proto( } #endif -#ifdef IVAS_FLOAT_FIXED + /*------------------------------------------------------------------------- - * computeDirectionAngles_fx() + * computeDirectionAngles() * *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED void computeDirectionAngles_fx( Word32 *intensity_real_x_fx, Word32 *intensity_real_y_fx, @@ -4343,23 +4456,30 @@ void computeDirectionAngles_fx( temp = BASOP_Util_Add_Mant32Exp( tmp1, sub( 31, q_tmp1 ), tmp2, sub( 31, q_tmp2 ), &exp ); radius = Sqrt32( temp, &exp ); - res = BASOP_util_atan2( y, x, sub( sub( 31, q_y ), sub( 31, q_x ) ) ); // Q13 - azimuth[k] = add( s_max( -23040, s_min( 23040, mult( res, _180_OVER_PI_Q9 ) ) ), 64 ) / ONE_IN_Q7; // Q0; + res = BASOP_util_atan2( y, x, sub( sub( 31, q_y ), sub( 31, q_x ) ) ); /* Q13 */ + res = add( s_max( -23040, s_min( 23040, mult( res, _180_OVER_PI_Q9 ) ) ), 64 ); /* Q7 */ + azimuth[k] = shr( abs_s( res ), Q7 ); /* Q0 */ move16(); + IF( res < 0 ) + { + azimuth[k] = negate( azimuth[k] ); + move16(); + } - res = BASOP_util_atan2( z, radius, sub( sub( 31, q_z ), exp ) ); // Q13 - elevation[k] = add( s_max( -11520, s_min( 23040, mult( res, _180_OVER_PI_Q9 ) ) ), 64 ) / ONE_IN_Q7; // Q0; + res = BASOP_util_atan2( z, radius, sub( sub( 31, q_z ), exp ) ); /* Q13 */ + res = add( s_max( -11520, s_min( 23040, mult( res, _180_OVER_PI_Q9 ) ) ), 64 ); /* Q7 */ + elevation[k] = shr( abs_s( res ), Q7 ); /* Q0 */ move16(); + IF( res < 0 ) + { + elevation[k] = negate( elevation[k] ); + move16(); + } } return; } #else -/*------------------------------------------------------------------------- - * computeDirectionAngles() - * - *------------------------------------------------------------------------*/ - void computeDirectionAngles( float *intensity_real_x, float *intensity_real_y, @@ -4416,48 +4536,79 @@ void ivas_masa_init_stereotype_detection_fx( MASA_STEREO_TYPE_DETECT *stereo_type_detect ) { stereo_type_detect->masa_stereo_type = MASA_STEREO_DOWNMIX; + move32(); stereo_type_detect->current_stereo_type = MASA_STEREO_DOWNMIX; + move32(); stereo_type_detect->type_change_direction = MASA_STEREO_DOWNMIX; + move32(); stereo_type_detect->counter = 0; + move16(); stereo_type_detect->interpolator = 0; + move16(); stereo_type_detect->dipole_freq_range[0] = 1; + move16(); stereo_type_detect->dipole_freq_range[1] = 3; + move16(); stereo_type_detect->left_bb_power_fx = 0; /* Broadband estimates */ + move32(); stereo_type_detect->q_left_bb_power = Q31; + move16(); stereo_type_detect->right_bb_power_fx = 0; + move32(); stereo_type_detect->q_right_bb_power = Q31; + move16(); stereo_type_detect->total_bb_power_fx = 0; + move32(); stereo_type_detect->q_total_bb_power = Q31; + move16(); stereo_type_detect->left_hi_power_fx = 0; /* High-frequency estimates */ + move32(); stereo_type_detect->q_left_hi_power = Q31; + move16(); stereo_type_detect->right_hi_power_fx = 0; + move32(); stereo_type_detect->q_right_hi_power = Q31; + move16(); stereo_type_detect->total_hi_power_fx = 0; + move32(); stereo_type_detect->q_total_hi_power = Q31; + move16(); set32_fx( stereo_type_detect->sum_power_fx, 0, MASA_SUM_FREQ_RANGE_BINS ); set32_fx( stereo_type_detect->total_power_fx, 0, MASA_SUM_FREQ_RANGE_BINS ); stereo_type_detect->q_sum_power = Q31; + move16(); stereo_type_detect->q_total_power = Q31; + move16(); stereo_type_detect->subtract_power_y_fx = 0; + move32(); stereo_type_detect->q_subtract_power_y = Q31; + move16(); stereo_type_detect->subtract_power_y_smooth_fx = 0; + move32(); stereo_type_detect->q_subtract_power_y_smooth = Q31; + move16(); stereo_type_detect->target_power_y_smooth_fx = 0; + move32(); #ifdef MSAN_FIX stereo_type_detect->q_target_power_y_smooth = 31; + move16(); #endif stereo_type_detect->lr_total_bb_ratio_db_fx = 0; + move32(); stereo_type_detect->lr_total_hi_ratio_db_fx = 0; + move32(); stereo_type_detect->min_sum_total_ratio_db_fx = 0; + move32(); stereo_type_detect->subtract_target_ratio_db_fx = 0; + move32(); return; } @@ -4500,13 +4651,13 @@ void ivas_masa_init_stereotype_detection( #endif -#ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- - * ivas_masa_stereotype_detection_fx() + * ivas_masa_stereotype_detection() * * Detect the type of the transport audio signals *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED void ivas_masa_stereotype_detection_fx( MASA_STEREO_TYPE_DETECT *stereo_type_detect ) { @@ -4563,7 +4714,7 @@ void ivas_masa_stereotype_detection_fx( /* Determine if the determined features match the downmix type, according to a metric */ change_to_downmix_selection = 0; move16(); - IF( GT_32( subtract_target_ratio_db_fx, 0 ) ) + IF( subtract_target_ratio_db_fx > 0 ) { /* subtract_temp = subtract_target_ratio_db / 3.0f; */ subtract_temp_fx = Mpy_32_32( subtract_target_ratio_db_fx, 715827883 /* 1 / 3.0f in Q31 */ ); /* Q21 */ @@ -4613,35 +4764,29 @@ void ivas_masa_stereotype_detection_fx( IF( EQ_16( change_to_spaced_selection, 1 ) ) { stereo_type_detect->masa_stereo_type = MASA_STEREO_SPACED_MICS; - move16(); + move32(); } ELSE IF( EQ_16( change_to_downmix_selection, 1 ) ) { stereo_type_detect->masa_stereo_type = MASA_STEREO_DOWNMIX; - move16(); + move32(); } } - IF( EQ_16( stereo_type_detect->interpolator, 0 ) ) + IF( stereo_type_detect->interpolator == 0 ) { IF( NE_16( stereo_type_detect->current_stereo_type, stereo_type_detect->masa_stereo_type ) ) { stereo_type_detect->interpolator = 1; move16(); stereo_type_detect->type_change_direction = stereo_type_detect->masa_stereo_type; - move16(); + move32(); } } return; } #else -/*------------------------------------------------------------------------- - * ivas_masa_stereotype_detection() - * - * Detect the type of the transport audio signals - *------------------------------------------------------------------------*/ - void ivas_masa_stereotype_detection( MASA_STEREO_TYPE_DETECT *stereo_type_detect ) { @@ -4735,13 +4880,14 @@ void ivas_masa_stereotype_detection( } #endif -#ifdef IVAS_FLOAT_FIXED + /*------------------------------------------------------------------------- * computeIntensityVector_dec() * * *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED void computeIntensityVector_dec_fx( Word32 Cldfb_RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], Word32 Cldfb_ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], @@ -4761,6 +4907,7 @@ void computeIntensityVector_dec_fx( Word16 min_q_shift; min_q_shift = Q31; + move32(); /* calculate the max possible shift for the buffers Cldfb_RealBuffer_fx and Cldfb_ImagBuffer_fx*/ FOR( i = 0; i < 4; i++ ) { @@ -4793,16 +4940,11 @@ void computeIntensityVector_dec_fx( } *q_intensity_real = sub( add( add( q_cldfb, min_q_shift ), add( q_cldfb, min_q_shift ) ), 31 ); + move16(); return; } #else -/*------------------------------------------------------------------------- - * computeIntensityVector_dec() - * - * - *------------------------------------------------------------------------*/ - void computeIntensityVector_dec( float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], @@ -4831,13 +4973,14 @@ void computeIntensityVector_dec( } #endif -#ifdef IVAS_FLOAT_FIXED + /*------------------------------------------------------------------------- - * ivas_lfe_synth_with_cldfb_fx() + * ivas_lfe_synth_with_cldfb() * * *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED void ivas_lfe_synth_with_cldfb_fx( MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth, Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], @@ -4870,12 +5013,12 @@ void ivas_lfe_synth_with_cldfb_fx( FOR( i = 0; i < nchan_transport; i++ ) { - IF( RealBuffer_fx[i][0][0] ) + if ( RealBuffer_fx[i][0][0] ) { exp = norm_l( RealBuffer_fx[i][0][0] ); } min_q_shift = s_min( min_q_shift, exp ); - IF( ImagBuffer_fx[i][0][0] ) + if ( ImagBuffer_fx[i][0][0] ) { exp = norm_l( ImagBuffer_fx[i][0][0] ); } @@ -4913,21 +5056,33 @@ void ivas_lfe_synth_with_cldfb_fx( targetEneTrans_q = sub( add( transportEne_q, Q14 ), 15 ); hMasaLfeSynth->transportEneSmooth_fx = Mpy_32_16_1( hMasaLfeSynth->transportEneSmooth_fx, MCMASA_LFE_SYNTH_ALPHA_Q15 ); + move32(); hMasaLfeSynth->protoLfeEneSmooth_fx = Mpy_32_16_1( hMasaLfeSynth->protoLfeEneSmooth_fx, MCMASA_LFE_SYNTH_ALPHA_Q15 ); + move32(); hMasaLfeSynth->targetEneLfeSmooth_fx = Mpy_32_16_1( hMasaLfeSynth->targetEneLfeSmooth_fx, MCMASA_LFE_SYNTH_ALPHA_Q15 ); + move32(); hMasaLfeSynth->targetEneTransSmooth_fx = Mpy_32_16_1( hMasaLfeSynth->targetEneTransSmooth_fx, MCMASA_LFE_SYNTH_ALPHA_Q15 ); + move32(); hMasaLfeSynth->transportEneSmooth_fx = BASOP_Util_Add_Mant32Exp( hMasaLfeSynth->transportEneSmooth_fx, sub( 31, hMasaLfeSynth->transportEneSmooth_q ), transportEne_fx, sub( 31, transportEne_q ), &temp_q ); + move32(); hMasaLfeSynth->transportEneSmooth_q = sub( 31, temp_q ); + move16(); hMasaLfeSynth->protoLfeEneSmooth_fx = BASOP_Util_Add_Mant32Exp( hMasaLfeSynth->protoLfeEneSmooth_fx, sub( 31, hMasaLfeSynth->protoLfeEneSmooth_q ), protoLfeEne_fx, sub( 31, protoLfeEne_q ), &temp_q ); + move32(); hMasaLfeSynth->protoLfeEneSmooth_q = sub( 31, temp_q ); + move16(); hMasaLfeSynth->targetEneLfeSmooth_fx = BASOP_Util_Add_Mant32Exp( hMasaLfeSynth->targetEneLfeSmooth_fx, sub( 31, hMasaLfeSynth->targetEneLfeSmooth_q ), targetEneLfe_fx, sub( 31, targetEneLfe_q ), &temp_q ); + move32(); hMasaLfeSynth->targetEneLfeSmooth_q = sub( 31, temp_q ); + move16(); hMasaLfeSynth->targetEneTransSmooth_fx = BASOP_Util_Add_Mant32Exp( hMasaLfeSynth->targetEneTransSmooth_fx, sub( 31, hMasaLfeSynth->targetEneTransSmooth_q ), targetEneTrans_fx, sub( 31, targetEneTrans_q ), &temp_q ); + move32(); hMasaLfeSynth->targetEneTransSmooth_q = sub( 31, temp_q ); + move16(); temp = BASOP_Util_Divide3232_Scale( hMasaLfeSynth->targetEneLfeSmooth_fx, L_add( EPSILON_FX, hMasaLfeSynth->protoLfeEneSmooth_fx ), &temp_q ); temp_q = add( sub( hMasaLfeSynth->targetEneLfeSmooth_q, hMasaLfeSynth->protoLfeEneSmooth_q ), sub( Q15, temp_q ) ); @@ -4979,12 +5134,6 @@ void ivas_lfe_synth_with_cldfb_fx( return; } #else -/*------------------------------------------------------------------------- - * ivas_lfe_synth_with_cldfb() - * - * - *------------------------------------------------------------------------*/ - void ivas_lfe_synth_with_cldfb( MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth, float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], @@ -5046,13 +5195,14 @@ void ivas_lfe_synth_with_cldfb( } #endif -#ifdef IVAS_FLOAT_FIXED + /*------------------------------------------------------------------------- - * rotateAziEle_DirAC_fx() + * rotateAziEle_DirAC() * * Apply rotation to DirAC DOAs *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED void rotateAziEle_DirAC_fx( Word16 *azi, /* i/o: array of azimuth values */ Word16 *ele, /* i/o: array of elevation values */ @@ -5078,8 +5228,7 @@ void rotateAziEle_DirAC_fx( IF( GT_16( abs_s( ele[b] ), 180 ) ) { // cos(180 + x) = -cos(x) - w_fx = -ptr_cos[sub( abs_s( ele[b] ), 180 )]; // Q31 - move32(); + w_fx = L_negate( ptr_cos[sub( abs_s( ele[b] ), 180 )] ); // Q31 } ELSE { @@ -5090,8 +5239,7 @@ void rotateAziEle_DirAC_fx( IF( GT_16( abs_s( azi[b] ), 180 ) ) { // cos(180 + x) = -cos(x) - tmp = -ptr_cos[sub( abs_s( azi[b] ), 180 )]; // Q31 - move32(); + tmp = L_negate( ptr_cos[sub( abs_s( azi[b] ), 180 )] ); // Q31 } ELSE { @@ -5105,7 +5253,7 @@ void rotateAziEle_DirAC_fx( IF( GT_16( azi[b], 180 ) ) { // sin(180 + x) = -sin(x) - tmp = -ptr_sin[sub( azi[b], 180 )]; // Q31 + tmp = L_negate( ptr_sin[sub( azi[b], 180 )] ); // Q31 move32(); } ELSE IF( LT_16( azi[b], -180 ) ) @@ -5124,7 +5272,7 @@ void rotateAziEle_DirAC_fx( IF( GT_16( ele[b], 180 ) ) { // sin(180 + x) = -sin(x) - dv_2_fx = -ptr_sin[sub( ele[b], 180 )]; // Q31 + dv_2_fx = L_negate( ptr_sin[sub( ele[b], 180 )] ); // Q31 move32(); } ELSE IF( LT_16( ele[b], -180 ) ) @@ -5161,12 +5309,6 @@ void rotateAziEle_DirAC_fx( return; } #else -/*------------------------------------------------------------------------- - * rotateAziEle_DirAC() - * - * Apply rotation to DirAC DOAs - *------------------------------------------------------------------------*/ - void rotateAziEle_DirAC( int16_t *azi, /* i/o: array of azimuth values */ int16_t *ele, /* i/o: array of elevation values */ @@ -5205,6 +5347,8 @@ void rotateAziEle_DirAC( return; } #endif + + /* A reduced rewrite of the corresponding decoder side function */ #ifndef IVAS_FLOAT_FIXED static void ivas_masa_ext_dirac_render_sf( @@ -5611,6 +5755,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( Word16 Q_surCohRatio, surCohRatio_exp[CLDFB_NO_CHANNELS_MAX]; Word32 dirEne_fx; Word32 surCohEner_fx; + move16(); FOR( Word16 ii = 0; ii < MAX_OUTPUT_CHANNELS; ii++ ) { @@ -5641,7 +5786,6 @@ static void ivas_masa_ext_dirac_render_sf_fx( onset_filter_fx = DirAC_mem.onset_filter_fx; reference_power_fix = DirAC_mem.reference_power_fx; reference_power_smooth_fx = ( DirAC_mem.reference_power_fx == NULL ) ? NULL : DirAC_mem.reference_power_fx + hSpatParamRendCom->num_freq_bands; - // DirAC_mem.reference_power_smooth_q = DirAC_mem.reference_power_q = Q31; onset_filter_subframe_fx = ( DirAC_mem.onset_filter_fx == NULL ) ? NULL : DirAC_mem.onset_filter_fx + hSpatParamRendCom->num_freq_bands; coherence_flag = 1; /* There is always coherence assumed for ext rend of MASA */ move16(); @@ -5706,15 +5850,19 @@ static void ivas_masa_ext_dirac_render_sf_fx( move32(); surCohEner_fx = Mpy_32_16_1( hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_fx[i], hSpatParamRendCom->surroundingCoherence_fx[md_idx][i] ); // Q.29 hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_fx[i] = L_sub( hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_fx[i], surCohEner_fx ); + move32(); hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx[i] = L_add( hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx[i], surCohEner_fx ); + move32(); surCohRatio_fx[i] = L_deposit_h( BASOP_Util_Divide3232_Scale( surCohEner_fx, L_add( L_add( 1, dirEne_fx ), surCohEner_fx ), &surCohRatio_exp[i] ) ); + move32(); temp_exp = s_max( temp_exp, surCohRatio_exp[i] ); } FOR( i = 0; i < hSpatParamRendCom->num_freq_bands; i++ ) { surCohRatio_fx[i] = L_shr( surCohRatio_fx[i], sub( temp_exp, surCohRatio_exp[i] ) ); + move32(); } Q_surCohRatio = sub( 31, temp_exp ); } @@ -5734,13 +5882,15 @@ static void ivas_masa_ext_dirac_render_sf_fx( &hDirACRend->h_output_synthesis_psd_state.direct_power_factor_q, &hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_q ); hDirACRend->h_output_synthesis_psd_state.direct_power_factor_q = sub( 31, hDirACRend->h_output_synthesis_psd_state.direct_power_factor_q ); + move16(); hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_q = sub( 31, hDirACRend->h_output_synthesis_psd_state.diffuse_power_factor_q ); + move16(); IF( coherence_flag ) { FOR( i = 0; i < hSpatParamRendCom->num_freq_bands; i++ ) { surCohRatio_fx[i] = L_deposit_h( hSpatParamRendCom->surroundingCoherence_fx[md_idx][i] ); - move16(); + move32(); } } ELSE @@ -5839,9 +5989,10 @@ static void ivas_masa_ext_dirac_render_sf_fx( DirAC_mem.reference_power_q = DirAC_mem.reference_power_smooth_q; move16(); } - temp_proto_frame_q = getScaleFactor32( hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f_len ) - 2; + temp_proto_frame_q = sub( getScaleFactor32( hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f_len ), 2 ); Scale_sig32( hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f_len, temp_proto_frame_q ); hDirACRend->proto_frame_f_q = add( hDirACRend->proto_frame_f_q, temp_proto_frame_q ); + move16(); } ELSE { @@ -5875,9 +6026,10 @@ static void ivas_masa_ext_dirac_render_sf_fx( DirAC_mem.reference_power_q = DirAC_mem.reference_power_smooth_q; move16(); } - temp_proto_frame_q = getScaleFactor32( hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f_len ) - 2; + temp_proto_frame_q = sub( getScaleFactor32( hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f_len ), 2 ); Scale_sig32( hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f_len, temp_proto_frame_q ); hDirACRend->proto_frame_f_q = add( hDirACRend->proto_frame_f_q, temp_proto_frame_q ); + move16(); BREAK; case 1: @@ -5909,9 +6061,10 @@ static void ivas_masa_ext_dirac_render_sf_fx( move16(); } - temp_proto_frame_q = getScaleFactor32( hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f_len ) - 2; + temp_proto_frame_q = sub( getScaleFactor32( hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f_len ), 2 ); Scale_sig32( hDirACRend->proto_frame_f_fx, hDirACRend->proto_frame_f_len, temp_proto_frame_q ); hDirACRend->proto_frame_f_q = add( hDirACRend->proto_frame_f_q, temp_proto_frame_q ); + move16(); BREAK; default: @@ -6005,10 +6158,6 @@ static void ivas_masa_ext_dirac_render_sf_fx( hDirACRend->h_output_synthesis_psd_state.direct_power_factor_q = Q31; move16(); - /*Word16 q_cy_auto_diff_smooth = getScaleFactor32(h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, h_dirac_output_synthesis_state->cy_auto_diff_smooth_len); - Scale_sig32(h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, h_dirac_output_synthesis_state->cy_auto_diff_smooth_len, q_cy_auto_diff_smooth); - h_dirac_output_synthesis_state->q_cy_auto_diff_smooth = add(h_dirac_output_synthesis_state->q_cy_auto_diff_smooth, q_cy_auto_diff_smooth);*/ - ivas_dirac_dec_output_synthesis_process_slot_fx( reference_power_fix, DirAC_mem.reference_power_q, p_onset_filter_fx, @@ -6031,12 +6180,15 @@ static void ivas_masa_ext_dirac_render_sf_fx( { Scale_sig32( DirAC_mem.reference_power_fx, DirAC_mem.reference_power_len, -1 ); DirAC_mem.reference_power_q = sub( DirAC_mem.reference_power_q, 1 ); + move16(); DirAC_mem.reference_power_smooth_q = DirAC_mem.reference_power_q; + move16(); v_add_fixed( reference_power_fix, reference_power_smooth_fx, reference_power_smooth_fx, hSpatParamRendCom->num_freq_bands, 0 ); } } /*Rescaling proto_direct_buffer_f*/ Word16 temp = MAX_16; + move16(); FOR( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) { @@ -6129,20 +6281,15 @@ static void ivas_masa_ext_dirac_render_sf_fx( #if 1 IF( hDirACRend->proto_signal_decorr_on ) { - // hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q = hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q; - Word16 new_proto_diffuse_buffer_f_q = getScaleFactor32( hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_fx, hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_len ); Word16 new_proto_direct_buffer_f_q = getScaleFactor32( hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_fx, hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_len ); scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_fx, hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_len, new_proto_diffuse_buffer_f_q ); scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_fx, hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_len, new_proto_direct_buffer_f_q ); hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q = add( hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, new_proto_direct_buffer_f_q ); + move16(); hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q = add( hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q, new_proto_diffuse_buffer_f_q ); - - /*scale_sig32(hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_fx, hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_len, sub(s_min(hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q), hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q)); - scale_sig32(hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_fx, hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_len, sub(s_min(hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q), hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q)); - hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q = s_min(hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q); - hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q = s_min(hDirACRend->h_output_synthesis_psd_state.proto_direct_buffer_f_q, hDirACRend->h_output_synthesis_psd_state.proto_diffuse_buffer_f_q);*/ + move16(); } #endif /*Buffer Scaling*/ @@ -6159,15 +6306,17 @@ static void ivas_masa_ext_dirac_render_sf_fx( q_cldfb = 11; move16(); - Word16 reference_power_temp_q = getScaleFactor32( DirAC_mem.reference_power_fx, DirAC_mem.reference_power_len ); scale_sig32( DirAC_mem.reference_power_fx, DirAC_mem.reference_power_len, reference_power_temp_q ); DirAC_mem.reference_power_q = add( DirAC_mem.reference_power_q, reference_power_temp_q ); + move16(); DirAC_mem.reference_power_smooth_q = add( DirAC_mem.reference_power_q, reference_power_temp_q ); + move16(); Word16 q_cy_auto_diff_smooth = getScaleFactor32( h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, h_dirac_output_synthesis_state->cy_auto_diff_smooth_len ); Scale_sig32( h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx, h_dirac_output_synthesis_state->cy_auto_diff_smooth_len, q_cy_auto_diff_smooth ); h_dirac_output_synthesis_state->q_cy_auto_diff_smooth = add( h_dirac_output_synthesis_state->q_cy_auto_diff_smooth, q_cy_auto_diff_smooth ); + move16(); Scale_sig32( hDirACRend->h_output_synthesis_psd_state.direct_responses_square_fx, hDirACRend->num_outputs_dir * hSpatParamRendCom->num_freq_bands, sub( 31, hDirACRend->h_output_synthesis_psd_state.direct_responses_square_q ) ); hDirACRend->h_output_synthesis_psd_state.direct_responses_square_q = Q31; @@ -6183,29 +6332,39 @@ static void ivas_masa_ext_dirac_render_sf_fx( IF( hDirACRend->masa_stereo_type_detect ) { hDirACRend->masa_stereo_type_detect->subtract_power_y_smooth_fx = L_shl( hDirACRend->masa_stereo_type_detect->subtract_power_y_smooth_fx, sub( s_min( hDirACRend->masa_stereo_type_detect->q_subtract_power_y_smooth, hDirACRend->masa_stereo_type_detect->q_subtract_power_y ), hDirACRend->masa_stereo_type_detect->q_subtract_power_y_smooth ) ); + move32(); hDirACRend->masa_stereo_type_detect->subtract_power_y_fx = L_shl( hDirACRend->masa_stereo_type_detect->subtract_power_y_fx, sub( s_min( hDirACRend->masa_stereo_type_detect->q_subtract_power_y_smooth, hDirACRend->masa_stereo_type_detect->q_subtract_power_y ), hDirACRend->masa_stereo_type_detect->q_subtract_power_y ) ); + move32(); hDirACRend->masa_stereo_type_detect->q_subtract_power_y_smooth = s_min( hDirACRend->masa_stereo_type_detect->q_subtract_power_y_smooth, hDirACRend->masa_stereo_type_detect->q_subtract_power_y ); + move16(); hDirACRend->masa_stereo_type_detect->q_subtract_power_y = s_min( hDirACRend->masa_stereo_type_detect->q_subtract_power_y_smooth, hDirACRend->masa_stereo_type_detect->q_subtract_power_y ); + move16(); } Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len, sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q ) ); hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ); + move16(); Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_len, sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) ); hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ); + move16(); Word16 proto_power_diff_smooth_prev_temp_q = getScaleFactor32( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_len ); Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_len, proto_power_diff_smooth_prev_temp_q ); hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_q = add( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_q, proto_power_diff_smooth_prev_temp_q ); + move16(); Word16 proto_power_diff_smooth_temp_q = getScaleFactor32( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_len ); Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_len, proto_power_diff_smooth_temp_q ); hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q = add( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q, proto_power_diff_smooth_temp_q ); + move16(); Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_len, sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_q ), hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_q ) ); Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_len, sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_q ), hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q ) ); hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_q, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q ); + move16(); hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_q = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_q, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q ); + move16(); Scale_sig32( diffuseness_vector_fx, hSpatParamRendCom->num_freq_bands, 1 ); @@ -6215,8 +6374,11 @@ static void ivas_masa_ext_dirac_render_sf_fx( Scale_sig32( DirAC_mem.reference_power_fx, DirAC_mem.reference_power_len, sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ), DirAC_mem.reference_power_q ) ); hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q = s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ); + move16(); DirAC_mem.reference_power_q = s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ); + move16(); DirAC_mem.reference_power_smooth_q = s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ); + move16(); ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, @@ -6230,7 +6392,9 @@ static void ivas_masa_ext_dirac_render_sf_fx( 0, &q_cldfb ); hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_q = hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q; + move16(); hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q = DirAC_mem.reference_power_smooth_q; + move16(); IF( LT_16( DirAC_mem.reference_power_q, DirAC_mem.reference_power_smooth_q ) ) { Scale_sig32( reference_power_fix + hSpatParamRendCom->num_freq_bands, sub( DirAC_mem.reference_power_len, hSpatParamRendCom->num_freq_bands ), sub( DirAC_mem.reference_power_q, DirAC_mem.reference_power_smooth_q ) ); @@ -6282,12 +6446,13 @@ static void ivas_masa_ext_dirac_render_sf_fx( /* Note here that compared to decoder path, there is no separate channel ever for MASA ext rend path */ FOR( ch = 0; ch < outchannels; ch++ ) { - IF( GT_16( hDirACRend->hOutSetup.num_lfe, 0 ) && ( EQ_16( hDirACRend->hOutSetup.index_lfe[idx_lfe], ch ) ) ) + test(); + IF( hDirACRend->hOutSetup.num_lfe > 0 && ( EQ_16( hDirACRend->hOutSetup.index_lfe[idx_lfe], ch ) ) ) { /* No LFE for MASA rendering */ - set32_fx( &( output_f_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), 0, hSpatParamRendCom->subframe_nbslots[subframe_idx] * hSpatParamRendCom->num_freq_bands ); + set32_fx( &( output_f_fx[ch][imult1616( index_slot, hSpatParamRendCom->num_freq_bands )] ), 0, hSpatParamRendCom->subframe_nbslots[subframe_idx] * hSpatParamRendCom->num_freq_bands ); - IF( LT_16( idx_lfe, sub( hDirACRend->hOutSetup.num_lfe, 1 ) ) ) + if ( LT_16( idx_lfe, sub( hDirACRend->hOutSetup.num_lfe, 1 ) ) ) { idx_lfe++; } @@ -6307,8 +6472,10 @@ static void ivas_masa_ext_dirac_render_sf_fx( } hMasaExtRend->cldfbSynRend[0]->Q_cldfb_state = sub( q_cldfb, 1 ); + move16(); } hSpatParamRendCom->slots_rendered = add( hSpatParamRendCom->subframe_nbslots[subframe_idx], hSpatParamRendCom->slots_rendered ); + move16(); hSpatParamRendCom->subframes_rendered++; pop_wmops(); @@ -6316,6 +6483,8 @@ static void ivas_masa_ext_dirac_render_sf_fx( return; } #endif + + #ifndef IVAS_FLOAT_FIXED void ivas_masa_ext_dirac_render( MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA renderer structure */ @@ -6375,6 +6544,7 @@ void ivas_masa_ext_dirac_render_fx( } hSpatParamRendCom->subframes_rendered = hSpatParamRendCom->dirac_read_idx; + move16(); FOR( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) { @@ -6386,7 +6556,8 @@ void ivas_masa_ext_dirac_render_fx( output_f_local[n] += n_samples_sf; } - hSpatParamRendCom->dirac_read_idx = ( hSpatParamRendCom->dirac_read_idx + 1 ) % hSpatParamRendCom->dirac_md_buffer_length; + hSpatParamRendCom->dirac_read_idx = add( hSpatParamRendCom->dirac_read_idx, 1 ) % hSpatParamRendCom->dirac_md_buffer_length; + move16(); } return; diff --git a/lib_rend/ivas_efap.c b/lib_rend/ivas_efap.c index 3632adde4..fb6abd941 100644 --- a/lib_rend/ivas_efap.c +++ b/lib_rend/ivas_efap.c @@ -41,6 +41,10 @@ #include "ivas_prot_rend.h" #include "ivas_stat_dec.h" #include "wmc_auto.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_prot_fx.h" +#endif + /*-----------------------------------------------------------------------* * Local constants @@ -156,7 +160,7 @@ static int16_t in_tri( float A[2], float B[2], float C[2], float P_minus_A[2] ); static void sph2cart( const float azi, const float ele, float *pos ); #else static void sort_channels_vertex_fx( const EFAP_VERTEX *vtxArray, const EFAP_LS_TRIANGLE *triArray, Word16 channels[EFAP_MAX_CHAN_NUM], const Word16 lengthChannels, Word16 idxTri ); -static Word32 efap_lmodl( const Word32 x, const Word32 y ); +static Word32 efap_32mod32( const Word32 x, const Word32 y ); static Word16 get_poly_num_fx( const Word32 P[2], const EFAP_POLYSET_DATA *polyData ); static Word16 in_poly_fx( const Word32 P[2], const EFAP_POLYSET poly ); static Word16 in_tri_fx( Word32 A[2], Word32 B[2], Word32 C[2], Word32 P_minus_A[2] ); @@ -176,8 +180,8 @@ static void sph2cart_fx( const Word32 azi, const Word32 ele, Word32 *pos ); ivas_error efap_init_data_fx( EFAP_HANDLE *hEFAPdata, /* i/o: handle for EFAP data structure that will be initialized */ - const Word32 *speaker_node_azi_deg, /* i : vector of speaker node azimuths (positive left) (Q22) */ - const Word32 *speaker_node_ele_deg, /* i : vector of speaker node elevations (positive up) (Q22) */ + const Word32 *speaker_node_azi_deg, /* i : vector of speaker node azimuths (positive left) Q22 */ + const Word32 *speaker_node_ele_deg, /* i : vector of speaker node elevations (positive up) Q22 */ const Word16 num_speaker_nodes, /* i : number of speaker nodes in the set */ const Word16 efap_mode /* i : indicates whether EFAP or EFIP is used */ ) @@ -187,6 +191,7 @@ ivas_error efap_init_data_fx( ivas_error error; error = IVAS_ERR_OK; + move32(); /* Basic init checks */ test(); @@ -240,8 +245,8 @@ ivas_error efap_init_data_fx( move16(); /* Loudspeaker configuration */ - mvl2l( speaker_node_azi_deg, efap->aziSpk, num_speaker_nodes ); - mvl2l( speaker_node_ele_deg, efap->eleSpk, num_speaker_nodes ); + Copy32( speaker_node_azi_deg, efap->aziSpk, num_speaker_nodes ); + Copy32( speaker_node_ele_deg, efap->eleSpk, num_speaker_nodes ); /* Initialization of the vertex */ vertex_init_fx( efap->aziSpk, efap->eleSpk, &efap->vtxData ); @@ -353,8 +358,8 @@ ivas_error efap_init_data( } #endif -#ifdef IVAS_FLOAT_FIXED +#ifdef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * efap_determine_gains_fx() * @@ -363,14 +368,11 @@ ivas_error efap_init_data( *-------------------------------------------------------------------------*/ void efap_determine_gains_fx( - EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ - Word32 *gains, /* o : gain vector for speaker nodes for given direction */ - const Word32 azi_deg, - /* i : azimuth in degrees for panning direction (positive left) */ // Q22 - const Word32 ele_deg, - /* i : elevation in degrees for panning direction (positive up) */ // Q22 - const Word16 efap_mode /* i : indicates whether EFAP or EFIP is used */ - + EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + Word32 *gains, /* o : gain vector for speaker nodes for given direction Q30 */ + const Word32 azi_deg, /* i : azimuth in degrees for panning direction (positive left) Q22 */ + const Word32 ele_deg, /* i : elevation in degrees for panning direction (positive up) Q22 */ + const Word16 efap_mode /* i : indicates whether EFAP or EFIP is used */ ) { Word16 i, j; @@ -387,20 +389,21 @@ void efap_determine_gains_fx( /* Panning */ efap_panning_fx( azi_wrap_int, ele_wrap_int, &hEFAPdata->polyData, hEFAPdata->bufferLong_fx ); - IF( EQ_16( efap_mode, EFAP_MODE_EFAP ) ) + IF( efap_mode == EFAP_MODE_EFAP ) { normBuffer = 0; - move16(); + move32(); FOR( j = 0; j < hEFAPdata->numSpk; ++j ) { hEFAPdata->bufferShort_fx[j] = 0; - move16(); + move32(); /* Multiplying by the downmixMatrix */ FOR( i = 0; i < hEFAPdata->vtxData.numVtx; ++i ) { - hEFAPdata->bufferShort_fx[j] = L_add_sat( hEFAPdata->bufferShort_fx[j], L_shr( Mpy_32_32( hEFAPdata->bufferLong_fx[i], hEFAPdata->dmTranspose_fx[i][j] ), Q1 ) ); // Q30 + hEFAPdata->bufferShort_fx[j] = L_add_sat( hEFAPdata->bufferShort_fx[j], L_shr( Mpy_32_32( hEFAPdata->bufferLong_fx[i], hEFAPdata->dmTranspose_fx[i][j] ), Q1 ) ); /* Q30 */ + move32(); } - normBuffer = L_add_sat( normBuffer, Mpy_32_32( hEFAPdata->bufferShort_fx[j], hEFAPdata->bufferShort_fx[j] ) ); // Q29 + normBuffer = L_add_sat( normBuffer, Mpy_32_32( hEFAPdata->bufferShort_fx[j], hEFAPdata->bufferShort_fx[j] ) ); /* Q29 */ } Word16 exp = 2; move16(); @@ -409,43 +412,47 @@ void efap_determine_gains_fx( FOR( j = 0; j < hEFAPdata->numSpk; ++j ) { hEFAPdata->bufferShort_fx[j] = Mpy_32_32( hEFAPdata->bufferShort_fx[j], normBuffer ); - hEFAPdata->bufferShort_fx[j] = L_shl( hEFAPdata->bufferShort_fx[j], exp ); // Q30 + move32(); + hEFAPdata->bufferShort_fx[j] = L_shl( hEFAPdata->bufferShort_fx[j], exp ); /* Q30 */ + move32(); } } ELSE { normBuffer = 0; - move16(); + move32(); FOR( j = 0; j < hEFAPdata->numSpk; ++j ) { hEFAPdata->bufferShort_fx[j] = 0; - move16(); + move32(); /* Multiplying by the downmixMatrix */ FOR( i = 0; i < hEFAPdata->vtxData.numVtx; ++i ) { - hEFAPdata->bufferShort_fx[j] = L_add_sat( hEFAPdata->bufferShort_fx[j], L_shr( Mpy_32_32( hEFAPdata->bufferLong_fx[i], hEFAPdata->dmTranspose_fx[i][j] ), Q1 ) ); // Q30 + hEFAPdata->bufferShort_fx[j] = L_add_sat( hEFAPdata->bufferShort_fx[j], L_shr( Mpy_32_32( hEFAPdata->bufferLong_fx[i], hEFAPdata->dmTranspose_fx[i][j] ), Q1 ) ); /* Q30 */ + move32(); } - normBuffer = L_add_sat( normBuffer, L_shr( hEFAPdata->bufferShort_fx[j], Q1 ) ); // Q29 + normBuffer = L_add_sat( normBuffer, L_shr( hEFAPdata->bufferShort_fx[j], Q1 ) ); /* Q29 */ } Word16 exp = 2; move16(); - normBuffer = Inv16( (Word16) L_shr( normBuffer, Q16 ), &exp ); + normBuffer = Inv16( extract_l( L_shr( normBuffer, Q16 ) ), &exp ); FOR( j = 0; j < hEFAPdata->numSpk; ++j ) { Word16 exp_temp = add( exp, 1 ); hEFAPdata->bufferShort_fx[j] = Sqrt32( Mpy_32_16_1( hEFAPdata->bufferShort_fx[j], (Word16) normBuffer ), &exp_temp ); - hEFAPdata->bufferShort_fx[j] = L_shl( hEFAPdata->bufferShort_fx[j], sub( exp_temp, 1 ) ); // Q30 + move32(); + hEFAPdata->bufferShort_fx[j] = L_shl( hEFAPdata->bufferShort_fx[j], sub( exp_temp, 1 ) ); /* Q30 */ + move32(); } } /* Copy gains to output */ - mvl2l( hEFAPdata->bufferShort_fx, gains, hEFAPdata->numSpk ); + Copy32( hEFAPdata->bufferShort_fx, gains, hEFAPdata->numSpk ); /* Q30 */ return; } #else - /*-------------------------------------------------------------------------* * efap_determine_gains() * @@ -521,6 +528,8 @@ void efap_determine_gains( return; } #endif + + /*-------------------------------------------------------------------------* * efap_free_data() * @@ -528,7 +537,7 @@ void efap_determine_gains( *-------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -void efap_free_data( +void efap_free_data_fx( EFAP_HANDLE *hEFAPdata /* i/o: EFAP handle to be freed */ ) { @@ -542,6 +551,7 @@ void efap_free_data( } dim1 = ( *hEFAPdata )->numTot; + move16(); /* instance buffer members */ free( ( *hEFAPdata )->aziSpk ); @@ -638,6 +648,7 @@ void efap_free_data( * Main function for the Efap initialization whose purpose is to initialize * the different polygons and to add the ghost speakers *-------------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED static ivas_error poly_init_fx( EFAP *efap, /* i/o: A pointer to a handle to efap instance */ @@ -652,6 +663,7 @@ static ivas_error poly_init_fx( ivas_error error; error = IVAS_ERR_OK; + move32(); /* Safety Check */ assert( efap != NULL && "EFAP: efap == NULL" ); @@ -670,8 +682,9 @@ static ivas_error poly_init_fx( /* set isNaN for ghost loudspeakers */ FOR( n = 0; n < efap->vtxData.numVtx; ++n ) { - IF( GT_32( efap->vtxData.vertexArray[n].ele, L_sub( Q22_90_DEG, 4 ) ) || - LT_32( efap->vtxData.vertexArray[n].ele, L_sub( 4, Q22_90_DEG ) ) ) + test(); + if ( GT_32( efap->vtxData.vertexArray[n].ele, L_sub( Q22_90_DEG, 4 ) ) || + LT_32( efap->vtxData.vertexArray[n].ele, L_sub( 4, Q22_90_DEG ) ) ) { efap->vtxData.vertexArray[n].isNaN = 1; move16(); @@ -694,9 +707,9 @@ static ivas_error poly_init_fx( { efap->polyData.polysetArray[m].chan[j] = sortedChan[n][j]; move16(); - efap->polyData.polysetArray[m].polyAzi[j] = efap->vtxData.vertexArray[sortedChan[n][j]].azi; + efap->polyData.polysetArray[m].polyAzi[j] = efap->vtxData.vertexArray[sortedChan[n][j]].azi; /* Q22 */ move32(); - efap->polyData.polysetArray[m].polyEle[j] = efap->vtxData.vertexArray[sortedChan[n][j]].ele; + efap->polyData.polysetArray[m].polyEle[j] = efap->vtxData.vertexArray[sortedChan[n][j]].ele; /* Q22 */ move32(); efap->polyData.polysetArray[m].isNaN[j] = efap->vtxData.vertexArray[sortedChan[n][j]].isNaN; move16(); @@ -716,19 +729,29 @@ static ivas_error poly_init_fx( assert( ( m + 2 < EFAP_MAX_POLY_SET ) && "EFAP: maximum polygons exceeded!" ); /* add two new polygons with azimuths wrapped to differing bounds */ - efap->polyData.polysetArray[m + 1].polyAzi[j] = efap_lmodl( efap->polyData.polysetArray[m].polyAzi[j], Q22_360_DEG ); - efap->polyData.polysetArray[m + 2].polyAzi[j] = L_sub( efap->polyData.polysetArray[m + 1].polyAzi[j], Q22_360_DEG ); + efap->polyData.polysetArray[add( m, 1 )].polyAzi[j] = efap_32mod32( efap->polyData.polysetArray[m].polyAzi[j], Q22_360_DEG ); /* Q22 */ + move32(); + efap->polyData.polysetArray[add( m, 2 )].polyAzi[j] = L_sub( efap->polyData.polysetArray[add( m, 1 )].polyAzi[j], Q22_360_DEG ); /* Q22 */ + move32(); /* Copy the rest of the fields */ - efap->polyData.polysetArray[m + 1].chan[j] = efap->polyData.polysetArray[m].chan[j]; - efap->polyData.polysetArray[m + 1].polyEle[j] = efap->polyData.polysetArray[m].polyEle[j]; - efap->polyData.polysetArray[m + 1].isNaN[j] = efap->polyData.polysetArray[m].isNaN[j]; - efap->polyData.polysetArray[m + 1].numChan = lengthTri2PolySorted[n]; + efap->polyData.polysetArray[add( m, 1 )].chan[j] = efap->polyData.polysetArray[m].chan[j]; + move16(); + efap->polyData.polysetArray[add( m, 1 )].polyEle[j] = efap->polyData.polysetArray[m].polyEle[j]; /* Q22 */ + move32(); + efap->polyData.polysetArray[add( m, 1 )].isNaN[j] = efap->polyData.polysetArray[m].isNaN[j]; + move16(); + efap->polyData.polysetArray[add( m, 1 )].numChan = lengthTri2PolySorted[n]; + move16(); - efap->polyData.polysetArray[m + 2].chan[j] = efap->polyData.polysetArray[m].chan[j]; - efap->polyData.polysetArray[m + 2].polyEle[j] = efap->polyData.polysetArray[m].polyEle[j]; - efap->polyData.polysetArray[m + 2].isNaN[j] = efap->polyData.polysetArray[m].isNaN[j]; - efap->polyData.polysetArray[m + 2].numChan = lengthTri2PolySorted[n]; + efap->polyData.polysetArray[add( m, 2 )].chan[j] = efap->polyData.polysetArray[m].chan[j]; + move16(); + efap->polyData.polysetArray[add( m, 2 )].polyEle[j] = efap->polyData.polysetArray[m].polyEle[j]; /* Q22 */ + move32(); + efap->polyData.polysetArray[add( m, 2 )].isNaN[j] = efap->polyData.polysetArray[m].isNaN[j]; + move16(); + efap->polyData.polysetArray[add( m, 2 )].numChan = lengthTri2PolySorted[n]; + move16(); } finalLength = add( finalLength, 2 ); } @@ -842,32 +865,34 @@ static ivas_error poly_init( } #endif + /*-------------------------------------------------------------------------* * sphere_triangulation() * * *-------------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED static ivas_error sphere_triangulation_fx( - const Word16 numSpk, /* i : Number of speakers */ - EFAP_VERTEX_DATA *vtxData, /* i/o: Vertex data structure */ - EFAP_POLYSET_DATA *polyData, /* o : Polygon data structure */ - Word32 ***dmTranspose_fx, /* o : Transpose of the downmix matrix */ - Word16 *numTot, /* o : Number of speakers (real + ghost) */ - const int16_t efip_flag /* i : flag to indicate whether initialization is for EFIP (used for ALLRAD) */ + const Word16 numSpk, /* i : Number of speakers */ + EFAP_VERTEX_DATA *vtxData, /* i/o: Vertex data structure */ + EFAP_POLYSET_DATA *polyData, /* o : Polygon data structure */ + Word32 ***dmTranspose_fx, /* o : Transpose of the downmix matrix Q31 */ + Word16 *numTot, /* o : Number of speakers (real + ghost) */ + const Word16 efip_flag /* i : flag to indicate whether initialization is for EFIP (used for ALLRAD) */ ) { - int16_t i; + Word16 i; void **p_dmTranspose; - int16_t vtxInHull[EFAP_MAX_SIZE_TMP_BUFF]; + Word16 vtxInHull[EFAP_MAX_SIZE_TMP_BUFF]; - set_s( vtxInHull, 0, EFAP_MAX_SIZE_TMP_BUFF ); + set16_fx( vtxInHull, 0, EFAP_MAX_SIZE_TMP_BUFF ); /* Add Imaginary Speakers */ add_ghost_speakers_fx( vtxData->vertexArray, &vtxData->numVtx, efip_flag ); /* Sort the vertices according to their index */ - IF( ( vtxData->vtxOrder = (int16_t *) malloc( vtxData->numVtx * sizeof( int16_t ) ) ) == NULL ) + IF( ( vtxData->vtxOrder = (Word16 *) malloc( vtxData->numVtx * sizeof( Word16 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for EFAP Vertex Order\n" ) ); } @@ -893,6 +918,7 @@ static ivas_error sphere_triangulation_fx( /* Store the value of numVtx to be used for freeing later (numVtx will change after remap_ghosts() ) */ *numTot = vtxData->numVtx; + move16(); FOR( i = 0; i < vtxData->numVtx; i++ ){ IF( ( p_dmTranspose[i] = malloc( numSpk * sizeof( Word32 ) ) ) == NULL ){ @@ -969,13 +995,14 @@ static ivas_error sphere_triangulation( } #endif -#ifndef IVAS_FLOAT_FIXED + /*-------------------------------------------------------------------------* * initial_polyeder() * * *-------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void initial_polyeder( EFAP_VERTEX_DATA *vtxData, /* i : Vertex data structure */ EFAP_LS_TRIANGLE *triArray, /* o : Triangle array structure */ @@ -1096,12 +1123,6 @@ static void initial_polyeder( return; } #else -/*-------------------------------------------------------------------------* - * initial_polyeder() - * - * - *-------------------------------------------------------------------------*/ - static void initial_polyeder_fx( EFAP_VERTEX_DATA *vtxData, /* i : Vertex data structure */ EFAP_LS_TRIANGLE *triArray, /* o : Triangle array structure */ @@ -1122,32 +1143,34 @@ static void initial_polyeder_fx( assert( triArray != NULL && "EFAP: triArray==NULL" ); /* initialize variables */ - set_s( tmpSurface, -1, 3 ); - set_l( centroid, 0, 3 ); - set_l( tmp1, 0, 3 ); - set_l( tmp2, 0, 3 ); - set_l( tmp3, 0, 3 ); - set_l( tmpCross, 0, 3 ); + set16_fx( tmpSurface, -1, 3 ); + set32_fx( centroid, 0, 3 ); + set32_fx( tmp1, 0, 3 ); + set32_fx( tmp2, 0, 3 ); + set32_fx( tmp3, 0, 3 ); + set32_fx( tmpCross, 0, 3 ); numVtx = vtxData->numVtx; + move16(); /* seed vertices */ FOR( i = 0; i < 4; i++ ) { tetrahedron[i] = i; + move16(); } /* 1. attempt to create an edge with nonzero length */ WHILE( EQ_32( vtxData->vertexArray[tetrahedron[0]].azi, vtxData->vertexArray[tetrahedron[1]].azi ) && EQ_32( vtxData->vertexArray[tetrahedron[0]].ele, vtxData->vertexArray[tetrahedron[1]].ele ) ) { - tetrahedron[1]++; + tetrahedron[1] = add( tetrahedron[1], 1 ); assert( tetrahedron[1] < numVtx && "EFAP: convex hull construction failed, vertices are coincident!" ); } /* 2. attempt to create a triangle with nonzero area */ tmp = 0; - move16(); + move32(); v_sub_fixed( vtxData->vertexArray[tetrahedron[1]].pos, vtxData->vertexArray[tetrahedron[0]].pos, tmp1, 3, 1 ); WHILE( LT_16( tetrahedron[2], numVtx ) ) { @@ -1159,23 +1182,26 @@ static void initial_polyeder_fx( } IF( GT_32( L_abs( tmp ), Mpy_32_32( POLY_THRESH_Q29, POLY_THRESH_Q29 ) ) ) /* compare tmp against POLY_THRESH^2 instead of sqrtf(tmp) */ { - break; + BREAK; } tetrahedron[2] = add( tetrahedron[2], 1 ); + move16(); } assert( tetrahedron[2] < numVtx && "EFAP: convex hull construction failed, vertices are colinear!" ); /* 3. attempt to create a tetrahedron with nonzero volume */ tmp = 0; + move32(); WHILE( LT_16( tetrahedron[3], numVtx ) ) { v_sub_fixed( vtxData->vertexArray[tetrahedron[3]].pos, vtxData->vertexArray[tetrahedron[0]].pos, tmp3, 3, 1 ); // tmp3 Q30 tmp = dotp_fixed( tmp3, tmpCross, 3 ); // tmp Q28 IF( GT_32( L_abs( tmp ), POLY_THRESH_Q28 ) ) { - break; + BREAK; } tetrahedron[3] = add( tetrahedron[3], 1 ); + move16(); } assert( tetrahedron[3] < numVtx && "EFAP: convex hull construction failed, vertices are coplanar!" ); @@ -1183,9 +1209,13 @@ static void initial_polyeder_fx( FOR( i = 0; i < 4; i++ ) { vtxInHull[tetrahedron[i]] = 1; /* set vertex as added to hull*/ + move16(); centroid[0] = L_add( centroid[0], L_shr( vtxData->vertexArray[tetrahedron[i]].pos[0], Q2 ) ); + move32(); centroid[1] = L_add( centroid[1], L_shr( vtxData->vertexArray[tetrahedron[i]].pos[1], Q2 ) ); + move32(); centroid[2] = L_add( centroid[2], L_shr( vtxData->vertexArray[tetrahedron[i]].pos[2], Q2 ) ); + move32(); } /* Executed below float operation centroid[0] /= 4; @@ -1195,36 +1225,50 @@ static void initial_polyeder_fx( /* 5. create and orient planes */ tmpSurface[0] = tetrahedron[0]; + move16(); tmpSurface[1] = tetrahedron[1]; + move16(); tmpSurface[2] = tetrahedron[2]; + move16(); flip_plane_fx( vtxData->vertexArray, tmpSurface, centroid ); - mvs2s( tmpSurface, triArray[0].LS, 3 ); + Copy( tmpSurface, triArray[0].LS, 3 ); tmpSurface[0] = tetrahedron[0]; + move16(); tmpSurface[1] = tetrahedron[1]; + move16(); tmpSurface[2] = tetrahedron[3]; + move16(); flip_plane_fx( vtxData->vertexArray, tmpSurface, centroid ); - mvs2s( tmpSurface, triArray[1].LS, 3 ); + Copy( tmpSurface, triArray[1].LS, 3 ); tmpSurface[0] = tetrahedron[0]; + move16(); tmpSurface[1] = tetrahedron[2]; + move16(); tmpSurface[2] = tetrahedron[3]; + move16(); flip_plane_fx( vtxData->vertexArray, tmpSurface, centroid ); - mvs2s( tmpSurface, triArray[2].LS, 3 ); + Copy( tmpSurface, triArray[2].LS, 3 ); tmpSurface[0] = tetrahedron[1]; + move16(); tmpSurface[1] = tetrahedron[2]; + move16(); tmpSurface[2] = tetrahedron[3]; + move16(); flip_plane_fx( vtxData->vertexArray, tmpSurface, centroid ); - mvs2s( tmpSurface, triArray[3].LS, 3 ); + Copy( tmpSurface, triArray[3].LS, 3 ); /* set numTri */ *numTri = 4; + move16(); return; } #endif + #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * add_ghost_speakers() @@ -1417,7 +1461,9 @@ static void add_ghost_speakers_fx( EFAP_VTX_DMX_TYPE vtxDmxType; vtxDmxType = EFAP_DMX_INTENSITY; + move32(); numVertex = *numVtx; + move16(); maxAngle = 13421773; move32(); //(1.f / 160.0f) in Q31 @@ -1442,15 +1488,17 @@ static void add_ghost_speakers_fx( IF( GT_32( tmpEle, Q22_45_DEG ) ) { vtxDmxType = EFAP_DMX_NONE; + move32(); } ELSE { vtxDmxType = EFAP_DMX_AMPLITUDE; + move32(); } } - add_vertex_fx( vertexArray, 0, Q22_90_DEG, numVertex + a, vtxDmxType ); - ++lengthVertGhst; - ++a; + add_vertex_fx( vertexArray, 0, Q22_90_DEG, add( numVertex, a ), vtxDmxType ); + lengthVertGhst = add( lengthVertGhst, 1 ); + a = add( a, 1 ); } /* ADD VOH IF NECESSERAY (i.e. if the elevation of the lowest LS is > -90 deg) */ @@ -1462,17 +1510,20 @@ static void add_ghost_speakers_fx( IF( LT_32( tmpEle, -Q22_45_DEG ) ) { vtxDmxType = EFAP_DMX_NONE; + move32(); } ELSE { vtxDmxType = EFAP_DMX_AMPLITUDE; + move32(); } } - add_vertex_fx( vertexArray, 0, -Q22_90_DEG, numVertex + a, vtxDmxType ); + add_vertex_fx( vertexArray, 0, -Q22_90_DEG, add( numVertex, a ), vtxDmxType ); - ++lengthVertGhst; - ++a; + lengthVertGhst = add( lengthVertGhst, 1 ); + ; + a = add( a, 1 ); } /* LIST ALL SURROUNDING loudspeakers */ @@ -1484,7 +1535,8 @@ static void add_ghost_speakers_fx( IF( LT_32( L_abs( vertexArray[i].ele ), Q22_45_DEG ) ) { tmpAzi[k] = vertexArray[i].azi; - ++k; + move32(); + k = add( k, 1 ); } } @@ -1514,20 +1566,22 @@ static void add_ghost_speakers_fx( FOR( i = 0; i < k - 1; ++i ) { tmpAngleDiff[i] = L_sub( tmpAzi[i + 1], tmpAzi[i] ); + move32(); sectors[i] = ceil_fixed( Mpy_32_32( tmpAngleDiff[i], maxAngle ), Q22 ); + move32(); - IF( GT_32( sectors[i], Q22_1 ) ) + if ( GT_32( sectors[i], Q22_1 ) ) { - ++lengthHorGhst; + lengthHorGhst = add( lengthHorGhst, 1 ); } } - tmpAngleDiff[k - 1] = L_sub( L_add( tmpAzi[0], Q22_360_DEG ), tmpAzi[k - 1] ); + tmpAngleDiff[sub( k, 1 )] = L_sub( L_add( tmpAzi[0], Q22_360_DEG ), tmpAzi[sub( k, 1 )] ); - sectors[k - 1] = ceil_fixed( Mpy_32_32( tmpAngleDiff[k - 1], maxAngle ), Q22 ); + sectors[sub( k, 1 )] = ceil_fixed( Mpy_32_32( tmpAngleDiff[sub( k, 1 )], maxAngle ), Q22 ); - IF( GT_32( sectors[k - 1], Q22_1 ) ) + if ( GT_32( sectors[sub( k, 1 )], Q22_1 ) ) { - ++lengthHorGhst; + lengthHorGhst = add( lengthHorGhst, 1 ); } /* Adding new virtual speakers */ @@ -1542,23 +1596,25 @@ static void add_ghost_speakers_fx( { newAzi = L_add( tmpAzi[i], L_shl( ( j + 1 ) * newDiff, Q22 ) ); - add_vertex_fx( vertexArray, newAzi, 0, numVertex + a, EFAP_DMX_INTENSITY ); - ++a; + add_vertex_fx( vertexArray, newAzi, 0, add( numVertex, a ), EFAP_DMX_INTENSITY ); + a = add( a, 1 ); - IF( GT_16( j, 0 ) ) + if ( j > 0 ) { - ++lengthHorGhst; + lengthHorGhst = add( lengthHorGhst, 1 ); } } } } } *numVtx = add( add( numVertex, lengthHorGhst ), lengthVertGhst ); + move16(); return; } #endif + /*-------------------------------------------------------------------------* * sort_vertices() * @@ -1579,6 +1635,7 @@ static void sort_vertices_fx( FOR( i = 0; i < *numVtx; ++i ) { tmpIdx[i] = vertexArray[i].idx; + move16(); } /* Sorting indexes */ @@ -1608,6 +1665,8 @@ static void sort_vertices( return; } #endif + + #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * add_vertex_to_convex_hull() @@ -1729,6 +1788,8 @@ static void add_vertex_to_convex_hull_fx( move32(); // -1e-6f in Q28 Word32 tmpDist; EFAP_LS_TRIANGLE triArrayNew[EFAP_MAX_POLY_SET]; + Word16 tmp16, tmp_e; + Word32 tmp32; /* If the vertex is already part of the hull, nothing must be done */ IF( vtxInHull[vtxIdx] ) @@ -1746,19 +1807,30 @@ static void add_vertex_to_convex_hull_fx( { numHullVtx = L_add( numHullVtx, 1 ); centroid[0] = L_add( centroid[0], L_shr( vtxData->vertexArray[i].pos[0], Q4 ) ); + move32(); centroid[1] = L_add( centroid[1], L_shr( vtxData->vertexArray[i].pos[1], Q4 ) ); + move32(); centroid[2] = L_add( centroid[2], L_shr( vtxData->vertexArray[i].pos[2], Q4 ) ); + move32(); } } - // Multiplying with 1 / numHullVtx; + /* numHullVtx = 1.0f / numHullVtx; */ + tmp16 = BASOP_Util_Divide3232_Scale( 1, numHullVtx, &tmp_e ); + tmp32 = L_shl_sat( tmp16, add( Q16, tmp_e ) ); /* Q31 */ - centroid[0] /= numHullVtx; - centroid[1] /= numHullVtx; - centroid[2] /= numHullVtx; + centroid[0] = Mpy_32_32( centroid[0], tmp32 ); + move32(); + centroid[1] = Mpy_32_32( centroid[1], tmp32 ); + move32(); + centroid[2] = Mpy_32_32( centroid[1], tmp32 ); + move32(); centroid[0] = L_shl( centroid[0], 4 ); + move32(); centroid[1] = L_shl( centroid[1], 4 ); + move32(); centroid[2] = L_shl( centroid[2], 4 ); + move32(); /* Processing */ k = 0; @@ -1773,12 +1845,12 @@ static void add_vertex_to_convex_hull_fx( { visible[k] = i; move16(); - ++k; + k = add( k, 1 ); } ELSE { - mvs2s( triArray[i].LS, triArrayNew[l].LS, 3 ); - ++l; + Copy( triArray[i].LS, triArrayNew[l].LS, 3 ); + l = add( l, 1 ); } } @@ -1795,16 +1867,17 @@ static void add_vertex_to_convex_hull_fx( flip_plane_fx( vtxData->vertexArray, surface, centroid ); - mvs2s( surface, triArrayNew[l].LS, 3 ); - ++l; + Copy( surface, triArrayNew[l].LS, 3 ); + l = add( l, 1 ); } /* Outputs */ FOR( i = 0; i < l; i++ ) { - mvs2s( triArrayNew[i].LS, triArray[i].LS, 3 ); + Copy( triArrayNew[i].LS, triArray[i].LS, 3 ); } *szTri = l; + move16(); /* Flag the vertex as added to the hull */ vtxInHull[vtxIdx] = 1; @@ -1813,11 +1886,13 @@ static void add_vertex_to_convex_hull_fx( } #endif + /*-------------------------------------------------------------------------* * visible_edges() * * *-------------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED static void visible_edges_fx( const EFAP_LS_TRIANGLE *triArray, /* i : Triangle array */ @@ -1849,7 +1924,7 @@ static void visible_edges_fx( move16(); FOR( j = 1; j < 3; ++j ) { - IF( tmpMax[i] < triArray[visible[i]].LS[j] ) + if ( LT_16( tmpMax[i], triArray[visible[i]].LS[j] ) ) { tmpMax[i] = triArray[visible[i]].LS[j]; move16(); @@ -1871,9 +1946,13 @@ static void visible_edges_fx( FOR( j = 0; j < 3; ++j ) { a = tmpSurface[j]; + move16(); b = tmpSurface[j + 1]; + move16(); counter[a][b] = add( counter[a][b], 1 ); + move16(); counterTranspose[b][a] = counter[a][b]; + move16(); } } @@ -1882,21 +1961,23 @@ static void visible_edges_fx( FOR( j = 0; j < maxVertex + 1; ++j ) { counter[i][j] = add( counterTranspose[i][j], counterTranspose[j][i] ); + move16(); } } /* Finding the edges */ k = 0; + move16(); FOR( a = 0; a < maxVertex; ++a ) { FOR( b = a + 1; b < maxVertex + 1; ++b ) { - IF( counter[a][b] == 1 ) + IF( EQ_16( counter[a][b], 1 ) ) { edges[k] = a; move16(); - edges[k + 1] = b; + edges[add( k, 1 )] = b; move16(); k = add( k, 2 ); } @@ -1993,6 +2074,8 @@ static void visible_edges( return; } #endif + + #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * flip_plane() @@ -2046,25 +2129,29 @@ static void flip_plane_fx( vtxArray[surface[2]].pos, centroid ); - IF( GT_32( dist, 0 ) ) + IF( dist > 0 ) { /*efap_flipLeftRight( surface, 3 );*/ tmp = surface[0]; + move16(); surface[0] = surface[2]; + move16(); surface[2] = tmp; + move16(); } return; } #endif -#ifndef IVAS_FLOAT_FIXED + /*-------------------------------------------------------------------------* * remap_ghosts() * * *-------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void remap_ghosts( EFAP_VERTEX *vtxArray, /* i/o: Vertex array */ EFAP_LS_TRIANGLE *triArray, /* i/o: Triangle array */ @@ -2209,19 +2296,13 @@ static void remap_ghosts( return; } #else -/*-------------------------------------------------------------------------* - * remap_ghosts_fx() - * - * - *-------------------------------------------------------------------------*/ - static void remap_ghosts_fx( - EFAP_VERTEX *vtxArray, /* i/o: Vertex array */ - EFAP_LS_TRIANGLE *triArray, /* i/o: Triangle array */ - Word16 numSpk, /* i : Number of speakers */ - Word16 *numVertex, /* i/o: Size of vertex array */ - Word16 numTri, /* i : Size of triangle array */ - Word32 **downmixMatrixTranspose /* o : Transpose of downmix matrix */ + EFAP_VERTEX *vtxArray, /* i/o: Vertex array */ + EFAP_LS_TRIANGLE *triArray, /* i/o: Triangle array */ + Word16 numSpk, /* i : Number of speakers */ + Word16 *numVertex, /* i/o: Size of vertex array */ + Word16 numTri, /* i : Size of triangle array */ + Word32 **downmixMatrixTranspose /* o : Transpose of downmix matrix Q31 */ ) { Word16 numGhst = 0; @@ -2235,10 +2316,11 @@ static void remap_ghosts_fx( Word16 neighbours[EFAP_MAX_SIZE_TMP_BUFF]; Word32 tmpVec[EFAP_MAX_SIZE_TMP_BUFF]; Word32 tmpVec2[EFAP_MAX_SIZE_TMP_BUFF]; - Word32 tmpMat[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF]; - Word32 tmpNewMat[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF]; + Word32 tmpMat[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF]; /* Q31 */ + Word32 tmpNewMat[EFAP_MAX_SIZE_TMP_BUFF][EFAP_MAX_SIZE_TMP_BUFF]; /* Q31 */ Word32 tmpDist; const Word32 thresh = 214748; + Word16 tmp16, tmp_e; move32(); // 1e-4f in Q31 set32_fx( tmpVec, 0, EFAP_MAX_SIZE_TMP_BUFF ); @@ -2248,7 +2330,7 @@ static void remap_ghosts_fx( FOR( g = numVtx - 1; g > numSpk - 1; --g ) { /* find(triangle_mat == ghost, 1, 'first') */ - IF( EQ_16( find_int_in_tri_fx( triArray, g, numTri, posFound ), 0 ) ) + IF( find_int_in_tri_fx( triArray, g, numTri, posFound ) == 0 ) { remove_vertex_fx( vtxArray, g, numVtx ); --numVtx; @@ -2259,13 +2341,14 @@ static void remap_ghosts_fx( IF( GT_16( triArray[i].LS[j], g ) ) { triArray[i].LS[j] = sub( g, 1 ); + move16(); } } } } ELSE { - ++numGhst; + numGhst = add( numGhst, 1 ); } } @@ -2278,8 +2361,10 @@ static void remap_ghosts_fx( set32_fx( tmpMat[i], 0, numTot ); set32_fx( tmpNewMat[i], 0, numTot ); - tmpMat[i][i] = 0x7fffffff; - tmpNewMat[i][i] = 0x7fffffff; + tmpMat[i][i] = ONE_IN_Q31; + move32(); + tmpNewMat[i][i] = ONE_IN_Q31; + move32(); } /* Generate initial sound energy distribution matrix */ @@ -2291,15 +2376,20 @@ static void remap_ghosts_fx( FOR( j = 0; j < numTot; ++j ) { tmpMat[j][i] = 0; + move32(); tmpNewMat[j][i] = 0; + move32(); } /* The neighbours are set to 1.0/tmpL */ - inv_tmpL = 0x7fffffff / tmpL; + tmp16 = BASOP_Util_Divide3232_Scale( 1, tmpL, &tmp_e ); + inv_tmpL = L_shl_sat( tmp16, add( Q16, tmp_e ) ); /* Q31 */ FOR( j = 0; j < tmpL; ++j ) { - tmpMat[neighbours[j]][i] = inv_tmpL; - tmpNewMat[neighbours[j]][i] = inv_tmpL; + tmpMat[neighbours[j]][i] = inv_tmpL; /* Q31 */ + move32(); + tmpNewMat[neighbours[j]][i] = inv_tmpL; /* Q31 */ + move32(); } } @@ -2308,24 +2398,25 @@ static void remap_ghosts_fx( { FOR( j = 0; j < numTot; ++j ) { - tmpNewMat[i][j] = tmpMat[j][i]; + tmpNewMat[i][j] = tmpMat[j][i]; /* Q31 */ + move32(); } } FOR( i = numSpk; i < numTot; ++i ) { - mvl2l( tmpNewMat[i], tmpVec, numTot ); + Copy32( tmpNewMat[i], tmpVec, numTot ); tmpDist = sum_l( &tmpVec[numSpk], sub( numTot, numSpk ) ); WHILE( GT_32( tmpDist, thresh ) ) { matrix_times_row_fx( tmpMat, tmpVec, numTot, tmpVec2 ); - mvl2l( tmpVec2, tmpVec, numTot ); - set_l( tmpVec2, 0, numTot ); + Copy32( tmpVec2, tmpVec, numTot ); + set32_fx( tmpVec2, 0, numTot ); tmpDist = sum_l( &tmpVec[numSpk], sub( numTot, numSpk ) ); } - mvl2l( tmpVec, tmpNewMat[i], numTot ); + Copy32( tmpVec, tmpNewMat[i], numTot ); } FOR( i = 0; i < numSpk; ++i ) @@ -2333,9 +2424,11 @@ static void remap_ghosts_fx( /* Applying a sqrt(2) coeff and obtaining the dmMatrix*/ FOR( j = 0; j < numSpk; ++j ) { - IF( EQ_32( tmpNewMat[j][i], 0 ) || EQ_32( tmpNewMat[j][i], 0x7fffffff ) ) + test(); + IF( tmpNewMat[j][i] == 0 || EQ_32( tmpNewMat[j][i], 0x7fffffff ) ) { - downmixMatrixTranspose[j][i] = tmpNewMat[j][i]; + downmixMatrixTranspose[j][i] = tmpNewMat[j][i]; /* Q31 */ + move32(); } ELSE { @@ -2343,7 +2436,8 @@ static void remap_ghosts_fx( move16(); Word32 tmp_sqrt = Sqrt32( tmpNewMat[j][i], &exp ); tmp_sqrt = L_shl( tmp_sqrt, exp ); - downmixMatrixTranspose[j][i] = tmp_sqrt; + downmixMatrixTranspose[j][i] = tmp_sqrt; /* Q31 */ + move32(); } } /* Downmix ghost loudspeakers according to dmxType */ @@ -2352,16 +2446,20 @@ static void remap_ghosts_fx( SWITCH( vtxArray[j].dmxType ) { case EFAP_DMX_NONE: - downmixMatrixTranspose[j][i] = 0; + downmixMatrixTranspose[j][i] = 0; /* Q31 */ + move32(); BREAK; case EFAP_DMX_AMPLITUDE: - downmixMatrixTranspose[j][i] = tmpNewMat[j][i]; + downmixMatrixTranspose[j][i] = tmpNewMat[j][i]; /* Q31 */ + move32(); BREAK; case EFAP_DMX_INTENSITY: default: - IF( EQ_32( tmpNewMat[j][i], 0 ) || EQ_32( tmpNewMat[j][i], 0x7fffffff ) ) + test(); + IF( tmpNewMat[j][i] == 0 || EQ_32( tmpNewMat[j][i], ONE_IN_Q31 ) ) { - downmixMatrixTranspose[j][i] = tmpNewMat[j][i]; + downmixMatrixTranspose[j][i] = tmpNewMat[j][i]; /* Q31 */ + move32(); } ELSE { @@ -2369,7 +2467,8 @@ static void remap_ghosts_fx( move16(); Word32 tmp_sqrt = Sqrt32( tmpNewMat[j][i], &exp ); tmp_sqrt = L_shl( tmp_sqrt, exp ); - downmixMatrixTranspose[j][i] = tmp_sqrt; + downmixMatrixTranspose[j][i] = tmp_sqrt; /* Q31 */ + move32(); } BREAK; } @@ -2384,6 +2483,7 @@ static void remap_ghosts_fx( } #endif + #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * vertex_init() @@ -2432,6 +2532,7 @@ static void vertex_init_fx( } #endif + #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * efap_panning() @@ -2522,7 +2623,9 @@ static void efap_panning_fx( Word32 P[2]; P[0] = azi; + move32(); P[1] = ele; + move32(); /* Finding in which polygon the point is */ polyIdx = get_poly_num_fx( P, polyData ); @@ -2531,18 +2634,23 @@ static void efap_panning_fx( /* Extracting the chan, the azimuth and the ele of the considered poly */ numChan = polyData->polysetArray[polyIdx].numChan; + move16(); FOR( i = 0; i < numChan; ++i ) { chan[i] = polyData->polysetArray[polyIdx].chan[i]; + move16(); aziPoly[i] = polyData->polysetArray[polyIdx].polyAzi[i]; + move32(); - IF( EQ_16( polyData->polysetArray[polyIdx].isNaN[i], 1 ) ) + if ( EQ_16( polyData->polysetArray[polyIdx].isNaN[i], 1 ) ) { aziPoly[i] = P[0]; + move32(); } elePoly[i] = polyData->polysetArray[polyIdx].polyEle[i]; + move32(); } /* Computing the gain for the polygon */ @@ -2558,13 +2666,16 @@ static void efap_panning_fx( FOR( i = 0; i < numChan; ++i ) { bufferL[chan[i]] = Mpy_32_32( tmpBuff[i], normTmpBuff ); + move32(); bufferL[chan[i]] = L_shl( bufferL[chan[i]], exp ); // Q31 + move32(); } return; } #endif + #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * get_poly_gains() @@ -2642,31 +2753,40 @@ static void get_poly_gains_fx( Word32 P_minus_A[2]; P[0] = azi; + move32(); P[1] = ele; + move32(); /* Processing, we search for the triangle in which belong P, then we compute the gain */ FOR( i = 1; i < numChan + 1; ++i ) { A[0] = aziPoly[i - 1]; + move32(); A[1] = elePoly[i - 1]; + move32(); v_sub_fixed( P, A, P_minus_A, 2, 0 ); /* Precalculate value of (P-A) */ FOR( j = i; j < numChan - 2 + i; ++j ) { - idx1 = 1 + ( j % numChan ); - idx2 = 1 + ( idx1 % numChan ); + idx1 = add( 1, ( j % numChan ) ); + idx2 = add( 1, ( idx1 % numChan ) ); - B[0] = aziPoly[idx1 - 1]; - B[1] = elePoly[idx1 - 1]; + B[0] = aziPoly[sub( idx1, 1 )]; + move32(); + B[1] = elePoly[sub( idx1, 1 )]; + move32(); - C[0] = aziPoly[idx2 - 1]; - C[1] = elePoly[idx2 - 1]; + C[0] = aziPoly[sub( idx2, 1 )]; + move32(); + C[1] = elePoly[sub( idx2, 1 )]; + move32(); IF( in_tri_fx( A, B, C, P_minus_A ) ) { buffer[i - 1] = L_shl_sat( get_tri_gain_fx( A, B, C, P_minus_A ), Q12 ); - break; + move32(); + BREAK; } } } @@ -2675,6 +2795,7 @@ static void get_poly_gains_fx( } #endif + #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * get_tri_gain() @@ -2735,7 +2856,9 @@ static Word32 get_tri_gain_fx( /* Processing */ tmpN[0] = L_sub( B[1], C[1] ); + move32(); tmpN[1] = L_sub( C[0], B[0] ); + move32(); v_sub_fixed( B, A, tmpSub1, 2, 0 ); @@ -2746,13 +2869,13 @@ static Word32 get_tri_gain_fx( Word32 inv_tmpDot2 = L_shl( tmpDot1, norm_l( tmpDot1 ) ); exp = sub( exp, norm_l( tmpDot1 ) ); Word16 inv_tmpDot1 = Inv16( (Word16) L_shr( inv_tmpDot2, Q16 ), &exp ); - v_multc_fixed( tmpN, L_shl( inv_tmpDot1, Q16 + exp ), N, 2 ); + v_multc_fixed( tmpN, L_shl( inv_tmpDot1, add( Q16, exp ) ), N, 2 ); tmpDot2 = dotp_fixed( P_minus_A, N, 2 ); // Q18 gain = L_sub( 0x00040000, tmpDot2 ); /* Set gains <= -60dB to 0 to avoid problems in SVD */ - IF( LT_32( L_abs( gain ), 1 ) ) + if ( LT_32( L_abs( gain ), 1 ) ) { gain = 0; move32(); @@ -2760,6 +2883,8 @@ static Word32 get_tri_gain_fx( return gain; // Q18 } #endif + + #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * add_vertex() @@ -2822,8 +2947,8 @@ static void add_vertex( static void add_vertex_fx( EFAP_VERTEX *vtxArray, /* i/o: Handle to the vertex array that will be updated */ - const Word32 azi, /* i : Azimuth of the vertex */ - const Word32 ele, /* i : Elevation of the vertex */ + const Word32 azi, /* i : Azimuth of the vertex Q22 */ + const Word32 ele, /* i : Elevation of the vertex Q22 */ const Word16 pos, /* i : Index in the vtxArray where we want to add the vertex */ const EFAP_VTX_DMX_TYPE dmxType /* i : downmix type for the vertex */ ) @@ -2835,11 +2960,13 @@ static void add_vertex_fx( /* Updating the vertex array */ - tmp = efap_lmodl( L_sub( Q22_180_DEG, azi ), Q22_360_DEG ); + tmp = efap_32mod32( L_sub( Q22_180_DEG, azi ), Q22_360_DEG ); vtxArray[pos].azi = L_sub( Q22_180_DEG, tmp ); - tmp = ( ( Q22_180_DEG < ele ) ? Q22_180_DEG : ele ); - vtxArray[pos].ele = ( ( -Q22_180_DEG > tmp ) ? -Q22_180_DEG : tmp ); + tmp = ( LT_32( Q22_180_DEG, ele ) ? Q22_180_DEG : ele ); + move32(); + vtxArray[pos].ele = ( GT_32( -Q22_180_DEG, tmp ) ? -Q22_180_DEG : tmp ); + move32(); /* Converting spherical coordinates to cartesians, assuming radius = 1 */ sph2cart_fx( vtxArray[pos].azi, vtxArray[pos].ele, &vtxArray[pos].pos[0] ); @@ -2857,7 +2984,7 @@ static void add_vertex_fx( idxEleTmp = L_sub( Q22_90_DEG, idxEleTmp ); /* Final Idx */ - vtxArray[pos].idx = add( (Word16) idxAziTmp, i_mult( 181, (Word16) L_shr( idxEleTmp, Q22 ) ) ); + vtxArray[pos].idx = add( extract_l( idxAziTmp ), i_mult( 181, extract_l( L_shr( idxEleTmp, Q22 ) ) ) ); /* Setting the nan flag to 0 */ vtxArray[pos].isNaN = 0; @@ -2865,11 +2992,13 @@ static void add_vertex_fx( /* Set the default downmix type */ vtxArray[pos].dmxType = dmxType; + move32(); return; } #endif + /*-------------------------------------------------------------------------* * efap_sort_s() * @@ -2890,19 +3019,26 @@ static void efap_sort_s_fx( FOR( i = 0; i < len; i++ ) { idx[i] = i; + move16(); } FOR( i = len - 2; i >= 0; i-- ) { tempr = x[i]; + move16(); tempi = idx[i]; + move16(); FOR( j = i + 1; ( j < len ) && ( tempr > x[j] ); j++ ) { x[j - 1] = x[j]; + move16(); idx[j - 1] = idx[j]; + move16(); } x[j - 1] = tempr; + move16(); idx[j - 1] = tempi; + move16(); } return; @@ -2938,13 +3074,15 @@ static void efap_sort_s( return; } #endif -#ifndef IVAS_FLOAT_FIXED + + /*-------------------------------------------------------------------------* * vertex_distance() * * Compute the signed distance between a vertex and a hull surface *-------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static float vertex_distance( const EFAP_VERTEX *vtxArray, /* i : The considered vertex */ const EFAP_LS_TRIANGLE tri, /* i : The considered triangle */ @@ -2967,12 +3105,6 @@ static float vertex_distance( return point_plane_distance( A, B, C, P ); } #else -/*-------------------------------------------------------------------------* - * vertex_distance() - * - * Compute the signed distance between a vertex and a hull surface - *-------------------------------------------------------------------------*/ - static Word32 vertex_distance_fx( const EFAP_VERTEX *vtxArray, /* i : The considered vertex */ const EFAP_LS_TRIANGLE tri, /* i : The considered triangle */ @@ -2986,16 +3118,21 @@ static Word32 vertex_distance_fx( FOR( i = 0; i < 3; ++i ) { A[i] = vtxArray[tri.LS[0]].pos[i]; + move32(); B[i] = vtxArray[tri.LS[1]].pos[i]; + move32(); C[i] = vtxArray[tri.LS[2]].pos[i]; + move32(); P[i] = vtxArray[vtxIdx].pos[i]; + move32(); } return point_plane_distance_fx( A, B, C, P ); } #endif + #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * point_poly_distance() @@ -3037,6 +3174,7 @@ static Word32 point_poly_distance_fx( } #endif + #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * point_plane_distance() @@ -3102,6 +3240,14 @@ static Word32 point_plane_distance_fx( // returns output in Q28 Word32 dist; /* Check if the point already matches a triangle vertex */ + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); IF( ( EQ_32( X[0], P1[0] ) && EQ_32( X[1], P1[1] ) && EQ_32( X[2], P1[2] ) ) || ( EQ_32( X[0], P2[0] ) && EQ_32( X[1], P2[1] ) && EQ_32( X[2], P2[2] ) ) || ( EQ_32( X[0], P3[0] ) && EQ_32( X[1], P3[1] ) && EQ_32( X[2], P3[2] ) ) ) @@ -3128,6 +3274,7 @@ static Word32 point_plane_distance_fx( // returns output in Q28 } #endif + #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * efap_crossp() @@ -3155,24 +3302,29 @@ static void efap_crossp( *-------------------------------------------------------------------------*/ static void efap_crossp_fx( - const Word32 *v1, /* i : First float vector */ - const Word32 *v2, /* i : Second float vector */ - Word32 *v /* o : Output vector */ + const Word32 *v1, /* i : First float vector Q30 */ + const Word32 *v2, /* i : Second float vector Q30 */ + Word32 *v /* o : Output vector Q29 */ ) { - v[0] = L_sub( Mpy_32_32( v1[1], v2[2] ), Mpy_32_32( v1[2], v2[1] ) ); - v[1] = L_sub( Mpy_32_32( v1[2], v2[0] ), Mpy_32_32( v1[0], v2[2] ) ); - v[2] = L_sub( Mpy_32_32( v1[0], v2[1] ), Mpy_32_32( v1[1], v2[0] ) ); + v[0] = L_sub( Mpy_32_32( v1[1], v2[2] ), Mpy_32_32( v1[2], v2[1] ) ); /* Q29 */ + move32(); + v[1] = L_sub( Mpy_32_32( v1[2], v2[0] ), Mpy_32_32( v1[0], v2[2] ) ); /* Q29 */ + move32(); + v[2] = L_sub( Mpy_32_32( v1[0], v2[1] ), Mpy_32_32( v1[1], v2[0] ) ); /* Q29 */ + move32(); return; } #endif + /*-------------------------------------------------------------------------* * find_int_in_tri() * * Find an integer in triangle array of integers *-------------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED static Word16 find_int_in_tri_fx( const EFAP_LS_TRIANGLE *tri, /* i : Triangle array */ @@ -3191,7 +3343,9 @@ static Word16 find_int_in_tri_fx( IF( EQ_16( tri[i].LS[j], n ) ) { pos[0] = i; + move16(); pos[1] = j; + move16(); return 1; } } @@ -3233,6 +3387,7 @@ static int16_t find_int_in_tri( * * Remove a vertex from a vertex structure *-------------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED static void remove_vertex_fx( EFAP_VERTEX *vtxArray, /* i : Vertex array */ @@ -3279,11 +3434,13 @@ static void remove_vertex( } #endif + /*-------------------------------------------------------------------------* * get_neighbours() * * Returns the neighbouring triangles of a vertex *-------------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED static Word16 get_neighbours_fx( const EFAP_LS_TRIANGLE *triArray, /* i : Triangle array */ @@ -3301,24 +3458,28 @@ static Word16 get_neighbours_fx( /* Processing */ FOR( i = 0; i < numTri; ++i ) { - mvs2s( triArray[i].LS, tmpTriArray[i].LS, 3 ); + Copy( triArray[i].LS, tmpTriArray[i].LS, 3 ); } k = 0; move16(); WHILE( 1 ) { - IF( EQ_16( find_int_in_tri_fx( tmpTriArray, vtxIdx, numTri, tmpPos ), 0 ) ) + IF( find_int_in_tri_fx( tmpTriArray, vtxIdx, numTri, tmpPos ) == 0 ) { BREAK; } ELSE { tmpNeighbours[k] = tmpTriArray[tmpPos[0]].LS[0]; + move16(); tmpNeighbours[k + 1] = tmpTriArray[tmpPos[0]].LS[1]; + move16(); tmpNeighbours[k + 2] = tmpTriArray[tmpPos[0]].LS[2]; - k += 3; + move16(); + k = add( k, 3 ); tmpTriArray[tmpPos[0]].LS[tmpPos[1]] = -1; + move16(); } IF( GT_16( k, i_mult( 3, numTri ) ) ) @@ -3332,16 +3493,19 @@ static Word16 get_neighbours_fx( /* Creating the output vector, by eliminating redundancies and also deleting the indice == vtxIdx*/ neighbours[0] = tmpNeighbours[0]; + move16(); j = 1; move16(); FOR( i = 1; i < k; ++i ) { + test(); IF( NE_16( tmpNeighbours[i], tmpNeighbours[i - 1] ) && NE_16( tmpNeighbours[i], vtxIdx ) ) { neighbours[j] = tmpNeighbours[i]; - ++j; + move16(); + j = add( j, 1 ); } } @@ -3412,6 +3576,7 @@ static int16_t get_neighbours( } #endif + #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * matrix_times_row() @@ -3452,13 +3617,14 @@ static void matrix_times_row_fx( Word32 *out /* o : Output vector */ ) { - int16_t i, j; + Word16 i, j; FOR( i = 0; i < L; ++i ) { FOR( j = 0; j < L; ++j ) { out[i] = L_add( out[i], Mpy_32_32( mat[i][j], vec[j] ) ); + move32(); } } @@ -3466,11 +3632,13 @@ static void matrix_times_row_fx( } #endif + /*-------------------------------------------------------------------------* * tri_to_poly() * * Combines triangles of a surface in order to create polygons *-------------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED static void tri_to_poly_fx( const EFAP_VERTEX *vtxArray, /* i : Vertex array */ @@ -3515,7 +3683,8 @@ static void tri_to_poly_fx( { assert( lenPoly < EFAP_MAX_CHAN_NUM && "EFAP: exceeded max polygon vertices!" ); poly[lenPoly] = j; - ++lenPoly; + move16(); + lenPoly = add( lenPoly, 1 ); } } @@ -3528,30 +3697,35 @@ static void tri_to_poly_fx( { found = compare_poly_fx( sortedChan[j], sortedLengths[j], poly, lenPoly ); - IF( GT_16( found, 0 ) ) + IF( found > 0 ) { BREAK; } - ELSE IF( LT_16( found, 0 ) ) + ELSE IF( found < 0 ) { replaceIdx = j; + move16(); } } - IF( EQ_16( found, 0 ) ) + IF( found == 0 ) { /* append new poly */ - mvs2s( poly, sortedChan[lenPolySet], lenPoly ); + Copy( poly, sortedChan[lenPolySet], lenPoly ); sortedTri[lenPolySet] = i; + move16(); sortedLengths[lenPolySet] = lenPoly; - ++lenPolySet; + move16(); + lenPolySet = add( lenPolySet, 1 ); } ELSE IF( EQ_16( found, -1 ) ) { /* replace with superset */ - mvs2s( poly, sortedChan[replaceIdx], lenPoly ); + Copy( poly, sortedChan[replaceIdx], lenPoly ); sortedTri[replaceIdx] = i; + move16(); sortedLengths[replaceIdx] = lenPoly; + move16(); } } @@ -3564,7 +3738,7 @@ static void tri_to_poly_fx( /* Output */ *outLengthPS = lenPolySet; move16(); - mvs2s( sortedLengths, outLengthSorted, EFAP_MAX_POLY_SET ); + Copy( sortedLengths, outLengthSorted, EFAP_MAX_POLY_SET ); return; } #else @@ -3661,11 +3835,13 @@ static void tri_to_poly( } #endif + /*-------------------------------------------------------------------------* * compare_poly() * * Compares a newly created polygon with an existing one *-------------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED static Word16 compare_poly_fx( Word16 *old, /* i : Existing polygon */ @@ -3692,6 +3868,8 @@ static Word16 compare_poly_fx( } } + test(); + test(); IF( EQ_16( count, lenOld ) && LT_16( lenOld, lenNew ) ) { /* new polygon is a superset */ @@ -3751,13 +3929,14 @@ static int16_t compare_poly( } #endif -#ifndef IVAS_FLOAT_FIXED + /*-------------------------------------------------------------------------* * sort_channels_vertex() * * Sort the channels of a polygon set according to the vertex azimuth *-------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void sort_channels_vertex( const EFAP_VERTEX *vtxArray, /* i : Vertex array */ const EFAP_LS_TRIANGLE *triArray, /* i : Triangle array */ @@ -3843,12 +4022,6 @@ static void sort_channels_vertex( return; } #else -/*-------------------------------------------------------------------------* - * sort_channels_vertex() - * - * Sort the channels of a polygon set according to the vertex azimuth - *-------------------------------------------------------------------------*/ - static void sort_channels_vertex_fx( const EFAP_VERTEX *vtxArray, /* i : Vertex array */ const EFAP_LS_TRIANGLE *triArray, /* i : Triangle array */ @@ -3879,8 +4052,11 @@ static void sort_channels_vertex_fx( FOR( i = 0; i < 3; ++i ) { P1[i] = vtxArray[triArray[idxTri].LS[0]].pos[i]; // Q31 + move32(); P2[i] = vtxArray[triArray[idxTri].LS[1]].pos[i]; // Q31 + move32(); P3[i] = vtxArray[triArray[idxTri].LS[2]].pos[i]; // Q31 + move32(); } /* First Base Vector */ @@ -3898,6 +4074,7 @@ static void sort_channels_vertex_fx( FOR( i = 0; i < 3; i++ ) { tmpV2[i] = L_shl( tmpV2[i], add( Q2, shl( exp1, 1 ) ) ); + move32(); } v_sub_fixed( tmpV1, tmpV2, tmpV3, 3, 0 ); // tmpV3 Q30 @@ -3910,7 +4087,8 @@ static void sort_channels_vertex_fx( /* Center of the first Triangle */ FOR( i = 0; i < 3; ++i ) { - MC[i] = L_shl( L_add( L_add( L_shr( P1[i], Q2 ), L_shr( P2[i], Q2 ) ), L_shr( P3[i], Q2 ) ) / 3, Q2 ); + MC[i] = L_shl( Mpy_32_32( L_add( L_add( L_shr( P1[i], Q2 ), L_shr( P2[i], Q2 ) ), L_shr( P3[i], Q2 ) ), 715827883 /* 1 / 3 in Q31 */ ), Q2 ); + move32(); } /* Sort Vertices */ @@ -3919,6 +4097,7 @@ static void sort_channels_vertex_fx( FOR( j = 0; j < 3; ++j ) { tmpP[j] = vtxArray[channels[i]].pos[j]; + move32(); } v_sub_fixed( tmpP, MC, P, 3, 1 ); // P Q30 @@ -3927,7 +4106,8 @@ static void sort_channels_vertex_fx( y = dotp_fixed( P, V, 3 ); // y Q29 - exp2 // Executing azi[i] = atan2f( y, x ); - azi[i] = L_shl( (Word32) BASOP_util_atan2( y, x, sub( exp2, exp1 ) ), Q16 ); // azi 2Q29 + azi[i] = L_shl( BASOP_util_atan2( y, x, sub( exp2, exp1 ) ), Q16 ); // azi 2Q29 + move32(); } /* Sorting the azi vec */ @@ -3937,15 +4117,17 @@ static void sort_channels_vertex_fx( FOR( i = 0; i < lengthChannels; ++i ) { newChannels[i] = channels[order[i]]; + move16(); } /* return Success */ - mvs2s( newChannels, channels, lengthChannels ); + Copy( newChannels, channels, lengthChannels ); return; } #endif + #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------------* * efap_fmodf() @@ -3963,28 +4145,37 @@ static float efap_fmodf( } #else /*-------------------------------------------------------------------------* - * efap_lmodl() + * efap_32mod32() * * Modulus operation that will handle negative values the same way as matlab *-------------------------------------------------------------------------*/ -static Word32 efap_lmodl( +static Word32 efap_32mod32( const Word32 x, /* i : Dividend */ const Word32 y /* i : Divisor */ ) { Word32 result = x % y; - return GE_32( result, 0 ) ? result : L_add( result, y ); + move32(); + IF( result >= 0 ) + { + return result; + } + ELSE + { + return L_add( result, y ); + } } #endif -#ifndef IVAS_FLOAT_FIXED + /*-------------------------------------------------------------------------* * get_poly_num() * * Returns the index of the polygon in which the coordinate is *-------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static int16_t get_poly_num( const float P[2], /* i : Azimuth and elevation of the point */ const EFAP_POLYSET_DATA *polyData /* i : Polyset struct */ @@ -4041,12 +4232,6 @@ static int16_t get_poly_num( return found_poly; } #else -/*-------------------------------------------------------------------------* - * get_poly_num() - * - * Returns the index of the polygon in which the coordinate is - *-------------------------------------------------------------------------*/ - static Word16 get_poly_num_fx( const Word32 P[2], /* i : Azimuth and elevation of the point */ const EFAP_POLYSET_DATA *polyData /* i : Polyset struct */ @@ -4072,19 +4257,21 @@ static Word16 get_poly_num_fx( { /* select only polygons which are visible from the point */ dist_tmp = point_poly_distance_fx( polyData->polysetArray[i], pos ); - IF( EQ_32( dist_tmp, 0 ) ) + IF( dist_tmp == 0 ) { return i; } - ELSE IF( GT_32( dist_tmp, 0 ) ) + ELSE IF( dist_tmp > 0 ) { poly_tmp[num_poly] = i; + move16(); poly_dist[num_poly] = dist_tmp; - num_poly++; + move32(); + num_poly = add( num_poly, 1 ); } } } - IF( EQ_16( num_poly, 0 ) ) + IF( num_poly == 0 ) { return -1; } @@ -4093,13 +4280,15 @@ static Word16 get_poly_num_fx( found_poly = poly_tmp[0]; move16(); dist_tmp = poly_dist[0]; - move16(); + move32(); FOR( i = 1; i < num_poly; i++ ) { IF( LT_32( poly_dist[i], dist_tmp ) ) { found_poly = poly_tmp[i]; + move16(); dist_tmp = poly_dist[i]; + move32(); } } @@ -4107,13 +4296,14 @@ static Word16 get_poly_num_fx( } #endif -#ifndef IVAS_FLOAT_FIXED + /*-------------------------------------------------------------------------* * in_poly() * * Determines if a given point is within a polygon or not *-------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static int16_t in_poly( const float P[2], /* i : Azimuth and elevation of the point */ const EFAP_POLYSET poly /* i : Polyset struct */ @@ -4178,12 +4368,6 @@ static int16_t in_poly( return 0; } #else -/*-------------------------------------------------------------------------* - * in_poly_fx() - * - * Determines if a given point is within a polygon or not - *-------------------------------------------------------------------------*/ - static Word16 in_poly_fx( /* Angles are in Q22 */ const Word32 P[2], /* i : Azimuth and elevation of the point */ const EFAP_POLYSET poly /* i : Polyset struct */ @@ -4195,6 +4379,7 @@ static Word16 in_poly_fx( /* Angles are in Q22 */ Word32 B[2]; Word32 C[2]; Word32 P_minus_A[2]; + move16(); /* Safety check */ @@ -4216,6 +4401,7 @@ static Word16 in_poly_fx( /* Angles are in Q22 */ move32(); } A[1] = poly.polyEle[0]; + move32(); v_sub_fixed( P, A, P_minus_A, 2, 0 ); /* Precalculate value of (P-A) */ @@ -4224,22 +4410,28 @@ static Word16 in_poly_fx( /* Angles are in Q22 */ IF( poly.isNaN[n] ) { B[0] = P[0]; + move32(); } ELSE { B[0] = poly.polyAzi[n]; + move32(); } B[1] = poly.polyEle[n]; + move32(); IF( poly.isNaN[n + 1] ) { C[0] = P[0]; + move32(); } ELSE { C[0] = poly.polyAzi[n + 1]; + move32(); } C[1] = poly.polyEle[n + 1]; + move32(); IF( in_tri_fx( A, B, C, P_minus_A ) ) { @@ -4251,13 +4443,14 @@ static Word16 in_poly_fx( /* Angles are in Q22 */ } #endif -#ifndef IVAS_FLOAT_FIXED + /*-------------------------------------------------------------------------* * in_tri() * * Determines if a given point is within a triangle or not *-------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static int16_t in_tri( float A[2], /* i : Coordinate of one apex of the triangle */ float B[2], /* i : Coordinate of one apex of the triangle */ @@ -4310,12 +4503,6 @@ static int16_t in_tri( } } #else -/*-------------------------------------------------------------------------* - * in_tri_fx() - * - * Determines if a given point is within a triangle or not - *-------------------------------------------------------------------------*/ - static Word16 in_tri_fx( Word32 A[2], /* i : Coordinate of one apex of the triangle */ Word32 B[2], /* i : Coordinate of one apex of the triangle */ @@ -4326,9 +4513,11 @@ static Word16 in_tri_fx( Word32 tmpDot1[2], tmpDot2[2]; Word32 matInv[2][2]; Word32 invFactor; - Word64 invFactor_w64; + Word16 tmp16, tmp_e; Word64 S[2]; + /* Threshold adjusted */ Word64 thresh_int = 21475; // 1e-6f in Q32 + move64(); /* Not a Valid Triangle : Colinear edges @@ -4343,22 +4532,27 @@ static Word16 in_tri_fx( /* Verification of the non-colinearity : Q22 * Q22 = Q13 */ invFactor = L_sub( Mpy_32_32( tmpDot1[0], tmpDot2[1] ), Mpy_32_32( tmpDot1[1], tmpDot2[0] ) ); - IF( EQ_32( invFactor, 0 ) ) + IF( invFactor == 0 ) { return 0; } - invFactor_w64 = W_shr( ( (Word64) 0x7FFFFFFFFFFFFFFF ) / ( (Word64) invFactor ), Q19 ); // Q31 - invFactor = (Word32) invFactor_w64; + /* invFactor = 1.f / invFactor; */ + tmp16 = BASOP_Util_Divide3232_Scale( ONE_IN_Q13, invFactor, &tmp_e ); + invFactor = L_shl_sat( tmp16, add( Q16, tmp_e ) ); /* Q31 */ Word16 invFactor_exp = norm_l( invFactor ); invFactor = L_shl( invFactor, invFactor_exp ); // Q22 = Q22 * Q31 matInv[0][0] = Mpy_32_32( tmpDot2[1], invFactor ); + move32(); matInv[0][1] = Mpy_32_32( L_negate( tmpDot2[0] ), invFactor ); + move32(); matInv[1][0] = Mpy_32_32( L_negate( tmpDot1[1] ), invFactor ); + move32(); matInv[1][1] = Mpy_32_32( tmpDot1[0], invFactor ); + move32(); /* Computing S (Q13 + matInv_exp_final[i] + P_minus_A_exp_final + invFactor_exp - 1 ) = matInv (Q22 + matInv_exp_final[i] + invFactor_exp) *(P-A) (Q22 + P_minus_A_exp_final) */ @@ -4370,46 +4564,55 @@ static Word16 in_tri_fx( { matInv_exp[i][j] = 31; move16(); - IF( NE_32( matInv[i][j], 0 ) ) + IF( matInv[i][j] != 0 ) { matInv_exp[i][j] = norm_l( matInv[i][j] ); + move16(); } } matInv_exp_final[i] = s_min( matInv_exp[i][0], matInv_exp[i][1] ); + move16(); P_minus_A_exp[i] = 31; move16(); - IF( NE_32( P_minus_A[i], 0 ) ) + IF( P_minus_A[i] != 0 ) { P_minus_A_exp[i] = norm_l( P_minus_A[i] ); + move16(); } } P_minus_A_exp_final = s_min( P_minus_A_exp[0], P_minus_A_exp[1] ); S[0] = L_add( L_shr( Mpy_32_32( L_shl( matInv[0][0], matInv_exp_final[0] ), L_shl( P_minus_A[0], P_minus_A_exp_final ) ), Q1 ), L_shr( Mpy_32_32( L_shl( matInv[0][1], matInv_exp_final[0] ), L_shl( P_minus_A[1], P_minus_A_exp_final ) ), Q1 ) ); + move64(); S[1] = L_add( L_shr( Mpy_32_32( L_shl( matInv[1][0], matInv_exp_final[1] ), L_shl( P_minus_A[0], P_minus_A_exp_final ) ), Q1 ), L_shr( Mpy_32_32( L_shl( matInv[1][1], matInv_exp_final[1] ), L_shl( P_minus_A[1], P_minus_A_exp_final ) ), Q1 ) ); + move64(); /* Checking if we are in the triangle; For the theory, check Christian Borss article, section 3.2 */ // Q32 S - IF( LT_16( ( Q20 - matInv_exp_final[0] - P_minus_A_exp_final - invFactor_exp ), 0 ) ) + IF( sub( sub( sub( Q20, matInv_exp_final[0] ), P_minus_A_exp_final ), invFactor_exp ) < 0 ) { - S[0] = S[0] >> ( matInv_exp_final[0] + P_minus_A_exp_final + invFactor_exp - Q20 ); + S[0] = W_shr( S[0], sub( add( add( matInv_exp_final[0], P_minus_A_exp_final ), invFactor_exp ), Q20 ) ); + move64(); } ELSE { - S[0] = S[0] << ( Q20 - matInv_exp_final[0] - P_minus_A_exp_final - invFactor_exp ); + S[0] = W_shl( S[0], sub( sub( sub( Q20, matInv_exp_final[0] ), P_minus_A_exp_final ), invFactor_exp ) ); + move64(); } - IF( LT_16( ( Q20 - matInv_exp_final[1] - P_minus_A_exp_final - invFactor_exp ), 0 ) ) + IF( sub( sub( sub( Q20, matInv_exp_final[1] ), P_minus_A_exp_final ), invFactor_exp ) < 0 ) { - S[1] = S[1] >> ( matInv_exp_final[1] + P_minus_A_exp_final + invFactor_exp - Q20 ); + S[1] = W_shr( S[1], sub( add( add( matInv_exp_final[1], P_minus_A_exp_final ), invFactor_exp ), Q20 ) ); + move64(); } ELSE { - S[1] = S[1] << ( Q20 - matInv_exp_final[1] - P_minus_A_exp_final - invFactor_exp ); + S[1] = W_shl( S[1], sub( sub( sub( Q20, matInv_exp_final[1] ), P_minus_A_exp_final ), invFactor_exp ) ); + move64(); } - IF( LT_64( S[0], -thresh_int ) || LT_64( S[1], -thresh_int ) || GT_64( ( S[0] + S[1] ), ( ( (Word64) 1 ) << 32 ) + thresh_int ) ) + IF( LT_64( S[0], -thresh_int ) || LT_64( S[1], -thresh_int ) || GT_64( W_add( S[0], S[1] ), W_add( W_shl( 1, 32 ), thresh_int ) ) ) { return 0; } @@ -4447,9 +4650,9 @@ static void sph2cart( *-------------------------------------------------------------------------*/ static void sph2cart_fx( - const Word32 azi, /* i : Azimuth in degrees (Q22) */ - const Word32 ele, /* i : Elevation in degrees (Q22) */ - Word32 *pos /* o : Cartesian coordinates vector (x, y, z) */ + const Word32 azi, /* i : Azimuth in degrees Q22 */ + const Word32 ele, /* i : Elevation in degrees Q22 */ + Word32 *pos /* o : Cartesian coordinates vector (x, y, z) Q31 */ ) { Word16 azi_temp, ele_temp; @@ -4457,9 +4660,12 @@ static void sph2cart_fx( azi_temp = extract_l( L_shr( Mpy_32_32( azi, ONE_BY_360_Q31 ), Q7 ) ); /* Q15 */ ele_temp = extract_l( L_shr( Mpy_32_32( ele, ONE_BY_360_Q31 ), Q7 ) ); /* Q15 */ - pos[0] = Mpy_32_16( getCosWord16R2( azi_temp ), 0, getCosWord16R2( ele_temp ) ); - pos[1] = Mpy_32_16( getSineWord16R2( azi_temp ), 0, getCosWord16R2( ele_temp ) ); - pos[2] = L_shl( getSineWord16R2( ele_temp ), Q16 ); + pos[0] = Mpy_32_16( getCosWord16R2( azi_temp ), 0, getCosWord16R2( ele_temp ) ); /* Q31 */ + move32(); + pos[1] = Mpy_32_16( getSineWord16R2( azi_temp ), 0, getCosWord16R2( ele_temp ) ); /* Q31 */ + move32(); + pos[2] = L_shl( getSineWord16R2( ele_temp ), Q16 ); /* Q31 */ + move32(); return; } diff --git a/lib_rend/ivas_hrtf.c b/lib_rend/ivas_hrtf.c index 6a76c438d..28ba346ca 100644 --- a/lib_rend/ivas_hrtf.c +++ b/lib_rend/ivas_hrtf.c @@ -201,12 +201,13 @@ void ivas_HRTF_CRend_binary_close( * * Allocate HRTF binary handle for FASTCONV renderer *-----------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED ivas_error ivas_HRTF_fastconv_binary_open_fx( HRTFS_FASTCONV **hHrtfFastConv ) { *hHrtfFastConv = (HRTFS_FASTCONV *) malloc( sizeof( HRTFS_FASTCONV ) ); - if ( *hHrtfFastConv == NULL ) + IF( *hHrtfFastConv == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FASTCONV HRTF tables!" ); } @@ -227,6 +228,7 @@ ivas_error ivas_HRTF_fastconv_binary_open( } #endif + /*-----------------------------------------------------------------------* * ivas_HRTF_fastconv_binary_close() * diff --git a/lib_rend/ivas_limiter.c b/lib_rend/ivas_limiter.c index 4d42d645c..fe2b843a7 100644 --- a/lib_rend/ivas_limiter.c +++ b/lib_rend/ivas_limiter.c @@ -37,12 +37,18 @@ #include "ivas_prot_rend.h" #include "wmc_auto.h" #include +#ifdef IVAS_FLOAT_FIXED +#include "ivas_prot_fx.h" +#endif + + #ifdef IVAS_FLOAT_FIXED #define ATTACK_CNST_48k ( 2106670080 ) // Q31 #define ATTACK_CNST_32k ( 2086555136 ) // Q31 #define ATTACK_CNST_16k ( 2027355264 ) // Q31 #define ATTACK_CNST_8k ( 1913946752 ) // Q31 #endif + Word32 release_cnst_table[201] = // Q31 { 2106670080, @@ -248,12 +254,15 @@ Word32 release_cnst_table[201] = // Q31 2147277568, }; + /*-------------------------------------------------------------------* * detect_strong_saturations() * * Detection of very strong saturations, * usually happens as a consequence of a heavy corrupted bitstream *-------------------------------------------------------------------*/ + +/*! r: apply_strong_limiting flag */ #ifndef IVAS_FLOAT_FIXED /*! r: apply_strong_limiting flag */ static int16_t detect_strong_saturations( @@ -303,65 +312,70 @@ static int16_t detect_strong_saturations( return apply_strong_limiting; } #else -/*-------------------------------------------------------------------* - * detect_strong_saturations() - * - * Detection of very strong saturations, - * usually happens as a consequence of a heavy corrupted bitstream - *-------------------------------------------------------------------*/ - -/*! r: apply_strong_limiting flag */ static Word16 detect_strong_saturations_fx( const Word16 BER_detect, /* i : BER detect flag */ Word16 *strong_saturation_cnt, /* i/o: counter of strong saturations */ const Word32 max_val, /* i : maximum absolute value */ Word32 *frame_gain, /* i/o: frame gain value */ - Word16 q_factor /*Q factor of the output samples*/ + Word16 q_factor /* i : Q factor of the output samples */ ) { Word16 apply_strong_limiting; Word64 compare_max_value_Mul_3, compare_max_value_Mul_10; apply_strong_limiting = 0; + move16(); compare_max_value_Mul_3 = W_shl( 98187, q_factor ); // 3 * IVAS_LIMITER_THRESHOLD compare_max_value_Mul_10 = W_shl( 327290, q_factor ); // 10 * IVAS_LIMITER_THRESHOLD + test(); IF( BER_detect ) { *strong_saturation_cnt = 50; + move16(); apply_strong_limiting = 1; + move16(); } ELSE IF( GT_64( max_val, compare_max_value_Mul_3 ) && GT_16( *strong_saturation_cnt, 0 ) ) { apply_strong_limiting = 1; + move16(); } ELSE IF( GT_64( max_val, compare_max_value_Mul_10 ) ) { - *strong_saturation_cnt += 20; - *strong_saturation_cnt = min( *strong_saturation_cnt, 50 ); + *strong_saturation_cnt = add( *strong_saturation_cnt, 20 ); + move16(); + *strong_saturation_cnt = s_min( *strong_saturation_cnt, 50 ); + move16(); apply_strong_limiting = 1; + move16(); } - else + ELSE { ( *strong_saturation_cnt )--; - *strong_saturation_cnt = max( *strong_saturation_cnt, 0 ); + *strong_saturation_cnt = s_max( *strong_saturation_cnt, 0 ); + move16(); } - if ( apply_strong_limiting ) + IF( apply_strong_limiting ) { - IF( LT_32( *frame_gain, 322122547 ) ) // Q30 of 0.3 is compared + IF( LT_32( *frame_gain, 322122547 /* 0.3 in Q30 */ ) ) { - *frame_gain = Mpy_32_16_1( *frame_gain, 10923 /* 1/3 in Q15 */ ); // Q30 + /* *frame_gain /= 3.0f; */ + *frame_gain = Mpy_32_16_1( *frame_gain, 10923 /* 1/3 in Q15 */ ); /* Q30 */ + move32(); } ELSE { apply_strong_limiting = 0; + move16(); } } return apply_strong_limiting; } #endif -#ifdef IVAS_FLOAT_FIXED + + /*-------------------------------------------------------------------* * ivas_limiter_open() * @@ -369,61 +383,71 @@ static Word16 detect_strong_saturations_fx( *-------------------------------------------------------------------*/ /*! r : limiter struct handle */ -ivas_error ivas_limiter_open( +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_limiter_open_fx( IVAS_LIMITER_HANDLE *hLimiter_out, /* o : limiter struct handle */ - const int16_t max_num_channels, /* i : maximum number of I/O channels to be processed */ - const int32_t sampling_rate /* i : sampling rate for processing */ + const Word16 max_num_channels, /* i : maximum number of I/O channels to be processed */ + const Word32 sampling_rate /* i : sampling rate for processing */ ) { - int16_t i; + Word16 i; IVAS_LIMITER_HANDLE hLimiter; Word32 attack_cnst_fx = 0; - if ( max_num_channels <= 0 || sampling_rate <= 0 ) + move32(); + test(); + IF( max_num_channels <= 0 || sampling_rate <= 0 ) { return ( IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Wrong parameters for Limiter\n" ) ); } - if ( ( hLimiter = malloc( sizeof( IVAS_LIMITER ) ) ) == NULL ) + IF( ( hLimiter = malloc( sizeof( IVAS_LIMITER ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Limiter handle\n" ) ); } hLimiter->max_num_channels = max_num_channels; + move16(); hLimiter->num_channels = max_num_channels; + move16(); - /*if ( ( hLimiter->channel_ptrs = malloc( max_num_channels * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Limiter handle\n" ) ); - }*/ - if ( ( hLimiter->channel_ptrs_fx = malloc( max_num_channels * sizeof( Word32 * ) ) ) == NULL ) + IF( ( hLimiter->channel_ptrs_fx = malloc( max_num_channels * sizeof( Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Limiter handle\n" ) ); } hLimiter->sampling_rate = sampling_rate; + move32(); hLimiter->gain_fx = ONE_IN_Q30; - hLimiter->release_heuristic_fx = 0; + move32(); + hLimiter->release_heuristic_fx = 0; /* Q30 */ + move32(); SWITCH( sampling_rate ) { case 48000: attack_cnst_fx = ATTACK_CNST_48k; + move32(); BREAK; case 32000: attack_cnst_fx = ATTACK_CNST_32k; + move32(); BREAK; case 16000: attack_cnst_fx = ATTACK_CNST_16k; + move32(); BREAK; case 8000: attack_cnst_fx = ATTACK_CNST_8k; + move32(); BREAK; default: assert( 0 ); } hLimiter->attack_constant_fx = attack_cnst_fx; /* Q31 */ + move32(); hLimiter->strong_saturation_count = 0; + move16(); - for ( i = 0; i < max_num_channels; ++i ) + FOR( i = 0; i < max_num_channels; ++i ) { hLimiter->channel_ptrs_fx[i] = NULL; } @@ -433,13 +457,6 @@ ivas_error ivas_limiter_open( return IVAS_ERR_OK; } #else -/*-------------------------------------------------------------------* - * ivas_limiter_open() - * - * Allocate and initialize limiter struct - *-------------------------------------------------------------------*/ - -/*! r : limiter struct handle */ ivas_error ivas_limiter_open( IVAS_LIMITER_HANDLE *hLimiter_out, /* o : limiter struct handle */ const int16_t max_num_channels, /* i : maximum number of I/O channels to be processed */ @@ -482,23 +499,25 @@ ivas_error ivas_limiter_open( return IVAS_ERR_OK; } #endif -#ifdef IVAS_FLOAT_FIXED + + /*-------------------------------------------------------------------* * ivas_limiter_close() * * Deallocate limiter struct *-------------------------------------------------------------------*/ -void ivas_limiter_close( +#ifdef IVAS_FLOAT_FIXED +void ivas_limiter_close_fx( IVAS_LIMITER_HANDLE *phLimiter /* i/o: pointer to limiter handle, can be NULL */ ) { + test(); IF( phLimiter == NULL || *phLimiter == NULL ) { return; } - // free( ( *phLimiter )->channel_ptrs ); free( ( *phLimiter )->channel_ptrs_fx ); free( *phLimiter ); *phLimiter = NULL; @@ -506,12 +525,6 @@ void ivas_limiter_close( return; } #else -/*-------------------------------------------------------------------* - * ivas_limiter_close() - * - * Deallocate limiter struct - *-------------------------------------------------------------------*/ - void ivas_limiter_close( IVAS_LIMITER_HANDLE *phLimiter /* i/o: pointer to limiter handle, can be NULL */ ) @@ -528,7 +541,8 @@ void ivas_limiter_close( return; } #endif -#ifdef IVAS_FLOAT_FIXED + + /*-------------------------------------------------------------------* * ivas_limiter_dec() * @@ -536,18 +550,22 @@ void ivas_limiter_close( * release time and special handling of bit errors *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED void ivas_limiter_dec_fx( IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ Word32 *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ const Word16 num_channels, /* i : number of channels to be processed */ const Word16 output_frame, /* i : number of samples per channel in the buffer */ const Word16 BER_detect, /* i : BER detect flag */ - Word16 q_factor ) + Word16 q_factor /* i : Q factor of the output samples */ +) { Word16 c; Word32 **channels; /* return early if given bad parameters */ + test(); + test(); IF( hLimiter == NULL || output == NULL || output_frame <= 0 ) { return; @@ -555,7 +573,8 @@ void ivas_limiter_dec_fx( /* Update number of channels and prepare pointers to the beginning of each of them */ assert( num_channels <= hLimiter->max_num_channels && "Number of channels must be lower than the maximum set during limiter initialization!" ); - hLimiter->num_channels = min( num_channels, hLimiter->max_num_channels ); + hLimiter->num_channels = s_min( num_channels, hLimiter->max_num_channels ); + move16(); channels = hLimiter->channel_ptrs_fx; FOR( c = 0; c < num_channels; ++c ) @@ -568,14 +587,6 @@ void ivas_limiter_dec_fx( return; } #else - -/*-------------------------------------------------------------------* - * ivas_limiter_dec() - * - * In-place saturation control for multichannel buffers with adaptive - * release time and special handling of bit errors - *-------------------------------------------------------------------*/ - void ivas_limiter_dec( IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ float *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ @@ -608,7 +619,8 @@ void ivas_limiter_dec( return; } #endif -#ifdef IVAS_FLOAT_FIXED + + /*-------------------------------------------------------------------* * limiter_process() * @@ -617,13 +629,14 @@ void ivas_limiter_dec( * of calling this directly. *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED void limiter_process_fx( IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ const Word16 output_frame, /* i : number of samples to be processed per channel in the I/O buffer */ const Word32 threshold, /* i : signal amplitude above which limiting starts to be applied */ const Word16 BER_detect, /* i : BER detect flag */ Word16 *strong_saturation_cnt, /* i/o: counter of strong saturations (can be NULL) */ - Word16 q_factor /*Q factor of output samples*/ + Word16 q_factor /* i : Q factor of output samples */ ) { Word16 i, c; @@ -632,38 +645,46 @@ void limiter_process_fx( Word32 releaseHeuristic, releaseHeuristic_cnst, releaseHeuristic_cnst_2; Word16 apply_limiting, apply_strong_limiting; Word32 **output; - Word16 num_channels, q_fact_gain, scale, result; + Word16 num_channels, scale, result; Word32 release_constant, compare_value; Word32 div32, gain, frame_gain, attack_constant; /* return early if given nonsensical values */ + test(); IF( hLimiter == NULL || output_frame <= 0 ) { return; } apply_limiting = 1; + move16(); apply_strong_limiting = 0; + move16(); gain = hLimiter->gain_fx; + move32(); output = hLimiter->channel_ptrs_fx; num_channels = hLimiter->num_channels; + move16(); // sampling_rate = hLimiter->sampling_rate; attack_constant = hLimiter->attack_constant_fx; /* Q31 */ + move32(); /*-----------------------------------------------------------------* * Find highest absolute peak sample value *-----------------------------------------------------------------*/ max_val = 0; + move32(); FOR( i = 0; i < output_frame; i++ ) { FOR( c = 0; c < num_channels; c++ ) { tmp = L_abs( output[c][i] ); - IF( GT_32( tmp, max_val ) ) + if ( GT_32( tmp, max_val ) ) { max_val = tmp; + move32(); } } } @@ -688,21 +709,25 @@ void limiter_process_fx( case 320: case 160: releaseHeuristic_cnst = 85899345; + move32(); releaseHeuristic_cnst_2 = 21474836; - break; + move32(); + BREAK; default: releaseHeuristic_cnst = 21474836; + move32(); releaseHeuristic_cnst_2 = 5368709; - break; + move32(); + BREAK; } - releaseHeuristic = hLimiter->release_heuristic_fx; - q_fact_gain = Q30; + releaseHeuristic = hLimiter->release_heuristic_fx; /* Q30 */ + move32(); IF( GT_32( max_val, threshold ) ) { - frame_gain = L_shl( divide3232( threshold, max_val ), 15 ); // to q30 - releaseHeuristic = min( ONE_IN_Q30, L_add( releaseHeuristic, releaseHeuristic_cnst ) ); // releaseHeuristic_cnst is Q30 of ( 4.f * output_frame / sampling_rate ) - // release_constant = powf( 0.01f, 1.0f / ( 0.005f * powf( 200.f, .08 ) * sampling_rate ) ); + frame_gain = L_shl( divide3232( threshold, max_val ), 15 ); // to q30 + releaseHeuristic = L_min( ONE_IN_Q30, L_add( releaseHeuristic, releaseHeuristic_cnst ) ); // releaseHeuristic_cnst is Q30 of ( 4.f * output_frame / sampling_rate ) + // release_constant = powf( 0.01f, 1.0f / ( 0.005f * powf( 200.f, .08 ) * sampling_rate ) ); /* Unoptimized code for reference */ /* releaseHeuristic = min( 1.f, releaseHeuristic + ( (float) 2.f * output_frame / sampling_rate / adaptiveReleaseWindowLengthInSeconds ) ); * ^ @@ -711,7 +736,7 @@ void limiter_process_fx( } ELSE { - releaseHeuristic = max( 0, L_sub( releaseHeuristic, releaseHeuristic_cnst_2 ) ); // releaseHeuristic_cnst_2 is Q30 of output_frame / sampling_rate ) + releaseHeuristic = L_max( 0, L_sub( releaseHeuristic, releaseHeuristic_cnst_2 ) ); // releaseHeuristic_cnst_2 is Q30 of output_frame / sampling_rate ) /* Unoptimized code for reference */ /*releaseHeuristic = max( 0.f, releaseHeuristic - ( (float) 0.5f * output_frame / sampling_rate / adaptiveReleaseWindowLengthInSeconds ) ); * ^ @@ -719,28 +744,32 @@ void limiter_process_fx( */ /* No samples above threshold and gain from previous frame is already 1.f, * therefore gain == 1.f for the entire frame. Skip processing. */ - IF( GE_32( gain, ( L_shl( 1, q_fact_gain ) ) ) ) + if ( GE_32( gain, ONE_IN_Q30 ) ) { apply_limiting = 0; + move16(); } /* No samples above threshold but gain from previous frame is not 1.f, * transition to gain == 1.f */ - frame_gain = L_shl( 1, q_fact_gain ); + frame_gain = ONE_IN_Q30; } /* Detection of very strong saturations */ - if ( strong_saturation_cnt != NULL ) + IF( strong_saturation_cnt != NULL ) { apply_strong_limiting = detect_strong_saturations_fx( BER_detect, strong_saturation_cnt, max_val, &frame_gain, q_factor ); } compare_value = 107374182; // Q30 of 0.1f + move32(); /* Limit gain reduction to 20dB. Any peaks that require gain reduction * higher than this are most likely due to bit errors during decoding */ + test(); IF( LT_32( frame_gain, compare_value ) && !apply_strong_limiting ) { frame_gain = compare_value; + move32(); } - if ( apply_limiting ) + IF( apply_limiting ) { /* 99% time constants of the gain curve * @@ -748,9 +777,11 @@ void limiter_process_fx( * samples the gain curve will reach 99% of its target value */ div32 = 5368709; // Q30 of 0.005 which is the lowest values for (output_frame / sampling_rate) + move32(); result = BASOP_Util_Divide3232_Scale( releaseHeuristic, div32, &scale ); - release_constant = release_cnst_table[shr( result, ( 15 - scale ) )]; + release_constant = release_cnst_table[shr( result, sub( 15, scale ) )]; /* Q31 */ + move32(); /* Unoptimized code for reference */ /* releaseTimeInSeconds = 0.005f * powf(200.f, releaseHeuristic); <-- Map heuristic value (0; 1) exponentially to range (0.005; 1) * release_constant = powf( 0.01f, 1.0f / ( releaseTimeInSeconds * sampling_rate ) ); @@ -765,11 +796,11 @@ void limiter_process_fx( /* Update gain */ IF( LT_32( frame_gain, gain ) ) { - gain = L_add( Mpy_32_32( attack_constant, ( L_sub( gain, frame_gain ) ) ), frame_gain ); // q30 + gain = L_add( Mpy_32_32( attack_constant, ( L_sub( gain, frame_gain ) ) ), frame_gain ); /* Q30 */ } ELSE { - gain = L_add( Mpy_32_32( release_constant, ( L_sub( gain, frame_gain ) ) ), frame_gain ); // q30 + gain = L_add( Mpy_32_32( release_constant, ( L_sub( gain, frame_gain ) ) ), frame_gain ); /* Q30 */ } FOR( c = 0; c < num_channels; c++ ) @@ -777,26 +808,21 @@ void limiter_process_fx( sample = &output[c][i]; /* Apply gain */ - *sample = Mpy_32_32( L_shl_sat( *sample, 1 ), gain ); // q_factor + *sample = Mpy_32_32( L_shl_sat( *sample, 1 ), gain ); /* Q(q_factor) */ + move32(); } } } /* Save last gain and release heuristic values for next frame */ - hLimiter->gain_fx = gain; - hLimiter->release_heuristic_fx = releaseHeuristic; + hLimiter->gain_fx = gain; /* Q30 */ + move32(); + hLimiter->release_heuristic_fx = releaseHeuristic; /* Q30 */ + move32(); return; } #else -/*-------------------------------------------------------------------* - * limiter_process() - * - * hLimiter->channel_ptrs must be set before calling this function. - * Consider using a wrapper function like ivas_limiter_dec() instead - * of calling this directly. - *-------------------------------------------------------------------*/ - void limiter_process( IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ const int16_t output_frame, /* i : number of samples to be processed per channel in the I/O buffer */ diff --git a/lib_rend/ivas_masa_merge.c b/lib_rend/ivas_masa_merge.c index b9f2b4f8b..f1e93e224 100644 --- a/lib_rend/ivas_masa_merge.c +++ b/lib_rend/ivas_masa_merge.c @@ -50,29 +50,19 @@ #ifdef IVAS_FLOAT_FIXED static void copy_masa_meta_tile_fx( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, MASA_DECODER_EXT_OUT_META_HANDLE inMeta, const UWord8 sf, const UWord8 band ); -#else -static void copy_masa_meta_tile( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, MASA_DECODER_EXT_OUT_META_HANDLE inMeta, const uint8_t sf, const uint8_t band ); -#endif -#ifdef IVAS_FLOAT_FIXED static void full_stream_merge_fx( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, Word32 inEne1[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word16 *inEne1_e, MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, Word32 inEne2[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word16 *inEne2_e ); -static void diffuse_meta_merge_1x1_fx( - MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ - MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i : Input metadata 1 */ - Word32 inEne_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 1 */ - Word16 *inEne_e, /* i : TF-energy of input 1 */ - MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, /* i : Input metadata 2 */ - Word32 inEneISM_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ - Word16 *inEneISM_e /* i : TF-energy of input 2 */ -); +static void diffuse_meta_merge_1x1_fx( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, MASA_DECODER_EXT_OUT_META_HANDLE inMeta, Word32 inEne_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word16 *inEne_e, MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, Word32 inEneISM_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word16 *inEneISM_e ); #else +static void copy_masa_meta_tile( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, MASA_DECODER_EXT_OUT_META_HANDLE inMeta, const uint8_t sf, const uint8_t band ); + static void full_stream_merge( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, float inEne1[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, float inEne2[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] ); static void diffuse_meta_merge_1x1( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, MASA_DECODER_EXT_OUT_META_HANDLE inMeta, float inEne[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, float inEneISM[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] ); - #endif + /*---------------------------------------------------------------------* * copy_masa_meta_tile() * @@ -90,17 +80,23 @@ void copy_masa_meta_tile_fx( outMeta->directionIndex[0][sf][band] = inMeta->directionIndex[0][sf][band]; move16(); outMeta->directToTotalRatio[0][sf][band] = inMeta->directToTotalRatio[0][sf][band]; + move16(); outMeta->spreadCoherence[0][sf][band] = inMeta->spreadCoherence[0][sf][band]; + move16(); outMeta->surroundCoherence[sf][band] = inMeta->surroundCoherence[sf][band]; + move16(); outMeta->diffuseToTotalRatio[sf][band] = inMeta->diffuseToTotalRatio[sf][band]; + move16(); - IF( inMeta->descriptiveMeta.numberOfDirections == 1 ) + IF( EQ_16( inMeta->descriptiveMeta.numberOfDirections, 1 ) ) { outMeta->directionIndex[1][sf][band] = inMeta->directionIndex[1][sf][band]; move16(); outMeta->directToTotalRatio[1][sf][band] = inMeta->directToTotalRatio[1][sf][band]; + move16(); outMeta->spreadCoherence[1][sf][band] = inMeta->spreadCoherence[1][sf][band]; + move16(); } ELSE { @@ -108,7 +104,9 @@ void copy_masa_meta_tile_fx( outMeta->directionIndex[1][sf][band] = SPH_IDX_FRONT; move16(); outMeta->directToTotalRatio[1][sf][band] = 0u; + move16(); outMeta->spreadCoherence[1][sf][band] = 0u; + move16(); } return; @@ -153,7 +151,7 @@ void copy_masa_meta_tile( *---------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -void copy_masa_descriptive_meta( +void copy_masa_descriptive_meta_fx( MASA_DECRIPTIVE_META *outMeta, /* o : metadata to be written */ MASA_DECRIPTIVE_META *inMeta /* i : input metadata */ ) @@ -162,14 +160,22 @@ void copy_masa_descriptive_meta( FOR( char_idx = 0; char_idx < 8; char_idx++ ) { outMeta->formatDescriptor[char_idx] = inMeta->formatDescriptor[char_idx]; + move16(); } outMeta->numberOfDirections = inMeta->numberOfDirections; + move16(); outMeta->numberOfChannels = inMeta->numberOfChannels; + move16(); outMeta->sourceFormat = inMeta->sourceFormat; + move16(); outMeta->transportDefinition = inMeta->transportDefinition; + move16(); outMeta->channelAngle = inMeta->channelAngle; + move16(); outMeta->channelDistance = inMeta->channelDistance; + move16(); outMeta->channelLayout = inMeta->channelLayout; + move16(); return; } @@ -275,118 +281,148 @@ void diffuse_meta_merge_1x1( return; } -#endif - - -#ifdef IVAS_FLOAT_FIXED +#else void diffuse_meta_merge_1x1_fx( - MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ - MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i : Input metadata 1 */ - Word32 inEne_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 1 */ - Word16 *inEne_e, /* i : TF-energy of input 1 */ - MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, /* i : Input metadata 2 */ - Word32 inEneISM_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ - Word16 *inEneISM_e /* i : TF-energy of input 2 */ + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i : Input metadata 1 */ + Word32 inEne_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 1 */ + Word16 *inEne_e, /* i : TF-energy of input 1 Exponent */ + MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, /* i : Input metadata 2 */ + Word32 inEneISM_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ + Word16 *inEneISM_e /* i : TF-energy of input 2 Exponent */ ) { Word8 sf, band; Word16 max_e, in1_e[MASA_FREQUENCY_BANDS], i; FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { - FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) { - Word32 energyTimesRatio_fx, energyTimesRatioISM_fx, total_diff_nrg_fx = 0, dir_nrg_ratio_fx, total_nrg_fx = 0; + Word32 energyTimesRatio_fx, energyTimesRatioISM_fx, total_diff_nrg_fx, dir_nrg_ratio_fx, total_nrg_fx = 0; Word32 dir_ratio_ism_fx, L_tmp1, L_tmp2; Word16 scale, energyTimesRatio_e, tmp, total_nrg_e = 0, total_diff_nrg_e, dir_ratio_ism_e, energyTimesRatioISM_e, dir_nrg_ratio_e; + move32(); + move16(); - tmp = BASOP_Util_Divide1616_Scale( (Word16) inMeta->directToTotalRatio[0][sf][band], (Word16) UINT8_MAX, &scale ); - energyTimesRatio_fx = Mpy_32_16_r( inEne_fx[sf][band], tmp ); - energyTimesRatio_e = inEne_e[sf] + scale; + tmp = BASOP_Util_Divide1616_Scale( inMeta->directToTotalRatio[0][sf][band], UINT8_MAX, &scale ); + energyTimesRatio_fx = Mpy_32_16_r( inEne_fx[sf][band], tmp ); /* Q( 31 - ( nEne_e[sf] + scale ) ) */ + energyTimesRatio_e = add( inEne_e[sf], scale ); /* target is original MASA diffuseness */ - tmp = BASOP_Util_Divide1616_Scale( (Word16) inMeta->directToTotalRatio[0][sf][band], (Word16) UINT8_MAX, &scale ); - total_diff_nrg_fx = Mpy_32_16_r( inEne_fx[sf][band], tmp ); - total_diff_nrg_e = inEne_e[sf] + scale; + tmp = BASOP_Util_Divide1616_Scale( inMeta->directToTotalRatio[0][sf][band], UINT8_MAX, &scale ); + total_diff_nrg_fx = Mpy_32_16_r( inEne_fx[sf][band], tmp ); /* Q( 31 - ( nEne_e[sf] + scale ) ) */ + total_diff_nrg_e = add( inEne_e[sf], scale ); /* criterion is mean of ISM ratio and new ratio */ - dir_ratio_ism_fx = L_deposit_h( BASOP_Util_Divide1616_Scale( (Word16) inMeta->directToTotalRatio[0][sf][band], (Word16) UINT8_MAX, &dir_ratio_ism_e ) ); + dir_ratio_ism_fx = L_deposit_h( BASOP_Util_Divide1616_Scale( inMeta->directToTotalRatio[0][sf][band], UINT8_MAX, &dir_ratio_ism_e ) ); tmp = BASOP_Util_Divide3232_Scale( total_diff_nrg_fx, L_add( total_nrg_fx, EPSILON_FX ), &scale ); - L_tmp1 = L_deposit_h( tmp ); - scale = scale + ( total_diff_nrg_e - total_nrg_e ); + L_tmp1 = L_deposit_h( tmp ); /* Q( 31 - ( scale + total_nrg_e - total_diff_nrg_e ) ) */ + scale = add( scale, sub( total_diff_nrg_e, total_nrg_e ) ); L_tmp2 = L_sub( L_shl( 1, scale ), L_tmp1 ); L_tmp1 = BASOP_Util_Add_Mant32Exp( dir_ratio_ism_fx, dir_ratio_ism_e, L_tmp2, scale, &tmp ); L_tmp1 = L_shr( L_tmp1, 1 ); - energyTimesRatioISM_fx = Mpy_32_32( L_tmp1, inEneISM_fx[sf][band] ); - energyTimesRatioISM_e = tmp + inEneISM_e[sf]; + energyTimesRatioISM_fx = Mpy_32_32( L_tmp1, inEneISM_fx[sf][band] ); /* Q( 31 - ( tmp + inEneISM_e[sf] ) ) */ + energyTimesRatioISM_e = add( tmp, inEneISM_e[sf] ); - IF( ( BASOP_Util_Cmp_Mant32Exp( energyTimesRatioISM_fx, energyTimesRatioISM_e, energyTimesRatio_fx, energyTimesRatio_e ) > 1 ) ) + IF( ( BASOP_Util_Cmp_Mant32Exp( energyTimesRatioISM_fx, energyTimesRatioISM_e, energyTimesRatio_fx, energyTimesRatio_e ) > 0 ) ) { Word32 new_dir_ratio_fx, new_diff_ratio_fx; Word16 new_dir_ratio_e; outMeta->directionIndex[0][sf][band] = inMetaISM->directionIndex[0][sf][band]; + move16(); outMeta->directToTotalRatio[0][sf][band] = inMetaISM->directToTotalRatio[0][sf][band]; + move16(); outMeta->spreadCoherence[0][sf][band] = inMetaISM->spreadCoherence[0][sf][band]; + move16(); outMeta->surroundCoherence[sf][band] = inMetaISM->surroundCoherence[sf][band]; + move16(); tmp = BASOP_Util_Divide3232_Scale( total_diff_nrg_fx, L_add( EPSILON_FX, total_nrg_fx ), &scale ); - scale = scale + ( total_diff_nrg_e - total_nrg_e ); + scale = add( scale, sub( total_diff_nrg_e, total_nrg_e ) ); dir_nrg_ratio_fx = L_sub( L_shl( 1, scale ), L_deposit_h( tmp ) ); dir_nrg_ratio_e = scale; + move16(); new_dir_ratio_fx = dir_nrg_ratio_fx; + move32(); new_dir_ratio_e = dir_nrg_ratio_e; + move16(); tmp = BASOP_Util_Cmp_Mant32Exp( dir_nrg_ratio_fx, dir_nrg_ratio_e, dir_ratio_ism_fx, dir_ratio_ism_e ); IF( tmp <= 0 ) { new_dir_ratio_fx = dir_nrg_ratio_fx; + move32(); new_dir_ratio_e = dir_nrg_ratio_e; + move16(); } - outMeta->directToTotalRatio[0][sf][band] = (uint8_t) ( L_shr( new_dir_ratio_fx, 31 - new_dir_ratio_e ) * UINT8_MAX ); - new_diff_ratio_fx = L_shl( 1, 31 - new_dir_ratio_e ) - new_dir_ratio_fx; - outMeta->diffuseToTotalRatio[sf][band] = (uint8_t) ( L_shr( new_diff_ratio_fx, new_dir_ratio_e ) * UINT8_MAX ); + outMeta->directToTotalRatio[0][sf][band] = (UWord8) imult1616( extract_l( L_shr( new_dir_ratio_fx, sub( 31, new_dir_ratio_e ) ) ), UINT8_MAX ); + move16(); + new_diff_ratio_fx = L_sub( L_shl( 1, sub( 31, new_dir_ratio_e ) ), new_dir_ratio_fx ); + outMeta->diffuseToTotalRatio[sf][band] = (UWord8) imult1616( extract_l( L_shr( new_diff_ratio_fx, new_dir_ratio_e ) ), UINT8_MAX ); + move16(); } ELSE { /* use the plain original meta for this tile */ outMeta->directionIndex[0][sf][band] = inMeta->directionIndex[0][sf][band]; + move16(); outMeta->directToTotalRatio[0][sf][band] = inMeta->directToTotalRatio[0][sf][band]; + move16(); outMeta->spreadCoherence[0][sf][band] = inMeta->spreadCoherence[0][sf][band]; + move16(); outMeta->surroundCoherence[sf][band] = inMeta->surroundCoherence[sf][band]; + move16(); outMeta->diffuseToTotalRatio[sf][band] = inMeta->diffuseToTotalRatio[sf][band]; + move16(); } outMeta->directionIndex[1][sf][band] = SPH_IDX_FRONT; + move16(); outMeta->directToTotalRatio[1][sf][band] = 0u; + move16(); outMeta->spreadCoherence[1][sf][band] = 0u; + move16(); inEne_fx[sf][band] = BASOP_Util_Add_Mant32Exp( inEne_fx[sf][band], inEne_e[sf], inEneISM_fx[sf][band], inEneISM_e[sf], &in1_e[band] ); /* Update energy for subsequent mergings */ + move16(); } max_e = in1_e[0]; + move16(); FOR( i = 1; i < MASA_FREQUENCY_BANDS; i++ ) { - IF( max_e < in1_e[i] ) - max_e = in1_e[i]; + if ( LT_16( max_e, in1_e[i] ) ) + { + max_e = in1_e[i]; + move16(); + } } FOR( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) { - inEne_fx[sf][i] = L_shr( inEne_fx[sf][i], max_e - in1_e[i] ); + inEne_fx[sf][i] = L_shr( inEne_fx[sf][i], sub( max_e, in1_e[i] ) ); /* Q(31 - max_e) */ + move32(); } inEne_e[sf] = max_e; + move16(); } /* Set descriptive meta for mixed format */ outMeta->descriptiveMeta.sourceFormat = 0u; + move16(); outMeta->descriptiveMeta.transportDefinition = 0u; + move16(); outMeta->descriptiveMeta.channelAngle = 0u; + move16(); outMeta->descriptiveMeta.channelDistance = 0u; + move16(); outMeta->descriptiveMeta.channelLayout = 0u; + move16(); outMeta->descriptiveMeta.numberOfDirections = 0u; + move16(); /* Number of transports should be set outside. */ return; @@ -465,60 +501,56 @@ void full_stream_merge( return; } -#endif - -#ifdef IVAS_FLOAT_FIXED +#else void full_stream_merge_fx( - MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ - MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ - Word32 inEne1_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ - Word16 *inEne1_e, - MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ - Word32 inEne2_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ - Word16 *inEne2_e ) + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ + Word32 inEne1_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ + Word16 *inEne1_e, /* i/o: TF-energy of input 1 Exponent */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ + Word32 inEne2_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ + Word16 *inEne2_e /* i : TF-energy of input 2 Exponent */ +) { - uint8_t n_dirs_1, n_dirs_2; - uint8_t sf, band; - Word16 scale, tmp, dir_nrg_1_e = 0, dir_nrg_2_e = 0, max_e; + UWord8 n_dirs_1, n_dirs_2; + UWord8 sf, band; + Word16 scale, tmp, dir_nrg_1_e, dir_nrg_2_e, max_e, i; Word16 in1_e[MASA_FREQUENCY_BANDS]; Word32 dir_nrg_1_fx, dir_nrg_2_fx, L_tmp; /* full stream select based on total direct energy */ - n_dirs_1 = inMeta1->descriptiveMeta.numberOfDirections + 1u; /* to 1-based */ - n_dirs_2 = inMeta2->descriptiveMeta.numberOfDirections + 1u; + n_dirs_1 = (UWord8) add( inMeta1->descriptiveMeta.numberOfDirections, 1u ); /* to 1-based */ + n_dirs_2 = (UWord8) add( inMeta2->descriptiveMeta.numberOfDirections, 1u ); FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) { - tmp = BASOP_Util_Divide1616_Scale( (Word16) inMeta1->directToTotalRatio[0][sf][band], (Word16) UINT8_MAX, &scale ); - dir_nrg_1_fx = Mpy_32_32( L_deposit_h( tmp ), inEne1_fx[sf][band] ); - dir_nrg_1_e = scale + inEne1_e[sf]; - + tmp = BASOP_Util_Divide1616_Scale( inMeta1->directToTotalRatio[0][sf][band], UINT8_MAX, &scale ); + dir_nrg_1_fx = Mpy_32_32( L_deposit_h( tmp ), inEne1_fx[sf][band] ); /* Q( 31 - ( scale + inEne1_e[sf] ) ) */ + dir_nrg_1_e = add( scale, inEne1_e[sf] ); - tmp = BASOP_Util_Divide1616_Scale( (Word16) inMeta1->directToTotalRatio[0][sf][band], (Word16) UINT8_MAX, &scale ); - dir_nrg_2_fx = Mpy_32_32( L_deposit_h( tmp ), inEne2_fx[sf][band] ); - dir_nrg_2_e = scale + inEne2_e[sf]; + tmp = BASOP_Util_Divide1616_Scale( inMeta1->directToTotalRatio[0][sf][band], UINT8_MAX, &scale ); + dir_nrg_2_fx = Mpy_32_32( L_deposit_h( tmp ), inEne2_fx[sf][band] ); /* Q( 31 - ( scale + inEne2_e[sf] ) ) */ + dir_nrg_2_e = add( scale, inEne2_e[sf] ); - - IF( n_dirs_1 == 2 ) + IF( EQ_16( n_dirs_1, 2 ) ) { - - tmp = BASOP_Util_Divide1616_Scale( (Word16) inMeta1->directToTotalRatio[1][sf][band], (Word16) UINT8_MAX, &scale ); - L_tmp = Mpy_32_32( L_deposit_h( tmp ), inEne1_fx[sf][band] ); - scale = scale + inEne1_e[sf]; + tmp = BASOP_Util_Divide1616_Scale( inMeta1->directToTotalRatio[1][sf][band], UINT8_MAX, &scale ); + L_tmp = Mpy_32_32( L_deposit_h( tmp ), inEne1_fx[sf][band] ); /* Q( 31 - ( scale + inEne1_e[sf] ) ) */ + scale = add( scale, inEne1_e[sf] ); dir_nrg_1_fx = BASOP_Util_Add_Mant32Exp( L_tmp, scale, dir_nrg_1_fx, dir_nrg_1_e, &dir_nrg_1_e ); } - IF( n_dirs_2 == 2 ) + IF( EQ_16( n_dirs_2, 2 ) ) { - tmp = BASOP_Util_Divide1616_Scale( (Word16) inMeta2->directToTotalRatio[1][sf][band], (Word16) UINT8_MAX, &scale ); - L_tmp = Mpy_32_32( L_deposit_h( tmp ), inEne2_fx[sf][band] ); - scale = scale + inEne2_e[sf]; + tmp = BASOP_Util_Divide1616_Scale( inMeta2->directToTotalRatio[1][sf][band], UINT8_MAX, &scale ); + L_tmp = Mpy_32_32( L_deposit_h( tmp ), inEne2_fx[sf][band] ); /* Q( 31 - ( scale + inEne2_e[sf] ) ) */ + scale = add( scale, inEne2_e[sf] ); dir_nrg_2_fx = BASOP_Util_Add_Mant32Exp( L_tmp, scale, dir_nrg_2_fx, dir_nrg_2_e, &dir_nrg_2_e ); } - IF( BASOP_Util_Cmp_Mant32Exp( dir_nrg_1_fx, dir_nrg_1_e, dir_nrg_2_fx, dir_nrg_2_e ) > 1 ) + IF( BASOP_Util_Cmp_Mant32Exp( dir_nrg_1_fx, dir_nrg_1_e, dir_nrg_2_fx, dir_nrg_2_e ) > 0 ) { copy_masa_meta_tile_fx( outMeta, inMeta1, sf, band ); } @@ -528,36 +560,51 @@ void full_stream_merge_fx( } inEne1_fx[sf][band] = BASOP_Util_Add_Mant32Exp( inEne1_fx[sf][band], inEne1_e[sf], inEne2_fx[sf][band], inEne2_e[sf], &in1_e[band] ); + move32(); } max_e = in1_e[0]; - FOR( Word16 i = 1; i < MASA_FREQUENCY_BANDS; i++ ) + move16(); + FOR( i = 1; i < MASA_FREQUENCY_BANDS; i++ ) { - IF( max_e < in1_e[i] ) - max_e = in1_e[i]; + if ( LT_16( max_e, in1_e[i] ) ) + { + max_e = in1_e[i]; + move16(); + } } - FOR( Word16 i = 0; i < MASA_FREQUENCY_BANDS; i++ ) + FOR( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) { - inEne1_fx[sf][i] = L_shr( inEne1_fx[sf][i], max_e - in1_e[i] ); + inEne1_fx[sf][i] = L_shr( inEne1_fx[sf][i], sub( max_e, in1_e[i] ) ); /* Q( 31 - max_e ) */ + move32(); } inEne1_e[sf] = max_e; + move16(); } /* Set descriptive meta for mixed format */ outMeta->descriptiveMeta.sourceFormat = 0u; + move16(); outMeta->descriptiveMeta.transportDefinition = 0u; + move16(); outMeta->descriptiveMeta.channelAngle = 0u; + move16(); outMeta->descriptiveMeta.channelDistance = 0u; + move16(); outMeta->descriptiveMeta.channelLayout = 0u; - IF( n_dirs_1 == 2 || n_dirs_2 == 2 ) + move16(); + test(); + IF( EQ_16( n_dirs_1, 2 ) || EQ_16( n_dirs_2, 2 ) ) { outMeta->descriptiveMeta.numberOfDirections = 1u; + move16(); } ELSE { outMeta->descriptiveMeta.numberOfDirections = 0u; + move16(); } /* Number of transports should be set outside. */ @@ -602,28 +649,32 @@ void ivas_prerend_merge_masa_metadata( return; } -#endif - -#ifdef IVAS_FLOAT_FIXED +#else void ivas_prerend_merge_masa_metadata_fx( - MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ - MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ - IVAS_REND_AudioConfigType inType1, /* i : Type of input 1 */ - Word32 inEne1_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ - Word16 *inEne1_e, - MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ - IVAS_REND_AudioConfigType inType2, /* i : Type of input 2 */ - Word32 inEne2_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ - Word16 *inEne2_e /* i : TF-energy of input 2 */ + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ + IVAS_REND_AudioConfigType inType1, /* i : Type of input 1 */ + Word32 inEne1_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ + Word16 *inEne1_e, /* i/o: TF-energy of input 1 Exponent */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ + IVAS_REND_AudioConfigType inType2, /* i : Type of input 2 */ + Word32 inEne2_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ + Word16 *inEne2_e /* i : TF-energy of input 2 Exponent */ ) { /* mixing ISMs with non-ISM use different merge */ - IF( inType1 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED && inType2 != IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED && ( inMeta1->descriptiveMeta.numberOfDirections == 0u && inMeta2->descriptiveMeta.numberOfDirections == 0u ) ) + test(); + test(); + test(); + test(); + test(); + test(); + IF( EQ_32( inType1, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) && NE_32( inType2, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) && ( inMeta1->descriptiveMeta.numberOfDirections == 0u && inMeta2->descriptiveMeta.numberOfDirections == 0u ) ) { /* meta_1 is ISM and both are 1dir */ diffuse_meta_merge_1x1_fx( outMeta, inMeta2, inEne2_fx, inEne2_e, inMeta1, inEne1_fx, inEne1_e ); } - ELSE IF( inType2 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED && inType1 != IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED && ( inMeta1->descriptiveMeta.numberOfDirections == 0u && inMeta2->descriptiveMeta.numberOfDirections == 0u ) ) + ELSE IF( EQ_32( inType2, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) && NE_32( inType1, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) && ( inMeta1->descriptiveMeta.numberOfDirections == 0u && inMeta2->descriptiveMeta.numberOfDirections == 0u ) ) { /* meta_2 is ISM and both are 1dir */ diffuse_meta_merge_1x1_fx( outMeta, inMeta1, inEne1_fx, inEne1_e, inMeta2, inEne2_fx, inEne2_e ); @@ -708,6 +759,7 @@ ivas_error masaPrerendOpen_fx( ivas_error error; error = IVAS_ERR_OK; + move32(); hMasaPrerend = (MASA_PREREND_HANDLE) malloc( sizeof( MASA_PREREND_DATA ) ); IF( hMasaPrerend == NULL ) @@ -762,6 +814,7 @@ void masaPrerendClose_fx( { Word16 i; + test(); IF( hMasaPrerendPtr == NULL || *hMasaPrerendPtr == NULL ) { return; diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 11cb17e70..4868919f8 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -120,14 +120,13 @@ void ivas_limiter_dec const int16_t BER_detect /* i : BER detect flag */ ); #ifdef IVAS_FLOAT_FIXED -void ivas_limiter_dec_fx -( +void ivas_limiter_dec_fx( IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ - Word32 *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ - const Word16 num_channels, /* i : number of channels to be processed */ - const Word16 output_frame, /* i : number of samples per channel in the buffer */ + Word32 *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ + const Word16 num_channels, /* i : number of channels to be processed */ + const Word16 output_frame, /* i : number of samples per channel in the buffer */ const Word16 BER_detect, /* i : BER detect flag */ - Word16 q_factor + Word16 q_factor /* i : Q factor of the output samples */ ); #endif void limiter_process( @@ -139,13 +138,13 @@ void limiter_process( ); #ifdef IVAS_FLOAT_FIXED void limiter_process_fx( - IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ - const Word16 output_frame, /* i : number of samples to be processed per channel in the I/O buffer */ - const Word32 threshold, /* i : signal amplitude above which limiting starts to be applied */ - const Word16 BER_detect, /* i : BER detect flag */ - Word16 *strong_saturation_cnt, /* i/o: counter of strong saturations (can be NULL) */ - Word16 q_factor - ); + IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ + const Word16 output_frame, /* i : number of samples to be processed per channel in the I/O buffer */ + const Word32 threshold, /* i : signal amplitude above which limiting starts to be applied */ + const Word16 BER_detect, /* i : BER detect flag */ + Word16 *strong_saturation_cnt, /* i/o: counter of strong saturations (can be NULL) */ + Word16 q_factor /* i : Q factor of output samples */ +); #endif /*----------------------------------------------------------------------------------* * TD decorr. function prototypes @@ -214,11 +213,11 @@ void ivas_td_decorr_APD_iir_filter_fx( #ifdef IVAS_FLOAT_FIXED ivas_error efap_init_data_fx( - EFAP_HANDLE *hEFAPdata, /* i/o: handle for EFAP data structure that will be initialized */ - const Word32 *speaker_node_azi_deg, /* i : vector of speaker node azimuths (positive left) */ - const Word32 *speaker_node_ele_deg, /* i : vector of speaker node elevations (positive up) */ - const Word16 num_speaker_nodes, /* i : number of speaker nodes in the set */ - const Word16 efap_mode /* i : indicates whether EFAP or EFIP is used */ + EFAP_HANDLE *hEFAPdata, /* i/o: handle for EFAP data structure that will be initialized */ + const Word32 *speaker_node_azi_deg, /* i : vector of speaker node azimuths (positive left) Q22 */ + const Word32 *speaker_node_ele_deg, /* i : vector of speaker node elevations (positive up) Q22 */ + const Word16 num_speaker_nodes, /* i : number of speaker nodes in the set */ + const Word16 efap_mode /* i : indicates whether EFAP or EFIP is used */ ); #else ivas_error efap_init_data( @@ -235,11 +234,11 @@ void efap_free_data( #ifdef IVAS_FLOAT_FIXED void efap_determine_gains_fx( - EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ - Word32 *gains, /* o : gain vector for speaker nodes for given direction */ - const Word32 azi_deg, /* i : azimuth in degrees for panning direction (positive left) */ - const Word32 ele_deg, /* i : elevation in degrees for panning direction (positive up) */ - const Word16 efap_mode /* i : indicates whether EFAP or EFIP is used */ + EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + Word32 *gains, /* o : gain vector for speaker nodes for given direction Q30 */ + const Word32 azi_deg, /* i : azimuth in degrees for panning direction (positive left) Q22 */ + const Word32 ele_deg, /* i : elevation in degrees for panning direction (positive up) Q22 */ + const Word16 efap_mode /* i : indicates whether EFAP or EFIP is used */ ); #else void efap_determine_gains( @@ -395,6 +394,7 @@ float configure_reqularization_factor( const int32_t ivas_total_brate /* i : total IVAS bitrate */ ); +#ifndef IVAS_FLOAT_FIXED ivas_error ivas_dirac_alloc_mem( DIRAC_REND_HANDLE hDirACRend, const RENDERER_TYPE renderer_type, @@ -402,6 +402,14 @@ ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem, const int16_t hodirac_flag ); +#else +ivas_error ivas_dirac_alloc_mem_fx( + DIRAC_REND_HANDLE hDirACRend, + const RENDERER_TYPE renderer_type, + const Word16 num_freq_bands, + DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem, + const Word16 hodirac_flag); +#endif void ivas_dirac_free_mem( DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem @@ -941,15 +949,17 @@ void compute_hoa_encoder_mtx_fx( Word32 *response_fx, const Word16 num_responses, const Word16 ambisonics_order); +#endif -void ivas_dirac_dec_compute_power_factors_fx( +#ifndef IVAS_FLOAT_FIXED +void ivas_dirac_dec_compute_gain_factors( const int16_t num_freq_bands, - const Word32 *diffuseness_fx, - const Word16 max_band_decorr, - Word32 *direct_power_factor, - Word32 *diffuse_power_factor + const float *diffuseness, + const int16_t max_band_decorr, + float *direct_gain_factor, + float *diffuse_gain_factor ); - +#else void ivas_dirac_dec_compute_gain_factors_fx( const Word16 num_freq_bands, const Word32 *diffuseness_fx, @@ -960,14 +970,7 @@ void ivas_dirac_dec_compute_gain_factors_fx( ); #endif -void ivas_dirac_dec_compute_gain_factors( - const int16_t num_freq_bands, - const float *diffuseness, - const int16_t max_band_decorr, - float *direct_gain_factor, - float *diffuse_gain_factor -); - +#ifndef IVAS_FLOAT_FIXED void ivas_dirac_dec_compute_power_factors( const int16_t num_freq_bands, const float *diffuseness, @@ -975,6 +978,15 @@ void ivas_dirac_dec_compute_power_factors( float *direct_power_factor, float *diffuse_power_factor ); +#else +void ivas_dirac_dec_compute_power_factors_fx( + const Word16 num_freq_bands, + const Word32 *diffuseness_fx, + const Word16 max_band_decorr, + Word32 *direct_power_factor, + Word32 *diffuse_power_factor +); +#endif void ivas_dirac_dec_compute_directional_responses( SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ @@ -2836,19 +2848,17 @@ void ivas_prerend_merge_masa_metadata( IVAS_REND_AudioConfigType inType2, /* i : Type of input 2 */ float inEne2[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 */ ); -#endif - -#ifdef IVAS_FLOAT_FIXED +#else void ivas_prerend_merge_masa_metadata_fx( - MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ - MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ - IVAS_REND_AudioConfigType inType1, /* i : Type of input 1 */ - Word32 inEne1_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ - Word16 *inEne1_e, - MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ - IVAS_REND_AudioConfigType inType2, /* i : Type of input 2 */ - Word32 inEne2_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ - Word16 *inEne2_e /* i : TF-energy of input 2 */ + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ + IVAS_REND_AudioConfigType inType1, /* i : Type of input 1 */ + Word32 inEne1_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ + Word16 *inEne1_e, /* i/o: TF-energy of input 1 Exponent */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ + IVAS_REND_AudioConfigType inType2, /* i : Type of input 2 */ + Word32 inEne2_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ + Word16 *inEne2_e /* i : TF-energy of input 2 Exponent */ ); #endif diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index a44a5077a..b8ac1194b 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1032,12 +1032,12 @@ typedef struct EFAP_VERTEX #else typedef struct EFAP_VERTEX { - Word32 azi; /* azimuth of the loudspeaker */ - Word32 ele; /* elevation of the loudspeaker */ - Word32 pos[3]; /* [x y z] cartesian coordinate vector */ - Word16 idx; /* integer, that corresponds to the first index for the LS in the 1D output */ - Word16 isNaN; /* used to indicate if the vertex is a virtual speaker */ - EFAP_VTX_DMX_TYPE dmxType; /* virtual speaker downmix type */ + Word32 azi; /* azimuth of the loudspeaker */ /* Q22 */ + Word32 ele; /* elevation of the loudspeaker */ /* Q22 */ + Word32 pos[3]; /* [x y z] cartesian coordinate vector */ /* Q31 */ + Word16 idx; /* integer, that corresponds to the first index for the LS in the 1D output */ + Word16 isNaN; /* used to indicate if the vertex is a virtual speaker */ + EFAP_VTX_DMX_TYPE dmxType; /* virtual speaker downmix type */ } EFAP_VERTEX; #endif @@ -1062,11 +1062,11 @@ typedef struct EFAP_POLYSET #else typedef struct EFAP_POLYSET { - Word16 chan[EFAP_MAX_CHAN_NUM]; /* An array indicating the loudspeaker index of the polygon vertices */ - Word16 isNaN[EFAP_MAX_CHAN_NUM]; /* Indicates if one of the vertices isNaN */ - Word16 numChan; /* An integer between 0 and EFAP_MAX_CHAN_NUM corresponding to the number of vertices of the polygon */ - Word32 polyAzi[EFAP_MAX_CHAN_NUM]; /* An array (same length as "chan"), with the azimuth of the channels */ - Word32 polyEle[EFAP_MAX_CHAN_NUM]; /* An array (same length as "chan"), with the elevation of the channels */ + Word16 chan[EFAP_MAX_CHAN_NUM]; /* An array indicating the loudspeaker index of the polygon vertices */ + Word16 isNaN[EFAP_MAX_CHAN_NUM]; /* Indicates if one of the vertices isNaN */ + Word16 numChan; /* An integer between 0 and EFAP_MAX_CHAN_NUM corresponding to the number of vertices of the polygon */ + Word32 polyAzi[EFAP_MAX_CHAN_NUM]; /* An array (same length as "chan"), with the azimuth of the channels */ /* Q22 */ + Word32 polyEle[EFAP_MAX_CHAN_NUM]; /* An array (same length as "chan"), with the elevation of the channels */ /* Q22 */ } EFAP_POLYSET; #endif @@ -1092,8 +1092,8 @@ typedef struct EFAP float *aziSpk; /* Loudspeaker azimuths */ float *eleSpk; /* Loudspeaker elevations */ #else - Word32 *aziSpk; /* Loudspeaker azimuths */ - Word32 *eleSpk; /* Loudspeaker elevations */ + Word32 *aziSpk; /* Loudspeaker azimuths */ /* Q22 */ + Word32 *eleSpk; /* Loudspeaker elevations */ /* Q22 */ #endif EFAP_VERTEX_DATA vtxData; /* Vertex Data, contains all the data concerning the vertex */ EFAP_POLYSET_DATA polyData; /* Polygon data */ @@ -1102,9 +1102,9 @@ typedef struct EFAP float *bufferLong; /* tmp buffer that will be given as a parameter for computing the gain; this is a 1D array of length numVtx */ float *bufferShort; /* tmp buffer that will be given as a parameter for computing the gain; this is the result of downMixMatrix*bufferLong, length is numSpk */ #else - Word32 **dmTranspose_fx; /* Downmix Matrix used for redistributing the energy of ghosts LS and its transpose */ - Word32 *bufferLong_fx; /* tmp buffer that will be given as a parameter for computing the gain; this is a 1D array of length numVtx */ - Word32 *bufferShort_fx; /* tmp buffer that will be given as a parameter for computing the gain; this is the result of downMixMatrix*bufferLong, length is numSpk */ + Word32 **dmTranspose_fx; /* Downmix Matrix used for redistributing the energy of ghosts LS and its transpose */ /* Q31 */ + Word32 *bufferLong_fx; /* tmp buffer that will be given as a parameter for computing the gain; this is a 1D array of length numVtx */ + Word32 *bufferShort_fx; /* tmp buffer that will be given as a parameter for computing the gain; this is the result of downMixMatrix*bufferLong, length is numSpk */ #endif int16_t numTot; /* Total number of real + ghost loudspeakers, used later for freeing memory */ @@ -1122,15 +1122,15 @@ typedef struct ivas_orient_trk_state_t float offCenterAdaptationRate; float adaptationAngle; #else - Word32 centerAdaptationRate_fx; /* Q31 */ - Word32 offCenterAdaptationRate_fx; /* Q31 */ - Word32 adaptationAngle_fx; /* Q29 */ + Word32 centerAdaptationRate_fx; /* Q31 */ + Word32 offCenterAdaptationRate_fx; /* Q31 */ + Word32 adaptationAngle_fx; /* Q29 */ #endif #ifndef IVAS_FLOAT_FIXED float alpha; #else - Word32 alpha_fx; /* Q(Q_alpha) */ + Word32 alpha_fx; /* Q(Q_alpha) */ Word16 Q_alpha; #endif IVAS_QUATERNION absAvgRot; /* average absolute orientation */ @@ -2245,15 +2245,11 @@ typedef struct { Word16 max_num_channels; Word16 num_channels; - // float **channel_ptrs; Word32 **channel_ptrs_fx; Word32 sampling_rate; - // float gain; - Word32 gain_fx; /* Q30 */ - // float release_heuristic; + Word32 gain_fx; /* Q30 */ Word32 release_heuristic_fx; /* Q30 */ - // float attack_constant; - Word32 attack_constant_fx; /* Q31 */ + Word32 attack_constant_fx; /* Q31 */ Word16 strong_saturation_count; } IVAS_LIMITER, *IVAS_LIMITER_HANDLE; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index f9eadb800..2ce925892 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -1105,10 +1105,10 @@ static ivas_error initLimiter( /* Support re-init: close if already allocated */ IF( *phLimiter != NULL ) { - ivas_limiter_close( phLimiter ); + ivas_limiter_close_fx( phLimiter ); } - IF( NE_32( ( error = ivas_limiter_open( phLimiter, numChannels, sampleRate ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_limiter_open_fx( phLimiter, numChannels, sampleRate ) ), IVAS_ERR_OK ) ) { return error; } @@ -1680,7 +1680,7 @@ static ivas_error initEfap( /* If re-initializing, free existing EFAP handle. */ IF( pEfapWrapper->hEfap != NULL ) { - efap_free_data( &pEfapWrapper->hEfap ); + efap_free_data_fx( &pEfapWrapper->hEfap ); } /* Only initialize EFAP handle if output config is channel-based */ @@ -4098,7 +4098,7 @@ static ivas_error initMcBinauralRendering( { IF( inputMc->efapInWrapper.hEfap != NULL ) { - efap_free_data( &inputMc->efapInWrapper.hEfap ); + efap_free_data_fx( &inputMc->efapInWrapper.hEfap ); } } @@ -4321,7 +4321,7 @@ static ivas_error initMcMasaRendering( IF( inputMc->efapInWrapper.hEfap != NULL ) { - efap_free_data( &inputMc->efapInWrapper.hEfap ); + efap_free_data_fx( &inputMc->efapInWrapper.hEfap ); } IF( NE_32( ( error = ivas_mcmasa_ana_open( &inputMc->hMcMasa, inConfig, inSampleRate ) ), IVAS_ERR_OK ) ) @@ -4640,7 +4640,7 @@ static void clearInputMc( /* Free input's internal handles */ IF( inputMc->efapInWrapper.hEfap != NULL ) { - efap_free_data( &inputMc->efapInWrapper.hEfap ); + efap_free_data_fx( &inputMc->efapInWrapper.hEfap ); } ivas_rend_closeCrend( &inputMc->crendWrapper ); @@ -12447,7 +12447,7 @@ static void renderMasaToMasa( } } - copy_masa_descriptive_meta( &( outMeta->descriptiveMeta ), &( inMeta->descriptive_meta ) ); + copy_masa_descriptive_meta_fx( &( outMeta->descriptiveMeta ), &( inMeta->descriptive_meta ) ); accumulate2dArrayToBuffer_fx( tmpBuffer_fx, &outAudio ); @@ -13481,7 +13481,7 @@ void IVAS_REND_Close( IF( hIvasRend->efapOutWrapper.hEfap != NULL ) { - efap_free_data( &hIvasRend->efapOutWrapper.hEfap ); + efap_free_data_fx( &hIvasRend->efapOutWrapper.hEfap ); } /* clear inputs */ @@ -13505,7 +13505,7 @@ void IVAS_REND_Close( /* clear Config. Renderer */ ivas_render_config_close( &( hIvasRend->hRendererConfig ) ); - ivas_limiter_close( &hIvasRend->hLimiter ); + ivas_limiter_close_fx( &hIvasRend->hLimiter ); closeHeadRotation( hIvasRend ); @@ -13995,7 +13995,7 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( ivas_dirac_dec_output_synthesis_init_fx( hSpatParamRendCom, hDirACRend, nchan_out_woLFE, 0 ); /* Allocate stack memory */ - IF( NE_32( ( error = ivas_dirac_alloc_mem( hDirACRend, RENDERER_DIRAC, hSpatParamRendCom->num_freq_bands, &( hDirACRend->stack_mem ), 0 ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_alloc_mem_fx( hDirACRend, RENDERER_DIRAC, hSpatParamRendCom->num_freq_bands, &( hDirACRend->stack_mem ), 0 ) ), IVAS_ERR_OK ) ) { return error; } -- GitLab From 988c29a091d0aba30d237fa1d166d6ac612746c7 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 4 Jul 2024 11:59:54 +0530 Subject: [PATCH 037/110] Clang formatting changes --- lib_com/tools.c | 2 +- lib_com/tools_fx.c | 10 +++++----- lib_dec/ivas_init_dec.c | 2 +- lib_rend/ivas_allrad_dec.c | 4 ++-- lib_rend/ivas_limiter.c | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib_com/tools.c b/lib_com/tools.c index 2132eb9f5..55d866a3e 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -217,7 +217,7 @@ float sum2_f( #ifdef IVAS_FLOAT_FIXED Word32 sum2_f_32_fx( - const Word32 *vec, /* i : input vector */ + const Word32 *vec, /* i : input vector */ const Word16 lvec, /* i : length of input vector */ Word16 gb ) { diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 6369b678f..6d17d6a4a 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -3832,9 +3832,9 @@ void delay_signal( } void delay_signal_fx( - Word32 x[], /* i/o: signal to be delayed */ - const Word16 len, /* i : length of the input signal */ - Word32 mem[], /* i/o: synchronization memory */ + Word32 x[], /* i/o: signal to be delayed */ + const Word16 len, /* i : length of the input signal */ + Word32 mem[], /* i/o: synchronization memory */ const Word16 delay /* i : delay in samples */ ) { @@ -3850,9 +3850,9 @@ void delay_signal_fx( } #ifdef IVAS_FLOAT_FIXED void delay_signal_q_adj_fx( - Word32 x[], /* i/o: signal to be delayed */ + Word32 x[], /* i/o: signal to be delayed */ const Word16 len, /* i : length of the input signal */ - Word32 mem[], /* i/o: synchronization memory */ + Word32 mem[], /* i/o: synchronization memory */ const Word16 delay, /* i : delay in samples */ const Word16 q_x, const Word16 q_mem ) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index d844c7435..bb9894dfd 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2290,7 +2290,7 @@ ivas_error ivas_init_decoder_fx( } ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), - st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); } FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) diff --git a/lib_rend/ivas_allrad_dec.c b/lib_rend/ivas_allrad_dec.c index ca405c01d..b97e877b3 100644 --- a/lib_rend/ivas_allrad_dec.c +++ b/lib_rend/ivas_allrad_dec.c @@ -292,7 +292,7 @@ ivas_error ivas_sba_get_hoa_dec_matrix_fx( // printf( "\n%f", ((float)*p_dec_mtx)/ ONE_IN_Q25 ); p_dec_mtx++; } - p_dec_mtx += sub( SBA_NHARM_HOA3 , num_harm ); + p_dec_mtx += sub( SBA_NHARM_HOA3, num_harm ); } } @@ -310,7 +310,7 @@ ivas_error ivas_sba_get_hoa_dec_matrix_fx( move32(); p_dec_mtx++; } - p_dec_mtx += sub( SBA_NHARM_HOA3 , num_harm ); + p_dec_mtx += sub( SBA_NHARM_HOA3, num_harm ); } /* free EFAP handle */ diff --git a/lib_rend/ivas_limiter.c b/lib_rend/ivas_limiter.c index fe2b843a7..07f2ca72d 100644 --- a/lib_rend/ivas_limiter.c +++ b/lib_rend/ivas_limiter.c @@ -386,8 +386,8 @@ static Word16 detect_strong_saturations_fx( #ifdef IVAS_FLOAT_FIXED ivas_error ivas_limiter_open_fx( IVAS_LIMITER_HANDLE *hLimiter_out, /* o : limiter struct handle */ - const Word16 max_num_channels, /* i : maximum number of I/O channels to be processed */ - const Word32 sampling_rate /* i : sampling rate for processing */ + const Word16 max_num_channels, /* i : maximum number of I/O channels to be processed */ + const Word32 sampling_rate /* i : sampling rate for processing */ ) { Word16 i; -- GitLab From fc7c7f8d6f1217a6efc987c64502e2bbc747d7db Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 4 Jul 2024 09:52:09 +0200 Subject: [PATCH 038/110] Use FX enc -> FL dec in long jobs --- .gitlab-ci.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7e6dc41ad..a301db3bb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -523,12 +523,13 @@ ivas-pytest-dec-usan: # Long test jobs # --------------------------------------------------------------- -ivas-pytest-mld-long-enc-dec: +ivas-pytest-mld-long-enc: extends: - .rules-pytest-mld-long - .test-job-linux before_script: - - USE_LTV=1 + - USE_LTV=1 + - DUT_DECODER_PATH=./IVAS_dec_ref - TEST_SUITE="$LONG_TEST_SUITE" - LEVEL_SCALING=1.0 <<: *ivas-pytest-anchor @@ -544,12 +545,13 @@ ivas-pytest-mld-long-dec: - LEVEL_SCALING=1.0 <<: *ivas-pytest-anchor -ivas-pytest-mld-long-enc-dec-lev-10: +ivas-pytest-mld-long-enc-lev-10: extends: - .rules-pytest-mld-long - .test-job-linux before_script: - - USE_LTV=1 + - USE_LTV=1 + - DUT_DECODER_PATH=./IVAS_dec_ref - TEST_SUITE="$LONG_TEST_SUITE" - LEVEL_SCALING=0.3162 <<: *ivas-pytest-anchor @@ -559,18 +561,19 @@ ivas-pytest-mld-long-dec-lev-10: - .rules-pytest-mld-long - .test-job-linux before_script: - - USE_LTV=1 + - USE_LTV=1 - DUT_ENCODER_PATH=./IVAS_cod_ref - TEST_SUITE="$LONG_TEST_SUITE" - LEVEL_SCALING=0.3162 <<: *ivas-pytest-anchor -ivas-pytest-mld-long-enc-dec-lev+10: +ivas-pytest-mld-long-enc-lev+10: extends: - .rules-pytest-mld-long - .test-job-linux before_script: - - USE_LTV=1 + - USE_LTV=1 + - DUT_DECODER_PATH=./IVAS_dec_ref - TEST_SUITE="$LONG_TEST_SUITE" - LEVEL_SCALING=3.162 <<: *ivas-pytest-anchor -- GitLab From 1f18f6b73910a9198fe31ecda9438d3bbb441472 Mon Sep 17 00:00:00 2001 From: norvell Date: Thu, 4 Jul 2024 11:10:38 +0000 Subject: [PATCH 039/110] Add generation of summary images and add "images" folder as artifact. --- .gitlab-ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7e6dc41ad..93e5479d2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -237,6 +237,10 @@ stages: - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - python3 scripts/parse_xml_report.py report-junit.xml $MLD_ARTIFACT_NAME + - mkdir images + - python3 scripts/create_histogram_summary.py $MLD_ARTIFACT_NAME images/summary_"$CI_JOB_ID"_MLD.csv images/summary_10002_MLD.png --measure MLD + - python3 scripts/create_histogram_summary.py $MLD_ARTIFACT_NAME images/summary_"$CI_JOB_ID"_DIFF.csv images/summary_10002_DIFF.png --measure DIFF + - python3 scripts/create_histogram_summary.py $MLD_ARTIFACT_NAME images/summary_"$CI_JOB_ID"_SSNR.csv images/summary_10002_SSNR.png --measure SSNR - if [ $USE_LTV -eq 1 ] && [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH $CI_JOB_NAME $CI_PROJECT_ID) @@ -269,6 +273,7 @@ stages: - $PAGES_HTML_ARTIFACT_NAME - $MLD_ARTIFACT_NAME - $MERGED_CSV_ARTIFACT_NAME + - images expose_as: "pytest mld results" reports: junit: -- GitLab From 7c775ca7d7c31c0fa94308c8a213070f6134a558 Mon Sep 17 00:00:00 2001 From: norvell Date: Thu, 4 Jul 2024 11:48:22 +0000 Subject: [PATCH 040/110] Cleaning up debugging value and replacing with $CI_JOB_ID --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 93e5479d2..6838e9910 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -238,9 +238,9 @@ stages: - python3 scripts/parse_xml_report.py report-junit.xml $MLD_ARTIFACT_NAME - mkdir images - - python3 scripts/create_histogram_summary.py $MLD_ARTIFACT_NAME images/summary_"$CI_JOB_ID"_MLD.csv images/summary_10002_MLD.png --measure MLD - - python3 scripts/create_histogram_summary.py $MLD_ARTIFACT_NAME images/summary_"$CI_JOB_ID"_DIFF.csv images/summary_10002_DIFF.png --measure DIFF - - python3 scripts/create_histogram_summary.py $MLD_ARTIFACT_NAME images/summary_"$CI_JOB_ID"_SSNR.csv images/summary_10002_SSNR.png --measure SSNR + - python3 scripts/create_histogram_summary.py $MLD_ARTIFACT_NAME images/summary_"$CI_JOB_ID"_MLD.csv images/summary_"$CI_JOB_ID"_MLD.png --measure MLD + - python3 scripts/create_histogram_summary.py $MLD_ARTIFACT_NAME images/summary_"$CI_JOB_ID"_DIFF.csv images/summary_"$CI_JOB_ID"_DIFF.png --measure DIFF + - python3 scripts/create_histogram_summary.py $MLD_ARTIFACT_NAME images/summary_"$CI_JOB_ID"_SSNR.csv images/summary_"$CI_JOB_ID"_SSNR.png --measure SSNR - if [ $USE_LTV -eq 1 ] && [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH $CI_JOB_NAME $CI_PROJECT_ID) -- GitLab From 1407eb454a04acf94d07d48ac0478c54d12cf5b6 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 4 Jul 2024 19:46:06 +0530 Subject: [PATCH 041/110] MLD-Fix for Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out Config early reflections --- lib_rend/ivas_shoebox.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_shoebox.c b/lib_rend/ivas_shoebox.c index c2df17819..f09cbeac2 100644 --- a/lib_rend/ivas_shoebox.c +++ b/lib_rend/ivas_shoebox.c @@ -992,7 +992,7 @@ void ivas_shoebox_set_scene( /* Retrieve coordinate and surface sign */ coord = L_shr( loop_ub, 1 ); // tbl - rcoselev = L_add( L_add( loop_ub, 1 ), L_mult( (Word16) ER_PARAMS->n_ref, j ) ); + rcoselev = L_add( L_add( loop_ub, 1 ), L_mult0( (Word16) ER_PARAMS->n_ref, j ) ); /* Initialize image position coordinates */ im_pos_fx[0] = tmp_pos_fx[0]; // Q:22 -- GitLab From 26e98e60750746e7d35a74a0cba77fb14faf089b Mon Sep 17 00:00:00 2001 From: norvell Date: Fri, 5 Jul 2024 04:56:22 +0000 Subject: [PATCH 042/110] Add "--histogram" argument to add histograms to report. --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 371671d80..e882417fd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -249,7 +249,7 @@ stages: - unzip artifacts.zip -d previous_artifacts # This wildcard thingy relies on only one csv file being present per job - file_previous="previous_artifacts/mld--$CI_JOB_NAME-$id_previous--sha-*.csv" - - python3 ci/basop-pages/create_report_pages.py $PAGES_HTML_ARTIFACT_NAME $MERGED_CSV_ARTIFACT_NAME $MLD_ARTIFACT_NAME $file_previous $CI_JOB_ID $id_previous $CI_JOB_NAME + - python3 ci/basop-pages/create_report_pages.py $PAGES_HTML_ARTIFACT_NAME $MERGED_CSV_ARTIFACT_NAME $MLD_ARTIFACT_NAME $file_previous $CI_JOB_ID $id_previous $CI_JOB_NAME --histogram - else # create empty file for artifacts to avoid errors - touch $CI_JOB_NAME-index.html -- GitLab From 06d432c51833b340975e53e2cdd2caece0cdd52f Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 5 Jul 2024 11:57:58 +0530 Subject: [PATCH 043/110] BASOP and instrumentation for lib_rend module files --- lib_dec/d_gain2p_fx.c | 2 +- lib_rend/ivas_reverb_iir_filter.c | 26 ++++++- lib_rend/ivas_rom_TdBinauralRenderer.c | 63 ++++++++--------- lib_rend/ivas_rom_TdBinauralRenderer.h | 46 +++++++------ lib_rend/ivas_rom_binauralRenderer.c | 93 +++++++++++++++++++------- lib_rend/ivas_rom_binauralRenderer.h | 30 ++++----- lib_util/vector3_pair_file_reader.c | 16 +++++ 7 files changed, 176 insertions(+), 100 deletions(-) diff --git a/lib_dec/d_gain2p_fx.c b/lib_dec/d_gain2p_fx.c index 7ab2dec98..1507c284e 100644 --- a/lib_dec/d_gain2p_fx.c +++ b/lib_dec/d_gain2p_fx.c @@ -106,7 +106,7 @@ static void Mode2_gain_dec_mless_fx( /*-----------------------------------------------------------------* * decode pitch gain *-----------------------------------------------------------------*/ - *gain_pit = t_qua_gain[index * 2]; + *gain_pit = t_qua_gain[shl( index, 1 )]; move16(); /*-----------------------------------------------------------------* * calculate the predicted gain code diff --git a/lib_rend/ivas_reverb_iir_filter.c b/lib_rend/ivas_reverb_iir_filter.c index 03745f6b8..1f1508b5e 100644 --- a/lib_rend/ivas_reverb_iir_filter.c +++ b/lib_rend/ivas_reverb_iir_filter.c @@ -54,9 +54,13 @@ void ivas_reverb_iir_filt_init( ) { iirFilter->MaxTaps = maxTaps; + move16(); iirFilter->isFIR = 0; + move16(); iirFilter->nr_taps = 0; /* filter is set to PASS i.e. input copy to output */ + move16(); iirFilter->Output_fx = 0; + move32(); FOR( UWord16 i = 0; i < maxTaps; i++ ) { @@ -114,19 +118,23 @@ void ivas_reverb_iir_filt_set( { UWord16 i; - IF( GT_32( nr_taps, iirFilter->MaxTaps ) ) + if ( GT_32( nr_taps, iirFilter->MaxTaps ) ) { nr_taps = (UWord16) iirFilter->MaxTaps; + move16(); } iirFilter->nr_taps = nr_taps; + move16(); iirFilter->isFIR = ( coefA == NULL ); + move16(); IF( iirFilter->isFIR != 0 ) { FOR( i = 0; i < iirFilter->nr_taps; i++ ) { iirFilter->CoefB_fx[i] = L_shl( coefB[i], 16 ); /*Q30*/ + move32(); } } ELSE @@ -134,7 +142,9 @@ void ivas_reverb_iir_filt_set( FOR( i = 0; i < iirFilter->nr_taps; i++ ) { iirFilter->CoefA_fx[i] = L_shl( coefA[i], 16 ); /*Q30*/ + move32(); iirFilter->CoefB_fx[i] = L_shl( coefB[i], 16 ); /*Q30*/ + move32(); } } @@ -199,20 +209,30 @@ void ivas_reverb_iir_filt_2taps_feed_blk_fx( { UWord16 i; Word32 flt_output_fx = 0; + move32(); Word32 flt_CoefB_0_fx = iirFilter->CoefB_fx[0]; + move32(); Word32 flt_CoefB_1_fx = iirFilter->CoefB_fx[1]; + move32(); Word32 flt_CoefA_1_fx = iirFilter->CoefA_fx[1]; + move32(); Word32 flt_pBuffer_0_fx = iirFilter->pBuffer_fx[0]; + move32(); Word32 flt_pBuffer_1_fx = iirFilter->pBuffer_fx[1]; + move32(); for ( i = 0; i < blk_size; i++ ) { - flt_output_fx = L_add( Mpy_32_32( input[i] << 1, flt_CoefB_0_fx ), flt_pBuffer_0_fx ); - flt_pBuffer_0_fx = L_sub( L_add( flt_pBuffer_1_fx, Mpy_32_32( input[i] << 1, flt_CoefB_1_fx ) ), Mpy_32_32( flt_output_fx << 1, flt_CoefA_1_fx ) ); + flt_output_fx = L_add( Mpy_32_32( L_shl( input[i], 1 ), flt_CoefB_0_fx ), flt_pBuffer_0_fx ); + flt_pBuffer_0_fx = L_sub( L_add( flt_pBuffer_1_fx, Mpy_32_32( L_shl( input[i], 1 ), flt_CoefB_1_fx ) ), Mpy_32_32( L_shl( flt_output_fx, 1 ), flt_CoefA_1_fx ) ); output[i] = flt_output_fx; + move32(); } iirFilter->pBuffer_fx[0] = flt_pBuffer_0_fx; + move32(); iirFilter->pBuffer_fx[1] = flt_pBuffer_1_fx; + move32(); iirFilter->Output_fx = flt_output_fx; + move32(); return; } diff --git a/lib_rend/ivas_rom_TdBinauralRenderer.c b/lib_rend/ivas_rom_TdBinauralRenderer.c index 2bd48fa60..2fb147ee5 100644 --- a/lib_rend/ivas_rom_TdBinauralRenderer.c +++ b/lib_rend/ivas_rom_TdBinauralRenderer.c @@ -44,7 +44,9 @@ * TD Binaural rendering related ROM tables *------------------------------------------------------------------------*/ /* TD renderer default HRIR model */ +#ifndef IVAS_FLOAT_FIXED const float defaultHRIR_rom_latency_s = 0.000020834f; +#endif const Word32 defaultHRIR_rom_latency_s_fx = 44741; /* Q31 */ const int16_t defaultHRIR_rom_azimDim2[15] = { 1, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 1, @@ -64,26 +66,24 @@ const int16_t defaultHRIR_rom_azimShapeIdx[15] = { const int16_t defaultHRIR_rom_azimShapeSampFactor[15] = { -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, }; + +#ifndef IVAS_FLOAT_FIXED const float defaultHRIR_rom_elevKSeq[13] = { -90.000000f, -75.000000f, -60.000000f, -45.000000f, -30.000000f, -15.000000f, 0.000000f, 15.000000f, 30.000000f, 45.000000f, 60.000000f, 75.000000f, 90.000000f, }; -#ifdef IVAS_FLOAT_FIXED +const uint32_t defaultHRIR_rom_elevBsShape[36] = { +0x3f800000,0x3ed80000,0x3e000000,0x3c800000,0x00000000,0xaa000000,0x3efe0000,0x3f180000,0x3eea0000,0x3e800000,0x3dd80000,0x3d000000,0x3b800000,0x00000000,0x29800000,0x3da2aaab,0x3e855555,0x3eea0000,0x3f155555,0x3f13aaab,0x3ef00000,0x3ea0aaab,0x3e2aaaab,0x3d900000,0x3caaaaab,0x3b2aaaab,0x27800000,0xa9000000,0x3b2aaaab,0x3caaaaab,0x3d900000,0x3e2aaaab,0x3ea15555,0x3ef55555,0x3f1caaab,0x3f2aaaab, +}; +const uint32_t defaultHRIR_rom_azimBsShape[21] = { +0x3f2aaaab,0x3f283c13,0x3f21735f,0x3f17152a,0x3f09e60f,0x3ef55555,0x3ed44f30,0x3eb242e7,0x3e90b9af,0x3e627984,0x3e2aaaab,0x3df8d4fe,0x3daec33e,0x3d6a2798,0x3d1374bc,0x3caaaaab,0x3c2ec33e,0x3b9374bc,0x3aaec33e,0x392ec33e,0x26800000, +}; +#else const Word32 defaultHRIR_rom_elevKSeq_fx[13]/*Q22*/ = { -377487360, -314572800, -251658240, -188743680, -125829120, -62914560, 0, 62914560, 125829120, 188743680, 251658240, 314572800, 377487360 }; -#endif // IVAS_FLOAT_FIXED -const uint32_t defaultHRIR_rom_elevBsShape[36] = { -0x3f800000,0x3ed80000,0x3e000000,0x3c800000,0x00000000,0xaa000000,0x3efe0000,0x3f180000,0x3eea0000,0x3e800000,0x3dd80000,0x3d000000,0x3b800000,0x00000000,0x29800000,0x3da2aaab,0x3e855555,0x3eea0000,0x3f155555,0x3f13aaab,0x3ef00000,0x3ea0aaab,0x3e2aaaab,0x3d900000,0x3caaaaab,0x3b2aaaab,0x27800000,0xa9000000,0x3b2aaaab,0x3caaaaab,0x3d900000,0x3e2aaaab,0x3ea15555,0x3ef55555,0x3f1caaab,0x3f2aaaab, - }; -#ifdef IVAS_FLOAT_FIXED const Word32 defaultHRIR_rom_elevBsShape_fx[36]/*Q30*/ = { 1073741824,452984832,134217728,16777216,0,0,532676608,637534208,490733568,268435456,113246208,33554432,4194304,0,0,85284184,279620256,490733568,626349376,619358912,503316480,336942432,178956976,75497472,22369622,2796202,0,0,2796202,22369622,75497472,178956976,338340512,514501280,657107648,715827904 }; -#endif -const uint32_t defaultHRIR_rom_azimBsShape[21] = { -0x3f2aaaab,0x3f283c13,0x3f21735f,0x3f17152a,0x3f09e60f,0x3ef55555,0x3ed44f30,0x3eb242e7,0x3e90b9af,0x3e627984,0x3e2aaaab,0x3df8d4fe,0x3daec33e,0x3d6a2798,0x3d1374bc,0x3caaaaab,0x3c2ec33e,0x3b9374bc,0x3aaec33e,0x392ec33e,0x26800000, - }; -#ifdef IVAS_FLOAT_FIXED const Word32 defaultHRIR_rom_azimBsShape_fx[21]/*Q30*/ = { 715827904,705627328,677173184,633686656,578388928,514501280,445244928,373841120,303511008,237475904,178956976,130459632,91625968,61382240,38654704,22369622,11453246,4831838,1431655,178956,0 }; @@ -9768,8 +9768,7 @@ const UWord32 defaultHRIR_rom_AlphaR16_fx[470 * 43] = { 0xfff79681,0xfff6efd6,0xfff60bef,0xfffcef12,0xfffc9aee,0xfffcff38,0xfffcfd81,0xfffcff0e,0xfffcf933,0xfffd051f,0xfffd11c2,0xfffd35df,0xfffcb524,0xfffcaf46,0xfff68911,0xfff779ec,0xfff7be7c,0xfff82f76,0xfff758ca,0xfff72d7a,0xfff6c569,0xfff685bc,0xfff63a4c,0xfff5ad85,0xfff5fdc3, 0xfff62cd1,0xfff6a08b,0xfff6f7fb,0xfff78045,0xfff80434,0xfff8484b,0xfff884ee,0xfff8f780,0xfff924db,0xfff60a28, }; -#endif - +#else const uint32_t defaultHRIR_rom_AlphaL48[470 * 128] = { 0x3e0946b9,0x3cda8822,0x3e23be7e,0x3e005914,0x3e095697,0x3e097781,0x3e102edf,0x3e12d807,0x3e1514fc,0x3e103703,0x3e0d2242,0x3e09c889,0x3e06fde7,0x3e04b4aa,0x3e035ecf,0x3e0249b7,0x3e0116dd,0x3e008502,0x3dfcee82,0x3dee77e2,0x3e15b7f1,0x3cac1e96,0xbc8dd29b,0xbd855185,0x3d35c945, 0xbc7e4c57,0xbd71b7fd,0xbd7da762,0xbd708def,0xbd3a07f7,0xbd7775d0,0xbd84cf24,0xbd7d084a,0xbc7d5814,0x3d78b324,0xbd72376a,0xbcb689c0,0xbcfdaebc,0x3e0e19d2,0x3e20943f,0x3e1fe583,0x3e2947bb,0x3e3c07e7,0x3e44e230,0x3e463c59,0x3e3a7208,0x3e2f6146,0x3e2475af,0x3e1bd4da,0x3e1633a9, @@ -19453,6 +19452,7 @@ const uint32_t defaultHRIR_rom_AlphaR16[470 * 43] = { 0xba0697fc,0xba1102aa,0xba1f4119,0xb9443bb0,0xb9594495,0xb9403233,0xb9409feb,0xb9403ca5,0xb941b375,0xb93eb877,0xb93b8f84,0xb9328856,0xb952b729,0xb9542e9d,0xba176ef7,0xba08614e,0xba041846,0xb9fa1149,0xba0a7366,0xba0d2864,0xba13a976,0xba17a447,0xba1c5b4b,0xba2527bc,0xba2023da, 0xba1d32f8,0xba15f751,0xba108050,0xba07fbb1,0xb9ff7999,0xb9f6f6a1,0xb9ef625e,0xb9e11009,0xb9db64bd,0xba1f5d84, }; +#endif #ifdef IVAS_FLOAT_FIXED const UWord32 defaultHRIR_rom_EL48_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { @@ -19514,7 +19514,6 @@ const UWord32 defaultHRIR_rom_EL48_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { 0x00004eb9,0x00004ef0,0x00004f16,0x00004fb6,0x0000510d,0x00005600,0x00004f04,0x00004bf4,0x00004a5b,0x0000497c,0x00004a37,0x000049e2,0x00004d5b,0x00004f63,0x00005179,0x00005522,0x00005687,0x00006262,0x00006816,0x00007ec4,0x0000abd6,0x0000706a,0x00008b60,0x0000ca1f,0x0000c5e3, 0x0000bba0,0x0000a655,0x0000b00c,0x0000aaff,0x0000a4e6,0x00007d8e,0x00006765,0x00009e3e,0x00007e4b,0x00007037 }; - const UWord32 defaultHRIR_rom_ER48_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { 0x047ee4d8,0x03f280b8,0x05386b98,0x0472fda0,0x0546eb40,0x076f6d78,0x04382528,0x0488aa00,0x06bd5348,0x0704d428,0x06d60568,0x05f157b8,0x06d09290,0x06f92248,0x06cc8e98,0x0466c600,0x03db67c4,0x07924390,0x048ebf48,0x03f41dd8,0x04657680,0x036a1ca0,0x03cfde2c,0x03e0ba68,0x03f52760, 0x0409ea10,0x0421a660,0x0435ba10,0x04558680,0x047a5fa8,0x04b01dc0,0x04dde948,0x0526fc60,0x0509efe8,0x04e6aa20,0x04840c20,0x047d6488,0x05ed4498,0x05ff8e50,0x068475b0,0x03d7760c,0x03201db0,0x02a62e40,0x02995154,0x02374fd0,0x029927f8,0x02a77ff0,0x028bc644,0x02ad3d58,0x024cb2e0, @@ -19574,7 +19573,6 @@ const UWord32 defaultHRIR_rom_ER48_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { 0x0000654d,0x00007d87,0x00009920,0x000067b9,0x00007d2a,0x0000a4b4,0x0000aad5,0x0000b032,0x0000a656,0x0000bb83,0x0000c5fe,0x0000ca75,0x00008ba1,0x000070cc,0x0000ad9f,0x00007f4d,0x00006826,0x00006217,0x00005680,0x0000552a,0x00005176,0x00004f63,0x00004d5c,0x000049e2,0x00004a38, 0x0000497d,0x00004a60,0x00004bf4,0x00004f03,0x00005602,0x0000510f,0x00004fbb,0x00004f07,0x00004f16,0x00007035 }; - const UWord32 defaultHRIR_rom_EL32_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { 0x054a4eb8,0x04f4f0d8,0x05569b70,0x04b47630,0x052be930,0x0558ee78,0x05a21340,0x05c92f10,0x06092e60,0x05a367d8,0x056ef578,0x053967f0,0x050b7040,0x04e48198,0x04c1a078,0x04ab4c58,0x04922828,0x04796a68,0x045da820,0x040c93f8,0x048b76b0,0x046b48d0,0x04a92308,0x0663b628,0x04465358, 0x047a43a0,0x05ccc530,0x05e3ce48,0x05bf4e28,0x05441fe8,0x05c979c8,0x05fd7718,0x05df75e0,0x04a4ec80,0x04991e50,0x06641720,0x053f2f28,0x06b72af0,0x06f11a08,0x06feb018,0x080029f0,0x08c5c000,0x09cc9040,0x0a736fb0,0x0afda5f0,0x09a82a90,0x08b57570,0x07cbf1f8,0x070ce3d8,0x0679eea8, @@ -19634,7 +19632,6 @@ const UWord32 defaultHRIR_rom_EL32_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { 0x000066f1,0x00005f38,0x00005c09,0x00005867,0x0000562c,0x00005266,0x000052b2,0x000052f8,0x00005635,0x0000595b,0x00005e23,0x0000626c,0x000066b0,0x00006a2e,0x00006dcd,0x00007219,0x000076b9,0x00007e7c,0x00007e2c,0x000080b7,0x0000843c,0x00008350,0x000086c8,0x00009561,0x0000903a, 0x00008f5e,0x00008abf,0x00008b73,0x0000896d,0x00008d88,0x00007df7,0x00007884,0x00007bdd,0x00007824,0x00008e1d }; - const UWord32 defaultHRIR_rom_ER32_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { 0x054a4a90,0x04b59ef0,0x056004c0,0x04f624c8,0x05412248,0x06704ac8,0x0497dc00,0x04a6cb70,0x05db4030,0x05f962d0,0x05ca3a18,0x0545d3b0,0x05bf93a0,0x05e45250,0x05cc2d70,0x0479a490,0x0443aa10,0x06608268,0x04a79d68,0x046b7780,0x048cf9f0,0x040d0960,0x045d49a0,0x04798b10,0x049221d8, 0x04ab4a30,0x04c19e60,0x04e487e0,0x050b7560,0x05396118,0x056ed2e8,0x05a36f38,0x06096f58,0x05c92ae0,0x05a1f158,0x05593640,0x052acdc0,0x06fdff08,0x06daac48,0x06c51e00,0x04ae7998,0x04066aa0,0x038b0910,0x035dec1c,0x02f83044,0x031c4304,0x0322f880,0x03106168,0x0324368c,0x02dda158, @@ -19694,7 +19691,6 @@ const UWord32 defaultHRIR_rom_ER32_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { 0x0000722b,0x0000789e,0x00007c98,0x000078ef,0x00007e1f,0x00008d9b,0x00008974,0x00008b66,0x00008ac2,0x00008f60,0x0000903c,0x0000957b,0x000086e2,0x0000837c,0x00008482,0x000080cd,0x00007e2d,0x00007e7e,0x000076b8,0x00007218,0x00006dcc,0x00006a2d,0x000066b1,0x0000626d,0x00005e25, 0x0000595c,0x00005638,0x000052f9,0x000052b0,0x00005261,0x0000562b,0x00005869,0x00005c08,0x00005f3c,0x00008e1b }; - const UWord32 defaultHRIR_rom_EL16_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { 0x0624a2d8,0x0502a108,0x05b79728,0x056d4278,0x05b9bb98,0x05e5c5a0,0x06306120,0x0654ff78,0x067b1728,0x063a1c20,0x0613f848,0x05ee0980,0x05c33e88,0x059d3e18,0x057b0f90,0x05587a98,0x053bcb90,0x0523f068,0x050f7448,0x04db7478,0x0523f160,0x04961aa0,0x049bddb0,0x05a78478,0x046b85e0, 0x04637c28,0x05380080,0x054a5d90,0x05363028,0x050b2de0,0x05249788,0x0537d5d8,0x053265e8,0x047e3db8,0x04ac31f0,0x05954f50,0x04ef02d8,0x063a6220,0x071ba9b0,0x074d5100,0x07f8d530,0x08ad8a40,0x09c936d0,0x0a6c9e40,0x0abe03a0,0x09ec2c90,0x093fda60,0x089fee20,0x0805d110,0x078068a0, @@ -19754,7 +19750,6 @@ const UWord32 defaultHRIR_rom_EL16_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { 0x0000d58b,0x0000c4a9,0x0000bc7f,0x0000b366,0x0000add0,0x0000a546,0x0000a65b,0x0000a711,0x0000adaa,0x0000b3f7,0x0000bd81,0x0000c5eb,0x0000ceec,0x0000d62a,0x0000ddd5,0x0000e69e,0x0000f020,0x0001004f,0x0000ff52,0x000104a7,0x00010b0c,0x00010ccd,0x000113aa,0x00013070,0x000126bc, 0x00012626,0x00011e5a,0x00012093,0x00011d2c,0x000127d3,0x0001087d,0x0000fe1f,0x0000ff1c,0x0000f85b,0x0001253d }; - const UWord32 defaultHRIR_rom_ER16_fx[HRTF_MODEL_N_SECTIONS * 470] /*Q28*/ = { 0x0624a0e0,0x056db600,0x05bb77a0,0x0503cb18,0x04ef0160,0x05965d08,0x04a9add8,0x047e1d30,0x05325de0,0x053790e8,0x052407d8,0x050a5ea0,0x05357c10,0x054a7a30,0x05383838,0x04636030,0x046979c8,0x05a5d650,0x049bd6d8,0x04969ab0,0x0524e510,0x04dbc5e8,0x050f3628,0x05240978,0x053bc720, 0x055879e8,0x057b1008,0x059d3f68,0x05c342b0,0x05ee07c0,0x0613ed00,0x063a23d0,0x067b3920,0x0654f4f0,0x06303e80,0x05e5f970,0x05b92728,0x074deba8,0x07120130,0x063be4a0,0x0563d9f8,0x049bfa40,0x04522128,0x04164b68,0x03c36a60,0x03b749dc,0x03a7aefc,0x03ae0df8,0x03b453fc,0x0399cf74, @@ -19843,8 +19838,10 @@ const UWord32 defaultHRIR_rom_ITD_W_fx[658] /*Q25*/ = { 0x00073c50,0xffc53d17,0xffaef3ae,0x006c6e6f,0x001e3554,0xff07f047,0xfe85f03e,0x01690b7c,0x002de0f0,0x0004a149,0xff2c94fc,0xfffd8383,0x00bfdc23,0xfff389ae,0xffd2c64d,0xfe883edc,0x0173389c,0x00f2eb6a,0xffdb167a,0xff9bf93c,0x004de8c3,0x003de697,0xfff9603a,0xfeffbcf4,0xffe7c878, 0x006e0794,0x0155a804,0xfe867a7a,0xff23a62f,0xffbef3f5,0x00a43429,0x00169261,0xffff467a, }; -#endif - +const Word32 defaultHRIR_rom_ITD_azimBsShape_fx[84]/*Q30*/ = { +1073741824,782757760,549755840,368293440,231928240,134217728,68719480,28991030,8589935,1073741,0,0,275683200,466003936,582236480,635655168,637534208,599147968,531770624,446676608,355140096,268435456,195689440,137438960,92073360,57982060,33554432,17179870,7247757,2147483,268435,0,0,15121864,56550404,118380040,194705184,279620256,367219712,451597920,526849312,587068352,626349376,640397504,631360192,602995520,559061568,503316480,439518304,371425184,302795200,237386416,178956976,130459632,91625968,61382240,38654704,22369622,11453246,4831838,1431655,178956,0,0,178956,1431655,4831838,11453246,22369622,38654704,61382240,91625968,130459632,178956976,237475904,303511008,373841120,445244928,514501280,578388928,633686656,677173184,705627328,715827904 +}; +#else const uint32_t defaultHRIR_rom_EL48[HRTF_MODEL_N_SECTIONS * 470] = { 0x3e8fdcf1,0x3e8e2708,0x3ea53482,0x3e7c2de6,0x3e8fe783,0x3e906f77,0x3e9cddeb,0x3ea14109,0x3ea4da3b,0x3e9bbc9a,0x3e96062e,0x3e8f4bf3,0x3e8aaf7d,0x3e86b5df,0x3e8433e5,0x3e813d26,0x3e7d4d8a,0x3e78207d,0x3e742259,0x3e5a5203,0x3e8c3f1f,0x3e7d5e54,0x3e9285e3,0x3ef28ede,0x3e7742e2, 0x3e8ce88c,0x3ed9c917,0x3edf1bd9,0x3eda040b,0x3ebdd7d4,0x3eda97bf,0x3ee14156,0x3ed85779,0x3e90d3f7,0x3e8790ef,0x3eec0412,0x3ea8cd79,0x3ece6925,0x3ec47da1,0x3ebd9a80,0x3ed966e3,0x3ee7df3f,0x3f0a6b43,0x3f150db1,0x3f167f00,0x3f073082,0x3ef21552,0x3ed4e4bc,0x3ec08701,0x3eb2e282, @@ -20234,35 +20231,31 @@ const uint32_t defaultHRIR_rom_ITD_azimBsShape[84] = { 0x3e90624e,0x3e6263ab,0x3e2aaaab,0x3df8d4fe,0x3daec33e,0x3d6a2798,0x3d1374bc,0x3caaaaab,0x3c2ec33e,0x3b9374bc,0x3aaec33e,0x392ec33e,0xa6800000,0x00000000,0x392ec33e,0x3aaec33e,0x3b9374bc,0x3c2ec33e,0x3caaaaab,0x3d1374bc,0x3d6a2798,0x3daec33e,0x3df8d4fe,0x3e2aaaab,0x3e627984, 0x3e90b9af,0x3eb242e7,0x3ed44f30,0x3ef55555,0x3f09e60f,0x3f17152a,0x3f21735f,0x3f283c13,0x3f2aaaab, }; -#ifdef IVAS_FLOAT_FIXED -const Word32 defaultHRIR_rom_ITD_azimBsShape_fx[84]/*Q30*/ = { -1073741824,782757760,549755840,368293440,231928240,134217728,68719480,28991030,8589935,1073741,0,0,275683200,466003936,582236480,635655168,637534208,599147968,531770624,446676608,355140096,268435456,195689440,137438960,92073360,57982060,33554432,17179870,7247757,2147483,268435,0,0,15121864,56550404,118380040,194705184,279620256,367219712,451597920,526849312,587068352,626349376,640397504,631360192,602995520,559061568,503316480,439518304,371425184,302795200,237386416,178956976,130459632,91625968,61382240,38654704,22369622,11453246,4831838,1431655,178956,0,0,178956,1431655,4831838,11453246,22369622,38654704,61382240,91625968,130459632,178956976,237475904,303511008,373841120,445244928,514501280,578388928,633686656,677173184,705627328,715827904 -}; #endif + +#ifndef IVAS_FLOAT_FIXED const float defaultHRIR_rom_ITD_azimKSeq[19] = { 0.000000f, 10.000000f, 20.000000f, 30.000000f, 40.000000f, 50.000000f, 60.000000f, 70.000000f, 80.000000f, 90.000000f, 100.000000f, 110.000000f, 120.000000f, 130.000000f, 140.000000f, 150.000000f, 160.000000f, 170.000000f, 180.000000f, }; -#ifdef IVAS_FLOAT_FIXED -const Word32 defaultHRIR_rom_ITD_azimKSeq_fx[19]/*Q22*/ = { - 0< #include "prot.h" #include "options.h" /* only included to get access to the feature-defines */ +#ifdef IVAS_FLOAT_FIXED +#include "prot_fx1.h" +#include "prot_fx2.h" +#include "ivas_prot_fx.h" +#endif struct Vector3PairFileReader @@ -117,6 +122,17 @@ ivas_error Vector3PairFileReader_read( pSecond->y = y2; pSecond->z = z2; +#ifdef IVAS_FLOAT_FIXED + pFirst->q_fact = Q29; + pSecond->q_fact = Q29; + pFirst->x_fx = floatToFixed_32( pFirst->x, pFirst->q_fact ); + pFirst->y_fx = floatToFixed_32( pFirst->y, pFirst->q_fact ); + pFirst->z_fx = floatToFixed_32( pFirst->z, pFirst->q_fact ); + pSecond->x_fx = floatToFixed_32( pSecond->x, pSecond->q_fact ); + pSecond->y_fx = floatToFixed_32( pSecond->y, pSecond->q_fact ); + pSecond->z_fx = floatToFixed_32( pSecond->z, pSecond->q_fact ); +#endif + return IVAS_ERR_OK; } -- GitLab From 053b6f5d156928c79e7fcf4f8813a22150af960e Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 5 Jul 2024 12:27:26 +0530 Subject: [PATCH 044/110] Addressed comments shared in 3gpp issue 668 [x] Addressed comments in https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/issues/668 [x] ivas_tools.c and tools.c instrumentation will be addressed in another MR. --- lib_com/hp50.c | 19 ++++++++----------- lib_com/ivas_mdct_imdct_fx.c | 8 ++++---- lib_com/modif_fs.c | 8 ++++++-- lib_dec/ivas_mc_param_dec.c | 12 ++++++------ lib_dec/ivas_sba_rendering_internal.c | 13 ++++++++----- lib_dec/ivas_spar_md_dec.c | 18 ++++++++++++------ lib_dec/ivas_stereo_dft_dec_fx.c | 5 +++++ lib_dec/swb_tbe_dec.c | 4 ++-- lib_rend/ivas_reverb_filter_design.c | 20 ++++---------------- 9 files changed, 55 insertions(+), 52 deletions(-) diff --git a/lib_com/hp50.c b/lib_com/hp50.c index 288d690e3..b080d0431 100644 --- a/lib_com/hp50.c +++ b/lib_com/hp50.c @@ -654,23 +654,18 @@ void hp20_fix32( Qprev_y1 = extract_l( mem_fx[4] ); Qprev_y2 = extract_l( mem_fx[5] ); - y1_fx64 = (Word64) mem_fx[0]; - y2_fx64 = (Word64) mem_fx[1]; - x0_fx64 = (Word64) mem_fx[2]; - x1_fx64 = (Word64) mem_fx[3]; - move64(); - move64(); - move64(); - move64(); + y1_fx64 = W_deposit32_l( mem_fx[0] ); + y2_fx64 = W_deposit32_l( mem_fx[1] ); + x0_fx64 = W_deposit32_l( mem_fx[2] ); + x1_fx64 = W_deposit32_l( mem_fx[3] ); FOR( i = 0; i < lg; i++ ) { x2_fx64 = x1_fx64; - x1_fx64 = x0_fx64; - x0_fx64 = (Word64) signal_fx[i]; - move64(); move64(); + x1_fx64 = x0_fx64; move64(); + x0_fx64 = W_deposit32_l( signal_fx[i] ); Qy1 = W_norm( y1_fx64 ); if ( y1_fx64 == 0 ) @@ -732,9 +727,11 @@ void hp20_fix32( y0_fx64 = W_shr( y0_fx64, 29 ); signal_fx[i] = W_extract_l( W_shr( y0_fx64, Qmin ) ); + move32(); IF( signal_fx[i] < 0 ) { signal_fx[i] = L_add( signal_fx[i], 1 ); + move32(); } y2_fx64 = y1_fx64; diff --git a/lib_com/ivas_mdct_imdct_fx.c b/lib_com/ivas_mdct_imdct_fx.c index cb64739e8..730a2fe7e 100644 --- a/lib_com/ivas_mdct_imdct_fx.c +++ b/lib_com/ivas_mdct_imdct_fx.c @@ -303,9 +303,9 @@ void ivas_imdct_fx( FOR( i = 0; i < len_by_2; i++ ) { - re[i] = L_add( Mpy_32_16_1( pIn[sub( sub( length, imult1616( 2, i ) ), 1 )], pTwid_re[i] ), Mpy_32_16_1( pIn[2 * i], pTwid_im[i] ) ); /*stl_arr_index*/ + re[i] = L_add( Mpy_32_16_1( pIn[sub( sub( length, shl( i, 1 ) ), 1 )], pTwid_re[i] ), Mpy_32_16_1( pIn[2 * i], pTwid_im[i] ) ); /*stl_arr_index*/ move32(); - im[i] = L_sub( Mpy_32_16_1( pIn[2 * i], pTwid_re[i] ), Mpy_32_16_1( pIn[sub( sub( length, imult1616( 2, i ) ), 1 )], pTwid_im[i] ) ); /*stl_arr_index*/ + im[i] = L_sub( Mpy_32_16_1( pIn[2 * i], pTwid_re[i] ), Mpy_32_16_1( pIn[sub( sub( length, shl( i, 1 ) ), 1 )], pTwid_im[i] ) ); /*stl_arr_index*/ move32(); } @@ -328,9 +328,9 @@ void ivas_imdct_fx( FOR( i = ( len_by_2 - 1 ); i >= 0; i-- ) { - re[add( imult1616( 2, i ), 1 )] = im[sub( sub( len_by_2, 1 ), i )]; + re[add( shl( i, 1 ), 1 )] = im[sub( sub( len_by_2, 1 ), i )]; move32(); - re[imult1616( 2, i )] = L_negate( re[i] ); + re[2 * i] = L_negate( re[i] ); move32(); } diff --git a/lib_com/modif_fs.c b/lib_com/modif_fs.c index b4552998d..4bccd568b 100644 --- a/lib_com/modif_fs.c +++ b/lib_com/modif_fs.c @@ -1081,7 +1081,7 @@ void interpolate_3_over_1_allpass_32( Word32 *mem /* i/o: memory */ ) { - Word16 i; + Word16 i, tmp16; Word32 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */ Word32 *out1; Word32 mem_temp; @@ -1104,6 +1104,7 @@ void interpolate_3_over_1_allpass_32( mem[2] = Vu[1]; move32(); *out1++ = mem[3]; + move32(); /* Middle branch */ Vm[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[4] ), filt_coeff[3] ) ); @@ -1118,6 +1119,7 @@ void interpolate_3_over_1_allpass_32( mem[5] = Vm[1]; move32(); *out1++ = mem[6]; + move32(); /* Lower branch */ Vl[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[7] ), filt_coeff[6] ) ); @@ -1134,10 +1136,12 @@ void interpolate_3_over_1_allpass_32( mem[8] = Vl[1]; move32(); *out1++ = mem[9]; + move32(); } /*LPF*/ - FOR( i = 0; i < len * 3; i++ ) + tmp16 = imult1616( len, 3 ); + FOR( i = 0; i < tmp16; i++ ) { mem_temp = out[i]; move32(); diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index d25fff5f8..4887ffa12 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -6208,7 +6208,7 @@ static void ivas_param_mc_dequantize_cov_fx( tmp_e = Cp_buf_e[add( k, imult1616( nY_int, k ) )]; move16(); - IF( NE_32( Cproto_fx[add( k, imult1616( nY_int, k ) )], 0 ) ) + IF( Cproto_fx[add( k, imult1616( nY_int, k ) )] != 0 ) { L_tmp = ISqrt32( Cproto_fx[add( k, imult1616( nY_int, k ) )], &tmp_e ); } @@ -6269,13 +6269,13 @@ static void ivas_param_mc_dequantize_cov_fx( Cy_state_int_e[hParamMC->hMetadataPMC->icc_mapping[param_frame_idx][k][1] + nY_int * hParamMC->hMetadataPMC->icc_mapping[param_frame_idx][k][0]] = tmp; move16(); #else - Cy_state_int_fx[hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][0] + nY_int * hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][1]] = L_shr( L_deposit_h( icc_q_fx[k] ), tmp ); + Cy_state_int_fx[add( hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][0], imult1616( nY_int, hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][1] ) )] = L_shr( L_deposit_h( icc_q_fx[k] ), tmp ); move32(); - Cy_state_int_e[hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][0] + nY_int * hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][1]] = tmp; + Cy_state_int_e[add( hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][0], imult1616( nY_int, hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][1] ) )] = tmp; move16(); - Cy_state_int_fx[hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][1] + nY_int * hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][0]] = L_shr( L_deposit_h( icc_q_fx[k] ), tmp ); + Cy_state_int_fx[add( hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][1], imult1616( nY_int, hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][0] ) )] = L_shr( L_deposit_h( icc_q_fx[k] ), tmp ); move32(); - Cy_state_int_e[hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][1] + nY_int * hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][0]] = tmp; + Cy_state_int_e[add( hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][1], imult1616( nY_int, hParamMC->hMetadataPMC->icc_mapping_conf->icc_mapping[k][0] ) )] = tmp; move16(); #endif } @@ -6339,7 +6339,7 @@ static void ivas_param_mc_dequantize_cov_fx( } } - IF( synth_conf == PARAM_MC_SYNTH_LS_CONV_COV ) + IF( EQ_32( synth_conf, PARAM_MC_SYNTH_LS_CONV_COV ) ) { /* Cy = dmx*Cy*dmx' */ Word32 mat_mult_buffer1_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index 03b5eb85c..e925bd3e6 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -200,6 +200,7 @@ void ivas_sba2mc_cldfb_fixed( * * MC signals transformed into SBA in TD domain *-------------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED void ivas_mc2sba_fx( IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ @@ -233,6 +234,7 @@ void ivas_mc2sba_fx( move16(); FOR( i = 0; i < add( hIntSetup.nchan_out_woLFE, hIntSetup.num_lfe ); i++ ) { + test(); IF( ( hIntSetup.num_lfe > 0 ) && EQ_16( i, hIntSetup.index_lfe[idx_lfe] ) ) { IF( gain_lfe_fx > 0 ) @@ -245,16 +247,16 @@ void ivas_mc2sba_fx( } } - IF( LT_16( idx_lfe, sub( hIntSetup.num_lfe, 1 ) ) ) + if ( LT_16( idx_lfe, sub( hIntSetup.num_lfe, 1 ) ) ) { idx_lfe = add( idx_lfe, 1 ); } } ELSE { - azimuth = (Word16) L_shr( hIntSetup.ls_azimuth_fx[idx_in], 22 ); + azimuth = extract_l( L_shr( hIntSetup.ls_azimuth_fx[idx_in], Q22 ) ); move16(); - elevation = (Word16) L_shr( hIntSetup.ls_elevation_fx[idx_in], 22 ); + elevation = extract_l( L_shr( hIntSetup.ls_elevation_fx[idx_in], Q22 ) ); move16(); idx_in = add( idx_in, 1 ); ivas_dirac_dec_get_response_fx( @@ -284,7 +286,6 @@ void ivas_mc2sba_fx( return; } #else - void ivas_mc2sba( IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ @@ -362,6 +363,7 @@ void ivas_mc2sba( } #endif + /*-------------------------------------------------------------------------* * ivas_param_mc_mc2sba_cldfb() * @@ -402,6 +404,7 @@ void ivas_param_mc_mc2sba_cldfb_fx( FOR( idx_ch = 0; idx_ch < add( hTransSetup.nchan_out_woLFE, hTransSetup.num_lfe ); idx_ch++ ) { + test(); IF( ( hTransSetup.num_lfe > 0 ) && EQ_16( idx_ch, hTransSetup.index_lfe[idx_lfe] ) ) { IF( gain_lfe_fx > 0 ) @@ -413,7 +416,7 @@ void ivas_param_mc_mc2sba_cldfb_fx( move32(); } - IF( LT_16( idx_lfe, sub( hTransSetup.num_lfe, 1 ) ) ) + if ( LT_16( idx_lfe, sub( hTransSetup.num_lfe, 1 ) ) ) { idx_lfe = add( idx_lfe, 1 ); } diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 50ca91a30..6e7f24878 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -4079,6 +4079,7 @@ static void ivas_spar_md_fill_invalid_bandcoeffs( * * *-----------------------------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED static void ivas_spar_dec_compute_ramp_down_post_matrix_fx( ivas_spar_md_dec_state_t *hMdDec, @@ -4091,20 +4092,22 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix_fx( num_out_ch = hMdDec->spar_md_cfg.num_umx_chs; move16(); move16(); - IF( EQ_16( bfi, 0 ) ) + IF( bfi == 0 ) { hMdDec->spar_plc_num_lost_frames = 0; move16(); } ELSE { - IF( EQ_16( hMdDec->td_decorr_flag, 0 ) ) + IF( hMdDec->td_decorr_flag == 0 ) { assert( 0 ); } hMdDec->spar_plc_num_lost_frames = add( hMdDec->spar_plc_num_lost_frames, 1 ); + move16(); hMdDec->spar_plc_num_lost_frames = s_min( hMdDec->spar_plc_num_lost_frames, 100 ); /*hMdDec->spar_plc_num_lost_frames is always <=100*/ + move16(); IF( GT_16( hMdDec->spar_plc_num_lost_frames, ivas_spar_dec_plc_num_frames_keep ) ) /*if control enters then ivas_spar_dec_plc_num_frames_keep<100 */ { @@ -4118,13 +4121,15 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix_fx( num_fade_frames = s_max( sub( hMdDec->spar_plc_num_lost_frames, ivas_spar_dec_plc_num_frames_keep ), 0 ); norm_nff = norm_s( num_fade_frames ); gain_dB = -imult1616( s_min( num_fade_frames, ivas_spar_dec_plc_max_num_frames_ramp_down ), ivas_spar_dec_plc_per_frame_ramp_down_gain_dB ); /*abs(gain_dB)<99*/ /*Q(gain_dB)=7Q24*/ - Word16 exp_gain = 0; /*stores exponent for gain_fx*/ + Word16 exp_gain; /*stores exponent for gain_fx*/ gain_fx = BASOP_util_Pow2( Mult_32_16( imult3216( 13421773 /*=2^28/20*/, gain_dB ), 27213 /*=log2(10)*2^13*/ ), 5, &exp_gain ); Q_gain = sub( 31, exp_gain ); FOR( i = 0; i < IVAS_SPAR_MAX_CH; i++ ) { post_matrix_fx[i] = add( shl( 1, norm_nff ), mult( s_min( mult( shl( num_fade_frames, norm_nff ), 3640 /* 1 / ivas_spar_dec_plc_num_frames_fade_out in Q15 */ ), shl( 1, norm_nff ) ), shl( sub( ivas_spar_dec_plc_spatial_target[i], 1 ), 15 ) ) ); /*Q=norm_nff*/ - post_matrix_fx[i] = Mult_32_16( gain_fx, (Word16) post_matrix_fx[i] ); /*Q_gain+norm_nff-15*/ + move32(); + post_matrix_fx[i] = Mult_32_16( gain_fx, extract_l( post_matrix_fx[i] ) ); /*Q_gain+norm_nff-15*/ + move32(); } Q_post_matrix = sub( add( Q_gain, norm_nff ), 15 ); /* apply the post matrix */ @@ -4136,19 +4141,20 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix_fx( { FOR( b = 0; b < num_bands_out; b++ ) { - hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = Mult_32_32( hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], post_matrix_fx[i] ); + hMdDec->mixer_mat_fx[i][j][add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )] = Mult_32_32( hMdDec->mixer_mat_fx[i][j][add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )], post_matrix_fx[i] ); + move32(); } } } } hMdDec->Q_mixer_mat = sub( add( Q_post_matrix, hMdDec->Q_mixer_mat ), 31 ); + move16(); } } return; } #else - static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 6f0775a9a..87831a269 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -2461,18 +2461,22 @@ static void stereo_dft_dequantize_ipd_fx( IF( EQ_16( bits, 2 ) ) /* 2-bit phase quantization for the highest frequency band only */ { delta_fx = ( EVS_PI_FX ) >> 1; + move16(); } ELSE IF( EQ_16( bits, 3 ) ) { delta_fx = ( EVS_PI_FX ) >> 2; + move16(); } ELSE IF( EQ_16( bits, 4 ) ) { delta_fx = ( EVS_PI_FX ) >> 3; + move16(); } ELSE { delta_fx = ( EVS_PI_FX ) >> 2; + move16(); assert( 0 ); } @@ -2480,6 +2484,7 @@ static void stereo_dft_dequantize_ipd_fx( { temp_out = L_sub( L_mult0( ind[i], delta_fx ), ( EVS_PI_FX ) ); *out_fx = L_shl( temp_out, 14 ); + move32(); } return; } diff --git a/lib_dec/swb_tbe_dec.c b/lib_dec/swb_tbe_dec.c index 2b1bd7f63..613e82b3f 100644 --- a/lib_dec/swb_tbe_dec.c +++ b/lib_dec/swb_tbe_dec.c @@ -4610,7 +4610,7 @@ void GenTransition_fixed( { IF( i % 2 == 0 ) { - syn_overlap_32k_fx[i] = -syn_overlap_32k_fx[i]; + syn_overlap_32k_fx[i] = L_negate( syn_overlap_32k_fx[i] ); move32(); } ELSE @@ -4729,7 +4729,7 @@ void GenTransition_WB_fixed( { IF( i % 2 == 0 ) { - speech_buf_16k2_fx[i] = -speech_buf_16k2_fx[i]; + speech_buf_16k2_fx[i] = L_negate( speech_buf_16k2_fx[i] ); move32(); } ELSE diff --git a/lib_rend/ivas_reverb_filter_design.c b/lib_rend/ivas_reverb_filter_design.c index 8ffc766d4..b293d6e22 100644 --- a/lib_rend/ivas_reverb_filter_design.c +++ b/lib_rend/ivas_reverb_filter_design.c @@ -277,6 +277,7 @@ static void calc_min_phase_fx( Word16 guarded_bits; guarded_bits = find_guarded_bits_fx( fft_size ); *q_pCepstrum = sub( L_norm_arr( pCepstrum, fft_size ), guarded_bits ); + move16(); FOR( Word16 j = 0; j < fft_size; j++ ) { @@ -284,6 +285,7 @@ static void calc_min_phase_fx( move32(); } *q_pCepstrum = add( *q_pCepstrum, 26 ); + move16(); /* Compute the real pCepstrum of the log amplitude spectrum */ fft_rel_fx32( pCepstrum, fft_size, log2_fft_size ); @@ -295,14 +297,6 @@ static void calc_min_phase_fx( pCepstrum[idx] = Mpy_32_32( pCepstrum[idx], scale_factor ); // q = q_pCepstrum move32(); } -#if 0 - guarded_bits = L_norm_arr(pCepstrum, fft_size); - FOR(Word16 j = 0; j < fft_size; j++) - { - pCepstrum[j] = L_shl(pCepstrum[j], guarded_bits - 3); - } - q_pCepstrum += guarded_bits - 3; -#endif /* Fold the pCepstrum to ensure that zeros outside the unit circle move inside it, making it minimum phase. */ pFolded_cepstrum_re[0] = pCepstrum[0]; move32(); @@ -313,7 +307,7 @@ static void calc_min_phase_fx( { pFolded_cepstrum_re[idx] = L_shl( pCepstrum[idx], 1 ); // q = q_pCepstrum move32(); - pFolded_cepstrum_im[idx] = L_negate( L_shl( pCepstrum[fft_size - idx], 1 ) ); // q = q_pCepstrum + pFolded_cepstrum_im[idx] = L_negate( L_shl( pCepstrum[sub( fft_size, idx )], 1 ) ); // q = q_pCepstrum move32(); /* Note: sign inverted because of fft rather than ifft used before */ } @@ -344,13 +338,7 @@ static void calc_min_phase_fx( IF( LE_16( fft_size, 512 ) ) /* for size <= 512 using complex-value FFT (more effecient, but available only up to 512 size) */ { DoRTFTn_fx_ivas( pFolded_cepstrum_re, pFolded_cepstrum_im, fft_size ); - // guarded_bits = L_norm_arr(pFolded_cepstrum_im, fft_size); -#if 0 - FOR(Word16 j = 0; j < fft_size; j++) - { - pFolded_cepstrum_im[j] = L_shl(pFolded_cepstrum_im[j], 30 - *q_pCepstrum); - } -#endif + /* Copying the img part into the output */ FOR( idx = 1; idx < half_fft_size; idx++ ) { -- GitLab From 3d3f635ecdaaf90f01880b40856b79458bfac0f3 Mon Sep 17 00:00:00 2001 From: norvell Date: Fri, 5 Jul 2024 07:47:18 +0000 Subject: [PATCH 045/110] Updated pages to synch with !1675 in PC repo --- .gitlab-ci.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e882417fd..a8fd344f5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -237,10 +237,9 @@ stages: - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - python3 scripts/parse_xml_report.py report-junit.xml $MLD_ARTIFACT_NAME - - mkdir images - - python3 scripts/create_histogram_summary.py $MLD_ARTIFACT_NAME images/summary_"$CI_JOB_ID"_MLD.csv images/summary_"$CI_JOB_ID"_MLD.png --measure MLD - - python3 scripts/create_histogram_summary.py $MLD_ARTIFACT_NAME images/summary_"$CI_JOB_ID"_DIFF.csv images/summary_"$CI_JOB_ID"_DIFF.png --measure DIFF - - python3 scripts/create_histogram_summary.py $MLD_ARTIFACT_NAME images/summary_"$CI_JOB_ID"_SSNR.csv images/summary_"$CI_JOB_ID"_SSNR.png --measure SSNR + - mkdir images_"$CI_JOB_NAME" + - for MEASURE in MLD DIFF SSNR;do python3 scripts/create_histogram_summary.py $MLD_ARTIFACT_NAME images_"$CI_JOB_NAME"/summary_"$MEASURE".csv images_"$CI_JOB_NAME"/summary_"$MEASURE".png --measure $MEASURE; done + - python3 ci/basop-pages/create_summary_page.py summary_$CI_JOB_NAME.html $CI_JOB_ID $CI_JOB_NAME - if [ $USE_LTV -eq 1 ] && [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH $CI_JOB_NAME $CI_PROJECT_ID) @@ -249,10 +248,10 @@ stages: - unzip artifacts.zip -d previous_artifacts # This wildcard thingy relies on only one csv file being present per job - file_previous="previous_artifacts/mld--$CI_JOB_NAME-$id_previous--sha-*.csv" - - python3 ci/basop-pages/create_report_pages.py $PAGES_HTML_ARTIFACT_NAME $MERGED_CSV_ARTIFACT_NAME $MLD_ARTIFACT_NAME $file_previous $CI_JOB_ID $id_previous $CI_JOB_NAME --histogram + - python3 ci/basop-pages/create_report_pages.py $PAGES_HTML_ARTIFACT_NAME $MERGED_CSV_ARTIFACT_NAME $MLD_ARTIFACT_NAME $file_previous $CI_JOB_ID $id_previous $CI_JOB_NAME - else # create empty file for artifacts to avoid errors - - touch $CI_JOB_NAME-index.html + - touch $PAGES_HTML_ARTIFACT_NAME - touch $MERGED_CSV_ARTIFACT_NAME - fi -- GitLab From acd76a6cb52afdd35fdf3e49b0e34bfd1053d2bd Mon Sep 17 00:00:00 2001 From: norvell Date: Fri, 5 Jul 2024 09:57:40 +0000 Subject: [PATCH 046/110] Added missing artifact $SUMMARY_HTML_ARTIFACT_NAME --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a8fd344f5..e137f89bc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -215,6 +215,7 @@ stages: MLD_ARTIFACT_NAME: "mld--$CI_JOB_NAME-$CI_JOB_ID--sha-$CI_COMMIT_SHORT_SHA.csv" MERGED_CSV_ARTIFACT_NAME: "$CI_JOB_NAME--merged_csv--$CI_JOB_ID.csv" PAGES_HTML_ARTIFACT_NAME: "$CI_JOB_NAME-index.html" + SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" script: - *print-common-info - *update-scripts-repo @@ -239,7 +240,7 @@ stages: - python3 scripts/parse_xml_report.py report-junit.xml $MLD_ARTIFACT_NAME - mkdir images_"$CI_JOB_NAME" - for MEASURE in MLD DIFF SSNR;do python3 scripts/create_histogram_summary.py $MLD_ARTIFACT_NAME images_"$CI_JOB_NAME"/summary_"$MEASURE".csv images_"$CI_JOB_NAME"/summary_"$MEASURE".png --measure $MEASURE; done - - python3 ci/basop-pages/create_summary_page.py summary_$CI_JOB_NAME.html $CI_JOB_ID $CI_JOB_NAME + - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME - if [ $USE_LTV -eq 1 ] && [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH $CI_JOB_NAME $CI_PROJECT_ID) @@ -273,6 +274,7 @@ stages: - $MLD_ARTIFACT_NAME - $MERGED_CSV_ARTIFACT_NAME - images + - $SUMMARY_HTML_ARTIFACT_NAME expose_as: "pytest mld results" reports: junit: -- GitLab From 8d587bd32536f165a2e89193122f9155d45547bf Mon Sep 17 00:00:00 2001 From: norvell Date: Fri, 5 Jul 2024 10:01:53 +0000 Subject: [PATCH 047/110] Another missing artifact $IMAGES_ARTIFACT_NAME --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e137f89bc..b4d7b432a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -216,6 +216,7 @@ stages: MERGED_CSV_ARTIFACT_NAME: "$CI_JOB_NAME--merged_csv--$CI_JOB_ID.csv" PAGES_HTML_ARTIFACT_NAME: "$CI_JOB_NAME-index.html" SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" + IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" script: - *print-common-info - *update-scripts-repo @@ -238,7 +239,7 @@ stages: - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - python3 scripts/parse_xml_report.py report-junit.xml $MLD_ARTIFACT_NAME - - mkdir images_"$CI_JOB_NAME" + - mkdir $IMAGES_ARTIFACT_NAME - for MEASURE in MLD DIFF SSNR;do python3 scripts/create_histogram_summary.py $MLD_ARTIFACT_NAME images_"$CI_JOB_NAME"/summary_"$MEASURE".csv images_"$CI_JOB_NAME"/summary_"$MEASURE".png --measure $MEASURE; done - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME @@ -275,6 +276,7 @@ stages: - $MERGED_CSV_ARTIFACT_NAME - images - $SUMMARY_HTML_ARTIFACT_NAME + - $IMAGES_ARTIFACT_NAME expose_as: "pytest mld results" reports: junit: -- GitLab From e0fa304b8c33bd76f5f2319b6084c353a043d27e Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 8 Jul 2024 21:10:48 +0530 Subject: [PATCH 048/110] BASOP and instrumentation changes for lib_com, lib_rend, lib_dec --- lib_com/fd_cng_com.c | 80 +- lib_com/fd_cng_com_fx.c | 40 +- lib_com/fft.c | 72 +- lib_com/fft_evs.c | 6 + lib_com/fft_fx_evs.c | 89 +- lib_com/fft_rel.c | 65 +- lib_com/fft_rel_fx.c | 6 + lib_com/gs_bitallocation_fx.c | 4 +- lib_com/gs_bitallocation_ivas_fx.c | 247 +++-- lib_com/gs_gains_fx.c | 102 +- lib_com/gs_inact_switching_fx.c | 5 + lib_com/gs_noisefill_fx.c | 71 +- lib_com/gs_preech.c | 8 +- lib_com/guided_plc_util_fx.c | 2 +- lib_com/hp50.c | 25 +- lib_com/hq2_bit_alloc.c | 16 +- lib_com/hq2_bit_alloc_fx.c | 36 +- lib_com/ivas_prot.h | 106 +- lib_com/ivas_prot_fx.h | 42 +- lib_com/ivas_tools.c | 820 +++++++++------ lib_com/wi_fx.c | 393 ++++--- lib_com/window_fx.c | 10 +- lib_com/window_ola_fx.c | 102 +- lib_com/wtda.c | 126 ++- lib_com/wtda_fx.c | 5 +- lib_dec/fd_cng_dec.c | 37 +- lib_dec/ivas_init_dec.c | 2 +- lib_dec/ivas_sba_dec.c | 2 +- lib_dec/ivas_spar_decoder.c | 662 ++++++++---- lib_dec/ivas_spar_md_dec.c | 1524 ++++++++++++++++------------ lib_dec/ivas_stereo_adapt_GR_dec.c | 129 ++- lib_dec/ivas_stereo_cng_dec.c | 527 ++++++---- lib_dec/ivas_stereo_dft_dec.c | 159 +-- lib_enc/ivas_mcmasa_enc.c | 27 + lib_enc/speech_music_classif.c | 50 + 35 files changed, 3580 insertions(+), 2017 deletions(-) diff --git a/lib_com/fd_cng_com.c b/lib_com/fd_cng_com.c index 5e0ec84ed..32df6893f 100644 --- a/lib_com/fd_cng_com.c +++ b/lib_com/fd_cng_com.c @@ -961,56 +961,63 @@ void SynthesisSTFT_fx( Word32 *timeDomainOutput, Word32 *olapBuffer, const Word16 *olapWin, - const int16_t tcx_transition, + const Word16 tcx_transition, HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ - const int16_t element_mode, /* i : element mode */ - const int16_t nchan_out /* i : number of output channels */ + const Word16 element_mode, /* i : element mode */ + const Word16 nchan_out /* i : number of output channels */ ) { - int16_t i; + Word16 i; Word32 buf_fx[M + 1 + 320], tmp_fx; /* Perform IFFT */ RFFTN_fx( fftBuffer, hFdCngCom->fftSineTab_fx, hFdCngCom->fftlen, 1 ); /* Handle overlap in P/S domain for stereo */ - IF( ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) && nchan_out == 2 ) + test(); + test(); + IF( ( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) ) && EQ_16( nchan_out, 2 ) ) { - mvl2l( olapBuffer + 3 * hFdCngCom->frameSize / 4 - ( M + 1 ), buf_fx, hFdCngCom->frameSize + M + 1 ); - set_l( olapBuffer, 0, hFdCngCom->fftlen ); + Copy32( olapBuffer + sub( i_mult( 3, shr( hFdCngCom->frameSize, 2 ) ), ( M + 1 ) ), buf_fx, add( hFdCngCom->frameSize, M + 1 ) ); + set32_fx( olapBuffer, 0, hFdCngCom->fftlen ); } ELSE { - mvl2l( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->frameSize ); - set_l( olapBuffer + hFdCngCom->frameSize, 0, hFdCngCom->frameSize ); /*olapBuffer, fftBuffer, olapWin*/ + Copy32( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->frameSize ); + set32_fx( olapBuffer + hFdCngCom->frameSize, 0, hFdCngCom->frameSize ); /*olapBuffer, fftBuffer, olapWin*/ } IF( tcx_transition ) { - FOR( i = 0; i < 5 * hFdCngCom->frameSize / 4; i++ ) + FOR( i = 0; i < i_mult( 5, shr( hFdCngCom->frameSize, 2 ) ); i++ ) { olapBuffer[i] = fftBuffer[i]; + move32(); } } ELSE { - FOR( i = hFdCngCom->frameSize / 4; i < 3 * hFdCngCom->frameSize / 4; i++ ) + FOR( i = hFdCngCom->frameSize / 4; i < i_mult( 3, shr( hFdCngCom->frameSize, 2 ) ); i++ ) { - olapBuffer[i] = L_add( olapBuffer[i], Mpy_32_16_1( fftBuffer[i], olapWin[i - hFdCngCom->frameSize / 4] ) ); + olapBuffer[i] = L_add( olapBuffer[i], Mpy_32_16_1( fftBuffer[i], olapWin[sub( i, shr( hFdCngCom->frameSize, 2 ) )] ) ); + move32(); } - FOR( ; i < 5 * hFdCngCom->frameSize / 4; i++ ) + FOR( ; i < i_mult( 5, shr( hFdCngCom->frameSize, 2 ) ); i++ ) { olapBuffer[i] = fftBuffer[i]; + move32(); } } - FOR( ; i < 7 * hFdCngCom->frameSize / 4; i++ ) + FOR( ; i < i_mult( 7, shr( hFdCngCom->frameSize, 2 ) ); i++ ) { - olapBuffer[i] = Mpy_32_16_1( fftBuffer[i], olapWin[i - 3 * hFdCngCom->frameSize / 4] ); + olapBuffer[i] = Mpy_32_16_1( fftBuffer[i], olapWin[sub( i, i_mult( 3, shr( hFdCngCom->frameSize, 2 ) ) )] ); + move32(); } FOR( ; i < hFdCngCom->fftlen; i++ ) { olapBuffer[i] = 0; + move32(); } Word32 fftScale = 0; @@ -1018,43 +1025,49 @@ void SynthesisSTFT_fx( { case 640: fftScale = FFT_SCALING_640; - break; + move32(); + BREAK; case 512: fftScale = FFT_SCALING_512; - break; + move32(); + BREAK; default: assert( !"Not supported FFT length!" ); } /* Get time-domain signal */ // v_multc(olapBuffer + hFdCngCom->frameSize / 4, (float)(hFdCngCom->fftlen / 2), timeDomainOutput, hFdCngCom->frameSize); v_multc_fixed( olapBuffer + hFdCngCom->frameSize / 4, fftScale, timeDomainOutput, hFdCngCom->frameSize ); // Q_in - 9 - /* Get excitation */ - IF( ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) && nchan_out == 2 ) + /* Get excitation */ + test(); + test(); + IF( ( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) ) && EQ_16( nchan_out, 2 ) ) { FOR( i = 0; i < hFdCngCom->frameSize / 2; i++ ) { - buf_fx[i + ( M + 1 )] = L_add( buf_fx[i + ( M + 1 )], olapBuffer[i + hFdCngCom->frameSize / 4] ); + buf_fx[i + ( M + 1 )] = L_add( buf_fx[i + ( M + 1 )], olapBuffer[add( i, shr( hFdCngCom->frameSize, 2 ) )] ); + move32(); } // v_multc(buf, (float)(hFdCngCom->fftlen / 2), buf, M + 1 + hFdCngCom->frameSize); - v_multc_fixed( buf_fx, fftScale, buf_fx, M + 1 + hFdCngCom->frameSize ); + v_multc_fixed( buf_fx, fftScale, buf_fx, add( M + 1, hFdCngCom->frameSize ) ); } ELSE { // v_multc(olapBuffer + hFdCngCom->frameSize / 4 - (M + 1), (float)(hFdCngCom->fftlen / 2), buf, M + 1 + hFdCngCom->frameSize); - v_multc_fixed( olapBuffer + ( hFdCngCom->frameSize / 4 ) - ( M + 1 ), fftScale, buf_fx, M + 1 + hFdCngCom->frameSize ); + v_multc_fixed( olapBuffer + sub( shr( hFdCngCom->frameSize, 2 ), ( M + 1 ) ), fftScale, buf_fx, add( M + 1, hFdCngCom->frameSize ) ); } tmp_fx = buf_fx[0]; + move32(); // preemph(buf + 1, PREEMPH_FAC_FLT, M + hFdCngCom->frameSize, &tmp); - preemph_ivas_fx( buf_fx + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp_fx ); + preemph_ivas_fx( buf_fx + 1, PREEMPH_FAC, add( M, hFdCngCom->frameSize ), &tmp_fx ); // residu(hFdCngCom->A_cng_flt, M, buf + 1 + M, hFdCngCom->exc_cng_flt, hFdCngCom->frameSize); // floatToFixed_arr( hFdCngCom->A_cng_flt, hFdCngCom->A_cng, Q13, M + 1 ); // residu_ivas_fx( hFdCngCom->A_cng, Q13, M, buf_fx + 1 + M, hFdCngCom->exc_cng_32fx, hFdCngCom->frameSize ); - residu_ivas_fx( hFdCngCom->A_cng, ( 15 - norm_s( hFdCngCom->A_cng[0] - 1 ) ), M, buf_fx + 1 + M, hFdCngCom->exc_cng_32fx, hFdCngCom->frameSize ); + residu_ivas_fx( hFdCngCom->A_cng, sub( 15, norm_s( hFdCngCom->A_cng[0] - 1 ) ), M, buf_fx + 1 + M, hFdCngCom->exc_cng_32fx, hFdCngCom->frameSize ); for ( i = 0; i < hFdCngCom->frameSize; i++ ) { - hFdCngCom->exc_cng_flt[i] = fix_to_float( hFdCngCom->exc_cng_32fx[i], Q_in - 9 ); + hFdCngCom->exc_cng_flt[i] = fix_to_float( hFdCngCom->exc_cng_32fx[i], sub( Q_in, 9 ) ); } return; @@ -1149,7 +1162,8 @@ void SynthesisSTFT_dirac_fx( FOR( i = shr( hFdCngCom->frameSize, 2 ); i < i_mult( 3, shr( hFdCngCom->frameSize, 2 ) ); i++ ) { - olapBuffer[i] = L_add( olapBuffer[i], Mpy_32_16_1( fftBuffer[i], olapWin[i - hFdCngCom->frameSize / 4] ) ); + olapBuffer[i] = L_add( olapBuffer[i], Mpy_32_16_1( fftBuffer[i], olapWin[sub( i, shr( hFdCngCom->frameSize, 2 ) )] ) ); + move32(); } FOR( ; i < i_mult( 5, shr( hFdCngCom->frameSize, 2 ) ); i++ ) { @@ -1186,14 +1200,15 @@ void SynthesisSTFT_dirac_fx( } /* Get time-domain signal */ - v_multc_fixed( olapBuffer + hFdCngCom->frameSize / 4, fftScale, timeDomainOutput, samples_out ); // Q_in - 9 + v_multc_fixed( olapBuffer + shr( hFdCngCom->frameSize, 2 ), fftScale, timeDomainOutput, samples_out ); // Q_in - 9 /* Get excitation */ - v_multc_fixed( olapBuffer + ( hFdCngCom->frameSize / 4 ) - ( M + 1 ), fftScale, buf, M + 1 + hFdCngCom->frameSize ); + v_multc_fixed( olapBuffer + sub( shr( hFdCngCom->frameSize, 2 ), ( M + 1 ) ), fftScale, buf, add( M + 1, hFdCngCom->frameSize ) ); tmp = buf[0]; + move32(); preemph_ivas_fx( buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp ); // residu_ivas_fx( hFdCngCom->A_cng, Q13, M, buf + 1 + M, hFdCngCom->exc_cng_32fx, hFdCngCom->frameSize ); - residu_ivas_fx( hFdCngCom->A_cng, 15 - norm_s( hFdCngCom->A_cng[0] - 1 ), M, buf + 1 + M, hFdCngCom->exc_cng_32fx, hFdCngCom->frameSize ); + residu_ivas_fx( hFdCngCom->A_cng, sub( 15, norm_s( hFdCngCom->A_cng[0] - 1 ) ), M, buf + 1 + M, hFdCngCom->exc_cng_32fx, hFdCngCom->frameSize ); /* update and window olapBuf if we have a output frame that is shorter than the default frame size...*/ IF( LT_16( samples_out, hFdCngCom->frameSize ) ) @@ -1202,7 +1217,8 @@ void SynthesisSTFT_dirac_fx( } FOR( i = i_mult( 5, shr( hFdCngCom->frameSize, 2 ) ); i < i_mult( 7, shr( hFdCngCom->frameSize, 2 ) ); i++ ) { - olapBuffer[i] = Mpy_32_16_1( olapBuffer[i], olapWin[i - 3 * hFdCngCom->frameSize / 4] ); + olapBuffer[i] = Mpy_32_16_1( olapBuffer[i], olapWin[sub( i, i_mult( 3, shr( hFdCngCom->frameSize, 2 ) ) )] ); + move32(); } return; @@ -1286,9 +1302,10 @@ Word32 rand_gauss_fx( temp = own_random( seed ); temp = L_add( temp, own_random( seed ) ); temp = L_add( temp, own_random( seed ) ); - temp = L_shr( temp, 15 - q ); + temp = L_shr( temp, sub( 15, q ) ); *x = temp; + move32(); return temp; } @@ -1311,6 +1328,7 @@ Word16 rand_gauss_fix( temp = L_add( temp, shr( own_random( seed ), Q2 ) ); *x = (Word16) temp; + move32(); return (Word16) temp; } diff --git a/lib_com/fd_cng_com_fx.c b/lib_com/fd_cng_com_fx.c index 7125ec40c..b024df61d 100644 --- a/lib_com/fd_cng_com_fx.c +++ b/lib_com/fd_cng_com_fx.c @@ -395,10 +395,12 @@ void compress_range( if ( in_s != 0 ) { out[i] = extract_h( L_tmp ); + move16(); } if ( out[i] == 0 ) { out[i] = 1; + move16(); } } } @@ -417,10 +419,12 @@ void compress_range( if ( in[i] != 0 ) { out[i] = extract_h( L_tmp ); + move16(); } if ( out[i] == 0 ) { out[i] = 1; + move16(); } } } @@ -523,7 +527,7 @@ void expand_range_var_exp( move32(); Word32 tmp_low_lim = L_shr( low_lim, maxOutExp ); - IF( LT_32( out[i], tmp_low_lim ) ) + if ( LT_32( out[i], tmp_low_lim ) ) { out[i] = tmp_low_lim; move32(); @@ -603,6 +607,7 @@ void minimum_statistics( Word16 msNoiseFloor16; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif @@ -765,7 +770,7 @@ void minimum_statistics( FOR( j = start; j < stop; j++ ) { - /* Compute optimal smoothing parameter for PSD estimation */ test(); + /* Compute optimal smoothing parameter for PSD estimation */ test(); IF( ( scalar == 0 ) || ( msNoiseFloor[j] == 0 ) ) { @@ -827,6 +832,7 @@ void minimum_statistics( /* Compute the PSD (smoothed periodogram) in each band */ msPsd[j] = round_fx( L_add( Mpy_32_16_1( msAlpha[j], msPsd[j] ), Mpy_32_16_1( L_sub( 2147483647l /*1.0 Q31*/, msAlpha[j] ), msPeriodog[j] ) ) ); + move16(); } msPsdSum[cnt] = dotp_s_fx( msPsd + start, psize + start, current_len, CNG_HS ); move32(); @@ -1077,6 +1083,7 @@ void minimum_statistics( FOR( j = 0; j < len; j++ ) { msCurrentMinOut[j] = L_deposit_h( msPeriodog[j] ); + move32(); } set32_fx( hFdCngCom->msAlphaCor, 2147483647l /*1.0 Q31*/, cnt ); set32_fx( msAlpha, 0l /*0.0 Q31*/, len ); @@ -1123,6 +1130,7 @@ void minimum_statistics( FOR( j = 0; j < len; j++ ) { msNoiseEst[j] = round_fx( L_mac( L_mult( 31130 /*0.95 Q15*/, msNoiseEst[j] ), 1638 /*0.05 Q15*/, msNoiseFloor[j] ) ); + move16(); } } #ifdef IVAS_CODE_CNG_COM @@ -1221,6 +1229,7 @@ void minimum_statistics_fx( Word16 msNoiseFloor16; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif @@ -1379,7 +1388,7 @@ void minimum_statistics_fx( FOR( j = start; j < stop; j++ ) { - /* Compute optimal smoothing parameter for PSD estimation */ test(); + /* Compute optimal smoothing parameter for PSD estimation */ test(); IF( ( scalar == 0 ) || ( msNoiseFloor[j] == 0 ) ) { @@ -1441,6 +1450,7 @@ void minimum_statistics_fx( /* Compute the PSD (smoothed periodogram) in each band */ msPsd[j] = round_fx( L_add( Mpy_32_16_1( msAlpha[j], msPsd[j] ), Mpy_32_16_1( L_sub( 2147483647l /*1.0 Q31*/, msAlpha[j] ), msPeriodog[j] ) ) ); + move16(); } msPsdSum[cnt] = dotp_s_fx( msPsd + start, psize + start, current_len, CNG_HS ); move32(); @@ -1691,6 +1701,7 @@ void minimum_statistics_fx( FOR( j = 0; j < len; j++ ) { msCurrentMinOut[j] = L_deposit_h( msPeriodog[j] ); + move32(); } set32_fx( hFdCngCom->msAlphaCor, 2147483647l /*1.0 Q31*/, cnt ); set32_fx( msAlpha, 0l /*0.0 Q31*/, len ); @@ -1731,12 +1742,14 @@ void minimum_statistics_fx( ELSE { hFdCngCom->msFrCnt = add( hFdCngCom->msFrCnt, 1 ); + move16(); } /* Smooth noise estimate during CNG phases */ FOR( j = 0; j < len; j++ ) { msNoiseEst[j] = round_fx( L_mac( L_mult( 31130 /*0.95 Q15*/, msNoiseEst[j] ), 1638 /*0.05 Q15*/, msNoiseFloor[j] ) ); + move16(); } } if ( enc_dec == DEC && element_mode == IVAS_CPE_TD ) @@ -1804,6 +1817,7 @@ void apply_scale( { *scale = L_add( *scale, L_deposit_h( scaleTable[i].scale ) ); + move32(); } } @@ -1837,6 +1851,7 @@ Word16 apply_scale_ind( { *scale = L_add( *scale, L_deposit_h( scaleTable[i].scale ) ); + move32(); } return i; } @@ -1864,7 +1879,9 @@ void apply_scale_ivas_fx( assert( i < scaleTableSize ); *scale = L_add( *scale, L_deposit_h( scaleTable[i].scale ) ); + move32(); *index = i; + move16(); } #endif // IVAS_FLOAT_FIXED /*------------------------------------------------------------------- @@ -1961,6 +1978,7 @@ void scalebands( delta = 0; move16(); partpowLD64M1 = 0L; /* to avoid compilation warnings */ + move32(); /* Interpolate the bin/band-wise levels from the partition levels */ IF( EQ_16( nband, npart ) ) @@ -2102,6 +2120,7 @@ void scalebands_fx( delta = 0; move16(); partpowLD64M1 = 0L; /* to avoid compilation warnings */ + move32(); /* Interpolate the bin/band-wise levels from the partition levels */ IF( EQ_16( nband, npart ) ) @@ -2241,6 +2260,7 @@ static void getmidbands( Word16 j, max_psize, shift; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif @@ -2248,6 +2268,7 @@ static void getmidbands( move16(); /* first half partition */ move16(); midband[0] = part[0]; + move16(); psize[0] = add( part[0], 1 ); move16(); psize_inv[0] = getNormReciprocalWord16( psize[0] ); @@ -2401,8 +2422,10 @@ void AnalysisSTFT_fx( FOR( i = 0; i < hFdCngCom->fftlen; i++ ) { fftBuffer[i] = L_shr( fftBuffer[i], 11 ); + move32(); } *fftBuffer_exp = WORD16_BITS + 11; + move16(); /* Perform FFT */ RFFTN_fx( fftBuffer, hFdCngCom->fftSineTab_fx, hFdCngCom->fftlen, -1 ); @@ -2439,9 +2462,11 @@ void SynthesisSTFT( /* Perform IFFT */ scale = 0; + move16(); BASOP_rfft( fftBuffer, hFdCngCom->fftlen, &scale, 1 ); fftBufferExp = add( fftBufferExp, scale ); hFdCngCom->fftBuffer_exp = fftBufferExp; + move16(); fftBufferExp = add( fftBufferExp, hFdCngCom->fftlenShift ); @@ -2466,6 +2491,7 @@ void SynthesisSTFT( FOR( i = 0; i < len; i++ ) { olapBuffer[i] = round_fx( L_shl( fftBuffer[i], fftBufferExp - 15 ) ); + move16(); } } ELSE @@ -2685,6 +2711,7 @@ void mhvals( tmp2_m = BASOP_Util_Add_Mant32Exp( tmp2_m, tmp2_e, L_deposit_h( m_array[i] ), 0, &tmp2_e ); assert( tmp2_e == 0 ); *m = extract_h( tmp2_m ); + move32(); } } @@ -2735,9 +2762,12 @@ void lpc_from_spectrum( Word32 *powspec = hFdCngCom->cngNoiseLevel; /*i : pointer to noise levels format Q5.27*/ Word16 powspec_exp = hFdCngCom->cngNoiseLevelExp; + move16(); Word16 fftlen = hFdCngCom->fftlen; /*i : size of fft*/ Word16 *A = hFdCngCom->A_cng; /*o : lpc coefficients format Q3.12*/ + move16(); Word16 lpcorder = M; + move16(); scale = 0; move16(); @@ -2767,6 +2797,7 @@ void lpc_from_spectrum( *ptr = nf; move32(); *pti = L_deposit_l( 0 ); + move32(); ptr += 2; pti += 2; } @@ -2776,6 +2807,7 @@ void lpc_from_spectrum( *ptr = L_max( nf, L_shl( powspec[i - start], s1 ) ); move32(); *pti = L_deposit_l( 0 ); + move32(); ptr += 2; pti += 2; } @@ -2785,6 +2817,7 @@ void lpc_from_spectrum( *ptr = nf; move32(); *pti = L_deposit_l( 0 ); + move32(); ptr += 2; pti += 2; } @@ -2960,6 +2993,7 @@ void FdCng_exc( Word16 i; *CNG_mode = -1; + move16(); FOR( i = 0; i < L_frame / L_SUBFR; i++ ) { diff --git a/lib_com/fft.c b/lib_com/fft.c index 75f54e2c3..c40556298 100644 --- a/lib_com/fft.c +++ b/lib_com/fft.c @@ -6513,21 +6513,21 @@ static void BASOP_fft8( move32(); im[s * 6] = L_add( s05, s07 ); move32(); - re[s * 3] = L_add( s08, s14 ); + re[i_mult( s, 3 )] = L_add( s08, s14 ); move32(); - re[s * 7] = L_sub( s08, s14 ); + re[i_mult( s, 7 )] = L_sub( s08, s14 ); move32(); - im[s * 3] = L_add( s09, s15 ); + im[i_mult( s, 3 )] = L_add( s09, s15 ); move32(); - im[s * 7] = L_sub( s09, s15 ); + im[i_mult( s, 7 )] = L_sub( s09, s15 ); move32(); re[s * 1] = L_add( s10, s12 ); move32(); - re[s * 5] = L_sub( s10, s12 ); + re[i_mult( s, 5 )] = L_sub( s10, s12 ); move32(); im[s * 1] = L_add( s11, s13 ); move32(); - im[s * 5] = L_sub( s11, s13 ); + im[i_mult( s, 5 )] = L_sub( s11, s13 ); move32(); return; @@ -6581,23 +6581,23 @@ static void BASOP_fftN2( IF( i == 0 ) { - cplxMpy4_8_1( x02, x03, x[2 * i + 2 * 1 * dim1], x[2 * i + 2 * 1 * dim1 + 1] ); - cplxMpy4_8_1( x04, x05, x[2 * i + 2 * 2 * dim1], x[2 * i + 2 * 2 * dim1 + 1] ); - cplxMpy4_8_1( x06, x07, x[2 * i + 2 * 3 * dim1], x[2 * i + 2 * 3 * dim1 + 1] ); - cplxMpy4_8_1( x08, x09, x[2 * i + 2 * 4 * dim1], x[2 * i + 2 * 4 * dim1 + 1] ); - cplxMpy4_8_1( x10, x11, x[2 * i + 2 * 5 * dim1], x[2 * i + 2 * 5 * dim1 + 1] ); - cplxMpy4_8_1( x12, x13, x[2 * i + 2 * 6 * dim1], x[2 * i + 2 * 6 * dim1 + 1] ); - cplxMpy4_8_1( x14, x15, x[2 * i + 2 * 7 * dim1], x[2 * i + 2 * 7 * dim1 + 1] ); + cplxMpy4_8_1( x02, x03, x[add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x04, x05, x[add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x06, x07, x[add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x08, x09, x[add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x10, x11, x[add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x12, x13, x[add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x14, x15, x[add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) ), 1 )] ); } ELSE { - cplxMpy4_8_0( x02, x03, x[2 * i + 2 * 1 * dim1], x[2 * i + 2 * 1 * dim1 + 1], W[sc * i + sc * 1 * dim1 - Woff], W[sc * i + sc * 1 * dim1 + 1 - Woff] ); - cplxMpy4_8_0( x04, x05, x[2 * i + 2 * 2 * dim1], x[2 * i + 2 * 2 * dim1 + 1], W[sc * i + sc * 2 * dim1 - Woff], W[sc * i + sc * 2 * dim1 + 1 - Woff] ); - cplxMpy4_8_0( x06, x07, x[2 * i + 2 * 3 * dim1], x[2 * i + 2 * 3 * dim1 + 1], W[sc * i + sc * 3 * dim1 - Woff], W[sc * i + sc * 3 * dim1 + 1 - Woff] ); - cplxMpy4_8_0( x08, x09, x[2 * i + 2 * 4 * dim1], x[2 * i + 2 * 4 * dim1 + 1], W[sc * i + sc * 4 * dim1 - Woff], W[sc * i + sc * 4 * dim1 + 1 - Woff] ); - cplxMpy4_8_0( x10, x11, x[2 * i + 2 * 5 * dim1], x[2 * i + 2 * 5 * dim1 + 1], W[sc * i + sc * 5 * dim1 - Woff], W[sc * i + sc * 5 * dim1 + 1 - Woff] ); - cplxMpy4_8_0( x12, x13, x[2 * i + 2 * 6 * dim1], x[2 * i + 2 * 6 * dim1 + 1], W[sc * i + sc * 6 * dim1 - Woff], W[sc * i + sc * 6 * dim1 + 1 - Woff] ); - cplxMpy4_8_0( x14, x15, x[2 * i + 2 * 7 * dim1], x[2 * i + 2 * 7 * dim1 + 1], W[sc * i + sc * 7 * dim1 - Woff], W[sc * i + sc * 7 * dim1 + 1 - Woff] ); + cplxMpy4_8_0( x02, x03, x[add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 1, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 1, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x04, x05, x[add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 2, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 2, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x06, x07, x[add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 3, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 3, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x08, x09, x[add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 4, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 4, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x10, x11, x[add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 5, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 5, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x12, x13, x[add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 6, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 6, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x14, x15, x[add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 7, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 7, dim1 ) ) ), 1 ), Woff )] ); } t00 = L_shr( L_add( x00, x08 ), SCALEFACTORN2 - 1 ); t02 = L_shr( L_sub( x00, x08 ), SCALEFACTORN2 - 1 ); @@ -6639,37 +6639,37 @@ static void BASOP_fftN2( s13 = Mpy_32_16_1( L_sub( t03, t01 ), C81_FX ); s15 = Mpy_32_16_1( L_add( t01, t03 ), C82_FX ); - re[sx * i + sx * 0 * dim1] = L_add( s00, s02 ); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 0, dim1 ) ) )] = L_add( s00, s02 ); move32(); - im[sx * i + sx * 0 * dim1] = L_add( s01, s03 ); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 0, dim1 ) ) )] = L_add( s01, s03 ); move32(); - re[sx * i + sx * 1 * dim1] = L_add( s10, s12 ); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 1, dim1 ) ) )] = L_add( s10, s12 ); move32(); - im[sx * i + sx * 1 * dim1] = L_add( s11, s13 ); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 1, dim1 ) ) )] = L_add( s11, s13 ); move32(); - re[sx * i + sx * 2 * dim1] = L_sub( s04, s06 ); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 2, dim1 ) ) )] = L_sub( s04, s06 ); move32(); - im[sx * i + sx * 2 * dim1] = L_sub( s05, s07 ); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 2, dim1 ) ) )] = L_sub( s05, s07 ); move32(); - re[sx * i + sx * 3 * dim1] = L_add( s08, s14 ); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 3, dim1 ) ) )] = L_add( s08, s14 ); move32(); - im[sx * i + sx * 3 * dim1] = L_add( s09, s15 ); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 3, dim1 ) ) )] = L_add( s09, s15 ); move32(); - re[sx * i + sx * 4 * dim1] = L_sub( s00, s02 ); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 4, dim1 ) ) )] = L_sub( s00, s02 ); move32(); - im[sx * i + sx * 4 * dim1] = L_sub( s01, s03 ); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 4, dim1 ) ) )] = L_sub( s01, s03 ); move32(); - re[sx * i + sx * 5 * dim1] = L_sub( s10, s12 ); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 5, dim1 ) ) )] = L_sub( s10, s12 ); move32(); - im[sx * i + sx * 5 * dim1] = L_sub( s11, s13 ); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 5, dim1 ) ) )] = L_sub( s11, s13 ); move32(); - re[sx * i + sx * 6 * dim1] = L_add( s04, s06 ); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 6, dim1 ) ) )] = L_add( s04, s06 ); move32(); - im[sx * i + sx * 6 * dim1] = L_add( s05, s07 ); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 6, dim1 ) ) )] = L_add( s05, s07 ); move32(); - re[sx * i + sx * 7 * dim1] = L_sub( s08, s14 ); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 7, dim1 ) ) )] = L_sub( s08, s14 ); move32(); - im[sx * i + sx * 7 * dim1] = L_sub( s09, s15 ); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 7, dim1 ) ) )] = L_sub( s09, s15 ); move32(); } diff --git a/lib_com/fft_evs.c b/lib_com/fft_evs.c index 9f98faaa4..3ff15a5c6 100644 --- a/lib_com/fft_evs.c +++ b/lib_com/fft_evs.c @@ -555,12 +555,15 @@ void fft16( Word32 *re, Word32 *im, Word16 s, Word16 bScale ) FOR( i = 0; i < 16; i++ ) { inp_data[i] = CL_form( re[s * i], im[s * i] ); + move64(); } fft16_with_cmplx_data( inp_data, bScale ); FOR( i = 0; i < 16; i++ ) { re[s * i] = CL_Extract_real( inp_data[i] ); + move32(); im[s * i] = CL_Extract_imag( inp_data[i] ); + move32(); } } } @@ -1927,6 +1930,7 @@ static void fftN2( cmplx s0, s1, s2, s3, s4, s5, s6, s7; i = 0; + move16(); { y0 = CL_shr( x_cmplx[i + 0 * dim1], 1 ); y1 = CL_shr( x_cmplx[i + 1 * dim1], 1 ); @@ -2463,7 +2467,9 @@ void BASOP_rfft( Word32 *x, Word16 sizeOfFft, Word16 *scale, Word16 isign ) case 320: case 640: c1 = FFTC( 0x66666680 ); + move16(); c2 = FFTC( 0x99999980 ); + move16(); FOR( i = 0; i < sizeOfFft2; i++ ) { x[2 * i] = Mpy_32_xx( x[2 * i], c1 ); diff --git a/lib_com/fft_fx_evs.c b/lib_com/fft_fx_evs.c index b36bac55f..fa25f6847 100644 --- a/lib_com/fft_fx_evs.c +++ b/lib_com/fft_fx_evs.c @@ -808,10 +808,8 @@ static void cftbsub_fx( move32(); a[j1] = x0r; move32(); - move32(); a[j1 + 1] = x0i; move32(); - move32(); } } } @@ -842,7 +840,7 @@ static void rftfsub_fx( { k = sub( n, j ); kk = add( kk, ks ); - wkr = sub( 8192, c[nc - kk] ); + wkr = sub( 8192, c[sub( nc, kk )] ); wki = c[kk]; move16(); xr = L_sub( a[j], a[k] ); @@ -888,7 +886,7 @@ static void rftbsub_fx( { k = sub( n, j ); kk = add( kk, ks ); - wkr = sub( 8192, c[nc - kk] ); + wkr = sub( 8192, c[sub( nc, kk )] ); wki = c[kk]; move16(); xr = L_sub( a[j], a[k] ); @@ -936,8 +934,8 @@ static void dctsub_fx( { k = sub( n, j ); kk = add( kk, ks ); - wkr = sub( c[kk], c[nc - kk] ); - wki = add( c[kk], c[nc - kk] ); + wkr = sub( c[kk], c[sub( nc, kk )] ); + wki = add( c[kk], c[sub( nc, kk )] ); xr = L_sub( Mult_32_16( L_shl( a[j], 1 ), wki ), Mult_32_16( L_shl( a[k], 1 ), wkr ) ); a[j] = L_add( Mult_32_16( L_shl( a[j], 1 ), wkr ), Mult_32_16( L_shl( a[k], 1 ), wki ) ); move32(); @@ -945,6 +943,7 @@ static void dctsub_fx( move32(); } a[m] = Mult_32_16( L_shl( a[m], 1 ), c[0] ); + move16(); } /*-----------------------------------------------------------------* @@ -967,7 +966,9 @@ void edct2_fx( Word32 xr; *q = Exp16Array( n, in ); + move16(); *q = add( *q, 6 ); + move16(); FOR( j = 0; j < n; j++ ) { a[j] = L_shl( (Word32) in[j], *q ); @@ -1264,6 +1265,7 @@ static void fft5_32_16fx( Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif i0 = Idx[0]; move16(); @@ -1509,7 +1511,6 @@ static void fft32_5_16fx( Word16 i, id, jd; Word16 z[64]; - move16(); /*penalty for 1 ptr init */ FOR( i = 0; i < 32; i++ ) { id = Idx[i]; @@ -1522,7 +1523,6 @@ static void fft32_5_16fx( cdftForw_16fx( 64, z, Ip_fft32, w_fft32_16fx ); - move16(); /*penalty for 1 ptr init */ FOR( i = 0; i < 32; i++ ) { jd = Odx_fft32_5[i]; @@ -1604,7 +1604,6 @@ void DoRTFT128_16fx( Word16 i; Word16 z[256]; - move16(); /*penalty for 1 ptr init */ FOR( i = 0; i < 128; i++ ) { z[2 * i] = x[i]; @@ -1619,8 +1618,6 @@ void DoRTFT128_16fx( move16(); y[0] = z[1]; move16(); - move16(); /*penalty for 1 ptr init */ - move16(); /*penalty for 1 ptr init */ FOR( i = 1; i < 128; i++ ) { x[128 - i] = z[2 * i]; @@ -1840,6 +1837,7 @@ static void cftfsub_16fx( Word16 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif l = 2; @@ -1940,6 +1938,7 @@ static void cft1st_16fx( Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif #ifdef BASOP_NOGLOB @@ -2042,20 +2041,24 @@ static void cft1st_16fx( #ifdef BASOP_NOGLOB a[10] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); tmp = add_o( x0r, x0i, &Overflow ); L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ a[11] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /* Q(Qx+Q_edct) */ + move16(); x0r = add_o( x3i, x1r, &Overflow ); x0i = sub_o( x3r, x1i, &Overflow ); tmp = sub_o( x0i, x0r, &Overflow ); L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ a[14] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); tmp = add_o( x0i, x0r, &Overflow ); L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ a[15] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); #else a[10] = round_fx( L_shl( L_tmp, 1 ) ); /*Q(Qx+Q_edct) */ @@ -2114,30 +2117,36 @@ static void cft1st_16fx( L_tmp = Mult_32_16( wk2r, x0r ); /*Q(15+Qx+Q_edct) */ L_tmp = Msub_32_16( L_tmp, wk2i, x0i ); /*Q(15+Qx+Q_edct) */ a[j + 4] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); L_tmp = Mult_32_16( wk2r, x0i ); /*Q(15+Qx+Q_edct) */ L_tmp = Madd_32_16( L_tmp, wk2i, x0r ); /*Q(15+Qx+Q_edct) */ a[j + 5] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); x0r = sub_o( x1r, x3i, &Overflow ); x0i = add_o( x1i, x3r, &Overflow ); L_tmp = Mult_32_16( wk1r, x0r ); /*Q(15+Qx+Q_edct) */ L_tmp = Msub_32_16( L_tmp, wk1i, x0i ); /*Q(15+Qx+Q_edct) */ a[j + 2] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); L_tmp = Mult_32_16( wk1r, x0i ); /*Q(15+Qx+Q_edct) */ L_tmp = Madd_32_16( L_tmp, wk1i, x0r ); /*Q(15+Qx+Q_edct) */ a[j + 3] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); x0r = add_o( x1r, x3i, &Overflow ); x0i = sub_o( x1i, x3r, &Overflow ); L_tmp = Mult_32_16( wk3r, x0r ); /*Q(15+Qx+Q_edct) */ L_tmp = Msub_32_16( L_tmp, wk3i, x0i ); /*Q(15+Qx+Q_edct) */ a[j + 6] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); L_tmp = Mult_32_16( wk3r, x0i ); /*Q(15+Qx+Q_edct) */ L_tmp = Madd_32_16( L_tmp, wk3i, x0r ); /*Q(15+Qx+Q_edct) */ a[j + 7] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); wk1r = w[k2 + 2]; move32(); @@ -2168,21 +2177,25 @@ static void cft1st_16fx( L_tmp = Mult_32_16( wk2i, tmp ); /*Q(15+Qx+Q_edct) */ L_tmp = Msub_32_16( L_tmp, wk2r, x0i ); /*Q(15+Qx+Q_edct) */ a[j + 12] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); tmp = negate( x0i ); L_tmp = Mult_32_16( wk2i, tmp ); /*Q(15+Qx+Q_edct) */ L_tmp = Madd_32_16( L_tmp, wk2r, x0r ); /*Q(15+Qx+Q_edct) */ a[j + 13] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); x0r = sub_o( x1r, x3i, &Overflow ); x0i = add_o( x1i, x3r, &Overflow ); L_tmp = Mult_32_16( wk1r, x0r ); /*Q(15+Qx+Q_edct) */ L_tmp = Msub_32_16( L_tmp, wk1i, x0i ); /*Q(15+Qx+Q_edct) */ a[j + 10] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); L_tmp = Mult_32_16( wk1r, x0i ); /*Q(15+Qx+Q_edct) */ L_tmp = Madd_32_16( L_tmp, wk1i, x0r ); /*Q(15+Qx+Q_edct) */ a[j + 11] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); x0r = add_o( x1r, x3i, &Overflow ); x0i = sub_o( x1i, x3r, &Overflow ); @@ -2190,10 +2203,12 @@ static void cft1st_16fx( L_tmp = Mult_32_16( wk3r, x0r ); /*Q(15+Qx+Q_edct) */ L_tmp = Msub_32_16( L_tmp, wk3i, x0i ); /*Q(15+Qx+Q_edct) */ a[j + 14] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); L_tmp = Mult_32_16( wk3r, x0i ); /*Q(15+Qx+Q_edct) */ L_tmp = Madd_32_16( L_tmp, wk3i, x0r ); /*Q(15+Qx+Q_edct) */ a[j + 15] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); #else x0r = add( a[j], a[j + 2] ); x0i = add( a[j + 1], a[j + 3] ); @@ -2318,9 +2333,9 @@ static void cftmdl_16fx( Word32 L_x0r, L_x0i; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif m = shl( l, 2 ); - move16(); FOR( j = 0; j < l; j += 2 ) { #ifdef BASOP_NOGLOB @@ -2413,20 +2428,24 @@ static void cftmdl_16fx( tmp = sub_o( x0r, x0i, &Overflow ); L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ a[j1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); tmp = add_o( x0r, x0i, &Overflow ); L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ a[j1 + 1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); x0r = add_o( x3i, x1r, &Overflow ); x0i = sub_o( x3r, x1i, &Overflow ); tmp = sub_o( x0i, x0r, &Overflow ); L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ a[j3] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); tmp = add_o( x0i, x0r, &Overflow ); L_tmp = Mult_32_16( wk1r, tmp ); /*Q(15+Qx+Q_edct) */ a[j3 + 1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); #else j1 = add( j, l ); j2 = add( j1, l ); @@ -2517,10 +2536,12 @@ static void cftmdl_16fx( L_tmp = Mult_32_16( wk2r, x0r ); /*Q(15+Qx+Q_edct) */ L_tmp = Msub_32_16( L_tmp, wk2i, x0i ); /*Q(15+Qx+Q_edct) */ a[j2] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); L_tmp = Mult_32_16( wk2r, x0i ); /*Q(15+Qx+Q_edct) */ L_tmp = Madd_32_16( L_tmp, wk2i, x0r ); /*Q(15+Qx+Q_edct) */ a[j2 + 1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); x0r = sub_o( x1r, x3i, &Overflow ); x0i = add_o( x1i, x3r, &Overflow ); @@ -2528,10 +2549,12 @@ static void cftmdl_16fx( L_tmp = Mult_32_16( wk1r, x0r ); /*Q(15+Qx+Q_edct) */ L_tmp = Msub_32_16( L_tmp, wk1i, x0i ); /*Q(15+Qx+Q_edct) */ a[j1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); L_tmp = Mult_32_16( wk1r, x0i ); /*Q(15+Qx+Q_edct) */ L_tmp = Madd_32_16( L_tmp, wk1i, x0r ); /*Q(15+Qx+Q_edct) */ a[j1 + 1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); L_x0r = L_add( (Word32) x1r, (Word32) x3i ); L_x0i = L_sub( (Word32) x1i, (Word32) x3r ); @@ -2540,10 +2563,12 @@ static void cftmdl_16fx( L_tmp = Mult_32_16( wk3r, x0r ); /*Q(15+Qx+Q_edct) */ L_tmp = Msub_32_16( L_tmp, wk3i, x0i ); /*Q(15+Qx+Q_edct) */ a[j3] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); L_tmp = Mult_32_16( wk3r, x0i ); /*Q(15+Qx+Q_edct) */ L_tmp = Madd_32_16( L_tmp, wk3i, x0r ); /*Q(15+Qx+Q_edct) */ a[j3 + 1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); #else j1 = add( j, l ); j2 = add( j1, l ); @@ -2641,11 +2666,13 @@ static void cftmdl_16fx( L_tmp = Mult_32_16( wk2i, tmp ); /*Q(15+Qx+Q_edct) */ L_tmp = Msub_32_16( L_tmp, wk2r, x0i ); /*Q(15+Qx+Q_edct) */ a[j2] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); tmp = negate( x0i ); L_tmp = Mult_32_16( wk2i, tmp ); /*Q(15+Qx+Q_edct) */ L_tmp = Madd_32_16( L_tmp, wk2r, x0r ); /*Q(15+Qx+Q_edct) */ a[j2 + 1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); x0r = sub_o( x1r, x3i, &Overflow ); x0i = add_o( x1i, x3r, &Overflow ); @@ -2653,10 +2680,12 @@ static void cftmdl_16fx( L_tmp = Mult_32_16( wk1r, x0r ); /*Q(15+Qx+Q_edct) */ L_tmp = Msub_32_16( L_tmp, wk1i, x0i ); /*Q(15+Qx+Q_edct) */ a[j1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); L_tmp = Mult_32_16( wk1r, x0i ); /*Q(15+Qx+Q_edct) */ L_tmp = Madd_32_16( L_tmp, wk1i, x0r ); /*Q(15+Qx+Q_edct) */ a[j1 + 1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); x0r = add_o( x1r, x3i, &Overflow ); x0i = sub_o( x1i, x3r, &Overflow ); @@ -2664,10 +2693,12 @@ static void cftmdl_16fx( L_tmp = Mult_32_16( wk3r, x0r ); /*Q(15+Qx+Q_edct) */ L_tmp = Msub_32_16( L_tmp, wk3i, x0i ); /*Q(15+Qx+Q_edct) */ a[j3] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); L_tmp = Mult_32_16( wk3r, x0i ); /*Q(15+Qx+Q_edct) */ L_tmp = Madd_32_16( L_tmp, wk3i, x0r ); /*Q(15+Qx+Q_edct) */ a[j3 + 1] = round_fx_o( L_shl_o( L_tmp, 1, &Overflow ), &Overflow ); /*Q(Qx+Q_edct) */ + move16(); #else j1 = add( j, l ); j2 = add( j1, l ); @@ -2843,6 +2874,7 @@ void fft3_fx( const Word16 X[], Word16 Y[], const Word16 n ) acc = L_mac0( acc, *RZ2, t_sin[c2_ind] ); acc = L_mac0( acc, *IZ2, t_sin[s2_ind] ); *RY++ = round_fx( acc ); /* bit growth = 1 (compensated by non-fractional mode MAC). */ + move16(); acc = L_shl( *IZ0--, 15 ); acc = L_msu0( acc, *RZ1++, t_sin[s1_ind] ); @@ -2850,6 +2882,7 @@ void fft3_fx( const Word16 X[], Word16 Y[], const Word16 n ) acc = L_msu0( acc, *RZ2++, t_sin[s2_ind] ); acc = L_mac0( acc, *IZ2--, t_sin[c2_ind] ); *IY-- = round_fx( acc ); + move16(); c1_ind = add( c1_ind, c1_step ); s1_ind = add( s1_ind, s1_step ); @@ -2867,6 +2900,7 @@ void fft3_fx( const Word16 X[], Word16 Y[], const Word16 n ) acc = L_msu0( acc, *RZ2, t_sin[c2_ind] ); acc = L_mac0( acc, *IZ2, t_sin[s2_ind] ); *RY++ = round_fx( acc ); + move16(); acc = L_shl( *IZ0--, 15 ); acc = L_msu0( acc, *RZ1++, t_sin[s1_ind] ); @@ -2874,6 +2908,7 @@ void fft3_fx( const Word16 X[], Word16 Y[], const Word16 n ) acc = L_msu0( acc, *RZ2++, t_sin[s2_ind] ); acc = L_msu0( acc, *IZ2--, t_sin[c2_ind] ); *IY-- = round_fx( acc ); + move16(); c1_ind = add( c1_ind, c1_step ); s1_ind = add( s1_ind, s1_step ); @@ -2886,11 +2921,14 @@ void fft3_fx( const Word16 X[], Word16 Y[], const Word16 n ) acc = L_mac0( acc, *RZ1, t_sin[c1_ind] ); acc = L_msu0( acc, *RZ2, t_sin[c2_ind] ); *RY++ = round_fx( acc ); + move16(); acc = 0; + move32(); acc = L_msu0( acc, *RZ1--, t_sin[s1_ind] ); acc = L_msu0( acc, *RZ2--, t_sin[s2_ind] ); *IY-- = round_fx( acc ); + move16(); IZ0++; IZ1++; IZ2++; @@ -2910,6 +2948,7 @@ void fft3_fx( const Word16 X[], Word16 Y[], const Word16 n ) acc = L_msu0( acc, *RZ2, t_sin[c2_ind] ); acc = L_msu0( acc, *IZ2, t_sin[s2_ind] ); *RY++ = round_fx( acc ); + move16(); acc = L_mult0( *IZ0++, -32768 ); acc = L_msu0( acc, *RZ1--, t_sin[s1_ind] ); @@ -2917,6 +2956,7 @@ void fft3_fx( const Word16 X[], Word16 Y[], const Word16 n ) acc = L_msu0( acc, *RZ2--, t_sin[s2_ind] ); acc = L_mac0( acc, *IZ2++, t_sin[c2_ind] ); *IY-- = round_fx( acc ); + move16(); c1_ind = add( c1_ind, c1_step ); s1_ind = add( s1_ind, s1_step ); @@ -2935,6 +2975,7 @@ void fft3_fx( const Word16 X[], Word16 Y[], const Word16 n ) acc = L_msu0( acc, *RZ2, t_sin[c2_ind] ); acc = L_mac0( acc, *IZ2, t_sin[s2_ind] ); *RY++ = round_fx( acc ); + move16(); acc = L_mult0( *IZ0++, -32768 ); acc = L_msu0( acc, *RZ1--, t_sin[s1_ind] ); @@ -2942,6 +2983,7 @@ void fft3_fx( const Word16 X[], Word16 Y[], const Word16 n ) acc = L_mac0( acc, *RZ2--, t_sin[s2_ind] ); acc = L_mac0( acc, *IZ2++, t_sin[c2_ind] ); *IY-- = round_fx( acc ); + move16(); c1_ind = sub( c1_ind, c1_step ); s1_ind = sub( s1_ind, s1_step ); @@ -2954,11 +2996,13 @@ void fft3_fx( const Word16 X[], Word16 Y[], const Word16 n ) acc = L_msu0( acc, *RZ1, t_sin[c1_ind] ); acc = L_msu0( acc, *RZ2, t_sin[c2_ind] ); *RY++ = round_fx( acc ); + move16(); acc = L_deposit_l( 0 ); acc = L_msu0( acc, *RZ1++, t_sin[s1_ind] ); acc = L_mac0( acc, *RZ2++, t_sin[s2_ind] ); *IY-- = round_fx( acc ); + move16(); IZ0--; /* Just decrement the address counter */ IZ1--; IZ2--; @@ -2978,6 +3022,7 @@ void fft3_fx( const Word16 X[], Word16 Y[], const Word16 n ) acc = L_msu0( acc, *RZ2, t_sin[c2_ind] ); acc = L_msu0( acc, *IZ2, t_sin[s2_ind] ); *RY++ = round_fx( acc ); + move16(); acc = L_shl( *IZ0--, 15 ); acc = L_msu0( acc, *RZ1++, t_sin[s1_ind] ); @@ -2985,6 +3030,7 @@ void fft3_fx( const Word16 X[], Word16 Y[], const Word16 n ) acc = L_mac0( acc, *RZ2++, t_sin[s2_ind] ); acc = L_msu0( acc, *IZ2--, t_sin[c2_ind] ); *IY-- = round_fx( acc ); + move16(); c1_ind = sub( c1_ind, c1_step ); s1_ind = sub( s1_ind, s1_step ); @@ -3002,6 +3048,7 @@ void fft3_fx( const Word16 X[], Word16 Y[], const Word16 n ) acc = L_mac0( acc, *RZ2, t_sin[c2_ind] ); acc = L_msu0( acc, *IZ2, t_sin[s2_ind] ); *RY++ = round_fx( acc ); + move16(); acc = L_shl( *IZ0--, 15 ); acc = L_msu0( acc, *RZ1++, t_sin[s1_ind] ); @@ -3009,6 +3056,7 @@ void fft3_fx( const Word16 X[], Word16 Y[], const Word16 n ) acc = L_mac0( acc, *RZ2++, t_sin[s2_ind] ); acc = L_mac0( acc, *IZ2--, t_sin[c2_ind] ); *IY-- = round_fx( acc ); + move16(); c1_ind = sub( c1_ind, c1_step ); s1_ind = sub( s1_ind, s1_step ); @@ -3021,6 +3069,7 @@ void fft3_fx( const Word16 X[], Word16 Y[], const Word16 n ) acc = L_msu0( acc, *RZ1, t_sin[c1_ind] ); acc = L_mac0( acc, *RZ2, t_sin[c2_ind] ); *RY = round_fx( acc ); + move16(); return; } @@ -3151,6 +3200,7 @@ void ifft3_fx( const Word16 Z[], Word16 X[], const Word16 n ) acc = L_msu0( acc, *IZ1--, t_sin[s1_ind] ); acc = L_msu0( acc, *IZ2++, t_sin[s2_ind] ); *RY1++ = round_fx( acc ); + move16(); c0_ind = sub( c0_ind, step ); s0_ind = add( s0_ind, step ); @@ -3170,6 +3220,7 @@ void ifft3_fx( const Word16 Z[], Word16 X[], const Word16 n ) acc = L_msu0( acc, *IZ1, t_sin[s1_ind] ); acc = L_msu0( acc, *IZ2, t_sin[s2_ind] ); *RY1++ = round_fx( acc ); + move16(); acc = L_mult0( *IZ0--, t_sin[c0_ind] ); acc = L_msu0( acc, *IZ1--, t_sin[c1_ind] ); @@ -3178,6 +3229,7 @@ void ifft3_fx( const Word16 Z[], Word16 X[], const Word16 n ) acc = L_mac0( acc, *RZ1++, t_sin[s1_ind] ); acc = L_msu0( acc, *RZ2--, t_sin[s2_ind] ); *IY1-- = round_fx( acc ); + move16(); c0_ind = sub( c0_ind, step ); s0_ind = add( s0_ind, step ); @@ -3198,6 +3250,7 @@ void ifft3_fx( const Word16 Z[], Word16 X[], const Word16 n ) acc = L_msu0( acc, *IZ1, t_sin[s1_ind] ); acc = L_msu0( acc, *IZ2, t_sin[s2_ind] ); *RY1++ = round_fx( acc ); + move16(); acc = L_mult0( *IZ0--, t_sin[c0_ind] ); acc = L_msu0( acc, *IZ1--, t_sin[c1_ind] ); @@ -3206,6 +3259,7 @@ void ifft3_fx( const Word16 Z[], Word16 X[], const Word16 n ) acc = L_mac0( acc, *RZ1++, t_sin[s1_ind] ); acc = L_msu0( acc, *RZ2--, t_sin[s2_ind] ); *IY1-- = round_fx( acc ); + move16(); c0_ind = sub( c0_ind, step ); s0_ind = add( s0_ind, step ); @@ -3223,6 +3277,7 @@ void ifft3_fx( const Word16 Z[], Word16 X[], const Word16 n ) acc = L_msu0( acc, *IZ1, t_sin[s1_ind] ); acc = L_msu0( acc, *IZ2, t_sin[s2_ind] ); *RY1++ = round_fx( acc ); + move16(); /* Construction of Y2 */ c0_ind = T_SIN_PI_2; @@ -3246,6 +3301,7 @@ void ifft3_fx( const Word16 Z[], Word16 X[], const Word16 n ) acc = L_mac0( acc, *IZ1--, t_sin[s1_ind] ); acc = L_mac0( acc, *IZ2++, t_sin[s2_ind] ); *RY2++ = round_fx( acc ); + move16(); c0_ind = sub( c0_ind, step2 ); s0_ind = add( s0_ind, step2 ); @@ -3265,6 +3321,7 @@ void ifft3_fx( const Word16 Z[], Word16 X[], const Word16 n ) acc = L_mac0( acc, *IZ1, t_sin[s1_ind] ); acc = L_mac0( acc, *IZ2, t_sin[s2_ind] ); *RY2++ = round_fx( acc ); + move16(); acc = L_mult0( *IZ0--, t_sin[c0_ind] ); acc = L_msu0( acc, *IZ1--, t_sin[c1_ind] ); @@ -3273,6 +3330,7 @@ void ifft3_fx( const Word16 Z[], Word16 X[], const Word16 n ) acc = L_msu0( acc, *RZ1++, t_sin[s1_ind] ); acc = L_mac0( acc, *RZ2--, t_sin[s2_ind] ); *IY2-- = round_fx( acc ); + move16(); c0_ind = sub( c0_ind, step2 ); s0_ind = add( s0_ind, step2 ); @@ -3293,6 +3351,7 @@ void ifft3_fx( const Word16 Z[], Word16 X[], const Word16 n ) acc = L_mac0( acc, *IZ1, t_sin[s1_ind] ); acc = L_mac0( acc, *IZ2, t_sin[s2_ind] ); *RY2++ = round_fx( acc ); + move16(); acc = L_mult0( *IZ0--, t_sin[c0_ind] ); acc = L_mac0( acc, *IZ1--, t_sin[c1_ind] ); @@ -3301,6 +3360,7 @@ void ifft3_fx( const Word16 Z[], Word16 X[], const Word16 n ) acc = L_msu0( acc, *RZ1++, t_sin[s1_ind] ); acc = L_mac0( acc, *RZ2--, t_sin[s2_ind] ); *IY2-- = round_fx( acc ); + move16(); c0_ind = sub( c0_ind, step2 ); s0_ind = add( s0_ind, step2 ); @@ -3321,6 +3381,7 @@ void ifft3_fx( const Word16 Z[], Word16 X[], const Word16 n ) acc = L_mac0( acc, *IZ1, t_sin[s1_ind] ); acc = L_msu0( acc, *IZ2, t_sin[s2_ind] ); *RY2++ = round_fx( acc ); + move16(); acc = L_mult0( *IZ0--, t_sin[c0_ind] ); acc = L_mac0( acc, *IZ1--, t_sin[c1_ind] ); @@ -3329,6 +3390,7 @@ void ifft3_fx( const Word16 Z[], Word16 X[], const Word16 n ) acc = L_msu0( acc, *RZ1++, t_sin[s1_ind] ); acc = L_msu0( acc, *RZ2--, t_sin[s2_ind] ); *IY2-- = round_fx( acc ); + move16(); c0_ind = sub( c0_ind, step2 ); s0_ind = add( s0_ind, step2 ); @@ -3349,6 +3411,7 @@ void ifft3_fx( const Word16 Z[], Word16 X[], const Word16 n ) acc = L_mac0( acc, *IZ1, t_sin[s1_ind] ); acc = L_msu0( acc, *IZ2, t_sin[s2_ind] ); *RY2++ = round_fx( acc ); + move16(); acc = L_mult0( *IZ1--, t_sin[c1_ind] ); acc = L_msu0( acc, *IZ0--, t_sin[c0_ind] ); @@ -3357,6 +3420,7 @@ void ifft3_fx( const Word16 Z[], Word16 X[], const Word16 n ) acc = L_msu0( acc, *RZ1++, t_sin[s1_ind] ); acc = L_msu0( acc, *RZ2--, t_sin[s2_ind] ); *IY2-- = round_fx( acc ); + move16(); c0_ind = add( c0_ind, step2 ); s0_ind = sub( s0_ind, step2 ); @@ -3374,6 +3438,7 @@ void ifft3_fx( const Word16 Z[], Word16 X[], const Word16 n ) acc = L_mac0( acc, *IZ1, t_sin[s1_ind] ); acc = L_msu0( acc, *IZ2, t_sin[s2_ind] ); *RY2++ = round_fx( acc ); + move16(); /* Compute the inverse FFT for all 3 blocks. */ RY0 = &Y[0]; /* Rewind the pointers. */ diff --git a/lib_com/fft_rel.c b/lib_com/fft_rel.c index 0891367c6..1cf917f8f 100644 --- a/lib_com/fft_rel.c +++ b/lib_com/fft_rel.c @@ -317,6 +317,7 @@ void fft_rel_fx( Word16 *xi2, *xi3, *xi4, *xi1; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif @@ -357,7 +358,7 @@ void fft_rel_fx( move16(); x1 = &x[1]; move16(); - FOR( i = 0; i < n / 2; i++ ) + FOR( i = 0; i < shr( n, 1 ); i++ ) { xt = *x0; move16(); @@ -400,7 +401,7 @@ void fft_rel_fx( n2 = shl( n4, 1 ); n1 = shl( n2, 1 ); - step = N_MAX_SAS / n1; + step = idiv1616( N_MAX_SAS, n1 ); x0 = x; x1 = x + n2; @@ -679,6 +680,8 @@ void fft_rel_fx32( Word32 *x2even, *x2odd; Word32 temp[512]; + test(); + test(); IF( EQ_16( n, 128 ) || EQ_16( n, 256 ) || EQ_16( n, 512 ) ) { idx = fft256_read_indexes; @@ -690,10 +693,14 @@ void fft_rel_fx32( FOR( i = 0; i < 64; i++ ) { j = *idx++; + move16(); k = *idx++; + move16(); *x2++ = L_add( x[shr( j, 1 )], x[shr( k, 1 )] ); + move16(); *x2++ = L_sub( x[shr( j, 1 )], x[shr( k, 1 )] ); + move16(); } } ELSE IF( EQ_16( n, 256 ) ) @@ -702,10 +709,14 @@ void fft_rel_fx32( FOR( i = 0; i < 128; i++ ) { j = *idx++; + move16(); k = *idx++; + move16(); *x2++ = L_add( x[j], x[k] ); + move16(); *x2++ = L_sub( x[j], x[k] ); + move16(); } } ELSE IF( EQ_16( n, 512 ) ) @@ -721,11 +732,15 @@ void fft_rel_fx32( idx++; *x2even++ = L_add( x[j], x[k] ); + move16(); *x2even++ = L_sub( x[j], x[k] ); - j++; - k++; + move16(); + j = add( j, 1 ); + k = add( k, 1 ); *x2odd++ = L_add( x[j], x[k] ); + move16(); *x2odd++ = L_sub( x[j], x[k] ); + move16(); } } @@ -746,11 +761,15 @@ void fft_rel_fx32( FOR( i = 0; i < n; i += 4 ) { *x2++ = L_add( *x0++, *x1 ); /* x[i] = xt + x[i+n2]; */ + move16(); *x2++ = *x0; + move16(); x0--; *x2++ = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; */ + move16(); x1++; *x2++ = L_negate( *x1 ); /* x[i+n2+n4] = -x[i+n2+n4]; */ + move16(); x0 += 4; x1 += 3; /* x1 has already advanced */ @@ -764,23 +783,27 @@ void fft_rel_fx32( *-----------------------------------------------------------------*/ j = 0; + move16(); x0 = &x[0]; - FOR( i = 0; i < n - 1; i++ ) + FOR( i = 0; i < sub( n, 1 ); i++ ) { IF( LT_16( i, j ) ) { xt = x[j]; + move32(); x[j] = *x0; + move32(); *x0 = xt; + move32(); } x0++; - k = n / 2; + k = shr( n, 1 ); WHILE( LE_16( k, j ) ) { - j -= k; + j = sub( j, k ); k = shr( k, 1 ); } - j += k; + j = add( j, k ); } /*-----------------------------------------------------------------* @@ -789,10 +812,12 @@ void fft_rel_fx32( x0 = &x[0]; x1 = &x[1]; - FOR( i = 0; i < n / 2; i++ ) + FOR( i = 0; i < shr( n, 1 ); i++ ) { *x1 = L_sub( *x0, *x1 ); + move32(); *x0 = L_sub( L_shl( *x0, 1 ), *x1 ); + move32(); x0++; x0++; @@ -813,9 +838,12 @@ void fft_rel_fx32( FOR( i = 0; i < n; i += 4 ) { - *x1 = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; */ + *x1 = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; */ + move32(); *x0 = L_sub( L_shl( *x0, 1 ), *x1++ ); /* x[i] = xt + x[i+n2]; */ - *x1 = L_negate( *x1 ); /* x[i+n2+n4] = -x[i+n2+n4]; */ + move32(); + *x1 = L_negate( *x1 ); /* x[i+n2+n4] = -x[i+n2+n4]; */ + move32(); x0 += 4; x1 += 3; /* x1 has already advanced */ @@ -835,10 +863,14 @@ void fft_rel_fx32( *-----------------------------------------------------------------*/ n4 = 1; + move16(); n2 = 2; + move16(); n1 = 4; + move16(); step = N_MAX_DIV4; + move16(); FOR( k = 3; k <= m; k++ ) { @@ -853,9 +885,12 @@ void fft_rel_fx32( FOR( i = 0; i < n; i += n1 ) { - *x1 = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; */ + *x1 = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; */ + move32(); *x0 = L_sub( L_shl( *x0, 1 ), *x1 ); /* x[i] = xt + x[i+n2]; */ - *x2 = L_negate( *x2 ); /* x[i+n2+n4] = -x[i+n2+n4]; */ + move32(); + *x2 = L_negate( *x2 ); /* x[i+n2+n4] = -x[i+n2+n4]; */ + move32(); s = sincos_t_ext_fx; c = s + N_MAX_FFT / 4; /* 1024/4 = 256, 256/4=64 */ @@ -878,9 +913,13 @@ void fft_rel_fx32( t2 = L_sub( Mpy_32_16_1( *xi3, *s ), Mpy_32_16_1( *xi4, *c ) ); /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); */ *xi4 = L_sub( *xi2, t2 ); + move32(); *xi2 = L_sub( *xi1, t1 ); + move32(); *xi1 = L_sub( L_shl( *xi1, 1 ), *xi2 ); + move32(); *xi3 = L_negate( L_add( L_shl( t2, 1 ), *xi4 ) ); + move32(); } x1 += n1; diff --git a/lib_com/fft_rel_fx.c b/lib_com/fft_rel_fx.c index 405c500b5..846099592 100644 --- a/lib_com/fft_rel_fx.c +++ b/lib_com/fft_rel_fx.c @@ -85,6 +85,7 @@ static void c_fft_fx( const Word16 *table_ptr; const Word16 *input_ptr1, *input_ptr2, *input_ptr3, *input_ptr4; Word16 shift = 0; + move16(); /* Setup Reorder Variables */ table_ptr = NULL; table_ptr = FFT_REORDER_1024; @@ -92,18 +93,23 @@ static void c_fft_fx( { case 1024: shift = 0; + move16(); BREAK; case 512: shift = 1; + move16(); BREAK; case 256: shift = 2; + move16(); BREAK; case 128: shift = 3; + move16(); BREAK; case 64: shift = 4; + move16(); BREAK; } /* The FFT part */ diff --git a/lib_com/gs_bitallocation_fx.c b/lib_com/gs_bitallocation_fx.c index b3da54d2a..112d94e51 100644 --- a/lib_com/gs_bitallocation_fx.c +++ b/lib_com/gs_bitallocation_fx.c @@ -579,7 +579,7 @@ void bands_and_bit_alloc_fx( #endif test(); - if ( EQ_16( bwidth, NB ) && GT_16( nb_bands_max, 10 ) ) + if ( ( bwidth == NB ) && GT_16( nb_bands_max, 10 ) ) { nb_bands_max = 10; move16(); @@ -588,8 +588,10 @@ void bands_and_bit_alloc_fx( /*------------------------------------------------------------------------ * Find extra number of band to code according to bit rate availables *-----------------------------------------------------------------------*/ + test(); WHILE( GE_16( bit_tmp, bit_new_bands ) && LE_16( nb_bands, sub( nb_bands_max, 1 ) ) ) { + test(); bit_tmp = sub( bit_tmp, bit_new_bands ); nb_bands = add( nb_bands, 1 ); } diff --git a/lib_com/gs_bitallocation_ivas_fx.c b/lib_com/gs_bitallocation_ivas_fx.c index 107236eb6..0e7426120 100644 --- a/lib_com/gs_bitallocation_ivas_fx.c +++ b/lib_com/gs_bitallocation_ivas_fx.c @@ -121,7 +121,7 @@ void bands_and_bit_alloc_ivas_fx( #endif nb_tot_bands = MBANDS_GN; move16(); - IF( EQ_16( L_frame, L_FRAME16k ) ) + if ( EQ_16( L_frame, L_FRAME16k ) ) { nb_tot_bands = MBANDS_GN_BITALLOC16k; move16(); @@ -137,6 +137,7 @@ void bands_and_bit_alloc_ivas_fx( #else /* BASOP_NOGLOB */ ener_vec[0] = add( Ener_per_bd_iQ[0], Ener_per_bd_iQ[1] ); /*Q12 */ #endif + move16(); Copy( Ener_per_bd_iQ_tmp + 1, ener_vec, MBANDS_GN - 1 ); /*Q12 */ ener_vec[MBANDS_GN - 1] = ener_vec[MBANDS_GN - 2]; move16(); @@ -162,7 +163,8 @@ void bands_and_bit_alloc_ivas_fx( bit_new_bands = 5; move16(); #if 1 // def ADD_LRTD - IF( GT_32( core_brate, ACELP_16k40 ) && EQ_16( L_frame, L_FRAME16k ) ) + test(); + if ( GT_32( core_brate, ACELP_16k40 ) && EQ_16( L_frame, L_FRAME16k ) ) { bit_new_bands = 7; move16(); @@ -185,8 +187,11 @@ void bands_and_bit_alloc_ivas_fx( i = add( i, 1 ); } - IF( GT_16( element_mode, EVS_MONO ) && EQ_16( coder_type, AUDIO ) && - LE_32( core_brate, STEREO_GSC_BIT_RATE_ALLOC ) && EQ_32( brate_intermed_tbl[i], ACELP_9k60 ) ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */ + test(); + test(); + test(); + if ( ( element_mode > EVS_MONO ) && EQ_16( coder_type, AUDIO ) && + LE_32( core_brate, STEREO_GSC_BIT_RATE_ALLOC ) && EQ_32( brate_intermed_tbl[i], ACELP_9k60 ) ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */ { i = sub( i, 1 ); } @@ -200,7 +205,7 @@ void bands_and_bit_alloc_ivas_fx( test(); test(); - IF( ( EQ_16( coder_type, AUDIO ) || EQ_16( coder_type, INACTIVE ) ) && EQ_16( bwidth, NB ) ) + IF( ( EQ_16( coder_type, AUDIO ) || ( coder_type == INACTIVE ) ) && ( bwidth == NB ) ) { IF( GE_32( core_brate, ACELP_9k60 ) ) { @@ -231,14 +236,17 @@ void bands_and_bit_alloc_ivas_fx( } #if 1 // def ADD_LRTD - IF( L_frame == L_FRAME16k ) + IF( EQ_16( L_frame, L_FRAME16k ) ) { - *bit -= 8; + *bit = sub( *bit, 8 ); + move16(); } - IF( coder_type == INACTIVE && core_brate <= GSC_LRES_GAINQ_LIMIT ) /* can happen only for 2nd channel inactive */ + test(); + IF( coder_type == INACTIVE && LE_32( core_brate, GSC_LRES_GAINQ_LIMIT ) ) /* can happen only for 2nd channel inactive */ { - *bit += GSC_LRES_NB_NITS; + *bit = add( *bit, GSC_LRES_NB_NITS ); + move16(); } IF( *bit > 0 ) @@ -247,7 +255,9 @@ void bands_and_bit_alloc_ivas_fx( { #ifndef FIX_802_1137_1137_GSC_IVAS_FXFLT_DECODING SWB_bit_budget = *bit; // Q0 + move16(); st_band = 5; + move16(); set_l( bits_per_bands, 0, MBANDS_GN_BITALLOC16k ); @@ -262,45 +272,48 @@ void bands_and_bit_alloc_ivas_fx( 2 = GSC bit alloc for tc frame 3 = more music like (should not happen often given music is coded with dft) */ - IF( GSC_IVAS_mode <= 3 ) + if ( LE_16( GSC_IVAS_mode, 3 ) ) { - nb_bands_max -= 6; + nb_bands_max = sub( nb_bands_max, 6 ); } - IF( GSC_IVAS_mode == 2 ) + IF( EQ_16( GSC_IVAS_mode, 2 ) ) { // bit_fracf += 0.1f; bit_fracf = L_add( bit_fracf, 26214 ); // Q18 - nb_bands_max--; + nb_bands_max = sub( nb_bands_max, 1 ); } - IF( GSC_IVAS_mode == 3 ) + IF( EQ_16( GSC_IVAS_mode, 3 ) ) { // bit_fracf -= 0.1f; bit_fracf = L_sub( bit_fracf, 26214 ); // Q18 - nb_bands_max += 3; + nb_bands_max = add( nb_bands_max, 3 ); } /* First find how much we want to share between LF and HF, at low bitrate, a miminum of bits is needed in LF by limitating the number of bands*/ /* Adjust the number of band based on the content type and bitrate */ // nb_bands_adj = 1.0f; nb_bands_adj = ONE_IN_Q18; - IF( GSC_IVAS_mode == 1 && core_brate < GSC_L_RATE_STG ) + move32(); + test(); + test(); + IF( EQ_16( GSC_IVAS_mode, 1 ) && LT_32( core_brate, GSC_L_RATE_STG ) ) { // nb_bands_adj = 0.0125f * SWB_bit_budget - 0.75f; nb_bands_adj = L_sub( Mpy_32_32( 26843546, L_shl( SWB_bit_budget, Q18 ) ), 196608 ); // Q18 } - ELSE IF( GSC_IVAS_mode != 2 && core_brate > GSC_H_RATE_STG ) + ELSE IF( NE_16( GSC_IVAS_mode, 2 ) && GT_32( core_brate, GSC_H_RATE_STG ) ) { // nb_bands_adj = 0.02f * SWB_bit_budget - 1.2f; nb_bands_adj = L_sub( Mpy_32_32( 42949673, L_shl( SWB_bit_budget, Q18 ) ), 314572 ); // Q18 } // nb_bands_max = (int16_t)(nb_bands_max * nb_bands_adj + 0.5f); - nb_bands_max = (Word16) L_shr_r( nb_bands_max * nb_bands_adj, Q18 ); // Q0 + nb_bands_max = extract_l( L_shr_r( nb_bands_max * nb_bands_adj, Q18 ) ); // Q0 nb_bands_max = check_bounds_s( nb_bands_max, 5, nb_tot_bands ); // bit_fracf *= SWB_bit_budget; - bit_fracf = bit_fracf * SWB_bit_budget; // Q18 + bit_fracf = imult3216( bit_fracf, extract_l( SWB_bit_budget ) ); // Q18 /* Estimation of the number of bit used in HF */ /* with only the first weigthing The number of bits in max_ener_band[st_band-1] = 17% of bit_fracf */ @@ -308,43 +321,52 @@ void bands_and_bit_alloc_ivas_fx( mb = Mpy_32_32( 365072220, bit_fracf ); // Q18 // mp = 2 * DSR_NB_PULSE); mp = 2359296; // Q18 - IF( core_brate < GSC_L_RATE_STG && GSC_IVAS_mode == 3 ) + move32(); + test(); + IF( LT_32( core_brate, GSC_L_RATE_STG ) && EQ_16( GSC_IVAS_mode, 3 ) ) { // mp = 1.5f * DSR_NB_PULSE; mp = 1769472; // Q18 + move32(); } - ELSE IF( core_brate < GSC_L_RATE_STG ) + ELSE IF( LT_32( core_brate, GSC_L_RATE_STG ) ) { // mp = DSR_NB_PULSE; mp = DSR_NB_PULSE_Q18; + move32(); } /* We want max_ener_band[st_band] <= max_ener_band[st_band-1] and max_ener_band[nb_bands_max-1] <= max_ener_band[st_band]*/ /* We will estimate the number of bits to allocate of HF and put the remaining bits, if any, back on LF */ /* compute the total possible number of band to be coded */ // nb_tot_bands = (int16_t)((SWB_bit_budget - bit_fracf) / (mp + (mb - mp) / 2.0f)); - nb_tot_bands = (Word16) ( L_sub( L_shl( SWB_bit_budget, Q18 ), bit_fracf ) / L_add( mp, L_shr( L_sub( mb, mp ), 1 ) ) ); - mp = min( mp, mb ); - IF( nb_tot_bands + st_band > nb_bands_max ) + nb_tot_bands = extract_l( L_sub( L_shl( SWB_bit_budget, Q18 ), bit_fracf ) / L_add( mp, L_shr( L_sub( mb, mp ), 1 ) ) ); + mp = L_min( mp, mb ); + IF( GT_16( add( nb_tot_bands, st_band ), nb_bands_max ) ) { - bit_adj = ( ( mb + mp ) / 2 ) * ( nb_tot_bands + st_band - nb_bands_max ); - bit_adj = max( 0, bit_adj ); - nb_tot_bands = nb_bands_max - st_band; + bit_adj = imult3216( L_shr( L_add( mb, mp ), 1 ), sub( add( nb_tot_bands, st_band ), nb_bands_max ) ); + bit_adj = L_max( 0, bit_adj ); + nb_tot_bands = sub( nb_bands_max, st_band ); // bit_fracf += bit_adj; bit_fracf = L_add( bit_fracf, bit_adj ); // Q18 } - nb_tot_bands += st_band; + nb_tot_bands = add( nb_tot_bands, st_band ); /* Allocate bits to LF */ // etmp = 0.23f; Word32 etmp_32fx = 493921239; // Q15 + move32(); FOR( j = 0; j < st_band; j++ ) { i = j; + move16(); max_ener_band[j] = i; + move16(); ener_vec[i] = MIN16B; + move16(); // bits_per_bands[j] = etmp * bit_fracf; bits_per_bands[j] = Mpy_32_32( bit_fracf, etmp_32fx ); // 33 - 15 = Q18 + move32(); // etmp -= 0.015f; etmp_32fx = L_sub( etmp_32fx, 32212255 ); } @@ -356,44 +378,51 @@ void bands_and_bit_alloc_ivas_fx( set_s( nb_pulse_per_band, 2, MBANDS_GN_BITALLOC16k ); FOR( i = st_band + 2; i < nb_tot_bands - 1; i++ ) { - IF( ener_vec[i] < ener_vec[i - 1] && ener_vec[i] < ener_vec[i + 1] ) + test(); + if ( LT_16( ener_vec[i], ener_vec[i - 1] ) && LT_16( ener_vec[i], ener_vec[i + 1] ) ) { nb_pulse_per_band[i] = 1; + move16(); } } FOR( j = st_band; j < nb_tot_bands; j++ ) { - IF( j > 6 ) + IF( GT_16( j, 6 ) ) { i = maximum_fx( ener_vec, nb_tot_bands, &etmp ); } ELSE { i = j; + move16(); } max_ener_band[j] = i; + move16(); ener_vec[i] = MIN16B; + move16(); } /* Recompute the final bit distribution for HF */ - IF( nb_tot_bands > st_band ) + IF( GT_16( nb_tot_bands, st_band ) ) { // bit_fracf = DSR_NB_PULSE; - mb = ( SWB_bit_budget * 2 / ( nb_tot_bands - st_band ) ) - mp; // Q18 - bit_fracf = ( mb - mp ) / ( nb_tot_bands - st_band ); + mb = ( L_shl( SWB_bit_budget, 1 ) / sub( nb_tot_bands, st_band ) ) - mp; // Q18 + bit_fracf = L_sub( mb, mp ) / sub( nb_tot_bands, st_band ); mb = L_sub( mb, bit_fracf ); /* Do the distribution */ FOR( j = st_band; j < nb_tot_bands; j++ ) { - IF( nb_pulse_per_band[max_ener_band[j]] > 1 ) + IF( GT_16( nb_pulse_per_band[max_ener_band[j]], 1 ) ) { bits_per_bands[max_ener_band[j]] = mb; + move32(); } ELSE { // bits_per_bands[max_ener_band[j]] = 4.5f; bits_per_bands[max_ener_band[j]] = 1179648; + move32(); } mb = L_sub( mb, bit_fracf ); SWB_bit_budget = L_sub( SWB_bit_budget, bits_per_bands[max_ener_band[j]] ); // Q18 @@ -403,52 +432,56 @@ void bands_and_bit_alloc_ivas_fx( /* Series of verification in case bit allocated != the budget */ IF( SWB_bit_budget > 0 ) { - i = st_band - 1; + i = sub( st_band, 1 ); WHILE( SWB_bit_budget > 0 ) { // bits_per_bands[i]++; bits_per_bands[i] = L_add( bits_per_bands[i], 262144 ); // SWB_bit_budget--; SWB_bit_budget = L_sub( SWB_bit_budget, 262144 ); - i--; - IF( i == -1 ) + i = sub( i, 1 ); + IF( EQ_16( i, -1 ) ) { - i = st_band - 1; + i = sub( st_band, 1 ); } } } nb_bands = nb_tot_bands; + move16(); sum_bit = 0; + move32(); j = 0; + move16(); FOR( i = 0; i < nb_bands; i++ ) { // if (bits_per_bands[i] > 112) - IF( bits_per_bands[i] > 29360128 ) + IF( GT_32( bits_per_bands[i], 29360128 ) ) { - sum_bit += bits_per_bands[i] - 112; + sum_bit = L_add( sum_bit, L_sub( bits_per_bands[i], 112 ) ); sum_bit = L_add( sum_bit, L_sub( bits_per_bands[i], 29360128 ) ); // bits_per_bands[i] = 112; bits_per_bands[i] = 29360128; - j = i + 1; + move32(); + j = add( i, 1 ); } /* safety check for overage bit reallocation */ // else if (bits_per_bands[i] + sum_bit / 3 > 112) - ELSE IF( bits_per_bands[i] + sum_bit / 3 > 29360128 ) + ELSE IF( GT_32( L_add( bits_per_bands[i], divide3216( L_shl( sum_bit, 1 ), 3 ) ), 29360128 ) ) { - j = i + 1; + j = add( i, 1 ); } } IF( sum_bit != 0 ) { // sum_bit /= (nb_bands - j); - sum_bit = sum_bit / ( nb_bands - j ); + sum_bit = divide3216( L_shl( sum_bit, 1 ), sub( nb_bands, j ) ); FOR( i = j; i < nb_bands; i++ ) { - bits_per_bands[i] += sum_bit; + bits_per_bands[i] = L_add( bits_per_bands[i], sum_bit ); } } #else @@ -461,7 +494,7 @@ void bands_and_bit_alloc_ivas_fx( IF( EQ_16( GSC_noisy_speech, 1 ) ) { SWB_bit_budget = *bit; - move16(); + move32(); nb_bands = 5; move16(); @@ -469,22 +502,30 @@ void bands_and_bit_alloc_ivas_fx( // fzero_val = 0.0f; fzero_val = 0; - IF( element_mode > EVS_MONO ) + move16(); + + if ( element_mode > EVS_MONO ) { fzero_val = MIN16B; + move16(); } - IF( coder_type == UNVOICED && element_mode > EVS_MONO ) + test(); + IF( EQ_16( coder_type, UNVOICED ) && element_mode > EVS_MONO ) { nb_bands = 3; - IF( SWB_bit_budget > 20 ) + move16(); + + if ( GT_32( SWB_bit_budget, 20 ) ) { nb_bands = 5; + move16(); } } - ELSE IF( bwidth < SWB ) + ELSE IF( LT_16( bwidth, SWB ) ) { nb_bands = 7; + move16(); } #endif @@ -513,11 +554,13 @@ void bands_and_bit_alloc_ivas_fx( move16(); } #if 1 // def ADD_LRTD - IF( bwidth < SWB ) + IF( LT_16( bwidth, SWB ) ) { - IF( coder_type == UNVOICED && element_mode > EVS_MONO ) + test(); + if ( EQ_16( coder_type, UNVOICED ) && element_mode > EVS_MONO ) { nb_tot_bands = 5; + move16(); } #endif FOR( ; j < nb_bands; j++ ) @@ -537,7 +580,9 @@ void bands_and_bit_alloc_ivas_fx( { i = maximum_fx( ener_vec, nb_tot_bands, &etmp ); max_ener_band[j] = i; + move16(); ener_vec[i] = fzero_val; + move16(); } } #endif @@ -545,24 +590,28 @@ void bands_and_bit_alloc_ivas_fx( } ELSE { - bit_index++; + bit_index = add( bit_index, 1 ); bit_tmp = sub( *bit, GSC_freq_bits[bit_index] ); - bit_index++; + bit_index = add( bit_index, 1 ); nb_bands_max = add( nb_bands_max, GSC_freq_bits[bit_index] ); - bit_index++; + bit_index = add( bit_index, 1 ); *pvq_len = 112; move16(); st_band = 7; move16(); #if 1 // def ADD_LRTD - IF( L_frame == L_FRAME16k && core_brate > ACELP_16k40 ) + test(); + IF( EQ_16( L_frame, L_FRAME16k ) && GT_32( core_brate, ACELP_16k40 ) ) { *pvq_len = 160; + move16(); st_band = 10; - nb_bands = *pvq_len / 16; - bit_tmp -= 35; + move16(); + nb_bands = shr( *pvq_len, 4 ); + bit_tmp = sub( bit_tmp, 35 ); bit_new_bands = 5; + move16(); } #endif IF( LE_32( core_brate, ACELP_9k60 ) ) @@ -587,7 +636,7 @@ void bands_and_bit_alloc_ivas_fx( nb_bands = shr( *pvq_len, 4 ); #if 1 // def ADD_LRTD - nb_bands_max = min( nb_bands_max, MBANDS_GN_BITALLOC16k ); + nb_bands_max = s_min( nb_bands_max, MBANDS_GN_BITALLOC16k ); #endif /*------------------------------------------------------------------------ * Ajustement of the maximum number of bands in function of the @@ -597,17 +646,17 @@ void bands_and_bit_alloc_ivas_fx( test(); test(); test(); - IF( EQ_16( coder_type, INACTIVE ) || GE_16( noise_lev, NOISE_LEVEL_SP3 ) ) + IF( coder_type == INACTIVE || GE_16( noise_lev, NOISE_LEVEL_SP3 ) ) { /* Probably classification error -> concentrate bits on LF */ #if 1 // def ADD_LRTD - IF( L_frame == L_FRAME16k && core_brate >= ACELP_24k40 ) + IF( EQ_16( L_frame, L_FRAME16k ) && GE_32( core_brate, ACELP_24k40 ) ) { - nb_bands_max = nb_tot_bands - 2; + nb_bands_max = sub( nb_tot_bands, 2 ); } - ELSE IF( core_brate >= ACELP_16k40 ) + ELSE IF( GE_32( core_brate, ACELP_16k40 ) ) { - nb_bands_max = nb_bands + 2; + nb_bands_max = add( nb_bands, 2 ); } ELSE #endif @@ -631,29 +680,30 @@ void bands_and_bit_alloc_ivas_fx( nb_bands_max = sub( nb_bands_max, 1 ); } #if 1 // def ADD_LRTD - IF( L_frame == L_FRAME16k ) + IF( EQ_16( L_frame, L_FRAME16k ) ) { - IF( core_brate < ACELP_24k40 ) + IF( LT_32( core_brate, ACELP_24k40 ) ) { - nb_bands_max -= 4; + nb_bands_max = sub( nb_bands_max, 4 ); } - ELSE IF( core_brate < ACELP_32k ) + ELSE IF( LT_32( core_brate, ACELP_32k ) ) { - IF( Diff_len > 0 || noise_lev >= NOISE_LEVEL_SP2 ) + test(); + IF( GT_16( Diff_len, 0 ) || GE_16( noise_lev, NOISE_LEVEL_SP2 ) ) { - nb_bands_max -= 2; - bit_new_bands *= 2; + nb_bands_max = sub( nb_bands_max, 2 ); + bit_new_bands = shl( bit_new_bands, 1 ); } } ELSE IF( core_brate >= ACELP_32k ) { - bit_new_bands *= 2; + bit_new_bands = shl( bit_new_bands, 1 ); } } #endif test(); - IF( EQ_16( bwidth, NB ) && GT_16( nb_bands_max, 10 ) ) + if ( ( bwidth == NB ) && GT_16( nb_bands_max, 10 ) ) { nb_bands_max = 10; move16(); @@ -662,8 +712,10 @@ void bands_and_bit_alloc_ivas_fx( /*------------------------------------------------------------------------ * Find extra number of band to code according to bit rate availables *-----------------------------------------------------------------------*/ + test(); WHILE( GE_16( bit_tmp, bit_new_bands ) && LE_16( nb_bands, sub( nb_bands_max, 1 ) ) ) { + test(); bit_tmp = sub( bit_tmp, bit_new_bands ); nb_bands = add( nb_bands, 1 ); } @@ -672,9 +724,11 @@ void bands_and_bit_alloc_ivas_fx( * Fractional bits to distribute on the first x bands *-----------------------------------------------------------------------*/ #if 1 // def ADD_LRTD - IF( L_frame == L_FRAME16k && core_brate > ACELP_32k ) + test(); + IF( EQ_16( L_frame, L_FRAME16k ) && GT_32( core_brate, ACELP_32k ) ) { bit_fracf = 0; + move32(); } ELSE #endif @@ -703,20 +757,22 @@ void bands_and_bit_alloc_ivas_fx( bit_index = add( bit_index, 1 ); } #if 1 // def ADD_LRTD - IF( L_frame == L_FRAME16k && core_brate > ACELP_16k40 ) + IF( EQ_16( L_frame, L_FRAME16k ) && GT_32( core_brate, ACELP_16k40 ) ) { bit_index = 0; - i = imax - 1; + move16(); + i = sub( imax, 1 ); // bits_per_bands[i] += Compl_GSC_freq_bits[bit_index]; bits_per_bands[i] = L_add( bits_per_bands[i], L_shl( Compl_GSC_freq_bits[bit_index], Q18 ) ); - i++; - bit_index++; + i = add( i, 1 ); + bit_index = add( bit_index, 1 ); FOR( ; i < 10; i++ ) { // bits_per_bands[i] += Compl_GSC_freq_bits[bit_index] + bit_fracf; bits_per_bands[i] = L_add( bits_per_bands[i], L_add( L_shl( Compl_GSC_freq_bits[bit_index], Q18 ), bit_fracf ) ); - bit_index++; + move32(); + bit_index = add( bit_index, 1 ); } } #endif @@ -735,7 +791,8 @@ void bands_and_bit_alloc_ivas_fx( { FOR( j = 0; j < nb_tot_bands; j++ ) { - bits_per_bands[j] = max( bits_per_bands[j], 0 ); + bits_per_bands[j] = L_max( bits_per_bands[j], 0 ); + move32(); } } @@ -744,26 +801,28 @@ void bands_and_bit_alloc_ivas_fx( * Complete the bit allocation per frequency band for 16kHz high brate mode *--------------------------------------------------------------------------*/ #if 1 // def ADD_LRTD - IF( L_frame == L_FRAME16k && core_brate > ACELP_32k ) + IF( EQ_16( L_frame, L_FRAME16k ) && GT_32( core_brate, ACELP_32k ) ) { FOR( j = st_band; j < nb_bands; j++ ) { // bits_per_bands[j] = bit_new_bands; bits_per_bands[j] = L_shl( bit_new_bands, Q18 ); + move32(); } // bit_fracf = (1.0f / nb_bands) * (bit_tmp); - bit_fracf = ( 262144 / nb_bands ) * ( bit_tmp ); + bit_fracf = L_shl( L_mult0( idiv1616( 16384, nb_bands ), bit_tmp ), 4 ); // etmp = 2.0f * bit_fracf / (nb_bands + 1); - etmp = (Word16) L_shr( L_shl( bit_fracf, Q1 ) / ( nb_bands + 1 ), Q3 ); // Q15 + etmp = divide3216( L_shr( bit_fracf, Q2 ), add( nb_bands, 1 ) ); // Q15 // bit_fracf = etmp; bit_fracf = L_shl( etmp, Q3 ); // Q18 - FOR( j = nb_bands - 1; j >= 0; j-- ) + FOR( j = sub( nb_bands, 1 ); j >= 0; j-- ) { // bits_per_bands[j] = etmp; // etmp += bit_fracf; bits_per_bands[j] = L_add( bits_per_bands[j], L_shl( etmp, Q3 ) ); // Q18 + move32(); etmp = (Word16) L_add( etmp, L_shr( bit_fracf, Q3 ) ); } } @@ -927,15 +986,17 @@ void bands_and_bit_alloc_ivas_fx( { // bits_per_bands[i] = (float)floor(bits_per_bands[i]); bits_per_bands[i] = L_shl( L_shr( bits_per_bands[i], Q18 ), Q18 ); + move32(); sum_bit = L_add( sum_bit, L_shr( bits_per_bands[i], Q18 ) ); } - IF( GSC_IVAS_mode != 0 && sum_bit < *bit ) /* If we need to add bits, we are doing it on the LF */ + test(); + IF( GSC_IVAS_mode != 0 && LT_32( sum_bit, *bit ) ) /* If we need to add bits, we are doing it on the LF */ { - reajust_bits_fx( bits_per_bands, 0, nb_bands, (int16_t) sum_bit, *bit ); + reajust_bits_fx( bits_per_bands, 0, nb_bands, (Word16) sum_bit, *bit ); } ELSE { - reajust_bits_fx( bits_per_bands, nb_bands - 1, 0, (int16_t) sum_bit, *bit ); + reajust_bits_fx( bits_per_bands, sub( nb_bands, 1 ), 0, (Word16) sum_bit, *bit ); } w_sum_bit = 0; move16(); @@ -986,7 +1047,9 @@ void bands_and_bit_alloc_ivas_fx( { set_s( out_bits_per_bands, 0, nb_tot_bands ); *nb_subbands = 0; + move16(); *pvq_len = 0; + move16(); } #endif return; @@ -1019,19 +1082,19 @@ static void reajust_bits_fx( IF( LT_16( bit_bdgt_in, sum_bit_in ) ) { amount_to_add = -1; - bit_bdgt = sum_bit_in; - sum_bit = bit_bdgt_in; move16(); + bit_bdgt = sum_bit_in; move16(); + sum_bit = bit_bdgt_in; move16(); } ELSE { bit_bdgt = bit_bdgt_in; - sum_bit = sum_bit_in; - amount_to_add = 1; move16(); + sum_bit = sum_bit_in; move16(); + amount_to_add = 1; move16(); } @@ -1051,7 +1114,7 @@ static void reajust_bits_fx( } i = add( i, incr ); - IF( EQ_16( i, end_band ) ) + if ( EQ_16( i, end_band ) ) { i = st_band; move16(); diff --git a/lib_com/gs_gains_fx.c b/lib_com/gs_gains_fx.c index e81af00c8..048099e25 100644 --- a/lib_com/gs_gains_fx.c +++ b/lib_com/gs_gains_fx.c @@ -111,6 +111,7 @@ void Comp_and_apply_gain_fx( L32 = L_shl( L_mult( exc_diffQ[i], y_gain ), tmp_exp ); /*Q_exc+16 */ exc_diffQ[i] = round_fx( L32 ); /*Q_exc */ #endif /* BASOP_NOGLOB */ + move16(); } } ELSE @@ -223,7 +224,7 @@ void Ener_per_band_comp_fx( IF( EQ_16( Eflag, 1 ) ) { - y_gain4_fx[j + 1] = Comp_band_log_ener( pt_fx, 32, Q_exc, -1 ); + y_gain4_fx[add( j, 1 )] = Comp_band_log_ener( pt_fx, 32, Q_exc, -1 ); move16(); pt_fx += 32; } @@ -237,7 +238,7 @@ void Ener_per_band_comp_ivas_fx( const Word16 Q_exc, /* i : frame length */ const Word16 Mband, /* i : Max band */ const Word16 Eflag, /* i : flag of highest band */ - const int16_t L_frame /* i : frame length */ + const Word16 L_frame /* i : frame length */ ) { const Word16 *pt_fx; @@ -260,12 +261,12 @@ void Ener_per_band_comp_ivas_fx( IF( EQ_16( Eflag, 1 ) ) { - y_gain4_fx[j + 1] = Comp_band_log_ener( pt_fx, 32, Q_exc, -1 ); + y_gain4_fx[add( j, 1 )] = Comp_band_log_ener( pt_fx, 32, Q_exc, -1 ); move16(); pt_fx += 32; } - if ( L_frame == L_FRAME16k ) + IF( EQ_16( L_frame, L_FRAME16k ) ) { y_gain4_fx[j + 2] = Comp_band_log_ener( pt_fx, 32, Q_exc, -1 ); move16(); @@ -296,7 +297,7 @@ static void GSC_gain_adj( /* Gain adjustment to fit ACELP generic inactive coding gain at low rate */ Word16 Gain_off, i; - IF( NE_16( coder_type, INACTIVE ) ) + IF( coder_type != INACTIVE ) { FOR( i = 0; i < MBANDS_GN; i++ ) { @@ -369,6 +370,7 @@ static void GSC_gain_adj_ivas_fx( /* Gain adjustment to fit ACELP generic inactive coding gain at low rate */ Word16 Gain_off, i; + test(); IF( NE_16( coder_type, INACTIVE ) && NE_16( coder_type, UNVOICED ) ) { FOR( i = 0; i < Mbands_gn; i++ ) @@ -383,6 +385,8 @@ static void GSC_gain_adj_ivas_fx( { Gain_off = 0; move16(); + + test(); IF( LE_32( core_brate, ACELP_5k00 ) && EQ_16( coder_type, UNVOICED ) ) { Gain_off = 18432; @@ -467,27 +471,27 @@ Word16 gsc_gaindec_fx( /* o : average frequency gai test(); IF( ( EQ_16( coder_type, AUDIO ) || EQ_16( coder_type, INACTIVE ) ) && EQ_16( bwidth_fx, NB ) ) { - idx_g_fx = (Word16) get_next_indice( st_fx, 6 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 6 ); VDQ_vec_fx( &mean_4g_fx, Gain_meanNB_fx, Gain_mean_dicNB_fx, idx_g_fx, 1 ); - idx_g_fx = (Word16) get_next_indice( st_fx, 6 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 6 ); move16(); VDQ_vec_fx( y_gainQ_fx, Mean_dic_NB_fx, Gain_dic1_NB_fx, idx_g_fx, 3 ); IF( LT_32( core_brate_fx, ACELP_9k60 ) ) { - idx_g_fx = (Word16) get_next_indice( st_fx, 5 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 5 ); VDQ_vec_fx( y_gainQ_fx + 3, Mean_dic_NB_fx + 3, Gain_dic2_NB_fx, idx_g_fx, 3 ); - idx_g_fx = (Word16) get_next_indice( st_fx, 4 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 4 ); VDQ_vec_fx( y_gainQ_fx + 6, Mean_dic_NB_fx + 6, Gain_dic3_NB_fx, idx_g_fx, 4 ); } ELSE { - idx_g_fx = (Word16) get_next_indice( st_fx, 6 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 6 ); VDQ_vec_fx( y_gainQ_fx + 3, Mean_dic_NB_fx + 3, Gain_dic2_NBHR_fx, idx_g_fx, 3 ); - idx_g_fx = (Word16) get_next_indice( st_fx, 7 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 7 ); VDQ_vec_fx( y_gainQ_fx + 6, Mean_dic_NB_fx + 6, Gain_dic3_NBHR_fx, idx_g_fx, 4 ); } test(); @@ -515,7 +519,7 @@ Word16 gsc_gaindec_fx( /* o : average frequency gai } ELSE { - idx_g_fx = (Word16) get_next_indice( st_fx, 6 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 6 ); VDQ_vec_fx( &mean_4g_fx, mean_m_fx, mean_gain_dic_fx, idx_g_fx, 1 ); @@ -524,10 +528,10 @@ Word16 gsc_gaindec_fx( /* o : average frequency gai /*--------------------------------------------------------------------------------------* * UQ of the first 8 bands and half of the last 8 bands *--------------------------------------------------------------------------------------*/ - idx_g_fx = (Word16) get_next_indice( st_fx, 5 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 5 ); VDQ_vec_fx( y_gainQ_fx, YGain_mean_LR_fx, YGain_dic1_LR_fx, idx_g_fx, 3 ); - idx_g_fx = (Word16) get_next_indice( st_fx, 5 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 5 ); VDQ_vec_fx( y_gainQ_fx + 3, YGain_mean_LR_fx + 3, YGain_dic2_LR_fx, idx_g_fx, 4 ); /*----------------------------------------------------------------------* @@ -535,7 +539,7 @@ Word16 gsc_gaindec_fx( /* o : average frequency gai * And scaling *----------------------------------------------------------------------*/ - idx_g_fx = (Word16) get_next_indice( st_fx, 5 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 5 ); VDQ_vec_fx( y_gainQ_fx + 7, YGain_mean_LR_fx + 7, YGain_dic3_LR_fx, idx_g_fx, 5 ); @@ -568,16 +572,16 @@ Word16 gsc_gaindec_fx( /* o : average frequency gai } ELSE { - idx_g_fx = (Word16) get_next_indice( st_fx, 6 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 6 ); VDQ_vec_fx( y_gainQ_fx, YG_mean16_fx, YG_dicMR_1_fx, idx_g_fx, 4 ); - idx_g_fx = (Word16) get_next_indice( st_fx, 5 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 5 ); VDQ_vec_fx( y_gainQ_fx + 4, YG_mean16_fx + 4, YG_dicMR_2_fx, idx_g_fx, 4 ); - idx_g_fx = (Word16) get_next_indice( st_fx, 5 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 5 ); VDQ_vec_fx( y_gainQ_fx + 8, YG_mean16_fx + 8, YG_dicMR_3_fx, idx_g_fx, 4 ); - idx_g_fx = (Word16) get_next_indice( st_fx, 4 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 4 ); VDQ_vec_fx( y_gainQ_fx + 12, YG_mean16_fx + 12, YG_dicMR_4_fx, idx_g_fx, 4 ); } } @@ -631,27 +635,26 @@ Word16 gsc_gaindec_ivas_fx( /* o : average frequenc test(); IF( ( EQ_16( coder_type, AUDIO ) || EQ_16( coder_type, INACTIVE ) ) && EQ_16( bwidth_fx, NB ) ) { - idx_g_fx = (Word16) get_next_indice( st_fx, 6 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 6 ); VDQ_vec_fx( &mean_4g_fx, Gain_meanNB_fx, Gain_mean_dicNB_fx, idx_g_fx, 1 ); - idx_g_fx = (Word16) get_next_indice( st_fx, 6 ); - move16(); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 6 ); VDQ_vec_fx( y_gainQ_fx, Mean_dic_NB_fx, Gain_dic1_NB_fx, idx_g_fx, 3 ); IF( LT_32( core_brate_fx, ACELP_9k60 ) ) { - idx_g_fx = (Word16) get_next_indice( st_fx, 5 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 5 ); VDQ_vec_fx( y_gainQ_fx + 3, Mean_dic_NB_fx + 3, Gain_dic2_NB_fx, idx_g_fx, 3 ); - idx_g_fx = (Word16) get_next_indice( st_fx, 4 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 4 ); VDQ_vec_fx( y_gainQ_fx + 6, Mean_dic_NB_fx + 6, Gain_dic3_NB_fx, idx_g_fx, 4 ); } ELSE { - idx_g_fx = (Word16) get_next_indice( st_fx, 6 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 6 ); VDQ_vec_fx( y_gainQ_fx + 3, Mean_dic_NB_fx + 3, Gain_dic2_NBHR_fx, idx_g_fx, 3 ); - idx_g_fx = (Word16) get_next_indice( st_fx, 7 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 7 ); VDQ_vec_fx( y_gainQ_fx + 6, Mean_dic_NB_fx + 6, Gain_dic3_NBHR_fx, idx_g_fx, 4 ); } test(); @@ -679,7 +682,7 @@ Word16 gsc_gaindec_ivas_fx( /* o : average frequenc } ELSE { - idx_g_fx = (Word16) get_next_indice( st_fx, 6 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 6 ); VDQ_vec_fx( &mean_4g_fx, mean_m_fx, mean_gain_dic_fx, idx_g_fx, 1 ); @@ -688,10 +691,10 @@ Word16 gsc_gaindec_ivas_fx( /* o : average frequenc /*--------------------------------------------------------------------------------------* * UQ of the first 8 bands and half of the last 8 bands *--------------------------------------------------------------------------------------*/ - idx_g_fx = (Word16) get_next_indice( st_fx, 5 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 5 ); VDQ_vec_fx( y_gainQ_fx, YGain_mean_LR_fx, YGain_dic1_LR_fx, idx_g_fx, 3 ); - idx_g_fx = (Word16) get_next_indice( st_fx, 5 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 5 ); VDQ_vec_fx( y_gainQ_fx + 3, YGain_mean_LR_fx + 3, YGain_dic2_LR_fx, idx_g_fx, 4 ); /*----------------------------------------------------------------------* @@ -699,7 +702,7 @@ Word16 gsc_gaindec_ivas_fx( /* o : average frequenc * And scaling *----------------------------------------------------------------------*/ - idx_g_fx = (Word16) get_next_indice( st_fx, 5 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 5 ); VDQ_vec_fx( y_gainQ_fx + 7, YGain_mean_LR_fx + 7, YGain_dic3_LR_fx, idx_g_fx, 5 ); @@ -717,6 +720,7 @@ Word16 gsc_gaindec_ivas_fx( /* o : average frequenc { /*y_gainQ_fx[i] *= 1.41f;*/ y_gainQ_fx[i] = round_fx( L_shl( L_mult( y_gainQ_fx[i], 23101 ), 1 ) ); /*Q12 */ + move16(); } /*----------------------------------------------------------------------* * Copy the true Q values in the specific bands @@ -732,35 +736,35 @@ Word16 gsc_gaindec_ivas_fx( /* o : average frequenc } ELSE { - if ( st_fx->L_frame == L_FRAME ) + IF( EQ_16( st_fx->L_frame, L_FRAME ) ) { - idx_g_fx = (Word16) get_next_indice( st_fx, 6 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 6 ); VDQ_vec_fx( y_gainQ_fx, YG_mean16_fx, YG_dicMR_1_fx, idx_g_fx, 4 ); - idx_g_fx = (Word16) get_next_indice( st_fx, 5 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 5 ); VDQ_vec_fx( y_gainQ_fx + 4, YG_mean16_fx + 4, YG_dicMR_2_fx, idx_g_fx, 4 ); - idx_g_fx = (Word16) get_next_indice( st_fx, 5 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 5 ); VDQ_vec_fx( y_gainQ_fx + 8, YG_mean16_fx + 8, YG_dicMR_3_fx, idx_g_fx, 4 ); - idx_g_fx = (Word16) get_next_indice( st_fx, 4 ); + idx_g_fx = (Word16) get_next_indice_fx( st_fx, 4 ); VDQ_vec_fx( y_gainQ_fx + 12, YG_mean16_fx + 12, YG_dicMR_4_fx, idx_g_fx, 4 ); } - else + ELSE { - idx_g_fx = get_next_indice( st_fx, 7 ); + idx_g_fx = get_next_indice_fx( st_fx, 7 ); VDQ_vec_fx( y_gainQ_fx, YG_mean16HR_fx, YG_dicHR_1_fx, idx_g_fx, 4 ); - idx_g_fx = get_next_indice( st_fx, 6 ); + idx_g_fx = get_next_indice_fx( st_fx, 6 ); VDQ_vec_fx( y_gainQ_fx + 4, YG_mean16HR_fx + 4, YG_dicHR_2_fx, idx_g_fx, 4 ); - idx_g_fx = get_next_indice( st_fx, 6 ); + idx_g_fx = get_next_indice_fx( st_fx, 6 ); VDQ_vec_fx( y_gainQ_fx + 8, YG_mean16HR_fx + 8, YG_dicHR_3_fx, idx_g_fx, 4 ); - idx_g_fx = get_next_indice( st_fx, 6 ); + idx_g_fx = get_next_indice_fx( st_fx, 6 ); VDQ_vec_fx( y_gainQ_fx + 12, YG_mean16HR_16kHz_fx, YG_dicHR_4_16kHz_fx, idx_g_fx, 4 ); - idx_g_fx = get_next_indice( st_fx, 3 ); + idx_g_fx = get_next_indice_fx( st_fx, 3 ); VDQ_vec_fx( y_gainQ_fx + 16, YG_meanL2G_16kHz_fx, YG_dicL2G_16kHz_fx, idx_g_fx, 2 ); } } @@ -799,7 +803,7 @@ Word16 gsc_gainQ_fx( /*Q12*/ test(); test(); - IF( ( EQ_16( coder_type, AUDIO ) || EQ_16( coder_type, INACTIVE ) ) && EQ_16( bwidth, NB ) ) + IF( ( EQ_16( coder_type, AUDIO ) || ( coder_type == INACTIVE ) ) && ( bwidth == NB ) ) { /*ftmp1 = mean(y_gain4, 10)-0.6f;*/ @@ -827,6 +831,7 @@ Word16 gsc_gainQ_fx( /*Q12*/ /* Quantized mean gain without clipping */ mean_4g[0] = round_fx( L_tmp ); + move16(); idx_g = vquant_fx( mean_4g, Gain_meanNB_fx, mean_4g, Gain_mean_dicNB_fx, 1, 64 ); push_indice_fx( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); @@ -863,12 +868,18 @@ Word16 gsc_gainQ_fx( /*Q12*/ /* Some energy is needed in high band for stat_noise_uv_enc to be functional in inactive speech */ y_gain_tmp[10] = round_fx( L_mac( L_mac( L_mult( y_gain_tmp[6], 8192 ), y_gain_tmp[7], 8192 ), y_gain_tmp[8], 8192 ) ); + move16(); y_gain_tmp[11] = round_fx( L_mac( L_mac( L_mult( y_gain_tmp[7], 8192 ), y_gain_tmp[8], 8192 ), y_gain_tmp[9], 8192 ) ); + move16(); y_gain_tmp[12] = round_fx( L_mac( L_mac( L_mult( y_gain_tmp[8], 8192 ), y_gain_tmp[9], 8192 ), y_gain_tmp[10], 8192 ) ); + move16(); y_gain_tmp[13] = round_fx( L_mac( L_mac( L_mult( y_gain_tmp[9], 8192 ), y_gain_tmp[10], 8192 ), y_gain_tmp[11], 8192 ) ); + move16(); y_gain_tmp[14] = round_fx( L_mac( L_mac( L_mult( y_gain_tmp[10], 8192 ), y_gain_tmp[11], 8192 ), y_gain_tmp[12], 8192 ) ); + move16(); y_gain_tmp[15] = round_fx( L_mac( L_mac( L_mult( y_gain_tmp[11], 8192 ), y_gain_tmp[12], 8192 ), y_gain_tmp[13], 8192 ) ); + move16(); } ELSE { @@ -880,6 +891,7 @@ Word16 gsc_gainQ_fx( /*Q12*/ /*ftmp1 = mean(y_gain4, 16);*/ L_tmp = 0; + move32(); FOR( cnt = 0; cnt < 16; cnt++ ) { L_tmp = L_mac( L_tmp, y_gain4[cnt], 2048 ); @@ -889,6 +901,7 @@ Word16 gsc_gainQ_fx( /*Q12*/ tmp1 = sub( tmp16, 4915 ); tmp2 = add( tmp16, 4915 ); L_tmp = 0; + move32(); FOR( i = 0; i < 16; i++ ) { y_gain_tmp2[i] = y_gain4[i]; @@ -904,8 +917,10 @@ Word16 gsc_gainQ_fx( /*Q12*/ FOR( ; i < Mbands_gn; i++ ) { y_gain_tmp2[i] = y_gain4[i]; + move16(); /*if(y_gain4[i] < ftmp1-0.6f)*/ y_gain_tmp2[i] = s_max( y_gain_tmp2[i], tmp1 ); /* Just the last move is needed, because s_max and s_min could be done in 1 line*/ + move16(); /*else if(y_gain4[i] > ftmp1+0.6f)*/ y_gain_tmp2[i] = s_min( y_gain_tmp2[i], tmp2 ); move16(); @@ -913,6 +928,7 @@ Word16 gsc_gainQ_fx( /*Q12*/ /* Quantized mean gain without clipping */ mean_4g[0] = round_fx( L_tmp ); + move16(); /*idx_g = (short)vquant(mean_4g, mean_m, mean_4g, mean_gain_dic, 1, 64);*/ @@ -940,6 +956,7 @@ Word16 gsc_gainQ_fx( /*Q12*/ move16(); idx_g = 0; + move16(); /*idx_g = (short)vquant(y_gain_tmp2, YGain_mean_LR, y_gain_tmp2, YGain_dic1_LR, 3, 32);*/ idx_g = vquant_fx( y_gain_tmp2, YGain_mean_LR_fx, y_gain_tmp2, YGain_dic1_LR_fx, 3, 32 ); @@ -962,6 +979,7 @@ Word16 gsc_gainQ_fx( /*Q12*/ Copy( y_gain_tmp2 + 8, y_gain_tmp + 8, 3 ); y_gain_tmp[15] = y_gain_tmp2[11]; + move16(); ifft_rel_fx( y_gain_tmp + 8, 8, 3 ); FOR( i = 8; i < 16; i++ ) diff --git a/lib_com/gs_inact_switching_fx.c b/lib_com/gs_inact_switching_fx.c index 16fbddb41..446f9849b 100644 --- a/lib_com/gs_inact_switching_fx.c +++ b/lib_com/gs_inact_switching_fx.c @@ -137,6 +137,7 @@ void Inac_swtch_ematch_fx( L_tmp = L_shl( L_tmp, add( exp, 15 ) ); /* Q(Q_exc+1) -> Q(16+Q_exc)*/ *pt_exc = round_fx( L_tmp ); #endif + move16(); pt_exc++; } } @@ -152,6 +153,7 @@ void Inac_swtch_ematch_fx( L_tmp = L_shl( L_tmp, add( exp, 15 ) ); /* Q(Q_exc+1) -> Q(16+Q_exc)*/ *pt_exc = round_fx( L_tmp ); /*Q_exc*/ #endif + move16(); pt_exc++; } } @@ -243,6 +245,7 @@ void Inac_switch_ematch_ivas_fx( L_tmp = L_mult( ALPHA0_FX, lt_ener_per_band[i] ); /*Q(15+12+1)=Q(28) */ L_tmp = L_mac( L_tmp, BETA0_FX, Ener_per_bd[i] ); /*Q28 */ lt_ener_per_band[i] = round_fx( L_tmp ); /*Q12 */ + move16(); ftmp = sub( lt_ener_per_band[i], Ener_per_bd[i] ); /*Q12 */ @@ -263,6 +266,7 @@ void Inac_switch_ematch_ivas_fx( L_tmp = L_mult0( *pt_exc, ftmp ); L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc) -> Q(15+Q_exc)*/ *pt_exc = round_fx_sat( L_tmp ); /*Q_exc - 1*/ + move16(); pt_exc++; } } @@ -273,6 +277,7 @@ void Inac_switch_ematch_ivas_fx( L_tmp = L_mult0( *pt_exc, ftmp ); L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc) -> Q(15+Q_exc)*/ *pt_exc = round_fx_sat( L_tmp ); /*Q_exc - 1*/ + move16(); pt_exc++; } } diff --git a/lib_com/gs_noisefill_fx.c b/lib_com/gs_noisefill_fx.c index 1809a1f6f..3e5bfab96 100644 --- a/lib_com/gs_noisefill_fx.c +++ b/lib_com/gs_noisefill_fx.c @@ -96,17 +96,17 @@ static void EstimateNoiseLevel_inner_fx( noise_offset = 8192; move16(); /*0.25f * 32768 */ - IF( bitrate > ACELP_24k40 ) + IF( GT_32( bitrate, ACELP_24k40 ) ) { noise_offset = 6554; move16(); /*.2f * 32768 */ } - ELSE IF( bitrate >= ACELP_22k60 ) + ELSE IF( GE_32( bitrate, ACELP_22k60 ) ) { noise_offset = 9830; move16(); /*.3f * 32768 */ } - ELSE IF( bitrate >= ACELP_9k60 ) + ELSE IF( GE_32( bitrate, ACELP_9k60 ) ) { noise_offset = 11469; move16(); /*0.35f * 32768 */ @@ -194,6 +194,7 @@ static void EstimateNoiseLevel_fx( } } test(); + test(); IF( ( EQ_16( coder_type, INACTIVE ) || GE_16( noise_lev, NOISE_LEVEL_SP3 ) ) && EQ_16( L_frame, L_FRAME ) ) { FOR( i_band = 9; i_band < Mbands_gn; i_band++ ) @@ -280,8 +281,7 @@ static void Apply_NoiseFill_fx( FOR( i_band = 0; i_band < Mbands_gn; i_band++ ) { - StartBin += NB_Qbins; - move16(); + StartBin = add( StartBin, NB_Qbins ); NB_Qbins = freq_nsbin_per_band[i_band]; move16(); @@ -333,7 +333,7 @@ void freq_dnw_scaling_fx( start_sc = L_frame; move16(); test(); - IF( LE_32( core_brate, ACELP_8k00 ) && EQ_16( coder_type, INACTIVE ) ) + IF( LE_32( core_brate, ACELP_8k00 ) && ( coder_type == INACTIVE ) ) { sc_dyn = mult_r( sc_dyn, 4915 ); /*Q15 (0.15 in Q15) */ start_sc = 64; @@ -357,6 +357,7 @@ void freq_dnw_scaling_fx( } } + test(); IF( EQ_16( L_frame, L_FRAME16k ) && LE_32( core_brate, ACELP_24k40 ) ) { /*sc_dyn += 0.125f;*/ @@ -411,12 +412,15 @@ static void Decreas_freqPeak_fx( Word16 tmp2; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move16(); #endif move16(); /*ptr init*/ lsf_new_diff[0] = 0; /* prevent unitialized value */ + move16(); FOR( j = 1; j < ( M - 1 ); j++ ) { lsf_new_diff[j] = sub( lsf_new[j], lsf_new[j - 1] ); /*Qx2.56 */ + move16(); } avrg = 0; @@ -479,6 +483,7 @@ static void Decreas_freqPeak_fx( tmp1 = negate( tmp ); tmp2 = *src; + move16(); *( src ) = tmp1; move16(); if ( tmp2 > 0 ) @@ -528,6 +533,7 @@ static void envelop_modify_fx( Word16 Q_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move16(); #endif start_band = i_mult( last_bin, 16 ); @@ -550,7 +556,8 @@ static void envelop_modify_fx( move16(); Ener_fx = Isqrt_lc( Ener_fx, &exp1 ); /*Q(31-exp1) */ - weight_fx = 16384; /*Q15 */ + weight_fx = 16384; /*Q15 */ + move16(); src_fx = &exc_diffQ_fx[start_band]; /*Q_exc */ FOR( i = last_bin; i < last_bin + 4; i++ ) { @@ -578,7 +585,7 @@ static void envelop_modify_fx( L_tmp = L_mult0( sub( 32767, weight_fx ), Random( seed_tcx ) ); /*Q30 */ tmp1 = round_fx( L_shr( L_tmp, 2 ) ); - L_exc_diffQ_fx[16 * i + j] = L_mult0( Ener1_fx, add( tmp, tmp1 ) ); /*Q12 */ + L_exc_diffQ_fx[add( i_mult( 16, i ), j )] = L_mult0( Ener1_fx, add( tmp, tmp1 ) ); /*Q12 */ move32(); src_fx++; } @@ -609,7 +616,7 @@ static void envelop_modify_fx( L_tmp = L_mult0( sub( 32767, weight_fx ), Random( seed_tcx ) ); /*Q30 */ tmp1 = round_fx( L_shr( L_tmp, 2 ) ); /*Q12 */ - L_exc_diffQ_fx[16 * i + j] = L_mult0( Ener1_fx, add( tmp, tmp1 ) ); /*Q12 */ + L_exc_diffQ_fx[add( i_mult( 16, i ), j )] = L_mult0( Ener1_fx, add( tmp, tmp1 ) ); /*Q12 */ move32(); src_fx++; } @@ -618,7 +625,7 @@ static void envelop_modify_fx( move16(); FOR( i = start_band; i < L_FRAME; i++ ) { - IF( GT_32( L_abs( L_exc_diffQ_fx[i] ), exc_diffQ_max ) ) + if ( GT_32( L_abs( L_exc_diffQ_fx[i] ), exc_diffQ_max ) ) { exc_diffQ_max = L_abs( L_exc_diffQ_fx[i] ); } @@ -632,6 +639,7 @@ static void envelop_modify_fx( FOR( i = start_band; i < L_FRAME; i++ ) { exc_diffQ_fx[i] = extract_l( L_exc_diffQ_fx[i] ); + move16(); } } ELSE @@ -641,6 +649,7 @@ static void envelop_modify_fx( FOR( i = start_band; i < L_FRAME; i++ ) { exc_diffQ_fx[i] = extract_l( L_shr( L_exc_diffQ_fx[i], Q_tmp ) ); + move16(); } } @@ -783,11 +792,13 @@ void highband_exc_dct_in_fx( } test(); - + test(); + test(); IF( GSC_IVAS_mode == 0 && GSC_noisy_speech && !bfi && LE_16( element_mode, IVAS_SCE ) ) { set16_fx( noisepb, 3277, MBANDS_GN ); } + test(); IF( LT_32( core_brate, 6000 ) && LE_16( coder_type, UNVOICED ) ) { FOR( i = 0; i < L_frame; i++ ) @@ -829,6 +840,7 @@ void highband_exc_dct_in_fx( tmp = msu_r( -7680 * 65536, -17564, shl( i, 6 ) ); /*-15 in Q9; -0.067 in Q18 and i in Q6= Q9 */ L_tmp = L_mult( exc_diffQ[i], tmp ); /*Q(Qexc_diffQ+10) */ exc_diffQ[i] = round_fx( L_shl( L_tmp, 16 - 10 ) ); /*Qexc_diffQ */ + move16(); } } } @@ -1211,6 +1223,10 @@ void highband_exc_dct_in_ivas_fx( move16(); } + test(); + test(); + test(); + test(); IF( bfi || LT_32( core_brate, 6000 ) || ( LT_32( core_brate, 8600 ) && EQ_16( coder_type, UNVOICED ) ) ) { set16_fx( noisepb, 13107, MBANDS_GN ); /*0.4 in Q15 */ @@ -1229,12 +1245,15 @@ void highband_exc_dct_in_ivas_fx( Copy( exc_diffQ, exc_wo_nf, L_frame ); } + test(); test(); IF( GSC_IVAS_mode == 0 && GSC_noisy_speech && !bfi && LE_16( element_mode, IVAS_SCE ) ) { set16_fx( noisepb, 3277, MBANDS_GN ); } + + test(); IF( LT_32( core_brate, 6000 ) && LE_16( coder_type, UNVOICED ) ) { FOR( i = 0; i < L_frame; i++ ) @@ -1268,6 +1287,7 @@ void highband_exc_dct_in_ivas_fx( { Ener_per_band_comp_ivas_fx( exc_diffQ, Ener_per_bd_yQ, Qexc_diffQ, MBANDS_GN, 1, L_frame ); + test(); IF( LT_16( nb_subfr, 4 ) && LT_16( L_frame, L_FRAME16k ) ) { FOR( i = L_FRAME - 16; i < L_FRAME; i++ ) @@ -1276,6 +1296,7 @@ void highband_exc_dct_in_ivas_fx( tmp = msu_r( -7680 * 65536, -17564, shl( i, 6 ) ); /*-15 in Q9; -0.067 in Q18 and i in Q6= Q9 */ L_tmp = L_mult( exc_diffQ[i], tmp ); /*Q(Qexc_diffQ+10) */ exc_diffQ[i] = round_fx( L_shl( L_tmp, 16 - 10 ) ); /*Qexc_diffQ */ + move16(); } } } @@ -1328,23 +1349,30 @@ void highband_exc_dct_in_ivas_fx( { // float scale_factLF = 0.9f; Word16 scale_factLF = 29491; + move16(); // float scale_factHF = 0.9f; Word16 scale_factHF = 29491; + move16(); - IF( GSC_IVAS_mode == 1 && GSC_noisy_speech == 0 ) + test(); + test(); + IF( EQ_16( GSC_IVAS_mode, 1 ) && GSC_noisy_speech == 0 ) { // scale_factHF = 0.8f; scale_factHF = 26214; + move16(); } - ELSE IF( GSC_IVAS_mode == 2 || GSC_noisy_speech == 1 ) + ELSE IF( EQ_16( GSC_IVAS_mode, 2 ) || EQ_16( GSC_noisy_speech, 1 ) ) { // scale_factHF = 0.71f; scale_factHF = 23265; + move16(); } - ELSE IF( GSC_IVAS_mode == 3 ) + ELSE IF( EQ_16( GSC_IVAS_mode, 3 ) ) { // scale_factHF = 0.9f; scale_factHF = 29491; + move16(); } FOR( i = 0; i < pit_band_idx * 16; i++ ) { @@ -1355,44 +1383,51 @@ void highband_exc_dct_in_ivas_fx( { // exc_diffQ[i] *= scale_factHF; exc_diffQ[i] = mult_r( exc_diffQ[i], scale_factHF ); + move16(); } } ELSE IF( GSC_noisy_speech ) { // float scale_fact = 0.9f; Word16 scale_fact = 29491; + move16(); - IF( element_mode == IVAS_CPE_TD ) + IF( EQ_16( element_mode, IVAS_CPE_TD ) ) { IF( coder_type == INACTIVE ) { // scale_fact = 1.0f; scale_fact = 32767; + move16(); } ELSE { // scale_fact = 0.95f; scale_fact = 31129; + move16(); } } - ELSE IF( element_mode > IVAS_SCE ) + ELSE IF( GT_16( element_mode, IVAS_SCE ) ) { // scale_fact = 0.71f; scale_fact = 23265; + move16(); } FOR( i = 0; i < L_frame; i++ ) { // exc_diffQ[i] *= scale_fact; exc_diffQ[i] = mult_r( exc_diffQ[i], scale_fact ); + move16(); } } - IF( GSC_noisy_speech && element_mode > IVAS_SCE && core_brate < ACELP_7k20 ) + IF( GSC_noisy_speech && GT_16( element_mode, IVAS_SCE ) && LT_32( core_brate, ACELP_7k20 ) ) { FOR( i = 80; i < L_frame; i++ ) { // exc_diffQ[i] *= (+0.0024f * (float)i + 1.192f); exc_diffQ[i] = mult_r( shl( exc_diffQ[i], 1 ) /*Q16*/, (Word16) L_shr( L_add( 629 * i, 312475 ) /*Q18*/, Q4 ) /*Q14*/ ); + move16(); } } #else @@ -1421,7 +1456,7 @@ void highband_exc_dct_in_ivas_fx( Vr_add( exc_dct_in, exc_diffQ, exc_dct_in, L_frame ); test(); - IF( core_brate == ACELP_8k00 && bwidth != NB ) + IF( EQ_32( core_brate, ACELP_8k00 ) && bwidth != NB ) { IF( EQ_16( bwe_flag, 1 ) ) { diff --git a/lib_com/gs_preech.c b/lib_com/gs_preech.c index 36487d90f..8765dc7e0 100644 --- a/lib_com/gs_preech.c +++ b/lib_com/gs_preech.c @@ -159,7 +159,7 @@ void pre_echo_att_fx( Word16 att_len; test(); - IF( GT_16( gsc_attack_flag_fx, 0 ) && EQ_16( last_coder_type, AUDIO ) ) /*gsc_attack_flag_fx does not get set for all the test cases */ + IF( gsc_attack_flag_fx > 0 && EQ_16( last_coder_type, AUDIO ) ) /*gsc_attack_flag_fx does not get set for all the test cases */ { /*-------------------------------------------------------------------------* * Find where the onset (attack) occurs by computing the energy per section @@ -167,9 +167,11 @@ void pre_echo_att_fx( * gradual onset *-------------------------------------------------------------------------*/ att_len = ATT_LENGHT; - if ( L_frame == L_FRAME16k ) + move16(); + if ( EQ_16( L_frame, L_FRAME16k ) ) { att_len = ATT_LENGHT16k; + move16(); } FOR( i = 0; i < att_len; i++ ) { @@ -210,6 +212,7 @@ void pre_echo_att_fx( /* = isqrt(etmp/(*Last_frame_ener)) */ etmp_fx = L_max( etmp_fx, 1 ); *Last_frame_ener_fx = L_max( *Last_frame_ener_fx, 1 ); + move32(); n1 = norm_l( etmp_fx ); n2 = norm_l( *Last_frame_ener_fx ); @@ -234,6 +237,7 @@ void pre_echo_att_fx( { /*exc_fx[i] *= ratio_fx;*/ exc_fx[i] = round_fx( L_shl( L_mac( -8192, exc_fx[i], ratio_fx ), 2 ) ); + move16(); } } *Last_frame_ener_fx = etmp1_fx; diff --git a/lib_com/guided_plc_util_fx.c b/lib_com/guided_plc_util_fx.c index 87ab48143..a95e9a5c4 100644 --- a/lib_com/guided_plc_util_fx.c +++ b/lib_com/guided_plc_util_fx.c @@ -71,6 +71,7 @@ void updateLSFForConcealment( L_tmp = L_mult( divide_by_3_Q15, decState->lsfoldbfi1_14Q1[i] ); L_tmp = L_mac( L_tmp, divide_by_3_Q15, decState->lsfoldbfi0_14Q1[i] ); decState->lsf_adaptive_mean_14Q1[i] = mac_r( L_tmp, divide_by_3_Q15, lsf_14Q1[i] ); + move16(); decState->lsfoldbfi1_14Q1[i] = decState->lsfoldbfi0_14Q1[i]; move16(); decState->lsfoldbfi0_14Q1[i] = lsf_14Q1[i]; @@ -96,7 +97,6 @@ void getConcealedLP( Word16 lsp[( NB_DIV + 1 ) * M]; Word32 int_fs; - move16(); lsf = memDecState->lsf_con; diff --git a/lib_com/hp50.c b/lib_com/hp50.c index b080d0431..d6aaebea2 100644 --- a/lib_com/hp50.c +++ b/lib_com/hp50.c @@ -200,7 +200,7 @@ static void filter_2nd_order( BASOP_SATURATE_ERROR_ON_EVS L_sum = HP50_Mpy_32_32_fix( b2, mem[2] ); /* b2*x2 */ L_sum = L_add( L_sum, HP50_Mpy_32_32_fix( b1, mem[3] ) ); /* b1*x1 */ - x2 = shr( signal[0 * stride], prescale ); + x2 = shr( signal[0], prescale ); L_sum = L_add( L_sum, HP50_Mode2_Mpy_32_16_fix( b2, x2 ) ); /* b2*x0 */ L_sum = L_add( L_sum, HP50_Mpy_32_32_fix( mem[0], a2 ) ); /* y2*a2 */ L_sum = L_add( L_sum, HP50_Mpy_32_32_fix( mem[1], a1 ) ); /* y1*a1 */ @@ -213,16 +213,16 @@ static void filter_2nd_order( BASOP_SATURATE_ERROR_OFF_EVS BASOP_SATURATE_WARNING_OFF_EVS #ifdef BASOP_NOGLOB - signal[0 * stride] = round_fx_o( L_shl_o( L_y2, prescale, &Overflow ), &Overflow ); + signal[0] = round_fx_o( L_shl_o( L_y2, prescale, &Overflow ), &Overflow ); #else /* BASOP_NOGLOB */ - signal[0 * stride] = round_fx( L_shl( L_y2, prescale ) ); + signal[0] = round_fx( L_shl( L_y2, prescale ) ); #endif /* BASOP_NOGLOB */ BASOP_SATURATE_WARNING_ON_EVS BASOP_SATURATE_ERROR_ON_EVS L_sum = HP50_Mpy_32_32_fix( b2, mem[3] ); /* b2*x2 */ L_sum = L_add( L_sum, HP50_Mode2_Mpy_32_16_fix( b1, x2 ) ); /* b1*x1 */ - x1 = shr( signal[1 * stride], prescale ); + x1 = shr( signal[stride], prescale ); L_sum = L_add( L_sum, HP50_Mode2_Mpy_32_16_fix( b2, x1 ) ); /* b2*x0 */ L_sum = L_add( L_sum, HP50_Mpy_32_32_fix( mem[1], a2 ) ); /* y2*a2 */ L_sum = L_add( L_sum, HP50_Mpy_32_32_fix( L_y2, a1 ) ); /* y1*a1 */ @@ -235,11 +235,12 @@ static void filter_2nd_order( BASOP_SATURATE_ERROR_OFF_EVS BASOP_SATURATE_WARNING_OFF_EVS #ifdef BASOP_NOGLOB - signal[1 * stride] = round_fx_o( L_shl_o( L_y1, prescale, &Overflow ), &Overflow ); + signal[stride] = round_fx_o( L_shl_o( L_y1, prescale, &Overflow ), &Overflow ); #else /* BASOP_NOGLOB */ - signal[1 * stride] = round_fx( L_shl( L_y1, prescale ) ); + signal[stride] = round_fx( L_shl( L_y1, prescale ) ); #endif /* BASOP_NOGLOB */ BASOP_SATURATE_WARNING_ON_EVS + move16(); /* New we use a trick and toggle x1/x2 and L_y1/L_y2 to save a few cycles unrolling the loop by 2 */ FOR( i = 2; i < lg; i += 2 ) @@ -261,9 +262,10 @@ static void filter_2nd_order( BASOP_SATURATE_ERROR_OFF_EVS BASOP_SATURATE_WARNING_OFF_EVS #ifdef BASOP_NOGLOB - signal[i * stride] = round_fx_o( L_shl_o( L_y2, prescale, &Overflow ), &Overflow ); + signal[i_mult( i, stride )] = round_fx_o( L_shl_o( L_y2, prescale, &Overflow ), &Overflow ); #else /* BASOP_NOGLOB */ - signal[i * stride] = round_fx( L_shl( L_y2, prescale ) ); + signal[i_mult( i, stride )] = round_fx( L_shl( L_y2, prescale ) ); + move16(); #endif /* BASOP_NOGLOB */ BASOP_SATURATE_WARNING_ON_EVS /* y[i+1] = b2*x[i-1] + b1*x[i-0] + b2*x[i+1] + a2*y[i-1] + a1*y[i+0]; */ @@ -283,11 +285,12 @@ static void filter_2nd_order( BASOP_SATURATE_ERROR_OFF_EVS BASOP_SATURATE_WARNING_OFF_EVS #ifdef BASOP_NOGLOB - signal[( i + 1 ) * stride] = round_fx_o( L_shl_o( L_y1, prescale, &Overflow ), &Overflow ); + signal[i_mult( add( i, 1 ), stride )] = round_fx_o( L_shl_o( L_y1, prescale, &Overflow ), &Overflow ); #else /* BASOP_NOGLOB */ - signal[( i + 1 ) * stride] = round_fx( L_shl( L_y1, prescale ) ); + signal[i_mult( add( i, 1 ), stride )] = round_fx( L_shl( L_y1, prescale ) ); #endif BASOP_SATURATE_WARNING_ON_EVS + move16(); } /* update static filter memory from variables */ mem[0] = L_y2; @@ -295,7 +298,9 @@ static void filter_2nd_order( mem[1] = L_y1; move32(); mem[2] = L_deposit_h( x2 ); + move32(); mem[3] = L_deposit_h( x1 ); + move32(); return; diff --git a/lib_com/hq2_bit_alloc.c b/lib_com/hq2_bit_alloc.c index cd7f17aab..3653ffea8 100644 --- a/lib_com/hq2_bit_alloc.c +++ b/lib_com/hq2_bit_alloc.c @@ -216,7 +216,7 @@ static void Bits2indvsb_fx( th_5_fx = shl( 5, QRavg ); FOR( j = 0; j < be_cnt_fx; j++ ) { - IF( sub( abs_s( sub( Ravg_fx, shl( y_index_fx[j], QRavg ) ) ), th_5_fx ) > 0 ) + if ( sub( abs_s( sub( Ravg_fx, shl( y_index_fx[j], QRavg ) ) ), th_5_fx ) > 0 ) { enr_diffcnt_fx = add( enr_diffcnt_fx, 1 ); } @@ -461,10 +461,12 @@ void hq2_bit_alloc_har( } gmax_range_fx[i] = add( gmax_range_fx[i], temp_fx ); + move16(); } ELSE { gmax_range_fx[i] = add( gmax_range_fx[i], temp_fx ); + move16(); } } @@ -477,7 +479,7 @@ void hq2_bit_alloc_har( } grp_bound_fx[i] = harmonic_band_fx; move16(); - grp_bound_fx[i + 1] = N_fx; + grp_bound_fx[add( i, 1 )] = N_fx; move16(); @@ -575,7 +577,7 @@ void hq2_bit_alloc_har( FOR( i = 0; i < sub( N_fx, harmonic_band_fx ); i++ ) { - y_index_fx[i] = extract_h( L_shl( L_temp_band_energy[harmonic_band_fx + i], sub( 16, SWB_BWE_LR_Qbe ) ) ); + y_index_fx[i] = extract_h( L_shl( L_temp_band_energy[add( harmonic_band_fx, i )], sub( 16, SWB_BWE_LR_Qbe ) ) ); move16(); index_fx[i] = add( harmonic_band_fx, i ); move16(); @@ -643,6 +645,7 @@ void hq2_bit_alloc_har( #ifdef BASOP_NOGLOB lf_hf_ge_r_fx = round_fx_o( L_shl_o( L_temp, sub( 15 + 16, sub( add( SWB_BWE_LR_Qbe, QIns ), 30 ) ), &Overflow ), &Overflow ); Overflow = 0; /* reset BASOP Overflow */ + move16(); #else lf_hf_ge_r_fx = round_fx( L_shl( L_temp, sub( 15 + 16, sub( add( SWB_BWE_LR_Qbe, QIns ), 30 ) ) ) ); #endif @@ -694,24 +697,30 @@ void hq2_bit_alloc_har( L_temp = Mpy_32_16_1( L_Ravg_sub[1], extract_h( L_mult( bits_fact_fx, B_norm_fx ) ) ); L_temp = Mpy_32_16_1( L_temp, Inv_norm_sum_fx ); Bits_grp_fx[1] = extract_h( L_shr( L_temp, exp_shift ) ); + move16(); L_temp = Mpy_32_16_1( L_Ravg_sub[2], extract_h( L_mult( bits_fact1_fx, B_norm_fx ) ) ); L_temp = Mpy_32_16_1( L_temp, Inv_norm_sum_fx ); Bits_grp_fx[2] = extract_h( L_shr( L_temp, exp_shift ) ); + move16(); Bits_grp_fx[0] = sub( sub( B_fx, Bits_grp_fx[1] ), Bits_grp_fx[2] ); + move16(); } ELSE { L_temp = Mpy_32_16_1( L_Ravg_sub[0], extract_h( L_mult( bits_fact_fx, B_norm_fx ) ) ); L_temp = Mpy_32_16_1( L_temp, Inv_norm_sum_fx ); Bits_grp_fx[0] = extract_h( L_shr( L_temp, exp_shift ) ); + move16(); L_temp = Mpy_32_16_1( L_Ravg_sub[2], extract_h( L_mult( bits_fact1_fx, B_norm_fx ) ) ); L_temp = Mpy_32_16_1( L_temp, Inv_norm_sum_fx ); Bits_grp_fx[2] = extract_h( L_shr( L_temp, exp_shift ) ); + move16(); Bits_grp_fx[1] = sub( sub( B_fx, Bits_grp_fx[0] ), Bits_grp_fx[2] ); + move16(); } IF( sub( Bits_grp_fx[2], THR2 ) < 0 ) @@ -823,6 +832,7 @@ void hq2_bit_alloc( FOR( k = 0; k < bands; k++ ) { L_Rk[k] = L_shl( L_deposit_l( p2a_flags[k] ), SWB_BWE_LR_QRk ); + move32(); } } diff --git a/lib_com/hq2_bit_alloc_fx.c b/lib_com/hq2_bit_alloc_fx.c index eb3342b29..1f5a146c0 100644 --- a/lib_com/hq2_bit_alloc_fx.c +++ b/lib_com/hq2_bit_alloc_fx.c @@ -100,6 +100,7 @@ void Bits2indvsb_fx( FOR( i = 0; i < band_num_fx; i++ ) { y_index_fx[i] = extract_h( L_shr( L_y_ptr[i], sub( SWB_BWE_LR_Qbe, 16 ) ) ); + move16(); index_fx[i] = i; move16(); } @@ -120,6 +121,7 @@ void Bits2indvsb_fx( y_index_fx[j] = 0; move16(); L_R_temp[j] = L_deposit_l( 0 ); + move32(); } ELSE { @@ -370,14 +372,13 @@ void hq2_bit_alloc_har_fx( { FOR( temp_fx = 2; temp_fx <= k_fx; ) { - IF( LT_32( L_temp_band_energy[gmax_range_fx[i] + temp_fx - 1], L_temp_band_energy[gmax_range_fx[i] + temp_fx] ) ) + IF( LT_32( L_temp_band_energy[sub( add( gmax_range_fx[i], temp_fx ), 1 )], L_temp_band_energy[add( gmax_range_fx[i], temp_fx )] ) ) { BREAK; } - ELSE IF( GE_32( L_temp_band_energy[gmax_range_fx[i] + temp_fx - 1], L_temp_band_energy[gmax_range_fx[i] + temp_fx] ) ) + ELSE IF( GE_32( L_temp_band_energy[sub( add( gmax_range_fx[i], temp_fx ), 1 )], L_temp_band_energy[add( gmax_range_fx[i], temp_fx )] ) ) { temp_fx = add( temp_fx, 1 ); - ; IF( GT_16( temp_fx, k_fx ) ) { temp_fx = sub( temp_fx, 1 ); @@ -405,7 +406,7 @@ void hq2_bit_alloc_har_fx( } grp_bound_fx[i] = harmonic_band_fx; move16(); - grp_bound_fx[i + 1] = N_fx; + grp_bound_fx[add( i, 1 )] = N_fx; move16(); @@ -441,6 +442,7 @@ void hq2_bit_alloc_har_fx( G1_BE_DIFF_POS_fx = j; move16(); L_G1_BE_DIFF_VAL = L_temp_band_energydiff[j]; + move32(); } } @@ -502,6 +504,7 @@ void hq2_bit_alloc_har_fx( FOR( i = 0; i < j; i++ ) { y_index_fx[i] = extract_h( L_shl( L_temp_band_energy[harmonic_band_fx + i], sub( 16, SWB_BWE_LR_Qbe ) ) ); + move16(); index_fx[i] = add( harmonic_band_fx, i ); move16(); } @@ -592,6 +595,7 @@ void hq2_bit_alloc_har_fx( L_temp = L_add( L_shl( L_temp, SWB_BWE_LR_Qbe ), L_temp2 ); Bits_grp_fx[GRP_SB - 1] = extract_h( L_shl( L_temp, sub( 16, SWB_BWE_LR_Qbe ) ) ); + move16(); Bits_grp_fx[GRP_SB - 1] = s_min( Bits_grp_fx[GRP_SB - 1], 10 ); move16(); @@ -613,10 +617,12 @@ void hq2_bit_alloc_har_fx( L_temp = Mult_32_16( L_Ravg_sub[1], extract_h( L_mult( bits_fact_fx, B_norm_fx ) ) ); L_temp = Mult_32_16( L_temp, Inv_norm_sum_fx ); Bits_grp_fx[1] = extract_h( L_shr( L_temp, exp_shift ) ); + move16(); L_temp = Mult_32_16( L_Ravg_sub[2], extract_h( L_mult( bits_fact1_fx, B_norm_fx ) ) ); L_temp = Mult_32_16( L_temp, Inv_norm_sum_fx ); Bits_grp_fx[2] = extract_h( L_shr( L_temp, exp_shift ) ); + move16(); Bits_grp_fx[0] = sub( sub( B_fx, Bits_grp_fx[1] ), Bits_grp_fx[2] ); move16(); @@ -626,10 +632,12 @@ void hq2_bit_alloc_har_fx( L_temp = Mult_32_16( L_Ravg_sub[0], extract_h( L_mult( bits_fact_fx, B_norm_fx ) ) ); L_temp = Mult_32_16( L_temp, Inv_norm_sum_fx ); Bits_grp_fx[0] = extract_h( L_shr( L_temp, exp_shift ) ); + move16(); L_temp = Mult_32_16( L_Ravg_sub[2], extract_h( L_mult( bits_fact1_fx, B_norm_fx ) ) ); L_temp = Mult_32_16( L_temp, Inv_norm_sum_fx ); Bits_grp_fx[2] = extract_h( L_shr( L_temp, exp_shift ) ); + move16(); Bits_grp_fx[1] = sub( sub( B_fx, Bits_grp_fx[0] ), Bits_grp_fx[2] ); move16(); @@ -721,13 +729,21 @@ Word32 hq2_bit_alloc_fx( IF( is_transient && EQ_16( bands, 32 ) ) { L_Rk[6] = L_deposit_l( 0 ); + move32(); L_Rk[7] = L_deposit_l( 0 ); + move32(); L_Rk[14] = L_deposit_l( 0 ); + move32(); L_Rk[15] = L_deposit_l( 0 ); + move32(); L_Rk[22] = L_deposit_l( 0 ); + move32(); L_Rk[23] = L_deposit_l( 0 ); + move32(); L_Rk[30] = L_deposit_l( 0 ); + move32(); L_Rk[31] = L_deposit_l( 0 ); + move32(); } } ELSE @@ -736,6 +752,7 @@ Word32 hq2_bit_alloc_fx( FOR( k = 0; k < bands; k++ ) { L_Rk[k] = L_shl( L_deposit_l( p2a_flags[k] ), SWB_BWE_LR_QRk ); + move32(); } } @@ -814,6 +831,7 @@ Word32 hq2_bit_alloc_fx( IF( LT_32( L_Rk[k], MIN_BITS_FIX ) ) { L_Rk[k] = L_deposit_l( 0 ); + move32(); negflag = 1; move16(); } @@ -846,9 +864,10 @@ Word32 hq2_bit_alloc_fx( } /* prune worst allocation and recalculate total allocation */ - if ( GT_16( maxdex_fx, -1 ) ) + IF( GT_16( maxdex_fx, -1 ) ) { L_Rk[maxdex_fx] = L_deposit_l( 0 ); + move32(); } FOR( k = 0; k < bands; k++ ) { @@ -875,14 +894,17 @@ Word32 hq2_bit_alloc_fx( IF( LT_16( k, 11 ) && LT_32( L_Rk[k], L_THR1 ) ) { L_Rk[k] = L_deposit_l( 0 ); + move32(); } ELSE IF( GE_16( k, 11 ) && LT_16( k, 16 ) && LT_32( L_Rk[k], L_THR2 ) ) { L_Rk[k] = L_deposit_l( 0 ); + move32(); } ELSE if ( GE_16( k, 16 ) && LT_16( k, bands ) && LT_32( L_Rk[k], L_THR3 ) ) { L_Rk[k] = L_deposit_l( 0 ); + move32(); } L_dummy = L_add( L_dummy, L_Rk[k] ); @@ -898,9 +920,9 @@ Word32 hq2_bit_alloc_fx( FOR( k = 0; k < NB_SWB_SUBBANDS; k++ ) { test(); - IF( p2a_flags[bands - NB_SWB_SUBBANDS + k] == 1 && L_Rk[bands - NB_SWB_SUBBANDS + k] == 0 ) + IF( EQ_16( p2a_flags[add( sub( bands, NB_SWB_SUBBANDS ), k )], 1 ) && L_Rk[add( sub( bands, NB_SWB_SUBBANDS ), k )] == 0 ) { - p2a_flags[bands - NB_SWB_SUBBANDS + k] = 0; + p2a_flags[add( sub( bands, NB_SWB_SUBBANDS ), k )] = 0; move16(); bit_budget_temp_fx = sub( bit_budget_temp_fx, bits_lagIndices_modeNormal[k] ); } diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index d085e06be..85556a4f4 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -822,7 +822,7 @@ void smooth_dft2td_transition( void smooth_dft2td_transition_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 *output_fx[CPE_CHANNELS], /* i/o: synthesis @external Fs */ - const int16_t output_frame /* i : output frame lenght */ + const Word16 output_frame /* i : output frame lenght */ ); /*! r: flag indicating a valid bitrate */ int16_t is_IVAS_bitrate( @@ -862,8 +862,8 @@ void ivas_mdft_fx( const Word32 *pIn, /* i : input time-domain signal */ Word32 *pOut_re, /* o : Real part of MDFT signal */ Word32 *pOut_im, /* o : Imag. part of MDFT signal */ - const int16_t length, /* i : signal length */ - const int16_t mdft_length /* i : MDFT length */ + const Word16 length, /* i : signal length */ + const Word16 mdft_length /* i : MDFT length */ ); void ivas_imdft_fx( @@ -923,7 +923,7 @@ Word16 rand_triangular_signed_fx( #endif Word64 var_32_fx( const Word32 *x, /* i : input vector */ - const int16_t len, /* i : length of inputvector */ + const Word16 len, /* i : length of inputvector */ Word16 q /* q : q-factor for the array */ ); @@ -1368,9 +1368,9 @@ void ivas_param_ism_dec_render( #ifdef IVAS_FLOAT_FIXED void ivas_param_ism_dec_render_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ - uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ - uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + const UWord16 nSamplesAsked, /* i : number of CLDFB slots requested */ + UWord16 *nSamplesRendered, /* o : number of CLDFB slots rendered */ + UWord16 *nSamplesAvailable, /* o : number of CLDFB slots still to render */ Word32 *output_f_fx[] ); void ivas_param_ism_params_to_masa_param_mapping_fx( @@ -2207,7 +2207,7 @@ void stereo_tca_dec( void stereo_tca_dec_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 *synth[CPE_CHANNELS], /* i/o: output synth */ - const int16_t output_frame /* i : length of a frame per channel */ + const Word16 output_frame /* i : length of a frame per channel */ ); void stereo_tca_scale_R_channel( @@ -2219,7 +2219,7 @@ void stereo_tca_scale_R_channel( void stereo_tca_scale_R_channel_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 *output_fx, /* i/o: output synthesis, R channel */ - const int16_t output_frame /* i : frame length */ + const Word16 output_frame /* i : frame length */ ); void adjustTargetSignal( @@ -2232,10 +2232,10 @@ void adjustTargetSignal( void adjustTargetSignal_fx( Word32 *target_fx, - const int16_t prevShift, - const int16_t currShift, - const int16_t L_shift_adapt, - const int16_t method); + const Word16 prevShift, + const Word16 currShift, + const Word16 L_shift_adapt, + const Word16 method); /*----------------------------------------------------------------------------------* * IC-BWE Stereo prototypes *----------------------------------------------------------------------------------*/ @@ -2393,7 +2393,7 @@ void stereo_td_init_dec( void stereo_td_init_dec_fx( STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ - const int16_t last_element_mode /* i : last element mode */ + const Word16 last_element_mode /* i : last element mode */ ); void tdm_configure_dec( @@ -2423,9 +2423,9 @@ void tdm_upmix_plain_fx( const Word32 SCh_2_R_fx[], /* i : secondary channel */ const Word32 LR_ratio_fx, /* i : mixing ratio */ const Word32 inv_den_LR_ratio_fx, /* i : inverse mixing ration */ - const int16_t start_index, /* i : start index */ - const int16_t end_index, /* i : end index */ - const int16_t plus_minus_flag /* i : plus/minus flag */ + const Word16 start_index, /* i : start index */ + const Word16 end_index, /* i : end index */ + const Word16 plus_minus_flag /* i : plus/minus flag */ ); void stereo_tdm_combine( @@ -2441,9 +2441,9 @@ void stereo_tdm_combine_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 *PCh_2_L_fx, /* i/o: Primary channel -> output as left channel */ Word32 *SCh_2_R_fx, /* i/o: Secondary channel -> output as right channel*/ - const int16_t output_frame, /* i : Number of samples */ - const int16_t flag_HB, /* i : flag to distinguish between core (0) and HB (1) synthesis */ - const int16_t tdm_ratio_idx /* i : TDM ratio index */ + const Word16 output_frame, /* i : Number of samples */ + const Word16 flag_HB, /* i : flag to distinguish between core (0) and HB (1) synthesis */ + const Word16 tdm_ratio_idx /* i : TDM ratio index */ ); /*! r: replication decision; 1 = Use old LP */ @@ -2604,13 +2604,13 @@ void tdm_SCh_lsf_reuse_fx( void tdm_SCh_lsf_reuse_ivas_fx( - const int16_t enc_dec, /* i : encoder/decoder flag */ - const int32_t element_brate, /* i : element bitrate */ + const Word16 enc_dec, /* i : encoder/decoder flag */ + const Word32 element_brate, /* i : element bitrate */ Word16 lsf_new[M], /* i/o: LSFs at the end of the frame */ Word16 lsp_new[M], /* i/o: LSPs at the end of the frame */ const Word16 tdm_lsfQ_PCh[M], /* i : primary channel LSFs (log2(2.56)) */ const Word16 lsf_wgts[M], /* i : LSF weights Q15? */ - int16_t *beta_index /* i/o: quantization index */ + Word16 *beta_index /* i/o: quantization index */ ); void tdm_SCh_lsf_reuse( @@ -3214,7 +3214,7 @@ void applyDmxMdctStereo( void applyDmxMdctStereo_fx( const CPE_DEC_HANDLE hCPE, /* i : CPE handle */ Word32 *output_fx[CPE_CHANNELS], /* o : output from core decoder */ - const int16_t output_frame /* i : output frame length */ + const Word16 output_frame /* i : output frame length */ ); @@ -3305,8 +3305,8 @@ void stereo_cna_update_params( void stereo_cna_update_params_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 *output_fx[CPE_CHANNELS], /* i : Output signal */ - const int16_t output_frame, /* i : Output frame length */ - const int16_t tdm_ratio_idx /* i : TDM ratio index */ + const Word16 output_frame, /* i : Output frame length */ + const Word16 tdm_ratio_idx /* i : TDM ratio index */ ); void dtx_enc_init( Encoder_State *st, /* i : Encoder state handle */ @@ -3588,11 +3588,11 @@ void stereo_td2dft_update( void stereo_td2dft_update_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const int16_t n, /* i : channel number */ + const Word16 n, /* i : channel number */ Word32 output_fx[], /* i/o: synthesis @internal Fs */ Word32 synth_fx[], /* i/o: synthesis @output Fs */ Word32 hb_synth_fx[], /* i/o: hb synthesis */ - const int16_t output_frame /* i : frame length */ + const Word16 output_frame /* i : frame length */ ); void stereo_mdct2dft_update( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ @@ -3831,7 +3831,7 @@ void deindex_sph_idx( float *phi /* o : Azimuth */ ); void deindex_sph_idx_fx( - const uint16_t sphIndex, /* i : Spherical index */ + const UWord16 sphIndex, /* i : Spherical index */ const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */ Word32 *theta_fx, /* o : Elevation */ Word32 *phi_fx /* o : Azimuth */ @@ -4757,7 +4757,7 @@ void ivas_param_mc_dec_digest_tc( void ivas_param_mc_dec_digest_tc_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + const UWord8 nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ Word32 *transport_channels_f_fx[], Word16 transport_f_e ); @@ -5224,11 +5224,19 @@ ivas_error ivas_spar_dec_open( const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ ); +#ifndef IVAS_FLOAT_FIXED void ivas_spar_dec_close( SPAR_DEC_HANDLE *hSpar, /* i/o: SPAR decoder handle */ const int32_t output_Fs, /* i : output sampling rate */ const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ ); +#else +void ivas_spar_dec_close_fx( + SPAR_DEC_HANDLE *hSpar, /* i/o: SPAR decoder handle */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ +); +#endif ivas_error ivas_spar_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ @@ -5691,18 +5699,18 @@ void ivas_get_spar_md_from_dirac_fx( Word32 azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], Word32 ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], Word32 diffuseness[IVAS_MAX_NUM_BANDS], - const int16_t n_ts, + const Word16 n_ts, Word32 ***mixer_mat, ivas_spar_md_t *hSpar_md, ivas_spar_md_com_cfg *hSpar_md_cfg, - const int16_t start_band, - const int16_t end_band, - const int16_t order, - const int16_t dtx_vad, + const Word16 start_band, + const Word16 end_band, + const Word16 order, + const Word16 dtx_vad, Word32 Wscale_d[IVAS_MAX_NUM_BANDS], - const uint8_t useLowerRes, - const int16_t active_w_vlbr, - const int16_t dyn_active_w_flag + const UWord8 useLowerRes, + const Word16 active_w_vlbr, + const Word16 dyn_active_w_flag ); #endif void ivas_get_spar_md_from_dirac( @@ -5765,10 +5773,10 @@ void ivas_spar_md_dec_close( void ivas_spar_get_parameters_fx( SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ - const int16_t ts, /* i : time slot index */ - const int16_t num_ch_out, /* i : number of channels out */ - const int16_t num_ch_in, /* i : number of channels in */ - const int16_t num_spar_bands, /* i : number of SPAR bands */ + const Word16 ts, /* i : time slot index */ + const Word16 num_ch_out, /* i : number of channels out */ + const Word16 num_ch_in, /* i : number of channels in */ + const Word16 num_spar_bands, /* i : number of SPAR bands */ Word32 par_mat_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS] /* o : mixing matrix */ ); void ivas_spar_get_parameters( @@ -5806,10 +5814,10 @@ void ivas_spar_to_dirac( void ivas_spar_to_dirac_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const int16_t dtx_vad, /* i : DTX frame flag */ - const int16_t num_bands_out, /* i : number of output bands */ - const int16_t bw, /* i : band joining factor */ - const int16_t dyn_active_w_flag /* i : dynamic active W flag */ + const Word16 dtx_vad, /* i : DTX frame flag */ + const Word16 num_bands_out, /* i : number of output bands */ + const Word16 bw, /* i : band joining factor */ + const Word16 dyn_active_w_flag /* i : dynamic active W flag */ ); void ivas_spar_update_md_hist( ivas_spar_md_dec_state_t *hMdDec /* i/o: SPAR MD decoder handle */ @@ -6289,12 +6297,12 @@ void ivas_quantise_real_values( ); void ivas_quantise_real_values_fx( const Word32 *values_fx, - const int16_t q_levels, + const Word16 q_levels, const Word32 min_value_fx, const Word32 max_value_fx, - int16_t *index, + Word16 *index, Word32 *quant_fx, - const int16_t dim); + const Word16 dim); void ivas_spar_get_uniform_quant_strat( ivas_spar_md_com_cfg *pSpar_md_com_cfg, diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 56709404a..14d5b40cf 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -2100,9 +2100,9 @@ void td_bwe_dec_init_ivas_fx( ); void ivas_dirac_dec_render_sf_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output_fx[], /* i/o: synthesized core-coder transport channels/DirAC output */ - const int16_t nchan_transport, /* i : number of transport channels */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word32 *output_fx[], /* i/o: synthesized core-coder transport channels/DirAC output */ + const Word16 nchan_transport, /* i : number of transport channels */ Word32 *pppQMfFrame_ts_re_fx[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], Word32 *pppQMfFrame_ts_im_fx[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] ); @@ -2116,15 +2116,15 @@ void ivas_dirac_dec_render_fx( ); void ivas_dirac_dec_read_BS_fx( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ Decoder_State *st, /* i/o: decoder Core state structure */ DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial rendering data handle */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q metadata */ - int16_t *nb_bits, /* o : number of bits read */ - const int16_t last_bit_pos, /* i : last read bitstream position */ - const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + Word16 *nb_bits, /* o : number of bits read */ + const Word16 last_bit_pos, /* i : last read bitstream position */ + const Word16 hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + Word16 *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); ivas_error ivas_dirac_dec_config_fx( @@ -2166,23 +2166,23 @@ ivas_error ivas_ism_metadata_dec_create_fx( Word32 element_brate_tmp[] /* o : element bitrate per object */ ); ivas_error ivas_sba_dec_reconfigure_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - uint16_t *nSamplesFlushed, /* o : number of samples flushed */ - int16_t *data /* o : output synthesis signal */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + UWord16 *nSamplesFlushed, /* o : number of samples flushed */ + Word16 *data /* o : output synthesis signal */ ); ivas_error ivas_spar_md_dec_matrix_open_fx( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const int16_t num_channels, /* i : number of internal channels */ - const int16_t num_md_sub_frames /* i : number of MD subframes */ + const Word16 num_channels, /* i : number of internal channels */ + const Word16 num_md_sub_frames /* i : number of MD subframes */ ); void ivas_spar_md_dec_matrix_close_fx( ivas_spar_md_dec_state_t *hMdDecoder, /* i/o: SPAR MD decoder handle */ - const int16_t num_channels /* i : number of internal channels */ + const Word16 num_channels /* i : number of internal channels */ ); ivas_error ivas_spar_dec_open_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ ); void ivas_param_mc_dec_read_BS_fx( @@ -2226,8 +2226,8 @@ ivas_error ivas_FB_mixer_open_fx( void ivas_FB_mixer_close_fx( IVAS_FB_MIXER_HANDLE *hFbMixer_in, /* i/o: FB mixer handle */ - const int32_t sampling_rate, /* i : sampling rate in Hz */ - const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ + const Word32 sampling_rate, /* i : sampling rate in Hz */ + const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ ); void ivas_fb_mixer_cross_fading_fx( @@ -2235,9 +2235,9 @@ void ivas_fb_mixer_cross_fading_fx( Word32 **ppOut_pcm_fx, Word32 *pMdft_out_old_fx, Word32 *pMdft_out_new_fx, - const int16_t ch, - const int16_t frame_len, - const int16_t cf_offset ); + const Word16 ch, + const Word16 frame_len, + const Word16 cf_offset ); // ivas_omasa_dec.c ivas_error ivas_omasa_dirac_td_binaural_jbm_fx( diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index 39de3240e..0e24db967 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -182,7 +182,9 @@ UWord32 ivas_syn_output_fx( { Word16 i, n; Word16 synth_loc[MAX_JBM_L_FRAME48k]; + UWord32 tmp; UWord32 noClipping = 0; + move32(); /*-----------------------------------------------------------------* * float to integer conversion with saturation control @@ -190,11 +192,13 @@ UWord32 ivas_syn_output_fx( FOR( n = 0; n < n_channels; n++ ) { - noClipping += mvl2s_r( synth[n], q_synth, synth_loc, output_frame ); + tmp = mvl2s_r( synth[n], q_synth, synth_loc, output_frame ); + noClipping = UL_addNsD( noClipping, tmp ); FOR( i = 0; i < output_frame; i++ ) { - synth_out[i * n_channels + n] = synth_loc[i]; + synth_out[L_add( imult1616( i, n_channels ), n )] = synth_loc[i]; + move16(); } } @@ -253,7 +257,8 @@ void ivas_syn_output_f_fx( { FOR( i = 0; i < output_frame; i++ ) { - synth_out[i * n_channels + n] = synth[n][i]; + synth_out[L_add( imult1616( i, n_channels ), n )] = synth[n][i]; + move16(); } } @@ -289,25 +294,29 @@ void mvr2r_inc_fixed_one( IF( y_fx < x_fx ) { ix = 0; + move16(); iy = 0; + move16(); FOR( i = 0; i < n; i++ ) { y_fx[iy] = x_fx[ix]; + move32(); - ix += x_inc; - iy += y_inc; + ix = add( ix, x_inc ); + iy = add( iy, y_inc ); } } ELSE { - ix = ( n - 1 ) * x_inc; - iy = ( n - 1 ) * y_inc; - FOR( i = n - 1; i >= 0; i-- ) + ix = imult1616( sub( n, 1 ), x_inc ); + iy = imult1616( sub( n, 1 ), y_inc ); + FOR( i = sub( n, 1 ); i >= 0; i-- ) { y_fx[iy] = x_fx[ix]; + move32(); - ix -= x_inc; - iy -= y_inc; + ix = sub( ix, x_inc ); + iy = sub( iy, y_inc ); } } @@ -351,7 +360,7 @@ void mvr2r_inc_fixed( { ix = i_mult( sub( n, 1 ), x_inc ); iy = i_mult( sub( n, 1 ), y_inc ); - FOR( i = n - 1; i >= 0; i-- ) + FOR( i = sub( n, 1 ); i >= 0; i-- ) { y_fx[iy] = x_fx[ix]; move32(); @@ -457,12 +466,16 @@ void v_add_inc_fx( Word16 ix1 = 0; Word16 ix2 = 0; Word16 iy = 0; + move16(); + move16(); + move16(); FOR( i = 0; i < N; i++ ) { y[iy] = L_add( x1[ix1], x2[ix2] ); - ix1 += x_inc; - ix2 += x2_inc; - iy += y_inc; + move32(); + ix1 = add( ix1, x_inc ); + ix2 = add( ix2, x2_inc ); + iy = add( iy, y_inc ); } return; } @@ -493,10 +506,16 @@ void v_mult_inc_fx( Word16 ix2 = 0; Word16 iy = 0; + move16(); + move16(); + move16(); + FOR( i = 0; i < N; i++ ) { y_fx[iy] = Mpy_32_32( x1_fx[ix1], x2_fx[ix2] ); + move32(); y_q_fx[iy] = sub( add( x1_q_fx[ix1], x2_q_fx[ix2] ), 31 ); + move16(); ix1 = add( ix1, x1_inc ); ix2 = add( ix2, x2_inc ); @@ -522,9 +541,14 @@ void v_mult_inc_fixed( Word16 ix2 = 0; Word16 iy = 0; + move16(); + move16(); + move16(); + FOR( i = 0; i < N; i++ ) { y_fx[iy] = Mpy_32_32( x1_fx[ix1], x2_fx[ix2] ); + move32(); ix1 = add( ix1, x1_inc ); ix2 = add( ix2, x2_inc ); @@ -556,44 +580,6 @@ void v_mult_inc( int16_t ix2 = 0; int16_t iy = 0; -#ifdef IVAS_FLOAT_FIXED - ///////////////// to be removed //////////////////////////////// - Word32 x1_fx[2 * MAX_OUTPUT_CHANNELS * CLDFB_NO_CHANNELS_MAX]; - Word32 x2_fx[2 * MAX_OUTPUT_CHANNELS * CLDFB_NO_CHANNELS_MAX]; - Word32 y_fx[2 * MAX_OUTPUT_CHANNELS * CLDFB_NO_CHANNELS_MAX]; - Word16 y_q_fx[2 * MAX_OUTPUT_CHANNELS * CLDFB_NO_CHANNELS_MAX]; - Word16 x1_q_fx[2 * MAX_OUTPUT_CHANNELS * CLDFB_NO_CHANNELS_MAX]; - Word16 x2_q_fx[2 * MAX_OUTPUT_CHANNELS * CLDFB_NO_CHANNELS_MAX]; - FOR( i = 0; i < N; i++ ) - { - x1_q_fx[ix1] = Q_factor_L( x1[ix1] ); - x1_fx[ix1] = (Word32) ( x1[ix1] * ( W_shl( 1, x1_q_fx[ix1] ) ) ); - x2_q_fx[ix2] = Q_factor_L( x2[ix2] ); - x2_fx[ix2] = (Word32) ( x2[ix2] * ( W_shl( 1, x2_q_fx[ix2] ) ) ); - ix1 = add( ix1, x1_inc ); - ix2 = add( ix2, x2_inc ); - iy = add( iy, y_inc ); - } - //////////////////////////////////////////////////////////////////// - - v_mult_inc_fx( x1_fx, x1_q_fx, x1_inc, x2_fx, x2_q_fx, x2_inc, y_fx, y_q_fx, y_inc, N ); - - /////////////////////// to be removed /////////////////////////////// - iy = 0; - FOR( i = 0; i < N; i++ ) - { - IF( LT_16( y_q_fx[iy], 0 ) ) - { - y[iy] = (Float32) y_fx[iy] * ( W_shl( 1, ( -y_q_fx[iy] ) ) ); - } - ELSE - { - y[iy] = (Float32) y_fx[iy] / ( W_shl( 1, y_q_fx[iy] ) ); - } - iy = add( iy, y_inc ); - } - /////////////////////////////////////////////////////////////////////// -#else for ( i = 0; i < N; i++ ) { y[iy] = x1[ix1] * x2[ix2]; @@ -601,7 +587,7 @@ void v_mult_inc( ix2 += x2_inc; iy += y_inc; } -#endif + return; } @@ -624,6 +610,7 @@ void v_addc_fx( FOR( i = 0; i < N; i++ ) { y_fx[i] = L_add( c_fx, x_fx[i] ); + move32(); } return; @@ -647,6 +634,7 @@ void v_addc_fixed( FOR( i = 0; i < N; i++ ) { y[i] = L_add( c, x[i] ); + move32(); } return; @@ -662,32 +650,11 @@ void v_addc( { int16_t i; -#ifdef IVAS_FLOAT_FIXED - Word32 x_fx[CLDFB_NO_CHANNELS_MAX]; - Word32 y_fx[CLDFB_NO_CHANNELS_MAX]; - const Word32 c_fx = (Word32) ( c * L_shl( 1, 29 ) ); - - //////////////////////////// to be removed ////////////////////// - FOR( i = 0; i < N; i++ ) - { - x_fx[i] = (Word32) ( x[i] * L_shl( 1, 29 ) ); - } - ///////////////////////////////////////////////////////////////// - - v_addc_fx( (const Word32 *) x_fx, c_fx, y_fx, N ); - - ///////////////////////////// to be removed ////////////////////// - FOR( i = 0; i < N; i++ ) - { - y[i] = (Float32) y_fx[i] / L_shl( 1, 29 ); - } - /////////////////////////////////////////////////////////////////// -#else for ( i = 0; i < N; i++ ) { y[i] = c + x[i]; } -#endif + return; } @@ -717,12 +684,16 @@ void v_min_fx( IF( LT_32( L_shr( x1_fx[i], sub( x1_q_fx[i], x2_q_fx[i] ) ), x2_fx[i] ) ) { y_fx[i] = x1_fx[i]; + move32(); y_q_fx[i] = x1_q_fx[i]; + move16(); } ELSE { y_fx[i] = x2_fx[i]; + move32(); y_q_fx[i] = x2_q_fx[i]; + move16(); } } ELSE @@ -730,12 +701,16 @@ void v_min_fx( IF( LT_32( x1_fx[i], L_shr( x2_fx[i], sub( x2_q_fx[i], x1_q_fx[i] ) ) ) ) { y_fx[i] = x1_fx[i]; + move32(); y_q_fx[i] = x1_q_fx[i]; + move16(); } ELSE { y_fx[i] = x2_fx[i]; + move32(); y_q_fx[i] = x2_q_fx[i]; + move16(); } } } @@ -758,37 +733,11 @@ void v_min( { int16_t i; -#ifdef IVAS_FLOAT_FIXED - //////////////////////// to be removed /////////////////////////////// - Word32 x1_fx[MASA_FREQUENCY_BANDS]; - Word32 x2_fx[MASA_FREQUENCY_BANDS]; - Word32 y_fx[MASA_FREQUENCY_BANDS]; - Word16 x1_q_fx[MASA_FREQUENCY_BANDS]; - Word16 x2_q_fx[MASA_FREQUENCY_BANDS]; - Word16 y_q_fx[MASA_FREQUENCY_BANDS]; - FOR( i = 0; i < N; i++ ) - { - x1_q_fx[i] = Q_factor_L( x1[i] ); - x1_fx[i] = (Word32) ( x1[i] * ( W_shl( 1, x1_q_fx[i] ) ) ); - x2_q_fx[i] = Q_factor_L( x2[i] ); - x2_fx[i] = (Word32) ( x2[i] * ( W_shl( 1, x2_q_fx[i] ) ) ); - } - ///////////////////////////////////////////////////////////////////////// - - v_min_fx( (const Word32 *) x1_fx, x1_q_fx, (const Word32 *) x2_fx, x2_q_fx, y_fx, y_q_fx, N ); - - //////////////////////// to be removed //////////////////////////////// - FOR( i = 0; i < N; i++ ) - { - y[i] = (Float32) y_fx[i] / ( W_shl( 1, y_q_fx[i] ) ); - } - /////////////////////////////////////////////////////////////////////// -#else for ( i = 0; i < N; i++ ) { y[i] = ( x1[i] < x2[i] ) ? x1[i] : x2[i]; } -#endif + return; } @@ -811,6 +760,7 @@ void v_sqrt_fx( FOR( i = 0; i < N; i++ ) { y[i] = Sqrt32( x[i], &exp[i] ); + move32(); } return; @@ -853,6 +803,7 @@ void v_sub_s16_fx( FOR( i = 0; LT_16( i, N ); i++ ) { y[i] = sub( x1[i], x2[i] ); + move16(); } return; @@ -981,7 +932,9 @@ void v_mult_mat_fx( { pt_x_fx = x_fx; *pt_y_fx = 0; + move32(); y_q_fx[i] = 0; + move32(); FOR( j = 0; j < Nr; j++ ) { temp = Mpy_32_32( *pt_x_fx++, *pt_A_fx++ ); @@ -989,18 +942,23 @@ void v_mult_mat_fx( IF( EQ_16( j, 0 ) ) { *pt_y_fx = temp; + move32(); y_q_fx[i] = temp_q; + move16(); } ELSE { IF( GT_16( y_q_fx[i], temp_q ) ) { *pt_y_fx = L_add( L_shr( *pt_y_fx, sub( y_q_fx[i], temp_q ) ), temp ); + move32(); y_q_fx[i] = temp_q; + move16(); } ELSE { *pt_y_fx = L_add( *pt_y_fx, L_shr( temp, sub( temp_q, y_q_fx[i] ) ) ); + move32(); } } } @@ -1030,55 +988,6 @@ void v_mult_mat( { int16_t i, j; -#ifdef IVAS_FLOAT_FIXED - //////////////////// to be removed ////////////////////// - Word32 y_fx[NB_MEL_BANDS]; - Word32 x_fx[NB_MEL_BANDS]; - Word32 A_fx[NB_MEL_BANDS * NB_MEL_COEF]; - Word16 y_q_fx[NB_MEL_BANDS]; - Word16 x_q_fx[NB_MEL_BANDS]; - Word16 A_q_fx[NB_MEL_BANDS * NB_MEL_COEF]; - Word32 *pt_x_fx, *pt_A_fx; - const Float32 *pt_x, *pt_A; - Word16 *pt_x_q_fx, *pt_A_q_fx; - - pt_A_fx = A_fx; - pt_A_q_fx = A_q_fx; - pt_A = A; - - FOR( i = 0; i < Nc; i++ ) - { - pt_x = x; - pt_x_fx = x_fx; - pt_x_q_fx = x_q_fx; - FOR( j = 0; j < Nr; j++ ) - { - IF( EQ_16( i, 0 ) ) - { - *pt_x_q_fx = sub( Q_factor_L( *pt_x ), 3 ); - *pt_x_fx++ = (Word32) ( *pt_x++ * ( W_shl( 1, *pt_x_q_fx++ ) ) ); - } - *pt_A_q_fx = sub( Q_factor_L( *pt_A ), 3 ); - *pt_A_fx++ = (Word32) ( *pt_A++ * ( W_shl( 1, *pt_A_q_fx++ ) ) ); - } - } - - v_mult_mat_fx( y_fx, y_q_fx, (const Word32 *) x_fx, x_q_fx, (const Word32 *) A_fx, A_q_fx, Nr, Nc ); - - ////////////////////////////// to be removed //////////////////////// - FOR( i = 0; i < Nc; i++ ) - { - IF( LT_16( y_q_fx[i], 0 ) ) - { - y[i] = (Float32) y_fx[i] * W_shl( 1, -y_q_fx[i] ); - } - ELSE - { - y[i] = (Float32) y_fx[i] / W_shl( 1, y_q_fx[i] ); - } - } - //////////////////////////////////////////////////////////////////// -#else const float *pt_x, *pt_A; float tmp_y[MAX_V_MULT_MAT]; float *pt_y; @@ -1098,7 +1007,7 @@ void v_mult_mat( } mvr2r( tmp_y, y, Nc ); -#endif + return; } @@ -1380,12 +1289,13 @@ Word16 matrix_product_mant_exp_fx( Word16 out_e[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; Word16 *Zp_fx_e = out_e; Word16 row, col; + Word16 x_idx, y_idx; /* Processing */ test(); test(); test(); - IF( EQ_16( transpX, 1 ) && EQ_16( transpY, 0 ) ) /* We use X transpose */ + IF( EQ_16( transpX, 1 ) && transpY == 0 ) /* We use X transpose */ { IF( NE_16( rowsX, rowsY ) ) { @@ -1401,16 +1311,21 @@ Word16 matrix_product_mant_exp_fx( move16(); FOR( k = 0; k < rowsX; ++k ) { - ( *Zp_fx ) = BASOP_Util_Add_Mant32Exp( *Zp_fx, *Zp_fx_e, Mpy_32_32( X_fx[k + i * rowsX], Y_fx[k + j * rowsY] ), add( X_fx_e, Y_fx_e ), Zp_fx_e ); + x_idx = add( k, imult1616( i, rowsX ) ); + y_idx = add( k, imult1616( j, rowsY ) ); + ( *Zp_fx ) = BASOP_Util_Add_Mant32Exp( *Zp_fx, *Zp_fx_e, Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ), add( X_fx_e, Y_fx_e ), Zp_fx_e ); + move32(); } Zp_fx++; Zp_fx_e++; } } row = colsY; + move16(); col = colsX; + move16(); } - ELSE IF( EQ_16( transpX, 0 ) && EQ_16( transpY, 1 ) ) /* We use Y transpose */ + ELSE IF( transpX == 0 && EQ_16( transpY, 1 ) ) /* We use Y transpose */ { IF( NE_16( colsX, colsY ) ) { @@ -1426,14 +1341,19 @@ Word16 matrix_product_mant_exp_fx( move16(); FOR( k = 0; k < colsX; ++k ) { - ( *Zp_fx ) = BASOP_Util_Add_Mant32Exp( *Zp_fx, *Zp_fx_e, Mpy_32_32( X_fx[i + k * rowsX], Y_fx[j + k * rowsY] ), add( X_fx_e, Y_fx_e ), Zp_fx_e ); + x_idx = add( i, imult1616( k, rowsX ) ); + y_idx = add( j, imult1616( k, rowsY ) ); + ( *Zp_fx ) = BASOP_Util_Add_Mant32Exp( *Zp_fx, *Zp_fx_e, Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ), add( X_fx_e, Y_fx_e ), Zp_fx_e ); + move32(); } Zp_fx++; Zp_fx_e++; } } row = rowsY; + move16(); col = rowsX; + move16(); } ELSE IF( EQ_16( transpX, 1 ) && EQ_16( transpY, 1 ) ) /* We use both transpose */ { @@ -1451,7 +1371,10 @@ Word16 matrix_product_mant_exp_fx( move16(); FOR( k = 0; k < colsX; ++k ) { - ( *Zp_fx ) = BASOP_Util_Add_Mant32Exp( *Zp_fx, *Zp_fx_e, Mpy_32_32( X_fx[k + i * rowsX], Y_fx[j + k * rowsY] ), add( X_fx_e, Y_fx_e ), Zp_fx_e ); + x_idx = add( k, imult1616( i, rowsX ) ); + y_idx = add( j, imult1616( k, rowsY ) ); + ( *Zp_fx ) = BASOP_Util_Add_Mant32Exp( *Zp_fx, *Zp_fx_e, Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ), add( X_fx_e, Y_fx_e ), Zp_fx_e ); + move32(); } Zp_fx++; @@ -1459,7 +1382,9 @@ Word16 matrix_product_mant_exp_fx( } } row = rowsY; + move16(); col = colsX; + move16(); } ELSE /* Regular case */ { @@ -1478,18 +1403,24 @@ Word16 matrix_product_mant_exp_fx( move16(); FOR( k = 0; k < colsX; ++k ) { - ( *Zp_fx ) = BASOP_Util_Add_Mant32Exp( *Zp_fx, *Zp_fx_e, Mpy_32_32( X_fx[i + k * rowsX], Y_fx[k + j * rowsY] ), add( X_fx_e, Y_fx_e ), Zp_fx_e ); + x_idx = add( i, imult1616( k, rowsX ) ); + y_idx = add( k, imult1616( j, rowsY ) ); + ( *Zp_fx ) = BASOP_Util_Add_Mant32Exp( *Zp_fx, *Zp_fx_e, Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ), add( X_fx_e, Y_fx_e ), Zp_fx_e ); + move32(); } Zp_fx++; Zp_fx_e++; } } row = colsY; + move16(); col = rowsX; + move16(); } Zp_fx = Z_fx; Zp_fx_e = out_e; Word16 max_exp = -31; + move16(); FOR( j = 0; j < row; ++j ) { FOR( i = 0; i < col; ++i ) @@ -1500,11 +1431,13 @@ Word16 matrix_product_mant_exp_fx( } Zp_fx_e = out_e; *Z_fx_e = max_exp; + move16(); FOR( j = 0; j < row; ++j ) { FOR( i = 0; i < col; ++i ) { *Zp_fx = L_shr_r( *Zp_fx, sub( *Z_fx_e, *Zp_fx_e ) ); + move32(); Zp_fx++; Zp_fx_e++; } @@ -1526,13 +1459,14 @@ Word16 matrix_product_fx( ) { Word16 i, j, k; + Word16 x_idx, y_idx; Word32 *Zp_fx = Z_fx; /* Processing */ test(); test(); test(); - IF( EQ_16( transpX, 1 ) && EQ_16( transpY, 0 ) ) /* We use X transpose */ + IF( EQ_16( transpX, 1 ) && transpY == 0 ) /* We use X transpose */ { IF( NE_16( rowsX, rowsY ) ) { @@ -1546,13 +1480,16 @@ Word16 matrix_product_fx( move32(); FOR( k = 0; k < rowsX; ++k ) { - ( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[k + i * rowsX], Y_fx[k + j * rowsY] ) ); + x_idx = add( k, imult1616( i, rowsX ) ); + y_idx = add( k, imult1616( j, rowsY ) ); + ( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); + move32(); } Zp_fx++; } } } - ELSE IF( EQ_16( transpX, 0 ) && EQ_16( transpY, 1 ) ) /* We use Y transpose */ + ELSE IF( transpX == 0 && EQ_16( transpY, 1 ) ) /* We use Y transpose */ { IF( NE_16( colsX, colsY ) ) { @@ -1566,7 +1503,10 @@ Word16 matrix_product_fx( move32(); FOR( k = 0; k < colsX; ++k ) { - ( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[i + k * rowsX], Y_fx[j + k * rowsY] ) ); + x_idx = add( i, imult1616( k, rowsX ) ); + y_idx = add( j, imult1616( k, rowsY ) ); + ( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); + move32(); } Zp_fx++; } @@ -1586,7 +1526,10 @@ Word16 matrix_product_fx( move32(); FOR( k = 0; k < colsX; ++k ) { - ( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[k + i * rowsX], Y_fx[j + k * rowsY] ) ); + x_idx = add( k, imult1616( i, rowsX ) ); + y_idx = add( j, imult1616( k, rowsY ) ); + ( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); + move32(); } Zp_fx++; @@ -1608,7 +1551,10 @@ Word16 matrix_product_fx( move32(); FOR( k = 0; k < colsX; ++k ) { - ( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[i + k * rowsX], Y_fx[k + j * rowsY] ) ); + x_idx = add( i, imult1616( k, rowsX ) ); + y_idx = add( k, imult1616( j, rowsY ) ); + ( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); + move32(); } Zp_fx++; } @@ -1631,6 +1577,7 @@ Word16 matrix_product_q30_fx( ) { Word16 i, j, k; + Word16 x_idx, y_idx; Word32 *Zp_fx = Z_fx; Word64 W_tmp; @@ -1638,7 +1585,7 @@ Word16 matrix_product_q30_fx( test(); test(); test(); - IF( EQ_16( transpX, 1 ) && EQ_16( transpY, 0 ) ) /* We use X transpose */ + IF( EQ_16( transpX, 1 ) && transpY == 0 ) /* We use X transpose */ { IF( NE_16( rowsX, rowsY ) ) { @@ -1654,15 +1601,18 @@ Word16 matrix_product_q30_fx( FOR( k = 0; k < rowsX; ++k ) { //( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[k + i * rowsX], Y_fx[k + j * rowsY] ) ); - W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[k + i * rowsX], Y_fx[k + j * rowsY] ) ); // Q56 + x_idx = add( k, imult1616( i, rowsX ) ); + y_idx = add( k, imult1616( j, rowsY ) ); + W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); // Q56 } W_tmp = W_shl( W_tmp, 6 ); ( *Zp_fx ) = L_sub( W_round64_L( W_tmp ), 64 ); // adjusting for precision + move32(); Zp_fx++; } } } - ELSE IF( EQ_16( transpX, 0 ) && EQ_16( transpY, 1 ) ) /* We use Y transpose */ + ELSE IF( transpX == 0 && EQ_16( transpY, 1 ) ) /* We use Y transpose */ { IF( NE_16( colsX, colsY ) ) { @@ -1678,10 +1628,13 @@ Word16 matrix_product_q30_fx( FOR( k = 0; k < colsX; ++k ) { //( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[i + k * rowsX], Y_fx[j + k * rowsY] ) ); - W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[i + k * rowsX], Y_fx[j + k * rowsY] ) ); // Q56 + x_idx = add( i, imult1616( k, rowsX ) ); + y_idx = add( j, imult1616( k, rowsY ) ); + W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); // Q56 } W_tmp = W_shl( W_tmp, 6 ); ( *Zp_fx ) = L_sub( W_round64_L( W_tmp ), 64 ); // adjusting for precision + move32(); Zp_fx++; } } @@ -1702,11 +1655,14 @@ Word16 matrix_product_q30_fx( FOR( k = 0; k < colsX; ++k ) { //( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[k + i * rowsX], Y_fx[j + k * rowsY] ) ); + x_idx = add( k, imult1616( i, rowsX ) ); + y_idx = add( j, imult1616( k, rowsY ) ); W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[k + i * rowsX], Y_fx[j + k * rowsY] ) ); // Q56 } W_tmp = W_shl( W_tmp, 6 ); ( *Zp_fx ) = L_sub( W_round64_L( W_tmp ), 64 ); // adjusting for precision + move32(); Zp_fx++; } } @@ -1728,10 +1684,13 @@ Word16 matrix_product_q30_fx( FOR( k = 0; k < colsX; ++k ) { //( *Zp_fx ) = L_add( *Zp_fx, Mpy_32_32( X_fx[i + k * rowsX], Y_fx[k + j * rowsY] ) ); - W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[i + k * rowsX], Y_fx[k + j * rowsY] ) ); // Q56 + x_idx = add( i, imult1616( k, rowsX ) ); + y_idx = add( k, imult1616( j, rowsY ) ); + W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); // Q56 } W_tmp = W_shl( W_tmp, 6 ); ( *Zp_fx ) = L_sub( W_round64_L( W_tmp ), 64 ); // adjusting for precision + move32(); Zp_fx++; } } @@ -1760,12 +1719,13 @@ Word16 matrix_product_mant_exp( Word16 *Zp_e = Z_e; Word32 L_tmp; Word16 tmp_e; + Word16 x_idx, y_idx; /* Processing */ test(); test(); test(); - IF( EQ_16( transpX, 1 ) && EQ_16( transpY, 0 ) ) /* We use X transpose */ + IF( EQ_16( transpX, 1 ) && transpY == 0 ) /* We use X transpose */ { IF( NE_16( rowsX, rowsY ) ) { @@ -1781,11 +1741,14 @@ Word16 matrix_product_mant_exp( move16(); FOR( k = 0; k < rowsX; ++k ) { + x_idx = add( k, imult1616( i, rowsX ) ); + y_idx = add( k, imult1616( j, rowsY ) ); //( *Zp ) += X[k + i * rowsX] * Y[k + j * rowsY]; - L_tmp = Mpy_32_32( X_fx[k + i * rowsX], Y_fx[k + j * rowsY] ); - tmp_e = add( X_e[k + i * rowsX], Y_e[k + j * rowsY] ); + L_tmp = Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ); + tmp_e = add( X_e[x_idx], Y_e[y_idx] ); ( *Zp ) = BASOP_Util_Add_Mant32Exp( *Zp, *Zp_e, L_tmp, tmp_e, &tmp_e ); + move32(); ( *Zp_e ) = tmp_e; move16(); } @@ -1794,7 +1757,7 @@ Word16 matrix_product_mant_exp( } } } - ELSE IF( EQ_16( transpX, 0 ) && EQ_16( transpY, 1 ) ) /* We use Y transpose */ + ELSE IF( transpX == 0 && EQ_16( transpY, 1 ) ) /* We use Y transpose */ { IF( NE_16( colsX, colsY ) ) { @@ -1810,9 +1773,11 @@ Word16 matrix_product_mant_exp( move16(); FOR( k = 0; k < colsX; ++k ) { + x_idx = add( i, imult1616( k, rowsX ) ); + y_idx = add( j, imult1616( k, rowsY ) ); //( *Zp ) += X_fx[i + k * rowsX] * Y_fx[j + k * rowsY]; - L_tmp = Mpy_32_32( X_fx[i + k * rowsX], Y_fx[j + k * rowsY] ); - tmp_e = add( X_e[i + k * rowsX], Y_e[j + k * rowsY] ); + L_tmp = Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ); + tmp_e = add( X_e[x_idx], Y_e[y_idx] ); ( *Zp ) = BASOP_Util_Add_Mant32Exp( *Zp, *Zp_e, L_tmp, tmp_e, &tmp_e ); ( *Zp_e ) = tmp_e; @@ -1839,11 +1804,14 @@ Word16 matrix_product_mant_exp( move16(); FOR( k = 0; k < colsX; ++k ) { + x_idx = add( k, imult1616( i, rowsX ) ); + y_idx = add( j, imult1616( k, rowsY ) ); //( *Zp ) += X_fx[k + i * rowsX] * Y_fx[j + k * rowsY]; - L_tmp = Mpy_32_32( X_fx[k + i * rowsX], Y_fx[j + k * rowsY] ); - tmp_e = add( X_e[k + i * rowsX], Y_e[j + k * rowsY] ); + L_tmp = Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ); + tmp_e = add( X_e[x_idx], Y_e[y_idx] ); ( *Zp ) = BASOP_Util_Add_Mant32Exp( *Zp, *Zp_e, L_tmp, tmp_e, &tmp_e ); + move32(); ( *Zp_e ) = tmp_e; move16(); } @@ -1870,11 +1838,14 @@ Word16 matrix_product_mant_exp( move16(); FOR( k = 0; k < colsX; ++k ) { + x_idx = add( i, imult1616( k, rowsX ) ); + y_idx = add( k, imult1616( j, rowsY ) ); //( *Zp ) += X_fx[i + k * rowsX] * Y_fx[k + j * rowsY]; - L_tmp = Mpy_32_32( X_fx[i + k * rowsX], Y_fx[k + j * rowsY] ); - tmp_e = add( X_e[i + k * rowsX], Y_e[k + j * rowsY] ); + L_tmp = Mpy_32_32( X_fx[x_idx], Y_fx[y_idx] ); + tmp_e = add( X_e[x_idx], Y_e[y_idx] ); ( *Zp ) = BASOP_Util_Add_Mant32Exp( *Zp, *Zp_e, L_tmp, tmp_e, &tmp_e ); + move32(); ( *Zp_e ) = tmp_e; move16(); } @@ -1959,6 +1930,7 @@ Word16 matrix_diag_product_fx( { Word16 i, j; Word32 *Zp = Z; + Word16 tmp; /* Processing */ IF( EQ_16( transpX, 1 ) ) /* We use X transpose */ @@ -1971,7 +1943,9 @@ Word16 matrix_diag_product_fx( { FOR( i = 0; i < colsX; ++i ) { - *( Zp ) = Mpy_32_32( X[j + i * rowsX], Y[j] ); + tmp = add( j, imult1616( i, rowsX ) ); + *( Zp ) = Mpy_32_32( X[tmp], Y[j] ); + move32(); Zp++; } } @@ -1988,6 +1962,7 @@ Word16 matrix_diag_product_fx( FOR( i = 0; i < rowsX; ++i ) { *( Zp ) = Mpy_32_32( *( X ), Y[j] ); + move32(); Zp++; X++; } @@ -1995,6 +1970,7 @@ Word16 matrix_diag_product_fx( } *Z_e = add( X_e, Y_e ); + move16(); return EXIT_SUCCESS; } @@ -2015,6 +1991,7 @@ Word16 diag_matrix_product_fx( { Word16 i, j; Word32 *Zp = Z; + Word16 tmp; /* Processing */ IF( EQ_16( transpX, 1 ) ) /* We use X transpose */ @@ -2027,7 +2004,9 @@ Word16 diag_matrix_product_fx( { FOR( j = 0; j < entriesY; ++j ) { - *( Zp ) = Mpy_32_32( X[i + j * rowsX], Y[j] ); + tmp = add( i, imult1616( j, rowsX ) ); + *( Zp ) = Mpy_32_32( X[tmp], Y[j] ); + move32(); Zp++; } } @@ -2043,6 +2022,7 @@ Word16 diag_matrix_product_fx( FOR( j = 0; j < entriesY; ++j ) { *( Zp ) = Mpy_32_32( *( X ), Y[j] ); + move32(); Zp++; X++; } @@ -2050,6 +2030,7 @@ Word16 diag_matrix_product_fx( } *Z_e = add( Y_e, X_e ); + move16(); return EXIT_SUCCESS; } @@ -2126,12 +2107,13 @@ Word16 matrix_product_diag_fx( { Word16 j, k; Word32 *Zp = Z; + Word16 y_idx, x_idx; /* Processing */ test(); test(); test(); - IF( EQ_16( transpX, 1 ) && EQ_16( transpY, 0 ) ) /* We use X transpose */ + IF( EQ_16( transpX, 1 ) && transpY == 0 ) /* We use X transpose */ { IF( NE_16( rowsX, rowsY ) ) { @@ -2141,14 +2123,18 @@ Word16 matrix_product_diag_fx( FOR( j = 0; j < colsY; ++j ) { ( *Zp ) = 0; + move32(); FOR( k = 0; k < rowsX; ++k ) { - ( *Zp ) = L_add( ( *Zp ), Mpy_32_32( X[k + j * rowsX], Y[k + j * rowsY] ) ); + x_idx = add( k, imult1616( j, rowsX ) ); + y_idx = add( k, imult1616( j, rowsY ) ); + ( *Zp ) = L_add( ( *Zp ), Mpy_32_32( X[x_idx], Y[y_idx] ) ); + move32(); } Zp++; } } - ELSE IF( EQ_16( transpX, 0 ) && EQ_16( transpY, 1 ) ) /* We use Y transpose */ + ELSE IF( transpX == 0 && EQ_16( transpY, 1 ) ) /* We use Y transpose */ { IF( NE_16( colsX, colsY ) ) { @@ -2157,9 +2143,13 @@ Word16 matrix_product_diag_fx( FOR( j = 0; j < rowsY; ++j ) { ( *Zp ) = 0; + move32(); FOR( k = 0; k < colsX; ++k ) { - ( *Zp ) = L_add( ( *Zp ), Mpy_32_32( X[j + k * rowsX], Y[j + k * rowsY] ) ); + x_idx = add( j, imult1616( k, rowsX ) ); + y_idx = add( j, imult1616( k, rowsY ) ); + ( *Zp ) = L_add( ( *Zp ), Mpy_32_32( X[x_idx], Y[y_idx] ) ); + move32(); } Zp++; } @@ -2175,9 +2165,13 @@ Word16 matrix_product_diag_fx( { ( *Zp ) = 0; + move32(); FOR( k = 0; k < colsX; ++k ) { - ( *Zp ) = L_add( ( *Zp ), Mpy_32_32( X[k + j * rowsX], Y[j + k * rowsY] ) ); + x_idx = add( k, imult1616( j, rowsX ) ); + y_idx = add( j, imult1616( k, rowsY ) ); + ( *Zp ) = L_add( ( *Zp ), Mpy_32_32( X[x_idx], Y[y_idx] ) ); + move32(); } Zp++; @@ -2193,15 +2187,20 @@ Word16 matrix_product_diag_fx( FOR( j = 0; j < colsY; ++j ) { ( *Zp ) = 0; + move32(); FOR( k = 0; k < colsX; ++k ) { - ( *Zp ) = L_add( ( *Zp ), Mpy_32_32( X[j + k * rowsX], Y[k + j * rowsY] ) ); + x_idx = add( j, imult1616( k, rowsX ) ); + y_idx = add( k, imult1616( j, rowsY ) ); + ( *Zp ) = L_add( ( *Zp ), Mpy_32_32( X[x_idx], Y[y_idx] ) ); + move32(); } Zp++; } } *Z_e = add( X_e, Y_e ); + move16(); return EXIT_SUCCESS; } @@ -2317,6 +2316,7 @@ void cmplx_matrix_square_fx( Word16 i, j, k; Word32 *realZp, *imagZp; const Word32 *p_real1, *p_real2, *p_imag1, *p_imag2; + Word16 tmp1, tmp2; /* resulting matrix is hermitean, we only need to calc the upper triangle */ /* we assume transposition needed */ @@ -2326,12 +2326,12 @@ void cmplx_matrix_square_fx( { FOR( j = i; j < nCols; j++ ) { - p_real1 = realX + i * mRows; - p_imag1 = imagX + i * mRows; - p_real2 = realX + j * mRows; - p_imag2 = imagX + j * mRows; - realZp = realZ + ( i + nCols * j ); - imagZp = imagZ + ( i + nCols * j ); + p_real1 = realX + imult1616( i, mRows ); + p_imag1 = imagX + imult1616( i, mRows ); + p_real2 = realX + imult1616( j, mRows ); + p_imag2 = imagX + imult1616( j, mRows ); + realZp = realZ + add( i, imult1616( nCols, j ) ); + imagZp = imagZ + add( i, imult1616( nCols, j ) ); *( realZp ) = 0; move32(); *( imagZp ) = 0; @@ -2340,7 +2340,9 @@ void cmplx_matrix_square_fx( FOR( k = 0; k < mRows; k++ ) { *( imagZp ) = L_add( *( imagZp ), L_sub( Mpy_32_32( *( p_real1 ), *( p_imag2 ) ), Mpy_32_32( *( p_real2 ), *( p_imag1 ) ) ) ); + move32(); *( realZp ) = L_add( *( realZp ), L_add( Mpy_32_32( *( p_real1 ), *( p_real2 ) ), Mpy_32_32( *( p_imag1 ), *( p_imag2 ) ) ) ); + move32(); p_real1++; p_real2++; p_imag1++; @@ -2354,9 +2356,11 @@ void cmplx_matrix_square_fx( { FOR( j = 0; j < i; j++ ) { - realZ[i + nCols * j] = realZ[j + nCols * i]; + tmp1 = add( i, imult1616( nCols, j ) ); + tmp2 = add( j, imult1616( nCols, i ) ); + realZ[tmp1] = realZ[tmp2]; move32(); - imagZ[i + nCols * j] = imagZ[j + nCols * i]; + imagZ[tmp1] = imagZ[tmp2]; move32(); } } @@ -2463,6 +2467,7 @@ void v_multc_acc_32_16( FOR( i = 0; i < N; i++ ) { y[i] = L_add( y[i], Mpy_32_16_1( x[i], c ) ); + move32(); } return; @@ -2479,6 +2484,7 @@ void v_multc_acc_32_32( FOR( i = 0; i < N; i++ ) { y[i] = L_add( y[i], Mpy_32_32( x[i], c ) ); + move32(); } return; @@ -2549,54 +2555,66 @@ void lls_interp_n_fx( { Word16 i; const Word16 n_i_fx[11] = { 0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480 }; // Q11 + move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); + const Word16 one_by_n_fx[11] = { 0, 32767, 16384, 10911, 8192, 6553, 5459, 4681, 4096, 3640, 3276 }; + move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); + const Word16 sum_i_fx[12] = { 0, 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55 }; + move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); // 1.0f/ ( N * sum_ii[N] - sum_i[N] * sum_i[N] ) const Word32 res_table[12] = { 0, 0, 0, 357913952, 107374184, 42949672, 20452226, 10956549, 6391320, 3976821, 2603010, 385 }; + move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); Word32 sum_x_fx, sum_ix_fx, slope_fx, offset_fx; Word16 dot_exp = 0, sum_ix_q = 0; - ; + move16(); move16(); + Word32 num; - assert( N > 0 && N <= 10 ); + assert( N > 0 && LE_16( N, 10 ) ); sum_x_fx = 0; + move32(); FOR( int idx = 0; idx < N; idx++ ) { - sum_x_fx = (Word32) sum_x_fx + x_fx[idx]; + sum_x_fx = L_add( sum_x_fx, x_fx[idx] ); } sum_ix_fx = dotp_fx( x_fx, n_i_fx, N, &dot_exp ); - sum_ix_q = 30 - ( dot_exp - ( 11 + 15 ) ); + sum_ix_q = sub( 30, sub( dot_exp, ( 11 + 15 ) ) ); - sum_ix_fx = L_shr( sum_ix_fx, sum_ix_q - 15 ); - num = L_sub( ( sum_ix_fx * N ), ( sum_x_fx * sum_i_fx[N] ) ); + sum_ix_fx = L_shr( sum_ix_fx, sub( sum_ix_q, 15 ) ); + num = L_sub( imult3216( sum_ix_fx, N ), imult3216( sum_x_fx, sum_i_fx[N] ) ); slope_fx = Mpy_32_32( num, res_table[N] ); - offset_fx = Mpy_32_16_1( L_sub( sum_x_fx, ( slope_fx * sum_i_fx[N] ) ), one_by_n_fx[N] ); + offset_fx = Mpy_32_16_1( L_sub( sum_x_fx, imult3216( slope_fx, sum_i_fx[N] ) ), one_by_n_fx[N] ); IF( upd ) { FOR( i = 0; i < N; i++ ) { - IF( slope_fx * i > MAX_WORD16 ) + IF( GT_32( imult3216( slope_fx, i ), MAX_WORD16 ) ) { x_fx[i] = MAX_WORD16; + move16(); } ELSE { - x_fx[i] = (Word16) L_add_sat( ( slope_fx * i ), offset_fx ); + x_fx[i] = extract_l( L_add_sat( imult3216( slope_fx, i ), offset_fx ) ); + move16(); } } } IF( a_fx != NULL ) { - *a_fx = (Word16) slope_fx; + *a_fx = extract_l( slope_fx ); + move16(); } IF( b_fx != NULL ) { - *b_fx = (Word16) offset_fx; + *b_fx = extract_l( offset_fx ); + move16(); } return; @@ -2628,6 +2646,7 @@ static Word32 wrap_azi_fixed( const Word32 azi_deg ) { Word32 azi = azi_deg; + move32(); /* Wrap azimuth value */ WHILE( GT_32( azi, ANGLE_180_DEG_Q22 ) ) @@ -2730,12 +2749,16 @@ void panning_wrap_angles_fixed( Word32 azi, ele; azi = azi_deg; + move32(); ele = ele_deg; + move32(); - IF( L_abs( ele ) < ANGLE_90_DEG_Q22 ) + IF( LT_32( L_abs( ele ), ANGLE_90_DEG_Q22 ) ) { *ele_wrapped = ele; + move32(); *azi_wrapped = wrap_azi_fixed( azi ); + move32(); return; } ELSE @@ -2744,36 +2767,40 @@ void panning_wrap_angles_fixed( IF( ( ( ele % ANGLE_90_DEG_Q22 ) == 0 ) && ( ( ele % ANGLE_180_DEG_Q22 ) != 0 ) ) { *azi_wrapped = 0; - WHILE( ele > ANGLE_90_DEG_Q22 ) + move32(); + WHILE( GT_32( ele, ANGLE_90_DEG_Q22 ) ) { - ele -= ANGLE_360_DEG_Q22; + ele = L_sub( ele, ANGLE_360_DEG_Q22 ); } - WHILE( ele < -ANGLE_90_DEG_Q22 ) + WHILE( LT_32( ele, -ANGLE_90_DEG_Q22 ) ) { - ele += ANGLE_360_DEG_Q22; + ele = L_add( ele, ANGLE_360_DEG_Q22 ); } *ele_wrapped = ele; + move32(); } ELSE { /* Wrap elevation and adjust azimuth accordingly */ - WHILE( L_abs( ele ) > ANGLE_90_DEG_Q22 ) + WHILE( GT_32( L_abs( ele ), ANGLE_90_DEG_Q22 ) ) { /* Flip to other hemisphere */ - azi += ANGLE_180_DEG_Q22; + azi = L_add( azi, ANGLE_180_DEG_Q22 ); /* Compensate elevation accordingly */ - IF( ele > ANGLE_90_DEG_Q22 ) + IF( GT_32( ele, ANGLE_90_DEG_Q22 ) ) { - ele = ANGLE_180_DEG_Q22 - ele; + ele = L_sub( ANGLE_180_DEG_Q22, ele ); } - ELSE IF( ele < -ANGLE_90_DEG_Q22 ) + ELSE IF( LT_32( ele, -ANGLE_90_DEG_Q22 ) ) { - ele = -ANGLE_180_DEG_Q22 - ele; + ele = L_sub( -ANGLE_180_DEG_Q22, ele ); } } *azi_wrapped = wrap_azi_fixed( azi ); + move32(); *ele_wrapped = ele; + move32(); } return; @@ -2840,19 +2867,28 @@ void v_sort_ind_fixed( FOR( i = 0; i < len; i++ ) { idx[i] = i; + move16(); } FOR( i = len - 2; i >= 0; i-- ) { tempr = x[i]; + move32(); tempi = idx[i]; - FOR( j = i + 1; ( j < len ) && ( tempr > x[j] ); j++ ) + move16(); + test(); + FOR( j = add( i, 1 ); LT_16( j, len ) && GT_32( tempr, x[j] ); j++ ) { + test(); x[j - 1] = x[j]; + move32(); idx[j - 1] = idx[j]; + move16(); } x[j - 1] = tempr; + move32(); idx[j - 1] = tempi; + move16(); } return; @@ -2893,12 +2929,16 @@ Word16 is_IVAS_bitrate_fx( Word16 j; j = SIZE_IVAS_BRATE_TBL - IVAS_NUM_ACTIVE_BRATES; /* skip NO_DATA and SID bitrates */ + move16(); + + test(); WHILE( LE_16( j, SIZE_IVAS_BRATE_TBL ) && NE_32( ivas_total_brate, ivas_brate_tbl[j] ) ) { - j++; + test(); + j = add( j, 1 ); } - IF( j >= SIZE_IVAS_BRATE_TBL ) + IF( GE_16( j, SIZE_IVAS_BRATE_TBL ) ) { return 0; } @@ -2961,7 +3001,7 @@ Word16 is_SIDrate( test(); test(); - IF( EQ_32( ivas_total_brate, SID_1k75 ) || + if ( EQ_32( ivas_total_brate, SID_1k75 ) || EQ_32( ivas_total_brate, SID_2k40 ) || EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) { @@ -3023,7 +3063,7 @@ Word16 rand_triangular_signed_fx( Word16 tmp1, tmp2; Word16 exp1, exp = 1; move16(); - IF( LE_16( rand_val, 0 ) ) + IF( rand_val <= 0 ) { /* rand_val in [-1, 0] */ /*0.5f * (sqrtf(rand_val + 1.0f) - 1)*/ @@ -3056,7 +3096,6 @@ Word16 rand_triangular_signed_fx( * * calculates ceil(log2(val)) *-------------------------------------------------------------------*/ - Word16 ceil_log_2( UWord64 val ) { @@ -3065,70 +3104,263 @@ Word16 ceil_log_2( { assert( 0 ); } - return val <= 1 ? 0 : val <= 2 ? 1 - : val <= 4 ? 2 - : val <= 8 ? 3 - : val <= 16 ? 4 - : val <= 32 ? 5 - : val <= 64 ? 6 - : val <= 128 ? 7 - : val <= 256 ? 8 - : val <= 512 ? 9 - : val <= 1024 ? 10 - : val <= 2048 ? 11 - : val <= 4096 ? 12 - : val <= 8192 ? 13 - : val <= 16384 ? 14 - : val <= 32768 ? 15 - : val <= 65536 ? 16 - : val <= 131072 ? 17 - : val <= 262144 ? 18 - : val <= 524288 ? 19 - : val <= 1048576 ? 20 - : val <= 2097152 ? 21 - : val <= 4194304 ? 22 - : val <= 8388608 ? 23 - : val <= 16777216 ? 24 - : val <= 33554432 ? 25 - : val <= 67108864 ? 26 - : val <= 134217728 ? 27 - : val <= 268435456 ? 28 - : val <= 536870912 ? 29 - : val <= 1073741824 ? 30 - : val <= 2147483648 ? 31 - : val <= 4294967296 ? 32 - : val <= 8589934592 ? 33 - : val <= 17179869184 ? 34 - : val <= 34359738368 ? 35 - : val <= 68719476736 ? 36 - : val <= 137438953472 ? 37 - : val <= 274877906944 ? 38 - : val <= 549755813888 ? 39 - : val <= 1099511627776 ? 40 - : val <= 2199023255552 ? 41 - : val <= 4398046511104 ? 42 - : val <= 8796093022208 ? 43 - : val <= 17592186044416 ? 44 - : val <= 35184372088832 ? 45 - : val <= 70368744177664 ? 46 - : val <= 140737488355328 ? 47 - : val <= 281474976710656 ? 48 - : val <= 562949953421312 ? 49 - : val <= 1125899906842624 ? 50 - : val <= 2251799813685248 ? 51 - : val <= 4503599627370496 ? 52 - : val <= 9007199254740992 ? 53 - : val <= 18014398509481984 ? 54 - : val <= 36028797018963968 ? 55 - : val <= 72057594037927936 ? 56 - : val <= 144115188075855872 ? 57 - : val <= 288230376151711744 ? 58 - : val <= 576460752303423488 ? 59 - : val <= 1152921504606846976 ? 60 - : val <= 2305843009213693952 ? 61 - : val <= 4611686018427387904 ? 62 - : val <= 9223372036854775807 ? 63 - : 64; + ELSE IF( LE_64( val, 1 ) ) + { + return 0; + } + ELSE IF( LE_64( val, 2 ) ) + { + return 1; + } + ELSE IF( LE_64( val, 4 ) ) + { + return 2; + } + ELSE IF( LE_64( val, 8 ) ) + { + return 3; + } + ELSE IF( LE_64( val, 16 ) ) + { + return 4; + } + ELSE IF( LE_64( val, 32 ) ) + { + return 5; + } + ELSE IF( LE_64( val, 64 ) ) + { + return 6; + } + ELSE IF( LE_64( val, 128 ) ) + { + return 7; + } + ELSE IF( LE_64( val, 256 ) ) + { + return 8; + } + ELSE IF( LE_64( val, 512 ) ) + { + return 9; + } + ELSE IF( LE_64( val, 1024 ) ) + { + return 10; + } + ELSE IF( LE_64( val, 2048 ) ) + { + return 11; + } + ELSE IF( LE_64( val, 4096 ) ) + { + return 12; + } + ELSE IF( LE_64( val, 8192 ) ) + { + return 13; + } + ELSE IF( LE_64( val, 16384 ) ) + { + return 14; + } + ELSE IF( LE_64( val, 32768 ) ) + { + return 15; + } + ELSE IF( LE_64( val, 65536 ) ) + { + return 16; + } + ELSE IF( LE_64( val, 131072 ) ) + { + return 17; + } + ELSE IF( LE_64( val, 262144 ) ) + { + return 18; + } + ELSE IF( LE_64( val, 524288 ) ) + { + return 19; + } + ELSE IF( LE_64( val, 1048576 ) ) + { + return 20; + } + ELSE IF( LE_64( val, 2097152 ) ) + { + return 21; + } + ELSE IF( LE_64( val, 4194304 ) ) + { + return 22; + } + ELSE IF( LE_64( val, 8388608 ) ) + { + return 23; + } + ELSE IF( LE_64( val, 16777216 ) ) + { + return 24; + } + ELSE IF( LE_64( val, 33554432 ) ) + { + return 25; + } + ELSE IF( LE_64( val, 67108864 ) ) + { + return 26; + } + ELSE IF( LE_64( val, 134217728 ) ) + { + return 27; + } + ELSE IF( LE_64( val, 268435456 ) ) + { + return 28; + } + ELSE IF( LE_64( val, 536870912 ) ) + { + return 29; + } + ELSE IF( LE_64( val, 1073741824 ) ) + { + return 30; + } + ELSE IF( LE_64( val, 2147483648 ) ) + { + return 31; + } + ELSE IF( LE_64( val, 4294967296 ) ) + { + return 32; + } + ELSE IF( LE_64( val, 8589934592 ) ) + { + return 33; + } + ELSE IF( LE_64( val, 17179869184 ) ) + { + return 34; + } + ELSE IF( LE_64( val, 34359738368 ) ) + { + return 35; + } + ELSE IF( LE_64( val, 68719476736 ) ) + { + return 36; + } + ELSE IF( LE_64( val, 137438953472 ) ) + { + return 37; + } + ELSE IF( LE_64( val, 274877906944 ) ) + { + return 38; + } + ELSE IF( LE_64( val, 549755813888 ) ) + { + return 39; + } + ELSE IF( LE_64( val, 1099511627776 ) ) + { + return 40; + } + ELSE IF( LE_64( val, 2199023255552 ) ) + { + return 41; + } + ELSE IF( LE_64( val, 4398046511104 ) ) + { + return 42; + } + ELSE IF( LE_64( val, 8796093022208 ) ) + { + return 43; + } + ELSE IF( LE_64( val, 17592186044416 ) ) + { + return 44; + } + ELSE IF( LE_64( val, 35184372088832 ) ) + { + return 45; + } + ELSE IF( LE_64( val, 70368744177664 ) ) + { + return 46; + } + ELSE IF( LE_64( val, 140737488355328 ) ) + { + return 47; + } + ELSE IF( LE_64( val, 281474976710656 ) ) + { + return 48; + } + ELSE IF( LE_64( val, 562949953421312 ) ) + { + return 49; + } + ELSE IF( LE_64( val, 1125899906842624 ) ) + { + return 50; + } + ELSE IF( LE_64( val, 2251799813685248 ) ) + { + return 51; + } + ELSE IF( LE_64( val, 4503599627370496 ) ) + { + return 52; + } + ELSE IF( LE_64( val, 9007199254740992 ) ) + { + return 53; + } + ELSE IF( LE_64( val, 18014398509481984 ) ) + { + return 54; + } + ELSE IF( LE_64( val, 36028797018963968 ) ) + { + return 55; + } + ELSE IF( LE_64( val, 72057594037927936 ) ) + { + return 56; + } + ELSE IF( LE_64( val, 144115188075855872 ) ) + { + return 57; + } + ELSE IF( LE_64( val, 288230376151711744 ) ) + { + return 58; + } + ELSE IF( LE_64( val, 576460752303423488 ) ) + { + return 59; + } + ELSE IF( LE_64( val, 1152921504606846976 ) ) + { + return 60; + } + ELSE IF( LE_64( val, 2305843009213693952 ) ) + { + return 61; + } + ELSE IF( LE_64( val, 4611686018427387904 ) ) + { + return 62; + } + ELSE IF( LE_64( val, 9223372036854775807 ) ) + { + return 63; + } + return 64; } @@ -3142,7 +3374,7 @@ Word16 ceil_log_2( Word64 var_32_fx( const Word32 *x, /* i : input vector */ - const int16_t len, /* i : length of inputvector */ + const Word16 len, /* i : length of inputvector */ Word16 q /* q : q-factor for the array */ ) { @@ -3150,23 +3382,25 @@ Word64 var_32_fx( Word64 mean, var; mean = 0; + move64(); var = 0; + move64(); FOR( int i = 0; i < len; i++ ) { - mean = mean + x[i]; + mean = W_add( mean, x[i] ); } - mean = mean / len; + mean = mean / len; /* NOTE: No BASOP for 64 bit division */ FOR( int i = 0; i < len; i++ ) { - var = var + Mpy_32_32( L_sub( x[i], (Word32) mean ), L_sub( x[i], (Word32) mean ) ); + var = W_add( var, Mpy_32_32( L_sub( x[i], W_extract_l( mean ) ), L_sub( x[i], W_extract_l( mean ) ) ) ); } - var = var << ( 31 - q ); + var = W_shl( var, sub( 31, q ) ); - var = var / len; + var = var / len; /* NOTE: No BASOP for 64 bit division */ return var; } diff --git a/lib_com/wi_fx.c b/lib_com/wi_fx.c index 602487f71..391f6d9e5 100644 --- a/lib_com/wi_fx.c +++ b/lib_com/wi_fx.c @@ -160,8 +160,11 @@ void DTFS_sub_fx( move16(); } tmp->lag_fx = s_max( X1.lag_fx, X2.lag_fx ); + move16(); tmp->nH_fx = s_max( X1.nH_fx, X2.nH_fx ); + move16(); tmp->nH_4kHz_fx = s_max( X1.nH_4kHz_fx, X2.nH_4kHz_fx ); + move16(); tmp->upper_cut_off_freq_of_interest_fx = X1.upper_cut_off_freq_of_interest_fx; move16(); tmp->upper_cut_off_freq_fx = X1.upper_cut_off_freq_fx; @@ -180,7 +183,6 @@ static void DTFS_fast_fs_inv_fx( DTFS_STRUCTURE *X_fx, Word16 *out_fx, Word16 N_ Word16 dbuf_fx[256 + 1]; M_2 = s_min( shr( X_fx->lag_fx, 1 ), X_fx->nH_fx ); - move16(); N_2 = shr( N_fx, 1 ); s = negate( X_fx->Q ); @@ -193,7 +195,7 @@ static void DTFS_fast_fs_inv_fx( DTFS_STRUCTURE *X_fx, Word16 *out_fx, Word16 N_ { dbuf_fx[2 * i] = shl_r( X_fx->a_fx[i], s ); move16(); - dbuf_fx[2 * i + 1] = shl_r( X_fx->b_fx[i], s ); + dbuf_fx[add( 2 * i, 1 )] = shl_r( X_fx->b_fx[i], s ); move16(); } @@ -201,7 +203,7 @@ static void DTFS_fast_fs_inv_fx( DTFS_STRUCTURE *X_fx, Word16 *out_fx, Word16 N_ { dbuf_fx[2 * i] = 0; move16(); - dbuf_fx[2 * i + 1] = 0; + dbuf_fx[add( 2 * i, 1 )] = 0; move16(); } @@ -265,6 +267,7 @@ static Word16 DTFS_alignment_weight_fx( Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif diff_fx = 0; /* to avoid compilation warnings */ @@ -278,6 +281,7 @@ static Word16 DTFS_alignment_weight_fx( FOR( k = 0; k < M + 1; k++ ) { tmplpc_fx[k] = mult_r( LPC1[k], pwf_fx[k] ); /* Q12 */ + move16(); } DTFS_zeroFilter_fx( &X1, tmplpc_fx, M + 1, S_fx, C_fx ); @@ -287,6 +291,7 @@ static Word16 DTFS_alignment_weight_fx( FOR( k = 0; k < M + 1; k++ ) { tmplpc_fx[k] = mult_r( LPC2[k], pwf_fx[k] ); /* Q12 */ + move16(); } DTFS_zeroFilter_fx( &X2, tmplpc_fx, M + 1, S_fx, C_fx ); @@ -295,7 +300,7 @@ static Word16 DTFS_alignment_weight_fx( move16(); fshift_fx = Eshift; move16(); - Adiff_fx = (Word16) s_max( 768, mult_r( 4915, shl( X2.lag_fx, 7 ) ) ); /* Q7, 768=6*128, 4915 = 0.15*32768 */ + Adiff_fx = s_max( 768, mult_r( 4915, shl( X2.lag_fx, 7 ) ) ); /* Q7, 768=6*128, 4915 = 0.15*32768 */ if ( LT_16( X2.lag_fx, 60 ) ) { @@ -311,7 +316,7 @@ static Word16 DTFS_alignment_weight_fx( HalfLag = s_min( shr( X2.lag_fx, 1 ), X2.nH_4kHz_fx ); exp = norm_s( X2.lag_fx ); tmp = div_s( shl( 1, sub( 14, exp ) ), X2.lag_fx ); - L_tmp = L_shl( tmp, exp + 6 ); + L_tmp = L_shl( tmp, add( exp, 6 ) ); inv_lag = round_fx( L_tmp ); FOR( k = 0; k <= HalfLag; k++ ) @@ -323,6 +328,8 @@ static Word16 DTFS_alignment_weight_fx( ab1[k] = round_fx( L_mac0( L_mult0( X1.a_fx[k], X2.a_fx[k] ), X1.b_fx[k], X2.b_fx[k] ) ); /* Q(-15) */ ab2[k] = round_fx( L_msu0( L_mult0( X1.a_fx[k], X2.b_fx[k] ), X1.b_fx[k], X2.a_fx[k] ) ); /* Q(-15) */ #endif + move16(); + move16(); } start = sub( Eshift, Adiff_fx ); @@ -345,11 +352,13 @@ static Word16 DTFS_alignment_weight_fx( { #ifdef BASOP_NOGLOB corr_fx = L_mac0_o( corr_fx, ab1[k], cos_table[s_and( temp, 511 )], &Overflow ); - corr_fx = L_mac0_o( corr_fx, ab2[k], cos_table[s_and( ( temp + 128 ), 511 )], &Overflow ); + corr_fx = L_mac0_o( corr_fx, ab2[k], cos_table[s_and( add( temp, 128 ), 511 )], &Overflow ); #else corr_fx = L_mac0( corr_fx, ab1[k], cos_table[s_and( temp, 511 )] ); - corr_fx = L_mac0( corr_fx, ab2[k], cos_table[s_and( ( temp + 128 ), 511 )] ); + corr_fx = L_mac0( corr_fx, ab2[k], cos_table[s_and( add( temp, 128 ), 511 )] ); #endif + move32(); + move32(); temp = add( temp, temp1 ); } temp = sub( 8192, mult_r( 20972, abs_s( sub( n_fx, Eshift ) ) ) ); /* Q13, 20972 = Q21 of 0.01. */ @@ -384,7 +393,7 @@ static Word16 DTFS_alignment_weight_fx( #endif } - if ( diff_corr > 0 ) + IF( diff_corr > 0 ) { fshift_fx = n_fx; move16(); @@ -434,6 +443,7 @@ Word16 DTFS_alignment_full_fx( Word16 Eshift, Adiff_fx; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif /* Calculating the expected alignment shift */ @@ -570,7 +580,9 @@ void DTFS_phaseShift_fx( DTFS_STRUCTURE *X_fx, Word16 ph, Word16 Lag, Word16 *S_ temp = X_fx->a_fx[k]; L_temp = L_shr( L_temp2, 5 ); /* Q2 */ X_fx->a_fx[k] = round_fx( L_msu( L_mult( temp, C_fx[L_temp % ( 4 * Lag )] ), X_fx->b_fx[k], S_fx[L_temp % ( 4 * Lag )] ) ); /* X.Q */ + move16(); X_fx->b_fx[k] = round_fx( L_mac( L_mult( X_fx->b_fx[k], C_fx[L_temp % ( 4 * Lag )] ), temp, S_fx[L_temp % ( 4 * Lag )] ) ); + move16(); L_temp2 = L_add( L_temp2, ph ); } } @@ -582,7 +594,9 @@ void DTFS_phaseShift_fx( DTFS_STRUCTURE *X_fx, Word16 ph, Word16 Lag, Word16 *S_ temp = X_fx->a_fx[k]; L_temp = L_shr( L_negate( L_temp2 ), 5 ); /* Q2 */ X_fx->a_fx[k] = round_fx( L_mac( L_mult( temp, C_fx[L_temp % ( 4 * Lag )] ), X_fx->b_fx[k], S_fx[L_temp % ( 4 * Lag )] ) ); /* X.Q */ + move16(); X_fx->b_fx[k] = round_fx( L_msu( L_mult( X_fx->b_fx[k], C_fx[L_temp % ( 4 * Lag )] ), temp, S_fx[L_temp % ( 4 * Lag )] ) ); + move16(); L_temp2 = L_add( L_temp2, ph ); } } @@ -623,6 +637,7 @@ void Q2phaseShift_fx( Word32 temp2; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif temp2 = L_deposit_l( 0 ); @@ -643,6 +658,8 @@ void Q2phaseShift_fx( X_fx->b_fx[k] = round_fx( L_mac( L_mult( X_fx->b_fx[k], C_fx[temp2 % ( 4 * Lag )] ), temp, S_fx[temp2 % ( 4 * Lag )] ) ); temp2 = L_add( temp2, (Word32) ph ); #endif + move16(); + move16(); } } @@ -661,6 +678,8 @@ void Q2phaseShift_fx( X_fx->b_fx[k] = round_fx( L_msu( L_mult( X_fx->b_fx[k], C_fx[temp2 % ( 4 * Lag )] ), temp, S_fx[temp2 % ( 4 * Lag )] ) ); temp2 = add( (Word16) temp2, negate( ph ) ); #endif + move16(); + move16(); } } } @@ -712,10 +731,12 @@ void DTFS_zeroPadd_fx( /* recompute nH for new lag */ diff_fx = find_rem( 12800, X_fx->lag_fx, &rem_fx ); X_fx->nH_fx = find_rem( X_fx->upper_cut_off_freq_fx, diff_fx, &rem_fx ); + move16(); if ( GE_16( sub( X_fx->upper_cut_off_freq_fx, shr( (Word16) L_mult( diff_fx, X_fx->nH_fx ), 1 ) ), diff_fx ) ) { X_fx->nH_fx = add( X_fx->nH_fx, 1 ); + move16(); } } /*===================================================================*/ @@ -762,6 +783,7 @@ void DTFS_to_fs_fx( Word32 L_tmp1; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif IF( !FR_flag ) @@ -869,19 +891,23 @@ void DTFS_to_fs_fx( sum = add( sum, temp ); } La[k] = L_shr( L_a, 6 ); /* Q8 of a[k]*2.0 */ + move32(); Lb[k] = L_shr( L_b, 6 ); /* Q8 of b[k]*2.0 */ + move32(); L_temp = L_abs( La[k] ); if ( GT_32( L_temp, Labmax ) ) { Labmax = L_temp; + move32(); } L_temp = L_abs( Lb[k] ); if ( GT_32( L_temp, Labmax ) ) { Labmax = L_temp; + move32(); } } @@ -942,16 +968,20 @@ void DTFS_to_fs_fx( { #ifdef BASOP_NOGLOB X_fx->a_fx[k] = round_fx_o( L_shl_o( La[k], temp, &Overflow ), &Overflow ); /* Q(8+temp-16)=Q(temp-8) */ + move16(); X_fx->a_fx[k] = mult_ro( X_fx->a_fx[k], inv_lag, &Overflow ); move16(); /* Q(temp-8+19+1-16)=Q(temp-4) of a[k]*2.0/N */ X_fx->b_fx[k] = round_fx_o( L_shl_o( Lb[k], temp, &Overflow ), &Overflow ); /* Q(8+temp-16)=Q(temp-8) */ + move16(); X_fx->b_fx[k] = mult_ro( X_fx->b_fx[k], inv_lag, &Overflow ); move16(); /* Q(temp-8+19+1-16)=Q(temp-4) of b[k]*2.0/N */ #else X_fx->a_fx[k] = round_fx( L_shl( La[k], temp ) ); /* Q(8+temp-16)=Q(temp-8) */ + move16(); X_fx->a_fx[k] = mult_r( X_fx->a_fx[k], inv_lag ); move16(); /* Q(temp-8+19+1-16)=Q(temp-4) of a[k]*2.0/N */ X_fx->b_fx[k] = round_fx( L_shl( Lb[k], temp ) ); /* Q(8+temp-16)=Q(temp-8) */ + move16(); X_fx->b_fx[k] = mult_r( X_fx->b_fx[k], inv_lag ); move16(); /* Q(temp-8+19+1-16)=Q(temp-4) of b[k]*2.0/N */ #endif @@ -967,12 +997,14 @@ void DTFS_to_fs_fx( X_fx->a_fx[k] = round_fx( L_shl( La[k], temp ) ); /* Q(8+temp-16)=Q(temp-8) */ X_fx->a_fx[k] = mult_r( X_fx->a_fx[k], inv_lag ); #endif + move16(); move16(); /* Q(temp-8+19+1-16)=Q(temp-4) of a[k]*1.0/N */ X_fx->b_fx[k] = 0; move16(); } X_fx->Q = sub( temp, 4 ); + move16(); tmp = s_min( shr( X_fx->lag_fx, 1 ), sub( MAXLAG_WI, 1 ) ); FOR( k = add( nH_band, 1 ); k <= tmp; k++ ) @@ -1028,11 +1060,12 @@ static void DTFS_transform_fx( Word32 Lw_fx, temp32_fx; Word16 x2_256_fx[256], x1_256_fx[256]; Word16 k, m, l1; - Word32 x_r_fx[256] = { 0 }; + Word32 x_r_fx[256]; Word32 tmptmp3_40_fx; Word16 temp_w; Word16 N1; Word16 nrg_flag = 0; + move16(); Word32 L_tmp; Word16 tmp, tmp1, tmp2, frac, exp1, exp2; Word16 expa, expb, fraca, fracb, scale; @@ -1044,6 +1077,8 @@ static void DTFS_transform_fx( DTFS_STRUCTURE *tmp3_dtfs_fx; error = IVAS_ERR_OK; + move16(); + set32_fx( x_r_fx, 0, 256 ); IF( ( error = DTFS_new_fx( &tmp1_dtfs_fx ) ) != IVAS_ERR_OK ) { @@ -1062,7 +1097,7 @@ static void DTFS_transform_fx( DTFS_copy_fx( tmp2_dtfs_fx, X2_fx ); tmp2 = 0; /* to avoid compilation warnings */ - + move16(); DTFS_fast_fs_inv_fx( tmp1_dtfs_fx, x1_256_fx, 256, 8 ); DTFS_fast_fs_inv_fx( tmp2_dtfs_fx, x2_256_fx, 256, 8 ); @@ -1082,7 +1117,7 @@ static void DTFS_transform_fx( { tmp2 = negate( tmp1 ); } - tmp = div_s( shl( 1, ( 14 - exp2 ) ), tmp2 ); /* 29-exp2 */ + tmp = div_s( shl( 1, sub( 14, exp2 ) ), tmp2 ); /* 29-exp2 */ L_tmp = L_shl( tmp, 16 ); if ( tmp1 < 0 ) @@ -1169,11 +1204,12 @@ static void DTFS_transform_fx( w_fx = div_s( fracb, fraca ); exp1 = sub( expb, expa ); - w_fx = shl( w_fx, exp1 - 1 ); /*Q14*/ + w_fx = shl( w_fx, sub( exp1, 1 ) ); /*Q14*/ } ELSE { w_fx = 0; + move16(); } Lw_fx = L_deposit_h( w_fx ); @@ -1189,6 +1225,7 @@ static void DTFS_transform_fx( Lw_fx = L_add( Lw_fx, inv_fx ); /* (i+1)*inv */ /* mapping phase to 8x256 length signal */ temp32_fx = phase_fx[i]; /* Q(27-11)=Q16 due to multiplication by pow(2.0,11) */ + move32(); j = rint_new_fx( temp32_fx ); j = s_and( j, 0x07ff ); @@ -1201,15 +1238,16 @@ static void DTFS_transform_fx( FOR( j = 0; j < 12; j++ ) { - m = ( 1000 * LL + l1 - OSLENGTH / 2 + j ) % LL; /* use circular addressing */ + m = L_add( 1000 * LL - OSLENGTH / 2, add( l1, j ) ) % LL; /* use circular addressing */ x_r_fx[m] = L_mac( L_mult( x1_256_fx[m], temp_w ), x2_256_fx[m], w_fx ); + move32(); } tmptmp3_40_fx = L_deposit_l( 0 ); FOR( j = 0; j < 12; j++ ) { - m = ( 1000 * LL + l1 - OSLENGTH / 2 + j ) % LL; /* use circular addressing */ + m = L_add( 1000 * LL - OSLENGTH / 2, add( l1, j ) ) % LL; /* use circular addressing */ tmptmp3_40_fx = L_add( tmptmp3_40_fx, Mult_32_16( x_r_fx[m], sinc_fx[k][j] ) ); } #ifdef BASOP_NOGLOB @@ -1217,6 +1255,7 @@ static void DTFS_transform_fx( #else out_fx[i] = round_fx( L_shl( tmptmp3_40_fx, 2 ) ); #endif + move16(); } @@ -1264,6 +1303,7 @@ void DTFS_zeroFilter_fx( Word16 Qmin, Qab[MAXLAG_WI], na, nb; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif Qmin = 32767; move16(); @@ -1282,11 +1322,11 @@ void DTFS_zeroFilter_fx( FOR( n = 0; n < N; n++ ) { #ifdef BASOP_NOGLOB - sum1_fx = L_mac_o( sum1_fx, LPC[n], C_fx[( 4 * temp2 ) % ( 4 * X_fx->lag_fx )], &Overflow ); /* Q(12+15+1) */ + sum1_fx = L_mac_o( sum1_fx, LPC[n], C_fx[i_mult( 4, temp2 ) % i_mult( 4, X_fx->lag_fx )], &Overflow ); /* Q(12+15+1) */ sum2_fx = L_mac_o( sum2_fx, LPC[n], S_fx[( 4 * temp2 ) % ( 4 * X_fx->lag_fx )], &Overflow ); #else - sum1_fx = L_mac( sum1_fx, LPC[n], C_fx[( 4 * temp2 ) % ( 4 * X_fx->lag_fx )] ); /* Q(12+15+1) */ - sum2_fx = L_mac( sum2_fx, LPC[n], S_fx[( 4 * temp2 ) % ( 4 * X_fx->lag_fx )] ); + sum1_fx = L_mac( sum1_fx, LPC[n], C_fx[i_mult( 4, temp2 ) % i_mult( 4, X_fx->lag_fx )] ); /* Q(12+15+1) */ + sum2_fx = L_mac( sum2_fx, LPC[n], S_fx[i_mult( 4, temp2 ) % i_mult( 4, X_fx->lag_fx )] ); #endif temp2 = add( temp2, temp ); } @@ -1336,8 +1376,11 @@ void DTFS_zeroFilter_fx( X_fx->a_fx[k] = round_fx( (Word32) L_shl( L_temp1, nb ) ); /* Q(13+Q+nb-16)=Q(Q+nb-3) */ X_fx->b_fx[k] = round_fx( (Word32) L_shl( L_temp2, nb ) ); /* Q(Q+nb-3) */ #endif + move32(); + move32(); Qab[k] = sub( nb, 3 ); + move16(); if ( LT_16( Qab[k], Qmin ) ) { @@ -1455,9 +1498,12 @@ void DTFS_poleFilter_fx_9( } nb = sub( nb, 1 ); /* leave one more sign bit */ X_fx->a_fx[k] = round_fx( (Word32) L_shl( sum1_fx, nb ) ); /* Q(-3+n2+Q+exp+nb ) */ + move16(); X_fx->b_fx[k] = round_fx( (Word32) L_shl( sum2_fx, nb ) ); + move16(); Qab[k] = add( sub( nb, 3 ), n2_temp1 ); + move16(); if ( LT_16( Qab[k], Qmin ) ) { @@ -1466,7 +1512,7 @@ void DTFS_poleFilter_fx_9( } } /* bring to the same Q */ - move16(); + FOR( k = 0; k <= HalfLag; k++ ) { X_fx->a_fx[k] = shl( X_fx->a_fx[k], sub( Qmin, Qab[k] ) ); @@ -1476,6 +1522,7 @@ void DTFS_poleFilter_fx_9( } X_fx->Q = add( X_fx->Q, Qmin ); + move16(); return; } /*===================================================================*/ @@ -1539,20 +1586,21 @@ void DTFS_adjustLag_fx( tmp = div_s( shl( 1, sub( 14, exp ) ), X_DTFS_FX->lag_fx ); /* 29 - exp */ L_tmp = L_mult0( 12800, tmp ); temp32_fx = L_shl( L_tmp, sub( exp, 23 ) ); - diff_fx = (Word16) L_shl( L_tmp, sub( exp, 29 ) ); + diff_fx = extract_l( L_shl( L_tmp, sub( exp, 29 ) ) ); exp = norm_s( diff_fx ); tmp = div_s( shl( 1, sub( 14, exp ) ), diff_fx ); /* 29 - exp */ L_tmp = L_mult0( X_DTFS_FX->upper_cut_off_freq_fx, tmp ); - X_DTFS_FX->nH_fx = (Word16) L_shl( L_tmp, sub( exp, 29 ) ); + X_DTFS_FX->nH_fx = extract_l( L_shl( L_tmp, sub( exp, 29 ) ) ); + move16(); L_tmp = L_mult0( 4000, tmp ); tempnH_fx = L_shl( L_tmp, sub( exp, 23 ) ); X_DTFS_FX->nH_4kHz_fx = extract_l( L_shl( L_tmp, sub( exp, 29 ) ) ); + move16(); - - if ( GE_16( sub( X_DTFS_FX->upper_cut_off_freq_fx, shr( (Word16) L_mult( diff_fx, X_DTFS_FX->nH_fx ), 1 ) ), diff_fx ) ) + if ( GE_16( sub( X_DTFS_FX->upper_cut_off_freq_fx, shr( extract_l( L_mult( diff_fx, X_DTFS_FX->nH_fx ) ), 1 ) ), diff_fx ) ) { X_DTFS_FX->nH_fx = add( X_DTFS_FX->nH_fx, 1 ); move16(); @@ -1595,9 +1643,11 @@ Word32 DTFS_getEngy_fx( { Word16 k, HalfLag_fx; Word32 en_fx = 0; + move32(); Word16 temp_a_fx, temp_b_fx; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif HalfLag_fx = shr( sub( X_fx->lag_fx, 1 ), 1 ); HalfLag_fx = s_min( HalfLag_fx, X_fx->nH_fx ); @@ -1619,6 +1669,7 @@ Word32 DTFS_getEngy_fx( en_fx = L_shr( en_fx, 1 ); temp_a_fx = X_fx->a_fx[0]; + move16(); #ifdef BASOP_NOGLOB en_fx = L_mac0_o( en_fx, temp_a_fx, temp_a_fx, &Overflow ); #else @@ -1668,8 +1719,10 @@ Word32 DTFS_getEngy_P2A_fx( { Word16 k, HalfLag_fx; Word32 en_fx = 0; + move32(); #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif HalfLag_fx = shr( sub( X_fx->lag_fx, 1 ), 1 ); HalfLag_fx = s_min( HalfLag_fx, X_fx->nH_fx ); @@ -1740,7 +1793,7 @@ static Word32 DTFS_setEngy_fx( en1_fx = DTFS_getEngy_fx( X_DTFS_FX ); move16(); - if ( en1_fx == 0 ) + IF( en1_fx == 0 ) { return 0; } @@ -1748,6 +1801,7 @@ static Word32 DTFS_setEngy_fx( IF( en2_fx == 0 ) { factor_fx = 0; + move32(); } ELSE { @@ -1780,9 +1834,11 @@ static Word32 DTFS_setEngy_fx( { L_temp_fx = Mult_32_16( factor_fx, X_DTFS_FX->a_fx[k] ); /* Q(temp+X1.Q-15) */ X_DTFS_FX->a_fx[k] = round_fx( L_temp_fx ); /* Q(temp+X1.Q-15-16)=Q(temp+X1.Q-31); */ + move16(); L_temp_fx = Mult_32_16( factor_fx, X_DTFS_FX->b_fx[k] ); /* Q(temp+X1.Q-15) */ X_DTFS_FX->b_fx[k] = round_fx( L_temp_fx ); /* Q(temp+X1.Q-15-16)=Q(temp+X1.Q-31); */ + move16(); } @@ -1830,6 +1886,7 @@ void DTFS_car2pol_fx( Word16 exp, tmp, frac; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif HalfLag_fx = s_min( shr( sub( X_fx->lag_fx, 1 ), 1 ), X_fx->nH_fx ); FOR( k = 1; k <= HalfLag_fx; k++ ) @@ -1853,6 +1910,7 @@ void DTFS_car2pol_fx( Ltemp_fx = Isqrt_lc( L_deposit_h( tmp ), &exp ); /* Q(31-exp) */ X_fx->a_fx[k] = extract_h( L_shl( Ltemp_fx, sub( add( X_fx->Q, exp ), 15 ) ) ); /* Q */ + move16(); } ELSE { @@ -1880,6 +1938,7 @@ void DTFS_car2pol_fx( Ltemp_fx = Isqrt_lc( L_deposit_h( tmp ), &exp ); /* Q(31-exp) */ X_fx->a_fx[k] = extract_h( L_shl( Ltemp_fx, sub( add( X_fx->Q, exp ), 15 ) ) ); /* Q */ + move16(); } ELSE { @@ -1943,9 +2002,12 @@ Word32 DTFS_setEngyHarm_fx( Word16 exp, tmp, expa, expb, fraca, fracb, scale; Word32 L_tmp; Word32 Lacc_max = 0; + move32(); Word16 expp = 0; + move16(); #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif @@ -2058,15 +2120,18 @@ Word32 DTFS_setEngyHarm_fx( #else X_fx->a_fx[k] = round_fx( L_temp_fx ); /* Q(temp+X1.Q-15-16)=Q(temp+X1.Q-31); */ #endif + move16(); } if ( GE_32( Lacc_max, 2147483647 ) ) { *Qa_fx = sub( sub( X_fx->Q, add( 1, s_min( 2, expp ) ) ), exp ); + move16(); } else { *Qa_fx = sub( sub( X_fx->Q, 1 ), exp ); + move16(); } return en1_fx; /* Q(2*X1.Q) */ @@ -2120,20 +2185,23 @@ static void cubicPhase_fx( Word16 dbgshft; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif num_flag = 0; + move16(); den_flag = 0; + move16(); N = sub( N, L2 ); exp = norm_s( L1 ); tmp = div_s( shl( 1, sub( 14, exp ) ), L1 ); - L_tmp = L_shl( tmp, exp + 6 ); + L_tmp = L_shl( tmp, add( exp, 6 ) ); f1 = round_fx( L_tmp ); exp = norm_s( L2 ); tmp = div_s( shl( 1, sub( 14, exp ) ), L2 ); - L_tmp = L_shl( tmp, exp + 6 ); + L_tmp = L_shl( tmp, add( exp, 6 ) ); Ltemp4 = inverse_table[L2]; f2 = round_fx( L_tmp ); @@ -2173,7 +2241,7 @@ static void cubicPhase_fx( Ltemp2 = L_shl( Mult_32_16( Ltemp2, N ), 1 ); /* IF(N%2) */ - if ( s_and( N, 1 ) == 1 ) + if ( EQ_16( s_and( N, 1 ), 1 ) ) { Ltemp2 = L_add( Ltemp2, 1 ); } @@ -2326,7 +2394,7 @@ static void cubicPhase_fx( tmp = negate( tmp ); } - Lacc = L_shl( tmp, exp + 27 ); + Lacc = L_shl( tmp, add( exp, 27 ) ); Lacc = L_add( Lacc, 0x08000 ); c1 = extract_h( Lacc ); /* c1 in Q27 */ @@ -2384,7 +2452,7 @@ static void cubicPhase_fx( N2 = L_shl( L_mult0( n, n ), 14 ); Ltemp3 = L_shl( Mult_32_16( N2, n ), 1 ); - if ( s_and( N, 1 ) == 1 ) + if ( EQ_16( s_and( N, 1 ), 1 ) ) { Ltemp3 = L_add( Ltemp3, 1 ); } @@ -2453,6 +2521,7 @@ void DTFS_to_erb_fx( Word16 expa, expb, fraca, fracb, scale; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif const Word16 *erb_fx = NULL; num_erb_fx = NUM_ERB_NB; @@ -2556,6 +2625,7 @@ void DTFS_to_erb_fx( out_fx[i] = round_fx( L_tmp ); #endif + move16(); } } return; @@ -2599,6 +2669,7 @@ void erb_slot_fx( Word16 fraca, fracb, expa, expb, scale; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif const Word16 *erb_fx = NULL; /*move16(); */ @@ -2610,14 +2681,12 @@ void erb_slot_fx( upper_cut_off_freq_fx = 4000; move16(); erb_fx = &( erb_NB_fx[0] ); - move16(); } ELSE IF( EQ_16( num_erb_fx, NUM_ERB_WB ) ) { upper_cut_off_freq_fx = 6400; move16(); erb_fx = &( erb_WB_fx[0] ); - move16(); } exp = norm_s( lag_fx ); @@ -2688,6 +2757,7 @@ void erb_slot_fx( #else mfreq_fx[j] = round_fx( L_shl( mf_fx[j], 11 ) ); /* Q15 */ #endif + move16(); IF( GT_16( out_fx[j], 1 ) ) { expb = norm_l( mf_fx[j] ); @@ -2771,6 +2841,7 @@ void DTFS_erb_inv_fx( Word16 exp, tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif IF( EQ_16( num_erb_fx, NUM_ERB_NB ) ) @@ -2809,7 +2880,7 @@ void DTFS_erb_inv_fx( exp = norm_s( X_fx->lag_fx ); tmp = div_s( shl( 1, sub( 14, exp ) ), X_fx->lag_fx ); /* 29-exp */ - diff_fx = shl( tmp, exp - 10 ); /* Q19 */ + diff_fx = shl( tmp, sub( exp, 10 ) ); /* Q19 */ min_q = EVS_SW_MAX; move16(); @@ -2861,7 +2932,9 @@ void DTFS_erb_inv_fx( #else X_fx->a_fx[i] = round_fx( L_shl( Ltemp_fx, d2h ) ); /* Q(28-n+d2h) */ #endif + move16(); q[i] = add( sub( 28, n ), d2h ); + move16(); min_q = s_min( min_q, q[i] ); BREAK; @@ -2876,6 +2949,7 @@ void DTFS_erb_inv_fx( } X_fx->Q = min_q; + move16(); return; } @@ -2987,8 +3061,10 @@ void erb_add_fx( move16(); } ELSE + { curr_erb_fx[i] = 0; - move16(); + move16(); + } } tmp_fx = add( shl( index_fx[1], 3 ), index_fx[1] ); /* tmp=9*index[1] */ @@ -3002,19 +3078,23 @@ void erb_add_fx( IF( EQ_16( num_erb_fx, NUM_ERB_NB ) ) { curr_erb_fx[i] = add( AmpCB2_NB_fx[sub( add( tmp_fx, i ), 11 )], t_prev_erb_fx[i] ); /* Q13+Q13=Q13 */ + move16(); curr_erb_fx[i] = s_max( 0, curr_erb_fx[i] ); move16(); } ELSE IF( EQ_16( num_erb_fx, NUM_ERB_WB ) ) { curr_erb_fx[i] = add( AmpCB2_WB_fx[sub( add( tmp2_fx, i ), 11 )], t_prev_erb_fx[i] ); /* Q13 */ + move16(); curr_erb_fx[i] = s_max( 0, curr_erb_fx[i] ); move16(); } } ELSE + { curr_erb_fx[i] = 0; - move16(); + move16(); + } } return; } @@ -3075,17 +3155,24 @@ void quant_target_fx( DTFS_STRUCTURE *X_fx, const Word16 *curr_lpc, Word16 *w, W tmp = round_fx( L_shl( Lacc, exp ) ); exp = sub( sub( 30, exp ), 23 ); IF( tmp ) - tmp = div_s( 16384, tmp ); /* 15+exp1 */ + { + tmp = div_s( 16384, tmp ); /* 15+exp1 */ + } ELSE + { tmp = 0; + move16(); + } Ltemp = L_deposit_h( tmp ); tmp = round_fx( Ltemp ); /* tmp in Q(22-n) */ Ltemp1 = Mult_32_16( Ltemp1, tmp ); /* Q(30-n) */ n = sub( 8, exp ); w[0] = round_fx( L_shl( Ltemp1, n ) ); /* w[0] in Q15 */ + move16(); Ltemp2 = Mult_32_16( Ltemp2, tmp ); w[1] = round_fx( L_shl( Ltemp2, n ) ); /* w[1] in Q15 */ + move16(); logLag = log10_fx( X_fx->lag_fx ); /* logLag=10*log10(lag), Q23 */ Ltemp3 = L_shl( L_mult( shl( X_fx->Q, 1 ), 24660 ), 9 ); /* Ltemp3=2Q*10log10(2), Q23 */ @@ -3096,20 +3183,28 @@ void quant_target_fx( DTFS_STRUCTURE *X_fx, const Word16 *curr_lpc, Word16 *w, W Ltemp = L_add( L_sub( Ltemp, Ltemp3 ), logLag ); /* Ltemp=10*log10(lag*eng), Q23 */ target[0] = round_fx( L_shl( Mult_32_16( Ltemp, 0x6666 ), 1 ) ); /* Q11 */ + move16(); /* Process high band */ Ltemp = DTFS_setEngyHarm_fx( 2828, X_fx->upper_cut_off_freq_of_interest_fx, 2828, X_fx->upper_cut_off_freq_fx, 1, 0, &Qh, X_fx ); Ltemp = log10_fx( Ltemp ); Ltemp = L_add( L_sub( Ltemp, Ltemp3 ), logLag ); /* Ltemp=10*log10(lag*eng), Q23 */ target[1] = round_fx( L_shl( Mult_32_16( Ltemp, 0x6666 ), 1 ) ); /* Q11 */ + move16(); /* Need to unify the Q factors of both bands */ X_fx->Q = s_min( Ql, Qh ); /* set Q factor to be the smaller one */ - n = sub( Ql, Qh ); /* compare band Q factors */ + move16(); + n = sub( Ql, Qh ); /* compare band Q factors */ IF( n < 0 ) - rshiftHarmBand_fx( X_fx, 2828, X_fx->upper_cut_off_freq_fx, n ); - ELSE IF( n > 0 ) rshiftHarmBand_fx( X_fx, 0, 2828, sub( Qh, Ql ) ); + { + rshiftHarmBand_fx( X_fx, 2828, X_fx->upper_cut_off_freq_fx, n ); + } + ELSE IF( n > 0 ) + { + rshiftHarmBand_fx( X_fx, 0, 2828, sub( Qh, Ql ) ); + } } /*==========================================================================*/ @@ -3152,6 +3247,8 @@ ivas_error WIsyn_fx( { Word16 i; UWord16 I = 1, flag = 0; + move16(); + move16(); /* Word16 *phase_fx = (Word16*)malloc(sizeof(Word16) * (2*N)); new operator used size 2*N */ Word32 phase_fx[WI_FX_phase_fx]; Word16 alignment_fx; @@ -3166,6 +3263,7 @@ ivas_error WIsyn_fx( ivas_error error; error = IVAS_ERR_OK; + move16(); IF( ( error = DTFS_new_fx( &CURRCW_DTFS_FX ) ) != IVAS_ERR_OK ) { @@ -3217,7 +3315,9 @@ ivas_error WIsyn_fx( IF( temp < 0 ) - temp = add( temp, shl( CURRCW_DTFS_FX->lag_fx, 7 ) ); /* Q7 */ + { + temp = add( temp, shl( CURRCW_DTFS_FX->lag_fx, 7 ) ); /* Q7 */ + } find_rem( temp, shl( CURRCW_DTFS_FX->lag_fx, 7 ), &tmp_fx ); /* Q7 */ IF( FR_flag == 0 ) @@ -3241,7 +3341,7 @@ ivas_error WIsyn_fx( tmp = shl( CURRCW_DTFS_FX->lag_fx, 7 ); exp = norm_s( tmp ); tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* 22-exp */ - L_tmp = L_shl( L_mult( temp, tmp ), exp + 1 ); + L_tmp = L_shl( L_mult( temp, tmp ), add( exp, 1 ) ); tmp_fx = round_fx( L_tmp ); } ELSE IF( alignment_fx < 0 ) @@ -3250,7 +3350,7 @@ ivas_error WIsyn_fx( tmp = shl( CURRCW_DTFS_FX->lag_fx, 7 ); exp = norm_s( tmp ); tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* 22-exp */ - L_tmp = L_shl( L_mult( temp, tmp ), exp + 1 ); + L_tmp = L_shl( L_mult( temp, tmp ), add( exp, 1 ) ); tmp_fx = negate( round_fx( L_tmp ) ); } ELSE @@ -3260,7 +3360,7 @@ ivas_error WIsyn_fx( tmp = shl( CURRCW_DTFS_FX->lag_fx, 7 ); exp = norm_s( tmp ); tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* 22-exp */ - L_tmp = L_shl( L_mult( temp, tmp ), exp + 1 ); + L_tmp = L_shl( L_mult( temp, tmp ), add( exp, 1 ) ); tmp_fx = round_fx( L_tmp ); } @@ -3301,9 +3401,10 @@ ivas_error WIsyn_fx( { /* empty loop */ } - L_temp = L_temp & 0x7fff; + L_temp = L_and( L_temp, 0x7fff ); move16(); /* fraction part */ *ph_offset_fx = extract_l( L_temp ); + move16(); /* free(phase_fx) ; */ free( CURRCW_DTFS_FX ); @@ -3342,12 +3443,18 @@ Word16 ppp_extract_pitch_period_fx( { Word16 i, j, k; Word16 spike = 0, range; + move16(); Word16 max = 0; + move16(); const Word16 *ptr = in + L_FRAME - l; Word32 en1 = 0, Lacc, L_tmp; + move32(); Word16 spike_near_edge = 0, scale; + move16(); Word16 pos_max, neg_max; Word16 spike_pos = 0, spike_neg = 0; + move16(); + move16(); Word16 x, tmp, expa, fraca, expb, fracb, scale1, exp; pos_max = -0x8000L; @@ -3362,7 +3469,7 @@ Word16 ppp_extract_pitch_period_fx( { x = abs_s( ptr[i] ); - if ( GT_16( x, max ) ) + IF( GT_16( x, max ) ) { max = x; move16(); @@ -3383,9 +3490,10 @@ Word16 ppp_extract_pitch_period_fx( /* search for neg spike around the pos spike */ FOR( j = spike - 10; j < spike + 10; j++ ) { - k = ( j + l ) % l; + k = add( j, l ) % l; + move16(); - if ( LT_16( ptr[k], neg_max ) ) + IF( LT_16( ptr[k], neg_max ) ) { neg_max = ptr[k]; move16(); @@ -3401,9 +3509,10 @@ Word16 ppp_extract_pitch_period_fx( /* search for pos spike around the neg spike */ FOR( j = spike - 10; j < spike + 10; j++ ) { - k = ( j + l ) % l; + k = add( j, l ) % l; + move16(); - if ( GT_16( ptr[k], pos_max ) ) + IF( GT_16( ptr[k], pos_max ) ) { pos_max = ptr[k]; move16(); @@ -3414,7 +3523,7 @@ Word16 ppp_extract_pitch_period_fx( } test(); - IF( ( LE_16( ( l - 1 - s_max( spike_pos, spike_neg ) ), 2 ) ) || ( LE_16( s_min( spike_pos, spike_neg ), 2 ) ) ) + IF( ( LE_16( sub( sub( l, 1 ), s_max( spike_pos, spike_neg ) ), 2 ) ) || ( LE_16( s_min( spike_pos, spike_neg ), 2 ) ) ) { *out_of_bound = 1; move16(); @@ -3425,10 +3534,14 @@ Word16 ppp_extract_pitch_period_fx( tmp = (Word16) ( L_max( L_mult( CUTFREE_REL_RANGE_Q2, l ), CUTFREE_ABS_RANGE_Q3 ) ); /* Q3 */ IF( tmp > 0 ) - tmp = add( tmp, 4 ); /* Q3 */ + { + tmp = add( tmp, 4 ); /* Q3 */ + } ELSE + { tmp = sub( tmp, 4 ); /* Q3 */ - range = shr( tmp, 3 ); /* Q0 */ + } + range = shr( tmp, 3 ); /* Q0 */ test(); IF( ( LT_16( spike, range ) ) || ( GE_16( add( spike, range ), l ) ) ) @@ -3566,6 +3679,8 @@ void DTFS_peaktoaverage_fx( DTFS_STRUCTURE X_fx, Word32 *pos_fx, Word16 *Qpos, W { Word32 L_sum; Word32 maxPosEn_fx = 0, maxNegEn_fx = 0, L_temp; + move32(); + move32(); Word16 i; Word16 time_fx[256]; Word16 expa, expb, fraca, fracb, scale; @@ -3573,6 +3688,7 @@ void DTFS_peaktoaverage_fx( DTFS_STRUCTURE X_fx, Word32 *pos_fx, Word16 *Qpos, W Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif L_sum = DTFS_getEngy_P2A_fx( &X_fx ); /* 2Q */ DTFS_fast_fs_inv_fx( &X_fx, time_fx, 256, 8 ); @@ -3589,6 +3705,7 @@ void DTFS_peaktoaverage_fx( DTFS_STRUCTURE X_fx, Word32 *pos_fx, Word16 *Qpos, W if ( GT_32( L_temp, maxPosEn_fx ) ) { maxPosEn_fx = L_temp; /* Q(1) */ + move32(); } } ELSE @@ -3596,6 +3713,7 @@ void DTFS_peaktoaverage_fx( DTFS_STRUCTURE X_fx, Word32 *pos_fx, Word16 *Qpos, W if ( GT_32( L_temp, maxNegEn_fx ) ) { maxNegEn_fx = L_temp; /* Q(1) */ + move32(); } } } @@ -3604,15 +3722,17 @@ void DTFS_peaktoaverage_fx( DTFS_STRUCTURE X_fx, Word32 *pos_fx, Word16 *Qpos, W IF( L_sum == 0 ) { *pos_fx = *neg_fx = 0; - move16(); - move16(); + move32(); + move32(); } ELSE { IF( maxPosEn_fx == 0 ) { *pos_fx = 0; + move32(); *Qpos = 31; + move16(); } ELSE { @@ -3647,13 +3767,17 @@ void DTFS_peaktoaverage_fx( DTFS_STRUCTURE X_fx, Word32 *pos_fx, Word16 *Qpos, W L_tmp = Isqrt_lc( L_deposit_h( tmp ), &exp ); /* Q(31-exp) */ *pos_fx = L_tmp; + move32(); *Qpos = sub( 31, exp ); + move16(); } IF( maxNegEn_fx == 0 ) { *neg_fx = 0; + move32(); *Qneg = 31; + move16(); } ELSE { @@ -3664,7 +3788,7 @@ void DTFS_peaktoaverage_fx( DTFS_STRUCTURE X_fx, Word32 *pos_fx, Word16 *Qpos, W #else fraca = extract_h( L_shl( maxNegEn_fx, expa ) ); #endif - expa = 30 - expa - 1; + expa = sub( Q29, expa ); // 30 - expa - 1; expb = norm_l( L_sum ); @@ -3673,7 +3797,7 @@ void DTFS_peaktoaverage_fx( DTFS_STRUCTURE X_fx, Word32 *pos_fx, Word16 *Qpos, W #else fracb = round_fx( L_shl( L_sum, expb ) ); #endif - expb = 30 - expb - ( 2 * X_fx.Q ); + expb = sub( 30, add( expb, shl( X_fx.Q, 1 ) ) ); scale = shr( sub( fraca, fracb ), 15 ); @@ -3689,7 +3813,9 @@ void DTFS_peaktoaverage_fx( DTFS_STRUCTURE X_fx, Word32 *pos_fx, Word16 *Qpos, W L_tmp = Isqrt_lc( L_deposit_h( tmp ), &exp ); /* Q(31-exp) */ *neg_fx = L_tmp; - *Qneg = 31 - exp; + move32(); + *Qneg = sub( Q31, exp ); + move16(); } } } @@ -3777,19 +3903,19 @@ void GetSinCosTab_fx( Word16 L, Word16 *sinTab, Word16 *cosTab ) w = extract_h( Lw ); /* w in Q9 */ dl = extract_l( Lw ); /* dl has 16 bits left-over */ w = s_and( w, 511 ); - move16(); - move16(); /* t1=cos_table[w%512]; */ t1 = cos_table[w]; + move16(); /* t2=cos_table[add(w,1)%512]; */ dt = cos_diff_table[w]; + move16(); /*t2=cos_table[s_and(add(w,1),511)]; */ /*dt = sub(t2,t1); */ /* Q15 */ IF( dl < 0 ) { L_tmp = L_add( 65536, dl ); - Ltemp = ( L_tmp * dt ); + Ltemp = imult3216( L_tmp, dt ); } ELSE { @@ -3809,13 +3935,14 @@ void GetSinCosTab_fx( Word16 L, Word16 *sinTab, Word16 *cosTab ) move16(); /* t2=cos_table[add(w,1)%512]; */ dt = cos_diff_table[w]; + move16(); /*t2=cos_table[s_and(add(w,1),511)];move16(); */ /*dt = sub(t2,t1); */ /* dt=t2-t1, Q15 */ IF( dl < 0 ) { L_tmp = L_add( 65536, dl ); - Ltemp = ( L_tmp * dt ); + Ltemp = imult3216( L_tmp, dt ); } ELSE { @@ -3844,11 +3971,8 @@ static void c_fft_wi_fx( Word16 *farray_ptr_fx, Word16 size, Word16 stage, Word1 Word16 n_2, K; Word16 ii_table[8]; - - move16(); - move16(); - K = 0; + move16(); FOR( k = 256; k > 0; k -= size ) { @@ -3856,45 +3980,47 @@ static void c_fft_wi_fx( Word16 *farray_ptr_fx, Word16 size, Word16 stage, Word1 } n_2 = shr( size, 1 ); FOR( i = 1; i <= stage; i++ ) - ii_table[i - 1] = shr( size, i ); + { + ii_table[i - 1] = shr( size, i ); + } /* Rearrange the input array in bit reversed order */ j = 0; move16(); FOR( i = 0; i < size - 2; i = i + 2 ) { - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); IF( GT_16( j, i ) ) { ftmp_fx = *( farray_ptr_fx + i ); *( farray_ptr_fx + i ) = *( farray_ptr_fx + j ); *( farray_ptr_fx + j ) = (Word16) ftmp_fx; + move32(); + move16(); + move16(); - ftmp_fx = *( farray_ptr_fx + i + 1 ); - *( farray_ptr_fx + i + 1 ) = *( farray_ptr_fx + j + 1 ); - *( farray_ptr_fx + j + 1 ) = (Word16) ftmp_fx; + ftmp_fx = *( farray_ptr_fx + add( i, 1 ) ); + *( farray_ptr_fx + add( i, 1 ) ) = *( farray_ptr_fx + add( j, 1 ) ); + *( farray_ptr_fx + add( j, 1 ) ) = (Word16) ftmp_fx; + move32(); + move16(); + move16(); } k = n_2; move16(); - WHILE( j >= k ) + WHILE( GE_16( j, k ) ) { j = sub( j, k ); k = shr( k, 1 ); } - j += k; + j = add( j, k ); } /* The FFT part */ - IF( isign == 1 ) + IF( EQ_16( isign, 1 ) ) { FOR( i = 0; i < stage; i++ ) /* i is stage counter */ { @@ -3907,21 +4033,21 @@ static void c_fft_wi_fx( Word16 *farray_ptr_fx, Word16 size, Word16 stage, Word1 FOR( j = 0; j < jj; j = j + 2 ) /* j is sample counter */ { - ji = j * ii; /* ji is phase table index */ + ji = i_mult( j, ii ); /* ji is phase table index */ FOR( k = j; k < size; k = k + kk ) /* k is butterfly top */ { kj = add( k, jj ); /* kj is butterfly bottom */ - temp_sand = s_and( ( ji * K + 384 ), 511 ); + temp_sand = s_and( ( add( i_mult( ji, K ), 384 ) ), 511 ); /* Butterfly computations */ /* ftmp_real_fx = L_sub(L_mult(*(farray_ptr_fx + kj), cos_table[ji*K]), */ /* L_mult(*(farray_ptr_fx + kj + 1), cos_table[(ji*K+384)%512])); */ - ftmp_real_fx = L_msu( L_mult( *( farray_ptr_fx + kj ), cos_table[ji * K] ), - *( farray_ptr_fx + kj + 1 ), cos_table[temp_sand] ); + ftmp_real_fx = L_msu( L_mult( *( farray_ptr_fx + kj ), cos_table[i_mult( ji, K )] ), + *( farray_ptr_fx + add( kj, 1 ) ), cos_table[temp_sand] ); /* ftmp_imag_fx = L_add(L_mult(*(farray_ptr_fx + kj + 1), cos_table[ji*K]), */ /* L_mult(*(farray_ptr_fx + kj), cos_table[(ji*K+384)%512])); */ - ftmp_imag_fx = L_mac( L_mult( *( farray_ptr_fx + kj + 1 ), cos_table[ji * K] ), + ftmp_imag_fx = L_mac( L_mult( *( farray_ptr_fx + add( kj, 1 ) ), cos_table[i_mult( ji, K )] ), *( farray_ptr_fx + kj ), cos_table[temp_sand] ); tmp1 = round_fx( ftmp_real_fx ); @@ -3931,16 +4057,16 @@ static void c_fft_wi_fx( Word16 *farray_ptr_fx, Word16 size, Word16 stage, Word1 *( farray_ptr_fx + kj ) = shr( tmp, 1 ); move16(); - tmp = sub( *( farray_ptr_fx + k + 1 ), tmp2 ); - *( farray_ptr_fx + kj + 1 ) = shr( tmp, 1 ); + tmp = sub( *( farray_ptr_fx + add( k, 1 ) ), tmp2 ); + *( farray_ptr_fx + add( kj, 1 ) ) = shr( tmp, 1 ); move16(); tmp = add( *( farray_ptr_fx + k ), tmp1 ); *( farray_ptr_fx + k ) = shr( tmp, 1 ); move16(); - tmp = add( *( farray_ptr_fx + k + 1 ), tmp2 ); - *( farray_ptr_fx + k + 1 ) = shr( tmp, 1 ); + tmp = add( *( farray_ptr_fx + add( k, 1 ) ), tmp2 ); + *( farray_ptr_fx + add( k, 1 ) ) = shr( tmp, 1 ); move16(); } } @@ -3958,21 +4084,21 @@ static void c_fft_wi_fx( Word16 *farray_ptr_fx, Word16 size, Word16 stage, Word1 FOR( j = 0; j < jj; j = j + 2 ) /* j is sample counter */ { - ji = j * ii; /* ji is phase table index */ + ji = i_mult( j, ii ); /* ji is phase table index */ FOR( k = j; k < size; k = k + kk ) /* k is butterfly top */ { kj = add( k, jj ); /* kj is butterfly bottom */ - temp_sand = s_and( ( ji * K + 384 ), 511 ); + temp_sand = s_and( ( add( i_mult( ji, K ), 384 ) ), 511 ); /* Butterfly computations */ /* ftmp_real_fx = L_add(L_mult(*(farray_ptr_fx + kj), cos_table[ji*K]), */ /* L_mult(*(farray_ptr_fx + kj + 1), cos_table[(ji*K+384)%512])); */ - ftmp_real_fx = L_mac( L_mult( *( farray_ptr_fx + kj ), cos_table[ji * K] ), + ftmp_real_fx = L_mac( L_mult( *( farray_ptr_fx + kj ), cos_table[i_mult( ji, K )] ), *( farray_ptr_fx + kj + 1 ), cos_table[temp_sand] ); /* ftmp_imag_fx = L_sub(L_mult(*(farray_ptr_fx + kj + 1), cos_table[ji*K]), */ /* L_mult(*(farray_ptr_fx + kj), cos_table[(ji*K+384)%512])); */ - ftmp_imag_fx = L_msu( L_mult( *( farray_ptr_fx + kj + 1 ), cos_table[ji * K] ), + ftmp_imag_fx = L_msu( L_mult( *( farray_ptr_fx + add( kj, 1 ) ), cos_table[i_mult( ji, K )] ), *( farray_ptr_fx + kj ), cos_table[temp_sand] ); tmp1 = round_fx( ftmp_real_fx ); @@ -4024,7 +4150,7 @@ void r_fft_4_fx( Word16 *farray_ptr_fx, Word16 size, Word16 stage, Word16 isign } /* The FFT part */ - IF( isign == 1 ) + IF( EQ_16( isign, 1 ) ) { /* Perform the complex FFT */ c_fft_wi_fx( farray_ptr_fx, size, stage, isign ); @@ -4033,10 +4159,12 @@ void r_fft_4_fx( Word16 *farray_ptr_fx, Word16 size, Word16 stage, Word16 isign ftmp1_real_fx = *farray_ptr_fx; ftmp2_real_fx = *( farray_ptr_fx + 1 ); *farray_ptr_fx = add( ftmp1_real_fx, ftmp2_real_fx ); + move16(); *( farray_ptr_fx + 1 ) = sub( ftmp1_real_fx, ftmp2_real_fx ); + move16(); /* Now, handle the remaining positive frequencies */ - j = size - 2; + j = sub( size, 2 ); FOR( i = 2; i <= n_2; i = i + 2 ) { ftmp1_real_fx = add( *( farray_ptr_fx + i ), *( farray_ptr_fx + j ) ); @@ -4046,24 +4174,28 @@ void r_fft_4_fx( Word16 *farray_ptr_fx, Word16 size, Word16 stage, Word16 isign Lftmp1_real_fx = L_deposit_h( ftmp1_real_fx ); Lftmp1_imag_fx = L_deposit_h( ftmp1_imag_fx ); - temp_sand = s_and( ( i * K + 384 ), 511 ); + temp_sand = s_and( add( i_mult( i, K ), 384 ), 511 ); /* Ltmp1_fx = L_sub(L_mult(ftmp2_real_fx, cos_table[i*K]), L_mult(ftmp2_imag_fx, cos_table[(i*K+384)%512])); */ - Ltmp1_fx = L_msu( L_mult( ftmp2_real_fx, cos_table[i * K] ), ftmp2_imag_fx, cos_table[temp_sand] ); + Ltmp1_fx = L_msu( L_mult( ftmp2_real_fx, cos_table[i_mult( i, K )] ), ftmp2_imag_fx, cos_table[temp_sand] ); *( farray_ptr_fx + i ) = round_fx( L_shr( L_add( Lftmp1_real_fx, Ltmp1_fx ), 1 ) ); + move16(); /* Ltmp1_fx = L_add(L_mult(ftmp2_imag_fx, cos_table[i*K]), L_mult(ftmp2_real_fx, cos_table[(i*K+384)%512])); */ - Ltmp1_fx = L_mac( L_mult( ftmp2_imag_fx, cos_table[i * K] ), ftmp2_real_fx, cos_table[temp_sand] ); + Ltmp1_fx = L_mac( L_mult( ftmp2_imag_fx, cos_table[i_mult( i, K )] ), ftmp2_real_fx, cos_table[temp_sand] ); *( farray_ptr_fx + i + 1 ) = round_fx( L_shr( L_add( Lftmp1_imag_fx, Ltmp1_fx ), 1 ) ); + move16(); /* Ltmp1_fx = L_add(L_mult(ftmp2_real_fx, cos_table[j*K]), L_mult(ftmp2_imag_fx, cos_table[(j*K+384)%512])); */ - Ltmp1_fx = L_mac( L_mult( ftmp2_real_fx, cos_table[j * K] ), ftmp2_imag_fx, cos_table[temp_sand] ); + Ltmp1_fx = L_mac( L_mult( ftmp2_real_fx, cos_table[i_mult( j, K )] ), ftmp2_imag_fx, cos_table[temp_sand] ); *( farray_ptr_fx + j ) = round_fx( L_shr( L_add( Lftmp1_real_fx, Ltmp1_fx ), 1 ) ); + move16(); /* Ltmp1_fx = L_add(L_negate(L_mult(ftmp2_imag_fx, cos_table[j*K])), L_mult(ftmp2_real_fx, cos_table[(j*K+384)%512])); */ - Ltmp1_fx = L_msu( L_mult( ftmp2_real_fx, cos_table[temp_sand] ), ftmp2_imag_fx, cos_table[j * K] ); + Ltmp1_fx = L_msu( L_mult( ftmp2_real_fx, cos_table[temp_sand] ), ftmp2_imag_fx, cos_table[i_mult( j, K )] ); Ltmp2_fx = L_sub( Ltmp1_fx, Lftmp1_imag_fx ); *( farray_ptr_fx + j + 1 ) = round_fx( L_shr( Ltmp2_fx, 1 ) ); - j = size - i; + move16(); + j = sub( size, i ); } } ELSE @@ -4093,23 +4225,27 @@ void r_fft_4_fx( Word16 *farray_ptr_fx, Word16 size, Word16 stage, Word16 isign Lftmp1_real_fx = L_deposit_h( ftmp1_real_fx ); Lftmp1_imag_fx = L_deposit_h( ftmp1_imag_fx ); - temp_sand = s_and( ( i * K + 384 ), 511 ); + temp_sand = s_and( ( add( i_mult( i, K ), 384 ) ), 511 ); /* Ltmp1_fx = L_add(L_mult(ftmp2_real_fx, cos_table[i*K]), L_mult(ftmp2_imag_fx, cos_table[(i*K+384)%512])); */ - Ltmp1_fx = L_mac( L_mult( ftmp2_real_fx, cos_table[i * K] ), ftmp2_imag_fx, cos_table[temp_sand] ); + Ltmp1_fx = L_mac( L_mult( ftmp2_real_fx, cos_table[i_mult( i, K )] ), ftmp2_imag_fx, cos_table[temp_sand] ); *( farray_ptr_fx + i ) = round_fx( L_shr( L_add( Lftmp1_real_fx, Ltmp1_fx ), 1 ) ); + move16(); /* Ltmp1_fx = L_sub(L_mult(ftmp2_imag_fx, cos_table[i*K]), L_mult(ftmp2_real_fx, cos_table[(i*K+384)%512])); */ - Ltmp1_fx = L_msu( L_mult( ftmp2_imag_fx, cos_table[i * K] ), ftmp2_real_fx, cos_table[temp_sand] ); + Ltmp1_fx = L_msu( L_mult( ftmp2_imag_fx, cos_table[i_mult( i, K )] ), ftmp2_real_fx, cos_table[temp_sand] ); *( farray_ptr_fx + i + 1 ) = round_fx( L_shr( L_add( Lftmp1_imag_fx, Ltmp1_fx ), 1 ) ); + move16(); /* Ltmp1_fx = L_sub(L_mult(ftmp2_real_fx, cos_table[j*K]), L_mult(ftmp2_imag_fx, cos_table[(j*K+384)%512])); */ - Ltmp1_fx = L_msu( L_mult( ftmp2_real_fx, cos_table[j * K] ), ftmp2_imag_fx, cos_table[temp_sand] ); + Ltmp1_fx = L_msu( L_mult( ftmp2_real_fx, cos_table[i_mult( j, K )] ), ftmp2_imag_fx, cos_table[temp_sand] ); *( farray_ptr_fx + j ) = round_fx( L_shr( L_add( Lftmp1_real_fx, Ltmp1_fx ), 1 ) ); + move16(); /* Ltmp1_fx = L_negate(L_add(L_mult(ftmp2_imag_fx, cos_table[j*K]), L_mult(ftmp2_real_fx, cos_table[(j*K+384)%512]))); */ - Ltmp1_fx = L_negate( L_mac( L_mult( ftmp2_imag_fx, cos_table[j * K] ), ftmp2_real_fx, cos_table[temp_sand] ) ); + Ltmp1_fx = L_negate( L_mac( L_mult( ftmp2_imag_fx, cos_table[i_mult( j, K )] ), ftmp2_real_fx, cos_table[temp_sand] ) ); Ltmp2_fx = L_sub( Ltmp1_fx, Lftmp1_imag_fx ); *( farray_ptr_fx + j + 1 ) = round_fx( L_shr( Ltmp2_fx, 1 ) ); + move16(); } /* Perform the complex IFFT */ @@ -4162,13 +4298,15 @@ void copy_phase_fx( DTFS_STRUCTURE *X1_fx, DTFS_STRUCTURE X2_fx, DTFS_STRUCTURE Word16 exp, tmp, exp1; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif - move16(); retX_fx->lag_fx = X1_fx->lag_fx; + move16(); retX_fx->Q = sub( X2_fx.Q, 1 ); /* equivalent to 2x MIN_FX(shr(sub(X_fx->lag_fx,1),1),X_fx->nH_fx) */ - HalfLag = s_min( shr( X1_fx->lag_fx, 1 ), X1_fx->nH_fx ); move16(); + HalfLag = s_min( shr( X1_fx->lag_fx, 1 ), X1_fx->nH_fx ); + FOR( k = 1; k <= HalfLag; k++ ) { #ifdef BASOP_NOGLOB @@ -4184,11 +4322,15 @@ void copy_phase_fx( DTFS_STRUCTURE *X1_fx, DTFS_STRUCTURE X2_fx, DTFS_STRUCTURE exp1 = sub( sub( 30, exp ), 2 * X1_fx->Q + 1 ); IF( tmp ) - tmp = div_s( 16384, tmp ); /* 15+exp1 */ + { + tmp = div_s( 16384, tmp ); /* 15+exp1 */ + } ELSE + { tmp = 0; + } tmp = shr( tmp, 1 ); - q = 15 + exp1 + 16 - 1; + q = sub( add( add( 15, exp1 ), 16 ), 1 ); IF( tmp ) { @@ -4199,10 +4341,15 @@ void copy_phase_fx( DTFS_STRUCTURE *X1_fx, DTFS_STRUCTURE X2_fx, DTFS_STRUCTURE Ltemp_fx = Isqrt_lc( L_tmp, &exp ); /* Q(31-exp) */ } ELSE + { Ltemp_fx = 0; + move32(); + } - if ( s_and( q, 1 ) ) + IF( s_and( q, 1 ) ) + { Ltemp_fx = Mult_32_16( Ltemp_fx, 23170 ); /* 23170 is 1/sqrt(2) in Q15 */ + } q = shr( q, 1 ); /* Ltemp_fx in Q(q+16) */ @@ -4213,21 +4360,25 @@ void copy_phase_fx( DTFS_STRUCTURE *X1_fx, DTFS_STRUCTURE X2_fx, DTFS_STRUCTURE Ltemp_fx = L_add_o( L_shr( Ltemp_fx, 15 ), L_mult_o( X1_fx->b_fx[k], d1h, &Overflow ), &Overflow ); /* sin(w) in Q(q+16+Q-15) */ sn = round_fx_o( L_shl_o( Ltemp_fx, sub( 30, add( q, X1_fx->Q ) ), &Overflow ), &Overflow ); /* Q15 */ retX_fx->b_fx[k] = mult_ro( X2_fx.a_fx[k], sn, &Overflow ); /* X2_fx.Q */ + move16(); Ltemp_fx = L_mult0( X1_fx->a_fx[k], d1l ); Ltemp_fx = L_add_o( L_shr( Ltemp_fx, 15 ), L_mult_o( X1_fx->a_fx[k], d1h, &Overflow ), &Overflow ); /* cos(w) in Q(q+Q+1) */ cn = round_fx_o( L_shl_o( Ltemp_fx, sub( 30, add( q, X1_fx->Q ) ), &Overflow ), &Overflow ); /* Q15 */ retX_fx->a_fx[k] = mult_ro( X2_fx.a_fx[k], cn, &Overflow ); /* X2_fx.Q */ + move16(); #else Ltemp_fx = L_mult0( X1_fx->b_fx[k], d1l ); Ltemp_fx = L_add( L_shr( Ltemp_fx, 15 ), L_mult( X1_fx->b_fx[k], d1h ) ); /* sin(w) in Q(q+16+Q-15) */ sn = round_fx( L_shl( Ltemp_fx, sub( 30, add( q, X1_fx->Q ) ) ) ); /* Q15 */ retX_fx->b_fx[k] = mult_r( X2_fx.a_fx[k], sn ); /* X2_fx.Q */ + move16(); Ltemp_fx = L_mult0( X1_fx->a_fx[k], d1l ); Ltemp_fx = L_add( L_shr( Ltemp_fx, 15 ), L_mult( X1_fx->a_fx[k], d1h ) ); /* cos(w) in Q(q+Q+1) */ cn = round_fx( L_shl( Ltemp_fx, sub( 30, add( q, X1_fx->Q ) ) ) ); /* Q15 */ retX_fx->a_fx[k] = mult_r( X2_fx.a_fx[k], cn ); /* X2_fx.Q */ + move16(); #endif } k = sub( k, 1 ); @@ -4283,6 +4434,7 @@ Word32 getSpEngyFromResAmp_fx( DTFS_STRUCTURE *X_fx, Word16 lband, Word16 hband, Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif en = L_deposit_l( 0 ); @@ -4321,7 +4473,7 @@ Word32 getSpEngyFromResAmp_fx( DTFS_STRUCTURE *X_fx, Word16 lband, Word16 hband, #ifdef BASOP_NOGLOB Lacc = L_mac_o( Lacc, curr_lpc[i], cos_tab[n % M_fx], &Overflow ); /* Q28 */ #else - Lacc = L_mac( Lacc, curr_lpc[i], cos_tab[n % M_fx] ); /* Q28 */ + Lacc = L_mac( Lacc, curr_lpc[i], cos_tab[n % M_fx] ); /* Q28 */ #endif n = add( n, k4 ); /* n=4*i*k */ } @@ -4336,7 +4488,7 @@ Word32 getSpEngyFromResAmp_fx( DTFS_STRUCTURE *X_fx, Word16 lband, Word16 hband, #ifdef BASOP_NOGLOB Lacc = L_msu_o( Lacc, curr_lpc[i], sin_tab[n % M_fx], &Overflow ); /* Q28 */ #else - Lacc = L_msu( Lacc, curr_lpc[i], sin_tab[n % M_fx] ); /* Q28 */ + Lacc = L_msu( Lacc, curr_lpc[i], sin_tab[n % M_fx] ); /* Q28 */ #endif n = add( n, k4 ); /* n=4*i*k */ } @@ -4345,7 +4497,7 @@ Word32 getSpEngyFromResAmp_fx( DTFS_STRUCTURE *X_fx, Word16 lband, Word16 hband, #ifdef BASOP_NOGLOB Lacc = L_add_o( Mult_32_32( Re, Re ), Mult_32_32( Im, Im ), &Overflow ); /* Lacc=Re^2+Im^2 in Q23 */ #else - Lacc = L_add( Mult_32_32( Re, Re ), Mult_32_32( Im, Im ) ); /* Lacc=Re^2+Im^2 in Q23 */ + Lacc = L_add( Mult_32_32( Re, Re ), Mult_32_32( Im, Im ) ); /* Lacc=Re^2+Im^2 in Q23 */ #endif Ltemp = L_mult0( X_fx->a_fx[k], X_fx->a_fx[k] ); /* 2*a[k]^2 in 2Q */ /* Ltemp=(Word32)L_sat32_40(divide_dp(Ltemp,Lacc,-19,1)); : Ltemp in Q(2Q-13) */ @@ -4428,6 +4580,7 @@ void DTFS_poleFilter_fx( DTFS_STRUCTURE *X_fx, Word16 *LPC, Word16 N, Word16 *S_ Word16 exp, tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif Qmin = 32767; move16(); @@ -4443,8 +4596,8 @@ void DTFS_poleFilter_fx( DTFS_STRUCTURE *X_fx, Word16 *LPC, Word16 N, Word16 *S_ FOR( n = 0; n < N; n++ ) { #ifdef BASOP_NOGLOB - sum1_fx = L_mac_o( sum1_fx, LPC[n], C_fx[( 4 * temp2 ) % ( 4 * X_fx->lag_fx )], &Overflow ); /* Q(12+15+1) */ - sum2_fx = L_mac_o( sum2_fx, LPC[n], S_fx[( 4 * temp2 ) % ( 4 * X_fx->lag_fx )], &Overflow ); /* Q(12+15+1) */ + sum1_fx = L_mac_o( sum1_fx, LPC[n], C_fx[shl( temp2, 2 ) % shl( X_fx->lag_fx, 2 )], &Overflow ); /* Q(12+15+1) */ + sum2_fx = L_mac_o( sum2_fx, LPC[n], S_fx[shl( temp2, 2 ) % shl( X_fx->lag_fx, 2 )], &Overflow ); /* Q(12+15+1) */ #else sum1_fx = L_mac( sum1_fx, LPC[n], C_fx[( 4 * temp2 ) % ( 4 * X_fx->lag_fx )] ); /* Q(12+15+1) */ sum2_fx = L_mac( sum2_fx, LPC[n], S_fx[( 4 * temp2 ) % ( 4 * X_fx->lag_fx )] ); /* Q(12+15+1) */ @@ -4520,7 +4673,9 @@ void DTFS_poleFilter_fx( DTFS_STRUCTURE *X_fx, Word16 *LPC, Word16 N, Word16 *S_ } nb = sub( nb, 1 ); /* leave one more sign bit */ X_fx->a_fx[k] = round_fx( L_shl( sum1_fx, nb ) ); /* Q(Q-temp1+22+nb-16)=Q(Q-temp1+nb+2) */ + move16(); X_fx->b_fx[k] = round_fx( L_shl( sum2_fx, nb ) ); /* Q(Q-temp1+nb+2) */ + move16(); Qab[k] = add( sub( add( nb, 2 ), temp1 ), X_fx->Q ); @@ -4540,6 +4695,7 @@ void DTFS_poleFilter_fx( DTFS_STRUCTURE *X_fx, Word16 *LPC, Word16 N, Word16 *S_ } X_fx->Q = Qmin; + move16(); } /*===================================================================*/ /* FUNCTION : poleFilter_setup_fx() */ @@ -4574,6 +4730,7 @@ void poleFilter_setup_fx( const Word16 *LPC, Word16 N, DTFS_STRUCTURE X_fx, Word Word16 exp, tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif HalfLag = s_min( shr( X_fx.lag_fx, 1 ), X_fx.nH_fx ); @@ -4618,7 +4775,11 @@ void poleFilter_setup_fx( const Word16 *LPC, Word16 N, DTFS_STRUCTURE X_fx, Word } n2 = sub( n2, 1 ); temp1 = pf_temp1[k] = round_fx( (Word32) L_shl( sum1_fx, n2 ) ); /* Q(12+15+1+n2-16)=Q(12+n2) */ + move16(); + move16(); temp2 = pf_temp2[k] = round_fx( (Word32) L_shl( sum2_fx, n2 ) ); /* Q(12+n2) */ + move16(); + move16(); /* Calculate the circular convolution */ sum = L_mac( L_mult( temp1, temp1 ), temp2, temp2 ); /* Q(12+n2+12+n2+1)=Q(25+2*n2) */ @@ -4677,7 +4838,7 @@ Word32 DTFS_getEngy_band_wb_fx( DTFS_STRUCTURE X_fx, Word16 lband, Word16 hband { freq_fx = L_mult( k, 12800 ); - if ( GE_32( freq_fx, L_lband ) ) + IF( GE_32( freq_fx, L_lband ) ) { BREAK; } @@ -4687,7 +4848,7 @@ Word32 DTFS_getEngy_band_wb_fx( DTFS_STRUCTURE X_fx, Word16 lband, Word16 hband FOR( k = 1; k <= HalfLag; k++ ) { freq_fx = L_mult( k, 12800 ); - if ( GE_32( freq_fx, L_hband ) ) + IF( GE_32( freq_fx, L_hband ) ) { BREAK; } @@ -4702,14 +4863,14 @@ Word32 DTFS_getEngy_band_wb_fx( DTFS_STRUCTURE X_fx, Word16 lband, Word16 hband } en_fx = L_shr( en_fx, 1 ); /* 2*X1.Q+1 */ - if ( lband == 0 ) + IF( lband == 0 ) { en_fx = L_mac0( en_fx, X_fx.a_fx[0], X_fx.a_fx[0] ); /* 2*X1.Q+1 */ } /* IF ((X_fx.lag_fx%2 == 0) && (hband == X_fx.upper_cut_off_freq_fx)) */ test(); - IF( ( s_and( X_fx.lag_fx, 1 ) == 0 ) && ( hband == X_fx.upper_cut_off_freq_fx ) ) + IF( ( s_and( X_fx.lag_fx, 1 ) == 0 ) && EQ_16( hband, X_fx.upper_cut_off_freq_fx ) ) { en_fx = L_mac0( en_fx, X_fx.a_fx[k], X_fx.a_fx[k] ); en_fx = L_mac0( en_fx, X_fx.b_fx[k], X_fx.b_fx[k] ); diff --git a/lib_com/window_fx.c b/lib_com/window_fx.c index d848b2dd3..6ef8081fd 100644 --- a/lib_com/window_fx.c +++ b/lib_com/window_fx.c @@ -32,16 +32,17 @@ void ham_cos_window( Word32 cte, cc; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move16(); #endif assert( n1 >= 102 ); /* if n1 is too low -> overflow in div_l */ /* cte = PI2/(Float32)(2*n1 - 1); */ BASOP_SATURATE_WARNING_OFF_EVS - move16(); cte = L_deposit_l( div_l( PI2_10Q21, sub( shl( n1, 1 ), 1 ) ) ); /*0Q15*/ BASOP_SATURATE_WARNING_ON_EVS cc = 0; + move32(); FOR( i = 0; i < n1; i++ ) { /* fh_f[i] = 0.54f - 0.46f * (Float32)cos(cc); */ @@ -61,7 +62,7 @@ void ham_cos_window( /* cte = PI2/(Float32)(4*n2 - 1); */ cte = L_deposit_l( div_l( PI2_11Q20, sub( shl( n2, 2 ), 1 ) ) ); /*0Q15*/ cc = 0; - move16(); + move32(); add( n1, n2 ); BASOP_SATURATE_WARNING_OFF_EVS @@ -96,9 +97,10 @@ void ham_cos_window_ivas( // cte_fx = div_s(1, sub(shl(n1, 1), 1)); cc_fx = 0; move16(); - for ( i = 0; i < n1; i++ ) + FOR( i = 0; i < n1; i++ ) { *fh++ = sub( 17694, mult( getCosWord16R2( cc_fx ), 15073 ) ); + move16(); cc_fx = div_s( add( i, 1 ), sub( shl( n1, 1 ), 1 ) ); // add(cc_fx, cte_fx); } @@ -109,8 +111,8 @@ void ham_cos_window_ivas( for ( i = 0; i < n2; i++ ) { *fh++ = getCosWord16R2( cc_fx ); + move16(); cc_fx = div_s( add( i, 1 ), sub( shl( n1, 2 ), 1 ) ); - ; } return; diff --git a/lib_com/window_ola_fx.c b/lib_com/window_ola_fx.c index 32ae48d50..ac7e63d8a 100644 --- a/lib_com/window_ola_fx.c +++ b/lib_com/window_ola_fx.c @@ -32,7 +32,7 @@ void sinq_fx( #ifdef BASOP_NOGLOB tmp1 = add_sat( shl_sat( tmp, 1 ), phi ); /*Q15 */ #else - tmp1 = add( shl( tmp, 1 ), phi ); /*Q15 */ + tmp1 = add( shl( tmp, 1 ), phi ); /*Q15 */ #endif L_tmp = L_mult( tmp1, tmp1 ); /*Q31 */ L_tmp = Mult_32_16( L_tmp, tmp1 ); /*Q31 */ @@ -67,9 +67,10 @@ void sinq_fx( tmp_old = L_shl_sat( L_tmp, 1 ); /*Q31 */ x[i] = round_fx_sat( tmp_old ); /*Q15 */ #else - tmp_old = L_shl( L_tmp, 1 ); /*Q31 */ - x[i] = round_fx( tmp_old ); /*Q15 */ + tmp_old = L_shl( L_tmp, 1 ); /*Q31 */ + x[i] = round_fx( tmp_old ); /*Q15 */ #endif + move16(); } return; @@ -130,6 +131,7 @@ void window_ola_fx( move32(); } *Q_sig = add( *Q_sig, temp ); + move16(); /* rescaling for overlapp add */ @@ -137,14 +139,17 @@ void window_ola_fx( { Copy_Scale_sig( OldauOut, OldauOut, L, sub( *Q_sig, add( *Q_old, 15 ) ) ); *Q_old = sub( *Q_sig, 15 ); + move16(); } ELSE IF( LT_16( add( *Q_old, 15 ), *Q_sig ) ) { Scale_sig32( ImdctOut, L, sub( add( *Q_old, 15 ), *Q_sig ) ); *Q_sig = add( *Q_old, 15 ); + move16(); } *Q_sig = *Q_old; /*fixing output to new Q_old */ + move16(); decimate = 1; @@ -285,6 +290,7 @@ void window_ola_fx( FOR( i = 0; i < temp_len; i++ ) { *p1++ = round_fx( L_shl( *pa++, 1 ) ); + move16(); } /*p1=paout+shr(L,1);*/ @@ -293,6 +299,7 @@ void window_ola_fx( FOR( i = 0; i < temp_len; i++ ) { *p1++ = round_fx( L_negate( L_shl( *pa--, 1 ) ) ); + move16(); } @@ -323,11 +330,10 @@ void window_ola_fx( { #ifdef BASOP_NOGLOB *p1 = add_sat( mult( *p1, *p2 ), shl_sat( mult( *p4, *p3 ), 5 ) ); /*auOut[i]*SS2[i]+ OldauOut[i+n]*(SS2[L-n-i-1])/(wret2[i]+0.01f);;*/ - move16(); #else - *p1 = add( mult( *p1, *p2 ), shl( mult( *p4, *p3 ), 5 ) ); /*auOut[i]*SS2[i]+ OldauOut[i+n]*(SS2[L-n-i-1])/(wret2[i]+0.01f);;*/ - move16(); + *p1 = add( mult( *p1, *p2 ), shl( mult( *p4, *p3 ), 5 ) ); /*auOut[i]*SS2[i]+ OldauOut[i+n]*(SS2[L-n-i-1])/(wret2[i]+0.01f);;*/ #endif + move16(); p1++; p2++; p3++; @@ -362,6 +368,7 @@ void window_ola_fx( p3 -= decimate; *p1++ = round_fx( L_add( L_shl( Mult_32_16( *pa++, *p5-- ), 1 ), L_deposit_h( *p4++ ) ) ); /* (( Qin + Q15 -15)+1 + ( Qin - 15 + 16))-1 */ #endif + move16(); /* paout[i] = ImdctOut[L/2 + i] * win_right[(2*L_FRAME16k-(n16+(i-n)/2))*decimate-1-decay-windecay48]+OldauOut[i]; paout[i+1] = ImdctOut[L/2 + i +1] * win_int_right[2*L_FRAME16k-(n16+(i-n)/2)-1-windecay16]+OldauOut[i+1];*/ } @@ -380,6 +387,7 @@ void window_ola_fx( *p1++ = round_fx( L_sub( L_deposit_h( *p4++ ), L_shl( Mult_32_16( *pa--, *p5-- ), 1 ) ) ); /* (( Qin + Q15 -15)+1 + ( Qin - 15 + 16))-1 */ *p1++ = round_fx( L_sub( L_deposit_h( *p4++ ), L_shl( Mult_32_16( *pa--, *p3 ), 1 ) ) ); /* (( Qin + Q15 -15)+1 + ( Qin - 15 + 16))-1 */ #endif + move16(); p3 -= decimate; /* paout[L/2 + i ] = -ImdctOut[L - 1 - i] * win_int_right[(3*L_FRAME16k/2-1-i/2)-windecay16]+OldauOut[i+L/2]; paout[L/2 + i +1] = -ImdctOut[L - 1 - (i+1)] * win_right[(3*L_FRAME16k/2-1-i/2)*decimate+decay-windecay48]+OldauOut[i+L/2+1]; */ @@ -387,7 +395,9 @@ void window_ola_fx( FOR( i = 0; i < n; i += 2 ) { *p1++ = round_fx_sat( L_sub_sat( L_deposit_h( *p4++ ), L_shl( *pa--, 1 ) ) ); + move16(); *p1++ = round_fx_sat( L_sub_sat( L_deposit_h( *p4++ ), L_shl( *pa--, 1 ) ) ); + move16(); /* paout[L/2 + i +1] = -ImdctOut[L - 1 - (i+1)]+OldauOut[i+L/2+1] ; paout[L/2 + i ] = -ImdctOut[L - 1 - i]+OldauOut[i+L/2]; */ } @@ -402,7 +412,9 @@ void window_ola_fx( FOR( i = 0; i < temp_len; i += 2 ) { *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa++, *p2-- ), 1 ) ) ); + move16(); *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa++, *p3 ), 1 ) ) ); + move16(); p3 -= decimate; /* OldauOut[L/2 + i] = -ImdctOut[i] * win_int_left[(L_FRAME16k/2-i/2-1)]; OldauOut[L/2 + i +1] = -ImdctOut[i+1] * win_left[(L_FRAME16k/2-i/2-1)*decimate+decay]*/ @@ -417,7 +429,9 @@ void window_ola_fx( FOR( i = 0; i < temp_len; i += 2 ) { *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa--, *p2 ), 1 ) ) ); + move16(); *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa--, *p3-- ), 1 ) ) ); + move16(); p2 -= decimate; /* OldauOut[ i] = -ImdctOut[L/2 - 1 - i] *win_left[(L_FRAME16k-i/2)*decimate-decay-1]; OldauOut[ i +1] = -ImdctOut[L/2 - 1 - (i +1)] * win_int_left[L_FRAME16k-(i/2)-1];; */ @@ -441,6 +455,7 @@ void window_ola_fx( #else *p1++ = round_fx( L_add( L_shl( Mult_32_16( *pa++, *p3 ), 1 ), L_deposit_h( *p4++ ) ) ); /* (( Qin + Q15 -15)+1 + ( Qin - 15 + 16))-1 */ #endif + move16(); p3 -= decimate; /*paout[i] = ImdctOut[L/2 + i] * win_right[(2*L-i)*decimate-1-decay-windecay48]+OldauOut[i];*/ } @@ -456,12 +471,14 @@ void window_ola_fx( #else *p1++ = round_fx( L_sub( L_deposit_h( *p4++ ), L_shl( Mult_32_16( *pa--, *p3 ), 1 ) ) ); /* (( Qin + Q15 -15)+1 + ( Qin - 15 + 16))-1 */ #endif + move16(); p3 -= decimate; /* paout[L/2 + i] = -ImdctOut[L - 1 - i] * win_right[(3*L/2-1-i)*decimate+decay-windecay48]+OldauOut[i+L/2]; */ } FOR( i = 0; i < n; i++ ) { *p1++ = round_fx_sat( L_sub_sat( L_deposit_h( *p4++ ), L_shl( *pa--, 1 ) ) ); + move16(); /* paout[L/2 + i] = -ImdctOut[L - 1 - i] + OldauOut[i+L/2]; */ } } @@ -475,6 +492,7 @@ void window_ola_fx( FOR( i = 0; i < temp_len; i++ ) { *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa++, *p2 ), 1 ) ) ); + move16(); p2 -= decimate; /*OldauOut[L/2 + i] = -ImdctOut[i] * win_left[(L/2-i-1)*decimate+decay]; */ } @@ -486,6 +504,7 @@ void window_ola_fx( FOR( i = 0; i < temp_len; i++ ) { *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa--, *p2 ), 1 ) ) ); + move16(); p2 -= decimate; /* OldauOut[ i] = -ImdctOut[L/2 - 1 - i] * win_left[(L-i)*decimate-decay-1]; */ } @@ -498,7 +517,9 @@ void window_ola_fx( FOR( i = 0; i < n; i++ ) { *p1 = round_fx( L_negate( L_shl( *pa--, 1 ) ) ); + move16(); *p2++ = *p1++; + move16(); } return; @@ -532,35 +553,51 @@ void window_ola_ext_fx( n = shr( mult( shl( L, Q5 ), N_ZERO_BY_FS ), Q5 ); n16 = N16_CORE_SW; + move16(); windecay48 = WINDECAY48; + move16(); windecay16 = WINDECAY16; + move16(); decimate = 1; + move16(); decay = 0; + move16(); tcx_get_windows_mode1( left_mode, right_mode, win_left, win_right, win_int_left, win_int_right, L ); + test(); IF( EQ_16( L, L_FRAME32k ) || EQ_16( L, L_FRAME16k ) ) { decimate = 3; + move16(); decay = 1; + move16(); } ELSE IF( EQ_16( L, L_FRAME8k ) ) { decimate = 6; + move16(); decay = 2; + move16(); } ELSE IF( EQ_16( L, 512 ) ) { windecay48 = WINDECAY48_256; + move16(); decimate = 1; + move16(); decay = 0; + move16(); } ELSE IF( EQ_16( L, 256 ) ) { windecay48 = WINDECAY48_256; + move16(); decimate = 2; + move16(); decay = 0; + move16(); } paout = auOut - n; @@ -569,71 +606,88 @@ void window_ola_ext_fx( { FOR( i = n; i < shr( L, 1 ); i += 2 ) { - paout[i] = L_add_sat( Mpy_32_16_1( Mpy_32_16_1( ImdstOut[shr( L, 1 ) + i], sign_right ), win_right[( 2 * L_FRAME16k - ( n16 + ( i - n ) / 2 ) ) * decimate - 1 - decay - windecay48] ), OldauOut[i] ); - paout[i + 1] = L_add_sat( Mpy_32_16_1( Mpy_32_16_1( ImdstOut[shr( L, 1 ) + i + 1], sign_right ), win_int_right[2 * L_FRAME16k - ( n16 + ( i - n ) / 2 ) - 1 - windecay16] ), OldauOut[i + 1] ); + paout[i] = L_add_sat( Mpy_32_16_1( Mpy_32_16_1( ImdstOut[add( shr( L, 1 ), i )], sign_right ), win_right[sub( sub( sub( i_mult( ( sub( 2 * L_FRAME16k, add( n16, shr( sub( i, n ), 1 ) ) ) ), decimate ), 1 ), decay ), windecay48 )] ), OldauOut[i] ); + move32(); + paout[i + 1] = L_add_sat( Mpy_32_16_1( Mpy_32_16_1( ImdstOut[add( add( shr( L, 1 ), i ), 1 )], sign_right ), win_int_right[sub( sub( sub( 2 * L_FRAME16k, add( n16, shr( sub( i, n ), 1 ) ) ), 1 ), windecay16 )] ), OldauOut[i + 1] ); + move32(); } FOR( i = 0; i < shr( L, 1 ) - n; i += 2 ) { - paout[shr( L, 1 ) + i + 1] = L_add_sat( Mpy_32_16_1( L_negate( ImdstOut[L - 1 - ( i + 1 )] ), win_right[( 3 * L_FRAME16k / 2 - 1 - i / 2 ) * decimate + decay - windecay48] ), OldauOut[i + shr( L, 1 ) + 1] ); - paout[shr( L, 1 ) + i] = L_add_sat( Mpy_32_16_1( L_negate( ImdstOut[L - 1 - i] ), win_int_right[( 3 * L_FRAME16k / 2 - 1 - i / 2 ) - windecay16] ), OldauOut[i + shr( L, 1 )] ); + paout[add( add( shr( L, 1 ), i ), 1 )] = L_add_sat( Mpy_32_16_1( L_negate( ImdstOut[sub( sub( L, 1 ), add( i, 1 ) )] ), win_right[sub( add( i_mult( ( sub( 3 * L_FRAME16k / 2 - 1, shr( i, 1 ) ) ), decimate ), decay ), windecay48 )] ), OldauOut[add( add( i, shr( L, 1 ) ), 1 )] ); + move32(); + paout[add( shr( L, 1 ), i )] = L_add_sat( Mpy_32_16_1( L_negate( ImdstOut[sub( sub( L, 1 ), i )] ), win_int_right[sub( sub( 3 * L_FRAME16k / 2 - 1, shr( i, 1 ) ), windecay16 )] ), OldauOut[add( i, shr( L, 1 ) )] ); + move32(); } FOR( i = sub( shr( L, 1 ), n ); i < shr( L, 1 ); i += 2 ) { - paout[shr( L, 1 ) + i + 1] = L_add_sat( L_negate( ImdstOut[L - 1 - ( i + 1 )] ), OldauOut[i + shr( L, 1 ) + 1] ); - paout[shr( L, 1 ) + i] = L_add_sat( L_negate( ImdstOut[L - 1 - i] ), OldauOut[i + shr( L, 1 )] ); + paout[add( add( shr( L, 1 ), i ), 1 )] = L_add_sat( L_negate( ImdstOut[sub( sub( L, 1 ), add( i, 1 ) )] ), OldauOut[add( add( i, shr( L, 1 ) ), 1 )] ); + move32(); + paout[add( shr( L, 1 ), i )] = L_add_sat( L_negate( ImdstOut[sub( L, add( 1, i ) )] ), OldauOut[add( i, shr( L, 1 ) )] ); + move32(); } FOR( i = 0; i < shr( L, 1 ); i += 2 ) { - OldauOut[shr( L, 1 ) + i + 1] = Mpy_32_16_1( Mpy_32_16_1( ImdstOut[i + 1], sign_left ), win_left[( L_FRAME16k / 2 - i / 2 - 1 ) * decimate + decay] ); - OldauOut[shr( L, 1 ) + i] = Mpy_32_16_1( Mpy_32_16_1( ImdstOut[i], sign_left ), win_int_left[( L_FRAME16k / 2 - i / 2 - 1 )] ); + OldauOut[add( add( shr( L, 1 ), i ), 1 )] = Mpy_32_16_1( Mpy_32_16_1( ImdstOut[i + 1], sign_left ), win_left[add( i_mult( sub( L_FRAME16k / 2 - 1, shr( i, 1 ) ), decimate ), decay )] ); + move32(); + OldauOut[add( shr( L, 1 ), i )] = Mpy_32_16_1( Mpy_32_16_1( ImdstOut[i], sign_left ), win_int_left[sub( L_FRAME16k / 2 - 1, shr( i, 1 ) )] ); + move32(); } FOR( i = n; i < shr( L, 1 ); i += 2 ) { - OldauOut[i] = Mpy_32_16_1( L_negate( ImdstOut[shr( L, 1 ) - 1 - i] ), win_left[( L_FRAME16k - i / 2 ) * decimate - decay - 1] ); - OldauOut[i + 1] = Mpy_32_16_1( L_negate( ImdstOut[shr( L, 1 ) - 1 - ( i + 1 )] ), win_int_left[L_FRAME16k - i / 2 - 1] ); + OldauOut[i] = Mpy_32_16_1( L_negate( ImdstOut[sub( sub( shr( L, 1 ), 1 ), i )] ), win_left[sub( sub( i_mult( sub( L_FRAME16k, shr( i, 1 ) ), decimate ), decay ), 1 )] ); + move32(); + OldauOut[i + 1] = Mpy_32_16_1( L_negate( ImdstOut[sub( sub( shr( L, 1 ), 1 ), add( i, 1 ) )] ), win_int_left[sub( L_FRAME16k - 1, shr( i, 1 ) )] ); + move32(); } } ELSE { FOR( i = n; i < shr( L, 1 ); i++ ) { - paout[i] = L_add_sat( Mpy_32_16_1( Mpy_32_16_1( ImdstOut[shr( L, 1 ) + i], sign_right ), win_right[( 2 * L - i ) * decimate - 1 - decay - windecay48] ), OldauOut[i] ); + paout[i] = L_add_sat( Mpy_32_16_1( Mpy_32_16_1( ImdstOut[add( shr( L, 1 ), i )], sign_right ), win_right[sub( sub( sub( i_mult( ( sub( shl( L, 1 ), i ) ), decimate ), 1 ), decay ), windecay48 )] ), OldauOut[i] ); + move32(); } FOR( i = 0; i < shr( L, 1 ) - n; i++ ) { - paout[shr( L, 1 ) + i] = L_add_sat( Mpy_32_16_1( L_negate( ImdstOut[L - 1 - i] ), win_right[( 3 * shr( L, 1 ) - 1 - i ) * decimate + decay - windecay48] ), OldauOut[i + shr( L, 1 )] ); + paout[add( shr( L, 1 ), i )] = L_add_sat( Mpy_32_16_1( L_negate( ImdstOut[sub( L, add( 1, i ) )] ), win_right[sub( add( i_mult( ( sub( sub( i_mult( 3, shr( L, 1 ) ), 1 ), i ) ), decimate ), decay ), windecay48 )] ), OldauOut[add( i, shr( L, 1 ) )] ); + move32(); } FOR( i = sub( shr( L, 1 ), n ); i < shr( L, 1 ); i++ ) { - paout[shr( L, 1 ) + i] = L_add_sat( L_negate( ImdstOut[L - 1 - i] ), OldauOut[i + shr( L, 1 )] ); + paout[add( shr( L, 1 ), i )] = L_add_sat( L_negate( ImdstOut[sub( L, add( 1, i ) )] ), OldauOut[add( i, shr( L, 1 ) )] ); + move32(); } FOR( i = 0; i < shr( L, 1 ); i++ ) { - OldauOut[shr( L, 1 ) + i] = Mpy_32_16_1( Mpy_32_16_1( ImdstOut[i], sign_left ), win_left[( shr( L, 1 ) - i - 1 ) * decimate + decay] ); + OldauOut[add( shr( L, 1 ), i )] = Mpy_32_16_1( Mpy_32_16_1( ImdstOut[i], sign_left ), win_left[add( i_mult( ( sub( shr( L, 1 ), add( i, 1 ) ) ), decimate ), decay )] ); + move32(); } FOR( i = n; i < shr( L, 1 ); i++ ) { - OldauOut[i] = Mpy_32_16_1( L_negate( ImdstOut[shr( L, 1 ) - 1 - i] ), win_left[( L - i ) * decimate - decay - 1] ); + OldauOut[i] = Mpy_32_16_1( L_negate( ImdstOut[sub( shr( L, 1 ), add( 1, i ) )] ), win_left[sub( sub( i_mult( sub( L, i ), decimate ), decay ), 1 )] ); + move32(); } } FOR( i = 0; i < n; i++ ) { - OldauOut[i] = L_negate( ImdstOut[shr( L, 1 ) - 1 - i] ); + OldauOut[i] = L_negate( ImdstOut[sub( shr( L, 1 ), add( 1, i ) )] ); + move32(); } FOR( i = 0; i < n; i++ ) { - paout[L + i] = OldauOut[i]; + paout[add( L, i )] = OldauOut[i]; + move32(); } return; @@ -665,6 +719,8 @@ void core_switching_OLA_fx( const Word16 *pt4, *pt5; Word16 tmp, tmp2, temp_len; Word16 decimate = 0, delta = 0; /* initialize just to avoid compiler warnings */ + move16(); + move16(); const Word16 *on_win, *on_win_int; Word16 a, b, divisor, buf_offset; Word32 L_tmp; diff --git a/lib_com/wtda.c b/lib_com/wtda.c index 053e892f1..868cd7057 100644 --- a/lib_com/wtda.c +++ b/lib_com/wtda.c @@ -374,127 +374,153 @@ void wtda_fx32( tcx_get_windows_mode1( left_mode, right_mode, win_left, win_right, win_int_left, win_int_right, L ); decimate = 1; /* L_FRAME 48k */ + move16(); decay = 0; + move16(); windecay48 = (Word16) WINDECAY48; // (int16_t)(2 * ((float)L_FRAME48k * N_ZERO_MDCT_NS / FRAME_SIZE_NS)) + R1_48 + move16(); IF( EQ_16( L, L_FRAME32k ) || EQ_16( L, L_FRAME16k ) ) { decimate = 3; + move16(); decay = 1; + move16(); } ELSE IF( EQ_16( L, L_FRAME8k ) ) { decimate = 6; + move16(); decay = 2; + move16(); } - switch ( L ) // (int16_t)((float)L * N_ZERO_MDCT_NS / FRAME_SIZE_NS) + SWITCH( L ) // (int16_t)((float)L * N_ZERO_MDCT_NS / FRAME_SIZE_NS) { case L_FRAME16k: n = 90; - break; + move16(); + BREAK; case L_FRAME32k: n = 180; - break; + move16(); + BREAK; case L_FRAME48k: n = 270; - break; + move16(); + BREAK; default: n = (Word16) ( ( L * N_ZERO_MDCT_NS ) / FRAME_SIZE_NS ); - break; + move16(); + BREAK; } windecay16 = (Word16) WINDECAY16; // (int16_t)(2 * ((float)L_FRAME16k * N_ZERO_MDCT_NS / FRAME_SIZE_NS)) + R1_16; /* algorithmic delay reduction */ i = 0; + move16(); - if ( old_wtda == NULL ) + IF( old_wtda == NULL ) { allsig_r = new_audio + n; allsig_l = new_audio + n - L; } - else + ELSE { allsig_r = new_audio + n; allsig_l = old_wtda + n; } - if ( EQ_16( L, L_FRAME32k ) ) + IF( EQ_16( L, L_FRAME32k ) ) { - for ( i = 0; i < L / 2 - n; i += 2 ) + FOR( i = 0; i < sub( L / 2, n ); i += 2 ) { - idx1 = L / 2 - i - 1; - idx2 = 3 * L_FRAME16k / 2 - i / 2 - 1 - windecay16; - idx3 = L / 2 + i; - idx4 = 3 * L_FRAME16k / 2 + i / 2 - windecay16; + idx1 = sub( sub( shr( L, 1 ), i ), 1 ); + idx2 = sub( sub( 3 * L_FRAME16k / 2 - 1, shr( i, 1 ) ), windecay16 ); + idx3 = add( shr( L, 1 ), i ); + idx4 = sub( add( 3 * L_FRAME16k / 2, shr( i, 1 ) ), windecay16 ); wtda_audio[i] = L_sub_sat( Mpy_32_16_1( -allsig_r[idx1], win_int_right[idx2] ), Mpy_32_16_1( allsig_r[idx3], win_int_right[idx4] ) ); + move32(); - idx1 = L / 2 - ( i + 1 ) - 1; - idx2 = ( 3 * L_FRAME16k / 2 - i / 2 - 1 ) * decimate + decay - windecay48; - idx3 = L / 2 + i + 1; - idx4 = ( 3 * L_FRAME16k / 2 + 1 + i / 2 ) * decimate - decay - 1 - windecay48; + idx1 = sub( sub( shr( L, 1 ), add( i, 1 ) ), 1 ); + idx2 = sub( add( i_mult( ( sub( sub( 3 * L_FRAME16k / 2, shr( i, 1 ) ), 1 ) ), decimate ), decay ), windecay48 ); + idx3 = add( add( shr( L, 1 ), i ), 1 ); + idx4 = sub( sub( sub( i_mult( ( add( 3 * L_FRAME16k / 2 + 1, shr( i, 1 ) ) ), decimate ), decay ), 1 ), windecay48 ); wtda_audio[i + 1] = L_sub_sat( Mpy_32_16_1( -allsig_r[idx1], win_right[idx2] ), Mpy_32_16_1( allsig_r[idx3], win_right[idx4] ) ); + move32(); } - for ( i = L / 2 - n; i < L / 2; i += 2 ) + FOR( i = L / 2 - n; i < L / 2; i += 2 ) { - wtda_audio[i] = -allsig_r[L / 2 - i - 1]; - wtda_audio[i + 1] = -allsig_r[L / 2 - ( i + 1 ) - 1]; + wtda_audio[i] = L_negate( allsig_r[sub( sub( shr( L, 1 ), i ), 1 )] ); + move32(); + wtda_audio[i + 1] = L_negate( allsig_r[sub( sub( shr( L, 1 ), add( i, 1 ) ), 1 )] ); + move32(); } - for ( i = 0; i < n; i += 2 ) + FOR( i = 0; i < n; i += 2 ) { - wtda_audio[i + L / 2] = L_sub_sat( Mpy_32_16_1( allsig_l[i], win_left[( i / 2 ) * decimate + decay] ), new_audio[n - i - 1] ); - wtda_audio[i + L / 2 + 1] = L_sub_sat( Mpy_32_16_1( allsig_l[i + 1], win_int_left[i / 2] ), new_audio[n - ( i + 1 ) - 1] ); + wtda_audio[add( i, shr( L, 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[i], win_left[add( i_mult( shr( i, 1 ), decimate ), decay )] ), new_audio[sub( sub( n, i ), 1 )] ); + move32(); + wtda_audio[add( add( i, shr( L, 1 ) ), 1 )] = L_sub_sat( Mpy_32_16_1( allsig_l[i + 1], win_int_left[i / 2] ), new_audio[sub( sub( n, add( i, 1 ) ), 1 )] ); + move32(); } - for ( i = n; i < L / 2; i += 2 ) + FOR( i = n; i < L / 2; i += 2 ) { idx1 = i; - idx2 = ( i / 2 ) * decimate + decay; - idx3 = L - i - 1; - idx4 = ( L / 2 - i / 2 ) * decimate - 1 - decay; - wtda_audio[i + L / 2] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_left[idx4] ) ); - - idx1 = i + 1; - idx2 = i / 2; - idx3 = L - ( i + 1 ) - 1; - idx4 = L / 2 - i / 2 - 1; - wtda_audio[i + L / 2 + 1] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_int_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_int_left[idx4] ) ); + move16(); + idx2 = add( i_mult( shr( i, 1 ), decimate ), decay ); + idx3 = sub( sub( L, i ), 1 ); + idx4 = sub( sub( i_mult( sub( shr( L, 1 ), shr( i, 1 ) ), decimate ), 1 ), decay ); + wtda_audio[add( i, shr( L, 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_left[idx4] ) ); + move32(); + + idx1 = add( i, 1 ); + idx2 = shr( i, 1 ); + idx3 = sub( sub( L, add( i, 1 ) ), 1 ); + idx4 = sub( sub( shr( L, 1 ), shr( i, 1 ) ), 1 ); + wtda_audio[add( add( i, shr( L, 1 ) ), 1 )] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_int_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_int_left[idx4] ) ); + move32(); } } - else + ELSE { - for ( i = 0; i < L / 2 - n; i++ ) + FOR( i = 0; i < L / 2 - n; i++ ) { - idx1 = L / 2 - i - 1; - idx2 = 3 * L / 2 * decimate - ( i + 1 ) * decimate + decay - windecay48; - idx3 = L / 2 + i; - idx4 = 3 * L / 2 * decimate - 1 + ( i + 1 ) * decimate - decay - windecay48; + idx1 = sub( sub( shr( L, 1 ), i ), 1 ); + idx2 = sub( add( sub( i_mult( i_mult( 3, shr( L, 1 ) ), decimate ), i_mult( add( i, 1 ), decimate ) ), decay ), windecay48 ); + idx3 = add( shr( L, 1 ), i ); + idx4 = sub( sub( add( sub( i_mult( i_mult( 3, shr( L, 1 ) ), decimate ), 1 ), i_mult( add( i, 1 ), decimate ) ), decay ), windecay48 ); wtda_audio[i] = L_sub_sat( Mpy_32_16_1( -allsig_r[idx1], win_right[idx2] ), Mpy_32_16_1( allsig_r[idx3], win_right[idx4] ) ); + move32(); } - for ( i = L / 2 - n; i < L / 2; i++ ) + FOR( i = L / 2 - n; i < L / 2; i++ ) { - wtda_audio[i] = -allsig_r[L / 2 - i - 1]; + wtda_audio[i] = L_negate( allsig_r[sub( sub( shr( L, 1 ), i ), 1 )] ); + move32(); } - for ( i = 0; i < n; i++ ) + FOR( i = 0; i < n; i++ ) { - wtda_audio[i + L / 2] = L_sub_sat( Mpy_32_16_1( allsig_l[i], win_left[i * decimate + decay] ), new_audio[n - i - 1] ); + wtda_audio[add( i, shr( L, 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[i], win_left[add( i_mult( i, decimate ), decay )] ), new_audio[sub( sub( n, i ), 1 )] ); + move32(); } - for ( i = n; i < L / 2; i++ ) + FOR( i = n; i < L / 2; i++ ) { idx1 = i; - idx2 = i * decimate + decay; - idx3 = L - i - 1; - idx4 = L * decimate - i * decimate - 1 - decay; - wtda_audio[i + L / 2] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_left[idx4] ) ); + move16(); + idx2 = add( i_mult( i, decimate ), decay ); + idx3 = sub( sub( L, i ), 1 ); + idx4 = sub( sub( sub( i_mult( L, decimate ), i_mult( i, decimate ) ), 1 ), decay ); + wtda_audio[add( i, shr( L, 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_left[idx4] ) ); + move32(); } } - if ( old_wtda != NULL ) + IF( old_wtda != NULL ) { Copy32( new_audio, old_wtda, L ); } diff --git a/lib_com/wtda_fx.c b/lib_com/wtda_fx.c index dcc9b8229..07699e408 100644 --- a/lib_com/wtda_fx.c +++ b/lib_com/wtda_fx.c @@ -284,7 +284,7 @@ void wtda_fx( } - IF( L == L_FRAME32k ) + IF( EQ_16( L, L_FRAME32k ) ) { /* decimate = 3 */ @@ -403,8 +403,9 @@ void wtda_fx( } *Q = add( *Q, 15 ); /* output Q */ + move16(); - if ( old_wtda != NULL ) + IF( old_wtda != NULL ) { Copy( new_audio, old_wtda, L ); diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index 3eca9decd..d1fb87d05 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -552,12 +552,7 @@ void configureFdCngDec_ivas_fx( hsCom->startBand = 2; move16(); hsCom->stopBand = add( hsCom->FdCngSetup.sidPartitions[sub( hsCom->FdCngSetup.numPartitions, 1 )], 1 ); -#ifndef IVAS_FLOAT_FIXED - /* remove floating point dependency */ - initPartitions_flt( hsCom->FdCngSetup.sidPartitions, hsCom->FdCngSetup.numPartitions, hsCom->startBand, hsCom->stopBand, hsCom->part, &hsCom->npart, hsCom->midband, hsCom->psize_flt, hsCom->psize_inv_flt, 0 ); -#else // IVAS_FLOAT_FIXED initPartitions( hsCom->FdCngSetup.sidPartitions, hsCom->FdCngSetup.numPartitions, hsCom->startBand, hsCom->stopBand, hsCom->part, &hsCom->npart, hsCom->midband, hsCom->psize, hsCom->psize_norm, &hsCom->psize_norm_exp, hsCom->psize_inv, 0 ); -#endif // IVAS_FLOAT_FIXED IF( EQ_16( hsCom->stopFFTbin, 160 ) ) { @@ -578,9 +573,6 @@ void configureFdCngDec_ivas_fx( FOR( j = 0; j < hsCom->nCLDFBpart; j++ ) { hsCom->CLDFBpart[j] = sub( hsCom->part[add( j, hsCom->nFFTpart )], sub( hsCom->stopFFTbin, hsCom->startBand ) ); -#ifndef IVAS_FLOAT_FIXED - hsCom->CLDFBpsize_inv_flt[j] = hsCom->psize_inv_flt[j + hsCom->nFFTpart]; // TODO remove floating point dependency -#endif move16(); hsCom->CLDFBpsize_inv[j] = hsCom->psize_inv[add( j, hsCom->nFFTpart )]; move16(); @@ -594,12 +586,7 @@ void configureFdCngDec_ivas_fx( move16(); } -#ifdef IVAS_FLOAT_FIXED initPartitions( hsCom->FdCngSetup.shapingPartitions, hsCom->FdCngSetup.numShapingPartitions, hsCom->startBand, hsCom->stopFFTbin, hFdCngDec->part_shaping, &hFdCngDec->npart_shaping, hFdCngDec->midband_shaping, hFdCngDec->psize_shaping, hFdCngDec->psize_shaping_norm, &hFdCngDec->psize_shaping_norm_exp, hFdCngDec->psize_inv_shaping, stopBandFR ); -#else // IVAS_FLOAT_FIXED - /* remove floating point dependency */ - initPartitions_flt( hsCom->FdCngSetup.shapingPartitions, hsCom->FdCngSetup.numShapingPartitions, hsCom->startBand, hsCom->stopFFTbin, hFdCngDec->part_shaping, &hFdCngDec->npart_shaping, hFdCngDec->midband_shaping, hFdCngDec->psize_shaping_float, hFdCngDec->psize_inv_shaping_float, stopBandFR ); -#endif // IVAS_FLOAT_FIXED hFdCngDec->nFFTpart_shaping = hFdCngDec->npart_shaping; move16(); @@ -1338,7 +1325,7 @@ void FdCng_decodeSID_ivas_fx( Decoder_State *st /* i/o: decoder state structure */ ) { - int16_t N; + Word16 N; Word32 *sidNoiseEst; Word32 gain; Word16 i, index; @@ -1370,6 +1357,7 @@ void FdCng_decodeSID_ivas_fx( sidNoiseEst = hFdCngCom->sidNoiseEst; N = hFdCngCom->npart; + move16(); gain = 0; move32(); hFdCngCom->sid_frame_counter = add( hFdCngCom->sid_frame_counter, 1 ); @@ -1993,6 +1981,7 @@ void generate_masking_noise_ivas_fx( Word32 *ptr_r_fx; Word32 *ptr_i_fx; Word16 startBand = hFdCngCom->startBand; + move16(); Word16 *seed = &( hFdCngCom->seed ); Word32 scale_fx = 0x40000000; // 1.0 in Q30 move32(); @@ -2004,6 +1993,7 @@ void generate_masking_noise_ivas_fx( } scale_sig32( hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, shift ); hFdCngCom->cngNoiseLevelExp = sub( hFdCngCom->cngNoiseLevelExp, shift ); + move16(); /* skip noise generating if level is very low, to avoid problems with possibly running into denormals */ *exp_out = Q15; @@ -2054,7 +2044,7 @@ void generate_masking_noise_ivas_fx( /* Generate Gaussian random noise in real and imaginary parts of the FFT bins Amplitudes are adjusted to the estimated noise level cngNoiseLevel_flt in each bin */ - IF( EQ_16( startBand, 0 ) ) + IF( startBand == 0 ) { rand_gauss_fx( &fftBuffer_fx[0], seed, *exp_out ); // Q15 ptr_r_fx = fftBuffer_fx + 2; @@ -2111,6 +2101,7 @@ void generate_masking_noise_ivas_fx( SynthesisSTFT_fx( fftBuffer_fx, *exp_out, maskingNoise_fx, hFdCngCom->olapBufferSynth2_fx, hFdCngCom->olapWinSyn_fx, 0, hFdCngCom, element_mode, nchan_out ); } *exp_out = sub( *exp_out, Q9 ); + move16(); /* Add some comfort noise on top of decoded signal */ IF( return_noise ) @@ -2390,10 +2381,10 @@ void generate_stereo_masking_noise_fx( Word16 Q_syn, Decoder_State *st, /* i/o: decoder state structure */ STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i : TD stereo structure */ - const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ - const int16_t fadeOut, /* i : only fade out of previous state */ + const Word16 flag_sec_CNA, /* i : CNA flag for secondary channel */ + const Word16 fadeOut, /* i : only fade out of previous state */ STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ - const int16_t nchan_out /* i : number of output channels */ + const Word16 nchan_out /* i : number of output channels */ ) { HANDLE_FD_CNG_COM hFdCngCom; @@ -2403,7 +2394,7 @@ void generate_stereo_masking_noise_fx( Word32 N1_fx[L_FRAME16k]; Word32 N2_fx[L_FRAME16k]; Word16 N1_fx_exp, N2_fx_exp; - int16_t i; + Word16 i; IF( st->idchan == 0 ) { @@ -2556,6 +2547,7 @@ void generate_stereo_masking_noise_fx( move16(); } hStereoTD->prevSP_ratio_fx = extract_h( hStereoTD->SP_ratio_LT_fx ); + move16(); } return; @@ -2708,6 +2700,7 @@ void generate_masking_noise_lb_dirac_fx( n_samples_out = i_mult( shr( hFdCngCom->frameSize, 4 ), nCldfbTs ); n_samples_start = 0; Word16 exp_out = Q15; + move16(); /*LB CLDFB - CNA from STFT*/ IF( cna_flag ) { @@ -2799,7 +2792,7 @@ void generate_masking_noise_lb_dirac_fx( /* Perform STFT synthesis */ SynthesisSTFT_dirac_fx( fftBuffer, tdBuffer + n_samples_start, hFdCngCom->olapBufferSynth2_fx, hFdCngCom->olapWinSyn_fx, n_samples_out_loop, hFdCngCom ); } - hFdCngCom->fftBuffer_exp = sub( 31, 15 ); + hFdCngCom->fftBuffer_exp = 31 - 15; n_samples_out = sub( n_samples_out, hFdCngCom->frameSize ); n_samples_start = add( n_samples_start, hFdCngCom->frameSize ); } @@ -3417,7 +3410,7 @@ void FdCngDecodeDiracMDCTStereoSID_fx( exp_diff = sub( sts[0]->hFdCngDec->hFdCngCom->sidNoiseEstExp, sts[1]->hFdCngDec->hFdCngCom->sidNoiseEstExp ); FOR( p = 0; p < N; p++ ) { - IF( GT_16( exp_diff, 0 ) ) + IF( exp_diff > 0 ) { sts[0]->hFdCngDec->hFdCngCom->sidNoiseEst[p] = L_add( L_shr( sts[0]->hFdCngDec->hFdCngCom->sidNoiseEst[p], 1 ), L_shr( sts[1]->hFdCngDec->hFdCngCom->sidNoiseEst[p], add( exp_diff, 1 ) ) ); move32(); @@ -3428,7 +3421,7 @@ void FdCngDecodeDiracMDCTStereoSID_fx( move32(); } } - IF( LT_16( exp_diff, 0 ) ) + IF( exp_diff < 0 ) { sts[0]->hFdCngDec->hFdCngCom->sidNoiseEstExp = add( sts[0]->hFdCngDec->hFdCngCom->sidNoiseEstExp, negate( exp_diff ) ); } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index bb9894dfd..5840e553d 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -4862,7 +4862,7 @@ void ivas_destroy_dec_fx( } /* SPAR handle */ - ivas_spar_dec_close( &( st_ivas->hSpar ), st_ivas->hDecoderConfig->output_Fs, 0 ); + ivas_spar_dec_close_fx( &( st_ivas->hSpar ), st_ivas->hDecoderConfig->output_Fs, 0 ); /* HOA decoder matrix */ IF( st_ivas->hoa_dec_mtx != NULL ) diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 8933057bd..336155665 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -926,7 +926,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( test(); IF( NE_16( nchan_transport_old, ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) ) || ( GE_32( last_ivas_total_brate, IVAS_512k ) && LT_32( ivas_total_brate, IVAS_512k ) ) || ( LT_32( last_ivas_total_brate, IVAS_512k ) && GE_32( ivas_total_brate, IVAS_512k ) ) ) { - ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 ); + ivas_spar_dec_close_fx( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 ); if ( NE_32( ( error = ivas_spar_dec_open_fx( st_ivas, 1 ) ), IVAS_ERR_OK ) ) { diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index f18e474e4..e3d43dd5a 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -280,137 +280,137 @@ ivas_error ivas_spar_dec_open( #else ivas_error ivas_spar_dec_open_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ ) { SPAR_DEC_HANDLE hSpar; ivas_error error; - int16_t sba_order_internal, num_channels_internal; + Word16 sba_order_internal, num_channels_internal; IVAS_FB_CFG *fb_cfg; - int16_t i, j, b, active_w_mixing; - int32_t output_Fs; - int16_t num_decor_chs, map_idx; + Word16 i, j, b, active_w_mixing; + Word32 output_Fs; + Word16 num_decor_chs, map_idx; error = IVAS_ERR_OK; + move32(); sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + move16(); num_channels_internal = ivas_sba_get_nchan_metadata_fx( sba_order_internal, st_ivas->hDecoderConfig->ivas_total_brate ); hSpar = st_ivas->hSpar; - if ( !spar_reconfig_flag ) + IF( !spar_reconfig_flag ) { /* SPAR decoder handle */ - if ( ( hSpar = (SPAR_DEC_HANDLE) malloc( sizeof( SPAR_DEC_DATA ) ) ) == NULL ) + IF( ( hSpar = (SPAR_DEC_HANDLE) malloc( sizeof( SPAR_DEC_DATA ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR decoder" ); } } output_Fs = st_ivas->hDecoderConfig->output_Fs; - if ( num_channels_internal > ( SBA_HOA2_ORDER + 1 ) * ( SBA_HOA2_ORDER + 1 ) ) + move32(); + IF( GT_16( num_channels_internal, ( SBA_HOA2_ORDER + 1 ) * ( SBA_HOA2_ORDER + 1 ) ) ) { num_decor_chs = IVAS_HBR_MAX_DECOR_CHS; + move16(); } - else + ELSE { - num_decor_chs = num_channels_internal - 1; + num_decor_chs = sub( num_channels_internal, 1 ); } /* TD decorr. */ - if ( ( st_ivas->ivas_format == SBA_FORMAT ) && ( ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO ) || ( st_ivas->hDecoderConfig->ivas_total_brate >= IVAS_256k && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_FOA ) ) ) + test(); + test(); + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) && ( ( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) ) || ( GE_32( st_ivas->hDecoderConfig->ivas_total_brate, IVAS_256k ) && EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) ) ) { hSpar->hTdDecorr = NULL; } - else + ELSE { -#ifdef IVAS_FLOAT_FIXED - if ( ( error = ivas_td_decorr_dec_open_fx( &hSpar->hTdDecorr, output_Fs, num_decor_chs + 1, 1 ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_decor_chs + 1, 1 ) ) != IVAS_ERR_OK ) -#endif + IF( NE_32( ( error = ivas_td_decorr_dec_open_fx( &hSpar->hTdDecorr, output_Fs, add( num_decor_chs, 1 ), 1 ) ), IVAS_ERR_OK ) ) { return error; } } /* MD handle */ - if ( ( error = ivas_spar_md_dec_open( &hSpar->hMdDec, st_ivas->hDecoderConfig, num_channels_internal, sba_order_internal, st_ivas->sid_format, st_ivas->last_active_ivas_total_brate ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_spar_md_dec_open( &hSpar->hMdDec, st_ivas->hDecoderConfig, num_channels_internal, sba_order_internal, st_ivas->sid_format, st_ivas->last_active_ivas_total_brate ) ), IVAS_ERR_OK ) ) { return error; } hSpar->hMdDec->td_decorr_flag = 1; + move16(); if ( hSpar->hTdDecorr ) { hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[hSpar->hMdDec->table_idx].td_ducking; + move16(); } /* set FB config. */ active_w_mixing = -1; - if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs, 0 ) ) != IVAS_ERR_OK ) + move16(); + IF( NE_32( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs, 0 ) ), IVAS_ERR_OK ) ) { return error; } fb_cfg->pcm_offset = NS2SA( output_Fs, DELAY_FB_1_NS + IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ); + move16(); fb_cfg->remix_order = remix_order_set[hSpar->hMdDec->spar_md_cfg.remix_unmix_order]; + move16(); /* FB mixer handle */ -#ifdef IVAS_FLOAT_FIXED - IF( ( error = ivas_FB_mixer_open_fx( &hSpar->hFbMixer, output_Fs, fb_cfg, spar_reconfig_flag ) ) != IVAS_ERR_OK ) - { - return error; - } -#else - if ( ( error = ivas_FB_mixer_open( &hSpar->hFbMixer, output_Fs, fb_cfg, spar_reconfig_flag ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_FB_mixer_open_fx( &hSpar->hFbMixer, output_Fs, fb_cfg, spar_reconfig_flag ) ), IVAS_ERR_OK ) ) { return error; } -#endif /* AGC handle */ -#ifdef IVAS_FLOAT_FIXED - if ( ( error = ivas_spar_agc_dec_open_fx( &hSpar->hAgcDec, output_Fs ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_spar_agc_dec_open( &hSpar->hAgcDec, output_Fs ) ) != IVAS_ERR_OK ) -#endif // IVAS_FLOAT_FIXED + IF( NE_32( ( error = ivas_spar_agc_dec_open_fx( &hSpar->hAgcDec, output_Fs ) ), IVAS_ERR_OK ) ) { return error; } /* PCA handle */ hSpar->hPCA = NULL; - if ( st_ivas->hDecoderConfig->ivas_total_brate == PCA_BRATE && sba_order_internal == 1 ) + test(); + IF( EQ_32( st_ivas->hDecoderConfig->ivas_total_brate, PCA_BRATE ) && EQ_16( sba_order_internal, 1 ) ) { - if ( ( hSpar->hPCA = (PCA_DEC_STATE *) malloc( sizeof( PCA_DEC_STATE ) ) ) == NULL ) + IF( ( hSpar->hPCA = (PCA_DEC_STATE *) malloc( sizeof( PCA_DEC_STATE ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for PCA decoder" ); } - // ivas_pca_dec_init( hSpar->hPCA ); -#ifdef IVAS_FLOAT_FIXED ivas_pca_dec_init_fx( hSpar->hPCA ); -#endif } /* mixer_mat intitialization */ - for ( i = 0; i < num_channels_internal; i++ ) + FOR( i = 0; i < num_channels_internal; i++ ) { - for ( j = 0; j < num_channels_internal; j++ ) + FOR( j = 0; j < num_channels_internal; j++ ) { - for ( b = 0; b < IVAS_MAX_NUM_BANDS; b++ ) + FOR( b = 0; b < IVAS_MAX_NUM_BANDS; b++ ) { hSpar->hMdDec->mixer_mat_fx[i][j][b] = 0; - for ( int16_t i_ts = 0; i_ts < ( MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); i_ts++ ) + move32(); + FOR( Word16 i_ts = 0; i_ts < ( MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); i_ts++ ) { hSpar->hMdDec->mixer_mat_prev_fx[i_ts][i][j][b] = 0; + move32(); } } } } hSpar->i_subframe = 0; + move16(); hSpar->AGC_flag = 0; + move16(); /*-----------------------------------------------------------------* * Configuration - set SPAR high-level parameters @@ -418,84 +418,108 @@ ivas_error ivas_spar_dec_open_fx( ivas_spar_config( st_ivas->hDecoderConfig->ivas_total_brate, sba_order_internal, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, st_ivas->sid_format ); - switch ( sba_order_internal ) + SWITCH( sba_order_internal ) { case 1: st_ivas->transport_config = IVAS_AUDIO_CONFIG_FOA; - break; + move32(); + BREAK; case 2: st_ivas->transport_config = IVAS_AUDIO_CONFIG_HOA2; - break; + move32(); + BREAK; case 3: st_ivas->transport_config = IVAS_AUDIO_CONFIG_HOA3; - break; + move32(); + BREAK; } ivas_output_init( &( st_ivas->hTransSetup ), st_ivas->transport_config ); - set_s( hSpar->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); - set_s( hSpar->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); + set16_fx( hSpar->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set16_fx( hSpar->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); hSpar->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; + move16(); hSpar->subframes_rendered = 0; + move16(); hSpar->slots_rendered = 0; + move16(); hSpar->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; + move16(); /* init render timeslot mapping */ - set_s( hSpar->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); - for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) + set16_fx( hSpar->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + FOR( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) { hSpar->render_to_md_map[map_idx] = map_idx; + move16(); } /* allocate transport channels*/ - if ( st_ivas->hTcBuffer == NULL ) + IF( st_ivas->hTcBuffer == NULL ) { - int16_t nchan_to_allocate; - int16_t nchan_tc; + Word16 nchan_to_allocate; + Word16 nchan_tc; TC_BUFFER_MODE buffer_mode; - int16_t granularity; + Word16 granularity; buffer_mode = TC_BUFFER_MODE_RENDERER; + move32(); nchan_tc = ivas_jbm_dec_get_num_tc_channels( st_ivas ); nchan_to_allocate = num_channels_internal; + move16(); - if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + test(); + if ( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { - nchan_to_allocate += st_ivas->nchan_ism; + nchan_to_allocate = add( nchan_to_allocate, st_ivas->nchan_ism ); } granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + move16(); - if ( ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO ) ) + test(); + test(); + test(); + IF( ( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) ) ) { - if ( ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO ) ) + test(); + test(); + IF( ( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) && EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) { - nchan_tc = st_ivas->hDecoderConfig->nchan_out + st_ivas->nchan_ism; + nchan_tc = add( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_ism ); nchan_to_allocate = nchan_tc; + move16(); } - else + ELSE { buffer_mode = TC_BUFFER_MODE_BUFFER; + move32(); nchan_tc = st_ivas->hDecoderConfig->nchan_out; + move16(); nchan_to_allocate = nchan_tc; + move16(); } } - else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { nchan_to_allocate = 2 * BINAURAL_CHANNELS; + move16(); } - if ( st_ivas->ivas_format == SBA_ISM_FORMAT && ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + test(); + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && ( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { /* get correct granularity in case of binaural rendering of the discrete objects with the td obj renderer */ - granularity = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ); + Word32 quo, rem; + iDiv_and_mod_32( st_ivas->hDecoderConfig->output_Fs, FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES, &quo, &rem, 0 ); + granularity = extract_l( quo ); + move16(); } -#ifdef IVAS_FLOAT_FIXED - if ( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, buffer_mode, nchan_tc, nchan_to_allocate, nchan_to_allocate, granularity ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, buffer_mode, nchan_tc, nchan_to_allocate, nchan_to_allocate, granularity ) ) != IVAS_ERR_OK ) -#endif + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, buffer_mode, nchan_tc, nchan_to_allocate, nchan_to_allocate, granularity ) ), IVAS_ERR_OK ) ) { return error; } @@ -513,6 +537,7 @@ ivas_error ivas_spar_dec_open_fx( * Deallocate SPAR handle *------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ivas_spar_dec_close( SPAR_DEC_HANDLE *hSpar, /* i/o: SPAR decoder handle */ const int32_t output_Fs, /* i : output sampling rate */ @@ -531,18 +556,11 @@ void ivas_spar_dec_close( ivas_td_decorr_dec_close( &( *hSpar )->hTdDecorr ); /* FB mixer handle */ -#ifdef IVAS_FLOAT_FIXED - ivas_FB_mixer_close_fx( &( *hSpar )->hFbMixer, output_Fs, spar_reconfig_flag ); -#else + ivas_FB_mixer_close( &( *hSpar )->hFbMixer, output_Fs, spar_reconfig_flag ); -#endif /* AGC */ -#ifdef IVAS_FLOAT_FIXED - ivas_spar_agc_dec_close_fx( &( *hSpar )->hAgcDec ); -#else ivas_spar_agc_dec_close( &( *hSpar )->hAgcDec ); -#endif // IVAS_FLOAT_FIXED /* PCA */ if ( ( *hSpar )->hPCA != NULL ) @@ -559,6 +577,47 @@ void ivas_spar_dec_close( return; } +#else +void ivas_spar_dec_close_fx( + SPAR_DEC_HANDLE *hSpar, /* i/o: SPAR decoder handle */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ +) +{ + test(); + IF( hSpar == NULL || *hSpar == NULL ) + { + return; + } + + /* MD handle */ + ivas_spar_md_dec_close( &( *hSpar )->hMdDec ); + + /* TD decorrelator handle */ + ivas_td_decorr_dec_close( &( *hSpar )->hTdDecorr ); + + /* FB mixer handle */ + ivas_FB_mixer_close_fx( &( *hSpar )->hFbMixer, output_Fs, spar_reconfig_flag ); + + /* AGC */ + ivas_spar_agc_dec_close_fx( &( *hSpar )->hAgcDec ); + + /* PCA */ + IF( ( *hSpar )->hPCA != NULL ) + { + free( ( *hSpar )->hPCA ); + ( *hSpar )->hPCA = NULL; + } + + IF( !spar_reconfig_flag ) + { + free( ( *hSpar ) ); + ( *hSpar ) = NULL; + } + + return; +} +#endif /*-------------------------------------------------------------------* @@ -579,20 +638,31 @@ ivas_error ivas_spar_dec_fx( Word16 next_bit_pos_orig, last_bit_pos; UWord16 bstr_meta[MAX_BITS_METADATA], *bit_stream_orig; ivas_error error; + Word32 quo, rem; push_wmops( "ivas_spar_decode" ); error = IVAS_ERR_OK; + move32(); hDecoderConfig = st_ivas->hDecoderConfig; - st0 = GT_16( st_ivas->nSCE, 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + st0 = NULL; + IF( st_ivas->nSCE > 0 ) + { + st0 = st_ivas->hSCE[0]->hCoreCoder[0]; + } + ELSE + { + st0 = st_ivas->hCPE[0]->hCoreCoder[0]; + } + bit_stream_orig = st0->bit_stream; - move16(); next_bit_pos_orig = st0->next_bit_pos; move16(); IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - last_bit_pos = sub( extract_l( L_sub( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ), 1 ) ), nb_bits_read[1] ); + iDiv_and_mod_32( hDecoderConfig->ivas_total_brate, FRAMES_PER_SEC, &quo, &rem, 0 ); + last_bit_pos = sub( extract_l( L_sub( quo, 1 ) ), nb_bits_read[1] ); } ELSE { @@ -610,15 +680,17 @@ ivas_error ivas_spar_dec_fx( IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - last_bit_pos = sub( extract_l( L_sub( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ), 1 ) ), nb_bits_read[1] ); + iDiv_and_mod_32( hDecoderConfig->ivas_total_brate, FRAMES_PER_SEC, &quo, &rem, 0 ); + last_bit_pos = sub( extract_l( L_sub( quo, 1 ) ), nb_bits_read[1] ); } ELSE { - last_bit_pos = extract_l( L_sub( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ), 1 ) ); + iDiv_and_mod_32( hDecoderConfig->ivas_total_brate, FRAMES_PER_SEC, &quo, &rem, 0 ); + last_bit_pos = extract_l( L_sub( quo, 1 ) ); } test(); - IF( !st0->bfi && EQ_32( hDecoderConfig->ivas_total_brate, IVAS_SID_5k2 ) ) + if ( !st0->bfi && EQ_32( hDecoderConfig->ivas_total_brate, IVAS_SID_5k2 ) ) { last_bit_pos = sub( last_bit_pos, SID_FORMAT_NBITS ); } @@ -629,16 +701,16 @@ ivas_error ivas_spar_dec_fx( /* reverse the bitstream for easier reading of indices */ FOR( i = 0; i < s_min( MAX_BITS_METADATA, last_bit_pos ); i++ ) { - bstr_meta[i] = st_ivas->bit_stream[last_bit_pos - i]; + bstr_meta[i] = st_ivas->bit_stream[sub( last_bit_pos, i )]; move16(); } st0->bit_stream = bstr_meta; - move16(); st0->next_bit_pos = 0; move16(); st0->bits_frame = s_min( MAX_BITS_METADATA, add( last_bit_pos, 1 ) ); + move16(); - IF( !st0->bfi ) + if ( !st0->bfi ) { st0->total_brate = hDecoderConfig->ivas_total_brate; /* to avoid BER detect */ move32(); @@ -648,22 +720,27 @@ ivas_error ivas_spar_dec_fx( * Decode SPAR metadata *---------------------------------------------------------------------*/ - IF( ( error = ivas_spar_dec_MD_fx( st_ivas, st0 ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_spar_dec_MD_fx( st_ivas, st0 ) ), IVAS_ERR_OK ) ) { return error; } - *nb_bits_read = st0->next_bit_pos + nb_bits_read_orig; + *nb_bits_read = add( st0->next_bit_pos, nb_bits_read_orig ); + move16(); st0->bit_stream = bit_stream_orig; st0->next_bit_pos = next_bit_pos_orig; + move16(); - IF( !st0->bfi && hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) + test(); + IF( !st0->bfi && EQ_32( hDecoderConfig->ivas_total_brate, IVAS_SID_5k2 ) ) { Word16 zero_pad_bits; - *nb_bits_read += SID_FORMAT_NBITS; - zero_pad_bits = (Word16) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - *nb_bits_read; + *nb_bits_read = add( *nb_bits_read, SID_FORMAT_NBITS ); + move16(); + zero_pad_bits = sub( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC, *nb_bits_read ); assert( zero_pad_bits <= 1 ); - *nb_bits_read += zero_pad_bits; + *nb_bits_read = add( *nb_bits_read, zero_pad_bits ); + move16(); } pop_wmops(); @@ -792,13 +869,15 @@ static Word16 ivas_get_spar_table_idx_from_coded_idx( test(); IF( EQ_32( ivas_spar_br_table_consts[i].ivas_total_brate, ivas_total_brate ) && EQ_16( ivas_spar_br_table_consts[i].sba_order, sba_order ) ) { - ind1[j++] = i; + ind1[j] = i; move16(); + j = add( j, 1 ); } } assert( j > 0 ); - *bitlen = ivas_get_bits_to_encode( j - 1 ); + *bitlen = ivas_get_bits_to_encode( sub( j, 1 ) ); + move16(); ind2 = get_next_indice_fx( st0, *bitlen ); @@ -856,6 +935,7 @@ static Word16 ivas_parse_spar_header( Word16 bitlen, bwidth; *table_idx = ivas_get_spar_table_idx_from_coded_idx( ivas_total_brate, sba_order, st0, &bitlen ); + move16(); bwidth = ivas_spar_br_table_consts[( *table_idx )].bwidth; move16(); @@ -938,6 +1018,7 @@ static void matrix_inverse_fx( out[0][0] = L_shl( tmp_32, shift ); move32(); *out_q = add( shift, sub( Q15, tmp_e ) ); + move16(); return; } @@ -960,6 +1041,7 @@ static void matrix_inverse_fx( move32(); *out_q = add( Q27, sub( q_fac, 31 ) ); + move16(); return; } @@ -992,6 +1074,7 @@ static void matrix_inverse_fx( move32(); *out_q = add( Q23, sub( q_fac, 31 ) ); + move16(); return; } @@ -1077,7 +1160,9 @@ void ivas_spar_get_cldfb_gains_fx( Word16 seed, split_band, slot_row, slot_col, slot, tmp_idx; pt_len = cldfbAnaDec0->p_filter_length; + move16(); num_cldfb_bands = cldfbAnaDec0->no_channels; + move16(); stride = NS2SA_fx2( output_Fs_fx, DELAY_CLDFB_NS ); encfb_delay = NS2SA_fx2( output_Fs_fx, IVAS_FB_ENC_DELAY_NS ); @@ -1087,28 +1172,37 @@ void ivas_spar_get_cldfb_gains_fx( cf_end = add( sub( hSpar->hFbMixer->cross_fade_end_offset, encfb_delay ), decfb_delay ); cf_len = sub( cf_end, cf_start ); weights_fx = hSpar->hFbMixer->cldfb_cross_fade_fx; - cf_cldfb_start = shr( (Word16) ceil_fixed( sub( divide1616( sub( cf_start, shr( decfb_delay, 1 ) ), shl( stride, 9 ) ), 32 ), 6 ), 6 ); + cf_cldfb_start = shr( extract_l( ceil_fixed( sub( divide1616( sub( cf_start, shr( decfb_delay, 1 ) ), shl( stride, 9 ) ), 32 ), 6 ) ), 6 ); cf_cldfb_end = shr( divide1616( add( sub( cf_start, shr( decfb_delay, 1 ) ), cf_len ), shl( stride, 9 ) ), 6 ); /*q-factor of stride is 9(as max value is 60)*/ num_cf_slots = add( sub( cf_cldfb_end, cf_cldfb_start ), 1 ); num_samples = add( imult1616( num_cf_slots, stride ), sub( pt_len, stride ) ); seed = RANDOM_INITSEED; + move16(); split_band = SPAR_DIRAC_SPLIT_START_BAND; + move16(); pp_ts_im_fx[0] = ts_im_fx; pp_ts_re_fx[0] = ts_re_fx; set32_fx( tgt_fx, 0, ( 3 - 1 ) * CLDFB_NO_CHANNELS_MAX + 10 * CLDFB_NO_CHANNELS_MAX ); cf_start_s_fx = divide3232( ( sub( cf_start, shr( decfb_delay, 1 ) ) ), output_Fs_fx ); cf_len_s_fx = divide3232( sub( hSpar->hFbMixer->cross_fade_end_offset, hSpar->hFbMixer->cross_fade_start_offset ), output_Fs_fx ); - Word16 Q_cf_start_s = norm_s( cf_start_s_fx ) - 1; + Word16 Q_cf_start_s = sub( norm_s( cf_start_s_fx ), 1 ); Word16 Q_cf_len_s = norm_s( cf_len_s_fx ); - Word16 Q_weights = 15 + Q_cf_start_s - Q_cf_len_s; + Word16 Q_weights = add( 15, sub( Q_cf_start_s, Q_cf_len_s ) ); FOR( ts = 0; ts < CLDFB_NO_COL_MAX; ts++ ) { weights_fx[ts] = divide1616( shl( sub( divide3232( L_mult0( add( shl( ts, 1 ), 1 ), shr( stride, 1 ) ), output_Fs_fx ), cf_start_s_fx ), Q_cf_start_s ), shl( cf_len_s_fx, Q_cf_len_s ) ); + move16(); weights_fx[ts] = s_max( s_min( weights_fx[ts], shl( 1, Q_weights ) ), 0 ); + move16(); } hSpar->hFbMixer->cldfb_cross_fade_start = cf_cldfb_start; + move16(); hSpar->hFbMixer->cldfb_cross_fade_end = cf_cldfb_end; + move16(); + test(); + test(); + test(); IF( GT_16( num_cf_slots, 3 ) || GT_16( pt_len, 10 * CLDFB_NO_CHANNELS_MAX ) || GT_16( stride, CLDFB_NO_CHANNELS_MAX ) || EQ_16( split_band, IVAS_MAX_NUM_BANDS ) ) { return; @@ -1121,34 +1215,44 @@ void ivas_spar_get_cldfb_gains_fx( // floatToFixed_arrL( (float *)hSpar->hFbMixer->pFilterbank_cross_fade, pFilterbank_cross_fade_fx, Q31, cf_len ); FOR( sample = 0; sample < cf_len; sample++ ) { - tgt_fx[tmp_idx++] = L_deposit_h( hSpar->hFbMixer->pFilterbank_cross_fade_fx[sample] ); + tgt_fx[tmp_idx] = L_deposit_h( hSpar->hFbMixer->pFilterbank_cross_fade_fx[sample] ); + move32(); + tmp_idx = add( tmp_idx, 1 ); /* increasing window function */ } FOR( ; tmp_idx < num_samples; tmp_idx++ ) { /* fill up with ones*/ tgt_fx[tmp_idx] = MAX_32; + move32(); } FOR( sample = 0; sample < num_samples; sample++ ) { /* initialize trasnform matrix with zeros*/ T_fx[sample][0] = T_fx[sample][1] = T_fx[sample][2] = 0; + move32(); + move32(); + move32(); } - FOR( sample = 0; sample < pt_len - stride; sample++ ) + FOR( sample = 0; sample < sub( pt_len, stride ); sample++ ) { /* fill internal CLDFB analysis time buffer with data*/ Word16 x_fx = get_random_number_fx( &seed ); cldfbAnaDec0->cldfb_state_fx[sample] = L_shl( x_fx, 12 ); + move32(); } Word16 q_cldfb = 27; + move16(); cldfbAnaDec0->Q_cldfb_state = q_cldfb; + move16(); FOR( slot = 0; slot < num_cf_slots; slot++ ) { FOR( sample = 0; sample < stride; sample++ ) { Word16 x_fx = get_random_number_fx( &seed ); ts_inout_fx[sample] = L_shl( x_fx, 12 ); /*Q-27*/ + move32(); } cldfbAnalysis_ts_fx_fixed_q( ts_inout_fx, ts_re_fx, ts_im_fx, num_cldfb_bands, cldfbAnaDec0, &q_cldfb ); @@ -1157,12 +1261,15 @@ void ivas_spar_get_cldfb_gains_fx( FOR( sample = 0; sample < stride; sample++ ) { - T_fx[slot * stride + sample][slot] = ts_inout_fx[sample]; + T_fx[add( imult1616( slot, stride ), sample )][slot] = ts_inout_fx[sample]; + move32(); } tmp_idx = sub( pt_len, 1 ); FOR( sample = stride; sample < pt_len; sample++ ) { - T_fx[add( imult1616( slot, stride ), sample )][slot] = cldfbSynDec0->cldfb_state_fx[tmp_idx--]; + T_fx[add( imult1616( slot, stride ), sample )][slot] = cldfbSynDec0->cldfb_state_fx[tmp_idx]; + move32(); + tmp_idx = sub( tmp_idx, 1 ); } } @@ -1170,6 +1277,7 @@ void ivas_spar_get_cldfb_gains_fx( FOR( sample = 0; sample < num_samples; sample++ ) { tgt_fx[sample] = L_shl( Mult_32_32( tgt_fx[sample], L_add( T_fx[sample][0], L_add( T_fx[sample][1], T_fx[sample][2] ) ) ), 10 ); /*Q31*/ + move32(); } /* compute matrices */ FOR( slot_row = 0; slot_row < num_cf_slots; slot_row++ ) @@ -1177,37 +1285,48 @@ void ivas_spar_get_cldfb_gains_fx( FOR( slot_col = slot_row; slot_col < num_cf_slots; slot_col++ ) { Tt_T_fx[slot_row][slot_col] = 0; + move32(); FOR( sample = 0; sample < num_samples; sample++ ) { Tt_T_fx[slot_row][slot_col] = L_add( Tt_T_fx[slot_row][slot_col], Mult_32_32( L_shl( T_fx[sample][slot_row], 8 ), L_shl( T_fx[sample][slot_col], 8 ) ) ); /*Q58-Q31*/ + move32(); } } } Tt_T_fx[1][0] = Tt_T_fx[0][1]; + move32(); Tt_T_fx[2][0] = Tt_T_fx[0][2]; + move32(); Tt_T_fx[2][1] = Tt_T_fx[1][2]; + move32(); FOR( slot_row = 0; slot_row < num_cf_slots; slot_row++ ) { Tt_tgt_fx[slot_row] = 0; + move32(); FOR( sample = 0; sample < num_samples; sample++ ) { Tt_tgt_fx[slot_row] = L_add( Tt_tgt_fx[slot_row], Mult_32_32( T_fx[sample][slot_row], tgt_fx[sample] ) ); + move32(); } } Word16 output_q = 27; + move16(); matrix_inverse_fx( Tt_T_fx, Tt_T_inv_fx, num_cf_slots, &output_q ); /* compute the optimal coefficients */ FOR( slot_row = 0; slot_row < num_cf_slots; slot_row++ ) { Word32 tmp = 0; + move32(); FOR( slot_col = 0; slot_col < num_cf_slots; slot_col++ ) { tmp = L_add( tmp, Mult_32_32( Tt_T_inv_fx[slot_row][slot_col], Tt_tgt_fx[slot_col] ) ); } - weights_fx[add( cf_cldfb_start, slot_row )] = extract_l( L_shr( L_max( L_min( tmp, L_shl( 1, ( output_q - 10 ) ) ), 0 ), output_q - 10 - Q_weights ) ); /*Q_weights*/ + weights_fx[add( cf_cldfb_start, slot_row )] = extract_l( L_shr( L_max( L_min( tmp, L_shl( 1, sub( output_q, 10 ) ) ), 0 ), sub( sub( output_q, 10 ), Q_weights ) ) ); /*Q_weights*/ + move16(); } hSpar->hFbMixer->cldfb_cross_fade_q = Q_weights; + move16(); cldfb_reset_memory_fx( cldfbSynDec0 ); cldfb_reset_memory_fx( cldfbAnaDec0 ); @@ -1465,7 +1584,7 @@ static ivas_error ivas_spar_dec_MD_fx( move16(); test(); - IF( GT_32( ivas_total_brate, FRAME_NO_DATA ) && !bfi ) + IF( ( ivas_total_brate > FRAME_NO_DATA ) && !bfi ) { IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) ) { @@ -1479,19 +1598,20 @@ static ivas_error ivas_spar_dec_MD_fx( ELSE { hSpar->hMdDec->spar_md.num_bands = s_min( SPAR_DIRAC_SPLIT_START_BAND, IVAS_MAX_NUM_BANDS ); + move16(); } IF( NE_16( hSpar->hMdDec->table_idx, table_idx ) ) { hSpar->hMdDec->table_idx = table_idx; move16(); - IF( hSpar->hTdDecorr ) + if ( hSpar->hTdDecorr ) { hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[table_idx].td_ducking; move16(); } - IF( ( error = ivas_spar_md_dec_init( hSpar->hMdDec, hDecoderConfig, num_channels, sba_order ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_spar_md_dec_init( hSpar->hMdDec, hDecoderConfig, num_channels, sba_order ) ), IVAS_ERR_OK ) ) { return error; } @@ -1524,6 +1644,7 @@ static ivas_error ivas_spar_dec_MD_fx( IF( EQ_16( hSpar->hMdDec->spar_md_cfg.nchan_transport, 1 ) ) { hSpar->AGC_flag = get_next_indice_fx( st0, 1 ); + move16(); } ivas_agc_read_bits_fx( hSpar->hAgcDec, st0, hSpar->hMdDec->spar_md_cfg.nchan_transport, hSpar->AGC_flag ); @@ -1536,7 +1657,7 @@ static ivas_error ivas_spar_dec_MD_fx( test(); test(); test(); - IF( EQ_16( st0->m_old_frame_type, ZERO_FRAME ) && EQ_32( ivas_total_brate, IVAS_SID_5k2 ) && EQ_16( st0->prev_bfi, 0 ) && EQ_16( hSpar->hMdDec->spar_md_cfg.nchan_transport, 1 ) ) + IF( EQ_16( st0->m_old_frame_type, ZERO_FRAME ) && EQ_32( ivas_total_brate, IVAS_SID_5k2 ) && ( st0->prev_bfi == 0 ) && EQ_16( hSpar->hMdDec->spar_md_cfg.nchan_transport, 1 ) ) { ivas_spar_setup_md_smoothing_fx( hSpar->hMdDec, num_bands_out, num_md_sub_frames ); } @@ -1552,7 +1673,7 @@ static ivas_error ivas_spar_dec_MD_fx( ivas_spar_smooth_md_dtx_fx( hSpar->hMdDec, num_bands_out, num_md_sub_frames ); } - set_s( hSpar->hMdDec->valid_bands, 0, IVAS_MAX_NUM_BANDS ); + set16_fx( hSpar->hMdDec->valid_bands, 0, IVAS_MAX_NUM_BANDS ); } pop_wmops(); @@ -1682,83 +1803,104 @@ static ivas_error ivas_spar_dec_MD( static Word16 ivas_spar_get_cldfb_slot_gain_fx( SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ - const int16_t time_slot_idx, - int16_t *time_slot_idx0, - int16_t *time_slot_idx1, + const Word16 time_slot_idx, + Word16 *time_slot_idx0, + Word16 *time_slot_idx1, Word16 *weight_lowfreq_fx ) { Word16 weight_fx; Word32 encfb_delay_fx, decfb_delay_fx; Word32 xfade_start_ns_fx; - int16_t xfade_delay_subframes; - int16_t i_hist; - int16_t split_band; + Word16 xfade_delay_subframes; + Word16 i_hist; + Word16 split_band; *weight_lowfreq_fx = hSpar->hFbMixer->cldfb_cross_fade_fx[time_slot_idx]; + move16(); encfb_delay_fx = IVAS_FB_ENC_DELAY_NS; + move32(); decfb_delay_fx = IVAS_FB_DEC_DELAY_NS; + move32(); Word32 one_by_outfs = 0; // q15 - switch ( hDecoderConfig->output_Fs ) + move32(); + SWITCH( hDecoderConfig->output_Fs ) { case 16000: one_by_outfs = 2048000000; - break; + move32(); + BREAK; case 32000: one_by_outfs = 1024000000; - break; + move32(); + BREAK; case 48000: one_by_outfs = 682666688; - break; + move32(); + BREAK; default: assert( 0 ); } - Word64 fade_start = (Word64) one_by_outfs * hSpar->hFbMixer->cross_fade_start_offset; + Word64 fade_start = W_mult0_32_32( one_by_outfs, hSpar->hFbMixer->cross_fade_start_offset ); + move64(); fade_start = W_shr( fade_start, 15 ); - xfade_start_ns_fx = ( (Word32) fade_start - encfb_delay_fx + L_shr( decfb_delay_fx, 1 ) ); - xfade_delay_subframes = (int16_t) ( xfade_start_ns_fx / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); + xfade_start_ns_fx = L_add( L_sub( W_extract_l( fade_start ), encfb_delay_fx ), L_shr( decfb_delay_fx, 1 ) ); + xfade_delay_subframes = extract_l( Mpy_32_32( xfade_start_ns_fx, 429 /* 1 / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) in Q31 -> 429 */ ) ); - i_hist = 4 - xfade_delay_subframes; + i_hist = sub( 4, xfade_delay_subframes ); split_band = SPAR_DIRAC_SPLIT_START_BAND; + move16(); - if ( split_band < IVAS_MAX_NUM_BANDS ) + IF( LT_16( split_band, IVAS_MAX_NUM_BANDS ) ) { - if ( hSpar->i_subframe > 3 ) + IF( GT_16( hSpar->i_subframe, 3 ) ) { Word16 mod_res = time_slot_idx % MAX_PARAM_SPATIAL_SUBFRAMES; - switch ( mod_res ) + move16(); + SWITCH( mod_res ) { case 0: weight_fx = 0; - break; + move16(); + BREAK; case 1: weight_fx = 8191; - break; + move16(); + BREAK; case 2: weight_fx = 16383; - break; + move16(); + BREAK; case 3: weight_fx = 24575; - break; + move16(); + BREAK; default: weight_fx = 0; - break; + move16(); + BREAK; } } - else + ELSE { weight_fx = 0; + move16(); } *time_slot_idx0 = i_hist; - *time_slot_idx1 = i_hist + 1; + move16(); + *time_slot_idx1 = add( i_hist, 1 ); + move16(); } - else + ELSE { /* determine cross-fade gain for current frame Parameters*/ *time_slot_idx0 = hSpar->hFbMixer->cldfb_cross_fade_start; + move16(); *time_slot_idx1 = hSpar->hFbMixer->cldfb_cross_fade_end; + move16(); weight_fx = *weight_lowfreq_fx; + move16(); } return weight_fx; @@ -1826,50 +1968,56 @@ static float ivas_spar_get_cldfb_slot_gain( void ivas_spar_get_parameters_fx( SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ - const int16_t ts, - const int16_t num_ch_out, - const int16_t num_ch_in, - const int16_t num_spar_bands, + const Word16 ts, + const Word16 num_ch_out, + const Word16 num_ch_in, + const Word16 num_spar_bands, Word32 par_mat_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS] ) { - int16_t spar_band, out_ch, in_ch; + Word16 spar_band, out_ch, in_ch; Word16 weight_fx, weight_20ms_fx; - int16_t ts0, ts1, split_band; + Word16 ts0, ts1, split_band; // weight = ivas_spar_get_cldfb_slot_gain(hSpar, hDecoderConfig, ts, &ts0, &ts1, &weight_20ms); weight_fx = ivas_spar_get_cldfb_slot_gain_fx( hSpar, hDecoderConfig, ts, &ts0, &ts1, &weight_20ms_fx ); split_band = SPAR_DIRAC_SPLIT_START_BAND; - for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + move16(); + FOR( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) { - for ( out_ch = 0; out_ch < num_ch_out; out_ch++ ) + FOR( out_ch = 0; out_ch < num_ch_out; out_ch++ ) { - if ( split_band < IVAS_MAX_NUM_BANDS - /* 20ms cross-fade for Transport channels in all frequency bands */ - && ( 0 == ivas_is_res_channel( out_ch, hSpar->hMdDec->spar_md_cfg.nchan_transport ) ) /* sub-frame processing for missing channels in all frequency bands*/ + test(); + IF( LT_16( split_band, IVAS_MAX_NUM_BANDS ) + /* 20ms cross-fade for Transport channels in all frequency bands */ + && ( 0 == ivas_is_res_channel( out_ch, hSpar->hMdDec->spar_md_cfg.nchan_transport ) ) /* sub-frame processing for missing channels in all frequency bands*/ ) { - for ( in_ch = 0; in_ch < num_ch_in; in_ch++ ) + FOR( in_ch = 0; in_ch < num_ch_in; in_ch++ ) { - if ( hSpar->i_subframe > 3 ) + IF( GT_16( hSpar->i_subframe, 3 ) ) { par_mat_fx[out_ch][in_ch][spar_band] = L_add_sat( Mpy_32_16_1( hSpar->hMdDec->mixer_mat_prev_fx[ts0][out_ch][in_ch][spar_band], sub( MAX_WORD16, weight_fx ) ), Mpy_32_16_1( hSpar->hMdDec->mixer_mat_prev_fx[ts1][out_ch][in_ch][spar_band], weight_fx ) ); + move32(); } - else + ELSE { par_mat_fx[out_ch][in_ch][spar_band] = hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][spar_band]; + move32(); } } } - else + ELSE { - for ( in_ch = 0; in_ch < num_ch_in; in_ch++ ) + FOR( in_ch = 0; in_ch < num_ch_in; in_ch++ ) { /* 20ms Transport channel reconstruction with matching encoder/decoder processing */ - int16_t prev_idx = SPAR_DIRAC_SPLIT_START_BAND < IVAS_MAX_NUM_BANDS ? 1 : 0; /* if SPAR_DIRAC_SPLIT_START_BAND == IVAS_MAX_NUM_BANDS, then the sub-frame mixer_mat delay line is not active */ + Word16 prev_idx = SPAR_DIRAC_SPLIT_START_BAND < IVAS_MAX_NUM_BANDS ? 1 : 0; /* if SPAR_DIRAC_SPLIT_START_BAND == IVAS_MAX_NUM_BANDS, then the sub-frame mixer_mat delay line is not active */ + move16(); par_mat_fx[out_ch][in_ch][spar_band] = L_add_sat( Mpy_32_16_1( hSpar->hMdDec->mixer_mat_prev_fx[prev_idx][out_ch][in_ch][spar_band], sub( MAX_WORD16, weight_20ms_fx ) ), Mpy_32_16_1( hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][spar_band], weight_20ms_fx ) ); + move32(); } } } @@ -2018,7 +2166,9 @@ static void ivas_spar_get_skip_mat_fx( FOR( in_ch = 0; in_ch < num_ch_in; in_ch++ ) { skip_mat[out_ch][in_ch] = 1; + move16(); skip_flag = 1; + move16(); FOR( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) { FOR( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) @@ -2026,6 +2176,7 @@ static void ivas_spar_get_skip_mat_fx( IF( hSpar->hMdDec->mixer_mat_prev_fx[1 + i_ts][out_ch][in_ch][spar_band] != 0 ) { skip_flag = 0; + move16(); BREAK; } } @@ -2033,19 +2184,21 @@ static void ivas_spar_get_skip_mat_fx( IF( skip_flag == 0 ) { skip_mat[out_ch][in_ch] = 0; + move16(); BREAK; } } - IF( skip_mat[out_ch][in_ch] == 1 ) + IF( EQ_16( skip_mat[out_ch][in_ch], 1 ) ) { FOR( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) { FOR( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) { - IF( hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][spar_band + i_ts * IVAS_MAX_NUM_BANDS] != 0 ) + IF( hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][add( spar_band, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )] != 0 ) { skip_flag = 0; + move16(); BREAK; } } @@ -2053,6 +2206,7 @@ static void ivas_spar_get_skip_mat_fx( IF( skip_flag == 0 ) { skip_mat[out_ch][in_ch] = 0; + move16(); BREAK; } } @@ -2083,89 +2237,118 @@ static void ivas_spar_calc_smooth_facs_fx( Word32 L_temp; Word16 exp_tmp, q_tmp; bin = 0; + move16(); FOR( b = 0; b < nbands_spar; b++ ) { - IF( GE_16( bin, CLDFB_NO_CHANNELS_MAX ) || ( GT_16( b, 0 ) && LT_16( bin2band->p_cldfb_map_to_spar_band[bin], bin2band->p_cldfb_map_to_spar_band[bin - 1] ) ) ) + test(); + test(); + IF( GE_16( bin, CLDFB_NO_CHANNELS_MAX ) || ( ( b > 0 ) && LT_16( bin2band->p_cldfb_map_to_spar_band[bin], bin2band->p_cldfb_map_to_spar_band[bin - 1] ) ) ) { BREAK; } /* calculate band-wise subframe energies */ subframe_band_nrg_fx[b] = 0; + move32(); WHILE( LT_16( bin, CLDFB_NO_CHANNELS_MAX ) && EQ_16( b, bin2band->p_cldfb_map_to_spar_band[bin] ) ) { + test(); FOR( ts = 0; ts < nSlots; ts++ ) { L_temp = L_add( L_shr( Mpy_32_32( cldfb_in_ts_re_fx[ts][bin], cldfb_in_ts_re_fx[ts][bin] ), 4 ), L_shr( Mpy_32_32( cldfb_in_ts_im_fx[ts][bin], cldfb_in_ts_im_fx[ts][bin] ), 4 ) ); // 2*q_cldfb - 35 subframe_band_nrg_fx[b] = L_add_sat( subframe_band_nrg_fx[b], L_temp ); // 2*q_cldfb - 35 (saturation reached in 1 orig pytest) + move32(); } - bin++; + bin = add( bin, 1 ); } - exp_tmp = sub( 66, i_mult( 2, q_cldfb ) ); + exp_tmp = sub( 66, shl( q_cldfb, 1 ) ); subframe_band_nrg_fx[b] = Sqrt32( subframe_band_nrg_fx[b], &exp_tmp ); - q_tmp = 31 - exp_tmp; + move32(); + q_tmp = sub( 31, exp_tmp ); + test(); IF( isFirstSubframe && LT_16( nSlots, MAX_PARAM_SPATIAL_SUBFRAMES ) ) { /* fill up to full 5ms subframe */ smooth_buf_fx[b][0] = L_add( smooth_buf_fx[b][0], L_shr( subframe_band_nrg_fx[b], q_tmp ) ); // Q0 + move32(); } ELSE { smooth_buf_fx[b][0] = L_shr( subframe_band_nrg_fx[b], q_tmp ); // Q0 + move32(); } /* calculate short and long energy averages */ smooth_short_avg_fx[b] = 0; + move32(); FOR( i = 0; i < 2 * SBA_DIRAC_NRG_SMOOTH_SHORT; i++ ) { smooth_short_avg_fx[b] = L_add( smooth_short_avg_fx[b], smooth_buf_fx[b][i] ); // Q0 + move32(); } smooth_long_avg_fx[b] = smooth_short_avg_fx[b]; // Q0 + move32(); FOR( i = 2 * SBA_DIRAC_NRG_SMOOTH_SHORT; i < 2 * SBA_DIRAC_NRG_SMOOTH_LONG; i++ ) { smooth_long_avg_fx[b] = L_add( smooth_long_avg_fx[b], smooth_buf_fx[b][i] ); // Q0 + move32(); } smooth_short_avg_fx[b] = Mpy_32_16_1( smooth_short_avg_fx[b], 5461 /*(1/6 in Q15)*/ ); // Q0 - smooth_long_avg_fx[b] = Mpy_32_16_1( smooth_long_avg_fx[b], 1639 /*(1/20 in Q15)*/ ); // Q0 + move32(); + smooth_long_avg_fx[b] = Mpy_32_16_1( smooth_long_avg_fx[b], 1639 /*(1/20 in Q15)*/ ); // Q0 + move32(); /* calculate smoothing factor based on energy averages */ /* reduce factor for higher short-term energy */ IF( smooth_long_avg_fx[b] <= 0 ) { smooth_fac_fx[b] = 0; + move16(); } - ELSE IF( smooth_long_avg_fx[b] >= smooth_short_avg_fx[b] ) + ELSE IF( GE_32( smooth_long_avg_fx[b], smooth_short_avg_fx[b] ) ) { smooth_fac_fx[b] = MAX_16; // 1.0f in Q15 + move16(); } ELSE { smooth_fac_fx[b] = divide3232( smooth_long_avg_fx[b], smooth_short_avg_fx[b] ); // Q15 + move16(); } /* map factor to range [0;1] */ smooth_fac_fx[b] = shl( mult_r( s_max( 0, sub( smooth_fac_fx[b], 9830 ) ), 23405 /*Q14*/ ), 1 ); // Q15 + move16(); /* compress factor (higher compression in lowest bands) */ IF( LT_16( b, 2 ) ) { exp_tmp = 0; + move16(); smooth_fac_fx[b] = Sqrt16( smooth_fac_fx[b], &exp_tmp ); + move16(); smooth_fac_fx[b] = Sqrt16( smooth_fac_fx[b], &exp_tmp ); + move16(); smooth_fac_fx[b] = shl( smooth_fac_fx[b], exp_tmp ); // Q15 + move16(); } ELSE { exp_tmp = 0; + move16(); smooth_fac_fx[b] = Sqrt16( smooth_fac_fx[b], &exp_tmp ); + move16(); smooth_fac_fx[b] = shl( smooth_fac_fx[b], exp_tmp ); // Q15 + move16(); } /* apply upper bounds depending on band */ smooth_fac_fx[b] = s_max( min_smooth_gains1_fx[b], s_min( max_smooth_gains2_fx[b], smooth_fac_fx[b] ) ); + move16(); } /* only update if we collected a full 5ms worth of energies for the buffer */ + test(); IF( isFirstSubframe || EQ_16( nSlots, MAX_PARAM_SPATIAL_SUBFRAMES ) ) { FOR( b = 0; b < nbands_spar; b++ ) @@ -2173,6 +2356,7 @@ static void ivas_spar_calc_smooth_facs_fx( FOR( i = 2 * SBA_DIRAC_NRG_SMOOTH_LONG; i > 0; i-- ) { smooth_buf_fx[b][i] = smooth_buf_fx[b][i - 1]; + move32(); } } } @@ -2372,7 +2556,6 @@ void ivas_spar_dec_agc_pca_fx( IF( hSpar->hMdDec->td_decorr_flag ) { num_in_ingest = ivas_sba_get_nchan_metadata_fx( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); - move16(); } ELSE { @@ -2454,7 +2637,8 @@ void ivas_spar_dec_set_render_map_fx( /* copy also to tc buffer */ /* only for non-combined formats and combinded formats w/o discrete objects */ - IF( !( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) ) + test(); + IF( !( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) ) { st_ivas->hTcBuffer->nb_subframes = hSpar->nb_subframes; move16(); @@ -2504,7 +2688,9 @@ void ivas_spar_dec_set_render_params_fx( hSpar = st_ivas->hSpar; nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + move16(); num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; + move16(); ivas_spar_dec_gen_umx_mat_fx( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi, ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ) ); ivas_spar_dec_set_render_map_fx( st_ivas, n_cldfb_slots ); @@ -2610,7 +2796,7 @@ void ivas_spar_dec_digest_tc_fx( hSpar = st_ivas->hSpar; test(); test(); - IF( hSpar->hMdDec->td_decorr_flag && !( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) + IF( hSpar->hMdDec->td_decorr_flag && !( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) { Word16 nchan_internal, ch; Word16 ch_sba_idx; @@ -2619,12 +2805,13 @@ void ivas_spar_dec_digest_tc_fx( Word32 *p_tc[MAX_SPAR_INTERNAL_CHANNELS]; Word32 Pcm_tmp[MAX_SPAR_INTERNAL_CHANNELS][L_FRAME48k]; Word16 q_format = Q11; + move16(); ch_sba_idx = 0; move16(); - IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - IF( EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + if ( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { ch_sba_idx = st_ivas->nchan_ism; move16(); @@ -2632,15 +2819,17 @@ void ivas_spar_dec_digest_tc_fx( } /* TD decorrelator */ - default_frame = (Word16) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + Word32 quo, rem; + iDiv_and_mod_32( st_ivas->hDecoderConfig->output_Fs, FRAMES_PER_SEC, &quo, &rem, 0 ); + default_frame = extract_l( quo ); nSamplesLeftForTD = nSamplesForRendering; + move16(); nchan_internal = ivas_sba_get_nchan_metadata_fx( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); FOR( ch = 0; ch < nchan_internal; ch++ ) { pPcm_tmp[ch] = Pcm_tmp[ch]; - p_tc[ch] = st_ivas->hTcBuffer->tc_fx[ch + ch_sba_idx]; - move32(); + p_tc[ch] = st_ivas->hTcBuffer->tc_fx[add( ch, ch_sba_idx )]; } WHILE( nSamplesLeftForTD ) @@ -2652,22 +2841,23 @@ void ivas_spar_dec_digest_tc_fx( ivas_td_decorr_process_fx( hSpar->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr, &q_format ); st_ivas->hTcBuffer->q_tc_fx = s_min( st_ivas->hTcBuffer->q_tc_fx, q_format ); + move16(); IF( GE_16( hSpar->hTdDecorr->num_apd_outputs, sub( nchan_internal, nchan_transport ) ) ) { FOR( ch = 0; ch < sub( nchan_internal, nchan_transport ); ch++ ) { - Copy32( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); + Copy32( pPcm_tmp[sub( sub( hSpar->hTdDecorr->num_apd_outputs, 1 ), ch )], p_tc[sub( sub( nchan_internal, 1 ), ch )], nSamplesToDecorr ); } } ELSE { FOR( ch = 0; ch < sub( nchan_internal, nchan_transport ); ch++ ) { - set32_fx( p_tc[nchan_internal - 1 - ch], 0, nSamplesToDecorr ); + set32_fx( p_tc[sub( sub( nchan_internal, 1 ), ch )], 0, nSamplesToDecorr ); } FOR( ch = 0; ch < hSpar->hTdDecorr->num_apd_outputs; ch++ ) { - Copy32( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); + Copy32( pPcm_tmp[sub( sub( hSpar->hTdDecorr->num_apd_outputs, 1 ), ch )], p_tc[sub( sub( nchan_internal, 1 ), ch )], nSamplesToDecorr ); } } } @@ -2828,7 +3018,7 @@ void ivas_spar_dec_upmixer_sf_fx( Word16 slot_size, slot_idx_start; Word16 md_idx; Word32 *p_tc_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; - Word32 Pcm_tmp_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k] = { 0 }; + Word32 Pcm_tmp_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k]; Word16 numch_out_dirac; Word32 mixer_mat_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; Word16 b_skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; @@ -2836,34 +3026,45 @@ void ivas_spar_dec_upmixer_sf_fx( SPAR_DEC_HANDLE hSpar; Word16 num_md_sub_frames; Word16 q1 = 30; + move16(); push_wmops( "ivas_spar_dec_upmixer_sf" ); hSpar = st_ivas->hSpar; hDecoderConfig = st_ivas->hDecoderConfig; nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + move16(); num_cldfb_bands = hSpar->hFbMixer->pFb->fb_bin_to_band.num_cldfb_bands; + move16(); numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; + move16(); numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; + move16(); num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + move16(); slot_idx_start = hSpar->slots_rendered; + move16(); - IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { Word16 nchan_ism; nchan_ism = st_ivas->nchan_ism; + move16(); FOR( i = 0; i < nchan_internal; i++ ) { - p_tc_fx[i] = st_ivas->hTcBuffer->tc_fx[i + nchan_ism] + slot_idx_start * slot_size; + p_tc_fx[i] = st_ivas->hTcBuffer->tc_fx[add( i, nchan_ism )] + i_mult( slot_idx_start, slot_size ); } - IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) && EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { FOR( i = 0; i < nchan_ism; i++ ) { - p_tc_fx[i + nchan_internal] = st_ivas->hTcBuffer->tc_fx[i] + slot_idx_start * slot_size; + p_tc_fx[add( i, nchan_internal )] = st_ivas->hTcBuffer->tc_fx[i] + i_mult( slot_idx_start, slot_size ); } } } @@ -2871,7 +3072,7 @@ void ivas_spar_dec_upmixer_sf_fx( { FOR( i = 0; i < nchan_internal; i++ ) { - p_tc_fx[i] = st_ivas->hTcBuffer->tc_fx[i] + slot_idx_start * slot_size; + p_tc_fx[i] = st_ivas->hTcBuffer->tc_fx[i] + i_mult( slot_idx_start, slot_size ); } } @@ -2883,10 +3084,12 @@ void ivas_spar_dec_upmixer_sf_fx( IF( hSpar->hMdDec->td_decorr_flag ) { num_in_ingest = nchan_internal; + move16(); } ELSE { num_in_ingest = nchan_transport; + move16(); } /*---------------------------------------------------------------------* @@ -2894,6 +3097,7 @@ void ivas_spar_dec_upmixer_sf_fx( *---------------------------------------------------------------------*/ hSpar->hFbMixer->fb_cfg->num_in_chans = num_in_ingest; + move16(); /*---------------------------------------------------------------------* @@ -2901,15 +3105,15 @@ void ivas_spar_dec_upmixer_sf_fx( *---------------------------------------------------------------------*/ /* set-up pointers */ - IF( NE_16( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) + IF( NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) { /* at this point, output channels are used as intermediate procesing buffers */ FOR( in_ch = 0; in_ch < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; in_ch++ ) { FOR( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) { - cldfb_in_ts_re_fx[in_ch][ts] = &Pcm_tmp_fx[in_ch][ts * num_cldfb_bands]; - cldfb_in_ts_im_fx[in_ch][ts] = &Pcm_tmp_fx[in_ch][ts * num_cldfb_bands + 4 * num_cldfb_bands]; + cldfb_in_ts_re_fx[in_ch][ts] = &Pcm_tmp_fx[in_ch][i_mult( ts, num_cldfb_bands )]; + cldfb_in_ts_im_fx[in_ch][ts] = &Pcm_tmp_fx[in_ch][add( i_mult( ts, num_cldfb_bands ), ( 4 * num_cldfb_bands ) )]; } } } @@ -2919,8 +3123,8 @@ void ivas_spar_dec_upmixer_sf_fx( { FOR( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) { - cldfb_in_ts_re_fx[in_ch][ts] = &Pcm_tmp_fx[in_ch][ts * num_cldfb_bands]; - cldfb_in_ts_im_fx[in_ch][ts] = &Pcm_tmp_fx[in_ch][ts * num_cldfb_bands + 4 * num_cldfb_bands]; + cldfb_in_ts_re_fx[in_ch][ts] = &Pcm_tmp_fx[in_ch][i_mult( ts, num_cldfb_bands )]; + cldfb_in_ts_im_fx[in_ch][ts] = &Pcm_tmp_fx[in_ch][add( i_mult( ts, num_cldfb_bands ), ( 4 * num_cldfb_bands ) )]; } } } @@ -2930,12 +3134,14 @@ void ivas_spar_dec_upmixer_sf_fx( *---------------------------------------------------------------------*/ num_spar_bands = hSpar->hFbMixer->pFb->filterbank_num_bands; + move16(); /* apply parameters */ /* determine if we can skip certain data */ ivas_spar_get_skip_mat_fx( hSpar, numch_out, numch_in, num_spar_bands, b_skip_mat, num_md_sub_frames ); /* this can be precomputed based on bitrate and format*/ numch_out_dirac = hDecoderConfig->nchan_out; + move16(); /* CLDFB analysis of incoming frame */ @@ -2944,35 +3150,45 @@ void ivas_spar_dec_upmixer_sf_fx( FOR( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { Word16 q_cldfb = 11; - cldfbAnalysis_ts_fx_fixed_q( &p_tc_fx[in_ch][ts * num_cldfb_bands], cldfb_in_ts_re_fx[in_ch][ts], cldfb_in_ts_im_fx[in_ch][ts], num_cldfb_bands, st_ivas->cldfbAnaDec[in_ch], &q_cldfb ); + move16(); + cldfbAnalysis_ts_fx_fixed_q( &p_tc_fx[in_ch][i_mult( ts, num_cldfb_bands )], cldfb_in_ts_re_fx[in_ch][ts], cldfb_in_ts_im_fx[in_ch][ts], num_cldfb_bands, st_ivas->cldfbAnaDec[in_ch], &q_cldfb ); } } - IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) && EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { - FOR( ; in_ch < st_ivas->nchan_ism + numch_in; in_ch++ ) + FOR( ; in_ch < add( st_ivas->nchan_ism, numch_in ); in_ch++ ) { FOR( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { Word16 q_cldfb = 11; - cldfbAnalysis_ts_fx_fixed_q( &p_tc_fx[in_ch][ts * num_cldfb_bands], cldfb_in_ts_re_fx[in_ch][ts], cldfb_in_ts_im_fx[in_ch][ts], num_cldfb_bands, st_ivas->cldfbAnaDec[in_ch], &q_cldfb ); + move16(); + cldfbAnalysis_ts_fx_fixed_q( &p_tc_fx[in_ch][i_mult( ts, num_cldfb_bands )], cldfb_in_ts_re_fx[in_ch][ts], cldfb_in_ts_im_fx[in_ch][ts], num_cldfb_bands, st_ivas->cldfbAnaDec[in_ch], &q_cldfb ); } } } - IF( ( LT_32( hDecoderConfig->ivas_total_brate, IVAS_24k4 ) ) && ( ( EQ_16( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_HOA2 ) ) || ( EQ_16( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_HOA3 ) ) ) ) + test(); + test(); + IF( ( LT_32( hDecoderConfig->ivas_total_brate, IVAS_24k4 ) ) && ( ( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_HOA2 ) ) || ( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_HOA3 ) ) ) ) { Word16 q_cldfb = 6; + move16(); ivas_spar_calc_smooth_facs_fx( cldfb_in_ts_re_fx[0], cldfb_in_ts_im_fx[0], q_cldfb, num_spar_bands, hSpar->subframe_nbslots[hSpar->subframes_rendered], hSpar->subframes_rendered == 0, &hSpar->hFbMixer->pFb->fb_bin_to_band, hSpar->hMdDec->smooth_fac_fx, hSpar->hMdDec->smooth_buf_fx ); } FOR( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { - md_idx = hSpar->render_to_md_map[ts + slot_idx_start]; + md_idx = hSpar->render_to_md_map[add( ts, slot_idx_start )]; + move16(); floatToFixed_arr( hSpar->hFbMixer->cldfb_cross_fade, hSpar->hFbMixer->cldfb_cross_fade_fx, Q15, CLDFB_NO_COL_MAX ); ivas_spar_get_parameters_fx( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat_fx ); - IF( ( LT_32( hDecoderConfig->ivas_total_brate, IVAS_24k4 ) ) && ( ( EQ_16( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_HOA2 ) ) || ( EQ_16( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_HOA3 ) ) ) ) + test(); + test(); + IF( ( LT_32( hDecoderConfig->ivas_total_brate, IVAS_24k4 ) ) && ( ( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_HOA2 ) ) || ( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_HOA3 ) ) ) ) { FOR( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) { @@ -2981,7 +3197,9 @@ void ivas_spar_dec_upmixer_sf_fx( FOR( in_ch = 0; in_ch < numch_in; in_ch++ ) { mixer_mat_fx[out_ch][in_ch][spar_band] = L_add( Mult_32_16( mixer_mat_fx[out_ch][in_ch][spar_band], sub( 32767, hSpar->hMdDec->smooth_fac_fx[spar_band] ) ), Mult_32_16( hSpar->hMdDec->mixer_mat_prev2_fx[out_ch][in_ch][spar_band], hSpar->hMdDec->smooth_fac_fx[spar_band] ) ); /*q1*/ + move32(); hSpar->hMdDec->mixer_mat_prev2_fx[out_ch][in_ch][spar_band] = mixer_mat_fx[out_ch][in_ch][spar_band]; + move32(); } } } @@ -2997,19 +3215,24 @@ void ivas_spar_dec_upmixer_sf_fx( FOR( out_ch = 0; out_ch < numch_out; out_ch++ ) { out_re_fx[out_ch] = 0; + move32(); out_im_fx[out_ch] = 0; + move32(); FOR( in_ch = 0; in_ch < numch_in; in_ch++ ) { - IF( EQ_16( b_skip_mat[out_ch][in_ch], 0 ) ) + IF( b_skip_mat[out_ch][in_ch] == 0 ) { IF( LT_16( cldfb_band, CLDFB_PAR_WEIGHT_START_BAND ) ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ { spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band]; + move16(); cldfb_par_fx = mixer_mat_fx[out_ch][in_ch][spar_band]; + move32(); } ELSE { cldfb_par_fx = 0; + move32(); FOR( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) { /* accumulate contributions from all SPAR bands */ @@ -3019,7 +3242,9 @@ void ivas_spar_dec_upmixer_sf_fx( } out_re_fx[out_ch] = L_add( out_re_fx[out_ch], Mult_32_32( cldfb_in_ts_re_fx[in_ch][ts][cldfb_band], cldfb_par_fx ) ); /*q1-25*/ + move32(); out_im_fx[out_ch] = L_add( out_im_fx[out_ch], Mult_32_32( cldfb_in_ts_im_fx[in_ch][ts][cldfb_band], cldfb_par_fx ) ); /*q1-25*/ + move32(); } } } @@ -3027,16 +3252,25 @@ void ivas_spar_dec_upmixer_sf_fx( /*update CLDFB data with the parameter-modified data*/ FOR( out_ch = 0; out_ch < numch_out; out_ch++ ) { - cldfb_in_ts_re_fx[out_ch][ts][cldfb_band] = L_shl( out_re_fx[out_ch], 31 - q1 ); /*Q=6*/ - cldfb_in_ts_im_fx[out_ch][ts][cldfb_band] = L_shl( out_im_fx[out_ch], 31 - q1 ); /*Q=6*/ + cldfb_in_ts_re_fx[out_ch][ts][cldfb_band] = L_shl( out_re_fx[out_ch], sub( 31, q1 ) ); /*Q=6*/ + move32(); + cldfb_in_ts_im_fx[out_ch][ts][cldfb_band] = L_shl( out_im_fx[out_ch], sub( 31, q1 ) ); /*Q=6*/ + move32(); } } - IF( ( EQ_16( ( add( add( slot_idx_start, ts ), 1 ) ), hSpar->num_slots ) ) || ( NE_16( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ), ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) ) + + test(); + IF( ( EQ_16( ( add( add( slot_idx_start, ts ), 1 ) ), hSpar->num_slots ) ) || ( NE_16( ( shr( md_idx, 2 ) /* md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME */ ), ( hSpar->render_to_md_map[add( add( slot_idx_start, ts ), 1 )] / JBM_CLDFB_SLOTS_IN_SUBFRAME /*It's value is 4*/ ) ) ) ) { /* we have crossed an unadapted parameter sf border, update previous mixing matrices */ - Word16 md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; + Word16 md_sf = shr( md_idx, 2 ) /* md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME */; split_band = SPAR_DIRAC_SPLIT_START_BAND; - md_sf = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? md_sf : 0; + move16(); + if ( NE_16( num_md_sub_frames, MAX_PARAM_SPATIAL_SUBFRAMES ) ) + { + md_sf = 0; + move16(); + } IF( LT_16( split_band, IVAS_MAX_NUM_BANDS ) ) { Copy32( hSpar->hMdDec->mixer_mat_prev_fx[1][0][0], hSpar->hMdDec->mixer_mat_prev_fx[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); @@ -3050,17 +3284,22 @@ void ivas_spar_dec_upmixer_sf_fx( { FOR( b = 0; b < num_spar_bands; b++ ) { - hSpar->hMdDec->mixer_mat_prev_fx[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][b + md_sf * IVAS_MAX_NUM_BANDS]; + hSpar->hMdDec->mixer_mat_prev_fx[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][add( b, i_mult( md_sf, IVAS_MAX_NUM_BANDS ) )]; + move32(); } } } - hSpar->i_subframe++; + hSpar->i_subframe = add( hSpar->i_subframe, 1 ); + move16(); hSpar->i_subframe = s_min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); + move16(); } } } - IF( NE_16( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) && NE_16( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_16( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) ) + test(); + test(); + IF( NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) && NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) ) { ivas_dirac_dec_render_sf_fx( st_ivas, output_fx, nchan_internal, cldfb_in_ts_re_fx, cldfb_in_ts_im_fx ); } @@ -3069,38 +3308,49 @@ void ivas_spar_dec_upmixer_sf_fx( { Word16 outchannels, idx_in, idx_lfe, ch; idx_in = 0; + move16(); idx_lfe = 0; + move16(); outchannels = add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ); FOR( ch = 0; ch < outchannels; ch++ ) { - IF( ( GT_16( st_ivas->hOutSetup.num_lfe, 0 ) ) && ( EQ_16( st_ivas->hOutSetup.index_lfe[idx_lfe], ch ) ) ) + test(); + IF( ( st_ivas->hOutSetup.num_lfe > 0 ) && ( EQ_16( st_ivas->hOutSetup.index_lfe[idx_lfe], ch ) ) ) { - set_zero_fx( output_fx[ch], hSpar->subframe_nbslots[hSpar->subframes_rendered] * num_cldfb_bands ); - IF( LT_16( idx_lfe, ( sub( st_ivas->hDirACRend->hOutSetup.num_lfe, 1 ) ) ) ) + set_zero_fx( output_fx[ch], i_mult( hSpar->subframe_nbslots[hSpar->subframes_rendered], num_cldfb_bands ) ); + if ( LT_16( idx_lfe, ( sub( st_ivas->hDirACRend->hOutSetup.num_lfe, 1 ) ) ) ) { - idx_lfe++; + idx_lfe = add( idx_lfe, 1 ); } } ELSE { - IF( ( EQ_16( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) || !( EQ_16( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) && - !( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) && EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) ) + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) || !( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) && + !( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) ) { Scale_sig32( st_ivas->cldfbSynDec[idx_in]->cldfb_state_fx, st_ivas->cldfbSynDec[idx_in]->p_filter_length, -6 ); st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state = sub( st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state, 6 ); + move16(); Scale_sig32( output_fx[ch], out_len, -6 ); FOR( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { - cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[idx_in][ts], &cldfb_in_ts_im_fx[idx_in][ts], &output_fx[ch][ts * num_cldfb_bands], num_cldfb_bands, st_ivas->cldfbSynDec[idx_in] ); + cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[idx_in][ts], &cldfb_in_ts_im_fx[idx_in][ts], &output_fx[ch][i_mult( ts, num_cldfb_bands )], num_cldfb_bands, st_ivas->cldfbSynDec[idx_in] ); } Scale_sig32( output_fx[ch], out_len, 6 ); Scale_sig32( st_ivas->cldfbSynDec[idx_in]->cldfb_state_fx, st_ivas->cldfbSynDec[idx_in]->p_filter_length, 6 ); st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state = add( st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state, 6 ); + move16(); } - idx_in++; + idx_in = add( idx_in, 1 ); } } } @@ -3111,19 +3361,23 @@ void ivas_spar_dec_upmixer_sf_fx( { Scale_sig32( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx, st_ivas->cldfbSynDec[out_ch]->p_filter_length, -6 ); st_ivas->cldfbSynDec[out_ch]->Q_cldfb_state = sub( st_ivas->cldfbSynDec[out_ch]->Q_cldfb_state, 6 ); + move16(); Scale_sig32( output_fx[out_ch], out_len, -6 ); FOR( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { - cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[out_ch][ts], &cldfb_in_ts_im_fx[out_ch][ts], &output_fx[out_ch][ts * num_cldfb_bands], num_cldfb_bands, st_ivas->cldfbSynDec[out_ch] ); + cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[out_ch][ts], &cldfb_in_ts_im_fx[out_ch][ts], &output_fx[out_ch][i_mult( ts, num_cldfb_bands )], num_cldfb_bands, st_ivas->cldfbSynDec[out_ch] ); } Scale_sig32( output_fx[out_ch], out_len, 6 ); Scale_sig32( st_ivas->cldfbSynDec[out_ch]->cldfb_state_fx, st_ivas->cldfbSynDec[out_ch]->p_filter_length, 6 ); st_ivas->cldfbSynDec[out_ch]->Q_cldfb_state = add( st_ivas->cldfbSynDec[out_ch]->Q_cldfb_state, 6 ); + move16(); } } hSpar->slots_rendered = add( hSpar->slots_rendered, hSpar->subframe_nbslots[hSpar->subframes_rendered] ); - hSpar->subframes_rendered++; + move16(); + hSpar->subframes_rendered = add( hSpar->subframes_rendered, 1 ); + move16(); pop_wmops(); diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 6e7f24878..48cbad61d 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -69,7 +69,7 @@ static const int16_t ivas_spar_dec_plc_spatial_target[IVAS_SPAR_MAX_CH] = { 1, 0 *------------------------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -static void ivas_get_spar_matrices_fx( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t n_ts, const int16_t bw, const int16_t dtx_vad, const int16_t nB, const int16_t numch_out, const int16_t active_w_vlbr, const int16_t dyn_active_w_flag ); +static void ivas_get_spar_matrices_fx( ivas_spar_md_dec_state_t *hMdDec, const Word16 num_bands_out, const Word16 n_ts, const Word16 bw, const Word16 dtx_vad, const Word16 nB, const Word16 numch_out, const Word16 active_w_vlbr, const Word16 dyn_active_w_flag ); #else static void ivas_get_spar_matrices( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t n_ts, const int16_t bw, const int16_t dtx_vad, const int16_t nB, const int16_t numch_out, const int16_t active_w_vlbr, const int16_t dyn_active_w_flag ); #endif @@ -83,7 +83,7 @@ static void ivas_fill_band_coeffs_idx( ivas_band_coeffs_ind_t *pBands_idx, const #ifndef IVAS_FLOAT_FIXED static void ivas_mat_col_rearrange( float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t order[IVAS_SPAR_MAX_CH], const int16_t i_ts, float ***mixer_mat, const int16_t bands, const int16_t num_ch ); #else -static void ivas_mat_col_rearrange_fx( Word32 in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t order[IVAS_SPAR_MAX_CH], const int16_t i_ts, Word32 ***mixer_mat, const int16_t bands, const int16_t num_ch ); +static void ivas_mat_col_rearrange_fx( Word32 in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const Word16 order[IVAS_SPAR_MAX_CH], const Word16 i_ts, Word32 ***mixer_mat, const Word16 bands, const Word16 num_ch ); #endif #ifndef IVAS_FLOAT_FIXED @@ -101,24 +101,33 @@ static void ivas_spar_md_fill_invalid_bands_fx( ivas_spar_dec_matrices_t *pSpar_ static void ivas_spar_md_fill_invalid_bands( ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, const int16_t numch_out, const int16_t num_md_sub_frames ); #endif +#ifdef IVAS_FLOAT_FIXED +static void ivas_spar_md_fill_invalid_bandcoeffs( ivas_band_coeffs_t *pBand_coeffs, ivas_band_coeffs_t *pBand_coeffs_prev, const Word16 *valid_bands, Word16 *base_band_age, Word16 *first_valid_frame, const Word16 num_bands ); +#else static void ivas_spar_md_fill_invalid_bandcoeffs( ivas_band_coeffs_t *pBand_coeffs, ivas_band_coeffs_t *pBand_coeffs_prev, const int16_t *valid_bands, int16_t *base_band_age, int16_t *first_valid_frame, const int16_t num_bands ); +#endif + #ifdef IVAS_FLOAT_FIXED -static ivas_error ivas_spar_set_dec_config( ivas_spar_md_dec_state_t *hMdDec, const int16_t nchan_transport, Word32 *pFC ); +static ivas_error ivas_spar_set_dec_config( ivas_spar_md_dec_state_t *hMdDec, const Word16 nchan_transport, Word32 *pFC ); #else static ivas_error ivas_spar_set_dec_config( ivas_spar_md_dec_state_t *hMdDec, const int16_t nchan_transport, float *pFC ); #endif +#ifdef IVAS_FLOAT_FIXED +static void ivas_parse_parameter_bitstream_dtx( ivas_spar_md_t *pSpar_md, Decoder_State *st, const Word16 bw, const Word16 num_bands, Word16 *num_dmx_per_band, Word16 *num_dec_per_band ); +#else static void ivas_parse_parameter_bitstream_dtx( ivas_spar_md_t *pSpar_md, Decoder_State *st, const int16_t bw, const int16_t num_bands, int16_t *num_dmx_per_band, int16_t *num_dec_per_band ); +#endif #ifndef IVAS_FLOAT_FIXED static ivas_error ivas_deindex_real_index( const int16_t *index, const int16_t q_levels, const float min_value, const float max_value, float *quant, const int16_t num_ch_dim2 ); #endif #ifdef IVAS_FLOAT_FIXED -static ivas_error ivas_deindex_real_index_fx( const int16_t *index, const int16_t q_levels, const Word32 min_value, const Word32 max_value, Word32 *quant, const int16_t num_ch_dim2 ); +static ivas_error ivas_deindex_real_index_fx( const Word16 *index, const Word16 q_levels, const Word32 min_value, const Word32 max_value, Word32 *quant, const Word16 num_ch_dim2 ); #endif #ifdef IVAS_FLOAT_FIXED -static void ivas_spar_dec_parse_md_bs_fx( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, int16_t *nB, int16_t *bands_bw, int16_t *dtx_vad, const int32_t ivas_total_brate, const int16_t sba_inactive_mode ); +static void ivas_spar_dec_parse_md_bs_fx( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, Word16 *nB, Word16 *bands_bw, Word16 *dtx_vad, const Word32 ivas_total_brate, const Word16 sba_inactive_mode ); #else static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, int16_t *nB, int16_t *bands_bw, int16_t *dtx_vad, const int32_t ivas_total_brate, const int16_t sba_inactive_mode ); #endif @@ -299,90 +308,90 @@ ivas_error ivas_spar_md_dec_matrix_open( #else ivas_error ivas_spar_md_dec_matrix_open_fx( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const int16_t num_channels, /* i : number of internal channels */ - const int16_t num_md_sub_frames /* i : number of MD subframes */ + const Word16 num_channels, /* i : number of internal channels */ + const Word16 num_md_sub_frames /* i : number of MD subframes */ ) { - int16_t i, j; - int16_t k; - if ( ( hMdDec->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * num_md_sub_frames * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) + Word16 i, j; + Word16 k; + IF( ( hMdDec->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( i_mult( i_mult( IVAS_MAX_NUM_BANDS, num_md_sub_frames ), sizeof( ivas_band_coeffs_t ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); } - if ( ( hMdDec->band_coeffs_prev = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) + IF( ( hMdDec->band_coeffs_prev = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); } - if ( ( hMdDec->mixer_mat_fx = (Word32 ***) malloc( num_channels * sizeof( Word32 ** ) ) ) == NULL ) + IF( ( hMdDec->mixer_mat_fx = (Word32 ***) malloc( i_mult( num_channels, sizeof( Word32 ** ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } - for ( i = 0; i < num_channels; i++ ) + FOR( i = 0; i < num_channels; i++ ) { - if ( ( hMdDec->mixer_mat_fx[i] = (Word32 **) malloc( num_channels * sizeof( Word32 * ) ) ) == NULL ) + IF( ( hMdDec->mixer_mat_fx[i] = (Word32 **) malloc( i_mult( num_channels, sizeof( Word32 * ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } - for ( j = 0; j < num_channels; j++ ) + FOR( j = 0; j < num_channels; j++ ) { - if ( ( hMdDec->mixer_mat_fx[i][j] = (Word32 *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) == NULL ) + IF( ( hMdDec->mixer_mat_fx[i][j] = (Word32 *) malloc( i_mult( i_mult( num_md_sub_frames, IVAS_MAX_NUM_BANDS ), sizeof( Word32 ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } } } - if ( ( hMdDec->spar_coeffs.C_re_fx = (Word32 ***) malloc( num_channels * sizeof( Word32 ** ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs.C_re_fx = (Word32 ***) malloc( i_mult( num_channels, sizeof( Word32 ** ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } - for ( i = 0; i < num_channels; i++ ) + FOR( i = 0; i < num_channels; i++ ) { - if ( ( hMdDec->spar_coeffs.C_re_fx[i] = (Word32 **) malloc( num_channels * sizeof( Word32 * ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs.C_re_fx[i] = (Word32 **) malloc( i_mult( num_channels, sizeof( Word32 * ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } - for ( j = 0; j < num_channels; j++ ) + FOR( j = 0; j < num_channels; j++ ) { - if ( ( hMdDec->spar_coeffs.C_re_fx[i][j] = (Word32 *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs.C_re_fx[i][j] = (Word32 *) malloc( i_mult( i_mult( num_md_sub_frames, IVAS_MAX_NUM_BANDS ), sizeof( Word32 ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } } } - if ( ( hMdDec->spar_coeffs.P_re_fx = (Word32 ***) malloc( num_channels * sizeof( Word32 ** ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs.P_re_fx = (Word32 ***) malloc( i_mult( num_channels, sizeof( Word32 ** ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } - for ( i = 0; i < num_channels; i++ ) + FOR( i = 0; i < num_channels; i++ ) { - if ( ( hMdDec->spar_coeffs.P_re_fx[i] = (Word32 **) malloc( num_channels * sizeof( Word32 * ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs.P_re_fx[i] = (Word32 **) malloc( i_mult( num_channels, sizeof( Word32 * ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } - for ( j = 0; j < num_channels; j++ ) + FOR( j = 0; j < num_channels; j++ ) { - if ( ( hMdDec->spar_coeffs.P_re_fx[i][j] = (Word32 *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs.P_re_fx[i][j] = (Word32 *) malloc( i_mult( num_md_sub_frames, IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } } } - if ( ( hMdDec->spar_coeffs_prev.C_re_fx = (Word32 ***) malloc( num_channels * sizeof( Word32 ** ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs_prev.C_re_fx = (Word32 ***) malloc( i_mult( num_channels, sizeof( Word32 ** ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } - for ( i = 0; i < num_channels; i++ ) + FOR( i = 0; i < num_channels; i++ ) { - if ( ( hMdDec->spar_coeffs_prev.C_re_fx[i] = (Word32 **) malloc( num_channels * sizeof( Word32 * ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs_prev.C_re_fx[i] = (Word32 **) malloc( i_mult( num_channels, sizeof( Word32 * ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } - for ( j = 0; j < num_channels; j++ ) + FOR( j = 0; j < num_channels; j++ ) { - if ( ( hMdDec->spar_coeffs_prev.C_re_fx[i][j] = (Word32 *) malloc( IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs_prev.C_re_fx[i][j] = (Word32 *) malloc( IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } @@ -390,73 +399,77 @@ ivas_error ivas_spar_md_dec_matrix_open_fx( } // Fix Memory - if ( ( hMdDec->spar_coeffs_prev.P_re_fx = (Word32 ***) malloc( num_channels * sizeof( Word32 ** ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs_prev.P_re_fx = (Word32 ***) malloc( i_mult( num_channels, sizeof( Word32 ** ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } - for ( i = 0; i < num_channels; i++ ) + FOR( i = 0; i < num_channels; i++ ) { - if ( ( hMdDec->spar_coeffs_prev.P_re_fx[i] = (Word32 **) malloc( num_channels * sizeof( Word32 * ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs_prev.P_re_fx[i] = (Word32 **) malloc( i_mult( num_channels, sizeof( Word32 * ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } - for ( j = 0; j < num_channels; j++ ) + FOR( j = 0; j < num_channels; j++ ) { - if ( ( hMdDec->spar_coeffs_prev.P_re_fx[i][j] = (Word32 *) malloc( IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs_prev.P_re_fx[i][j] = (Word32 *) malloc( IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } } } // Fix Memory - if ( ( hMdDec->spar_coeffs_tar.C_re_fx = (Word32 ***) malloc( num_channels * sizeof( Word32 ** ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs_tar.C_re_fx = (Word32 ***) malloc( i_mult( num_channels, sizeof( Word32 ** ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } - for ( i = 0; i < num_channels; i++ ) + FOR( i = 0; i < num_channels; i++ ) { - if ( ( hMdDec->spar_coeffs_tar.C_re_fx[i] = (Word32 **) malloc( num_channels * sizeof( Word32 * ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs_tar.C_re_fx[i] = (Word32 **) malloc( i_mult( num_channels, sizeof( Word32 * ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } - for ( j = 0; j < num_channels; j++ ) + FOR( j = 0; j < num_channels; j++ ) { - if ( ( hMdDec->spar_coeffs_tar.C_re_fx[i][j] = (Word32 *) malloc( IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs_tar.C_re_fx[i][j] = (Word32 *) malloc( IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } } } // Fix Memory - if ( ( hMdDec->spar_coeffs_tar.P_re_fx = (Word32 ***) malloc( num_channels * sizeof( Word32 ** ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs_tar.P_re_fx = (Word32 ***) malloc( i_mult( num_channels, sizeof( Word32 ** ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } - for ( i = 0; i < num_channels; i++ ) + FOR( i = 0; i < num_channels; i++ ) { - if ( ( hMdDec->spar_coeffs_tar.P_re_fx[i] = (Word32 **) malloc( num_channels * sizeof( Word32 * ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs_tar.P_re_fx[i] = (Word32 **) malloc( i_mult( num_channels, sizeof( Word32 * ) ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } - for ( j = 0; j < num_channels; j++ ) + FOR( j = 0; j < num_channels; j++ ) { - if ( ( hMdDec->spar_coeffs_tar.P_re_fx[i][j] = (Word32 *) malloc( IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) == NULL ) + IF( ( hMdDec->spar_coeffs_tar.P_re_fx[i][j] = (Word32 *) malloc( IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } } } - for ( i = 0; i < num_channels; i++ ) + FOR( i = 0; i < num_channels; i++ ) { - for ( j = 0; j < num_channels; j++ ) + FOR( j = 0; j < num_channels; j++ ) { - for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) { hMdDec->spar_coeffs_prev.C_re_fx[i][j][k] = 0; + move32(); hMdDec->spar_coeffs_prev.P_re_fx[i][j][k] = 0; + move32(); hMdDec->spar_coeffs_tar.C_re_fx[i][j][k] = 0; + move32(); hMdDec->spar_coeffs_tar.P_re_fx[i][j][k] = 0; + move32(); } } } @@ -485,7 +498,7 @@ Word16 ivas_get_spar_dec_md_num_subframes( move16(); IF( GT_16( sba_order, SBA_FOA_ORDER ) ) { - IF( GE_32( ivas_total_brate, IVAS_512k ) ) + if ( GE_32( ivas_total_brate, IVAS_512k ) ) { num_subframes = 1; move16(); @@ -495,7 +508,7 @@ Word16 ivas_get_spar_dec_md_num_subframes( test(); test(); test(); - IF( ( LE_32( ivas_total_brate, IVAS_SID_5k2 ) && LT_32( ivas_last_active_brate, IVAS_24k4 ) ) || ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && LT_32( ivas_total_brate, IVAS_24k4 ) ) ) + if ( ( LE_32( ivas_total_brate, IVAS_SID_5k2 ) && LT_32( ivas_last_active_brate, IVAS_24k4 ) ) || ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && LT_32( ivas_total_brate, IVAS_24k4 ) ) ) { num_subframes = 1; move16(); @@ -541,51 +554,51 @@ int16_t ivas_get_spar_dec_md_num_subframes( ivas_error ivas_spar_md_dec_open( ivas_spar_md_dec_state_t **hMdDec_out, /* i/o: SPAR MD decoder handle */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ - const int16_t num_channels, /* i : number of internal channels */ - const int16_t sba_order, /* i : SBA order */ - const int16_t sid_format, /* i : SID format */ - const int32_t last_active_ivas_total_brate /* i : IVAS last active bitrate */ + const Word16 num_channels, /* i : number of internal channels */ + const Word16 sba_order, /* i : SBA order */ + const Word16 sid_format, /* i : SID format */ + const Word32 last_active_ivas_total_brate /* i : IVAS last active bitrate */ ) { ivas_spar_md_dec_state_t *hMdDec; ivas_error error; - int16_t num_md_sub_frames; + Word16 num_md_sub_frames; error = IVAS_ERR_OK; + move32(); - if ( ( hMdDec = (ivas_spar_md_dec_state_t *) malloc( sizeof( ivas_spar_md_dec_state_t ) ) ) == NULL ) + IF( ( hMdDec = (ivas_spar_md_dec_state_t *) malloc( sizeof( ivas_spar_md_dec_state_t ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD decoder" ); } num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, hDecoderConfig->ivas_total_brate, last_active_ivas_total_brate ); -#ifndef IVAS_FLOAT_FIXED - if ( ( error = ivas_spar_md_dec_matrix_open( hMdDec, num_channels, num_md_sub_frames ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_spar_md_dec_matrix_open_fx( hMdDec, num_channels, num_md_sub_frames ) ) != IVAS_ERR_OK ) -#endif + IF( NE_32( ( error = ivas_spar_md_dec_matrix_open_fx( hMdDec, num_channels, num_md_sub_frames ) ), IVAS_ERR_OK ) ) { return error; } - if ( hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) + IF( EQ_32( hDecoderConfig->ivas_total_brate, IVAS_SID_5k2 ) ) { - if ( sid_format == SID_SBA_2TC ) + IF( EQ_16( sid_format, SID_SBA_2TC ) ) { hMdDec->table_idx = ivas_get_spar_table_idx( IVAS_48k, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + move16(); } - else + ELSE { hMdDec->table_idx = ivas_get_spar_table_idx( IVAS_24k4, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + move16(); } } - else + ELSE { hMdDec->table_idx = ivas_get_spar_table_idx( hDecoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + move16(); } - if ( ( error = ivas_spar_md_dec_init( hMdDec, hDecoderConfig, num_channels, sba_order ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_spar_md_dec_init( hMdDec, hDecoderConfig, num_channels, sba_order ) ), IVAS_ERR_OK ) ) { return error; } @@ -718,27 +731,27 @@ void ivas_spar_md_dec_matrix_close( #else void ivas_spar_md_dec_matrix_close_fx( ivas_spar_md_dec_state_t *hMdDecoder, /* i/o: SPAR MD decoder handle */ - const int16_t num_channels /* i : number of internal channels */ + const Word16 num_channels /* i : number of internal channels */ ) { - int16_t i, j; + Word16 i, j; - if ( hMdDecoder->spar_md.band_coeffs != NULL ) + IF( hMdDecoder->spar_md.band_coeffs != NULL ) { free( hMdDecoder->spar_md.band_coeffs ); hMdDecoder->spar_md.band_coeffs = NULL; } - if ( hMdDecoder->band_coeffs_prev != NULL ) + IF( hMdDecoder->band_coeffs_prev != NULL ) { free( hMdDecoder->band_coeffs_prev ); hMdDecoder->band_coeffs_prev = NULL; } - if ( hMdDecoder->mixer_mat_fx != NULL ) + IF( hMdDecoder->mixer_mat_fx != NULL ) { - for ( i = 0; i < num_channels; i++ ) + FOR( i = 0; i < num_channels; i++ ) { - for ( j = 0; j < num_channels; j++ ) + FOR( j = 0; j < num_channels; j++ ) { free( hMdDecoder->mixer_mat_fx[i][j] ); } @@ -746,11 +759,11 @@ void ivas_spar_md_dec_matrix_close_fx( } free( hMdDecoder->mixer_mat_fx ); } - if ( hMdDecoder->spar_coeffs.C_re_fx != NULL ) + IF( hMdDecoder->spar_coeffs.C_re_fx != NULL ) { - for ( i = 0; i < num_channels; i++ ) + FOR( i = 0; i < num_channels; i++ ) { - for ( j = 0; j < num_channels; j++ ) + FOR( j = 0; j < num_channels; j++ ) { free( hMdDecoder->spar_coeffs.C_re_fx[i][j] ); } @@ -758,11 +771,11 @@ void ivas_spar_md_dec_matrix_close_fx( } free( hMdDecoder->spar_coeffs.C_re_fx ); } - if ( hMdDecoder->spar_coeffs.P_re_fx != NULL ) + IF( hMdDecoder->spar_coeffs.P_re_fx != NULL ) { - for ( i = 0; i < num_channels; i++ ) + FOR( i = 0; i < num_channels; i++ ) { - for ( j = 0; j < num_channels; j++ ) + FOR( j = 0; j < num_channels; j++ ) { free( hMdDecoder->spar_coeffs.P_re_fx[i][j] ); } @@ -771,11 +784,11 @@ void ivas_spar_md_dec_matrix_close_fx( free( hMdDecoder->spar_coeffs.P_re_fx ); } - if ( hMdDecoder->spar_coeffs_prev.C_re_fx != NULL ) + IF( hMdDecoder->spar_coeffs_prev.C_re_fx != NULL ) { - for ( i = 0; i < num_channels; i++ ) + FOR( i = 0; i < num_channels; i++ ) { - for ( j = 0; j < num_channels; j++ ) + FOR( j = 0; j < num_channels; j++ ) { free( hMdDecoder->spar_coeffs_prev.C_re_fx[i][j] ); } @@ -784,11 +797,11 @@ void ivas_spar_md_dec_matrix_close_fx( free( hMdDecoder->spar_coeffs_prev.C_re_fx ); } - if ( hMdDecoder->spar_coeffs_prev.P_re_fx != NULL ) + IF( hMdDecoder->spar_coeffs_prev.P_re_fx != NULL ) { - for ( i = 0; i < num_channels; i++ ) + FOR( i = 0; i < num_channels; i++ ) { - for ( j = 0; j < num_channels; j++ ) + FOR( j = 0; j < num_channels; j++ ) { free( hMdDecoder->spar_coeffs_prev.P_re_fx[i][j] ); } @@ -797,11 +810,11 @@ void ivas_spar_md_dec_matrix_close_fx( free( hMdDecoder->spar_coeffs_prev.P_re_fx ); } - if ( hMdDecoder->spar_coeffs_tar.C_re_fx != NULL ) + IF( hMdDecoder->spar_coeffs_tar.C_re_fx != NULL ) { - for ( i = 0; i < num_channels; i++ ) + FOR( i = 0; i < num_channels; i++ ) { - for ( j = 0; j < num_channels; j++ ) + FOR( j = 0; j < num_channels; j++ ) { free( hMdDecoder->spar_coeffs_tar.C_re_fx[i][j] ); } @@ -809,11 +822,11 @@ void ivas_spar_md_dec_matrix_close_fx( } free( hMdDecoder->spar_coeffs_tar.C_re_fx ); } - if ( hMdDecoder->spar_coeffs_tar.P_re_fx != NULL ) + IF( hMdDecoder->spar_coeffs_tar.P_re_fx != NULL ) { - for ( i = 0; i < num_channels; i++ ) + FOR( i = 0; i < num_channels; i++ ) { - for ( j = 0; j < num_channels; j++ ) + FOR( j = 0; j < num_channels; j++ ) { free( hMdDecoder->spar_coeffs_tar.P_re_fx[i][j] ); } @@ -837,16 +850,13 @@ void ivas_spar_md_dec_close( ) { ivas_spar_md_dec_state_t *hMdDecoder; - int16_t num_channels; + Word16 num_channels; hMdDecoder = *hMdDec; num_channels = hMdDecoder->spar_md_cfg.num_umx_chs; + move16(); -#ifndef IVAS_FLOAT_FIXED - ivas_spar_md_dec_matrix_close( hMdDecoder, num_channels ); -#else ivas_spar_md_dec_matrix_close_fx( hMdDecoder, num_channels ); -#endif free( *hMdDec ); *hMdDec = NULL; @@ -961,15 +971,12 @@ ivas_error ivas_spar_md_dec_init( ivas_error ivas_spar_md_dec_init( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ - const int16_t num_channels, /* i : number of internal channels */ - const int16_t sba_order /* i : SBA order */ + const Word16 num_channels, /* i : number of internal channels */ + const Word16 sba_order /* i : SBA order */ ) { - int16_t i, j; - int16_t nchan_transport; -#ifndef IVAS_FLOAT_FIXED - Word32 pFC[IVAS_MAX_NUM_BANDS]; -#endif + Word16 i, j; + Word16 nchan_transport; Word32 *pFC_fx = NULL, PR_minmax_fx[2]; ivas_error error; @@ -977,20 +984,21 @@ ivas_error ivas_spar_md_dec_init( ivas_sba_get_spar_hoa_ch_ind_fx( num_channels, hDecoderConfig->ivas_total_brate, hMdDec->HOA_md_ind ); - hMdDec->spar_md.num_bands = ( hMdDec->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + IF( hMdDec->spar_hoa_md_flag ) + { + hMdDec->spar_md.num_bands = IVAS_MAX_NUM_BANDS; + move16(); + } + ELSE + { + hMdDec->spar_md.num_bands = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + move16(); + } ivas_spar_set_bitrate_config_fx( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands, hMdDec->spar_hoa_dirac2spar_md_flag, 0, 0, 0 ); nchan_transport = hMdDec->spar_md_cfg.nchan_transport; - - -#ifndef IVAS_FLOAT_FIXED - /* get FB coefficients */ - FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) - { - pFC[i] = L_shr( Mpy_32_32( ivas_fb_fcs_12band_1ms_fx[i], hDecoderConfig->output_Fs ), 1 ); // Q0 - } -#endif + move16(); IF( EQ_32( hDecoderConfig->output_Fs, 8000 ) ) { @@ -1012,86 +1020,78 @@ ivas_error ivas_spar_md_dec_init( { pFC_fx = pFC_48k; } - else + ELSE { assert( 0 ); // update sample rate } -#ifdef IVAS_FLOAT_FIXED - if ( ( error = ivas_spar_set_dec_config( hMdDec, nchan_transport, pFC_fx ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_spar_set_dec_config( hMdDec, nchan_transport, pFC ) ) != IVAS_ERR_OK ) -#endif + IF( NE_32( ( error = ivas_spar_set_dec_config( hMdDec, nchan_transport, pFC_fx ) ), IVAS_ERR_OK ) ) { return error; } - if ( nchan_transport != 2 && ( ( hMdDec->spar_md_cfg.remix_unmix_order == 2 ) || ( hMdDec->spar_md_cfg.remix_unmix_order == 1 ) ) ) + test(); + test(); + IF( NE_16( nchan_transport, 2 ) && ( EQ_16( hMdDec->spar_md_cfg.remix_unmix_order, 2 ) || EQ_16( hMdDec->spar_md_cfg.remix_unmix_order, 1 ) ) ) { return IVAS_ERR_INTERNAL; } /* DTX quant init */ PR_minmax_fx[0] = hMdDec->spar_md_cfg.quant_strat[0].PR.min_fx; + move32(); PR_minmax_fx[1] = hMdDec->spar_md_cfg.quant_strat[0].PR.max_fx; + move32(); ivas_spar_quant_dtx_init_fx( &hMdDec->spar_md, PR_minmax_fx ); ivas_spar_arith_coeffs_com_init_fx( &hMdDec->arith_coeffs, &hMdDec->spar_md_cfg, hMdDec->table_idx, DEC ); ivas_spar_huff_coeffs_com_init_fx( &hMdDec->huff_coeffs, &hMdDec->spar_md_cfg, hMdDec->table_idx, DEC ); hMdDec->spar_md_cfg.prev_quant_idx = -1; + move16(); /* initialize PLC state */ - set_s( hMdDec->valid_bands, 0, IVAS_MAX_NUM_BANDS ); - set_s( hMdDec->base_band_age, 0, IVAS_MAX_NUM_BANDS ); - set_s( hMdDec->base_band_coeffs_age, 0, IVAS_MAX_NUM_BANDS ); + set16_fx( hMdDec->valid_bands, 0, IVAS_MAX_NUM_BANDS ); + set16_fx( hMdDec->base_band_age, 0, IVAS_MAX_NUM_BANDS ); + set16_fx( hMdDec->base_band_coeffs_age, 0, IVAS_MAX_NUM_BANDS ); hMdDec->spar_plc_num_lost_frames = 0; + move16(); hMdDec->spar_plc_enable_fadeout_flag = 1; + move16(); hMdDec->dtx_md_smoothing_cntr = 1; + move16(); -#ifndef IVAS_FLOAT_FIXED - ivas_clear_band_coeffs( hMdDec->spar_md.band_coeffs, IVAS_MAX_NUM_BANDS ); - ivas_clear_band_coeffs( hMdDec->band_coeffs_prev, IVAS_MAX_NUM_BANDS ); -#else ivas_clear_band_coeffs_fx( hMdDec->spar_md.band_coeffs, IVAS_MAX_NUM_BANDS ); ivas_clear_band_coeffs_fx( hMdDec->band_coeffs_prev, IVAS_MAX_NUM_BANDS ); -#endif + ivas_clear_band_coeff_idx( hMdDec->spar_md.band_coeffs_idx, IVAS_MAX_NUM_BANDS ); ivas_clear_band_coeff_idx( hMdDec->spar_md_prev.band_coeffs_idx, IVAS_MAX_NUM_BANDS ); ivas_clear_band_coeff_idx( hMdDec->spar_md_prev.band_coeffs_idx_mapped, IVAS_MAX_NUM_BANDS ); hMdDec->spar_md.dtx_vad = 0; + move16(); hMdDec->td_decorr_flag = 1; + move16(); set32_fx( hMdDec->spar_md.en_ratio_slow_fx, 0, IVAS_MAX_NUM_BANDS ); set32_fx( hMdDec->spar_md.ref_pow_slow_fx, 0, IVAS_MAX_NUM_BANDS ); set16_fx( hMdDec->smooth_fac_fx, 0, IVAS_MAX_NUM_BANDS ); -#ifndef IVAS_FLOAT_FIXED - set_f( hMdDec->spar_md.en_ratio_slow, 0.0f, IVAS_MAX_NUM_BANDS ); - set_f( hMdDec->spar_md.ref_pow_slow, 0.0f, IVAS_MAX_NUM_BANDS ); - set_zero( hMdDec->smooth_fac, IVAS_MAX_NUM_BANDS ); -#endif - for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) { set32_fx( hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); -#ifndef IVAS_FLOAT_FIXED - set_zero( hMdDec->smooth_buf[i], 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); -#endif } - for ( i = 0; i < IVAS_SPAR_MAX_CH; i++ ) + FOR( i = 0; i < IVAS_SPAR_MAX_CH; i++ ) { - for ( j = 0; j < IVAS_SPAR_MAX_CH; j++ ) + FOR( j = 0; j < IVAS_SPAR_MAX_CH; j++ ) { set32_fx( hMdDec->mixer_mat_prev2_fx[i][j], 0, IVAS_MAX_NUM_BANDS ); -#ifndef IVAS_FLOAT_FIXED - set_zero( hMdDec->mixer_mat_prev2[i][j], IVAS_MAX_NUM_BANDS ); -#endif } } hMdDec->first_valid_frame = 1; + move16(); return IVAS_ERR_OK; } @@ -1107,53 +1107,64 @@ ivas_error ivas_spar_md_dec_init( #ifdef IVAS_FLOAT_FIXED static ivas_error ivas_spar_set_dec_config( ivas_spar_md_dec_state_t *hMdDec, - const int16_t nchan_transport, + const Word16 nchan_transport, Word32 *pFC ) { - int16_t i, j, nchan, dmx_ch; + Word16 i, j, nchan, dmx_ch; - for ( i = 0; i < nchan_transport; i++ ) + FOR( i = 0; i < nchan_transport; i++ ) { hMdDec->spar_md_cfg.max_freq_per_chan[i] = ivas_spar_br_table_consts[hMdDec->table_idx].fpcs; + move16(); } nchan = ivas_sba_get_nchan_metadata_fx( ivas_spar_br_table_consts[hMdDec->table_idx].sba_order, ivas_spar_br_table_consts[hMdDec->table_idx].ivas_total_brate ); - switch ( nchan ) + SWITCH( nchan ) { case 4: /* FOA_CHANNELS */ hMdDec->num_decorr = IVAS_TD_DECORR_OUT_3CH; - break; + move16(); + BREAK; case 9: /* IVAS_HOA_2_CH */ hMdDec->num_decorr = IVAS_TD_DECORR_OUT_5CH; - break; + move16(); + BREAK; case 6: /* IVAS_HOA_2_CH */ hMdDec->num_decorr = IVAS_TD_DECORR_OUT_2CH; - break; + move16(); + BREAK; case 8: /* IVAS_HOA_3_CH */ hMdDec->num_decorr = IVAS_TD_DECORR_OUT_4CH; - break; + move16(); + BREAK; } hMdDec->spar_md_cfg.num_umx_chs = nchan; + move16(); dmx_ch = 0; - for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + move16(); + FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) { dmx_ch = 0; - for ( j = 0; j < nchan_transport; j++ ) + move16(); + FOR( j = 0; j < nchan_transport; j++ ) { - if ( pFC[i] < hMdDec->spar_md_cfg.max_freq_per_chan[j] ) + if ( LT_32( pFC[i], hMdDec->spar_md_cfg.max_freq_per_chan[j] ) ) { - dmx_ch += 1; + dmx_ch = add( dmx_ch, 1 ); } } hMdDec->spar_md_cfg.num_dmx_chans_per_band[i] = hMdDec->spar_md_cfg.nchan_transport; - hMdDec->spar_md_cfg.num_decorr_per_band[i] = nchan - hMdDec->spar_md_cfg.nchan_transport; + move16(); + hMdDec->spar_md_cfg.num_decorr_per_band[i] = sub( nchan, hMdDec->spar_md_cfg.nchan_transport ); + move16(); } hMdDec->spar_md_cfg.nchan_transport = dmx_ch; + move16(); return IVAS_ERR_OK; } @@ -1296,9 +1307,9 @@ static void ivas_dec_mono_sba_handling_fx( test(); test(); - IF( - ( NE_32( azimuth_fx, 0 ) ) || - ( NE_32( elevation_fx, 0 ) ) || + if ( + ( ( azimuth_fx != 0 ) ) || + ( ( elevation_fx != 0 ) ) || ( GT_32( energy_ratio_fx, 161061274 /* 0.15f in Q30 */ ) ) ) /* 0.15f is just above the lowest quantised value. */ { mono_flag = 0; @@ -1308,6 +1319,7 @@ static void ivas_dec_mono_sba_handling_fx( } /* Combine the SPAR prediction coefs flag with the azimuth, elevation and energy ratio flag.*/ + test(); mono_flag = mono_flag && ivas_spar_chk_zero_coefs_fx( st_ivas ); IF( mono_flag ) @@ -1361,7 +1373,16 @@ void ivas_spar_md_dec_process_fx( hMdDec = st_ivas->hSpar->hMdDec; - active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; + IF( LT_32( st_ivas->hDecoderConfig->ivas_total_brate, IVAS_24k4 ) ) + { + active_w_vlbr = 1; + move16(); + } + ELSE + { + active_w_vlbr = 0; + move16(); + } num_md_chs = ivas_sba_get_nchan_metadata_fx( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); @@ -1389,7 +1410,7 @@ void ivas_spar_md_dec_process_fx( } } } - else + ELSE { dyn_active_w_flag = 0; move16(); @@ -1399,23 +1420,6 @@ void ivas_spar_md_dec_process_fx( } } -#if 0 // ndef IVAS_FLOAT_FIXED_TO_BE_REMOVED - FOR (Word16 i = 0; i < IVAS_MAX_NUM_BANDS; i++) - { - FOR (Word16 ii = 0; ii < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; ii++) - { - FOR (Word16 jj = 0; jj < IVAS_SPAR_MAX_DMX_CHS - 1; jj++) - { - hMdDec->spar_md.band_coeffs[i].C_re_fx[ii][jj] = (Word32)(hMdDec->spar_md.band_coeffs[i].C_re[ii][jj] * (1 << 22)); - } - } - FOR (Word16 jj = 0; jj < IVAS_SPAR_MAX_DMX_CHS - 1; jj++) - { - hMdDec->spar_md.band_coeffs[i].pred_re_fx[jj] = (Word32)(hMdDec->spar_md.band_coeffs[i].pred_re[jj] * (1 << 22)); - hMdDec->spar_md.band_coeffs[i].P_re_fx[jj] = (Word32)(hMdDec->spar_md.band_coeffs[i].P_re[jj] * (1 << 22)); - } - } -#endif ivas_spar_dec_parse_md_bs_fx( hMdDec, st0, &nB, &bw, &dtx_vad, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hQMetaData->sba_inactive_mode ); @@ -1428,23 +1432,7 @@ void ivas_spar_md_dec_process_fx( &hMdDec->base_band_coeffs_age[0], &hMdDec->first_valid_frame, nB ); -#if 0 // ndef IVAS_FLOAT_FIXED_TO_BE_REMOVED - for (int i = 0; i < IVAS_MAX_NUM_BANDS; i++) - { - for (int ii = 0; ii < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; ii++) - { - for (int jj = 0; jj < IVAS_SPAR_MAX_DMX_CHS - 1; jj++) - { - hMdDec->spar_md.band_coeffs[i].C_re[ii][jj] = (float)hMdDec->spar_md.band_coeffs[i].C_re_fx[ii][jj] / (1 << 22); - } - } - for (int jj = 0; jj < IVAS_SPAR_MAX_DMX_CHS - 1; jj++) - { - hMdDec->spar_md.band_coeffs[i].pred_re[jj] = (float)hMdDec->spar_md.band_coeffs[i].pred_re_fx[jj] / (1 << 22); - hMdDec->spar_md.band_coeffs[i].P_re[jj] = (float)hMdDec->spar_md.band_coeffs[i].P_re_fx[jj] / (1 << 22); - } - } -#endif + ivas_dec_mono_sba_handling_fx( st_ivas ); /* SPAR to DirAC conversion */ @@ -1458,37 +1446,28 @@ void ivas_spar_md_dec_process_fx( move16(); /* expand DirAC MD to all time slots */ - for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) + FOR( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) { - for ( b = 0; b < hMdDec->spar_md.num_bands; b++ ) + FOR( b = 0; b < hMdDec->spar_md.num_bands; b++ ) { - for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) { -#if 0 // ndef IVAS_FLOAT_FIXED_TO_BE_REMOVED - hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re[j] = hMdDec->spar_md.band_coeffs[b].pred_re[j]; -#endif - hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re_fx[j] = hMdDec->spar_md.band_coeffs[b].pred_re_fx[j]; + hMdDec->spar_md.band_coeffs[add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )].pred_re_fx[j] = hMdDec->spar_md.band_coeffs[b].pred_re_fx[j]; move32(); } - for ( j = 0; j < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; j++ ) + FOR( j = 0; j < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; j++ ) { - for ( k = 0; k < IVAS_SPAR_MAX_DMX_CHS - 1; k++ ) + FOR( k = 0; k < IVAS_SPAR_MAX_DMX_CHS - 1; k++ ) { -#if 0 // ndef IVAS_FLOAT_FIXED_TO_BE_REMOVED - hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].C_re[j][k] = hMdDec->spar_md.band_coeffs[b].C_re[j][k]; -#endif - hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].C_re_fx[j][k] = hMdDec->spar_md.band_coeffs[b].C_re_fx[j][k]; + hMdDec->spar_md.band_coeffs[add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )].C_re_fx[j][k] = hMdDec->spar_md.band_coeffs[b].C_re_fx[j][k]; move32(); } } - for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) { -#if 0 // ndef IVAS_FLOAT_FIXED_TO_BE_REMOVED - hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].P_re[j] = hMdDec->spar_md.band_coeffs[b].P_re[j]; -#endif - hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].P_re_fx[j] = hMdDec->spar_md.band_coeffs[b].P_re_fx[j]; + hMdDec->spar_md.band_coeffs[add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )].P_re_fx[j] = hMdDec->spar_md.band_coeffs[b].P_re_fx[j]; move32(); } } @@ -1511,6 +1490,7 @@ void ivas_spar_md_dec_process_fx( hMdDec->dtx_md_smoothing_cntr = 1; + move16(); return; } @@ -1700,36 +1680,42 @@ Word16 ivas_spar_chk_zero_coefs_fx( Word16 j, k, b; ivas_spar_md_dec_state_t *hMdDec; Word16 mono = 1; + move16(); Word16 ndec, ndm; hMdDec = st_ivas->hSpar->hMdDec; ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; + move16(); ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; + move16(); FOR( b = 0; b < min( hMdDec->spar_md.num_bands, SPAR_DIRAC_SPLIT_START_BAND ); b++ ) { - FOR( j = 0; j < ndm + ndec - 1; j++ ) + FOR( j = 0; j < sub( add( ndm, ndec ), 1 ); j++ ) { - IF( NE_32( hMdDec->spar_md.band_coeffs[b].pred_re_fx[j], 0 ) ) + if ( hMdDec->spar_md.band_coeffs[b].pred_re_fx[j] != 0 ) { mono = 0; + move16(); } } FOR( j = 0; j < ndec; j++ ) { - FOR( k = 0; k < ndm - 1; k++ ) + FOR( k = 0; k < sub( ndm, 1 ); k++ ) { - IF( NE_32( hMdDec->spar_md.band_coeffs[b].C_re_fx[j][k], 0 ) ) + if ( hMdDec->spar_md.band_coeffs[b].C_re_fx[j][k] != 0 ) { mono = 0; + move16(); } } } FOR( j = 0; j < ndec; j++ ) { - IF( NE_32( hMdDec->spar_md.band_coeffs[b].P_re_fx[j], 0 ) ) + if ( hMdDec->spar_md.band_coeffs[b].P_re_fx[j] != 0 ) { mono = 0; + move16(); } } } @@ -1805,7 +1791,7 @@ void ivas_spar_smooth_md_dtx_fx( { FOR( k = dmx_ch; k < FOA_CHANNELS; k++ ) { - hMdDec->spar_coeffs.P_re_fx[j][k][b + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.P_re_fx[j][k][b]; /* Q22 */ + hMdDec->spar_coeffs.P_re_fx[j][k][add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )] = hMdDec->spar_coeffs.P_re_fx[j][k][b]; /* Q22 */ move32(); } } @@ -1814,7 +1800,7 @@ void ivas_spar_smooth_md_dtx_fx( { FOR( k = 0; k < dmx_ch; k++ ) { - hMdDec->spar_coeffs.C_re_fx[j][k][b + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.C_re_fx[j][k][b]; /* Q22 */ + hMdDec->spar_coeffs.C_re_fx[j][k][add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )] = hMdDec->spar_coeffs.C_re_fx[j][k][b]; /* Q22 */ move32(); } } @@ -1822,6 +1808,7 @@ void ivas_spar_smooth_md_dtx_fx( } hMdDec->dtx_md_smoothing_cntr = s_min( add( hMdDec->dtx_md_smoothing_cntr, 1 ), IVAS_DEFAULT_DTX_CNG_RAMP ); + move16(); return; } @@ -2390,14 +2377,14 @@ static void ivas_get_spar_matrices( static void ivas_get_spar_matrices_fx( ivas_spar_md_dec_state_t *hMdDec, - const int16_t num_bands_out, - const int16_t n_ts, - const int16_t bw, - const int16_t dtx_vad, - const int16_t nB, - const int16_t numch_out, - const int16_t active_w_vlbr, - const int16_t dyn_active_w_flag ) + const Word16 num_bands_out, + const Word16 n_ts, + const Word16 bw, + const Word16 dtx_vad, + const Word16 nB, + const Word16 numch_out, + const Word16 active_w_vlbr, + const Word16 dyn_active_w_flag ) { Word16 num_bands, dmx_ch, split_band; Word16 i, j, k, m, b, i_ts, active_w; @@ -2405,9 +2392,11 @@ static void ivas_get_spar_matrices_fx( Word32 active_w_dm_fac_fx, re_fx, re_fx1; num_bands = num_bands_out; + move16(); order = remix_order_set[hMdDec->spar_md_cfg.remix_unmix_order]; split_band = SPAR_DIRAC_SPLIT_START_BAND; + move16(); // Dead code as SPAR_DIRAC_SPLIT_START_BAND = 8 and IVAS_MAX_NUM_BANDS = 12 IF( GE_16( split_band, IVAS_MAX_NUM_BANDS ) ) @@ -2427,15 +2416,30 @@ static void ivas_get_spar_matrices_fx( } } - IF( bw == IVAS_RED_BAND_FACT ) + if ( EQ_16( bw, IVAS_RED_BAND_FACT ) ) { num_bands = shl( num_bands, 1 ); } + test(); active_w = EQ_16( dyn_active_w_flag, 1 ) || EQ_16( hMdDec->spar_md_cfg.active_w, 1 ); - active_w_dm_fac_fx = EQ_16( dtx_vad, 0 ) ? IVAS_ACTIVEW_DM_F_SCALE_DTX_FX : ( EQ_16( active_w_vlbr, 1 ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR_FX : IVAS_ACTIVEW_DM_F_SCALE_FX ); - move16(); + IF( dtx_vad == 0 ) + { + active_w_dm_fac_fx = IVAS_ACTIVEW_DM_F_SCALE_DTX_FX; + move32(); + } + ELSE IF( EQ_16( active_w_vlbr, 1 ) ) + { + active_w_dm_fac_fx = IVAS_ACTIVEW_DM_F_SCALE_VLBR_FX; + move32(); + } + ELSE + { + active_w_dm_fac_fx = IVAS_ACTIVEW_DM_F_SCALE_FX; + move32(); + } + FOR( i_ts = 0; i_ts < n_ts; i_ts++ ) { FOR( i = 0; i < numch_out; i++ ) @@ -2443,18 +2447,20 @@ static void ivas_get_spar_matrices_fx( FOR( j = 0; j < numch_out; j++ ) { - set32_fx( &hMdDec->spar_coeffs.C_re_fx[i][j][i_ts * IVAS_MAX_NUM_BANDS], 0, IVAS_MAX_NUM_BANDS ); - set32_fx( &hMdDec->spar_coeffs.P_re_fx[i][j][i_ts * IVAS_MAX_NUM_BANDS], 0, IVAS_MAX_NUM_BANDS ); + set32_fx( &hMdDec->spar_coeffs.C_re_fx[i][j][i_mult( i_ts, IVAS_MAX_NUM_BANDS )], 0, IVAS_MAX_NUM_BANDS ); + set32_fx( &hMdDec->spar_coeffs.P_re_fx[i][j][i_mult( i_ts, IVAS_MAX_NUM_BANDS )], 0, IVAS_MAX_NUM_BANDS ); } } num_bands = min( num_bands, nB ); + move16(); FOR( b = 0; b < num_bands; b++ ) { Word32 tmp_C1_re_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; Word32 tmp_C2_re_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; Word32 tmp_dm_re_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; - dmx_ch = hMdDec->spar_md_cfg.num_dmx_chans_per_band[bw * b]; + dmx_ch = hMdDec->spar_md_cfg.num_dmx_chans_per_band[i_mult( bw, b )]; + move16(); FOR( j = 0; j < numch_out; j++ ) { @@ -2472,7 +2478,7 @@ static void ivas_get_spar_matrices_fx( FOR( j = 1; j < numch_out; j++ ) { - tmp_C1_re_fx[j][0] = hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re_fx[j - 1]; // Q.22 + tmp_C1_re_fx[j][0] = hMdDec->spar_md.band_coeffs[add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )].pred_re_fx[j - 1]; // Q.22 move32(); } @@ -2481,7 +2487,7 @@ static void ivas_get_spar_matrices_fx( FOR( j = 1; j < numch_out; j++ ) { - tmp_C2_re_fx[0][j] = Mpy_32_32( active_w_dm_fac_fx, -hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re_fx[j - 1] ); // Q31 *Q22=Q22 + tmp_C2_re_fx[0][j] = Mpy_32_32( active_w_dm_fac_fx, L_negate( hMdDec->spar_md.band_coeffs[add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )].pred_re_fx[j - 1] ) ); // Q31 *Q22=Q22 move32(); } re_fx = Mpy_32_32( tmp_C2_re_fx[0][1], tmp_C1_re_fx[1][0] ); // Q22 *Q22 =Q13 @@ -2494,23 +2500,29 @@ static void ivas_get_spar_matrices_fx( tmp_dm_re_fx[0][0] = L_shl( L_add( re_fx1, re_fx ), Q9 ); // (Q13+Q13) << Q9 = Q22; move32(); - if ( EQ_16( dyn_active_w_flag, 1 ) ) + IF( EQ_16( dyn_active_w_flag, 1 ) ) { tmp_dm_re_fx[0][0] = L_shl( Mpy_32_32( tmp_dm_re_fx[0][0], IVAS_SPAR_DYN_ACTIVEW_THRESH_FX ), Q9 ); // Q13 *Q31 =Q13 << Q9=Q.22 move32(); } tmp_dm_re_fx[0][1] = tmp_C2_re_fx[0][1]; + move32(); tmp_dm_re_fx[0][2] = tmp_C2_re_fx[0][2]; + move32(); tmp_dm_re_fx[0][3] = tmp_C2_re_fx[0][3]; + move32(); tmp_dm_re_fx[1][0] = tmp_C1_re_fx[1][0]; + move32(); tmp_dm_re_fx[2][0] = tmp_C1_re_fx[2][0]; + move32(); tmp_dm_re_fx[3][0] = tmp_C1_re_fx[3][0]; + move32(); IF( NE_16( hMdDec->spar_md_cfg.remix_unmix_order, 3 ) ) { @@ -2521,12 +2533,11 @@ static void ivas_get_spar_matrices_fx( { IF( NE_16( hMdDec->spar_md_cfg.remix_unmix_order, 3 ) ) { - ivas_mat_col_rearrange_fx( tmp_C1_re_fx, order, i_ts, hMdDec->mixer_mat_fx, b, numch_out ); } } - IF( GT_16( dmx_ch, 0 ) ) + IF( dmx_ch > 0 ) { Word32 tmpC_re_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; Word32 tmpP_re_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; @@ -2552,7 +2563,7 @@ static void ivas_get_spar_matrices_fx( { FOR( k = 1; k < dmx_ch; k++ ) { - tmpC_re_fx[j][k] = hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].C_re_fx[j - dmx_ch][k - 1]; // Q22 + tmpC_re_fx[j][k] = hMdDec->spar_md.band_coeffs[add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )].C_re_fx[sub( j, dmx_ch )][k - 1]; // Q22 move32(); } } @@ -2563,7 +2574,7 @@ static void ivas_get_spar_matrices_fx( { IF( EQ_16( sub( j, dmx_ch ), sub( k, dmx_ch ) ) ) { - tmpP_re_fx[j][k] = hMdDec->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].P_re_fx[k - dmx_ch]; // Q22 + tmpP_re_fx[j][k] = hMdDec->spar_md.band_coeffs[add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )].P_re_fx[sub( k, dmx_ch )]; // Q22 move32(); } ELSE @@ -2581,9 +2592,9 @@ static void ivas_get_spar_matrices_fx( { FOR( m = 0; m < numch_out; m++ ) { - re_fx = Mpy_32_32( hMdDec->mixer_mat_fx[j][m][b + i_ts * IVAS_MAX_NUM_BANDS], tmpP_re_fx[m][k] ); // Q30*Q22 + re_fx = Mpy_32_32( hMdDec->mixer_mat_fx[j][m][add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )], tmpP_re_fx[m][k] ); // Q30*Q22 re_fx = L_shl( re_fx, 1 ); - hMdDec->spar_coeffs.P_re_fx[j][k][( b * bw ) + i_ts * IVAS_MAX_NUM_BANDS] = L_add( hMdDec->spar_coeffs.P_re_fx[j][k][( b * bw ) + i_ts * IVAS_MAX_NUM_BANDS], re_fx ); + hMdDec->spar_coeffs.P_re_fx[j][k][add( i_mult( b, bw ), i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )] = L_add( hMdDec->spar_coeffs.P_re_fx[j][k][add( i_mult( b, bw ), i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )], re_fx ); move32(); } } @@ -2596,23 +2607,24 @@ static void ivas_get_spar_matrices_fx( { FOR( m = 0; m < numch_out; m++ ) { - re_fx = Mpy_32_32( hMdDec->mixer_mat_fx[j][m][b + i_ts * IVAS_MAX_NUM_BANDS], tmpC_re_fx[m][k] ); // Q30* Q22 + re_fx = Mpy_32_32( hMdDec->mixer_mat_fx[j][m][add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )], tmpC_re_fx[m][k] ); // Q30* Q22 re_fx = L_shl( re_fx, 1 ); - hMdDec->spar_coeffs.C_re_fx[j][k][( b * bw ) + i_ts * IVAS_MAX_NUM_BANDS] = L_add( hMdDec->spar_coeffs.C_re_fx[j][k][( b * bw ) + i_ts * IVAS_MAX_NUM_BANDS], re_fx ); + hMdDec->spar_coeffs.C_re_fx[j][k][add( i_mult( b, bw ), i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )] = L_add( hMdDec->spar_coeffs.C_re_fx[j][k][add( i_mult( b, bw ), i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )], re_fx ); move32(); } } } - hMdDec->spar_coeffs.C_re_fx[0][0][( b * bw ) + i_ts * IVAS_MAX_NUM_BANDS] = - max( 0, hMdDec->spar_coeffs.C_re_fx[0][0][( b * bw ) + i_ts * IVAS_MAX_NUM_BANDS] ); + hMdDec->spar_coeffs.C_re_fx[0][0][add( i_mult( b, bw ), i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )] = + max( 0, hMdDec->spar_coeffs.C_re_fx[0][0][add( i_mult( b, bw ), i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )] ); + move32(); } } /* band mixing */ IF( EQ_16( bw, IVAS_RED_BAND_FACT ) ) { - FOR( b = 0; b < num_bands_out; b = b + bw ) + FOR( b = 0; b < num_bands_out; b = add( b, bw ) ) { dmx_ch = hMdDec->spar_md_cfg.num_dmx_chans_per_band[b]; move16(); @@ -2620,8 +2632,7 @@ static void ivas_get_spar_matrices_fx( { FOR( k = dmx_ch; k < numch_out; k++ ) { - - hMdDec->spar_coeffs.P_re_fx[j][k][( b + 1 ) + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.P_re_fx[j][k][b + i_ts * IVAS_MAX_NUM_BANDS]; + hMdDec->spar_coeffs.P_re_fx[j][k][add( add( b, 1 ), i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )] = hMdDec->spar_coeffs.P_re_fx[j][k][add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )]; move32(); } } @@ -2630,9 +2641,7 @@ static void ivas_get_spar_matrices_fx( { FOR( k = 0; k < dmx_ch; k++ ) { - - hMdDec->spar_coeffs.C_re_fx[j][k][( b + 1 ) + i_ts * IVAS_MAX_NUM_BANDS] = hMdDec->spar_coeffs.C_re_fx[j][k][b + i_ts * IVAS_MAX_NUM_BANDS]; - + hMdDec->spar_coeffs.C_re_fx[j][k][add( add( b, 1 ), i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )] = hMdDec->spar_coeffs.C_re_fx[j][k][add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )]; move32(); } } @@ -2697,7 +2706,7 @@ static void ivas_mat_col_rearrange_fx( FOR( j = 0; j < num_ch; j++ ) { - mixer_mat[j][i][bands + i_ts * IVAS_MAX_NUM_BANDS] = L_shl_sat( in_re[j][idx], Q8 ); + mixer_mat[j][i][add( bands, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )] = L_shl_sat( in_re[j][idx], Q8 ); move32(); } } @@ -2732,7 +2741,7 @@ void ivas_spar_dec_gen_umx_mat_fx( { FOR( b = 0; b < num_bands_out; b++ ) { - hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = L_shl_sat( hMdDec->spar_coeffs.C_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], Q8 ); + hMdDec->mixer_mat_fx[i][j][add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )] = L_shl_sat( hMdDec->spar_coeffs.C_re_fx[i][j][add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )], Q8 ); move32(); } } @@ -2743,7 +2752,7 @@ void ivas_spar_dec_gen_umx_mat_fx( { FOR( b = 0; b < num_bands_out; b++ ) { - hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = L_shl_sat( hMdDec->spar_coeffs.P_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], Q8 ); + hMdDec->mixer_mat_fx[i][j][add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )] = L_shl_sat( hMdDec->spar_coeffs.P_re_fx[i][j][add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )], Q8 ); move32(); } } @@ -2757,7 +2766,7 @@ void ivas_spar_dec_gen_umx_mat_fx( { FOR( b = 0; b < num_bands_out; b++ ) { - hMdDec->mixer_mat_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = L_shl_sat( hMdDec->spar_coeffs.C_re_fx[i][j][b + i_ts * IVAS_MAX_NUM_BANDS], Q8 ); + hMdDec->mixer_mat_fx[i][j][add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )] = L_shl_sat( hMdDec->spar_coeffs.C_re_fx[i][j][add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )], Q8 ); move32(); } } @@ -2829,51 +2838,48 @@ void ivas_spar_dec_gen_umx_mat( static void ivas_spar_md_band_upmix( ivas_band_coeffs_t *band_coeffs, - int16_t *nB, - int16_t *bands_bw, - int16_t *valid_bands, - int16_t bw_final, - int16_t ndec, - int16_t ndm ) + Word16 *nB, + Word16 *bands_bw, + Word16 *valid_bands, + Word16 bw_final, + Word16 ndec, + Word16 ndm ) { - int16_t i, ii, jj, b, idx, bw_fact; + Word16 i, ii, jj, b, idx, bw_fact; - bw_fact = *bands_bw / bw_final; - for ( i = *nB - 1; i >= 0; i-- ) + bw_fact = idiv1616( *bands_bw, bw_final ); + FOR( i = sub( *nB, 1 ); i >= 0; i-- ) { - for ( b = bw_fact - 1; b >= 0; b-- ) + FOR( b = sub( bw_fact, 1 ); b >= 0; b-- ) { - idx = i * bw_fact + b; - for ( ii = 0; ii < ndec + ndm - 1; ii++ ) + idx = add( i_mult( i, bw_fact ), b ); + FOR( ii = 0; ii < sub( add( ndec, ndm ), 1 ); ii++ ) { -#if 0 // ndef IVAS_FLOAT_FIXED_TO_BE_REMOVED - band_coeffs[idx].pred_re[ii] = band_coeffs[i].pred_re[ii]; -#endif band_coeffs[idx].pred_re_fx[ii] = band_coeffs[i].pred_re_fx[ii]; + move32(); } - for ( ii = 0; ii < ndec; ii++ ) + FOR( ii = 0; ii < ndec; ii++ ) { - for ( jj = 0; jj < ndm - 1; jj++ ) + FOR( jj = 0; jj < sub( ndm, 1 ); jj++ ) { -#if 0 // ndef IVAS_FLOAT_FIXED_TO_BE_REMOVED - band_coeffs[idx].C_re[ii][jj] = band_coeffs[i].C_re[ii][jj]; -#endif band_coeffs[idx].C_re_fx[ii][jj] = band_coeffs[i].C_re_fx[ii][jj]; + move32(); } } - for ( jj = 0; jj < ndec; jj++ ) + FOR( jj = 0; jj < ndec; jj++ ) { -#if 0 // ndef IVAS_FLOAT_FIXED_TO_BE_REMOVED - band_coeffs[idx].P_re[jj] = band_coeffs[i].P_re[jj]; -#endif band_coeffs[idx].P_re_fx[jj] = band_coeffs[i].P_re_fx[jj]; + move32(); } valid_bands[idx] = valid_bands[i]; + move16(); } } - *nB = ( *nB ) * ( *bands_bw ) / bw_final; + *nB = idiv1616( i_mult( ( *nB ), ( *bands_bw ) ), bw_final ); + move16(); *bands_bw = bw_final; + move16(); return; } @@ -3122,99 +3128,112 @@ static void ivas_spar_dec_parse_md_bs( static void ivas_spar_dec_parse_md_bs_fx( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st0, - int16_t *nB, - int16_t *bands_bw, - int16_t *dtx_vad, - const int32_t ivas_total_brate, - const int16_t sba_inactive_mode ) + Word16 *nB, + Word16 *bands_bw, + Word16 *dtx_vad, + const Word32 ivas_total_brate, + const Word16 sba_inactive_mode ) { - int16_t i, j, k, num_bands; - int16_t ii, jj, ndec, ndm; - uint16_t qsi; + Word16 i, j, k, num_bands; + Word16 ii, jj, ndec, ndm; + UWord16 qsi; ivas_quant_strat_t qs; - int16_t strat, no_ec; - int16_t do_diff[IVAS_MAX_NUM_BANDS]; - // float quant[IVAS_SPAR_MAX_C_COEFF]; + Word16 strat, no_ec; + Word16 do_diff[IVAS_MAX_NUM_BANDS]; Word32 quant_fx[IVAS_SPAR_MAX_C_COEFF]; - int16_t do_repeat[IVAS_MAX_NUM_BANDS]; + Word16 do_repeat[IVAS_MAX_NUM_BANDS]; *dtx_vad = 1; + move16(); *bands_bw = 1; + move16(); qsi = 0; + move16(); num_bands = hMdDec->spar_md.num_bands; + move16(); - if ( ivas_total_brate > IVAS_SID_5k2 ) + IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) ) { - if ( hMdDec->spar_md_cfg.quant_strat_bits > 0 ) + IF( hMdDec->spar_md_cfg.quant_strat_bits > 0 ) { - if ( ivas_total_brate >= BRATE_SPAR_Q_STRAT ) + IF( GE_32( ivas_total_brate, BRATE_SPAR_Q_STRAT ) ) { /*only one bit written for quantization strategy to indicate either a fixed quantization strategy or dtx_vad==0 */ qsi = get_next_indice( st0, 1 ); - if ( qsi == 1 ) + if ( EQ_32( qsi, 1 ) ) { *dtx_vad = 0; + move16(); } } - else + ELSE { - if ( sba_inactive_mode == 1 ) + IF( EQ_16( sba_inactive_mode, 1 ) ) { *dtx_vad = 0; - qsi = hMdDec->spar_md_cfg.quant_strat_bits + 1; + move16(); + qsi = add( hMdDec->spar_md_cfg.quant_strat_bits, 1 ); } - else + ELSE { qsi = get_next_indice( st0, hMdDec->spar_md_cfg.quant_strat_bits ); } } } - else + ELSE { qsi = 0; + move16(); } } - else + ELSE { *dtx_vad = 0; + move16(); } hMdDec->dtx_vad = *dtx_vad; + move16(); - if ( *dtx_vad == 0 ) + IF( *dtx_vad == 0 ) { *nB = SPAR_DTX_BANDS; - *bands_bw = num_bands / *nB; + move16(); + *bands_bw = idiv1616( num_bands, *nB ); + move16(); - for ( i = 0; i < *nB; i++ ) + FOR( i = 0; i < *nB; i++ ) { - for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) { - // hMdDec->spar_md.band_coeffs[i].pred_re[j] = 0; hMdDec->spar_md.band_coeffs[i].pred_re_fx[j] = 0; - // hMdDec->spar_md.band_coeffs[i].P_re[j] = 0; + move32(); hMdDec->spar_md.band_coeffs[i].P_re_fx[j] = 0; + move32(); } hMdDec->valid_bands[i] = 1; + move16(); } - for ( i = 0; i < num_bands; i++ ) + FOR( i = 0; i < num_bands; i++ ) { - for ( j = 0; j < ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ); j++ ) + FOR( j = 0; j < ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ); j++ ) { - for ( k = 0; k < ( IVAS_SPAR_MAX_DMX_CHS - 1 ); k++ ) + FOR( k = 0; k < ( IVAS_SPAR_MAX_DMX_CHS - 1 ); k++ ) { - // hMdDec->spar_md.band_coeffs[i].C_re[j][k] = 0; hMdDec->spar_md.band_coeffs[i].C_re_fx[j][k] = 0; + move32(); } } } ivas_parse_parameter_bitstream_dtx( &hMdDec->spar_md, st0, *bands_bw, *nB, hMdDec->spar_md_cfg.num_dmx_chans_per_band, hMdDec->spar_md_cfg.num_decorr_per_band ); - if ( *bands_bw != 1 ) + IF( NE_16( *bands_bw, 1 ) ) { ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; + move16(); ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; + move16(); ivas_spar_md_band_upmix( hMdDec->spar_md.band_coeffs, nB, @@ -3229,124 +3248,175 @@ static void ivas_spar_dec_parse_md_bs_fx( } qs = hMdDec->spar_md_cfg.quant_strat[qsi]; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); strat = get_next_indice( st0, 3 ); no_ec = 0; + move16(); - if ( strat < 2 ) + IF( LT_16( strat, 2 ) ) { - *bands_bw = strat + 1; - *nB = num_bands / *bands_bw; - for ( i = 0; i < *nB; i++ ) + *bands_bw = add( strat, 1 ); + move16(); + *nB = idiv1616( num_bands, *bands_bw ); + move16(); + FOR( i = 0; i < *nB; i++ ) { do_diff[i] = 0; + move16(); do_repeat[i] = 0; + move16(); } } - else if ( strat < 4 ) + ELSE IF( LT_16( strat, 4 ) ) { - *bands_bw = strat - 1; - *nB = num_bands / *bands_bw; - for ( i = 0; i < *nB; i++ ) + *bands_bw = sub( strat, 1 ); + move16(); + *nB = idiv1616( num_bands, *bands_bw ); + move16(); + FOR( i = 0; i < *nB; i++ ) { do_diff[i] = 0; + move16(); do_repeat[i] = 0; + move16(); } no_ec = 1; + move16(); } - else if ( ivas_total_brate < IVAS_24k4 ) + ELSE IF( LT_32( ivas_total_brate, IVAS_24k4 ) ) { *bands_bw = 2; - *nB = num_bands / *bands_bw; + move16(); + *nB = idiv1616( num_bands, *bands_bw ); + move16(); - for ( i = 0; i < *nB; i++ ) + FOR( i = 0; i < *nB; i++ ) { do_diff[i] = 0; - do_repeat[i] = ( ( strat % 2 ) == ( ( i + 1 ) % 2 ) ); + move16(); + do_repeat[i] = extract_l( EQ_16( ( strat % 2 ), ( add( i, 1 ) % 2 ) ) ); + move16(); } } - else + ELSE { *bands_bw = 1; + move16(); *nB = num_bands; + move16(); - for ( i = 0; i < *nB; i++ ) + FOR( i = 0; i < *nB; i++ ) { - do_diff[i] = ( ( ( i + 1 ) & 3 ) != strat - 4 ); + do_diff[i] = extract_l( NE_16( s_and( add( i, 1 ), 3 ), sub( strat, 4 ) ) ); + move16(); do_repeat[i] = 0; + move16(); } - if ( hMdDec->spar_md_cfg.prev_quant_idx >= 0 ) + IF( hMdDec->spar_md_cfg.prev_quant_idx >= 0 ) { ivas_map_prior_coeffs_quant( &hMdDec->spar_md_prev, &hMdDec->spar_md_cfg, qsi, *nB ); } } hMdDec->spar_md_cfg.prev_quant_idx = qsi; + move16(); - if ( no_ec == 0 ) + IF( no_ec == 0 ) { ivas_decode_arith_bs( hMdDec, st0, qsi, *nB, *bands_bw, do_diff, strat, ivas_total_brate ); } - else + ELSE { ivas_decode_huffman_bs( hMdDec, st0, qsi, *nB, *bands_bw ); } - for ( i = 0; i < *nB; i++ ) + FOR( i = 0; i < *nB; i++ ) { - ndec = hMdDec->spar_md_cfg.num_decorr_per_band[( *bands_bw ) * i]; - ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[( *bands_bw ) * i]; + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[i_mult( ( *bands_bw ), i )]; + move16(); + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[i_mult( ( *bands_bw ), i )]; + move16(); - // ivas_deindex_real_index( hMdDec->spar_md.band_coeffs_idx[i].pred_index_re, qs.PR.q_levels[0], qs.PR.min, qs.PR.max, hMdDec->spar_md.band_coeffs[i].pred_re, ndm + ndec - 1 ); - ivas_deindex_real_index_fx( hMdDec->spar_md.band_coeffs_idx[i].pred_index_re, qs.PR.q_levels[0], qs.PR.min_fx, qs.PR.max_fx, hMdDec->spar_md.band_coeffs[i].pred_re_fx, ndm + ndec - 1 ); + ivas_deindex_real_index_fx( hMdDec->spar_md.band_coeffs_idx[i].pred_index_re, qs.PR.q_levels[0], qs.PR.min_fx, qs.PR.max_fx, hMdDec->spar_md.band_coeffs[i].pred_re_fx, sub( add( ndm, ndec ), 1 ) ); j = 0; - for ( ii = 0; ii < ndec; ii++ ) + move16(); + FOR( ii = 0; ii < ndec; ii++ ) { - for ( jj = 0; jj < ndm - 1; jj++ ) + FOR( jj = 0; jj < sub( ndm, 1 ); jj++ ) { - // quant[j] = hMdDec->spar_md.band_coeffs[i].C_re[ii][jj]; quant_fx[j] = hMdDec->spar_md.band_coeffs[i].C_re_fx[ii][jj]; - j++; + move32(); + j = add( j, 1 ); } } - // ivas_deindex_real_index( hMdDec->spar_md.band_coeffs_idx[i].drct_index_re, qs.C.q_levels[0], qs.C.min, qs.C.max, quant, ndec * ( ndm - 1 ) ); - ivas_deindex_real_index_fx( hMdDec->spar_md.band_coeffs_idx[i].drct_index_re, qs.C.q_levels[0], qs.C.min_fx, qs.C.max_fx, quant_fx, ndec * ( ndm - 1 ) ); + ivas_deindex_real_index_fx( hMdDec->spar_md.band_coeffs_idx[i].drct_index_re, qs.C.q_levels[0], qs.C.min_fx, qs.C.max_fx, quant_fx, i_mult( ndec, sub( ndm, 1 ) ) ); j = 0; - for ( ii = 0; ii < ndec; ii++ ) + move16(); + FOR( ii = 0; ii < ndec; ii++ ) { - for ( jj = 0; jj < ndm - 1; jj++ ) + FOR( jj = 0; jj < sub( ndm, 1 ); jj++ ) { - // hMdDec->spar_md.band_coeffs[i].C_re[ii][jj] = quant[j]; hMdDec->spar_md.band_coeffs[i].C_re_fx[ii][jj] = quant_fx[j]; - j++; + move32(); + j = add( j, 1 ); } } - // ivas_deindex_real_index( hMdDec->spar_md.band_coeffs_idx[i].decd_index_re, qs.P_r.q_levels[0], qs.P_r.min, qs.P_r.max, hMdDec->spar_md.band_coeffs[i].P_re, ndm + ndec - 1 ); - ivas_deindex_real_index_fx( hMdDec->spar_md.band_coeffs_idx[i].decd_index_re, qs.P_r.q_levels[0], qs.P_r.min_fx, qs.P_r.max_fx, hMdDec->spar_md.band_coeffs[i].P_re_fx, ndm + ndec - 1 ); + ivas_deindex_real_index_fx( hMdDec->spar_md.band_coeffs_idx[i].decd_index_re, qs.P_r.q_levels[0], qs.P_r.min_fx, qs.P_r.max_fx, hMdDec->spar_md.band_coeffs[i].P_re_fx, sub( add( ndm, ndec ), 1 ) ); /* Store prior coefficient indices */ - for ( j = 0; j < ndm + ndec - 1; j++ ) + FOR( j = 0; j < sub( add( ndm, ndec ), 1 ); j++ ) { hMdDec->spar_md_prev.band_coeffs_idx[i].pred_index_re[j] = hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j]; + move16(); } - for ( j = 0; j < ndec * ( ndm - 1 ); j++ ) + FOR( j = 0; j < i_mult( ndec, sub( ndm, 1 ) ); j++ ) { hMdDec->spar_md_prev.band_coeffs_idx[i].drct_index_re[j] = hMdDec->spar_md.band_coeffs_idx[i].drct_index_re[j]; + move16(); } - for ( j = 0; j < ndec; j++ ) + FOR( j = 0; j < ndec; j++ ) { hMdDec->spar_md_prev.band_coeffs_idx[i].decd_index_re[j] = hMdDec->spar_md.band_coeffs_idx[i].decd_index_re[j]; + move16(); + } + test(); + IF( ( do_diff[i] == 0 ) && ( do_repeat[i] == 0 ) ) + { + hMdDec->valid_bands[i] = s_or( hMdDec->valid_bands[i], 1 ); + move16(); + } + ELSE + { + hMdDec->valid_bands[i] = s_or( hMdDec->valid_bands[i], 0 ); + move16(); } - hMdDec->valid_bands[i] |= ( do_diff[i] == 0 && do_repeat[i] == 0 ) ? 1 : 0; } ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; + move16(); ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; - if ( *bands_bw != 1 ) + move16(); + IF( NE_16( *bands_bw, 1 ) ) { ivas_spar_md_band_upmix( hMdDec->spar_md.band_coeffs, @@ -3702,37 +3772,47 @@ static void ivas_spar_get_plc_interp_weights( #endif static void ivas_spar_get_plc_interp_weights_fx( - int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], - int16_t last_valid_band_idx, - int16_t idx, - int16_t b, + Word16 valid_band_idx[IVAS_MAX_NUM_BANDS], + Word16 last_valid_band_idx, + Word16 idx, + Word16 b, Word16 *w, - int16_t *id0, - int16_t *id1 ) + Word16 *id0, + Word16 *id1 ) { - if ( last_valid_band_idx < 0 ) /* Extrapolation */ + IF( last_valid_band_idx < 0 ) /* Extrapolation */ { *id1 = valid_band_idx[0]; + move16(); *id0 = 0; + move16(); *w = MAX_WORD16; + move16(); } - else if ( last_valid_band_idx == idx ) /* Extrapolation */ + ELSE IF( EQ_16( last_valid_band_idx, idx ) ) /* Extrapolation */ { *id1 = valid_band_idx[last_valid_band_idx]; + move16(); *id0 = valid_band_idx[last_valid_band_idx]; + move16(); *w = 0; + move16(); } - else /* Interpolation */ + ELSE /* Interpolation */ { *id0 = valid_band_idx[last_valid_band_idx]; + move16(); *id1 = valid_band_idx[last_valid_band_idx + 1]; - if ( ( b - *id0 ) == 0 ) + move16(); + IF( sub( b, *id0 ) == 0 ) { *w = 0; + move16(); } - else + ELSE { - *w = divide3232( ( b - *id0 ), ( *id1 - *id0 ) ); + *w = divide3232( sub( b, *id0 ), sub( *id1, *id0 ) ); + move16(); } } return; @@ -3756,13 +3836,15 @@ static void ivas_spar_md_fill_invalid_bands_fx( { Word16 i, j, b, all_valid; Word16 valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1; + move16(); Word16 last_valid_band_idx[IVAS_MAX_NUM_BANDS]; Word16 w_fx = 0; + move16(); ivas_spar_plc_get_band_age( valid_bands, base_band_age, num_bands, last_valid_band_idx, valid_band_idx, &all_valid, &idx ); assert( idx > 0 ); /* some bands should be valid */ - IF( EQ_16( all_valid, 0 ) ) + IF( all_valid == 0 ) { FOR( b = 0; b < num_bands; b++ ) { @@ -3786,7 +3868,7 @@ static void ivas_spar_md_fill_invalid_bands_fx( } ELSE /* young invalid bands */ { - IF( EQ_16( valid_bands[b], 0 ) ) + IF( valid_bands[b] == 0 ) { FOR( i = 0; i < num_channels; i++ ) { @@ -3801,7 +3883,7 @@ static void ivas_spar_md_fill_invalid_bands_fx( } } - IF( EQ_16( valid_bands[b], 0 ) ) + IF( valid_bands[b] == 0 ) { Word16 i_ts; FOR( i = 0; i < num_channels; i++ ) @@ -3810,9 +3892,9 @@ static void ivas_spar_md_fill_invalid_bands_fx( { FOR( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) { - pSpar_coeffs->C_re_fx[i][j][add( b, i_ts * IVAS_MAX_NUM_BANDS )] = pSpar_coeffs->C_re_fx[i][j][b]; + pSpar_coeffs->C_re_fx[i][j][add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )] = pSpar_coeffs->C_re_fx[i][j][b]; move32(); - pSpar_coeffs->P_re_fx[i][j][add( b, i_ts * IVAS_MAX_NUM_BANDS )] = pSpar_coeffs->P_re_fx[i][j][b]; + pSpar_coeffs->P_re_fx[i][j][add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )] = pSpar_coeffs->P_re_fx[i][j][b]; move32(); } } @@ -3907,87 +3989,89 @@ static void ivas_spar_md_fill_invalid_bands( static void ivas_spar_md_fill_invalid_bandcoeffs( ivas_band_coeffs_t *pBand_coeffs, ivas_band_coeffs_t *pBand_coeffs_prev, - const int16_t *valid_bands, - int16_t *base_band_age, - int16_t *first_valid_frame, - const int16_t num_bands ) + const Word16 *valid_bands, + Word16 *base_band_age, + Word16 *first_valid_frame, + const Word16 num_bands ) { - int16_t j, k, b, all_valid; - int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1; - int16_t last_valid_band_idx[IVAS_MAX_NUM_BANDS]; - // float w = 0; + Word16 j, k, b, all_valid; + Word16 valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1; + move16(); + Word16 last_valid_band_idx[IVAS_MAX_NUM_BANDS]; Word16 w_fx = 0; + move16(); ivas_spar_plc_get_band_age( valid_bands, base_band_age, num_bands, last_valid_band_idx, valid_band_idx, &all_valid, &idx ); assert( idx > 0 ); /* some bands should be valid */ - if ( all_valid == 0 ) + IF( all_valid == 0 ) { - for ( b = 0; b < num_bands; b++ ) + FOR( b = 0; b < num_bands; b++ ) { /* check against non zero in if and else if */ - if ( ( base_band_age[b] > 3 ) || ( *first_valid_frame == 0 ) ) /* old invalid bands */ + test(); + IF( GT_16( base_band_age[b], 3 ) || ( *first_valid_frame == 0 ) ) /* old invalid bands */ { - int16_t id0, id1; - // ivas_spar_get_plc_interp_weights( valid_band_idx, last_valid_band_idx[b], - // idx, b, &w, &id0, &id1 ); + Word16 id0, id1; + ivas_spar_get_plc_interp_weights_fx( valid_band_idx, last_valid_band_idx[b], idx, b, &w_fx, &id0, &id1 ); - for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) { - // pBand_coeffs[b].pred_re[j] = ( 1 - w ) * pBand_coeffs[id0].pred_re[j] + w * pBand_coeffs[id1].pred_re[j]; pBand_coeffs[b].pred_re_fx[j] = L_add( Mpy_32_16_1( pBand_coeffs[id0].pred_re_fx[j], sub( MAX_WORD16, w_fx ) ), Mpy_32_16_1( pBand_coeffs[id1].pred_re_fx[j], w_fx ) ); + move32(); } - for ( j = 0; j < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; j++ ) + FOR( j = 0; j < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; j++ ) { - for ( k = 0; k < IVAS_SPAR_MAX_DMX_CHS - 1; k++ ) + FOR( k = 0; k < IVAS_SPAR_MAX_DMX_CHS - 1; k++ ) { - // pBand_coeffs[b].C_re[j][k] = ( 1 - w ) * pBand_coeffs[id0].C_re[j][k] + w * pBand_coeffs[id1].C_re[j][k]; pBand_coeffs[b].C_re_fx[j][k] = L_add( Mpy_32_16_1( pBand_coeffs[id0].C_re_fx[j][k], sub( MAX_WORD16, w_fx ) ), Mpy_32_16_1( pBand_coeffs[id1].C_re_fx[j][k], w_fx ) ); + move32(); } } - for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) { - // pBand_coeffs[b].P_re[j] = ( 1 - w ) * pBand_coeffs[id0].P_re[j] + w * pBand_coeffs[id1].P_re[j]; pBand_coeffs[b].P_re_fx[j] = L_add( Mpy_32_16_1( pBand_coeffs[id0].P_re_fx[j], sub( MAX_WORD16, w_fx ) ), Mpy_32_16_1( pBand_coeffs[id1].P_re_fx[j], w_fx ) ); + move32(); } } - else /* young invalid bands */ + ELSE /* young invalid bands */ { - if ( valid_bands[b] == 0 ) + IF( valid_bands[b] == 0 ) { - for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) { - // pBand_coeffs[b].pred_re[j] = pBand_coeffs_prev[b].pred_re[j]; pBand_coeffs[b].pred_re_fx[j] = pBand_coeffs_prev[b].pred_re_fx[j]; + move32(); } - for ( j = 0; j < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; j++ ) + FOR( j = 0; j < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; j++ ) { - for ( k = 0; k < IVAS_SPAR_MAX_DMX_CHS - 1; k++ ) + FOR( k = 0; k < IVAS_SPAR_MAX_DMX_CHS - 1; k++ ) { - // pBand_coeffs[b].C_re[j][k] = pBand_coeffs_prev[b].C_re[j][k]; pBand_coeffs[b].C_re_fx[j][k] = pBand_coeffs_prev[b].C_re_fx[j][k]; + move32(); } } - for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) { - // pBand_coeffs[b].P_re[j] = pBand_coeffs_prev[b].P_re[j]; pBand_coeffs[b].P_re_fx[j] = pBand_coeffs_prev[b].P_re_fx[j]; + move32(); } } } } } - else + ELSE { *first_valid_frame = 1; + move16(); } return; @@ -4120,8 +4204,9 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix_fx( Word16 norm_nff; /*norm of num_fade_frames*/ num_fade_frames = s_max( sub( hMdDec->spar_plc_num_lost_frames, ivas_spar_dec_plc_num_frames_keep ), 0 ); norm_nff = norm_s( num_fade_frames ); - gain_dB = -imult1616( s_min( num_fade_frames, ivas_spar_dec_plc_max_num_frames_ramp_down ), ivas_spar_dec_plc_per_frame_ramp_down_gain_dB ); /*abs(gain_dB)<99*/ /*Q(gain_dB)=7Q24*/ - Word16 exp_gain; /*stores exponent for gain_fx*/ + gain_dB = negate( imult1616( s_min( num_fade_frames, ivas_spar_dec_plc_max_num_frames_ramp_down ), ivas_spar_dec_plc_per_frame_ramp_down_gain_dB ) ); /*abs(gain_dB)<99*/ /*Q(gain_dB)=7Q24*/ + Word16 exp_gain = 0; + move16(); /*stores exponent for gain_fx*/ gain_fx = BASOP_util_Pow2( Mult_32_16( imult3216( 13421773 /*=2^28/20*/, gain_dB ), 27213 /*=log2(10)*2^13*/ ), 5, &exp_gain ); Q_gain = sub( 31, exp_gain ); FOR( i = 0; i < IVAS_SPAR_MAX_CH; i++ ) @@ -4141,7 +4226,7 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix_fx( { FOR( b = 0; b < num_bands_out; b++ ) { - hMdDec->mixer_mat_fx[i][j][add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )] = Mult_32_32( hMdDec->mixer_mat_fx[i][j][add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )], post_matrix_fx[i] ); + hMdDec->mixer_mat_fx[i][j][add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )] = Mult_32_32( hMdDec->mixer_mat_fx[i][j][add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )], post_matrix_fx[i] ); move32(); } } @@ -4227,56 +4312,47 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix( #ifdef IVAS_FLOAT_FIXED static void ivas_spar_unquant_dtx_indicies( ivas_spar_md_t *pSpar_md, - const int16_t nB, - const int16_t bw, - int16_t *ndm_per_band ) + const Word16 nB, + const Word16 bw, + Word16 *ndm_per_band ) { - int16_t i, b; - int16_t q_lvl; + Word16 i, b; + Word16 q_lvl; // float val; Word32 val_fx; - int16_t idx; + Word16 idx; // float pr_min_max[2]; Word32 pr_min_max_fx[2]; - // pr_min_max[0] = pSpar_md->min_max[0]; - // pr_min_max[1] = pSpar_md->min_max[1]; - pr_min_max_fx[0] = pSpar_md->min_max_fx[0]; + move32(); pr_min_max_fx[1] = pSpar_md->min_max_fx[1]; + move32(); - for ( b = 0; b < nB; b++ ) + FOR( b = 0; b < nB; b++ ) { - for ( i = 0; i < FOA_CHANNELS - 1; i++ ) + FOR( i = 0; i < FOA_CHANNELS - 1; i++ ) { - q_lvl = dtx_pr_real_q_levels[ndm_per_band[bw * b] - 1][i]; - // idx = pSpar_md->band_coeffs_idx[b].pred_index_re[i]; - // ivas_deindex_real_index( &idx, q_lvl, pr_min_max[0], pr_min_max[1], &val, 1 ); - // pSpar_md->band_coeffs[b].pred_re[i] = val; - // pSpar_md->band_coeffs[b].pred_re_fx[i] = val * (1 << 22); + q_lvl = dtx_pr_real_q_levels[sub( ndm_per_band[i_mult( bw, b )], 1 )][i]; + move16(); idx = pSpar_md->band_coeffs_idx[b].pred_index_re[i]; + move16(); ivas_deindex_real_index_fx( &idx, q_lvl, pr_min_max_fx[0], pr_min_max_fx[1], &val_fx, 1 ); pSpar_md->band_coeffs[b].pred_re_fx[i] = val_fx; -#if 0 // ndef IVAS_FLOAT_FIXED_TO_BE_REMOVED - pSpar_md->band_coeffs[b].pred_re[i] = (float)val_fx / (1 << 22); -#endif + move32(); } - for ( i = 0; i < FOA_CHANNELS - ndm_per_band[bw * b]; i++ ) + FOR( i = 0; i < sub( FOA_CHANNELS, ndm_per_band[i_mult( bw, b )] ); i++ ) { - q_lvl = dtx_pd_real_q_levels[ndm_per_band[bw * b] - 1][i]; - // idx = pSpar_md->band_coeffs_idx[b].decd_index_re[i]; - // ivas_deindex_real_index( &idx, q_lvl, dtx_pd_real_min_max[0], dtx_pd_real_min_max[1], &val, 1 ); - // pSpar_md->band_coeffs[b].P_re[i] = val; - // pSpar_md->band_coeffs[b].P_re_fx[i] = val*(1<<22); + q_lvl = dtx_pd_real_q_levels[sub( ndm_per_band[i_mult( bw, b )], 1 )][i]; + move16(); idx = pSpar_md->band_coeffs_idx[b].decd_index_re[i]; + move16(); ivas_deindex_real_index_fx( &idx, q_lvl, dtx_pd_real_min_max_fx[0], dtx_pd_real_min_max_fx[1], &val_fx, 1 ); pSpar_md->band_coeffs[b].P_re_fx[i] = val_fx; -#if 0 // ndef IVAS_FLOAT_FIXED_TO_BE_REMOVED - pSpar_md->band_coeffs[b].P_re[i] = (float)val_fx / (1 << 22); -#endif + move32(); } } @@ -4330,91 +4406,102 @@ static void ivas_spar_unquant_dtx_indicies( static void ivas_parse_parameter_bitstream_dtx( ivas_spar_md_t *pSpar_md, Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ - const int16_t bw, - const int16_t num_bands, - int16_t *num_dmx_per_band, - int16_t *num_dec_per_band ) + const Word16 bw, + const Word16 num_bands, + Word16 *num_dmx_per_band, + Word16 *num_dec_per_band ) { - int16_t i, j, ndec, ndm; - // float val; + Word16 i, j, ndec, ndm; Word32 val_fx; - int16_t idx; - // float pr_min_max[2]; + Word16 idx; Word32 pr_min_max_fx[2]; - int16_t pr_q_lvls, pr, pd, pd_q_lvls, pr_pd_bits; - int16_t zero_pad_bits, sid_bits_len; + Word16 pr_q_lvls, pr, pd, pd_q_lvls, pr_pd_bits; + Word16 zero_pad_bits, sid_bits_len; sid_bits_len = st0->next_bit_pos; - // pr_min_max[0] = pSpar_md->min_max[0]; + move16(); pr_min_max_fx[0] = pSpar_md->min_max_fx[0]; - // pr_min_max[1] = pSpar_md->min_max[1]; + move32(); pr_min_max_fx[1] = pSpar_md->min_max_fx[1]; + move32(); - for ( i = 0; i < num_bands; i++ ) + FOR( i = 0; i < num_bands; i++ ) { - ndec = num_dec_per_band[bw * i]; - ndm = num_dmx_per_band[bw * i]; + ndec = num_dec_per_band[i_mult( bw, i )]; + move16(); + ndm = num_dmx_per_band[i_mult( bw, i )]; + move16(); - for ( j = 0; j < FOA_CHANNELS - 1; j++ ) + FOR( j = 0; j < FOA_CHANNELS - 1; j++ ) { - int16_t pr_idx_1, pr_idx_2, pd_idx_1, pd_idx_2; - uint16_t value; + Word16 pr_idx_1, pr_idx_2, pd_idx_1, pd_idx_2; + UWord16 value; pr_idx_1 = pr_pr_idx_pairs[ndm - 1][j][0]; + move16(); pr_idx_2 = pr_pr_idx_pairs[ndm - 1][j][1]; + move16(); pd_idx_1 = pr_pd_idx_pairs[ndm - 1][j][0]; + move16(); pd_idx_2 = pr_pd_idx_pairs[ndm - 1][j][1]; + move16(); - if ( pr_idx_1 != 0 || pd_idx_1 != 0 || pr_idx_2 != 0 || pd_idx_2 != 0 ) + test(); + test(); + test(); + IF( pr_idx_1 != 0 || pd_idx_1 != 0 || pr_idx_2 != 0 || pd_idx_2 != 0 ) { pr_q_lvls = dtx_pr_real_q_levels[ndm - 1][pd_idx_1 - 1]; + move16(); - if ( ( j + 1 ) > ndec ) + IF( GT_16( add( j, 1 ), ndec ) ) { pd_q_lvls = 1; + move16(); } - else + ELSE { pd_q_lvls = dtx_pd_real_q_levels[ndm - 1][pd_idx_2 - 1]; + move16(); } - pr_pd_bits = ivas_get_bits_to_encode( pd_q_lvls * pr_q_lvls ); + pr_pd_bits = ivas_get_bits_to_encode( L_mult0( pd_q_lvls, pr_q_lvls ) ); value = get_next_indice( st0, pr_pd_bits ); - pr = (int16_t) floor( value / pd_q_lvls ); - pd = value - pr * pd_q_lvls; - // val = dtx_pd_real_min_max[0]; + pr = idiv1616( value, pd_q_lvls ); + pd = extract_l( L_sub( value, i_mult( pr, pd_q_lvls ) ) ); val_fx = dtx_pd_real_min_max_fx[0]; - // ivas_quantise_real_values( &val, pd_q_lvls, dtx_pd_real_min_max[0], dtx_pd_real_min_max[1], &idx, &val, 1 ); + move32(); ivas_quantise_real_values_fx( &val_fx, pd_q_lvls, dtx_pd_real_min_max_fx[0], dtx_pd_real_min_max_fx[1], &idx, &val_fx, 1 ); - pd = pd + idx; + pd = add( pd, idx ); - // val = pr_min_max[0]; val_fx = pr_min_max_fx[0]; - // ivas_quantise_real_values( &val, pr_q_lvls, pr_min_max[0], pr_min_max[1], &idx, &val, 1 ); + move32(); ivas_quantise_real_values_fx( &val_fx, pr_q_lvls, pr_min_max_fx[0], pr_min_max_fx[1], &idx, &val_fx, 1 ); - pr = pr + idx; + pr = add( pr, idx ); - if ( ( j + 1 ) <= ndec ) + if ( LE_16( add( j, 1 ), ndec ) ) { pSpar_md->band_coeffs_idx[i].decd_index_re[pd_idx_2 - 1] = pd; + move16(); } pSpar_md->band_coeffs_idx[i].pred_index_re[pd_idx_1 - 1] = pr; + move16(); } } } - sid_bits_len = st0->next_bit_pos - sid_bits_len; - zero_pad_bits = ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - sid_bits_len; + sid_bits_len = sub( st0->next_bit_pos, sid_bits_len ); + zero_pad_bits = sub( ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ), sid_bits_len ); assert( zero_pad_bits >= 0 ); - if ( num_dmx_per_band[0] == 2 ) + if ( EQ_16( num_dmx_per_band[0], 2 ) ) { - zero_pad_bits -= 1; + zero_pad_bits = sub( zero_pad_bits, 1 ); } - for ( j = 0; j < zero_pad_bits; j++ ) + FOR( j = 0; j < zero_pad_bits; j++ ) { get_next_indice( st0, 1 ); } @@ -4558,34 +4645,36 @@ static ivas_error ivas_deindex_real_index( #else static ivas_error ivas_deindex_real_index_fx( - const int16_t *index, - const int16_t q_levels, + const Word16 *index, + const Word16 q_levels, const Word32 min_value, const Word32 max_value, Word32 *quant, - const int16_t dim ) + const Word16 dim ) { - int16_t i; + Word16 i; Word32 q_step_fx; - if ( q_levels == 0 ) + IF( q_levels == 0 ) { return IVAS_ERR_INTERNAL; } - if ( q_levels == 1 ) + IF( EQ_16( q_levels, 1 ) ) { - for ( i = 0; i < dim; i++ ) + FOR( i = 0; i < dim; i++ ) { quant[i] = 0; + move32(); } } - else + ELSE { q_step_fx = L_sub( max_value, min_value ); - q_step_fx = Mpy_32_32( q_step_fx, one_by_q_level[( q_levels - 1 )] ); - for ( i = 0; i < dim; i++ ) + q_step_fx = Mpy_32_32( q_step_fx, one_by_q_level[q_levels - 1] ); + FOR( i = 0; i < dim; i++ ) { quant[i] = Mpy_32_32( L_shl( index[i], 31 - 6 ), q_step_fx ); //(25+28)-31 = 22 + move32(); } } @@ -4873,122 +4962,157 @@ void ivas_spar_to_dirac( void ivas_spar_to_dirac_fx( Decoder_Struct *st_ivas, ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const int16_t dtx_vad, /* i : DTX frame flag */ - const int16_t num_bands_out, /* i : number of output bands */ - const int16_t bw, /* i : band joining factor */ - const int16_t dyn_active_w_flag ) + const Word16 dtx_vad, /* i : DTX frame flag */ + const Word16 num_bands_out, /* i : number of output bands */ + const Word16 bw, /* i : band joining factor */ + const Word16 dyn_active_w_flag ) { DIRAC_DEC_HANDLE hDirAC; - int16_t start_band, end_band, band, qmf_band_start, qmf_band_end; - int16_t block, b; - int16_t *band_grouping; - // float diffuseness[IVAS_MAX_NUM_BANDS]; + Word16 start_band, end_band, band, qmf_band_start, qmf_band_end; + Word16 block, b; + Word16 *band_grouping; + Word32 diffuseness_fx[IVAS_MAX_NUM_BANDS]; - int16_t sba_order_internal; - // float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + Word16 sba_order_internal; + Word32 azi_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; - // float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 ele_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; - int16_t azi[IVAS_MAX_NUM_BANDS]; - int16_t ele[IVAS_MAX_NUM_BANDS]; - // float dvx[IVAS_MAX_NUM_BANDS], dvy[IVAS_MAX_NUM_BANDS], dvz[IVAS_MAX_NUM_BANDS]; + Word16 azi[IVAS_MAX_NUM_BANDS]; + Word16 ele[IVAS_MAX_NUM_BANDS]; + Word32 dvx_fx[IVAS_MAX_NUM_BANDS], dvy_fx[IVAS_MAX_NUM_BANDS], dvz_fx[IVAS_MAX_NUM_BANDS]; - // float radius; + Word32 radius_fx; - // float en_ratio, res_pow; + Word32 en_ratio_fx, res_pow_fx; Word16 en_ratio_q; - int16_t num_slots_in_subfr; - int16_t tmp_write_idx_param_band; - int16_t tmp_write_idx_band; - // float pred_re_20ms[IVAS_MAX_NUM_BANDS][IVAS_SPAR_MAX_CH - 1]; + Word16 num_slots_in_subfr; + Word16 tmp_write_idx_param_band; + Word16 tmp_write_idx_band; + Word32 pred_re_20ms_fx[IVAS_MAX_NUM_BANDS][IVAS_SPAR_MAX_CH - 1]; - int16_t pred_idx; - int16_t *dirac_to_spar_md_bands; - int16_t enc_param_start_band; - int16_t active_w_vlbr; - int16_t i, num_subframes; - int16_t active_w; + Word16 pred_idx; + Word16 *dirac_to_spar_md_bands; + Word16 enc_param_start_band; + Word16 active_w_vlbr; + Word16 i, num_subframes; + Word16 active_w; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; - active_w = ( dyn_active_w_flag == 1 ) || ( hMdDec->spar_md_cfg.active_w == 1 ); + test(); + active_w = EQ_16( dyn_active_w_flag, 1 ) || EQ_16( hMdDec->spar_md_cfg.active_w, 1 ); sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); + move16(); start_band = 0; - end_band = min( num_bands_out, SPAR_DIRAC_SPLIT_START_BAND ) / bw; + move16(); + end_band = idiv1616( min( num_bands_out, SPAR_DIRAC_SPLIT_START_BAND ), bw ); hDirAC = st_ivas->hDirAC; hSpatParamRendCom = st_ivas->hSpatParamRendCom; dirac_to_spar_md_bands = st_ivas->hSpar->dirac_to_spar_md_bands; - enc_param_start_band = st_ivas->hSpar->enc_param_start_band / bw; - active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; - if ( hDirAC != NULL && ivas_get_hodirac_flag_fx( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) == 0 ) + IF( st_ivas->hSpar->enc_param_start_band > 0 ) + { + enc_param_start_band = idiv1616( st_ivas->hSpar->enc_param_start_band, bw ); + } + ELSE + { + enc_param_start_band = 0; + move16(); + } + + IF( LT_32( st_ivas->hDecoderConfig->ivas_total_brate, IVAS_24k4 ) ) + { + active_w_vlbr = 1; + move16(); + } + ELSE + { + active_w_vlbr = 0; + move16(); + } + + test(); + IF( hDirAC != NULL && ivas_get_hodirac_flag_fx( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) == 0 ) { band_grouping = hDirAC->band_grouping; - num_slots_in_subfr = st_ivas->hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; - for ( band = start_band; band < end_band; band++ ) + IF( st_ivas->hDirAC->hConfig->dec_param_estim ) + { + num_slots_in_subfr = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; + move16(); + } + ELSE + { + num_slots_in_subfr = 1; + move16(); + } + + FOR( band = start_band; band < end_band; band++ ) { - // float PR[3], Pd[3], dvnorm, g_pred; Word32 PR_fx[3], Pd_fx[3], dvnorm_fx, g_pred_fx; Word16 q_g_pred; Word16 q_dvnorm; - // PR[0] = hMdDec->spar_md.band_coeffs[band].pred_re[2]; PR_fx[0] = hMdDec->spar_md.band_coeffs[band].pred_re_fx[2]; - // PR[1] = hMdDec->spar_md.band_coeffs[band].pred_re[0]; + move32(); PR_fx[1] = hMdDec->spar_md.band_coeffs[band].pred_re_fx[0]; - // PR[2] = hMdDec->spar_md.band_coeffs[band].pred_re[1]; + move32(); PR_fx[2] = hMdDec->spar_md.band_coeffs[band].pred_re_fx[1]; - // g_pred = PR[0] * PR[0] + PR[1] * PR[1] + PR[2] * PR[2]; - g_pred_fx = Mpy_32_32( PR_fx[0], PR_fx[0] ) + Mpy_32_32( PR_fx[1], PR_fx[1] ) + Mpy_32_32( PR_fx[2], PR_fx[2] ); + move32(); + g_pred_fx = L_add( L_add( Mpy_32_32( PR_fx[0], PR_fx[0] ), Mpy_32_32( PR_fx[1], PR_fx[1] ) ), Mpy_32_32( PR_fx[2], PR_fx[2] ) ); q_g_pred = Q22 + Q22 - Q31; - q_dvnorm = Q31 - q_g_pred; + move16(); + q_dvnorm = sub( Q31, q_g_pred ); q_g_pred = q_dvnorm; + move16(); IF( LE_32( g_pred_fx, EPSILON_FIX ) ) { dvx_fx[band] = ONE_IN_Q22; + move32(); dvy_fx[band] = 0; + move32(); dvz_fx[band] = 0; + move32(); azi[band] = 0; + move16(); ele[band] = 0; + move16(); q_g_pred = Q22; + move16(); q_dvnorm = Q22; + move16(); } - else + ELSE { - // g_pred = Sqrt32( g_pred, ); - // dvnorm = 1.0f / g_pred; dvnorm_fx = ISqrt32( g_pred_fx, &q_dvnorm ); g_pred_fx = Sqrt32( g_pred_fx, &q_g_pred ); - if ( q_g_pred < 0 ) + IF( q_g_pred < 0 ) { - g_pred_fx = L_shr( g_pred_fx, ( -1 * q_g_pred ) ); + g_pred_fx = L_shr( g_pred_fx, negate( q_g_pred ) ); q_g_pred = 0; + move16(); } - /*dvx[band] = PR[0] * dvnorm; -dvy[band] = PR[1] * dvnorm; - dvz[band] = PR[2] * dvnorm;*/ - dvx_fx[band] = Mpy_32_32( PR_fx[0], dvnorm_fx ); + move32(); dvy_fx[band] = Mpy_32_32( PR_fx[1], dvnorm_fx ); + move32(); dvz_fx[band] = Mpy_32_32( PR_fx[2], dvnorm_fx ); - Word16 q_1 = ( 22 ) + ( 31 - q_dvnorm ) - 31; + move32(); + Word16 q_1 = sub( add( 22, sub( 31, q_dvnorm ) ), 31 ); - Word32 temp = Mpy_32_32( dvx_fx[band], dvx_fx[band] ) + Mpy_32_32( dvy_fx[band], dvy_fx[band] ); - Word16 q2 = q_1 + q_1 - 31; - Word16 q_temp = 31 - q2; + Word32 temp = L_add( Mpy_32_32( dvx_fx[band], dvx_fx[band] ), Mpy_32_32( dvy_fx[band], dvy_fx[band] ) ); + Word16 q2 = sub( add( q_1, q_1 ), 31 ); + Word16 q_temp = sub( 31, q2 ); radius_fx = Sqrt32( temp, &q_temp ); - // radius = sqrtf(dvx[band] * dvx[band] + dvy[band] * dvy[band]); - - // float check_qzi = atan2f(dvy[band], dvx[band]); Word16 check_azi_fx = BASOP_util_atan2( dvy_fx[band], dvx_fx[band], 0 ); Word32 check_azi_fx_32 = L_shl( check_azi_fx, 16 ); Word16 check_azi_fx_res; - IF( LT_32( check_azi_fx_32, 0 ) ) + IF( check_azi_fx_32 < 0 ) { check_azi_fx_res = negate( divide3232( L_negate( check_azi_fx_32 ), 1686629760 ) ); } @@ -4997,314 +5121,376 @@ dvy[band] = PR[1] * dvnorm; check_azi_fx_res = divide3232( check_azi_fx_32, 1686629760 ); } Word32 azi_intermediate = Mpy_32_16_1( DEGREE_180_Q_22, check_azi_fx_res ); - azi_intermediate = azi_intermediate + ONE_IN_Q21; - // Word16 azi_res = L_shr_r(azi_intermediate, 22); - Word16 azi_res = extract_l( azi_intermediate / ( 1 << 22 ) ); + azi_intermediate = L_add( azi_intermediate, ONE_IN_Q21 ); + + Word16 azi_res; + IF( azi_intermediate < 0 ) + { + azi_res = negate( extract_l( L_shr( L_negate( azi_intermediate ), 22 ) ) ); + } + ELSE + { + azi_res = extract_l( L_shr( azi_intermediate, 22 ) ); + } - Word16 check_ele_fx = BASOP_util_atan2( dvz_fx[band], radius_fx, ( 9 + q_dvnorm ) - q_temp ); + Word16 check_ele_fx = BASOP_util_atan2( dvz_fx[band], radius_fx, sub( add( 9, q_dvnorm ), q_temp ) ); Word32 check_ele_fx_32 = L_shl( check_ele_fx, 16 ); Word16 check_ele_fx_res; - IF( LT_32( check_azi_fx_32, 0 ) ) + IF( check_azi_fx_32 < 0 ) { check_ele_fx_res = negate( divide3232( L_negate( check_ele_fx_32 ), 1686629760 ) ); } - else + ELSE { check_ele_fx_res = divide3232( check_ele_fx_32, 1686629760 ); } Word32 ele_intermediate = Mpy_32_16_1( DEGREE_180_Q_22, check_ele_fx_res ); - ele_intermediate = ele_intermediate + ONE_IN_Q21; - // Word16 ele_res = L_shr_r(ele_intermediate, 22); - Word16 ele_res = extract_l( ele_intermediate / ( 1 << 22 ) ); + ele_intermediate = L_add( ele_intermediate, ONE_IN_Q21 ); + Word16 ele_res; + IF( ele_intermediate < 0 ) + { + ele_res = negate( extract_l( L_shr( L_negate( ele_intermediate ), 22 ) ) ); + } + ELSE + { + ele_res = extract_l( L_shr( ele_intermediate, 22 ) ); + } - // azi[band] = (int16_t)(max(-180.0f, min(180.0f, atan2f(dvy[band], dvx[band]) / EVS_PI * 180.0f)) + 0.5f); azi[band] = max( -180, min( 180, azi_res ) ); - // ele[band] = (int16_t)(max(-90.0f, min(180.0f, atan2f(dvz[band], radius) / EVS_PI * 180.0f)) + 0.5f); + move16(); ele[band] = max( -90, min( 180, ele_res ) ); + move16(); } - if ( st_ivas->nchan_transport == 1 ) + IF( EQ_16( st_ivas->nchan_transport, 1 ) ) { // float w_en_norm, f_scale; Word32 w_en_norm_fx, f_scale_fx; Word16 q_w_en_norm_fx; - if ( active_w ) + IF( active_w ) { - if ( dtx_vad == 0 ) + IF( dtx_vad == 0 ) { - // f_scale = IVAS_ACTIVEW_DM_F_SCALE_DTX; f_scale_fx = IVAS_ACTIVEW_DM_F_SCALE_DTX_FX; + move32(); } - else + ELSE { - // f_scale = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR : IVAS_ACTIVEW_DM_F_SCALE; - f_scale_fx = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR_FX : IVAS_ACTIVEW_DM_F_SCALE_FX; + IF( active_w_vlbr ) + { + f_scale_fx = IVAS_ACTIVEW_DM_F_SCALE_VLBR_FX; + move32(); + } + ELSE + { + f_scale_fx = IVAS_ACTIVEW_DM_F_SCALE_FX; + move32(); + } } } - else + ELSE { - // f_scale = 0.0f; f_scale_fx = 0; + move32(); } - // w_en_norm = ( 1.0f - ( f_scale * g_pred * g_pred ) ); Word32 temp_result = Mpy_32_32( Mpy_32_32( f_scale_fx, g_pred_fx ), g_pred_fx ); temp_result = L_sub( L_shr( ONE_IN_Q31, q_g_pred ), temp_result ); - // w_en_norm *= w_en_norm; + w_en_norm_fx = Mpy_32_32( temp_result, temp_result ); - q_w_en_norm_fx = q_g_pred + q_g_pred; - // Pd[0] = hMdDec->spar_md.band_coeffs[band].P_re[1]; - // Pd[1] = hMdDec->spar_md.band_coeffs[band].P_re[0]; - // Pd[2] = hMdDec->spar_md.band_coeffs[band].P_re[2]; + q_w_en_norm_fx = add( q_g_pred, q_g_pred ); + Pd_fx[0] = hMdDec->spar_md.band_coeffs[band].P_re_fx[1]; + move32(); Pd_fx[1] = hMdDec->spar_md.band_coeffs[band].P_re_fx[0]; + move32(); Pd_fx[2] = hMdDec->spar_md.band_coeffs[band].P_re_fx[2]; - // en_ratio = PR[0] * PR[0] + PR[1] * PR[1] + PR[2] * PR[2]; - en_ratio_fx = Mpy_32_32( PR_fx[0], PR_fx[0] ) + Mpy_32_32( PR_fx[1], PR_fx[1] ) + Mpy_32_32( PR_fx[2], PR_fx[2] ); // 22+22-31 = 13 - Word32 Pd_temp_res = Mpy_32_32( Pd_fx[0], Pd_fx[0] ) + Mpy_32_32( Pd_fx[1], Pd_fx[1] ) + Mpy_32_32( Pd_fx[2], Pd_fx[2] ); // q = 22+22-31 = 13 - // res_pow = w_en_norm + en_ratio + ( Pd[0] * Pd[0] + Pd[1] * Pd[1] + Pd[2] * Pd[2] ); - res_pow_fx = L_shr( w_en_norm_fx, ( 31 - q_w_en_norm_fx ) - 13 ) + en_ratio_fx + Pd_temp_res; - // res_pow_q = 13; + move32(); + + en_ratio_fx = L_add( L_add( Mpy_32_32( PR_fx[0], PR_fx[0] ), Mpy_32_32( PR_fx[1], PR_fx[1] ) ), Mpy_32_32( PR_fx[2], PR_fx[2] ) ); // 22+22-31 = 13 + Word32 Pd_temp_res = L_add( L_add( Mpy_32_32( Pd_fx[0], Pd_fx[0] ), Mpy_32_32( Pd_fx[1], Pd_fx[1] ) ), Mpy_32_32( Pd_fx[2], Pd_fx[2] ) ); // q = 22+22-31 = 13 + + res_pow_fx = L_add( L_shr( w_en_norm_fx, sub( sub( 31, q_w_en_norm_fx ), 13 ) ), L_add( en_ratio_fx, Pd_temp_res ) ); + res_pow_fx = L_shr( res_pow_fx, 1 ); - // res_pow *= 0.5f; - // hMdDec->spar_md.en_ratio_slow[band] = 0.75f * hMdDec->spar_md.en_ratio_slow[band] + 0.25f * en_ratio; - hMdDec->spar_md.en_ratio_slow_fx[band] = Mpy_32_32( 1610612736, hMdDec->spar_md.en_ratio_slow_fx[band] ) + Mpy_32_32( 536870912, en_ratio_fx ); - // hMdDec->spar_md.ref_pow_slow[band] = 0.75f * hMdDec->spar_md.ref_pow_slow[band] + 0.25f * res_pow; - hMdDec->spar_md.ref_pow_slow_fx[band] = Mpy_32_32( 1610612736, hMdDec->spar_md.ref_pow_slow_fx[band] ) + Mpy_32_32( 536870912, res_pow_fx ); - // en_ratio = sqrtf( hMdDec->spar_md.en_ratio_slow[band] ) / ( hMdDec->spar_md.ref_pow_slow[band] + EPSILON ); + + hMdDec->spar_md.en_ratio_slow_fx[band] = L_add( Mpy_32_32( 1610612736, hMdDec->spar_md.en_ratio_slow_fx[band] ), Mpy_32_32( 536870912, en_ratio_fx ) ); + move32(); + + hMdDec->spar_md.ref_pow_slow_fx[band] = L_add( Mpy_32_32( 1610612736, hMdDec->spar_md.ref_pow_slow_fx[band] ), Mpy_32_32( 536870912, res_pow_fx ) ); + move32(); + en_ratio_q = 31 - 13; + move16(); en_ratio_fx = Sqrt32( hMdDec->spar_md.en_ratio_slow_fx[band], &en_ratio_q ); - if ( en_ratio_q < 0 ) + IF( en_ratio_q < 0 ) { - en_ratio_fx = L_shr( en_ratio_fx, -1 * ( en_ratio_q ) ); + en_ratio_fx = L_shr( en_ratio_fx, negate( en_ratio_q ) ); en_ratio_q = 0; + move16(); } - Word32 en_ratio_fx_scaled = L_shr( en_ratio_fx, ( 31 - en_ratio_q - 13 ) ); - if ( en_ratio_fx_scaled > hMdDec->spar_md.ref_pow_slow_fx[band] ) + Word32 en_ratio_fx_scaled = L_shr( en_ratio_fx, ( sub( sub( 31, en_ratio_q ), 13 ) ) ); + IF( GT_32( en_ratio_fx_scaled, hMdDec->spar_md.ref_pow_slow_fx[band] ) ) { diffuseness_fx[band] = 0; + move32(); } - else if ( en_ratio_fx_scaled == 0 ) + ELSE IF( en_ratio_fx_scaled == 0 ) { diffuseness_fx[band] = ONE_IN_Q30; + move32(); } - else if ( en_ratio_fx_scaled == hMdDec->spar_md.ref_pow_slow_fx[band] ) + ELSE IF( EQ_32( en_ratio_fx_scaled, hMdDec->spar_md.ref_pow_slow_fx[band] ) ) { diffuseness_fx[band] = ONE_IN_Q30; + move32(); } - else + ELSE { - en_ratio_fx = divide3232( en_ratio_fx_scaled, ( hMdDec->spar_md.ref_pow_slow_fx[band] + EPSILON_FX ) ); + en_ratio_fx = divide3232( en_ratio_fx_scaled, L_add( hMdDec->spar_md.ref_pow_slow_fx[band], EPSILON_FX ) ); en_ratio_fx = L_shl( en_ratio_fx, 15 ); - diffuseness_fx[band] = ONE_IN_Q30 - en_ratio_fx; + diffuseness_fx[band] = L_sub( ONE_IN_Q30, en_ratio_fx ); + move32(); } } - else + ELSE { - // en_ratio = PR[0] * PR[0] + PR[1] * PR[1] + PR[2] * PR[2]; - en_ratio_fx = Mpy_32_32( PR_fx[0], PR_fx[0] ) + Mpy_32_32( PR_fx[1], PR_fx[1] ) + Mpy_32_32( PR_fx[2], PR_fx[2] ); - // hMdDec->spar_md.en_ratio_slow[band] = 0.75f * hMdDec->spar_md.en_ratio_slow[band] + 0.25f * en_ratio; - hMdDec->spar_md.en_ratio_slow_fx[band] = Mpy_32_32( 1610612736, hMdDec->spar_md.en_ratio_slow_fx[band] ) + Mpy_32_32( 536870912, en_ratio_fx ); - // en_ratio = sqrtf( hMdDec->spar_md.en_ratio_slow[band] ); + en_ratio_fx = L_add( L_add( Mpy_32_32( PR_fx[0], PR_fx[0] ), Mpy_32_32( PR_fx[1], PR_fx[1] ) ), Mpy_32_32( PR_fx[2], PR_fx[2] ) ); + + hMdDec->spar_md.en_ratio_slow_fx[band] = L_add( Mpy_32_32( 1610612736, hMdDec->spar_md.en_ratio_slow_fx[band] ), Mpy_32_32( 536870912, en_ratio_fx ) ); + move32(); + en_ratio_q = 31 - 13; + move16(); en_ratio_fx = Sqrt32( hMdDec->spar_md.en_ratio_slow_fx[band], &en_ratio_q ); - if ( en_ratio_q < 0 ) + IF( en_ratio_q < 0 ) { - en_ratio_fx = L_shr( en_ratio_fx, -1 * ( en_ratio_q ) ); + en_ratio_fx = L_shr( en_ratio_fx, ( -en_ratio_q ) ); en_ratio_q = 0; + move16(); } Word32 en_ratio_fx_scaled = L_shr( en_ratio_fx, 1 ); - if ( en_ratio_fx_scaled > ONE_IN_Q30 ) + IF( GT_32( en_ratio_fx_scaled, ONE_IN_Q30 ) ) { diffuseness_fx[band] = 0; + move32(); } - else + ELSE { - diffuseness_fx[band] = ONE_IN_Q30 - en_ratio_fx_scaled; + diffuseness_fx[band] = L_sub( ONE_IN_Q30, en_ratio_fx_scaled ); + move32(); } } - // diffuseness[band] = 1.0f - en_ratio; /*compute diffuseness*/ - // diffuseness[band] = ( ( diffuseness[band] < 1.0f ) ? ( ( diffuseness[band] < 0.0f ) ? 0.f : diffuseness[band] ) : 1.0f ); - // diffuseness[band] = (float)diffuseness_fx[band] / (1 << 30); } - for ( band = start_band; band < end_band; band++ ) + FOR( band = start_band; band < end_band; band++ ) { - int16_t azi_dith, ele_dith; + Word16 azi_dith, ele_dith; tmp_write_idx_param_band = hDirAC->spar_to_dirac_write_idx; + move16(); + + en_ratio_fx = L_sub( ONE_IN_Q30, diffuseness_fx[band] ); + + masa_sq_fx( L_sub( ONE_IN_Q30, en_ratio_fx ), diffuseness_thresholds_fx, DIRAC_DIFFUSE_LEVELS ); - // en_ratio = 1.0f - diffuseness[band]; - en_ratio_fx = ONE_IN_Q30 - diffuseness_fx[band]; - // en_ratio = (float)en_ratio_fx / (1 << 30); - // cam delete the below function call - // masa_sq( 1.0f - en_ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); - //#ifdef IVAS_FLOAT_FIXED - masa_sq_fx( ONE_IN_Q30 - en_ratio_fx, diffuseness_thresholds_fx, DIRAC_DIFFUSE_LEVELS ); - //#endif qmf_band_start = band_grouping[band]; + move16(); qmf_band_end = band_grouping[band + 1]; + move16(); - for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + FOR( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) { - int16_t ts_start, ts_end, ts; + Word16 ts_start, ts_end, ts; ts_start = DirAC_block_grouping[block]; + move16(); ts_end = DirAC_block_grouping[block + 1]; - for ( b = qmf_band_start; b < qmf_band_end; b++ ) + move16(); + FOR( b = qmf_band_start; b < qmf_band_end; b++ ) { azi_dith = azi[band]; + move16(); ele_dith = ele[band]; + move16(); hSpatParamRendCom->energy_ratio1_fx[block][b] = en_ratio_fx; + move32(); tmp_write_idx_band = tmp_write_idx_param_band; + move16(); - if ( hDirAC->hConfig->dec_param_estim == FALSE ) + IF( hDirAC->hConfig->dec_param_estim == FALSE ) { hSpatParamRendCom->elevation[tmp_write_idx_band][b] = ele_dith; + move16(); hSpatParamRendCom->azimuth[tmp_write_idx_band][b] = azi_dith; + move16(); hSpatParamRendCom->diffuseness_vector_fx[tmp_write_idx_band][b] = diffuseness_fx[band]; + move32(); } - else + ELSE { - for ( ts = ts_start; ts < ts_end; ts++ ) + FOR( ts = ts_start; ts < ts_end; ts++ ) { hSpatParamRendCom->elevation[tmp_write_idx_band][b] = ele_dith; + move16(); hSpatParamRendCom->azimuth[tmp_write_idx_band][b] = azi_dith; + move16(); hSpatParamRendCom->diffuseness_vector_fx[tmp_write_idx_band][b] = diffuseness_fx[band]; - tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hSpatParamRendCom->dirac_md_buffer_length; + move32(); + tmp_write_idx_band = add( tmp_write_idx_band, 1 ) % hSpatParamRendCom->dirac_md_buffer_length; + move16(); } } } - tmp_write_idx_param_band = ( tmp_write_idx_param_band + num_slots_in_subfr ) % hSpatParamRendCom->dirac_md_buffer_length; + tmp_write_idx_param_band = add( tmp_write_idx_param_band, num_slots_in_subfr ) % hSpatParamRendCom->dirac_md_buffer_length; + move16(); } } /* update buffer write index */ - if ( hDirAC->hConfig->dec_param_estim == FALSE ) + IF( hDirAC->hConfig->dec_param_estim == FALSE ) { - hDirAC->spar_to_dirac_write_idx = ( hDirAC->spar_to_dirac_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % hSpatParamRendCom->dirac_md_buffer_length; + hDirAC->spar_to_dirac_write_idx = add( hDirAC->spar_to_dirac_write_idx, MAX_PARAM_SPATIAL_SUBFRAMES ) % hSpatParamRendCom->dirac_md_buffer_length; + move16(); } - else + ELSE { - hDirAC->spar_to_dirac_write_idx = ( hDirAC->spar_to_dirac_write_idx + CLDFB_NO_COL_MAX ) % hSpatParamRendCom->dirac_md_buffer_length; + hDirAC->spar_to_dirac_write_idx = add( hDirAC->spar_to_dirac_write_idx, CLDFB_NO_COL_MAX ) % hSpatParamRendCom->dirac_md_buffer_length; + move16(); } } - else + ELSE { band = end_band; + move16(); } /*read DirAC metadata, convert DirAC to SPAR*/ - for ( ; band < num_bands_out / bw; band++ ) + FOR( ; band < idiv1616( num_bands_out, bw ); band++ ) { - int16_t dirac_band_idx; + Word16 dirac_band_idx; - dirac_band_idx = dirac_to_spar_md_bands[band] - enc_param_start_band; + dirac_band_idx = sub( dirac_to_spar_md_bands[band], enc_param_start_band ); num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + move16(); if ( st_ivas->hQMetaData->useLowerRes ) { num_subframes = 1; + move16(); } - for ( block = 0; block < num_subframes; block++ ) + FOR( block = 0; block < num_subframes; block++ ) { - // if ( st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth[block] < 0.f ) - //{ - // st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth[block] += 360.f; - // } - if ( st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth_fx[block] < 0 ) + + IF( st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth_fx[block] < 0 ) { st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth_fx[block] = L_add( L_shl( 360, 22 ), st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth_fx[block] ); + move32(); } - // azi_dirac[band][block] = st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth[block]; - // ele_dirac[band][block] = st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].elevation[block]; - //#ifdef IVAS_FLOAT_FIXED + azi_dirac_fx[band][block] = st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth_fx[block]; + move32(); ele_dirac_fx[band][block] = st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].elevation_fx[block]; - //#endif + move32(); } - // diffuseness[band] = 1.0f - st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio[0]; - //#ifdef IVAS_FLOAT_FIXED - diffuseness_fx[band] = ONE_IN_Q30 - st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio_fx[0]; - //#endif + diffuseness_fx[band] = L_sub( ONE_IN_Q30, st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio_fx[0] ); + move32(); } /* DirAC MD averaged over 4 subframes and converted to SPAR format similar to encoder processing */ - if ( hMdDec->spar_md_cfg.nchan_transport > 1 ) + IF( GT_16( hMdDec->spar_md_cfg.nchan_transport, 1 ) ) { -#ifdef IVAS_FLOAT_FIXED - ivas_get_spar_md_from_dirac_fx( azi_dirac_fx, ele_dirac_fx, diffuseness_fx, 1, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out, ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL, st_ivas->hQMetaData->useLowerRes, active_w_vlbr, dyn_active_w_flag ); -#else - ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, 1, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out, ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL, st_ivas->hQMetaData->useLowerRes, active_w_vlbr, dyn_active_w_flag ); -#endif + Word16 order; + IF( hMdDec->spar_hoa_md_flag ) + { + order = 1; + move16(); + } + ELSE + { + order = sba_order_internal; + move16(); + } + ivas_get_spar_md_from_dirac_fx( azi_dirac_fx, ele_dirac_fx, diffuseness_fx, 1, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out, order, dtx_vad, NULL, st_ivas->hQMetaData->useLowerRes, active_w_vlbr, dyn_active_w_flag ); /* temporarily copy frame-wise prediction coefficients in DirAC bands*/ - for ( pred_idx = 0; pred_idx < FOA_CHANNELS - 1; pred_idx++ ) + FOR( pred_idx = 0; pred_idx < FOA_CHANNELS - 1; pred_idx++ ) { - for ( band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++ ) + FOR( band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++ ) { - // pred_re_20ms[band][pred_idx] = hMdDec->spar_md.band_coeffs[band].pred_re[pred_idx]; pred_re_20ms_fx[band][pred_idx] = hMdDec->spar_md.band_coeffs[band].pred_re_fx[pred_idx]; + move32(); } } } - int16_t num_md_sub_frames; + Word16 num_md_sub_frames; num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order_internal, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); - //#ifdef IVAS_FLOAT_FIXED - ivas_get_spar_md_from_dirac_fx( azi_dirac_fx, ele_dirac_fx, diffuseness_fx, num_md_sub_frames, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out / bw, ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL, st_ivas->hQMetaData->useLowerRes, active_w_vlbr, dyn_active_w_flag ); - //#else - // ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, num_md_sub_frames, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out / bw, ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL, st_ivas->hQMetaData->useLowerRes, active_w_vlbr, dyn_active_w_flag ); - //#endif - if ( st_ivas->hQMetaData->useLowerRes && dtx_vad ) + + Word16 order; + IF( hMdDec->spar_hoa_md_flag ) { - for ( band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++ ) + order = 1; + move16(); + } + ELSE + { + order = sba_order_internal; + move16(); + } + ivas_get_spar_md_from_dirac_fx( azi_dirac_fx, ele_dirac_fx, diffuseness_fx, num_md_sub_frames, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, idiv1616( num_bands_out, bw ), order, dtx_vad, NULL, st_ivas->hQMetaData->useLowerRes, active_w_vlbr, dyn_active_w_flag ); + + test(); + IF( st_ivas->hQMetaData->useLowerRes && dtx_vad ) + { + FOR( band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++ ) { - for ( block = 1; block < num_md_sub_frames; block++ ) + FOR( block = 1; block < num_md_sub_frames; block++ ) { - for ( i = 0; i < FOA_CHANNELS - 1; i++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */ + FOR( i = 0; i < FOA_CHANNELS - 1; i++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */ { - // hMdDec->spar_md.band_coeffs[band + block * IVAS_MAX_NUM_BANDS].pred_re[i] = hMdDec->spar_md.band_coeffs[band].pred_re[i]; - hMdDec->spar_md.band_coeffs[band + block * IVAS_MAX_NUM_BANDS].pred_re_fx[i] = hMdDec->spar_md.band_coeffs[band].pred_re_fx[i]; + hMdDec->spar_md.band_coeffs[add( band, i_mult( block, IVAS_MAX_NUM_BANDS ) )].pred_re_fx[i] = hMdDec->spar_md.band_coeffs[band].pred_re_fx[i]; + move32(); } - for ( i = 0; i < FOA_CHANNELS - 1; i++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */ + FOR( i = 0; i < FOA_CHANNELS - 1; i++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */ { - // hMdDec->spar_md.band_coeffs[band + block * IVAS_MAX_NUM_BANDS].P_re[i] = hMdDec->spar_md.band_coeffs[band].P_re[i]; - hMdDec->spar_md.band_coeffs[band + block * IVAS_MAX_NUM_BANDS].P_re_fx[i] = hMdDec->spar_md.band_coeffs[band].P_re_fx[i]; + hMdDec->spar_md.band_coeffs[add( band, i_mult( block, IVAS_MAX_NUM_BANDS ) )].P_re_fx[i] = hMdDec->spar_md.band_coeffs[band].P_re_fx[i]; + move32(); } } } } /* expand DirAC TC 20ms MD for residual channels to all subframes*/ - for ( block = 0; block < num_md_sub_frames; block++ ) + FOR( block = 0; block < num_md_sub_frames; block++ ) { - for ( band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++ ) + FOR( band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++ ) { - for ( pred_idx = 0; pred_idx < FOA_CHANNELS - 1; pred_idx++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */ + FOR( pred_idx = 0; pred_idx < FOA_CHANNELS - 1; pred_idx++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */ { - if ( ivas_is_res_channel( pred_idx + 1, hMdDec->spar_md_cfg.nchan_transport ) ) + IF( ivas_is_res_channel( add( pred_idx, 1 ), hMdDec->spar_md_cfg.nchan_transport ) ) { /* use 20ms coefficients only for residual channels */ - // hMdDec->spar_md.band_coeffs[band + block * IVAS_MAX_NUM_BANDS].pred_re[pred_idx] = pred_re_20ms[band][pred_idx]; - hMdDec->spar_md.band_coeffs[band + block * IVAS_MAX_NUM_BANDS].pred_re_fx[pred_idx] = pred_re_20ms_fx[band][pred_idx]; + hMdDec->spar_md.band_coeffs[add( band, i_mult( block, IVAS_MAX_NUM_BANDS ) )].pred_re_fx[pred_idx] = pred_re_20ms_fx[band][pred_idx]; + move32(); } } } } - for ( b = end_band * bw; b < num_bands_out; b++ ) + FOR( b = i_mult( end_band, bw ); b < num_bands_out; b++ ) { hMdDec->valid_bands[b] = 1; + move16(); } return; diff --git a/lib_dec/ivas_stereo_adapt_GR_dec.c b/lib_dec/ivas_stereo_adapt_GR_dec.c index 79b9d272f..6eaef9c9e 100644 --- a/lib_dec/ivas_stereo_adapt_GR_dec.c +++ b/lib_dec/ivas_stereo_adapt_GR_dec.c @@ -61,28 +61,35 @@ static Word16 read_GR2( p = bit_stream; nb = 0; + move16(); FOR( i = 0; i < len; i++ ) { ready = 0; + move16(); temp = 0; + move16(); DO { b = *p++; - IF( EQ_16( (Word16) b, 0 ) ) + move16(); + IF( b == 0 ) { ready = 1; + move16(); } ELSE { - temp = add( (Word16) temp, 1 ); + temp = (UWord16) ( L_add( temp, 1 ) ); } } - WHILE( EQ_16( (Word16) ready, 0 ) ); + WHILE( ready == 0 ); b = *p++; - b = (UWord16) add( shl( (Word16) b, 1 ), (Word16) *p++ ); - ind[i] = add( shl( (Word16) temp, 2 ), (Word16) b ); - nb = (UWord16) add( (Word16) nb, add( (Word16) temp, 3 ) ); + move16(); + b = (UWord16) L_add( L_shl( b, 1 ), *p++ ); + ind[i] = extract_l( L_add( L_shl( temp, 2 ), b ) ); + move16(); + nb = (UWord16) L_add( nb, L_add( temp, 3 ) ); } return nb; @@ -108,28 +115,35 @@ static Word16 read_GR1( p = bit_stream; nb = 0; + move16(); FOR( i = 0; i < len; i++ ) { ready = 0; + move16(); temp = 0; + move16(); DO { b = *p++; - IF( EQ_16( (Word16) b, 0 ) ) + move16(); + IF( b == 0 ) { ready = 1; + move16(); } ELSE { - temp = add( (Word16) temp, 1 ); + temp = (UWord16) ( L_add( temp, 1 ) ); } } - WHILE( EQ_16( (Word16) ready, 0 ) ); + WHILE( ready == 0 ); b = *p++; - ind[i] = add( shl( (Word16) temp, 1 ), (Word16) b ); - nb = (UWord16) add( (Word16) nb, add( (Word16) temp, 2 ) ); + move16(); + ind[i] = extract_l( L_add( L_shl( temp, 1 ), b ) ); + move16(); + nb = (UWord16) L_add( nb, L_add( temp, 2 ) ); } return nb; @@ -155,26 +169,32 @@ Word16 read_GR0( p = bit_stream; nb = 0; + move16(); FOR( i = 0; i < len; i++ ) { ready = 0; + move16(); temp = 0; + move16(); DO { b = *p++; - IF( EQ_16( (Word16) b, 0 ) ) + move16(); + IF( b == 0 ) { ready = 1; + move16(); } ELSE { - temp = add( (Word16) temp, 1 ); + temp = (UWord16) L_add( temp, 1 ); } } - WHILE( EQ_16( (Word16) ready, 0 ) ); + WHILE( ready == 0 ); ind[i] = temp; - nb = (UWord16) add( (Word16) nb, add( (Word16) temp, 1 ) ); + move16(); + nb = (UWord16) L_add( nb, L_add( temp, 1 ) ); } return nb; @@ -196,10 +216,13 @@ static ivas_error find_map( ) { *map_idx = 0; + move16(); WHILE( ( NE_16( map[*map_idx], val ) ) && ( NE_16( *map_idx, len ) ) ) { - ( *map_idx )++; + test(); + *map_idx = add( *map_idx, 1 ); + move16(); } @@ -226,7 +249,7 @@ static void decode_adapt_GR_indices1( IF( EQ_16( no_symb, NO_SYMB_GR_SIDE_G ) ) { - map = &map0[15 * no_symb]; + map = &map0[i_mult( 15, no_symb )]; } ELSE { @@ -236,8 +259,9 @@ static void decode_adapt_GR_indices1( FOR( i = 0; i < len; i++ ) { map_symb = ind[i]; + move16(); find_map( out + i, map, map_symb, no_symb ); - map = &( map0[out[i] * no_symb] ); + map = &( map0[i_mult( out[i], no_symb )] ); } return; @@ -258,11 +282,13 @@ Word16 get_value( { Word16 i; UWord16 mask = 0, val = 0; + move16(); + move16(); - FOR( i = nbits - 1; i >= 0; i-- ) + FOR( i = sub( nbits, 1 ); i >= 0; i-- ) { - val = (UWord16) add( (Word16) val, shl( bit_stream[i], mask ) ); - mask = add( mask, 1 ); + val = (UWord16) L_add( val, L_shl( bit_stream[i], mask ) ); + mask = (UWord16) L_add( mask, 1 ); } return val; @@ -287,27 +313,31 @@ Word16 read_BS_GR( Word16 b, ind1_tmp[STEREO_DFT_BAND_MAX], tmp, i; *GR_ord = bit_stream[nb]; + move16(); b = 1; + move16(); - IF( EQ_16( *GR_ord, 0 ) ) + IF( *GR_ord == 0 ) { - b = add( b, read_GR0( &bit_stream[nb + b], ind1_tmp, len ) ); + b = add( b, read_GR0( &bit_stream[add( nb, b )], ind1_tmp, len ) ); } ELSE { - b = add( b, read_GR1( &bit_stream[nb + b], ind1_tmp, len ) ); + b = add( b, read_GR1( &bit_stream[add( nb, b )], ind1_tmp, len ) ); } FOR( i = 0; i < len; i++ ) { tmp = add( ind1_tmp[i], 1 ); - IF( tmp & 1 ) /* if odd number */ + IF( s_and( tmp, 1 ) ) /* if odd number */ { ind1[i] = negate( shr( ind1_tmp[i], 1 ) ); + move16(); } ELSE { ind1[i] = shr( tmp, 1 ); + move16(); } } @@ -335,30 +365,36 @@ Word16 read_BS_adapt_GR_sg( /* read first component */ b = 0; + move16(); b = add( b, read_GR1( &bit_stream[nb], ind1_tmp, 1 ) ); /* read GR ord */ - ord = bit_stream[nb + b]; + ord = bit_stream[add( nb, b )]; + move16(); b = add( b, 1 ); - IF( EQ_16( ord, 0 ) ) + IF( ord == 0 ) { *GR_ord = 1; - b = add( b, read_GR1( &bit_stream[nb + b], &ind1_tmp[1], len - 1 ) ); + move16(); + b = add( b, read_GR1( &bit_stream[add( nb, b )], &ind1_tmp[1], sub( len, 1 ) ) ); } ELSE { - ord = bit_stream[nb + b]; + ord = bit_stream[add( nb, b )]; + move16(); b = add( b, 1 ); - IF( EQ_16( ord, 0 ) ) + IF( ord == 0 ) { *GR_ord = 0; + move16(); - b = add( b, read_GR0( &bit_stream[nb + b], &ind1_tmp[1], len - 1 ) ); + b = add( b, read_GR0( &bit_stream[add( nb, b )], &ind1_tmp[1], sub( len, 1 ) ) ); } ELSE { *GR_ord = 2; - b = add( b, read_GR2( &bit_stream[nb + b], &ind1_tmp[1], len - 1 ) ); + move16(); + b = add( b, read_GR2( &bit_stream[add( nb, b )], &ind1_tmp[1], sub( len, 1 ) ) ); } } @@ -381,6 +417,7 @@ Word16 read_itd( ) { Word16 huff_flag, sign_flag, I, i, nb = 0, ready; + move16(); huff_flag = (Word16) get_next_indice( st, 1 ); sign_flag = (Word16) get_next_indice( st, 1 ); @@ -389,24 +426,30 @@ Word16 read_itd( IF( EQ_16( huff_flag, 1 ) ) { ready = 0; + move16(); I = 0; + move16(); - WHILE( ( EQ_16( ready, 0 ) ) && ( LT_16( nb, 10 ) ) ) + WHILE( ( ready == 0 ) && ( LT_16( nb, 10 ) ) ) { + test(); I = add( shl( I, 1 ), (Word16) get_next_indice( st, 1 ) ); nb = add( nb, 1 ); FOR( i = 0; i < 20; i++ ) { + test(); IF( ( EQ_16( I, dft_code_itd[i] ) ) && ( EQ_16( dft_len_itd[i], ( sub( nb, 2 ) ) ) ) ) { I = i; + move16(); ready = 1; + move16(); BREAK; } } } - IF( EQ_16( ready, 0 ) ) + IF( ready == 0 ) { printf( "Error reading Huffman code for ITD: \n" ); } @@ -419,6 +462,7 @@ Word16 read_itd( I = add( I, shl( sign_flag, 8 ) ); *pI = I; + move16(); return nb; } @@ -451,22 +495,24 @@ Word16 read_BS_adapt_GR_rpg( FOR( i = start; i < total_no; i++ ) { ind1_pred[i] = 0; + move16(); } } ELSE { - *GR_ord = bit_stream[nb + b]; /* GR order */ + *GR_ord = bit_stream[add( nb, b )]; /* GR order */ + move16(); b = add( b, 1 ); - IF( EQ_16( *GR_ord, 0 ) ) + IF( *GR_ord == 0 ) { - b = add( b, read_GR0( &bit_stream[nb + b], &ind1_tmp[1], len - 1 ) ); + b = add( b, read_GR0( &bit_stream[add( nb, b )], &ind1_tmp[1], sub( len, 1 ) ) ); } ELSE { /* GR ord 1 */ - b = add( b, read_GR1( &bit_stream[nb + b], &ind1_tmp[1], len - 1 ) ); + b = add( b, read_GR1( &bit_stream[add( nb, b )], &ind1_tmp[1], sub( len, 1 ) ) ); } - decode_adapt_GR_indices1( ind1_tmp, total_no - start, NO_SYMB_GR_PRED_G, &ind1_pred[start], dft_maps_rpg ); + decode_adapt_GR_indices1( ind1_tmp, sub( total_no, start ), NO_SYMB_GR_PRED_G, &ind1_pred[start], dft_maps_rpg ); } return b; @@ -488,14 +534,17 @@ Word16 read_flag_EC_DFT( Word16 flg; flg = bit_stream[0]; - IF( EQ_16( flg, 0 ) ) + move16(); + IF( flg == 0 ) { *flag = flg; + move16(); return 1; } ELSE { *flag = add( 2, bit_stream[1] ); + move16(); return 2; } } diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index 48394bd86..5aef907a7 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -727,6 +727,7 @@ static void stereo_dft_generate_comfort_noise_fx( q_shift = s_min( getScaleFactor32( hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ), sub( hFdCngCom->cngNoiseLevelExp, 27 ) ); scale_sig32( hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, q_shift ); hFdCngCom->cngNoiseLevelExp = sub( hFdCngCom->cngNoiseLevelExp, q_shift ); + move16(); enr = 0; /* Eliminates compiler warning. They are always set before they are used */ move32(); @@ -741,25 +742,29 @@ static void stereo_dft_generate_comfort_noise_fx( q_shb_shape = 0; move16(); - IF( EQ_16( chan, 0 ) ) + IF( chan == 0 ) { - pSideGain = hStereoDft->side_gain_fx + i_mult( STEREO_DFT_NBDIV, STEREO_DFT_BAND_MAX ); + pSideGain = hStereoDft->side_gain_fx + STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX; FOR( b = 0; b < hStereoDft->nbands; b++ ) { - IF( EQ_16( hStereoCng->xfade_frame_counter, 0 ) ) + IF( hStereoCng->xfade_frame_counter == 0 ) { hStereoDft->g_state_fx[b] = extract_h( *pSideGain++ ); + move16(); } ELSE { hStereoDft->g_state_fx[b] = add( mult( ONE_MINUS_A_GFILT_FX, extract_h( *pSideGain++ ) ), mult( A_GFILT_FX, hStereoDft->g_state_fx[b] ) ); + move16(); } + test(); IF( hStereoCng->first_SID ) { IF( hStereoCng->first_SID_after_TD ) { hStereoCng->cm_fx[b] = extract_h( Mpy_32_32( hStereoCng->c_LR_LT_fx, hStereoCng->c_LR_LT_fx ) ); + move16(); } ELSE { @@ -772,15 +777,18 @@ static void stereo_dft_generate_comfort_noise_fx( IF( GT_16( hStereoCng->nr_corr_frames, CORR_INIT ) ) { hStereoCng->cm_fx[b] = extract_h( Mpy_32_32( hStereoCng->c_LR_LT_fx, hStereoCng->c_LR_LT_fx ) ); + move16(); } ELSE { hStereoCng->cm_fx[b] = add( mult( ONE_MINUS_A_GFILT_FX, hStereoCng->coh_fx[b] ), mult( A_GFILT_FX, hStereoCng->cm_fx[b] ) ); + move16(); } } ELSE { hStereoCng->cm_fx[b] = add( mult( ONE_MINUS_A_GFILT_FX, hStereoCng->coh_fx[b] ), mult( A_GFILT_FX, hStereoCng->cm_fx[b] ) ); + move16(); } } @@ -794,8 +802,8 @@ static void stereo_dft_generate_comfort_noise_fx( { gamma = hStereoCng->cm_fx[b]; /* Q15 */ move16(); - gamma = BASOP_Util_Divide1616_Scale( gamma, 32767 - gamma, &q_div ); /* e(q_div) */ - q_sqrt2 = q_div + 16; + gamma = BASOP_Util_Divide1616_Scale( gamma, sub( 32767, gamma ), &q_div ); /* e(q_div) */ + q_sqrt2 = add( q_div, 16 ); tmp32_1 = BASOP_Util_Add_Mant32Exp( gamma, add( q_div, 16 ), sub( 32767, mult_r( hStereoDft->g_state_fx[b], hStereoDft->g_state_fx[b] ) ), 16, &q_sqrt1 ); /* e(q_sqrt1) */ tmp32_1 = Sqrt32( tmp32_1, &q_sqrt1 ); /* e(q_sqrt1) */ tmp32_2 = Sqrt32( gamma, &q_sqrt2 ); /* e(q_sqrt2) */ @@ -838,10 +846,11 @@ static void stereo_dft_generate_comfort_noise_fx( } scaleAvg = BASOP_Util_Divide1616_Scale( scaleAvg, hStereoDft->nbands, &q_div ); hStereoDft->scale_fx = shl_sat( scaleAvg, q_div ); + move16(); } } - IF( EQ_16( st->cng_type, LP_CNG ) ) + IF( st->cng_type == LP_CNG ) { set32_fx( cngNoiseLevel_upd, 0, st->L_frame ); @@ -850,26 +859,31 @@ static void stereo_dft_generate_comfort_noise_fx( move16(); dmpf[1] = negate( st->preemph_fac ); move16(); - mvs2s( st->Aq_cng, Atmp, M + 1 ); + Copy( st->Aq_cng, Atmp, M + 1 ); conv_fx_32( Atmp, dmpf, cngNoiseLevel_upd, M + 2 ); IF( EQ_16( st->L_frame, L_FRAME ) ) { pTrigo = hStereoDft->dft_trigo_12k8_fx; trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP * STEREO_DFT_TRIGO_DEC_STEP; + move16(); } ELSE { pTrigo = hStereoDft->dft_trigo_16k_fx; trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP; + move16(); } - FOR( i = 0; i < st->L_frame / 4; i++ ) + FOR( i = 0; i < shr( st->L_frame, 2 ); i++ ) { trigo_dec[i] = pTrigo[i_mult( i, trigo_step )]; - trigo_dec[sub( shr( st->L_frame, 1 ), i )] = pTrigo[i_mult( i, trigo_step )]; + move16(); + trigo_dec[sub( st->L_frame / 2, i )] = pTrigo[i_mult( i, trigo_step )]; + move16(); } - trigo_dec[shr( st->L_frame, 2 )] = pTrigo[i_mult( shr( st->L_frame, 2 ), trigo_step )]; + trigo_dec[st->L_frame / 4] = pTrigo[i_mult( st->L_frame / 4, trigo_step )]; + move16(); Word16 rshift_cng = sub( find_guarded_bits_fx( st->L_frame ), getScaleFactor32( cngNoiseLevel_upd, st->L_frame ) ); v_shr_32( cngNoiseLevel_upd, cngNoiseLevel_upd, st->L_frame, rshift_cng ); @@ -886,7 +900,7 @@ static void stereo_dft_generate_comfort_noise_fx( ptr0 = cngNoiseLevel_upd; ptr1 = ptr0 + 2; ptr2 = ptr1 + 1; - assert( GT_32( st->lp_ener_fx, 0 ) ); + assert( st->lp_ener_fx > 0 ); // lp_ener_fx will be in Q6 at this point. // So applying appropriate left shift on the denominator. @@ -898,30 +912,34 @@ static void stereo_dft_generate_comfort_noise_fx( FOR( i = 0; i < sub( shr( st->L_frame, 1 ), 1 ); i++ ) { ftmp = Madd_32_32( Mpy_32_32( *ptr1, *ptr1 ), *ptr2, *ptr2 ); - assert( GT_32( ftmp, 0 ) ); + assert( ftmp > 0 ); q_sqrt = sub( 62, shl( q_cngNoiseLevel_upd, 1 ) ); - IF( EQ_32( ftmp, 0 ) ) + IF( ftmp == 0 ) { ftmp = EPSILLON_FX; + move32(); q_sqrt = s_max( 0, q_sqrt ); } tmp = ISqrt32( ftmp, &q_sqrt ); e_norm_temp[i] = sub( 31, add( q_sqrt, q_div ) ); + move16(); *ptr0++ = Mpy_32_32( factor, tmp ); + move32(); ptr1 += 2; ptr2 += 2; } FOR( i = 0; i < sub( shr( st->L_frame, 1 ), 1 ); i++ ) { - q_cngNoiseLevel_upd = s_min( q_cngNoiseLevel_upd, e_norm_temp[i] + norm_l( cngNoiseLevel_upd[i] ) ); + q_cngNoiseLevel_upd = s_min( q_cngNoiseLevel_upd, add( e_norm_temp[i], norm_l( cngNoiseLevel_upd[i] ) ) ); } FOR( i = 0; i < st->L_frame; i++ ) { cngNoiseLevel_upd[i] = L_shl( cngNoiseLevel_upd[i], sub( q_cngNoiseLevel_upd, e_norm_temp[i] ) ); + move32(); } - IF( GT_16( sub( s_min( output_frame, L_FRAME32k ), hFdCngCom->stopFFTbin ), 0 ) ) + IF( sub( s_min( output_frame, L_FRAME32k ), hFdCngCom->stopFFTbin ) > 0 ) { /* Transform shb LP spectrum */ set32_fx( shb_shape, 0, L_FRAME16k ); @@ -930,14 +948,18 @@ static void stereo_dft_generate_comfort_noise_fx( IF( NE_16( st->L_frame, L_FRAME16k ) ) { pTrigo = hStereoDft->dft_trigo_16k_fx; - trigo_step = i_mult( STEREO_DFT_TRIGO_SRATE_16k_STEP, STEREO_DFT_TRIGO_DEC_STEP ); + trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP; + move16(); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { trigo_dec[i] = pTrigo[i_mult( i, trigo_step )]; - trigo_dec[sub( shr( L_FRAME16k, 1 ), i )] = pTrigo[i_mult( i, trigo_step )]; + move16(); + trigo_dec[sub( L_FRAME16k / 2, i )] = pTrigo[i_mult( i, trigo_step )]; + move16(); } - trigo_dec[shr( L_FRAME16k, 2 )] = pTrigo[i_mult( shr( L_FRAME16k, 2 ), trigo_step )]; + trigo_dec[L_FRAME16k / 4] = pTrigo[i_mult( L_FRAME16k / 4, trigo_step )]; + move16(); } Word16 rshift_shb = sub( find_guarded_bits_fx( L_FRAME16k ), getScaleFactor32( shb_shape, L_FRAME16k ) ); @@ -962,8 +984,9 @@ static void stereo_dft_generate_comfort_noise_fx( { ftmp = Madd_32_32( Mpy_32_32( *ptr1, *ptr1 ), *ptr2, *ptr2 ); q_tmp = sub( shl( q_shb_shape, 1 ), 31 ); - assert( GT_32( ftmp, 0 ) ); + assert( ftmp > 0 ); q_div = 0; + move16(); ftmp = BASOP_Util_Divide3232_Scale_cadence( L_shl( 1, q_tmp ), ftmp, &q_div ); /* in float: both a = "div"=(1/(x^2+y^2) and sqrt(a) is used and summed up in the same loop. @@ -974,11 +997,14 @@ static void stereo_dft_generate_comfort_noise_fx( enr = BASOP_Util_Add_Mant32Exp( enr, q_enr, ftmp, q_div, &q_enr ); tmp32_1 = Sqrt32( ftmp, &q_div ); *ptr0++ = tmp32_1; + move32(); e_norm_temp[i] = sub( 31, q_div ); + move16(); ptr1 += 2; ptr2 += 2; } q_shb_shape = MAX_16; + move16(); FOR( i = 0; i < L_FRAME16k; i++ ) { @@ -987,20 +1013,25 @@ static void stereo_dft_generate_comfort_noise_fx( FOR( i = 0; i < L_FRAME16k; i++ ) { shb_shape[i] = L_shl( shb_shape[i], sub( q_shb_shape, e_norm_temp[i] ) ); + move32(); } } /* Update CNG noise level from MS noise estimation */ - mvl2l( st->hFdCngDec->bandNoiseShape, cngNoiseLevel_hist, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ); + Copy32( st->hFdCngDec->bandNoiseShape, cngNoiseLevel_hist, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ); ptr_cng = cngNoiseLevel_hist; - FOR( i = 0; i < sub( st->last_L_frame, hFdCngCom->startBand ) / 2; i++ ) + FOR( i = 0; i < shr( sub( st->last_L_frame, hFdCngCom->startBand ), 1 ); i++ ) { tmp = *( cngNoiseLevel_hist + shl( i, 1 ) ); tmp = L_add( tmp, *( cngNoiseLevel_hist + add( shl( i, 1 ), 1 ) ) ); *ptr_cng++ = L_shr( tmp, 1 ); + move32(); } - IF( EQ_16( last_element_mode, IVAS_CPE_TD ) && EQ_16( chan, 0 ) && EQ_16( hStereoCng->xfade_frame_counter, 0 ) && GE_16( hFdCngCom->msFrCnt_init_counter, hFdCngCom->msFrCnt_init_thresh ) ) + test(); + test(); + test(); + IF( EQ_16( last_element_mode, IVAS_CPE_TD ) && ( chan == 0 ) && ( hStereoCng->xfade_frame_counter == 0 ) && GE_16( hFdCngCom->msFrCnt_init_counter, hFdCngCom->msFrCnt_init_thresh ) ) { ptr_cng = cngNoiseLevel_hist + hFdCngCom->startBand; ptr_tmp = cngNoiseLevel_upd + hFdCngCom->startBand; @@ -1017,6 +1048,7 @@ static void stereo_dft_generate_comfort_noise_fx( { tmp_16 = shl( tmp_16, q_div ); hStereoCng->xfade_length = sub( MAX_XFADE_FX, extract_l( L_shr( imult3216( MAX_XFADE_FX, tmp_16 ), Q15 ) ) ); + move16(); } ELSE { @@ -1024,6 +1056,7 @@ static void stereo_dft_generate_comfort_noise_fx( tmp_16 = Invert16( tmp_16, &q_inv ); tmp_16 = shl( tmp_16, add( q_inv, q_div ) ); hStereoCng->xfade_length = sub( MAX_XFADE_FX, extract_l( L_shr( imult3216( MAX_XFADE_FX, tmp_16 ), Q15 ) ) ); + move16(); } } @@ -1031,7 +1064,7 @@ static void stereo_dft_generate_comfort_noise_fx( { ptr_cng = cngNoiseLevel_hist + hFdCngCom->startBand; ptr_tmp = cngNoiseLevel_upd + hFdCngCom->startBand; - FOR( i = 0; i < ( st->last_L_frame - hFdCngCom->startBand ) / 2; i++ ) + FOR( i = 0; i < shr( sub( st->last_L_frame, hFdCngCom->startBand ), 1 ); i++ ) { tmp_16 = BASOP_Util_Divide1616_Scale( hStereoCng->xfade_frame_counter, hStereoCng->xfade_length, &q_div ); tmp_16 = shl( tmp_16, q_div ); @@ -1051,13 +1084,13 @@ static void stereo_dft_generate_comfort_noise_fx( ptr_i = ptr_r + 1; scale = shr( output_frame, 1 ); - FOR( i = 0; i < ( hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / 2; i++ ) + FOR( i = 0; i < shr( sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), 1 ); i++ ) { /* Real part in FFT bins */ rand_gauss_fx( ptr_r, &st->hTdCngDec->cng_seed, q_dft ); tmp32_1 = Mpy_32_16_1( *ptr_level, scale ); // Q(q_cngNoiseLevel_upd - 15) q_shift = norm_l( tmp32_1 ); - IF( GT_16( q_shift, sub( 46, q_cngNoiseLevel_upd ) ) ) + if ( GT_16( q_shift, sub( 46, q_cngNoiseLevel_upd ) ) ) { q_shift = sub( 46, q_cngNoiseLevel_upd ); } @@ -1065,21 +1098,23 @@ static void stereo_dft_generate_comfort_noise_fx( q_shift = sub( sub( 46, q_cngNoiseLevel_upd ), q_shift ); ( *ptr_r ) = L_shl( Mpy_32_32( ( *ptr_r ), tmp32_1 ), q_shift ); + move32(); ptr_r += 2; /* Imaginary part in FFT bins */ rand_gauss_fx( ptr_i, &st->hTdCngDec->cng_seed, q_dft ); ( *ptr_i ) = L_shl( Mpy_32_32( ( *ptr_i ), tmp32_1 ), q_shift ); + move32(); ptr_i += 2; ptr_level++; } - IF( GT_16( sub( s_min( output_frame, L_FRAME32k ), hFdCngCom->stopFFTbin ), 0 ) ) + IF( sub( s_min( output_frame, L_FRAME32k ), hFdCngCom->stopFFTbin ) > 0 ) { Word32 scale_32; Word16 q_res; /* high band generation, flipped spectrum */ - assert( NE_32( enr, 0 ) ); + assert( enr != 0 ); // 10 ^ (0.1 * st->hTdCngDec->shb_cng_gain) // Above expression equivalent to 2 ^ (3.321928094 * 0.1 * st->hTdCngDec->shb_cng_gain) // 3.321928094 * 0.1 = 0.3321928094 @@ -1091,19 +1126,23 @@ static void stereo_dft_generate_comfort_noise_fx( move16(); scale = BASOP_Util_Divide3232_Scale( scale_32, enr, &q_div ); // q_res = add(q_div, sub( q_enr, sub(Q31, q_res))); move16(); - q_res = q_res - q_enr + q_div; + q_res = add( sub( q_res, q_enr ), q_div ); // q_div = sub(Q15, q_res); move16(); q_div = q_res; + move16(); inv_scale = ISqrt16( scale, &q_res ); scale = Sqrt16( scale, &q_div ); - ptr_shb = shb_shape + sub( shr( L_FRAME16k, 1 ), 1 ); + ptr_shb = shb_shape + ( L_FRAME16k / 2 - 1 ); /* Averaging for Nyquist frequency */ Word16 q1, q2; tmp32_1 = Mpy_32_16_1( cngNoiseLevel_upd[sub( shr( sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), 1 ), 1 )], inv_scale ); tmp32_2 = *( ptr_shb - 1 ); + move32(); q1 = sub( add( q_cngNoiseLevel_upd, 1 ), q_res ); q2 = q_shb_shape; + move16(); *ptr_shb = BASOP_Util_Add_Mant32Exp( tmp32_1, sub( Q31, q1 ), tmp32_2, sub( Q31, q2 ), &q_tmp ); + move32(); q_tmp = sub( q_tmp, 1 ); IF( LT_16( sub( Q31, q_tmp ), q_shb_shape ) ) { @@ -1112,19 +1151,21 @@ static void stereo_dft_generate_comfort_noise_fx( } *ptr_shb = L_shl( *ptr_shb, sub( q_shb_shape, sub( Q31, q_tmp ) ) ); + move32(); // *ptr_shb = 0.5f * ( cngNoiseLevel_upd[( hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / 2 - 1] / scale + *( ptr_shb - 1 ) ); - ptr_r = DFT[chan] + hFdCngCom->stopFFTbin + i_mult( k, STEREO_DFT32MS_N_MAX ); + ptr_r = DFT[chan] + add( hFdCngCom->stopFFTbin, i_mult( k, STEREO_DFT32MS_N_MAX ) ); ptr_i = ptr_r + 1; - FOR( i = 0; i < shr( sub( s_min( output_frame, i_mult( hFdCngCom->regularStopBand, 16 ) ), hFdCngCom->stopFFTbin ), 1 ); i++ ) + FOR( i = 0; i < shr( sub( s_min( output_frame, shl( hFdCngCom->regularStopBand, 4 ) ), hFdCngCom->stopFFTbin ), 1 ); i++ ) { /* Real part in FFT bins */ rand_gauss_fx( ptr_r, &st->hTdCngDec->cng_seed, q_dft ); tmp32_1 = *ptr_shb; + move32(); q_shift = norm_l( tmp32_1 ); - IF( GT_16( q_shift, sub( 31, q_shb_shape ) ) ) + if ( GT_16( q_shift, sub( 31, q_shb_shape ) ) ) { q_shift = sub( 31, q_shb_shape ); } @@ -1132,10 +1173,12 @@ static void stereo_dft_generate_comfort_noise_fx( q_shift = sub( sub( 31, q_shb_shape ), q_shift ); ( *ptr_r ) = L_shl( Mpy_32_32( ( *ptr_r ), tmp32_1 ), q_shift ); + move32(); ptr_r += 2; /* Imaginary part in FFT bins */ rand_gauss_fx( ptr_i, &st->hTdCngDec->cng_seed, q_dft ); ( *ptr_i ) = L_shl( Mpy_32_32( ( *ptr_i ), tmp32_1 ), q_shift ); + move32(); ptr_i += 2; ptr_shb--; } @@ -1143,7 +1186,7 @@ static void stereo_dft_generate_comfort_noise_fx( /* rescale */ tmp32_1 = L_mult0( scale, shr( output_frame, 1 ) ); q_shift = norm_l( tmp32_1 ); - IF( GT_16( q_shift, add( Q16, q_div ) ) ) + if ( GT_16( q_shift, add( Q16, q_div ) ) ) { q_shift = add( Q16, q_div ); } @@ -1152,10 +1195,12 @@ static void stereo_dft_generate_comfort_noise_fx( ptr_r = DFT[chan] + add( hFdCngCom->stopFFTbin, i_mult( k, STEREO_DFT32MS_N_MAX ) ); ptr_i = ptr_r + 1; - FOR( i = 0; i < ( min( output_frame, hFdCngCom->regularStopBand * 16 ) - hFdCngCom->stopFFTbin ) / 2; i++ ) + FOR( i = 0; i < shr( sub( min( output_frame, shl( hFdCngCom->regularStopBand, 4 ) ), hFdCngCom->stopFFTbin ), 1 ); i++ ) { ( *ptr_r ) = L_shl( Mpy_32_32( ( *ptr_r ), tmp32_1 ), q_shift ); + move32(); ( *ptr_i ) = L_shl( Mpy_32_32( ( *ptr_i ), tmp32_1 ), q_shift ); + move32(); ptr_r += 2; ptr_i += 2; } @@ -1171,10 +1216,12 @@ static void stereo_dft_generate_comfort_noise_fx( q_tmp = s_max( hFdCngCom->cngNoiseLevelExp, shl( sub( Q31, q_cngNoiseLevel_upd ), 1 ) ); scale_sig32( hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, sub( hFdCngCom->cngNoiseLevelExp, q_tmp ) ); hFdCngCom->cngNoiseLevelExp = q_tmp; + move16(); FOR( i = 0; i < shr( sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), 1 ); i++ ) { *ptr_level-- = L_shl( Mpy_32_32( *ptr_tmp, *ptr_tmp ), sub( shl( sub( Q31, q_cngNoiseLevel_upd ), 1 ), hFdCngCom->cngNoiseLevelExp ) ); + move32(); ptr_tmp--; *ptr_level = *( ptr_level + 1 ); move32(); @@ -1184,16 +1231,18 @@ static void stereo_dft_generate_comfort_noise_fx( ELSE { /* FD-CNG */ - IF( !( hFdCngCom->msFrCnt_init_counter < hFdCngCom->msFrCnt_init_thresh ) ) + IF( !LT_16( hFdCngCom->msFrCnt_init_counter, hFdCngCom->msFrCnt_init_thresh ) ) { - IF( hStereoCng->xfade_frame_counter <= MAX_K && hStereoCng->last_act_element_mode == IVAS_CPE_TD && chan == 0 ) + test(); + test(); + IF( LE_16( hStereoCng->xfade_frame_counter, (Word16) MAX_K ) && EQ_16( hStereoCng->last_act_element_mode, IVAS_CPE_TD ) && ( chan == 0 ) ) { /* Fade MS -> SID/MS */ j = 0; move16(); - FOR( k = 0; k < ( hFdCngCom->nFFTpart - 2 ); k++ ) + FOR( k = 0; k < sub( hFdCngCom->nFFTpart, 2 ); k++ ) { - factor = BASOP_Util_Divide3232_Scale_cadence( ( hFdCngCom->sidNoiseEstLp[k] + DELTA_FX ), ( st->hFdCngDec->partNoiseShape[k] + DELTA_FX ), &q_div ); + factor = BASOP_Util_Divide3232_Scale_cadence( L_add( hFdCngCom->sidNoiseEstLp[k], DELTA_FX ), L_add( st->hFdCngDec->partNoiseShape[k], DELTA_FX ), &q_div ); factor = s_min( add( hStereoDft->scale_fx, extract_l( Mpy_32_16_1( L_mult( sub( extract_h( factor ), hStereoDft->scale_fx ), hStereoCng->xfade_frame_counter ), ONE_BY_MAX_K ) ) ), extract_h( factor ) ); FOR( ; j <= hFdCngCom->part[k]; j++ ) { @@ -1208,7 +1257,7 @@ static void stereo_dft_generate_comfort_noise_fx( FOR( k = 0; k < STEREO_DFT_NBDIV; k++ ) { ptr_level = hFdCngCom->cngNoiseLevel; - ptr_r = DFT[chan] + hFdCngCom->startBand + k * STEREO_DFT32MS_N_MAX; + ptr_r = DFT[chan] + add( hFdCngCom->startBand, i_mult( k, STEREO_DFT32MS_N_MAX ) ); ptr_i = ptr_r + 1; q_cngNoiseLevel = sub( Q31, hFdCngCom->cngNoiseLevelExp ); FOR( i = 0; i < shr( sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), 1 ); i++ ) @@ -1222,6 +1271,7 @@ static void stereo_dft_generate_comfort_noise_fx( q_sqrt = sub( Q31, q_cngNoiseLevel ); tmp = Sqrt32( tmp, &q_sqrt ); *( ptr_r ) = imult3216( Mpy_32_32( *( ptr_r ), tmp ), scale ); + move32(); ( *ptr_r ) = L_shl( ( *ptr_r ), q_sqrt ); move32(); ptr_r += 2; @@ -1231,8 +1281,8 @@ static void stereo_dft_generate_comfort_noise_fx( move32(); ptr_i += 2; } - ptr_level = hFdCngCom->cngNoiseLevel + hFdCngCom->stopFFTbin - hFdCngCom->startBand; - ptr_r = DFT[chan] + hFdCngCom->stopFFTbin + k * STEREO_DFT32MS_N_MAX; + ptr_level = hFdCngCom->cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); + ptr_r = DFT[chan] + add( hFdCngCom->stopFFTbin, i_mult( k, STEREO_DFT32MS_N_MAX ) ); ptr_i = ptr_r + 1; FOR( j = hFdCngCom->numCoreBands; j < hFdCngCom->regularStopBand; j++ ) { @@ -1264,9 +1314,10 @@ static void stereo_dft_generate_comfort_noise_fx( } } - IF( hStereoCng->last_act_element_mode == IVAS_CPE_TD && chan > 0 ) + test(); + IF( EQ_16( hStereoCng->last_act_element_mode, IVAS_CPE_TD ) && ( chan > 0 ) ) { - Word32 log_lp_noise = L_add( L_shl( hFdCngCom->cngNoiseLevelExp, Q25 ), BASOP_Util_Log2( lp_noise + DELTA_FX ) ); + Word32 log_lp_noise = L_add( L_shl( hFdCngCom->cngNoiseLevelExp, Q25 ), BASOP_Util_Log2( L_add( lp_noise, DELTA_FX ) ) ); // log10(x) is computed as log2(x) * log10(2) // log_lp_noise at this stage is in Q25. where as the structure value is in Q23 // Hence the 16-bit constant log10(2) will be stored in Q13 @@ -1274,11 +1325,11 @@ static void stereo_dft_generate_comfort_noise_fx( st1->lp_noise = L_add( Mpy_32_16_1( st1->lp_noise, 29491 /* 0.9f in Q15 */ ), log_lp_noise ); move32(); } - ELSE IF( EQ_16( chan, 0 ) ) + ELSE IF( ( chan == 0 ) ) { Word16 q_lp_noise = 0; // st->hFdCngDec->q_lp_noise; // to be populated appropriately. - Word32 log_lp_noise = L_add( L_shl( hFdCngCom->cngNoiseLevelExp, Q25 ), BASOP_Util_Log2( lp_noise + DELTA_FX ) ); move16(); + Word32 log_lp_noise = L_add( L_shl( hFdCngCom->cngNoiseLevelExp, Q25 ), BASOP_Util_Log2( L_add( lp_noise, DELTA_FX ) ) ); // log10(x) is computed as log2(x) * log10(2) // log_lp_noise at this stage is in Q25. where as the structure value is in Q23 // Hence the 16-bit constant log10(2) will be stored in Q13 @@ -1287,14 +1338,15 @@ static void stereo_dft_generate_comfort_noise_fx( move32(); st->lp_noise = st->hFdCngDec->lp_noise; move32(); - st->hFdCngDec->hFdCngCom->flag_noisy_speech = (Word16) LT_32( L_shr( L_sub( st->hFdCngDec->lp_speech, st->hFdCngDec->lp_noise ), q_lp_noise ), 28 ); + st->hFdCngDec->hFdCngCom->flag_noisy_speech = extract_l( LT_32( L_shr( L_sub( st->hFdCngDec->lp_speech, st->hFdCngDec->lp_noise ), q_lp_noise ), 28 ) ); move16(); st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx = L_add( Mpy_32_32( Q31_0_99, st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx ), imult3216( Q31_0_01, st->hFdCngDec->hFdCngCom->flag_noisy_speech ) ); move32(); } - IF( EQ_16( chan, 0 ) && LE_32( st->core_brate, SID_2k40 ) ) + test(); + IF( ( chan == 0 ) && LE_32( st->core_brate, SID_2k40 ) ) { Word32 max_smoothed_psd = 0; move32(); @@ -1303,9 +1355,14 @@ static void stereo_dft_generate_comfort_noise_fx( FOR( i = hFdCngCom->startBand; i < hFdCngCom->stopFFTbin; i++ ) { Word16 l_shift_val = sub( st->hFdCngDec->q_smoothed_psd, sub( Q31, hFdCngCom->cngNoiseLevelExp ) ); - move16(); - l_shift_val = max_smoothed_psd == 0 ? 0 : l_shift_val; - ftmp = hFdCngCom->cngNoiseLevel[i - hFdCngCom->startBand]; + + if ( max_smoothed_psd == 0 ) + { + l_shift_val = 0; + move16(); + } + + ftmp = hFdCngCom->cngNoiseLevel[sub( i, hFdCngCom->startBand )]; move32(); IF( !st->hFdCngDec->first_cna_noise_updated ) { @@ -1317,7 +1374,7 @@ static void stereo_dft_generate_comfort_noise_fx( { alpha = (Word16) ( 0x799A ); move16(); - IF( GT_32( st->hFdCngDec->smoothed_psd_fx[i], 0 ) && GT_32( Mpy_32_16_1( ftmp, (Word16) 0x3333 ), L_shr_sat( st->hFdCngDec->smoothed_psd_fx[i], l_shift_val ) ) ) + IF( ( st->hFdCngDec->smoothed_psd_fx[i] > 0 ) && GT_32( Mpy_32_16_1( ftmp, (Word16) 0x3333 ), L_shr_sat( st->hFdCngDec->smoothed_psd_fx[i], l_shift_val ) ) ) { /* prevent abrupt upward update steps */ ftmp = L_add( L_shl( st->hFdCngDec->smoothed_psd_fx[i], 2 ), L_shr( st->hFdCngDec->smoothed_psd_fx[i], 1 ) ); @@ -1338,9 +1395,10 @@ static void stereo_dft_generate_comfort_noise_fx( } /* update msNoiseEst in SID and NO_DATA frames */ - bandcombinepow( &st->hFdCngDec->smoothed_psd_fx[hFdCngCom->startBand], ( Q31 - st->hFdCngDec->q_smoothed_psd ), hFdCngCom->stopFFTbin - hFdCngCom->startBand, st->hFdCngDec->part_shaping, st->hFdCngDec->nFFTpart_shaping, st->hFdCngDec->psize_inv_shaping, st->hFdCngDec->msNoiseEst, &st->hFdCngDec->msNoiseEst_exp ); + bandcombinepow( &st->hFdCngDec->smoothed_psd_fx[hFdCngCom->startBand], sub( Q31, st->hFdCngDec->q_smoothed_psd ), sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), st->hFdCngDec->part_shaping, st->hFdCngDec->nFFTpart_shaping, st->hFdCngDec->psize_inv_shaping, st->hFdCngDec->msNoiseEst, &st->hFdCngDec->msNoiseEst_exp ); Scale_sig32( st->hFdCngDec->msNoiseEst, NPART_SHAPING, sub( st->hFdCngDec->msNoiseEst_exp, 27 ) ); st->hFdCngDec->msNoiseEst_exp = 27; + move16(); st->hFdCngDec->first_cna_noise_updated = 1; move16(); Copy32( st->hFdCngDec->msNoiseEst, st->hFdCngDec->msPeriodog_ST_fx, st->hFdCngDec->nFFTpart_shaping ); @@ -1412,7 +1470,8 @@ void stereo_dtf_cng_fx( { IF( LT_16( hCPE->hStereoCng->nr_dft_frames, CM_INIT ) ) { - hCPE->hStereoCng->nr_dft_frames++; + hCPE->hStereoCng->nr_dft_frames = add( hCPE->hStereoCng->nr_dft_frames, 1 ); + move16(); } IF( LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) @@ -1420,7 +1479,8 @@ void stereo_dtf_cng_fx( test(); IF( LT_16( hCPE->hStereoCng->nr_sid_frames, SID_INIT ) && EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) { - hCPE->hStereoCng->nr_sid_frames++; + hCPE->hStereoCng->nr_sid_frames = add( hCPE->hStereoCng->nr_sid_frames, 1 ); + move16(); } FOR( n = 0; n < CPE_CHANNELS; n++ ) @@ -1459,7 +1519,8 @@ void stereo_cng_dec_update( } IF( LT_16( hCPE->hStereoCng->active_frame_counter, MAX_FRAME_COUNTER ) ) { - hCPE->hStereoCng->active_frame_counter++; + hCPE->hStereoCng->active_frame_counter = add( hCPE->hStereoCng->active_frame_counter, 1 ); + move16(); } } ELSE @@ -1468,14 +1529,15 @@ void stereo_cng_dec_update( move16(); IF( LT_16( hCPE->hStereoCng->xfade_frame_counter, MAX_FRAME_COUNTER ) ) { - hCPE->hStereoCng->xfade_frame_counter++; + hCPE->hStereoCng->xfade_frame_counter = add( hCPE->hStereoCng->xfade_frame_counter, 1 ); + move16(); } } IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { test(); - IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) || EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) + IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) || ( ivas_total_brate == FRAME_NO_DATA ) ) { hCPE->hStereoCng->prev_sid_nodata = 1; move16(); @@ -1512,36 +1574,50 @@ void stereo_cng_compute_PScorr_fx( { Word16 i; Word32 enrP_fx = 0, enrS_fx = 0, dotPS_fx = 0, c_PS_fx; + move32(); + move32(); + move32(); Word32 outputResamp_fx[L_FRAME16k]; Word32 *outputPptr_fx, *outputSptr_fx; Word16 outputPptr_Q = 0, outputSptr_Q = 0; + move16(); + move16(); Word32 tmp1 = 0, tmp2 = 0, tmp3 = 0; + move32(); + move32(); + move32(); IF( GT_16( L_frame_0, L_frame_1 ) ) { outputPptr_fx = output_fx0; L_lerp_fx( output_fx1, outputResamp_fx, L_frame_0, L_frame_1, output_Q ); outputPptr_Q = *output_Q; + move16(); outputSptr_fx = outputResamp_fx; outputSptr_Q = 1; + move16(); } ELSE IF( GT_16( L_frame_1, L_frame_0 ) ) { outputSptr_fx = output_fx1; L_lerp_fx( output_fx0, outputResamp_fx, L_frame_1, L_frame_0, output_Q ); outputSptr_Q = *output_Q; + move16(); outputPptr_fx = outputResamp_fx; outputPptr_Q = 1; + move16(); } ELSE { outputPptr_fx = output_fx0; outputSptr_fx = output_fx1; outputPptr_Q = *output_Q; + move16(); outputSptr_Q = *output_Q; + move16(); } - Word16 guard_bits = (Word16) find_guarded_bits_fx( L_frame_0 ); + Word16 guard_bits = find_guarded_bits_fx( L_frame_0 ); FOR( i = 0; i < L_frame_0; i++ ) { @@ -1553,16 +1629,17 @@ void stereo_cng_compute_PScorr_fx( enrS_fx = L_add( enrS_fx, tmp2 ); tmp3 = Mpy_32_32( *outputPptr_fx++, *outputSptr_fx++ ); // outputSptr_Q + outputPptr_Q - 31 - tmp3 = L_shr( tmp3, guard_bits + 1 ); // outputSptr_Q + outputPptr_Q - 31 - guard_bits + tmp3 = L_shr( tmp3, add( guard_bits, 1 ) ); // outputSptr_Q + outputPptr_Q - 31 - guard_bits dotPS_fx = L_add( dotPS_fx, tmp3 ); } Word32 Var1 = Mpy_32_32( enrP_fx, enrS_fx ); // 2*( outputPptr_Q - 31 - guard_bits + outputSptr_Q - 31 - guard_bits ) - Word16 exp = 31 - ( 2 * ( outputPptr_Q - 31 - guard_bits + outputSptr_Q - 31 - guard_bits ) ); + Word16 exp = sub( 31, shl( add( sub( sub( outputPptr_Q, 31 ), guard_bits ), sub( sub( outputSptr_Q, 31 ), guard_bits ) ), 1 ) ); - IF( Var1 == 0 ) + if ( Var1 == 0 ) { Var1 = 1; + move32(); } Word32 Var2, Var3; @@ -1570,26 +1647,37 @@ void stereo_cng_compute_PScorr_fx( Var3 = L_add( dotPS_fx, 1 ); /*adding one in order to make temp non-zero. q = Q_outputSptr + Q_outputPptr - guard_bits*/ c_PS_fx = Mpy_32_32( Var3, Var2 ); /* outputSptr_Q + outputPptr_Q - guard_bits - exp */ - Word16 c_PS_fx_Q = outputSptr_Q + outputPptr_Q - guard_bits - exp - 31; + Word16 c_PS_fx_Q = add( outputSptr_Q, sub( sub( sub( outputPptr_Q, guard_bits ), exp ), 31 ) ); Word32 a = 0, b = 0; + move32(); + move32(); Word16 a_q = 0, b_q = 0, ab_q = 0; + move16(); + move16(); + move16(); a = Mpy_32_32( c_PS_fx, ONE_MINUS_STEREO_TD_PS_CORR_FILT_Q31 ); // Q(c_PS_fx_Q) a_q = c_PS_fx_Q; + move16(); b = Mpy_32_32( STEREO_TD_PS_CORR_FILT_Q31, *c_PS_LT_fx ); // Q(Q_c_PS_LT_fx) b_q = Q_c_PS_LT_fx; + move16(); IF( GT_16( a_q, b_q ) ) { - ab_q = a_q - b_q; - *c_PS_LT_fx = L_add( L_shr( a, (Word16) ab_q ), b ); + ab_q = sub( a_q, b_q ); + *c_PS_LT_fx = L_add( L_shr( a, ab_q ), b ); + move32(); Q_c_PS_LT_fx = b_q; + move16(); } ELSE IF( LT_16( b_q, a_q ) ) { - ab_q = b_q - a_q; - *c_PS_LT_fx = L_add( a, L_shr( b, (Word16) ab_q ) ); + ab_q = sub( b_q, a_q ); + *c_PS_LT_fx = L_add( a, L_shr( b, ab_q ) ); + move32(); Q_c_PS_LT_fx = a_q; + move16(); } return; @@ -1700,8 +1788,8 @@ static void stereo_cng_compute_LRcorr( static void stereo_cng_compute_LRcorr_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ Word32 *output_fx[CPE_CHANNELS], /* i : Output signal */ - const int16_t output_frame, /* i : Output frame length */ - const int16_t tdm_ratio_idx /* i : TDM ratio index */ + const Word16 output_frame, /* i : Output frame length */ + const Word16 tdm_ratio_idx /* i : TDM ratio index */ ) { Word16 i; @@ -1723,139 +1811,169 @@ static void stereo_cng_compute_LRcorr_fx( beta_fx = tdm_ratio_tabl_fx[tdm_ratio_idx]; enrL_fx = 0; + move64(); enrR_fx = 0; + move64(); dotLR_fx = 0; + move64(); FOR( i = 0; i < output_frame; i++ ) { - - enrL_fx += ( (Word64) output_fx[0][i] ) * ( output_fx[0][i] ); - enrR_fx += ( (Word64) output_fx[1][i] ) * ( output_fx[1][i] ); - dotLR_fx += ( ( (Word64) output_fx[0][i] ) * ( output_fx[1][i] ) ); + enrL_fx = W_add( enrL_fx, W_mult0_32_32( output_fx[0][i], output_fx[0][i] ) ); + enrR_fx = W_add( enrR_fx, W_mult0_32_32( output_fx[1][i], output_fx[1][i] ) ); + dotLR_fx = W_add( dotLR_fx, W_mult0_32_32( output_fx[0][i], output_fx[1][i] ) ); } - dotLR_fx = dotLR_fx + EPSILON_FX_SMALL; - IF( dotLR_fx < 0 ) + dotLR_fx = W_add( dotLR_fx, EPSILON_FX_SMALL ); + if ( dotLR_fx < 0 ) { dotLR_fx = W_neg( dotLR_fx ); } - enrL_fx = enrL_fx + EPSILON_FX_SMALL; - enrR_fx = enrR_fx + EPSILON_FX_SMALL; + enrL_fx = W_add( enrL_fx, EPSILON_FX_SMALL ); + enrR_fx = W_add( enrR_fx, EPSILON_FX_SMALL ); headroom_left_enrL = W_norm( enrL_fx ); headroom_left_enrR = W_norm( enrR_fx ); { - IF( headroom_left_enrL < 32 ) + IF( LT_16( headroom_left_enrL, 32 ) ) { - enrL_fx = W_shr( enrL_fx, ( 32 - headroom_left_enrL ) ); - enrL_q = ( 31 - ( ( 2 * OUTPUT_Q ) - ( 32 - headroom_left_enrL ) ) ); + enrL_fx = W_shr( enrL_fx, sub( 32, headroom_left_enrL ) ); + enrL_q = sub( 31, sub( ( 2 * OUTPUT_Q ), sub( 32, headroom_left_enrL ) ) ); } ELSE { - enrL_q = 31 - ( 2 * OUTPUT_Q ); + enrL_q = sub( 31, ( 2 * OUTPUT_Q ) ); } - IF( headroom_left_enrR < 32 ) + IF( LT_16( headroom_left_enrR, 32 ) ) { - enrR_fx = W_shr( enrR_fx, ( 32 - headroom_left_enrR ) ); - enrR_q = ( 31 - ( ( 2 * OUTPUT_Q ) - ( 32 - headroom_left_enrR ) ) ); + enrR_fx = W_shr( enrR_fx, sub( 32, headroom_left_enrR ) ); + enrR_q = sub( 31, sub( ( 2 * OUTPUT_Q ), sub( 32, headroom_left_enrR ) ) ); } ELSE { - enrR_q = 31 - ( 2 * OUTPUT_Q ); + enrR_q = sub( 31, ( 2 * OUTPUT_Q ) ); } enrL_inv_q = enrL_q; + move16(); enrR_inv_q = enrR_q; + move16(); - temp_x_inv = ISqrt32( (Word32) enrL_fx, &enrL_inv_q ); - temp_y_inv = ISqrt32( (Word32) enrR_fx, &enrR_inv_q ); + temp_x_inv = ISqrt32( W_extract_l( enrL_fx ), &enrL_inv_q ); + temp_y_inv = ISqrt32( W_extract_l( enrR_fx ), &enrR_inv_q ); energy_xy_fx = Mpy_32_32( temp_x_inv, temp_y_inv ); - res_q = enrL_inv_q + enrR_inv_q; + res_q = add( enrL_inv_q, enrR_inv_q ); headroom_left_dotLR = W_norm( dotLR_fx ); dotLR_q = OUTPUT_Q * 2; - IF( headroom_left_dotLR < 32 ) + move16(); + IF( LT_16( headroom_left_dotLR, 32 ) ) { - dotLR_fx = W_shr( dotLR_fx, 32 - headroom_left_dotLR ); - dotLR_q = dotLR_q - ( 32 - headroom_left_dotLR ); + dotLR_fx = W_shr( dotLR_fx, sub( 32, headroom_left_dotLR ) ); + dotLR_q = sub( dotLR_q, sub( 32, headroom_left_dotLR ) ); } - dotLR_fx = Mpy_32_32( (Word32) dotLR_fx, energy_xy_fx ); - dotLR_q = dotLR_q + ( 31 - res_q ) - 31; - dotLR_fx = W_shl( dotLR_fx, 31 - dotLR_q ); + dotLR_fx = Mpy_32_32( W_extract_l( dotLR_fx ), energy_xy_fx ); + dotLR_q = add( dotLR_q, sub( sub( 31, res_q ), 31 ) ); + dotLR_fx = W_shl( dotLR_fx, sub( 31, dotLR_q ) ); } - c_LR_fx = extract_h( (Word32) dotLR_fx ); + c_LR_fx = extract_h( W_extract_l( dotLR_fx ) ); Word16 div_q = 0; - c_fx = BASOP_Util_Divide3232_Scale( (Word32) enrL_fx, (Word32) enrR_fx, &div_q ); - c_q = 15 - div_q + ( enrR_q - enrL_q ); + move16(); + c_fx = BASOP_Util_Divide3232_Scale( W_extract_l( enrL_fx ), W_extract_l( enrR_fx ), &div_q ); + c_q = add( sub( 15, div_q ), sub( enrR_q, enrL_q ) ); hCPE->hStereoTD->c_LR_LT_fx = L_add( Mpy_32_32( STEREO_TD_PS_CORR_FILT_FX, hCPE->hStereoTD->c_LR_LT_fx ), - Mpy_32_32( L_sub( ONE_IN_Q31, STEREO_TD_PS_CORR_FILT_FX ), L_deposit_h( (Word16) c_LR_fx ) ) ); + Mpy_32_32( L_sub( ONE_IN_Q31, STEREO_TD_PS_CORR_FILT_FX ), L_deposit_h( extract_l( c_LR_fx ) ) ) ); + move32(); hCPE->hStereoCng->c_LR_LT_fx = hCPE->hStereoTD->c_LR_LT_fx; + move32(); - Word16 sqrt_q = 31 - c_q; + Word16 sqrt_q = sub( 31, c_q ); Word32 sqrt_res = Sqrt32( c_fx, &sqrt_q ); tmp_fx = Mpy_32_32( beta_fx, L_sub( ONE_IN_Q31, beta_fx ) ); tmp_fx = Mpy_32_32( tmp_fx, hCPE->hStereoTD->c_LR_LT_fx ); tmp_fx = Mpy_32_32( tmp_fx, sqrt_res ); - Word16 tmp_q = ( 31 - sqrt_q ) - 1; // *2 handled with q reduction + Word16 tmp_q = sub( sub( 31, sqrt_q ), 1 ); // *2 handled with q reduction beta_sqr = Mpy_32_32( beta_fx, beta_fx ); one_minus_beta_sqr = Mpy_32_32( L_sub( ONE_IN_Q31, beta_fx ), L_sub( ONE_IN_Q31, beta_fx ) ); - numer_1 = Mpy_32_16_1( one_minus_beta_sqr, (Word16) c_fx ); // c_q+31-15 - numer_1_q = c_q + 31 - 15; + numer_1 = Mpy_32_16_1( one_minus_beta_sqr, extract_l( c_fx ) ); // c_q+31-15 + numer_1_q = add( c_q, 31 - 15 ); numer_2 = beta_sqr; // 31 + move32(); numer_2_q = 31; + move16(); numer_3 = tmp_fx; // tmp_q + move32(); numer_3_q = tmp_q; + move16(); num_q = 31; - num_q = num_q < numer_1_q ? num_q : numer_1_q; - num_q = num_q < numer_2_q ? num_q : numer_2_q; - num_q = num_q < numer_3_q ? num_q : numer_3_q; + move16(); + + num_q = s_min( num_q, numer_1_q ); + num_q = s_min( num_q, numer_2_q ); - denom_1 = Mpy_32_16_1( beta_sqr, (Word16) c_fx ); // c_q+31-15; - denom_1_q = c_q + 31 - 15; + num_q = s_min( num_q, numer_3_q ); + + denom_1 = Mpy_32_16_1( beta_sqr, extract_l( c_fx ) ); // c_q+31-15; + denom_1_q = add( c_q, 31 - 15 ); denom_2 = one_minus_beta_sqr; // 31 + move32(); denom_2_q = 31; + move16(); denom_3 = tmp_fx; // tmp_q + move32(); denom_3_q = tmp_q; + move16(); denom_q = 31; - denom_q = denom_q < denom_1_q ? denom_q : denom_1_q; - denom_q = denom_q < denom_2_q ? denom_q : denom_2_q; - denom_q = denom_q < denom_3_q ? denom_q : denom_3_q; + move16(); + + denom_q = s_min( denom_q, denom_1_q ); + + denom_q = s_min( denom_q, denom_2_q ); - num = L_add( L_shr( numer_1, numer_1_q - num_q ), L_sub( L_shr( numer_2, numer_2_q - num_q ), L_shr( numer_3, numer_3_q - num_q ) ) ) + DELTA_FX; - denom = L_add( L_shr( denom_1, denom_1_q - denom_q ), L_add( L_shr( denom_2, denom_2_q - denom_q ), L_shr( denom_3, denom_3_q - denom_q ) ) ) + DELTA_FX; + denom_q = s_min( denom_q, denom_3_q ); + + num = L_add( L_add( L_shr( numer_1, sub( numer_1_q, num_q ) ), L_sub( L_shr( numer_2, sub( numer_2_q, num_q ) ), L_shr( numer_3, sub( numer_3_q, num_q ) ) ) ), DELTA_FX ); + denom = L_add( L_add( L_shr( denom_1, sub( denom_1_q, denom_q ) ), L_add( L_shr( denom_2, sub( denom_2_q, denom_q ) ), L_shr( denom_3, sub( denom_3_q, denom_q ) ) ) ), DELTA_FX ); Word16 q = 0; + move16(); sc_fx = BASOP_Util_Divide3232_Scale( num, denom, &q ); - sc_q = 15 - ( num_q - denom_q ) - q; + sc_q = sub( sub( 15, sub( num_q, denom_q ) ), q ); Word32 sc_thr = L_shr( sc_fx, sc_q ); - IF( sc_thr > 4 ) + IF( GT_32( sc_thr, 4 ) ) { sc_fx = MAX_WORD16; + move32(); } ELSE { - sc_fx = L_shr( sc_fx, sc_q - 13 ); + sc_fx = L_shr( sc_fx, sub( sc_q, 13 ) ); } sqrt_q = 2; + move16(); sqrt_res = Sqrt32( L_shl_sat( sc_fx, 16 ), &sqrt_q ); IF( sqrt_q < 0 ) { - sqrt_res = L_shr( sqrt_res, -1 * sqrt_q ); + sqrt_res = L_shr( sqrt_res, ( -sqrt_q ) ); sqrt_q = 0; + move16(); } hCPE->hStereoTD->SP_ratio_LT_fx = L_add_sat( Mpy_32_32( 1932735283, hCPE->hStereoTD->SP_ratio_LT_fx ), L_shl_sat( Mpy_32_32( 214748364, sqrt_res ), sqrt_q ) ); + move32(); - IF( hCPE->hStereoCng->nr_corr_frames < CM_INIT ) + IF( LT_16( hCPE->hStereoCng->nr_corr_frames, CM_INIT ) ) { - hCPE->hStereoCng->nr_corr_frames++; + hCPE->hStereoCng->nr_corr_frames = add( hCPE->hStereoCng->nr_corr_frames, 1 ); + move16(); } hCPE->hStereoCng->nr_dft_frames = 0; + move16(); return; } @@ -1916,51 +2034,58 @@ static void FindEmEs_fx( Word16 headroom_left_ener_fx, headroom_left_ener_side_fx; Word16 ener_q, ener_side_q; ener_fx = 1; + move64(); ener_side_fx = 1; + move64(); Word32 square_res, log_res, division_res; Word16 temp_q = 0; - for ( i = 0; i < len; i++ ) + move16(); + FOR( i = 0; i < len; i++ ) { mono_i_fx = L_add( L_shr( ch1_fx[i], 1 ), L_shr( ch2_fx[i], 1 ) ); - ener_fx = W_add( ener_fx, ( (Word64) mono_i_fx * mono_i_fx ) ); + ener_fx = W_add( ener_fx, W_mult0_32_32( mono_i_fx, mono_i_fx ) ); side_i_fx = L_sub( L_shr( ch1_fx[i], 1 ), L_shr( ch2_fx[i], 1 ) ); - ener_side_fx = W_add( ener_side_fx, ( (Word64) side_i_fx * side_i_fx ) ); + ener_side_fx = W_add( ener_side_fx, W_mult0_32_32( side_i_fx, side_i_fx ) ); } headroom_left_ener_fx = W_norm( ener_fx ); headroom_left_ener_side_fx = W_norm( ener_side_fx ); - IF( headroom_left_ener_fx < 32 ) + IF( LT_16( headroom_left_ener_fx, 32 ) ) { - ener_fx = W_shr( ener_fx, ( 32 - headroom_left_ener_fx ) ); - ener_q = ( ( 2 * OUTPUT_Q ) - ( 32 - headroom_left_ener_fx ) ); + ener_fx = W_shr( ener_fx, sub( 32, headroom_left_ener_fx ) ); + ener_q = sub( ( 2 * OUTPUT_Q ), sub( 32, headroom_left_ener_fx ) ); } ELSE { ener_q = ( 2 * OUTPUT_Q ); + move16(); } - IF( headroom_left_ener_side_fx < 32 ) + IF( LT_16( headroom_left_ener_side_fx, 32 ) ) { - ener_side_fx = W_shr( ener_side_fx, ( 32 - headroom_left_ener_side_fx ) ); - ener_side_q = ( ( 2 * OUTPUT_Q ) - ( 32 - headroom_left_ener_side_fx ) ); + ener_side_fx = W_shr( ener_side_fx, sub( 32, headroom_left_ener_side_fx ) ); + ener_side_q = sub( ( 2 * OUTPUT_Q ), sub( 32, headroom_left_ener_side_fx ) ); } ELSE { ener_side_q = ( 2 * OUTPUT_Q ); + move16(); } /**es_em = 10 * ( log10( sqrt( ener_side / len ) ) - log10( sqrt( ener / len ) ) ); */ - division_res = BASOP_Util_Divide3232_Scale( (Word32) ener_side_fx, (Word32) ener_fx, &temp_q ); - temp_q = temp_q - ( ener_side_q - ener_q ); - square_res = Sqrt32( L_deposit_h( (Word16) division_res ), &temp_q ); + division_res = BASOP_Util_Divide3232_Scale( W_extract_l( ener_side_fx ), W_extract_l( ener_fx ), &temp_q ); + temp_q = sub( temp_q, sub( ener_side_q, ener_q ) ); + square_res = Sqrt32( L_deposit_h( extract_l( division_res ) ), &temp_q ); IF( temp_q < 0 ) { - square_res = L_shr( square_res, -1 * temp_q ); + square_res = L_shr( square_res, ( -temp_q ) ); temp_q = 0; + move16(); } log_res = BASOP_Util_Log2( square_res ); es_em_fx = Mpy_32_32( log_res, 1616107501 ); // 25+30 /* long-term estimate */ *lt_es_em_fx = L_add( Mpy_32_32( 858993459, *lt_es_em_fx ), Mpy_32_32( 1288490188, es_em_fx ) ); + move32(); return; } #endif @@ -2086,11 +2211,11 @@ void stereo_cna_update_params( void stereo_cna_update_params_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ Word32 *output_fx[CPE_CHANNELS], /* i : Output signal */ - const int16_t output_frame, /* i : Output frame length */ - const int16_t tdm_ratio_idx /* i : TDM ratio index */ + const Word16 output_frame, /* i : Output frame length */ + const Word16 tdm_ratio_idx /* i : TDM ratio index */ ) { - int16_t i; + Word16 i; Word64 enrL_fx, enrR_fx, dotLR_fx; Word32 c_fx, c_LR_fx, c_ILD_fx; Decoder_State **sts; @@ -2113,110 +2238,124 @@ void stereo_cna_update_params_fx( ///// - if ( hCPE->element_mode == IVAS_CPE_DFT ) + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { - if ( hCPE->nchan_out > 1 ) + IF( GT_16( hCPE->nchan_out, 1 ) ) { FindEmEs_fx( output_fx[0], output_fx[1], output_frame, &hCPE->lt_es_em_fx ); } - else + ELSE { hCPE->lt_es_em_fx = 0; + move32(); } } - else if ( hCPE->element_mode == IVAS_CPE_TD ) + ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) { FindEmEs_fx( output_fx[0], output_fx[1], output_frame, &hCPE->lt_es_em_fx ); hCPE->hStereoCng->first_SID_after_TD = 1; + move16(); stereo_cng_compute_LRcorr_fx( hCPE, output_fx, output_frame, tdm_ratio_idx ); } - else + ELSE { return; } enrL_fx = 0; + move64(); enrR_fx = 0; + move64(); dotLR_fx = 0; + move64(); - - if ( hCPE->element_mode == IVAS_CPE_TD || ( hCPE->element_mode == IVAS_CPE_DFT && sts[0]->core_brate > SID_2k40 && sts[0]->VAD == 0 ) ) + test(); + test(); + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) || ( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && GT_32( sts[0]->core_brate, SID_2k40 ) && ( sts[0]->VAD == 0 ) ) ) { - if ( hCPE->nchan_out == 1 ) + IF( EQ_16( hCPE->nchan_out, 1 ) ) { c_LR_fx = MAX_WORD16; + move32(); c_ILD_fx = 0; + move32(); } - else + ELSE { FOR( i = 0; i < output_frame; i++ ) { - - enrL_fx += ( (Word64) output_fx[0][i] ) * ( output_fx[0][i] ); - enrR_fx += ( (Word64) output_fx[1][i] ) * ( output_fx[1][i] ); - dotLR_fx += ( ( (Word64) output_fx[0][i] ) * ( output_fx[1][i] ) ); + enrL_fx = W_add( enrL_fx, W_mult0_32_32( output_fx[0][i], output_fx[0][i] ) ); + enrR_fx = W_add( enrR_fx, W_mult0_32_32( output_fx[1][i], output_fx[1][i] ) ); + dotLR_fx = W_add( dotLR_fx, W_mult0_32_32( output_fx[0][i], output_fx[1][i] ) ); } - dotLR_fx = dotLR_fx + EPSILON_FX_SMALL; + dotLR_fx = W_add( dotLR_fx, EPSILON_FX_SMALL ); if ( dotLR_fx < 0 ) { dotLR_fx = W_neg( dotLR_fx ); } - enrL_fx = enrL_fx + EPSILON_FX_SMALL; - enrR_fx = enrR_fx + EPSILON_FX_SMALL; + enrL_fx = W_add( enrL_fx, EPSILON_FX_SMALL ); + enrR_fx = W_add( enrR_fx, EPSILON_FX_SMALL ); headroom_left_x = W_norm( enrL_fx ); headroom_left_y = W_norm( enrR_fx ); - IF( headroom_left_x < 32 ) + IF( LT_16( headroom_left_x, 32 ) ) { - enrL_fx = W_shr( enrL_fx, ( 32 - headroom_left_x ) ); - x_q = ( 31 - ( ( 2 * OUTPUT_Q ) - ( 32 - headroom_left_x ) ) ); + enrL_fx = W_shr( enrL_fx, sub( 32, headroom_left_x ) ); + x_q = sub( 31, sub( ( 2 * OUTPUT_Q ), sub( 32, headroom_left_x ) ) ); } ELSE { - x_q = 31 - ( 2 * OUTPUT_Q ); + x_q = sub( 31, ( 2 * OUTPUT_Q ) ); } - IF( headroom_left_y < 32 ) + IF( LT_16( headroom_left_y, 32 ) ) { - enrR_fx = W_shr( enrR_fx, ( 32 - headroom_left_y ) ); - y_q = ( 31 - ( ( 2 * OUTPUT_Q ) - ( 32 - headroom_left_y ) ) ); + enrR_fx = W_shr( enrR_fx, sub( 32, headroom_left_y ) ); + y_q = sub( 31, sub( ( 2 * OUTPUT_Q ), sub( 32, headroom_left_y ) ) ); } ELSE { - y_q = 31 - ( 2 * OUTPUT_Q ); + y_q = sub( 31, ( 2 * OUTPUT_Q ) ); } x_inv_q = x_q; + move16(); y_inv_q = y_q; + move16(); - temp_x_inv = ISqrt32( (Word32) enrL_fx, &x_inv_q ); - temp_y_inv = ISqrt32( (Word32) enrR_fx, &y_inv_q ); + temp_x_inv = ISqrt32( W_extract_l( enrL_fx ), &x_inv_q ); + temp_y_inv = ISqrt32( W_extract_l( enrR_fx ), &y_inv_q ); energy_xy_fx = Mpy_32_32( temp_x_inv, temp_y_inv ); - temp_res_q = x_inv_q + y_inv_q; + temp_res_q = add( x_inv_q, y_inv_q ); headroom_left_dotLR_fx = W_norm( dotLR_fx ); dotLR_fx_q = OUTPUT_Q * 2; - IF( headroom_left_dotLR_fx < 32 ) + move16(); + IF( LT_16( headroom_left_dotLR_fx, 32 ) ) { - dotLR_fx = W_shr( dotLR_fx, 32 - headroom_left_dotLR_fx ); - dotLR_fx_q = dotLR_fx_q - ( 32 - headroom_left_dotLR_fx ); + dotLR_fx = W_shr( dotLR_fx, sub( 32, headroom_left_dotLR_fx ) ); + dotLR_fx_q = sub( dotLR_fx_q, sub( 32, headroom_left_dotLR_fx ) ); } - dotLR_fx = Mpy_32_32( (Word32) dotLR_fx, energy_xy_fx ); - dotLR_fx_q = dotLR_fx_q + ( 31 - temp_res_q ) - 31; - dotLR_fx = (Word64) L_shl_sat( (Word32) dotLR_fx, 31 - dotLR_fx_q ); + dotLR_fx = Mpy_32_32( W_extract_l( dotLR_fx ), energy_xy_fx ); + dotLR_fx_q = add( dotLR_fx_q, sub( sub( 31, temp_res_q ), 31 ) ); + dotLR_fx = W_deposit32_l( L_shl_sat( W_extract_l( dotLR_fx ), sub( 31, dotLR_fx_q ) ) ); /* estimate L/R correlation factor and ILD in time domain */ - c_LR_fx = extract_h( (Word32) dotLR_fx ); + c_LR_fx = extract_h( W_extract_l( dotLR_fx ) ); temp_res_q = 0; - c_fx = BASOP_Util_Divide3232_Scale( (Word32) enrL_fx, (Word32) enrR_fx, &temp_res_q ); - c_q = 15 - temp_res_q + ( y_q - x_q ); + move16(); + c_fx = BASOP_Util_Divide3232_Scale( W_extract_l( enrL_fx ), W_extract_l( enrR_fx ), &temp_res_q ); + c_q = add( sub( 15, temp_res_q ), sub( y_q, x_q ) ); Word32 one_in_c_q; IF( GT_16( c_q, 31 ) ) { c_q = 31; - c_fx = L_shr_sat( c_fx, c_q - 31 ); + move16(); + c_fx = L_shr_sat( c_fx, sub( c_q, 31 ) ); one_in_c_q = ONE_IN_Q31; + move32(); } ELSE { @@ -2227,28 +2366,34 @@ void stereo_cna_update_params_fx( Word32 denom_c_fx = L_add_sat( c_fx, one_in_c_q ); Word16 num_c_headroom = norm_l( L_sub_sat( c_fx, one_in_c_q ) ); Word16 denom_c_headroom = norm_l( L_add_sat( c_fx, one_in_c_q ) ); - Word16 min_headroom_left = num_c_headroom < denom_c_headroom ? num_c_headroom : denom_c_headroom; + Word16 min_headroom_left = s_min( num_c_headroom, denom_c_headroom ); + move16(); temp_res_q = 0; + move16(); c_ILD_fx = BASOP_Util_Divide3232_Scale( L_shl_sat( num_c_fx, min_headroom_left ), L_shl_sat( denom_c_fx, min_headroom_left ), &temp_res_q ); - if ( temp_res_q < 0 ) + IF( temp_res_q < 0 ) { - c_ILD_fx = L_shr( c_ILD_fx, -1 * temp_res_q ); + c_ILD_fx = L_shr( c_ILD_fx, negate( temp_res_q ) ); } } /* update of long-term ILD and LR correlation factors for stereo CNA */ - if ( !hFdCngDec->first_cna_noise_updated ) + IF( !hFdCngDec->first_cna_noise_updated ) { - hFdCngDec->cna_LR_LT_fx = (Word16) c_LR_fx; - hFdCngDec->cna_ILD_LT_fx = (Word16) c_ILD_fx; + hFdCngDec->cna_LR_LT_fx = extract_l( c_LR_fx ); + move16(); + hFdCngDec->cna_ILD_LT_fx = extract_l( c_ILD_fx ); + move16(); } - else + ELSE { hFdCngDec->cna_LR_LT_fx = extract_h( L_add_sat( Mpy_32_16_1( STEREO_CNA_LR_CORR_LT_FILT_FX, hFdCngDec->cna_LR_LT_fx ), - Mpy_32_16_1( L_sub( ONE_IN_Q31, STEREO_CNA_LR_CORR_LT_FILT_FX ), (Word16) c_LR_fx ) ) ); + Mpy_32_16_1( L_sub( ONE_IN_Q31, STEREO_CNA_LR_CORR_LT_FILT_FX ), extract_l( c_LR_fx ) ) ) ); + move16(); hFdCngDec->cna_ILD_LT_fx = extract_h( L_add_sat( Mpy_32_16_1( STEREO_CNA_ILD_LT_FILT_FX, hFdCngDec->cna_ILD_LT_fx ), - Mpy_32_16_1( L_sub( ONE_IN_Q31, STEREO_CNA_ILD_LT_FILT_FX ), (Word16) c_ILD_fx ) ) ); + Mpy_32_16_1( L_sub( ONE_IN_Q31, STEREO_CNA_ILD_LT_FILT_FX ), extract_l( c_ILD_fx ) ) ) ); + move16(); } set16_fx( hFdCngDec->cna_g_state_fx, hFdCngDec->cna_ILD_LT_fx, hFdCngDec->cna_nbands ); @@ -2257,33 +2402,37 @@ void stereo_cna_update_params_fx( /* Soft VAD for stereo CNA */ - if ( hCPE->element_mode == IVAS_CPE_TD || hCPE->element_mode == IVAS_CPE_DFT ) + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) || EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { - if ( !hFdCngDec->first_cna_noise_updated ) + IF( !hFdCngDec->first_cna_noise_updated ) { hFdCngDec->cna_act_fact_fx = 0; + move16(); } - else + ELSE { - if ( hCPE->element_mode == IVAS_CPE_TD ) + IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) { /* quickly decrease in TD stereo mode */ hFdCngDec->cna_act_fact_fx = extract_h( Mpy_32_16_1( 1503238553, hFdCngDec->cna_act_fact_fx ) ); + move16(); } - else if ( ( sts[0]->VAD * MAX_WORD16 ) > hFdCngDec->cna_act_fact_fx ) // VAD is one bit + ELSE IF( GT_32( L_mult0( sts[0]->VAD, MAX_WORD16 ), hFdCngDec->cna_act_fact_fx ) ) // VAD is one bit { /* quickly increase during active frames in DFT stereo mode */ - hFdCngDec->cna_act_fact_fx = extract_h( Mpy_32_16_1( 1503238553, hFdCngDec->cna_act_fact_fx ) + ( 644245094 * sts[0]->VAD ) ); + hFdCngDec->cna_act_fact_fx = extract_h( L_add( Mpy_32_16_1( 1503238553, hFdCngDec->cna_act_fact_fx ), ( 644245094 * sts[0]->VAD ) ) ); + move16(); } - else + ELSE { /* slowly decrease during inactive frames in DFT stereo mode */ - hFdCngDec->cna_act_fact_fx = extract_h( Mpy_32_16_1( 2040109440, hFdCngDec->cna_act_fact_fx ) + ( 107374184 * sts[0]->VAD ) ); + hFdCngDec->cna_act_fact_fx = extract_h( L_add( Mpy_32_16_1( 2040109440, hFdCngDec->cna_act_fact_fx ), ( 107374184 * sts[0]->VAD ) ) ); + move16(); } } } - return; } #endif @@ -2355,8 +2504,8 @@ void stereo_cng_init_dec_fx( hStereoCng->enableSecCNA = 0; move16(); hStereoCng->c_PS_LT_fx = 16384; /* 0.5 in Q15 */ - hStereoCng->frameSize = frameSize; move16(); + hStereoCng->frameSize = frameSize; hStereoCng->last_act_element_mode = IVAS_CPE_DFT; move16(); diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index daa92a594..c9bf60ddf 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -695,20 +695,21 @@ void stereo_dft_dec_analyze_fx( * Initialization *-----------------------------------------------------------------*/ - IF( input_frame == output_frame ) + IF( EQ_16( input_frame, output_frame ) ) { trigo_fx = hStereoDft->dft_trigo_fx; - trigo_step = hStereoDft->dft_trigo_step * STEREO_DFT_TRIGO_DEC_STEP; + trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); win_right_fx = hStereoDft->win32ms_fx; win_left_fx = hStereoDft->win32ms_fx; win2_fx = hStereoDft->win232ms_fx; - IF( ana_type == DFT_STEREO_DEC_ANA_BPF ) + test(); + IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) { assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" ); mem_fx = hCPE->input_mem_BPF_fx[chan]; } - ELSE IF( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD ) + ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) ) { mem_fx = hCPE->input_mem_LB_fx[chan]; } @@ -717,20 +718,22 @@ void stereo_dft_dec_analyze_fx( mem_fx = hCPE->input_mem_fx[chan]; } } - ELSE IF( input_frame == L_FRAME ) + ELSE IF( EQ_16( input_frame, L_FRAME ) ) { trigo_fx = hStereoDft->dft_trigo_12k8_fx; trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP * STEREO_DFT_TRIGO_DEC_STEP; + move16(); win_right_fx = hStereoDft->win32ms_12k8_fx; win_left_fx = hStereoDft->win32ms_12k8_fx; win2_fx = hStereoDft->win232ms_12k8_fx; - IF( ana_type == DFT_STEREO_DEC_ANA_BPF ) + test(); + IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) { assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" ); mem_fx = hCPE->input_mem_BPF_fx[chan]; } - ELSE IF( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD ) + ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) ) { mem_fx = hCPE->input_mem_LB_fx[chan]; } @@ -740,34 +743,37 @@ void stereo_dft_dec_analyze_fx( mem_fx = hCPE->input_mem_fx[chan]; } } - ELSE IF( input_frame == L_FRAME16k ) + ELSE IF( EQ_16( input_frame, L_FRAME16k ) ) { trigo_fx = hStereoDft->dft_trigo_16k_fx; trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP; + move16(); win_right_fx = hStereoDft->win32ms_16k_fx; win_left_fx = hStereoDft->win32ms_16k_fx; win2_fx = hStereoDft->win232ms_16k_fx; - IF( ana_type == DFT_STEREO_DEC_ANA_BPF ) + test(); + IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) { assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" ); mem_fx = hCPE->input_mem_BPF_fx[chan]; } - ELSE IF( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD ) + ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) ) { mem_fx = hCPE->input_mem_LB_fx[chan]; } ELSE { - assert( ( chan == 1 ) && hCPE->hStereoDft->hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF && "16kHz sampling rate only FOR second channel with allpass signal" ); + assert( ( chan == 1 ) && ( hCPE->hStereoDft->hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF ) && "16kHz sampling rate only FOR second channel with allpass signal" ); mem_fx = hCPE->input_mem_fx[chan]; } } - ELSE IF( input_frame == L_FRAME8k ) + ELSE IF( EQ_16( input_frame, L_FRAME8k ) ) { assert( ( chan == 1 ) && "DFT stereo: 8kHz analysis only FOR residual coding" ); trigo_fx = hStereoDft->dft_trigo_8k_fx; trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP * STEREO_DFT_TRIGO_DEC_STEP; + move16(); win_right_fx = hStereoDft->win32ms_8k_fx; win_left_fx = hStereoDft->win32ms_8k_fx; win2_fx = hStereoDft->win232ms_8k_fx; @@ -776,27 +782,32 @@ void stereo_dft_dec_analyze_fx( ELSE { IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error in DFT stereo: sampling rate not supported" ); - mem_fx = NULL; /* to avoid compilation warning */ - trigo_fx = NULL; /* to avoid compilation warning */ - trigo_step = -1; /* to avoid compilation warning */ + mem_fx = NULL; /* to avoid compilation warning */ + trigo_fx = NULL; /* to avoid compilation warning */ + trigo_step = -1; /* to avoid compilation warning */ + move16(); win_right_fx = NULL; /* to avoid compilation warning */ win_left_fx = NULL; /* to avoid compilation warning */ win2_fx = NULL; /* to avoid compilation warning */ } - inputFs = input_frame * FRAMES_PER_SEC; + inputFs = L_mult0( input_frame, FRAMES_PER_SEC ); delay_dec = NS2SA( inputFs, STEREO_DFT32MS_OVL_NS ); + move16(); zp = NS2SA( inputFs, STEREO_DFT32MS_ZP_NS ); + move16(); ovl = NS2SA( inputFs, STEREO_DFT32MS_OVL_NS ); + move16(); NFFT = NS2SA( inputFs, STEREO_DFT32MS_N_NS ); Word16 qfac_fx; fac_fx = BASOP_Util_Divide3232_Scale_cadence( hStereoDft->NFFT, NFFT, &qfac_fx ); qfac_fx = sub( 31, qfac_fx ); ovl2 = NS2SA( inputFs, STEREO_DFT32MS_OVL2_NS ); + move16(); /* Offset FOR the time buffers */ - assert( ( delay >= -NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_DELAY_DEC_BWE_NS + STEREO_DFT_OVL_NS / 2 ) ) && ( delay <= NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_OVL_NS ) ) ); - mem_size = delay_dec + delay; + assert( ( delay >= -NS2SA( ( input_frame * FRAMES_PER_SEC ), STEREO_DFT_DELAY_DEC_BWE_NS + STEREO_DFT_OVL_NS / 2 ) ) && ( delay <= NS2SA( ( input_frame * FRAMES_PER_SEC ), STEREO_DFT_OVL_NS ) ) ); + mem_size = add( delay_dec, delay ); /* Update buffers */ Copy32( mem_fx, input_buff_fx, mem_size ); @@ -804,7 +815,8 @@ void stereo_dft_dec_analyze_fx( Copy32( input_buff_fx + input_frame, mem_fx, mem_size ); pInput_buff_fx = input_buff_fx; - IF( hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) + test(); + IF( EQ_16( hCPE->nchan_out, 1 ) && ( hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ) { pop_wmops(); return; @@ -815,145 +827,176 @@ void stereo_dft_dec_analyze_fx( * DFT Analysis: loop over frame *-----------------------------------------------------------------*/ - assert( k_offset <= STEREO_DFT_NBDIV ); + assert( ( k_offset <= STEREO_DFT_NBDIV ) ); - FOR( i = 0; i < NFFT / 4; i++ ) + FOR( i = 0; i < shr( NFFT, 2 ); i++ ) { - trigo_dec_fx[i] = trigo_fx[i * trigo_step]; - trigo_dec_fx[NFFT / 2 - i] = trigo_fx[i * trigo_step]; + trigo_dec_fx[i] = trigo_fx[i_mult( i, trigo_step )]; + move16(); + trigo_dec_fx[sub( NFFT / 2, i )] = trigo_fx[i_mult( i, trigo_step )]; + move16(); } - trigo_dec_fx[NFFT / 4] = trigo_fx[NFFT / 4 * trigo_step]; + trigo_dec_fx[NFFT / 4] = trigo_fx[i_mult( NFFT / 4, trigo_step )]; + move16(); - FOR( k = 0; k < STEREO_DFT_NBDIV - k_offset; k++ ) + FOR( k = 0; k < sub( STEREO_DFT_NBDIV, k_offset ); k++ ) { set32_fx( DFT_fx, 0, STEREO_DFT32MS_N_MAX ); IF( k == 0 ) { offset = 0; + move16(); } ELSE { /* If OVL2 = OVL offset = 10ms */ offset = NS2SA( inputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 ); + move16(); } pInput_fx = pInput_buff_fx + offset; - pDFT_out_fx = out_DFT_fx[chan] + k * STEREO_DFT32MS_N_MAX; + pDFT_out_fx = out_DFT_fx[chan] + i_mult( k, STEREO_DFT32MS_N_MAX ); /*Forwards FFT: L and R*/ /* Zero Padding & Flat Portion */ - Copy32( pInput_fx, DFT_fx + zp, NFFT - 2 * zp ); + Copy32( pInput_fx, DFT_fx + zp, sub( NFFT, i_mult( 2, zp ) ) ); /* Overlapping portions */ IF( k == 0 ) { FOR( i = 0; i < ovl; i++ ) { - DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win_left_fx[STEREO_DFT32MS_STEP * i] ); + DFT_fx[add( i, zp )] = Mpy_32_16_1( DFT_fx[add( i, zp )], win_left_fx[i_mult( STEREO_DFT32MS_STEP, i )] ); + move32(); } FOR( i = 0; i < ovl2; i++ ) { - DFT_fx[NFFT - zp - 1 - i] = Mpy_32_16_1( DFT_fx[NFFT - zp - 1 - i], win2_fx[i] ); + DFT_fx[sub( sub( sub( NFFT, zp ), 1 ), i )] = Mpy_32_16_1( DFT_fx[sub( sub( sub( NFFT, zp ), 1 ), i )], win2_fx[i] ); + move32(); } } ELSE { FOR( i = 0; i < ovl2; i++ ) { - DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win2_fx[i] ); + DFT_fx[add( i, zp )] = Mpy_32_16_1( DFT_fx[add( i, zp )], win2_fx[i] ); + move32(); } FOR( i = 0; i < ovl; i++ ) { - DFT_fx[NFFT - zp - i - 1] = Mpy_32_16_1( DFT_fx[NFFT - zp - i - 1], win_right_fx[STEREO_DFT32MS_STEP * i] ); + DFT_fx[sub( sub( sub( NFFT, zp ), i ), 1 )] = Mpy_32_16_1( DFT_fx[sub( sub( sub( NFFT, zp ), i ), 1 )], win_right_fx[i_mult( STEREO_DFT32MS_STEP, i )] ); + move32(); } } Word16 q_DFT, q_shift, guarded_bits; q_DFT = *q; + move16(); guarded_bits = find_guarded_bits_fx( NFFT ); - q_shift = L_norm_arr( DFT_fx, NFFT ) - guarded_bits; + q_shift = sub( L_norm_arr( DFT_fx, NFFT ), guarded_bits ); FOR( Word16 j = 0; j < NFFT; j++ ) { DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); + move32(); } - q_DFT += q_shift; + q_DFT = add( q_DFT, q_shift ); rfft_fx( DFT_fx, trigo_dec_fx, NFFT, -1 ); - q_shift = L_norm_arr( DFT_fx, NFFT ) - ( 31 - qfac_fx ); + q_shift = sub( L_norm_arr( DFT_fx, NFFT ), sub( 31, qfac_fx ) ); FOR( Word16 j = 0; j < NFFT; j++ ) { DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); + move32(); } - q_DFT += q_shift; - IF( q_out_DFT[chan] - q_DFT > 0 ) + q_DFT = add( q_DFT, q_shift ); + IF( sub( q_out_DFT[chan], q_DFT ) > 0 ) { FOR( int j = 0; j < NFFT; j++ ) { - out_DFT_fx[chan][j] = L_shr( out_DFT_fx[chan][j], q_out_DFT[chan] - q_DFT ); + out_DFT_fx[chan][j] = L_shr( out_DFT_fx[chan][j], sub( q_out_DFT[chan], q_DFT ) ); + move32(); } q_out_DFT[chan] = q_DFT; + move16(); } ELSE { FOR( int j = 0; j < NFFT; j++ ) { - DFT_fx[j] = L_shr( DFT_fx[j], q_DFT - q_out_DFT[chan] ); + DFT_fx[j] = L_shr( DFT_fx[j], sub( q_DFT, q_out_DFT[chan] ) ); + move32(); } q_DFT = q_out_DFT[chan]; + move16(); } /*Resampling: filtering+scaling*/ - IF( ana_type == DFT_STEREO_DEC_ANA_FB || ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_NOCORE ) + test(); + test(); + IF( ( ana_type == DFT_STEREO_DEC_ANA_FB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_NOCORE ) ) { - pDFT_out_fx[0] = L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), 31 - qfac_fx ); /*DC*/ - IF( NFFT == hStereoDft->NFFT ) /*Nyquist*/ + pDFT_out_fx[0] = L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ); /*DC*/ + move32(); + IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/ { - pDFT_out_fx[1] = L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), 31 - qfac_fx ); + pDFT_out_fx[1] = L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ); + move32(); } ELSE { pDFT_out_fx[1] = 0; + move32(); } FOR( i = 2; i < NFFT; i++ ) { - pDFT_out_fx[i] = L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), 31 - qfac_fx ); + pDFT_out_fx[i] = L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ); + move32(); } FOR( i = NFFT; i < hStereoDft->NFFT; i++ ) { pDFT_out_fx[i] = 0; + move32(); } } - ELSE IF( ana_type == DFT_STEREO_DEC_ANA_BPF ) + ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) { - pDFT_out_fx[0] = L_sub( pDFT_out_fx[0], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[0], fac_fx ), dft_bpf_weights_fx[0] ), 32 - qfac_fx ) ); + pDFT_out_fx[0] = L_sub( pDFT_out_fx[0], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[0], fac_fx ), dft_bpf_weights_fx[0] ), sub( 32, qfac_fx ) ) ); + move32(); FOR( i = 1; i < STEREO_DFT_BPF_SIZE; i++ ) { - pDFT_out_fx[2 * i] = L_sub( pDFT_out_fx[2 * i], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i], fac_fx ), dft_bpf_weights_fx[i] ), 32 - qfac_fx ) ); - pDFT_out_fx[2 * i + 1] = L_sub( pDFT_out_fx[2 * i + 1], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i + 1], fac_fx ), dft_bpf_weights_fx[i] ), 32 - qfac_fx ) ); + pDFT_out_fx[2 * i] = L_sub( pDFT_out_fx[2 * i], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); + move32(); + pDFT_out_fx[add( 2 * i, 1 )] = L_sub( pDFT_out_fx[add( 2 * i, 1 )], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[add( 2 * i, 1 )], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); + move32(); } } - ELSE IF( ana_type == DFT_STEREO_DEC_ANA_HB_ADD ) + ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_HB_ADD ) ) { - NFFT_core = NS2SA( hCPE->hCoreCoder[0]->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_N_NS ); + NFFT_core = NS2SA( L_mult0( hCPE->hCoreCoder[0]->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_N_NS ); + move16(); FOR( i = NFFT_core; i < NFFT; i++ ) { - pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), 31 - qfac_fx ), pDFT_out_fx[i] ); + pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); + move32(); } } ELSE { - pDFT_out_fx[0] = L_add( pDFT_out_fx[0], L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), 31 - qfac_fx ) ); /*DC*/ - IF( NFFT == hStereoDft->NFFT ) /*Nyquist*/ + pDFT_out_fx[0] = L_add( pDFT_out_fx[0], L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ) ); /*DC*/ + move32(); + IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/ { - pDFT_out_fx[1] = L_add( L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), 31 - qfac_fx ), pDFT_out_fx[1] ); + pDFT_out_fx[1] = L_add( L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[1] ); + move32(); } FOR( i = 2; i < NFFT; i++ ) { - pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), 31 - qfac_fx ), pDFT_out_fx[i] ); + pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); + move32(); } } } @@ -2505,10 +2548,6 @@ void stereo_dft_dec_read_BS( hStereoDft->res_global_gain = ECSQ_dequantize_gain( I ); -#ifdef DUMPS_ENABLED - dbgwrite_txt( &hStereoDft->res_global_gain, 1, "float_res_global_gain.txt", NULL ); -#endif // DUMPS_ENABLED - ecsq_inst.config_index = 2 * hStereoDft->res_cod_mode[k_offset] - 1; ECSQ_decode( &ecsq_inst, hStereoDft->res_cod_line_max, dec ); @@ -2517,10 +2556,6 @@ void stereo_dft_dec_read_BS( set_zero( res_buf, STEREO_DFT_N_8k ); ECSQ_dequantize_vector( dec, hStereoDft->res_global_gain, hStereoDft->res_cod_line_max, res_buf ); - -#ifdef DUMPS_ENABLED - dbgwrite_txt( res_buf, hStereoDft->res_cod_line_max, "float_res_buf.txt", NULL ); -#endif // DUMPS_ENABLED } else { diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index 34f1c2249..a4bcf14f6 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -1018,7 +1018,34 @@ void ivas_mcmasa_param_est_enc( { mvr2r( intensity_real[2], &( hMcMasa->buffer_intensity_real_vert[index - 1][0] ), num_freq_bands ); computeVerticalDiffuseness( hMcMasa->buffer_intensity_real_vert, hMcMasa->buffer_energy, hMcMasa->no_col_avg_diff, num_freq_bands, vertical_diffuseness_vector ); +#ifdef IVAS_FLOAT_FIXED + //////////////////////// to be removed /////////////////////////////// + Word32 x1_fx[MASA_FREQUENCY_BANDS]; + Word32 x2_fx[MASA_FREQUENCY_BANDS]; + Word32 y_fx[MASA_FREQUENCY_BANDS]; + Word16 x1_q_fx[MASA_FREQUENCY_BANDS]; + Word16 x2_q_fx[MASA_FREQUENCY_BANDS]; + Word16 y_q_fx[MASA_FREQUENCY_BANDS]; + FOR(i = 0; i < num_freq_bands; i++) + { + x1_q_fx[i] = Q_factor_L(diffuseness_vector[i]); + x1_fx[i] = (Word32)(diffuseness_vector[i] * (W_shl(1, x1_q_fx[i]))); + x2_q_fx[i] = Q_factor_L(vertical_diffuseness_vector[i]); + x2_fx[i] = (Word32)(vertical_diffuseness_vector[i] * (W_shl(1, x2_q_fx[i]))); + } + ///////////////////////////////////////////////////////////////////////// + + v_min_fx((const Word32 *)x1_fx, x1_q_fx, (const Word32 *)x2_fx, x2_q_fx, y_fx, y_q_fx, num_freq_bands ); + + //////////////////////// to be removed //////////////////////////////// + FOR(i = 0; i < num_freq_bands; i++) + { + diffuseness_vector[i] = (Float32)y_fx[i] / (W_shl(1, y_q_fx[i])); + } + /////////////////////////////////////////////////////////////////////// +#else v_min( diffuseness_vector, vertical_diffuseness_vector, diffuseness_vector, num_freq_bands ); +#endif } for ( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) diff --git a/lib_enc/speech_music_classif.c b/lib_enc/speech_music_classif.c index 3fe6fe53b..d529e73a6 100644 --- a/lib_enc/speech_music_classif.c +++ b/lib_enc/speech_music_classif.c @@ -1350,7 +1350,57 @@ int16_t ivas_smc_gmm( pt_mel_fb += len; } +#ifdef IVAS_FLOAT_FIXED + //////////////////// to be removed ////////////////////// + Word32 y_fx[NB_MEL_BANDS]; + Word32 x_fx[NB_MEL_BANDS]; + Word32 A_fx[NB_MEL_BANDS * NB_MEL_COEF]; + Word16 y_q_fx[NB_MEL_BANDS]; + Word16 x_q_fx[NB_MEL_BANDS]; + Word16 A_q_fx[NB_MEL_BANDS * NB_MEL_COEF]; + Word32 *pt_x_fx, *pt_A_fx; + const Float32 *pt_x, *pt_A; + Word16 *pt_x_q_fx, *pt_A_q_fx; + + pt_A_fx = A_fx; + pt_A_q_fx = A_q_fx; + pt_A = dct_mtx; + + FOR( i = 0; i < NB_MEL_COEF; i++ ) + { + pt_x = melS; + pt_x_fx = x_fx; + pt_x_q_fx = x_q_fx; + FOR( j = 0; j < NB_MEL_BANDS; j++ ) + { + IF( EQ_16( i, 0 ) ) + { + *pt_x_q_fx = sub( Q_factor_L( *pt_x ), 3 ); + *pt_x_fx++ = (Word32) ( *pt_x++ * ( W_shl( 1, *pt_x_q_fx++ ) ) ); + } + *pt_A_q_fx = sub( Q_factor_L( *pt_A ), 3 ); + *pt_A_fx++ = (Word32) ( *pt_A++ * ( W_shl( 1, *pt_A_q_fx++ ) ) ); + } + } + + v_mult_mat_fx( y_fx, y_q_fx, (const Word32 *) x_fx, x_q_fx, (const Word32 *) A_fx, A_q_fx, NB_MEL_BANDS, NB_MEL_COEF ); + + ////////////////////////////// to be removed //////////////////////// + FOR( i = 0; i < NB_MEL_COEF; i++ ) + { + IF( LT_16( y_q_fx[i], 0 ) ) + { + mfcc[i] = (Float32) y_fx[i] * W_shl( 1, -y_q_fx[i] ); + } + ELSE + { + mfcc[i] = (Float32) y_fx[i] / W_shl( 1, y_q_fx[i] ); + } + } + //////////////////////////////////////////////////////////////////// +#else v_mult_mat( mfcc, melS, dct_mtx, NB_MEL_BANDS, NB_MEL_COEF ); +#endif *pFV++ = mfcc[2]; *pFV++ = mfcc[6]; -- GitLab From ffbb3cc30c1e7131e33acaf4bc560e2bde2c6a87 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 8 Jul 2024 21:17:19 +0530 Subject: [PATCH 049/110] clang formatting changes --- lib_com/ivas_tools.c | 67 ++++++++++++++++++++++++++++++++------- lib_enc/ivas_mcmasa_enc.c | 16 +++++----- 2 files changed, 63 insertions(+), 20 deletions(-) diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index 0e24db967..e42efb441 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -2555,21 +2555,64 @@ void lls_interp_n_fx( { Word16 i; const Word16 n_i_fx[11] = { 0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480 }; // Q11 - move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); const Word16 one_by_n_fx[11] = { 0, 32767, 16384, 10911, 8192, 6553, 5459, 4681, 4096, 3640, 3276 }; - move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); const Word16 sum_i_fx[12] = { 0, 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55 }; - move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); // 1.0f/ ( N * sum_ii[N] - sum_i[N] * sum_i[N] ) const Word32 res_table[12] = { 0, 0, 0, 357913952, 107374184, 42949672, 20452226, 10956549, 6391320, 3976821, 2603010, 385 }; - move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); Word32 sum_x_fx, sum_ix_fx, slope_fx, offset_fx; Word16 dot_exp = 0, sum_ix_q = 0; - move16(); move16(); + move16(); + move16(); Word32 num; assert( N > 0 && LE_16( N, 10 ) ); @@ -3002,8 +3045,8 @@ Word16 is_SIDrate( test(); test(); if ( EQ_32( ivas_total_brate, SID_1k75 ) || - EQ_32( ivas_total_brate, SID_2k40 ) || - EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) + EQ_32( ivas_total_brate, SID_2k40 ) || + EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) { sid_rate_flag = 1; move16(); @@ -3373,9 +3416,9 @@ Word16 ceil_log_2( *-------------------------------------------------------------------*/ Word64 var_32_fx( - const Word32 *x, /* i : input vector */ - const Word16 len, /* i : length of inputvector */ - Word16 q /* q : q-factor for the array */ + const Word32 *x, /* i : input vector */ + const Word16 len, /* i : length of inputvector */ + Word16 q /* q : q-factor for the array */ ) { @@ -3391,7 +3434,7 @@ Word64 var_32_fx( mean = W_add( mean, x[i] ); } - mean = mean / len; /* NOTE: No BASOP for 64 bit division */ + mean = mean / len; /* NOTE: No BASOP for 64 bit division */ FOR( int i = 0; i < len; i++ ) { @@ -3400,7 +3443,7 @@ Word64 var_32_fx( var = W_shl( var, sub( 31, q ) ); - var = var / len; /* NOTE: No BASOP for 64 bit division */ + var = var / len; /* NOTE: No BASOP for 64 bit division */ return var; } diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index a4bcf14f6..3748ef6a4 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -1026,21 +1026,21 @@ void ivas_mcmasa_param_est_enc( Word16 x1_q_fx[MASA_FREQUENCY_BANDS]; Word16 x2_q_fx[MASA_FREQUENCY_BANDS]; Word16 y_q_fx[MASA_FREQUENCY_BANDS]; - FOR(i = 0; i < num_freq_bands; i++) + FOR( i = 0; i < num_freq_bands; i++ ) { - x1_q_fx[i] = Q_factor_L(diffuseness_vector[i]); - x1_fx[i] = (Word32)(diffuseness_vector[i] * (W_shl(1, x1_q_fx[i]))); - x2_q_fx[i] = Q_factor_L(vertical_diffuseness_vector[i]); - x2_fx[i] = (Word32)(vertical_diffuseness_vector[i] * (W_shl(1, x2_q_fx[i]))); + x1_q_fx[i] = Q_factor_L( diffuseness_vector[i] ); + x1_fx[i] = (Word32) ( diffuseness_vector[i] * ( W_shl( 1, x1_q_fx[i] ) ) ); + x2_q_fx[i] = Q_factor_L( vertical_diffuseness_vector[i] ); + x2_fx[i] = (Word32) ( vertical_diffuseness_vector[i] * ( W_shl( 1, x2_q_fx[i] ) ) ); } ///////////////////////////////////////////////////////////////////////// - v_min_fx((const Word32 *)x1_fx, x1_q_fx, (const Word32 *)x2_fx, x2_q_fx, y_fx, y_q_fx, num_freq_bands ); + v_min_fx( (const Word32 *) x1_fx, x1_q_fx, (const Word32 *) x2_fx, x2_q_fx, y_fx, y_q_fx, num_freq_bands ); //////////////////////// to be removed //////////////////////////////// - FOR(i = 0; i < num_freq_bands; i++) + FOR( i = 0; i < num_freq_bands; i++ ) { - diffuseness_vector[i] = (Float32)y_fx[i] / (W_shl(1, y_q_fx[i])); + diffuseness_vector[i] = (Float32) y_fx[i] / ( W_shl( 1, y_q_fx[i] ) ); } /////////////////////////////////////////////////////////////////////// #else -- GitLab From 32a86b0a772053fe1a8baffca888413d1c1524bc Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 8 Jul 2024 21:46:16 +0530 Subject: [PATCH 050/110] Integrated ivas_enc_cov_handler_process_fx function in MC path --- lib_com/ivas_cov_smooth.c | 91 ++--- lib_com/ivas_prot.h | 30 +- lib_com/ivas_prot_fx.h | 5 + lib_com/ivas_stat_com.h | 18 +- lib_com/ivas_tools.c | 67 +--- lib_enc/ivas_enc.c | 578 +++++++++++++++++++++++++++++-- lib_enc/ivas_enc_cov_handler.c | 139 ++++++-- lib_enc/ivas_init_enc.c | 273 ++++++++++++++- lib_enc/ivas_lfe_enc.c | 118 ++++++- lib_enc/ivas_mc_paramupmix_enc.c | 113 ++++++ lib_enc/ivas_osba_enc.c | 268 +++++++++++++- lib_enc/ivas_sba_enc.c | 247 ++++++++++++- lib_enc/ivas_spar_encoder.c | 18 + lib_enc/ivas_stat_enc.h | 14 +- 14 files changed, 1772 insertions(+), 207 deletions(-) diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index b7f195b9c..c1d35c45e 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -206,7 +206,6 @@ static void ivas_set_up_cov_smoothing_fx( Word16 active_bins = pFb->fb_bin_to_band.pFb_active_bins_per_band[j]; update_factor = ivas_calculate_update_factor_fx( pFb->fb_bin_to_band.pFb_bin_to_band_fx[j], active_bins ); ivas_calculate_smoothning_factor_fx( &hCovState->pSmoothing_factor_fx[j], update_factor, min_pool_size, max_update_rate, smooth_mode, ivas_total_brate, j ); - hCovState->pSmoothing_factor[j] = fixedToFloat( hCovState->pSmoothing_factor_fx[j], Q31 ); } } ELSE @@ -217,7 +216,6 @@ static void ivas_set_up_cov_smoothing_fx( Word16 active_bins = pFb->fb_bin_to_band.p_short_stride_num_bins_per_band[j]; update_factor = ivas_calculate_update_factor_fx( p_bin_to_band, active_bins ); ivas_calculate_smoothning_factor_fx( &hCovState->pSmoothing_factor_fx[j], update_factor, min_pool_size, max_update_rate, smooth_mode, ivas_total_brate, j ); - hCovState->pSmoothing_factor[j] = fixedToFloat( hCovState->pSmoothing_factor_fx[j], Q31 ); } } @@ -270,78 +268,65 @@ static void ivas_set_up_cov_smoothing( #endif +#ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- - * ivas_spar_covar_smooth_enc_open() + * ivas_spar_covar_smooth_enc_open_fx() * * Allocate and initialize SPAR Covar. smoothing handle *------------------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED -ivas_error ivas_spar_covar_smooth_enc_open( +ivas_error ivas_spar_covar_smooth_enc_open_fx( ivas_cov_smooth_state_t **hCovState_out, /* i/o: SPAR Covar. smoothing handle */ const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ ivas_filterbank_t *pFb, /* i/o: FB handle */ - const int16_t nchan_inp, /* i : number of input channels */ + const Word16 nchan_inp, /* i : number of input channels */ const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ ) { ivas_cov_smooth_state_t *hCovState; - int16_t i, j; + Word16 i, j; - if ( ( hCovState = (ivas_cov_smooth_state_t *) malloc( sizeof( ivas_cov_smooth_state_t ) ) ) == NULL ) + IF( ( hCovState = (ivas_cov_smooth_state_t *) malloc( sizeof( ivas_cov_smooth_state_t ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder" ); } -#ifdef IVAS_FLOAT_FIXED IF( ( hCovState->pSmoothing_factor_fx = (Word32 *) malloc( sizeof( Word32 ) * cov_smooth_cfg->max_bands ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder" ); } -#endif - if ( ( hCovState->pSmoothing_factor = (float *) malloc( sizeof( float ) * cov_smooth_cfg->max_bands ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder" ); - } - for ( i = 0; i < nchan_inp; i++ ) + FOR( i = 0; i < nchan_inp; i++ ) { - for ( j = 0; j < nchan_inp; j++ ) + FOR( j = 0; j < nchan_inp; j++ ) { - if ( ( hCovState->pPrior_cov_real[i][j] = (float *) malloc( sizeof( float ) * cov_smooth_cfg->max_bands ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder" ); - } - set_zero( hCovState->pPrior_cov_real[i][j], cov_smooth_cfg->max_bands ); -#ifdef IVAS_FLOAT_FIXED - if ( ( hCovState->pPrior_cov_real_fx[i][j] = (Word32 *) malloc( sizeof( Word32 ) * cov_smooth_cfg->max_bands ) ) == NULL ) + IF( ( hCovState->pPrior_cov_real_fx[i][j] = (Word32 *) malloc( sizeof( Word32 ) * cov_smooth_cfg->max_bands ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder Fixed" ); } set_zero_fx( hCovState->pPrior_cov_real_fx[i][j], cov_smooth_cfg->max_bands ); -#endif -#ifdef IVAS_FLOAT_FIXED - if ( ( hCovState->q_cov_real_per_band[i][j] = (Word16 *) malloc( sizeof( Word16 ) * cov_smooth_cfg->max_bands ) ) == NULL ) + IF( ( hCovState->q_cov_real_per_band[i][j] = (Word16 *) malloc( sizeof( Word16 ) * cov_smooth_cfg->max_bands ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder Fixed" ); } set_s( hCovState->q_cov_real_per_band[i][j], Q31, cov_smooth_cfg->max_bands ); -#endif } } -#ifdef IVAS_FLOAT_FIXED ivas_set_up_cov_smoothing_fx( hCovState, pFb, cov_smooth_cfg->max_update_rate_fx, cov_smooth_cfg->min_pool_size, smooth_mode, ivas_total_brate ); -#else - ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, smooth_mode, ivas_total_brate ); -#endif *hCovState_out = hCovState; return IVAS_ERR_OK; } #else +/*------------------------------------------------------------------------- + * ivas_spar_covar_smooth_enc_open() + * + * Allocate and initialize SPAR Covar. smoothing handle + *------------------------------------------------------------------------*/ + ivas_error ivas_spar_covar_smooth_enc_open( ivas_cov_smooth_state_t **hCovState_out, /* i/o: SPAR Covar. smoothing handle */ const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ @@ -384,46 +369,36 @@ ivas_error ivas_spar_covar_smooth_enc_open( } #endif +#ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- - * ivas_spar_covar_smooth_enc_close() + * ivas_spar_covar_smooth_enc_close_fx() * * Deallocate SPAR Covar. smoothing handle *------------------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED -void ivas_spar_covar_smooth_enc_close( +void ivas_spar_covar_smooth_enc_close_fx( ivas_cov_smooth_state_t **hCovState_out, /* i/o: SPAR Covar. smoothing handle */ - const int16_t nchan_inp /* i : number of input channels */ + const Word16 nchan_inp /* i : number of input channels */ ) { ivas_cov_smooth_state_t *hCovState; - int16_t i, j; + Word16 i, j; hCovState = *hCovState_out; - if ( hCovState != NULL ) + IF( hCovState != NULL ) { -#ifdef IVAS_FLOAT_FIXED free( hCovState->pSmoothing_factor_fx ); hCovState->pSmoothing_factor_fx = NULL; -#endif - free( hCovState->pSmoothing_factor ); - hCovState->pSmoothing_factor = NULL; - for ( i = 0; i < nchan_inp; i++ ) + FOR( i = 0; i < nchan_inp; i++ ) { - for ( j = 0; j < nchan_inp; j++ ) + FOR( j = 0; j < nchan_inp; j++ ) { - free( hCovState->pPrior_cov_real[i][j] ); - hCovState->pPrior_cov_real[i][j] = NULL; -#ifdef IVAS_FLOAT_FIXED free( hCovState->pPrior_cov_real_fx[i][j] ); hCovState->pPrior_cov_real_fx[i][j] = NULL; -#endif -#ifdef IVAS_FLOAT_FIXED free( hCovState->q_cov_real_per_band[i][j] ); hCovState->q_cov_real_per_band[i][j] = NULL; -#endif } } @@ -434,6 +409,12 @@ void ivas_spar_covar_smooth_enc_close( return; } #else +/*------------------------------------------------------------------------- + * ivas_spar_covar_smooth_enc_close() + * + * Deallocate SPAR Covar. smoothing handle + *------------------------------------------------------------------------*/ + void ivas_spar_covar_smooth_enc_close( ivas_cov_smooth_state_t **hCovState_out, /* i/o: SPAR Covar. smoothing handle */ const int16_t nchan_inp /* i : number of input channels */ @@ -597,9 +578,7 @@ static void ivas_compute_smooth_cov_fx( return; } -#endif - - +#else /*-----------------------------------------------------------------------------------------* * Function ivas_compute_smooth_cov() * @@ -691,6 +670,7 @@ static void ivas_compute_smooth_cov( return; } +#endif #ifdef IVAS_FLOAT_FIXED @@ -728,9 +708,7 @@ void ivas_cov_smooth_process_fx( return; } -#endif - - +#else /*-----------------------------------------------------------------------------------------* * Function ivas_cov_smooth_process() * @@ -763,3 +741,4 @@ void ivas_cov_smooth_process( return; } +#endif diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 85556a4f4..6b6e1c39c 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5860,6 +5860,21 @@ void ivas_spar_dec_gen_umx_mat( const int16_t num_md_sub_frames ); +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_spar_covar_enc_open_fx( + ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ + ivas_filterbank_t *pFb, /* i/o: FB handle */ + const Word32 input_Fs, /* i : input sampling rate */ + const Word16 nchan_inp, /* i : number of input channels */ + const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC*/ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ +); + +void ivas_spar_covar_enc_close_fx( + ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ + const Word16 nchan_inp /* i : number of input channels */ +); +#else /* Covariance module */ ivas_error ivas_spar_covar_enc_open( ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ @@ -5874,6 +5889,7 @@ void ivas_spar_covar_enc_close( ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ const int16_t nchan_inp /* i : number of input channels */ ); +#endif #ifdef IVAS_FLOAT_FIXED void ivas_enc_cov_handler_process_fx( @@ -5898,8 +5914,7 @@ void ivas_enc_cov_handler_process_fx( const Word16 nchan_transport, const Word16 is_sba ); -#endif - +#else void ivas_enc_cov_handler_process( ivas_enc_cov_handler_state_t *hCovEnc, /* i/o: SPAR Covar. encoder handle */ float **ppIn_FR_real, @@ -5919,8 +5934,9 @@ void ivas_enc_cov_handler_process( const int16_t nchan_transport, const int16_t is_sba ); +#endif -#ifdef IVAS_FLOAT_FIXED_ +#ifdef IVAS_FLOAT_FIXED ivas_error ivas_spar_covar_smooth_enc_open_fx( ivas_cov_smooth_state_t **hCovState, /* i/o: SPAR Covar. smoothing handle */ const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ @@ -5934,8 +5950,7 @@ void ivas_spar_covar_smooth_enc_close_fx( ivas_cov_smooth_state_t **hCovState, /* i/o: SPAR Covar. encoder handle */ const Word16 nchan_inp /* i : number of input channels */ ); -#endif - +#else ivas_error ivas_spar_covar_smooth_enc_open( ivas_cov_smooth_state_t **hCovState, /* i/o: SPAR Covar. smoothing handle */ const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ @@ -5949,6 +5964,7 @@ void ivas_spar_covar_smooth_enc_close( ivas_cov_smooth_state_t **hCovState, /* i/o: SPAR Covar. encoder handle */ const int16_t nchan_inp /* i : number of input channels */ ); +#endif #ifdef IVAS_FLOAT_FIXED void ivas_cov_smooth_process_fx( @@ -5961,8 +5977,7 @@ void ivas_cov_smooth_process_fx( const Word16 transient_det[2], Word16 *q_cov[IVAS_SPAR_MAX_CH] ); -#endif - +#else void ivas_cov_smooth_process( ivas_cov_smooth_state_t *hCovState, /* i/o: Covariance state handle */ float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], @@ -5972,6 +5987,7 @@ void ivas_cov_smooth_process( const int16_t num_ch, const int16_t transient_det[2] ); +#endif /* Transient detector module */ ivas_error ivas_transient_det_open( diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 14d5b40cf..66921d415 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -2393,6 +2393,11 @@ Word16 ism_quant_meta_fx( const Word16 cbsize /* i : codebook size */ ); +/*! r: number of channels to be analysed */ +Word16 getNumChanAnalysis_fx( + Encoder_Struct *st_ivas /* i : IVAS encoder structure */ +); + ivas_error ivas_limiter_open_fx( IVAS_LIMITER_HANDLE *hLimiter_out, /* o : limiter struct handle */ const Word16 max_num_channels, /* i : maximum number of I/O channels to be processed */ diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 78227e56b..1a2542ed4 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -367,24 +367,28 @@ typedef struct ivas_agc_com_state_t /* Covariance structures */ typedef struct ivas_cov_smooth_state_t { - float *pPrior_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; - int16_t prior_bank_idx; - float *pSmoothing_factor; - int16_t num_bins; #ifdef IVAS_FLOAT_FIXED Word32 *pPrior_cov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; - Word16 *q_cov_real[IVAS_SPAR_MAX_CH]; Word16 *q_cov_real_per_band[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; +#else + float *pPrior_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; +#endif + int16_t prior_bank_idx; +#ifdef IVAS_FLOAT_FIXED Word32 *pSmoothing_factor_fx; /* Q31 */ +#else + float *pSmoothing_factor; #endif + int16_t num_bins; } ivas_cov_smooth_state_t; typedef struct ivas_cov_smooth_cfg_t { - float max_update_rate; #ifdef IVAS_FLOAT_FIXED Word32 max_update_rate_fx; /* Q31 */ +#else + float max_update_rate; #endif int16_t min_pool_size; int16_t max_bands; @@ -595,7 +599,7 @@ typedef struct ivas_masa_qmetadata_frame_struct #ifndef IVAS_FLOAT_FIXED float dir_comp_ratio; #else - Word16 dir_comp_ratio_fx; /* Q15 */ + Word16 dir_comp_ratio_fx; /* Q15 */ #endif uint8_t is_masa_ivas_format; diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index e42efb441..0e24db967 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -2555,64 +2555,21 @@ void lls_interp_n_fx( { Word16 i; const Word16 n_i_fx[11] = { 0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480 }; // Q11 - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); + move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); const Word16 one_by_n_fx[11] = { 0, 32767, 16384, 10911, 8192, 6553, 5459, 4681, 4096, 3640, 3276 }; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); + move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); const Word16 sum_i_fx[12] = { 0, 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55 }; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); + move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); // 1.0f/ ( N * sum_ii[N] - sum_i[N] * sum_i[N] ) const Word32 res_table[12] = { 0, 0, 0, 357913952, 107374184, 42949672, 20452226, 10956549, 6391320, 3976821, 2603010, 385 }; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); + move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); Word32 sum_x_fx, sum_ix_fx, slope_fx, offset_fx; Word16 dot_exp = 0, sum_ix_q = 0; - move16(); - move16(); + move16(); move16(); Word32 num; assert( N > 0 && LE_16( N, 10 ) ); @@ -3045,8 +3002,8 @@ Word16 is_SIDrate( test(); test(); if ( EQ_32( ivas_total_brate, SID_1k75 ) || - EQ_32( ivas_total_brate, SID_2k40 ) || - EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) + EQ_32( ivas_total_brate, SID_2k40 ) || + EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) { sid_rate_flag = 1; move16(); @@ -3416,9 +3373,9 @@ Word16 ceil_log_2( *-------------------------------------------------------------------*/ Word64 var_32_fx( - const Word32 *x, /* i : input vector */ - const Word16 len, /* i : length of inputvector */ - Word16 q /* q : q-factor for the array */ + const Word32 *x, /* i : input vector */ + const Word16 len, /* i : length of inputvector */ + Word16 q /* q : q-factor for the array */ ) { @@ -3434,7 +3391,7 @@ Word64 var_32_fx( mean = W_add( mean, x[i] ); } - mean = mean / len; /* NOTE: No BASOP for 64 bit division */ + mean = mean / len; /* NOTE: No BASOP for 64 bit division */ FOR( int i = 0; i < len; i++ ) { @@ -3443,7 +3400,7 @@ Word64 var_32_fx( var = W_shl( var, sub( 31, q ) ); - var = var / len; /* NOTE: No BASOP for 64 bit division */ + var = var / len; /* NOTE: No BASOP for 64 bit division */ return var; } diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 23dee7bc6..e983df322 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -40,13 +40,18 @@ #include "ivas_prot.h" #include "ivas_rom_com.h" #include "wmc_auto.h" +#ifdef IVAS_FLOAT_FIXED +#include "prot_fx1.h" +#include "prot_fx2.h" +#include "ivas_prot_fx.h" +#endif /*-------------------------------------------------------------------* * ivas_enc() * * Principal IVAS encoder routine *-------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED ivas_error ivas_enc( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ const int16_t *data, /* i : input signal */ @@ -433,71 +438,571 @@ ivas_error ivas_enc( { st_ivas->hLFE->hBstr = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0]->hBstr : st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; -#ifdef IVAS_FLOAT_FIXED - Word16 q_data_lfe_ch; - Word32 data_lfe_ch_fx[L_FRAME48k]; - float max_val = 0; + ivas_lfe_enc( st_ivas->hLFE, data_f[LFE_CHANNEL], input_frame, st_ivas->hLFE->hBstr ); + } - for ( int ii = 0; ii < input_frame; ii++ ) + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + if ( ( error = ivas_mct_enc( st_ivas, data_f, input_frame, 0 ) ) != IVAS_ERR_OK ) { - if ( max_val < (float) fabs( data_f[LFE_CHANNEL][ii] ) ) - max_val = (float) fabs( data_f[LFE_CHANNEL][ii] ); + return error; } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + /* encode MC ParamUpmix parameters and write bitstream */ + ivas_mc_paramupmix_enc( st_ivas, hMetaData, data_f, input_frame ); - if ( (Word32) max_val == 0 ) - q_data_lfe_ch = 31; - else - q_data_lfe_ch = norm_l( (Word32) max_val ); + st_ivas->hLFE->hBstr = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0]->hBstr : st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; + + ivas_lfe_enc( st_ivas->hLFE, data_f[LFE_CHANNEL], input_frame, st_ivas->hLFE->hBstr ); + + if ( ( error = ivas_mct_enc( st_ivas, data_f, input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + /* encode Parametric MC parameters and write bitstream */ + ivas_param_mc_enc( st_ivas, hMetaData, data_f, input_frame ); + + if ( st_ivas->nCPE == 1 ) /* Stereo DMX */ + { + if ( ( error = ivas_cpe_enc( st_ivas, 0, data_f[0], data_f[1], input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE > 1 ) + { + if ( ( error = ivas_mct_enc( st_ivas, data_f, input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + if ( st_ivas->hMcMasa->separateChannelEnabled ) + { + hMetaData = st_ivas->hCPE[0]->hMetaData; /* Metadata is always with CPE in the case of separated channel */ + } + ivas_mcmasa_enc( st_ivas->hMcMasa, st_ivas->hQMetaData, st_ivas->hMasa, data_f, input_frame, st_ivas->nchan_transport, nchan_inp ); - for ( int ii = 0; ii < input_frame; ii++ ) + if ( ( error = ivas_masa_encode( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], st_ivas->nchan_transport, ivas_format, ivas_total_brate, 0, -1, + ISM_MODE_NONE, -1, NULL, -1, NULL, 0, 0 ) ) != IVAS_ERR_OK ) { - data_lfe_ch_fx[ii] = (Word32) ( data_f[LFE_CHANNEL][ii] * ( 1 << q_data_lfe_ch ) ); + return error; } - ivas_lfe_enc_fx( st_ivas->hLFE, data_lfe_ch_fx, q_data_lfe_ch, input_frame, st_ivas->hLFE->hBstr ); + if ( st_ivas->hMcMasa->separateChannelEnabled ) + { + if ( ( error = ivas_sce_enc( st_ivas, 0, data_f[2], input_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list = st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->nb_ind_tot; + + if ( ( error = ivas_cpe_enc( st_ivas, 0, data_f[0], data_f[1], input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_enc( st_ivas, 0, data_f[0], input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) /* Stereo DMX */ + { + if ( ( error = ivas_cpe_enc( st_ivas, 0, data_f[0], data_f[1], input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + } + + /*----------------------------------------------------------------* + * Common updates + *----------------------------------------------------------------*/ + + hEncoderConfig->last_ivas_total_brate = ivas_total_brate; + + + pop_wmops(); + return error; +} #else - ivas_lfe_enc( st_ivas->hLFE, data_f[LFE_CHANNEL], input_frame, st_ivas->hLFE->hBstr ); -#endif // IVAS_FLOAT_FIXED +ivas_error ivas_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const Word16 *data, /* i : input signal */ + const Word16 n_samples /* i : number of input samples */ +) +{ + Word16 i, n, input_frame, n_samples_chan, nchan_inp /*, scale*/; + Word32 input_Fs; + IVAS_FORMAT ivas_format; + ENCODER_CONFIG_HANDLE hEncoderConfig; + BSTR_ENC_HANDLE hMetaData; + Word16 nb_bits_metadata[MAX_SCE + 1]; + float *data_f[MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS]; + Word32 *data_fx[MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS]; + Word32 ivas_total_brate; + ivas_error error; + error = IVAS_ERR_OK; + move32(); + + push_wmops( "ivas_enc" ); + + /*------------------------------------------------------------------* + * Initialization - general + *-----------------------------------------------------------------*/ + + hEncoderConfig = st_ivas->hEncoderConfig; + + input_Fs = hEncoderConfig->input_Fs; + ivas_format = hEncoderConfig->ivas_format; + nchan_inp = hEncoderConfig->nchan_inp; + ivas_total_brate = hEncoderConfig->ivas_total_brate; + move32(); + move32(); + move16(); + move32(); + + input_frame = extract_l( Mpy_32_16_1( input_Fs, INV_FRAME_PER_SEC_Q15 ) ); + IF( NE_16( nchan_inp, 1 ) ) + { + n_samples_chan = div_l( L_deposit_l( n_samples ), nchan_inp ); + n_samples_chan = shl( n_samples_chan, 1 ); + } + ELSE + { + n_samples_chan = n_samples; + move16(); + } + set16_fx( nb_bits_metadata, 0, MAX_SCE + 1 ); + + /*----------------------------------------------------------------* + * convert 'Word16' input data to 'Word32' in Q11 format + *----------------------------------------------------------------*/ + + FOR( n = 0; n < MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + data_f[n] = st_ivas->p_data_f[n]; // float initialization to be removed + data_fx[n] = st_ivas->p_data_fx[n]; + } + + st_ivas->q_data_fx = 11; // Q-factor of the input buffer + move16(); + n = 0; + move16(); + WHILE( LT_16( n, nchan_inp ) ) + { + FOR( i = 0; i < n_samples_chan; i++ ) + { + data_f[n][i] = (float) data[i * nchan_inp + n]; // float initialization to be removed + data_fx[n][i] = L_mult0( data[add( imult1616( i, nchan_inp ), n )], shl( 1, st_ivas->q_data_fx ) ); + move32(); } + n = add( n, 1 ); + } - if ( st_ivas->mc_mode == MC_MODE_MCT ) + IF( LT_16( n_samples_chan, input_frame ) ) + { + FOR( n = 0; n < nchan_inp; n++ ) { - if ( ( error = ivas_mct_enc( st_ivas, data_f, input_frame, 0 ) ) != IVAS_ERR_OK ) + set_f( data_f[n] + n_samples_chan, 0.0f, input_frame - n_samples_chan ); // float initialization to be removed + set32_fx( data_fx[n] + n_samples_chan, 0, sub( input_frame, n_samples_chan ) ); + } + } + + IF( EQ_32( ivas_format, SBA_FORMAT ) ) + { + IF( ( error = ivas_sba_enc_reconfigure( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE IF( EQ_32( ivas_format, SBA_ISM_FORMAT ) ) + { + IF( ( error = ivas_osba_enc_reconfig( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*----------------------------------------------------------------* + * HP filtering + *----------------------------------------------------------------*/ + + n = getNumChanAnalysis_fx( st_ivas ); + + /* bypass EVS coding in float precision, emulating EVS encoder/decoder delay */ + FOR( i = 0; i < n; i++ ) + { + test(); + test(); + IF( ( EQ_32( ivas_format, SBA_FORMAT ) ) && !( GT_16( st_ivas->sba_analysis_order, 1 ) ) ) + { + hp20_flt( data_f[HOA_keep_ind[st_ivas->hSpar->hMdEnc->HOA_md_ind[i]]], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); +#if 0 // To be enabled, precision loss observed + hp20_fix32( data_fx[HOA_keep_ind[st_ivas->hSpar->hMdEnc->HOA_md_ind[i]]], input_frame, st_ivas->mem_hp20_in_fx[i], input_Fs ); +#endif + } + ELSE IF( !( EQ_32( ivas_format, MC_FORMAT ) && EQ_16( i, LFE_CHANNEL ) ) ) + { + hp20_flt( data_f[i], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); // To be removed +#if 0 // To be enabled, precision loss observed + hp20_fix32( data_fx[i], input_frame, st_ivas->mem_hp20_in_fx[i], input_Fs ); +#endif + } + } + +#if 0 /* Fixed to float conversion To be removed */ + for ( i = 0; i < n; i++ ) + { + fixedToFloat_arrL( data_fx[i], data_f[i], st_ivas->q_data_fx, input_frame ); + } +#endif // 1 + + + /*----------------------------------------------------------------* + * write IVAS format signaling + *----------------------------------------------------------------*/ + + ivas_write_format( st_ivas ); + + /*----------------------------------------------------------------* + * Encoding + *----------------------------------------------------------------*/ + + if ( ivas_format == STEREO_FORMAT ) + { + st_ivas->hCPE[0]->element_brate = ivas_total_brate; + if ( ( error = ivas_cpe_enc( st_ivas, 0, data_f[0], data_f[1], input_frame, 0 /* no metadata */ ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( ivas_format == ISM_FORMAT ) + { + /* select ISM format mode; reconfigure the ISM format encoder */ + if ( ( error = ivas_ism_enc_config( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + ivas_param_ism_enc( st_ivas, data_f, input_frame ); + + /* Stereo DMX generation */ + ivas_param_ism_stereo_dmx( st_ivas, data_f, input_frame ); + + /* Core coding of Stereo DMX */ + if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0 ) ) != IVAS_ERR_OK ) { return error; } } - else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + else if ( st_ivas->ism_mode == ISM_MODE_DISC ) { - /* encode MC ParamUpmix parameters and write bitstream */ - ivas_mc_paramupmix_enc( st_ivas, hMetaData, data_f, input_frame ); + /* Analysis, decision about bitrates per channel & core coding */ + if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( ivas_format == SBA_FORMAT || ivas_format == MASA_FORMAT ) + { + /* MASA configuration */ + if ( ivas_format == MASA_FORMAT ) + { + ivas_masa_enc_reconfigure( st_ivas ); + } - st_ivas->hLFE->hBstr = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0]->hBstr : st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; + /* SBA/MASA metadata encoding and SBA/MASA metadata bitstream writing */ + hMetaData = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData : st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; -#ifdef IVAS_FLOAT_FIXED - Word16 q_data_lfe_ch; - Word32 data_lfe_ch_fx[L_FRAME48k]; - float max_val = 0; + if ( st_ivas->hQMetaData != NULL && ivas_format == MASA_FORMAT ) + { + ivas_masa_estimate_energy( st_ivas->hMasa, data_f, input_frame, st_ivas->nchan_transport ); /* energy-estimation uses TF-resolution: 4x24 */ + + if ( ( error = ivas_masa_enc_config( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_masa_encode( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], st_ivas->nchan_transport, ivas_format, ivas_total_brate, hEncoderConfig->Opt_DTX_ON, st_ivas->nchan_transport == 2 ? st_ivas->hCPE[0]->element_mode : -1, + ISM_MODE_NONE, -1, NULL, -1, NULL, 0, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( ivas_format == SBA_FORMAT ) + { + if ( ( error = ivas_spar_enc( st_ivas, data_f, input_frame, nb_bits_metadata, hMetaData ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ivas_format == SBA_FORMAT ) + { + ivas_sba_getTCs( data_f, st_ivas, input_frame ); + } - for ( int ii = 0; ii < input_frame; ii++ ) + /* core-coding of transport channels */ + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_enc( st_ivas, 0, data_f[0], input_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) /* Stereo DMX */ + { + if ( ( error = ivas_cpe_enc( st_ivas, 0, data_f[0], data_f[1], input_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { - if ( max_val < (float) fabs( data_f[LFE_CHANNEL][ii] ) ) - max_val = (float) fabs( data_f[LFE_CHANNEL][ii] ); + return error; } + } + else if ( st_ivas->nCPE > 1 ) /* FOA/HOA format */ + { + if ( ( error = ivas_mct_enc( st_ivas, data_f, input_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( ivas_format == MASA_ISM_FORMAT ) + { + float *data_separated_object; + + int16_t idx_separated_object; + int16_t flag_omasa_ener_brate; - if ( (Word32) max_val == 0 ) - q_data_lfe_ch = 31; + flag_omasa_ener_brate = 0; + + /* Stereo transport is used also with monoMASA, duplicate mono if monoMASA */ + if ( ( st_ivas->hEncoderConfig->nchan_inp - hEncoderConfig->nchan_ism ) == 1 ) + { + v_multc( data_f[hEncoderConfig->nchan_ism], 1.0f / SQRT2, data_f[hEncoderConfig->nchan_ism], input_frame ); + mvr2r( data_f[hEncoderConfig->nchan_ism], data_f[hEncoderConfig->nchan_ism + 1], input_frame ); + } + + /* Estimate TF-tile energy for the input MASA stream */ + ivas_masa_estimate_energy( st_ivas->hMasa, &( data_f[hEncoderConfig->nchan_ism] ), input_frame, st_ivas->nchan_transport ); + + if ( ( error = ivas_omasa_enc_config( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + set_s( nb_bits_metadata, 0, MAX_SCE + 1 ); + idx_separated_object = 0; + + data_separated_object = data_f[hEncoderConfig->nchan_ism + CPE_CHANNELS]; + + /* put audio object data in SCE's */ + if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC ) + { + /* Estimate MASA parameters for the objects */ + ivas_omasa_enc( st_ivas->hOMasa, st_ivas->hMasa, st_ivas->hIsmMetaData, data_f, input_frame, st_ivas->nchan_transport, hEncoderConfig->nchan_ism, st_ivas->ism_mode, data_separated_object, &idx_separated_object ); + } + + /* Encode ISMs transport channels */ + n = 0; + if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + if ( ( error = ivas_sce_enc( st_ivas, 0, data_separated_object, input_frame, nb_bits_metadata[1] ) ) != IVAS_ERR_OK ) /* there are no metadata bits in SCE in this mode */ + { + return error; + } + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + if ( ( error = ivas_ism_enc( st_ivas, &data_separated_object, input_frame, &nb_bits_metadata[1], 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + flag_omasa_ener_brate = ivas_omasa_ener_brate( st_ivas->hEncoderConfig->nchan_ism, ivas_total_brate, data_f, input_frame ); + + /* Analysis, decision about bitrates per channel & core coding */ + if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, &nb_bits_metadata[1], flag_omasa_ener_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + n = st_ivas->hEncoderConfig->nchan_ism; + } + + hMetaData = st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; + + if ( st_ivas->nSCE > 0 ) + { + /* update pointer to the buffer of indices (ISM indices were alredy written) */ + hMetaData->ind_list = st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData->ind_list + st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData->nb_ind_tot; + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list = st_ivas->hSCE[st_ivas->nSCE - 1]->hCoreCoder[0]->hBstr->ind_list + st_ivas->hSCE[st_ivas->nSCE - 1]->hCoreCoder[0]->hBstr->nb_ind_tot; + } + + /* Encode MASA parameters and write MASA metadata bitstream */ + if ( ( error = ivas_masa_encode( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, nb_bits_metadata, st_ivas->nchan_transport, ivas_format, ivas_total_brate, st_ivas->hEncoderConfig->Opt_DTX_ON, st_ivas->nchan_transport == 2 ? st_ivas->hCPE[0]->element_mode : -1, + st_ivas->ism_mode, hEncoderConfig->nchan_ism, st_ivas->hIsmMetaData, idx_separated_object, st_ivas->hOMasa, st_ivas->hIsmMetaData[0]->ism_imp, flag_omasa_ener_brate ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Configuration of combined-format bit-budget distribution */ + ivas_set_surplus_brate_enc( st_ivas ); + + /* Encode MASA transport channels */ + if ( ( ivas_cpe_enc( st_ivas, 0, data_f[n], data_f[n + 1], input_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( ivas_format == SBA_ISM_FORMAT ) + { + int16_t planar_sba_orig; + planar_sba_orig = hEncoderConfig->sba_planar; + + /* Analyze objects and determine needed audio signals */ + ivas_osba_enc( st_ivas->hOSba, st_ivas->hIsmMetaData, data_f, input_frame, hEncoderConfig->nchan_ism, st_ivas->ism_mode, st_ivas->sba_analysis_order, hEncoderConfig->input_Fs, hEncoderConfig->sba_planar ); + + if ( st_ivas->ism_mode == ISM_MODE_NONE ) + { + /*once SBA and ISM are combined into SBA signal then disable planar flag*/ + hEncoderConfig->sba_planar = 0; + if ( st_ivas->nchan_transport == 1 ) + { + hMetaData = st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData; + } else - q_data_lfe_ch = norm_l( (Word32) max_val ); + { + hMetaData = st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; + } + + /* SBA metadata encoding and SBA metadata bitstream writing */ + if ( ( error = ivas_spar_enc( st_ivas, data_f, input_frame, nb_bits_metadata, hMetaData ) ) != IVAS_ERR_OK ) + { + return error; + } + + hEncoderConfig->sba_planar = planar_sba_orig; + } + else + { + n = hEncoderConfig->nchan_ism; + hMetaData = st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; + + if ( ( error = ivas_ism_metadata_enc( &st_ivas->hEncoderConfig->ivas_total_brate, n, st_ivas->hEncoderConfig->nchan_ism, st_ivas->hIsmMetaData, NULL, hMetaData, &nb_bits_metadata[1], 0, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hCPE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* SBA metadata encoding and SBA metadata bitstream writing */ + if ( ( error = ivas_spar_enc( st_ivas, &data_f[n], input_frame, nb_bits_metadata, hMetaData ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* get SBA TCs */ + ivas_sba_getTCs( &data_f[n], st_ivas, input_frame ); + } + /* core-coding of transport channels */ + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_enc( st_ivas, 0, data_f[0], input_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) /* Stereo DMX */ + { + if ( ( error = ivas_cpe_enc( st_ivas, 0, data_f[0], data_f[1], input_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE > 1 ) /* FOA/HOA format */ + { + if ( ( error = ivas_mct_enc( st_ivas, data_f, input_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else if ( EQ_32( ivas_format, MC_FORMAT ) ) + { + /* select MC format mode; write MC LS setup; reconfigure the MC format encoder */ + if ( ( error = ivas_mc_enc_config( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } - for ( int ii = 0; ii < input_frame; ii++ ) + // hMetaData = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData : st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; + IF( st_ivas->nSCE > 0 ) + { + hMetaData = st_ivas->hSCE[sub( st_ivas->nSCE, 1 )]->hMetaData; + } + ELSE + { + hMetaData = st_ivas->hCPE[sub( st_ivas->nCPE, 1 )]->hMetaData; + } + + /* LFE low pass filter */ + ivas_lfe_lpf_enc_apply( st_ivas->hLfeLpf, data_f[LFE_CHANNEL], input_frame ); + + /* LFE channel encoder */ + IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) ) + { + IF( st_ivas->nSCE > 0 ) + { + st_ivas->hLFE->hBstr = st_ivas->hSCE[0]->hCoreCoder[0]->hBstr; + } + ELSE { - data_lfe_ch_fx[ii] = (Word32) ( data_f[LFE_CHANNEL][ii] * ( 1 << q_data_lfe_ch ) ); + st_ivas->hLFE->hBstr = st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; } - ivas_lfe_enc_fx( st_ivas->hLFE, data_lfe_ch_fx, q_data_lfe_ch, input_frame, st_ivas->hLFE->hBstr ); +#if 1 // To be removed + floatToFixed_arr32( data_f[LFE_CHANNEL], data_fx[LFE_CHANNEL], st_ivas->q_data_fx, input_frame ); +#endif + ivas_lfe_enc_fx( st_ivas->hLFE, data_fx[LFE_CHANNEL], st_ivas->q_data_fx, input_frame, st_ivas->hLFE->hBstr ); + } + + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + if ( ( error = ivas_mct_enc( st_ivas, data_f, input_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + /* encode MC ParamUpmix parameters and write bitstream */ + ivas_mc_paramupmix_enc( st_ivas, hMetaData, data_f, input_frame ); + + st_ivas->hLFE->hBstr = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0]->hBstr : st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; + +#ifdef IVAS_FLOAT_FIXED + floatToFixed_arr32( data_f[LFE_CHANNEL], data_fx[LFE_CHANNEL], st_ivas->q_data_fx, input_frame ); + + ivas_lfe_enc_fx( st_ivas->hLFE, data_fx[LFE_CHANNEL], st_ivas->q_data_fx, input_frame, st_ivas->hLFE->hBstr ); #else ivas_lfe_enc( st_ivas->hLFE, data_f[LFE_CHANNEL], input_frame, st_ivas->hLFE->hBstr ); #endif // IVAS_FLOAT_FIXED @@ -586,3 +1091,4 @@ ivas_error ivas_enc( pop_wmops(); return error; } +#endif diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index cda2b4676..804470189 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -44,13 +44,14 @@ * Local constants *------------------------------------------------------------------------------------------*/ -#define MIN_POOL_SIZE 24 -#define MAX_UPDATE_RATE 0.8f -#define MIN_POOL_SIZE_DTX 40 -#define MAX_UPDATE_RATE_DTX 0.4f +#define MIN_POOL_SIZE 24 +#define MIN_POOL_SIZE_DTX 40 #ifdef IVAS_FLOAT_FIXED #define MAX_UPDATE_RATE_Q31 ( 1717986944 ) #define MAX_UPDATE_RATE_DTX_Q31 ( 858993472 ) +#else +#define MAX_UPDATE_RATE 0.8f +#define MAX_UPDATE_RATE_DTX 0.4f #endif @@ -60,9 +61,80 @@ #ifdef IVAS_FLOAT_FIXED static void ivas_band_cov_fx( Word32 **ppIn_FR_real, Word32 **ppIn_FR_imag, Word16 *q_In_FR, const Word16 num_chans, const Word16 num_bins, Word16 stride, Word32 **pFb_bin_to_band, const Word16 *pFb_start_bin_per_band, const Word16 *pFb_active_bins_per_band, const Word16 start_band, const Word16 end_band, Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word16 *q_cov_real[IVAS_SPAR_MAX_CH], const Word16 HOA_md_ind[IVAS_SPAR_MAX_CH] ); -#endif +#else static void ivas_band_cov( float **ppIn_FR_real, float **ppIn_FR_imag, const int16_t num_chans, const int16_t num_bins, int16_t stride, float **pFb_bin_to_band, const int16_t *pFb_start_bin_per_band, const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ); +#endif +#ifdef IVAS_FLOAT_FIXED +/*------------------------------------------------------------------------- + * ivas_spar_covar_enc_open_fx() + * + * Allocate and initialize SPAR Covar. encoder handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_spar_covar_enc_open_fx( + ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ + ivas_filterbank_t *pFb, /* i/o: FB handle */ + const Word32 input_Fs, /* i : input sampling rate */ + const Word16 nchan_inp, /* i : number of input channels */ + const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC*/ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ +) +{ + ivas_enc_cov_handler_state_t *hCovState; + ivas_cov_smooth_cfg_t cov_smooth_cfg; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + IF( ( hCovState = (ivas_enc_cov_handler_state_t *) malloc( sizeof( ivas_enc_cov_handler_state_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder" ); + } + + cov_smooth_cfg.max_bands = IVAS_MAX_NUM_BANDS; + move16(); + cov_smooth_cfg.max_update_rate_fx = MAX_UPDATE_RATE_Q31; + move32(); + cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE; + move16(); + IF( EQ_32( smooth_mode, COV_SMOOTH_MC ) ) + { + cov_smooth_cfg.max_update_rate_fx = ONE_IN_Q31; // Q31 + move32(); + cov_smooth_cfg.min_pool_size = 20; + move16(); + } + + IF( NE_32( ( error = ivas_spar_covar_smooth_enc_open_fx( &hCovState->pCov_state, &cov_smooth_cfg, pFb, nchan_inp, smooth_mode, ivas_total_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } + + cov_smooth_cfg.max_update_rate_fx = MAX_UPDATE_RATE_DTX_Q31; + move32(); + cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE_DTX; + move16(); + + IF( NE_32( ( error = ivas_spar_covar_smooth_enc_open_fx( &hCovState->pCov_dtx_state, &cov_smooth_cfg, pFb, nchan_inp, smooth_mode, ivas_total_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } + + hCovState->num_bins = extract_l( Mpy_32_32( input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + hCovState->prior_dtx_present = 0; + move16(); + + set_zero_fx( hCovState->bb_var_lt_fx, FOA_CHANNELS ); + hCovState->prior_var_flag = -1; + move16(); + + *hCovEnc = hCovState; + + return error; +} +#else /*------------------------------------------------------------------------- * ivas_spar_covar_enc_open() * @@ -90,16 +162,10 @@ ivas_error ivas_spar_covar_enc_open( } cov_smooth_cfg.max_bands = IVAS_MAX_NUM_BANDS; -#ifdef IVAS_FLOAT_FIXED - cov_smooth_cfg.max_update_rate_fx = MAX_UPDATE_RATE_Q31; -#endif cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE; cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE; if ( smooth_mode == COV_SMOOTH_MC ) { -#ifdef IVAS_FLOAT_FIXED - cov_smooth_cfg.max_update_rate_fx = ONE_IN_Q31; // Q31 -#endif cov_smooth_cfg.max_update_rate = 1.0f; cov_smooth_cfg.min_pool_size = 20; } @@ -109,9 +175,6 @@ ivas_error ivas_spar_covar_enc_open( return error; } -#ifdef IVAS_FLOAT_FIXED - cov_smooth_cfg.max_update_rate_fx = MAX_UPDATE_RATE_DTX_Q31; -#endif cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE_DTX; cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE_DTX; @@ -130,8 +193,41 @@ ivas_error ivas_spar_covar_enc_open( return error; } +#endif +#ifdef IVAS_FLOAT_FIXED +/*------------------------------------------------------------------------- + * ivas_spar_covar_enc_close_fx() + * + * Deallocate SPAR Covar. encoder handle + *------------------------------------------------------------------------*/ + +void ivas_spar_covar_enc_close_fx( + ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ + const Word16 nchan_inp /* i : number of input channels */ +) +{ + ivas_enc_cov_handler_state_t *hCovState; + + test(); + IF( hCovEnc == NULL || *hCovEnc == NULL ) + { + return; + } + + hCovState = *hCovEnc; + + ivas_spar_covar_smooth_enc_close_fx( &hCovState->pCov_state, nchan_inp ); + + ivas_spar_covar_smooth_enc_close_fx( &hCovState->pCov_dtx_state, nchan_inp ); + + free( *hCovEnc ); + *hCovEnc = NULL; + + return; +} +#else /*------------------------------------------------------------------------- * ivas_spar_covar_enc_close() * @@ -161,6 +257,7 @@ void ivas_spar_covar_enc_close( return; } +#endif #ifdef IVAS_FLOAT_FIXED @@ -325,9 +422,7 @@ ELSE IF( EQ_16( nchan_transport, 3 ) ) return activeW_flag; } -#endif - - +#else /*-----------------------------------------------------------------------------------------* * Function ivas_spar_get_activeW_flag() * @@ -438,6 +533,7 @@ static int16_t ivas_spar_get_activeW_flag( return activeW_flag; } +#endif #ifdef IVAS_FLOAT_FIXED @@ -599,8 +695,7 @@ void ivas_enc_cov_handler_process_fx( return; } -#endif - +#else /*-----------------------------------------------------------------------------------------* * Function ivas_enc_cov_handler_process() * @@ -707,6 +802,7 @@ void ivas_enc_cov_handler_process( return; } +#endif #ifdef IVAS_FLOAT_FIXED @@ -843,9 +939,7 @@ static void ivas_band_cov_fx( return; } -#endif - - +#else static void ivas_band_cov( float **ppIn_FR_real, float **ppIn_FR_imag, @@ -914,3 +1008,4 @@ static void ivas_band_cov( return; } +#endif diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 1daf86b23..4bdf08e1a 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -42,6 +42,7 @@ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #include "prot_fx_enc.h" +#include "prot_fx1.h" #endif @@ -240,6 +241,50 @@ int16_t getNumChanAnalysis( return n; } +#ifdef IVAS_FLOAT_FIXED +Word16 getNumChanAnalysis_fx( + Encoder_Struct *st_ivas /* i : IVAS encoder structure */ +) +{ + Word16 n; + + n = add( st_ivas->nSCE, CPE_CHANNELS * st_ivas->nCPE ); + test(); + test(); + test(); + test(); + IF( EQ_32( st_ivas->hEncoderConfig->ivas_format, SBA_FORMAT ) ) + { + n = imult1616( add( st_ivas->sba_analysis_order, 1 ), add( st_ivas->sba_analysis_order, 1 ) ); + } + ELSE IF( EQ_32( st_ivas->hEncoderConfig->ivas_format, MC_FORMAT ) && ( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) || EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) ) + { + n = st_ivas->hEncoderConfig->nchan_inp; + move16(); + } + ELSE IF( EQ_32( st_ivas->hEncoderConfig->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) + { + n = st_ivas->hEncoderConfig->nchan_inp; + move16(); + } + ELSE IF( EQ_32( st_ivas->hEncoderConfig->ivas_format, ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + { + n = st_ivas->hEncoderConfig->nchan_inp; + move16(); + } + ELSE IF( EQ_32( st_ivas->hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) ) + { + n = st_ivas->hEncoderConfig->nchan_inp; + move16(); + } + ELSE IF( EQ_32( st_ivas->hEncoderConfig->ivas_format, SBA_ISM_FORMAT ) ) + { + n = add( st_ivas->hEncoderConfig->nchan_ism, imult1616( add( st_ivas->sba_analysis_order, 1 ), add( st_ivas->sba_analysis_order, 1 ) ) ); + } + + return n; +} +#endif /*-------------------------------------------------------------------* * copy_encoder_config() @@ -461,7 +506,20 @@ ivas_error ivas_init_encoder( { st_ivas->p_data_f[n] = NULL; } - +#ifdef IVAS_FLOAT_FIXED + FOR( n = 0; n < nchan_inp_buff; n++ ) + { + /* note: these are intra-frame heap memories */ + IF( ( st_ivas->p_data_fx[n] = (Word32 *) malloc( Mpy_32_16_1( input_Fs, INV_FRAME_PER_SEC_Q15 ) * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point input audio buffer!\n" ) ); + } + } + FOR( ; n < MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + st_ivas->p_data_fx[n] = NULL; + } +#endif /*-----------------------------------------------------------------* * Allocate and initialize buffer of indices *-----------------------------------------------------------------*/ @@ -976,7 +1034,29 @@ ivas_error ivas_init_encoder( set_f( st_ivas->mem_hp20_in[i], 0.0f, L_HP20_MEM ); } +#ifdef IVAS_FLOAT_FIXED + IF( n > 0 ) + { + IF( ( st_ivas->mem_hp20_in_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + } + ELSE + { + st_ivas->mem_hp20_in_fx = NULL; + } + + FOR( i = 0; i < n; i++ ) + { + IF( ( st_ivas->mem_hp20_in_fx[i] = (Word32 *) malloc( ( L_HP20_MEM + 2 ) * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + set32_fx( st_ivas->mem_hp20_in_fx[i], 0, L_HP20_MEM + 2 ); + } +#endif return error; } #ifdef IVAS_FLOAT_FIXED @@ -1030,7 +1110,7 @@ ivas_error ivas_init_encoder_fx( nchan_inp_buff++; /* for *data_separated_object */ } - +#if 1 /* To be removed */ FOR( n = 0; n < nchan_inp_buff; n++ ) { /* note: these are intra-frame heap memories */ @@ -1043,6 +1123,20 @@ ivas_error ivas_init_encoder_fx( { st_ivas->p_data_f[n] = NULL; } +#endif + FOR( n = 0; n < nchan_inp_buff; n++ ) + { + /* note: these are intra-frame heap memories */ + IF( ( st_ivas->p_data_fx[n] = (Word32 *) malloc( Mpy_32_16_1( input_Fs, INV_FRAME_PER_SEC_Q15 ) * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point input audio buffer!\n" ) ); + } + } + FOR( ; n < MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + st_ivas->p_data_fx[n] = NULL; + } + /*-----------------------------------------------------------------* * Allocate and initialize buffer of indices @@ -1535,8 +1629,8 @@ ivas_error ivas_init_encoder_fx( *-----------------------------------------------------------------*/ /* set number of input channels used for analysis/coding */ - n = getNumChanAnalysis( st_ivas ); - + n = getNumChanAnalysis_fx( st_ivas ); +#if 1 // To be removed if ( n > 0 ) { if ( ( st_ivas->mem_hp20_in = (float **) malloc( n * sizeof( float * ) ) ) == NULL ) @@ -1558,6 +1652,29 @@ ivas_error ivas_init_encoder_fx( set_f( st_ivas->mem_hp20_in[i], 0.0f, L_HP20_MEM ); } +#endif + /*Fixed point init*/ + IF( n > 0 ) + { + IF( ( st_ivas->mem_hp20_in_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + } + ELSE + { + st_ivas->mem_hp20_in_fx = NULL; + } + + FOR( i = 0; i < n; i++ ) + { + IF( ( st_ivas->mem_hp20_in_fx[i] = (Word32 *) malloc( ( L_HP20_MEM + 2 ) * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + set32_fx( st_ivas->mem_hp20_in_fx[i], 0, L_HP20_MEM + 2 ); + } return error; } @@ -1723,7 +1840,154 @@ void destroy_core_enc( * * Close IVAS encoder handles *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_destroy_enc( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + int16_t i, n, nchan_inp; + nchan_inp = st_ivas->hEncoderConfig->nchan_inp; + + /* SCE handles */ + for ( i = 0; i < MAX_SCE; i++ ) + { + if ( st_ivas->hSCE[i] != NULL ) + { + destroy_sce_enc( st_ivas->hSCE[i] ); + st_ivas->hSCE[i] = NULL; + } + } + + /* CPE handles */ + for ( i = 0; i < MAX_CPE; i++ ) + { + if ( st_ivas->hCPE[i] != NULL ) + { + destroy_cpe_enc( st_ivas->hCPE[i] ); + st_ivas->hCPE[i] = NULL; + } + } + /* HP20 filter handles */ + if ( st_ivas->mem_hp20_in != NULL ) + { + n = getNumChanAnalysis_fx( st_ivas ); + + for ( i = 0; i < n; i++ ) + { + free( st_ivas->mem_hp20_in_fx[i] ); + st_ivas->mem_hp20_in_fx[i] = NULL; + } + free( st_ivas->mem_hp20_in_fx ); + st_ivas->mem_hp20_in_fx = NULL; + } + if ( st_ivas->mem_hp20_in != NULL ) + { + n = getNumChanAnalysis_fx( st_ivas ); + + for ( i = 0; i < n; i++ ) + { + free( st_ivas->mem_hp20_in[i] ); + st_ivas->mem_hp20_in[i] = NULL; + } + free( st_ivas->mem_hp20_in ); + st_ivas->mem_hp20_in = NULL; + } + + /* ISM metadata handles */ + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); + + /* ISM DTX Handle */ + if ( st_ivas->hISMDTX != NULL ) + { + free( st_ivas->hISMDTX ); + st_ivas->hISMDTX = NULL; + } + + /* Q Metadata handle */ + ivas_qmetadata_close( &( st_ivas->hQMetaData ) ); + + /* DirAC handle */ + ivas_dirac_enc_close( &( st_ivas->hDirAC ), st_ivas->hEncoderConfig->input_Fs ); + + /* ParamISM handle */ + ivas_param_ism_enc_close( &( st_ivas->hParamIsm ), st_ivas->hEncoderConfig->input_Fs ); + + /* SPAR handle */ + ivas_spar_enc_close( &( st_ivas->hSpar ), st_ivas->hEncoderConfig->input_Fs, nchan_inp, 0 ); + + /* MASA handle */ + ivas_masa_enc_close( &( st_ivas->hMasa ) ); + + /* MCT handle */ + ivas_mct_enc_close( &( st_ivas->hMCT ) ); + + /* LFE handle */ + ivas_lfe_enc_close( &( st_ivas->hLFE ) ); + + /* LFE low pass filter state */ + ivas_lfe_lpf_enc_close( &( st_ivas->hLfeLpf ) ); + + /* Param-Upmix MC handle */ + ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs ); + + /* Parametric MC handle */ + ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs ); + + /* Multi-channel MASA handle */ + ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); + + /* OMASA handle */ + ivas_omasa_enc_close( &( st_ivas->hOMasa ) ); + + /* OSBA handle */ + ivas_osba_enc_close( &( st_ivas->hOSba ) ); + + /* Stereo downmix for EVS encoder handle */ + stereo_dmx_evs_close_encoder( &( st_ivas->hStereoDmxEVS ) ); + + /* Encoder configuration handle */ + if ( st_ivas->hEncoderConfig != NULL ) + { + free( st_ivas->hEncoderConfig ); + st_ivas->hEncoderConfig = NULL; + } + + /* Buffer of indices */ + if ( st_ivas->ind_list != NULL ) + { + free( st_ivas->ind_list ); + } + + if ( st_ivas->ind_list_metadata != NULL ) + { + free( st_ivas->ind_list_metadata ); + } + + /* floating-point input audio buffers */ + for ( n = 0; n < MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + if ( st_ivas->p_data_f[n] != NULL ) + { + free( st_ivas->p_data_f[n] ); + st_ivas->p_data_f[n] = NULL; + } + } + for ( n = 0; n < MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + if ( st_ivas->p_data_fx[n] != NULL ) + { + free( st_ivas->p_data_fx[n] ); + st_ivas->p_data_fx[n] = NULL; + } + } + + /* main IVAS handle */ + free( st_ivas ); + + return; +} +#else void ivas_destroy_enc( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ) @@ -1850,6 +2114,7 @@ void ivas_destroy_enc( return; } +#endif /*------------------------------------------------------------------------- * ivas_initialize_MD_bstr_enc() diff --git a/lib_enc/ivas_lfe_enc.c b/lib_enc/ivas_lfe_enc.c index 26829a6d7..f4923cafd 100644 --- a/lib_enc/ivas_lfe_enc.c +++ b/lib_enc/ivas_lfe_enc.c @@ -94,7 +94,7 @@ static void ivas_lfe_arith_coding( * * LFE quatization block, calls arithmetic coding block inside *-----------------------------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED static void ivas_lfe_enc_quant( LFE_ENC_HANDLE hLFE, float *pLfe_dct, @@ -319,7 +319,7 @@ static void ivas_lfe_enc_quant( } -#ifdef IVAS_FLOAT_FIXED +#else static void ivas_lfe_enc_quant_fx( LFE_ENC_HANDLE hLFE, @@ -626,7 +626,7 @@ static void ivas_lfe_enc_quant_fx( * * LFE channel encoder *-----------------------------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void ivas_lfe_enc( LFE_ENC_HANDLE hLFE, /* i/o: LFE encoder handle */ float data_lfe_ch[], /* i : input LFE signal */ @@ -669,7 +669,7 @@ void ivas_lfe_enc( return; } -#ifdef IVAS_FLOAT_FIXED +#else void ivas_lfe_enc_fx( LFE_ENC_HANDLE hLFE, /* i/o: LFE encoder handle */ @@ -779,7 +779,85 @@ void ivas_lfe_enc_fx( * * Create, allocate and initialize IVAS encoder LFE handle *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_create_lfe_enc( + LFE_ENC_HANDLE *hLFE_out, /* o : IVAS LFE encoder structure */ + const Word32 input_Fs /* i : input sampling rate */ +) +{ + Word16 input_frame; + LFE_ENC_HANDLE hLFE; + Word16 i, j; + + input_frame = extract_l( Mpy_32_16_1( input_Fs, INV_FRAME_PER_SEC_Q15 ) ); + + /*-----------------------------------------------------------------* + * Allocate LFE handle + *-----------------------------------------------------------------*/ + + IF ( ( hLFE = (LFE_ENC_HANDLE) malloc( sizeof( LFE_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE\n" ) ); + } + + /* initializations */ + hLFE->lfe_bits = 0; + move16(); + hLFE->pWindow_state = NULL; + hLFE->hBstr = NULL; + + /*-----------------------------------------------------------------* + * Input memory buffer: allocate and initialize + *-----------------------------------------------------------------*/ + + IF( ( hLFE->old_wtda_audio_fx = (Word32 *) malloc( sizeof( hLFE->old_wtda_audio_fx[0] ) * NS2SA( input_Fs, IVAS_LFE_FADE_NS ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE memory\n" ) ); + } + + set32_fx( hLFE->old_wtda_audio_fx, 0, NS2SA( input_Fs, IVAS_LFE_FADE_NS ) ); + hLFE->q_old_wtda_audio = 31; + move16(); + + /*-----------------------------------------------------------------* + * LFE Window: allocate and initialize + *-----------------------------------------------------------------*/ + + IF ( ( hLFE->pWindow_state = (LFE_WINDOW_HANDLE) malloc( sizeof( LFE_WINDOW_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE window structure\n" ) ); + } + + ivas_lfe_window_init_fx( hLFE->pWindow_state, input_Fs, input_frame ); + + /* Initialization for entropy coding */ + hLFE->cum_freq_models[0][0] = ivas_str_lfe_freq_models.entropy_coder_model_fine_sg1; + hLFE->cum_freq_models[0][1] = ivas_str_lfe_freq_models.entropy_coder_model_fine_sg2; + hLFE->cum_freq_models[0][2] = ivas_str_lfe_freq_models.entropy_coder_model_fine_sg3; + hLFE->cum_freq_models[0][3] = ivas_str_lfe_freq_models.entropy_coder_model_fine_sg4; + hLFE->cum_freq_models[1][0] = ivas_str_lfe_freq_models.entropy_coder_model_coarse_sg1; + hLFE->cum_freq_models[1][1] = ivas_str_lfe_freq_models.entropy_coder_model_coarse_sg2; + hLFE->cum_freq_models[1][2] = ivas_str_lfe_freq_models.entropy_coder_model_coarse_sg3; + hLFE->cum_freq_models[1][3] = &ivas_str_lfe_freq_models.entropy_coder_model_coarse_sg4; + + /* Initialization base2 bits for each subgroup for no entropy coding */ + FOR ( i = 0; i < IVAS_MAX_NUM_QUANT_STRATS; i++ ) + { + FOR( j = 0; j < IVAS_MAX_NUM_DCT_COEF_GROUPS; j++ ) + { + // hLFE->lfe_enc_indices_coeffs_tbl[i][j] = + // (int16_t) ceilf( log2f( (float) ( ivas_lfe_num_ele_in_coder_models[i][j] + 1 ) ) ); + hLFE->lfe_enc_indices_coeffs_tbl[i][j] = + floor_log_2( add( ivas_lfe_num_ele_in_coder_models[i][j], 1 ) ); + move16(); + } + } + + *hLFE_out = hLFE; + return IVAS_ERR_OK; +} +#else ivas_error ivas_create_lfe_enc( LFE_ENC_HANDLE *hLFE_out, /* o : IVAS LFE encoder structure */ const int32_t input_Fs /* i : input sampling rate */ @@ -866,14 +944,42 @@ ivas_error ivas_create_lfe_enc( return IVAS_ERR_OK; } - +#endif /*------------------------------------------------------------------------- * ivas_lfe_enc_close() * * Destroy IVAS cncoder LFE handle *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_lfe_enc_close( + LFE_ENC_HANDLE *hLFE /* i/o: LFE encoder handle */ +) +{ + test(); + IF( hLFE == NULL || *hLFE == NULL ) + { + return; + } + + IF( ( *hLFE )->old_wtda_audio_fx != NULL ) + { + free( ( *hLFE )->old_wtda_audio_fx ); + ( *hLFE )->old_wtda_audio_fx = NULL; + } + IF( ( *hLFE )->pWindow_state ) + { + free( ( *hLFE )->pWindow_state ); + ( *hLFE )->pWindow_state = NULL; + } + + free( ( *hLFE ) ); + ( *hLFE ) = NULL; + + return; +} +#else void ivas_lfe_enc_close( LFE_ENC_HANDLE *hLFE /* i/o: LFE encoder handle */ ) @@ -908,7 +1014,7 @@ void ivas_lfe_enc_close( return; } - +#endif /*------------------------------------------------------------------------- * ivas_create_lfe_lpf_enc() diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index db20e7bc2..ea0fd5bfb 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -40,6 +40,7 @@ #include "ivas_prot.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" +#include "prot_fx2.h" #endif #include "ivas_cnst.h" #include "ivas_rom_com.h" @@ -52,7 +53,11 @@ static void ivas_mc_paramupmix_dmx( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, float *data_f[], const int16_t input_frame ); +#ifdef IVAS_FLOAT_FIXED +static ivas_error ivas_mc_paramupmix_param_est_enc( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, float *input_frame_t[], const int16_t input_frame, float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS], float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS] ); +#else static void ivas_mc_paramupmix_param_est_enc( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, float *input_frame_t[], const int16_t input_frame, float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS], float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS] ); +#endif static void get_huff_table( const PAR_TYPE par_type, HUFF_TAB *df0, HUFF_TAB *df ); @@ -197,10 +202,17 @@ ivas_error ivas_mc_paramupmix_enc_open( for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { /* Covariance handle */ +#ifdef IVAS_FLOAT_FIXED + IF( NE_32( ( error = ivas_spar_covar_enc_open_fx( &( hMCParamUpmix->hCovEnc[i] ), hMCParamUpmix->hFbMixer->pFb, input_Fs, MC_PARAMUPMIX_NCH + 1, COV_SMOOTH_MC, st_ivas->hEncoderConfig->ivas_total_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } +#else if ( ( error = ivas_spar_covar_enc_open( &( hMCParamUpmix->hCovEnc[i] ), hMCParamUpmix->hFbMixer->pFb, input_Fs, MC_PARAMUPMIX_NCH + 1, COV_SMOOTH_MC, st_ivas->hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) { return error; } +#endif } for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) @@ -333,7 +345,11 @@ void ivas_mc_paramupmix_enc_close( /* Covariance handle */ if ( ( *hMCParamUpmix )->hCovEnc[i] != NULL ) { +#ifdef IVAS_FLOAT_FIXED + ivas_spar_covar_enc_close_fx( &( *hMCParamUpmix )->hCovEnc[i], ( MC_PARAMUPMIX_NCH + 1 ) ); +#else ivas_spar_covar_enc_close( &( *hMCParamUpmix )->hCovEnc[i], ( MC_PARAMUPMIX_NCH + 1 ) ); +#endif } } @@ -664,12 +680,21 @@ static void ivas_mc_paramupmix_dmx( * estimate the input and down mix covariances *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static ivas_error ivas_mc_paramupmix_param_est_enc( + MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ + float *data_f[], /* i : Input frame in the time domain */ + const int16_t input_frame, /* i : Input frame length */ + float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS], + float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS] ) +#else static void ivas_mc_paramupmix_param_est_enc( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ float *data_f[], /* i : Input frame in the time domain */ const int16_t input_frame, /* i : Input frame length */ float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS], float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS] ) +#endif { float *pcm_in[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; float fr_realbuffer[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH][L_FRAME48k]; @@ -679,8 +704,19 @@ static void ivas_mc_paramupmix_param_est_enc( float *p_fr_imagbuffer[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; float *pp_in_fr_real[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; float *pp_in_fr_imag[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; +#ifdef IVAS_FLOAT_FIXED + Word32 *cov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + Word32 *cov_dtx_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + Word16 *q_cov_real[IVAS_SPAR_MAX_CH]; + Word16 *q_cov_dtx_real[IVAS_SPAR_MAX_CH]; + Word32 cov_real_buf_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + Word32 cov_dtx_real_buf_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; + Word32 *pp_in_fr_real_fx[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH], *pp_in_fr_imag_fx[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; + Word16 q_ppIn_FR[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; +#else float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; +#endif float rxx, rxy, ryy, cmat, rxxest, drxx, wetaux; int16_t l_ts; int16_t b, i, j, ts, bnd; @@ -785,12 +821,85 @@ static void ivas_mc_paramupmix_param_est_enc( { for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ ) { +#ifdef IVAS_FLOAT_FIXED + cov_real_fx[i][j] = cov_real_buf_fx[i][j]; + cov_dtx_real_fx[i][j] = cov_dtx_real_buf_fx[i][j]; +#else cov_real[i][j] = hMCParamUpmix->cov_real[b][i][j]; cov_dtx_real[i][j] = hMCParamUpmix->cov_dtx_real[b][i][j]; +#endif + } +#ifdef IVAS_FLOAT_FIXED + IF( ( q_cov_real[i] = (Word16 *) malloc( sizeof( Word16 ) * MC_PARAMUPMIX_NCH ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder Fixed" ); + } + set_s( q_cov_real[i], Q31, MC_PARAMUPMIX_NCH ); + IF( ( q_cov_dtx_real[i] = (Word16 *) malloc( sizeof( Word16 ) * MC_PARAMUPMIX_NCH ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV encoder Fixed" ); } + set_s( q_cov_dtx_real[i], Q31, MC_PARAMUPMIX_NCH ); +#endif + } + +#ifdef IVAS_FLOAT_FIXED + FOR( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) + { + IF( ( pp_in_fr_real_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * input_frame ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR encoder Fixed" ); + } + set_zero_fx( pp_in_fr_real_fx[i], input_frame ); + IF( ( pp_in_fr_imag_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * input_frame ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR encoder Fixed" ); + } + set_zero_fx( pp_in_fr_imag_fx[i], input_frame ); + } + set_s( q_ppIn_FR, Q31, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH ); + + FOR( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) + { + q_ppIn_FR[i] = L_get_q_buf1( pp_in_fr_real[i], input_frame ); + q_ppIn_FR[i] = min( q_ppIn_FR[i], L_get_q_buf1( pp_in_fr_imag[i], input_frame ) ); + floatToFixed_arrL( pp_in_fr_real[i], pp_in_fr_real_fx[i], q_ppIn_FR[i], input_frame ); + floatToFixed_arrL( pp_in_fr_imag[i], pp_in_fr_imag_fx[i], q_ppIn_FR[i], input_frame ); } +#endif +#ifdef IVAS_FLOAT_FIXED + ivas_enc_cov_handler_process_fx( hMCParamUpmix->hCovEnc[b], pp_in_fr_real_fx, pp_in_fr_imag_fx, q_ppIn_FR, cov_real_fx, q_cov_real, cov_dtx_real_fx, q_cov_dtx_real, hMCParamUpmix->hFbMixer->pFb, 0, hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands, MC_PARAMUPMIX_NCH, 0 /*dtx_vad*/, transient_det[b], HOA_md_ind, NULL, NULL, NULL, 0, 0 ); +#else ivas_enc_cov_handler_process( hMCParamUpmix->hCovEnc[b], pp_in_fr_real, pp_in_fr_imag, cov_real, cov_dtx_real, hMCParamUpmix->hFbMixer->pFb, 0, hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands, MC_PARAMUPMIX_NCH, 0 /*dtx_vad*/, transient_det[b], HOA_md_ind, NULL, NULL, NULL, 0, 0 ); +#endif + +#ifdef IVAS_FLOAT_FIXED + FOR( i = 0; i < MC_PARAMUPMIX_NCH; i++ ) + { + FOR( j = 0; j < MC_PARAMUPMIX_NCH; j++ ) + { + FOR( k = 0; k < hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands; k++ ) + { + hMCParamUpmix->cov_real[b][i][j][k] = me2f( cov_real_fx[i][j][k], sub( Q31, hMCParamUpmix->hCovEnc[b]->pCov_state->q_cov_real_per_band[i][j][k] ) ); + hMCParamUpmix->cov_dtx_real[b][i][j][k] = me2f( cov_dtx_real_fx[i][j][k], sub( Q31, hMCParamUpmix->hCovEnc[b]->pCov_dtx_state->q_cov_real_per_band[i][j][k] ) ); + } + } + free( q_cov_real[i] ); + q_cov_real[i] = NULL; + free( q_cov_dtx_real[i] ); + q_cov_dtx_real[i] = NULL; + } + // Note: No need to convert pp_in_fr_real_fx and pp_in_fr_imag_fx back to float as they are not used after ivas_mc_paramupmix_param_est_enc() + + FOR( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) + { + free( pp_in_fr_real_fx[i] ); + pp_in_fr_real_fx[i] = NULL; + free( pp_in_fr_imag_fx[i] ); + pp_in_fr_imag_fx[i] = NULL; + } +#endif } maxbands = hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands; @@ -824,5 +933,9 @@ static void ivas_mc_paramupmix_param_est_enc( } } +#ifdef IVAS_FLOAT_FIXED + return IVAS_ERR_OK; +#else return; +#endif } diff --git a/lib_enc/ivas_osba_enc.c b/lib_enc/ivas_osba_enc.c index 296dbce5c..5389d11d2 100644 --- a/lib_enc/ivas_osba_enc.c +++ b/lib_enc/ivas_osba_enc.c @@ -42,6 +42,8 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" +#include "prot_fx1.h" +#include "prot_fx2.h" #endif @@ -170,7 +172,264 @@ void ivas_osba_enc_close( * * oSBA encoder reconfiguration *--------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_osba_enc_reconfig( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + + Word16 n, nSCE_old, nCPE_old, nchan_transport_old; + ISM_MODE old_ism_mode; + Word32 ivas_total_brate; + ivas_error error; + ENCODER_CONFIG_HANDLE hEncoderConfig; + + error = IVAS_ERR_OK; move32(); + hEncoderConfig = st_ivas->hEncoderConfig; + ivas_total_brate = hEncoderConfig->ivas_total_brate; move32(); + + IF ( NE_32(ivas_total_brate, hEncoderConfig->last_ivas_total_brate) ) + { + DIRAC_ENC_HANDLE hDirAC = st_ivas->hDirAC; + SPAR_ENC_HANDLE hSpar; + int16_t analysis_order_old; + int16_t spar_reconfig_flag; + int16_t nbands_old; + int16_t ndir_old; + + spar_reconfig_flag = 0;move16(); + old_ism_mode = st_ivas->ism_mode;move32(); + IF ( GE_32(ivas_total_brate, IVAS_256k) ) + { + st_ivas->ism_mode = ISM_SBA_MODE_DISC;move32(); + } + ELSE + { + st_ivas->ism_mode = ISM_MODE_NONE;move32(); + } + nchan_transport_old = st_ivas->nchan_transport; + nCPE_old = st_ivas->nCPE; + nSCE_old = st_ivas->nSCE; + move16(); + move16(); + move16(); + + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, hEncoderConfig->sba_order ); + move16(); + analysis_order_old = ivas_sba_get_analysis_order_fx( hEncoderConfig->last_ivas_total_brate, hEncoderConfig->sba_order ); + + nbands_old = st_ivas->hQMetaData->q_direction->cfg.nbands; + move16(); + ndir_old = st_ivas->hQMetaData->no_directions; + move16(); + + test(); + IF ( NE_16( analysis_order_old, st_ivas->sba_analysis_order ) || NE_32( old_ism_mode, st_ivas->ism_mode ) ) + { + Word16 i, n_old; + Word32 **old_mem_hp20_in_fx; + + n_old = add(st_ivas->hEncoderConfig->nchan_ism, imult1616(add( analysis_order_old, 1 ), add( analysis_order_old, 1 ))); + n = add(st_ivas->hEncoderConfig->nchan_ism, imult1616(add( st_ivas->sba_analysis_order, 1 ), add( st_ivas->sba_analysis_order, 1 ))); +#if 1 // To be removed + float **old_mem_hp20_in; + + if ( n > n_old ) + { + /* save old mem_hp_20 pointer */ + old_mem_hp20_in = st_ivas->mem_hp20_in; + st_ivas->mem_hp20_in = NULL; + + if ( ( st_ivas->mem_hp20_in = (float **) malloc( n * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + for ( i = 0; i < n_old; i++ ) + { + st_ivas->mem_hp20_in[i] = old_mem_hp20_in[i]; + old_mem_hp20_in[i] = NULL; + } + /* create additional hp20 memories */ + for ( ; i < n; i++ ) + { + if ( ( st_ivas->mem_hp20_in[i] = (float *) malloc( L_HP20_MEM * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + set_f( st_ivas->mem_hp20_in[i], 0.0f, L_HP20_MEM ); + } + + free( old_mem_hp20_in ); + old_mem_hp20_in = NULL; + } + else if ( n < n_old ) + { + /* save old mem_hp_20 pointer */ + old_mem_hp20_in = st_ivas->mem_hp20_in; + st_ivas->mem_hp20_in = NULL; + + if ( ( st_ivas->mem_hp20_in = (float **) malloc( n * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + for ( i = 0; i < n; i++ ) + { + st_ivas->mem_hp20_in[i] = old_mem_hp20_in[i]; + old_mem_hp20_in[i] = NULL; + } + /* remove superfluous hp20 memories */ + for ( ; i < n_old; i++ ) + { + free( old_mem_hp20_in[i] ); + old_mem_hp20_in[i] = NULL; + } + + free( old_mem_hp20_in ); + old_mem_hp20_in = NULL; + } +#endif + IF( GT_16( n, n_old ) ) + { + /* save old mem_hp_20 pointer */ + old_mem_hp20_in_fx = st_ivas->mem_hp20_in_fx; + st_ivas->mem_hp20_in_fx = NULL; + + IF ( ( st_ivas->mem_hp20_in_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + FOR ( i = 0; i < n_old; i++ ) + { + st_ivas->mem_hp20_in_fx[i] = old_mem_hp20_in_fx[i]; + old_mem_hp20_in_fx[i] = NULL; + } + /* create additional hp20 memories */ + FOR ( ; i < n; i++ ) + { + IF ( ( st_ivas->mem_hp20_in_fx[i] = (Word32 *) malloc( (L_HP20_MEM+2) * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + set32_fx( st_ivas->mem_hp20_in_fx[i], 0, L_HP20_MEM + 2 ); + } + + free( old_mem_hp20_in_fx ); + old_mem_hp20_in_fx = NULL; + } + ELSE IF ( LT_16(n, n_old) ) + { + /* save old mem_hp_20 pointer */ + old_mem_hp20_in_fx = st_ivas->mem_hp20_in_fx; + st_ivas->mem_hp20_in_fx = NULL; + + IF ( ( st_ivas->mem_hp20_in_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + FOR ( i = 0; i < n; i++ ) + { + st_ivas->mem_hp20_in_fx[i] = old_mem_hp20_in_fx[i]; + old_mem_hp20_in_fx[i] = NULL; + } + /* remove superfluous hp20 memories */ + FOR ( ; i < n_old; i++ ) + { + free( old_mem_hp20_in_fx[i] ); + old_mem_hp20_in_fx[i] = NULL; + } + + free( old_mem_hp20_in_fx ); + old_mem_hp20_in_fx = NULL; + } + + } + + ivas_spar_config( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 ); + + hSpar = st_ivas->hSpar; + + if ( st_ivas->nchan_transport == 1 ) + { + hEncoderConfig->element_mode_init = IVAS_SCE; + } + else + { + hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + } + if ( nchan_transport_old != st_ivas->nchan_transport || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) ) + { + /* FB mixer handle */ + if ( hDirAC->hFbMixer != NULL ) + { + ivas_FB_mixer_close( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs, 0 ); + hDirAC->hFbMixer = NULL; + } + spar_reconfig_flag = 1; + ivas_spar_enc_close( &( st_ivas->hSpar ), hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag ); + + if ( ( error = ivas_spar_enc_open( st_ivas, spar_reconfig_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + } + st_ivas->hSpar->spar_reconfig_flag = spar_reconfig_flag; + if ( ( error = ivas_dirac_enc_reconfigure( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( st_ivas->hQMetaData->q_direction->cfg.nbands != nbands_old || st_ivas->hQMetaData->no_directions != ndir_old ) + { + int16_t dir, j, i; + IVAS_QDIRECTION *q_direction = st_ivas->hQMetaData->q_direction; + for ( dir = 0; dir < st_ivas->hQMetaData->no_directions; dir++ ) + { + for ( j = 0; j < q_direction[dir].cfg.nbands; j++ ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + q_direction[dir].band_data[j].energy_ratio_index[i] = 0; + q_direction[dir].band_data[j].energy_ratio_index_mod[i] = 0; + } + } + } + } + hSpar->enc_param_start_band = hDirAC->hConfig->enc_param_start_band; + + /*-----------------------------------------------------------------* + * Allocate, initialize, and configure SCE/CPE/MCT handles + *-----------------------------------------------------------------*/ + + if ( old_ism_mode == ISM_MODE_NONE && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + st_ivas->nCPE += ( st_ivas->hEncoderConfig->nchan_ism + 1 ) >> 1; + } + else if ( old_ism_mode == ISM_SBA_MODE_DISC && st_ivas->ism_mode == ISM_MODE_NONE ) + { + nchan_transport_old += st_ivas->hEncoderConfig->nchan_ism; + } + else if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC ) + { + st_ivas->nCPE += ( st_ivas->hEncoderConfig->nchan_ism + 1 ) >> 1; + nCPE_old = st_ivas->nCPE; + nchan_transport_old = st_ivas->nchan_transport; + nchan_transport_old += st_ivas->hEncoderConfig->nchan_ism; + } + + if ( ( error = ivas_corecoder_enc_reconfig( st_ivas, nSCE_old, nCPE_old, nchan_transport_old, ivas_total_brate / st_ivas->nchan_transport, ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS, MC_MODE_NONE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return error; +} +#else ivas_error ivas_osba_enc_reconfig( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ) @@ -208,13 +467,10 @@ ivas_error ivas_osba_enc_reconfig( nchan_transport_old = st_ivas->nchan_transport; nCPE_old = st_ivas->nCPE; nSCE_old = st_ivas->nSCE; -#ifndef IVAS_FLOAT_FIXED + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, hEncoderConfig->sba_order ); analysis_order_old = ivas_sba_get_analysis_order( hEncoderConfig->last_ivas_total_brate, hEncoderConfig->sba_order ); -#else - st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, hEncoderConfig->sba_order ); - analysis_order_old = ivas_sba_get_analysis_order_fx( hEncoderConfig->last_ivas_total_brate, hEncoderConfig->sba_order ); -#endif + nbands_old = st_ivas->hQMetaData->q_direction->cfg.nbands; ndir_old = st_ivas->hQMetaData->no_directions; @@ -363,7 +619,7 @@ ivas_error ivas_osba_enc_reconfig( return error; } - +#endif /*--------------------------------------------------------------------------* * ivas_osba_enc() diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index cbd9c869d..2ebcdba1e 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -43,6 +43,8 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" +#include "prot_fx1.h" +#include "prot_fx2.h" #endif @@ -87,7 +89,244 @@ void ivas_sba_getTCs( * * Reconfigure IVAS SBA encoder *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +/* To be renamed as ivas_sba_enc_reconfigure_fx later */ +ivas_error ivas_sba_enc_reconfigure( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + Word16 n, nSCE_old, nCPE_old, nchan_transport_old; + Word32 ivas_total_brate; + ivas_error error; + ENCODER_CONFIG_HANDLE hEncoderConfig; + + error = IVAS_ERR_OK; + move32(); + hEncoderConfig = st_ivas->hEncoderConfig; + ivas_total_brate = hEncoderConfig->ivas_total_brate; + move32(); + + IF( NE_32( ivas_total_brate, hEncoderConfig->last_ivas_total_brate ) ) + { + DIRAC_ENC_HANDLE hDirAC = st_ivas->hDirAC; + SPAR_ENC_HANDLE hSpar; + Word16 analysis_order_old; + Word16 spar_reconfig_flag; + Word16 nbands_old; + Word16 ndir_old; + + spar_reconfig_flag = 0; + nchan_transport_old = st_ivas->nchan_transport; + nCPE_old = st_ivas->nCPE; + nSCE_old = st_ivas->nSCE; + move16(); + move16(); + move16(); + move16(); + + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, hEncoderConfig->sba_order ); + move16(); + analysis_order_old = ivas_sba_get_analysis_order_fx( hEncoderConfig->last_ivas_total_brate, hEncoderConfig->sba_order ); + + nbands_old = st_ivas->hQMetaData->q_direction->cfg.nbands; + move16(); + ndir_old = st_ivas->hQMetaData->no_directions; + move16(); + + IF( NE_16( analysis_order_old, st_ivas->sba_analysis_order ) ) + { + Word16 i, n_old; + Word32 **old_mem_hp20_in_fx; + + n_old = imult1616( add( analysis_order_old, 1 ), add( analysis_order_old, 1 ) ); + n = imult1616( add( st_ivas->sba_analysis_order, 1 ), add( st_ivas->sba_analysis_order, 1 ) ); +#if 1 // To be removed + float **old_mem_hp20_in; + + if ( n > n_old ) + { + /* save old mem_hp_20 pointer */ + old_mem_hp20_in = st_ivas->mem_hp20_in; + st_ivas->mem_hp20_in = NULL; + + if ( ( st_ivas->mem_hp20_in = (float **) malloc( n * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + for ( i = 0; i < n_old; i++ ) + { + st_ivas->mem_hp20_in[i] = old_mem_hp20_in[i]; + old_mem_hp20_in[i] = NULL; + } + /* create additional hp20 memories */ + for ( ; i < n; i++ ) + { + if ( ( st_ivas->mem_hp20_in[i] = (float *) malloc( L_HP20_MEM * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + set_f( st_ivas->mem_hp20_in[i], 0.0f, L_HP20_MEM ); + } + + free( old_mem_hp20_in ); + old_mem_hp20_in = NULL; + } + else if ( n < n_old ) + { + /* save old mem_hp_20 pointer */ + old_mem_hp20_in = st_ivas->mem_hp20_in; + st_ivas->mem_hp20_in = NULL; + + if ( ( st_ivas->mem_hp20_in = (float **) malloc( n * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + for ( i = 0; i < n; i++ ) + { + st_ivas->mem_hp20_in[i] = old_mem_hp20_in[i]; + old_mem_hp20_in[i] = NULL; + } + /* remove superfluous hp20 memories */ + for ( ; i < n_old; i++ ) + { + free( old_mem_hp20_in[i] ); + old_mem_hp20_in[i] = NULL; + } + + free( old_mem_hp20_in ); + old_mem_hp20_in = NULL; + } +#endif + IF( GT_16( n, n_old ) ) + { + /* save old mem_hp_20 pointer */ + old_mem_hp20_in_fx = st_ivas->mem_hp20_in_fx; + st_ivas->mem_hp20_in_fx = NULL; + + IF( ( st_ivas->mem_hp20_in_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + FOR( i = 0; i < n_old; i++ ) + { + st_ivas->mem_hp20_in_fx[i] = old_mem_hp20_in_fx[i]; + old_mem_hp20_in_fx[i] = NULL; + } + /* create additional hp20 memories */ + FOR( ; i < n; i++ ) + { + IF( ( st_ivas->mem_hp20_in_fx[i] = (Word32 *) malloc( ( L_HP20_MEM + 2 ) * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + set32_fx( st_ivas->mem_hp20_in_fx[i], 0, L_HP20_MEM + 2 ); + } + + free( old_mem_hp20_in_fx ); + old_mem_hp20_in_fx = NULL; + } + ELSE IF( LT_16( n, n_old ) ) + { + /* save old mem_hp_20 pointer */ + old_mem_hp20_in_fx = st_ivas->mem_hp20_in_fx; + st_ivas->mem_hp20_in_fx = NULL; + + IF( ( st_ivas->mem_hp20_in_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + + FOR( i = 0; i < n; i++ ) + { + st_ivas->mem_hp20_in_fx[i] = old_mem_hp20_in_fx[i]; + old_mem_hp20_in_fx[i] = NULL; + } + /* remove superfluous hp20 memories */ + FOR( ; i < n_old; i++ ) + { + free( old_mem_hp20_in_fx[i] ); + old_mem_hp20_in_fx[i] = NULL; + } + + free( old_mem_hp20_in_fx ); + old_mem_hp20_in_fx = NULL; + } + } + + ivas_spar_config( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 ); + + hSpar = st_ivas->hSpar; + + if ( st_ivas->nchan_transport == 1 ) + { + hEncoderConfig->element_mode_init = IVAS_SCE; + } + else + { + hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + } + + if ( nchan_transport_old != st_ivas->nchan_transport || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) ) + { + /* FB mixer handle */ + if ( hDirAC->hFbMixer != NULL ) + { + ivas_FB_mixer_close( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs, 0 ); + hDirAC->hFbMixer = NULL; + } + spar_reconfig_flag = 1; + ivas_spar_enc_close( &( st_ivas->hSpar ), hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag ); + + if ( ( error = ivas_spar_enc_open( st_ivas, spar_reconfig_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + st_ivas->hSpar->spar_reconfig_flag = spar_reconfig_flag; + + if ( ( error = ivas_dirac_enc_reconfigure( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hQMetaData->q_direction->cfg.nbands != nbands_old || st_ivas->hQMetaData->no_directions != ndir_old ) + { + int16_t dir, j, i; + IVAS_QDIRECTION *q_direction = st_ivas->hQMetaData->q_direction; + for ( dir = 0; dir < st_ivas->hQMetaData->no_directions; dir++ ) + { + for ( j = 0; j < q_direction[dir].cfg.nbands; j++ ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + q_direction[dir].band_data[j].energy_ratio_index[i] = 0; + q_direction[dir].band_data[j].energy_ratio_index_mod[i] = 0; + } + } + } + } + hSpar->enc_param_start_band = hDirAC->hConfig->enc_param_start_band; + + /*-----------------------------------------------------------------* + * Allocate, initialize, and configure SCE/CPE/MCT handles + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_corecoder_enc_reconfig( st_ivas, nSCE_old, nCPE_old, nchan_transport_old, ivas_total_brate / st_ivas->nchan_transport, ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS, MC_MODE_NONE ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return error; +} +#else ivas_error ivas_sba_enc_reconfigure( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ) @@ -114,13 +353,10 @@ ivas_error ivas_sba_enc_reconfigure( nchan_transport_old = st_ivas->nchan_transport; nCPE_old = st_ivas->nCPE; nSCE_old = st_ivas->nSCE; -#ifndef IVAS_FLOAT_FIXED + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, hEncoderConfig->sba_order ); analysis_order_old = ivas_sba_get_analysis_order( hEncoderConfig->last_ivas_total_brate, hEncoderConfig->sba_order ); -#else - st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, hEncoderConfig->sba_order ); - analysis_order_old = ivas_sba_get_analysis_order_fx( hEncoderConfig->last_ivas_total_brate, hEncoderConfig->sba_order ); -#endif + nbands_old = st_ivas->hQMetaData->q_direction->cfg.nbands; ndir_old = st_ivas->hQMetaData->no_directions; @@ -257,3 +493,4 @@ ivas_error ivas_sba_enc_reconfigure( return error; } +#endif diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 238a9ff7b..b1e9ad53a 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -150,10 +150,17 @@ ivas_error ivas_spar_enc_open( } /* Covariance handle */ +#ifdef IVAS_FLOAT_FIXED + IF( NE_32( ( error = ivas_spar_covar_enc_open_fx( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, input_Fs, nchan_inp, COV_SMOOTH_SPAR, hEncoderConfig->ivas_total_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } +#else if ( ( error = ivas_spar_covar_enc_open( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, input_Fs, nchan_inp, COV_SMOOTH_SPAR, hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) { return error; } +#endif if ( !spar_reconfig_flag ) { @@ -344,10 +351,17 @@ ivas_error ivas_spar_enc_open_fx( } /* Covariance handle */ +#ifdef IVAS_FLOAT_FIXED + IF( NE_32( ( error = ivas_spar_covar_enc_open_fx( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, input_Fs, nchan_inp, COV_SMOOTH_SPAR, hEncoderConfig->ivas_total_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } +#else IF( ( error = ivas_spar_covar_enc_open( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, input_Fs, nchan_inp, COV_SMOOTH_SPAR, hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) { return error; } +#endif IF( !spar_reconfig_flag ) { @@ -494,7 +508,11 @@ void ivas_spar_enc_close( ivas_spar_md_enc_close( &( *hSpar )->hMdEnc ); /* Covar. State handle */ +#ifdef IVAS_FLOAT_FIXED + ivas_spar_covar_enc_close_fx( &( *hSpar )->hCovEnc, num_chans ); +#else ivas_spar_covar_enc_close( &( *hSpar )->hCovEnc, num_chans ); +#endif /* FB mixer handle */ ivas_FB_mixer_close( &( *hSpar )->hFbMixer, input_Fs, spar_reconfig_flag ); diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 3e9ec271f..37aebacef 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -855,10 +855,11 @@ typedef struct ivas_enc_cov_handler_state_t ivas_cov_smooth_state_t *pCov_dtx_state; int16_t num_bins; int16_t prior_dtx_present; - float bb_var_lt[FOA_CHANNELS]; int16_t prior_var_flag; #ifdef IVAS_FLOAT_FIXED Word32 bb_var_lt_fx[FOA_CHANNELS]; +#else + float bb_var_lt[FOA_CHANNELS]; #endif } ivas_enc_cov_handler_state_t; @@ -1351,8 +1352,9 @@ typedef struct ivas_lfe_enc_data_structure const uint16_t *cum_freq_models[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; int16_t lfe_enc_indices_coeffs_tbl[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; int16_t lfe_bits; +#ifndef IVAS_FLOAT_FIXED float *old_wtda_audio; -#ifdef IVAS_FLOAT_FIXED +#else Word32 *old_wtda_audio_fx; Word16 q_old_wtda_audio; #endif // IVAS_FLOAT_FIXED @@ -1414,7 +1416,10 @@ typedef struct ENCODER_CONFIG_HANDLE hEncoderConfig; /* Encoder configuration structure */ float *p_data_f[MAX_INPUT_CHANNELS+MAX_NUM_OBJECTS]; /* floating-point input audio buffers */ - +#ifdef IVAS_FLOAT_FIXED + Word32 *p_data_fx[MAX_INPUT_CHANNELS+MAX_NUM_OBJECTS]; /* fixed-point input audio buffers */ + Word16 q_data_fx; /* Q-factor of fixed-point input audio buffers */ +#endif Indice *ind_list; /* List of indices */ Word16 ivas_max_num_indices; /* Maximum allowed number of indices in the list */ Indice *ind_list_metadata; /* List of indices for metadata */ @@ -1426,6 +1431,9 @@ typedef struct Word16 codec_mode; /* Mode1 or Mode2 of core codec */ Word16 last_codec_mode; /* previous frame Mode 1 or 2 */ float **mem_hp20_in; /* input signals HP filter memories */ +#ifdef IVAS_FLOAT_FIXED + Word32 **mem_hp20_in_fx; /* input signals HP filter memories */ +#endif /* core-encoder modules */ Word16 nSCE; /* number of total SCEs */ -- GitLab From e51b4cdcb6505a1d8c39b2d64ed1fe692ff82ad4 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 8 Jul 2024 21:49:43 +0530 Subject: [PATCH 051/110] Clang formatting changes --- lib_com/ivas_stat_com.h | 2 +- lib_com/ivas_tools.c | 67 +++++++++++++++++++++++++++++++++-------- lib_enc/ivas_lfe_enc.c | 8 ++--- lib_enc/ivas_osba_enc.c | 45 +++++++++++++++------------ 4 files changed, 85 insertions(+), 37 deletions(-) diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 1a2542ed4..8a042ca26 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -599,7 +599,7 @@ typedef struct ivas_masa_qmetadata_frame_struct #ifndef IVAS_FLOAT_FIXED float dir_comp_ratio; #else - Word16 dir_comp_ratio_fx; /* Q15 */ + Word16 dir_comp_ratio_fx; /* Q15 */ #endif uint8_t is_masa_ivas_format; diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index 0e24db967..e42efb441 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -2555,21 +2555,64 @@ void lls_interp_n_fx( { Word16 i; const Word16 n_i_fx[11] = { 0, 2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432, 20480 }; // Q11 - move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); const Word16 one_by_n_fx[11] = { 0, 32767, 16384, 10911, 8192, 6553, 5459, 4681, 4096, 3640, 3276 }; - move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); const Word16 sum_i_fx[12] = { 0, 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55 }; - move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); // 1.0f/ ( N * sum_ii[N] - sum_i[N] * sum_i[N] ) const Word32 res_table[12] = { 0, 0, 0, 357913952, 107374184, 42949672, 20452226, 10956549, 6391320, 3976821, 2603010, 385 }; - move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); Word32 sum_x_fx, sum_ix_fx, slope_fx, offset_fx; Word16 dot_exp = 0, sum_ix_q = 0; - move16(); move16(); + move16(); + move16(); Word32 num; assert( N > 0 && LE_16( N, 10 ) ); @@ -3002,8 +3045,8 @@ Word16 is_SIDrate( test(); test(); if ( EQ_32( ivas_total_brate, SID_1k75 ) || - EQ_32( ivas_total_brate, SID_2k40 ) || - EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) + EQ_32( ivas_total_brate, SID_2k40 ) || + EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) { sid_rate_flag = 1; move16(); @@ -3373,9 +3416,9 @@ Word16 ceil_log_2( *-------------------------------------------------------------------*/ Word64 var_32_fx( - const Word32 *x, /* i : input vector */ - const Word16 len, /* i : length of inputvector */ - Word16 q /* q : q-factor for the array */ + const Word32 *x, /* i : input vector */ + const Word16 len, /* i : length of inputvector */ + Word16 q /* q : q-factor for the array */ ) { @@ -3391,7 +3434,7 @@ Word64 var_32_fx( mean = W_add( mean, x[i] ); } - mean = mean / len; /* NOTE: No BASOP for 64 bit division */ + mean = mean / len; /* NOTE: No BASOP for 64 bit division */ FOR( int i = 0; i < len; i++ ) { @@ -3400,7 +3443,7 @@ Word64 var_32_fx( var = W_shl( var, sub( 31, q ) ); - var = var / len; /* NOTE: No BASOP for 64 bit division */ + var = var / len; /* NOTE: No BASOP for 64 bit division */ return var; } diff --git a/lib_enc/ivas_lfe_enc.c b/lib_enc/ivas_lfe_enc.c index f4923cafd..8d0f57495 100644 --- a/lib_enc/ivas_lfe_enc.c +++ b/lib_enc/ivas_lfe_enc.c @@ -782,7 +782,7 @@ void ivas_lfe_enc_fx( #ifdef IVAS_FLOAT_FIXED ivas_error ivas_create_lfe_enc( LFE_ENC_HANDLE *hLFE_out, /* o : IVAS LFE encoder structure */ - const Word32 input_Fs /* i : input sampling rate */ + const Word32 input_Fs /* i : input sampling rate */ ) { Word16 input_frame; @@ -795,7 +795,7 @@ ivas_error ivas_create_lfe_enc( * Allocate LFE handle *-----------------------------------------------------------------*/ - IF ( ( hLFE = (LFE_ENC_HANDLE) malloc( sizeof( LFE_ENC_DATA ) ) ) == NULL ) + IF( ( hLFE = (LFE_ENC_HANDLE) malloc( sizeof( LFE_ENC_DATA ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE\n" ) ); } @@ -823,7 +823,7 @@ ivas_error ivas_create_lfe_enc( * LFE Window: allocate and initialize *-----------------------------------------------------------------*/ - IF ( ( hLFE->pWindow_state = (LFE_WINDOW_HANDLE) malloc( sizeof( LFE_WINDOW_DATA ) ) ) == NULL ) + IF( ( hLFE->pWindow_state = (LFE_WINDOW_HANDLE) malloc( sizeof( LFE_WINDOW_DATA ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE window structure\n" ) ); } @@ -841,7 +841,7 @@ ivas_error ivas_create_lfe_enc( hLFE->cum_freq_models[1][3] = &ivas_str_lfe_freq_models.entropy_coder_model_coarse_sg4; /* Initialization base2 bits for each subgroup for no entropy coding */ - FOR ( i = 0; i < IVAS_MAX_NUM_QUANT_STRATS; i++ ) + FOR( i = 0; i < IVAS_MAX_NUM_QUANT_STRATS; i++ ) { FOR( j = 0; j < IVAS_MAX_NUM_DCT_COEF_GROUPS; j++ ) { diff --git a/lib_enc/ivas_osba_enc.c b/lib_enc/ivas_osba_enc.c index 5389d11d2..5a8fcfa78 100644 --- a/lib_enc/ivas_osba_enc.c +++ b/lib_enc/ivas_osba_enc.c @@ -184,11 +184,13 @@ ivas_error ivas_osba_enc_reconfig( ivas_error error; ENCODER_CONFIG_HANDLE hEncoderConfig; - error = IVAS_ERR_OK; move32(); + error = IVAS_ERR_OK; + move32(); hEncoderConfig = st_ivas->hEncoderConfig; - ivas_total_brate = hEncoderConfig->ivas_total_brate; move32(); + ivas_total_brate = hEncoderConfig->ivas_total_brate; + move32(); - IF ( NE_32(ivas_total_brate, hEncoderConfig->last_ivas_total_brate) ) + IF( NE_32( ivas_total_brate, hEncoderConfig->last_ivas_total_brate ) ) { DIRAC_ENC_HANDLE hDirAC = st_ivas->hDirAC; SPAR_ENC_HANDLE hSpar; @@ -197,15 +199,19 @@ ivas_error ivas_osba_enc_reconfig( int16_t nbands_old; int16_t ndir_old; - spar_reconfig_flag = 0;move16(); - old_ism_mode = st_ivas->ism_mode;move32(); - IF ( GE_32(ivas_total_brate, IVAS_256k) ) + spar_reconfig_flag = 0; + move16(); + old_ism_mode = st_ivas->ism_mode; + move32(); + IF( GE_32( ivas_total_brate, IVAS_256k ) ) { - st_ivas->ism_mode = ISM_SBA_MODE_DISC;move32(); + st_ivas->ism_mode = ISM_SBA_MODE_DISC; + move32(); } ELSE { - st_ivas->ism_mode = ISM_MODE_NONE;move32(); + st_ivas->ism_mode = ISM_MODE_NONE; + move32(); } nchan_transport_old = st_ivas->nchan_transport; nCPE_old = st_ivas->nCPE; @@ -224,13 +230,13 @@ ivas_error ivas_osba_enc_reconfig( move16(); test(); - IF ( NE_16( analysis_order_old, st_ivas->sba_analysis_order ) || NE_32( old_ism_mode, st_ivas->ism_mode ) ) + IF( NE_16( analysis_order_old, st_ivas->sba_analysis_order ) || NE_32( old_ism_mode, st_ivas->ism_mode ) ) { Word16 i, n_old; Word32 **old_mem_hp20_in_fx; - n_old = add(st_ivas->hEncoderConfig->nchan_ism, imult1616(add( analysis_order_old, 1 ), add( analysis_order_old, 1 ))); - n = add(st_ivas->hEncoderConfig->nchan_ism, imult1616(add( st_ivas->sba_analysis_order, 1 ), add( st_ivas->sba_analysis_order, 1 ))); + n_old = add( st_ivas->hEncoderConfig->nchan_ism, imult1616( add( analysis_order_old, 1 ), add( analysis_order_old, 1 ) ) ); + n = add( st_ivas->hEncoderConfig->nchan_ism, imult1616( add( st_ivas->sba_analysis_order, 1 ), add( st_ivas->sba_analysis_order, 1 ) ) ); #if 1 // To be removed float **old_mem_hp20_in; @@ -297,20 +303,20 @@ ivas_error ivas_osba_enc_reconfig( old_mem_hp20_in_fx = st_ivas->mem_hp20_in_fx; st_ivas->mem_hp20_in_fx = NULL; - IF ( ( st_ivas->mem_hp20_in_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) + IF( ( st_ivas->mem_hp20_in_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); } - FOR ( i = 0; i < n_old; i++ ) + FOR( i = 0; i < n_old; i++ ) { st_ivas->mem_hp20_in_fx[i] = old_mem_hp20_in_fx[i]; old_mem_hp20_in_fx[i] = NULL; } /* create additional hp20 memories */ - FOR ( ; i < n; i++ ) + FOR( ; i < n; i++ ) { - IF ( ( st_ivas->mem_hp20_in_fx[i] = (Word32 *) malloc( (L_HP20_MEM+2) * sizeof( Word32 ) ) ) == NULL ) + IF( ( st_ivas->mem_hp20_in_fx[i] = (Word32 *) malloc( ( L_HP20_MEM + 2 ) * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); } @@ -321,24 +327,24 @@ ivas_error ivas_osba_enc_reconfig( free( old_mem_hp20_in_fx ); old_mem_hp20_in_fx = NULL; } - ELSE IF ( LT_16(n, n_old) ) + ELSE IF( LT_16( n, n_old ) ) { /* save old mem_hp_20 pointer */ old_mem_hp20_in_fx = st_ivas->mem_hp20_in_fx; st_ivas->mem_hp20_in_fx = NULL; - IF ( ( st_ivas->mem_hp20_in_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) + IF( ( st_ivas->mem_hp20_in_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); } - FOR ( i = 0; i < n; i++ ) + FOR( i = 0; i < n; i++ ) { st_ivas->mem_hp20_in_fx[i] = old_mem_hp20_in_fx[i]; old_mem_hp20_in_fx[i] = NULL; } /* remove superfluous hp20 memories */ - FOR ( ; i < n_old; i++ ) + FOR( ; i < n_old; i++ ) { free( old_mem_hp20_in_fx[i] ); old_mem_hp20_in_fx[i] = NULL; @@ -347,7 +353,6 @@ ivas_error ivas_osba_enc_reconfig( free( old_mem_hp20_in_fx ); old_mem_hp20_in_fx = NULL; } - } ivas_spar_config( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 ); -- GitLab From 67c251cbffe26de7477ddd4bffc1d7944d838bee Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 8 Jul 2024 22:15:13 +0530 Subject: [PATCH 052/110] Incorrect scaling fix, LTV crash fix and Float build fix [x] Fix for Incorrect scaling in ivas_mdct_core_tns_ns_fx. Scaling occurring for wrong length in decoder_tcx_tns_fx corrected [x] float build fix [x] Fix for ltv crash of stream OMASA 2Dir2TC 3ISM at 48 kbps, 48kHz in, 48kHz out, MONO out. When hCPE->brate_surplus comes negative hCPE->brate_surplus / FRAMES_PER_SECOND with basops for -4800 gives -97 instead of -96 which lead to hCPE->hStereoTD->tdm_LRTD_flag sometimes differing from float workspace. --- lib_com/ivas_masa_com.c | 4 +- lib_com/ivas_prot_fx.h | 3 +- lib_com/ivas_rom_com_fx.c | 6 +- lib_com/ivas_rom_com_fx.h | 2 +- lib_com/ivas_stereo_ica_com_fx.c | 10 +- lib_dec/dec_tcx.c | 35 +++++- lib_dec/dec_tcx_fx.c | 2 +- lib_dec/ivas_mdct_core_dec.c | 175 +++++++------------------- lib_dec/ivas_stereo_switching_dec.c | 15 ++- lib_enc/ivas_stereo_mdct_stereo_enc.c | 7 +- lib_rend/lib_rend.c | 8 +- 11 files changed, 115 insertions(+), 152 deletions(-) diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c index dbcda4b56..e1aa643d6 100644 --- a/lib_com/ivas_masa_com.c +++ b/lib_com/ivas_masa_com.c @@ -1460,7 +1460,7 @@ void deindex_sph_idx( return; } - +#ifdef IVAS_FLOAT_FIXED void deindex_sph_idx_fx( const UWord16 sphIndex, /* i : Spherical index */ const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */ @@ -1683,7 +1683,7 @@ void deindex_sph_idx_fx( } return; } - +#endif /*--------------------------------------------------------------- * valid_ratio_index() * diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 66921d415..7a8054ca1 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -1388,7 +1388,8 @@ void decoder_tcx_tns_fx( STnsData *tnsData, const Word16 bfi, /* i : Bad frame indicator */ const Word16 frame_cnt, /* i : frame counter in the super frame */ - const Word16 whitenedDomain ); + const Word16 whitenedDomain, + Word16 *length ); void ivas_mdct_core_tns_ns_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ diff --git a/lib_com/ivas_rom_com_fx.c b/lib_com/ivas_rom_com_fx.c index 31e156bcd..fea82488a 100644 --- a/lib_com/ivas_rom_com_fx.c +++ b/lib_com/ivas_rom_com_fx.c @@ -1404,7 +1404,7 @@ const Word16 dft_cng_alpha_bits_fx[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_CO * DirAC ROM tables *----------------------------------------------------------------------------------*/ -// q = 30 + // q = 30 const Word32 diffuseness_reconstructions_fx[DIRAC_DIFFUSE_LEVELS] = { 0, 42467328, 96206848, 170655744, 331087872, 508821504, 678952960, 912785408 }; @@ -3516,7 +3516,7 @@ const Word16 *const ivas_sns_cdbks_side_tcx10_fx[SNS_MSVQ_NSTAGES_SIDE] = { /*----------------------------------------------------------------------* * MC ParamUpmix ROM tables *-----------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED const ACPL_QUANT_TABLE_FX ivas_mc_paramupmix_alpha_quant_table_fx = { 33, /* nquant */ 16, /* offset */ @@ -3583,7 +3583,7 @@ const ACPL_QUANT_TABLE_FX ivas_mc_paramupmix_beta_quant_table_fx[9] = { { 0, 15938355, 36909876, 62914560, 93952408, 130023424, 171127600, 217264944, 268435456 } /* data in Q28 */ } }; - +#endif /* Q Factor is 31*/ const Word32 ivas_han_win_48k_fx[L_FRAME32k] = { 5760, 22976, 51712, 91904, 143552, 206784, 281408, 367552, 465216, diff --git a/lib_com/ivas_rom_com_fx.h b/lib_com/ivas_rom_com_fx.h index 26940e676..049dd0aad 100644 --- a/lib_com/ivas_rom_com_fx.h +++ b/lib_com/ivas_rom_com_fx.h @@ -40,7 +40,6 @@ #include "stat_com.h" #include "ivas_stat_com.h" -#ifdef IVAS_FLOAT_FIXED extern const Word16 ivas_sin_twiddle_480_fx[IVAS_480_PT_LEN >> 1]; extern const Word16 ivas_cos_twiddle_480_fx[IVAS_480_PT_LEN >> 1]; @@ -50,6 +49,7 @@ extern const Word16 ivas_sin_twiddle_160_fx[IVAS_160_PT_LEN >> 1]; extern const Word16 ivas_cos_twiddle_160_fx[IVAS_160_PT_LEN >> 1]; extern const Word16 ivas_sin_twiddle_80_fx[IVAS_80_PT_LEN >> 1]; extern const Word16 ivas_cos_twiddle_80_fx[IVAS_80_PT_LEN >> 1]; +#ifdef IVAS_FLOAT_FIXED extern const Word16 nf_tw_smoothing_coeffs_fx[N_LTP_GAIN_MEMS]; extern const Word32 dft_res_gains_q_fx[][2]; extern const Word16 dft_res_cod_alpha_fx[STEREO_DFT_BAND_MAX]; diff --git a/lib_com/ivas_stereo_ica_com_fx.c b/lib_com/ivas_stereo_ica_com_fx.c index 0b3920c8e..d96d64c7c 100644 --- a/lib_com/ivas_stereo_ica_com_fx.c +++ b/lib_com/ivas_stereo_ica_com_fx.c @@ -118,6 +118,7 @@ Word32 inv_table_145[N_MAX_SHIFT_CHANGE + 1] = { Word32 tableD1_145[N_MAX_SHIFT_CHANGE + 1] = { 0, 15027, 120219, 405740, 961755, 1878428, 3245924, 5154407, 7694041, 10954993, 15027425, 20001503, 25967392, 33015256, 41235259, 50717555, 61552334, 73829752, 87639951, 103073111, 120219402 }; +#ifdef IVAS_FLOAT_FIXED static void interpTargetChannel_fx( Word32 *target_fx, const Word16 prevShift, @@ -300,14 +301,14 @@ static void interpTargetChannel_fx( return; } - +#endif /*--------------------------------------------------------------- * Function targetCh_AlignStereoDFT() * * Align target channel in DFT stereo to correct FOR shift variations * ---------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED static void targetCh_AlignStereoDFT_fx( Word32 *target_fx, const Word16 prevShift, @@ -368,14 +369,14 @@ static void targetCh_AlignStereoDFT_fx( return; } - +#endif /*--------------------------------------------------------------- * adjustTargetSignal() * * Target signal correction FOR shift variations. * ---------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED void adjustTargetSignal_fx( Word32 *target_fx, const Word16 prevShift, @@ -396,3 +397,4 @@ void adjustTargetSignal_fx( return; } +#endif \ No newline at end of file diff --git a/lib_dec/dec_tcx.c b/lib_dec/dec_tcx.c index 921e84976..17ce5672d 100644 --- a/lib_dec/dec_tcx.c +++ b/lib_dec/dec_tcx.c @@ -1568,7 +1568,8 @@ void decoder_tcx_tns_fx( STnsData *tnsData, const Word16 bfi, /* i : Bad frame indicator */ const Word16 frame_cnt, /* i : frame counter in the super frame */ - const Word16 whitenedDomain ) + const Word16 whitenedDomain, + Word16 *length ) { Word16 index, isTCX5, L; TCX_CONFIG_HANDLE hTcxCfg = st->hTcxCfg; @@ -1581,8 +1582,11 @@ void decoder_tcx_tns_fx( L = L_frameTCX; move16(); + test(); IF( EQ_16( L_frame, shr( st->L_frame, 1 ) ) && NE_16( st->tcxonly, 0 ) ) { + test(); + test(); IF( NE_16( frame_cnt, 0 ) && EQ_16( bfi, 0 ) && NE_16( st->last_core, ACELP_CORE ) ) { /* fix sub-window overlap */ @@ -1590,12 +1594,22 @@ void decoder_tcx_tns_fx( move16(); } + test(); + test(); + test(); IF( ( NE_16( hTcxCfg->fIsTNSAllowed, 0 ) && NE_16( fUseTns, 0 ) && NE_16( bfi, 1 ) ) || GT_16( L_spec, L_frameTCX ) ) { L = L_spec; move16(); } + test(); + test(); + test(); + test(); + test(); + test(); + test(); IF( ( EQ_16( bfi, 0 ) && ( NE_16( hTcxCfg->tcx_last_overlap_mode, FULL_OVERLAP ) || ( EQ_16( hTcxCfg->tcx_curr_overlap_mode, FULL_OVERLAP ) && EQ_16( frame_cnt, 0 ) && EQ_16( index, 0 ) ) ) ) || ( NE_16( bfi, 0 ) && ( NE_16( hTcxCfg->tcx_last_overlap_mode, FULL_OVERLAP ) && @@ -1613,11 +1627,16 @@ void decoder_tcx_tns_fx( *-----------------------------------------------------------*/ + test(); + test(); + test(); IF( NE_16( hTcxCfg->fIsTNSAllowed, 0 ) && NE_16( fUseTns, 0 ) && NE_16( bfi, 1 ) && EQ_16( tnsData->tnsOnWhitenedSpectra, whitenedDomain ) ) { /* Apply TNS to get the reconstructed signal */ SetTnsConfig( hTcxCfg, L_frame_glob == st->L_frame, ( st->last_core == ACELP_CORE ) && ( frame_cnt == 0 ) ); + test(); + test(); IF( EQ_16( L_frame, shr( st->L_frame, 1 ) ) && NE_16( st->tcxonly, 0 ) && NE_16( isTCX5, 0 ) ) { tcx5TnsGrouping_fx( shr( L, 1 ), shr( hTcxCfg->tnsConfig[0][0].iFilterBorders[0], 1 ), x_fx ); @@ -1625,8 +1644,11 @@ void decoder_tcx_tns_fx( ApplyTnsFilter( hTcxCfg->pCurrentTnsConfig, tnsData, x_fx, 0 ); + test(); + test(); IF( EQ_16( L_frame, shr( st->L_frame, 1 ) ) && NE_16( st->tcxonly, 0 ) && NE_16( isTCX5, 0 ) ) { + test(); IF( EQ_16( st->element_mode, EVS_MONO ) || LT_16( L_spec, L_frameTCX ) ) /* todo: this is temporary to maintain EVS BE, this is a bug and should be fixed also for EVS (see issue 13) */ { tcx5TnsUngrouping_fx( shr( L_frameTCX, 1 ), shr( hTcxCfg->tnsConfig[0][0].iFilterBorders[0], 1 ), x_fx, DEC ); @@ -1637,12 +1659,17 @@ void decoder_tcx_tns_fx( } } } + test(); IF( NE_16( whitenedDomain, 0 ) && NE_16( isTCX5, 0 ) ) { tcx5SpectrumInterleaving_fx( shr( L, 1 ), x_fx ); } /* restore index */ + test(); + test(); + test(); + test(); IF( EQ_16( L_frame, shr( st->L_frame, 1 ) ) && NE_16( st->tcxonly, 0 ) && NE_16( frame_cnt, 0 ) && EQ_16( bfi, 0 ) && NE_16( st->last_core, ACELP_CORE ) ) { /* restore sub-window overlap */ @@ -1650,6 +1677,12 @@ void decoder_tcx_tns_fx( move16(); } + if ( length != NULL ) + { + *length = L; + move16(); + } + return; } #endif diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index f521839cd..96fcfb25d 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3726,7 +3726,7 @@ void decoder_tcx_ivas_fx( x_e = sub( x_e, shift ); move16(); - decoder_tcx_tns_fx( st, L_frame_glob, L_spec, L_frame, L_frameTCX, x_fx, fUseTns, &tnsData, bfi, frame_cnt, 0 ); + decoder_tcx_tns_fx( st, L_frame_glob, L_spec, L_frame, L_frameTCX, x_fx, fUseTns, &tnsData, bfi, frame_cnt, 0, NULL ); Scale_sig32( x_fx, N_MAX, sub( x_e, 20 ) ); // Scaling x_fx to Q11 Scale_sig( xn_buf_fx, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX, sub( st->Q_syn, 14 ) ); // Scaling xn_buf_fx to Q_syn diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index 72c1985d8..6c2bc239e 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -150,6 +150,7 @@ void mdct_read_IGF_bits( } #endif + /*-----------------------------------------------------------------* * Function dec_prm_tcx_sidebits() * @@ -296,8 +297,7 @@ static void dec_prm_tcx_sidebits_fx( return; } -#endif -#ifndef IVAS_FLOAT_FIXED +#else static void dec_prm_tcx_sidebits( int16_t param[], /* o : decoded parameters */ Decoder_State *st, /* i/o: decoder memory state */ @@ -398,11 +398,13 @@ static void dec_prm_tcx_sidebits( } #endif + /*-----------------------------------------------------------------* * Function dec_prm_tcx_spec() * * decode TCX core parameters *-----------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED static void dec_prm_tcx_spec_fx( Decoder_State *st, /* i/o: decoder memory state */ @@ -482,8 +484,7 @@ static void dec_prm_tcx_spec_fx( return; } -#endif -#ifndef IVAS_FLOAT_FIXED +#else static void dec_prm_tcx_spec( Decoder_State *st, /* i/o: decoder memory state */ int16_t param[], /* o : decoded parameters */ @@ -545,6 +546,7 @@ static void dec_prm_tcx_spec( } #endif + /*-----------------------------------------------------------------* * Function ivas_mdct_dec_side_bits_frame_channel() * @@ -815,8 +817,7 @@ void ivas_mdct_dec_side_bits_frame_channel_fx( return; } -#endif -#ifndef IVAS_FLOAT_FIXED +#else void ivas_mdct_dec_side_bits_frame_channel( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW], /* o : lpc_parameters */ @@ -848,16 +849,7 @@ void ivas_mdct_dec_side_bits_frame_channel( if ( MCT_flag ) { /* Initialization or re-configuration of Stereo TCX */ -#ifdef IVAS_FLOAT_FIXED - /* stereo_tcx_dec_mode_switch_reconf_To_fixed is for intermediatery conversions which is needed to be removed */ - stereo_tcx_dec_mode_switch_reconf_To_fixed( sts[ch], 1, hCPE->last_element_mode ); - /*============*/ - stereo_tcx_init_dec_fx( sts[ch], 1, hCPE->last_element_mode ); - /*============*/ - stereo_tcx_dec_mode_switch_reconf_To_fixed( sts[ch], 0, hCPE->last_element_mode ); -#else stereo_tcx_init_dec( sts[ch], 1, hCPE->last_element_mode ); -#endif // IVAS_FLOAT_FIXED } sts[ch]->enablePlcWaveadjust = 0; } @@ -1018,11 +1010,13 @@ void ivas_mdct_dec_side_bits_frame_channel( } #endif + /*-----------------------------------------------------------------* * ivas_mdct_core_invQ() * * Inverse processing steps up to inverse quantization *-----------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED void ivas_mdct_core_invQ_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ @@ -2288,13 +2282,13 @@ void ivas_mdct_core_reconstruct_fx( #endif -#ifndef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------* * ivas_mdct_core_tns_ns() * * reconstruct time signal *-----------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ivas_mdct_core_tns_ns( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : two entries for each channel in TCX10 */ @@ -2352,55 +2346,11 @@ void ivas_mdct_core_tns_ns( if ( !bfi ) { -#ifdef IVAS_FLOAT_FIXED - Word32 sns_int_scf_fx[FDNS_NPTS], Aq_fx[SNS_NPTS]; - FOR( int c = 0; c < SNS_NPTS; c++ ) - { - Aq_fx[c] = (Word32) ( Aq[ch][k * M + c] * ONE_IN_Q16 ); - } - - sns_interpolate_scalefactors_fx( sns_int_scf_fx, Aq_fx, DEC ); - - FOR( int c = 0; c < FDNS_NPTS; c++ ) - { - sns_int_scf[c] = ( (float) sns_int_scf_fx[c] / ONE_IN_Q16 ); - } -#else sns_interpolate_scalefactors( &sns_int_scf[0], &Aq[ch][k * M], DEC ); -#endif // IVAS_FLOAT_FIXED if ( MCT_flag && st->hTonalMDCTConc != NULL && ( ( k + 1 ) == nSubframes[ch] ) ) { -#ifdef IVAS_FLOAT_FIXED - Word32 x_fx[N_MAX]; - Word16 x_e, scf_fx[FDNS_NPTS], scf_e[FDNS_NPTS]; - f2me_buf( x[ch][k], x_fx, &x_e, L_frameTCX[ch] ); - /*for ( int j = 0; j < st->hTonalMDCTConc->nScaleFactors; j++ ) - { - f2me_16( sns_int_scf[j], &scf_fx[j], &scf_e[j] ); - }*/ - Word16 q_shift; - FOR( Word16 ind = 0; ind < st->hTonalMDCTConc->nScaleFactors; ind++ ) - { - q_shift = norm_l( sns_int_scf_fx[ind] ); - scf_fx[ind] = extract_h( L_shl( sns_int_scf_fx[ind], q_shift ) ); - scf_e[ind] = 15 - q_shift; - } - /*float maxim = 0; - FOR(Word16 ind = 0; ind < L_frameTCX[ch]; ind++) { - maxim = fmaxf(maxim, fabsf(x[ch][k][ind])); - } - if (maxim >= 1) q_x = norm_l((Word32)maxim); - FOR(Word16 ind = 0; ind < L_frameTCX[ch]; ind++) { - x_fx[ind] = (Word32)(x[ch][k][ind] * (1 << q_x)); - } - x_e = 31 - q_x;*/ - - TonalMDCTConceal_SaveFreqSignal_ivas_fx( st->hTonalMDCTConc, x_fx, x_e, L_frameTCX[ch], L_frame[ch], &scf_fx[0], scf_e, 0, get_igf_startline( st, L_frame[ch], L_frameTCX[ch] ) ); - // st->hTonalMDCTConc->last_block_nrg_flt = me2f( st->hTonalMDCTConc->last_block_nrg, st->hTonalMDCTConc->last_block_nrg_exp ); -#else TonalMDCTConceal_SaveFreqSignal_ivas( st->hTonalMDCTConc, x[ch][k], L_frameTCX[ch], L_frame[ch], &sns_int_scf[0], get_igf_startline_flt( st, L_frame[ch], L_frameTCX[ch] ) ); -#endif } } else @@ -2409,6 +2359,7 @@ void ivas_mdct_core_tns_ns( { if ( !MCT_flag && st->hTcxDec->cummulative_damping_tcx_float < 0.99f ) // if ( !MCT_flag && st->hTcxDec->cummulative_damping_tcx_float != 1.f ) + { float *scf_last, *scf_bg; float fade_in, fade_out; @@ -2434,66 +2385,9 @@ void ivas_mdct_core_tns_ns( } } -#ifdef IVAS_FLOAT_FIXED - Word32 x_fx_[1200]; - Word16 q = 26; - float maximum = 0; - FOR( Word16 ind = 0; ind < st->hTcxCfg->pCurrentTnsConfig->iFilterBorders[0]; ind++ ) - maximum = fmaxf( maximum, fabsf( x[ch][k][ind] ) ); - if ( maximum >= 1.f ) - q = norm_l( (Word32) maximum ) - 5; - FOR( Word16 ind = 0; ind < s_max( s_max( L_frameTCX[ch], L_spec[ch] ), st->hTcxCfg->pCurrentTnsConfig->iFilterBorders[0] ); ind++ ) - x_fx_[ind] = (Word32) ( x[ch][k][ind] * ( 1 << q ) ); - decoder_tcx_tns_fx( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], x_fx_, fUseTns[ch][k], &tnsData[ch][k], bfi, k, 1 ); - FOR( Word16 ind = 0; ind < s_max( s_max( L_frameTCX[ch], L_spec[ch] ), st->hTcxCfg->pCurrentTnsConfig->iFilterBorders[0] ); ind++ ) - x[ch][k][ind] = (float) ( x_fx_[ind] ) / (float) ( 1 << q ); -#else decoder_tcx_tns( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], &x[ch][k][0], fUseTns[ch][k], &tnsData[ch][k], bfi, k, 1 ); -#endif -#ifdef IVAS_FLOAT_FIXED - Word32 x_fx[L_FRAME48k], sns_int_scf_fx[FDNS_NPTS]; - Word16 q_x = 31, q_sns_int_scf = 31; - FOR( Word16 c = 0; c < L_FRAME16k; c++ ) - { - if ( abs( (Word32) x[ch][k][c] ) != 0 ) - q_x = s_min( q_x, norm_l( (Word32) x[ch][k][c] ) ); - } - FOR( Word16 c = 0; c < FDNS_NPTS; c++ ) - { - if ( abs( (Word32) sns_int_scf[c] ) != 0 ) - q_sns_int_scf = s_min( q_sns_int_scf, norm_l( (Word32) sns_int_scf[c] ) ); - } - q_x -= 1; - q_sns_int_scf -= 1; - FOR( Word16 c = 0; c < st->hTcxCfg->psychParamsCurrent->nBins; c++ ) - { - x_fx[c] = (Word32) ( x[ch][k][c] * ( 1 << q_x ) ); - } - FOR( Word16 c = 0; c < FDNS_NPTS; c++ ) - { - sns_int_scf_fx[c] = (Word32) ( sns_int_scf[c] * ( 1 << q_sns_int_scf ) ); - } - - sns_shape_spectrum_fx( x_fx, &q_x, st->hTcxCfg->psychParamsCurrent, sns_int_scf_fx, q_sns_int_scf, st->hTcxCfg->psychParamsCurrent->nBins ); - - IF( q_x + 1 < 31 ) - { - FOR( Word16 c = 0; c < st->hTcxCfg->psychParamsCurrent->nBins; c++ ) - { - x[ch][k][c] = ( (float) x_fx[c] / ( 1 << ( q_x + 1 ) ) ); - } - } - ELSE - { - FOR( Word16 c = 0; c < st->hTcxCfg->psychParamsCurrent->nBins; c++ ) - { - x[ch][k][c] = ( (float) x_fx[c] / ONE_IN_Q31 ); - } - } -#else sns_shape_spectrum( x[ch][k], st->hTcxCfg->psychParamsCurrent, &sns_int_scf[0], st->hTcxCfg->psychParamsCurrent->nBins ); -#endif // IVAS_FLOAT_FIXED v_multc( x[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, sns_int_scf[FDNS_NPTS - 1], x[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, L_spec[ch] - st->hTcxCfg->psychParamsCurrent->nBins ); decoder_tcx_tns( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], &x[ch][k][0], fUseTns[ch][k], &tnsData[ch][k], bfi, k, 0 ); @@ -2512,8 +2406,7 @@ void ivas_mdct_core_tns_ns( return; } -#endif -#ifdef IVAS_FLOAT_FIXED +#else /* Has a missing dependency: TonalMDCTConceal_Apply. Currently not used anywhere and untested.*/ void ivas_mdct_core_tns_ns_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ @@ -2537,7 +2430,7 @@ void ivas_mdct_core_tns_ns_fx( Word16 left_rect[CPE_CHANNELS]; Word16 L_spec[CPE_CHANNELS]; Word32 sns_int_scf_fx[FDNS_NPTS]; - Word16 exp; + Word16 exp, length; /* Initializations */ sts = hCPE->hCoreCoder; @@ -2656,16 +2549,28 @@ void ivas_mdct_core_tns_ns_fx( } Word16 norm_x; q_x = sub( q_x, 5 ); - Scale_sig32( &x_fx[ch][k][0], L_spec[ch], -5 ); - decoder_tcx_tns_fx( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], x_fx[ch][k], fUseTns[ch][k], &tnsData[ch][k], bfi, k, 1 ); - norm_x = getScaleFactor32( &x_fx[ch][k][0], L_spec[ch] ); - Scale_sig32( &x_fx[ch][k][0], L_spec[ch], norm_x ); + length = L_frameTCX[ch]; + move16(); + test(); + test(); + test(); + test(); + test(); + if ( EQ_16( L_frame[ch], shr( st->L_frame, 1 ) ) && NE_16( st->tcxonly, 0 ) && ( ( NE_16( st->hTcxCfg->fIsTNSAllowed, 0 ) && NE_16( fUseTns[ch][k], 0 ) && NE_16( bfi, 1 ) ) || GT_16( L_spec[ch], L_frameTCX[ch] ) ) ) + { + length = L_spec[ch]; + move16(); + } + Scale_sig32( &x_fx[ch][k][0], length, -5 ); + decoder_tcx_tns_fx( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], x_fx[ch][k], fUseTns[ch][k], &tnsData[ch][k], bfi, k, 1, &length ); + norm_x = getScaleFactor32( &x_fx[ch][k][0], length ); + Scale_sig32( &x_fx[ch][k][0], length, norm_x ); q_x = add( q_x, norm_x ); x_e[ch][k] = sub( 31, q_x ); move16(); Word16 q_sns_int_scf; - Word16 q_2, length; + Word16 q_2; q_sns_int_scf = add( 16 - 1, getScaleFactor32( sns_int_scf_fx, FDNS_NPTS ) ); // q_sns_int_scf -= 1; FOR( Word16 c = 0; c < FDNS_NPTS; c++ ) @@ -2700,10 +2605,22 @@ void ivas_mdct_core_tns_ns_fx( move16(); q_x = sub( q_x, 5 ); - Scale_sig32( &x_fx[ch][k][0], L_spec[ch], -5 ); - decoder_tcx_tns_fx( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], &x_fx[ch][k][0], fUseTns[ch][k], &tnsData[ch][k], bfi, k, 0 ); - norm_x = getScaleFactor32( &x_fx[ch][k][0], L_spec[ch] ); - Scale_sig32( &x_fx[ch][k][0], L_spec[ch], norm_x ); + length = L_frameTCX[ch]; + move16(); + test(); + test(); + test(); + test(); + test(); + if ( EQ_16( L_frame[ch], shr( st->L_frame, 1 ) ) && NE_16( st->tcxonly, 0 ) && ( ( NE_16( st->hTcxCfg->fIsTNSAllowed, 0 ) && NE_16( fUseTns[ch][k], 0 ) && NE_16( bfi, 1 ) ) || GT_16( L_spec[ch], L_frameTCX[ch] ) ) ) + { + length = L_spec[ch]; + move16(); + } + Scale_sig32( &x_fx[ch][k][0], length, -5 ); + decoder_tcx_tns_fx( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], &x_fx[ch][k][0], fUseTns[ch][k], &tnsData[ch][k], bfi, k, 0, &length ); + norm_x = getScaleFactor32( &x_fx[ch][k][0], length ); + Scale_sig32( &x_fx[ch][k][0], length, norm_x ); q_x = add( q_x, norm_x ); x_e[ch][k] = sub( 31, q_x ); move16(); diff --git a/lib_dec/ivas_stereo_switching_dec.c b/lib_dec/ivas_stereo_switching_dec.c index 733708657..c1c049cbd 100644 --- a/lib_dec/ivas_stereo_switching_dec.c +++ b/lib_dec/ivas_stereo_switching_dec.c @@ -1282,7 +1282,7 @@ ivas_error stereo_memory_dec_fx( DEC_CORE_HANDLE st; Word16 i, n, delay_comp_DFT; ivas_error error; - Word16 div_m, div_e; + Word16 div_m, div_e, tmp16; error = IVAS_ERR_OK; @@ -1764,7 +1764,16 @@ ivas_error stereo_memory_dec_fx( IF( hCPE->hCoreCoder[0]->bfi == 0 ) { st = hCPE->hCoreCoder[1]; - hCPE->hStereoTD->tdm_LRTD_flag = get_indice_st( hCPE->hCoreCoder[0], L_add( hCPE->element_brate, hCPE->brate_surplus ), ( sub( add( sub( extract_l( Mpy_32_16_1( hCPE->element_brate, INV_FRAME_PER_SEC_Q15 ) ), nb_bits_metadata ), extract_l( Mpy_32_16_1( hCPE->brate_surplus, INV_FRAME_PER_SEC_Q15 ) ) ), ( TDM_SECONDARY_SIGNALLING + TDM_RATIO_BITS + TDM_LP_REUSE_BITS + TDM_LR_CONTENT_BITS ) ) ), TDM_LR_CONTENT_BITS ); + IF( hCPE->brate_surplus < 0 ) + { + tmp16 = extract_l( L_negate( Mpy_32_32( L_abs( hCPE->brate_surplus ), ONE_BY_FRAMES_PER_SEC_Q31 ) ) ); + } + ELSE + { + tmp16 = extract_l( Mpy_32_32( hCPE->brate_surplus, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + } + + hCPE->hStereoTD->tdm_LRTD_flag = get_indice_st( hCPE->hCoreCoder[0], L_add( hCPE->element_brate, hCPE->brate_surplus ), ( sub( add( sub( extract_l( Mpy_32_16_1( hCPE->element_brate, INV_FRAME_PER_SEC_Q15 ) ), nb_bits_metadata ), tmp16 ), ( TDM_SECONDARY_SIGNALLING + TDM_RATIO_BITS + TDM_LP_REUSE_BITS + TDM_LR_CONTENT_BITS ) ) ), TDM_LR_CONTENT_BITS ); move16(); IF( hCPE->hStereoTD->tdm_LRTD_flag != 0 ) @@ -3096,7 +3105,7 @@ void stereo_switching_dec( test(); test(); test(); - IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) || n == 0 || EQ_16( hCPE->last_element_mode, IVAS_CPE_TD ) || EQ_16( hCPE->nchan_out, 1 ) ) + IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) || n == 0 || NE_16( hCPE->last_element_mode, IVAS_CPE_TD ) || EQ_16( hCPE->nchan_out, 1 ) ) { FOR( i = 0; i < dft32ms_ovl; i++ ) { diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc.c b/lib_enc/ivas_stereo_mdct_stereo_enc.c index 1c6aa5e86..ea78be94e 100644 --- a/lib_enc/ivas_stereo_mdct_stereo_enc.c +++ b/lib_enc/ivas_stereo_mdct_stereo_enc.c @@ -108,7 +108,7 @@ static void dft_ana_init( return; } - +#ifdef IVAS_FLOAT_FIXED static void dft_ana_init_fx( DFT_ANA_HANDLE hDft_ana, /*i : DFT analysis handle */ const Word32 input_Fs /*i : Input sampling frequency */ @@ -147,7 +147,7 @@ static void dft_ana_init_fx( return; } - +#endif /*-------------------------------------------------------------------* * write_itd_data() * @@ -1190,7 +1190,7 @@ ivas_error initMdctItdHandling( return IVAS_ERR_OK; } - +#ifdef IVAS_FLOAT_FIXED ivas_error initMdctItdHandling_fx( STEREO_MDCT_ENC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ const Word32 input_Fs /* i : input sampling rate */ @@ -1220,6 +1220,7 @@ ivas_error initMdctItdHandling_fx( return IVAS_ERR_OK; } +#endif /*------------------------------------------------------------------------- * stereo_mdct_enc_destroy() * diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 2ce925892..bd7ebe21d 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -13564,8 +13564,8 @@ void IVAS_REND_Close( closeHeadRotation( hIvasRend ); - ivas_external_orientation_close_fx( &hIvasRend->hExternalOrientationData ); - ivas_combined_orientation_close_fx( &hIvasRend->hCombinedOrientationData ); + ivas_external_orientation_close( &hIvasRend->hExternalOrientationData ); + ivas_combined_orientation_close( &hIvasRend->hCombinedOrientationData ); free( hIvasRend ); *phIvasRend = NULL; @@ -14804,7 +14804,7 @@ static ivas_error initMasaExtRenderer( { for ( i = 0; i < hMasaExtRend->nchan_input; i++ ) { - if ( ( error = openCldfb( &( hMasaExtRend->cldfbAnaRend[i] ), CLDFB_ANALYSIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + if ( ( error = openCldfb_ivas( &( hMasaExtRend->cldfbAnaRend[i] ), CLDFB_ANALYSIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) { return error; } @@ -14812,7 +14812,7 @@ static ivas_error initMasaExtRenderer( for ( i = 0; i < hMasaExtRend->nchan_output; i++ ) { - if ( ( error = openCldfb( &( hMasaExtRend->cldfbSynRend[i] ), CLDFB_SYNTHESIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + if ( ( error = openCldfb_ivas( &( hMasaExtRend->cldfbSynRend[i] ), CLDFB_SYNTHESIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) { return error; } -- GitLab From 64a15d37b9d2accaca4e18d74d2d312c9a6f5161 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 8 Jul 2024 22:19:53 +0530 Subject: [PATCH 053/110] clang formatting changes --- lib_com/ivas_rom_com_fx.c | 2 +- lib_com/ivas_stereo_ica_com_fx.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_rom_com_fx.c b/lib_com/ivas_rom_com_fx.c index fea82488a..6dddb795f 100644 --- a/lib_com/ivas_rom_com_fx.c +++ b/lib_com/ivas_rom_com_fx.c @@ -1404,7 +1404,7 @@ const Word16 dft_cng_alpha_bits_fx[STEREO_DFT_N_COH_ALPHA_STEPS][STEREO_DFT_N_CO * DirAC ROM tables *----------------------------------------------------------------------------------*/ - // q = 30 +// q = 30 const Word32 diffuseness_reconstructions_fx[DIRAC_DIFFUSE_LEVELS] = { 0, 42467328, 96206848, 170655744, 331087872, 508821504, 678952960, 912785408 }; diff --git a/lib_com/ivas_stereo_ica_com_fx.c b/lib_com/ivas_stereo_ica_com_fx.c index d96d64c7c..6ffce03e4 100644 --- a/lib_com/ivas_stereo_ica_com_fx.c +++ b/lib_com/ivas_stereo_ica_com_fx.c @@ -397,4 +397,4 @@ void adjustTargetSignal_fx( return; } -#endif \ No newline at end of file +#endif -- GitLab From c1bc360e1a52aabb76bed461237922621837f6cb Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 9 Jul 2024 12:19:19 +0530 Subject: [PATCH 054/110] LTV crash and high MLD fixes [x] High MLD fix for the test case - ltv-Multi-channel 7_1_4 at 160 kbps, 48kHz in, 48kHz out, BINAURAL out, bandwidth switching, HR. MLD decreased from 37.302719 to 15.416886 [x] Fix for ltv-crash SBA FOA bitrate switching from 13.2 kbps to 192 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out [x] Fix for LTV-Crash [ltv-OMASA 1Dir1TC 4ISM at 48 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out] --- lib_com/fd_cng_com_fx.c | 16 +++++++++++++++- lib_dec/dec_tcx.c | 10 ++++++++-- lib_dec/fd_cng_dec_fx.c | 17 ++++++++++++++++- lib_dec/ivas_spar_md_dec.c | 10 +++++++++- lib_dec/ivas_stereo_dft_dec_fx.c | 2 +- 5 files changed, 49 insertions(+), 6 deletions(-) diff --git a/lib_com/fd_cng_com_fx.c b/lib_com/fd_cng_com_fx.c index b024df61d..7ba5cf7c6 100644 --- a/lib_com/fd_cng_com_fx.c +++ b/lib_com/fd_cng_com_fx.c @@ -2227,7 +2227,21 @@ void scalebands_fx( move32(); FOR( ; i <= part[stopPartM1]; i++ ) { - val = L_shl( Mpy_32_16_1( val, delta ), s1 ); + test(); + IF( val != 0 && delta != 0 ) + { + val = L_shl( Mpy_32_16_1( val, delta ), s1 ); + IF( val == 0 ) + { + val = 1; + move32(); + } + } + ELSE + { + val = 0; + move32(); + } bandpow[i] = val; move32(); } diff --git a/lib_dec/dec_tcx.c b/lib_dec/dec_tcx.c index 17ce5672d..06c9bc5ba 100644 --- a/lib_dec/dec_tcx.c +++ b/lib_dec/dec_tcx.c @@ -1571,7 +1571,7 @@ void decoder_tcx_tns_fx( const Word16 whitenedDomain, Word16 *length ) { - Word16 index, isTCX5, L; + Word16 index, isTCX5, L, tmp; TCX_CONFIG_HANDLE hTcxCfg = st->hTcxCfg; index = hTcxCfg->tcx_last_overlap_mode; /* backup last TCX overlap mode */ @@ -1581,6 +1581,8 @@ void decoder_tcx_tns_fx( move16(); L = L_frameTCX; move16(); + tmp = L; + move16(); test(); IF( EQ_16( L_frame, shr( st->L_frame, 1 ) ) && NE_16( st->tcxonly, 0 ) ) @@ -1601,6 +1603,8 @@ void decoder_tcx_tns_fx( { L = L_spec; move16(); + tmp = L; + move16(); } test(); @@ -1652,6 +1656,8 @@ void decoder_tcx_tns_fx( IF( EQ_16( st->element_mode, EVS_MONO ) || LT_16( L_spec, L_frameTCX ) ) /* todo: this is temporary to maintain EVS BE, this is a bug and should be fixed also for EVS (see issue 13) */ { tcx5TnsUngrouping_fx( shr( L_frameTCX, 1 ), shr( hTcxCfg->tnsConfig[0][0].iFilterBorders[0], 1 ), x_fx, DEC ); + tmp = L_frameTCX; + move16(); } ELSE { @@ -1679,7 +1685,7 @@ void decoder_tcx_tns_fx( if ( length != NULL ) { - *length = L; + *length = tmp; move16(); } diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 4c0e5b1d7..f4cf173f5 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -2907,7 +2907,22 @@ void perform_noise_estimation_dec_ivas_fx( } /* IIR smoothing */ - *ptr_per = Mpy_32_16_1( ( *ptr_per ), alpha ); + test(); + IF( *ptr_per != 0 && alpha != 0 ) + { + *ptr_per = Mpy_32_16_1( ( *ptr_per ), alpha ); + move32(); + IF( *ptr_per == 0 ) + { + *ptr_per = 1; + move32(); + } + } + ELSE + { + *ptr_per = 0; + move32(); + } *ptr_per = L_add( ( *ptr_per ), Mpy_32_16_1( temp, sub( MAX_16, alpha ) ) ); ptr_per++; } diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 48cbad61d..1a894ce10 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -4469,7 +4469,15 @@ static void ivas_parse_parameter_bitstream_dtx( value = get_next_indice( st0, pr_pd_bits ); - pr = idiv1616( value, pd_q_lvls ); + IF( value != 0 ) + { + pr = idiv1616( value, pd_q_lvls ); + } + ELSE + { + pr = 0; + move16(); + } pd = extract_l( L_sub( value, i_mult( pr, pd_q_lvls ) ) ); val_fx = dtx_pd_real_min_max_fx[0]; move32(); diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 87831a269..1808c5384 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -2153,7 +2153,7 @@ void stereo_dft_dec_fx( move16(); } l_gamma = L_deposit_l( gamma ); - op1 = L_add( l_gamma, L_shr( L_deposit_l( sub( MAX_16, mult( g, g ) ) ), q_gamma ) ); + op1 = L_add( l_gamma, L_shr( L_deposit_l( sub( MAX_16, mult_sat( g, g ) ) ), q_gamma ) ); /*The mult_sat function is needed because -0.999979973 is being mapped to -32768. This value, when multiplied by -32768, is causing a crash.*/ q_loc2 = add( Q16, q_gamma ); q_loc1 = q_loc2; move16(); -- GitLab From 531cf2a57865a4a8a63550cbdd276490c8d0d6fa Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 9 Jul 2024 15:04:11 +0530 Subject: [PATCH 055/110] Pulled in changes for float fix for issue 791 and svd threshold updated in float code --- lib_com/ivas_prot.h | 2 +- lib_com/options.h | 329 +++++++++++++++++++------------------- lib_dec/ivas_core_dec.c | 26 ++- lib_dec/ivas_cpe_dec_fx.c | 4 +- lib_dec/ivas_sce_dec_fx.c | 2 +- lib_dec/ivas_svd_dec.c | 2 +- 6 files changed, 196 insertions(+), 169 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 6b6e1c39c..06a1d8d1e 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -533,7 +533,7 @@ ivas_error ivas_core_enc( const int16_t flag_16k_smc /* i : flag to indicate if the OL SMC is run at 16 kHz */ ); #ifdef IVAS_FLOAT_FIXED -ivas_error ivas_core_dec( +ivas_error ivas_core_dec_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */ CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ diff --git a/lib_com/options.h b/lib_com/options.h index 7a446867d..32b4203c0 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -1,163 +1,166 @@ -/****************************************************************************************************** - - (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#ifndef OPTIONS_H -#define OPTIONS_H -//#define DEBUGGING /*allows message printed out during run time */ -#ifdef DEBUGGING -#include "debug.h" -#endif - -#include "stl.h" - -/* clang-format off */ - /* ################### Start compiler switches ######################## */ - -#define SUPPORT_JBM_TRACEFILE /* support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ - -/* #################### End compiler switches ######################### */ - -/* ################### Start compiler switches ######################## */ -/* */ -#ifdef _MSC_VER -#pragma warning(disable:4310) /* cast truncates constant value this affects mainly constants tables*/ -#endif - -/*#define WMOPS 1 --> activation or deactivation in count.h*/ /* Activate FIXED-POINT complexity counters */ -/*#define DONT_COUNT */ /* To prevent the complexity counting */ - -#ifdef WMOPS_FLT -/*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ -/*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ -/*#define WMOPS_WC_FRAME_ANALYSIS*/ /* Output detailed complexity analysis for the worst-case frame */ -/*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ -#endif - -/* #################### End DEBUGGING switches ############################ */ - -/* ################### Start FIXES switches ########################### */ - -#define NON_BE_FIX_1048_THRESHOLD_COH_BASOP /* Nokia: Fix 1048 replace comparison with 0 with comparison to threshold, to align with BASOP*/ -#define NONBE_FIX_1054_NEGATIVE_LVQ_INDEX /* Nokia: issue 1054: Input to decode_comb in deindex_lvq_SHB should be positive */ -#define FIX_1033_MEMORY_LEAK_OMASA /* Nokia / Orange: issue #1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ -#define FIX_976_USAN_PVQ_ENC_DEC_EVS_CR /* Ericsson: premature cast to unsigned detected by USAN corrected */ -#define FIX_1027_GSC_INT_OVERFLOW /* VA: issue 2207: overflow in GSC */ -#define NONBE_FIX_1096_NAN_VALUES_IN_DIRAC_TO_STEREO /* FhG: avoid sidegain DFT-Stereo param to be larger than 1 when converting from Dirac parameters */ -#define NON_BE_1055_RESET_LP_MEMORIES /* VA: issue 1055: Correctly reset LP filter MA and AR memories in bitrate switching */ - -/* #################### End FIXES switches ############################ */ - -#define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ - - -/* ################### Start BE switches ################################# */ -/* only BE switches wrt selection floating point code */ - -/*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ - -#define FIX_854_ARRAY_SIZE_MISMATCH /* VA: issue 854: correct the mismatch between definition and declaration of `ivas_core_dec() */ -#define FIX_785_REMOVE_DEAD_CODE /* VA: issue 785: remove dead code */ -#define FIX_852_FIX_HANDLE_DEREF /* VA: issue 852: Fix missing handle dereferencing of hIsmMetadaData in ivas_ism_metadata_close() */ -#define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ - -/* #################### End BE switches ################################## */ - - -/* #################### Start NON-BE switches ############################ */ -/* any switch which is non-be wrt selection floating point code */ -/* all switches in this category should start with "NONBE_" */ - -#define NONBE_FIX_838_CRASH_24_4_WB /* FhG: Issue 838: fix encoder crashes for Unified Stereo and MASA 2 TC at 24.4 kbps WB due to missing IGF (re-) allocation */ -#define NONBE_FIX_839_MC_RS_CHANNEL_ALLOC /* FhG: Issues #839: problems with reallocation of the channels on the heap in case of MC RS */ -#define BE_FIX_832_ASAN_ERROR_EFAP_OSBA /* FhG: issue #832: fix ASAN error caused by re-allocating EFAP memories in OSBA*/ -#define NONBE_FIX_819_DOUBLE_PREC_COMB_FORMATS /* VA: issue 820: Double precision arithmetic in combined formats */ -#define NONBE_FIX_849_OMASA_BFI_CRASH /* VA: issue 849: fix OMASA 2TC and FEC crashes */ -#define NONBE_FIX_738_QUATERNION_SLERP_PRECISION /* Quaternion slerp changes*/ -#define IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED -#define MSAN_FIX -#endif -#define ISM_DISABLE -#define FIX_TMP_714 -#define BASOP_NOGLOB_TMP_715 -#define EVS_FUNC_MODIFIED -//#define DEBUGGING -//#define DBG_WAV_WRITER -#define EVS_FLOAT_ENC -//#define DUMPS_ENABLED -//#define WMOPS -#define FIX_667_DISABLE_INITIAL_PLC_SUPPRESSION -#define IVAS_CNST -#define REMOVE_IVAS_UNUSED_PARAMETERS_WARNING /*temporary operation on unused EVS parameters to remove warnings, these parameters will be used in IVAS */ - -#define MOD_BIT_ALLOC_ROM_TABLE // Just to highlight modification in bit allocation table and to ensure these modifications doesn't affect EVS modes*/ -#define SIMPLIFY_CODE_BE // Simplify synthesis loop - -#define CR_2109_to_2112_cd0_ce0 /* This is related to the CRs include in the 26.444 package of 21-12. Concerns lead_deindexing and */ - -#define FIX_ISSUE_723_INFO_TCX_NOISE /*FhG: Issue 723: fix for IGF that introduces wrong noise filling behavion*/ - -#define FIX_QMETADATA_PENALTY /* Nokia: transform penalty calculation in qmetadata into integer operations */ - -/* ##################### End NON-BE switches ########################### */ -#define FIX_740_HQ_CORE_OVA // Proposed fix to solve overlap and add issue for HQ_CORE -#define FIX_746 // proposed fix to solve low bit-rate frame boundaries issues -#define FIX_SATURATION_725 // Propose fix for saturation in AVQ -#define FIX_737_HQ_ACELP_SWITCH_SCALING_ERROR /* Eri: Proposed fix for issue 737: scaling error in excitation memory after HQ->ACELP switch */ -#define FIX_736_BWE_SECT_C // Solves an issue where the BWE was disappearing, problem related to wrong scaling in ic-BWE -#define FIX_734_MISSING_SUBFR_LOW_RATE_ACELP -#define FIX_747_TDBWE_ENERGY_BURST -#define FIX_770_DISCONTINUITIES_SW_TCX2ACELP // Fix discontinuities when switching from TCX to ACELP -#define FIX_680_CNG_FRAME_BOUNDARIES_ISSUE /* Step was right shift by 2, which made the OVA wrong */ -#define NONBE_FIX_1069_SVD_TUNING /* FhG: issue 1069: tune SVD constants */ -#define FIX_778_STEREO_BRATE_SWITCHING -#define FIX_774_ENERGY_BURST /* Fix 0 bit BWE */ -#define FIX_729_MISSING_RESCALING -#define FIX_798_LSF_SECONDARY_CH_MISSING_CODE /* Adding the missing code to properly render the secondary channel of TD stereo*/ -#define FIX_798_WRONG_CPY_OF_PITCH /* The copy of the pitch from primary to secondary channel was wrong AND safety check was really wrong */ -#define FIX_800_PROPOSAL_HB_LPC_COEFFICIENT /* Proposal to fix wrong shape of TDBWE, #800 */ - -#define FIX_802__NON_BE_DECODING /* Fix possible difference float and fixed point when computing the GSC bit allocation */ -#define FIX_802_1137_1137_GSC_IVAS_FXFLT_DECODING /* VA: ISSUES 802 and 1137 Made sure that float and fixed point GCS bit allocation is the same during IVAS modes */ - -/* ################## End DEVELOPMENT switches ######################### */ - -/* clang-format on */ -#define NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO - -#define UNUSED_PARAM( ... ) (void) ( __VA_ARGS__ ) - -#endif +/****************************************************************************************************** + + (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef OPTIONS_H +#define OPTIONS_H +//#define DEBUGGING /*allows message printed out during run time */ +#ifdef DEBUGGING +#include "debug.h" +#endif + +#include "stl.h" + +/* clang-format off */ + /* ################### Start compiler switches ######################## */ + +#define SUPPORT_JBM_TRACEFILE /* support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ + +/* #################### End compiler switches ######################### */ + +/* ################### Start compiler switches ######################## */ +/* */ +#ifdef _MSC_VER +#pragma warning(disable:4310) /* cast truncates constant value this affects mainly constants tables*/ +#endif + +/*#define WMOPS 1 --> activation or deactivation in count.h*/ /* Activate FIXED-POINT complexity counters */ +/*#define DONT_COUNT */ /* To prevent the complexity counting */ + +#ifdef WMOPS_FLT +/*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ +/*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ +/*#define WMOPS_WC_FRAME_ANALYSIS*/ /* Output detailed complexity analysis for the worst-case frame */ +/*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ +#endif + +/* #################### End DEBUGGING switches ############################ */ + +/* ################### Start FIXES switches ########################### */ + +#define NON_BE_FIX_1048_THRESHOLD_COH_BASOP /* Nokia: Fix 1048 replace comparison with 0 with comparison to threshold, to align with BASOP*/ +#define NONBE_FIX_1054_NEGATIVE_LVQ_INDEX /* Nokia: issue 1054: Input to decode_comb in deindex_lvq_SHB should be positive */ +#define FIX_1033_MEMORY_LEAK_OMASA /* Nokia / Orange: issue #1033: Memory leak in OMASA to BINAURAL with HRTF with bitrate switching */ +#define FIX_976_USAN_PVQ_ENC_DEC_EVS_CR /* Ericsson: premature cast to unsigned detected by USAN corrected */ +#define FIX_1027_GSC_INT_OVERFLOW /* VA: issue 2207: overflow in GSC */ +#define NONBE_FIX_1096_NAN_VALUES_IN_DIRAC_TO_STEREO /* FhG: avoid sidegain DFT-Stereo param to be larger than 1 when converting from Dirac parameters */ +#define NON_BE_1055_RESET_LP_MEMORIES /* VA: issue 1055: Correctly reset LP filter MA and AR memories in bitrate switching */ + +/* #################### End FIXES switches ############################ */ + +#define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ + + +/* ################### Start BE switches ################################# */ +/* only BE switches wrt selection floating point code */ + +/*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ + +#define FIX_854_ARRAY_SIZE_MISMATCH /* VA: issue 854: correct the mismatch between definition and declaration of `ivas_core_dec() */ +#define FIX_785_REMOVE_DEAD_CODE /* VA: issue 785: remove dead code */ +#define FIX_852_FIX_HANDLE_DEREF /* VA: issue 852: Fix missing handle dereferencing of hIsmMetadaData in ivas_ism_metadata_close() */ +#define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ + +/* #################### End BE switches ################################## */ + + +/* #################### Start NON-BE switches ############################ */ +/* any switch which is non-be wrt selection floating point code */ +/* all switches in this category should start with "NONBE_" */ + +#define NONBE_FIX_838_CRASH_24_4_WB /* FhG: Issue 838: fix encoder crashes for Unified Stereo and MASA 2 TC at 24.4 kbps WB due to missing IGF (re-) allocation */ +#define NONBE_FIX_839_MC_RS_CHANNEL_ALLOC /* FhG: Issues #839: problems with reallocation of the channels on the heap in case of MC RS */ +#define BE_FIX_832_ASAN_ERROR_EFAP_OSBA /* FhG: issue #832: fix ASAN error caused by re-allocating EFAP memories in OSBA*/ +#define NONBE_FIX_819_DOUBLE_PREC_COMB_FORMATS /* VA: issue 820: Double precision arithmetic in combined formats */ +#define NONBE_FIX_849_OMASA_BFI_CRASH /* VA: issue 849: fix OMASA 2TC and FEC crashes */ +#define NONBE_FIX_738_QUATERNION_SLERP_PRECISION /* Quaternion slerp changes*/ +#define IVAS_FLOAT_FIXED +#ifdef IVAS_FLOAT_FIXED +#define MSAN_FIX +#endif +#define ISM_DISABLE +#define FIX_TMP_714 +#define BASOP_NOGLOB_TMP_715 +#define EVS_FUNC_MODIFIED +//#define DEBUGGING +//#define DBG_WAV_WRITER +#define EVS_FLOAT_ENC +//#define DUMPS_ENABLED +//#define WMOPS +#define FIX_667_DISABLE_INITIAL_PLC_SUPPRESSION +#define IVAS_CNST +#define REMOVE_IVAS_UNUSED_PARAMETERS_WARNING /*temporary operation on unused EVS parameters to remove warnings, these parameters will be used in IVAS */ + +#define MOD_BIT_ALLOC_ROM_TABLE // Just to highlight modification in bit allocation table and to ensure these modifications doesn't affect EVS modes*/ +#define SIMPLIFY_CODE_BE // Simplify synthesis loop + +#define CR_2109_to_2112_cd0_ce0 /* This is related to the CRs include in the 26.444 package of 21-12. Concerns lead_deindexing and */ + +#define FIX_ISSUE_723_INFO_TCX_NOISE /*FhG: Issue 723: fix for IGF that introduces wrong noise filling behavion*/ + +#define FIX_QMETADATA_PENALTY /* Nokia: transform penalty calculation in qmetadata into integer operations */ + +#define NONBE_MDCT_ST_DTX_SKIP_DEWHITENING_OF_NOISE_SHAPES_ON_SID_FRAMES /* FhG: issue 1133: skip de-whitening of bg noise shape after frameloss period if the first good frame is an SID */ +#define NONBE_MDCT_ST_PLC_DO_NOT_SCALE_OLD_OUT_IF_FIRST_GOOD_IS_SID /* FhG: issue 1133: in TCX PLC, don't scale hHQ_core->old_out after applying fade to noise in burst frame error */ + +/* ##################### End NON-BE switches ########################### */ +#define FIX_740_HQ_CORE_OVA // Proposed fix to solve overlap and add issue for HQ_CORE +#define FIX_746 // proposed fix to solve low bit-rate frame boundaries issues +#define FIX_SATURATION_725 // Propose fix for saturation in AVQ +#define FIX_737_HQ_ACELP_SWITCH_SCALING_ERROR /* Eri: Proposed fix for issue 737: scaling error in excitation memory after HQ->ACELP switch */ +#define FIX_736_BWE_SECT_C // Solves an issue where the BWE was disappearing, problem related to wrong scaling in ic-BWE +#define FIX_734_MISSING_SUBFR_LOW_RATE_ACELP +#define FIX_747_TDBWE_ENERGY_BURST +#define FIX_770_DISCONTINUITIES_SW_TCX2ACELP // Fix discontinuities when switching from TCX to ACELP +#define FIX_680_CNG_FRAME_BOUNDARIES_ISSUE /* Step was right shift by 2, which made the OVA wrong */ +#define NONBE_FIX_1069_SVD_TUNING /* FhG: issue 1069: tune SVD constants */ +#define FIX_778_STEREO_BRATE_SWITCHING +#define FIX_774_ENERGY_BURST /* Fix 0 bit BWE */ +#define FIX_729_MISSING_RESCALING +#define FIX_798_LSF_SECONDARY_CH_MISSING_CODE /* Adding the missing code to properly render the secondary channel of TD stereo*/ +#define FIX_798_WRONG_CPY_OF_PITCH /* The copy of the pitch from primary to secondary channel was wrong AND safety check was really wrong */ +#define FIX_800_PROPOSAL_HB_LPC_COEFFICIENT /* Proposal to fix wrong shape of TDBWE, #800 */ + +#define FIX_802__NON_BE_DECODING /* Fix possible difference float and fixed point when computing the GSC bit allocation */ +#define FIX_802_1137_1137_GSC_IVAS_FXFLT_DECODING /* VA: ISSUES 802 and 1137 Made sure that float and fixed point GCS bit allocation is the same during IVAS modes */ + +/* ################## End DEVELOPMENT switches ######################### */ + +/* clang-format on */ +#define NONBE_FIX_1010_STEREO_CNG_DIV_BY_ZERO + +#define UNUSED_PARAM( ... ) (void) ( __VA_ARGS__ ) + +#endif diff --git a/lib_dec/ivas_core_dec.c b/lib_dec/ivas_core_dec.c index 4ee545e49..1ef2e9d41 100644 --- a/lib_dec/ivas_core_dec.c +++ b/lib_dec/ivas_core_dec.c @@ -53,7 +53,7 @@ * Principal IVAS core decoder routine, where number of core channels is 1 or 2 *-------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -ivas_error ivas_core_dec( +ivas_error ivas_core_dec_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */ CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ @@ -279,7 +279,12 @@ ivas_error ivas_core_dec( test(); test(); test(); + test(); +#ifdef NONBE_MDCT_ST_PLC_DO_NOT_SCALE_OLD_OUT_IF_FIRST_GOOD_IS_SID + IF( !st->bfi && st->prev_bfi && GT_32( st->total_brate, SID_2k40 ) && ( EQ_16( st->last_core_bfi, TCX_20_CORE ) || EQ_16( st->last_core_bfi, TCX_10_CORE ) ) && st->hTcxDec != NULL ) +#else IF( !st->bfi && st->prev_bfi && ( EQ_16( st->last_core_bfi, TCX_20_CORE ) || EQ_16( st->last_core_bfi, TCX_10_CORE ) ) && st->hTcxDec != NULL ) +#endif { conceal_eof_gain32 = L_shl( L_deposit_l( st->hTcxDec->conceal_eof_gain ), 1 ); @@ -795,10 +800,18 @@ ivas_error ivas_core_dec( sts[1]->hHQ_core->Q_old_wtda = sub( 15, sts[1]->hHQ_core->exp_old_out ); } } + + test(); test(); +#ifdef NONBE_MDCT_ST_DTX_SKIP_DEWHITENING_OF_NOISE_SHAPES_ON_SID_FRAMES + /* On first good active frame after frameloss undo the whitening of the bg noise shape */ + IF( GT_32( sts[0]->core_brate, SID_2k40 ) && sts[0]->bfi == 0 && EQ_16( sts[0]->prev_bfi, 1 ) ) + { +#else IF( sts[0]->bfi == 0 && EQ_16( sts[0]->prev_bfi, 1 ) ) { /* On first good frame after frameloss undo the whitening of the bg noise shape */ +#endif FOR( n = 0; n < n_channels; ++n ) { IF( NE_16( sts[n]->last_core_bfi, ACELP_CORE ) ) @@ -1754,7 +1767,11 @@ ivas_error ivas_core_dec( st->flagGuidedAcelp = 0; } +#ifdef NONBE_MDCT_ST_PLC_DO_NOT_SCALE_OLD_OUT_IF_FIRST_GOOD_IS_SID + if ( !st->bfi && st->prev_bfi && st->total_brate > SID_2k40 && ( st->last_core_bfi == TCX_20_CORE || st->last_core_bfi == TCX_10_CORE ) && st->hTcxDec != NULL ) +#else if ( !st->bfi && st->prev_bfi && ( st->last_core_bfi == TCX_20_CORE || st->last_core_bfi == TCX_10_CORE ) && st->hTcxDec != NULL ) +#endif { v_multc( st->hHQ_core->old_out, st->hTcxDec->conceal_eof_gain_float * st->last_concealed_gain_syn_deemph_float, st->hHQ_core->old_out, st->hTcxDec->L_frameTCX ); v_multc( st->hHQ_core->old_outLB, st->hTcxDec->conceal_eof_gain_float * st->last_concealed_gain_syn_deemph_float, st->hHQ_core->old_outLB, st->L_frame ); @@ -1968,9 +1985,16 @@ ivas_error ivas_core_dec( updateBuffersForDmxMdctStereo( hCPE, output_frame, output, synth ); } +#ifdef NONBE_MDCT_ST_DTX_SKIP_DEWHITENING_OF_NOISE_SHAPES_ON_SID_FRAMES + + /* On first good active frame after frameloss undo the whitening of the bg noise shape */ + if ( sts[0]->core_brate > SID_2k40 && sts[0]->bfi == 0 && sts[0]->prev_bfi == 1 ) + { +#else if ( sts[0]->bfi == 0 && sts[0]->prev_bfi == 1 ) { /* On first good frame after frameloss undo the whitening of the bg noise shape */ +#endif for ( n = 0; n < n_channels; ++n ) { if ( sts[n]->last_core_bfi != ACELP_CORE ) diff --git a/lib_dec/ivas_cpe_dec_fx.c b/lib_dec/ivas_cpe_dec_fx.c index e0ac57446..1a97e84b5 100644 --- a/lib_dec/ivas_cpe_dec_fx.c +++ b/lib_dec/ivas_cpe_dec_fx.c @@ -586,7 +586,7 @@ ivas_error ivas_cpe_dec_fx( test(); IF( NE_16( hCPE->element_mode, IVAS_CPE_DFT ) || ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) ) { - IF( NE_32( ( error = ivas_core_dec( st_ivas, NULL, hCPE, st_ivas->hMCT, n_channels, output, outputHB_fx, NULL, st_ivas->sba_dirac_stereo_flag ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_core_dec_fx( st_ivas, NULL, hCPE, st_ivas->hMCT, n_channels, output, outputHB_fx, NULL, st_ivas->sba_dirac_stereo_flag ) ), IVAS_ERR_OK ) ) { return error; } @@ -611,7 +611,7 @@ ivas_error ivas_cpe_dec_fx( set32_fx( DFT_fx[1], 0, STEREO_DFT_BUF_MAX ); /* core decoder */ - IF( NE_32( ( error = ivas_core_dec( NULL, NULL, hCPE, st_ivas->hMCT, n_channels, output, outputHB_fx, DFT_fx, 0 ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_core_dec_fx( NULL, NULL, hCPE, st_ivas->hMCT, n_channels, output, outputHB_fx, DFT_fx, 0 ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_sce_dec_fx.c b/lib_dec/ivas_sce_dec_fx.c index 78ce1a71a..5976c81a3 100644 --- a/lib_dec/ivas_sce_dec_fx.c +++ b/lib_dec/ivas_sce_dec_fx.c @@ -298,7 +298,7 @@ ivas_error ivas_sce_dec_fx( set32_fx( output[0], 0, L_FRAME48k ); - IF( NE_32( ( error = ivas_core_dec( st_ivas, hSCE, NULL, NULL, 1, output, outputHB, NULL, st_ivas->sba_dirac_stereo_flag ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_core_dec_fx( st_ivas, hSCE, NULL, NULL, 1, output, outputHB, NULL, st_ivas->sba_dirac_stereo_flag ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_svd_dec.c b/lib_dec/ivas_svd_dec.c index 630e24d4e..5d5ccedb4 100644 --- a/lib_dec/ivas_svd_dec.c +++ b/lib_dec/ivas_svd_dec.c @@ -52,7 +52,7 @@ #ifdef NONBE_FIX_1069_SVD_TUNING #define SVD_MINIMUM_VALUE 1e-32f /* minimum value */ #define CONVERGENCE_FACTOR 1.0e-04f /* factor for SVD convergence */ -#define SVD_ZERO_FLUSH_THRESHOLD 0.0f +#define SVD_ZERO_FLUSH_THRESHOLD 1.0e-20f #else #define SVD_MINIMUM_VALUE 1e-32f /* minimum value */ #define CONVERGENCE_FACTOR 1.19209290e-07f /* factor for SVD convergence */ -- GitLab From a8fb397f84c12a3242804a0d5e97d603b9dbaab0 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 10 Jul 2024 12:26:21 +0530 Subject: [PATCH 056/110] Preprocess front ivas and acelp core encoder functions converted --- lib_com/cldfb.c | 606 +++++++++- lib_com/cldfb_evs.c | 2 +- lib_com/cng_exc_fx.c | 5 +- lib_com/cnst.h | 3 + lib_com/ivas_mdct_imdct_fx.c | 4 +- lib_com/ivas_prot.h | 51 +- lib_com/ivas_prot_fx.h | 6 + lib_com/ivas_rom_com.c | 4 +- lib_com/ivas_rom_com.h | 17 + lib_com/modif_fs_fx.c | 17 +- lib_com/prot.h | 23 + lib_com/prot_fx2.h | 46 +- lib_com/rom_com.c | 629 ++++++++++- lib_com/rom_com.h | 28 +- lib_com/rom_com_fx.h | 8 + lib_com/stat_com.h | 1 + lib_dec/ivas_lfe_plc_fx.c | 5 +- lib_enc/acelp_core_enc.c | 1466 ++++++++++++++++++++++++ lib_enc/amr_wb_enc_fx.c | 6 +- lib_enc/bw_detect_fx.c | 12 +- lib_enc/cng_enc_fx.c | 3 +- lib_enc/init_enc.c | 111 +- lib_enc/ivas_core_pre_proc_front.c | 1261 ++++++++++++++++++++- lib_enc/ivas_cpe_enc.c | 19 +- lib_enc/ivas_enc.c | 26 + lib_enc/ivas_init_enc.c | 7 + lib_enc/ivas_ism_enc.c | 8 +- lib_enc/ivas_masa_enc.c | 2 +- lib_enc/ivas_omasa_enc.c | 2 +- lib_enc/ivas_sce_enc.c | 9 +- lib_enc/ivas_stereo_dft_enc.c | 3 + lib_enc/ivas_stereo_switching_enc.c | 6 +- lib_enc/ivas_stereo_td_enc.c | 4 +- lib_enc/lsf_enc.c | 3 + lib_enc/lsf_enc_fx.c | 1614 ++++++++++++++++++++++++--- lib_enc/mslvq_enc_fx.c | 368 ++++++ lib_enc/nois_est_fx.c | 107 +- lib_enc/pre_proc_fx.c | 6 +- lib_enc/prot_fx_enc.h | 90 ++ lib_enc/stat_enc.h | 19 +- lib_enc/vad_fx.c | 1236 ++++++++++++++++++++ 41 files changed, 7516 insertions(+), 327 deletions(-) diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index b2022f725..6a4062a98 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -60,6 +60,8 @@ static void cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ); +static void cldfb_init_proto_and_twiddles_enc( HANDLE_CLDFB_FILTER_BANK hs ); + static float GetEnergyCldfb_ivas( float *energyValuesSum, float *energyLookahead, float **realValues, float **imagValues, const int16_t numberBands, int16_t numberCols, TEC_ENC_HANDLE hTecEnc ); /*-------------------------------------------------------------------* @@ -1596,6 +1598,28 @@ void configureCldfb_ivas( return; } +void configureCldfb_ivas_enc( + HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: filter bank handle */ + const int32_t sampling_rate /* i : sampling rate */ +) +{ + + h_cldfb->no_col = CLDFB_NO_COL_MAX; + h_cldfb->bandsToZero = 0; + h_cldfb->nab = 0; + + h_cldfb->no_channels = (int16_t) ( sampling_rate * INV_CLDFB_BANDWIDTH + 0.5f ); + h_cldfb->p_filter_length = 10 * h_cldfb->no_channels; +#ifdef IVAS_FLOAT_FIXED + h_cldfb->zeros = 0; + h_cldfb->anaScalefactor = 0; + h_cldfb->synScalefactor = 0; + h_cldfb->filterScale = 1; +#endif + cldfb_init_proto_and_twiddles_enc( h_cldfb ); + + return; +} #ifdef IVAS_FLOAT_FIXED void configureCldfb_ivas_fx( HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: filter bank handle */ @@ -1612,7 +1636,9 @@ void configureCldfb_ivas_fx( Word32 val = L_add( Mpy_32_16_1( n_sampling_rate, 41 /* INV_CLDFB_BANDWIDTH in Q15 */ ), 1 ); val = L_shr( val, 1 ); h_cldfb->no_channels = extract_l( val ); - + h_cldfb->zeros = 0; + h_cldfb->anaScalefactor = 0; + h_cldfb->synScalefactor = 0; h_cldfb->p_filter_length = 10 * h_cldfb->no_channels; cldfb_init_proto_and_twiddles( h_cldfb ); @@ -1626,7 +1652,71 @@ void configureCldfb_ivas_fx( * open and configures a CLDFB handle *--------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -ivas_error openCldfb_ivas( +ivas_error openCldfb_ivas_fx( + HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ + CLDFB_TYPE type, /* i : analysis or synthesis */ + const Word32 sampling_rate, /* i : sampling rate */ + CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ +) +{ + HANDLE_CLDFB_FILTER_BANK hs; + Word16 buf_len; + + IF( ( hs = (HANDLE_CLDFB_FILTER_BANK) malloc( sizeof( CLDFB_FILTER_BANK ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); + } + + hs->type = type; + move16(); + hs->prototype = prototype; + move16(); + + // configureCldfb_ivas( hs, sampling_rate ); + configureCldfb_ivas_fx( hs, sampling_rate ); + hs->memory_flt = NULL; + hs->memory_length = 0; + move16(); + + IF( EQ_32( type, CLDFB_ANALYSIS ) ) + { + buf_len = sub( hs->p_filter_length, hs->no_channels ); + hs->FilterStates = (Word16 *) malloc( ( 9 + 16 ) * CLDFB_getNumChannels( sampling_rate ) * sizeof( Word16 ) ); + hs->FilterStates_eg = 0; + } + ELSE + { + buf_len = hs->p_filter_length; + move16(); + hs->FilterStates = (Word16 *) malloc( 2 * ( 9 + 16 ) * CLDFB_getNumChannels( sampling_rate ) * sizeof( Word16 ) ); + hs->FilterStates_eg = 0; + } + + IF( ( hs->cldfb_state_fx = (Word32 *) malloc( buf_len * sizeof( Word32 ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); + } + + hs->cldfb_state_length = buf_len; // Temporarily added to store the length of buffer + hs->cldfb_size = buf_len; /*for having original size at intermediatery conversion, will be removed on removing conversion*/ + set32_fx( hs->cldfb_state_fx, 0, buf_len ); + hs->Q_cldfb_state = Q11; + /* TODO: remove the floating point dependency */ + + IF( ( hs->cldfb_state = (float *) malloc( buf_len * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); + } + + set_f( hs->cldfb_state, 0.0f, buf_len ); + + *h_cldfb = hs; + move16(); + + return IVAS_ERR_OK; +} + +ivas_error openCldfb_ivas_enc( HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ CLDFB_TYPE type, /* i : analysis or synthesis */ const int32_t sampling_rate, /* i : sampling rate */ @@ -1644,17 +1734,25 @@ ivas_error openCldfb_ivas( hs->type = type; hs->prototype = prototype; - configureCldfb_ivas( hs, sampling_rate ); + configureCldfb_ivas_enc( hs, sampling_rate ); hs->memory_flt = NULL; hs->memory_length = 0; if ( type == CLDFB_ANALYSIS ) { buf_len = hs->p_filter_length - hs->no_channels; +#ifdef IVAS_FLOAT_FIXED + hs->FilterStates = (Word16 *) malloc( ( 9 + 16 ) * CLDFB_getNumChannels( sampling_rate ) * sizeof( Word16 ) ); + hs->FilterStates_eg = 0; +#endif } else { buf_len = hs->p_filter_length; +#ifdef IVAS_FLOAT_FIXED + hs->FilterStates = (Word16 *) malloc( 2 * ( 9 + 16 ) * CLDFB_getNumChannels( sampling_rate ) * sizeof( Word16 ) ); + hs->FilterStates_eg = 0; +#endif } if ( ( hs->cldfb_state = (float *) malloc( buf_len * sizeof( float ) ) ) == NULL ) @@ -1670,7 +1768,8 @@ ivas_error openCldfb_ivas( hs->cldfb_state_length = buf_len; // Temporarily added to store the length of buffer hs->cldfb_size = buf_len; /*for having original size at intermediatery conversion, will be removed on removing conversion*/ set32_fx( hs->cldfb_state_fx, 0, buf_len ); - hs->Q_cldfb_state = Q11; + set16_fx( hs->FilterStates, 0, i_mult( 9 + 16, hs->no_channels ) ); + set16_fx( hs->FilterStates_e, 0, sizeof( hs->FilterStates_e ) / sizeof( hs->FilterStates_e[0] ) ); #endif // IVAS_FLOAT_FIXED @@ -1678,7 +1777,6 @@ ivas_error openCldfb_ivas( return IVAS_ERR_OK; } -#else ivas_error openCldfb_ivas( HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ CLDFB_TYPE type, /* i : analysis or synthesis */ @@ -1714,63 +1812,56 @@ ivas_error openCldfb_ivas( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); } - set_f( hs->cldfb_state, 0.0f, buf_len ); +#ifdef IVAS_FLOAT_FIXED + if ( ( hs->cldfb_state_fx = (Word32 *) malloc( buf_len * sizeof( Word32 ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); + } + hs->cldfb_state_length = buf_len; // Temporarily added to store the length of buffer + hs->cldfb_size = buf_len; /*for having original size at intermediatery conversion, will be removed on removing conversion*/ + set32_fx( hs->cldfb_state_fx, 0, buf_len ); + hs->Q_cldfb_state = Q11; +#endif // IVAS_FLOAT_FIXED + *h_cldfb = hs; return IVAS_ERR_OK; } -#endif -#ifdef IVAS_FLOAT_FIXED -ivas_error openCldfb_ivas_fx( +#else +ivas_error openCldfb_ivas( HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ CLDFB_TYPE type, /* i : analysis or synthesis */ - const Word32 sampling_rate, /* i : sampling rate */ + const int32_t sampling_rate, /* i : sampling rate */ CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ ) { HANDLE_CLDFB_FILTER_BANK hs; - Word16 buf_len; + int16_t buf_len; - IF( ( hs = (HANDLE_CLDFB_FILTER_BANK) malloc( sizeof( CLDFB_FILTER_BANK ) ) ) == NULL ) + if ( ( hs = (HANDLE_CLDFB_FILTER_BANK) malloc( sizeof( CLDFB_FILTER_BANK ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); } hs->type = type; - move16(); hs->prototype = prototype; - move16(); - // configureCldfb_ivas( hs, sampling_rate ); - configureCldfb_ivas_fx( hs, sampling_rate ); + configureCldfb_ivas( hs, sampling_rate ); hs->memory_flt = NULL; hs->memory_length = 0; - move16(); - IF( EQ_32( type, CLDFB_ANALYSIS ) ) + if ( type == CLDFB_ANALYSIS ) { - buf_len = sub( hs->p_filter_length, hs->no_channels ); + buf_len = hs->p_filter_length - hs->no_channels; } - ELSE + else { buf_len = hs->p_filter_length; - move16(); - } - - IF( ( hs->cldfb_state_fx = (Word32 *) malloc( buf_len * sizeof( Word32 ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); } - hs->cldfb_state_length = buf_len; // Temporarily added to store the length of buffer - hs->cldfb_size = buf_len; /*for having original size at intermediatery conversion, will be removed on removing conversion*/ - set32_fx( hs->cldfb_state_fx, 0, buf_len ); - hs->Q_cldfb_state = Q11; - /* TODO: remove the floating point dependency */ - - IF( ( hs->cldfb_state = (float *) malloc( buf_len * sizeof( float ) ) ) == NULL ) + if ( ( hs->cldfb_state = (float *) malloc( buf_len * sizeof( float ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); } @@ -1778,12 +1869,10 @@ ivas_error openCldfb_ivas_fx( set_f( hs->cldfb_state, 0.0f, buf_len ); *h_cldfb = hs; - move16(); return IVAS_ERR_OK; } #endif - /*-------------------------------------------------------------------* * resampleCldfb_ivas() * @@ -1862,6 +1951,44 @@ void analysisCldfbEncoder_ivas( return; } +void analysisCldfbEncoder_ivas_fx( + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 *timeIn, + Word32 realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word16 realBuffer16[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word16 imagBuffer16[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 *ppBuf_Ener, + Word16 *enerBuffSum_exp, + CLDFB_SCALE_FACTOR *scale ) +{ + Word16 i; + CLDFB_SCALE_FACTOR enerScale; + Word32 *ppBuf_Real[CLDFB_NO_COL_MAX]; + Word32 *ppBuf_Imag[CLDFB_NO_COL_MAX]; + Word16 *ppBuf_Real16[CLDFB_NO_COL_MAX]; + Word16 *ppBuf_Imag16[CLDFB_NO_COL_MAX]; + Word32 workBuffer[256]; + + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + ppBuf_Real[i] = &realBuffer[i][0]; + ppBuf_Imag[i] = &imagBuffer[i][0]; + ppBuf_Real16[i] = &realBuffer16[i][0]; + ppBuf_Imag16[i] = &imagBuffer16[i][0]; + } + + cldfbAnalysisFiltering( st->cldfbAnaEnc, ppBuf_Real, ppBuf_Imag, scale, timeIn, 0, CLDFB_NO_COL_MAX, workBuffer ); + + enerScale.lb_scale = negate( scale->lb_scale ); + enerScale.lb_scale16 = negate( scale->lb_scale ); + + AnalysisPostSpectrumScaling_Fx( st->cldfbAnaEnc, ppBuf_Real, ppBuf_Imag, ppBuf_Real16, ppBuf_Imag16, &enerScale.lb_scale16 ); + + GetEnergyCldfb( &st->energyCoreLookahead_Fx, &st->sf_energyCoreLookahead_Fx, 1, ppBuf_Real16, ppBuf_Imag16, enerScale.lb_scale16, st->cldfbAnaEnc->no_channels, st->cldfbAnaEnc->no_col, &st->currEnergyHF_fx, &st->currEnergyHF_e_fx, ppBuf_Ener, enerBuffSum_exp, st->hTECEnc ); + + return; +} /*-------------------------------------------------------------------* * GetEnergyCldfb_ivas() * @@ -2390,7 +2517,416 @@ static void cldfb_init_proto_and_twiddles( return; } +static void cldfb_init_proto_and_twiddles_enc( + HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ +) +{ + /*find appropriate set of rotVecs*/ + switch ( hs->no_channels ) + { + case 10: + hs->rot_vec_ana_re = rot_vec_ana_re_L10; + hs->rot_vec_ana_im = rot_vec_ana_im_L10; + hs->rot_vec_syn_re = rot_vec_syn_re_L10; + hs->rot_vec_syn_im = rot_vec_syn_im_L10; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_re_fx = rot_vec_ana_re_L10_fx; + hs->rot_vec_ana_im_fx = rot_vec_ana_im_L10_fx; + hs->rot_vec_syn_re_fx = rot_vec_syn_re_L10_fx; + hs->rot_vec_syn_im_fx = rot_vec_syn_im_L10_fx; + hs->rRotVctr = rRotVectr_10; + hs->iRotVctr = iRotVectr_10; + IF( hs->type == CLDFB_SYNTHESIS ) + { + hs->synScalefactor = add( cldfb_synScale[0], hs->filterScale ); + move16(); + } + ELSE + { + hs->anaScalefactor = add( cldfb_anaScale[0], hs->filterScale ); + move16(); + } +#endif + if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) + { + hs->p_filter_flt = CLDFB80_10_flt; + hs->scale_flt = CLDFB80_10_SCALE; + hs->ds = 10; + hs->da = 10; + hs->rot_vec_ana_delay_re = NULL; + hs->rot_vec_ana_delay_im = NULL; + hs->rot_vec_syn_delay_re = NULL; + hs->rot_vec_syn_delay_im = NULL; +#ifdef IVAS_FLOAT_FIXED + hs->p_filter_sf = (Word16) 17036; + hs->scale = cldfb_scale_2_5ms[0]; + hs->p_filter = cldfb_protoFilter_2_5ms[0]; +#endif + } + else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + hs->p_filter_flt = LDQMF_10; + hs->scale_flt = LDQMF_10_SCALE; + hs->ds = 40; + hs->da = -20; + hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; + hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; +#ifdef IVAS_FLOAT_FIXED + hs->p_filter_sf = (Word16) 15388; + hs->p_filter = cldfb_protoFilter_5_0ms[0]; + hs->scale = cldfb_scale_5_0ms[0]; +#endif + } + break; + case 16: + hs->rot_vec_ana_re = rot_vec_ana_re_L16; + hs->rot_vec_ana_im = rot_vec_ana_im_L16; + hs->rot_vec_syn_re = rot_vec_syn_re_L16; + hs->rot_vec_syn_im = rot_vec_syn_im_L16; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_re_fx = rot_vec_ana_re_L16_fx; + hs->rot_vec_ana_im_fx = rot_vec_ana_im_L16_fx; + hs->rot_vec_syn_re_fx = rot_vec_syn_re_L16_fx; + hs->rot_vec_syn_im_fx = rot_vec_syn_im_L16_fx; + hs->rRotVctr = rRotVectr_16; + hs->iRotVctr = iRotVectr_16; + { + hs->anaScalefactor = add( cldfb_anaScale[1], hs->filterScale ); + move16(); + } +#endif + if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) + { + hs->p_filter_flt = CLDFB80_16_flt; + hs->scale_flt = CLDFB80_16_SCALE; + hs->ds = 20; + hs->da = 20; + hs->rot_vec_ana_delay_re = NULL; + hs->rot_vec_ana_delay_im = NULL; + hs->rot_vec_syn_delay_re = NULL; + hs->rot_vec_syn_delay_im = NULL; +#ifdef IVAS_FLOAT_FIXED + hs->p_filter_sf = (Word16) 17051; + hs->p_filter = cldfb_protoFilter_2_5ms[1]; + hs->scale = cldfb_scale_2_5ms[1]; +#endif + } + else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + hs->p_filter_flt = LDQMF_16; + hs->scale_flt = LDQMF_16_SCALE; + hs->ds = 80; + hs->da = -40; + hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; + hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; +#ifdef IVAS_FLOAT_FIXED + hs->p_filter_sf = (Word16) 15388; + hs->p_filter = cldfb_protoFilter_5_0ms[1]; + hs->scale = cldfb_scale_5_0ms[1]; +#endif + } + break; + + case 20: + hs->rot_vec_ana_re = rot_vec_ana_re_L20; + hs->rot_vec_ana_im = rot_vec_ana_im_L20; + hs->rot_vec_syn_re = rot_vec_syn_re_L20; + hs->rot_vec_syn_im = rot_vec_syn_im_L20; +#ifdef IVAS_FLOAT_FIXED + hs->rRotVctr = rRotVectr_20; + hs->iRotVctr = iRotVectr_20; + hs->rot_vec_ana_re_fx = rot_vec_ana_re_L20_fx; + hs->rot_vec_ana_im_fx = rot_vec_ana_im_L20_fx; + hs->rot_vec_syn_re_fx = rot_vec_syn_re_L20_fx; + hs->rot_vec_syn_im_fx = rot_vec_syn_im_L20_fx; + IF( hs->type == CLDFB_SYNTHESIS ) + { + hs->synScalefactor = add( cldfb_synScale[2], hs->filterScale ); + move16(); + } + ELSE + { + hs->anaScalefactor = add( cldfb_anaScale[2], hs->filterScale ); + move16(); + } +#endif + if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) + { + hs->p_filter_flt = CLDFB80_20_flt; + hs->scale_flt = CLDFB80_20_SCALE; + hs->ds = 20; + hs->da = 20; + hs->rot_vec_ana_delay_re = NULL; + hs->rot_vec_ana_delay_im = NULL; + hs->rot_vec_syn_delay_re = NULL; + hs->rot_vec_syn_delay_im = NULL; +#ifdef IVAS_FLOAT_FIXED + hs->p_filter_sf = (Word16) 17050; + hs->p_filter = cldfb_protoFilter_2_5ms[2]; + hs->scale = cldfb_scale_2_5ms[2]; +#endif + } + else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + hs->p_filter_flt = LDQMF_20; + hs->scale_flt = LDQMF_20_SCALE; + hs->ds = 80; + hs->da = -40; + hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; + hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; +#ifdef IVAS_FLOAT_FIXED + hs->p_filter_sf = (Word16) 15390; + hs->p_filter = cldfb_protoFilter_5_0ms[2]; + hs->scale = cldfb_scale_5_0ms[2]; +#endif + } + break; + + case 30: + hs->rot_vec_ana_re = rot_vec_ana_re_L30; + hs->rot_vec_ana_im = rot_vec_ana_im_L30; + hs->rot_vec_syn_re = rot_vec_syn_re_L30; + hs->rot_vec_syn_im = rot_vec_syn_im_L30; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_re_fx = rot_vec_ana_re_L30_fx; + hs->rot_vec_ana_im_fx = rot_vec_ana_im_L30_fx; + hs->rot_vec_syn_re_fx = rot_vec_syn_re_L30_fx; + hs->rot_vec_syn_im_fx = rot_vec_syn_im_L30_fx; + hs->rRotVctr = rRotVectr_30; + hs->iRotVctr = iRotVectr_30; + IF( hs->type == CLDFB_SYNTHESIS ) + { + hs->synScalefactor = add( cldfb_synScale[6], hs->filterScale ); + move16(); + } + ELSE + { + hs->anaScalefactor = add( cldfb_anaScale[6], hs->filterScale ); + move16(); + } +#endif + if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) + { + hs->p_filter_flt = CLDFB80_30_flt; + hs->scale_flt = CLDFB80_30_SCALE; + hs->ds = 30; + hs->da = 30; + hs->rot_vec_ana_delay_re = NULL; + hs->rot_vec_ana_delay_im = NULL; + hs->rot_vec_syn_delay_re = NULL; + hs->rot_vec_syn_delay_im = NULL; +#ifdef IVAS_FLOAT_FIXED + hs->p_filter_sf = (Word16) 17051; + hs->scale = cldfb_scale_2_5ms[6]; + hs->p_filter = cldfb_protoFilter_2_5ms[6]; +#endif + } + else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + hs->p_filter_flt = LDQMF_30; + hs->scale_flt = LDQMF_30_SCALE; + hs->ds = 120; + hs->da = -60; + hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; + hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; +#ifdef IVAS_FLOAT_FIXED + hs->p_filter_sf = (Word16) 15388; + hs->scale = cldfb_scale_5_0ms[6]; + hs->p_filter = cldfb_protoFilter_5_0ms[6]; +#endif + } + break; + + case 32: + hs->rot_vec_ana_re = rot_vec_ana_re_L32; + hs->rot_vec_ana_im = rot_vec_ana_im_L32; + hs->rot_vec_syn_re = rot_vec_syn_re_L32; + hs->rot_vec_syn_im = rot_vec_syn_im_L32; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_re_fx = rot_vec_ana_re_L32_fx; + hs->rot_vec_ana_im_fx = rot_vec_ana_im_L32_fx; + hs->rot_vec_syn_re_fx = rot_vec_syn_re_L32_fx; + hs->rot_vec_syn_im_fx = rot_vec_syn_im_L32_fx; + hs->rRotVctr = rRotVectr_32; + hs->iRotVctr = iRotVectr_32; + { + hs->anaScalefactor = add( cldfb_anaScale[3], hs->filterScale ); + move16(); + } +#endif + if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) + { + hs->p_filter_flt = CLDFB80_32_flt; + hs->scale_flt = CLDFB80_32_SCALE; + hs->ds = 32; + hs->da = 32; + hs->rot_vec_ana_delay_re = NULL; + hs->rot_vec_ana_delay_im = NULL; + hs->rot_vec_syn_delay_re = NULL; + hs->rot_vec_syn_delay_im = NULL; +#ifdef IVAS_FLOAT_FIXED + hs->p_filter_sf = (Word16) 17050; + hs->p_filter = cldfb_protoFilter_2_5ms[3]; + hs->scale = cldfb_scale_2_5ms[3]; +#endif + } + else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + hs->p_filter_flt = LDQMF_32; + hs->scale_flt = LDQMF_32_SCALE; + hs->ds = 160; + hs->da = -80; + hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; + hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; +#ifdef IVAS_FLOAT_FIXED + hs->p_filter_sf = (Word16) 15392; + hs->scale = cldfb_scale_5_0ms[3]; + hs->p_filter = cldfb_protoFilter_5_0ms[3]; +#endif + } + break; + + case 40: + hs->rot_vec_ana_re = rot_vec_ana_re_L40; + hs->rot_vec_ana_im = rot_vec_ana_im_L40; + hs->rot_vec_syn_re = rot_vec_syn_re_L40; + hs->rot_vec_syn_im = rot_vec_syn_im_L40; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_re_fx = rot_vec_ana_re_L40_fx; + hs->rot_vec_ana_im_fx = rot_vec_ana_im_L40_fx; + hs->rot_vec_syn_re_fx = rot_vec_syn_re_L40_fx; + hs->rot_vec_syn_im_fx = rot_vec_syn_im_L40_fx; + hs->rRotVctr = rRotVectr_40; + hs->iRotVctr = iRotVectr_40; + IF( hs->type == CLDFB_SYNTHESIS ) + { + hs->synScalefactor = add( cldfb_synScale[4], hs->filterScale ); + move16(); + } + ELSE + { + hs->anaScalefactor = add( cldfb_anaScale[4], hs->filterScale ); + move16(); + } +#endif + if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) + { + hs->p_filter_flt = CLDFB80_40_flt; + hs->scale_flt = CLDFB80_40_SCALE; + hs->ds = 40; + hs->da = 40; + hs->rot_vec_ana_delay_re = NULL; + hs->rot_vec_ana_delay_im = NULL; + hs->rot_vec_syn_delay_re = NULL; + hs->rot_vec_syn_delay_im = NULL; +#ifdef IVAS_FLOAT_FIXED + hs->p_filter_sf = (Word16) 17051; + hs->q_scale = norm_s( (Word16) CLDFB80_40_SCALE ); + hs->scale = cldfb_scale_2_5ms[4]; + hs->p_filter = cldfb_protoFilter_2_5ms[4]; +#endif + } + else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + hs->p_filter_flt = LDQMF_40; + hs->scale_flt = LDQMF_40_SCALE; + hs->ds = 160; + hs->da = -80; + hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; + hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx; + hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; + hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; + hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; + hs->p_filter_sf = (Word16) 15391; + hs->p_filter = cldfb_protoFilter_5_0ms[4]; + hs->scale = cldfb_scale_5_0ms[4]; +#endif + } + break; + + case 60: + hs->rot_vec_ana_re = rot_vec_ana_re_L60; + hs->rot_vec_ana_im = rot_vec_ana_im_L60; + hs->rot_vec_syn_re = rot_vec_syn_re_L60; + hs->rot_vec_syn_im = rot_vec_syn_im_L60; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_re_fx = rot_vec_ana_re_L60_fx; + hs->rot_vec_ana_im_fx = rot_vec_ana_im_L60_fx; + hs->rot_vec_syn_re_fx = rot_vec_syn_re_L60_fx; + hs->rot_vec_syn_im_fx = rot_vec_syn_im_L60_fx; + hs->rRotVctr = rRotVectr_60; + hs->iRotVctr = iRotVectr_60; + IF( hs->type == CLDFB_SYNTHESIS ) + { + hs->synScalefactor = add( cldfb_synScale[5], hs->filterScale ); + move16(); + } + ELSE + { + hs->anaScalefactor = add( cldfb_anaScale[5], hs->filterScale ); + move16(); + } +#endif + if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) + { + hs->p_filter_flt = CLDFB80_60_flt; + hs->scale_flt = CLDFB80_60_SCALE; + hs->ds = 60; + hs->da = 60; + hs->rot_vec_ana_delay_re = NULL; + hs->rot_vec_ana_delay_im = NULL; + hs->rot_vec_syn_delay_re = NULL; + hs->rot_vec_syn_delay_im = NULL; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = NULL; + hs->rot_vec_ana_delay_im_fx = NULL; + hs->rot_vec_syn_delay_re_fx = NULL; + hs->rot_vec_syn_delay_im_fx = NULL; + hs->p_filter_sf = (Word16) 17051; + hs->p_filter = cldfb_protoFilter_2_5ms[5]; + hs->scale = cldfb_scale_2_5ms[5]; +#endif + } + else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + hs->p_filter_flt = LDQMF_60; + hs->scale_flt = LDQMF_60_SCALE; + hs->ds = 240; + hs->da = -120; + hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; + hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; + hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx; + hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; + hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; + hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; + hs->p_filter_sf = (Word16) 15391; + hs->p_filter = cldfb_protoFilter_5_0ms[5]; + hs->scale = cldfb_scale_5_0ms[5]; +#endif + } + break; + } + + return; +} /*-------------------------------------------------------------------* * cldfb_save_memory_ivas() * diff --git a/lib_com/cldfb_evs.c b/lib_com/cldfb_evs.c index 59c8df221..9fa073106 100644 --- a/lib_com/cldfb_evs.c +++ b/lib_com/cldfb_evs.c @@ -1286,7 +1286,7 @@ void GetEnergyCldfb( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) } } - IF( GE_16( numberBands, freqTable[1] ) ) + IF( GE_16( numberBands, freqTable[1] ) && hTecEnc != NULL) { Word32 *tempEnergyValuesArry[CLDFB_NO_COL_MAX]; Word16 ScaleX2; diff --git a/lib_com/cng_exc_fx.c b/lib_com/cng_exc_fx.c index e8e69432f..c43d08014 100644 --- a/lib_com/cng_exc_fx.c +++ b/lib_com/cng_exc_fx.c @@ -307,9 +307,10 @@ IF( NE_16( Opt_AMR_WB, 1 ) ) /* calculate the spectrum of random excitation signal */ Copy( exc2, fft_io, L_frame ); + Word16 Q_new_inp, mem_decim_size; // TO be removed IF( EQ_16( L_frame, L_FRAME16k ) ) { - modify_Fs_fx( fft_io, L_FRAME16k, 16000, fft_io, 12800, exc_mem1, 0 ); + modify_Fs_fx( fft_io, L_FRAME16k, 16000, fft_io, 12800, exc_mem1, 0, &Q_new_inp, &mem_decim_size ); } /* fft_rel(fft_io, L_FFT, LOG2_L_FFT); */ @@ -443,7 +444,7 @@ IF( NE_16( Opt_AMR_WB, 1 ) ) IF( EQ_16( L_frame, L_FRAME16k ) ) { - modify_Fs_fx( fft_io, L_FFT, 12800, fft_io, 16000, exc_mem, 0 ); + modify_Fs_fx( fft_io, L_FFT, 12800, fft_io, 16000, exc_mem, 0, &Q_new_inp, &mem_decim_size ); } /* enr1 = dotp( fft_io, fft_io, L_frame ) / L_frame; */ diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 55eafef53..e5dfef089 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -2881,6 +2881,7 @@ typedef enum SIGNAL_CLASSIFER_MODE #define SCALE_GAIN_ANA_16 ( 3 ) #define SCALE_GAIN_ANA_20 ( 3 ) #define SCALE_GAIN_ANA_32 ( 2 ) +#define SCALE_GAIN_ANA_30 ( 2 ) #define SCALE_GAIN_ANA_40 ( 2 ) #define SCALE_GAIN_ANA_60 ( 1 ) @@ -2892,6 +2893,7 @@ typedef enum SIGNAL_CLASSIFER_MODE #define SCALE_CLDFB_ANA_32 ( SCALE_MODULATION + SCALE_GAIN_ANA_32 ) #define SCALE_CLDFB_ANA_40 ( SCALE_MODULATION + SCALE_GAIN_ANA_40 ) #define SCALE_CLDFB_ANA_60 ( SCALE_MODULATION + SCALE_GAIN_ANA_60 ) +#define SCALE_CLDFB_ANA_30 ( SCALE_MODULATION + SCALE_GAIN_ANA_30 ) #define SCALE_CLDFB_SYN_10 ( SCALE_MODULATION + SCALE_GAIN_SYN ) #define SCALE_CLDFB_SYN_16 ( SCALE_MODULATION + SCALE_GAIN_SYN ) @@ -2899,6 +2901,7 @@ typedef enum SIGNAL_CLASSIFER_MODE #define SCALE_CLDFB_SYN_32 ( SCALE_MODULATION + SCALE_GAIN_SYN ) #define SCALE_CLDFB_SYN_40 ( SCALE_MODULATION + SCALE_GAIN_SYN ) #define SCALE_CLDFB_SYN_60 ( SCALE_MODULATION + SCALE_GAIN_SYN ) +#define SCALE_CLDFB_SYN_30 ( SCALE_MODULATION + SCALE_GAIN_SYN ) /************************************************************************/ /* FFT */ diff --git a/lib_com/ivas_mdct_imdct_fx.c b/lib_com/ivas_mdct_imdct_fx.c index 730a2fe7e..486f3a8db 100644 --- a/lib_com/ivas_mdct_imdct_fx.c +++ b/lib_com/ivas_mdct_imdct_fx.c @@ -355,7 +355,7 @@ void ivas_imdct_fx( * * Sets/Maps the fft twiddle tables based on fft length *-----------------------------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED void ivas_get_twid_factors_fx1( const Word16 length, const Word16 **pTwid_re, @@ -388,7 +388,7 @@ void ivas_get_twid_factors_fx1( return; } - +#endif /*-----------------------------------------------------------------------------------------* * Function ivas_get_mdct_scaling_gain_fx() diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 06a1d8d1e..ffb1b6014 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -162,8 +162,8 @@ ivas_error ivas_sce_enc( ivas_error ivas_cpe_enc( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ const int16_t cpe_id, /* i : CPE # identifier */ - const float data_f_ch0[], /* i : input signal for channel 0 */ - const float data_f_ch1[], /* i : input signal for channel 1 */ + float data_f_ch0[], /* i : input signal for channel 0 */ + float data_f_ch1[], /* i : input signal for channel 1 */ const int16_t input_frame, /* i : input frame length per channel */ const int16_t nb_bits_metadata /* i : number of metadata bits */ ); @@ -221,6 +221,51 @@ ivas_error pre_proc_front_ivas( const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); +ivas_error pre_proc_front_ivas_fx( + SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const int32_t element_brate, /* i : SCE/CPE element bitrate */ + const int16_t nb_bits_metadata, /* i : number of metadata bits */ + const int16_t input_frame, /* i : frame length */ + const int16_t n, /* i : channel number */ + float old_inp_12k8[], /* o : buffer of old input signal */ + float old_inp_16k[], /* o : buffer of old input signal @16kHz */ + float *ener, /* o : residual energy from Levinson-Durbin */ + float *relE, /* o : frame relative energy */ + float A[NB_SUBFR16k * ( M + 1 )], /* o : A(z) unquantized for the 4 subframes */ + float Aw[NB_SUBFR16k * ( M + 1 )], /* o : weighted A(z) unquantized for subframes */ + float epsP[M + 1], /* o : LP prediction errors */ + float lsp_new[M], /* o : LSPs at the end of the frame */ + float lsp_mid[M], /* o : LSPs in the middle of the frame */ + int16_t *vad_hover_flag, /* o : VAD hangover flag */ + int16_t *attack_flag, /* o : flag signaling attack */ + float realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer */ + float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer */ + float old_wsp[], /* o : weighted input signal buffer */ + float pitch_fr[NB_SUBFR], /* o : fractional pitch values */ + float voicing_fr[NB_SUBFR], /* o : fractional pitch gains */ + int16_t *loc_harm, /* o : harmonicity flag */ + float *cor_map_sum, /* o : speech/music clasif. parameter */ + int16_t *vad_flag_dtx, /* o : HE-SAD flag with additional DTX HO */ + float enerBuffer[CLDFB_NO_CHANNELS_MAX], /* o : energy buffer */ + float fft_buff[2 * L_FFT], /* o : FFT buffer */ + const float tdm_A_PCh[M + 1], /* i : unq. LP coeff. of primary channel */ + const float tdm_lsp_new_PCh[M], /* i : unq. LSPs of primary channel */ + const float currFlatness, /* i : flatness parameter */ + const int16_t tdm_ratio_idx, /* i : Current Ratio_L index */ + float fr_bands_LR[][2 * NB_BANDS], /* i : energy in frequency bands */ + const float Etot_LR[], /* i : total energy Left & Right channel */ + float lf_E_LR[][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels */ + const int16_t localVAD_HE_SAD_LR[], /* i : HE-SAD flag without hangover, LR channels */ + float band_energies_LR[2 * NB_BANDS], /* o : energy in critical bands without minimum noise floor E_MIN */ + const int16_t flag_16k_smc, /* i : flag to indicate if the OL SMC is run at 16 kHz */ + const int16_t front_vad_flag, /* i : front-VAD flag to overwrite VAD decision */ + const int16_t force_front_vad, /* i : flag to force VAD decision */ + const int16_t front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision*/ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); ivas_error pre_proc_ivas( Encoder_State *st, /* i/o: encoder state structure */ const int16_t last_element_mode, /* i : last element mode */ @@ -2575,7 +2620,6 @@ void tdm_low_rate_dec( float *bwe_exc, /* o : excitation for SWB TBE */ const float *lsf_new /* i : ISFs at the end of the frame */ ); - #ifdef IVAS_FLOAT_FIXED void tdm_SCh_LSF_intra_pred_fx( const Word32 element_brate, /* i : element bitrate */ @@ -2583,7 +2627,6 @@ void tdm_SCh_LSF_intra_pred_fx( Word16 *pred_lsf_SCh_fx /* o : predicted secondary channel LSFs */ ); #endif - void tdm_SCh_LSF_intra_pred( const int32_t element_brate, /* i : element bitrate */ const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */ diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 7a8054ca1..12a8e69c8 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -2417,4 +2417,10 @@ void copy_masa_descriptive_meta_fx( void efap_free_data_fx( EFAP_HANDLE *hEFAPdata /* i/o: EFAP handle to be freed */ ); + +void tdm_SCh_LSF_intra_pred_fx( + const Word32 element_brate, /* i : element bitrate */ + const Word16 *tdm_lsfQ_PCh_fx, /* i : primary channel LSFs */ + Word16 *pred_lsf_SCh_fx /* o : predicted secondary channel LSFs */ +); #endif diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index cc37a8565..ace600eab 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -6835,6 +6835,4 @@ const ACPL_QUANT_TABLE ivas_mc_paramupmix_beta_quant_table[9] = 0, /* offset */ { +0.000000e+000f, +5.937500e-002f, +1.375000e-001f, +2.343750e-001f, +3.500000e-001f, +4.843750e-001f, +6.375000e-001f, +8.093750e-001f, +1.000000e+000f } /* data */ } -}; - -/* clang-format on */ +}; \ No newline at end of file diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index 85bd01c21..a89745452 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -106,6 +106,23 @@ extern const float tdm_den_ratio_tabl[]; extern const int16_t tdm_bit_allc_tbl[5][6]; /* LSFs Intra-frame prediction tables */ +#ifdef IVAS_FLOAT_FIXED +extern const Word16 tdm_LSF_MEAN_RE_USE_OUT_fx[M]; +extern const Word16 tdm_LSF_MEAN_RE_USE_IN_fx[M]; +extern const Word16 tdm_LSF_MEAN_RE_USE_fx[M]; + +extern const Word16 tdm_Beta_Q1bit_re_use_13k2_fx[2]; +extern const Word16 tdm_Beta_Q1bit_re_use_16k4_fx[2]; +extern const Word16 tdm_Beta_Q1bit_re_use_24k4_32k_fx[2]; +extern const Word16 tdm_Beta_Q1bit_re_use_48k_fx[2]; + +extern const Word16 tdm_RE_USE_adaptive_beta_prd_diag_3_fx[15 + 16 + 15]; + +extern const Word16 tdm_LSF_MEAN_PRED_QNT_OUT_fx[M]; +extern const Word16 tdm_LSF_MEAN_PRED_QNT_IN_fx[M]; +extern const Word16 tdm_LSF_MEAN_PRED_QNT_fx[M]; +extern const Word16 tdm_PRED_QNT_fixed_beta_prd_diag_3_fx[15 + 16 + 15]; +#endif extern const float tdm_LSF_MEAN_RE_USE_OUT[M]; extern const float tdm_LSF_MEAN_RE_USE_IN[M]; extern const float tdm_LSF_MEAN_RE_USE[M]; diff --git a/lib_com/modif_fs_fx.c b/lib_com/modif_fs_fx.c index fa12252ad..1845bcde2 100644 --- a/lib_com/modif_fs_fx.c +++ b/lib_com/modif_fs_fx.c @@ -47,7 +47,9 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ Word16 sigOut_fx[], /* o : decimated signal Q0 */ const Word32 fout, /* i : frequency of output Q0 */ Word16 mem_fx[], /* i/o: filter memory Q0 */ - const Word16 nblp /* i : flag indicating if NB low-pass is applied */ + const Word16 nblp, /* i : flag indicating if NB low-pass is applied */ + Word16 *Q_new_inp, // TO be removed + Word16 *mem_decim_size // TO be removed ) { Word16 i; @@ -79,13 +81,14 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ /*-------------------------------------------------------------------* * Find the resampling configuration *-------------------------------------------------------------------*/ - + *Q_new_inp = 0; /* check if fin and fout are the same */ IF( EQ_32( fin, fout ) ) { /* just copy the signal_fx and quit */ Copy( sigIn_fx, sigOut_fx, lg ); - + *mem_decim_size = 0; + *Q_new_inp = 0; return lg; } ELSE @@ -150,6 +153,7 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ } mem_len = shl( filt_len, 1 ); + *mem_decim_size = mem_len; signal_fx = signal_tab_fx + 2 * L_FILT_MAX + sub( L_FRAME48k, add( mem_len, lg ) ); signal_ana_fx = signal_fx; mem_len_ana = mem_len; @@ -254,6 +258,7 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ } /* rescaling */ test(); + IF( ( GT_16( fac_num, fac_den ) ) == ( ( cfg_ptr_fx->flags_fx & RS_INV_FAC ) != 0 ) ) { IF( LT_16( fac_num, fac_den ) ) @@ -266,6 +271,7 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ FOR( i = 0; i < lg_out; i++ ) { sigOut_fx[i] = round_fx( L_shl( L_mult( sigOut_fx[i], num_den ), 1 ) ); /*Q0*/ + *Q_new_inp = -1; } } ELSE @@ -277,6 +283,7 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ { #ifdef BASOP_NOGLOB num_den = shl_o( num_den, 1, &Overflow ); + //*Q_new_inp = 2; #else num_den = shl( num_den, 1 ); #endif @@ -286,6 +293,7 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ sigOut_fx[i] = mult_r( sigOut_fx[i], num_den ); /*Q0*/ move16(); } + *Q_new_inp = -1; } } ELSE @@ -298,6 +306,7 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ { sigOut_fx[i] = mult_r( sigOut_fx[i], num_den ); /*Q-1*/ move16(); + *Q_new_inp = -2; } } ELSE @@ -306,6 +315,7 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ FOR( i = 0; i < lg_out; i++ ) { sigOut_fx[i] = round_fx( L_mac( L_deposit_h( sigOut_fx[i] ), sigOut_fx[i], num_den ) ); /*Q0*/ + *Q_new_inp = -1; } } } @@ -316,6 +326,7 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ { sigOut_fx[i] = mult_r( sigOut_fx[i], 16384 ); move16(); /*Q-1*/ + *Q_new_inp = -2; } } /* update the filter memory */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 03ce573b9..7bfe52d3e 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -9347,6 +9347,11 @@ void configureCldfb_ivas( const int32_t sampling_rate /* i : sampling rate */ ); +void configureCldfb_ivas_enc( + HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: filter bank handle */ + const int32_t sampling_rate /* i : sampling rate */ +); + void analysisCldfbEncoder_ivas( Encoder_State *st, /* i/o: encoder state structure */ const float *timeIn, @@ -9355,6 +9360,17 @@ void analysisCldfbEncoder_ivas( float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float *ppBuf_Ener ); +void analysisCldfbEncoder_ivas_fx( + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 *timeIn, + Word32 realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word16 realBuffer16[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word16 imagBuffer16[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + Word32 *ppBuf_Ener, + Word16 *enerBuffSum_exp, + CLDFB_SCALE_FACTOR *scale ); + ivas_error openCldfb_ivas( HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ CLDFB_TYPE type, /* i : analysis or synthesis */ @@ -9362,6 +9378,13 @@ ivas_error openCldfb_ivas( CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ ); +ivas_error openCldfb_ivas_enc( + HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ + CLDFB_TYPE type, /* i : analysis or synthesis */ + const int32_t sampling_rate, /* i : sampling rate */ + CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ +); + void resampleCldfb_ivas( HANDLE_CLDFB_FILTER_BANK hs, /* i/o: filter bank handle */ const int32_t newSamplerate /* i : new samplerate to operate */ diff --git a/lib_com/prot_fx2.h b/lib_com/prot_fx2.h index 131a12285..7975ff65f 100644 --- a/lib_com/prot_fx2.h +++ b/lib_com/prot_fx2.h @@ -220,6 +220,14 @@ void deindex_lvq_SHB_fx( const Word16 nbits, const Word16 mode ); +Word16 deindex_lvq_ivas_fx( + Word16 *index, /* i : index to be decoded, as an array of 3 Word16 */ + Word16 *x_lvq, /* o : decoded codevector Q(x2.56) */ + Word16 mode, /* i : LVQ coding mode/MSLVQ structure index (select scales & no_lead ), or idx_cv for CNG case */ + Word16 sf_flag, /* i : safety net flag */ + Word16 no_bits /* i : number of bits for lattice */ +); + void permute_fx( Word16 *pTmp1, /* i/o: vector whose components are to be permuted */ const Word16 *perm /* i : permutation info (indexes that should be interchanged), max two perms */ @@ -881,6 +889,13 @@ Word16 lsf_stab_ivas_fx( /* o : LP filter stability const Word16 L_frame /* i : frame length */ ); +Word16 lsf_stab_ivas_fx( /* o : LP filter stability Q15*/ + const Word16 *lsf, /* i : LSF vector Q(x2.56)*/ + const Word16 *lsfold, /* i : old LSF vector Q(x2.56)*/ + const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const Word16 L_frame /* i : frame length */ +); + void reorder_isf_fx( Word16 *isf, /* i/o: ISFs in the frequency domain (0..0.5) */ const Word16 min_dist, /* i : minimum required distance */ @@ -925,6 +940,17 @@ Word16 vq_dec_lvq_fx( Word16 *p_no_scales, Word16 *p_no_scales_p ); +Word16 vq_dec_lvq_ivas_fx( + Word16 sf_flag, /* i : safety net flag */ + Word16 x[], /* o : Decoded vector Q(x2.56)*/ + Word16 indices[], /* i : Indices */ + Word16 stages, /* i : Number of stages */ + Word16 N, /* i : Vector dimension */ + Word16 mode, /* (i): mode_lvq, or mode_lvq_p */ + Word16 no_bits /* (i): no. bits for lattice */ +); +void a2rc_fx( const Word16 *a, Word16 *refl, Word16 lpcorder ); + Word16 vq_dec_lvq_ivas_fx( Word16 sf_flag, /* i : safety net flag */ Word16 x[], /* o : Decoded vector Q(x2.56)*/ @@ -2263,15 +2289,17 @@ Word32 Interpol_lc_fx( /* o : interpolated value ); -// modif_fs_fx.c -Word16 modify_Fs_fx( /* o : length of output Q0 */ - const Word16 sigIn_fx[], /* i : signal to decimate Q0 */ - Word16 lg, /* i : length of input Q0 */ - const Word32 fin, /* i : frequency of input Q0 */ - Word16 sigOut_fx[], /* o : decimated signal Q0 */ - const Word32 fout, /* i : frequency of output Q0 */ - Word16 mem_fx[], /* i/o: filter memory Q0 */ - const Word16 nblp /* i : flag indicating if NB low-pass is applied */ +//modif_fs_fx.c +Word16 modify_Fs_fx( /* o : length of output Q0 */ + const Word16 sigIn_fx[], /* i : signal to decimate Q0 */ + Word16 lg, /* i : length of input Q0 */ + const Word32 fin, /* i : frequency of input Q0 */ + Word16 sigOut_fx[], /* o : decimated signal Q0 */ + const Word32 fout, /* i : frequency of output Q0 */ + Word16 mem_fx[], /* i/o: filter memory Q0 */ + const Word16 nblp, /* i : flag indicating if NB low-pass is applied */ + Word16 *Q_new_inp, //TO be removed + Word16 *mem_decim_size //TO be removed ); Word16 modify_Fs_intcub3m_sup_fx( /* o : length of output */ diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c index 22589b96f..58be1cf3f 100644 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -2627,9 +2627,21 @@ const float interpol_frac2_mid[NB_SUBFR*3] = { 0.0f, 0.25f, 0.75f }; +const Word16 interpol_frac2_mid_fx[NB_SUBFR * 3] = { + 8191, 24575, 0, + 8191, 24575, 0, + 0, 8191, 24575, + 0, 8191, 24575 +}; + const float interpol_frac_12k8[NB_SUBFR] = { 0.25f, 0.5f, 0.75f, 1.0f }; + +const Word16 interpol_frac_12k8_fx[NB_SUBFR] = { + 8191, 16383, 24575, 32767 +}; + const Word16 interpol_frac_fx[NB_SUBFR] = { 8192, 16384, 24576,32767 }; const float interpol_isp_amr_wb[NB_SUBFR] = { @@ -10093,6 +10105,512 @@ const Word16 CLDFB80_60[] = W16(0x0002), W16(0x0020), W16(0xff00), W16(0xe05e), W16(0x00a9) }; +const Word16 CLDFB80_30[] = +{ + 0, -5, -30, 278, 8546, + 0, -4, -33, 306, 9141, + 0, -2, -29, 334, 9735, + 0, -1, -17, 363, 10324, + 0, -1, -13, 397, 10904, + 0, -1, -9, 435, 11474, + 0, -1, -2, 478, 12028, + 0, 0, 6, 525, 12566, + 0, 0, 12, 578, 13083, + 0, 0, 19, 637, 13579, + 0, 0, 26, 701, 14050, + 0, 0, 28, 771, 14493, + 0, 0, 30, 846, 14906, + 0, 0, 28, 927, 15285, + 0, 0, 4, 1012, 15630, + 0, -1, 27, 1105, 15937, + 0, -1, 26, 1201, 16209, + 0, 0, 29, 1299, 16442, + 0, 1, 31, 1399, 16638, + 0, 0, 36, 1498, 16794, + 0, 0, 41, 1594, 16911, + 0, -1, 45, 1687, 16990, + 0, 0, 46, 1774, 17036, + 0, 0, 49, 1853, 17052, + 0, 0, 50, 1922, 17040, + 0, 0, 50, 1981, 16999, + 0, 0, 45, 2027, 16924, + 0, -1, 39, 2061, 16809, + 0, -4, 27, 2080, 16651, + 0, -10, 12, 2084, 16463, + 0, -17, -10, 2075, 16161, + 0, -16, -23, 2054, 15746, + 0, -10, -31, 2012, 15307, + 0, -4, -32, 1949, 14834, + 0, -2, -26, 1862, 14334, + 0, -3, -15, 1752, 13816, + 0, -2, -1, 1616, 13288, + 0, 0, 13, 1454, 12753, + 0, -1, 25, 1267, 12212, + 0, 0, 35, 1054, 11663, + 0, 0, 42, 815, 11104, + 0, 1, 45, 552, 10536, + 0, -2, 42, 263, 9960, + 0, -3, 37, -51, 9379, + 0, 9, 33, -391, 8795, + 0, -12, 25, -755, 8207, + 0, 3, 4, -1144, 7616, + 0, 2, -14, -1557, 7022, + 0, -2, -34, -1992, 6427, + 0, 0, -54, -2449, 5833, + 0, 1, -73, -2927, 5244, + 0, 1, -90, -3425, 4659, + 0, 0, -107, -3942, 4072, + 0, 1, -123, -4476, 3479, + 0, 1, -139, -5026, 2877, + 0, -1, -156, -5590, 2272, + 0, 0, -176, -6167, 1684, + 0, 6, -199, -6754, 1144, + 0, 18, -223, -7348, 682, + 0, 32, -249, -7947, 282 +}; + +const Word16 LDQMF_10_enc_fx[] = +{ + 2, -21, 79, -1890, 8640, + 1, -35, -5, -3186, 7299, + -1, -49, -126, -4597, 5995, + -3, -62, -285, -6085, 4767, + -5, -74, -484, -7607, 3646, + -6, -84, -721, -9114, 2656, + -7, -92, -989, -10557, 1815, + -7, -99, -1279, -11885, 1125, + -8, -104, -1579, -13052, 583, + -10, -108, -1869, -14017, 175, + -15, -112, -2129, -14742, -104, + -21, -117, -2336, -15204, -267, + -27, -123, -2462, -15389, -354, + -31, -132, -2482, -15293, -380, + -33, -144, -2370, -14926, -359, + -32, -156, -2104, -14306, -304, + -27, -166, -1668, -13461, -230, + -18, -169, -1049, -12429, -152, + -7, -160, -246, -11250, -82, + 6, -132, 739, -9972, -31 +}; + +const Word16 LDQMF_16_enc_fx[] = +{ + 2, -18, 91, -1662, 8892, + 2, -27, 46, -2441, 8051, + 1, -36, -12, -3271, 7216, + 0, -45, -84, -4146, 6396, + -2, -53, -171, -5056, 5602, + -3, -61, -274, -5991, 4841, + -5, -69, -392, -6940, 4121, + -6, -76, -526, -7892, 3449, + -6, -82, -674, -8835, 2831, + -7, -88, -835, -9756, 2270, + -7, -93, -1007, -10643, 1767, + -7, -97, -1187, -11485, 1324, + -7, -101, -1373, -12269, 941, + -8, -104, -1560, -12985, 613, + -9, -106, -1744, -13622, 338, + -11, -109, -1921, -14172, 111, + -14, -111, -2084, -14626, -64, + -17, -114, -2228, -14977, -185, + -21, -117, -2346, -15223, -274, + -25, -121, -2433, -15361, -334, + -28, -126, -2481, -15389, -368, + -31, -132, -2484, -15307, -380, + -33, -139, -2436, -15119, -373, + -33, -146, -2332, -14828, -350, + -32, -154, -2167, -14440, -316, + -30, -161, -1935, -13962, -273, + -26, -166, -1635, -13402, -225, + -21, -169, -1263, -12769, -176, + -15, -168, -818, -12074, -128, + -8, -161, -301, -11328, -86, + 0, -147, 286, -10541, -50, + 9, -124, 942, -9725, -23 +}; + +const Word16 LDQMF_20_enc_fx[] = +{ + 2, -17, 95, -1588, 8976, + 2, -24, 61, -2202, 8303, + 1, -32, 19, -2850, 7632, + 1, -39, -32, -3530, 6968, + 0, -46, -92, -4236, 6316, + -2, -53, -162, -4964, 5680, + -3, -59, -241, -5708, 5065, + -4, -65, -331, -6464, 4475, + -5, -71, -431, -7226, 3914, + -6, -76, -540, -7987, 3385, + -6, -81, -658, -8741, 2890, + -7, -86, -785, -9482, 2432, + -7, -90, -919, -10205, 2011, + -7, -94, -1060, -10901, 1628, + -7, -97, -1205, -11566, 1283, + -7, -100, -1354, -12194, 976, + -7, -103, -1504, -12778, 706, + -8, -105, -1653, -13314, 470, + -9, -107, -1798, -13797, 266, + -11, -109, -1938, -14222, 90, + -14, -111, -2068, -14585, -49, + -16, -113, -2187, -14883, -153, + -19, -115, -2290, -15114, -234, + -22, -118, -2376, -15276, -295, + -25, -121, -2439, -15369, -338, + -28, -125, -2478, -15391, -365, + -30, -130, -2488, -15343, -378, + -32, -135, -2467, -15226, -378, + -33, -141, -2411, -15042, -368, + -33, -147, -2319, -14794, -347, + -32, -153, -2186, -14483, -320, + -31, -159, -2012, -14114, -286, + -28, -164, -1794, -13691, -249, + -25, -167, -1531, -13219, -210, + -21, -169, -1221, -12702, -171, + -16, -168, -866, -12146, -133, + -10, -164, -464, -11556, -98, + -4, -155, -16, -10938, -67, + 3, -141, 476, -10298, -41, + 9, -121, 1012, -9642, -21, +}; +const Word16 LDQMF_30_enc_fx[] = +{ + 2, -16, 100, -1489, 9088, + 2, -21, 79, -1890, 8640, + 2, -26, 55, -2307, 8191, + 2, -30, 27, -2740, 7744, + 1, -35, -5, -3186, 7299, + 0, -40, -41, -3646, 6858, + 0, -45, -81, -4116, 6423, + -1, -49, -126, -4597, 5995, + -2, -54, -174, -5087, 5576, + -3, -58, -227, -5583, 5166, + -3, -62, -285, -6085, 4767, + -4, -66, -347, -6591, 4380, + -5, -70, -413, -7099, 4006, + -5, -74, -484, -7607, 3646, + -6, -77, -559, -8113, 3300, + -6, -81, -638, -8616, 2970, + -6, -84, -721, -9114, 2656, + -7, -87, -807, -9604, 2359, + -7, -89, -896, -10086, 2078, + -7, -92, -989, -10557, 1815, + -7, -94, -1084, -11015, 1568, + -7, -97, -1181, -11458, 1338, + -7, -99, -1279, -11885, 1125, + -7, -101, -1379, -12294, 929, + -7, -102, -1479, -12684, 748, + -8, -104, -1579, -13052, 583, + -8, -105, -1677, -13398, 433, + -9, -107, -1774, -13720, 297, + -10, -108, -1869, -14017, 175, + -11, -109, -1960, -14287, 63, + -13, -110, -2047, -14529, -30, + -15, -112, -2129, -14742, -104, + -17, -113, -2205, -14926, -168, + -19, -115, -2274, -15080, -222, + -21, -117, -2336, -15204, -267, + -23, -118, -2388, -15296, -303, + -25, -121, -2430, -15358, -332, + -27, -123, -2462, -15389, -354, + -28, -126, -2482, -15388, -369, + -30, -129, -2489, -15356, -377, + -31, -132, -2482, -15293, -380, + -32, -136, -2460, -15200, -377, + -33, -140, -2423, -15078, -370, + -33, -144, -2370, -14926, -359, + -33, -148, -2299, -14746, -343, + -33, -152, -2211, -14539, -325, + -32, -156, -2104, -14306, -304, + -31, -160, -1979, -14047, -281, + -29, -163, -1833, -13765, -256, + -27, -166, -1668, -13461, -230, + -24, -168, -1482, -13136, -204, + -22, -169, -1276, -12791, -177, + -18, -169, -1049, -12429, -152, + -15, -168, -802, -12050, -127, + -11, -165, -534, -11657, -103, + -7, -160, -246, -11250, -82, + -3, -153, 63, -10833, -62, + 1, -144, 391, -10406, -45, + 6, -132, 739, -9972, -31, + 11, -117, 1105, -9532, -17 +}; + +const Word16 LDQMF_32_enc_fx[] = +{ + 2, -16, 101, -1477, 9102, + 2, -20, 81, -1852, 8682, + 2, -25, 59, -2241, 8261, + 2, -29, 33, -2644, 7841, + 1, -34, 4, -3059, 7424, + 1, -38, -28, -3486, 7009, + 0, -43, -64, -3924, 6599, + -1, -47, -104, -4371, 6195, + -1, -51, -148, -4826, 5798, + -2, -55, -195, -5288, 5408, + -3, -59, -247, -5755, 5027, + -4, -63, -302, -6227, 4657, + -4, -67, -361, -6702, 4297, + -5, -71, -424, -7178, 3948, + -5, -74, -491, -7654, 3613, + -6, -77, -561, -8129, 3290, + -6, -80, -635, -8600, 2980, + -6, -83, -713, -9067, 2685, + -7, -86, -793, -9528, 2404, + -7, -89, -877, -9981, 2138, + -7, -91, -963, -10425, 1887, + -7, -94, -1051, -10859, 1651, + -7, -96, -1141, -11280, 1430, + -7, -98, -1233, -11687, 1223, + -7, -100, -1326, -12079, 1031, + -7, -101, -1420, -12455, 854, + -7, -103, -1513, -12813, 690, + -8, -104, -1606, -13152, 540, + -9, -106, -1699, -13471, 402, + -9, -107, -1789, -13768, 277, + -10, -108, -1878, -14043, 164, + -12, -109, -1963, -14295, 60, + -13, -110, -2045, -14522, -27, + -15, -112, -2122, -14724, -97, + -17, -113, -2194, -14899, -158, + -18, -114, -2260, -15049, -211, + -20, -116, -2319, -15172, -255, + -22, -118, -2371, -15268, -292, + -24, -120, -2414, -15337, -321, + -26, -122, -2449, -15378, -344, + -27, -124, -2473, -15392, -361, + -29, -127, -2486, -15379, -373, + -30, -130, -2488, -15338, -379, + -31, -133, -2477, -15270, -380, + -32, -137, -2453, -15176, -376, + -33, -140, -2416, -15056, -369, + -33, -144, -2364, -14910, -357, + -33, -148, -2297, -14740, -343, + -33, -152, -2214, -14546, -325, + -32, -156, -2115, -14329, -306, + -31, -159, -1999, -14089, -284, + -29, -162, -1867, -13829, -261, + -27, -165, -1716, -13549, -237, + -25, -167, -1548, -13250, -213, + -23, -169, -1362, -12933, -188, + -20, -169, -1158, -12601, -164, + -17, -169, -936, -12253, -140, + -13, -167, -696, -11892, -117, + -10, -163, -437, -11518, -96, + -6, -158, -161, -11134, -76, + -2, -151, 133, -10741, -58, + 2, -142, 444, -10339, -43, + 6, -131, 772, -9931, -29, + 11, -117, 1117, -9518, -17 +}; + +const Word16 LDQMF_40_enc_fx[] = +{ + 2, -15, 102, -1440, 9144, + 2, -19, 87, -1738, 8808, + 2, -22, 70, -2045, 8472, + 2, -26, 51, -2361, 8135, + 2, -30, 30, -2685, 7800, + 1, -33, 7, -3017, 7465, + 1, -37, -18, -3357, 7133, + 0, -41, -46, -3704, 6804, + 0, -44, -76, -4057, 6477, + -1, -48, -108, -4416, 6155, + -1, -51, -143, -4780, 5837, + -2, -54, -181, -5148, 5524, + -3, -57, -220, -5521, 5216, + -3, -61, -263, -5896, 4915, + -4, -64, -308, -6274, 4620, + -4, -67, -355, -6654, 4332, + -5, -69, -405, -7035, 4052, + -5, -72, -457, -7416, 3779, + -6, -75, -512, -7797, 3514, + -6, -78, -569, -8176, 3258, + -6, -80, -628, -8553, 3011, + -6, -83, -689, -8928, 2772, + -6, -85, -753, -9299, 2543, + -7, -87, -818, -9665, 2323, + -7, -89, -885, -10026, 2113, + -7, -91, -954, -10381, 1912, + -7, -93, -1024, -10730, 1720, + -7, -95, -1096, -11071, 1538, + -7, -96, -1169, -11403, 1366, + -7, -98, -1242, -11727, 1203, + -7, -99, -1317, -12041, 1050, + -7, -101, -1391, -12344, 905, + -7, -102, -1466, -12636, 770, + -8, -103, -1541, -12917, 644, + -8, -104, -1616, -13185, 526, + -8, -106, -1690, -13440, 416, + -9, -107, -1762, -13681, 314, + -10, -107, -1834, -13909, 219, + -11, -108, -1904, -14121, 132, + -12, -109, -1971, -14319, 50, + -13, -110, -2037, -14501, -20, + -14, -111, -2099, -14666, -77, + -16, -112, -2158, -14815, -129, + -17, -113, -2214, -14947, -175, + -19, -115, -2266, -15063, -215, + -20, -116, -2314, -15161, -251, + -22, -117, -2356, -15242, -281, + -23, -119, -2394, -15306, -307, + -25, -120, -2426, -15352, -329, + -26, -122, -2451, -15381, -346, + -27, -124, -2471, -15392, -360, + -29, -126, -2483, -15386, -370, + -30, -129, -2488, -15362, -376, + -31, -131, -2486, -15320, -379, + -32, -134, -2475, -15262, -379, + -32, -136, -2456, -15187, -377, + -33, -139, -2429, -15095, -371, + -33, -142, -2392, -14986, -363, + -33, -145, -2345, -14862, -353, + -33, -148, -2289, -14722, -341, + -33, -151, -2223, -14566, -327, + -32, -154, -2147, -14396, -312, + -31, -157, -2059, -14212, -295, + -30, -160, -1961, -14013, -277, + -29, -163, -1852, -13802, -259, + -28, -165, -1732, -13578, -240, + -26, -167, -1601, -13342, -220, + -24, -168, -1458, -13094, -200, + -22, -169, -1303, -12835, -181, + -20, -169, -1137, -12567, -161, + -17, -169, -959, -12288, -142, + -14, -167, -770, -12002, -124, + -12, -165, -569, -11707, -106, + -9, -162, -356, -11404, -90, + -6, -158, -132, -11095, -74, + -2, -152, 103, -10780, -60, + 1, -145, 349, -10460, -47, + 4, -137, 606, -10136, -36, + 8, -127, 874, -9808, -26, + 11, -115, 1152, -9476, -15 +}; + +const Word16 LDQMF_60_enc_fx[] = +{ + 2, -14, 105, -1391, 9200, + 2, -17, 95, -1588, 8976, + 2, -19, 85, -1788, 8752, + 2, -22, 73, -1993, 8528, + 2, -24, 61, -2202, 8303, + 2, -27, 48, -2414, 8079, + 2, -29, 34, -2630, 7855, + 1, -32, 19, -2850, 7632, + 1, -34, 3, -3073, 7410, + 1, -36, -14, -3300, 7188, + 1, -39, -32, -3530, 6968, + 0, -41, -51, -3762, 6749, + 0, -44, -71, -3998, 6531, + 0, -46, -92, -4236, 6316, + -1, -48, -114, -4476, 6102, + -1, -50, -137, -4719, 5890, + -2, -53, -162, -4964, 5680, + -2, -55, -187, -5210, 5472, + -2, -57, -214, -5458, 5267, + -3, -59, -241, -5708, 5065, + -3, -61, -270, -5959, 4865, + -4, -63, -300, -6211, 4669, + -4, -65, -331, -6464, 4475, + -4, -67, -363, -6718, 4285, + -5, -69, -396, -6972, 4098, + -5, -71, -431, -7226, 3914, + -5, -73, -466, -7480, 3734, + -5, -75, -502, -7733, 3558, + -6, -76, -540, -7987, 3385, + -6, -78, -578, -8239, 3216, + -6, -80, -618, -8491, 3051, + -6, -81, -658, -8741, 2890, + -6, -83, -700, -8990, 2733, + -6, -84, -742, -9237, 2581, + -7, -86, -785, -9482, 2432, + -7, -87, -829, -9726, 2287, + -7, -89, -874, -9966, 2147, + -7, -90, -919, -10205, 2011, + -7, -91, -966, -10440, 1879, + -7, -93, -1012, -10672, 1751, + -7, -94, -1060, -10901, 1628, + -7, -95, -1108, -11127, 1509, + -7, -96, -1156, -11349, 1394, + -7, -97, -1205, -11566, 1283, + -7, -98, -1255, -11780, 1177, + -7, -99, -1304, -11989, 1075, + -7, -100, -1354, -12194, 976, + -7, -101, -1404, -12394, 882, + -7, -102, -1454, -12589, 792, + -7, -103, -1504, -12778, 706, + -8, -104, -1554, -12962, 623, + -8, -104, -1603, -13141, 545, + -8, -105, -1653, -13314, 470, + -9, -106, -1702, -13481, 398, + -9, -106, -1750, -13642, 330, + -9, -107, -1798, -13797, 266, + -10, -108, -1845, -13945, 204, + -11, -108, -1892, -14087, 146, + -11, -109, -1938, -14222, 90, + -12, -110, -1982, -14351, 38, + -13, -110, -2026, -14472, -9, + -14, -111, -2068, -14585, -49, + -14, -111, -2109, -14692, -86, + -15, -112, -2149, -14791, -121, + -16, -113, -2187, -14883, -153, + -17, -114, -2223, -14967, -182, + -18, -114, -2258, -15044, -209, + -19, -115, -2290, -15114, -234, + -20, -116, -2321, -15176, -256, + -21, -117, -2350, -15230, -277, + -22, -118, -2376, -15276, -295, + -23, -119, -2399, -15315, -311, + -24, -120, -2421, -15346, -326, + -25, -121, -2439, -15369, -338, + -26, -123, -2455, -15384, -349, + -27, -124, -2468, -15391, -358, + -28, -125, -2478, -15391, -365, + -29, -127, -2485, -15383, -371, + -30, -128, -2488, -15367, -375, + -30, -130, -2488, -15343, -378, + -31, -132, -2485, -15312, -380, + -31, -133, -2478, -15273, -380, + -32, -135, -2467, -15226, -378, + -32, -137, -2452, -15172, -376, + -33, -139, -2434, -15111, -372, + -33, -141, -2411, -15042, -368, + -33, -143, -2385, -14967, -362, + -33, -145, -2354, -14884, -355, + -33, -147, -2319, -14794, -347, + -33, -149, -2279, -14697, -339, + -33, -151, -2235, -14593, -330, + -32, -153, -2186, -14483, -320, + -32, -155, -2133, -14366, -309, + -32, -157, -2075, -14243, -298, + -31, -159, -2012, -14114, -286, + -30, -161, -1944, -13979, -274, + -29, -162, -1871, -13838, -262, + -28, -164, -1794, -13691, -249, + -27, -165, -1711, -13539, -236, + -26, -166, -1623, -13382, -223, + -25, -167, -1531, -13219, -210, + -24, -168, -1433, -13051, -197, + -22, -169, -1330, -12879, -184, + -21, -169, -1221, -12702, -171, + -19, -169, -1108, -12521, -158, + -18, -169, -990, -12335, -145, + -16, -168, -866, -12146, -133, + -14, -167, -737, -11953, -121, + -12, -166, -603, -11756, -109, + -10, -164, -464, -11556, -98, + -8, -161, -320, -11353, -87, + -6, -158, -170, -11147, -77, + -4, -155, -16, -10938, -67, + -2, -151, 143, -10727, -58, + 0, -146, 307, -10514, -49, + 3, -141, 476, -10298, -41, + 5, -135, 650, -10081, -34, + 7, -129, 829, -9862, -27, + 9, -121, 1012, -9642, -21, + 12, -113, 1199, -9421, -13 +}; /*! * \brief CLDFB rRotVectr @@ -10170,6 +10688,29 @@ const Word16 iRotVectr_20[] = W16(0xbec1), W16(0xb5bf), W16(0xae90), W16(0xa963), W16(0xa658) }; +/*! + * \brief CLDFB rRotVectr + * + * cldfb bands: 30 + * global gain: 2.50 + * scale: sqrt(1.0/4.00) + */ +const Word16 rRotVectr_30[] = +{ + 25902, 25725, 25265, 24529, 23525, 22262, 20756, 19022, 17080, 14950, 12657, 10226, 7682, 5054, 2370 +}; + +/*! + * \brief CLDFB iRotVectr + * + * cldfb bands: 30 + * global gain: 2.50 + * scale: sqrt(1.0/4.00) + */ +const Word16 iRotVectr_30[] = +{ + -339, -3045, -5717, -8327, -10845, -13245, -15499, -17584, -19476, -21154, -22601, -23801, -24739, -25406, -25796 +}; /*! * \brief CLDFB rRotVectr * @@ -10266,11 +10807,11 @@ const Word16 iRotVectr_60[] = const Word16 cldfb_anaScale[] = { - SCALE_CLDFB_ANA_10, SCALE_CLDFB_ANA_16, SCALE_CLDFB_ANA_20, SCALE_CLDFB_ANA_32, SCALE_CLDFB_ANA_40, SCALE_CLDFB_ANA_60 + SCALE_CLDFB_ANA_10, SCALE_CLDFB_ANA_16, SCALE_CLDFB_ANA_20, SCALE_CLDFB_ANA_32, SCALE_CLDFB_ANA_40, SCALE_CLDFB_ANA_60, SCALE_CLDFB_ANA_30 }; const Word16 cldfb_synScale[] = { - SCALE_CLDFB_SYN_10, SCALE_CLDFB_SYN_16, SCALE_CLDFB_SYN_20, SCALE_CLDFB_SYN_32, SCALE_CLDFB_SYN_40, SCALE_CLDFB_SYN_60 + SCALE_CLDFB_SYN_10, SCALE_CLDFB_SYN_16, SCALE_CLDFB_SYN_20, SCALE_CLDFB_SYN_32, SCALE_CLDFB_SYN_40, SCALE_CLDFB_SYN_60, SCALE_CLDFB_SYN_30 }; const Word16 cldfb_synGain[] = { @@ -10284,8 +10825,14 @@ const Word16 cldfb_synGain[] = const Word16 *cldfb_protoFilter_2_5ms[] = { - CLDFB80_10, CLDFB80_16, CLDFB80_20, CLDFB80_32, CLDFB80_40, CLDFB80_60 + CLDFB80_10, CLDFB80_16, CLDFB80_20, CLDFB80_32, CLDFB80_40, CLDFB80_60, CLDFB80_30 +}; +#ifdef IVAS_FLOAT_FIXED +const Word16 *cldfb_protoFilter_5_0ms[] = +{ + LDQMF_10_enc_fx, LDQMF_16_enc_fx, LDQMF_20_enc_fx, LDQMF_32_enc_fx, LDQMF_40_enc_fx, LDQMF_60_enc_fx, LDQMF_30_enc_fx }; +#endif const Word16 cldfb_scale_2_5ms[7] = { 22603/*88.293854 Q8*/, /* 10 bands */ @@ -10293,8 +10840,22 @@ const Word16 cldfb_scale_2_5ms[7] = 22605/*88.300926 Q8*/, /* 20 bands */ 22606/*88.303848 Q8*/, /* 32 bands */ 22606/*88.304718 Q8*/, /* 40 bands */ - 22535/*88.028412 Q8*/ /* 60 bands */ + 22535/*88.028412 Q8*/, /* 60 bands */ + 22588/*88.234489 Q8*/ /* 30 bands */ }; + +#ifdef IVAS_FLOAT_FIXED +const Word16 cldfb_scale_5_0ms[7] = +{ + 21649/*88.293854 Q8*/, /* 10 bands */ + 21649/*88.299622 Q8*/, /* 16 bands */ + 21649/*88.300926 Q8*/, /* 20 bands */ + 21649/*88.303848 Q8*/, /* 32 bands */ + 21649/*88.304718 Q8*/, /* 40 bands */ + 22535/*88.028412 Q8*/, /* 60 bands */ + 21581/*88.028412 Q8*/ /* 30 bands */ +}; +#endif const float rot_vec_syn_re_L10[5] = { 0.1117172025f,0.1048929802f,0.0878011021f,0.0621146404f,0.0303479649f, @@ -19813,7 +20374,6 @@ const float SVWB2_SN1[256] = { -91.02f, -115.23f, -227.34f, -448.05f, -339.84f, 30.08f, 56.25f, 130.86f, 105.08f, 196.09f, 249.22f, 280.86f, 240.23f, 146.88f, 85.55f, 67.19f }; -/* An 16-by-16 matrix */ const Word16 SVWB2_SN1_fx[256] = { -257, -385, -673, 926, 1408, 874, 735, 512, 624, 587, 493, 688, 845, 521, 428, 95, -32, -90, 1046, 666, 329, -59, -324, -282, -712, -783, -229, 28, -354, -434, -497, -351, @@ -19896,6 +20456,30 @@ const float SVWB2_AR2[128] = { 0.78f, -1.17f, 28.91f, 67.19f, 26.56f, -1.56f, -13.67f, -9.77f, -60.94f, -85.55f, -168.75f, -112.50f, -71.09f, -14.06f, 44.53f, 44.14f }; +/* SVWB2_AR1 * 2.56f */ +const Word16 SVWB2_AR1_fx[128] = { + -28, -38, -122, 74, 296, 148, 146, 120, 148, 36, -11, -163, -223, -299, -290, -320, + -22, -30, -138, -319, -385, 159, 124, 51, 32, -44, -15, -78, -96, -53, 40, 64, + -96, -144, -205, -96, 80, 96, 152, 246, 206, 193, 265, 333, 320, 232, 131, 32, + 108, 106, 102, 37, -14, -17, -61, -144, -161, -160, -257, -404, -540, -316, -124, 18, + 22, 12, 34, -14, -52, -106, -144, -266, -346, -472, -401, -30, -4, -43, -88, -10, + -52, -117, -203, 415, 324, 171, 121, -31, 48, -31, -60, -65, 128, 193, 141, 67, + -47, -86, 430, 334, 193, 136, 85, 82, 1, -34, 47, 84, 2, -30, -77, -45, + -4, -14, -9, -38, -136, -242, -217, -54, -38, 179, 191, 61, 42, -3, 5, -37 +}; + +/* SVWB2_AR2 * 2.56f */ +const Word16 SVWB2_AR2_fx[128] = { + 12, 16, -46, -156, -329, -293, 43, 141, 61, 15, -9, 29, -74, -41, -37, 16, + -47, -81, -136, 82, -33, -111, -268, -293, 109, 136, 53, -58, -51, 62, 64, 14, + -15, -19, -171, -347, 258, 161, 88, 13, -57, -26, -59, 24, 10, 14, -41, -8, + 33, 38, 139, 157, 31, 65, -14, 52, 63, 30, -8, -1, -182, -341, -344, -258, + 14, 16, 46, 6, -54, -64, -136, -132, -318, -303, 261, 146, -19, -57, -30, 30, + -34, -34, 21, 93, 163, 201, 290, 257, 225, 296, 209, 197, 72, 26, 57, 1, + 33, 66, 73, -8, -104, 44, 31, -13, 70, 72, -17, -48, 430, 373, 218, 92, + 1, -2, 74, 172, 67, -3, -34, -25, -156, -219, -432, -288, -181, -35, 113, 112 +}; + /*----------------------------------------------------------------------------------* * LSF quantization - LSF mode/codebook selection tables *----------------------------------------------------------------------------------*/ @@ -20649,30 +21233,6 @@ const Word16 AUWB2_MA1_fx[512] = -19, 43, 35, 40, 42, 55, 63, 101, 133, 194, 222, 152, 117, 145, 133, 213 }; -/* SVWB2_AR1 * 2.56f */ -const Word16 SVWB2_AR1_fx[128] = { - -28, -38, -122, 74, 296, 148, 146, 120, 148, 36, -11, -163, -223, -299, -290, -320, - -22, -30, -138, -319, -385, 159, 124, 51, 32, -44, -15, -78, -96, -53, 40, 64, - -96, -144, -205, -96, 80, 96, 152, 246, 206, 193, 265, 333, 320, 232, 131, 32, - 108, 106, 102, 37, -14, -17, -61, -144, -161, -160, -257, -404, -540, -316, -124, 18, - 22, 12, 34, -14, -52, -106, -144, -266, -346, -472, -401, -30, -4, -43, -88, -10, - -52, -117, -203, 415, 324, 171, 121, -31, 48, -31, -60, -65, 128, 193, 141, 67, - -47, -86, 430, 334, 193, 136, 85, 82, 1, -34, 47, 84, 2, -30, -77, -45, - -4, -14, -9, -38, -136, -242, -217, -54, -38, 179, 191, 61, 42, -3, 5, -37 -}; - -/* SVWB2_AR2 * 2.56f */ -const Word16 SVWB2_AR2_fx[128] = { - 12, 16, -46, -156, -329, -293, 43, 141, 61, 15, -9, 29, -74, -41, -37, 16, - -47, -81, -136, 82, -33, -111, -268, -293, 109, 136, 53, -58, -51, 62, 64, 14, - -15, -19, -171, -347, 258, 161, 88, 13, -57, -26, -59, 24, 10, 14, -41, -8, - 33, 38, 139, 157, 31, 65, -14, 52, 63, 30, -8, -1, -182, -341, -344, -258, - 14, 16, 46, 6, -54, -64, -136, -132, -318, -303, 261, 146, -19, -57, -30, 30, - -34, -34, 21, 93, 163, 201, 290, 257, 225, 296, 209, 197, 72, 26, 57, 1, - 33, 66, 73, -8, -104, 44, 31, -13, 70, 72, -17, -48, 430, 373, 218, 92, - 1, -2, 74, 172, 67, -3, -34, -25, -156, -219, -432, -288, -181, -35, 113, 112 -}; - const Word16 *const Quantizers_fx[] = { SVNB_SN1_fx, SVNB_SN2_fx, GETRNB_SN1_fx, GETRNB_SN2_fx, AUNB_SN1_fx,SVWB_SN1_fx, SVWB_SN2_fx, GETRWB_SN1_fx, GETRWB_SN2_fx, AUWB_SN1_fx,/* U13, */ TRWB2_SN1_fx, TRWB2_SN2_fx, AUWB2_SN1_fx, CNG_SN1_fx, SVWB2_SN1_fx, SVWB2_SN2_fx @@ -21626,6 +22186,7 @@ const Word16 scales_fx[][6] = {2267, 5315, 0, 2666, 1237, 1802}, /* CNG */ };/* An 6-by-146 matrix in Scale = 2048.00f */ + const Word16 scales_p_fx[][6] = { {2998, 4862, 0, 0, 0, 0, }, @@ -21785,7 +22346,6 @@ const Word16 scales_p_fx[][6] = }; - /* An 16-by-34 matrix in Scale = 20.48f */ const float sigma_MSLVQ[][16] = { @@ -22751,7 +23311,7 @@ const Word16 min_lat_bits_SN_fx[] = { -1, -1, 17, 12, 17, 17, -1, -1, 17, 12, 17 const int16_t min_lat_bits_pred[] = {17, 18, 9, 15, -1, 21, 17, 14, 9, 15, -1, 21, 17, -1, 24, 26, -1, 26, 16}; -const Word16 min_lat_bits_pred_fx[] = { 17, 18, 9, 15, -1, 21, 17, 14, 9, 15, -1, 21, 17, -1, -1, 26, -1, 26, 16 }; +const Word16 min_lat_bits_pred_fx[] = { 17, 18, 9, 15, -1, 21, 17, 14, 9, 15, -1, 21, 17, -1, 24, 26, -1, 26, 16 }; const int16_t offset_lvq_modes_SN[] = {-1,-1,33,64,96, 129,-1,-1,12,43,79,109,-1,-1,137,-1,107,135, 112 @@ -37923,6 +38483,13 @@ const Word32 sigma_BWE_fx[] = { 19499580, 20916386, 22705246, 39204284, 40792208 }; /* for 3 bits first stage */ +const Word16 sigma_BWE16_fx[] = { +260, 255, 268, +267, 294, 315, 598, +622, 289, 288, 297, +298, 319, 346, 598, +622 }; /* for 3 bits first stage */ + const float inv_sigma_BWE[] = { 126.2392994665869f, 128.5766227364854f, 122.2856952550425f, 122.8889356808437f, 111.5502335749417f, 104.0176806054527f, 54.7767591108706f, 52.6444584512409f, /* for 4 bits first stage */ diff --git a/lib_com/rom_com.h b/lib_com/rom_com.h index 0d5c159c5..a4d78c03a 100644 --- a/lib_com/rom_com.h +++ b/lib_com/rom_com.h @@ -236,10 +236,12 @@ extern const Word32 lag_window_16k_32[NUM_LAGW_STRENGTHS][16]; extern const Word32 lag_window_25k6_32[NUM_LAGW_STRENGTHS][16]; extern const Word32 lag_window_32k_32[NUM_LAGW_STRENGTHS][16]; extern const Word32 lag_window_48k_32[16]; -extern const float interpol_frac2[]; /* LPC interpolation coefficients for two-subframe mode */ -extern const Word16 interpol_frac2_fx[]; /* LPC interpolation coefficients for two-subframe mode */ -extern const float interpol_frac2_mid[]; /* LPC interpolation coefficients with mid-ISFs for two-subframe mode */ -extern const float interpol_frac_12k8[]; /* LPC interpolation coefficients */ +extern const float interpol_frac2[]; /* LPC interpolation coefficients for two-subframe mode */ +extern const float interpol_frac2_mid[]; /* LPC interpolation coefficients with mid-ISFs for two-subframe mode */ +extern const float interpol_frac_12k8[]; /* LPC interpolation coefficients */ +extern const Word16 interpol_frac2_fx[]; /* LPC interpolation coefficients for two-subframe mode */ +extern const Word16 interpol_frac2_mid_fx[]; /* LPC interpolation coefficients with mid-ISFs for two-subframe mode */ +extern const Word16 interpol_frac_12k8_fx[]; /* LPC interpolation coefficients */ extern const Word16 interpol_frac_fx[NB_SUBFR]; extern const float interpol_isp_amr_wb[]; /* LPC interpolation coefficients for AMR-WB interoperable mode */ @@ -638,6 +640,8 @@ extern const Word16 inv_sigma_p_fx[][16]; extern const float scales[][MAX_NO_SCALES * 2]; extern const float scales_p[][MAX_NO_SCALES * 2]; extern const Word16 scales_fx[][MAX_NO_SCALES * 2]; +extern const Word16 scales_ivas_fx[][MAX_NO_SCALES * 2]; +extern const Word16 scales_p_ivas_fx[][MAX_NO_SCALES * 2]; extern const Word16 scales_p_fx[][MAX_NO_SCALES * 2]; extern const int16_t predmode_tab_float[][6]; extern const Word16 predmode_tab[][6]; @@ -1611,7 +1615,16 @@ extern const Word16 CLDFB80_20[200]; extern const Word16 CLDFB80_32[320]; extern const Word16 CLDFB80_40[400]; extern const Word16 CLDFB80_60[600]; - +extern const Word16 CLDFB80_30[300]; +#ifdef IVAS_FLOAT_FIXED +extern const Word16 LDQMF_10_enc_fx[100]; +extern const Word16 LDQMF_16_enc_fx[160]; +extern const Word16 LDQMF_20_enc_fx[200]; +extern const Word16 LDQMF_30_enc_fx[300]; +extern const Word16 LDQMF_32_enc_fx[320]; +extern const Word16 LDQMF_40_enc_fx[400]; +extern const Word16 LDQMF_60_enc_fx[600]; +#endif extern const Word16 rRotVectr_10[]; extern const Word16 iRotVectr_10[]; @@ -1625,12 +1638,16 @@ extern const Word16 rRotVectr_40[]; extern const Word16 iRotVectr_40[]; extern const Word16 rRotVectr_60[]; extern const Word16 iRotVectr_60[]; +extern const Word16 rRotVectr_30[]; +extern const Word16 iRotVectr_30[]; extern const Word16 cldfb_anaScale[]; extern const Word16 cldfb_synScale[]; extern const Word16 cldfb_synGain[]; extern const Word16 *cldfb_protoFilter_2_5ms[]; +extern const Word16 *cldfb_protoFilter_5_0ms[]; extern const Word16 cldfb_scale_2_5ms[7]; +extern const Word16 cldfb_scale_5_0ms[7]; extern const float rot_vec_syn_re_L10[5]; @@ -1990,6 +2007,7 @@ extern const Word16 tcx_mdct_window_trans_48_fx[60]; extern const float sigma_BWE[]; extern const Word32 sigma_BWE_fx[]; +extern const Word16 sigma_BWE16_fx[]; extern const float inv_sigma_BWE[]; extern const float scales_BWE[]; extern const Word8 no_lead_BWE[]; diff --git a/lib_com/rom_com_fx.h b/lib_com/rom_com_fx.h index a07774106..ac6a0ef46 100644 --- a/lib_com/rom_com_fx.h +++ b/lib_com/rom_com_fx.h @@ -85,6 +85,14 @@ extern const Word16 LDQMF_32_fx[320]; extern const Word16 LDQMF_40_fx[400]; extern const Word16 LDQMF_60_fx[600]; +extern const Word16 LDQMF_10_enc_fx[100]; +extern const Word16 LDQMF_16_enc_fx[160]; +extern const Word16 LDQMF_20_enc_fx[200]; +extern const Word16 LDQMF_30_enc_fx[300]; +extern const Word16 LDQMF_32_enc_fx[320]; +extern const Word16 LDQMF_40_enc_fx[400]; +extern const Word16 LDQMF_60_enc_fx[600]; + extern const Word32 rot_vec_delay_re_LDQMF_fx[60]; extern const Word32 rot_vec_delay_im_LDQMF_fx[60]; diff --git a/lib_com/stat_com.h b/lib_com/stat_com.h index 05fd4b643..d9baadc35 100644 --- a/lib_com/stat_com.h +++ b/lib_com/stat_com.h @@ -782,6 +782,7 @@ typedef struct cldfb_filter_bank_struct float scale_flt; /* scaling of frequency domain */ Word16 scale; /* scaling of frequency domain */ /* Q8 */ + Word16 q_scale; } CLDFB_FILTER_BANK, *HANDLE_CLDFB_FILTER_BANK; diff --git a/lib_dec/ivas_lfe_plc_fx.c b/lib_dec/ivas_lfe_plc_fx.c index 003392ca9..f878ecf16 100644 --- a/lib_dec/ivas_lfe_plc_fx.c +++ b/lib_dec/ivas_lfe_plc_fx.c @@ -964,8 +964,9 @@ void ivas_lfe_tdplc_fx( Copy_Scale_sig_32_16( prevsynth_fx, prevsynth_16_fx, LFE_PLC_BUFLEN, -16 ); // Q5 = Q21 - Q16 Copy_Scale_sig_32_16( rec_frame_fx, rec_frame_16_fx, LFE_PLC_RECLEN, 0 ); // Q5 - modify_Fs_fx( prevsynth_16_fx + LFE_PLC_BUFLEN - LFE_PLC_FDEL / LFE_PLC_DSF, LFE_PLC_FDEL / LFE_PLC_DSF, LFE_PLC_FS, rec_frame_us_16_fx, 48000, mem_fx, 0 ); - modify_Fs_fx( rec_frame_16_fx, LFE_PLC_RECLEN, LFE_PLC_FS, rec_frame_us_16_fx, 48000, mem_fx, 0 ); + Word16 Q_new_inp, mem_decim_size; // TO be removed + modify_Fs_fx( prevsynth_16_fx + LFE_PLC_BUFLEN - LFE_PLC_FDEL / LFE_PLC_DSF, LFE_PLC_FDEL / LFE_PLC_DSF, LFE_PLC_FS, rec_frame_us_16_fx, 48000, mem_fx, 0, &Q_new_inp, &mem_decim_size ); + modify_Fs_fx( rec_frame_16_fx, LFE_PLC_RECLEN, LFE_PLC_FS, rec_frame_us_16_fx, 48000, mem_fx, 0, &Q_new_inp, &mem_decim_size ); /*samples are generated with 48k sampling rate and then converted to required sampling rate by simple decimation as signal is already bandlimited*/ diff --git a/lib_enc/acelp_core_enc.c b/lib_enc/acelp_core_enc.c index 771e0bc9e..c5359b781 100644 --- a/lib_enc/acelp_core_enc.c +++ b/lib_enc/acelp_core_enc.c @@ -44,6 +44,7 @@ #include "ivas_cnst.h" #include "ivas_prot.h" #include "prot_fx2.h" +#include "prot_fx_enc.h" #include "ivas_rom_com.h" #include "wmc_auto.h" @@ -52,7 +53,1471 @@ * * ACELP core encoder *--------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error acelp_core_enc( + Encoder_State *st, /* i/o: encoder state structure */ + const float inp[], /* i : input signal of the current frame */ + const float ener, /* i : residual energy from Levinson-Durbin*/ + float A[NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes*/ + float Aw[NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquant. for subframes*/ + const float epsP[M + 1], /* i : LP prediction errors */ + float lsp_new[M], /* i : LSPs at the end of the frame */ + float lsp_mid[M], /* i : LSPs in the middle of the frame */ + const int16_t vad_hover_flag, /* i : VAD hangover flag */ + const int16_t attack_flag, /* i : attack flag (GSC or TC) */ + float bwe_exc_extended[], /* i/o: bandwidth extended excitation */ + float *voice_factors, /* o : voicing factors */ + float old_syn_12k8_16k[], /* o : intermediate ACELP synthesis at 12.8kHz or 16kHz to be used by SWB BWE */ + float pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */ + int16_t *unbits, /* o : number of unused bits */ + STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ + float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ +) +{ + int16_t i, nBits; /* reserved bits */ + LPD_state_HANDLE hLPDmem; /* i/o: acelp memories */ + float old_exc_flt[L_EXC], *exc; /* excitation signal buffer */ + float lsf_new[M]; /* ISFs at the end of the frame */ + float Aq[NB_SUBFR16k * ( M + 1 )]; /* A(z) quantized for the 4 subframes */ + float syn[L_FRAME16k]; /* synthesis signal buffer */ + float res[L_FRAME16k]; /* Residual signal for FER protection */ + float exc2[L_FRAME16k]; /* enhanced excitation */ + float Es_pred; /* predicited scaled innovation energy */ + float tmp_noise; /* NB post-filter long-term noise energy*/ + int16_t tc_subfr; /* TC sub-frame indication */ + float old_bwe_exc[( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2]; /* excitation buffer */ + float *bwe_exc; /* excitation for SWB TBE */ + int16_t allow_cn_step; + int32_t int_fs; + float att; + int16_t nb_bits; /* parameters handling */ + + /* SC-VBR - back-up memories for LSF quantizer and synthesis filter */ + int16_t pstreaklen; + float mem_MA[M], mem_AR[M], Bin_E[L_FFT], Bin_E_old[L_FFT / 2], lsp_new_bck[M], lsp_mid_bck[M], mem_syn_bck[M]; + float clip_var, mem_w0_bck, streaklimit; + + float q_env[NUM_ENV_CNG]; + int16_t sid_bw = -1; + float exc3[L_FRAME16k]; + float syn1[L_FRAME16k]; + + float tilt_code_bck; + float gc_threshold_bck; + float clip_var_bck[6]; + int16_t next_force_sf_bck; + int16_t uc_two_stage_flag; + int16_t position; + float tmpF; + int16_t ppp_mode, nelp_mode; + int16_t tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag; + float *tdm_Pri_pitch_buf; + + /* bitstream */ + BSTR_ENC_HANDLE hBstr = st->hBstr; +#if 0 + //Word16 old_exc_fx[L_EXC], *exc_fx; /* excitation signal buffer */ + Word16 lsf_new_fx[M]; /* ISFs at the end of the frame */ + Word16 Aq_fx[NB_SUBFR16k*(M + 1)]; /* A(z) quantized for the 4 subframes */ + Word16 syn_fx[L_FRAME16k]; /* synthesis vector */ + Word16 res_fx[L_FRAME16k]; /* Residual signal for FER protection */ + Word16 exc2_fx[L_FRAME16k]; /* enhanced excitation */ + Word16 Es_pred_fx; /* predicited scaled innovation energy */ + Word16 tmp_noise_fx; /* NB post-filter long-term noise energy*/ + Word16 tc_subfr_fx; /* TC sub-frame indication */ + Word16 old_bwe_exc_fx[(PIT16k_MAX + (L_FRAME16k + 1) + L_SUBFR16k) * 2]; /* excitation buffer */ + Word16 *bwe_exc_fx; /* excitation for SWB TBE */ + Word16 allow_cn_step_fx; + Word16 int_fs_fx; + Word32 L_epsP[2]; + /* SC-VBR - back-up memories for LSF quantizer and synthesis filter */ + Word16 mCb1_fx, pstreaklen_fx; + Word16 mem_MA_fx[M], mem_AR_fx[M], lsp_new_bck_fx[M], lsf_new_bck_fx[M], lsp_mid_bck_fx[M], mem_syn_bck_fx[M]; + Word32 Bin_E_fx[L_FFT], Bin_E_old_fx[L_FFT / 2]; + Word16 clip_var_fx, mem_w0_bck_fx, streaklimit_fx; + Word16 indice; + Word16 tmp16; + Word16 enr_index; + Word16 enr; + + Word16 tilt_code_bck_fx; + Word32 gc_threshold_bck_fx; + Word16 clip_var_bck_fx[6]; + Word16 next_force_sf_bck_fx; + Word32 q_env_fx[NUM_ENV_CNG]; + Word16 coder_type; + Word16 exc3_fx[L_FRAME16k]; + Word16 syn1_fx[L_FRAME16k]; + Word16* tdm_Pri_pitch_buf_fx; + Word16 att_fx; + + Word16 lsp_new_fx[M]; /* i : LSPs at the end of the frame */ + Word16 lsp_mid_fx[M]; /* i : LSPs in the middle of the frame */ + Word16 old_syn_12k8_16k_fx[L_FRAME16k]; +#endif + ivas_error error; + + error = IVAS_ERR_OK; + + if ( st->element_mode == IVAS_CPE_MDCT && st->core_brate <= SID_2k40 ) + { + /* Core was ACELP because of DTX in MDCT-Stereo, but SID encoding for that is done in separate function */ + return error; + } + + push_wmops( "acelp_core_enc" ); + /*------------------------------------------------------------------* + * Initialization + *------------------------------------------------------------------*/ + + hLPDmem = st->hLPDmem; + + Es_pred = 0; + + exc = old_exc_flt + L_EXC_MEM; /* pointer to excitation signal in the current frame */ + mvr2r( hLPDmem->old_exc_flt, old_exc_flt, L_EXC_MEM ); + + if ( st->hBWE_TD != NULL ) + { + bwe_exc = old_bwe_exc + PIT16k_MAX * 2; /* pointer to BWE excitation signal in the current frame */ + mvr2r( st->hBWE_TD->old_bwe_exc, old_bwe_exc, PIT16k_MAX * 2 ); + } + else + { + bwe_exc = NULL; + } + + st->bpf_off = 0; + if ( st->last_core == HQ_CORE || st->last_codec_mode == MODE2 || st->last_core == TCX_20_CORE || st->last_core == TCX_10_CORE ) + { + /* in case of HQ->ACELP switching, do not apply BPF */ + st->bpf_off = 1; + /* reset the GSC pre echo energy threshold in case of switching */ + if ( st->hGSCEnc != NULL ) + { + st->hGSCEnc->Last_frame_ener = (float) MAX_32; + } + } + + /* force safety-net LSFQ in the first frames after CNG segment */ + if ( st->last_core_brate <= SID_2k40 ) + { + st->Nb_ACELP_frames = 0; + } + st->Nb_ACELP_frames++; + + if ( st->L_frame == L_FRAME ) + { + int_fs = INT_FS_12k8; + } + else + { + int_fs = INT_FS_16k; + } + + tmp_noise = 0; + tc_subfr = -1; + position = -1; + + /* SC-VBR temporary variables */ + pstreaklen = 0; + clip_var = 0; + mem_w0_bck = 0; + streaklimit = 0; + + /* channel-aware mode */ + reset_rf_indices( st->hRF, st->L_frame, &st->rf_target_bits_write ); + + /* VBR modes */ + if ( st->Opt_SC_VBR ) + { + ppp_mode = st->hSC_VBR->ppp_mode; + nelp_mode = st->hSC_VBR->nelp_mode; + } + else + { + ppp_mode = 0; + nelp_mode = 0; + } + + /* TD stereo */ + if ( st->element_mode == IVAS_CPE_TD && st->idchan == 1 ) + { + tdm_lp_reuse_flag = hStereoTD->tdm_lp_reuse_flag; + tdm_low_rate_mode = hStereoTD->tdm_low_rate_mode; + tdm_Pitch_reuse_flag = hStereoTD->tdm_Pitch_reuse_flag; + tdm_Pri_pitch_buf = hStereoTD->tdm_Pri_pitch_buf; + } + else + { + tdm_lp_reuse_flag = 0; + tdm_low_rate_mode = 0; + if ( st->element_mode == IVAS_SCE && st->low_rate_mode ) + { + tdm_low_rate_mode = 1; + } + tdm_Pitch_reuse_flag = 0; + tdm_Pri_pitch_buf = NULL; + } + + /*-----------------------------------------------------------------* + * ACELP@12k8 / ACELP@16k switching + *-----------------------------------------------------------------*/ + + if ( st->last_L_frame != st->L_frame && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) ) + { + /* in case of switching, do not apply BPF (flag employed also in updt_enc()) */ + st->bpf_off = 1; + + /* force safety-net LSFQ in the first frames after ACELP@12k8/ACELP@16k switching */ + st->Nb_ACELP_frames = 1; + + /* convert old quantized LSP vector */ + if ( st->L_frame == L_FRAME ) + { + st->rate_switching_reset = lsp_convert_poly( st->lsp_old, st->L_frame, 0 ); + } + else + { + st->rate_switching_reset = st->rate_switching_reset_16kHz; + mvr2r( st->lsp_old16k, st->lsp_old, M ); + } + + /* convert old quantized LSF vector */ + lsp2lsf( st->lsp_old, st->lsf_old, M, int_fs ); + + /* interpolation of unquantized ISPs */ + if ( st->rate_switching_reset ) + { + /*extrapolation in case of unstable LSP*/ + int_lsp4( st->L_frame, lsp_mid, lsp_mid, lsp_new, A, M, 0 ); + } + else + { + int_lsp4( st->L_frame, st->lsp_old, lsp_mid, lsp_new, A, M, 0 ); + } + + /* Reset LPC mem */ + mvr2r( GEWB_Ave, st->mem_AR, M ); + set_zero( st->mem_MA, M ); + + /* update synthesis filter memories */ + synth_mem_updt2_flt( st->L_frame, st->last_L_frame, hLPDmem->old_exc_flt, hLPDmem->mem_syn_r_flt, hLPDmem->mem_syn2_flt, hLPDmem->mem_syn_flt, ENC ); + mvr2r( hLPDmem->old_exc_flt, old_exc_flt, L_EXC_MEM ); + mvr2r( hLPDmem->mem_syn2_flt, hLPDmem->mem_syn1_flt, M ); + mvr2r( hLPDmem->mem_syn2_flt, hLPDmem->mem_syn3_flt, M ); + + /* update Aw[] coefficients */ + weight_a_subfr( st->L_frame / L_SUBFR, A, Aw, st->gamma_flt, M ); + } + + if ( st->last_bwidth == NB && st->bwidth != NB && st->ini_frame != 0 ) + { + st->rate_switching_reset = 1; + } + + /*----------------------------------------------------------------* + * Encoding of CNG frames + *----------------------------------------------------------------*/ + + if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) + { + if ( st->cng_type == LP_CNG ) + { + /* Run CNG post parameter update */ + cng_params_postupd( st->hTdCngEnc->ho_circ_ptr, &st->hTdCngEnc->cng_buf_cnt, st->hTdCngEnc->cng_exc2_buf_flt, st->hTdCngEnc->cng_brate_buf, st->hTdCngEnc->ho_env_circ, st->element_mode, st->hFdCngEnc->hFdCngCom->CngBandwidth ); + + /* encode CNG parameters */ + CNG_enc( st, Aq, inp, ener, lsp_mid, lsp_new, lsf_new, &allow_cn_step, q_env, &sid_bw ); + + /* comfort noise generation */ + CNG_exc( st->core_brate, st->L_frame, &st->hTdCngEnc->Enew, &st->hTdCngEnc->cng_seed, exc, exc2, &st->hTdCngEnc->lp_ener, st->last_core_brate, &st->hDtxEnc->first_CNG, &st->hTdCngEnc->cng_ener_seed, bwe_exc, allow_cn_step, &st->hTdCngEnc->last_allow_cn_step, st->hTdCngEnc->num_ho, q_env, st->hTdCngEnc->lp_env, st->hTdCngEnc->old_env, st->hTdCngEnc->exc_mem, st->hTdCngEnc->exc_mem1, &sid_bw, &st->hTdCngEnc->cng_ener_seed1, exc3, st->Opt_AMR_WB, EVS_MONO ); + } + else + { + if ( st->core_brate == SID_2k40 && st->element_mode != IVAS_CPE_MDCT ) + { + FdCng_encodeSID( st ); + st->hDtxEnc->last_CNG_L_frame = st->L_frame; + } + + generate_comfort_noise_enc( st ); + + FdCng_exc_flt( st->hFdCngEnc->hFdCngCom, &st->hDtxEnc->CNG_mode, st->L_frame, st->lsp_old, st->hDtxEnc->first_CNG, st->hDtxEnc->lspCNG, Aq, lsp_new, lsf_new, exc, exc2, bwe_exc ); + mvr2r( exc2, exc3, st->L_frame ); + + if ( st->core_brate == SID_2k40 ) + { + if ( st->hTdCngEnc != NULL ) + { + tmpF = cng_energy( st->element_mode, st->bwidth, st->hDtxEnc->CNG_mode, st->hTdCngEnc->CNG_att, exc, st->L_frame ); + i = (int16_t) ( ( tmpF + 2.0f ) * STEP_SID ); + i = min( max( i, 0 ), 127 ); + st->hTdCngEnc->old_enr_index = i; + } + } + } + + /* Reset HO counter in the first SID frame */ + if ( st->hTdCngEnc != NULL ) + { + st->hTdCngEnc->burst_ho_cnt = 0; + } + + /* synthesis at 12.8kHz sampling rate */ + syn_12k8( st->L_frame, Aq, exc3, syn1, hLPDmem->mem_syn3_flt, 1 ); + + /* reset the encoder */ + CNG_reset_enc( st, pitch_buf, voice_factors, 0 ); + + /* update st->mem_syn1_flt for ACELP core switching */ + mvr2r( hLPDmem->mem_syn3_flt, hLPDmem->mem_syn1_flt, M ); + + /* update ACELP core synthesis filter memory */ + mvr2r( hLPDmem->mem_syn3_flt, hLPDmem->mem_syn_flt, M ); + + /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ + mvr2r( syn1 + st->L_frame - L_SYN_MEM, hLPDmem->mem_syn_r_flt, L_SYN_MEM ); + + /* save and delay synthesis to be used by SWB BWE */ + if ( st->hBWE_FD != NULL ) + { + save_old_syn( st->L_frame, syn1, old_syn_12k8_16k, st->hBWE_FD->old_syn_12k8_16k, st->preemph_fac_flt, &st->hBWE_FD->mem_deemph_old_syn ); + } + + /*Update MODE2 core switching memory*/ + deemph( syn1, st->preemph_fac_flt, st->L_frame, &( hLPDmem->syn_flt[M] ) ); + mvr2r( syn1 + st->L_frame - M - 1, hLPDmem->syn_flt, M + 1 ); + } + + /*----------------------------------------------------------------* + * Encoding of all other frames + *----------------------------------------------------------------*/ +#if 0 + ELSE + { +#if 1 + /*-----------------------------------------------------------------* + * Configure ACELP bit allocation + *-----------------------------------------------------------------*/ + + nb_bits = 0; + st->acelp_cfg.FEC_mode = 0; + uc_two_stage_flag = 0; + + if ( !nelp_mode && !ppp_mode ) + { + config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + } + + /*-----------------------------------------------------------------* + * After inactive period, use the most up-to-date ISPs + *-----------------------------------------------------------------*/ + + if ( st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_2k40 ) + { + mvr2r( st->hDtxEnc->lspCNG, st->lsp_old, M ); + lsp2lsf( st->hDtxEnc->lspCNG, st->lsf_old, M, int_fs ); + } + + /*-----------------------------------------------------------------* + * Reset higher ACELP pre-quantizer in case of switching + *-----------------------------------------------------------------*/ + + if ( !st->use_acelp_preq ) + { + st->mem_deemp_preQ = 0.0f; + st->mem_preemp_preQ = 0.0f; + st->last_code_preq = 0; + st->last_nq_preQ = 0; + } + st->use_acelp_preq = 0; + + /*-----------------------------------------------------------------* + * LSF Quantization + * A[z] calculation + *-----------------------------------------------------------------*/ + + /* SC-VBR & channel-aware mode - back-up memories for LSF quantizer and synthesis filter */ + lsf_syn_mem_backup( st, &tilt_code_bck, &gc_threshold_bck, clip_var_bck, &next_force_sf_bck, lsp_new, lsp_mid, &clip_var, mem_AR, mem_MA, lsp_new_bck, lsp_mid_bck, Bin_E, Bin_E_old, mem_syn_bck, &mem_w0_bck, &streaklimit, &pstreaklen ); + Word16 tdm_lsfQ_PCh_fx[M]; + Word16 Q_new = 0; + IF ( !tdm_lp_reuse_flag ) + { +#if 1 + floatToFixed_arr(lsp_new, lsp_new_fx, 15, M); + FOR(Word16 idx = 0; idx < M; idx++) + { + st->lsf_old_fx[idx] = st->lsf_old[idx] * 2.56; + lsf_new_fx[idx] = lsf_new_fx[idx] * 2.56; + st->lsf_adaptive_mean_fx[idx] = st->lsf_adaptive_mean[idx] * 2.56; + st->mem_MA_fx[idx] = st->mem_MA[idx] * 2.56; + st->mem_AR_fx[idx] = st->mem_AR[idx] * 2.56; + tdm_lsfQ_PCh_fx[idx] = tdm_lsfQ_PCh[idx] * 2.56; + st->lsfoldbfi1_fx[idx] = st->lsfoldbfi1[idx] * 2.56; + st->lsfoldbfi0_fx[idx] = st->lsfoldbfi0[idx] * 2.56; + } + + FOR(Word16 idx = 0; idx < 6; idx++) + { + st->clip_var_fx[idx] = st->clip_var[idx] * 2.56; + } + + Q_new = Q_factor_arr(st->Bin_E, 256); + + floatToFixed_arrL(st->Bin_E_old, st->Bin_E_old_fx, 0, L_FFT ); + floatToFixed_arrL(st->Bin_E, st->Bin_E_fx, Q_new, L_FFT); + floatToFixed_arr(st->lsp_old, st->lsp_old_fx, 15, M); + floatToFixed_arr(lsp_mid, lsp_mid_fx, 15, M); + + st->stab_fac_fx = st->stab_fac * (1 << 15); + st->streaklimit_fx = st->streaklimit * (1 << 15); + st->pstreaklen_fx = st->pstreaklen; + + lsf_enc_ivas_fx(st, lsf_new_fx, lsp_new_fx, lsp_mid_fx, Aq_fx, tdm_low_rate_mode, st->GSC_IVAS_mode, tdm_lsfQ_PCh_fx, Q_new); + + Scale_sig(Aq_fx, NB_SUBFR16k * (M + 1), 14 - norm_l(Aq_fx[0])); + fixedToFloat_arr(Aq_fx, Aq, 12, NB_SUBFR16k * (M + 1)); + fixedToFloat_arr(lsp_new_fx, lsp_new, 15, M); + fixedToFloat_arr(lsp_mid_fx, lsp_mid, 15, M); + st->stab_fac = (float)st->stab_fac_fx / (1 << 15); + for (int i = 0; i < M; i++) { + + lsf_new[i] = lsf_new_fx[i] / 2.56; + st->lsf_old[i] = st->lsf_old_fx[i] / 2.56; + st->lsf_adaptive_mean[i] = st->lsf_adaptive_mean_fx[i] / 2.56; + st->mem_MA[i] = st->mem_MA_fx[i] / 2.56; + st->mem_AR[i] = st->mem_AR_fx[i] / 2.56; + st->lsfoldbfi1[i] = st->lsfoldbfi1_fx[i] / 2.56; + st->lsfoldbfi0[i] = st->lsfoldbfi0_fx[i] / 2.56; + } + st->streaklimit = (float)st->streaklimit_fx / (1 << 15); + st->pstreaklen = st->pstreaklen_fx; +#else + lsf_enc( st, lsf_new, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, st->GSC_IVAS_mode, tdm_lsfQ_PCh ); +#endif + } + ELSE + { + const float *pt_interp_2; + + IF ( NE_16(st->active_cnt, 1 )) + { +#if 0 + Word16 beta_index; + Word16 lsf_wgts[M]; + + /* intra_frame prediction for the LSFs */ + lsp2lsf_fx(lsp_new_fx, lsf_new_fx, M, 12800); + + Unified_weighting_fx(&st->Bin_E_fx[L_FFT / 2], Q_new, lsf_new_fx, lsf_wgts, st->bwidth == NB, st->coder_type == UNVOICED, st->sr_core, M); + + tdm_SCh_lsf_reuse_fx(ENC, st->element_brate, lsf_new_fx, lsp_new_fx, tdm_lsfQ_PCh_fx, lsf_wgts, &beta_index); +#else + int16_t beta_index; + float lsf_wgts[M]; + + /* intra_frame prediction for the LSFs */ + lsp2lsf( lsp_new, lsf_new, M, 12800 ); + + Unified_weighting( &st->Bin_E[L_FFT / 2], lsf_new, lsf_wgts, st->bwidth == NB, st->coder_type == UNVOICED, st->sr_core, M ); + + tdm_SCh_lsf_reuse( ENC, st->element_brate, lsf_new, lsp_new, tdm_lsfQ_PCh, lsf_wgts, &beta_index ); +#endif + push_indice( hBstr, IND_IC_LSF_PRED, beta_index, TDM_IC_LSF_PRED_BITS ); + } + + pt_interp_2 = interpol_frac_12k8; + if ( tdm_low_rate_mode == 1 && st->coder_type > UNVOICED ) + { + pt_interp_2 = interpol_frac2; + } + + if ( st->active_cnt == 1 ) + { + mvr2r( lsp_new, st->lsp_old, M ); + lsp2lsf( lsp_new, st->lsf_old, M, st->sr_core ); + lsp2lsf( lsp_new, lsf_new, M, st->sr_core ); + } + + /* LSP interpolation and conversion of LSPs to A(z) */ + int_lsp( st->L_frame, st->lsp_old, lsp_new, Aq, M, pt_interp_2, 0 ); + + /* Check LSF stability (distance between old LSFs and current LSFs) */ + st->stab_fac = lsf_stab( lsf_new, st->lsf_old, 0, st->L_frame ); + } + + if ( st->last_core == HQ_CORE && st->element_mode > EVS_MONO ) + { + /* Prepare ACB memory from last HQ frame */ + tmpF = hLPDmem->old_exc_flt[0]; + preemph( hLPDmem->old_exc_flt, st->preemph_fac_flt, st->L_frame, &tmpF ); + mvr2r( hLPDmem->old_exc_flt + st->L_frame - M, hLPDmem->mem_syn_flt, M ); + residu( Aq, M, hLPDmem->old_exc_flt, old_exc_flt, st->L_frame ); + } + + if ( st->last_core != ACELP_CORE && st->element_mode > EVS_MONO ) + { + /* Prepare ACB memory of old_bwe_exc */ + if ( st->L_frame == L_FRAME ) + { + lerp_flt( old_exc_flt, old_bwe_exc, L_EXC_MEM_DEC * HIBND_ACB_L_FAC, L_EXC_MEM_DEC ); + } + else + { + lerp_flt( old_exc_flt, old_bwe_exc, L_EXC_MEM_DEC * 2, L_EXC_MEM_DEC ); + } + } + + + /*---------------------------------------------------------------* + * Calculation of LP residual (filtering through A[z] filter) + *---------------------------------------------------------------*/ + + calc_residu( inp, res, Aq, st->L_frame ); + + calculate_hangover_attenuation_gain( st, &att, vad_hover_flag ); + if ( att != 1.0f ) + { + v_multc( res, att, res, st->L_frame ); + } + + /*-----------------------------------------------------------------* + * Determine TC subframe classification + *-----------------------------------------------------------------*/ + + if ( st->coder_type == TRANSITION ) + { + tc_classif_enc( st->L_frame, &tc_subfr, &position, attack_flag, st->pitch[0], res ); + + config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + } + + /*---------------------------------------------------------------* + * Calculation of prediction for scaled innovation energy + * (for memory-less gain quantizer) + *---------------------------------------------------------------*/ + + if ( nb_bits > 0 ) + { + Es_pred_enc( &Es_pred, &i, st->L_frame, L_SUBFR, res, st->voicing, nb_bits, uc_two_stage_flag ); + push_indice( hBstr, IND_ES_PRED, i, nb_bits ); + } + + /*------------------------------------------------------------* + * Encode excitation according to coding type + *------------------------------------------------------------*/ + + if ( tdm_low_rate_mode ) /* tdm stereo low rate mode */ + { + if ( st->coder_type <= UNVOICED ) + { + tdm_low_rate_enc( st, Aq, res, syn, exc, pitch_buf, voice_factors, bwe_exc, 0 /*attack_flag*/, lsf_new, &tmp_noise ); + } + else /* GENERIC */ + { + encod_gen_2sbfr( st, inp, Aw, Aq, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + } + } + else if ( nelp_mode ) + { + /* SC-VBR - NELP frames */ + encod_nelp( st, inp, Aw, Aq, res, syn, &tmp_noise, exc, exc2, pitch_buf, voice_factors, bwe_exc ); + } + else if ( st->coder_type == UNVOICED ) + { + /* UNVOICED frames (Gauss. excitation) */ + encod_unvoiced( st, inp, Aw, Aq, Es_pred, uc_two_stage_flag, res, syn, &tmp_noise, exc, pitch_buf, voice_factors, bwe_exc ); + } + else if ( st->coder_type == TRANSITION ) + { + encod_tran( st, inp, Aw, Aq, Es_pred, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc, tc_subfr, position, unbits ); + } + else if ( ppp_mode ) + { + /* SC-VBR - PPP frames */ + if ( ( error = encod_ppp( st, inp, Aw, Aq, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc ) ) != IVAS_ERR_OK ) + { + return error; + } + + + if ( st->hSC_VBR->bump_up ) /* PPP failed, bump up */ + { + /* restore memories of LSF quantizer and synthesis filter */ + lsf_syn_mem_restore( st, tilt_code_bck, gc_threshold_bck, clip_var_bck, next_force_sf_bck, lsp_new, lsp_mid, clip_var, mem_AR, mem_MA, lsp_new_bck, lsp_mid_bck, Bin_E, Bin_E_old, mem_syn_bck, mem_w0_bck, streaklimit, pstreaklen ); + + /* Configure ACELP bit allocation */ + config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + + /* redo LSF quantization */ + lsf_enc( st, lsf_new, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, 0, NULL ); + + /* recalculation of LP residual (filtering through A[z] filter) */ + calc_residu( inp, res, Aq, st->L_frame ); + st->hTdCngEnc->burst_ho_cnt = 0; + + /* VOICED frames in SC-VBR */ + encod_gen_voic( st, inp, Aw, Aq, Es_pred, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc, unbits, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + } + } + else if ( st->coder_type == AUDIO || ( st->coder_type == INACTIVE && st->inactive_coder_type_flag ) ) + { + /* AUDIO and INACTIVE frames (coded by GSC technology) */ + encod_audio( st, inp, Aw, Aq, res, syn, exc, pitch_buf, voice_factors, bwe_exc, attack_flag, lsf_new, &tmp_noise, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + } + else + { + /* GENERIC, VOICED and INACTIVE frames (coded by AVQ technology) */ + encod_gen_voic( st, inp, Aw, Aq, Es_pred, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc, unbits, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + } + + + /* update mem_syn1_flt for ACELP core switching */ + mvr2r( hLPDmem->mem_syn_flt, hLPDmem->mem_syn1_flt, M ); + + /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ + mvr2r( syn + st->L_frame - L_SYN_MEM, hLPDmem->mem_syn_r_flt, L_SYN_MEM ); + + /* save and delay synthesis to be used by SWB BWE */ + if ( st->hBWE_FD != NULL ) + { + save_old_syn( st->L_frame, syn, old_syn_12k8_16k, st->hBWE_FD->old_syn_12k8_16k, st->preemph_fac_flt, &st->hBWE_FD->mem_deemph_old_syn ); + } + + /*Update MODE2 core switching memory*/ + mvr2r( syn, syn1, st->L_frame ); + deemph( syn1, st->preemph_fac_flt, st->L_frame, &( hLPDmem->syn_flt[M] ) ); + mvr2r( syn1 + st->L_frame - M - 1, hLPDmem->syn_flt, M + 1 ); + + if ( st->element_mode > EVS_MONO && st->hTcxEnc != NULL ) + { + mvr2r( syn1 + st->L_frame / 2, st->hTcxEnc->Txnq_flt, st->L_frame / 2 ); + } + + /*--------------------------------------------------------------------------------------* + * Modify the excitation signal when the noise is stationary + *--------------------------------------------------------------------------------------*/ + + if ( !( st->idchan == 1 && st->element_mode == IVAS_CPE_TD ) && nelp_mode != 1 && !( st->element_mode == IVAS_SCE && tdm_low_rate_mode ) ) + { + /* exc2 buffer is needed only for updating of Aq[] which is needed for core switching */ + mvr2r( exc, exc2, st->L_frame ); + stat_noise_uv_enc( st, epsP, lsp_new, lsp_mid, Aq, exc2, uc_two_stage_flag ); + } + + /*-----------------------------------------------------------------* + * Encode supplementary information for Frame Error Concealment + *-----------------------------------------------------------------*/ + + FEC_encode( hBstr, st->acelp_cfg, syn, st->coder_type, st->clas, pitch_buf, res, &st->Last_pulse_pos, st->L_frame, st->total_brate ); + + if ( st->hBWE_TD != NULL ) + { + if ( st->L_frame == L_FRAME ) + { + mvr2r( Aq + 2 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq, ( M + 1 ) ); + } + else + { + mvr2r( Aq + 3 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq, ( M + 1 ) ); + } + } +#else + /*-----------------------------------------------------------------* + * Configure ACELP bit allocation + *-----------------------------------------------------------------*/ + + nb_bits = 0; + st->acelp_cfg.FEC_mode = 0; + uc_two_stage_flag = 0; +#if 0 // Both are in fixed point, but 1st one giveing crash for one file. + IF ( !nelp_mode && !ppp_mode ) + { + config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + } +#else + if (!nelp_mode && !ppp_mode) + { + config_acelp1_IVAS(ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &(st->acelp_cfg), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode); + } +#endif + /*-----------------------------------------------------------------* + * After inactive period, use the most up-to-date ISPs + *-----------------------------------------------------------------*/ +#if 0 + floatToFixed_arr(st->lsp_old, st->lsp_old_fx, 15, M); + + IF(EQ_32(st->last_core_brate, FRAME_NO_DATA) || EQ_32(st->last_core_brate, SID_2k40)) + { + Copy(st->hDtxEnc->lspCNG_fx, st->lsp_old_fx, M); + lsp2lsf_fx(st->hDtxEnc->lspCNG_fx, st->lsf_old_fx, M, int_fs); + } + for (int i = 0; i < M; i++) { + st->lsf_old[i] = st->lsf_old_fx[i] / 2.56; + } +#else + if ( st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_2k40 ) + { + mvr2r( st->hDtxEnc->lspCNG, st->lsp_old, M ); + lsp2lsf( st->hDtxEnc->lspCNG, st->lsf_old, M, int_fs ); + } +#endif + /*-----------------------------------------------------------------* + * Reset higher ACELP pre-quantizer in case of switching + *-----------------------------------------------------------------*/ +#if 1 + IF (!st->use_acelp_preq) + { + st->mem_deemp_preQ_fx = 0; + st->mem_preemp_preQ_fx = 0; + st->last_code_preq = 0; + st->last_nq_preQ = 0; + } + st->use_acelp_preq = 0; + + if (!st->use_acelp_preq) + { + st->mem_deemp_preQ = 0.0f; + st->mem_preemp_preQ = 0.0f; + st->last_code_preq = 0; + st->last_nq_preQ = 0; + } +#else + if ( !st->use_acelp_preq ) + { + st->mem_deemp_preQ = 0.0f; + st->mem_preemp_preQ = 0.0f; + st->last_code_preq = 0; + st->last_nq_preQ = 0; + } + st->use_acelp_preq = 0; +#endif + /*-----------------------------------------------------------------* + * LSF Quantization + * A[z] calculation + *-----------------------------------------------------------------*/ + + /* SC-VBR & channel-aware mode - back-up memories for LSF quantizer and synthesis filter */ +#if 0 + floatToFixed_arr(lsp_new, lsp_new_fx, 15, M); + floatToFixed_arr(lsp_mid, lsp_mid_fx, 15, M); + floatToFixed_arr(st->Bin_E_old, st->Bin_E_old_fx, 15, L_FFT / 2); + floatToFixed_arr(st->clip_var, st->clip_var_fx, 8, 6); + FOR(Word16 idx = 0; idx < M; idx++) + { + + st->lsf_old_fx[idx] = st->lsf_old[idx] * 2.56; + st->lsf_adaptive_mean_fx[idx] = st->lsf_adaptive_mean[idx] * 2.56; + st->mem_MA_fx[idx] = st->mem_MA[idx] * 2.56; + st->mem_AR_fx[idx] = st->mem_AR[idx] * 2.56; + } + hLPDmem->tilt_code = hLPDmem->tilt_code_flt; + hLPDmem->gc_threshold = hLPDmem->gc_threshold_flt; + st->next_force_safety_net_fx = st->next_force_safety_net; + + lsf_syn_mem_backup_fx(st, &tilt_code_bck_fx, &gc_threshold_bck_fx, clip_var_bck_fx, &next_force_sf_bck, lsp_new_fx, lsf_new_fx, lsp_mid_fx, &clip_var_fx, mem_AR_fx, mem_MA_fx, lsp_new_bck_fx, lsf_new_bck_fx, lsp_mid_bck_fx, &mCb1_fx, Bin_E_fx, Bin_E_old_fx, mem_syn_bck_fx, &mem_w0_bck_fx, &streaklimit_fx, &pstreaklen_fx); + + fixedToFloat_arr(clip_var_bck_fx, clip_var_bck, 8, 6); + fixedToFloat_arr(lsp_new_bck_fx, lsp_new_bck, 15, M); + fixedToFloat_arr(lsp_mid_bck_fx, lsp_mid_bck, 15, M); + fixedToFloat_arr(lsp_mid_bck_fx, lsp_mid_bck, 15, M); + fixedToFloat_arr(Bin_E_fx, Bin_E, 15, L_FFT); + fixedToFloat_arr(Bin_E_old_fx, Bin_E_old, 15, L_FFT / 2); + fixedToFloat_arr(mem_syn_bck_fx, mem_syn_bck, 15, M); + + for (int i = 0; i < M; i++) { + + lsf_new[i] = lsf_new_fx[i] / 2.56; + st->lsf_old[i] = st->lsf_old_fx[i] / 2.56; + st->lsf_adaptive_mean[i] = st->lsf_adaptive_mean_fx[i] / 2.56; + st->mem_MA[i] = st->mem_MA_fx[i] / 2.56; + st->mem_AR[i] = st->mem_AR_fx[i] / 2.56; + mem_MA[i] = mem_MA_fx[i] / 2.56; + mem_AR[i] = mem_AR_fx[i] / 2.56; + } + + clip_var = (float)clip_var_fx / (1 << 8); + mem_w0_bck = mem_w0_bck_fx; + streaklimit = streaklimit_fx; + mem_w0_bck = mem_w0_bck_fx; +#else + lsf_syn_mem_backup( st, &tilt_code_bck, &gc_threshold_bck, clip_var_bck, &next_force_sf_bck, lsp_new, lsp_mid, &clip_var, mem_AR, mem_MA, lsp_new_bck, lsp_mid_bck, Bin_E, Bin_E_old, mem_syn_bck, &mem_w0_bck, &streaklimit, &pstreaklen ); +#endif + if ( !tdm_lp_reuse_flag ) + { +#if 1 + Word16 Q_new = 0; + Word16 tdm_lsfQ_PCh_fx[M]; + + floatToFixed_arr(lsp_new, lsp_new_fx, 15, M); + FOR(Word16 idx = 0; idx < M; idx++) + { + st->lsf_old_fx[idx] = st->lsf_old[idx] * 2.56; + lsf_new_fx[idx] = lsf_new_fx[idx] * 2.56; + st->lsf_adaptive_mean_fx[idx] = st->lsf_adaptive_mean[idx] * 2.56; + st->mem_MA_fx[idx] = st->mem_MA[idx] * 2.56; + st->mem_AR_fx[idx] = st->mem_AR[idx] * 2.56; + tdm_lsfQ_PCh_fx[idx] = tdm_lsfQ_PCh[idx] * 2.56; + } + + FOR(Word16 idx = 0; idx < 6; idx++) + { + st->clip_var_fx[idx] = st->clip_var[idx] * 2.56; + } + + floatToFixed_arrL(st->Bin_E_old, st->Bin_E_old_fx, 0, L_FFT / 2); + floatToFixed_arrL(st->Bin_E, st->Bin_E_fx, 0, L_FFT / 2); + floatToFixed_arr(st->lsp_old, st->lsp_old_fx, 15, M); + floatToFixed_arr(lsp_mid, lsp_mid_fx, 15, M); + + st->stab_fac_fx = st->stab_fac * (1 << 15); + + lsf_enc_ivas_fx(st, lsf_new_fx, lsp_new_fx, lsp_mid_fx, Aq_fx, tdm_low_rate_mode, st->GSC_IVAS_mode, tdm_lsfQ_PCh_fx, Q_new); + + Scale_sig(Aq_fx, NB_SUBFR16k * (M + 1), 14 - norm_l(Aq_fx[0])); + fixedToFloat_arr(Aq_fx, Aq, 12, NB_SUBFR16k * (M + 1)); + fixedToFloat_arr(lsp_new_fx, lsp_new, 15, M); + fixedToFloat_arr(lsp_mid_fx, lsp_mid, 15, M); + st->stab_fac = (float)st->stab_fac_fx / (1 << 15); + for (int i = 0; i < M; i++) { + + lsf_new[i] = lsf_new_fx[i] / 2.56; + st->lsf_old[i] = st->lsf_old_fx[i] / 2.56; + st->lsf_adaptive_mean[i] = st->lsf_adaptive_mean_fx[i] / 2.56; + st->mem_MA[i] = st->mem_MA_fx[i] / 2.56; + st->mem_AR[i] = st->mem_AR_fx[i] / 2.56; + } +#else + lsf_enc( st, lsf_new, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, st->GSC_IVAS_mode, tdm_lsfQ_PCh ); +#endif + } + else + { + const float *pt_interp_2; + + if ( st->active_cnt != 1 ) + { + int16_t beta_index; + float lsf_wgts[M]; + + /* intra_frame prediction for the LSFs */ + lsp2lsf( lsp_new, lsf_new, M, 12800 ); + + Unified_weighting( &st->Bin_E[L_FFT / 2], lsf_new, lsf_wgts, st->bwidth == NB, st->coder_type == UNVOICED, st->sr_core, M ); + + tdm_SCh_lsf_reuse( ENC, st->element_brate, lsf_new, lsp_new, tdm_lsfQ_PCh, lsf_wgts, &beta_index ); + + push_indice( hBstr, IND_IC_LSF_PRED, beta_index, TDM_IC_LSF_PRED_BITS ); + } + + pt_interp_2 = interpol_frac_12k8; + if ( tdm_low_rate_mode == 1 && st->coder_type > UNVOICED ) + { + pt_interp_2 = interpol_frac2; + } + + if ( st->active_cnt == 1 ) + { + mvr2r( lsp_new, st->lsp_old, M ); + lsp2lsf( lsp_new, st->lsf_old, M, st->sr_core ); + lsp2lsf( lsp_new, lsf_new, M, st->sr_core ); + } + + /* LSP interpolation and conversion of LSPs to A(z) */ + int_lsp( st->L_frame, st->lsp_old, lsp_new, Aq, M, pt_interp_2, 0 ); + + /* Check LSF stability (distance between old LSFs and current LSFs) */ + st->stab_fac = lsf_stab( lsf_new, st->lsf_old, 0, st->L_frame ); + } + + if ( st->last_core == HQ_CORE && st->element_mode > EVS_MONO ) + { + /* Prepare ACB memory from last HQ frame */ + tmpF = hLPDmem->old_exc_flt[0]; + preemph( hLPDmem->old_exc_flt, st->preemph_fac_flt, st->L_frame, &tmpF ); + mvr2r( hLPDmem->old_exc_flt + st->L_frame - M, hLPDmem->mem_syn_flt, M ); + residu( Aq, M, hLPDmem->old_exc_flt, old_exc_flt, st->L_frame ); + } + + if ( st->last_core != ACELP_CORE && st->element_mode > EVS_MONO ) + { + /* Prepare ACB memory of old_bwe_exc */ + if ( st->L_frame == L_FRAME ) + { + lerp_flt( old_exc_flt, old_bwe_exc, L_EXC_MEM_DEC * HIBND_ACB_L_FAC, L_EXC_MEM_DEC ); + } + else + { + lerp_flt( old_exc_flt, old_bwe_exc, L_EXC_MEM_DEC * 2, L_EXC_MEM_DEC ); + } + } + + + /*---------------------------------------------------------------* + * Calculation of LP residual (filtering through A[z] filter) + *---------------------------------------------------------------*/ +#if 0 + floatToFixed_arr(Aq, Aq_fx, 12, NB_SUBFR16k*(M + 1)); + calc_residu_fx(st, inp_fx, res_fx, Aq_fx); +#else + calc_residu( inp, res, Aq, st->L_frame ); +#endif + calculate_hangover_attenuation_gain( st, &att, vad_hover_flag ); + if ( att != 1.0f ) + { + v_multc( res, att, res, st->L_frame ); + } + + /*-----------------------------------------------------------------* + * Determine TC subframe classification + *-----------------------------------------------------------------*/ + + if ( st->coder_type == TRANSITION ) + { + tc_classif_enc( st->L_frame, &tc_subfr, &position, attack_flag, st->pitch[0], res ); + + config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + } + + /*---------------------------------------------------------------* + * Calculation of prediction for scaled innovation energy + * (for memory-less gain quantizer) + *---------------------------------------------------------------*/ +#if 0 + Es_pred_fx = Es_pred * (1 << 8); + IF(nb_bits > 0) + { + Es_pred_enc_fx(&Es_pred_fx, &i, st->L_frame, res_fx, st->voicing_fx, nb_bits, uc_two_stage_flag, 0); + push_indice(hBstr, IND_ES_PRED, i, nb_bits); + } + + Es_pred = (float)Es_pred_fx / (1 << 8); +#else + if ( nb_bits > 0 ) + { + Es_pred_enc( &Es_pred, &i, st->L_frame, L_SUBFR, res, st->voicing, nb_bits, uc_two_stage_flag ); + push_indice( hBstr, IND_ES_PRED, i, nb_bits ); + } +#endif + /*------------------------------------------------------------* + * Encode excitation according to coding type + *------------------------------------------------------------*/ + + if ( tdm_low_rate_mode ) /* tdm stereo low rate mode */ + { + if ( st->coder_type <= UNVOICED ) + { + tdm_low_rate_enc( st, Aq, res, syn, exc, pitch_buf, voice_factors, bwe_exc, 0 /*attack_flag*/, lsf_new, &tmp_noise ); + } + else /* GENERIC */ + { + encod_gen_2sbfr( st, inp, Aw, Aq, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + } + } + else if ( nelp_mode ) + { + /* SC-VBR - NELP frames */ + encod_nelp( st, inp, Aw, Aq, res, syn, &tmp_noise, exc, exc2, pitch_buf, voice_factors, bwe_exc ); + } + else if ( st->coder_type == UNVOICED ) + { + /* UNVOICED frames (Gauss. excitation) */ + encod_unvoiced( st, inp, Aw, Aq, Es_pred, uc_two_stage_flag, res, syn, &tmp_noise, exc, pitch_buf, voice_factors, bwe_exc ); + } + else if ( st->coder_type == TRANSITION ) + { + encod_tran( st, inp, Aw, Aq, Es_pred, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc, tc_subfr, position, unbits ); + } + else if ( ppp_mode ) + { + /* SC-VBR - PPP frames */ + if ( ( error = encod_ppp( st, inp, Aw, Aq, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc ) ) != IVAS_ERR_OK ) + { + return error; + } + + + if ( st->hSC_VBR->bump_up ) /* PPP failed, bump up */ + { + /* restore memories of LSF quantizer and synthesis filter */ + lsf_syn_mem_restore( st, tilt_code_bck, gc_threshold_bck, clip_var_bck, next_force_sf_bck, lsp_new, lsp_mid, clip_var, mem_AR, mem_MA, lsp_new_bck, lsp_mid_bck, Bin_E, Bin_E_old, mem_syn_bck, mem_w0_bck, streaklimit, pstreaklen ); + + /* Configure ACELP bit allocation */ + config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + + /* redo LSF quantization */ + lsf_enc( st, lsf_new, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, 0, NULL ); + + /* recalculation of LP residual (filtering through A[z] filter) */ + calc_residu( inp, res, Aq, st->L_frame ); + st->hTdCngEnc->burst_ho_cnt = 0; + + /* VOICED frames in SC-VBR */ + encod_gen_voic( st, inp, Aw, Aq, Es_pred, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc, unbits, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + } + } + else if ( st->coder_type == AUDIO || ( st->coder_type == INACTIVE && st->inactive_coder_type_flag ) ) + { + /* AUDIO and INACTIVE frames (coded by GSC technology) */ + encod_audio( st, inp, Aw, Aq, res, syn, exc, pitch_buf, voice_factors, bwe_exc, attack_flag, lsf_new, &tmp_noise, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + } + else + { + /* GENERIC, VOICED and INACTIVE frames (coded by AVQ technology) */ + encod_gen_voic( st, inp, Aw, Aq, Es_pred, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc, unbits, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + } + + /* update mem_syn1_flt for ACELP core switching */ + mvr2r( hLPDmem->mem_syn_flt, hLPDmem->mem_syn1_flt, M ); + + Copy(hLPDmem->mem_syn, hLPDmem->mem_syn1_fx, M); + + /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ + mvr2r( syn + st->L_frame - L_SYN_MEM, hLPDmem->mem_syn_r_flt, L_SYN_MEM ); + + Copy(syn_fx + st->L_frame - L_SYN_MEM, hLPDmem->mem_syn_r, L_SYN_MEM); + /* save and delay synthesis to be used by SWB BWE */ +#if 1 + floatToFixed_arr(hLPDmem->mem_syn_r, hLPDmem->mem_syn_r_flt, 0, L_SYN_MEM); + floatToFixed_arr(hLPDmem->mem_syn1_fx, hLPDmem->mem_syn1_flt, 0, M); +#endif +#if 0 + floatToFixed_arr(st->hBWE_FD->old_syn_12k8_16k, st->hBWE_FD->old_syn_12k8_16k_fx, 0, 36); + floatToFixed_arr(syn, syn_fx, -1, L_FRAME16k); + st->hBWE_FD->mem_deemph_old_syn_fx = st->hBWE_FD->mem_deemph_old_syn; + st->preemph_fac = st->preemph_fac_flt * (1 << 15); + + save_old_syn_fx(st->L_frame, syn_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx); + + fixedToFloat_arr(old_syn_12k8_16k_fx, old_syn_12k8_16k, -1, 320); + fixedToFloat_arr(st->hBWE_FD->old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k, 0, 36); + st->hBWE_FD->mem_deemph_old_syn = st->hBWE_FD->mem_deemph_old_syn_fx; +#else + if ( st->hBWE_FD != NULL ) + { + save_old_syn( st->L_frame, syn, old_syn_12k8_16k, st->hBWE_FD->old_syn_12k8_16k, st->preemph_fac_flt, &st->hBWE_FD->mem_deemph_old_syn ); + } +#endif + /*Update MODE2 core switching memory*/ + mvr2r( syn, syn1, st->L_frame ); +#if 0 + deemph(syn1, st->preemph_fac_flt, st->L_frame, &(hLPDmem->syn_flt[M])); +#else + deemph( syn1, st->preemph_fac_flt, st->L_frame, &( hLPDmem->syn_flt[M] ) ); +#endif + mvr2r( syn1 + st->L_frame - M - 1, hLPDmem->syn_flt, M + 1 ); + + if ( st->element_mode > EVS_MONO && st->hTcxEnc != NULL ) + { + mvr2r( syn1 + st->L_frame / 2, st->hTcxEnc->Txnq_flt, st->L_frame / 2 ); + } + + /*--------------------------------------------------------------------------------------* + * Modify the excitation signal when the noise is stationary + *--------------------------------------------------------------------------------------*/ + + if ( !( st->idchan == 1 && st->element_mode == IVAS_CPE_TD ) && nelp_mode != 1 && !( st->element_mode == IVAS_SCE && tdm_low_rate_mode ) ) + { + /* exc2 buffer is needed only for updating of Aq[] which is needed for core switching */ + mvr2r( exc, exc2, st->L_frame ); + stat_noise_uv_enc( st, epsP, lsp_new, lsp_mid, Aq, exc2, uc_two_stage_flag ); + } + + /*-----------------------------------------------------------------* + * Encode supplementary information for Frame Error Concealment + *-----------------------------------------------------------------*/ + + FEC_encode( hBstr, st->acelp_cfg, syn, st->coder_type, st->clas, pitch_buf, res, &st->Last_pulse_pos, st->L_frame, st->total_brate ); + + if ( st->hBWE_TD != NULL ) + { + if ( st->L_frame == L_FRAME ) + { + mvr2r( Aq + 2 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq, ( M + 1 ) ); + } + else + { + mvr2r( Aq + 3 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq, ( M + 1 ) ); + } + } + +#endif + } /* end of active inp coding */ +#else + else + { + /*-----------------------------------------------------------------* + * Configure ACELP bit allocation + *-----------------------------------------------------------------*/ + + nb_bits = 0; + st->acelp_cfg.FEC_mode = 0; + uc_two_stage_flag = 0; + + if ( !nelp_mode && !ppp_mode ) + { + config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + } + + /*-----------------------------------------------------------------* + * After inactive period, use the most up-to-date ISPs + *-----------------------------------------------------------------*/ + + if ( st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_2k40 ) + { + mvr2r( st->hDtxEnc->lspCNG, st->lsp_old, M ); + lsp2lsf( st->hDtxEnc->lspCNG, st->lsf_old, M, int_fs ); + } + + /*-----------------------------------------------------------------* + * Reset higher ACELP pre-quantizer in case of switching + *-----------------------------------------------------------------*/ + + if ( !st->use_acelp_preq ) + { + st->mem_deemp_preQ = 0.0f; + st->mem_preemp_preQ = 0.0f; + st->last_code_preq = 0; + st->last_nq_preQ = 0; + } + st->use_acelp_preq = 0; + + /*-----------------------------------------------------------------* + * LSF Quantization + * A[z] calculation + *-----------------------------------------------------------------*/ + + /* SC-VBR & channel-aware mode - back-up memories for LSF quantizer and synthesis filter */ + lsf_syn_mem_backup( st, &tilt_code_bck, &gc_threshold_bck, clip_var_bck, &next_force_sf_bck, lsp_new, lsp_mid, &clip_var, mem_AR, mem_MA, lsp_new_bck, lsp_mid_bck, Bin_E, Bin_E_old, mem_syn_bck, &mem_w0_bck, &streaklimit, &pstreaklen ); + + if ( !tdm_lp_reuse_flag ) + { + lsf_enc( st, lsf_new, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, st->GSC_IVAS_mode, tdm_lsfQ_PCh ); + } + else + { + const float *pt_interp_2; + + if ( st->active_cnt != 1 ) + { + int16_t beta_index; + float lsf_wgts[M]; + + /* intra_frame prediction for the LSFs */ + lsp2lsf( lsp_new, lsf_new, M, 12800 ); + + Unified_weighting( &st->Bin_E[L_FFT / 2], lsf_new, lsf_wgts, st->bwidth == NB, st->coder_type == UNVOICED, st->sr_core, M ); +#ifdef IVAS_FLOAT_FIXED + Word16 lsf_new_fx[M]; + Word16 lsp_new_fx[M]; + Word16 tdm_lsfQ_PCh_fx[M]; + Word16 lsf_wgts_fx[M]; + for ( int ii = 0; ii < M; ii++ ) + { + lsf_new_fx[ii] = (Word16) ( ( lsf_new[ii] ) * 2.56f ); + tdm_lsfQ_PCh_fx[ii] = (Word16) ( ( tdm_lsfQ_PCh[ii] ) * 2.56f ); + lsf_wgts_fx[ii] = (Word16) ( ( lsf_wgts[ii] ) * 2.56f ); + } + floatToFixed_arr( lsp_new, lsp_new_fx, 15, M ); + + tdm_SCh_lsf_reuse_fx( ENC, st->element_brate, lsf_new_fx, lsp_new_fx, tdm_lsfQ_PCh_fx, lsf_wgts_fx, &beta_index ); + + for ( int ii = 0; ii < M; ii++ ) + { + lsf_new[ii] = (Word16) ( ( lsf_new_fx[ii] ) / 2.56f ); + lsf_wgts[ii] = (Word16) ( ( lsf_wgts_fx[ii] ) / 2.56f ); + } + fixedToFloat_arr( lsp_new_fx, lsp_new, 15, M ); +#else + tdm_SCh_lsf_reuse( ENC, st->element_brate, lsf_new, lsp_new, tdm_lsfQ_PCh, lsf_wgts, &beta_index ); +#endif + push_indice( hBstr, IND_IC_LSF_PRED, beta_index, TDM_IC_LSF_PRED_BITS ); + } + + pt_interp_2 = interpol_frac_12k8; + if ( tdm_low_rate_mode == 1 && st->coder_type > UNVOICED ) + { + pt_interp_2 = interpol_frac2; + } + + if ( st->active_cnt == 1 ) + { + mvr2r( lsp_new, st->lsp_old, M ); + lsp2lsf( lsp_new, st->lsf_old, M, st->sr_core ); + lsp2lsf( lsp_new, lsf_new, M, st->sr_core ); + } + + /* LSP interpolation and conversion of LSPs to A(z) */ + int_lsp( st->L_frame, st->lsp_old, lsp_new, Aq, M, pt_interp_2, 0 ); + + /* Check LSF stability (distance between old LSFs and current LSFs) */ + st->stab_fac = lsf_stab( lsf_new, st->lsf_old, 0, st->L_frame ); + } + + if ( st->last_core == HQ_CORE && st->element_mode > EVS_MONO ) + { + /* Prepare ACB memory from last HQ frame */ + tmpF = hLPDmem->old_exc_flt[0]; + preemph( hLPDmem->old_exc_flt, st->preemph_fac_flt, st->L_frame, &tmpF ); + mvr2r( hLPDmem->old_exc_flt + st->L_frame - M, hLPDmem->mem_syn_flt, M ); + residu( Aq, M, hLPDmem->old_exc_flt, old_exc_flt, st->L_frame ); + } + + if ( st->last_core != ACELP_CORE && st->element_mode > EVS_MONO ) + { + /* Prepare ACB memory of old_bwe_exc */ + if ( st->L_frame == L_FRAME ) + { + lerp_flt( old_exc_flt, old_bwe_exc, L_EXC_MEM_DEC * HIBND_ACB_L_FAC, L_EXC_MEM_DEC ); + } + else + { + lerp_flt( old_exc_flt, old_bwe_exc, L_EXC_MEM_DEC * 2, L_EXC_MEM_DEC ); + } + } + + + /*---------------------------------------------------------------* + * Calculation of LP residual (filtering through A[z] filter) + *---------------------------------------------------------------*/ + + calc_residu( inp, res, Aq, st->L_frame ); + + calculate_hangover_attenuation_gain( st, &att, vad_hover_flag ); + if ( att != 1.0f ) + { + v_multc( res, att, res, st->L_frame ); + } + + /*-----------------------------------------------------------------* + * Determine TC subframe classification + *-----------------------------------------------------------------*/ + + if ( st->coder_type == TRANSITION ) + { + tc_classif_enc( st->L_frame, &tc_subfr, &position, attack_flag, st->pitch[0], res ); + + config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + } + + /*---------------------------------------------------------------* + * Calculation of prediction for scaled innovation energy + * (for memory-less gain quantizer) + *---------------------------------------------------------------*/ + + if ( nb_bits > 0 ) + { + Es_pred_enc( &Es_pred, &i, st->L_frame, L_SUBFR, res, st->voicing, nb_bits, uc_two_stage_flag ); + push_indice( hBstr, IND_ES_PRED, i, nb_bits ); + } + + /*------------------------------------------------------------* + * Encode excitation according to coding type + *------------------------------------------------------------*/ + + if ( tdm_low_rate_mode ) /* tdm stereo low rate mode */ + { + if ( st->coder_type <= UNVOICED ) + { + tdm_low_rate_enc( st, Aq, res, syn, exc, pitch_buf, voice_factors, bwe_exc, 0 /*attack_flag*/, lsf_new, &tmp_noise ); + } + else /* GENERIC */ + { + encod_gen_2sbfr( st, inp, Aw, Aq, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + } + } + else if ( nelp_mode ) + { + /* SC-VBR - NELP frames */ + encod_nelp( st, inp, Aw, Aq, res, syn, &tmp_noise, exc, exc2, pitch_buf, voice_factors, bwe_exc ); + } + else if ( st->coder_type == UNVOICED ) + { + /* UNVOICED frames (Gauss. excitation) */ + encod_unvoiced( st, inp, Aw, Aq, Es_pred, uc_two_stage_flag, res, syn, &tmp_noise, exc, pitch_buf, voice_factors, bwe_exc ); + } + else if ( st->coder_type == TRANSITION ) + { + encod_tran( st, inp, Aw, Aq, Es_pred, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc, tc_subfr, position, unbits ); + } + else if ( ppp_mode ) + { + /* SC-VBR - PPP frames */ + if ( ( error = encod_ppp( st, inp, Aw, Aq, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc ) ) != IVAS_ERR_OK ) + { + return error; + } + + + if ( st->hSC_VBR->bump_up ) /* PPP failed, bump up */ + { + /* restore memories of LSF quantizer and synthesis filter */ + lsf_syn_mem_restore( st, tilt_code_bck, gc_threshold_bck, clip_var_bck, next_force_sf_bck, lsp_new, lsp_mid, clip_var, mem_AR, mem_MA, lsp_new_bck, lsp_mid_bck, Bin_E, Bin_E_old, mem_syn_bck, mem_w0_bck, streaklimit, pstreaklen ); + + /* Configure ACELP bit allocation */ + config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + + /* redo LSF quantization */ + lsf_enc( st, lsf_new, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, 0, NULL ); + + /* recalculation of LP residual (filtering through A[z] filter) */ + calc_residu( inp, res, Aq, st->L_frame ); + st->hTdCngEnc->burst_ho_cnt = 0; + + /* VOICED frames in SC-VBR */ + encod_gen_voic( st, inp, Aw, Aq, Es_pred, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc, unbits, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + } + } + else if ( st->coder_type == AUDIO || ( st->coder_type == INACTIVE && st->inactive_coder_type_flag ) ) + { + /* AUDIO and INACTIVE frames (coded by GSC technology) */ + encod_audio( st, inp, Aw, Aq, res, syn, exc, pitch_buf, voice_factors, bwe_exc, attack_flag, lsf_new, &tmp_noise, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + } + else + { + /* GENERIC, VOICED and INACTIVE frames (coded by AVQ technology) */ + encod_gen_voic( st, inp, Aw, Aq, Es_pred, res, syn, exc, exc2, pitch_buf, voice_factors, bwe_exc, unbits, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + } + + + /* update mem_syn1_flt for ACELP core switching */ + mvr2r( hLPDmem->mem_syn_flt, hLPDmem->mem_syn1_flt, M ); + + /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ + mvr2r( syn + st->L_frame - L_SYN_MEM, hLPDmem->mem_syn_r_flt, L_SYN_MEM ); + + /* save and delay synthesis to be used by SWB BWE */ + if ( st->hBWE_FD != NULL ) + { + save_old_syn( st->L_frame, syn, old_syn_12k8_16k, st->hBWE_FD->old_syn_12k8_16k, st->preemph_fac_flt, &st->hBWE_FD->mem_deemph_old_syn ); + } + + /*Update MODE2 core switching memory*/ + mvr2r( syn, syn1, st->L_frame ); + deemph( syn1, st->preemph_fac_flt, st->L_frame, &( hLPDmem->syn_flt[M] ) ); + mvr2r( syn1 + st->L_frame - M - 1, hLPDmem->syn_flt, M + 1 ); + + if ( st->element_mode > EVS_MONO && st->hTcxEnc != NULL ) + { + mvr2r( syn1 + st->L_frame / 2, st->hTcxEnc->Txnq_flt, st->L_frame / 2 ); + } + + /*--------------------------------------------------------------------------------------* + * Modify the excitation signal when the noise is stationary + *--------------------------------------------------------------------------------------*/ + + if ( !( st->idchan == 1 && st->element_mode == IVAS_CPE_TD ) && nelp_mode != 1 && !( st->element_mode == IVAS_SCE && tdm_low_rate_mode ) ) + { + /* exc2 buffer is needed only for updating of Aq[] which is needed for core switching */ + mvr2r( exc, exc2, st->L_frame ); + stat_noise_uv_enc( st, epsP, lsp_new, lsp_mid, Aq, exc2, uc_two_stage_flag ); + } + + /*-----------------------------------------------------------------* + * Encode supplementary information for Frame Error Concealment + *-----------------------------------------------------------------*/ + + FEC_encode( hBstr, st->acelp_cfg, syn, st->coder_type, st->clas, pitch_buf, res, &st->Last_pulse_pos, st->L_frame, st->total_brate ); + + if ( st->hBWE_TD != NULL ) + { + if ( st->L_frame == L_FRAME ) + { + mvr2r( Aq + 2 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq, ( M + 1 ) ); + } + else + { + mvr2r( Aq + 3 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq, ( M + 1 ) ); + } + } + + + } /* end of active inp coding */ +#endif + + /*-----------------------------------------------------------------* + * Write ACELP unused bits + *-----------------------------------------------------------------*/ + + if ( st->core_brate != SID_2k40 && st->core_brate != FRAME_NO_DATA && st->core_brate != PPP_NELP_2k80 ) + { + nBits = st->acelp_cfg.ubits; + + while ( nBits > 0 ) + { + i = min( nBits, 16 ); + push_indice( hBstr, IND_UNUSED, 0, i ); + nBits -= i; + } + } + + /*-----------------------------------------------------------------* + * Apply non linearity in case of SWB TBE + *-----------------------------------------------------------------*/ + + if ( st->hBWE_TD != NULL ) + { + if ( ( st->last_Opt_SC_VBR == 1 && st->Opt_SC_VBR == 0 ) || ( ( st->extl == SWB_TBE || st->extl == WB_TBE || st->extl == FB_TBE ) && st->last_extl != SWB_TBE && st->last_extl != WB_TBE && st->last_extl != FB_TBE ) || ( st->idchan == 1 && st->element_mode == IVAS_CPE_TD && !st->tdm_LRTD_flag ) ) + { + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; + set_f( st->hBWE_TD->old_bwe_exc_extended, 0.0f, NL_BUFF_OFFSET ); + } + + if ( !st->Opt_SC_VBR && ( st->idchan == 0 || st->element_mode != IVAS_CPE_TD || ( st->idchan == 1 && st->element_mode == IVAS_CPE_TD && st->tdm_LRTD_flag ) ) ) + { + /* Apply a non linearity to the SHB excitation */ + non_linearity( bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame ); + } + + if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) + { + st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f; + } + } + + /*-----------------------------------------------------------------* + * Updates + *-----------------------------------------------------------------*/ + + updt_enc( st, old_exc_flt, pitch_buf, Es_pred, Aq, lsf_new, lsp_new, old_bwe_exc ); + + if ( st->hTdCngEnc != NULL && st->Opt_DTX_ON && st->core_brate > SID_2k40 ) + { + /* update CNG parameters in active frames */ + cng_params_upd( lsp_new, exc, st->L_frame, &st->hTdCngEnc->ho_circ_ptr, st->hTdCngEnc->ho_ener_circ, &st->hTdCngEnc->ho_circ_size, st->hTdCngEnc->ho_lsp_circ, ENC, st->hTdCngEnc->ho_env_circ, &st->hTdCngEnc->cng_buf_cnt, st->hTdCngEnc->cng_exc2_buf_flt, st->hTdCngEnc->cng_brate_buf, st->hDtxEnc->last_active_brate, st->element_mode, st->hFdCngEnc->hFdCngCom->CngBandwidth ); + + if ( st->L_frame == L_FRAME ) + { + /* store LSPs@16k, potentially to be used in CNG@16k */ + mvr2r( st->lsp_old16k, &( st->hTdCngEnc->ho_lsp_circ2[( st->hTdCngEnc->ho_circ_ptr ) * M] ), M ); + } + + /* set LSP@16k flag for the first buffer */ + st->hTdCngEnc->ho_16k_lsp[st->hTdCngEnc->ho_circ_ptr] = ( st->L_frame == L_FRAME ? 0 : 1 ); + + /* efficient DTX hangover control */ + if ( st->hTdCngEnc->burst_ho_cnt > 1 ) + { + dtx_hangover_control( st, lsp_new ); + } + } + + /* SC-VBR update of average data rate */ + if ( st->vad_flag == 1 ) + { + /* reset in case of bitrate switching in EVS */ + if ( st->hSC_VBR != NULL ) + { + update_average_rate( st->hSC_VBR, st->core_brate ); + } + } + + pop_wmops(); + return error; +} +#else ivas_error acelp_core_enc( Encoder_State *st, /* i/o: encoder state structure */ const float inp[], /* i : input signal of the current frame */ @@ -726,3 +2191,4 @@ ivas_error acelp_core_enc( return error; } +#endif \ No newline at end of file diff --git a/lib_enc/amr_wb_enc_fx.c b/lib_enc/amr_wb_enc_fx.c index 3f5ddbb4b..0fd37dd5d 100644 --- a/lib_enc/amr_wb_enc_fx.c +++ b/lib_enc/amr_wb_enc_fx.c @@ -255,8 +255,8 @@ void amr_wb_enc_fx( /*----------------------------------------------------------------* * Change the sampling frequency to 12.8 kHz *----------------------------------------------------------------*/ - - modify_Fs_fx( st->input_fx, input_frame, st->input_Fs, new_inp, 12800, st->mem_decim_fx, 0 ); + Word16 Q_new_inp, mem_decim_size; // TO be removed + modify_Fs_fx( st->input_fx, input_frame, st->input_Fs, new_inp, 12800, st->mem_decim_fx, 0, &Q_new_inp, &mem_decim_size ); /* update signal buffer */ Copy( new_inp, st->buf_speech_enc + L_FRAME, L_FRAME ); @@ -459,7 +459,7 @@ void amr_wb_enc_fx( } ELSE IF( EQ_32( st->input_Fs, 32000 ) || EQ_32( st->input_Fs, 48000 ) ) { - modify_Fs_fx( st->input_fx, input_frame, st->input_Fs, new_inp_16k, 16000, st->mem_decim16k_fx, 0 ); + modify_Fs_fx( st->input_fx, input_frame, st->input_Fs, new_inp_16k, 16000, st->mem_decim16k_fx, 0, &Q_new_inp, &mem_decim_size ); } /*----------------------------------------------------------------* diff --git a/lib_enc/bw_detect_fx.c b/lib_enc/bw_detect_fx.c index eb3e62ddf..2496d54d3 100644 --- a/lib_enc/bw_detect_fx.c +++ b/lib_enc/bw_detect_fx.c @@ -312,16 +312,14 @@ void bw_detect_fx( } ELSE { -#ifdef IVAS_CODE_DFT - l_frame = (int16_t) ( st->input_Fs / FRAMES_PER_SEC ); - if ( st->core == TCX_10_CORE ) + Word16 l_frame = (int16_t) ( st->input_Fs / FRAMES_PER_SEC ); + IF( EQ_16( st->core, TCX_10_CORE ) ) { - l_frame /= 2; + l_frame = shr( l_frame, 1 ); } - bin_width *= ( l_frame / BWD_TOTAL_WIDTH ); - mvr2r( spectrum, spect, l_frame ); -#endif + bin_width = i_mult( bin_width, l_frame / BWD_TOTAL_WIDTH ); + Copy( spectrum, spect, l_frame ); } /*---------------------------------------------------------------------* * compute energy per spectral bins diff --git a/lib_enc/cng_enc_fx.c b/lib_enc/cng_enc_fx.c index 401eb6412..c037a4c34 100644 --- a/lib_enc/cng_enc_fx.c +++ b/lib_enc/cng_enc_fx.c @@ -759,7 +759,8 @@ void CNG_enc_fx( IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) { - modify_Fs_fx( fft_io, L_FRAME16k, 16000, fft_io, 12800, hTdCngEnc->exc_mem2_fx, 0 ); + Word16 Q_new_inp, mem_decim_size; // TO be removed + modify_Fs_fx( fft_io, L_FRAME16k, 16000, fft_io, 12800, hTdCngEnc->exc_mem2_fx, 0, &Q_new_inp, &mem_decim_size ); } fft_rel_fx( fft_io, L_FFT, LOG2_L_FFT ); diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index c5d5a39a5..02550d2bb 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -41,6 +41,7 @@ #include "rom_enc.h" #include "prot.h" #include "ivas_prot.h" +#include "prot_fx2.h" #include "ivas_cnst.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED @@ -162,7 +163,11 @@ ivas_error init_encoder( st->mem_preemph = 0.0f; st->mem_preemph16k = 0.0f; st->mem_preemph_enc_flt = 0.0; - +#ifdef IVAS_FLOAT_FIXED + st->mem_preemph_fx = 0; + st->mem_preemph16k_fx = 0; + st->mem_preemph_enc = 0; +#endif /* AVQ pre-quantizer memory */ st->mem_preemp_preQ = 0.0f; st->mem_deemp_preQ = 0.0f; @@ -233,9 +238,13 @@ ivas_error init_encoder( set_f( st->inp_12k8_mem_stereo_sw, 0, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); st->mem_preemph16k_DFT = 0.0f; set_f( st->inp_16k_mem_stereo_sw, 0, STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ); - +#ifdef IVAS_FLOAT_FIXED + st->mem_preemph_DFT_fx = 0; + set16_fx( st->inp_12k8_mem_stereo_sw_fx, 0, sub( sub( STEREO_DFT_OVL_12k8, L_MEM_RECALC_12K8 ), L_FILT ) ); + st->mem_preemph16k_DFT_fx = 0; + set16_fx( st->inp_16k_mem_stereo_sw_fx, 0, sub( sub( STEREO_DFT_OVL_16k, L_MEM_RECALC_16K ), L_FILT16k ) ); st->sharpFlag = 0; - +#endif /* Stationary noise UV modification */ st->ge_sm = 10; st->uv_count = 0; @@ -284,25 +293,53 @@ ivas_error init_encoder( } st->Bin_E_old = st->hSignalBuf->Bin_E_old_flt; +#ifdef IVAS_FLOAT_FIXED + st->Bin_E_old_fx = st->hSignalBuf->Bin_E_old_fx; +#endif st->mem_decim = st->hSignalBuf->mem_decim_flt; st->mem_decim16k = st->hSignalBuf->mem_decim16k_flt; st->old_inp_12k8 = st->hSignalBuf->old_inp_12k8_flt; st->old_inp_16k = st->hSignalBuf->old_inp_16k_flt; +#ifdef IVAS_FLOAT_FIXED + st->Bin_E_old_fx = st->hSignalBuf->Bin_E_old_fx; + st->old_inp_12k8_fx = st->hSignalBuf->old_inp_12k8_fx; + st->old_inp_16k_fx = st->hSignalBuf->old_inp_16k_fx; + st->mem_decim_fx = st->hSignalBuf->mem_decim_fx; +#endif st->buf_speech_enc_pe_flt = st->hSignalBuf->buf_speech_enc_pe_flt; st->buf_synth_flt = st->hSignalBuf->buf_synth_flt; st->buf_speech_enc_flt = st->hSignalBuf->buf_speech_enc_flt; st->buf_wspeech_enc_flt = st->hSignalBuf->buf_wspeech_enc_flt; +#ifdef IVAS_FLOAT_FIXED + st->buf_speech_enc_pe = st->hSignalBuf->buf_speech_enc_pe; + st->buf_synth = st->hSignalBuf->buf_synth; + st->buf_speech_enc = st->hSignalBuf->buf_speech_enc; + st->buf_wspeech_enc = st->hSignalBuf->buf_wspeech_enc; +#endif /* initializations */ set_f( st->Bin_E_old, 0, L_FFT / 2 ); +#ifdef IVAS_FLOAT_FIXED + set32_fx( st->Bin_E_old_fx, 0, L_FFT / 2 ); +#endif set_f( st->mem_decim, 0, 2 * L_FILT_MAX ); set_f( st->mem_decim16k, 0, 2 * L_FILT_MAX ); set_f( st->old_inp_12k8, 0, L_INP_MEM ); set_f( st->old_inp_16k, 0, L_INP_MEM ); - +#ifdef IVAS_FLOAT_FIXED + set32_fx( st->Bin_E_old_fx, 0, L_FFT / 2 ); + set16_fx( st->old_inp_12k8_fx, 0, L_INP_MEM ); + set16_fx( st->old_inp_16k_fx, 0, L_INP_MEM ); + set16_fx( st->mem_decim_fx, 0, 2 * L_FILT_MAX ); +#endif st->input_buff = st->hSignalBuf->input_buff_flt; set_zero( st->input_buff, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ); st->old_input_signal = st->input_buff; +#ifdef IVAS_FLOAT_FIXED + st->input_buff_fx = st->hSignalBuf->input_buff; + set16_fx( st->input_buff_fx, 0, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ); + st->old_input_signal_fx = st->input_buff_fx; +#endif if ( st->element_mode == EVS_MONO ) { st->input = st->input_buff + st->input_Fs / FRAMES_PER_SEC + NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ); @@ -310,6 +347,9 @@ ivas_error init_encoder( else { st->input = st->input_buff + st->input_Fs / FRAMES_PER_SEC; +#ifdef IVAS_FLOAT_FIXED + st->input_fx = st->input_buff_fx + st->input_Fs / FRAMES_PER_SEC; +#endif } } else @@ -317,12 +357,18 @@ ivas_error init_encoder( st->hSignalBuf = NULL; st->Bin_E_old = NULL; st->mem_decim = NULL; +#ifdef IVAS_FLOAT_FIXED + st->mem_decim_fx = NULL; +#endif st->mem_decim16k = NULL; st->old_inp_12k8 = NULL; st->old_inp_16k = NULL; st->buf_speech_enc_pe_flt = NULL; st->buf_synth_flt = NULL; st->buf_speech_enc_flt = NULL; +#ifdef IVAS_FLOAT_FIXED + st->buf_speech_enc = NULL; +#endif st->buf_wspeech_enc_flt = NULL; st->input_buff = NULL; } @@ -504,7 +550,7 @@ ivas_error init_encoder( if ( ( st->element_mode != IVAS_CPE_MDCT && idchan == 0 ) || ( st->element_mode == IVAS_CPE_MDCT && st->Opt_DTX_ON ) ) { - if ( ( error = openCldfb_ivas( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + if ( ( error = openCldfb_ivas_enc( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) { return error; } @@ -513,7 +559,10 @@ ivas_error init_encoder( { st->cldfbAnaEnc = NULL; } - +#ifdef IVAS_FLOAT_FIXED + st->energyCoreLookahead_Fx = 0; + st->sf_energyCoreLookahead_Fx = 0; +#endif st->currEnergyLookAhead = 6.1e-5f; /*-----------------------------------------------------------------* @@ -605,7 +654,7 @@ ivas_error init_encoder( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); } - if ( ( error = openCldfb_ivas( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + if ( ( error = openCldfb_ivas_enc( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) { return error; } @@ -841,7 +890,9 @@ ivas_error init_encoder( } initFdCngEnc( st->hFdCngEnc, st->input_Fs, st->cldfbAnaEnc->scale_flt ); - +#ifdef IVAS_FLOAT_FIXED + initFdCngEnc_fx( st->hFdCngEnc, st->input_Fs, st->cldfbAnaEnc->scale ); +#endif /* initialization for IVAS modes happens in first frame pre-processing */ if ( st->element_mode == EVS_MONO ) { @@ -879,7 +930,22 @@ ivas_error init_encoder( st->cng_sba_flag = 0; st->bits_frame_channel = 0; st->side_bits_frame_channel = 0; - +#ifdef IVAS_FLOAT_FIXED + st->Q_syn2 = 0; + move16(); + st->Q_syn = 0; + move16(); + set16_fx( st->Q_max, Q_MAX, L_Q_MEM ); + set16_fx( st->Q_max_16k, Q_MAX, L_Q_MEM ); + st->Q_old = 15; + move16(); + st->old_wsp_max = 0; + move16(); + st->old_wsp_shift = 0; + move16(); + st->sharpFlag = 0; + move16(); +#endif return error; } #ifdef IVAS_FLOAT_FIXED @@ -1058,9 +1124,9 @@ ivas_error init_encoder_ivas_fx( /* stereo switching memories */ st->mem_preemph_DFT_fx = 0; - set32_fx( st->inp_12k8_mem_stereo_sw_fx, 0, sub( sub( STEREO_DFT_OVL_12k8, L_MEM_RECALC_12K8 ), L_FILT ) ); + set16_fx( st->inp_12k8_mem_stereo_sw_fx, 0, sub( sub( STEREO_DFT_OVL_12k8, L_MEM_RECALC_12K8 ), L_FILT ) ); st->mem_preemph16k_DFT_fx = 0; - set32_fx( st->inp_16k_mem_stereo_sw_fx, 0, sub( sub( STEREO_DFT_OVL_16k, L_MEM_RECALC_16K ), L_FILT16k ) ); + set16_fx( st->inp_16k_mem_stereo_sw_fx, 0, sub( sub( STEREO_DFT_OVL_16k, L_MEM_RECALC_16K ), L_FILT16k ) ); st->sharpFlag = 0; @@ -1335,7 +1401,7 @@ ivas_error init_encoder_ivas_fx( IF( ( NE_16( st->element_mode, IVAS_CPE_MDCT ) && EQ_16( idchan, 0 ) ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->Opt_DTX_ON ) ) { - IF( ( error = openCldfb_ivas( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + IF( ( error = openCldfb_ivas_enc( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) { return error; } @@ -1436,7 +1502,7 @@ ivas_error init_encoder_ivas_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); } - IF( ( error = openCldfb_ivas( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + IF( ( error = openCldfb_ivas_enc( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) { return error; } @@ -1694,8 +1760,9 @@ ivas_error init_encoder_ivas_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Transient Detection\n" ) ); } - /* (int16_t) ( st->input_Fs / FRAMES_PER_SEC ) */ - Word16 frame_length = extract_l( Mpy_32_32( st->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + Word16 temp; + Word16 frame_length = BASOP_Util_Divide3232_Scale( st->input_Fs, FRAMES_PER_SEC, &temp ); + frame_length = shr( frame_length, sub( 15, temp ) ); IF( GT_16( st->element_mode, EVS_MONO ) ) { @@ -1714,6 +1781,20 @@ ivas_error init_encoder_ivas_fx( st->cng_sba_flag = 0; st->bits_frame_channel = 0; st->side_bits_frame_channel = 0; + st->Q_syn2 = 0; + move16(); + st->Q_syn = 0; + move16(); + set16_fx( st->Q_max, Q_MAX, L_Q_MEM ); + set16_fx( st->Q_max_16k, Q_MAX, L_Q_MEM ); + st->Q_old = 15; + move16(); + st->old_wsp_max = 0; + move16(); + st->old_wsp_shift = 0; + move16(); + st->sharpFlag = 0; + move16(); return error; } diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index d08241540..b103282e9 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -37,6 +37,9 @@ #include "rom_enc.h" #include "rom_com.h" #include "prot.h" +#include "prot_fx1.h" +#include "prot_fx2.h" +#include "prot_fx_enc.h" #include "ivas_prot.h" #include "wmc_auto.h" #include @@ -52,7 +55,16 @@ /*-------------------------------------------------------------------* * Local function prototypes *--------------------------------------------------------------------*/ - +#if 0 +static void change_q( Word16 *buff, Word16 size, Word16 Q ) +{ + Flag Overflow; + for ( Word16 i = 0; i < size; i++ ) + { + buff[i] = shr_o( buff[i], Q, &Overflow ); + } +} +#endif static void calculate_energy_buffer( CPE_ENC_HANDLE hCPE, float enerBuffer_dft[], const int16_t no_channels, const int32_t input_Fs ); #ifdef IVAS_FIXED_ENC static void calculate_energy_buffer_fx( CPE_ENC_HANDLE hCPE, Word64 enerBuffer_dft_fx[], Word16 *enerBuffer_dft_q_fx, const Word16 no_channels, const Word32 input_Fs ); @@ -64,7 +76,6 @@ static void calculate_energy_buffer_fx( CPE_ENC_HANDLE hCPE, Word64 enerBuffer_d * Front Pre-processing for IVAS * (resampling, spectral analysis, LP analysis, VAD, OL pitch calculation, classification) *--------------------------------------------------------------------*/ - ivas_error pre_proc_front_ivas( SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ @@ -836,8 +847,1254 @@ ivas_error pre_proc_front_ivas( pop_wmops(); return error; } +#ifdef IVAS_FLOAT_FIXED +ivas_error pre_proc_front_ivas_fx( + SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + const int32_t element_brate, /* i : SCE/CPE element bitrate */ + const int16_t nb_bits_metadata, /* i : number of metadata bits */ + const int16_t input_frame, /* i : frame length */ + const int16_t n, /* i : channel number */ + float old_inp_12k8[], /* o : buffer of old input signal */ + float old_inp_16k[], /* o : buffer of old input signal @16kHz */ + float *ener, /* o : residual energy from Levinson-Durbin */ + float *relE, /* o : frame relative energy */ + float A[NB_SUBFR16k * ( M + 1 )], /* o : A(z) unquantized for the 4 subframes */ + float Aw[NB_SUBFR16k * ( M + 1 )], /* o : weighted A(z) unquantized for subframes */ + float epsP[M + 1], /* o : LP prediction errors */ + float lsp_new[M], /* o : LSPs at the end of the frame */ + float lsp_mid[M], /* o : LSPs in the middle of the frame */ + int16_t *vad_hover_flag, /* o : VAD hangover flag */ + int16_t *attack_flag, /* o : flag signaling attack */ + float realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer */ + float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer */ + float old_wsp[], /* o : weighted input signal buffer */ + float pitch_fr[NB_SUBFR], /* o : fractional pitch values */ + float voicing_fr[NB_SUBFR], /* o : fractional pitch gains */ + int16_t *loc_harm, /* o : harmonicity flag */ + float *cor_map_sum, /* o : speech/music clasif. parameter */ + int16_t *vad_flag_dtx, /* o : HE-SAD flag with additional DTX HO */ + float enerBuffer[CLDFB_NO_CHANNELS_MAX], /* o : energy buffer */ + float fft_buff[2 * L_FFT], /* o : FFT buffer */ + const float tdm_A_PCh[M + 1], /* i : unq. LP coeff. of primary channel */ + const float tdm_lsp_new_PCh[M], /* i : unq. LSPs of primary channel */ + const float currFlatness, /* i : flatness parameter */ + const int16_t tdm_ratio_idx, /* i : Current Ratio_L index */ + float fr_bands_LR[][2 * NB_BANDS], /* i : energy in frequency bands */ + const float Etot_LR[], /* i : total energy Left & Right channel Q8*/ + float lf_E_LR[][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels */ + const int16_t localVAD_HE_SAD_LR[], /* i : HE-SAD flag without hangover, LR channels */ + float band_energies_LR[2 * NB_BANDS], /* o : energy in critical bands without minimum noise floor E_MIN */ + const int16_t flag_16k_smc, /* i : flag to indicate if the OL SMC is run at 16 kHz */ + const int16_t front_vad_flag, /* i : front-VAD flag to overwrite VAD decision */ + const int16_t force_front_vad, /* i : flag to force VAD decision */ + const int16_t front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision*/ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + const int32_t ivas_total_brate /* i : IVAS total bitrate - for setting the DTX */ +) +{ + float *inp_12k8, *new_inp_12k8; /* pointers to current frame and new data */ + float *wsp; /* weighted input signal buffer */ + float Etot; /* total energy */ + float fr_bands[2 * NB_BANDS]; /* energy in frequency bands */ + float lf_E[2 * VOIC_BINS]; /* per bin spectrum energy in lf */ + float tmpN[NB_BANDS]; /* Temporary noise update */ + float tmpE[NB_BANDS]; /* Temporary averaged energy of 2 sf. */ + float tmpN_LR[CPE_CHANNELS][NB_BANDS]; /* Temporary noise update */ + float tmpE_LR[CPE_CHANNELS][NB_BANDS]; /* Temporary averaged energy of 2 sf. */ + float cor_map_sum_LR[CPE_CHANNELS]; /* speech/music clasif. parameter */ + float non_staX_LR; /* non-stationarity for sp/mus classifier */ + float ncharX_LR; /* noise character for sp/mus classifier */ + float sp_div_LR; /* spectral diversity feature */ + float S_map_LR[L_FFT / 2]; /* short-term correlation map */ + float corr_shiftL; /* correlation shift */ + float corr_shiftR; /* correlation shift */ + int16_t loc_harmLR[CPE_CHANNELS]; /* harmonicity flag */ + int16_t lr_vad_enabled; /* LR VAD indicator */ + float ee[2]; /* Spectral tilt */ + float corr_shift; /* correlation shift */ + float sp_div, PS[128]; /* speech/music clasif. parameters */ + int16_t L_look; /* length of look-ahead */ +#if 1 + float snr_sum_he; /* HE SAD parameters */ +#endif + float mem_decim_dummy[2 * L_FILT_MAX]; /* dummy decimation filter memory */ + float temp1F_icatdmResampBuf[L_FILT_MAX]; /* temp buffers for ICA TDM resamplers */ + float hp_E[2]; /* Energy in HF */ + int16_t flag_spitch; + int16_t high_lpn_flag; + float lsf_new[M]; + float band_energies[2 * NB_BANDS]; /* energy in critical bands without minimum noise floor E_MIN */ + int16_t localVAD_HE_SAD; + float non_staX; + float stab_fac; + int16_t alw_pitch_lag_12k8[2]; + float alw_voicing[2]; + int16_t last_core_orig; + float dummy; + float S_map[L_FFT / 2]; + int16_t i, lMemRecalc, lMemRecalc_12k8; + int16_t smc_dec; + float ncharX, dE1X; + Encoder_State *st; + float *signal_in; + int16_t element_mode; + int32_t input_Fs, last_element_brate; + int16_t *tdm_SM_last_clas, tmpS; + float *res_cod_SNR_M, tmpF[STEREO_DFT_BAND_MAX]; + STEREO_CLASSIF_HANDLE hStereoClassif; + int16_t old_pitch1; /* previous frame OL pitch[1] @12.8 kHz */ + int16_t LR_localVAD; + ivas_error error; + + push_wmops( "pre_proc_front" ); + +#ifdef IVAS_FLOAT_FIXED + Word16 *signal_in_fx; + Word16 *new_inp_12k8_fx; /* pointers to current frame and new data */ + CLDFB_SCALE_FACTOR cldfbScale; + Word32 *enerBuffer_fx; + Word16 enerBuffer_exp; /*[CLDFB_NO_CHANNELS_MAX];*/ + Word16 *temp1F_icatdmResampBuf_fx; + Word16 *old_inp_12k8_fx; + Word16 *old_inp_16k_fx; + Word16 *mem_decim_dummy_fx; /* dummy decimation filter memory */ + Word32 Etot_fx; /* total energy */ +#if 0 + Word32 fr_bands_fx[2 * NB_BANDS]; /* energy in frequency bands */ + Word16 Q_new; + Word16 new_inp_out_size, mem_decim_size; + Word16 snr_sum_he_fx; /* HE SAD parameters */ + Word16 Q_new_inp; + Word16 corr_shift_fx; + Word16 dummy_fx; + Word16 Etot_LR_fx[2]; + Word16 Q_exp; + Word32 Le_min_scaled; + Word32 fr_bands_LR_fx[2][2 * NB_BANDS]; + Word16 relE_fx; + Word32 tmpN_fx[NB_BANDS]; /* Temporary noise update */ + Word32 tmpE_fx[NB_BANDS]; /* Temporary averaged energy of 2 sf. */ + Word32 tmpN_LR_fx[CPE_CHANNELS][NB_BANDS]; /* Temporary noise update */ + Word32 tmpE_LR_fx[CPE_CHANNELS][NB_BANDS]; /* Temporary averaged energy of 2 sf. */ +#endif + + signal_in_fx = (Word16 *) malloc( 2 * 1965 * sizeof( Word16 * ) ); + enerBuffer_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); + old_inp_12k8_fx = (Word16 *) malloc( 496 * sizeof( Word16 * ) ); + old_inp_16k_fx = (Word16 *) malloc( 880 * sizeof( Word16 * ) ); + mem_decim_dummy_fx = (Word16 *) malloc( 90 * sizeof( Word16 * ) ); + temp1F_icatdmResampBuf_fx = (Word16 *) malloc( 45 * sizeof( Word16 * ) ); + + Word16 realBuffer16[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 imagBuffer16[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 realBuffer_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 imagBuffer_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 sf_energySum[CLDFB_NO_CHANNELS_MAX]; + + floatToFixed_arr( old_inp_12k8, old_inp_12k8_fx, 0, 496 ); +#endif + /*------------------------------------------------------------------* + * Initialization + *------------------------------------------------------------------*/ + + error = IVAS_ERR_OK; + + tmpS = 0; + tdm_SM_last_clas = &tmpS; + set_f( tmpF, 0, STEREO_DFT_BAND_MAX ); + res_cod_SNR_M = tmpF; + + LR_localVAD = 0; + + if ( hSCE != NULL ) + { + st = hSCE->hCoreCoder[n]; + signal_in = hSCE->hCoreCoder[n]->input; + element_mode = IVAS_SCE; + last_element_brate = hSCE->last_element_brate; + hStereoClassif = NULL; + lr_vad_enabled = 0; + } + else /* CPE */ + { + st = hCPE->hCoreCoder[n]; + signal_in = hCPE->hCoreCoder[n]->input; + element_mode = hCPE->element_mode; + last_element_brate = hCPE->last_element_brate; + hStereoClassif = hCPE->hStereoClassif; + lr_vad_enabled = 0; + if ( hCPE->hFrontVad[0] != NULL && hCPE->element_mode != IVAS_CPE_MDCT ) + { + lr_vad_enabled = 1; + } + + if ( lr_vad_enabled && n == 0 ) + { + /* Combine localVAD and vad_flag from LR processing */ + LR_localVAD = hCPE->hCoreCoder[0]->localVAD || hCPE->hCoreCoder[1]->localVAD; + } + + if ( hCPE->hStereoTD != NULL ) + { + tdm_SM_last_clas = &hCPE->hStereoTD->tdm_SM_last_clas[n]; + mvs2s( hCPE->hStereoTD->tdm_SM_last_clas, hCPE->hStereoTD->tdm_SM_last2_clas, CPE_CHANNELS ); + } + + if ( hCPE->hStereoDft != NULL ) + { + res_cod_SNR_M = hCPE->hStereoDft->res_cod_SNR_M; + } + } +#if 0 + set32_fx( tmpF_fx, 0, STEREO_DFT_BAND_MAX ); + res_cod_SNR_M_fx = tmpF_fx; + + LR_localVAD = 0; + + IF ( hSCE != NULL ) + { + st = hSCE->hCoreCoder[n]; + signal_in_fx = hSCE->hCoreCoder[n]->input_fx; + element_mode = IVAS_SCE; + last_element_brate = hSCE->last_element_brate; + hStereoClassif = NULL; + lr_vad_enabled = 0; + } + ELSE /* CPE */ + { + st = hCPE->hCoreCoder[n]; + signal_in_fx = hCPE->hCoreCoder[n]->input_fx; + element_mode = hCPE->element_mode; + last_element_brate = hCPE->last_element_brate; + hStereoClassif = hCPE->hStereoClassif; + lr_vad_enabled = 0; + IF ( hCPE->hFrontVad[0] != NULL && NE_16(hCPE->element_mode, IVAS_CPE_MDCT )) + { + lr_vad_enabled = 1; + } + + IF ( lr_vad_enabled && EQ_16(n, 0 )) + { + /* Combine localVAD and vad_flag from LR processing */ + LR_localVAD = hCPE->hCoreCoder[0]->localVAD || hCPE->hCoreCoder[1]->localVAD; + } + + IF ( hCPE->hStereoTD != NULL ) + { + tdm_SM_last_clas = &hCPE->hStereoTD->tdm_SM_last_clas[n]; + Copy( hCPE->hStereoTD->tdm_SM_last_clas, hCPE->hStereoTD->tdm_SM_last2_clas, CPE_CHANNELS ); + } + + IF ( hCPE->hStereoDft != NULL ) + { + res_cod_SNR_M_fx = hCPE->hStereoDft->res_cod_SNR_M_fx; + } + } +#endif + lMemRecalc_12k8 = 0; + lMemRecalc = 0; + IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_MDCT ) ) + { + lMemRecalc = NS2SA( st->input_Fs, L_MEM_RECALC_NS ); + lMemRecalc_12k8 = NS2SA( INT_FS_12k8, L_MEM_RECALC_NS ); + } + + input_Fs = st->input_Fs; + + localVAD_HE_SAD = 0; +#if 1 + snr_sum_he = 0; +#endif + corr_shiftL = 0; + corr_shiftR = 0; +#if 0 + snr_sum_he_fx = 0; +#endif + IF( hSCE != NULL ) + { + *vad_hover_flag = 0; + } + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 0; + st->coder_type = GENERIC; + IF( st->hGSCEnc != NULL ) + { + st->hGSCEnc->noise_lev = NOISE_LEVEL_SP0; + } + *attack_flag = 0; + + IF( st->Opt_SC_VBR ) + { + st->hSC_VBR->bump_up = 0; + st->hSC_VBR->ppp_mode = 0; + st->hSC_VBR->nelp_mode = 0; + st->hSC_VBR->avoid_HQ_VBR_NB = 0; + } + + L_look = L_LOOK_12k8; /* lookahead at 12.8kHz */ + + new_inp_12k8 = old_inp_12k8 + L_INP_MEM; /* pointer to new samples of the input signal in 12.8kHz core */ + inp_12k8 = new_inp_12k8 - L_look; /* pointer to the current frame of input signal in 12.8kHz core */ +#ifdef IVAS_FLOAT_FIXED + new_inp_12k8_fx = old_inp_12k8_fx + L_INP_MEM; /* pointer to new samples of the input signal in 12.8kHz core */ +#if 0 + inp_12k8_fx = new_inp_12k8_fx - L_look; /* pointer to the current frame of input signal in 12.8kHz core */ +#endif +#endif + if ( element_mode != IVAS_CPE_DFT ) + { + new_inp_12k8 -= L_FILT; + } + + if ( element_mode == IVAS_CPE_DFT ) + { + mvr2r( st->old_inp_12k8, old_inp_12k8, L_INP_MEM - STEREO_DFT_OVL_12k8 ); + } + else if ( element_mode == IVAS_CPE_TD ) + { + mvr2r( st->old_inp_12k8, old_inp_12k8, L_INP_MEM - lMemRecalc_12k8 - L_FILT ); + } + else + { + mvr2r( st->old_inp_12k8, old_inp_12k8, L_INP_MEM - L_FILT ); + } + + mvr2r( st->old_wsp, old_wsp, L_WSP_MEM ); + wsp = old_wsp + L_WSP_MEM; /* pointer to the current frame of weighted signal in 12.8kHz core */ + IF( NE_16( element_mode, IVAS_CPE_DFT ) ) + { + new_inp_12k8_fx -= L_FILT; + } +#if 0 + IF(EQ_16(element_mode, IVAS_CPE_DFT)) + { + Copy(st->old_inp_12k8_fx, old_inp_12k8_fx, L_INP_MEM - STEREO_DFT_OVL_12k8); + } + ELSE IF(EQ_16(element_mode, IVAS_CPE_TD)) + { + Copy(st->old_inp_12k8_fx, old_inp_12k8_fx, L_INP_MEM - lMemRecalc_12k8 - L_FILT); + } + ELSE + { + Copy(st->old_inp_12k8_fx, old_inp_12k8_fx, L_INP_MEM - L_FILT); + } + Copy(st->old_wsp, old_wsp, L_WSP_MEM); + wsp = old_wsp + L_WSP_MEM; /* pointer to the current frame of weighted signal in 12.8kHz core */ +#endif + st->rf_mode = st->Opt_RF_ON; + + last_core_orig = st->last_core; + + /*--------------------------------------------------------------* + * energy analysis + *---------------------------------------------------------------*/ + + floatToFixed_arr( signal_in - (Word16) ( input_Fs / 50 ), signal_in_fx, 0, (Word16) ( input_Fs / 25 ) ); + signal_in_fx = signal_in_fx + input_Fs / 50; + IF( EQ_16( element_mode, IVAS_SCE ) || ( EQ_16( element_mode, IVAS_CPE_MDCT ) && st->Opt_DTX_ON ) ) + { + analysisCldfbEncoder_ivas_fx( st, signal_in_fx, realBuffer_fx, imagBuffer_fx, realBuffer16, imagBuffer16, enerBuffer_fx, &enerBuffer_exp, &cldfbScale ); + for ( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + for ( int j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + realBuffer[i][j] = (float) realBuffer_fx[i][j] / ( 1 << ( 16 - cldfbScale.lb_scale ) ); + imagBuffer[i][j] = (float) imagBuffer_fx[i][j] / ( 1 << ( 16 - cldfbScale.lb_scale ) ); + } + } + cldfbScale.hb_scale = cldfbScale.lb_scale; + fixedToFloat_arrL( enerBuffer_fx, enerBuffer, 31 - enerBuffer_exp, 60 ); + } + ELSE IF( ( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( st->idchan, 0 ) ) || ( EQ_16( st->idchan, 1 ) && st->tdm_LRTD_flag ) ) + { + /* cldfb analysis only for pri. channel */ + analysisCldfbEncoder_ivas_fx( st, signal_in_fx - NS2SA( input_Fs, L_MEM_RECALC_TBE_NS ), realBuffer_fx, imagBuffer_fx, realBuffer16, imagBuffer16, enerBuffer_fx, &enerBuffer_exp, &cldfbScale ); + for ( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + for ( int j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + realBuffer[i][j] = (float) realBuffer_fx[i][j] / ( 1 << ( 16 - cldfbScale.lb_scale ) ); + imagBuffer[i][j] = (float) imagBuffer_fx[i][j] / ( 1 << ( 16 - cldfbScale.lb_scale ) ); + } + } + cldfbScale.hb_scale = cldfbScale.lb_scale; + fixedToFloat_arrL( enerBuffer_fx, enerBuffer, 31 - enerBuffer_exp, 60 ); + } + ELSE IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) + { + calculate_energy_buffer( hCPE, enerBuffer, st->cldfbAnaEnc->no_channels, input_Fs ); + f2me_buf( enerBuffer, enerBuffer_fx, &enerBuffer_exp, 60 ); + } + ELSE + { + set32_fx( enerBuffer_fx, 0, CLDFB_NO_CHANNELS_MAX ); + enerBuffer_exp = 31; + } + + /*----------------------------------------------------------------* + * Change the sampling frequency to 12.8 kHz + * (if not available from downsampled DMX) + *----------------------------------------------------------------*/ +#if 0 // Disabled due to high mld -- Scaling needs to be handled. + IF( element_mode == IVAS_SCE ) + { + new_inp_out_size = modify_Fs_fx( signal_in_fx, input_frame, input_Fs, new_inp_12k8_fx, INT_FS_12k8, st->mem_decim_fx, ( st->max_bwidth == NB ), &Q_new_inp, &mem_decim_size ); + + fixedToFloat_arr( new_inp_12k8_fx, new_inp_12k8, Q_new_inp, new_inp_out_size ); // To be removed + fixedToFloat_arr( st->mem_decim_fx, st->mem_decim, 0, mem_decim_size ); // To be removed + + change_q( new_inp_12k8_fx, new_inp_out_size, Q_new_inp ); + + Copy( st->mem_decim_fx, mem_decim_dummy_fx, 2 * L_FILT_MAX ); + + set16_fx( temp1F_icatdmResampBuf_fx, 0, L_FILT_MAX ); + + new_inp_out_size = modify_Fs_fx( temp1F_icatdmResampBuf_fx, NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ), input_Fs, new_inp_12k8_fx + L_FRAME, INT_FS_12k8, mem_decim_dummy_fx, 0, &Q_new_inp, &mem_decim_size ); + + fixedToFloat_arr( new_inp_12k8_fx + L_FRAME, new_inp_12k8 + L_FRAME, Q_new_inp, new_inp_out_size ); // To be removed + change_q( new_inp_12k8_fx + L_FRAME, new_inp_out_size, Q_new_inp ); + } + ELSE IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_MDCT ) ) + { + /* reconstruct past segment of the Secondary channel input signal when switching from DFT stereo */ + IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && EQ_16( st->idchan, 1 ) ) + { + Word16 length_inp = NS2SA( input_Fs, L_MEM_RECALC_SCH_NS ); + Word16 length_12k8 = NS2SA( INT_FS_12k8, L_MEM_RECALC_SCH_NS ); + + new_inp_out_size = modify_Fs_fx( signal_in_fx - lMemRecalc - length_inp, length_inp, input_Fs, new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, INT_FS_12k8, st->mem_decim_fx, 0, &Q_new_inp, &mem_decim_size ); + + fixedToFloat_arr( st->mem_decim_fx, st->mem_decim, 0, mem_decim_size ); // To be removed + fixedToFloat_arr( new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, new_inp_12k8 - lMemRecalc_12k8 - length_12k8, Q_new_inp, new_inp_out_size ); // To be removed + + change_q( new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, new_inp_out_size, Q_new_inp ); + } + + new_inp_out_size = modify_Fs_fx( signal_in_fx - lMemRecalc, input_frame, input_Fs, new_inp_12k8_fx - lMemRecalc_12k8, INT_FS_12k8, st->mem_decim_fx, ( st->max_bwidth == NB ), &Q_new_inp, &mem_decim_size ); + Copy( st->mem_decim_fx, mem_decim_dummy_fx, 2 * L_FILT_MAX ); + fixedToFloat_arr( new_inp_12k8_fx - lMemRecalc_12k8, new_inp_12k8 - lMemRecalc_12k8, Q_new_inp, new_inp_out_size ); // To be removed + fixedToFloat_arr( st->mem_decim_fx, st->mem_decim, 0, mem_decim_size ); // To be removed + + change_q( new_inp_12k8_fx - lMemRecalc_12k8, new_inp_out_size, Q_new_inp ); + + IF( GT_16( lMemRecalc, 0 ) ) + { + new_inp_out_size = modify_Fs_fx( signal_in_fx + input_frame - lMemRecalc, lMemRecalc, input_Fs, new_inp_12k8_fx + L_FRAME - lMemRecalc_12k8, INT_FS_12k8, mem_decim_dummy_fx, ( st->max_bwidth == NB ), &Q_new_inp, &mem_decim_size ); + fixedToFloat_arr( new_inp_12k8_fx + L_FRAME - lMemRecalc_12k8, new_inp_12k8 + L_FRAME - lMemRecalc_12k8, Q_new_inp, new_inp_out_size ); // To be removed + + change_q( new_inp_12k8_fx + L_FRAME - lMemRecalc_12k8, new_inp_out_size, Q_new_inp ); + } + set16_fx( temp1F_icatdmResampBuf_fx, 0, L_FILT_MAX ); + new_inp_out_size = modify_Fs_fx( temp1F_icatdmResampBuf_fx, NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ), input_Fs, new_inp_12k8_fx + L_FRAME, INT_FS_12k8, mem_decim_dummy_fx, 0, &Q_new_inp, &mem_decim_size ); + fixedToFloat_arr( new_inp_12k8_fx + L_FRAME, new_inp_12k8 + L_FRAME, Q_new_inp, new_inp_out_size ); // To be removed + + change_q( new_inp_12k8_fx + L_FRAME, new_inp_out_size, Q_new_inp ); + } + ELSE /* DFT stereo */ + { + /* update the FIR resampling filter memory, needed for switching to time-domain (FIR) resampling */ + Copy( signal_in_fx + input_frame - NS2SA( input_Fs, L_MEM_RECALC_NS ) - 2 * NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ), st->mem_decim_fx, 2 * NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ) ); + mvr2r( signal_in + input_frame - NS2SA( input_Fs, L_MEM_RECALC_NS ) - 2 * NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ), st->mem_decim, 2 * NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ) ); // To be removed + } +#else + if ( element_mode == IVAS_SCE ) + { + modify_Fs( signal_in, input_frame, input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim, ( st->max_bwidth == NB ) ); + + mvr2r( st->mem_decim, mem_decim_dummy, 2 * L_FILT_MAX ); + set_f( temp1F_icatdmResampBuf, 0, L_FILT_MAX ); + modify_Fs( temp1F_icatdmResampBuf, NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ), input_Fs, new_inp_12k8 + L_FRAME, INT_FS_12k8, mem_decim_dummy, 0 ); + } + else if ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_MDCT ) + { + /* reconstruct past segment of the Secondary channel input signal when switching from DFT stereo */ + if ( hCPE->last_element_mode == IVAS_CPE_DFT && st->idchan == 1 ) + { + int16_t length_inp = NS2SA( input_Fs, L_MEM_RECALC_SCH_NS ); + int16_t length_12k8 = NS2SA( INT_FS_12k8, L_MEM_RECALC_SCH_NS ); + + modify_Fs( signal_in - lMemRecalc - length_inp, length_inp, input_Fs, new_inp_12k8 - lMemRecalc_12k8 - length_12k8, INT_FS_12k8, st->mem_decim, 0 ); + } + + modify_Fs( signal_in - lMemRecalc, input_frame, input_Fs, new_inp_12k8 - lMemRecalc_12k8, INT_FS_12k8, st->mem_decim, ( st->max_bwidth == NB ) ); + mvr2r( st->mem_decim, mem_decim_dummy, 2 * L_FILT_MAX ); + + if ( lMemRecalc > 0 ) + { + modify_Fs( signal_in + input_frame - lMemRecalc, lMemRecalc, input_Fs, new_inp_12k8 + L_FRAME - lMemRecalc_12k8, INT_FS_12k8, mem_decim_dummy, ( st->max_bwidth == NB ) ); + } + set_f( temp1F_icatdmResampBuf, 0, L_FILT_MAX ); + modify_Fs( temp1F_icatdmResampBuf, NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ), input_Fs, new_inp_12k8 + L_FRAME, INT_FS_12k8, mem_decim_dummy, 0 ); + } + else /* DFT stereo */ + { + /* update the FIR resampling filter memory, needed for switching to time-domain (FIR) resampling */ + mvr2r( signal_in + input_frame - NS2SA( input_Fs, L_MEM_RECALC_NS ) - 2 * NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ), st->mem_decim, 2 * NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ) ); + } +#endif + /* save input resampled at 12.8kHz, non-preemhasised */ + if ( element_mode == IVAS_CPE_DFT ) + { + mvr2r( new_inp_12k8 - STEREO_DFT_OVL_12k8, st->buf_speech_enc_flt + L_FRAME32k - STEREO_DFT_OVL_12k8, L_FRAME + STEREO_DFT_OVL_12k8 ); + } + else if ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_MDCT ) + { + mvr2r( new_inp_12k8 - lMemRecalc_12k8, st->buf_speech_enc_flt + L_FRAME32k - lMemRecalc_12k8 - L_FILT, L_FRAME + lMemRecalc_12k8 + L_FILT ); + } + else + { + mvr2r( new_inp_12k8, st->buf_speech_enc_flt + L_FRAME32k, L_FRAME ); + } +#if 1 + IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) + { + Copy( new_inp_12k8_fx - STEREO_DFT_OVL_12k8, st->buf_speech_enc + L_FRAME32k - STEREO_DFT_OVL_12k8, L_FRAME + STEREO_DFT_OVL_12k8 ); + Scale_sig( st->buf_speech_enc + L_FRAME32k - STEREO_DFT_OVL_12k8, L_FRAME + STEREO_DFT_OVL_12k8, 1 ); + } + ELSE IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_MDCT ) ) + { + Copy( new_inp_12k8_fx - lMemRecalc_12k8, st->buf_speech_enc + L_FRAME32k - lMemRecalc_12k8 - L_FILT, L_FRAME + lMemRecalc_12k8 + L_FILT ); + Scale_sig( st->buf_speech_enc + L_FRAME32k - lMemRecalc_12k8 - L_FILT, L_FRAME + lMemRecalc_12k8 + L_FILT, 1 ); + } + ELSE + { + Copy( new_inp_12k8_fx, st->buf_speech_enc + L_FRAME32k, L_FRAME ); + Scale_sig( st->buf_speech_enc + L_FRAME32k, L_FRAME, 1 ); + } +#endif + /*------------------------------------------------------------------* + * Perform fixed preemphasis (12.8 kHz signal) through 1 - g*z^-1 + *-----------------------------------------------------------------*/ +#if 0 // Disabled due to high mld +#if 0 // EVS-Version + Word16 headroom = 1; + IF( ( ( EQ_16( st->bwidth, NB ) ) || ( EQ_16( st->max_bwidth, NB ) ) ) && ( GT_32( st->input_Fs, 8000 ) ) ) + { + headroom = add( headroom, 1 ); + } + IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) + { + Copy( new_inp_12k8_fx - STEREO_DFT_OVL_12k8 + L_FRAME, st->inp_12k8_mem_stereo_sw_fx, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); /* memory for TD/DFT stereo switching */ + + st->mem_preemph_fx = st->mem_preemph_DFT_fx; + st->mem_preemph_DFT_fx = old_inp_12k8_fx[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; + + Preemph_scaled( new_inp_12k8_fx - STEREO_DFT_OVL_12k8, &Q_new, &st->mem_preemph_fx, st->Q_max, PREEMPH_FAC, 0, headroom, L_Q_MEM, L_FRAME, st->last_coder_type, 1 ); + + fixedToFloat_arr( new_inp_12k8_fx - STEREO_DFT_OVL_12k8, new_inp_12k8 - STEREO_DFT_OVL_12k8, Q_new, L_FRAME ); // To be removed + dummy_fx = st->mem_preemph_fx; + Preemph_scaled( new_inp_12k8_fx - STEREO_DFT_OVL_12k8 + L_FRAME, &Q_new, &dummy_fx, st->Q_max, PREEMPH_FAC, 0, headroom, L_Q_MEM, STEREO_DFT_OVL_12k8, st->last_coder_type, 1 ); + + st->mem_preemph = (float) st->mem_preemph_fx; + fixedToFloat_arr( new_inp_12k8_fx - STEREO_DFT_OVL_12k8 + L_FRAME, new_inp_12k8 - STEREO_DFT_OVL_12k8 + L_FRAME, Q_new, STEREO_DFT_OVL_12k8 ); // To be removed + } + ELSE IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_MDCT ) ) + { + IF( EQ_16( st->idchan, 0 ) ) + { + IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) + { + st->mem_preemph_fx = st->mem_preemph_DFT_fx; + Copy( st->inp_12k8_mem_stereo_sw_fx, new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); + Preemph_scaled( new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), &Q_new, &st->mem_preemph_fx, st->Q_max, PREEMPH_FAC, 0, headroom, L_Q_MEM, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT, st->last_coder_type, 1 ); + + st->mem_preemph = (float) st->mem_preemph_fx; + fixedToFloat_arr( new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), new_inp_12k8 - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), Q_new, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); // To be removed + } + + st->mem_preemph_DFT_fx = old_inp_12k8_fx[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; /* == inp_12k8[L_FRAME-1] */ + } + + /* preemphasise past segment of the Secondary channel input signal when switching from DFT stereo */ + IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && EQ_16( st->idchan, 1 ) ) + { + Word16 length_12k8 = NS2SA( INT_FS_12k8, L_MEM_RECALC_SCH_NS ); + Preemph_scaled( new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, &Q_new, &st->mem_preemph_fx, st->Q_max, PREEMPH_FAC, 0, headroom, L_Q_MEM, length_12k8, st->last_coder_type, 1 ); + fixedToFloat_arr( new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, new_inp_12k8 - lMemRecalc_12k8 - length_12k8, Q_new, length_12k8 ); // To be removed + } + + Preemph_scaled( new_inp_12k8_fx - lMemRecalc_12k8, &Q_new, &st->mem_preemph_fx, st->Q_max, PREEMPH_FAC, 0, headroom, L_Q_MEM, L_FRAME, st->last_coder_type, 1 ); + dummy_fx = st->mem_preemph_fx; + + fixedToFloat_arr( new_inp_12k8_fx - lMemRecalc_12k8, new_inp_12k8 - lMemRecalc_12k8, Q_new, L_FRAME ); // To be removed + + Preemph_scaled( new_inp_12k8_fx - lMemRecalc_12k8 + L_FRAME, &Q_new, &dummy_fx, st->Q_max, PREEMPH_FAC, 0, headroom, L_Q_MEM, lMemRecalc_12k8 + L_FILT, st->last_coder_type, 1 ); + + fixedToFloat_arr( new_inp_12k8_fx - lMemRecalc_12k8 + L_FRAME, new_inp_12k8 - lMemRecalc_12k8 + L_FRAME, Q_new, lMemRecalc_12k8 + L_FILT ); // To be removed + } + ELSE /* IVAS_SCE or IVAS_CPE_MDCT */ + { + floatToFixed_arr( new_inp_12k8, new_inp_12k8_fx, 0, L_FRAME + L_FILT ); // To be removed + + Preemph_scaled( new_inp_12k8_fx, &Q_new, &st->mem_preemph_fx, st->Q_max, PREEMPH_FAC, 0, headroom, L_Q_MEM, L_FRAME, st->last_coder_type, 1 ); + dummy_fx = st->mem_preemph_fx; + + fixedToFloat_arr( new_inp_12k8_fx, new_inp_12k8, Q_new, L_FRAME ); // To be removed + floatToFixed_arr( new_inp_12k8, new_inp_12k8_fx, 0, L_FRAME + L_FILT ); // To be removed + + Preemph_scaled( new_inp_12k8_fx + L_FRAME, &Q_new, &dummy_fx, st->Q_max, PREEMPH_FAC, 0, headroom, L_Q_MEM, L_FILT, st->last_coder_type, 1 ); + st->mem_preemph = (float) st->mem_preemph_fx; + + fixedToFloat_arr( new_inp_12k8_fx + 256, new_inp_12k8 + 256, Q_new, 12 ); // To be removed + } + + Q_exp = sub( Q_new, st->Q_old ); + st->prev_Q_old = st->Q_old; + move16(); + st->Q_old = Q_new; + move16(); +#else // IVAS-Version + + IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) + { + floatToFixed_arr( new_inp_12k8 - STEREO_DFT_OVL_12k8, new_inp_12k8_fx - STEREO_DFT_OVL_12k8, 0, L_FRAME + STEREO_DFT_OVL_12k8 ); // To be removed + st->mem_preemph_fx = (Word16) st->mem_preemph; + st->mem_preemph_DFT_fx = (Word16) st->mem_preemph_DFT; + + Copy( new_inp_12k8_fx - STEREO_DFT_OVL_12k8 + L_FRAME, st->inp_12k8_mem_stereo_sw_fx, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); /* memory for TD/DFT stereo switching */ +#if 1 // TOBE removed later + mvr2r( new_inp_12k8 - STEREO_DFT_OVL_12k8 + L_FRAME, st->inp_12k8_mem_stereo_sw, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); /* memory for TD/DFT stereo switching */ + st->mem_preemph_DFT = old_inp_12k8[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; +#endif + st->mem_preemph_fx = st->mem_preemph_DFT_fx; + st->mem_preemph_DFT_fx = old_inp_12k8_fx[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; + + preemph_fx( new_inp_12k8_fx - STEREO_DFT_OVL_12k8, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx ); + dummy_fx = st->mem_preemph_fx; + preemph_fx( new_inp_12k8_fx - STEREO_DFT_OVL_12k8 + L_FRAME, PREEMPH_FAC_FLT, STEREO_DFT_OVL_12k8, &dummy_fx ); + + fixedToFloat_arr( new_inp_12k8_fx - STEREO_DFT_OVL_12k8, new_inp_12k8 - STEREO_DFT_OVL_12k8, 0, L_FRAME + STEREO_DFT_OVL_12k8 ); // To be removed + st->mem_preemph = (float) st->mem_preemph_fx; + st->mem_preemph_DFT = (float) st->mem_preemph_DFT_fx; + } + ELSE IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_MDCT ) ) + { + IF( EQ_16( st->idchan, 0 ) ) + { + + st->mem_preemph_fx = (Word16) st->mem_preemph; + IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) + { +#if 1 // TOBE removed later + + floatToFixed_arr( new_inp_12k8 - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), 0, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); // To be removed + st->mem_preemph_DFT_fx = (Word16) st->mem_preemph_DFT; + + mvr2r( st->inp_12k8_mem_stereo_sw, new_inp_12k8 - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); +#endif + st->mem_preemph_fx = st->mem_preemph_DFT_fx; + Copy( st->inp_12k8_mem_stereo_sw_fx, new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); + preemph_fx( new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), PREEMPH_FAC, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT, &st->mem_preemph_fx ); + + fixedToFloat_arr( new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), new_inp_12k8 - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), 0, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); // To be removed + } + + st->mem_preemph_DFT_fx = old_inp_12k8_fx[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; /* == inp_12k8[L_FRAME-1] */ +#if 1 // TOBE removed later + st->mem_preemph_DFT = old_inp_12k8[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; /* == inp_12k8[L_FRAME-1] */ // TO be remove later +#endif + } + + /* preemphasise past segment of the Secondary channel input signal when switching from DFT stereo */ + IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && EQ_16( st->idchan, 1 ) ) + { + Word16 length_12k8 = NS2SA( INT_FS_12k8, L_MEM_RECALC_SCH_NS ); + + floatToFixed_arr( new_inp_12k8 - lMemRecalc_12k8 - length_12k8, new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, 0, length_12k8 ); // To be removed + + preemph_fx( new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, PREEMPH_FAC, length_12k8, &st->mem_preemph_fx ); + + fixedToFloat_arr( new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, new_inp_12k8 - lMemRecalc_12k8 - length_12k8, 0, length_12k8 ); // To be removed + } + + floatToFixed_arr( new_inp_12k8 - lMemRecalc_12k8, new_inp_12k8_fx - lMemRecalc_12k8, 0, L_FRAME + lMemRecalc_12k8 + L_FILT ); // To be removed + + preemph_fx( new_inp_12k8_fx - lMemRecalc_12k8, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx ); + dummy_fx = st->mem_preemph_fx; + preemph_fx( new_inp_12k8_fx - lMemRecalc_12k8 + L_FRAME, PREEMPH_FAC, lMemRecalc_12k8 + L_FILT, &dummy_fx ); + + fixedToFloat_arr( new_inp_12k8_fx - lMemRecalc_12k8, new_inp_12k8 - lMemRecalc_12k8, 0, L_FRAME + lMemRecalc_12k8 + L_FILT ); // To be removed + } + ELSE /* IVAS_SCE or IVAS_CPE_MDCT */ + { + floatToFixed_arr( new_inp_12k8, new_inp_12k8_fx, 0, L_FRAME + L_FILT ); // To be removed + st->mem_preemph_fx = (Word16) st->mem_preemph; + + preemph_fx( new_inp_12k8_fx, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx ); + dummy_fx = st->mem_preemph_fx; + preemph_fx( new_inp_12k8_fx + L_FRAME, PREEMPH_FAC, L_FILT, &dummy_fx ); + + st->mem_preemph = (float) st->mem_preemph_fx; + dummy = (float) dummy_fx; + fixedToFloat_arr( new_inp_12k8_fx, new_inp_12k8, 0, L_FRAME + L_FILT ); // To be removed + } +#endif +#else + if ( element_mode == IVAS_CPE_DFT ) + { + mvr2r( new_inp_12k8 - STEREO_DFT_OVL_12k8 + L_FRAME, st->inp_12k8_mem_stereo_sw, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); /* memory for TD/DFT stereo switching */ + + st->mem_preemph = st->mem_preemph_DFT; + st->mem_preemph_DFT = old_inp_12k8[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; + + preemph( new_inp_12k8 - STEREO_DFT_OVL_12k8, PREEMPH_FAC_FLT, L_FRAME, &st->mem_preemph ); + dummy = st->mem_preemph; + preemph( new_inp_12k8 - STEREO_DFT_OVL_12k8 + L_FRAME, PREEMPH_FAC_FLT, STEREO_DFT_OVL_12k8, &dummy ); + } + else if ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_MDCT ) + { + if ( st->idchan == 0 ) + { + if ( hCPE->last_element_mode == IVAS_CPE_DFT ) + { + st->mem_preemph = st->mem_preemph_DFT; + mvr2r( st->inp_12k8_mem_stereo_sw, new_inp_12k8 - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); + preemph( new_inp_12k8 - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), PREEMPH_FAC_FLT, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT, &st->mem_preemph ); + } + + st->mem_preemph_DFT = old_inp_12k8[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; /* == inp_12k8[L_FRAME-1] */ + } + + /* preemphasise past segment of the Secondary channel input signal when switching from DFT stereo */ + if ( hCPE->last_element_mode == IVAS_CPE_DFT && st->idchan == 1 ) + { + int16_t length_12k8 = NS2SA( INT_FS_12k8, L_MEM_RECALC_SCH_NS ); + preemph( new_inp_12k8 - lMemRecalc_12k8 - length_12k8, PREEMPH_FAC_FLT, length_12k8, &st->mem_preemph ); + } + + preemph( new_inp_12k8 - lMemRecalc_12k8, PREEMPH_FAC_FLT, L_FRAME, &st->mem_preemph ); + dummy = st->mem_preemph; + preemph( new_inp_12k8 - lMemRecalc_12k8 + L_FRAME, PREEMPH_FAC_FLT, lMemRecalc_12k8 + L_FILT, &dummy ); + } + else /* IVAS_SCE or IVAS_CPE_MDCT */ + { + preemph( new_inp_12k8, PREEMPH_FAC_FLT, L_FRAME, &st->mem_preemph ); + dummy = st->mem_preemph; + preemph( new_inp_12k8 + L_FRAME, PREEMPH_FAC_FLT, L_FILT, &dummy ); + } +#endif + +#if 0 + /*------------------------------------------------------------------* + * Scaling of memories + *-----------------------------------------------------------------*/ + Q_new = 0; + floatToFixed_arrL( st->hNoiseEst->bckr, st->hNoiseEst->bckr_fx, Q_new + QSCALE, 20 ); + floatToFixed_arrL( st->hNoiseEst->enrO, st->hNoiseEst->enrO_fx, Q_new + QSCALE, 20 ); + floatToFixed_arrL( st->hNoiseEst->ave_enr2, st->hNoiseEst->ave_enr2_fx, Q_new + QSCALE, 20 ); + floatToFixed_arrL( st->hNoiseEst->fr_bands1, st->hNoiseEst->fr_bands1_fx, Q_new + QSCALE, 20 ); + floatToFixed_arrL( st->hNoiseEst->fr_bands2, st->hNoiseEst->fr_bands2_fx, Q_new + QSCALE, 20 ); + + Le_min_scaled = Scale_mem_pre_proc( st->ini_frame, Q_exp, &Q_new, old_inp_12k8_fx, &( st->mem_wsp_fx ), st->hNoiseEst->enrO_fx, st->hNoiseEst->bckr_fx, + st->hNoiseEst->ave_enr_fx, st->hNoiseEst->ave_enr2_fx, st->hNoiseEst->fr_bands1_fx, st->hNoiseEst->fr_bands2_fx, st->Bin_E_old_fx ); +#endif + /*-------------------------------------------------------------------------* + * Spectral analysis + *--------------------------------------------------------------------------*/ + analy_sp( element_mode, hCPE, input_Fs, inp_12k8, st->Bin_E, st->Bin_E_old, fr_bands, lf_E, &Etot, st->min_band, st->max_band, band_energies, PS, fft_buff ); + + if ( hStereoClassif != NULL ) + { + if ( st->lp_speech - Etot > 25 ) + { + hStereoClassif->silence_flag = 2; + } + else + { + hStereoClassif->silence_flag = hStereoClassif->silence_flag - 1; + } + hStereoClassif->silence_flag = max( 0, hStereoClassif->silence_flag ); + } + + /*----------------------------------------------------------------* + * SAD (1-signal, 0-noise) + *----------------------------------------------------------------*/ + + Etot_fx = (Word32) ( Etot * ( 1 << 24 ) ); + st->hNoiseEst->Etot_h_32fx = (Word32) ( st->hNoiseEst->Etot_h * 16777216.0 ); + st->hNoiseEst->Etot_l_32fx = (Word32) ( st->hNoiseEst->Etot_l * 16777216.0 ); + st->hNoiseEst->Etot_l_lp_32fx = (Word32) ( st->hNoiseEst->Etot_l_lp * 16777216.0 ); + st->hNoiseEst->Etot_last_32fx = (Word32) ( st->hNoiseEst->Etot_last * 16777216.0 ); + st->hNoiseEst->Etot_v_h2_32fx = (Word32) ( st->hNoiseEst->Etot_v_h2 * 16777216.0 ); + st->hNoiseEst->Etot_lp_32fx = (Word32) ( st->hNoiseEst->Etot_lp * 16777216.0 ); + st->hNoiseEst->sign_dyn_lp_32fx = (Word32) ( st->hNoiseEst->sign_dyn_lp * 16777216.0 ); + + noise_est_pre_32fx( Etot_fx, st->ini_frame, st->hNoiseEst, st->idchan, element_mode, hCPE != NULL ? hCPE->last_element_mode : element_mode ); + + st->hNoiseEst->Etot_h = (float) ( st->hNoiseEst->Etot_h_32fx / 16777216.0 ); + st->hNoiseEst->Etot_l = (float) ( st->hNoiseEst->Etot_l_32fx / 16777216.0 ); + st->hNoiseEst->Etot_l_lp = (float) ( st->hNoiseEst->Etot_l_lp_32fx / 16777216.0 ); + st->hNoiseEst->Etot_last = (float) ( st->hNoiseEst->Etot_last_32fx / 16777216.0 ); + st->hNoiseEst->Etot_v_h2 = (float) ( st->hNoiseEst->Etot_v_h2_32fx / 16777216.0 ); + st->hNoiseEst->Etot_lp = (float) ( st->hNoiseEst->Etot_lp_32fx / 16777216.0 ); + st->hNoiseEst->sign_dyn_lp = (float) ( st->hNoiseEst->sign_dyn_lp_32fx / 16777216.0 ); + + IF( EQ_16( element_mode, IVAS_CPE_TD ) && ( ( abs( hCPE->hStereoTD->tdm_last_ratio_idx - tdm_ratio_idx ) > 5 && EQ_16( st->idchan, 1 ) ) || abs( hCPE->hStereoTD->tdm_last_inst_ratio_idx - hCPE->hStereoTD->tdm_inst_ratio_idx ) > 10 ) ) + { + st->ini_frame = 1; + } +#if 0 // Disbaled due to high MLD + Q_new = Q_factor_arr( fr_bands, 40 ); + floatToFixed_arrL( fr_bands, fr_bands_fx, Q_new + QSCALE, 40 ); + st->lp_noise_fx = (Word16) ( st->lp_noise * ( 1 << 8 ) ); + st->lp_speech_fx = (Word16) ( st->lp_speech * ( 1 << 8 ) ); + floatToFixed_arrL( st->hNoiseEst->bckr, st->hNoiseEst->bckr_fx, Q_new + QSCALE, 20 ); + floatToFixed_arrL( st->hNoiseEst->enrO, st->hNoiseEst->enrO_fx, Q_new + QSCALE, 20 ); + st->flag_noisy_speech_snr_fx = (Word8) st->flag_noisy_speech_snr; + st->hVAD->bcg_flux_fx = (Word16) st->hVAD->bcg_flux * ( 1 << 4 ); + st->hNoiseEst->Etot_v_h2_fx = (Word16) ( st->hNoiseEst->Etot_v_h2 * ( 1 << 8 ) ); + st->hNoiseEst->sign_dyn_lp_fx = (Word16) ( st->hNoiseEst->sign_dyn_lp * ( 1 << 8 ) ); + st->hVAD->snr_sum_vad_fx = (Word16) ( st->hVAD->snr_sum_vad * 32767 ); + st->hVAD->prim_act_quick_fx = (Word16) ( st->hVAD->prim_act_quick * 32767 ); + st->hVAD->prim_act_slow_fx = (Word16) ( st->hVAD->prim_act_slow * 32767 ); + st->hVAD->prim_act_fx = (Word16) ( st->hVAD->prim_act * 32767 ); + st->hVAD->prim_act_quick_he_fx = (Word16) ( st->hVAD->prim_act_quick_he * 32767 ); + st->hVAD->prim_act_slow_he_fx = (Word16) ( st->hVAD->prim_act_slow_he * 32767 ); + st->hVAD->prim_act_he_fx = (Word16) ( st->hVAD->prim_act_he * 32767 ); + + + st->vad_flag = wb_vad_ivas_fx( st, fr_bands_fx, &i, &i, &i, &snr_sum_he_fx, &localVAD_HE_SAD, &( st->flag_noisy_speech_snr_fx ), Q_new, NULL, NULL, -MAX_16, -MAX_16 ); //-100000f == max 16bit float + + st->hNoiseEst->Etot_v_h2 = (float) ( st->hNoiseEst->Etot_v_h2_fx / ( 256.0 ) ); + st->hNoiseEst->sign_dyn_lp = (float) ( st->hNoiseEst->sign_dyn_lp_fx / ( 256.0 ) ); + st->hVAD->bcg_flux = (float) ( st->hVAD->bcg_flux_fx / ( 16.0 ) ); + st->flag_noisy_speech_snr = (Word16) st->flag_noisy_speech_snr_fx; + st->hVAD->snr_sum_vad = (float) ( st->hVAD->snr_sum_vad_fx / 32767.0 ); + st->hVAD->prim_act_quick = (float) ( st->hVAD->prim_act_quick_fx / 32767.0 ); + st->hVAD->prim_act_slow = (float) ( st->hVAD->prim_act_slow_fx / 32767.0 ); + st->hVAD->prim_act = (float) ( st->hVAD->prim_act_fx / 32767.0 ); + st->hVAD->prim_act_quick_he = (float) ( st->hVAD->prim_act_quick_he_fx / 32767.0 ); + st->hVAD->prim_act_slow_he = (float) ( st->hVAD->prim_act_slow_he_fx / 32767.0 ); + st->hVAD->prim_act_he = (float) ( st->hVAD->prim_act_he_fx / 32767.0 ); +#else + st->vad_flag = wb_vad( st, fr_bands, &i, &i, &i, &snr_sum_he, &localVAD_HE_SAD, &( st->flag_noisy_speech_snr ), NULL, NULL, -1000.0f, -1000.0f ); +#endif + + IF( EQ_16( force_front_vad, 1 ) || EQ_16( front_vad_flag, 1 ) ) + { + /* overwrite VAD decision with front-VAD decision if external VAD is set to 1*/ + st->vad_flag = front_vad_flag; + st->localVAD = front_vad_flag; + } + IF( ( hCPE != NULL && !( lr_vad_enabled && EQ_16( st->idchan, 0 ) ) ) || hSCE != NULL ) + { + st->lp_noise_fx = (Word16) ( st->lp_noise * ( 1 << 8 ) ); + st->lp_speech_fx = (Word16) ( st->lp_speech * ( 1 << 8 ) ); + st->hVAD->prim_act_he_fx = (Word16) ( st->hVAD->prim_act_he * MAX_16 ); + st->hNoiseEst->Etot_lp_fx = (Word16) ( st->hNoiseEst->Etot_lp * ( 1 << 8 ) ); + + *vad_flag_dtx = dtx_hangover_addition_fx( st, st->vad_flag, sub( st->lp_speech_fx, st->lp_noise_fx ), 0, vad_hover_flag, NULL, NULL ); + } + ELSE + { + /* This only applies to st->idchan==0 now */ + /* Add down mix stereo activity to LR vad_flag_dtx */ + *vad_flag_dtx = *vad_flag_dtx || st->vad_flag; + + + /* Determine hangover flag status based on LR localVAD and downmix localVAD */ + *vad_hover_flag = *vad_flag_dtx && !( LR_localVAD || st->localVAD ); + } + + IF( EQ_16( force_front_vad, 1 ) || EQ_16( front_vad_dtx_flag, 1 ) ) + { + /* overwrite VAD decision with front-VAD decision if external VAD is set to 1*/ + *vad_flag_dtx = front_vad_dtx_flag; + } + + /*----------------------------------------------------------------* + * NB/WB/SWB/FB bandwidth detector + *----------------------------------------------------------------*/ + FOR( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + { + sf_energySum[i] = enerBuffer_exp; + move16(); + } + + IF( EQ_16( st->idchan, 0 ) && NE_16( element_mode, IVAS_CPE_MDCT ) ) + { + st->cldfbAnaEnc->scale = (Word16) ( st->cldfbAnaEnc->scale_flt * ( 1 << 8 ) ); + floatToFixed_arr( st->input, st->input_fx, 0, 480 ); + + bw_detect_fx( st, st->input_fx, NULL, enerBuffer_fx, sf_energySum, ivas_format, 0 ); + + st->lt_mean_NB = (float) st->lt_mean_NB_fx / ( 1 << 11 ); + st->lt_mean_WB = (float) st->lt_mean_WB_fx / ( 1 << 11 ); + st->lt_mean_SWB = (float) st->lt_mean_SWB_fx / ( 1 << 11 ); + } + + IF( NE_16( element_mode, IVAS_CPE_MDCT ) ) /* in MDCT stereo, set_bw_stereo() is used instead */ + { + set_bw( element_mode, element_brate, st, MODE1 ); + } + + /* set the BW of the TD secondary channel in LRTD mode same as BW of the primary channel (only at higher bitrates) */ + IF( EQ_16( st->idchan, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( st->tdm_LRTD_flag, 1 ) && st->bits_frame_channel >= IVAS_16k4 / FRAMES_PER_SEC ) + { + st->bwidth = hCPE->hCoreCoder[0]->bwidth; + } + + /*----------------------------------------------------------------* + * Noise energy down-ward update and total noise energy estimation + * Long-term energies and relative frame energy updates + * Correlation correction as a function of total noise level + *----------------------------------------------------------------*/ + + noise_est_down( fr_bands, st->hNoiseEst->bckr, tmpN, tmpE, st->min_band, st->max_band, &st->hNoiseEst->totalNoise, Etot, &st->hNoiseEst->Etot_last, &st->hNoiseEst->Etot_v_h2 ); + + if ( lr_vad_enabled && st->idchan == 0 ) + { + noise_est_down( fr_bands_LR[0], hCPE->hFrontVad[0]->hNoiseEst->bckr, tmpN_LR[0], tmpE_LR[0], st->min_band, st->max_band, &hCPE->hFrontVad[0]->hNoiseEst->totalNoise, Etot_LR[0], &hCPE->hFrontVad[0]->hNoiseEst->Etot_last, &hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2 ); + noise_est_down( fr_bands_LR[1], hCPE->hFrontVad[1]->hNoiseEst->bckr, tmpN_LR[1], tmpE_LR[1], st->min_band, st->max_band, &hCPE->hFrontVad[1]->hNoiseEst->totalNoise, Etot_LR[1], &hCPE->hFrontVad[1]->hNoiseEst->Etot_last, &hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2 ); + corr_shiftL = correlation_shift( hCPE->hFrontVad[0]->hNoiseEst->totalNoise ); + corr_shiftR = correlation_shift( hCPE->hFrontVad[1]->hNoiseEst->totalNoise ); + } + + *relE = Etot - st->lp_speech; + + corr_shift = correlation_shift( st->hNoiseEst->totalNoise ); + + /*----------------------------------------------------------------* + * FD-CNG Noise Estimator + *----------------------------------------------------------------*/ + if ( st->hFdCngEnc != NULL ) + { + resetFdCngEnc( st ); + + if ( st->idchan == 0 || element_mode == IVAS_CPE_MDCT ) + { + if ( element_mode == IVAS_CPE_TD && lr_vad_enabled && band_energies_LR != NULL ) + { + perform_noise_estimation_enc( band_energies_LR, enerBuffer, st->hFdCngEnc, input_Fs, hCPE ); + } + else + { + perform_noise_estimation_enc( band_energies, enerBuffer, st->hFdCngEnc, input_Fs, hCPE ); + } + } + } + + /*-----------------------------------------------------------------* + * Select SID or FRAME_NO_DATA frame if DTX enabled + *-----------------------------------------------------------------*/ + + if ( hCPE != NULL && element_mode != IVAS_CPE_DFT && element_mode != IVAS_CPE_MDCT ) + { + *vad_flag_dtx = 1; + } + + if ( st->Opt_DTX_ON == 1 && *vad_flag_dtx == 0 && element_mode == IVAS_CPE_DFT && element_brate <= ACELP_16k40 && hCPE->hStereoDft->hConfig->force_mono_transmission == 1 ) /* force LP_CNG usage for MASA DTX when mono tranmission */ + { + st->cng_type = LP_CNG; + } + + dtx( st, ivas_total_brate, *vad_flag_dtx, inp_12k8 ); + + if ( hCPE != NULL && hCPE->hStereoDft != NULL && st->core_brate == SID_2k40 ) + { + /* Add another period of expected xcorr updates */ + hCPE->hStereoDft->expectedNumUpdates += st->hDtxEnc->max_SID; + } + + /*----------------------------------------------------------------* + * Adjust FD-CNG Noise Estimator + *----------------------------------------------------------------*/ + + if ( st->hFdCngEnc != NULL && ( st->ini_frame == 0 || last_element_brate != element_brate || st->last_bwidth != st->bwidth ) ) + { + int32_t total_brate; + + total_brate = ( element_mode == IVAS_SCE ) ? st->total_brate : st->bits_frame_nominal * FRAMES_PER_SEC; + configureFdCngEnc( st->hFdCngEnc, max( st->input_bwidth, WB ), total_brate ); + if ( hCPE != NULL ) + { + st->hFdCngEnc->hFdCngCom->CngBitrate = hCPE->element_brate - 1; + } + } + + if ( st->hFdCngEnc != NULL && st->Opt_DTX_ON ) + { + AdjustFirstSID( st ); + } + + /*----------------------------------------------------------------* + * LP analysis + *----------------------------------------------------------------*/ + + alw_pitch_lag_12k8[0] = st->old_pitch_la; + alw_pitch_lag_12k8[1] = st->old_pitch_la; + alw_voicing[0] = st->voicing[2]; + alw_voicing[1] = st->voicing[2]; + + i = 0; + if ( element_mode == IVAS_CPE_TD && st->idchan == 1 && hCPE->hStereoTD->tdm_low_rate_mode == 1 ) + { + i = 1; + } + + analy_lp( inp_12k8, L_FRAME, L_look, ener, A, epsP, lsp_new, lsp_mid, st->lsp_old1, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, i ); + + lsp2lsf( lsp_new, lsf_new, M, INT_FS_12k8 ); + stab_fac = lsf_stab( lsf_new, st->lsf_old1, 0, L_FRAME ); + mvr2r( lsf_new, st->lsf_old1, M ); + + if ( element_mode == IVAS_CPE_TD && st->idchan == 1 ) + { + /*----------------------------------------------------------------* + * Comparison of the LP coefficents to determine if it is possible + * to reuse the primary channel LP coefficients in the secondary channel + *----------------------------------------------------------------*/ + + hCPE->hStereoTD->tdm_lp_reuse_flag = tdm_lp_comparison( hCPE->hStereoTD, hCPE->hStereoClassif, st, inp_12k8, tdm_A_PCh, A, M, tdm_lsp_new_PCh, lsp_new, L_FRAME, element_brate - nb_bits_metadata * FRAMES_PER_SEC ); + } + + /*----------------------------------------------------------------* + * Compute weighted input (for OL pitch analysis) + * OL pitch analysis + * stable high pitch detection + * 1/4 pitch precision improvement + *----------------------------------------------------------------*/ + + find_wsp( L_FRAME, L_SUBFR, NB_SUBFR, A, Aw, inp_12k8, TILT_FAC, wsp, &st->mem_wsp, GAMMA1_FLT, L_look ); + + if ( st->vad_flag == 0 ) + { + /* reset the OL pitch tracker memories during inactive frames */ + pitch_ol_init( &st->old_thres, &st->old_pitch, &st->delta_pit, &st->old_corr ); + } + + old_pitch1 = st->pitch[1]; + + pitch_ol( st->pitch, st->voicing, &st->old_pitch, &st->old_corr, corr_shift, &st->old_thres, &st->delta_pit, st->old_wsp2, wsp, st->mem_decim2, *relE, L_look, st->clas, st->input_bwidth, st->Opt_SC_VBR ); + + /* Updates for adaptive lag window memory */ + st->old_pitch_la = st->pitch[2]; + + /* Detection of very short stable pitch period */ + StableHighPitchDetect( &flag_spitch, st->pitch, st->voicing, st->Bin_E, wsp, st->localVAD, &st->voicing_sm, &st->voicing0_sm, &st->LF_EnergyRatio_sm, &st->predecision_flag, &st->diff_sm, &st->energy_sm ); + + /* 1/4 pitch precision improvement */ + if ( element_brate <= IVAS_32k ) + { + pitch_ol2( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr[0], &voicing_fr[0], 0, wsp, 7 ); + pitch_ol2( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr[1], &voicing_fr[1], L_SUBFR, wsp, 7 ); + pitch_ol2( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr[2], &voicing_fr[2], 2 * L_SUBFR, wsp, 7 ); + pitch_ol2( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr[3], &voicing_fr[3], 3 * L_SUBFR, wsp, 7 ); + } + else + { + pitch_fr[0] = st->pitch[0]; + pitch_fr[1] = st->pitch[0]; + pitch_fr[2] = st->pitch[1]; + pitch_fr[3] = st->pitch[1]; + + voicing_fr[0] = st->voicing[0]; + voicing_fr[1] = st->voicing[0]; + voicing_fr[2] = st->voicing[1]; + voicing_fr[3] = st->voicing[1]; + } + + /*------------------------------------------------------------------* + * Update estimated noise energy and voicing cut-off frequency + *-----------------------------------------------------------------*/ + + noise_est( st, old_pitch1, tmpN, epsP, Etot, *relE, corr_shift, tmpE, fr_bands, cor_map_sum, &ncharX, &sp_div, + &non_staX, loc_harm, lf_E, &st->hNoiseEst->harm_cor_cnt, st->hNoiseEst->Etot_l_lp, &dummy /*sp_floor*/, S_map, hStereoClassif, NULL, st->ini_frame ); + + if ( lr_vad_enabled && st->idchan == 0 ) + { + /* Run noise_est for Left and Right channel */ + *loc_harmLR = *loc_harm; + noise_est( st, old_pitch1, tmpN_LR[0], epsP, Etot_LR[0], Etot_LR[0] - hCPE->hFrontVad[0]->lp_speech, corr_shiftL, tmpE_LR[0], fr_bands_LR[0], &cor_map_sum_LR[0], &ncharX_LR, &sp_div_LR, + &non_staX_LR, loc_harmLR, lf_E_LR[0], &hCPE->hFrontVad[0]->hNoiseEst->harm_cor_cnt, hCPE->hFrontVad[0]->hNoiseEst->Etot_l_lp, &dummy, S_map_LR, NULL, hCPE->hFrontVad[0], hCPE->hFrontVad[0]->ini_frame ); + + /* Note: the index [0] in the last argument is intended, the ini_frame counter is only maintained in the zero-th channel's VAD handle */ + noise_est( st, old_pitch1, tmpN_LR[1], epsP, Etot_LR[1], Etot_LR[1] - hCPE->hFrontVad[1]->lp_speech, corr_shiftR, tmpE_LR[1], fr_bands_LR[1], &cor_map_sum_LR[1], &ncharX_LR, &sp_div_LR, + &non_staX_LR, loc_harmLR, lf_E_LR[1], &hCPE->hFrontVad[1]->hNoiseEst->harm_cor_cnt, hCPE->hFrontVad[1]->hNoiseEst->Etot_l_lp, &dummy, S_map_LR, NULL, hCPE->hFrontVad[1], hCPE->hFrontVad[0]->ini_frame ); + } + + /*------------------------------------------------------------------* + * Update parameters used in the VAD and DTX + *-----------------------------------------------------------------*/ + + vad_param_updt( st, corr_shift, corr_shift, A, old_pitch1, NULL, 1 ); + + if ( lr_vad_enabled && st->idchan == 0 ) + { + vad_param_updt( st, corr_shiftL, corr_shiftR, A, old_pitch1, &hCPE->hFrontVad[0], CPE_CHANNELS ); + } + + /*-----------------------------------------------------------------* + * Find spectral tilt + * UC and VC frame selection + *-----------------------------------------------------------------*/ + + find_tilt( fr_bands, st->hNoiseEst->bckr, ee, st->pitch, st->voicing, lf_E, corr_shift, st->input_bwidth, st->max_band, hp_E, MODE1, &( st->bckr_tilt_lt_flt ), st->Opt_SC_VBR ); + + st->coder_type = find_uv( st, pitch_fr, voicing_fr, inp_12k8, ee, &dE1X, corr_shift, *relE, Etot, hp_E, &flag_spitch, last_core_orig, hStereoClassif ); + + /*-----------------------------------------------------------------* + * channel aware mode configuration * + *-----------------------------------------------------------------*/ + + st->rf_mode = 0; + st->rf_target_bits_write = 0; + + /*-----------------------------------------------------------------* + * Signal classification for FEC + * TC frame selection + *-----------------------------------------------------------------*/ + + st->clas = signal_clas( st, inp_12k8, ee, *relE, L_look, tdm_SM_last_clas ); + + select_TC( MODE1, st->tc_cnt, &st->coder_type, st->localVAD ); + + if ( st->Opt_SC_VBR ) + { + st->hSC_VBR->Local_VAD = st->localVAD; + } + + /*-----------------------------------------------------------------* + * Collect stereo classifier features + *-----------------------------------------------------------------*/ + + if ( hStereoClassif != NULL ) + { + stereo_classifier_features( hStereoClassif, st->idchan, element_mode, localVAD_HE_SAD, lsf_new, epsP, st->pitch, st->voicing, *cor_map_sum, non_staX, sp_div, st->clas ); + } + + /*----------------------------------------------------------------* + * 1st stage speech/music classification (GMM model) + *----------------------------------------------------------------*/ + + smc_dec = ivas_smc_gmm( st, hStereoClassif, localVAD_HE_SAD, Etot, lsp_new, *cor_map_sum, epsP, PS, non_staX, *relE, &high_lpn_flag, flag_spitch ); + + + /*----------------------------------------------------------------* + * VAD energy updates + * Update of old per-band energy spectrum + *----------------------------------------------------------------*/ + + long_enr( st, Etot, localVAD_HE_SAD, high_lpn_flag, NULL, 1, NULL, NULL ); + + mvr2r( fr_bands + NB_BANDS, st->hNoiseEst->enrO, NB_BANDS ); + + if ( lr_vad_enabled && st->idchan == 0 ) + { + long_enr( st, -1, localVAD_HE_SAD, high_lpn_flag, hCPE->hFrontVad, CPE_CHANNELS, localVAD_HE_SAD_LR, Etot_LR ); + + mvr2r( fr_bands_LR[0] + NB_BANDS, hCPE->hFrontVad[0]->hNoiseEst->enrO, NB_BANDS ); + mvr2r( fr_bands_LR[1] + NB_BANDS, hCPE->hFrontVad[1]->hNoiseEst->enrO, NB_BANDS ); + } + + /*----------------------------------------------------------------* + * SNR-based speech/music classification + * AC frame selection + *----------------------------------------------------------------*/ + + st->GSC_IVAS_mode = 0; + if ( st->idchan == 1 && element_mode == IVAS_CPE_TD ) + { + /* No speech/music classification in the secondary channel of TD stereo */ + st->sp_aud_decision1 = 0; + st->sp_aud_decision2 = 0; + + st->GSC_noisy_speech = 0; + if ( st->hGSCEnc != NULL ) + { + st->hGSCEnc->noise_lev = NOISE_LEVEL_SP3; + } + } + else if ( element_mode != IVAS_CPE_MDCT ) + { + /* SNR-based speech/music classification */ + if ( ( element_mode >= IVAS_CPE_DFT && element_brate >= IVAS_24k4 ) || ( element_mode == IVAS_SCE && element_brate >= SCE_SMC_THR ) ) + { + if ( ivas_format == SBA_FORMAT && st->core_brate != FRAME_NO_DATA && st->last_core_brate == FRAME_NO_DATA && st->sba_br_sw_while_no_data ) + { + SetModeIndex( st, st->bits_frame_nominal * FRAMES_PER_SEC, element_mode, MCT_flag ); + st->sba_br_sw_while_no_data = 0; + } + else if ( ivas_format == SBA_FORMAT && st->core_brate == FRAME_NO_DATA && element_brate != last_element_brate ) + { + st->sba_br_sw_while_no_data = 1; + } + + if ( flag_16k_smc ) + { + /* Compute core-coder buffers at internal sampling rate */ + error = ivas_compute_core_buffers( st, NULL, old_inp_16k, NULL, input_frame, IVAS_SCE /*last_element_mode*/, INT_FS_16k /*sr_core_tmp*/, ener, A, Aw, epsP, lsp_new, lsp_mid ); + if ( error != IVAS_ERR_OK ) + { + return error; + } + + smc_dec = ivas_acelp_tcx20_switching( st, st->speech_enc_flt, st->wspeech_enc_flt, non_staX, pitch_fr, voicing_fr, currFlatness, lsp_mid, stab_fac, res_cod_SNR_M, flag_16k_smc ); + } + else + { + smc_dec = ivas_acelp_tcx20_switching( st, inp_12k8, wsp, non_staX, pitch_fr, voicing_fr, currFlatness, lsp_mid, stab_fac, res_cod_SNR_M, flag_16k_smc ); + } + } + /* Switch to ACELP for non-harmonic transient signals */ + else if ( ( ( element_mode >= IVAS_CPE_DFT && element_brate <= IVAS_16k4 ) || ( element_mode == IVAS_SCE && element_brate < SCE_SMC_THR ) ) && ( loc_harm[0] != 1 ) && smc_dec == MUSIC ) + { + if ( element_mode == IVAS_SCE ) + { + if ( transient_analysis( st->hTranDet, st->hNoiseEst->cor_map, st->hNoiseEst->multi_harm_limit ) ) + { + smc_dec = SPEECH; + } + } + else if ( element_mode == IVAS_CPE_DFT ) + { + for ( i = 0; i < CPE_CHANNELS; i++ ) + { + if ( smc_dec != SPEECH && transient_analysis( hCPE->hCoreCoder[i]->hTranDet, st->hNoiseEst->cor_map, st->hNoiseEst->multi_harm_limit ) ) + { + smc_dec = SPEECH; /* overwrite initial music decision, initial SPEECH_MUSIC never changed */ + } + } + } + } + + /* 2nd stage speech/music classification (ACELP/GSC/TCX core selection) */ + ivas_smc_mode_selection( st, element_brate, smc_dec, *relE, Etot, attack_flag, inp_12k8, S_map, flag_spitch ); + } + + /*----------------------------------------------------------------* + * Final VAD correction (when HE-SAD is used instead of the normal VAD, + * rewrite the VAD flag by VAD flag with DTX hangover for further processing) + *----------------------------------------------------------------*/ + + if ( st->Opt_DTX_ON && element_mode != IVAS_CPE_DFT ) + { + st->vad_flag = *vad_flag_dtx; + } + + /*-----------------------------------------------------------------* + * Update old input signal buffer + *-----------------------------------------------------------------*/ + + mvr2r( &old_inp_12k8[L_FRAME], st->old_inp_12k8, L_INP_MEM ); + +#ifdef IVAS_FLOAT_FIXED + free( signal_in_fx - ( input_Fs / 50 ) ); + free( enerBuffer_fx ); + free( old_inp_12k8_fx ); + free( old_inp_16k_fx ); + free( mem_decim_dummy_fx ); + free( temp1F_icatdmResampBuf_fx ); +#endif + pop_wmops(); + return error; +} +#endif + #ifdef IVAS_FIXED_ENC /*-------------------------------------------------------------------* * calculate_energy_buffer_fx() diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 55f76e430..316d279da 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -43,6 +43,8 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" +#include "prot_fx1.h" +#include "prot_fx2.h" #endif @@ -62,8 +64,8 @@ static void stereo_mode_combined_format_enc( const Encoder_Struct *st_ivas, CPE_ ivas_error ivas_cpe_enc( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ const int16_t cpe_id, /* i : CPE # identifier */ - const float data_f_ch0[], /* i : input signal for channel 0 */ - const float data_f_ch1[], /* i : input signal for channel 1 */ + float data_f_ch0[], /* i : input signal for channel 0 */ + float data_f_ch1[], /* i : input signal for channel 1 */ const int16_t input_frame, /* i : input frame length per channel */ const int16_t nb_bits_metadata /* i : number of metadata bits */ ) @@ -155,9 +157,15 @@ ivas_error ivas_cpe_enc( } mvr2r( data_f_ch0, sts[0]->input, input_frame ); +#ifdef IVAS_FLOAT_FIXED + floatToFixed_arr16( data_f_ch0, sts[0]->input_fx, 0, input_frame ); +#endif if ( data_f_ch1 != NULL ) /*this may happen for cases with odd number of channels*/ { mvr2r( data_f_ch1, sts[1]->input, input_frame ); +#ifdef IVAS_FLOAT_FIXED + floatToFixed_arr16( data_f_ch1, sts[1]->input_fx, 0, input_frame ); +#endif } /*----------------------------------------------------------------* @@ -484,10 +492,17 @@ ivas_error ivas_cpe_enc( for ( n = 0; n < n_CoreChannels; n++ ) { +#ifdef IVAS_FLOAT_FIXED + error = pre_proc_front_ivas_fx( NULL, hCPE, hCPE->element_brate, nb_bits_metadata, input_frame, n, old_inp_12k8[n], old_inp_16k[n], + &ener[n], &relE[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], &vad_hover_flag[n], &attack_flag[n], + realBuffer[n], imagBuffer[n], old_wsp[n], pitch_fr[n], voicing_fr[n], &loc_harm[n], &cor_map_sum[n], &vad_flag_dtx[n], enerBuffer[n], + fft_buff[n], A[0], lsp_new[0], currFlatness[n], tdm_ratio_idx, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, band_energies_LR, 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, 0, 0, ivas_format, st_ivas->hMCT != NULL, ivas_total_brate ); +#else error = pre_proc_front_ivas( NULL, hCPE, hCPE->element_brate, nb_bits_metadata, input_frame, n, old_inp_12k8[n], old_inp_16k[n], &ener[n], &relE[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], &vad_hover_flag[n], &attack_flag[n], realBuffer[n], imagBuffer[n], old_wsp[n], pitch_fr[n], voicing_fr[n], &loc_harm[n], &cor_map_sum[n], &vad_flag_dtx[n], enerBuffer[n], fft_buff[n], A[0], lsp_new[0], currFlatness[n], tdm_ratio_idx, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, band_energies_LR, 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, 0, 0, ivas_format, st_ivas->hMCT != NULL, ivas_total_brate ); +#endif if ( error != IVAS_ERR_OK ) { return error; diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index e983df322..cca282ff9 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -65,6 +65,9 @@ ivas_error ivas_enc( BSTR_ENC_HANDLE hMetaData; int16_t nb_bits_metadata[MAX_SCE + 1]; float *data_f[MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS]; +#ifdef IVAS_FLOAT_FIXED + Word16 *data_fx[MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS]; +#endif int32_t ivas_total_brate; ivas_error error; error = IVAS_ERR_OK; @@ -113,7 +116,30 @@ ivas_error ivas_enc( set_f( data_f[n] + n_samples_chan, 0.0f, input_frame - n_samples_chan ); } } +#ifdef IVAS_FLOAT_FIXED + FOR( n = 0; n < MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + data_fx[n] = st_ivas->p_data_fx[n]; + } + n = 0; + WHILE( n < nchan_inp ) + { + FOR( i = 0; i < n_samples_chan; i++ ) + { + data_fx[n][i] = (Word16) ( data[i * nchan_inp + n] ); + } + n++; + } + + IF( n_samples_chan < input_frame ) + { + FOR( n = 0; n < nchan_inp; n++ ) + { + set16_fx( data_fx[n] + n_samples_chan, 0, input_frame - n_samples_chan ); + } + } +#endif if ( ivas_format == SBA_FORMAT ) { diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 4bdf08e1a..dc7c49756 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -2107,6 +2107,13 @@ void ivas_destroy_enc( free( st_ivas->p_data_f[n] ); st_ivas->p_data_f[n] = NULL; } +#ifdef IVAS_FLOAT_FIXED + if ( st_ivas->p_data_fx[n] != NULL ) + { + free( st_ivas->p_data_fx[n] ); + st_ivas->p_data_fx[n] = NULL; + } +#endif } /* main IVAS handle */ diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 296323cf9..96b1f2460 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -167,11 +167,17 @@ ivas_error ivas_ism_enc( /*----------------------------------------------------------------* * Front Pre-processing *----------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED + error = pre_proc_front_ivas_fx( hSCE, NULL, hSCE->element_brate, nb_bits_metadata[sce_id], input_frame, 0, old_inp_12k8[sce_id][0], old_inp_16k[sce_id][0], + &ener[sce_id][0], &relE[sce_id][0], A[sce_id][0], Aw[sce_id][0], epsP[sce_id][0], lsp_new[sce_id][0], lsp_mid[sce_id][0], &vad_hover_flag[sce_id][0], &attack_flag[sce_id][0], + realBuffer[sce_id][0], imagBuffer[sce_id][0], old_wsp[sce_id][0], pitch_fr[sce_id][0], voicing_fr[sce_id][0], &loc_harm[sce_id][0], &cor_map_sum[sce_id][0], &vad_flag_dtx[sce_id][0], enerBuffer[sce_id][0], + fft_buff[sce_id][0], A[sce_id][0], lsp_new[sce_id][0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, 0, 0, 0, 0, ISM_FORMAT, 0, st_ivas->hEncoderConfig->ivas_total_brate ); +#else error = pre_proc_front_ivas( hSCE, NULL, hSCE->element_brate, nb_bits_metadata[sce_id], input_frame, 0, old_inp_12k8[sce_id][0], old_inp_16k[sce_id][0], &ener[sce_id][0], &relE[sce_id][0], A[sce_id][0], Aw[sce_id][0], epsP[sce_id][0], lsp_new[sce_id][0], lsp_mid[sce_id][0], &vad_hover_flag[sce_id][0], &attack_flag[sce_id][0], realBuffer[sce_id][0], imagBuffer[sce_id][0], old_wsp[sce_id][0], pitch_fr[sce_id][0], voicing_fr[sce_id][0], &loc_harm[sce_id][0], &cor_map_sum[sce_id][0], &vad_flag_dtx[sce_id][0], enerBuffer[sce_id][0], fft_buff[sce_id][0], A[sce_id][0], lsp_new[sce_id][0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, 0, 0, 0, 0, ISM_FORMAT, 0, st_ivas->hEncoderConfig->ivas_total_brate ); +#endif if ( error != IVAS_ERR_OK ) { return error; diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 6c2d569af..27b8e492c 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -136,7 +136,7 @@ ivas_error ivas_masa_enc_open( for ( i = 0; i < hMasa->data.num_Cldfb_instances; i++ ) { - if ( ( error = openCldfb_ivas( &( hMasa->data.cldfbAnaEnc[i] ), CLDFB_ANALYSIS, hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + if ( ( error = openCldfb_ivas_enc( &( hMasa->data.cldfbAnaEnc[i] ), CLDFB_ANALYSIS, hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_omasa_enc.c b/lib_enc/ivas_omasa_enc.c index 075135e41..353be1fec 100644 --- a/lib_enc/ivas_omasa_enc.c +++ b/lib_enc/ivas_omasa_enc.c @@ -90,7 +90,7 @@ ivas_error ivas_omasa_enc_open( hOMasa->num_Cldfb_instances = numAnalysisChannels; for ( i = 0; i < hOMasa->num_Cldfb_instances; i++ ) { - if ( ( error = openCldfb_ivas( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, st_ivas->hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + if ( ( error = openCldfb_ivas_enc( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, st_ivas->hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index 3e40937fb..396df4b64 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -175,12 +175,19 @@ ivas_error ivas_sce_enc( /*----------------------------------------------------------------* * Front Pre-processing *----------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED + error = pre_proc_front_ivas_fx( hSCE, NULL, hSCE->element_brate, nb_bits_metadata, input_frame, 0, old_inp_12k8[0], old_inp_16k[0], + &ener[0], &relE[0], A[0], Aw[0], epsP[0], lsp_new[0], lsp_mid[0], &vad_hover_flag[0], &attack_flag[0], + realBuffer[0], imagBuffer[0], old_wsp[0], pitch_fr[0], voicing_fr[0], &loc_harm[0], &cor_map_sum[0], &vad_flag_dtx[0], enerBuffer[0], + fft_buff[0], A[0], lsp_new[0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, flag_16k_smc, + st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->force_front_vad : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_dtx_flag : 0, ivas_format, 0, st_ivas->hEncoderConfig->ivas_total_brate ); +#else error = pre_proc_front_ivas( hSCE, NULL, hSCE->element_brate, nb_bits_metadata, input_frame, 0, old_inp_12k8[0], old_inp_16k[0], &ener[0], &relE[0], A[0], Aw[0], epsP[0], lsp_new[0], lsp_mid[0], &vad_hover_flag[0], &attack_flag[0], realBuffer[0], imagBuffer[0], old_wsp[0], pitch_fr[0], voicing_fr[0], &loc_harm[0], &cor_map_sum[0], &vad_flag_dtx[0], enerBuffer[0], fft_buff[0], A[0], lsp_new[0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, flag_16k_smc, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->force_front_vad : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_dtx_flag : 0, ivas_format, 0, st_ivas->hEncoderConfig->ivas_total_brate ); +#endif if ( error != IVAS_ERR_OK ) { return error; diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index aebe83ca1..6959f9e5e 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -367,6 +367,9 @@ static void stereo_dft_enc_open( hStereoDft->win_ana_energy = (float) hStereoDft->N - hStereoDft->dft_ovl; hStereoDft->win_ana_energy += 2 * sum_f( win, hStereoDft->dft_ovl ); hStereoDft->win_ana_energy = hStereoDft->win_ana_energy / hStereoDft->NFFT; +#ifdef IVAS_FLOAT_FIXED + hStereoDft->win_ana_energy_fx = (Word16) ( hStereoDft->win_ana_energy * ( 1 << 15 ) ); +#endif set_f( hStereoDft->output_mem_dmx_32k, 0, STEREO_DFT_OVL_32k ); hStereoDft->dft_zp = (int16_t) ( STEREO_DFT_ZP_MAX_ENC * input_Fs / 48000 ); diff --git a/lib_enc/ivas_stereo_switching_enc.c b/lib_enc/ivas_stereo_switching_enc.c index 03cf7bfe2..1e97552e3 100644 --- a/lib_enc/ivas_stereo_switching_enc.c +++ b/lib_enc/ivas_stereo_switching_enc.c @@ -403,7 +403,7 @@ ivas_error stereo_memory_enc( /* allocate CLDFB for primary channel */ if ( st->cldfbAnaEnc == NULL ) { - if ( ( error = openCldfb_ivas( &st->cldfbAnaEnc, CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + if ( ( error = openCldfb_ivas_enc( &st->cldfbAnaEnc, CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) { return error; } @@ -419,7 +419,7 @@ ivas_error stereo_memory_enc( if ( st->cldfbSynTd == NULL ) { - if ( ( error = openCldfb_ivas( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + if ( ( error = openCldfb_ivas_enc( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) { return error; } @@ -553,7 +553,7 @@ ivas_error stereo_memory_enc( for ( i = 0; i < CPE_CHANNELS; i++ ) { st = hCPE->hCoreCoder[i]; - if ( ( error = openCldfb_ivas( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + if ( ( error = openCldfb_ivas_enc( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_stereo_td_enc.c b/lib_enc/ivas_stereo_td_enc.c index 8a388ca92..1c899987e 100644 --- a/lib_enc/ivas_stereo_td_enc.c +++ b/lib_enc/ivas_stereo_td_enc.c @@ -311,7 +311,7 @@ ivas_error stereo_set_tdm( /* allocate CLDFB ana for secondary channel */ if ( st->cldfbAnaEnc == NULL ) { - if ( ( error = openCldfb_ivas( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + if ( ( error = openCldfb_ivas_enc( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) { return error; } @@ -325,7 +325,7 @@ ivas_error stereo_set_tdm( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); } - if ( ( error = openCldfb_ivas( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + if ( ( error = openCldfb_ivas_enc( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/lsf_enc.c b/lib_enc/lsf_enc.c index ea07e8a1e..a9671520e 100644 --- a/lib_enc/lsf_enc.c +++ b/lib_enc/lsf_enc.c @@ -43,6 +43,9 @@ #include "prot_fx2.h" #include "basop_proto_func.h" #include "ivas_prot.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_prot_fx.h" +#endif #include "ivas_rom_com.h" #include "wmc_auto.h" diff --git a/lib_enc/lsf_enc_fx.c b/lib_enc/lsf_enc_fx.c index 3926f4a2b..1009c2bcc 100644 --- a/lib_enc/lsf_enc_fx.c +++ b/lib_enc/lsf_enc_fx.c @@ -8,9 +8,10 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ -#include "prot_fx_enc.h" /* Function prototypes */ +#include "prot_fx1.h" /* Function prototypes */ +#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx_enc.h" /* Function prototypes */ +#include "ivas_prot_fx.h" /* Function prototypes */ /*-----------------------------------------------------------------* @@ -29,8 +30,12 @@ static void lsfq_CNG_fx( BSTR_ENC_HANDLE hBstr, const Word16 *lsf, const Word16 static Word32 vq_lvq_lsf_enc( Word16 pred_flag, Word16 mode, Word16 u[], Word16 *levels, Word16 stages, Word16 w[], Word16 Idx[], const Word16 *lsf, const Word16 *pred, Word32 p_offset_scale1[][MAX_NO_SCALES + 1], Word32 p_offset_scale2[][MAX_NO_SCALES + 1], Word16 p_no_scales[][2], Word16 *resq, Word16 *lsfq ); +static Word32 vq_lvq_lsf_enc_ivas_fx( Word16 pred_flag, Word16 mode, Word16 u[], Word16 *levels, Word16 stages, Word16 w[], Word16 Idx[], const Word16 *lsf, const Word16 *pred, Word16 *resq, Word16 *lsfq ); + static void lsf_mid_enc_fx( BSTR_ENC_HANDLE hBstr, int16_t nb_bits, const Word16 int_fs, const Word16 qlsp0[], const Word16 qlsp1[], Word16 lsp[], const Word16 coder_type, const Word16 bwidth, Word32 Bin_Ener_old[], Word32 Bin_Ener[], Word16 Q_ener, Word16 ppp_mode, Word16 nelp_mode ); +static void lsf_mid_enc_ivas_fx( BSTR_ENC_HANDLE hBstr, int16_t nb_bits, const Word32 int_fs, const Word16 qlsp0[], const Word16 qlsp1[], Word16 lsp[], const Word16 coder_type, const Word16 bwidth, Word32 Bin_Ener_old[], Word16 Q_ener, Word16 ppp_mode, Word16 nelp_mode ); + /*===========================================================================*/ /* FUNCTION : lsf_enc_fx() */ /*---------------------------------------------------------------------------*/ @@ -336,7 +341,266 @@ void lsf_enc_fx( return; } +void lsf_enc_ivas_fx( + Encoder_State *st, /* i/o: state structure */ + Word16 *lsf_new, /* o : quantized LSF vector */ + Word16 *lsp_new, /* i/o: LSP vector to quantize/quantized */ + Word16 *lsp_mid, /* i/o : mid-frame LSP vector */ + Word16 *Aq, /* o : quantized A(z) for 4 subframes */ + const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const Word16 GSC_IVAS_mode, /* i : GSC IVAS mode */ + const Word16 tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ + const Word16 Q_new ) +{ + Word16 nBits = 0; + Word16 int_fs; + Word16 force_sf = 0; + Word16 fec_lsf[M], stab, i; + Word16 no_param_lpc; + + Word16 param_lpc[NPRM_LPC_NEW]; + Word32 L_tmp; + Word16 coder_type, ppp_mode, nelp_mode; + + test(); + IF( EQ_32( st->core_brate, SID_2k40 ) || EQ_32( st->core_brate, SID_1k75 ) ) + { + coder_type = INACTIVE; + move16(); + } + ELSE + { + coder_type = st->coder_type; + move16(); + } + + test(); + if ( EQ_16( coder_type, AUDIO ) && GSC_IVAS_mode > 0 ) + { + coder_type = GENERIC; + move16(); + } + + no_param_lpc = 0; + move16(); + + IF( st->Opt_SC_VBR ) + { + ppp_mode = st->hSC_VBR->ppp_mode; + nelp_mode = st->hSC_VBR->nelp_mode; + move16(); + move16(); + } + ELSE + { + ppp_mode = 0; + nelp_mode = 0; + move16(); + move16(); + } + + /* initialize */ +#if 0 + int_fs = INT_FS_16k_FX; + move16(); + if (EQ_16(L_frame, L_FRAME)) + { + int_fs = INT_FS_FX; + move16(); + } +#else + assert( st->sr_core <= 32000 ); + int_fs = extract_l( st->sr_core ); + move32(); +#endif + /* convert LSPs to LSFs */ + lsp2lsf_fx( lsp_new, lsf_new, M, int_fs ); + + /* check resonance for pitch clipping algorithm */ + gp_clip_test_lsf_fx( st->element_mode, lsf_new, st->clip_var_fx, 0 ); + + /* Find the number of bits for LSF quantization */ + nBits = 0; + move16(); + IF( EQ_32( st->core_brate, SID_2k40 ) ) + { + nBits = LSF_BITS_CNG; + move16(); + } + ELSE + { + test(); + IF( ( nelp_mode == 0 ) && ( ppp_mode == 0 ) ) + { + nBits = st->acelp_cfg.lsf_bits; + move16(); + } + ELSE IF( EQ_16( nelp_mode, 1 ) ) + { + nBits = 30; + move16(); + + if ( EQ_16( st->bwidth, NB ) ) + { + nBits = 32; + move16(); + } + } + ELSE IF( EQ_16( ppp_mode, 1 ) ) + { + nBits = 26; + move16(); + } + } + force_sf = 0; + move16(); + /* first three ACELP frames after an HQ frame shall be processed only with safety-net quantizer */ + test(); + if ( LT_16( st->Nb_ACELP_frames, 3 ) && NE_32( st->core_brate, SID_2k40 ) ) + { + force_sf = 1; + move16(); + } + + /* in case of unstable filter in decoder FEC, choose safety-net to help FEC */ + IF( EQ_16( st->next_force_safety_net_fx, 1 ) ) + { + force_sf = 1; + move16(); + st->next_force_safety_net_fx = 0; + move16(); + } + + /*-------------------------------------------------------------------------------------* + * Frame end LSF quantization + *-------------------------------------------------------------------------------------*/ + lsf_end_enc_ivas_fx( st, lsf_new, lsf_new, nBits, coder_type, Q_new + QSCALE - 2, + force_sf, param_lpc, &no_param_lpc, NULL, st->coder_type_raw, tdm_lsfQ_PCh ); + + /* convert quantized LSFs back to LSPs */ + lsf2lsp_fx( lsf_new, lsp_new, M, st->sr_core ); + + test(); + IF( EQ_16( st->last_core, HQ_CORE ) && EQ_16( st->core, ACELP_CORE ) ) + { + /* don't use old LSF values if this is the first ACELP frame after HQ frames */ + Copy( lsf_new, st->lsf_old_fx, M ); + } + /* set seed_acelp used in UC mode */ + + test(); + IF( EQ_16( coder_type, UNVOICED ) && GT_16( st->element_mode, EVS_MONO ) ) + { + st->seed_acelp = 0; + move16(); + FOR( i = no_param_lpc - 1; i >= 0; i-- ) + { + /* rightshift before *seed_acelp+param_lpc[i] to avoid overflows*/ + st->seed_acelp = add( i_mult( add( shr( st->seed_acelp, 1 ), param_lpc[i] ), 31821 ), 13849 ); + } + } + + IF( EQ_32( st->core_brate, SID_2k40 ) ) + { + /* return if SID frame (conversion to A(z) done in the calling function) */ + return; + } + + /*-------------------------------------------------------------------------------------* + * FEC - enforce safety-net in the next frame in case of unstable filter + *-------------------------------------------------------------------------------------*/ + + IF( NE_16( st->last_L_frame, st->L_frame ) ) + { + /* FEC - in case of core switching, use old LSFs */ + Copy( st->lsf_old_fx, st->lsfoldbfi1_fx, M ); + Copy( st->lsf_old_fx, st->lsfoldbfi0_fx, M ); + Copy( st->lsf_old_fx, st->lsf_adaptive_mean_fx, M ); + } + + FEC_lsf_estim_enc_fx( st, fec_lsf ); + + /* in case of FEC in decoder - calculate LSF stability */ + stab = lsf_stab_ivas_fx( lsf_new, fec_lsf, 0, st->L_frame ); + + test(); + test(); + test(); + /* If decoder FEC frame may be unstable force safety-net usage */ + IF( ( EQ_16( st->L_frame, L_FRAME16k ) ) && ( LT_16( stab, STAB_FAC_LIMIT_FX ) ) && ( EQ_16( coder_type, GENERIC ) ) ) + { + st->next_force_safety_net_fx = 1; + move16(); + } + ELSE IF( ( LT_16( stab, STAB_FAC_LIMIT_FX ) ) && ( EQ_16( st->clas, VOICED_CLAS ) || ( LT_16( st->clas, VOICED_CLAS ) && EQ_16( coder_type, AUDIO ) ) ) ) + { + st->next_force_safety_net_fx = 1; + move16(); + } + + + /* FEC - update adaptive LSF mean vector */ + FOR( i = 0; i < M; i++ ) + { + L_tmp = L_mult( lsf_new[i], 10922 ); /*Q(x2.56+16)*/ + L_tmp = L_mac( L_tmp, st->lsfoldbfi1_fx[i], 10922 ); /*Q(x2.56+16)*/ + L_tmp = L_mac( L_tmp, st->lsfoldbfi0_fx[i], 10922 ); /*Q(x2.56+16)*/ + st->lsf_adaptive_mean_fx[i] = round_fx( L_tmp ); /*Q(x2.56)*/ + } + + /* FEC - update LSF memories */ + Copy( st->lsfoldbfi0_fx, st->lsfoldbfi1_fx, M ); + Copy( lsf_new, st->lsfoldbfi0_fx, M ); + + + /*-------------------------------------------------------------------------------------* + * Mid-frame LSF encoding + * LSP interpolation and conversion of LSPs to A(z) + *-------------------------------------------------------------------------------------*/ + IF( st->rate_switching_reset ) + { + /*extrapolation in case of unstable LSF convert*/ + Copy( lsp_new, st->lsp_old_fx, M ); + Copy( lsf_new, st->lsf_old_fx, M ); + } + /* Mid-frame LSF encoding */ + lsf_mid_enc_ivas_fx( st->hBstr, st->acelp_cfg.mid_lsf_bits, st->sr_core, st->lsp_old_fx, lsp_new, lsp_mid, coder_type, st->bwidth, st->Bin_E_old_fx, Q_new + QSCALE - 2, ppp_mode, nelp_mode ); + + test(); + IF( EQ_16( st->last_core, HQ_CORE ) && EQ_16( st->core, ACELP_CORE ) ) + { + /* don't use old LSP/LSF values if this is the first ACELP frame after HQ frames */ + Copy( lsp_mid, st->lsp_old_fx, M ); + lsp2lsf_fx( lsp_mid, st->lsf_old_fx, M, int_fs ); + } + + /* LSP interpolation and conversion of LSPs to A(z) */ + test(); + IF( EQ_16( tdm_low_rate_mode, 1 ) && GT_16( coder_type, UNVOICED ) ) + { + IF( EQ_16( st->active_cnt, 1 ) ) + { + Copy( lsp_mid, st->lsp_old_fx, M ); + lsp2lsf_fx( lsp_mid, st->lsf_old_fx, M, int_fs ); + Copy( lsp_new, lsp_mid, M ); + } + /* LSP interpolation and conversion of LSPs to A(z) - two-subframe mode */ + int_lsp4_fx( st->L_frame, st->lsp_old_fx, lsp_mid, lsp_new, Aq, M, -2 ); + } + ELSE + { + int_lsp4_fx( st->L_frame, st->lsp_old_fx, lsp_mid, lsp_new, Aq, M, 0 ); + } + /*------------------------------------------------------------------* + * Check LSF stability (distance between old LSFs and current LSFs) + *------------------------------------------------------------------*/ + IF( NE_32( st->core_brate, SID_2k40 ) ) + { + st->stab_fac_fx = lsf_stab_ivas_fx( lsf_new, st->lsf_old_fx, 0, st->L_frame ); + } + return; +} /*-------------------------------------------------------------------* * lsfq_CNG_fx() * @@ -441,47 +705,136 @@ static void lsfq_CNG_fx( return; } -/*-------------------------------------------------------------------* - * qlsf_Mode_Select_fx() - * - * Mode selection for LSF quantizer - *-------------------------------------------------------------------*/ - - -static Word16 qlsf_Mode_Select_fx( - const Word16 *w, /* i : weighting vector Q8 */ - const Word16 *pred1, /* i : prediction vector x2.56 */ - const Word16 streaklimit, /* i : predictive streak limit Q15 */ - const Word32 op_loop_thr /* i : Open-loop Threshold */ +static void lsfq_CNG_ivas_fx( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 *lsf, /*x2.56 unquantized LSF vector */ + const Word16 *wghts, /*Q10 LSF weights */ + Word16 *qlsf /*x2.56 quantized LSF vecotor */ ) { - Word16 pred_pow2[M]; - Word32 temp32, En = 0; - Word16 safety_net; - Word16 i, cs, cl; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif + Word16 i, j, idx_cv, idx_lvq[3]; + Word32 min_dist, dist; + Word16 dd[M], ddq[M]; + const Word16 *p_cb; + Word16 first_cb, last_cb; + Word16 idx_lead_cng[2], idx_scale_cng[2]; + Word16 tmp; - /* calculate the prediction residual */ - cl = 0; + idx_cv = 0; move16(); - FOR( i = 0; i < M; i++ ) + + /* quantize first stage with 4 bits + The sampling frequency of the LP-CNG frame can be determined by checking the value of the highest order LSF + coefficient (last coefficient of lsf). If the last LSF coefficient (lsf[M-1]) is larger than 6350 + the decoded frame is WB2 with sampling rate of 16 kHz, otherwise it is sampled at 12.8kHz and contains + either NB or WB LSF data. */ + IF( GT_16( lsf[M - 1], WB_LIMIT_LSF_FX ) ) /* 16kHz sampled LSF vector*/ { - cl = s_max( cl, abs_s( pred1[i] ) ); + p_cb = &CNG_SN1_fx[0]; + move16(); + first_cb = 0; + move16(); + last_cb = 6; + move16(); } - cs = norm_s( cl ); - En = 0; - move16(); - FOR( i = 0; i < M; i++ ) + ELSE /* 12.8kHz sampled LSF vector*/ { - pred_pow2[i] = shl( pred1[i], cs ); + p_cb = &CNG_SN1_fx[6 * M]; move16(); -#ifdef BASOP_NOGLOB - En = L_mac_o( En, mult( pred_pow2[i], shl_o( w[i], 2, &Overflow ) ), pred_pow2[i], &Overflow ); /* 2.56*2.56 at Q-4 */ -#else /* BASOP_NOGLOB */ - En = L_mac( En, mult( pred_pow2[i], shl( w[i], 2 ) ), pred_pow2[i] ); /* 2.56*2.56 at Q-4 */ -#endif /* BASOP_NOGLOB */ + first_cb = 6; + move16(); + last_cb = M; + move16(); + } + + + min_dist = L_add( MAXINT32, 0 ); + FOR( i = first_cb; i < last_cb; i++ ) + { + tmp = sub( *p_cb, shl( lsf[0], 1 ) ); /*x2.56 */ + dist = Mult_32_16( L_mult0( wghts[0], *p_cb ), tmp ); /*Q8 + x2.56 -Q15 + x2.56 = Q-7 + x2.56+x.256 */ + p_cb++; + FOR( j = 1; j < M; j++ ) + { + tmp = sub( *p_cb, lsf[j] ); + tmp = sub( tmp, lsf[j] ); + + dist = L_add( dist, Mult_32_16( L_mult0( wghts[j], *p_cb ), tmp ) ); + p_cb++; + } + IF( LT_32( dist, min_dist ) ) + { + min_dist = dist; + move16(); /*Q-4 */ + idx_cv = i; + move16(); + } + } + + /* calculate difference */ + FOR( i = 0; i < M; i++ ) + { + dd[i] = sub( lsf[i], CNG_SN1_fx[idx_cv * M + i] ); /*x2.56 */ + move16(); + } + + /* quantize the difference with LVQ */ + /* MSVQ_ROM to be updated */ + mslvq_cng_ivas_fx( idx_cv, dd, qlsf, ddq, idx_lead_cng, idx_scale_cng, wghts ); + + index_lvq_ivas_fx( ddq, idx_lead_cng, idx_scale_cng, START_CNG + idx_cv, idx_lvq, 0 ); + Vr_add( qlsf, &CNG_SN1_fx[idx_cv * M], qlsf, M ); + + /* write the VQ index to the bitstream */ + push_indice_fx( hBstr, IND_ISF_0_0, idx_cv, 4 ); + + /* write the LVQ index to the bitstream */ + push_indice_fx( hBstr, IND_ISF_0_1, idx_lvq[0], LEN_INDICE ); + push_indice_fx( hBstr, IND_ISF_0_1, idx_lvq[1], LSF_BITS_CNG - 4 - LEN_INDICE ); + + return; +} +/*-------------------------------------------------------------------* + * qlsf_Mode_Select_fx() + * + * Mode selection for LSF quantizer + *-------------------------------------------------------------------*/ + + +static Word16 qlsf_Mode_Select_fx( + const Word16 *w, /* i : weighting vector Q8 */ + const Word16 *pred1, /* i : prediction vector x2.56 */ + const Word16 streaklimit, /* i : predictive streak limit Q15 */ + const Word32 op_loop_thr /* i : Open-loop Threshold */ +) +{ + Word16 pred_pow2[M]; + Word32 temp32, En = 0; + Word16 safety_net; + Word16 i, cs, cl; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; +#endif + + /* calculate the prediction residual */ + cl = 0; + move16(); + FOR( i = 0; i < M; i++ ) + { + cl = s_max( cl, abs_s( pred1[i] ) ); + } + cs = norm_s( cl ); + En = 0; + move16(); + FOR( i = 0; i < M; i++ ) + { + pred_pow2[i] = shl( pred1[i], cs ); + move16(); +#ifdef BASOP_NOGLOB + En = L_mac_o( En, mult( pred_pow2[i], shl_o( w[i], 2, &Overflow ) ), pred_pow2[i], &Overflow ); /* 2.56*2.56 at Q-4 */ +#else /* BASOP_NOGLOB */ + En = L_mac( En, mult( pred_pow2[i], shl( w[i], 2 ) ), pred_pow2[i] ); /* 2.56*2.56 at Q-4 */ +#endif /* BASOP_NOGLOB */ } cs = shl( cs, 1 ); @@ -543,11 +896,630 @@ static Word16 qlsf_Mode_Select_fx( /* _ (Word16*) qlsf : quantized LSFs in the cosine domain x2.56 */ /*------------------------------------------------------------------------*/ -/*------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*========================================================================*/ -void lsf_end_enc_fx( +/*------------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*========================================================================*/ +void lsf_end_enc_fx( + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 *lsf, /* i : LSF in the frequency domain (0..6400) */ + Word16 *qlsf, /* o : quantized LSF */ + const Word16 nBits_in, /* i : number of bits to spend on ISF quantization */ + const Word16 coder_type_org, /* i : coding type */ + Word16 Q_ener, /* i : Q valuen for Bin_Ener */ + Word16 force_sf, /* i : Force safety-net usage if coding type supports */ + Word16 *lpc_param, + Word16 *no_indices, + Word16 *bits_param_lpc, + Word16 coder_type_raw /* i : Coder type (LSF coder_type have some special cases)*/ +#ifdef LSF_RE_USE_SECONDARY_CHANNEL + , + const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ +#endif +) +{ + Word16 i; + Word16 Idx0[MAX_VQ_STAGES + 3]; /* Optimal codebook indices for safety-net quantizer */ + Word16 Idx1[MAX_VQ_STAGES + 3]; /* Optimal codebook indices for predictive quantizer */ + Word16 indice[MAX_VQ_STAGES + 3]; /* Temp. array of indice for vector de-quantizer */ + Word16 mode_lvq = 0, mode_lvq_p = 0; /* LVQ mode and predictive LVQ mode */ + Word16 bits0[MAX_VQ_STAGES], bits1[MAX_VQ_STAGES]; + const Word16 *Bit_alloc1 = NULL; + Word32 Err[2]; /* Quantization error for safety-net(0) and predictive(1) quantizers */ + Word16 Tmp[M]; /* Temporary target vector (mean and prediction removed) */ + Word16 pred0[M]; /* Prediction for the safety-net quantizer (usually mean) */ + Word16 pred1[M]; /* Prediction for the predictive quantizer */ + Word16 pred2[M]; /* Prediction for the predictive quantizer */ + Word16 wghts[M]; /* Weighting used for quantizer (currently GSM based) */ + Word16 stages0; /* Amount of stages used by safety-net quantizer */ + Word16 stages1; /* Amount of stages used by predictive quantizer */ + Word16 levels0[MAX_VQ_STAGES]; /* Sizes of different codebook stages for safety-net quantizer */ + Word16 levels1[MAX_VQ_STAGES]; /* Sizes of different codebook stages for predictive quantizer */ + Word16 predmode; /* 0: safety-net only, 1: predictive only, 2: best of the two */ + Word16 safety_net, cumleft, num_bits; + Word16 *Idx, stages, *bits; + Word16 Tmp2[M], Tmp1[M]; + Word32 abs_threshold; /* Absolute threshold depending on signal bandwidth, that indicates + very good perceptual LSF quantization performance */ + Word16 lsfq[M * 2], resq[M * 2]; + Word16 coder_type; /* coder type (from LSF quantizer point of view) */ + Word16 nBits; /* Number of bits */ + Word16 TCQIdx0[M + 2]; /* Optimal codebook indices for VQ-TCQ quantizer */ + Word16 *TCQIdx; + Word16 tmp; + Word16 flag_1bit_gran; + BSTR_ENC_HANDLE hBstr = st->hBstr; +#ifdef LSF_RE_USE_SECONDARY_CHANNEL + Word16 pred3[M]; + Word16 dummy, dummy_v[5]; +#endif + + flag_1bit_gran = (Word16) GT_16( st->element_mode, EVS_MONO ); + + nBits = nBits_in; + move16(); + /* Update LSF coder_type for LSF quantizer for some special cases */ + test(); + test(); + test(); +#ifdef LSF_RE_USE_SECONDARY_CHANNEL + IF( EQ_16( coder_type_org, GENERIC ) && EQ_32( st->sr_core, INT_FS_16k ) && EQ_16( st->codec_mode, MODE1 ) && ( st->idchan == 0 ) ) /* this bit is used only for primary channel or mono */ +#else + IF( EQ_16( coder_type_org, GENERIC ) && EQ_32( st->sr_core, INT_FS_16k ) && EQ_16( st->codec_mode, MODE1 ) ) +#endif + { + IF( EQ_16( coder_type_raw, VOICED ) ) + { + coder_type = VOICED; + move16(); /* Reflect Inactive mode */ + if ( EQ_16( flag_1bit_gran, 1 ) ) + { + nBits = sub( nBits, 1 ); /* This is for real Generic*/ + } + } + ELSE + { + nBits = sub( nBits, 1 ); /* This is for real Generic*/ + coder_type = coder_type_org; + move16(); + } + } + ELSE + { + coder_type = coder_type_org; + move16(); + } + + /*----------------------------------------------------------------------------------- -* + * Calculate the number of stages and levels for each stage based on allowed bit budget + * Set absolute threshold for codebook-type decision logic depending on signal bandwidth + *------------------------------------------------------------------------------------ -*/ + IF( EQ_16( st->bwidth, NB ) ) + { + abs_threshold = L_add( SFNETLOWLIMIT_NB, 0 ); + } + ELSE + { + abs_threshold = L_add( SFNETLOWLIMIT_WB, 0 ); + } + /* Calculate LSF weighting coefficients */ + Unified_weighting_fx( &st->Bin_E_fx[L_FFT / 2], Q_ener, lsf, wghts, (Word16) EQ_16( st->bwidth, NB ), (Word16) EQ_16( coder_type, UNVOICED ), st->sr_core, M ); + + /*--------------------------------------------------------------------------------* + * LSF quantization of SID frames + *--------------------------------------------------------------------------------*/ + IF( EQ_32( st->core_brate, SID_2k40 ) ) + { + lsfq_CNG_fx( hBstr, lsf, wghts, qlsf, &st->offset_scale1_fx[0][0], &st->offset_scale2_fx[0][0], &st->no_scales_fx[0][0] ); + sort_fx( qlsf, 0, M - 1 ); + reorder_lsf_fx( qlsf, MODE1_LSF_GAP_FX, M, st->sr_core ); + + return; + } + /* Find allowed predictor mode for current coder_type. (SN only (0), SN/AR switched (2) or MA predictive (1) */ + find_pred_mode( &predmode, coder_type, st->bwidth, st->sr_core, &mode_lvq, &mode_lvq_p, st->total_brate ); + + /*----------------------------------------------------------------* + * Calculate number of stages and levels for each stage based on the allowed bit allocation + * (subtract one bit for LSF predictor selection) + *----------------------------------------------------------------*/ + lsf_allocate_fx( sub( nBits, shr( predmode, 1 ) ), mode_lvq, mode_lvq_p, &stages0, &stages1, levels0, levels1, bits0, bits1 ); + + + /*--------------------------------------------------------------------------------* + * LSF quantization of all other frames but SID frames + * Select safety-net or predictive mode + *--------------------------------------------------------------------------------*/ + + Err[0] = MAXINT32; + move32(); + Err[1] = MAXINT32; + move32(); + /* for mem_MA update */ + FOR( i = 0; i < M; i++ ) + { + pred1[i] = add( ModeMeans_fx[mode_lvq][i], mult_r( MU_MA_FX, st->mem_MA_fx[i] ) ); + move16(); + } +#ifdef LSF_RE_USE_SECONDARY_CHANNEL + /* TD stereo SCh: perform intra-frame prediction with pulling-to-mean */ + if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL ) + { + /* if secondary channel predmode is set to be > 2 */ + predmode += 3; + + tdm_SCh_LSF_intra_pred( st->element_brate, tdm_lsfQ_PCh, pred3 ); + } +#endif + IF( predmode == 0 ) + { + /* Subtract only mean */ + Copy( ModeMeans_fx[mode_lvq], pred0, M ); + Vr_subt( lsf, pred0, Tmp, M ); + + /* LVQ quantization (safety-net only) */ + Err[0] = vq_lvq_lsf_enc( 0, mode_lvq, Tmp, levels0, stages0, wghts, Idx0, lsf, pred0, + st->offset_scale1_fx, st->offset_scale2_fx, st->no_scales_fx, resq, lsfq ); + safety_net = 1; + move16(); + st->pstreaklen_fx = 0; + move16(); /* predictive LSF quantizer streak is ended with safety-net */ + } + ELSE IF( EQ_16( predmode, 1 ) ) /* only MA prediction */ + { + Vr_subt( lsf, pred1, Tmp1, M ); + Err[1] = vq_lvq_lsf_enc( 2, mode_lvq_p, Tmp1, levels1, stages1, wghts, Idx1, lsf, pred1, + st->offset_scale1_p_fx, st->offset_scale2_p_fx, st->no_scales_p_fx, resq, lsfq ); + + safety_net = 0; + move16(); + } + ELSE +#ifdef LSF_RE_USE_SECONDARY_CHANNEL + PMT( "LSF_RE_USE_SECONDARY_CHANNEL CODE IS MISSING " ) + { + if ( predmode == 2 ) +#endif + { + /* Adaptive scaling factor (multiplier) is updated in order to reduce the amount of consecutive predictive frames in + case of possible frame erasure. AR-predictive usage for VOICED mode is allowed to be higher than other modes. */ + test(); + test(); + test(); + IF( ( ( GT_16( st->pstreaklen_fx, ( STREAKLEN + 3 ) ) ) && ( EQ_16( coder_type, VOICED ) ) ) || ( ( GT_16( st->pstreaklen_fx, ( STREAKLEN ) ) ) && ( NE_16( coder_type, VOICED ) ) ) ) + { + /* update the adaptive scaling factor to become smaller with increasing number of concecutive predictive frames. */ + st->streaklimit_fx = mult( st->streaklimit_fx, STREAKMULT_FX ); + move16(); + } + + IF( st->pstreaklen_fx == 0 ) + { + /* reset the consecutive AR-predictor multiplier */ + st->streaklimit_fx = 32767; /*1.0 in Q15 */ + move16(); + } + + /* VOICED_WB@16kHz */ + test(); + IF( EQ_32( st->sr_core, INT_FS_16k ) && EQ_16( coder_type, VOICED ) && flag_1bit_gran == 0 ) + { + /* Subtract mean and AR prediction */ + Copy( ModeMeans_fx[mode_lvq], pred0, M ); + /* subtract only mean */ + Vr_subt( lsf, pred0, Tmp, M ); + + FOR( i = 0; i < M; i++ ) + { + /* subtract mean and AR prediction */ + pred2[i] = mult( Predictors_fx[mode_lvq_p][i], sub( st->mem_AR_fx[i], pred0[i] ) ); + Tmp2[i] = sub( Tmp[i], pred2[i] ); + pred2[i] = add( pred2[i], pred0[i] ); + } + + /* select safety_net or predictive */ + safety_net = qlsf_Mode_Select_fx( wghts, Tmp2, st->streaklimit_fx, OP_LOOP_THR_HVO ); + IF( EQ_16( force_sf, 1 ) ) + { + safety_net = 1; + move16(); + } + + IF( safety_net ) + { + /* Safety-net - BC-TCQ quantization : SN */ + Err[0] = qlsf_ARSN_tcvq_Enc_16k_fx( Tmp, lsfq, TCQIdx0, wghts, sub( nBits, 1 ), safety_net ); + st->pstreaklen_fx = 0; + move16(); + } + ELSE + { + /* predictive - BC-TCQ quantization : AR */ + Err[1] = qlsf_ARSN_tcvq_Enc_16k_fx( Tmp2, lsfq, TCQIdx0, wghts, sub( nBits, 1 ), safety_net ); + st->pstreaklen_fx = add( st->pstreaklen_fx, 1 ); + } + } + /* all other frames (not VOICED@16kHz) */ + ELSE + { + /* Subtract mean and AR prediction */ + Copy( ModeMeans_fx[mode_lvq], pred0, M ); + /* subtract only mean */ + Vr_subt( lsf, pred0, Tmp, M ); + + FOR( i = 0; i < M; i++ ) + { + /* subtract mean and AR prediction */ + pred2[i] = add( pred0[i], mult( Predictors_fx[mode_lvq_p][i], sub( st->mem_AR_fx[i], pred0[i] ) ) ); + Tmp2[i] = sub( lsf[i], pred2[i] ); + } + + /* safety-net */ + Err[0] = vq_lvq_lsf_enc( 0, mode_lvq, Tmp, levels0, stages0, wghts, Idx0, lsf, pred0, st->offset_scale1_fx, st->offset_scale2_fx, st->no_scales_fx, resq, lsfq ); + /* Predictive quantizer is calculated only if it can be selected */ + test(); + IF( !force_sf || GT_32( Err[0], abs_threshold ) ) + { + Err[1] = vq_lvq_lsf_enc( 2, mode_lvq_p, Tmp2, levels1, stages1, wghts, Idx1, lsf, pred2, + st->offset_scale1_p_fx, st->offset_scale2_p_fx, st->no_scales_p_fx, &resq[M], &lsfq[M] ); + } + test(); + test(); + /* Select whether to use safety-net (non-predictive) or predictive LSF quantizer. The decision is based on following: + if the non-predictive (safety-net) quantization error (Err[0]) is low enough (spectral distortion is low) it is selected + or if the predictively quantized error (Err[1]) is by at least adaptive margin smaller than non-predictive quantizer. + or if the in case of frame erasure the resulting concealed predictive LSF would be unstable safety-net is selected */ + IF( force_sf || LT_32( Mult_32_16( Err[0], ( st->streaklimit_fx ) ), L_add( Err[1], Mult_32_16( Err[1], PREFERSFNET_FX ) ) ) || LT_32( Err[0], abs_threshold ) ) + { + safety_net = 1; + move16(); + st->pstreaklen_fx = 0; + move16(); /* Reset the consecutive predictive frame counter */ + } + ELSE + { + safety_net = 0; + move16(); /* Increase the consecutive predictive frame counter by one */ + st->pstreaklen_fx = add( st->pstreaklen_fx, 1 ); + } + } + } +#ifdef LSF_RE_USE_SECONDARY_CHANNEL + PMT( "LSF_RE_USE_SECONDARY_CHANNEL CODE IS MISSING " ) + else /* of "if (predmode==2)" */ + { + mvr2r( ModeMeans[mode_lvq], pred0, M ); + + if ( predmode == 4 ) + { + mode_lvq_p = 9; /* force to Generic WB with AR*/ + } + + for ( i = 0; i < M; i++ ) + { + /* subtract mean and AR prediction */ + pred2[i] = pred0[i] + Predictors[mode_lvq_p][i] * ( st->mem_AR[i] - pred0[i] ); + Tmp[i] = lsf[i] - pred2[i]; + Tmp2[i] = lsf[i] - pred3[i]; + } + + /* Adaptive scaling factor (multiplier) is updated in order to reduce the amount of consecutive predictive frames in + case of possible frame erasure. AR-predictive usage for VOICED mode is allowed to be higher than other modes. */ + if ( st->pstreaklen > ( STREAKLEN ) ) + { + /* update the adaptive scaling factor to become smaller with increasing number of concecutive predictive frames. */ + st->streaklimit *= STREAKMULT; + } + + if ( st->pstreaklen == 0 ) + { + /* reset the adaptive scaling factor */ + st->streaklimit = 1.0f; + } + + /* intra pred */ + /* use G AR pred for the intra mode (as a safety mode, this is why the indexes 0/1 are interchanged)*/ + + lsf_allocate( nBits - 1, mode_lvq, 9, &stages1, &stages0, levels1, levels0, bits1, bits0 ); + + Err[0] = vq_lvq_lsf_enc( 2, 9, Tmp2, levels0, stages0, wghts, Idx0, lsf, pred3, &resq[M], &lsfq[M] ); + + if ( force_sf ) + { + safety_net = 1; /* intra-frame prediction */ + st->pstreaklen = 0; /* Reset the consecutive predictive frame counter */ + } + else + { /* try also the inter frame prediction */ + + /* AR inter-frame prediction */ + lsf_allocate( nBits - 1, mode_lvq, mode_lvq_p, &dummy, &stages1, dummy_v, levels1, dummy_v, bits1 ); + + + Err[1] = vq_lvq_lsf_enc( 2, mode_lvq_p, Tmp, levels1, stages1, wghts, Idx1, lsf, pred2, resq, lsfq ); + + if ( Err[0] * ( st->streaklimit ) < PREFERSFNET * Err[1] ) + { + safety_net = 1; + st->pstreaklen = 0; /* Reset the consecutive predictive frame counter */ + } + else + { + safety_net = 0; + ( st->pstreaklen )++; /* Increase the consecutive predictive frame counter by one */ + } + } + } + } +#endif /*--------------------------------------------------------------------------* \ + * Write indices to array \ + *--------------------------------------------------------------------------*/ + + IF( EQ_16( st->codec_mode, MODE1 ) && EQ_16( st->core, ACELP_CORE ) ) + { + /* write coder_type bit for VOICED@16kHz or GENERIC@16kHz */ + test(); +#ifdef LSF_RE_USE_SECONDARY_CHANNEL + IF( EQ_16( coder_type_org, GENERIC ) && EQ_32( st->sr_core, INT_FS_16k ) && ( st->idchan == 0 ) ) +#else + IF( EQ_16( coder_type_org, GENERIC ) && EQ_32( st->sr_core, INT_FS_16k ) ) +#endif + { + /* VOICED =2 and GENERIC=3, so "coder_type-2" means VOICED =0 and GENERIC=1*/ + push_indice_fx( hBstr, IND_LSF_PREDICTOR_SELECT_BIT, sub( coder_type, 2 ), 1 ); + } + + /* write predictor selection bit */ +#ifdef LSF_RE_USE_SECONDARY_CHANNEL + IF( GE( predmode, 2 ) ) +#else + IF( EQ_16( predmode, 2 ) ) +#endif + { + push_indice_fx( st->hBstr, IND_LSF_PREDICTOR_SELECT_BIT, safety_net, 1 ); + } + + test(); + IF( EQ_16( coder_type, VOICED ) && EQ_32( st->sr_core, INT_FS_16k ) && flag_1bit_gran == 0 ) + { + /* BC-TCVQ (only for VOICED@16kHz) */ + TCQIdx = &TCQIdx0[1]; + Bit_alloc1 = &BC_TCVQ_BIT_ALLOC_40B[1]; + FOR( i = 0; i < ( M / 2 ) + 3; i++ ) + { + push_indice_fx( hBstr, IND_LSF, TCQIdx[i], Bit_alloc1[i] ); + } + } + ELSE + { + cumleft = nBits; + move16(); +#ifdef LSF_RE_USE_SECONDARY_CHANNEL + IF( GE( predmode, 2 ) ) +#else + IF( EQ_16( predmode, 2 ) ) +#endif + { + /* subtract predictor selection bit */ + cumleft = sub( nBits, 1 ); + } + + IF( safety_net ) + { + stages = stages0; + move16(); + Idx = Idx0; + move16(); + bits = bits0; + move16(); + } + ELSE + { + stages = stages1; + move16(); + Idx = Idx1; + move16(); + bits = bits1; + move16(); + } + + tmp = sub( stages, 1 ); + FOR( i = 0; i < tmp; i++ ) + { + indice[i] = Idx[i]; + move16(); + num_bits = bits[i]; + move16(); + cumleft -= num_bits; + move16(); + push_indice_fx( hBstr, IND_LSF, indice[i], num_bits ); + } + + WHILE( cumleft > 0 ) + { + indice[i] = Idx[i]; + move16(); + + IF( GT_16( cumleft, LEN_INDICE ) ) + { + num_bits = LEN_INDICE; + move16(); + } + ELSE + { + num_bits = cumleft; + move16(); + } + + cumleft = sub( cumleft, num_bits ); + push_indice_fx( hBstr, IND_LSF, indice[i], num_bits ); + i = add( i, 1 ); + } + } + } + ELSE + { + test(); + IF( EQ_16( coder_type, VOICED ) && EQ_32( st->sr_core, INT_FS_16k ) ) + { + /* BC-TCVQ (only for VOICED@16kHz) */ + /* Number of quantization indices */ + *no_indices = 10; + move16(); + FOR( i = 0; i < *no_indices; i++ ) + { + lpc_param[i] = TCQIdx0[i]; + move16(); + bits_param_lpc[i] = BC_TCVQ_BIT_ALLOC_40B[i]; + move16(); + } + } + ELSE + { + /* Number of quantization indices */ + + /* there are 31 bits */ + IF( EQ_16( safety_net, 1 ) ) + { + Idx = Idx0; + move16(); + *no_indices = add( stages0, 1 ); + FOR( i = 0; i < stages0; i++ ) + { + lpc_param[i] = Idx[i]; + move16(); + indice[i] = Idx[i]; + move16(); + bits_param_lpc[i] = bits0[i]; + move16(); + } + lpc_param[stages0] = Idx[stages0]; + move16(); + indice[stages0] = Idx[stages0]; + move16(); + tmp = sub( stages0, 1 ); + bits_param_lpc[tmp] = LEN_INDICE; + move16(); + bits_param_lpc[stages0] = sub( bits0[tmp], LEN_INDICE ); + } + ELSE + { + *no_indices = add( stages1, 1 ); + Idx = Idx1; + move16(); + FOR( i = 0; i < stages1; i++ ) + { + lpc_param[i] = ( Idx[i] ); + move16(); + indice[i] = Idx[i]; + move16(); + bits_param_lpc[i] = bits1[i]; + move16(); + } + lpc_param[stages1] = ( Idx[stages1] ); + move16(); + indice[stages1] = Idx[stages1]; + move16(); + tmp = sub( stages1, 1 ); + bits_param_lpc[tmp] = LEN_INDICE; + move16(); + bits_param_lpc[stages1] = sub( bits1[tmp], LEN_INDICE ); + } + IF( EQ_16( predmode, 2 ) ) + { + FOR( i = *no_indices; i > 0; i-- ) + { + tmp = sub( i, 1 ); + lpc_param[i] = lpc_param[tmp]; + move16(); + bits_param_lpc[i] = bits_param_lpc[tmp]; + move16(); + } + lpc_param[0] = safety_net; + move16(); /* put the safety net info on the last param */ + bits_param_lpc[0] = 1; + move16(); + *no_indices = add( *no_indices, 1 ); + } + } + } + + + /*--------------------------------------------------------------------------* + * De-quantize encoded LSF vector + *--------------------------------------------------------------------------*/ + + IF( safety_net ) + { + /* Safety-net */ + test(); + IF( EQ_16( coder_type, VOICED ) && EQ_32( st->sr_core, INT_FS_16k ) && flag_1bit_gran == 0 ) + { + /* BC-TCQ */ + Copy( lsfq, st->mem_MA_fx, M ); + Vr_add( lsfq, pred0, qlsf, M ); + } + ELSE + { +#ifdef LSF_RE_USE_SECONDARY_CHANNEL + if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL ) + { + /* intra mode*/ + vq_dec_lvq( 0, qlsf, &indice[0], stages0, M, 9, /*mode_lvq_p,*/ levels0[stages0 - 1] ); + v_add( qlsf, pred3, qlsf, M ); + v_sub( qlsf, pred1, st->mem_MA, M ); + } + else +#endif + { + vq_dec_lvq_fx( 1, qlsf, &indice[0], stages0, M, mode_lvq, levels0[stages0 - 1], + &st->offset_scale1_fx[0][0], &st->offset_scale2_fx[0][0], &st->offset_scale1_p_fx[0][0], &st->offset_scale2_p_fx[0][0], + &st->no_scales_fx[0][0], &st->no_scales_p_fx[0][0] ); + Vr_add( qlsf, pred0, qlsf, M ); + Vr_subt( qlsf, pred1, st->mem_MA_fx, M ); + } + } + } + ELSE + { + test(); + IF( EQ_16( coder_type, VOICED ) && EQ_32( st->sr_core, INT_FS_16k ) && flag_1bit_gran == 0 ) + { + /* BC-TCVQ */ + Copy( lsfq, st->mem_MA_fx, M ); + Vr_add( lsfq, pred2, qlsf, M ); + } + ELSE + { + /* LVQ */ + vq_dec_lvq_fx( 0, qlsf, &indice[0], stages1, M, mode_lvq_p, levels1[stages1 - 1], + &st->offset_scale1_fx[0][0], &st->offset_scale2_fx[0][0], &st->offset_scale1_p_fx[0][0], + &st->offset_scale2_p_fx[0][0], &st->no_scales_fx[0][0], &st->no_scales_p_fx[0][0] ); + IF( EQ_16( predmode, 1 ) ) + { + Copy( qlsf, st->mem_MA_fx, M ); + Vr_add( qlsf, pred1, qlsf, M ); + } + ELSE + { + Vr_add( qlsf, pred2, qlsf, M ); + Vr_subt( qlsf, pred1, st->mem_MA_fx, M ); + } + } + } + + /* Sort the quantized vector to ascending order */ + sort_fx( qlsf, 0, M - 1 ); + + /* Verify stability by adding minimum separation */ + reorder_lsf_fx( qlsf, MODE1_LSF_GAP_FX, M, st->sr_core ); + + /* Update AR-predictor memories */ + Copy( qlsf, st->mem_AR_fx, M ); + return; +} + +void lsf_end_enc_ivas_fx( Encoder_State *st, /* i/o: encoder state structure */ const Word16 *lsf, /* i : LSF in the frequency domain (0..6400) */ Word16 *qlsf, /* o : quantized LSF */ @@ -559,10 +1531,8 @@ void lsf_end_enc_fx( Word16 *no_indices, Word16 *bits_param_lpc, Word16 coder_type_raw /* i : Coder type (LSF coder_type have some special cases)*/ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL , const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ -#endif ) { Word16 i; @@ -596,10 +1566,8 @@ void lsf_end_enc_fx( Word16 tmp; Word16 flag_1bit_gran; BSTR_ENC_HANDLE hBstr = st->hBstr; -#ifdef LSF_RE_USE_SECONDARY_CHANNEL Word16 pred3[M]; Word16 dummy, dummy_v[5]; -#endif flag_1bit_gran = (Word16) GT_16( st->element_mode, EVS_MONO ); @@ -609,11 +1577,8 @@ void lsf_end_enc_fx( test(); test(); test(); -#ifdef LSF_RE_USE_SECONDARY_CHANNEL + IF( EQ_16( coder_type_org, GENERIC ) && EQ_32( st->sr_core, INT_FS_16k ) && EQ_16( st->codec_mode, MODE1 ) && ( st->idchan == 0 ) ) /* this bit is used only for primary channel or mono */ -#else - IF( EQ_16( coder_type_org, GENERIC ) && EQ_32( st->sr_core, INT_FS_16k ) && EQ_16( st->codec_mode, MODE1 ) ) -#endif { IF( EQ_16( coder_type_raw, VOICED ) ) { @@ -657,7 +1622,7 @@ void lsf_end_enc_fx( *--------------------------------------------------------------------------------*/ IF( EQ_32( st->core_brate, SID_2k40 ) ) { - lsfq_CNG_fx( hBstr, lsf, wghts, qlsf, &st->offset_scale1_fx[0][0], &st->offset_scale2_fx[0][0], &st->no_scales_fx[0][0] ); + lsfq_CNG_ivas_fx( hBstr, lsf, wghts, qlsf ); sort_fx( qlsf, 0, M - 1 ); reorder_lsf_fx( qlsf, MODE1_LSF_GAP_FX, M, st->sr_core ); @@ -688,16 +1653,16 @@ void lsf_end_enc_fx( pred1[i] = add( ModeMeans_fx[mode_lvq][i], mult_r( MU_MA_FX, st->mem_MA_fx[i] ) ); move16(); } -#ifdef LSF_RE_USE_SECONDARY_CHANNEL + /* TD stereo SCh: perform intra-frame prediction with pulling-to-mean */ - if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL ) + IF( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL ) { /* if secondary channel predmode is set to be > 2 */ predmode += 3; - tdm_SCh_LSF_intra_pred( st->element_brate, tdm_lsfQ_PCh, pred3 ); + tdm_SCh_LSF_intra_pred_fx( st->element_brate, tdm_lsfQ_PCh, pred3 ); } -#endif + IF( predmode == 0 ) { /* Subtract only mean */ @@ -705,8 +1670,7 @@ void lsf_end_enc_fx( Vr_subt( lsf, pred0, Tmp, M ); /* LVQ quantization (safety-net only) */ - Err[0] = vq_lvq_lsf_enc( 0, mode_lvq, Tmp, levels0, stages0, wghts, Idx0, lsf, pred0, - st->offset_scale1_fx, st->offset_scale2_fx, st->no_scales_fx, resq, lsfq ); + Err[0] = vq_lvq_lsf_enc_ivas_fx( 0, mode_lvq, Tmp, levels0, stages0, wghts, Idx0, lsf, pred0, resq, lsfq ); safety_net = 1; move16(); st->pstreaklen_fx = 0; @@ -715,19 +1679,27 @@ void lsf_end_enc_fx( ELSE IF( EQ_16( predmode, 1 ) ) /* only MA prediction */ { Vr_subt( lsf, pred1, Tmp1, M ); - Err[1] = vq_lvq_lsf_enc( 2, mode_lvq_p, Tmp1, levels1, stages1, wghts, Idx1, lsf, pred1, - st->offset_scale1_p_fx, st->offset_scale2_p_fx, st->no_scales_p_fx, resq, lsfq ); + Err[1] = vq_lvq_lsf_enc_ivas_fx( 2, mode_lvq_p, Tmp1, levels1, stages1, wghts, Idx1, lsf, pred1, resq, lsfq ); safety_net = 0; move16(); } ELSE -#ifdef LSF_RE_USE_SECONDARY_CHANNEL - PMT( "LSF_RE_USE_SECONDARY_CHANNEL CODE IS MISSING " ) { - if ( predmode == 2 ) -#endif + IF( EQ_16( predmode, 2 ) ) { + /* Subtract mean and AR prediction */ + Copy( ModeMeans_fx[mode_lvq], pred0, M ); + + /* subtract only mean */ + Vr_subt( lsf, pred0, Tmp, M ); + + FOR( i = 0; i < M; i++ ) + { + /* subtract mean and AR prediction */ + pred2[i] = add( pred0[i], mult( Predictors_fx[mode_lvq_p][i], sub( st->mem_AR_fx[i], pred0[i] ) ) ); + Tmp2[i] = sub( lsf[i], pred2[i] ); + } /* Adaptive scaling factor (multiplier) is updated in order to reduce the amount of consecutive predictive frames in case of possible frame erasure. AR-predictive usage for VOICED mode is allowed to be higher than other modes. */ test(); @@ -751,19 +1723,6 @@ void lsf_end_enc_fx( test(); IF( EQ_32( st->sr_core, INT_FS_16k ) && EQ_16( coder_type, VOICED ) && flag_1bit_gran == 0 ) { - /* Subtract mean and AR prediction */ - Copy( ModeMeans_fx[mode_lvq], pred0, M ); - /* subtract only mean */ - Vr_subt( lsf, pred0, Tmp, M ); - - FOR( i = 0; i < M; i++ ) - { - /* subtract mean and AR prediction */ - pred2[i] = mult( Predictors_fx[mode_lvq_p][i], sub( st->mem_AR_fx[i], pred0[i] ) ); - Tmp2[i] = sub( Tmp[i], pred2[i] ); - pred2[i] = add( pred2[i], pred0[i] ); - } - /* select safety_net or predictive */ safety_net = qlsf_Mode_Select_fx( wghts, Tmp2, st->streaklimit_fx, OP_LOOP_THR_HVO ); IF( EQ_16( force_sf, 1 ) ) @@ -789,26 +1748,14 @@ void lsf_end_enc_fx( /* all other frames (not VOICED@16kHz) */ ELSE { - /* Subtract mean and AR prediction */ - Copy( ModeMeans_fx[mode_lvq], pred0, M ); - /* subtract only mean */ - Vr_subt( lsf, pred0, Tmp, M ); - - FOR( i = 0; i < M; i++ ) - { - /* subtract mean and AR prediction */ - pred2[i] = add( pred0[i], mult( Predictors_fx[mode_lvq_p][i], sub( st->mem_AR_fx[i], pred0[i] ) ) ); - Tmp2[i] = sub( lsf[i], pred2[i] ); - } - /* safety-net */ - Err[0] = vq_lvq_lsf_enc( 0, mode_lvq, Tmp, levels0, stages0, wghts, Idx0, lsf, pred0, st->offset_scale1_fx, st->offset_scale2_fx, st->no_scales_fx, resq, lsfq ); + + Err[0] = vq_lvq_lsf_enc_ivas_fx( 0, mode_lvq, Tmp, levels0, stages0, wghts, Idx0, lsf, pred0, resq, lsfq ); /* Predictive quantizer is calculated only if it can be selected */ test(); IF( !force_sf || GT_32( Err[0], abs_threshold ) ) { - Err[1] = vq_lvq_lsf_enc( 2, mode_lvq_p, Tmp2, levels1, stages1, wghts, Idx1, lsf, pred2, - st->offset_scale1_p_fx, st->offset_scale2_p_fx, st->no_scales_p_fx, &resq[M], &lsfq[M] ); + Err[1] = vq_lvq_lsf_enc_ivas_fx( 2, mode_lvq_p, Tmp2, levels1, stages1, wghts, Idx1, lsf, pred2, &resq[M], &lsfq[M] ); } test(); test(); @@ -831,97 +1778,83 @@ void lsf_end_enc_fx( } } } -#ifdef LSF_RE_USE_SECONDARY_CHANNEL - PMT( "LSF_RE_USE_SECONDARY_CHANNEL CODE IS MISSING " ) - else /* of "if (predmode==2)" */ + ELSE /* of "if (predmode==2)" */ { - mvr2r( ModeMeans[mode_lvq], pred0, M ); + Copy( ModeMeans_fx[mode_lvq], pred0, M ); - if ( predmode == 4 ) + IF( EQ_16( predmode, 4 ) ) { mode_lvq_p = 9; /* force to Generic WB with AR*/ } - for ( i = 0; i < M; i++ ) + FOR( i = 0; i < M; i++ ) { /* subtract mean and AR prediction */ - pred2[i] = pred0[i] + Predictors[mode_lvq_p][i] * ( st->mem_AR[i] - pred0[i] ); - Tmp[i] = lsf[i] - pred2[i]; - Tmp2[i] = lsf[i] - pred3[i]; + pred2[i] = add( pred0[i], mult( Predictors_fx[mode_lvq_p][i], sub( st->mem_AR_fx[i], pred0[i] ) ) ); + Tmp[i] = sub( lsf[i], pred2[i] ); + Tmp2[i] = sub( lsf[i], pred3[i] ); } /* Adaptive scaling factor (multiplier) is updated in order to reduce the amount of consecutive predictive frames in - case of possible frame erasure. AR-predictive usage for VOICED mode is allowed to be higher than other modes. */ - if ( st->pstreaklen > ( STREAKLEN ) ) + case of possible frame erasure. AR-predictive usage for VOICED mode is allowed to be higher than other modes. */ + IF( GT_16( st->pstreaklen_fx, ( STREAKLEN ) ) ) { /* update the adaptive scaling factor to become smaller with increasing number of concecutive predictive frames. */ - st->streaklimit *= STREAKMULT; + st->streaklimit_fx = mult( st->streaklimit_fx, STREAKMULT_FX ); + move16(); } - if ( st->pstreaklen == 0 ) + IF( EQ_16( st->pstreaklen_fx, 0 ) ) { /* reset the adaptive scaling factor */ - st->streaklimit = 1.0f; + st->streaklimit_fx = 32767; } /* intra pred */ /* use G AR pred for the intra mode (as a safety mode, this is why the indexes 0/1 are interchanged)*/ - lsf_allocate( nBits - 1, mode_lvq, 9, &stages1, &stages0, levels1, levels0, bits1, bits0 ); - - Err[0] = vq_lvq_lsf_enc( 2, 9, Tmp2, levels0, stages0, wghts, Idx0, lsf, pred3, &resq[M], &lsfq[M] ); - - if ( force_sf ) + lsf_allocate_fx( nBits - 1, mode_lvq, 9, &stages1, &stages0, levels1, levels0, bits1, bits0 ); + Err[0] = vq_lvq_lsf_enc_ivas_fx( 2, 9, Tmp2, levels0, stages0, wghts, Idx0, lsf, pred3, &resq[M], &lsfq[M] ); + IF( force_sf ) { - safety_net = 1; /* intra-frame prediction */ - st->pstreaklen = 0; /* Reset the consecutive predictive frame counter */ + safety_net = 1; /* intra-frame prediction */ + st->pstreaklen_fx = 0; /* Reset the consecutive predictive frame counter */ } - else + ELSE { /* try also the inter frame prediction */ /* AR inter-frame prediction */ - lsf_allocate( nBits - 1, mode_lvq, mode_lvq_p, &dummy, &stages1, dummy_v, levels1, dummy_v, bits1 ); - - - Err[1] = vq_lvq_lsf_enc( 2, mode_lvq_p, Tmp, levels1, stages1, wghts, Idx1, lsf, pred2, resq, lsfq ); - - if ( Err[0] * ( st->streaklimit ) < PREFERSFNET * Err[1] ) + lsf_allocate_fx( nBits - 1, mode_lvq, mode_lvq_p, &dummy, &stages1, dummy_v, levels1, dummy_v, bits1 ); + Err[1] = vq_lvq_lsf_enc_ivas_fx( 2, mode_lvq_p, Tmp, levels1, stages1, wghts, Idx1, lsf, pred2, resq, lsfq ); + IF( LT_32( Mult_32_16( Err[0], ( st->streaklimit_fx ) ), L_add( Err[1], Mult_32_16( Err[1], PREFERSFNET_FX ) ) ) ) { safety_net = 1; - st->pstreaklen = 0; /* Reset the consecutive predictive frame counter */ + st->pstreaklen_fx = 0; /* Reset the consecutive predictive frame counter */ } - else + ELSE { safety_net = 0; - ( st->pstreaklen )++; /* Increase the consecutive predictive frame counter by one */ + ( st->pstreaklen_fx )++; /* Increase the consecutive predictive frame counter by one */ } } } } -#endif /*--------------------------------------------------------------------------* \ - * Write indices to array \ - *--------------------------------------------------------------------------*/ + /*--------------------------------------------------------------------------* + * Write indices to array + *--------------------------------------------------------------------------*/ IF( EQ_16( st->codec_mode, MODE1 ) && EQ_16( st->core, ACELP_CORE ) ) { /* write coder_type bit for VOICED@16kHz or GENERIC@16kHz */ test(); -#ifdef LSF_RE_USE_SECONDARY_CHANNEL IF( EQ_16( coder_type_org, GENERIC ) && EQ_32( st->sr_core, INT_FS_16k ) && ( st->idchan == 0 ) ) -#else - IF( EQ_16( coder_type_org, GENERIC ) && EQ_32( st->sr_core, INT_FS_16k ) ) -#endif { /* VOICED =2 and GENERIC=3, so "coder_type-2" means VOICED =0 and GENERIC=1*/ push_indice_fx( hBstr, IND_LSF_PREDICTOR_SELECT_BIT, sub( coder_type, 2 ), 1 ); } /* write predictor selection bit */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL - IF( GE( predmode, 2 ) ) -#else - IF( EQ_16( predmode, 2 ) ) -#endif + IF( GE_16( predmode, 2 ) ) { push_indice_fx( st->hBstr, IND_LSF_PREDICTOR_SELECT_BIT, safety_net, 1 ); } @@ -941,11 +1874,7 @@ void lsf_end_enc_fx( { cumleft = nBits; move16(); -#ifdef LSF_RE_USE_SECONDARY_CHANNEL - IF( GE( predmode, 2 ) ) -#else - IF( EQ_16( predmode, 2 ) ) -#endif + IF( GE_16( predmode, 2 ) ) { /* subtract predictor selection bit */ cumleft = sub( nBits, 1 ); @@ -1108,20 +2037,16 @@ void lsf_end_enc_fx( } ELSE { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL - if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL ) + IF( EQ_16( st->tdm_LRTD_flag, 0 ) && EQ_16( st->idchan, 1 ) && tdm_lsfQ_PCh != NULL ) { /* intra mode*/ - vq_dec_lvq( 0, qlsf, &indice[0], stages0, M, 9, /*mode_lvq_p,*/ levels0[stages0 - 1] ); - v_add( qlsf, pred3, qlsf, M ); - v_sub( qlsf, pred1, st->mem_MA, M ); + Vr_subt( qlsf, pred1, st->mem_MA_fx, M ); + vq_dec_lvq_ivas_fx( 0, qlsf, &indice[0], stages0, M, 9, levels0[stages0 - 1] ); + Vr_add( qlsf, pred3, qlsf, M ); } - else -#endif + ELSE { - vq_dec_lvq_fx( 1, qlsf, &indice[0], stages0, M, mode_lvq, levels0[stages0 - 1], - &st->offset_scale1_fx[0][0], &st->offset_scale2_fx[0][0], &st->offset_scale1_p_fx[0][0], &st->offset_scale2_p_fx[0][0], - &st->no_scales_fx[0][0], &st->no_scales_p_fx[0][0] ); + vq_dec_lvq_ivas_fx( 1, qlsf, &indice[0], stages0, M, mode_lvq, levels0[stages0 - 1] ); Vr_add( qlsf, pred0, qlsf, M ); Vr_subt( qlsf, pred1, st->mem_MA_fx, M ); } @@ -1139,9 +2064,7 @@ void lsf_end_enc_fx( ELSE { /* LVQ */ - vq_dec_lvq_fx( 0, qlsf, &indice[0], stages1, M, mode_lvq_p, levels1[stages1 - 1], - &st->offset_scale1_fx[0][0], &st->offset_scale2_fx[0][0], &st->offset_scale1_p_fx[0][0], - &st->offset_scale2_p_fx[0][0], &st->no_scales_fx[0][0], &st->no_scales_p_fx[0][0] ); + vq_dec_lvq_ivas_fx( 0, qlsf, &indice[0], stages1, M, mode_lvq_p, levels1[stages1 - 1] ); IF( EQ_16( predmode, 1 ) ) { Copy( qlsf, st->mem_MA_fx, M ); @@ -1166,7 +2089,6 @@ void lsf_end_enc_fx( return; } - /*-------------------------------------------------------------------* * first_VQstages() * @@ -1358,30 +2280,151 @@ static void first_VQstages( cs = add( cs, stagesVQ ); } - m = maxC; + m = maxC; + move16(); + } + + Copy( indices[1], indices_VQstage, maxC * stagesVQ ); + + return; +} + +/*--------------------------------------------------------------------------- + * vq_enc_lsf_lvq() + * + * Multi-stage VQ encoder for LSF quantization. Trained codebooks are used in initial stages + * and lattice-VQ quantization is applied on residual vector in other stages. + * + * Note: + * Compared to normal multistage VQ resulting LSF vector is reordered to ascending order before + * weighted error calculation (spectral distortion) at the final stage. + * + * Returns: + * Weighted error + *--------------------------------------------------------------------------*/ + +static Word32 vq_lvq_lsf_enc( + Word16 pred_flag, + Word16 mode, + Word16 u[], + Word16 *levels, + Word16 stages, + Word16 w[], + Word16 Idx[], + const Word16 *lsf, + const Word16 *pred, + Word32 p_offset_scale1[][MAX_NO_SCALES + 1], + Word32 p_offset_scale2[][MAX_NO_SCALES + 1], + Word16 p_no_scales[][2], + Word16 *resq, + Word16 *lsfq ) +{ + Word16 i; + const Word16 *const *cb, *cb_stage; + Word16 cand[LSFMBEST][M]; + Word16 maxC = LSFMBEST, stagesVQ; + Word16 mode_glb, j, indices_firstVQ[LSFMBEST * MAX_VQ_STAGES], c2; + Word32 e[LSFMBEST], L_tmp, L_ftmp; + Word16 quant[LSFMBEST][M], diff[M], dd[M]; + Word16 lat_cv[LSFMBEST][M]; + Word16 idx_lead[LSFMBEST][2], idx_scale[LSFMBEST][2]; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; +#endif + + stagesVQ = sub( stages, 1 ); + /* Codebook selection */ + IF( pred_flag == 0 ) /* safety net*/ + { + cb = &Quantizers_fx[CB_lsf[mode]]; + move16(); + mode_glb = add( offset_lvq_modes_SN_fx[mode], offset_in_lvq_mode_SN_fx[mode][sub( levels[stagesVQ], min_lat_bits_SN_fx[mode] )] ); + } + ELSE /* predictive */ + { + cb = &Quantizers_p_fx[CB_p_lsf[mode]]; + move16(); + mode_glb = add( offset_lvq_modes_pred_fx[mode], offset_in_lvq_mode_pred_fx[mode][sub( levels[stagesVQ], min_lat_bits_pred_fx[mode] )] ); + } + IF( stagesVQ > 0 ) + { + /* first VQ stages */ + first_VQstages( cb, u, levels, stagesVQ, w, M, MSVQ_MAXCNT, indices_firstVQ ); + } + + + FOR( i = 0; i < maxC; i++ ) + { + Copy( pred, cand[i], M ); + FOR( j = 0; j < stagesVQ; j++ ) + { + Idx[j] = indices_firstVQ[i * stagesVQ + j]; + move16(); + } + + FOR( j = 0; j < stagesVQ; j++ ) + { + cb_stage = cb[j]; + move16(); + Vr_add( cand[i], cb_stage + Idx[j] * M, cand[i], M ); + } + + /* LVQ quantization */ + Vr_subt( lsf, cand[i], dd, M ); + mslvq_fx( dd, quant[i], lat_cv[i], idx_lead[i], idx_scale[i], w, mode, mode_glb, pred_flag, p_no_scales ); + Vr_add( cand[i], quant[i], cand[i], M ); + + /* arrange the LSF candidate vector prior to selection to an ascending order*/ + sort_fx( cand[i], 0, M - 1 ); + + /* calculate the spectral distortion using weighted MSE of sorted LSF vector*/ + Vr_subt( cand[i], lsf, diff, M ); + FOR( j = 0; j < M; j++ ) + { +#ifdef BASOP_NOGLOB + diff[j] = shl_o( diff[j], 4, &Overflow ); +#else /* BASOP_NOGLOB */ + diff[j] = shl( diff[j], 4 ); +#endif /* BASOP_NOGLOB */ + move16(); + } +#ifdef BASOP_NOGLOB + L_tmp = L_mult( mult( diff[0], shl_o( w[0], 1, &Overflow ) ), diff[0] ); /*(2.56+Q5+ Q10 -Q15) + 2.56+ Q5 + Q1 = 2.56 + 2.56 + Q6 */ +#else + L_tmp = L_mult( mult( diff[0], shl( w[0], 1 ) ), diff[0] ); /*(2.56+Q5+ Q10 -Q15) + 2.56+ Q5 + Q1 = 2.56 + 2.56 + Q6 */ +#endif + FOR( j = 1; j < M; j++ ) + { +#ifdef BASOP_NOGLOB + L_tmp = L_mac( L_tmp, mult( diff[j], shl_o( w[j], 1, &Overflow ) ), diff[j] ); /*(2.56+Q5+ Q10 -Q15) + 2.56+ Q5 + Q1 = 2.56 + 2.56 + Q6 */ +#else + L_tmp = L_mac( L_tmp, mult( diff[j], shl( w[j], 1 ) ), diff[j] ); /*(2.56+Q5+ Q10 -Q15) + 2.56+ Q5 + Q1 = 2.56 + 2.56 + Q6 */ +#endif + } + e[i] = L_tmp; + move32(); + } + + /* find the optimal candidate */ + c2 = minimum_32_fx( e, maxC, &L_ftmp ); + set16_fx( resq, 0, M ); + FOR( j = 0; j < stagesVQ; j++ ) + { + Idx[j] = indices_firstVQ[c2 * stagesVQ + j]; + move16(); + cb_stage = cb[j]; move16(); + Vr_add( resq, cb_stage + Idx[j] * M, resq, M ); } + Vr_add( resq, quant[c2], resq, M ); /* quantized prediction residual */ + Copy( cand[c2], lsfq, M ); + index_lvq_fx( lat_cv[c2], idx_lead[c2], idx_scale[c2], mode_glb, &Idx[stagesVQ], + &p_offset_scale1[0][0], &p_offset_scale2[0][0], &p_no_scales[0][0] ); - Copy( indices[1], indices_VQstage, maxC * stagesVQ ); - - return; + return e[c2]; } -/*--------------------------------------------------------------------------- - * vq_enc_lsf_lvq() - * - * Multi-stage VQ encoder for LSF quantization. Trained codebooks are used in initial stages - * and lattice-VQ quantization is applied on residual vector in other stages. - * - * Note: - * Compared to normal multistage VQ resulting LSF vector is reordered to ascending order before - * weighted error calculation (spectral distortion) at the final stage. - * - * Returns: - * Weighted error - *--------------------------------------------------------------------------*/ - -static Word32 vq_lvq_lsf_enc( +static Word32 vq_lvq_lsf_enc_ivas_fx( Word16 pred_flag, Word16 mode, Word16 u[], @@ -1391,9 +2434,6 @@ static Word32 vq_lvq_lsf_enc( Word16 Idx[], const Word16 *lsf, const Word16 *pred, - Word32 p_offset_scale1[][MAX_NO_SCALES + 1], - Word32 p_offset_scale2[][MAX_NO_SCALES + 1], - Word16 p_no_scales[][2], Word16 *resq, Word16 *lsfq ) { @@ -1415,15 +2455,32 @@ static Word32 vq_lvq_lsf_enc( IF( pred_flag == 0 ) /* safety net*/ { cb = &Quantizers_fx[CB_lsf[mode]]; - move16(); - mode_glb = add( offset_lvq_modes_SN_fx[mode], offset_in_lvq_mode_SN_fx[mode][sub( levels[stagesVQ], min_lat_bits_SN_fx[mode] )] ); + IF( LT_16( mode, 6 ) ) + { + move16(); + mode_glb = add( offset_lvq_modes_SN[mode], offset_in_lvq_mode_SN[mode][sub( levels[stagesVQ], min_lat_bits_SN[mode] )] ); + } + ELSE + { + move16(); + mode_glb = add( offset_lvq_modes_SN[mode], levels[stagesVQ] - min_lat_bits_SN[mode] ); + } } ELSE /* predictive */ { cb = &Quantizers_p_fx[CB_p_lsf[mode]]; - move16(); - mode_glb = add( offset_lvq_modes_pred_fx[mode], offset_in_lvq_mode_pred_fx[mode][sub( levels[stagesVQ], min_lat_bits_pred_fx[mode] )] ); + IF( LT_16( mode, 6 ) || EQ_16( mode, 12 ) ) + { + move16(); + mode_glb = add( offset_lvq_modes_pred[mode], offset_in_lvq_mode_pred[mode][sub( levels[stagesVQ], min_lat_bits_pred_fx[mode] )] ); + } + ELSE + { + move16(); + mode_glb = sub( add( offset_lvq_modes_pred[mode], levels[stagesVQ] ), min_lat_bits_pred_fx[mode] ); + } } + IF( stagesVQ > 0 ) { /* first VQ stages */ @@ -1449,7 +2506,7 @@ static Word32 vq_lvq_lsf_enc( /* LVQ quantization */ Vr_subt( lsf, cand[i], dd, M ); - mslvq_fx( dd, quant[i], lat_cv[i], idx_lead[i], idx_scale[i], w, mode, mode_glb, pred_flag, p_no_scales ); + mslvq_ivas_fx( dd, quant[i], lat_cv[i], idx_lead[i], idx_scale[i], w, mode, mode_glb, pred_flag ); Vr_add( cand[i], quant[i], cand[i], M ); /* arrange the LSF candidate vector prior to selection to an ascending order*/ @@ -1496,12 +2553,10 @@ static Word32 vq_lvq_lsf_enc( } Vr_add( resq, quant[c2], resq, M ); /* quantized prediction residual */ Copy( cand[c2], lsfq, M ); - index_lvq_fx( lat_cv[c2], idx_lead[c2], idx_scale[c2], mode_glb, &Idx[stagesVQ], - &p_offset_scale1[0][0], &p_offset_scale2[0][0], &p_no_scales[0][0] ); + index_lvq_ivas_fx( lat_cv[c2], idx_lead[c2], idx_scale[c2], mode_glb, &Idx[stagesVQ], pred_flag ); return e[c2]; } - static void BcTcvq_1st_fx( Word16 x_fx[][2], /*x2.56*/ const Word16 CB_fx[][128][2], /*x2.56*/ @@ -2604,3 +3659,198 @@ static void lsf_mid_enc_fx( return; } + +static void lsf_mid_enc_ivas_fx( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 nb_bits, /* i : number of bits */ + const Word32 int_fs, /* i : internal (ACELP) sampling frequency*/ + const Word16 qlsp0[], /* i : quantized LSPs from frame beginning*/ + const Word16 qlsp1[], /* i : quantized LSPs from frame end */ + Word16 lsp[], /* i/o: mid-frame LSP */ + const Word16 coder_type, /* i : coding type */ + const Word16 bwidth, /* i : input signal bandwidth */ + Word32 Bin_Ener[], /* i : per bin log energy spectrum */ + Word16 Q_ener, /* i : Q value of Bin_ener */ + Word16 ppp_mode, + Word16 nelp_mode ) +{ + Word16 lsf[M], qlsf[M], qlsf1[M], qlsf0[M], wghts[M]; + Word32 err, err_min; + Word16 j, k, idx, size = 0; +#if 0 + Word32 Bin_Ener_mid[L_FFT/2]; +#endif + Word32 L_tmp; + Word16 tmp, k1; + const Word16 *ratio = NULL; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; +#endif + + /* convert LSPs to LSFs */ + lsp2lsf_fx( lsp, lsf, M, int_fs ); + lsp2lsf_fx( qlsp0, qlsf0, M, int_fs ); + lsp2lsf_fx( qlsp1, qlsf1, M, int_fs ); + + /* LSF weighting */ + Unified_weighting_fx( Bin_Ener, Q_ener, lsf, wghts, (Word16) EQ_16( bwidth, NB ), (Word16) EQ_16( coder_type, UNVOICED ), int_fs, M ); + move16(); + /* codebook selection, number of bits, size of the codebook */ + test(); + IF( ppp_mode == 0 && nelp_mode == 0 ) + { + /* codebook selection */ + IF( EQ_16( coder_type, VOICED ) ) + { + SWITCH( nb_bits ) + { + case 5: + { + ratio = tbl_mid_voi_wb_5b_fx; + move16(); + BREAK; + } + case 4: + { + ratio = tbl_mid_voi_wb_4b_fx; + move16(); + BREAK; + } + case 1: + { + ratio = tbl_mid_voi_wb_1b_fx; + move16(); + BREAK; + } + } + } + ELSE IF( EQ_16( coder_type, UNVOICED ) ) + { + ratio = tbl_mid_unv_wb_5b_fx; + } + ELSE + { + /* GENERIC, TRANSITION, AUDIO and INACTIVE */ + SWITCH( nb_bits ) + { + case 5: + { + ratio = tbl_mid_gen_wb_5b_fx; + move16(); + BREAK; + } + case 4: + { + ratio = tbl_mid_gen_wb_4b_fx; + move16(); + BREAK; + } + case 2: + { + ratio = tbl_mid_gen_wb_2b_fx; + move16(); + BREAK; + } + } + } + + size = (Word16) pow2[nb_bits]; + move16(); + } + ELSE IF( EQ_16( ppp_mode, 1 ) ) + { + ratio = tbl_mid_voi_wb_1b_fx; + move16(); + nb_bits = 1; + move16(); + size = 2; + move16(); + } + ELSE IF( EQ_16( nelp_mode, 1 ) ) + { + ratio = tbl_mid_unv_wb_4b_fx; + move16(); + nb_bits = 4; + move16(); + size = 16; + move16(); + } + + /* loop over codevectors */ + err_min = MAXINT32; + move16(); + idx = 0; + move16(); + k1 = 0; + move16(); + FOR( k = 0; k < size; k++ ) + { + err = L_deposit_l( 0 ); + + FOR( j = 0; j < M; j++ ) + { + /* qlsf[j] = (1.0f - ratio[k*M+j]) * qlsf0[j] + ratio[k*M+j] * qlsf1[j]; */ + L_tmp = L_mult( sub( 0x2000, ratio[k1 + j] ), qlsf0[j] ); + L_tmp = L_mac( L_tmp, ratio[k1 + j], qlsf1[j] ); + qlsf[j] = round_fx( L_shl( L_tmp, 2 ) ); + + test(); + test(); + IF( j > 0 && LT_16( j, M ) && LT_16( qlsf[j], add( qlsf[j - 1], LSF_GAP_MID_FX ) ) ) + { + qlsf[j] = add( qlsf[j - 1], LSF_GAP_MID_FX ); + move16(); + } + + tmp = sub( lsf[j], qlsf[j] ); + /* err += wghts[j] * ftemp * ftemp; */ + /* tmp is usually very small, we can have some extra precision with very rare saturation */ +#ifdef BASOP_NOGLOB + tmp = shl_o( tmp, 4, &Overflow ); + tmp = mult_ro( tmp, tmp, &Overflow ); + err = L_mac_o( err, tmp, shl_o( wghts[j], 2, &Overflow ), &Overflow ); +#else /* BASOP_NOGLOB */ + tmp = shl( tmp, 4 ); + tmp = mult_r( tmp, tmp ); + err = L_mac( err, tmp, shl( wghts[j], 2 ) ); +#endif + } + /* err = L_shl(err,Wscale); */ + err = Mult_32_16( err, LSF_1_OVER_256SQ ); + /* err = Mult_32_16(err,Wmult); */ + + IF( LT_32( err, err_min ) ) + { + err_min = L_add( err, 0 ); + idx = k; + move16(); + } + k1 += M; + move16(); + } + + /* calculate the quantized LSF vector */ + FOR( j = 0; j < M; j++ ) + { + /* qlsf[j] = (1.0f - ratio[idx*M+j]) * qlsf0[j] + ratio[idx*M+j] * qlsf1[j]; */ + L_tmp = L_mult( sub( 0x2000, ratio[idx * M + j] ), qlsf0[j] ); + L_tmp = L_mac( L_tmp, ratio[idx * M + j], qlsf1[j] ); + qlsf[j] = round_fx( L_shl( L_tmp, 2 ) ); + + test(); + test(); + IF( j > 0 && LT_16( j, M ) && LT_16( qlsf[j], add( qlsf[j - 1], LSF_GAP_MID_FX ) ) ) + { + qlsf[j] = add( qlsf[j - 1], LSF_GAP_MID_FX ); + move16(); + } + } + + reorder_lsf_fx( qlsf, LSF_GAP_MID_FX, M, int_fs ); + + /* convert LSFs back to LSPs */ + lsf2lsp_fx( qlsf, lsp, M, int_fs ); + push_indice_fx( hBstr, IND_MID_FRAME_LSF_INDEX, idx, nb_bits ); + + return; +} diff --git a/lib_enc/mslvq_enc_fx.c b/lib_enc/mslvq_enc_fx.c index b68315506..ea953ebd5 100644 --- a/lib_enc/mslvq_enc_fx.c +++ b/lib_enc/mslvq_enc_fx.c @@ -7,6 +7,8 @@ #include "rom_com_fx.h" #include "rom_com.h" #include "stl.h" +#include "prot.h" /* Function prototypes */ +#include "basop32.h" /* Function prototypes */ #include "prot_fx1.h" /* Function prototypes */ #include "prot_fx2.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -17,6 +19,7 @@ *-----------------------------------------------------------------*/ static Word32 quantize_data_fx( Word16 *data, const Word16 *w_in, Word16 *qin, Word16 *cv_out, Word16 *idx_lead, Word16 *idx_scale, const Word16 *sigma, const Word16 *inv_sigma, const Word16 *scales, Word16 no_scales, const Word16 *no_lead ); +static Word32 quantize_data_ivas_fx( Word16 *data, const Word16 *w_in, Word16 *qin, Word16 *cv_out, Word16 *idx_lead, Word16 *idx_scale, const Word16 *sigma, const Word16 *inv_sigma, const Word16 *scales, const Word16 *no_lead ); static Word32 q_data_fx( Word16 *pTmp1, const Word16 *w1, Word16 *quant, Word16 *cv_out, Word16 *idx_lead, Word16 *idx_scale, const Word16 *p_sigma, const Word16 *p_inv_sigma, const Word16 *p_scales, Word16 *p_no_scales, const Word16 *p_no_lead ); static void prepare_data_fx( Word16 *xsort, Word16 *sign, Word16 *data, Word32 *w, const Word16 *w_in, const Word16 *sigma, const Word16 *inv_sigma, Word16 *p_sig ); static Word32 calculate_min_dist_fx( Word16 cv_pot[LATTICE_DIM], Word16 no_scales, const Word16 *scale, const Word32 *w, Word16 *p_best_scale, Word16 *p_best_idx, const Word16 *no_leaders, Word16 sig, Word16 *indx ); @@ -86,6 +89,122 @@ Word32 mslvq_fx( return dist; } + +Word32 mslvq_ivas_fx( + Word16 *pTmp, /* i : M-dimensional input vector x2.56*/ + Word16 *quant, /* o : quantized vector x2.56*/ + Word16 *cv_out, /* o : corresponding 8-dim lattice codevectors (without the scaling) Q13*/ + Word16 *idx_lead, /* o : leader index for each 8-dim subvector */ + Word16 *idx_scale, /* o : scale index for each subvector */ + Word16 *w, /* i : weights for LSF quantization Q10*/ + Word16 mode, /* i : number indicating the coding type (V/UV/G...)*/ + Word16 mode_glb, /* i : LVQ coding mode */ + Word16 pred_flag /* i : prediction flag (0: safety net, 1,2 - predictive )*/ +) +{ + Word32 dist, L_tmp; + const Word16 *p_scales, *p_sigma, *p_inv_sigma; + Word16 p_no_lead[MAX_NO_SCALES * 2]; + Word16 tmp, tmp1, i; + + dist = L_deposit_l( 0 ); + move16(); + + IF( EQ_16( pred_flag, 0 ) ) + { + p_sigma = sigma_MSLVQ_fx[mode]; + /* inverse sigma is precomputed to save complexity */ + p_inv_sigma = inv_sigma_MSLVQ_fx[mode]; + p_scales = scales_ivas_fx[mode_glb]; + tmp = no_lead_idx[mode_glb][0]; + tmp1 = no_lead_idx[mode_glb][1]; + IF( LE_16( tmp, LIMIT_LEADER ) && ( LT_16( tmp, sub( tmp1, 2 ) ) ) ) + { + tmp = add( tmp, DELTA_LEADER ); + } + FOR( i = 0; i < MAX_NO_SCALES; i++ ) + { + p_no_lead[i] = leaders_short[tmp][i]; + p_no_lead[i + MAX_NO_SCALES] = leaders_short[tmp1][i]; + } + } + ELSE + { + IF( GE_16( pred_flag, 5 ) ) + { + /* assert( pred_flag >= 12 && pred_flag <= 15 ); */ + /* pred_flag is here the number of bits for MSLVQ */ + + p_sigma = &sigma_BWE16_fx[mode_glb * LATTICE_DIM]; + + /* inverse sigma is precomputed to save complexity */ +#if 1 // Pointing to wrong table, due to warning + p_inv_sigma = &sigma_BWE16_fx[mode_glb * LATTICE_DIM]; +#endif + + IF( EQ_16( mode_glb, 0 ) ) + { + p_scales = &scales_BWE_fx[i_mult( sub( pred_flag, mslvq_SHB_min_bits[mode_glb] ), 3 )]; + FOR( i = 0; i < MAX_NO_SCALES; i++ ) + { + p_no_lead[i] = no_lead_BWE[add( i, i_mult( sub( pred_flag, mslvq_SHB_min_bits[mode_glb] ), 3 ) )]; + } + } + ELSE + { + p_scales = &scales_BWE_3b_fx[i_mult( sub( pred_flag, mslvq_SHB_min_bits[mode_glb] ), 3 )]; + FOR( i = 0; i < MAX_NO_SCALES; i++ ) + { + p_no_lead[i] = no_lead_BWE_3b[add( i, i_mult( sub( pred_flag, mslvq_SHB_min_bits[mode_glb] ), 3 ) )]; + } + } + } + ELSE + { + p_sigma = sigma_p_fx[mode]; + + /* inverse sigma is precomputed to save complexity */ + p_inv_sigma = inv_sigma_p_fx[mode]; + p_scales = scales_p_ivas_fx[mode_glb]; + + tmp = no_lead_p_idx[mode_glb][0]; + tmp1 = no_lead_p_idx[mode_glb][1]; + + IF( LE_16( tmp, LIMIT_LEADER ) && ( LT_16( tmp, sub( tmp1, 2 ) ) ) ) + { + tmp = add( tmp, DELTA_LEADER ); + } + + IF( EQ_16( tmp, LIMIT_LEADER ) && EQ_16( tmp1, 0 ) ) + { + tmp = add( tmp, DELTA_LEADER ); + tmp1 = add( tmp1, DELTA_LEADER ); + } + + FOR( i = 0; i < MAX_NO_SCALES; i++ ) + { + p_no_lead[i] = leaders_short[tmp][i]; + p_no_lead[i + MAX_NO_SCALES] = leaders_short[tmp1][i]; + } + } + } + + /* first subvector */ + dist = quantize_data_ivas_fx( pTmp, w, quant, cv_out, idx_lead, idx_scale, + p_sigma, p_inv_sigma, p_scales, p_no_lead ); + IF( LT_16( pred_flag, 5 ) ) + { + /* second subvector */ + L_tmp = quantize_data_ivas_fx( pTmp + LATTICE_DIM, w + LATTICE_DIM, quant + LATTICE_DIM, + cv_out + LATTICE_DIM, &idx_lead[1], &idx_scale[1], + p_sigma + LATTICE_DIM, p_inv_sigma + LATTICE_DIM, p_scales + MAX_NO_SCALES, + p_no_lead + MAX_NO_SCALES ); + + dist = L_add( dist, L_tmp ); + } + + return dist; +} /*-----------------------------------------------------------------* * q_data() * @@ -121,6 +240,33 @@ static Word32 q_data_fx( return dist; } +static Word32 q_data_ivas_fx( + Word16 *pTmp1, /* i: M-dimensional input vector x2.56 */ + const Word16 *w1, /* i: M-dimensional weight vector Q8 */ + Word16 *quant, /* o: quantized vector x2.56 */ + Word16 *cv_out, /* o: non-scaled lattice codevector x2.56 */ + Word16 *idx_lead, /* o: leader indexes for each subvector */ + Word16 *idx_scale, /* o: scale indexes for each subvector */ + const Word16 *p_sigma, /* i: standard deviation x2.56 */ + const Word16 *p_inv_sigma, /* i: inverse standard deviation Q15 */ + const Word16 *p_scales, /* i: scale values Q11 */ + const Word16 *p_no_lead /* i: number of leaders for each truncation and each subvector */ +) +{ + Word32 dist, L_tmp; + /* first subvector */ + dist = quantize_data_ivas_fx( pTmp1, w1, quant, cv_out, idx_lead, idx_scale, + p_sigma, p_inv_sigma, p_scales, p_no_lead ); + /* second subvector */ + L_tmp = quantize_data_ivas_fx( pTmp1 + LATTICE_DIM, w1 + LATTICE_DIM, + quant + LATTICE_DIM, cv_out + LATTICE_DIM, &idx_lead[1], &idx_scale[1], + p_sigma + LATTICE_DIM, p_inv_sigma + LATTICE_DIM, p_scales + MAX_NO_SCALES, + p_no_lead + MAX_NO_SCALES ); + + dist = L_add( dist, L_tmp ); + + return dist; +} /*-----------------------------------------------------------------* * mslvq_cng() * @@ -192,6 +338,82 @@ Word32 mslvq_cng_fx( return dist; } +Word32 mslvq_cng_ivas_fx( + Word16 idx_cv, /* i : index of cv from previous stage */ + Word16 *pTmp, /* i : 16 dimensional input vector x2.56*/ + Word16 *quant, /* o : quantized vector x2.56*/ + Word16 *cv_out, /* o : corresponding 8-dim lattice codevectors (without the scaling) Q13*/ + Word16 *idx_lead, /* o : leader index for each 8-dim subvector */ + Word16 *idx_scale, /* o : scale index for each subvector */ + const Word16 *w /* i : weights for LSF quantization Q10*/ +) +{ + Word32 dist; + const Word16 *p_scales, *p_sigma, *p_inv_sigma; + Word16 no_scales[2]; + Word16 mode_glb, mode, i; + Word16 pTmp1[M], w1[M]; + Word16 p_no_lead[MAX_NO_SCALES * 2]; + + dist = L_deposit_l( 0 ); + mode = add( LVQ_COD_MODES, idx_cv ); + move16(); + + /* for CNG there is only one bitrate but several lattice quantizer structures, + depending on the previous VQ stage */ + mode_glb = add( START_CNG, idx_cv ); + move16(); + + p_sigma = sigma_MSLVQ_fx[mode]; + move16(); + p_inv_sigma = inv_sigma_MSLVQ_fx[mode]; + move16(); + p_scales = scales_fx[mode_glb]; + move16(); + + no_scales[0] = 0; + no_scales[1] = 0; + + FOR( i = 0; i < MAX_NO_SCALES; i++ ) + { + p_no_lead[i] = (Word16) leaders_short[no_lead_idx[mode_glb][0]][i]; + p_no_lead[i + MAX_NO_SCALES] = (Word16) leaders_short[no_lead_idx[mode_glb][1]][i]; + + IF( p_scales[i] > 0 ) + { + no_scales[0] += 1; + } + IF( p_scales[i + MAX_NO_SCALES] > 0 ) + { + no_scales[1] += 1; + } + } + + /* check if LSF component permutation is needed or not */ + IF( cng_sort[idx_cv] ) + { + FOR( i = 0; i < M; i++ ) + { + pTmp1[i] = pTmp[i]; + move16(); + w1[i] = w[i]; + move16(); + } + /* sorting the quantizer input and the corresponding weights according to the specified permutations */ + permute_fx( pTmp1, perm_MSLVQ[idx_cv] ); + permute_fx( w1, perm_MSLVQ[idx_cv] ); + + dist = q_data_ivas_fx( pTmp1, w1, quant, cv_out, idx_lead, idx_scale, p_sigma, p_inv_sigma, p_scales, p_no_lead ); + /* permute back */ + permute_fx( quant, perm_MSLVQ[idx_cv] ); + } + ELSE + { + dist = q_data_ivas_fx( pTmp, w, quant, cv_out, idx_lead, idx_scale, p_sigma, p_inv_sigma, p_scales, p_no_lead ); + } + + return dist; +} /*-----------------------------------------------------------------* * prepare_data_fx() * @@ -546,6 +768,107 @@ static Word32 quantize_data_fx( return min_dist; } +static Word32 quantize_data_ivas_fx( + Word16 *data, /* i : residual LSF data to quantize x2.56*/ + const Word16 *w_in, /* i : weights Q10*/ + Word16 *qin, /* o : quantized output (scaled) x2.56*/ + Word16 *cv_out, /* o : codevectors Q1*/ + Word16 *idx_lead, /* o : leader indexes for each subvector */ + Word16 *idx_scale, /* o : scale indexes for each subvector */ + const Word16 *sigma, /* i : standard deviation x2.56 */ + const Word16 *inv_sigma, /* i : inverse of standard deviation Q15 */ + const Word16 *scale, /* i : scales for each truncation Q11*/ + const Word16 *no_leaders /* i : number of leader vectors for each truncation of each subvector */ +) +{ + Word16 j; + Word32 w[LATTICE_DIM]; + Word32 min_dist = 0; + Word16 best_idx = 0, best_scale = -1; + Word16 s; + Word16 indx[LATTICE_DIM]; + Word16 sig, sign[LATTICE_DIM]; + Word16 cv_pot[LATTICE_DIM]; + Word16 id[8]; + Word16 smallest; + Word32 L_tmp; + + IF( scale[0] > 0 ) + { + prepare_data_fx( cv_pot, sign, data, w, w_in, sigma, inv_sigma, &sig ); + move16(); + /* sorting of the input vector based on its absolute values; indx: permutation corresponding to the sorting */ + sort_desc_ind_fx( cv_pot, LATTICE_DIM, indx ); + smallest = indx[LATTICE_DIM - 1]; + move16(); + + min_dist = calculate_min_dist_fx( cv_pot, MAX_NO_SCALES, scale, w, &best_scale, &best_idx, no_leaders, sig, indx ); + + IF( GT_16( best_scale, -1 ) ) + { + FOR( j = 0; j < LATTICE_DIM; j++ ) + { + id[indx[j]] = j; + } + FOR( j = 0; j < LATTICE_DIM; j++ ) + { + cv_out[j] = i_mult2( sign[j], pl_HQ_fx[best_idx * LATTICE_DIM + id[j]] ); + move16(); + } + IF( pl_par[best_idx] ) + { + IF( NE_16( sig, pl_par[best_idx] ) ) + { + cv_out[smallest] = negate( cv_out[smallest] ); + } + } + s = scale[best_scale]; + move16(); /*Q11 */ + FOR( j = 0; j < LATTICE_DIM; j++ ) + { + /*qin[j] = s * cv_out[j] * sigma[j]; */ + L_tmp = L_mult( cv_out[j], s ); /* Q1+Q11+Q1 = Q13 */ + L_tmp = Mult_32_16( L_tmp, shl( sigma[j], 2 ) ); /* Q13 + Q2 +x2.56 -Q15 */ + + qin[j] = extract_l( L_tmp ); /*x2.56 */ + } + *idx_lead = best_idx; + move16(); + *idx_scale = best_scale; + move16(); + } + ELSE + { + FOR( j = 0; j < LATTICE_DIM; j++ ) + { + qin[j] = 0; + move16(); + } + + *idx_lead = best_idx; + move16(); + *idx_scale = best_scale; + move16(); + } + } + ELSE + { + *idx_lead = 0; + move16(); + *idx_scale = -1; + move16(); + + FOR( j = 0; j < LATTICE_DIM; j++ ) + { + cv_out[j] = 0; + move16(); + qin[j] = 0; + move16(); + } + } + + return min_dist; +} /*-----------------------------------------------------------------* * sort_desc_ind() * @@ -655,7 +978,52 @@ void index_lvq_fx( return; } +void index_lvq_ivas_fx( + Word16 *quant, /* i : codevector to be indexed (2 8-dim subvectors) Q13*/ + Word16 *idx_lead, /* i : leader class index for each subvector */ + Word16 *idx_scale, /* i :scale index for each subvector */ + Word16 mode, /* i : integer signalling the quantizer structure for the current bitrate */ + Word16 *index, /* o : encoded index (represented on 3 short each with 15 bits ) */ + const Word16 prediction_flag ) +{ + Word32 index1, index2; + UWord32 offset_scale1[MAX_NO_SCALES + 1], offset_scale2[MAX_NO_SCALES + 1]; + Word64 idx64; + Word64 index2_64; + + index1 = 0; + move16(); + + create_offset( offset_scale1, offset_scale2, mode, prediction_flag ); + + /* for first subvector */ + IF( GT_16( idx_scale[0], -1 ) ) + { + index1 = L_add( encode_comb_fx( quant, idx_lead[0] ), L_add( table_no_cv_fx[idx_lead[0]], offset_scale1[idx_scale[0]] ) ); + } + + /* for second subvector */ + index2 = L_deposit_l( 0 ); + + IF( GT_16( idx_scale[1], -1 ) ) + { + index2 = L_add( encode_comb_fx( &quant[LATTICE_DIM], idx_lead[1] ), L_add( table_no_cv_fx[idx_lead[1]], offset_scale2[idx_scale[1]] ) ); + } + idx64 = W_mult0_32_32( index1, offset_scale2[MAX_NO_SCALES] ); + index2_64 = W_deposit32_l( index2 ); + idx64 = W_add_nosat( idx64, index2_64 ); + + /* convert to 3 short */ + index[0] = ( ( idx64 ) & ( 0x7fff ) ); + move16(); + index[1] = ( idx64 >> 15 ) & ( 0x7fff ); + move16(); + index[2] = ( idx64 >> 30 ) & ( 0x7fff ); + move16(); + + return; +} /*-----------------------------------------------------------------* * encode_comb() * diff --git a/lib_enc/nois_est_fx.c b/lib_enc/nois_est_fx.c index da9e0f0d3..855d25ce5 100644 --- a/lib_enc/nois_est_fx.c +++ b/lib_enc/nois_est_fx.c @@ -348,7 +348,7 @@ void noise_est_pre_fx( test(); test(); test(); - IF( ( ( GT_16( hNoiseEst->harm_cor_cnt, HE_LT_CNT_FX ) ) && ( GT_16( sub( hNoiseEst->Etot_last_fx, hNoiseEst->Etot_l_fx ), HE_LT_THR2_FX ) ) ) || ( ( sub( hNoiseEst->harm_cor_cnt, HE_LT_CNT_FX ) > 0 ) && ( LT_16( ini_frame_fx, HE_LT_CNT_INIT_FX ) ) ) || ( GT_16( sub( hNoiseEst->Etot_l_lp_fx, hNoiseEst->Etot_l_fx ), HE_LT_THR2_FX ) ) ) + IF( ( ( GT_16( hNoiseEst->harm_cor_cnt, HE_LT_CNT_FX ) ) && ( GT_16( sub_sat( hNoiseEst->Etot_last_fx, hNoiseEst->Etot_l_fx ), HE_LT_THR2_FX ) ) ) || ( ( sub( hNoiseEst->harm_cor_cnt, HE_LT_CNT_FX ) > 0 ) && ( LT_16( ini_frame_fx, HE_LT_CNT_INIT_FX ) ) ) || ( GT_16( sub_sat( hNoiseEst->Etot_l_lp_fx, hNoiseEst->Etot_l_fx ), HE_LT_THR2_FX ) ) ) { /**Etot_l_lp = 0.03f * *Etot_l + (1.0f - 0.03f) * *Etot_l_lp; */ hNoiseEst->Etot_l_lp_fx = mac_r( L_mult( 983, hNoiseEst->Etot_l_fx ), 31785, hNoiseEst->Etot_l_lp_fx ); @@ -361,13 +361,116 @@ void noise_est_pre_fx( } } /**sign_dyn_lp = 0.1f * (*Etot_h - *Etot_l) + (1.0f - 0.1f) * *sign_dyn_lp;*/ - hNoiseEst->sign_dyn_lp_fx = round_fx( L_mac( L_mult( 3277, sub( hNoiseEst->Etot_h_fx, hNoiseEst->Etot_l_fx ) ), 29491, hNoiseEst->sign_dyn_lp_fx ) ); + hNoiseEst->sign_dyn_lp_fx = round_fx( L_mac( L_mult( 3277, sub_sat( hNoiseEst->Etot_h_fx, hNoiseEst->Etot_l_fx ) ), 29491, hNoiseEst->sign_dyn_lp_fx ) ); } return; } +void noise_est_pre_32fx( + const Word32 Etot, /* i : Energy of current frame */ + const Word16 ini_frame_fx, /* i : Frame number (init) */ + NOISE_EST_HANDLE hNoiseEst, /* i/o: Noise estimation handle */ + const int16_t idchan, /* i : channel ID */ + const int16_t element_mode, /* i : element mode */ + const int16_t last_element_mode /* i : last element mode */ +) +{ + Word32 tmp; + + IF( LE_16( ini_frame_fx, 1 ) || ( EQ_16( idchan, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( last_element_mode, IVAS_CPE_DFT ) ) ) + { + hNoiseEst->Etot_h_32fx = Etot; + move16(); + hNoiseEst->Etot_l_32fx = Etot; + move16(); + hNoiseEst->Etot_l_lp_32fx = Etot; + move16(); + hNoiseEst->Etot_last_32fx = Etot; + move16(); + hNoiseEst->Etot_v_h2_32fx = 0; + move16(); + hNoiseEst->Etot_lp_32fx = Etot; + move16(); + hNoiseEst->sign_dyn_lp_32fx = 0; + move16(); + } + ELSE + { + /* *Etot_lp = 0.20f*Etot + 0.80f* *Etot_lp; */ + hNoiseEst->Etot_lp_32fx = L_add( Mpy_32_32( 429496730, Etot ), Mpy_32_32( 1717986918, hNoiseEst->Etot_lp_32fx ) ); + move16(); + + hNoiseEst->Etot_h_32fx = L_sub( hNoiseEst->Etot_h_32fx, 671089 ); + move16(); /* 10=0.04 in Q8 */ + hNoiseEst->Etot_h_32fx = L_max( hNoiseEst->Etot_h_32fx, Etot ); + move16(); + hNoiseEst->Etot_l_32fx = L_add( hNoiseEst->Etot_l_32fx, 1342177 ); + move16(); /* 20 = .08 in Q8 */ + + + /* Could even be higher but it also delays first entry to DTX */ + IF( GT_16( hNoiseEst->harm_cor_cnt, HE_LT_CNT_PRE_FX ) ) + { + test(); + IF( ( LT_16( ini_frame_fx, s_min( HE_LT_CNT_INIT_FX, MAX_FRAME_COUNTER - 1 ) ) ) && ( LT_32( L_sub( hNoiseEst->Etot_h_32fx, hNoiseEst->Etot_lp_32fx ), (Word32) 3 * 16777216 ) ) /* 3.0 Q8 */ + ) + { + /* *Etot_l += min(2,(*Etot_last-*Etot_l)*0.1f); */ + tmp = Mpy_32_32( L_sub( hNoiseEst->Etot_last_32fx, hNoiseEst->Etot_l_32fx ), 214748365 ); /* factor in Q15 3277 .1*32768 */ + tmp = L_min( 33554432, tmp ); /* 2.0 in Q8 is 512*/ + hNoiseEst->Etot_l_32fx = L_add( hNoiseEst->Etot_l_32fx, tmp ); + move16(); /* Q8 */ + } + /* Avoids large steps in short active segments */ + test(); + IF( ( GT_32( L_sub( hNoiseEst->Etot_last_32fx, hNoiseEst->Etot_l_32fx ), 503316480 ) ) /* 30.0f*Q8 */ + && ( GT_16( hNoiseEst->harm_cor_cnt, HE_LT_CNT_PRE_SHORT_FX ) ) ) + { + /* *Etot_l += (*Etot_last-*Etot_l)*0.02f; */ + hNoiseEst->Etot_l_32fx = L_add( hNoiseEst->Etot_l_32fx, Mpy_32_32( L_sub( hNoiseEst->Etot_last_32fx, hNoiseEst->Etot_l_32fx ), 42949673 ) ); + move16(); /* 0.02 = 655 Q8*/ + } + ELSE IF( GT_32( L_sub( hNoiseEst->Etot_last_32fx, hNoiseEst->Etot_l_32fx ), 167772160 ) ) /* 10.0 in Q8*/ + { + hNoiseEst->Etot_l_32fx = L_add( hNoiseEst->Etot_l_32fx, 1342177 ); + move16(); /* 0.08 is 20 in Q8*/ + } + } + + hNoiseEst->Etot_l_32fx = L_min( hNoiseEst->Etot_l_32fx, Etot ); + + IF( LT_16( ini_frame_fx, 100 ) && LT_32( hNoiseEst->Etot_l_32fx, hNoiseEst->Etot_l_lp_32fx ) ) + { + /**Etot_l_lp = 0.1f * *Etot_l + (1.0f - 0.1) * *Etot_l_lp; */ + hNoiseEst->Etot_l_lp_32fx = L_add( Mpy_32_32( 214748364, hNoiseEst->Etot_l_32fx ), Mpy_32_32( 1932735283, hNoiseEst->Etot_l_lp_32fx ) ); + move16(); + } + ELSE + { + test(); + test(); + test(); + test(); + IF( ( ( GT_16( hNoiseEst->harm_cor_cnt, HE_LT_CNT_FX ) ) && ( GT_32( L_sub_sat( hNoiseEst->Etot_last_32fx, hNoiseEst->Etot_l_32fx ), 503316480 ) ) ) || ( ( sub( hNoiseEst->harm_cor_cnt, HE_LT_CNT_FX ) > 0 ) && ( LT_16( ini_frame_fx, HE_LT_CNT_INIT_FX ) ) ) || ( GT_32( L_sub_sat( hNoiseEst->Etot_l_lp_32fx, hNoiseEst->Etot_l_32fx ), 503316480 ) ) ) + { + /**Etot_l_lp = 0.03f * *Etot_l + (1.0f - 0.03f) * *Etot_l_lp; */ + hNoiseEst->Etot_l_lp_32fx = L_add( Mpy_32_32( 64424509, hNoiseEst->Etot_l_32fx ), Mpy_32_32( 2083059139, hNoiseEst->Etot_l_lp_32fx ) ); + move16(); + } + ELSE + { + /* *Etot_l_lp = 0.02f * *Etot_l + (1.0f - 0.02f) * *Etot_l_lp; */ + hNoiseEst->Etot_l_lp_32fx = L_add( Mpy_32_32( 42949673, hNoiseEst->Etot_l_32fx ), Mpy_32_32( 2104533975, hNoiseEst->Etot_l_lp_32fx ) ); + } + } + /**sign_dyn_lp = 0.1f * (*Etot_h - *Etot_l) + (1.0f - 0.1f) * *sign_dyn_lp;*/ + hNoiseEst->sign_dyn_lp_32fx = L_add( Mpy_32_32( 214748365, L_sub_sat( hNoiseEst->Etot_h_32fx, hNoiseEst->Etot_l_32fx ) ), Mpy_32_32( 1932735283, hNoiseEst->sign_dyn_lp_32fx ) ); + } + + return; +} /*==================================================================================*/ /* FUNCTION : noise_est_down_fx() */ /*----------------------------------------------------------------------------------*/ diff --git a/lib_enc/pre_proc_fx.c b/lib_enc/pre_proc_fx.c index f76dd3e08..76a128110 100644 --- a/lib_enc/pre_proc_fx.c +++ b/lib_enc/pre_proc_fx.c @@ -211,8 +211,8 @@ void pre_proc_fx( /*----------------------------------------------------------------* * Change the sampling frequency to 12.8 kHz *----------------------------------------------------------------*/ - - modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, ( const Word16 )( EQ_16( st->max_bwidth, NB ) ) ); + Word16 Q_new_inp, mem_decim_size; // TO be removed + modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, ( const Word16 )( EQ_16( st->max_bwidth, NB ) ), &Q_new_inp, &mem_decim_size ); Copy( new_inp_12k8, st->buf_speech_enc + L_FRAME32k, L_FRAME ); Scale_sig( st->buf_speech_enc + L_FRAME32k, L_FRAME, 1 ); /*------------------------------------------------------------------* @@ -1018,7 +1018,7 @@ void pre_proc_fx( } ELSE IF( EQ_32( st->input_Fs, 32000 ) || EQ_32( st->input_Fs, 48000 ) ) { - modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_16k, sr_core_tmp, st->mem_decim16k_fx, 0 ); + modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_16k, sr_core_tmp, st->mem_decim16k_fx, 0, &Q_new_inp, &mem_decim_size ); } ELSE /* keep memories up-to-date in case of bitrate switching */ { diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 9ad638274..b05dfcce2 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -306,6 +306,16 @@ void noise_est_pre_fx( ); +void noise_est_pre_32fx( + const Word32 Etot, /* i : Energy of current frame */ + const Word16 ini_frame_fx, /* i : Frame number (init) */ + NOISE_EST_HANDLE hNoiseEst, /* i/o: Noise estimation handle */ + const Word16 idchan, /* i : channel ID */ + const Word16 element_mode, /* i : element mode */ + const Word16 last_element_mode /* i : last element mode */ + +); + void pitch_ol2_fx( const Word16 pit_min, /* i : minimum pitch value (20 or 29) */ const Word16 pitch_ol, /* i : pitch to be improved */ @@ -558,6 +568,22 @@ Word16 wb_vad_fx( Word16 lp_noise /* i : long term noise energy */ ); +Word16 wb_vad_ivas_fx( + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word32 fr_bands[], /* i : per band i energy (contains 2 vectors) Q_new+QSCALE*/ + Word16 *noisy_speech_HO, /* o : SC-VBR noisy speech HO flag */ + Word16 *clean_speech_HO, /* o : SC-VBR clean speech HO flag */ + Word16 *NB_speech_HO, /* o : SC-VBR NB speech HO flag */ + Word16 *snr_sum_he, /* o : Output snr_sum as weighted spectral measure*/ + Word16 *localVAD_HE_SAD, + Word8 *flag_noisy_speech_snr, /* o : */ + const Word16 Q_new, /* i : scaling factor Q0 */ + VAD_HANDLE hVAD, /* i/o: VAD data handle */ + NOISE_EST_HANDLE hNoiseEst, /* i : Noise estimation handle */ + Word16 lp_speech, /* i : long term active speech energy average */ + Word16 lp_noise /* i : long term noise energy */ +); + Word32 construct_snr_thresh_fx( Word16 sp_center[], /*(i) spectral center*/ Word32 snr_flux, /*(i) snr flux*/ Word32 lt_snr, /*(i) long time time domain snr*/ @@ -636,6 +662,21 @@ void lsf_end_enc_fx( #endif ); +void lsf_end_enc_ivas_fx( + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 *lsf, /* i : LSF in the frequency domain (0..6400) */ + Word16 *qlsf, /* o : quantized LSF */ + const Word16 nBits_in, /* i : number of bits to spend on ISF quantization */ + const Word16 coder_type_org, /* i : coding type */ + Word16 Q_ener, /* i : Q valuen for Bin_Ener */ + Word16 force_sf, /* i : Force safety-net usage if coding type supports */ + Word16 *lpc_param, + Word16 *no_indices, + Word16 *bits_param_lpc, + Word16 coder_type_raw /* i : Coder type (LSF coder_type have some special cases)*/ + , + const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ +); void Mode2_abs_pit_enc_fx( Word16 T0, /* i : integer pitch lag */ Word16 T0_frac, /* i : pitch fraction */ @@ -1229,6 +1270,16 @@ void lsf_enc_fx( #endif const Word16 Q_new ); +void lsf_enc_ivas_fx( + Encoder_State *st, /* i/o: state structure */ + Word16 *lsf_new, /* o : quantized LSF vector */ + Word16 *lsp_new, /* i/o: LSP vector to quantize/quantized */ + Word16 *lsp_mid, /* i/o : mid-frame LSP vector */ + Word16 *Aq, /* o : quantized A(z) for 4 subframes */ + const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const Word16 GSC_IVAS_mode, /* i : GSC IVAS mode */ + const Word16 tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ + const Word16 Q_new ); void Es_pred_enc_fx( Word16 *Es_pred, /* o : predicited scaled innovation energy Q8 */ Word16 *indice, /* o : indice of quantization */ @@ -1315,6 +1366,15 @@ void perform_noise_estimation_enc_fx( Word16 enerBuffer_exp, HANDLE_FD_CNG_ENC st ); /* i/o: FD_CNG structure containing all buffers and variables */ +void perform_noise_estimation_enc_ivas_fx( Word32 *band_energies, /* i: energy in critical bands without minimum noise floor MODE2_E_MIN */ + Word16 band_energies_exp, /* i: exponent for energy in critical bands without minimum noise floor MODE2_E_MIN */ + Word32 *enerBuffer, + Word16 enerBuffer_exp, + HANDLE_FD_CNG_ENC st, /* i/o: FD_CNG structure containing all buffers and variables */ + const int32_t input_Fs, /* i : input sampling rate */ + CPE_ENC_HANDLE hCPE /* i : CPE encoder structure */ +); + /* Adjust the noise estimator at the beginning of each CNG phase (encoder-side) */ Word16 AdjustFirstSID_fx( Word16 npart, @@ -3029,6 +3089,16 @@ Word32 mslvq_cng_fx( const Word16 *w, /* i : weights for LSF quantization Q10*/ Word16 *no_scales ); +Word32 mslvq_cng_ivas_fx( + Word16 idx_cv, /* i : index of cv from previous stage */ + Word16 *pTmp, /* i : 16 dimensional i vector x2.56*/ + Word16 *quant, /* o : quantized vector x2.56*/ + Word16 *cv_out, /* o : corresponding 8-dim lattice codevectors (without the scaling) Q13*/ + Word16 *idx_lead, /* o : leader index for each 8-dim subvector */ + Word16 *idx_scale, /* o : scale index for each subvector */ + const Word16 *w /* i : weights for LSF quantization Q10*/ +); + void Unified_weighting_fx( const Word32 Bin_Ener_128_fx[], /* i : FFT Bin energy 128 bins in two sets Q_ener */ Word16 Q_ener, @@ -3061,6 +3131,18 @@ Word32 mslvq_fx( Word16 pred_flag, /* i : prediction flag (0: safety net, 1 - predictive )*/ Word16 no_scales[][2] ); +Word32 mslvq_ivas_fx( + Word16 *pTmp, /* i : M-dimensional i vector */ + Word16 *quant, /* o : quantized vector */ + Word16 *cv_out, /* o : corresponding 8-dim lattice codevectors (without the scaling) */ + Word16 *idx_lead, /* o : leader index for each 8-dim subvector */ + Word16 *idx_scale, /* o : scale index for each subvector */ + Word16 *w, /* i : weights for LSF quantization */ + Word16 mode, /* i : number indicating the coding type (V/UV/G...)*/ + Word16 mode_glb, /* i : LVQ coding mode */ + Word16 pred_flag /* i : prediction flag (0: safety net, 1 - predictive )*/ +); + Word16 multi_harm_fx( /* o : frame multi-harmonicity (1-harmonic, 0-not) */ const Word16 Bin_E[], /* i : log-energy spectrum of the current frame Q7 */ Word16 old_S[], /* i/o: prev. log-energy spectrum w. subtracted floor Q7 */ @@ -3216,6 +3298,14 @@ void index_lvq_fx( Word32 *p_offset_scale2, Word16 *p_no_scales ); +void index_lvq_ivas_fx( + Word16 *quant, /* i : codevector to be indexed (2 8-dim subvectors) Q13*/ + Word16 *idx_lead, /* i : leader class index for each subvector */ + Word16 *idx_scale, /* i : scale index for each subvector */ + Word16 mode, /* i : integer signalling the quantizer structure for the current bitrate */ + Word16 *index, /* o : encoded index (represented on 3 short each with 15 bits ) */ + const Word16 prediction_flag ); + ivas_error init_encoder_fx( Encoder_State *st_fx /* i/o: Encoder static variables structure */ ); diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 6ab6aae6c..9bc9d5393 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -775,6 +775,13 @@ typedef struct noise_estimation_structure Word16 Etot_l_lp_fx; /* Q8 Noise estimator - Smoothed low energy */ Word16 Etot_last_fx; /*Q8*/ Word16 Etot_lp_fx; /* Q8 Noise estimator - Filtered input energy */ + + Word32 Etot_l_32fx; /* Q8 Noise estimator - Track energy from below */ + Word32 Etot_h_32fx; /* Q8 Noise estimator - Track energy from above */ + Word32 Etot_l_lp_32fx; /* Q8 Noise estimator - Smoothed low energy */ + Word32 Etot_last_32fx; /*Q8*/ + Word32 Etot_lp_32fx; /* Q8 Noise estimator - Filtered input energy */ + Word16 lt_tn_track_fx; /* Q15 */ Word16 lt_tn_dist_fx; /* Q8*/ Word16 lt_Ellp_dist_fx; /* Etot low lp same domain as *Etot_l_lp, Q8 */ @@ -800,6 +807,10 @@ typedef struct noise_estimation_structure float Etot_sq_st_est; /* Noise estimation - short term estimate of E{ Etot^2 } */ Word16 Etot_v_h2_fx; Word16 sign_dyn_lp_fx; /*Q8*/ + + Word32 Etot_v_h2_32fx; + Word32 sign_dyn_lp_32fx; /*Q8*/ + Word16 Etot_st_est_fx; /* Q8 Noise estimation - short term estimate of E{ Etot } */ Word16 Etot_sq_st_est_fx; /* Q2 Noise estimation - short term estimate of E{ Etot^2 } */ @@ -2267,10 +2278,10 @@ typedef struct enc_core_structure float mem_preemph16k_DFT; float inp_16k_mem_stereo_sw[STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k]; - Word32 mem_preemph_DFT_fx; - Word32 inp_12k8_mem_stereo_sw_fx[STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT]; - Word32 mem_preemph16k_DFT_fx; - Word32 inp_16k_mem_stereo_sw_fx[STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k]; + Word16 mem_preemph_DFT_fx; + Word16 inp_12k8_mem_stereo_sw_fx[STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT]; + Word16 mem_preemph16k_DFT_fx; + Word16 inp_16k_mem_stereo_sw_fx[STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k]; /* MCT Channel mode indication: LFE, ignore channel? */ MCT_CHAN_MODE mct_chan_mode; diff --git a/lib_enc/vad_fx.c b/lib_enc/vad_fx.c index 58c70edae..56756588c 100644 --- a/lib_enc/vad_fx.c +++ b/lib_enc/vad_fx.c @@ -1685,6 +1685,1242 @@ Word16 wb_vad_fx( } + if ( L_and( hVAD->vad_prim_reg, (Word32) 0x8000L ) != 0 ) /* 0x8000L = 1L << 15 */ + { + hVAD->vad_prim_cnt_16 = sub( hVAD->vad_prim_cnt_16, 1 ); + } + + hVAD->vad_prim_reg = L_shl( L_and( hVAD->vad_prim_reg, (Word32) 0x3fffffffL ), 1 ); + + IF( st_fx->localVAD != 0 ) + { + hVAD->vad_prim_reg = L_or( hVAD->vad_prim_reg, 0x01L ); + hVAD->vad_prim_cnt_16 = add( hVAD->vad_prim_cnt_16, 1 ); + } + + return flag; +} + +Word16 wb_vad_ivas_fx( + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word32 fr_bands[], /* i : per band input energy (contains 2 vectors) Q_new+QSCALE*/ + Word16 *noisy_speech_HO, /* o : SC-VBR noisy speech HO flag */ + Word16 *clean_speech_HO, /* o : SC-VBR clean speech HO flag */ + Word16 *NB_speech_HO, /* o : SC-VBR NB speech HO flag */ + Word16 *snr_sum_he, /* o : Output snr_sum as weighted spectral measure*/ + Word16 *localVAD_HE_SAD, + Word8 *flag_noisy_speech_snr, /* o : */ + const Word16 Q_new, /* i : scaling factor Q0 */ + VAD_HANDLE hVAD, /* i/o: VAD data handle */ + NOISE_EST_HANDLE hNoiseEst, /* i : Noise estimation handle */ + Word16 lp_speech_fx, /* i : long term active speech energy average */ + Word16 lp_noise_fx /* i : long term noise energy */ +) +{ + Word16 i, flag = 0, hangover_short; + + Word16 snr_sum, thr1 = 0, thr1_nb_mod, thr2 = 0, nk = 0, nc = 0, th_clean = 0; + Word16 lp_snr; /* Q8 */ + const Word32 *pt1; + const Word32 *pt2; + const Word32 *pt3; + + Word16 min_snr, sign_thr; + + Word32 L_snr, L_snr_sum; + Word32 ftmp, ftmp1, ftmp2; + Word16 m_noise_local, e_noise, e_num, m_num, snr, snr_tmp, shift_snr; + + Word16 snr_sumt; + Word32 L_vad_thr; + Word16 hangover_hd; + Word16 snr_idx; + Word16 delta1, delta2, delta3, delta4; + + Word16 flag_he1; + Word16 stmp; + Word32 L_msnr, L_mssnr = 0, L_mssnr_hov; + Word16 j, tmp, tmp1, tmp2; + Word32 L_tmp, L_tmp1, L_tmp2; + + Word32 L_snr18, L_snr19; /* Q4 */ + Word32 L_msnr18, L_msnr19; /* Q13 */ + Word16 nb_sig_snr; /* Q0 */ + + Word16 nv; + Word16 nv_ofs; /* Q8 */ + Word32 L_snr_sum_HE_SAD; /* Q4 */ + Word16 snr_sum_HE_SAD; /*Q8 log */ + Word16 sign_thr_HE_SAD, min_snr_HE_SAD; + + + Word16 thr1_ol; + Word32 L_snr_sum_ol; + Word16 snr_sum_ol; /* Q8 log */ + + Word32 L_snr_outlier; + Word16 snr_outlier_index; + Word32 L_accum_ener_L; + Word32 L_accum_ener_H; + Word16 vad_bwidth_fx; + Word16 last_7k2_coder_type; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; +#endif + + if ( hNoiseEst == NULL ) + { + hNoiseEst = st_fx->hNoiseEst; + move16(); + } + + if ( hVAD == NULL ) + { + move16(); + hVAD = st_fx->hVAD; + } + if ( LT_16( lp_speech_fx, -100 * 256 ) ) + { + lp_speech_fx = st_fx->lp_speech_fx; + move16(); + } + + if ( LT_16( lp_noise_fx, -100 * 256 ) ) + { + lp_noise_fx = st_fx->lp_noise_fx; + move16(); + } + + vad_bwidth_fx = st_fx->input_bwidth; + move16(); + + L_snr_outlier = L_deposit_l( 0 ); + snr_outlier_index = 0; + move16(); + L_accum_ener_L = L_deposit_l( 0 ); + L_accum_ener_H = L_deposit_l( 0 ); + + L_snr18 = L_deposit_l( 0 ); /* Q4*/ + L_snr19 = L_deposit_l( 0 ); /* Q4 */ + L_msnr18 = L_deposit_l( 8192 ); /* 1.0 Q13*/ + L_msnr19 = L_deposit_l( 8192 ); /* 1.0 Q13 */ + + + IF( EQ_16( vad_bwidth_fx, NB ) ) + { + st_fx->min_band = 1; + move16(); + st_fx->max_band = 16; + move16(); + } + ELSE + { + st_fx->min_band = 0; + move16(); + st_fx->max_band = 19; + move16(); + } + + IF( st_fx->Opt_SC_VBR ) + { + last_7k2_coder_type = st_fx->hSC_VBR->last_7k2_coder_type; + move16(); + } + ELSE + { + last_7k2_coder_type = -1; + move16(); + } + /*---------------------------------------------------------------------* + * set SNR thresholds depending on the input bandwitdh + *---------------------------------------------------------------------*/ + IF( EQ_16( st_fx->max_band, 19 ) ) + /* WB input */ /* or SWB input */ + { + nk = 3277; + move16(); /*0.1 Q15 */ + nc = 4122; + move16(); /*16.1 Q8 */ + nv = 525; + move16(); /* 2.05 Q8*/ + nv_ofs = 422; + move16(); /* 1.65 Q8*/ + th_clean = TH16_2_FX; + move16(); /* 35 Q8 */ + sign_thr = 21; + move16(); /*1.3 Q4 */ + tmp = sub( vad_bwidth_fx, WB ); + if ( tmp != 0 ) + { + sign_thr = 28; + move16(); /*1.75f; Q4 SWB */ + } + min_snr = 13; + move16(); /*0.8 Q4 WB */ + if ( tmp != 0 ) + { + min_snr = 4; + move16(); /*0.25f; Q4 SWB */ + } + + sign_thr_HE_SAD = 40; + move16(); /* 2.5f Q4 */ + ; + min_snr_HE_SAD = 3; + move16(); /* 0.2f Q4 */ + ; + } + ELSE /* NB input */ + { + move16(); + nk = 3277; + move16(); /* 0.1 Q15 */ + nc = 4096; + move16(); /* 16.0 Q8 */ + nv = 1024; + move16(); /* 4.0 Q8 */ + nv_ofs = 294; + move16(); /*1.15 Q8*/ + th_clean = TH8_1_FX; + move16(); /*20 Q8 */ + sign_thr = 28; + move16(); /* 1.75 * Q4 SIGN_THR */ + min_snr = 4; + move16(); /* .25 *Q4 MIN_SNR */ + sign_thr_HE_SAD = 42; + move16(); /* 2.65f Q4 */ + ; + min_snr_HE_SAD = 1; + move16(); /* 0.05f Q4 */ + ; + } + + hangover_short = 0; + move16(); + + IF( st_fx->Opt_SC_VBR != 0 ) + { + *noisy_speech_HO = 0; + move16(); + *clean_speech_HO = 0; + move16(); + *NB_speech_HO = 0; + move16(); + } + + /*---------------------------------------------------------------------* + * compute SNR for each band & total + *---------------------------------------------------------------------*/ + + lp_snr = sub( lp_speech_fx, lp_noise_fx ); /*Q8 */ + + snr_idx = 2; + move16(); + if ( GT_16( lp_snr, 4608 ) ) /*18.0 Q8*/ + { + snr_idx = 1; + move16(); + } + if ( GT_16( lp_snr, 6144 ) ) /*24.0 Q8*/ + { + snr_idx = 0; + move16(); + } + + + IF( snr_idx == 0 ) + { + stmp = 6; + move16(); + delta1 = 0; + move16(); /*0.0f in Q13 */ + delta2 = 0; + move16(); /*0.0f in Q13 */ + delta3 = 0; + move16(); /*0.0f in Q13 */ + delta4 = 0; + move16(); + + + /*vad_thr = 2.4f*lp_snr - 42.2f; + vad_thr = min(vad_thr, 80 ); */ + + L_vad_thr = -345702; + move32(); /* -42.2 Q13*/ + L_vad_thr = L_mac0( L_vad_thr, 77, lp_snr ); /* (2.4)Q5*(lp_snr)Q8 */ + L_vad_thr = L_min( L_vad_thr, 80 * ( 1 << 13 ) ); + } + ELSE IF( EQ_16( snr_idx, 1 ) ) + { + stmp = 6; + move16(); + delta1 = 819; + move16(); /*0.1f in Q13 */ + delta2 = 1638; + move16(); /*0.2f in Q13 */ + delta3 = 1638; + move16(); /*0.2f in Q13 */ + delta4 = 1638; + move16(); /*0.2f in Q13 */ + + /* vad_thr = 2.4f*lp_snr - 40.2f; + vad_thr = min(vad_thr, 80); + */ + L_vad_thr = -329318; + move32(); /* -40.2 Q13*/ + L_vad_thr = L_mac0( L_vad_thr, 77, lp_snr ); /* (2.4)Q5*(lp_snr)Q8 */ + L_vad_thr = L_min( L_vad_thr, 80 * ( 1 << 13 ) ); + } + ELSE + { + stmp = 9; + move16(); + delta1 = 1638; + move16(); /*0.2f in Q13 */ + delta2 = 3277; + move16(); /*0.4f in Q13 */ + delta3 = 2458; + move16(); /*0.3f in Q13 */ + delta4 = 3277; + move16(); /*0.4f in Q13 */ + /* vad_thr = 2.5f*lp_snr - 10.0f; + vad_thr = max(vad_thr, 1); + */ + L_vad_thr = -81920; + move32(); /* -10 Q13*/ + L_vad_thr = L_mac0( L_vad_thr, 80, lp_snr ); /* (2.5)Q5*(lp_snr)Q8 */ + L_vad_thr = L_max( L_vad_thr, 1 * ( 1 << 13 ) ); + } + + nb_sig_snr = 20; + move16(); + + pt1 = fr_bands; + pt2 = fr_bands + NB_BANDS; + pt3 = hNoiseEst->bckr_fx; + + L_snr_sum = L_deposit_l( 0 ); + L_snr_sum_HE_SAD = L_deposit_l( 0 ); + snr_sumt = 0; + move16(); + L_mssnr_hov = L_deposit_l( 0 ); + *snr_sum_he = 0; + move16(); + snr_sum_HE_SAD = 0; + move16(); + + + FOR( i = st_fx->min_band; i <= st_fx->max_band; i++ ) + { + ftmp = L_add( *pt1++, 0 ); + ftmp1 = L_add( *pt2++, 0 ); + ftmp2 = L_add( *pt3++, 0 ); + + /*fr_enr = ( 0.2f * st->enrO[i] + 0.4f * ftmp + 0.4f * ftmp1 );*/ + L_tmp = Mult_32_16( hNoiseEst->enrO_fx[i], 13107 ); /* L_tmp(high word) = Qenr0fx*Q16+1 -16 -> Qener0+1 */ + L_tmp1 = Madd_32_16( L_tmp, ftmp, 26214 ); /* 26214 = .4 in Q16 */ + L_tmp1 = Madd_32_16( L_tmp1, ftmp1, 26214 ); /* L_tmp1 re_used a bit later for final snr[i]*/ + + L_tmp2 = Madd_32_16( L_tmp, ftmp, 19661 ); /* 19661 = 0.3 in Q16 */ + L_tmp2 = Msub_32_16( L_tmp2, ftmp1, -32768 ); /* -32768= -0.5 in Q16 */ + + IF( GT_32( ftmp, ftmp1 ) ) + { + /*snr[i] = ( 0.2f * st->enrO[i] + 0.4f * ftmp + 0.4f * ftmp1 ) / ftmp2 ;*/ + /*snr[i] = L_tmp1/(ftmp2) */ + IF( ftmp2 != 0 ) + { + e_num = norm_l( L_tmp1 ); + m_num = extract_h( L_shl( L_tmp1, e_num ) ); + + e_noise = norm_l( ftmp2 ); + m_noise_local = extract_h( L_shl( ftmp2, e_noise ) ); + + m_num = shr( m_num, 1 ); + shift_snr = add( sub( e_num, e_noise ), 15 - 4 ); + + snr_tmp = div_s( m_num, m_noise_local ); +#ifdef BASOP_NOGLOB + L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ +#else /* BASOP_NOGLOB */ + L_snr = L_shr( snr_tmp, shift_snr ); /* L_snr in Q4 */ +#endif /* BASOP_NOGLOB */ + } + ELSE + { + e_num = norm_l( L_tmp1 ); + m_num = extract_h( L_shl( L_tmp1, e_num ) ); + + /* if bckr[i] == 0; approx. L_snr */ + e_noise = add( 30 + 1, abs_s( Q_new ) ); + + m_num = shr( m_num, 1 ); + shift_snr = add( sub( e_num, e_noise ), 15 - 4 ); + + snr_tmp = div_s( m_num, 32767 ); + L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /*L_snr in Q4*/ + } + } + ELSE + { + /*snr[i] = ( 0.2f * st->enrO[i] + 0.3f * ftmp + 0.5f * ftmp1 ) / ftmp2 ;*/ + /*snr[i] =L_tmp2/( ftmp2 ) */ + IF( ftmp2 != 0 ) + { + e_num = norm_l( L_tmp2 ); + m_num = extract_h( L_shl( L_tmp2, e_num ) ); + + e_noise = norm_l( ftmp2 ); + m_noise_local = extract_h( L_shl( ftmp2, e_noise ) ); + + m_num = shr( m_num, 1 ); + shift_snr = add( sub( e_num, e_noise ), 15 - 4 ); + + snr_tmp = div_s( m_num, m_noise_local ); +#ifdef BASOP_NOGLOB + L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ +#else /* BASOP_NOGLOB */ + L_snr = L_shr( snr_tmp, shift_snr ); /* L_snr in Q4 */ +#endif /* BASOP_NOGLOB */ + } + ELSE + { + e_num = norm_l( L_tmp2 ); + m_num = extract_h( L_shl( L_tmp2, e_num ) ); + + /* if bckr[i] == 0; approx. L_snr */ + e_noise = add( 30 + 1, abs_s( Q_new ) ); + + m_num = shr( m_num, 1 ); + shift_snr = add( sub( e_num, e_noise ), 15 - 4 ); + + snr_tmp = div_s( m_num, 32767 ); + L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /*L_snr in Q4*/ + } + } + + if ( LT_32( L_snr, 2 * ( 1 << 4 ) ) ) + { + nb_sig_snr = sub( nb_sig_snr, 1 ); /* nb_sig_snr--; */ + } + L_snr = L_max( L_snr, 1 * ( 1 << 4 ) ); /* if ( snr[i] < 1 ){snr[i] = 1;}*/ + + + /* snr[i] = (float)log10(snr[i]); */ + snr = vad_snr_log_fx( L_snr, ONE_LG10 ); + + /* snr_sumt += snr[i];*/ + snr_sumt = add( snr_sumt, shr( snr, 4 ) ); /*Q4 */ + + +#ifdef BASOP_NOGLOB + tmp = shl_o( snr, 5, &Overflow ); /* Q8 -> Q13 */ +#else /* BASOP_NOGLOB */ + tmp = shl( snr, 5 ); /* Q8 -> Q13 */ +#endif /* BASOP_NOGLOB */ + IF( LT_16( i, 2 ) ) + { +#ifdef BASOP_NOGLOB + tmp = add_o( tmp, delta1, &Overflow ); /*Q13 */ +#else /* BASOP_NOGLOB */ + tmp = add( tmp, delta1 ); /*Q13 */ +#endif /* BASOP_NOGLOB */ + } + ELSE IF( LT_16( i, 7 ) ) + { +#ifdef BASOP_NOGLOB + tmp = add_o( tmp, delta2, &Overflow ); /*Q13 */ +#else /* BASOP_NOGLOB */ + tmp = add( tmp, delta2 ); /*Q13 */ +#endif /* BASOP_NOGLOB */ + } + ELSE IF( LT_16( i, 18 ) ) + { +#ifdef BASOP_NOGLOB + tmp = add_o( tmp, delta3, &Overflow ); /*Q13 */ +#else /* BASOP_NOGLOB */ + tmp = add( tmp, delta3 ); /*Q13 */ +#endif /* BASOP_NOGLOB */ + } + ELSE + { +#ifdef BASOP_NOGLOB + tmp = add_o( tmp, delta4, &Overflow ); /*Q13 */ +#else /* BASOP_NOGLOB */ + tmp = add( tmp, delta4 ); /*Q13 */ +#endif /* BASOP_NOGLOB */ + } + + tmp1 = tmp; + move16(); /* ftmp1 = ftmp; */ + sub( 0, 0 ); + if ( i < 7 ) + { +#ifdef BASOP_NOGLOB + tmp1 = add_o( tmp, 3277, &Overflow ); /*.4 in Q13 ftmp1 = ftmp + 0.4f; */ +#else /* BASOP_NOGLOB */ + tmp1 = add( tmp, 3277 ); /*.4 in Q13 ftmp1 = ftmp + 0.4f; */ +#endif /* BASOP_NOGLOB */ + } + + tmp = s_min( tmp, 16384 ); /* Q13, ftmp = min(ftmp, 2.0f); */ + tmp1 = s_min( tmp1, 16384 ); /* Q13, ftmp1 = min(ftmp1, 2.0f); */ + + L_msnr = L_deposit_l( tmp ); /*msnr = 1*tmp;*/ + FOR( j = 1; j < stmp; j++ ) + { + /* Q13*Q13 +1 -16 +2 = Q13 */ + L_msnr = L_shl( Mult_32_16( L_msnr, tmp ), 2 ); /*Q13 , msnr *= ftmp;*/ + } + L_mssnr = L_add( L_mssnr, L_msnr ); /*Q13 mssnr += msnr;*/ + + if ( EQ_16( i, 18 ) ) + { + L_msnr18 = L_add( L_msnr, 0 ); /*Q13 msnr18 = msnr; */ + } + + if ( EQ_16( i, 19 ) ) + { + L_msnr19 = L_add( L_msnr, 0 ); /* Q13 , msnr19 = msnr; */ + } + + L_msnr = L_deposit_l( tmp1 ); /* Q13, msnr = 1*tmp1 ;*/ + + FOR( j = 1; j < stmp; j++ ) + { + L_msnr = L_shl( Mult_32_16( L_msnr, tmp1 ), 2 ); /*Q13 msnr *= ftmp1;*/ + } + L_mssnr_hov = L_add( L_mssnr_hov, L_msnr ); /*Q13 mssnr_hov += msnr; */ + + /* recompute after he1 modifications */ + /* snr[i] = fr_enr / st->bckr[i] = L_tmp1/st->bckr[i];*/ + IF( hNoiseEst->bckr_fx[i] != 0 ) + { + e_num = norm_l( L_tmp1 ); + m_num = extract_h( L_shl( L_tmp1, e_num ) ); + + e_noise = norm_l( hNoiseEst->bckr_fx[i] ); + m_noise_local = extract_h( L_shl( hNoiseEst->bckr_fx[i], e_noise ) ); + + m_num = shr( m_num, 1 ); + shift_snr = add( sub( e_num, e_noise ), 15 - 4 ); + + snr_tmp = div_s( m_num, m_noise_local ); +#ifdef BASOP_NOGLOB + L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ +#else /* BASOP_NOGLOB */ + L_snr = L_shr( snr_tmp, shift_snr ); /* L_snr in Q4 */ +#endif /* BASOP_NOGLOB */ + } + ELSE + { + e_num = norm_l( L_tmp1 ); + m_num = extract_h( L_shl( L_tmp1, e_num ) ); + + /* if bckr[i] == 0; approx. L_snr */ + e_noise = add( 30 + 1, abs_s( Q_new ) ); + + m_num = shr( m_num, 1 ); + shift_snr = add( sub( e_num, e_noise ), 15 - 4 ); + + snr_tmp = div_s( m_num, 32767 ); + L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /*L_snr in Q4*/ + } + + + /* conditional snrsum, snr_sum = snr_sum + snr[i];*/ + sign_thr_snr_acc_fx( &L_snr_sum_HE_SAD, L_snr, sign_thr_HE_SAD, min_snr_HE_SAD ); + sign_thr_snr_acc_fx( &L_snr_sum, L_snr, sign_thr, min_snr ); + + L_snr = L_max( L_snr, 16 ); /*Q4, if( snr[i] < 1.0f ) { snr[i] = 1.0f;} */ + + /* float saves all snrs in an snr[] vector , + in fix we only save two bands */ + if ( EQ_16( i, 18 ) ) + { + L_snr18 = L_add( L_snr, 0 ); /*Q4 */ + } + if ( EQ_16( i, 19 ) ) + { + L_snr19 = L_add( L_snr, 0 ); /* Q4 */ + } + + /* accumulate background noise energy in bands [0-2] and in bands [3-19]*/ + IF( LT_16( i, 3 ) ) + { +#ifdef BASOP_NOGLOB + L_accum_ener_L = L_add_o( L_accum_ener_L, hNoiseEst->bckr_fx[i], &Overflow ); /*Q_new+QSCALE */ +#else + L_accum_ener_L = L_add( L_accum_ener_L, hNoiseEst->bckr_fx[i] ); /*Q_new+QSCALE */ +#endif + } + ELSE + { +#ifdef BASOP_NOGLOB + L_accum_ener_H = L_add_o( L_accum_ener_H, hNoiseEst->bckr_fx[i], &Overflow ); /*Q_new+QSCALE */ +#else + L_accum_ener_H = L_add( L_accum_ener_H, hNoiseEst->bckr_fx[i] ); /*Q_new+QSCALE */ +#endif + } + + /* Identify the outlier band */ + IF( GT_32( L_snr, L_snr_outlier ) ) + { + L_snr_outlier = L_add( L_snr, 0 ); /*Q4*/ + snr_outlier_index = i; + move16(); + } + } /* end of band loop */ + + test(); + test(); + test(); /* one additional test for ELSE IF */ + IF( ( EQ_16( st_fx->max_band, 19 ) ) && ( GT_32( L_snr18, 5 * ( 1 << 4 ) ) ) && ( GT_32( L_snr19, 5 * ( 1 << 4 ) ) ) ) + { + /* mssnr = (mssnr + 3*(msnr18 + msnr19)) * 0.77f; */ + /* mssnr = (mssnr*.77f + 2.31f*(msnr18 + msnr19)); */ + L_tmp1 = Mult_32_16( L_mssnr, 25231 ); /* Q13+Q15+1-16 --> Q13 */ + L_tmp = Mult_32_16( L_shl( L_add( L_msnr18, L_msnr19 ), 2 ), 18924 ); /* Q(13+2)+Q(15-2)+1-16 --> Q13 */ + L_tmp = L_add( L_tmp1, L_tmp ); + if ( GT_32( L_tmp, L_mssnr ) ) + { + L_mssnr = L_tmp; + } + } + ELSE IF( ( snr_idx != 0 ) && GT_16( nb_sig_snr, 13 ) ) + { + L_tmp = -126976; + move32(); /* -15.5 Q13 */ + L_tmp = L_mac0( L_tmp, 80, lp_snr ); /* 2.5f(Q5)*lp_snr(Q8) - 15.5f */ + if ( L_tmp > 0 ) /* 2.5f*lp_snr - 15.5f > 0 */ + { + L_mssnr = L_add( L_mssnr, L_tmp ); /* mssnr += 2.5f*lp_snr - 15.5f; */ + } + } + + + /* Separated SNR_SUM outlier modification */ + L_snr_sum_ol = L_snr_sum; /* snr_sum_ol = snr_sum; */ + + test(); + test(); + test(); + IF( ( EQ_16( st_fx->max_band, 19 ) ) && LT_32( L_snr_outlier, MAX_SNR_OUTLIER_3_FX ) && GT_16( snr_outlier_index, 3 ) && LT_16( snr_outlier_index, MAX_SNR_OUTLIER_IND_FX ) ) + { + + test(); + test(); + IF( LT_32( L_accum_ener_H, Mult_32_16( L_accum_ener_L, INV_OUTLIER_THR_1_FX ) ) /* float:: (accum_ener_L*INV_OUTLIER_THR_1 > accum_ener_H ) !!! */ + || LT_32( L_snr_outlier, MAX_SNR_OUTLIER_1_FX ) ) + + { + /* as weight1 is 1.0 we do not need to multiply here , i.e. no need to loose any precisison */ + L_snr_sum_ol = L_sub( L_snr_sum_ol, L_snr_outlier ); /*Q4 */ + } + ELSE IF( LT_32( L_accum_ener_H, Mult_32_16( L_accum_ener_L, INV_OUTLIER_THR_2_FX ) ) /* float:: (accum_ener_L *INV_OUTLIER_THR_2 > accum_ener_H ) !!! */ + || LT_32( L_snr_outlier, MAX_SNR_OUTLIER_2_FX ) ) + { + /* L_snr_sum = SNR_OUTLIER_WGHT_2 * (snr_sum - snr_outlier); */ + + /* 1.01*x -> (1*x + 0.01*x) to not drop down to Q3 */ + L_tmp = L_sub( L_snr_sum_ol, L_snr_outlier ); + L_tmp2 = Mult_32_16( L_tmp, 20972 ); /* 0.01(in Q21)= 20972 Q4*Q21+1-16 -> Q10 */ + L_snr_sum_ol = L_add( L_tmp, L_shr( L_tmp2, 6 ) ); /* Q4 */ + } + ELSE + { + /* L_snr_sum = SNR_OUTLIER_WGHT_3 * (snr_sum - snr_outlier);*/ + /* 1.02*x -> (1*x + 0.02*x) to not drop down to Q3 */ + L_tmp = L_sub( L_snr_sum_ol, L_snr_outlier ); + L_tmp2 = Mult_32_16( L_tmp, 20972 ); /* 0.02(in Q20)= 20972 Q4*Q20+1-16 -> Q9 */ + L_snr_sum_ol = L_add( L_tmp, L_shr( L_tmp2, 5 ) ); /* Q4 */ + } + } + /*st_fx->snr_sum_vad_fx = 0.5f * st->snr_sum_vad + 0.5f * snr_sum_ol;*/ +#ifdef BASOP_NOGLOB + hVAD->L_snr_sum_vad_fx = L_shr( L_add_o( hVAD->L_snr_sum_vad_fx, L_snr_sum_ol, &Overflow ), 1 ); /*Q4*/ +#else /* BASOP_NOGLOB */ + hVAD->L_snr_sum_vad_fx = L_shr( L_add( hVAD->L_snr_sum_vad_fx, L_snr_sum_ol ), 1 ); /*Q4*/ +#endif /* BASOP_NOGLOB */ + + /* snr_sum_ol = 10.0f * (float)log10( snr_sum_ol ); */ + snr_sum_ol = vad_snr_log_fx( L_snr_sum_ol, LG10 ); + snr_sum = snr_sum_ol; + move16(); /* note for NB no outlier modification */ + + /* snr_sum_HE_SAD = 10.0f * (float)log10( snr_sum_HE_SAD ); */ + snr_sum_HE_SAD = vad_snr_log_fx( L_snr_sum_HE_SAD, LG10 ); + + *snr_sum_he = snr_sum_HE_SAD; + move16(); /* *snr_sum_he=snr_sum_HE_SAD; */ + + + /*---------------------------------------------------------------------* + * compute thr1 for SAD decision + *---------------------------------------------------------------------*/ + lp_snr = sub( lp_speech_fx, lp_noise_fx ); /*Q8*/ + + sub( 0, 0 ); + IF( LT_16( lp_snr, hNoiseEst->sign_dyn_lp_fx ) ) + { + lp_snr = add( lp_snr, 1 << 8 ); /* lp_snr += 1; */ + + if ( GT_16( lp_snr, hNoiseEst->sign_dyn_lp_fx ) ) + { + lp_snr = hNoiseEst->sign_dyn_lp_fx; + move16(); + } + } + + /*thr1 = nk * lp_snr + nc*1.0 + nv * ( st->Etot_v_h2 - nv_ofs); */ /* Linear function for noisy speech */ + + L_tmp = L_shl( L_mult( sub( hNoiseEst->Etot_v_h2_fx, nv_ofs ), nv ), 7 ); /* Q8+Q8+1 +7 --> Q24 */ + L_tmp = L_mac( L_tmp, nc, (Word16) 32767 ); /* Q8+Q15+1 = Q24 */ + thr1 = mac_r( L_tmp, lp_snr, nk ); /* Q8+Q15+1 - 16 --> Q8 */ + + IF( st_fx->element_mode > EVS_MONO && hNoiseEst->first_noise_updt_cnt < 100 ) + { + /* lower threshold during warmup time */ + thr1 = sub( thr1, 2560 ); + L_vad_thr = 0; + } + + IF( GT_16( lp_snr, (Word16) 20 * ( 1 << 8 ) ) ) /* if (lp_snr > 20.0f )*/ + { + IF( st_fx->element_mode == EVS_MONO || hNoiseEst->first_noise_updt_cnt >= 100 ) + { + /* thr1 = thr1 + 0.3f * (lp_snr - 20.0f); */ + thr1 = add( thr1, mult( 9830, sub( lp_snr, (Word16) 20 * ( 1 << 8 ) ) ) ); /* Q15*Q8+1 -16 --> Q8 */ + + test(); + test(); + test(); + if ( EQ_16( st_fx->max_band, 16 ) && GT_16( lp_snr, 40 * 256 ) && GT_16( thr1, 6600 ) && LT_16( lp_speech_fx, 11520 ) ) + { + thr1 = 6600; + } + } + } + + + /*---------------------------------------------------------------------* + * WB input + * SNR threshold computing + * Hangover control & final VAD decision + *---------------------------------------------------------------------*/ + + IF( NE_16( vad_bwidth_fx, NB ) ) + { + + /* Outlier Detection first calculates thr1_ol and snr_sum_ol instead of + modyfying thr1 and snr_sum */ + + thr1_ol = thr1; + move16(); + hangover_short = 3; + move16(); + + IF( LT_16( lp_snr, th_clean ) ) + { + hangover_short = 4; + move16(); + + /* In this section the modified nk, and nc are used */ + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); /*_DIFF_FLOAT_FIX_ -> the conditions around Opt_SC_VBR_fx are invertered compared to float + ### st_fx->Opt_SC_VBR!=0 vs !st_fx->Opt_SC_VBR #####*/ + test(); + IF( ( snr_outlier_index <= 4 && ( st_fx->last_coder_type > UNVOICED ) && !st_fx->Opt_SC_VBR ) || + ( snr_outlier_index <= 4 && ( last_7k2_coder_type > UNVOICED ) && st_fx->Opt_SC_VBR ) ) + + + { + thr1_ol = sub( thr1_ol, (Word16) ( 1 << 8 ) ); /*thr1_ol = thr1 - 1.0f ; */ + /*snr_sum_ol = 10.0f * (float)log10( hVAD->L_snr_sum_vad_fx );*/ + snr_sum_ol = vad_snr_log_fx( hVAD->L_snr_sum_vad_fx, LG10 ); /* snr in Q8 */ + } + ELSE IF( ( ( LE_16( st_fx->last_coder_type, UNVOICED ) ) && ( LT_32( L_snr_outlier, MAX_SNR_OUTLIER_2_FX ) ) && ( st_fx->Opt_SC_VBR != 0 ) ) || + ( ( LE_16( last_7k2_coder_type, UNVOICED ) ) && ( LT_32( L_snr_outlier, MAX_SNR_OUTLIER_2_FX ) ) && ( st_fx->Opt_SC_VBR == 0 ) ) ) + + { + /* thr1_ol = thr1 + (float)(1.0f - 0.04f * snr_outlier); */ + L_tmp2 = Msub_32_16( (Word32) ( 1 << ( 24 - 16 ) ), L_snr_outlier, 20972 ); /* (1.0)Q24(Q8 in high 32bit word) - Q4*Q19+1 */ + tmp2 = round_fx( L_shl( L_tmp2, 16 ) ); /* high word is in Q8 */ + thr1_ol = add( thr1_ol, tmp2 ); /* (Q8 , Q8) */ + } + ELSE + { + /*thr1_ol = thr1 + max(0, (float)(0.6f - 0.01f * L_snr_outlier)); */ + thr1_ol = thr1; + move16(); + L_tmp2 = Msub_32_16( (Word32) 614, L_snr_outlier, 20972 ); /* .6*1024= */ /* 0.6 Q26(Q10 in high word) - Q4*Q21+1 */ +#ifdef BASOP_NOGLOB + tmp2 = round_fx( L_shl_o( L_tmp2, 14, &Overflow ) ); /* Q10(high word)+ 14 -16 --> Q8*/ +#else /* BASOP_NOGLOB */ + tmp2 = round_fx( L_shl( L_tmp2, 14 ) ); /* Q10(high word)+ 14 -16 --> Q8*/ +#endif + if ( L_tmp2 > 0 ) + { + thr1_ol = add( thr1_ol, tmp2 ); /* Q24 >>16 + Q8 */ + } + } + } + + /* apply outlier modification */ + snr_sum = snr_sum_ol; + move16(); /*NB s*/ + thr1 = thr1_ol; + move16(); + + /* DTX HANGOVER is in pre_proc_fx() */ + flag_he1 = 0; + move16(); + + IF( GT_32( L_mssnr, L_vad_thr ) ) + { + flag_he1 = 1; + move16(); /* he1 primary decision */ + hVAD->nb_active_frames_he1 = add( hVAD->nb_active_frames_he1, 1 ); /* Counter of consecutive active speech frames */ + + IF( GE_16( hVAD->nb_active_frames_he1, ACTIVE_FRAMES_FX ) ) + { + hVAD->nb_active_frames_he1 = ACTIVE_FRAMES_FX; + move16(); + hVAD->hangover_cnt_he1 = 0; + move16(); /* Reset the counter of hangover frames after at least "active_frames" speech frames */ + } + + /* inside HO period */ + test(); + if ( sub( hVAD->hangover_cnt_he1, HANGOVER_LONG_HE_FX ) < 0 && hVAD->hangover_cnt_he1 != 0 ) + { + hVAD->hangover_cnt_he1 = add( hVAD->hangover_cnt_he1, 1 ); + } + + if ( hVAD->soft_hangover > 0 ) + { + hVAD->soft_hangover = sub( hVAD->soft_hangover, 1 ); + } + } + ELSE + { + /* Reset the counter of speech frames necessary to start hangover algorithm */ + hVAD->nb_active_frames_he1 = 0; + move16(); + } + + + IF( GT_16( hVAD->voiced_burst, 3 ) ) + { + IF( LT_16( hVAD->bcg_flux_fx, 640 ) ) /* Q4 */ + { + hVAD->soft_hangover = hangover_sf_tbl[add( snr_idx, 3 )]; + move16(); + } + ELSE + { + hVAD->soft_hangover = hangover_sf_tbl[snr_idx]; + move16(); + } + } + + + hangover_hd = hangover_hd_tbl[snr_idx]; + move16(); + + IF( LT_16( hVAD->bcg_flux_fx, 640 ) ) + { + hangover_hd = add( shr( hangover_hd, 1 ), 1 ); + move16(); + } + + /* VAD hangover for he1 */ + test(); + IF( flag_he1 == 0 && hVAD->soft_hangover > 0 ) + { + IF( GT_32( L_mssnr_hov, L_vad_thr ) ) + { + flag_he1 = 1; + move16(); + hVAD->soft_hangover = sub( hVAD->soft_hangover, 1 ); + } + ELSE + { + hVAD->soft_hangover = 0; + move16(); + } + + if ( hVAD->soft_hangover < 0 ) + { + hVAD->soft_hangover = 0; + move16(); + } + } + + test(); + test(); + IF( ( flag_he1 == 0 ) && ( LT_16( hVAD->hangover_cnt_he1, hangover_hd ) ) && ( hVAD->soft_hangover == 0 ) ) + { + flag_he1 = 1; + move16(); + hVAD->hangover_cnt_he1 = add( hVAD->hangover_cnt_he1, 1 ); + } + + + /* Calculate background stationarity */ + test(); + IF( flag_he1 == 0 && hNoiseEst->first_noise_updt > 0 ) + { + IF( GT_16( snr_sumt, hVAD->bcg_flux_fx ) ) + { + IF( hVAD->bcg_flux_init-- > 0 ) + { + IF( GT_16( snr_sumt, add( hVAD->bcg_flux_fx, 800 ) ) ) + { + /*st->bcg_flux = 0.9f * st->bcg_flux + (1-0.9f)*(st->bcg_flux+50);*/ + hVAD->bcg_flux_fx = mac_r( L_mult( hVAD->bcg_flux_fx, 29491 ), add( hVAD->bcg_flux_fx, 800 ), 3277 ); /*Q4 */ + } + ELSE + { + /*st->bcg_flux = 0.9f * st->bcg_flux + (1-0.9f)*snr_sumt*/ + hVAD->bcg_flux_fx = mac_r( L_mult( hVAD->bcg_flux_fx, 29491 ), snr_sumt, 3277 ); /*Q4 */ + } + } + ELSE + { + IF( GT_16( snr_sumt, add( hVAD->bcg_flux_fx, 160 ) ) ) + { + /*st->bcg_flux = 0.99f * st->bcg_flux + (1-0.99f)*(st->bcg_flux+10);*/ + hVAD->bcg_flux_fx = mac_r( L_mult( hVAD->bcg_flux_fx, 32440 ), add( hVAD->bcg_flux_fx, 160 ), 328 ); /*Q4 */ + } + ELSE + { + /*st->bcg_flux = 0.99f * st->bcg_flux + (1-0.99f)*snr_sumt;*/ + hVAD->bcg_flux_fx = mac_r( L_mult( hVAD->bcg_flux_fx, 32440 ), snr_sumt, 328 ); /*Q4 */ + } + } + } + ELSE + { + IF( hVAD->bcg_flux_init-- > 0 ) + { + IF( LT_16( snr_sumt, sub( hVAD->bcg_flux_fx, 480 ) ) ) + { + /*st->bcg_flux = 0.95f * st->bcg_flux + (1-0.95f)*(st->bcg_flux-30);*/ + hVAD->bcg_flux_fx = mac_r( L_mult( hVAD->bcg_flux_fx, 31131 ), sub( hVAD->bcg_flux_fx, 480 ), 1638 ); /*Q4 */ + } + ELSE + { + /*st->bcg_flux = 0.95f * st->bcg_flux + (1-0.95f)*snr_sumt;*/ + hVAD->bcg_flux_fx = mac_r( L_mult( hVAD->bcg_flux_fx, 31131 ), snr_sumt, 1638 ); /*Q4 */ + } + } + ELSE + { + IF( LT_16( snr_sumt, sub( hVAD->bcg_flux_fx, 160 ) ) ) + { + /*st->bcg_flux = 0.9992f * st->bcg_flux + (1-0.9992f)*(st->bcg_flux-10);*/ + hVAD->bcg_flux_fx = mac_r( L_mult( hVAD->bcg_flux_fx, 32742 ), sub( hVAD->bcg_flux_fx, 160 ), 26 ); /*Q4 */ + } + ELSE + { + /*st->bcg_flux = 0.9992f * st->bcg_flux + (1-0.9992f)*snr_sumt;*/ + hVAD->bcg_flux_fx = mac_r( L_mult( hVAD->bcg_flux_fx, 32742 ), snr_sumt, 26 ); /*Q4 */ + } + } + } + + hVAD->bcg_flux_init = s_max( hVAD->bcg_flux_init, 0 ); + } + + flag = 0; + move16(); + st_fx->localVAD = 0; + move16(); + /* if ( snr_sum > thr1 && flag_he1 == 1 ) */ /* Speech present */ + test(); + + IF( ( GT_16( snr_sum, thr1 ) ) && ( EQ_16( flag_he1, 1 ) ) ) /* Speech present */ + { + flag = 1; + move16(); + st_fx->localVAD = 1; + move16(); + + hVAD->nb_active_frames = add( hVAD->nb_active_frames, 1 ); /* Counter of consecutive active speech frames */ + + IF( GE_16( hVAD->nb_active_frames, ACTIVE_FRAMES_FX ) ) + { + hVAD->nb_active_frames = ACTIVE_FRAMES_FX; + move16(); + hVAD->hangover_cnt = 0; + move16(); /* Reset the counter of hangover frames after at least "active_frames" speech frames */ + } + + /* inside HO period */ + test(); + if ( LT_16( hVAD->hangover_cnt, HANGOVER_LONG_FX ) && hVAD->hangover_cnt != 0 ) + { + hVAD->hangover_cnt = add( hVAD->hangover_cnt, 1 ); + } + } + ELSE + { + /* Reset the counter of speech frames necessary to start hangover algorithm */ + hVAD->nb_active_frames = 0; + move16(); + + if ( LT_16( hVAD->hangover_cnt, HANGOVER_LONG_FX ) ) /* inside HO period */ + { + hVAD->hangover_cnt = add( hVAD->hangover_cnt, 1 ); + } + + + IF( LE_16( hVAD->hangover_cnt, hangover_short ) ) /* "hard" hangover */ + { + test(); + test(); + if ( EQ_16( st_fx->element_mode, EVS_MONO ) && ( LT_16( lp_snr, th_clean ) ) && ( st_fx->Opt_SC_VBR != 0 ) && ( GE_16( hVAD->hangover_cnt, 2 ) ) ) + { + *noisy_speech_HO = 1; + move16(); + } + test(); + test(); + if ( EQ_16( st_fx->element_mode, EVS_MONO ) && ( GE_16( lp_snr, th_clean ) ) && ( st_fx->Opt_SC_VBR != 0 ) && ( GE_16( hVAD->hangover_cnt, 2 ) ) ) + { + *clean_speech_HO = 1; + move16(); + } + flag = 1; + move16(); /*HO*/ + } + } + + + /* localVAD and vad_flag for HE-SAD - in parallel with normal localVAD and vad_flag */ + + *localVAD_HE_SAD = 0; + move16(); + + test(); + IF( ( GT_16( snr_sum_HE_SAD, thr1 ) ) && ( EQ_16( flag_he1, 1 ) ) ) /* Speech present */ + { + + *localVAD_HE_SAD = 1; + move16(); + } + } /* end of WB SWB */ + + /*---------------------------------------------------------------------* + * NB input + * SNR threshold computing + * Hangover control & final VAD decision + *---------------------------------------------------------------------*/ + + ELSE /* NB input */ + { + /* Add localVAD_HE_SAD also for NB operation for use with speech music classifier */ + *localVAD_HE_SAD = 0; + move16(); + if ( GT_16( snr_sum_HE_SAD, thr1 ) ) + { + *localVAD_HE_SAD = 1; + move16(); + } + + st_fx->localVAD = 0; + move16(); /* safety inits for fx */ + IF( GT_16( snr_sum, thr1 ) ) /* Speech present, possibly in hangover */ + { + hVAD->nb_active_frames = add( hVAD->nb_active_frames, 1 ); /* Counter of consecutive active speech frames */ + IF( GE_16( hVAD->nb_active_frames, ACTIVE_FRAMES_FX ) ) + { + hVAD->nb_active_frames = ACTIVE_FRAMES_FX; + move16(); + hVAD->hangover_cnt = 0; + move16(); /* Reset the counter of hangover frames after at least "active_frames" speech frames */ + } + + st_fx->localVAD = 1; + move16(); + } + ELSE + { + hVAD->nb_active_frames = 0; + move16(); /* Reset the counter of speech frames necessary to start hangover algorithm */ + /* st_fx->localVAD = 0; move16(); */ /* set above */ + } + + thr1_nb_mod = thr1; + move16(); /* thr1 may be adjusted after this point */ + IF( LT_16( hVAD->hangover_cnt, HANGOVER_LONG_NB_FX ) ) + { + hVAD->hangover_cnt = add( hVAD->hangover_cnt, 1 ); + + IF( LT_16( lp_snr, 4864 ) ) + /*19.0f Q8*/ /* very low SNR */ + { + thr1_nb_mod = sub( thr1_nb_mod, 1331 ); /*thr1 -= 5.2f;*/ + } + ELSE IF( LT_16( lp_snr, 8960 ) ) /*35 in Q8 */ /* low SNR */ + { + thr1_nb_mod = sub( thr1_nb_mod, 512 ); /*thr1 -= 2.0f;*/ + } + } + + + thr2 = sub( thr1_nb_mod, 384 ); /*thr2 = thr1 - 1.5f; , clean speech */ + + /* -dtx condition dependency in noisy speech */ + tmp = 333; + move16(); /* 1.3f; */ + if ( st_fx->Opt_DTX_ON == 0 ) + { + tmp = 282; + move16(); /* 1.10f; */ + } + if ( LT_16( lp_snr, th_clean ) ) + { + thr2 = sub( thr1_nb_mod, tmp ); /*thr2 = thr1 - [ 1.10 || 1.3 ];*/ + } + + + flag = 0; + move16(); + IF( GT_16( snr_sum, thr1_nb_mod ) ) /* Speech assumed present, even though lowered thr1 */ + { + flag = 1; + move16(); + } + + + test(); + IF( ( LT_16( snr_sum, thr1_nb_mod ) ) && ( GT_16( snr_sum, thr2 ) ) ) /* Speech present */ + { + flag = 1; + move16(); + st_fx->localVAD = 0; + move16(); + + if ( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + *NB_speech_HO = 1; + } + move16(); + } + thr1 = thr1_nb_mod; + move16(); /* needed for st_fx->vadnoise_fx update below */ + } /* end of NB */ + + + /* *flag_noisy_speech_snr is a Word8 parameter */ + *flag_noisy_speech_snr = 0; /*_DIFF_FLOAT_FIX_ -> this initialisation is not done here in float */ + move16(); + IF( vad_bwidth_fx != NB ) + { + if ( LT_16( lp_snr, TH16_2_NFLAG_FX ) ) /*now 27, original threshold: 35dB*/ + { + *flag_noisy_speech_snr = 1; + move16(); + } + } + ELSE + { + if ( LT_16( lp_snr, TH8_1_NFLAG_FX ) ) /* now 20.0 */ + { + *flag_noisy_speech_snr = 1; + move16(); + } + } + + if ( st_fx->hSC_VBR != NULL ) + { + /* SC-VBR */ + st_fx->hSC_VBR->vadsnr_fx = snr_sum; + move16(); /* for ppp, voiced_enc */ + st_fx->hSC_VBR->vadnoise_fx = thr1; + move16(); /* used in nb for find_uv */ + } + + /* Updates */ + hVAD->prim_act_quick_fx = mult_r( 26214, hVAD->prim_act_quick_fx ); /*Q15 */ + + if ( st_fx->localVAD != 0 ) + { + hVAD->prim_act_quick_fx = add( 6554, hVAD->prim_act_quick_fx ); /*Q15 */ + } + + hVAD->prim_act_slow_fx = mult_r( 32440, hVAD->prim_act_slow_fx ); /*Q15 */ + + if ( st_fx->localVAD != 0 ) + { + hVAD->prim_act_slow_fx = add( 328, hVAD->prim_act_slow_fx ); /*Q15 */ + } + + tmp = hVAD->prim_act_slow_fx; + move16(); + if ( LE_16( hVAD->prim_act_quick_fx, hVAD->prim_act_slow_fx ) ) + { + tmp = hVAD->prim_act_quick_fx; + move16(); + } + /*st->prim_act = 0.1f * tmp + (1.0f-0.1f)* st->prim_act;*/ + hVAD->prim_act_fx = mac_r( L_mult( 3277, tmp ), 29491, hVAD->prim_act_fx ); + + + hVAD->prim_act_quick_he_fx = mult_r( 26214, hVAD->prim_act_quick_he_fx ); /*Q15 */ + if ( *localVAD_HE_SAD != 0 ) + { + hVAD->prim_act_quick_he_fx = add( 6554, hVAD->prim_act_quick_he_fx ); /*Q15 */ + } + + hVAD->prim_act_slow_he_fx = mult_r( 32440, hVAD->prim_act_slow_he_fx ); /*Q15 */ + if ( *localVAD_HE_SAD != 0 ) + { + hVAD->prim_act_slow_he_fx = add( 328, hVAD->prim_act_slow_he_fx ); /*Q15 */ + } + + tmp = hVAD->prim_act_slow_he_fx; + move16(); + if ( LE_16( hVAD->prim_act_quick_he_fx, hVAD->prim_act_slow_he_fx ) ) + { + tmp = hVAD->prim_act_quick_he_fx; + move16(); + } + hVAD->prim_act_he_fx = mac_r( L_mult( 3277, tmp ), 29491, hVAD->prim_act_he_fx ); + + + if ( L_and( hVAD->vad_flag_reg_H, (Word32) 0x40000L ) != 0 ) /* 0x4000L = 0x01L << 18 */ + { + hVAD->vad_flag_cnt_50 = sub( hVAD->vad_flag_cnt_50, 1 ); + } + + hVAD->vad_flag_reg_H = L_shl( L_and( hVAD->vad_flag_reg_H, (Word32) 0x3fffffffL ), 1 ); + + + if ( L_and( hVAD->vad_flag_reg_L, (Word32) 0x40000000L ) != 0 ) + { + hVAD->vad_flag_reg_H = L_or( hVAD->vad_flag_reg_H, 0x01L ); + } + + hVAD->vad_flag_reg_L = L_shl( L_and( hVAD->vad_flag_reg_L, (Word32) 0x3fffffffL ), 1 ); + + + IF( flag != 0 ) /* should not include the extra DTX hangover */ + { + hVAD->vad_flag_reg_L = L_or( hVAD->vad_flag_reg_L, 0x01L ); + hVAD->vad_flag_cnt_50 = add( hVAD->vad_flag_cnt_50, 1 ); + } + + if ( L_and( hVAD->vad_prim_reg, (Word32) 0x8000L ) != 0 ) /* 0x8000L = 1L << 15 */ { hVAD->vad_prim_cnt_16 = sub( hVAD->vad_prim_cnt_16, 1 ); -- GitLab From 74c6c0620673582ad9aa94313f5173767ca07b4e Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 10 Jul 2024 12:30:24 +0530 Subject: [PATCH 057/110] Clang formatting changes --- lib_com/cldfb_evs.c | 2 +- lib_com/ivas_rom_com.c | 2 +- lib_com/prot_fx2.h | 22 +++++++++++----------- lib_enc/acelp_core_enc.c | 2 +- lib_enc/ivas_core_pre_proc_front.c | 6 +++--- lib_enc/stat_enc.h | 26 +++++++++++++------------- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/lib_com/cldfb_evs.c b/lib_com/cldfb_evs.c index 9fa073106..1e7d5bd8f 100644 --- a/lib_com/cldfb_evs.c +++ b/lib_com/cldfb_evs.c @@ -1286,7 +1286,7 @@ void GetEnergyCldfb( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) } } - IF( GE_16( numberBands, freqTable[1] ) && hTecEnc != NULL) + IF( GE_16( numberBands, freqTable[1] ) && hTecEnc != NULL ) { Word32 *tempEnergyValuesArry[CLDFB_NO_COL_MAX]; Word16 ScaleX2; diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index ace600eab..8733ad0bd 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -6835,4 +6835,4 @@ const ACPL_QUANT_TABLE ivas_mc_paramupmix_beta_quant_table[9] = 0, /* offset */ { +0.000000e+000f, +5.937500e-002f, +1.375000e-001f, +2.343750e-001f, +3.500000e-001f, +4.843750e-001f, +6.375000e-001f, +8.093750e-001f, +1.000000e+000f } /* data */ } -}; \ No newline at end of file +}; diff --git a/lib_com/prot_fx2.h b/lib_com/prot_fx2.h index 7975ff65f..e03108221 100644 --- a/lib_com/prot_fx2.h +++ b/lib_com/prot_fx2.h @@ -2289,17 +2289,17 @@ Word32 Interpol_lc_fx( /* o : interpolated value ); -//modif_fs_fx.c -Word16 modify_Fs_fx( /* o : length of output Q0 */ - const Word16 sigIn_fx[], /* i : signal to decimate Q0 */ - Word16 lg, /* i : length of input Q0 */ - const Word32 fin, /* i : frequency of input Q0 */ - Word16 sigOut_fx[], /* o : decimated signal Q0 */ - const Word32 fout, /* i : frequency of output Q0 */ - Word16 mem_fx[], /* i/o: filter memory Q0 */ - const Word16 nblp, /* i : flag indicating if NB low-pass is applied */ - Word16 *Q_new_inp, //TO be removed - Word16 *mem_decim_size //TO be removed +// modif_fs_fx.c +Word16 modify_Fs_fx( /* o : length of output Q0 */ + const Word16 sigIn_fx[], /* i : signal to decimate Q0 */ + Word16 lg, /* i : length of input Q0 */ + const Word32 fin, /* i : frequency of input Q0 */ + Word16 sigOut_fx[], /* o : decimated signal Q0 */ + const Word32 fout, /* i : frequency of output Q0 */ + Word16 mem_fx[], /* i/o: filter memory Q0 */ + const Word16 nblp, /* i : flag indicating if NB low-pass is applied */ + Word16 *Q_new_inp, // TO be removed + Word16 *mem_decim_size // TO be removed ); Word16 modify_Fs_intcub3m_sup_fx( /* o : length of output */ diff --git a/lib_enc/acelp_core_enc.c b/lib_enc/acelp_core_enc.c index c5359b781..d006fa1ea 100644 --- a/lib_enc/acelp_core_enc.c +++ b/lib_enc/acelp_core_enc.c @@ -2191,4 +2191,4 @@ ivas_error acelp_core_enc( return error; } -#endif \ No newline at end of file +#endif diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index b103282e9..48dff1e9c 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -917,7 +917,7 @@ ivas_error pre_proc_front_ivas_fx( float sp_div, PS[128]; /* speech/music clasif. parameters */ int16_t L_look; /* length of look-ahead */ #if 1 - float snr_sum_he; /* HE SAD parameters */ + float snr_sum_he; /* HE SAD parameters */ #endif float mem_decim_dummy[2 * L_FILT_MAX]; /* dummy decimation filter memory */ float temp1F_icatdmResampBuf[L_FILT_MAX]; /* temp buffers for ICA TDM resamplers */ @@ -959,8 +959,8 @@ ivas_error pre_proc_front_ivas_fx( Word16 *temp1F_icatdmResampBuf_fx; Word16 *old_inp_12k8_fx; Word16 *old_inp_16k_fx; - Word16 *mem_decim_dummy_fx; /* dummy decimation filter memory */ - Word32 Etot_fx; /* total energy */ + Word16 *mem_decim_dummy_fx; /* dummy decimation filter memory */ + Word32 Etot_fx; /* total energy */ #if 0 Word32 fr_bands_fx[2 * NB_BANDS]; /* energy in frequency bands */ Word16 Q_new; diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 9bc9d5393..451ac33ee 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -770,17 +770,17 @@ typedef struct noise_estimation_structure float lt_tn_dist; float lt_Ellp_dist; float lt_haco_ev; - Word16 Etot_l_fx; /* Q8 Noise estimator - Track energy from below */ - Word16 Etot_h_fx; /* Q8 Noise estimator - Track energy from above */ - Word16 Etot_l_lp_fx; /* Q8 Noise estimator - Smoothed low energy */ - Word16 Etot_last_fx; /*Q8*/ - Word16 Etot_lp_fx; /* Q8 Noise estimator - Filtered input energy */ - - Word32 Etot_l_32fx; /* Q8 Noise estimator - Track energy from below */ - Word32 Etot_h_32fx; /* Q8 Noise estimator - Track energy from above */ - Word32 Etot_l_lp_32fx; /* Q8 Noise estimator - Smoothed low energy */ - Word32 Etot_last_32fx; /*Q8*/ - Word32 Etot_lp_32fx; /* Q8 Noise estimator - Filtered input energy */ + Word16 Etot_l_fx; /* Q8 Noise estimator - Track energy from below */ + Word16 Etot_h_fx; /* Q8 Noise estimator - Track energy from above */ + Word16 Etot_l_lp_fx; /* Q8 Noise estimator - Smoothed low energy */ + Word16 Etot_last_fx; /*Q8*/ + Word16 Etot_lp_fx; /* Q8 Noise estimator - Filtered input energy */ + + Word32 Etot_l_32fx; /* Q8 Noise estimator - Track energy from below */ + Word32 Etot_h_32fx; /* Q8 Noise estimator - Track energy from above */ + Word32 Etot_l_lp_32fx; /* Q8 Noise estimator - Smoothed low energy */ + Word32 Etot_last_32fx; /*Q8*/ + Word32 Etot_lp_32fx; /* Q8 Noise estimator - Filtered input energy */ Word16 lt_tn_track_fx; /* Q15 */ Word16 lt_tn_dist_fx; /* Q8*/ @@ -806,10 +806,10 @@ typedef struct noise_estimation_structure float Etot_st_est; /* Noise estimation - short term estimate of E{ Etot } */ float Etot_sq_st_est; /* Noise estimation - short term estimate of E{ Etot^2 } */ Word16 Etot_v_h2_fx; - Word16 sign_dyn_lp_fx; /*Q8*/ + Word16 sign_dyn_lp_fx; /*Q8*/ Word32 Etot_v_h2_32fx; - Word32 sign_dyn_lp_32fx; /*Q8*/ + Word32 sign_dyn_lp_32fx; /*Q8*/ Word16 Etot_st_est_fx; /* Q8 Noise estimation - short term estimate of E{ Etot } */ Word16 Etot_sq_st_est_fx; /* Q2 Noise estimation - short term estimate of E{ Etot^2 } */ -- GitLab From d31efd874cefe3766a5c0a9e10731f4b352f0cd0 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 11 Jul 2024 12:24:19 +0530 Subject: [PATCH 058/110] BASOP and instrumentation for some of the lib_com files --- lib_com/enr_1_az.c | 11 +- lib_com/env_adj.c | 4 +- lib_com/env_stab.c | 4 + lib_com/env_stab_trans.c | 3 +- lib_com/fft_fx.c | 2428 +++++++++++++++++++++++++++---- lib_com/tcq_position_arith_fx.c | 324 +++-- lib_com/tcx_ltp_fx.c | 122 +- lib_com/tcx_mdct_fx.c | 92 +- lib_com/tcx_mdct_window.c | 66 +- lib_com/tcx_utils_fx.c | 76 +- lib_com/tec_com.c | 58 +- lib_com/tns_base.c | 47 +- 12 files changed, 2636 insertions(+), 599 deletions(-) diff --git a/lib_com/enr_1_az.c b/lib_com/enr_1_az.c index f55d6917b..2f663deaf 100644 --- a/lib_com/enr_1_az.c +++ b/lib_com/enr_1_az.c @@ -84,6 +84,7 @@ Word16 Enr_1_Az_fx( /* o : impulse response energy Q3 Word32 L_tmp, L_tmp2; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif /* Find the impulse response */ @@ -99,12 +100,14 @@ Word16 Enr_1_Az_fx( /* o : impulse response energy Q3 /* h1_in Q11, h1_out Q10 */ L_tmp = L_mult( a0, 1 << 13 ); /* Q25 = L_mult(Q11,Q13) */ *y = round_fx( L_tmp ); /* Q25 to Q9 */ - L_tmp2 = L_mult( *y, *y ); /* Q19 = L_mult(Q9,Q9) */ + move16(); + L_tmp2 = L_mult( *y, *y ); /* Q19 = L_mult(Q9,Q9) */ y++; L_tmp = L_msu( 0, Aq[1], y[-1] ); /* Q23 = L_mult(Q14,Q9) */ L_tmp = L_shl( L_tmp, q ); - *y = round_fx( L_tmp ); /* Q25 to Q9 */ + *y = round_fx( L_tmp ); /* Q25 to Q9 */ + move16(); L_tmp2 = L_mac( L_tmp2, *y, *y ); /* Q19 = L_mult(Q9,Q9) */ y++; @@ -124,6 +127,7 @@ Word16 Enr_1_Az_fx( /* o : impulse response energy Q3 #ifdef BASOP_NOGLOB L_tmp = L_shl_o( L_tmp, q, &Overflow ); *y = round_fx_o( L_tmp, &Overflow ); + move16(); L_tmp2 = L_mac_o( L_tmp2, *y, *y, &Overflow ); #else L_tmp = L_shl( L_tmp, q ); @@ -148,6 +152,7 @@ Word16 Enr_1_Az_fx( /* o : impulse response energy Q3 #ifdef BASOP_NOGLOB L_tmp = L_shl_o( L_tmp, q, &Overflow ); *y = round_fx_o( L_tmp, &Overflow ); + move16(); L_tmp2 = L_mac_o( L_tmp2, *y, *y, &Overflow ); #else L_tmp = L_shl( L_tmp, q ); @@ -158,6 +163,7 @@ Word16 Enr_1_Az_fx( /* o : impulse response energy Q3 } #ifdef BASOP_NOGLOB *Overflow_out = Overflow; + move32(); return round_fx_o( L_tmp2, Overflow_out ); /* Q19 to Q3 */ #else return round_fx( L_tmp2 ); /* Q19 to Q3 */ @@ -170,6 +176,7 @@ Word16 Enr_1_Az_fx( /* o : impulse response energy Q3 ) { Flag Overflow = 0; + move32(); return Enr_1_Az_fx_o( Aq, len, &Overflow ); } #endif diff --git a/lib_com/env_adj.c b/lib_com/env_adj.c index e6b6e57bd..874bf4aa8 100644 --- a/lib_com/env_adj.c +++ b/lib_com/env_adj.c @@ -259,7 +259,8 @@ void env_adj_fx( } ELSE { - adj[i] = MAX_16; /* Q15, 1.0f (saturated) */ + adj[i] = MAX_16; /* Q15, 1.0f (saturated) */ + move16(); IF( EQ_16( att_state, 1 ) ) /* End of attenuation region found */ { /* tmp = min(1, max(0, len-ENV_ADJ_START)*(1.0f/ENV_ADJ_INCL)); */ @@ -269,7 +270,6 @@ void env_adj_fx( tmp = round_fx( L_shl( L_mult0( s_max( 0, sub( len, ENV_ADJ_START_FX ) ), ENV_ADJ_INV_INCL_FX ), 16 ) ); /* Q15 (15+16-16) */ #endif tmp_diff = sub( MAX_16, tmp ); /* Q15 */ - move16(); FOR( j = start; j < i; j++ ) { /* adj[j] = max(tmp + (1-tmp)*adj[j],env_stab); */ diff --git a/lib_com/env_stab.c b/lib_com/env_stab.c index 4140a64dc..a05cb79ba 100644 --- a/lib_com/env_stab.c +++ b/lib_com/env_stab.c @@ -201,6 +201,7 @@ Word16 env_stability_fx( /* in Q15 */ Word16 inv_nb_sfm; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif IF( core_switching_flag ) @@ -377,6 +378,7 @@ Word16 env_stab_smo_fx( /* Q0 */ Word16 tmp, sum, exp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif /* get previous state */ prev_state = maximum_fx( env_stab_state_p, NUM_ENV_STAB_PLC_STATES, &maxval ); @@ -415,8 +417,10 @@ Word16 env_stab_smo_fx( /* Q0 */ { #ifdef BASOP_NOGLOB env_stab_state_p[i] = round_fx_o( L_shl_o( L_mult_o( env_stab_state_p[i], tmp, &Overflow ), add( exp, 1 ), &Overflow ), &Overflow ); /* Q15 */ + move16(); #else env_stab_state_p[i] = round_fx( L_shl( L_mult( env_stab_state_p[i], tmp ), add( exp, 1 ) ) ); /* Q15 */ + move16(); #endif } diff --git a/lib_com/env_stab_trans.c b/lib_com/env_stab_trans.c index 2062f4e77..29473bd66 100644 --- a/lib_com/env_stab_trans.c +++ b/lib_com/env_stab_trans.c @@ -231,6 +231,7 @@ void env_stab_transient_detect_fx( FOR( blk = 0; blk < NUM_SUBFRAMES; blk++ ) { L_E_sub[blk] = L_deposit_l( 0 ); /* Q9 */ + move32(); FOR( i = 0; i < BANDS_PER_SUBFRAMES; i++ ) /* 9 times -> < 2^4 */ { @@ -291,7 +292,7 @@ void env_stab_transient_detect_fx( *no_att_hangover = ATT_LIM_HANGOVER; move16(); } - ELSE if ( *no_att_hangover > 0 ) + ELSE IF( *no_att_hangover > 0 ) { *no_att_hangover = sub( *no_att_hangover, 1 ); move16(); diff --git a/lib_com/fft_fx.c b/lib_com/fft_fx.c index 7a0d153eb..4fe9aac60 100644 --- a/lib_com/fft_fx.c +++ b/lib_com/fft_fx.c @@ -188,27 +188,48 @@ static void fft15_shift2( Word32 f4o7, f4o8, f4o9, f4o10, f4o11, f4o12, f4o13, f4o14, f4o15, f4o16, f4o17, f4o18, f4o19; in0 = Idx[0]; + move16(); in8 = Idx[n1]; + move16(); in16 = Idx[n1 * 2]; - in24 = Idx[n1 * 3]; + move16(); + in24 = Idx[i_mult( n1, 3 )]; + move16(); in32 = Idx[n1 * 4]; - in1 = Idx[n1 * 5]; + move16(); + in1 = Idx[i_mult( n1, 5 )]; + move16(); in9 = Idx[n1 * 6]; - in17 = Idx[n1 * 7]; + move16(); + in17 = Idx[i_mult( n1, 7 )]; + move16(); in25 = Idx[n1 * 8]; - in33 = Idx[n1 * 9]; + move16(); + in33 = Idx[i_mult( n1, 9 )]; + move16(); in2 = Idx[n1 * 10]; - in10 = Idx[n1 * 11]; + move16(); + in10 = Idx[i_mult( n1, 11 )]; + move16(); in18 = Idx[n1 * 12]; - in26 = Idx[n1 * 13]; + move16(); + in26 = Idx[i_mult( n1, 13 )]; + move16(); in34 = Idx[n1 * 14]; + move16(); f2i13 = zRe[in0]; + move32(); f2i14 = zIm[in0]; + move32(); f2i21 = zRe[in1]; + move32(); f2i22 = zRe[in2]; + move32(); f2i23 = zIm[in1]; + move32(); f2i24 = zIm[in2]; + move32(); f2i15 = L_add( f2i21, f2i22 ); f2i16 = Mpy_32_16_1( L_sub( f2i22, f2i21 ), FFT_15PONIT_WNK4 ); @@ -225,29 +246,41 @@ static void fft15_shift2( fi6 = L_sub( f2i20, f2i16 ); f3i1 = zRe[in9]; + move32(); f4i2 = zRe[in10]; + move32(); f4i3 = zRe[in8]; + move32(); f3i2 = L_add( f4i2, f4i3 ); f3i3 = L_sub( f3i1, L_shr( f3i2, 1 ) ); f3i4 = Mpy_32_16_1( L_sub( f4i3, f4i2 ), FFT_15PONIT_WNK4 ); f3i5 = zIm[in9]; + move32(); f4i4 = zIm[in10]; + move32(); f4i5 = zIm[in8]; + move32(); f3i6 = L_add( f4i4, f4i5 ); f3i7 = Mpy_32_16_1( L_sub( f4i4, f4i5 ), FFT_15PONIT_WNK4 ); f3i8 = L_sub( f3i5, L_shr( f3i6, 1 ) ); f3i9 = zRe[in33]; + move32(); f4i6 = zRe[in34]; + move32(); f4i7 = zRe[in32]; + move32(); f3i10 = L_add( f4i6, f4i7 ); f3i11 = L_sub( f3i9, L_shr( f3i10, 1 ) ); f3i12 = Mpy_32_16_1( L_sub( f4i7, f4i6 ), FFT_15PONIT_WNK4 ); f3i13 = zIm[in33]; + move32(); f4i8 = zIm[in34]; + move32(); f4i9 = zIm[in32]; + move32(); f3i14 = L_add( f4i8, f4i9 ); f3i15 = Mpy_32_16_1( L_sub( f4i8, f4i9 ), FFT_15PONIT_WNK4 ); f4i1 = L_sub( f3i13, L_shr( f3i14, 1 ) ); @@ -272,29 +305,41 @@ static void fft15_shift2( fi24 = L_add( fi22, fi23 ); f4i10 = zRe[in24]; + move32(); fo6 = zRe[in25]; + move32(); fo7 = zRe[in26]; + move32(); f4i11 = L_add( fo6, fo7 ); f4i12 = L_sub( f4i10, L_shr( f4i11, 1 ) ); f4i13 = Mpy_32_16_1( L_sub( fo7, fo6 ), FFT_15PONIT_WNK4 ); f4i14 = zIm[in24]; + move32(); fo8 = zIm[in25]; + move32(); fo9 = zIm[in26]; + move32(); f4i15 = L_add( fo8, fo9 ); f4i16 = Mpy_32_16_1( L_sub( fo8, fo9 ), FFT_15PONIT_WNK4 ); f4i17 = L_sub( f4i14, L_shr( f4i15, 1 ) ); f4i18 = zRe[in18]; + move32(); f2o10 = zRe[in16]; + move32(); f2o11 = zRe[in17]; + move32(); f4i19 = L_add( f2o10, f2o11 ); f4i20 = L_sub( f4i18, L_shr( f4i19, 1 ) ); fo1 = Mpy_32_16_1( L_sub( f2o11, f2o10 ), FFT_15PONIT_WNK4 ); fo2 = zIm[in18]; + move32(); f2o12 = zIm[in16]; + move32(); f2o13 = zIm[in17]; + move32(); fo3 = L_add( f2o12, f2o13 ); fo4 = Mpy_32_16_1( L_sub( f2o12, f2o13 ), FFT_15PONIT_WNK4 ); fo5 = L_sub( fo2, L_shr( fo3, 1 ) ); @@ -327,12 +372,17 @@ static void fft15_shift2( fo14 = L_add( Mpy_32_16_1( fo15, FFT_15PONIT_WNK3 ), Mpy_32_16_1( fo16, FFT_15PONIT_WNK2 ) ); zRe[in0] = L_add( fi1, fo11 ); + move32(); fo17 = L_add( fo10, fo12 ); zRe[in18] = L_sub( fo17, fo14 ); + move32(); zRe[in24] = L_add( fo17, fo14 ); + move32(); fo18 = L_sub( fo12, fo10 ); zRe[in9] = L_sub( fo18, fo13 ); + move32(); zRe[in33] = L_add( fo18, fo13 ); + move32(); f2o1 = Mpy_32_16_1( L_sub( f2i3, fi15 ), FFT_15PONIT_WNK1 ); f2o2 = L_add( f2i3, fi15 ); @@ -342,12 +392,17 @@ static void fft15_shift2( f2o4 = L_sub( Mpy_32_16_1( f2o6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f2o7, FFT_15PONIT_WNK3 ) ); f2o5 = L_add( Mpy_32_16_1( f2o6, FFT_15PONIT_WNK3 ), Mpy_32_16_1( f2o7, FFT_15PONIT_WNK2 ) ); zIm[in0] = L_add( fi2, f2o2 ); + move32(); f2o8 = L_add( f2o1, f2o3 ); zIm[in24] = L_sub( f2o8, f2o5 ); + move32(); zIm[in18] = L_add( f2o5, f2o8 ); + move32(); f2o9 = L_sub( f2o3, f2o1 ); zIm[in33] = L_sub( f2o9, f2o4 ); + move32(); zIm[in9] = L_add( f2o4, f2o9 ); + move32(); f2o14 = Mpy_32_16_1( L_sub( fi30, fi12 ), FFT_15PONIT_WNK1 ); f2o15 = L_add( fi30, fi12 ); @@ -357,12 +412,17 @@ static void fft15_shift2( f3o2 = L_sub( Mpy_32_16_1( f3o4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o5, FFT_15PONIT_WNK3 ) ); f3o3 = L_add( Mpy_32_16_1( f3o5, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o4, FFT_15PONIT_WNK3 ) ); zRe[in2] = L_add( fi3, f2o15 ); + move32(); f3o6 = L_add( f2o14, f3o1 ); zRe[in17] = L_sub( f3o6, f3o3 ); + move32(); zRe[in26] = L_add( f3o6, f3o3 ); + move32(); f3o7 = L_sub( f3o1, f2o14 ); zRe[in8] = L_sub( f3o7, f3o2 ); + move32(); zRe[in32] = L_add( f3o7, f3o2 ); + move32(); f3o8 = Mpy_32_16_1( L_sub( f2i6, fi18 ), FFT_15PONIT_WNK1 ); f3o9 = L_add( f2i6, fi18 ); @@ -372,12 +432,17 @@ static void fft15_shift2( f3o11 = L_sub( Mpy_32_16_1( f3o13, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o14, FFT_15PONIT_WNK3 ) ); f3o12 = L_add( Mpy_32_16_1( f3o14, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o13, FFT_15PONIT_WNK3 ) ); zIm[in2] = L_add( fi6, f3o9 ); + move32(); f3o15 = L_add( f3o8, f3o10 ); zIm[in26] = L_sub( f3o15, f3o12 ); + move32(); zIm[in17] = L_add( f3o12, f3o15 ); + move32(); f4o1 = L_sub( f3o10, f3o8 ); zIm[in8] = L_add( f3o11, f4o1 ); + move32(); zIm[in32] = L_sub( f4o1, f3o11 ); + move32(); f4o2 = Mpy_32_16_1( L_sub( f2i9, fi21 ), FFT_15PONIT_WNK1 ); f4o3 = L_add( f2i9, fi21 ); @@ -387,13 +452,18 @@ static void fft15_shift2( f4o5 = L_add( Mpy_32_16_1( f4o8, FFT_15PONIT_WNK3 ), Mpy_32_16_1( f4o7, FFT_15PONIT_WNK2 ) ); f4o6 = L_sub( Mpy_32_16_1( f4o8, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o7, FFT_15PONIT_WNK3 ) ); zIm[in1] = L_add( fi5, f4o3 ); + move32(); f4o9 = L_sub( f4o4, f4o2 ); f4o10 = L_add( f4o2, f4o4 ); zIm[in10] = L_add( f4o6, f4o9 ); + move32(); zIm[in34] = L_sub( f4o9, f4o6 ); + move32(); zIm[in25] = L_sub( f4o10, f4o5 ); + move32(); zIm[in16] = L_add( f4o5, f4o10 ); + move32(); f4o11 = Mpy_32_16_1( L_sub( f2i12, fi24 ), FFT_15PONIT_WNK1 ); f4o12 = L_add( f2i12, fi24 ); @@ -403,13 +473,18 @@ static void fft15_shift2( f4o14 = L_add( Mpy_32_16_1( f4o16, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o17, FFT_15PONIT_WNK3 ) ); f4o15 = L_sub( Mpy_32_16_1( f4o17, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o16, FFT_15PONIT_WNK3 ) ); zRe[in1] = L_add( fi4, f4o12 ); + move32(); f4o18 = L_sub( f4o13, f4o11 ); f4o19 = L_add( f4o11, f4o13 ); zRe[in10] = L_sub( f4o18, f4o15 ); + move32(); zRe[in34] = L_add( f4o18, f4o15 ); + move32(); zRe[in16] = L_sub( f4o19, f4o14 ); + move32(); zRe[in25] = L_add( f4o19, f4o14 ); + move32(); return; } @@ -441,20 +516,35 @@ static void fft15_shift8( Word32 f5o8, f5o9, f5o10, f5o11, f5o12, f5o13, f5o14, f5o15, f5o16, f5o17, f5o18, f5o19, f5o21, f5o22; in0 = Idx[0]; + move16(); in8 = Idx[n1]; + move16(); in16 = Idx[n1 * 2]; - in24 = Idx[n1 * 3]; + move16(); + in24 = Idx[i_mult( n1, 3 )]; + move16(); in32 = Idx[n1 * 4]; - in1 = Idx[n1 * 5]; + move16(); + in1 = Idx[i_mult( n1, 5 )]; + move16(); in9 = Idx[n1 * 6]; - in17 = Idx[n1 * 7]; + move16(); + in17 = Idx[i_mult( n1, 7 )]; + move16(); in25 = Idx[n1 * 8]; - in33 = Idx[n1 * 9]; + move16(); + in33 = Idx[i_mult( n1, 9 )]; + move16(); in2 = Idx[n1 * 10]; - in10 = Idx[n1 * 11]; + move16(); + in10 = Idx[i_mult( n1, 11 )]; + move16(); in18 = Idx[n1 * 12]; - in26 = Idx[n1 * 13]; + move16(); + in26 = Idx[i_mult( n1, 13 )]; + move16(); in34 = Idx[n1 * 14]; + move16(); f2i13 = zRe[in0]; f2i14 = zIm[in0]; @@ -478,17 +568,29 @@ static void fft15_shift8( fi6 = L_sub( f3i5, f3i1 ); f3i10 = zRe[in9]; + move32(); f4i11 = zRe[in10]; + move32(); f4i12 = zRe[in8]; + move32(); f3i14 = zIm[in9]; + move32(); f4i13 = zIm[in10]; + move32(); f4i14 = zIm[in8]; + move32(); f4i3 = zRe[in33]; + move32(); f4i15 = zRe[in34]; + move32(); fo1 = zRe[in32]; + move32(); f4i7 = zIm[in33]; + move32(); fo2 = zIm[in34]; + move32(); fo3 = zIm[in32]; + move32(); f3i11 = L_add( f4i11, f4i12 ); @@ -524,17 +626,29 @@ static void fft15_shift8( fi24 = L_add( fi22, fi23 ); fo4 = zRe[in24]; + move32(); f2o5 = zRe[in25]; + move32(); f2o6 = zRe[in26]; + move32(); fo8 = zIm[in24]; + move32(); f2o7 = zIm[in25]; + move32(); f2o8 = zIm[in26]; + move32(); fo12 = zRe[in18]; + move32(); f2o9 = zRe[in16]; + move32(); f2o10 = zRe[in17]; + move32(); f2o1 = zIm[in18]; + move32(); f2o11 = zIm[in16]; + move32(); f2o12 = zIm[in17]; + move32(); fo5 = L_add( f2o5, f2o6 ); @@ -577,12 +691,17 @@ static void fft15_shift8( f3o1 = L_sub( Mpy_32_16_1( f3o3, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o4, FFT_15PONIT_WNK3 ) ); f3o2 = L_add( Mpy_32_16_1( f3o4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o3, FFT_15PONIT_WNK3 ) ); zRe[in0] = L_add( fi1, f2o14 ); + move32(); f3o5 = L_add( f2o13, f2o15 ); zRe[in24] = L_sub( f3o5, f3o2 ); + move32(); zRe[in18] = L_add( f3o5, f3o2 ); + move32(); f3o6 = L_sub( f2o15, f2o13 ); zRe[in33] = L_sub( f3o6, f3o1 ); + move32(); zRe[in9] = L_add( f3o6, f3o1 ); + move32(); f3o7 = Mpy_32_16_1( L_sub( f2i3, fi15 ), FFT_15PONIT_WNK1 ); f3o8 = L_add( f2i3, fi15 ); @@ -592,12 +711,17 @@ static void fft15_shift8( f3o10 = L_sub( Mpy_32_16_1( f3o12, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o13, FFT_15PONIT_WNK3 ) ); f3o11 = L_add( Mpy_32_16_1( f3o13, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o12, FFT_15PONIT_WNK3 ) ); zIm[in0] = L_add( fi2, f3o8 ); + move32(); f3o14 = L_add( f3o7, f3o9 ); zIm[in18] = L_sub( f3o14, f3o11 ); + move32(); zIm[in24] = L_add( f3o11, f3o14 ); + move32(); f3o15 = L_sub( f3o9, f3o7 ); zIm[in9] = L_sub( f3o15, f3o10 ); + move32(); zIm[in33] = L_add( f3o10, f3o15 ); + move32(); f4o1 = Mpy_32_16_1( L_sub( fi30, fi12 ), FFT_15PONIT_WNK1 ); f4o2 = L_add( fi30, fi12 ); @@ -607,12 +731,17 @@ static void fft15_shift8( f4o4 = L_sub( Mpy_32_16_1( f4o6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o7, FFT_15PONIT_WNK3 ) ); f4o5 = L_add( Mpy_32_16_1( f4o7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o6, FFT_15PONIT_WNK3 ) ); zRe[in2] = L_add( fi3, f4o2 ); + move32(); f4o8 = L_add( f4o1, f4o3 ); zRe[in26] = L_sub( f4o8, f4o5 ); + move32(); zRe[in17] = L_add( f4o8, f4o5 ); + move32(); f4o9 = L_sub( f4o3, f4o1 ); zRe[in32] = L_sub( f4o9, f4o4 ); + move32(); zRe[in8] = L_add( f4o9, f4o4 ); + move32(); f4o10 = Mpy_32_16_1( L_sub( f2i6, fi18 ), FFT_15PONIT_WNK1 ); f4o11 = L_add( f2i6, fi18 ); @@ -622,12 +751,17 @@ static void fft15_shift8( f4o13 = L_sub( Mpy_32_16_1( f4o15, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f5o1, FFT_15PONIT_WNK3 ) ); f4o14 = L_add( Mpy_32_16_1( f5o1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o15, FFT_15PONIT_WNK3 ) ); zIm[in2] = L_add( fi6, f4o11 ); + move32(); f5o2 = L_add( f4o10, f4o12 ); zIm[in17] = L_sub( f5o2, f4o14 ); + move32(); zIm[in26] = L_add( f4o14, f5o2 ); + move32(); f5o3 = L_sub( f4o12, f4o10 ); zIm[in32] = L_add( f4o13, f5o3 ); + move32(); zIm[in8] = L_sub( f5o3, f4o13 ); + move32(); f5o4 = Mpy_32_16_1( L_sub( f2i9, fi21 ), FFT_15PONIT_WNK1 ); f5o5 = L_add( f2i9, fi21 ); @@ -637,13 +771,18 @@ static void fft15_shift8( f5o7 = L_add( Mpy_32_16_1( f5o9, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f5o10, FFT_15PONIT_WNK3 ) ); f5o8 = L_sub( Mpy_32_16_1( f5o10, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f5o9, FFT_15PONIT_WNK3 ) ); zIm[in1] = L_add( fi5, f5o5 ); + move32(); f5o11 = L_sub( f5o6, f5o4 ); f5o12 = L_add( f5o4, f5o6 ); zIm[in34] = L_add( f5o8, f5o11 ); + move32(); zIm[in10] = L_sub( f5o11, f5o8 ); + move32(); zIm[in16] = L_sub( f5o12, f5o7 ); + move32(); zIm[in25] = L_add( f5o7, f5o12 ); + move32(); f5o13 = Mpy_32_16_1( L_sub( f2i12, fi24 ), FFT_15PONIT_WNK1 ); f5o14 = L_add( f2i12, fi24 ); @@ -653,13 +792,18 @@ static void fft15_shift8( f5o16 = L_add( Mpy_32_16_1( f5o18, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f5o19, FFT_15PONIT_WNK3 ) ); f5o17 = L_sub( Mpy_32_16_1( f5o19, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f5o18, FFT_15PONIT_WNK3 ) ); zRe[in1] = L_add( fi4, f5o14 ); + move32(); f5o21 = L_sub( f5o15, f5o13 ); f5o22 = L_add( f5o13, f5o15 ); zRe[in34] = L_sub( f5o21, f5o17 ); + move32(); zRe[in10] = L_add( f5o21, f5o17 ); + move32(); zRe[in25] = L_sub( f5o22, f5o16 ); + move32(); zRe[in16] = L_add( f5o22, f5o16 ); + move32(); return; } @@ -681,17 +825,28 @@ static void fft5_shift1( Word16 in1, in2, in3, in4, in5; in1 = Idx[0]; + move16(); in2 = Idx[n1]; + move16(); in3 = Idx[n1 * 2]; - in4 = Idx[n1 * 3]; + move16(); + in4 = Idx[i_mult( n1, 3 )]; + move16(); in5 = Idx[n1 * 4]; + move16(); fi1 = zRe[in1]; + move32(); fi2 = zIm[in1]; + move32(); fo3 = zRe[in2]; + move32(); fo4 = zRe[in5]; + move32(); fo6 = zRe[in3]; + move32(); fo7 = zRe[in4]; + move32(); fo5 = L_add( fo3, fo4 ); fo8 = L_add( fo6, fo7 ); @@ -701,9 +856,13 @@ static void fft5_shift1( fi6 = L_sub( fo3, fo4 ); fo3 = zIm[in2]; + move32(); fo4 = zIm[in5]; + move32(); fo6 = zIm[in3]; + move32(); fo7 = zIm[in4]; + move32(); fo5 = L_add( fo3, fo4 ); fo8 = L_add( fo6, fo7 ); @@ -713,7 +872,9 @@ static void fft5_shift1( fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); zRe[in1] = L_add( fi1, fi3 ); + move32(); zIm[in1] = L_add( fi2, fi8 ); + move32(); fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); @@ -722,9 +883,13 @@ static void fft5_shift1( fo6 = L_sub( fo7, fi5 ); zRe[in2] = L_add( fo5, fo3 ); + move32(); zRe[in3] = L_sub( fo6, fo4 ); + move32(); zRe[in4] = L_add( fo6, fo4 ); + move32(); zRe[in5] = L_sub( fo5, fo3 ); + move32(); fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); @@ -733,9 +898,13 @@ static void fft5_shift1( fo6 = L_sub( fo7, fo2 ); zIm[in2] = L_sub( fo5, fo3 ); + move32(); zIm[in3] = L_add( fo4, fo6 ); + move32(); zIm[in4] = L_sub( fo6, fo4 ); + move32(); zIm[in5] = L_add( fo3, fo5 ); + move32(); return; } @@ -757,17 +926,28 @@ static void fft5_shift4( Word16 in1, in2, in3, in4, in5; in1 = Idx[0]; + move16(); in2 = Idx[n1]; + move16(); in3 = Idx[n1 * 2]; - in4 = Idx[n1 * 3]; + move16(); + in4 = Idx[i_mult( n1, 3 )]; + move16(); in5 = Idx[n1 * 4]; + move16(); fi1 = zRe[in1]; + move32(); fi2 = zIm[in1]; + move32(); fo3 = zRe[in2]; + move32(); fo4 = zRe[in5]; + move32(); fo6 = zRe[in3]; + move32(); fo7 = zRe[in4]; + move32(); fo5 = L_add( fo3, fo4 ); fo8 = L_add( fo6, fo7 ); @@ -777,9 +957,13 @@ static void fft5_shift4( fi6 = L_sub( fo3, fo4 ); fo3 = zIm[in2]; + move32(); fo4 = zIm[in5]; + move32(); fo6 = zIm[in3]; + move32(); fo7 = zIm[in4]; + move32(); fo5 = L_add( fo3, fo4 ); fo8 = L_add( fo6, fo7 ); @@ -789,7 +973,9 @@ static void fft5_shift4( fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); zRe[in1] = L_add( fi1, fi3 ); + move32(); zIm[in1] = L_add( fi2, fi8 ); + move32(); fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); @@ -798,9 +984,13 @@ static void fft5_shift4( fo6 = L_sub( fo7, fi5 ); zRe[in2] = L_sub( fo5, fo3 ); + move32(); zRe[in4] = L_sub( fo6, fo4 ); + move32(); zRe[in3] = L_add( fo6, fo4 ); + move32(); zRe[in5] = L_add( fo5, fo3 ); + move32(); fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); @@ -809,9 +999,13 @@ static void fft5_shift4( fo6 = L_sub( fo7, fo2 ); zIm[in3] = L_sub( fo6, fo4 ); + move32(); zIm[in2] = L_add( fo3, fo5 ); + move32(); zIm[in4] = L_add( fo4, fo6 ); + move32(); zIm[in5] = L_sub( fo5, fo3 ); + move32(); return; } @@ -832,17 +1026,28 @@ static void fft5_32( Word16 in1, in2, in3, in4, in5; in1 = Idx[0]; + move16(); in2 = Idx[32]; + move16(); in3 = Idx[64]; + move16(); in4 = Idx[96]; + move16(); in5 = Idx[128]; + move16(); fi1 = zRe[in1]; + move32(); fi2 = zIm[in1]; + move32(); fo3 = zRe[in2]; + move32(); fo4 = zRe[in5]; + move32(); fo6 = zRe[in3]; + move32(); fo7 = zRe[in4]; + move32(); fo5 = L_add( fo3, fo4 ); fo8 = L_add( fo6, fo7 ); @@ -852,9 +1057,13 @@ static void fft5_32( fi6 = L_sub( fo3, fo4 ); fo3 = zIm[in2]; + move32(); fo4 = zIm[in5]; + move32(); fo6 = zIm[in3]; + move32(); fo7 = zIm[in4]; + move32(); fo5 = L_add( fo3, fo4 ); fo8 = L_add( fo6, fo7 ); @@ -864,7 +1073,9 @@ static void fft5_32( fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); zRe[in1] = L_add( fi1, fi3 ); + move32(); zIm[in1] = L_add( fi2, fi8 ); + move32(); fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); @@ -873,9 +1084,13 @@ static void fft5_32( fo6 = L_sub( fo7, fi5 ); zRe[in2] = L_add( fo6, fo4 ); + move32(); zRe[in3] = L_add( fo5, fo3 ); + move32(); zRe[in4] = L_sub( fo5, fo3 ); + move32(); zRe[in5] = L_sub( fo6, fo4 ); + move32(); fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); @@ -884,9 +1099,13 @@ static void fft5_32( fo6 = L_sub( fo7, fo2 ); zIm[in2] = L_sub( fo6, fo4 ); + move32(); zIm[in3] = L_sub( fo5, fo3 ); + move32(); zIm[in4] = L_add( fo3, fo5 ); + move32(); zIm[in5] = L_add( fo4, fo6 ); + move32(); return; } @@ -907,8 +1126,11 @@ static void fft64( FOR( i = 0; i < 64; i++ ) { id = Idx[i]; + move16(); z[2 * i] = x[id]; - z[2 * i + 1] = y[id]; + move32(); + z[add( shl( i, 1 ), 1 )] = y[id]; + move32(); } cdftForw( 128, z, Ip_fft64, w_fft64_fx ); @@ -916,9 +1138,13 @@ static void fft64( FOR( i = 0; i < 64; i++ ) { jd = Odx_fft64[i]; + move16(); id = Idx[jd]; + move16(); x[id] = z[2 * i]; - y[id] = z[2 * i + 1]; + move32(); + y[id] = z[add( shl( i, 1 ), 1 )]; + move32(); } return; @@ -942,8 +1168,11 @@ static void fft32_15( FOR( i = 0; i < 32; i++ ) { id = Idx[i]; + move16(); z[2 * i] = x[id]; - z[2 * i + 1] = y[id]; + move32(); + z[add( shl( i, 1 ), 1 )] = y[id]; + move32(); } cdftForw( 64, z, Ip_fft32, w_fft32_fx ); @@ -951,9 +1180,13 @@ static void fft32_15( FOR( i = 0; i < 32; i++ ) { jd = Odx_fft32_15[i]; + move16(); id = Idx[jd]; + move16(); x[id] = z[2 * i]; - y[id] = z[2 * i + 1]; + move32(); + y[id] = z[add( shl( i, 1 ), 1 )]; + move32(); } return; @@ -976,8 +1209,11 @@ static void fft32_5( FOR( i = 0; i < 32; i++ ) { id = Idx[i]; + move16(); z[2 * i] = x[id]; - z[2 * i + 1] = y[id]; + move32(); + z[add( shl( i, 1 ), 1 )] = y[id]; + move32(); } cdftForw( 64, z, Ip_fft32, w_fft32_fx ); @@ -985,9 +1221,13 @@ static void fft32_5( FOR( i = 0; i < 32; i++ ) { jd = Odx_fft32_5[i]; + move16(); id = Idx[jd]; + move16(); x[id] = z[2 * i]; - y[id] = z[2 * i + 1]; + move32(); + y[id] = z[add( shl( i, 1 ), 1 )]; + move32(); } return; @@ -1010,8 +1250,11 @@ static void fft16_ivas( FOR( i = 0; i < 16; i++ ) { id = Idx[i]; + move16(); z[2 * i] = x[id]; - z[2 * i + 1] = y[id]; + move32(); + z[add( shl( i, 1 ), 1 )] = y[id]; + move32(); } cdftForw( 32, z, Ip_fft16, w_fft16_fx ); @@ -1019,9 +1262,13 @@ static void fft16_ivas( FOR( i = 0; i < 16; i++ ) { jd = Odx_fft16[i]; + move16(); id = Idx[jd]; + move16(); x[id] = z[2 * i]; - y[id] = z[2 * i + 1]; + move32(); + y[id] = z[add( shl( i, 1 ), 1 )]; + move32(); } return; @@ -1044,8 +1291,11 @@ static void fft8( FOR( i = 0; i < 8; i++ ) { id = Idx[i]; + move16(); z[2 * i] = x[id]; - z[2 * i + 1] = y[id]; + move32(); + z[add( shl( i, 1 ), 1 )] = y[id]; + move32(); } cdftForw( 16, z, Ip_fft8, w_fft8_fx ); @@ -1053,8 +1303,11 @@ static void fft8( FOR( i = 0; i < 8; i++ ) { id = Idx[i]; + move16(); x[id] = z[2 * i]; - y[id] = z[2 * i + 1]; + move32(); + y[id] = z[add( shl( i, 1 ), 1 )]; + move32(); } return; @@ -1077,8 +1330,11 @@ static void fft8_5( FOR( i = 0; i < 8; i++ ) { id = Idx[i]; + move16(); z[2 * i] = x[id]; - z[2 * i + 1] = y[id]; + move32(); + z[add( shl( i, 1 ), 1 )] = y[id]; + move32(); } cdftForw( 16, z, Ip_fft8, w_fft8_fx ); @@ -1086,9 +1342,13 @@ static void fft8_5( FOR( i = 0; i < 8; i++ ) { jd = Odx_fft8_5[i]; + move16(); id = Idx[jd]; + move16(); x[id] = z[2 * i]; - y[id] = z[2 * i + 1]; + move32(); + y[id] = z[add( shl( i, 1 ), 1 )]; + move32(); } return; } @@ -1110,17 +1370,28 @@ static void fft5_8( Word16 in1, in2, in3, in4, in5; in1 = Idx[0]; + move16(); in2 = Idx[n1]; + move16(); in3 = Idx[n1 * 2]; - in4 = Idx[n1 * 3]; + move16(); + in4 = Idx[i_mult( n1, 3 )]; + move16(); in5 = Idx[n1 * 4]; + move16(); fi1 = zRe[in1]; + move32(); fi2 = zIm[in1]; + move32(); fo3 = zRe[in2]; + move32(); fo4 = zRe[in5]; + move32(); fo6 = zRe[in3]; + move32(); fo7 = zRe[in4]; + move32(); fo5 = L_add( fo3, fo4 ); fo8 = L_add( fo6, fo7 ); @@ -1130,9 +1401,13 @@ static void fft5_8( fi6 = L_sub( fo3, fo4 ); fo3 = zIm[in2]; + move32(); fo4 = zIm[in5]; + move32(); fo6 = zIm[in3]; + move32(); fo7 = zIm[in4]; + move32(); fo5 = L_add( fo3, fo4 ); fo8 = L_add( fo6, fo7 ); @@ -1142,7 +1417,9 @@ static void fft5_8( fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); zRe[in1] = L_add( fi1, fi3 ); + move32(); zIm[in1] = L_add( fi2, fi8 ); + move32(); fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); @@ -1151,9 +1428,13 @@ static void fft5_8( fo6 = L_sub( fo7, fi5 ); zRe[in2] = L_sub( fo6, fo4 ); + move32(); zRe[in3] = L_sub( fo5, fo3 ); + move32(); zRe[in5] = L_add( fo6, fo4 ); + move32(); zRe[in4] = L_add( fo5, fo3 ); + move32(); fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); @@ -1162,9 +1443,13 @@ static void fft5_8( fo6 = L_sub( fo7, fo2 ); zIm[in2] = L_add( fo4, fo6 ); + move32(); zIm[in3] = L_add( fo3, fo5 ); + move32(); zIm[in4] = L_sub( fo5, fo3 ); + move32(); zIm[in5] = L_sub( fo6, fo4 ); + move32(); return; } @@ -1186,8 +1471,11 @@ static void fft4_5( FOR( i = 0; i < 4; i++ ) { id = Idx[i]; + move16(); z[2 * i] = x[id]; - z[2 * i + 1] = y[id]; + move32(); + z[add( shl( i, 1 ), 1 )] = y[id]; + move32(); } cdftForw( 8, z, Ip_fft4, w_fft4_fx ); @@ -1195,9 +1483,13 @@ static void fft4_5( FOR( i = 0; i < 4; i++ ) { jd = Odx_fft4_5[i]; + move16(); id = Idx[jd]; + move16(); x[id] = z[2 * i]; - y[id] = z[2 * i + 1]; + move32(); + y[id] = z[add( shl( i, 1 ), 1 )]; + move32(); } return; } @@ -1218,17 +1510,28 @@ static void fft5_4( Word16 in1, in2, in3, in4, in5; in1 = Idx[0]; + move16(); in2 = Idx[n1]; + move16(); in3 = Idx[n1 * 2]; - in4 = Idx[n1 * 3]; + move16(); + in4 = Idx[i_mult( n1, 3 )]; + move16(); in5 = Idx[n1 * 4]; + move16(); fi1 = zRe[in1]; + move32(); fi2 = zIm[in1]; + move32(); fo3 = zRe[in2]; + move32(); fo4 = zRe[in5]; + move32(); fo6 = zRe[in3]; + move32(); fo7 = zRe[in4]; + move32(); fo5 = L_add( fo3, fo4 ); fo8 = L_add( fo6, fo7 ); @@ -1238,9 +1541,13 @@ static void fft5_4( fi6 = L_sub( fo3, fo4 ); fo3 = zIm[in2]; + move32(); fo4 = zIm[in5]; + move32(); fo6 = zIm[in3]; + move32(); fo7 = zIm[in4]; + move32(); fo5 = L_add( fo3, fo4 ); fo8 = L_add( fo6, fo7 ); @@ -1250,7 +1557,9 @@ static void fft5_4( fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); zRe[in1] = L_add( fi1, fi3 ); + move32(); zIm[in1] = L_add( fi2, fi8 ); + move32(); fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); @@ -1259,9 +1568,13 @@ static void fft5_4( fo6 = L_sub( fo7, fi5 ); zRe[in2] = L_sub( fo5, fo3 ); + move32(); zRe[in4] = L_sub( fo6, fo4 ); + move32(); zRe[in3] = L_add( fo6, fo4 ); + move32(); zRe[in5] = L_add( fo5, fo3 ); + move32(); fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); @@ -1270,9 +1583,13 @@ static void fft5_4( fo6 = L_sub( fo7, fo2 ); zIm[in2] = L_add( fo3, fo5 ); + move32(); zIm[in3] = L_sub( fo6, fo4 ); + move32(); zIm[in4] = L_add( fo4, fo6 ); + move32(); zIm[in5] = L_sub( fo5, fo3 ); + move32(); return; } @@ -1292,7 +1609,7 @@ void DoRTFT80_fx( /* Applying 16-point FFT for 5 times based on the address table Idx_dortft80 */ FOR( j = 0; j < 5; j++ ) { - fft16_ivas( x, y, Idx_dortft80 + 16 * j ); + fft16_ivas( x, y, Idx_dortft80 + shl( j, 4 ) ); } /* Applying 5-point FFT for 16 times based on the address table Idx_dortft80 */ @@ -1319,7 +1636,7 @@ void DoRTFT120_fx( /* Applying 8-point FFT for 15 times based on the address table Idx_dortft120 */ FOR( j = 0; j < 15; j++ ) { - fft8( x, y, Idx_dortft120 + 8 * j ); + fft8( x, y, Idx_dortft120 + shl( j, 3 ) ); } /* Applying 15-point FFT for 8 times based on the address table Idx_dortft120 */ @@ -1346,7 +1663,7 @@ void DoRTFT160_fx( /* Applying 32-point FFT for 5 times based on the address table Idx_dortft160 */ FOR( j = 0; j < 5; j++ ) { - fft32_5( x, y, Idx_dortft160 + 32 * j ); + fft32_5( x, y, Idx_dortft160 + shl( j, 5 ) ); } /* Applying 5-point FFT for 32 times based on the address table Idx_dortft160 */ @@ -1373,7 +1690,7 @@ void DoRTFT320_fx( /* Applying 64-point FFT for 5 times based on the address table Idx_dortft160 */ FOR( j = 0; j < 5; j++ ) { - fft64( x, y, Idx_dortft320 + 64 * j ); + fft64( x, y, Idx_dortft320 + shl( j, 6 ) ); } /* Applying 5-point FFT for 64 times based on the address table Idx_dortft160 */ @@ -1400,7 +1717,7 @@ void DoRTFT480_fx( /* Applying 32-point FFT for 15 times based on the address table Idx_dortft160 */ FOR( j = 0; j < 15; j++ ) { - fft32_15( x, y, Idx_dortft480 + 32 * j ); + fft32_15( x, y, Idx_dortft480 + shl( j, 5 ) ); } /* Applying 5-point FFT for 32 times based on the address table Idx_dortft160 */ @@ -1426,7 +1743,7 @@ void DoRTFT40_fx( /* Applying 8-point FFT for 5 times based on the address table Idx_dortft40 */ FOR( j = 0; j < 5; j++ ) { - fft8_5( x, y, Idx_dortft40 + 8 * j ); + fft8_5( x, y, Idx_dortft40 + shl( j, 3 ) ); } /* Applying 5-point FFT for 8 times based on the address table Idx_dortft40 */ @@ -1453,7 +1770,7 @@ void DoRTFT20_fx( /* Applying 4-point FFT for 5 times based on the address table Idx_dortft20 */ FOR( j = 0; j < 5; j++ ) { - fft4_5( x, y, Idx_dortft20 + 4 * j ); + fft4_5( x, y, Idx_dortft20 + shl( j, 2 ) ); } /* Applying 5-point FFT for 4 times based on the address table Idx_dortft20 */ @@ -1482,17 +1799,23 @@ void DoRTFT128_fx( FOR( i = 0; i < 128; i++ ) { z[2 * i] = x[i]; - z[2 * i + 1] = y[i]; + move32(); + z[add( shl( i, 1 ), 1 )] = y[i]; + move32(); } cdftForw( 256, z, Ip_fft128, w_fft128_fx ); x[0] = z[0]; + move32(); y[0] = z[1]; + move32(); FOR( i = 1; i < 128; i++ ) { x[128 - i] = z[2 * i]; - y[128 - i] = z[2 * i + 1]; + move32(); + y[128 - i] = z[add( shl( i, 1 ), 1 )]; + move32(); } return; @@ -1535,22 +1858,30 @@ static void bitrv2_SR( IF( EQ_16( n, 64 ) ) { m = 4; + move16(); l = -1; + move16(); } ELSE IF( EQ_16( n, 256 ) ) { m = 8; + move16(); l = -1; + move16(); } ELSE IF( EQ_16( n, 16 ) ) { m = 2; + move16(); l = -1; + move16(); } ELSE { l = n; + move16(); m = 1; + move16(); WHILE( shl( m, 3 ) < l ) { @@ -1562,7 +1893,7 @@ static void bitrv2_SR( m2 = shl( m, 1 ); - IF( EQ_16( l, 0 ) ) + IF( l == 0 ) { FOR( k = 0; k < m; k++ ) { @@ -1571,55 +1902,95 @@ static void bitrv2_SR( j1 = add( shl( j, 1 ), ip[k] ); k1 = add( shl( k, 1 ), ip[j] ); xr = a[j1]; + move32(); xi = a[j1 + 1]; + move32(); yr = a[k1]; + move32(); yi = a[k1 + 1]; + move32(); a[j1] = yr; + move32(); a[j1 + 1] = yi; + move32(); a[k1] = xr; + move32(); a[k1 + 1] = xi; - j1 += m2; - k1 += 2 * m2; + move32(); + j1 = add( j1, m2 ); + k1 = add( k1, 2 * m2 ); xr = a[j1]; + move32(); xi = a[j1 + 1]; + move32(); yr = a[k1]; + move32(); yi = a[k1 + 1]; + move32(); a[j1] = yr; + move32(); a[j1 + 1] = yi; + move32(); a[k1] = xr; + move32(); a[k1 + 1] = xi; + move32(); j1 = add( j1, m2 ); k1 = sub( k1, m2 ); xr = a[j1]; + move32(); xi = a[j1 + 1]; + move32(); yr = a[k1]; + move32(); yi = a[k1 + 1]; + move32(); a[j1] = yr; + move32(); a[j1 + 1] = yi; + move32(); a[k1] = xr; + move32(); a[k1 + 1] = xi; + move32(); j1 = add( j1, m2 ); k1 = add( k1, shl( m2, 1 ) ); xr = a[j1]; + move32(); xi = a[j1 + 1]; + move32(); yr = a[k1]; + move32(); yi = a[k1 + 1]; + move32(); a[j1] = yr; + move32(); a[j1 + 1] = yi; + move32(); a[k1] = xr; + move32(); a[k1 + 1] = xi; + move32(); } j1 = add( shl( k, 1 ), add( m2, ip[k] ) ); k1 = add( j1, m2 ); xr = a[j1]; + move32(); xi = a[j1 + 1]; + move32(); yr = a[k1]; + move32(); yi = a[k1 + 1]; + move32(); a[j1] = yr; + move32(); a[j1 + 1] = yi; + move32(); a[k1] = xr; + move32(); a[k1 + 1] = xi; + move32(); } } ELSE @@ -1631,23 +2002,39 @@ static void bitrv2_SR( j1 = add( shl( j, 1 ), ip[k] ); k1 = add( shl( k, 1 ), ip[j] ); xr = a[j1]; + move32(); xi = a[j1 + 1]; + move32(); yr = a[k1]; + move32(); yi = a[k1 + 1]; + move32(); a[j1] = yr; + move32(); a[j1 + 1] = yi; + move32(); a[k1] = xr; + move32(); a[k1 + 1] = xi; + move32(); j1 = add( j1, m2 ); k1 = add( k1, m2 ); xr = a[j1]; + move32(); xi = a[j1 + 1]; + move32(); yr = a[k1]; + move32(); yi = a[k1 + 1]; + move32(); a[j1] = yr; + move32(); a[j1 + 1] = yi; + move32(); a[k1] = xr; + move32(); a[k1 + 1] = xi; + move32(); } } } @@ -1670,12 +2057,14 @@ static void cftfsub( Word32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; l = 2; + move16(); IF( GT_16( n, 8 ) ) { cft1st( n, a, w ); l = 8; + move16(); WHILE( LT_16( shl( l, 2 ), n ) ) { @@ -1700,13 +2089,21 @@ static void cftfsub( x3r = L_sub( a[j2], a[j3] ); x3i = L_sub( a[j2 + 1], a[j3 + 1] ); a[j] = L_add( x0r, x2r ); + move32(); a[j + 1] = L_add( x0i, x2i ); + move32(); a[j2] = L_sub( x0r, x2r ); + move32(); a[j2 + 1] = L_sub( x0i, x2i ); + move32(); a[j1] = L_sub( x1r, x3i ); + move32(); a[j1 + 1] = L_add( x1i, x3r ); + move32(); a[j3] = L_add( x1r, x3i ); + move32(); a[j3 + 1] = L_sub( x1i, x3r ); + move32(); } } ELSE @@ -1717,9 +2114,13 @@ static void cftfsub( x0r = L_sub( a[j], a[j1] ); x0i = L_sub( a[j + 1], a[j1 + 1] ); a[j] = L_add( a[j], a[j1] ); + move32(); a[j + 1] = L_add( a[j + 1], a[j1 + 1] ); + move32(); a[j1] = x0r; + move32(); a[j1 + 1] = x0i; + move32(); } } @@ -1750,13 +2151,21 @@ static void cft1st( x3r = L_sub( a[4], a[6] ); x3i = L_sub( a[5], a[7] ); a[0] = L_add( x0r, x2r ); + move32(); a[1] = L_add( x0i, x2i ); + move32(); a[4] = L_sub( x0r, x2r ); + move32(); a[5] = L_sub( x0i, x2i ); + move32(); a[2] = L_sub( x1r, x3i ); + move32(); a[3] = L_add( x1i, x3r ); + move32(); a[6] = L_add( x1r, x3i ); + move32(); a[7] = L_sub( x1i, x3r ); + move32(); wk1r = w[2]; x0r = L_add( a[8], a[10] ); x0i = L_add( a[9], a[11] ); @@ -1767,27 +2176,40 @@ static void cft1st( x3r = L_sub( a[12], a[14] ); x3i = L_sub( a[13], a[15] ); a[8] = L_add( x0r, x2r ); + move32(); a[9] = L_add( x0i, x2i ); + move32(); a[12] = L_sub( x2i, x0i ); + move32(); a[13] = L_sub( x0r, x2r ); + move32(); x0r = L_sub( x1r, x3i ); x0i = L_add( x1i, x3r ); a[10] = Mpy_32_16_1( L_sub( x0r, x0i ), wk1r ); + move32(); a[11] = Mpy_32_16_1( L_add( x0r, x0i ), wk1r ); + move32(); x0r = L_add( x3i, x1r ); x0i = L_sub( x3r, x1i ); a[14] = Mpy_32_16_1( L_sub( x0i, x0r ), wk1r ); + move32(); a[15] = Mpy_32_16_1( L_add( x0i, x0r ), wk1r ); + move32(); k1 = 0; + move16(); FOR( j = 16; j < n; j += 16 ) { k1 = add( k1, 2 ); k2 = shl( k1, 1 ); wk2r = w[k1]; + move16(); wk2i = w[k1 + 1]; + move16(); wk1r = w[k2]; + move16(); wk1i = w[k2 + 1]; + move16(); wtmp = mult_r( wk2i, wk1i ); wk3r = sub( wk1r, wtmp ); wk3r = sub( wk3r, wtmp ); @@ -1803,21 +2225,31 @@ static void cft1st( x3r = L_sub( a[j + 4], a[j + 6] ); x3i = L_sub( a[j + 5], a[j + 7] ); a[j] = L_add( x0r, x2r ); + move32(); a[j + 1] = L_add( x0i, x2i ); + move32(); x0r = L_sub( x0r, x2r ); x0i = L_sub( x0i, x2i ); a[j + 4] = L_sub( Mpy_32_16_1( x0r, wk2r ), Mpy_32_16_1( x0i, wk2i ) ); + move32(); a[j + 5] = L_add( Mpy_32_16_1( x0i, wk2r ), Mpy_32_16_1( x0r, wk2i ) ); + move32(); x0r = L_sub( x1r, x3i ); x0i = L_add( x1i, x3r ); a[j + 2] = L_sub( Mpy_32_16_1( x0r, wk1r ), Mpy_32_16_1( x0i, wk1i ) ); + move32(); a[j + 3] = L_add( Mpy_32_16_1( x0i, wk1r ), Mpy_32_16_1( x0r, wk1i ) ); + move32(); x0r = L_add( x1r, x3i ); x0i = L_sub( x1i, x3r ); a[j + 6] = L_sub( Mpy_32_16_1( x0r, wk3r ), Mpy_32_16_1( x0i, wk3i ) ); + move32(); a[j + 7] = L_add( Mpy_32_16_1( x0i, wk3r ), Mpy_32_16_1( x0r, wk3i ) ); + move32(); wk1r = w[k2 + 2]; + move16(); wk1i = w[k2 + 3]; + move16(); wtmp = mult_r( wk2r, wk1i ); wk3r = sub( wk1r, wtmp ); wk3r = sub( wk3r, wtmp ); @@ -1833,19 +2265,26 @@ static void cft1st( x3r = L_sub( a[j + 12], a[j + 14] ); x3i = L_sub( a[j + 13], a[j + 15] ); a[j + 8] = L_add( x0r, x2r ); + move32(); a[j + 9] = L_add( x0i, x2i ); + move32(); x0r = L_sub( x0r, x2r ); x0i = L_sub( x0i, x2i ); a[j + 12] = L_negate( L_add( Mpy_32_16_1( x0r, wk2i ), Mpy_32_16_1( x0i, wk2r ) ) ); + move32(); a[j + 13] = L_sub( Mpy_32_16_1( x0r, wk2r ), Mpy_32_16_1( x0i, wk2i ) ); + move32(); x0r = L_sub( x1r, x3i ); x0i = L_add( x1i, x3r ); a[j + 10] = L_sub( Mpy_32_16_1( x0r, wk1r ), Mpy_32_16_1( x0i, wk1i ) ); + move32(); a[j + 11] = L_add( Mpy_32_16_1( x0i, wk1r ), Mpy_32_16_1( x0r, wk1i ) ); x0r = L_add( x1r, x3i ); x0i = L_sub( x1i, x3r ); a[j + 14] = L_sub( Mpy_32_16_1( x0r, wk3r ), Mpy_32_16_1( x0i, wk3i ) ); + move32(); a[j + 15] = L_add( Mpy_32_16_1( x0i, wk3r ), Mpy_32_16_1( x0r, wk3i ) ); + move32(); } return; @@ -1882,16 +2321,25 @@ static void cftmdl( x3r = L_sub( a[j2], a[j3] ); x3i = L_sub( a[j2 + 1], a[j3 + 1] ); a[j] = L_add( x0r, x2r ); + move32(); a[j + 1] = L_add( x0i, x2i ); + move32(); a[j2] = L_sub( x0r, x2r ); + move32(); a[j2 + 1] = L_sub( x0i, x2i ); + move32(); a[j1] = L_sub( x1r, x3i ); + move32(); a[j1 + 1] = L_add( x1i, x3r ); + move32(); a[j3] = L_add( x1r, x3i ); + move32(); a[j3 + 1] = L_sub( x1i, x3r ); + move32(); } wk1r = w[2]; + move16(); FOR( j = m; j < l + m; j += 2 ) { j1 = add( j, l ); @@ -1906,29 +2354,42 @@ static void cftmdl( x3r = L_sub( a[j2], a[j3] ); x3i = L_sub( a[j2 + 1], a[j3 + 1] ); a[j] = L_add( x0r, x2r ); + move32(); a[j + 1] = L_add( x0i, x2i ); + move32(); a[j2] = L_sub( x2i, x0i ); + move32(); a[j2 + 1] = L_sub( x0r, x2r ); + move32(); x0r = L_sub( x1r, x3i ); x0i = L_add( x1i, x3r ); a[j1] = Mpy_32_16_1( L_sub( x0r, x0i ), wk1r ); + move32(); a[j1 + 1] = Mpy_32_16_1( L_add( x0r, x0i ), wk1r ); + move32(); x0r = L_add( x3i, x1r ); x0i = L_sub( x3r, x1i ); a[j3] = Mpy_32_16_1( L_sub( x0i, x0r ), wk1r ); + move32(); a[j3 + 1] = Mpy_32_16_1( L_add( x0i, x0r ), wk1r ); + move32(); } k1 = 0; + move16(); m2 = shl( m, 1 ); FOR( k = m2; k < n; k += m2 ) { k1 = add( k1, 2 ); k2 = shl( k1, 1 ); wk2r = w[k1]; + move16(); wk2i = w[k1 + 1]; + move16(); wk1r = w[k2]; + move16(); wk1i = w[k2 + 1]; + move16(); wtmp = mult_r( wk2i, wk1i ); wk3r = sub( wk1r, wtmp ); wk3r = sub( wk3r, wtmp ); @@ -1949,23 +2410,33 @@ static void cftmdl( x3r = L_sub( a[j2], a[j3] ); x3i = L_sub( a[j2 + 1], a[j3 + 1] ); a[j] = L_add( x0r, x2r ); + move32(); a[j + 1] = L_add( x0i, x2i ); + move32(); x0r = L_sub( x0r, x2r ); x0i = L_sub( x0i, x2i ); a[j2] = L_sub( Mpy_32_16_1( x0r, wk2r ), Mpy_32_16_1( x0i, wk2i ) ); + move32(); a[j2 + 1] = L_add( Mpy_32_16_1( x0i, wk2r ), Mpy_32_16_1( x0r, wk2i ) ); + move32(); x0r = L_sub( x1r, x3i ); x0i = L_add( x1i, x3r ); a[j1] = L_sub( Mpy_32_16_1( x0r, wk1r ), Mpy_32_16_1( x0i, wk1i ) ); + move32(); a[j1 + 1] = L_add( Mpy_32_16_1( x0i, wk1r ), Mpy_32_16_1( x0r, wk1i ) ); + move32(); x0r = L_add( x1r, x3i ); x0i = L_sub( x1i, x3r ); a[j3] = L_sub( Mpy_32_16_1( x0r, wk3r ), Mpy_32_16_1( x0i, wk3i ) ); + move32(); a[j3 + 1] = L_add( Mpy_32_16_1( x0i, wk3r ), Mpy_32_16_1( x0r, wk3i ) ); + move32(); } wk1r = w[k2 + 2]; + move16(); wk1i = w[k2 + 3]; + move16(); wtmp = mult_r( wk2r, wk1i ); wk3r = sub( wk1r, wtmp ); wk3r = sub( wk3r, wtmp ); @@ -1986,19 +2457,27 @@ static void cftmdl( x3r = L_sub( a[j2], a[j3] ); x3i = L_sub( a[j2 + 1], a[j3 + 1] ); a[j] = L_add( x0r, x2r ); + move32(); a[j + 1] = L_add( x0i, x2i ); + move32(); x0r = L_sub( x0r, x2r ); x0i = L_sub( x0i, x2i ); a[j2] = L_negate( L_add( Mpy_32_16_1( x0r, wk2i ), Mpy_32_16_1( x0i, wk2r ) ) ); + move32(); a[j2 + 1] = L_sub( Mpy_32_16_1( x0r, wk2r ), Mpy_32_16_1( x0i, wk2i ) ); + move32(); x0r = L_sub( x1r, x3i ); x0i = L_add( x1i, x3r ); a[j1] = L_sub( Mpy_32_16_1( x0r, wk1r ), Mpy_32_16_1( x0i, wk1i ) ); + move32(); a[j1 + 1] = L_add( Mpy_32_16_1( x0i, wk1r ), Mpy_32_16_1( x0r, wk1i ) ); + move32(); x0r = L_add( x1r, x3i ); x0i = L_sub( x1i, x3r ); a[j3] = L_sub( Mpy_32_16_1( x0r, wk3r ), Mpy_32_16_1( x0i, wk3i ) ); + move32(); a[j3 + 1] = L_add( Mpy_32_16_1( x0i, wk3r ), Mpy_32_16_1( x0r, wk3i ) ); + move32(); } } @@ -2015,10 +2494,12 @@ static void cftbsub( Word32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; l = 2; + move16(); IF( GT_16( n, 8 ) ) { cft1st( n, a, w ); l = 8; + move16(); WHILE( LT_16( shl( l, 2 ), n ) ) { @@ -2043,13 +2524,21 @@ static void cftbsub( x3r = L_sub( a[j2], a[j3] ); x3i = L_sub( a[j2 + 1], a[j3 + 1] ); a[j] = L_add( x0r, x2r ); + move32(); a[j + 1] = L_sub( x0i, x2i ); + move32(); a[j2] = L_sub( x0r, x2r ); + move32(); a[j2 + 1] = L_add( x0i, x2i ); + move32(); a[j1] = L_sub( x1r, x3i ); + move32(); a[j1 + 1] = L_sub( x1i, x3r ); + move32(); a[j3] = L_add( x1r, x3i ); + move32(); a[j3 + 1] = L_add( x1i, x3r ); + move32(); } } ELSE @@ -2060,9 +2549,13 @@ static void cftbsub( x0r = L_sub( a[j], a[j1] ); x0i = L_sub( a[j1 + 1], a[j + 1] ); a[j] = L_add( a[j], a[j1] ); + move32(); a[j + 1] = L_negate( L_add( a[j + 1], a[j1 + 1] ) ); + move32(); a[j1] = x0r; + move32(); a[j1 + 1] = x0i; + move32(); } } @@ -2080,22 +2573,28 @@ static void rftfsub( Word32 xr, xi, yr, yi; m = shr( n, 1 ); - ks = 2 * nc / m; + ks = idiv1616( shl( nc, 1 ), m ); kk = 0; + move16(); FOR( j = 2; j < m; j += 2 ) { k = sub( n, j ); kk = add( kk, ks ); - wkr = sub( (Word16) 0x4000, c[nc - kk] ); + wkr = sub( (Word16) 0x4000, c[sub( nc, kk )] ); wki = c[kk]; + move16(); xr = L_sub( a[j], a[k] ); xi = L_add( a[j + 1], a[k + 1] ); yr = L_sub( Mpy_32_16_1( xr, wkr ), Mpy_32_16_1( xi, wki ) ); yi = L_add( Mpy_32_16_1( xi, wkr ), Mpy_32_16_1( xr, wki ) ); a[j] = L_sub( a[j], yr ); + move32(); a[j + 1] = L_sub( a[j + 1], yi ); + move32(); a[k] = L_add( a[k], yr ); + move32(); a[k + 1] = L_sub( a[k + 1], yi ); + move32(); } return; @@ -2112,23 +2611,29 @@ static void rftbsub( Word16 wkr, wki; Word32 xr, xi, yr, yi; a[1] = L_negate( a[1] ); + move32(); m = shr( n, 1 ); - ks = 2 * nc / m; + ks = idiv1616( shl( nc, 1 ), m ); kk = 0; + move16(); FOR( j = 2; j < m; j += 2 ) { - k = n - j; - kk += ks; - wkr = sub( (Word16) 0x4000, c[nc - kk] ); + k = sub( n, j ); + kk = add( kk, ks ); + wkr = sub( (Word16) 0x4000, c[sub( nc, kk )] ); wki = c[kk]; xr = L_sub( a[j], a[k] ); xi = L_add( a[j + 1], a[k + 1] ); yr = L_add( Mpy_32_16_1( xr, wkr ), Mpy_32_16_1( xi, wki ) ); yi = L_sub( Mpy_32_16_1( xi, wkr ), Mpy_32_16_1( xr, wki ) ); a[j] = L_sub( a[j], yr ); + move32(); a[j + 1] = L_sub( yi, a[j + 1] ); + move32(); a[k] = L_add( a[k], yr ); + move32(); a[k + 1] = L_sub( yi, a[k + 1] ); + move32(); } a[m + 1] = L_negate( a[m + 1] ); @@ -2147,19 +2652,23 @@ static void dctsub( Word32 xr; m = shr( n, 1 ); - ks = nc / n; + ks = idiv1616( nc, n ); kk = 0; + move16(); FOR( j = 1; j < m; j++ ) { k = sub( n, j ); - kk += ks; - wkr = sub( c[kk], c[nc - kk] ); - wki = add( c[kk], c[nc - kk] ); + kk = add( kk, ks ); + wkr = sub( c[kk], c[sub( nc, kk )] ); + wki = add( c[kk], c[sub( nc, kk )] ); xr = L_sub( Mpy_32_16_1( a[j], wki ), Mpy_32_16_1( a[k], wkr ) ); a[j] = L_add( Mpy_32_16_1( a[j], wkr ), Mpy_32_16_1( a[k], wki ) ); + move32(); a[k] = xr; + move32(); } a[m] = Mpy_32_16_1( a[m], c[0] ); + move32(); return; } @@ -2185,26 +2694,34 @@ void edct2_fx_ivas( Copy32( in, a, n ); nw = ip[0]; - IF( GT_16( n, shl( nw, 2 ) ) ) + move16(); + if ( GT_16( n, shl( nw, 2 ) ) ) { nw = shr( n, 2 ); } nc = ip[1]; - IF( GT_16( n, nc ) ) + move16(); + if ( GT_16( n, nc ) ) { nc = n; + move16(); } - IF( LT_16( isgn, 0 ) ) + IF( isgn < 0 ) { xr = a[n - 1]; + move16(); FOR( j = n - 2; j >= 2; j -= 2 ) { a[j + 1] = L_sub( a[j], a[j - 1] ); + move32(); a[j] = L_add( a[j], a[j - 1] ); + move32(); } a[1] = L_sub( a[0], xr ); + move32(); a[0] = L_add( a[0], xr ); + move32(); IF( GT_16( n, 4 ) ) { @@ -2218,14 +2735,15 @@ void edct2_fx_ivas( } } - IF( GE_16( isgn, 0 ) ) + IF( isgn >= 0 ) { a[0] = L_shr( a[0], 1 ); + move32(); } dctsub( n, a, nc, w + nw ); - IF( GE_16( isgn, 0 ) ) + IF( isgn >= 0 ) { IF( GT_16( n, 4 ) ) { @@ -2239,16 +2757,21 @@ void edct2_fx_ivas( } xr = L_sub( a[0], a[1] ); a[0] = L_add( a[0], a[1] ); + move32(); FOR( j = 2; j < n; j += 2 ) { a[j - 1] = L_sub( a[j], a[j + 1] ); + move32(); a[j] = L_add( a[j], a[j + 1] ); + move32(); } a[n - 1] = xr; + move32(); FOR( j = 0; j < n; j++ ) { a[j] = L_shr( a[j], 5 ); + move32(); } } } @@ -2266,7 +2789,9 @@ void DoRTFTn_fx_ivas( FOR( i = 0; i < n; i++ ) { z[2 * i] = x[i]; - z[2 * i + 1] = y[i]; + move32(); + z[add( shl( i, 1 ), 1 )] = y[i]; + move32(); } SWITCH( n ) @@ -2294,11 +2819,15 @@ void DoRTFTn_fx_ivas( } x[0] = z[0]; + move32(); y[0] = z[1]; + move32(); FOR( i = 1; i < n; i++ ) { - x[n - i] = z[2 * i]; - y[n - i] = z[2 * i + 1]; + x[sub( n, i )] = z[2 * i]; + move32(); + y[sub( n, i )] = z[add( shl( i, 1 ), 1 )]; + move32(); } return; @@ -2322,22 +2851,31 @@ void fft3_fx_ivas( /* Determine the order of the transform, the length of decimated */ /* transforms m, and the step for the sine and cosine tables. */ - switch ( n ) + SWITCH( n ) { case 1536: order = 9; + move16(); m = 512; + move16(); step = 1; - break; + move16(); + BREAK; case 384: order = 7; + move16(); m = 128; + move16(); step = 4; - break; + move16(); + BREAK; default: order = 9; + move16(); m = 512; + move16(); step = 1; + move16(); } /* Compose decimated sequences X[3i], X[3i+1],X[3i+2] */ @@ -2352,8 +2890,11 @@ void fft3_fx_ivas( FOR( i = 0; i < n / 3; i++ ) { *z0++ = *x++; /* Z0[i] = X[3i]; */ + move32(); *z1++ = *x++; /* Z1[i] = X[3i+1]; */ + move32(); *z2++ = *x++; /* Z2[i] = X[3i+2]; */ + move32(); } fft_rel_fx32( &Z0[0], m, order ); @@ -2373,49 +2914,59 @@ void fft3_fx_ivas( c1_step = negate( step ); s1_step = step; + move16(); c2_step = negate( shl( step, 1 ) ); s2_step = shl( step, 1 ); c1_ind = add( T_SIN_PI_2, c1_step ); s1_ind = s1_step; + move16(); c2_ind = add( T_SIN_PI_2, c2_step ); s2_ind = s2_step; + move16(); /* special case: i = 0 */ RY[0] = L_add( RZ0[0], L_add( RZ1[0], RZ2[0] ) ); + move32(); /* first 3/12 */ - for ( i = 1; i < 3 * m / 8; i++, c1_ind = add( c1_ind, c1_step ), s1_ind = add( s1_ind, s1_step ), c2_ind = add( c2_ind, c2_step ), s2_ind = add( s2_ind, s2_step ) ) + FOR( i = 1; i < i_mult( 3, shr( m, 3 ) ); ( i++, c1_ind = add( c1_ind, c1_step ), s1_ind = add( s1_ind, s1_step ), c2_ind = add( c2_ind, c2_step ), s2_ind = add( s2_ind, s2_step ) ) ) { RY[i] = L_add( RZ0[i], L_add( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ), L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ), L_add( Mpy_32_16_1( RZ2[i], t_sin[c2_ind] ), Mpy_32_16_1( IZ2[-i], t_sin[s2_ind] ) ) ) ) ); + move32(); IY[-i] = L_sub( IZ0[-i], L_add( L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ), Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ) ), L_sub( Mpy_32_16_1( RZ2[i], t_sin[s2_ind] ), Mpy_32_16_1( IZ2[-i], t_sin[c2_ind] ) ) ) ); + move32(); } /* next 1/12 */ - for ( ; i < 4 * m / 8; i++, c1_ind = add( c1_ind, c1_step ), s1_ind = add( s1_ind, s1_step ), c2_ind = sub( c2_ind, c2_step ), s2_ind = sub( s2_ind, s2_step ) ) + FOR( ; i < 4 * m / 8; ( i++, c1_ind = add( c1_ind, c1_step ), s1_ind = add( s1_ind, s1_step ), c2_ind = sub( c2_ind, c2_step ), s2_ind = sub( s2_ind, s2_step ) ) ) { RY[i] = L_add( RZ0[i], L_sub( L_add( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ), Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ) ), L_sub( Mpy_32_16_1( RZ2[i], t_sin[c2_ind] ), Mpy_32_16_1( IZ2[-i], t_sin[s2_ind] ) ) ) ); + move32(); IY[-i] = L_sub( IZ0[-i], L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ), L_sub( Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ), L_add( Mpy_32_16_1( RZ2[i], t_sin[s2_ind] ), Mpy_32_16_1( IZ2[-i], t_sin[c2_ind] ) ) ) ) ); + move32(); } /* special case: i = m/2 i.e. 1/3 */ RY[i] = L_add( RZ0[i], L_sub( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ), Mpy_32_16_1( RZ2[i], t_sin[c2_ind] ) ) ); + move32(); IY[-i] = L_negate( L_add( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ), Mpy_32_16_1( RZ2[i], t_sin[s2_ind] ) ) ); - i++; + move32(); + i = add( i, 1 ); c1_ind = add( c1_ind, c1_step ); s1_ind = add( s1_ind, s1_step ); @@ -2423,69 +2974,81 @@ void fft3_fx_ivas( s2_ind = sub( s2_ind, s2_step ); /* next 2/12 */ - for ( j = i - 2; i < 6 * m / 8; i++, j--, c1_ind = add( c1_ind, c1_step ), s1_ind = add( s1_ind, s1_step ), c2_ind = sub( c2_ind, c2_step ), s2_ind = sub( s2_ind, s2_step ) ) + FOR( j = i - 2; i < 6 * m / 8; ( i++, j--, c1_ind = add( c1_ind, c1_step ), s1_ind = add( s1_ind, s1_step ), c2_ind = sub( c2_ind, c2_step ), s2_ind = sub( s2_ind, s2_step ) ) ) { RY[i] = L_add( RZ0[j], L_sub( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ), L_add( Mpy_32_16_1( IZ1[-j], t_sin[s1_ind] ), L_add( Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ), Mpy_32_16_1( IZ2[-j], t_sin[s2_ind] ) ) ) ) ); + move32(); IY[-i] = L_negate( L_add( IZ0[-j], L_add( Mpy_32_16_1( RZ1[j], t_sin[s1_ind] ), L_add( Mpy_32_16_1( IZ1[-j], t_sin[c1_ind] ), L_sub( Mpy_32_16_1( RZ2[j], t_sin[s2_ind] ), Mpy_32_16_1( IZ2[-j], t_sin[c2_ind] ) ) ) ) ) ); + move32(); } /*--------------------------half--------------------------*/ /* next 2/12 */ - for ( ; i < 8 * m / 8; i++, j--, c1_ind = sub( c1_ind, c1_step ), s1_ind = sub( s1_ind, s1_step ), c2_ind = add( c2_ind, c2_step ), s2_ind = add( s2_ind, s2_step ) ) + FOR( ; i < 8 * m / 8; ( i++, j--, c1_ind = sub( c1_ind, c1_step ), s1_ind = sub( s1_ind, s1_step ), c2_ind = add( c2_ind, c2_step ), s2_ind = add( s2_ind, s2_step ) ) ) { RY[i] = L_sub( RZ0[j], L_add( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ), L_add( Mpy_32_16_1( IZ1[-j], t_sin[s1_ind] ), L_sub( Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ), Mpy_32_16_1( IZ2[-j], t_sin[s2_ind] ) ) ) ) ); + move32(); IY[-i] = L_negate( L_add( IZ0[-j], L_sub( Mpy_32_16_1( RZ1[j], t_sin[s1_ind] ), L_add( Mpy_32_16_1( IZ1[-j], t_sin[c1_ind] ), L_add( Mpy_32_16_1( RZ2[j], t_sin[s2_ind] ), Mpy_32_16_1( IZ2[-j], t_sin[c2_ind] ) ) ) ) ) ); + move32(); } /* special case: i = m, i.e 2/3 */ RY[i] = L_sub( RZ0[j], L_add( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ), Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ) ) ); - IY[-i++] = L_sub( Mpy_32_16_1( RZ2[j], t_sin[s2_ind] ), - Mpy_32_16_1( RZ1[j], t_sin[s1_ind] ) ); + move32(); + IY[-i] = L_sub( Mpy_32_16_1( RZ2[j], t_sin[s2_ind] ), + Mpy_32_16_1( RZ1[j], t_sin[s1_ind] ) ); + move32(); + i = add( i, 1 ); c1_ind = sub( c1_ind, c1_step ), s1_ind = sub( s1_ind, s1_step ), c2_ind = add( c2_ind, c2_step ), s2_ind = add( s2_ind, s2_step ); /* next 1/12 */ - for ( j = 1; i < 9 * m / 8; i++, j++, c1_ind = sub( c1_ind, c1_step ), s1_ind = sub( s1_ind, s1_step ), c2_ind = add( c2_ind, c2_step ), s2_ind = add( s2_ind, s2_step ) ) + FOR( j = 1; i < i_mult( 9, shr( m, 3 ) ); ( i++, j++, c1_ind = sub( c1_ind, c1_step ), s1_ind = sub( s1_ind, s1_step ), c2_ind = add( c2_ind, c2_step ), s2_ind = add( s2_ind, s2_step ) ) ) { RY[i] = L_sub( RZ0[j], L_sub( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ), L_sub( Mpy_32_16_1( IZ1[-j], t_sin[s1_ind] ), L_add( Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ), Mpy_32_16_1( IZ2[-j], t_sin[s2_ind] ) ) ) ) ); + move32(); IY[-i] = L_sub( IZ0[-j], L_add( Mpy_32_16_1( RZ1[j], t_sin[s1_ind] ), L_sub( Mpy_32_16_1( IZ1[-j], t_sin[c1_ind] ), L_sub( Mpy_32_16_1( RZ2[j], t_sin[s2_ind] ), Mpy_32_16_1( IZ2[-j], t_sin[c2_ind] ) ) ) ) ); + move32(); } /* last 3/12 */ - for ( ; i < 12 * m / 8; i++, j++, c1_ind = sub( c1_ind, c1_step ), s1_ind = sub( s1_ind, s1_step ), c2_ind = sub( c2_ind, c2_step ), s2_ind = sub( s2_ind, s2_step ) ) + FOR( ; i < 12 * m / 8; ( i++, j++, c1_ind = sub( c1_ind, c1_step ), s1_ind = sub( s1_ind, s1_step ), c2_ind = sub( c2_ind, c2_step ), s2_ind = sub( s2_ind, s2_step ) ) ) { RY[i] = L_sub( RZ0[j], L_sub( L_sub( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ), Mpy_32_16_1( IZ1[-j], t_sin[s1_ind] ) ), L_sub( Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ), Mpy_32_16_1( IZ2[-j], t_sin[s2_ind] ) ) ) ); + move32(); IY[-i] = L_sub( IZ0[-j], L_sub( L_add( Mpy_32_16_1( RZ1[j], t_sin[s1_ind] ), Mpy_32_16_1( IZ1[-j], t_sin[c1_ind] ) ), L_add( Mpy_32_16_1( RZ2[j], t_sin[s2_ind] ), Mpy_32_16_1( IZ2[-j], t_sin[c2_ind] ) ) ) ); + move32(); } /* special case: i = 3*m/2 */ RY[i] = L_sub( RZ0[j], L_sub( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ), Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ) ) ); + move32(); return; } @@ -2506,22 +3069,31 @@ void ifft3_fx_ivas( /* Determine the order of the transform, the length of decimated */ /* transforms m, and the step for the sine and cosine tables. */ - switch ( n ) + SWITCH( n ) { case 1536: order = 9; + move16(); m = 512; + move16(); step = 1; - break; + move16(); + BREAK; case 384: order = 7; + move16(); m = 128; + move16(); step = 4; - break; + move16(); + BREAK; default: order = 9; + move16(); m = 512; + move16(); step = 1; + move16(); } /* pointer initialization */ @@ -2534,23 +3106,27 @@ void ifft3_fx_ivas( RZ0 = &Z[0]; RZ1 = RZ0 + m; - RZ2 = RZ0 + n / 2 - m / 2; + RZ2 = RZ0 + sub( shr( n, 1 ), shr( m, 1 ) ); IZ0 = &Z[n]; IZ1 = IZ0 - m; - IZ2 = IZ0 - n / 2 + m / 2; + IZ2 = IZ0 - sub( shr( n, 1 ), shr( m, 1 ) ); /* Inverse butterflies of order 3. */ /* Construction of Y0 */ RY0[0] = L_add( RZ0[0], L_add( RZ1[0], RZ2[0] ) ); + move32(); FOR( i = 1; i < m / 2; i++ ) { RY0[i] = L_add( RZ0[i], L_add( RZ1[i], RZ2[-i] ) ); + move32(); IY0[-i] = L_add( IZ0[-i], L_sub( IZ1[-i], IZ2[i] ) ); + move32(); } /* m/2 */ RY0[i] = L_add( RZ0[i], L_add( RZ1[i], RZ2[-i] ) ); + move32(); /* Construction of Y1 */ c0_ind = T_SIN_PI_2; @@ -2565,6 +3141,7 @@ void ifft3_fx_ivas( L_add( Mpy_32_16_1( RZ2[0], t_sin[c2_ind] ), L_add( Mpy_32_16_1( IZ1[0], t_sin[s1_ind] ), Mpy_32_16_1( IZ2[0], t_sin[s2_ind] ) ) ) ) ); + move32(); c0_ind = sub( c0_ind, step ); s0_ind = add( s0_ind, step ); @@ -2572,7 +3149,7 @@ void ifft3_fx_ivas( s1_ind = sub( s1_ind, step ); c2_ind = sub( c2_ind, step ); s2_ind = add( s2_ind, step ); - for ( i = 1; i < m / 4; i++, c0_ind = sub( c0_ind, step ), s0_ind = add( s0_ind, step ), c1_ind = add( c1_ind, step ), s1_ind = sub( s1_ind, step ), c2_ind = sub( c2_ind, step ), s2_ind = add( s2_ind, step ) ) + FOR( i = 1; i < m / 4; ( i++, c0_ind = sub( c0_ind, step ), s0_ind = add( s0_ind, step ), c1_ind = add( c1_ind, step ), s1_ind = sub( s1_ind, step ), c2_ind = sub( c2_ind, step ), s2_ind = add( s2_ind, step ) ) ) { RY1[i] = L_sub( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ), L_add( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ), @@ -2580,15 +3157,17 @@ void ifft3_fx_ivas( L_add( Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ), L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ), Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ) ) ); + move32(); IY1[-i] = L_add( L_sub( Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ), Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ) ), L_add( Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ), L_add( Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ), L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ), Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ) ) ); + move32(); } - for ( ; i < m / 2; i++, c0_ind = sub( c0_ind, step ), s0_ind = add( s0_ind, step ), c1_ind = add( c1_ind, step ), s1_ind = sub( s1_ind, step ), c2_ind = add( c2_ind, step ), s2_ind = sub( s2_ind, step ) ) + FOR( ; i < m / 2; ( i++, c0_ind = sub( c0_ind, step ), s0_ind = add( s0_ind, step ), c1_ind = add( c1_ind, step ), s1_ind = sub( s1_ind, step ), c2_ind = add( c2_ind, step ), s2_ind = sub( s2_ind, step ) ) ) { RY1[i] = L_sub( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ), L_add( L_sub( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ), @@ -2596,12 +3175,14 @@ void ifft3_fx_ivas( L_add( Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ), L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ), Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ) ); + move32(); IY1[-i] = L_sub( Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ), L_sub( L_add( Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ), Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ) ), L_add( Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ), L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ), Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ) ) ); + move32(); } /* m/2 */ @@ -2611,20 +3192,28 @@ void ifft3_fx_ivas( L_add( Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ), L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ), Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ) ); + move32(); /* Construction of Y2 */ c0_ind = T_SIN_PI_2; + move16(); s0_ind = 0; + move16(); c1_ind = T_SIN_PI_2 * 1 / 3; + move16(); s1_ind = T_SIN_PI_2 * 2 / 3; + move16(); c2_ind = T_SIN_PI_2 * 1 / 3; + move16(); s2_ind = T_SIN_PI_2 * 2 / 3; - step2 = 2 * step; + move16(); + step2 = shl( step, 1 ); RY2[0] = L_sub( Mpy_32_16_1( RZ0[0], t_sin[c0_ind] ), L_sub( L_add( Mpy_32_16_1( RZ1[0], t_sin[c1_ind] ), Mpy_32_16_1( RZ2[0], t_sin[c2_ind] ) ), L_add( Mpy_32_16_1( IZ1[0], t_sin[s1_ind] ), Mpy_32_16_1( IZ2[0], t_sin[s2_ind] ) ) ) ); + move32(); c0_ind = sub( c0_ind, step2 ); s0_ind = add( s0_ind, step2 ); @@ -2632,7 +3221,7 @@ void ifft3_fx_ivas( s1_ind = add( s1_ind, step2 ); c2_ind = add( c2_ind, step2 ); s2_ind = sub( s2_ind, step2 ); - for ( i = 1; i < m / 8; i++, c0_ind = sub( c0_ind, step2 ), s0_ind = add( s0_ind, step2 ), c1_ind = sub( c1_ind, step2 ), s1_ind = add( s1_ind, step2 ), c2_ind = add( c2_ind, step2 ), s2_ind = sub( s2_ind, step2 ) ) + FOR( i = 1; i < m / 8; ( i++, c0_ind = sub( c0_ind, step2 ), s0_ind = add( s0_ind, step2 ), c1_ind = sub( c1_ind, step2 ), s1_ind = add( s1_ind, step2 ), c2_ind = add( c2_ind, step2 ), s2_ind = sub( s2_ind, step2 ) ) ) { RY2[i] = L_sub( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ), L_add( L_add( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ), @@ -2640,15 +3229,17 @@ void ifft3_fx_ivas( L_sub( Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ), L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ), Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ) ); + move32(); IY2[-i] = L_add( L_sub( Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ), Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ) ), L_add( Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ), L_sub( Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ), L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ), Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ) ) ); + move32(); } - for ( ; i < m / 4; i++, c0_ind = sub( c0_ind, step2 ), s0_ind = add( s0_ind, step2 ), c1_ind = add( c1_ind, step2 ), s1_ind = sub( s1_ind, step2 ), c2_ind = add( c2_ind, step2 ), s2_ind = sub( s2_ind, step2 ) ) + FOR( ; i < m / 4; ( i++, c0_ind = sub( c0_ind, step2 ), s0_ind = add( s0_ind, step2 ), c1_ind = add( c1_ind, step2 ), s1_ind = sub( s1_ind, step2 ), c2_ind = add( c2_ind, step2 ), s2_ind = sub( s2_ind, step2 ) ) ) { RY2[i] = L_add( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ), L_sub( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ), @@ -2656,15 +3247,17 @@ void ifft3_fx_ivas( Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ) ), L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ), Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ) ); + move32(); IY2[-i] = L_add( Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ), L_add( Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ), L_add( Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ), L_sub( Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ), L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ), Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ) ) ) ); + move32(); } - for ( ; i < 3 * m / 8; i++, c0_ind = sub( c0_ind, step2 ), s0_ind = add( s0_ind, step2 ), c1_ind = add( c1_ind, step2 ), s1_ind = sub( s1_ind, step2 ), c2_ind = sub( c2_ind, step2 ), s2_ind = add( s2_ind, step2 ) ) + FOR( ; i < i_mult( 3, shr( m, 3 ) ); ( i++, c0_ind = sub( c0_ind, step2 ), s0_ind = add( s0_ind, step2 ), c1_ind = add( c1_ind, step2 ), s1_ind = sub( s1_ind, step2 ), c2_ind = sub( c2_ind, step2 ), s2_ind = add( s2_ind, step2 ) ) ) { RY2[i] = L_sub( L_add( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ), Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ) ), @@ -2672,15 +3265,17 @@ void ifft3_fx_ivas( Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ) ), L_sub( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ), Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ); + move32(); IY2[-i] = L_sub( L_add( Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ), L_add( Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ), L_add( Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ), Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ) ) ) ), L_add( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ), Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ); + move32(); } - for ( ; i < m / 2; i++, c0_ind = add( c0_ind, step2 ), s0_ind = sub( s0_ind, step2 ), c1_ind = add( c1_ind, step2 ), s1_ind = sub( s1_ind, step2 ), c2_ind = sub( c2_ind, step2 ), s2_ind = add( s2_ind, step2 ) ) + FOR( ; i < m / 2; ( i++, c0_ind = add( c0_ind, step2 ), s0_ind = sub( s0_ind, step2 ), c1_ind = add( c1_ind, step2 ), s1_ind = sub( s1_ind, step2 ), c2_ind = sub( c2_ind, step2 ), s2_ind = add( s2_ind, step2 ) ) ) { RY2[i] = L_sub( L_sub( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ), Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ) ), @@ -2688,12 +3283,14 @@ void ifft3_fx_ivas( Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ) ), L_sub( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ), Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ); + move32(); IY2[-i] = L_add( L_sub( Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ), Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ) ), L_sub( L_add( Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ), Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ) ), L_add( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ), Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ) ); + move32(); } /* m/2 */ @@ -2703,6 +3300,7 @@ void ifft3_fx_ivas( Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ) ), L_sub( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ), Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ); + move32(); /* Compute the inverse FFT for all 3 blocks. */ ifft_rel_fx32( RY0, m, order ); @@ -2717,9 +3315,15 @@ void ifft3_fx_ivas( scale = (Word16) ( 0x2AAB ); FOR( i = 0; i < n; ) { - X[i++] = Mpy_32_16_1( ( *y0++ ), scale ); - X[i++] = Mpy_32_16_1( ( *y1++ ), scale ); - X[i++] = Mpy_32_16_1( ( *y2++ ), scale ); + X[i] = Mpy_32_16_1( ( *y0++ ), scale ); + move32(); + i = add( i, 1 ); + X[i] = Mpy_32_16_1( ( *y1++ ), scale ); + move32(); + i = add( i, 1 ); + X[i] = Mpy_32_16_1( ( *y2++ ), scale ); + move32(); + i = add( i, 1 ); } return; @@ -2734,27 +3338,36 @@ static void rfft_post( Word32 tmp1, tmp2, tmp3, tmp4; Word16 s, c; Word16 i = 0; + move16(); tmp1 = L_add( buf[0], buf[1] ); buf[1] = L_sub( buf[0], buf[1] ); + move32(); buf[0] = tmp1; + move32(); - FOR( i = 1; i <= ( len + 2 ) / 4; i++ ) + FOR( i = 1; i <= shr( add( len, 2 ), 2 ); i++ ) { - s = sine_table[i]; /* sin(pi*i/(len/2)) */ - c = sine_table[i + len / 4]; /* cos(pi*i/(len/2)) */ + s = sine_table[i]; /* sin(pi*i/(len/2)) */ + move16(); + c = sine_table[add( i, shr( len, 2 ) )]; /* cos(pi*i/(len/2)) */ + move16(); - tmp1 = L_sub( buf[2 * i], buf[len - 2 * i] ); - tmp2 = L_add( buf[2 * i + 1], buf[len - 2 * i + 1] ); + tmp1 = L_sub( buf[2 * i], buf[sub( len, shl( i, 1 ) )] ); + tmp2 = L_add( buf[add( shl( i, 1 ), 1 )], buf[add( sub( len, shl( i, 1 ) ), 1 )] ); tmp3 = L_sub( Mpy_32_16_1( tmp1, s ), Mpy_32_16_1( tmp2, c ) ); /* real part of j*W(k,N)*[T(k) - T'(N-k)] */ tmp4 = L_add( Mpy_32_16_1( tmp1, c ), Mpy_32_16_1( tmp2, s ) ); /* imag part of j*W(k,N)*[T(k) - T'(N-k)] */ - tmp1 = L_add( buf[2 * i], buf[len - 2 * i] ); - tmp2 = L_sub( buf[2 * i + 1], buf[len - 2 * i + 1] ); + tmp1 = L_add( buf[2 * i], buf[sub( len, shl( i, 1 ) )] ); + tmp2 = L_sub( buf[add( shl( i, 1 ), 1 )], buf[add( sub( len, shl( i, 1 ) ), 1 )] ); buf[2 * i] = L_shr( L_sub( tmp1, tmp3 ), 1 ); - buf[2 * i + 1] = L_shr( L_sub( tmp2, tmp4 ), 1 ); - buf[len - 2 * i] = L_shr( L_add( tmp1, tmp3 ), 1 ); - buf[len - 2 * i + 1] = L_negate( L_shr( L_add( tmp2, tmp4 ), 1 ) ); + move32(); + buf[add( shl( i, 1 ), 1 )] = L_shr( L_sub( tmp2, tmp4 ), 1 ); + move32(); + buf[sub( len, shl( i, 1 ) )] = L_shr( L_add( tmp1, tmp3 ), 1 ); + move32(); + buf[add( sub( len, shl( i, 1 ) ), 1 )] = L_negate( L_shr( L_add( tmp2, tmp4 ), 1 ) ); + move32(); } } @@ -2770,24 +3383,32 @@ static void rfft_pre( tmp1 = L_add( buf[0], buf[1] ); buf[1] = Mpy_32_16_1( L_sub( buf[0], buf[1] ), scale ); + move32(); buf[0] = Mpy_32_16_1( tmp1, scale ); + move32(); - FOR( i = 1; i <= ( len + 2 ) / 4; i++ ) + FOR( i = 1; i <= shr( add( len, 2 ), 2 ); i++ ) { - s = sine_table[i]; /* sin(pi*i/(len/2)) */ - c = sine_table[i + len / 4]; /* cos(pi*i/(len/2)) */ + s = sine_table[i]; /* sin(pi*i/(len/2)) */ + move16(); + c = sine_table[add( i, shr( len, 2 ) )]; /* cos(pi*i/(len/2)) */ + move16(); - tmp1 = L_sub( buf[2 * i], buf[len - 2 * i] ); - tmp2 = L_add( buf[2 * i + 1], buf[len - 2 * i + 1] ); + tmp1 = L_sub( buf[2 * i], buf[sub( len, shl( i, 1 ) )] ); + tmp2 = L_add( buf[add( shl( i, 1 ), 1 )], buf[add( sub( len, shl( i, 1 ) ), 1 )] ); tmp3 = L_add( Mpy_32_16_1( tmp1, s ), Mpy_32_16_1( tmp2, c ) ); /* real part of j*W(k,N)*[T(k) - T'(N-k)] */ tmp4 = L_sub( Mpy_32_16_1( tmp2, s ), Mpy_32_16_1( tmp1, c ) ); /* imag part of j*W(k,N)*[T(k) - T'(N-k)] */ - tmp1 = L_add( buf[2 * i], buf[len - 2 * i] ); - tmp2 = L_sub( buf[2 * i + 1], buf[len - 2 * i + 1] ); + tmp1 = L_add( buf[2 * i], buf[sub( len, shl( i, 1 ) )] ); + tmp2 = L_sub( buf[add( shl( i, 1 ), 1 )], buf[add( sub( len, shl( i, 1 ) ), 1 )] ); buf[2 * i] = Mpy_32_16_1( L_add( tmp1, tmp3 ), scale ); - buf[2 * i + 1] = L_negate( Mpy_32_16_1( L_add( tmp2, tmp4 ), scale ) ); - buf[len - 2 * i] = Mpy_32_16_1( L_sub( tmp1, tmp3 ), scale ); - buf[len - 2 * i + 1] = Mpy_32_16_1( L_sub( tmp2, tmp4 ), scale ); + move32(); + buf[add( shl( i, 1 ), 1 )] = L_negate( Mpy_32_16_1( L_add( tmp2, tmp4 ), scale ) ); + move32(); + buf[sub( len, shl( i, 1 ) )] = Mpy_32_16_1( L_sub( tmp1, tmp3 ), scale ); + move32(); + buf[add( sub( len, shl( i, 1 ) ), 1 )] = Mpy_32_16_1( L_sub( tmp2, tmp4 ), scale ); + move32(); } return; @@ -2814,13 +3435,17 @@ Word16 RFFTN_fx( FOR( i = 0; i < 320; i++ ) { x[i] = data[2 * i]; - y[i] = data[2 * i + 1]; + move32(); + y[i] = data[add( shl( i, 1 ), 1 )]; + move32(); } DoRTFT320_fx( x, y ); FOR( i = 0; i < 320; i++ ) { data[2 * i] = x[i]; - data[2 * i + 1] = y[i]; + move32(); + data[add( shl( i, 1 ), 1 )] = y[i]; + move32(); } IF( EQ_16( sign, -1 ) ) @@ -2834,27 +3459,36 @@ Word16 RFFTN_fx( { Word16 i; const Word16 log2 = 9; + move16(); Word32 reordered_data[512]; IF( EQ_16( sign, -1 ) ) { fft_rel_fx32( data, len, log2 ); reordered_data[0] = data[0]; + move32(); reordered_data[1] = data[len / 2]; + move32(); FOR( i = 1; i < len / 2; i++ ) { reordered_data[2 * i] = data[i]; - reordered_data[2 * i + 1] = data[len - i]; + move32(); + reordered_data[add( shl( i, 1 ), 1 )] = data[sub( len, i )]; + move32(); } } ELSE { reordered_data[0] = data[0]; + move32(); reordered_data[len / 2] = data[1]; + move32(); FOR( i = 1; i < len / 2; i++ ) { reordered_data[i] = data[2 * i]; - reordered_data[len - i] = data[2 * i + 1]; + move32(); + reordered_data[sub( len, i )] = data[add( shl( i, 1 ), 1 )]; + move32(); } ifft_rel_fx32( reordered_data, len, log2 ); } @@ -2876,7 +3510,9 @@ static void butterfly( Word32 *aMinusb ) { *aPlusb = L_add( a, b ); + move32(); *aMinusb = L_sub( a, b ); + move32(); return; } @@ -2892,14 +3528,22 @@ static void fft2( Word32 re2, im2; re1 = pInOut[0]; + move32(); im1 = pInOut[1]; + move32(); re2 = pInOut[2]; + move32(); im2 = pInOut[3]; + move32(); pInOut[0] = L_add( re1, re2 ); + move32(); pInOut[1] = L_add( im1, im2 ); + move32(); pInOut[2] = L_sub( re1, re2 ); + move32(); pInOut[3] = L_sub( im1, im2 ); + move32(); return; } @@ -2917,11 +3561,17 @@ static void fft3_2( Word32 *pInOut ) Word32 tmp3, tmp4; re1 = pInOut[0]; + move32(); im1 = pInOut[1]; + move32(); re2 = pInOut[2]; + move32(); im2 = pInOut[3]; + move32(); re3 = pInOut[4]; + move32(); im3 = pInOut[5]; + move32(); /* FFT MATRIX: 1.0000 1.0000 1.0000 @@ -2934,12 +3584,18 @@ static void fft3_2( Word32 *pInOut ) tmp2 = L_sub( re2, re3 ); tmp4 = L_sub( im2, im3 ); pInOut[0] = L_add( re1, tmp1 ); + move32(); pInOut[1] = L_add( im1, tmp3 ); + move32(); pInOut[2] = L_sub( re1, L_sub( Mpy_32_16_1( tmp1, C31 ), Mpy_32_16_1( tmp4, C32 ) ) ); + move32(); pInOut[4] = L_sub( re1, L_add( Mpy_32_16_1( tmp1, C31 ), Mpy_32_16_1( tmp4, C32 ) ) ); + move32(); pInOut[3] = L_sub( im1, L_add( Mpy_32_16_1( tmp2, C32 ), Mpy_32_16_1( tmp3, C31 ) ) ); + move32(); pInOut[5] = L_add( im1, L_sub( Mpy_32_16_1( tmp2, C32 ), Mpy_32_16_1( tmp3, C31 ) ) ); + move32(); } @@ -2957,13 +3613,21 @@ static void fft4( Word32 tmp7, tmp8; re1 = pInOut[0]; + move32(); im1 = pInOut[1]; + move32(); re2 = pInOut[2]; + move32(); im2 = pInOut[3]; + move32(); re3 = pInOut[4]; + move32(); im3 = pInOut[5]; + move32(); re4 = pInOut[6]; + move32(); im4 = pInOut[7]; + move32(); /* 1.0000 1.0000 1.0000 1.0000 @@ -2976,19 +3640,27 @@ static void fft4( tmp5 = L_add( im1, im3 ); tmp7 = L_add( im2, im4 ); pInOut[0] = L_add( tmp1, tmp3 ); + move32(); pInOut[4] = L_sub( tmp1, tmp3 ); + move32(); pInOut[1] = L_add( tmp5, tmp7 ); + move32(); pInOut[5] = L_sub( tmp5, tmp7 ); + move32(); tmp2 = L_sub( re1, re3 ); tmp4 = L_sub( re2, re4 ); tmp6 = L_sub( im1, im3 ); tmp8 = L_sub( im2, im4 ); pInOut[2] = L_add( tmp2, tmp8 ); + move32(); pInOut[6] = L_sub( tmp2, tmp8 ); + move32(); pInOut[3] = L_sub( tmp6, tmp4 ); + move32(); pInOut[7] = L_add( tmp4, tmp6 ); + move32(); return; } @@ -3005,10 +3677,15 @@ static void fft5( cmplx t[4]; x[0] = pInOut[0]; + move32(); x[1] = pInOut[1]; + move32(); x[2] = pInOut[2]; + move32(); x[3] = pInOut[3]; + move32(); x[4] = pInOut[4]; + move32(); /* 1.0000 1.0000 1.0000 1.0000 1.0000 @@ -3019,17 +3696,26 @@ static void fft5( 1.0000 0.3090 + 0.9511i -0.8090 + 0.5878i -0.8090 - 0.5878i 0.3090 - 0.9511i */ t[0] = CL_add( x[1], x[4] ); + move32(); t[1] = CL_sub( x[1], x[4] ); + move32(); t[2] = CL_add( x[2], x[3] ); + move32(); t[3] = CL_sub( x[2], x[3] ); + move32(); pInOut[0] = CL_add( x[0], CL_add( t[0], t[2] ) ); + move32(); pInOut[1] = CL_add( CL_add( x[0], CL_sub( CL_scale( t[0], C51 ), CL_scale( t[2], C53 ) ) ), CL_add( CL_conjugate( CL_scale( CL_swap_real_imag( t[1] ), C52 ) ), CL_conjugate( CL_scale( CL_swap_real_imag( t[3] ), C54 ) ) ) ); + move32(); pInOut[4] = CL_add( x[0], CL_sub( CL_scale( t[0], C51 ), CL_add( CL_scale( t[2], C53 ), CL_add( CL_conjugate( CL_scale( CL_swap_real_imag( t[1] ), C52 ) ), CL_conjugate( CL_scale( CL_swap_real_imag( t[3] ), C54 ) ) ) ) ) ); + move32(); pInOut[2] = CL_add( CL_sub( x[0], CL_scale( t[0], C53 ) ), CL_add( CL_scale( t[2], C51 ), CL_sub( CL_conjugate( CL_scale( CL_swap_real_imag( t[1] ), C54 ) ), CL_conjugate( CL_scale( CL_swap_real_imag( t[3] ), C52 ) ) ) ) ); + move32(); pInOut[3] = CL_add( CL_sub( x[0], CL_scale( t[0], C53 ) ), CL_add( CL_sub( CL_scale( t[2], C51 ), CL_conjugate( CL_scale( CL_swap_real_imag( t[1] ), C54 ) ) ), CL_conjugate( CL_scale( CL_swap_real_imag( t[3] ), C52 ) ) ) ); + move32(); return; } @@ -3049,9 +3735,13 @@ static void fft8_2( Word32 im3_5p, im3_5m; re0 = pInOut[0]; + move32(); im0 = pInOut[1]; + move32(); re4 = pInOut[8]; + move32(); im4 = pInOut[9]; + move32(); butterfly( pInOut[1 * 2], pInOut[7 * 2], &re1_7p, &re1_7m ); butterfly( pInOut[1 * 2 + 1], pInOut[7 * 2 + 1], &im1_7p, &im1_7m ); butterfly( pInOut[2 * 2], pInOut[6 * 2], &re2_6p, &re2_6m ); @@ -3069,29 +3759,45 @@ static void fft8_2( 6: 1 + 0i - 0 + 1i -1 - 0i 0 - 1i 1 + 0i - 0 + 1i - 1 - 0i - 0 - 1i 7: 1 + 0i C81 + C81i -0 + 1i -C81 + C81i -1 - 0i -C81 - C81i - 0 - 1i C81 - C81i */ - pInOut[0] = re0 + re4 + re1_7p + re2_6p + re3_5p; - pInOut[1] = im0 + im4 + im1_7p + im2_6p + im3_5p; + pInOut[0] = L_add( L_add( L_add( L_add( re0, re4 ), re1_7p ), re2_6p ), re3_5p ); + move32(); + pInOut[1] = L_add( L_add( L_add( L_add( im0, im4 ), im1_7p ), im2_6p ), im3_5p ); + move32(); - pInOut[2] = re0 + Mpy_32_16_1( L_sub( re1_7p, re3_5p ), C81 ) - re4 + Mpy_32_16_1( L_add( im1_7m, im3_5m ), C81 ) + im2_6m; - pInOut[3] = im0 + Mpy_32_16_1( L_sub( im1_7p, im3_5p ), C81 ) - im4 - Mpy_32_16_1( L_add( re1_7m, re3_5m ), C81 ) - re2_6m; + pInOut[2] = L_add( L_add( L_sub( L_add( re0, Mpy_32_16_1( L_sub( re1_7p, re3_5p ), C81 ) ), re4 ), Mpy_32_16_1( L_add( im1_7m, im3_5m ), C81 ) ), im2_6m ); + move32(); + pInOut[3] = L_sub( L_sub( L_sub( L_add( im0, Mpy_32_16_1( L_sub( im1_7p, im3_5p ), C81 ) ), im4 ), Mpy_32_16_1( L_add( re1_7m, re3_5m ), C81 ) ), re2_6m ); + move32(); - pInOut[4] = re0 - re2_6p + re4 + im1_7m - im3_5m; - pInOut[5] = im0 - im2_6p + im4 - re1_7m + re3_5m; + pInOut[4] = L_sub( L_add( L_add( L_sub( re0, re2_6p ), re4 ), im1_7m ), im3_5m ); + move32(); + pInOut[5] = L_add( L_sub( L_add( L_sub( im0, im2_6p ), im4 ), re1_7m ), re3_5m ); + move32(); - pInOut[6] = re0 + Mpy_32_16_1( L_sub( re3_5p, re1_7p ), C81 ) - re4 + Mpy_32_16_1( L_add( im1_7m, im3_5m ), C81 ) - im2_6m; - pInOut[7] = im0 + Mpy_32_16_1( L_sub( im3_5p, im1_7p ), C81 ) - im4 - Mpy_32_16_1( L_add( re1_7m, re3_5m ), C81 ) + re2_6m; + pInOut[6] = L_sub( L_add( L_sub( L_add( re0, Mpy_32_16_1( L_sub( re3_5p, re1_7p ), C81 ) ), re4 ), Mpy_32_16_1( L_add( im1_7m, im3_5m ), C81 ) ), im2_6m ); + move32(); + pInOut[7] = L_add( L_sub( L_sub( L_add( im0, Mpy_32_16_1( L_sub( im3_5p, im1_7p ), C81 ) ), im4 ), Mpy_32_16_1( L_add( re1_7m, re3_5m ), C81 ) ), re2_6m ); + move32(); - pInOut[8] = re0 - re1_7p + re2_6p - re3_5p + re4; - pInOut[9] = im0 - im1_7p + im2_6p - im3_5p + im4; + pInOut[8] = L_add( L_sub( L_add( L_sub( re0, re1_7p ), re2_6p ), re3_5p ), re4 ); + move32(); + pInOut[9] = L_add( L_sub( L_add( L_sub( im0, im1_7p ), im2_6p ), im3_5p ), im4 ); + move32(); - pInOut[10] = re0 + Mpy_32_16_1( L_sub( re3_5p, re1_7p ), C81 ) - re4 - Mpy_32_16_1( L_add( im1_7m, im3_5m ), C81 ) + im2_6m; - pInOut[11] = im0 + Mpy_32_16_1( L_sub( im3_5p, im1_7p ), C81 ) - im4 + Mpy_32_16_1( L_add( re1_7m, re3_5m ), C81 ) - re2_6m; + pInOut[10] = L_add( L_sub( L_sub( L_add( re0, Mpy_32_16_1( L_sub( re3_5p, re1_7p ), C81 ) ), re4 ), Mpy_32_16_1( L_add( im1_7m, im3_5m ), C81 ) ), im2_6m ); + move32(); + pInOut[11] = L_sub( L_add( L_sub( L_add( im0, Mpy_32_16_1( L_sub( im3_5p, im1_7p ), C81 ) ), im4 ), Mpy_32_16_1( L_add( re1_7m, re3_5m ), C81 ) ), re2_6m ); + move32(); - pInOut[12] = re0 - re2_6p + re4 - im1_7m + im3_5m; - pInOut[13] = im0 - im2_6p + im4 + re1_7m - re3_5m; + pInOut[12] = L_add( L_sub( L_add( L_sub( re0, re2_6p ), re4 ), im1_7m ), im3_5m ); + move32(); + pInOut[13] = L_sub( L_add( L_add( L_sub( im0, im2_6p ), im4 ), re1_7m ), re3_5m ); + move32(); - pInOut[14] = re0 + Mpy_32_16_1( L_sub( re1_7p, re3_5p ), C81 ) - re4 - Mpy_32_16_1( L_add( im1_7m, im3_5m ), C81 ) - im2_6m; - pInOut[15] = im0 + Mpy_32_16_1( L_sub( im1_7p, im3_5p ), C81 ) - im4 + Mpy_32_16_1( L_add( re1_7m, re3_5m ), C81 ) + re2_6m; + pInOut[14] = L_sub( L_sub( L_sub( L_add( re0, Mpy_32_16_1( L_sub( re1_7p, re3_5p ), C81 ) ), re4 ), Mpy_32_16_1( L_add( im1_7m, im3_5m ), C81 ) ), im2_6m ); + move32(); + pInOut[15] = L_add( L_add( L_sub( L_add( im0, Mpy_32_16_1( L_sub( im1_7p, im3_5p ), C81 ) ), im4 ), Mpy_32_16_1( L_add( re1_7m, re3_5m ), C81 ) ), re2_6m ); + move32(); return; } @@ -3113,16 +3819,20 @@ static void nextFFT( fft4( x ); BREAK; case 5: - FOR( Word32 i = 0; i < 5; i++ ) + FOR( Word16 i = 0; i < 5; i++ ) { val[i].re = x[2 * i]; - val[i].im = x[2 * i + 1]; + move32(); + val[i].im = x[add( shl( i, 1 ), 1 )]; + move32(); } fft5( val ); - FOR( Word32 i = 0; i < 5; i++ ) + FOR( Word16 i = 0; i < 5; i++ ) { x[2 * i] = val[i].re; - x[2 * i + 1] = val[i].im; + move32(); + x[add( shl( i, 1 ), 1 )] = val[i].im; + move32(); } BREAK; case 8: @@ -3142,16 +3852,19 @@ static __inline Word16 findFactor( const Word16 length ) { Word16 i = 0; + move16(); Word16 factor = 0; + move16(); WHILE( CTFFTfactors[i] != 0 ) { - IF( EQ_16( 0, ( length % CTFFTfactors[i] ) ) ) + IF( ( length % CTFFTfactors[i] ) == 0 ) { factor = CTFFTfactors[i]; + move16(); BREAK; } - i++; + i = add( i, 1 ); } return factor; } @@ -3165,12 +3878,17 @@ static __inline void twiddle( Word16 i, ii; const Word16 *ptr_sin = &sin_twiddle_table_25_5_5[0]; const Word16 *ptr_cos = &cos_twiddle_table_25_5_5[0]; + + test(); + test(); + test(); + test(); IF( EQ_16( length, 16 ) && EQ_16( n1, 8 ) && EQ_16( n2, 2 ) ) { ptr_sin = &sin_twiddle_table_16_8_2[0]; ptr_cos = &cos_twiddle_table_16_8_2[0]; } - ELSE IF( length != 25 || n1 != 5 || n2 != 5 ) + ELSE IF( NE_16( length, 25 ) || NE_16( n1, 5 ) || NE_16( n2, 5 ) ) { assert( 0 ); } @@ -3180,10 +3898,12 @@ static __inline void twiddle( FOR( ii = 1; ii < n2; ii++ ) { Word32 xRe, xIm; - xRe = x[2 * ( i * n2 + ii )]; - xIm = x[2 * ( i * n2 + ii ) + 1]; - x[2 * ( i * n2 + ii )] = (Word32) L_sub( Mpy_32_16_1( xRe, ptr_cos[i * n2 + ii] ), Mpy_32_16_1( xIm, ptr_sin[i * n2 + ii] ) ); - x[2 * ( i * n2 + ii ) + 1] = (Word32) L_add( Mpy_32_16_1( xRe, ptr_sin[i * n2 + ii] ), Mpy_32_16_1( xIm, ptr_cos[i * n2 + ii] ) ); + xRe = x[shl( ( add( i_mult( i, n2 ), ii ) ), 1 )]; + xIm = x[add( shl( ( add( i_mult( i, n2 ), ii ) ), 1 ), 1 )]; + x[shl( ( add( i_mult( i, n2 ), ii ) ), 1 )] = L_sub( Mpy_32_16_1( xRe, ptr_cos[add( i_mult( i, n2 ), ii )] ), Mpy_32_16_1( xIm, ptr_sin[add( i_mult( i, n2 ), ii )] ) ); + move32(); + x[add( shl( ( add( i_mult( i, n2 ), ii ) ), 1 ), 1 )] = L_add( Mpy_32_16_1( xRe, ptr_sin[add( i_mult( i, n2 ), ii )] ), Mpy_32_16_1( xIm, ptr_cos[add( i_mult( i, n2 ), ii )] ) ); + move32(); } } return; @@ -3198,6 +3918,7 @@ static void cooleyTukeyFFT( Word16 i, ii; Word16 n1, n2; Word16 cnt = 0; + move16(); Word32 *src, *dest; cmplx val[5]; @@ -3218,13 +3939,17 @@ static void cooleyTukeyFFT( FOR( i = 0; i < 5; i++ ) { val[i].re = x[2 * i]; - val[i].im = x[2 * i + 1]; + move32(); + val[i].im = x[add( shl( i, 1 ), 1 )]; + move32(); } fft5( val ); FOR( i = 0; i < 5; i++ ) { x[2 * i] = val[i].re; - x[2 * i + 1] = val[i].im; + move32(); + x[add( shl( i, 1 ), 1 )] = val[i].im; + move32(); } BREAK; case 8: @@ -3234,10 +3959,11 @@ static void cooleyTukeyFFT( { factor = findFactor( length ); - IF( GT_16( factor, 0 ) && GT_16( length / factor, 1 ) ) + IF( GT_16( factor, 0 ) && GT_16( idiv1616( length, factor ), 1 ) ) { n1 = factor; - n2 = length / factor; + move16(); + n2 = idiv1616( length, factor ); /* DATA Resorting for stage1 */ dest = scratch; @@ -3249,7 +3975,9 @@ static void cooleyTukeyFFT( /* *dest++ = x[2*(i+ii*n1)]; */ /* *dest++ = x[2*(i+ii*n1)+1]; */ *dest++ = *src; + move32(); *dest++ = *( src + 1 ); + move32(); src += 2 * n1; } } @@ -3258,39 +3986,47 @@ static void cooleyTukeyFFT( FOR( i = 0; i < length; i++ ) { *dest++ = *src++; + move32(); *dest++ = *src++; + move32(); } /* perform n1 ffts of length n2 */ FOR( i = 0; i < n1; i++ ) { - cooleyTukeyFFT( x + 2 * i * n2, n2, scratch + 2 * i * n2 ); + cooleyTukeyFFT( x + shl( i_mult( i, n2 ), 1 ), n2, scratch + shl( i_mult( i, n2 ), 1 ) ); } /*data twiddeling */ twiddle( x, length, n1, n2 ); /* DATA Resorting for stage2 */ cnt = 0; + move16(); FOR( i = 0; i < n2; i++ ) { FOR( ii = 0; ii < n1; ii++ ) { - scratch[2 * cnt] = x[2 * ( i + ii * n2 )]; - scratch[2 * cnt + 1] = x[2 * ( i + ii * n2 ) + 1]; - cnt++; + scratch[2 * cnt] = x[shl( add( i, i_mult( ii, n2 ) ), 1 )]; + move32(); + scratch[add( shl( cnt, 1 ), 1 )] = x[add( shl( add( i, i_mult( ii, n2 ) ), 1 ), 1 )]; + move32(); + cnt = add( cnt, 1 ); } } /* perform n2 ffts of length n1 */ FOR( i = 0; i < n2; i++ ) { - nextFFT( scratch + 2 * i * n1, n1 ); + nextFFT( scratch + shl( i_mult( i, n1 ), 1 ), n1 ); } cnt = 0; + move16(); FOR( i = 0; i < n1; i++ ) { FOR( ii = 0; ii < n2; ii++ ) { - x[2 * cnt] = scratch[2 * ( i + ii * n1 )]; - x[2 * cnt + 1] = scratch[2 * ( i + ii * n1 ) + 1]; - cnt++; + x[2 * cnt] = scratch[shl( add( i, i_mult( ii, n1 ) ), 1 )]; + move32(); + x[add( shl( cnt, 1 ), 1 )] = scratch[add( shl( add( i, i_mult( ii, n1 ) ), 1 ), 1 )]; + move32(); + cnt = add( cnt, 1 ); } } } @@ -3318,38 +4054,52 @@ static void pfaDFT( { Word32 *tmp = scratch1; Word16 n1_inv = 1, n2_inv = 1; + move16(); + move16(); Word16 n2 = factor[0 /*idx*/]; - Word16 n1 = length / n2; + move16(); + Word16 n1 = idiv1616( length, n2 ); Word16 idx, incr; - WHILE( ( ( n1_inv * n1 ) % n2 ) != 1 ) + WHILE( ( i_mult( n1_inv, n1 ) % n2 ) != 1 ) { - n1_inv++; + n1_inv = add( n1_inv, 1 ); } - WHILE( ( ( n2_inv * n2 ) % n1 ) != 1 ) + WHILE( ( i_mult( n2_inv, n2 ) % n1 ) != 1 ) { - n2_inv++; + n2_inv = add( n2_inv, 1 ); } idx = 0; - incr = n1 * n1_inv; + move16(); + incr = i_mult( n1, n1_inv ); + move16(); cnt = 0; + move16(); FOR( i = 0; i < n1; i++ ) { FOR( ii = 0; ii < n2 - 1; ii++ ) { - tmp[cnt++] = x[2 * idx]; - tmp[cnt++] = x[2 * idx + 1]; + tmp[cnt] = x[2 * idx]; + move32(); + cnt = add( cnt, 1 ); + tmp[cnt] = x[add( shl( idx, 1 ), 1 )]; + move32(); + cnt = add( cnt, 1 ); - idx += incr; + idx = add( idx, incr ); IF( GT_16( idx, length ) ) { - idx -= length; + idx = sub( idx, length ); } } - tmp[cnt++] = x[2 * idx]; - tmp[cnt++] = x[2 * idx + 1]; - idx++; + tmp[cnt] = x[2 * idx]; + move32(); + cnt = add( cnt, 1 ); + tmp[cnt] = x[add( shl( idx, 1 ), 1 )]; + move32(); + cnt = add( cnt, 1 ); + idx = add( idx, 1 ); } FOR( cnt = 0; cnt < length; cnt += n2 ) { @@ -3359,35 +4109,45 @@ static void pfaDFT( { FOR( i = 0; i < n2; i++ ) { - x[2 * ( cnt + i * n1 )] = tmp[2 * ( cnt * n2 + i )]; - x[2 * ( cnt + i * n1 ) + 1] = tmp[2 * ( cnt * n2 + i ) + 1]; + x[shl( add( cnt, i_mult( i, n1 ) ), 1 )] = tmp[shl( add( i_mult( cnt, n2 ), i ), 1 )]; + move32(); + x[add( shl( add( cnt, i_mult( i, n1 ) ), 1 ), 1 )] = tmp[add( shl( add( i_mult( cnt, n2 ), i ), 1 ), 1 )]; + move32(); } } FOR( cnt = 0; cnt < length; cnt += n1 ) { - pfaDFT( x + 2 * cnt, n1, tmp, numFactors - 1, &factor[1] ); + pfaDFT( x + 2 * cnt, n1, tmp, sub( numFactors, 1 ), &factor[1] ); } idx = 0; + move16(); cnt = 0; + move16(); FOR( i = 0; i < n2; i++ ) { - idx = i * n1; + idx = i_mult( i, n1 ); FOR( ii = 0; ii < n1; ii++ ) { - tmp[2 * idx] = x[cnt++]; - tmp[2 * idx + 1] = x[cnt++]; - idx += n2; + tmp[2 * idx] = x[cnt]; + move32(); + cnt = add( cnt, 1 ); + tmp[add( shl( idx, 1 ), 1 )] = x[cnt]; + move32(); + cnt = add( cnt, 1 ); + idx = add( idx, n2 ); IF( GT_16( idx, length ) ) { - idx -= length; + idx = sub( idx, length ); } } } FOR( cnt = 0; cnt < length; cnt++ ) { x[2 * cnt] = tmp[2 * cnt]; - x[2 * cnt + 1] = tmp[2 * cnt + 1]; + move32(); + x[add( shl( cnt, 1 ), 1 )] = tmp[add( shl( cnt, 1 ), 1 )]; + move32(); } } ELSE @@ -3405,11 +4165,14 @@ static void fftf_interleave( const Word16 len ) { Word16 i = 0; + move16(); FOR( i = 0; i < len; i++ ) { *out++ = *re++; + move32(); *out++ = *im++; + move32(); } return; @@ -3422,11 +4185,14 @@ static void fftf_deinterleave( const Word16 len ) { Word16 i = 0; + move16(); FOR( i = 0; i < len; i++ ) { *re++ = *in++; + move32(); *im++ = *in++; + move32(); } return; @@ -3439,6 +4205,9 @@ static void DoRTFT600( { Word32 scratch[1200], cmplx[1200]; Word16 factors[3] = { 25, 8, 3 }; + move16(); + move16(); + move16(); fftf_interleave( x, y, cmplx, 600 ); pfaDFT( cmplx, 600, scratch, 3, factors ); @@ -3454,6 +4223,8 @@ static void DoRTFT400( { Word32 scratch[800], cmplx[800]; Word16 factors[2] = { 25, 16 }; + move16(); + move16(); fftf_interleave( x, y, cmplx, 400 ); pfaDFT( cmplx, 400, scratch, 2, factors ); @@ -3470,6 +4241,9 @@ static void DoRTFT240( { Word32 scratch[480], cmplx[480]; Word16 factors[3] = { 16, 5, 3 }; + move16(); + move16(); + move16(); fftf_interleave( x, y, cmplx, 240 ); pfaDFT( cmplx, 240, scratch, 3, factors ); @@ -3485,6 +4259,8 @@ static void DoRTFT200( { Word32 scratch[400], cmplx[400]; Word16 factors[2] = { 25, 8 }; + move16(); + move16(); fftf_interleave( x, y, cmplx, 200 ); pfaDFT( cmplx, 200, scratch, 2, factors ); @@ -3500,6 +4276,8 @@ static void DoRTFT100( { Word32 scratch[200], cmplx[200]; Word16 factors[2] = { 25, 4 }; + move16(); + move16(); fftf_interleave( x, y, cmplx, 100 ); pfaDFT( cmplx, 100, scratch, 2, factors ); @@ -3585,6 +4363,7 @@ static void fft_len5( t = CL_scale( CL_sub( y1, y3 ), FFT_C54 ); y1 = CL_add( y1, y3 ); x[0] = CL_add( x[0], y1 ); + move64(); y1 = CL_add( x[0], CL_shl( CL_scale( y1, FFT_C55 ), 1 ) ); y3 = CL_sub( y1, t ); @@ -3595,9 +4374,13 @@ static void fft_len5( y2 = CL_add( t, CL_scale( y2, FFT_C53 ) ); x[1] = CL_msu_j( y1, y2 ); + move64(); x[4] = CL_mac_j( y1, y2 ); + move64(); x[2] = CL_mac_j( y3, y4 ); + move64(); x[3] = CL_msu_j( y3, y4 ); + move64(); return; } @@ -3608,36 +4391,63 @@ static void fft_len8( cmplx t[8], s[8]; t[0] = CL_add( x[0], x[4] ); + move64(); t[1] = CL_sub( x[0], x[4] ); + move64(); t[2] = CL_add( x[1], x[5] ); + move64(); t[3] = CL_sub( x[1], x[5] ); + move64(); t[4] = CL_add( x[2], x[6] ); + move64(); t[5] = CL_sub( x[2], x[6] ); + move64(); t[6] = CL_add( x[3], x[7] ); + move64(); t[7] = CL_sub( x[3], x[7] ); + move64(); s[0] = CL_add( t[0], t[4] ); + move64(); s[2] = CL_sub( t[0], t[4] ); + move64(); s[4] = CL_mac_j( t[1], t[5] ); + move64(); s[5] = CL_msu_j( t[1], t[5] ); + move64(); s[1] = CL_add( t[2], t[6] ); + move64(); s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) ); + move64(); t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) ); + move64(); t[1] = CL_sub( t[3], t[7] ); + move64(); s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); + move64(); s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); + move64(); s[7] = CL_conjugate( s[7] ); + move64(); x[0] = CL_add( s[0], s[1] ); + move64(); x[4] = CL_sub( s[0], s[1] ); + move64(); x[2] = CL_sub( s[2], s[3] ); + move64(); x[6] = CL_add( s[2], s[3] ); + move64(); x[3] = CL_add( s[4], s[7] ); + move64(); x[7] = CL_sub( s[4], s[7] ); + move64(); x[1] = CL_add( s[5], s[6] ); + move64(); x[5] = CL_sub( s[5], s[6] ); + move64(); return; } @@ -3650,58 +4460,100 @@ static void fft_len10( cmplx y[10]; s[0] = CL_add( x[6], x[4] ); + move64(); s[3] = CL_sub( x[6], x[4] ); + move64(); s[2] = CL_add( x[2], x[8] ); + move64(); s[1] = CL_sub( x[2], x[8] ); + move64(); t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); s[0] = CL_add( s[0], s[2] ); + move64(); y[0] = CL_add( x[0], s[0] ); + move64(); s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); + move64(); s[2] = CL_sub( s[0], t ); + move64(); s[0] = CL_add( s[0], t ); + move64(); t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); + move64(); s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); + move64(); s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); + move64(); y[2] = CL_msu_j( s[0], s[1] ); + move64(); y[8] = CL_mac_j( s[0], s[1] ); + move64(); y[4] = CL_mac_j( s[2], s[3] ); + move64(); y[6] = CL_msu_j( s[2], s[3] ); + move64(); s[0] = CL_add( x[1], x[9] ); + move64(); s[3] = CL_sub( x[1], x[9] ); + move64(); s[2] = CL_add( x[7], x[3] ); + move64(); s[1] = CL_sub( x[7], x[3] ); + move64(); t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); s[0] = CL_add( s[0], s[2] ); + move64(); y[1] = CL_add( x[5], s[0] ); + move64(); s[0] = CL_add( y[1], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); + move64(); s[2] = CL_sub( s[0], t ); + move64(); s[0] = CL_add( s[0], t ); + move64(); t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); + move64(); s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); + move64(); y[3] = CL_msu_j( s[0], s[1] ); + move64(); y[9] = CL_mac_j( s[0], s[1] ); + move64(); + move64(); y[5] = CL_mac_j( s[2], s[3] ); + move64(); y[7] = CL_msu_j( s[2], s[3] ); + move64(); x[0] = CL_add( y[0], y[1] ); + move64(); x[5] = CL_sub( y[0], y[1] ); + move64(); x[2] = CL_add( y[2], y[3] ); + move64(); x[7] = CL_sub( y[2], y[3] ); + move64(); x[4] = CL_add( y[4], y[5] ); + move64(); x[9] = CL_sub( y[4], y[5] ); + move64(); x[6] = CL_add( y[6], y[7] ); + move64(); x[1] = CL_sub( y[6], y[7] ); + move64(); x[8] = CL_add( y[8], y[9] ); + move64(); x[3] = CL_sub( y[8], y[9] ); + move64(); return; } @@ -3714,101 +4566,176 @@ static void fft_len15( cmplx y[15]; s[0] = CL_add( x[3], x[12] ); + move64(); s[3] = CL_sub( x[3], x[12] ); + move64(); s[2] = CL_add( x[6], x[9] ); + move64(); s[1] = CL_sub( x[6], x[9] ); + move64(); t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); s[0] = CL_add( s[0], s[2] ); + move64(); y[0] = CL_add( x[0], s[0] ); + move64(); s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); + move64(); s[2] = CL_sub( s[0], t ); + move64(); s[0] = CL_add( s[0], t ); + move64(); t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); + move64(); s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); + move64(); y[1] = CL_msu_j( s[0], s[1] ); + move64(); y[4] = CL_mac_j( s[0], s[1] ); + move64(); y[2] = CL_mac_j( s[2], s[3] ); + move64(); y[3] = CL_msu_j( s[2], s[3] ); + move64(); s[0] = CL_add( x[8], x[2] ); + move64(); s[3] = CL_sub( x[8], x[2] ); + move64(); s[2] = CL_add( x[11], x[14] ); + move64(); s[1] = CL_sub( x[11], x[14] ); + move64(); t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); s[0] = CL_add( s[0], s[2] ); + move64(); y[5] = CL_add( x[5], s[0] ); + move64(); s[0] = CL_add( y[5], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); + move64(); s[2] = CL_sub( s[0], t ); + move64(); s[0] = CL_add( s[0], t ); + move64(); t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); + move64(); s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); + move64(); y[6] = CL_msu_j( s[0], s[1] ); + move64(); y[9] = CL_mac_j( s[0], s[1] ); + move64(); y[7] = CL_mac_j( s[2], s[3] ); + move64(); y[8] = CL_msu_j( s[2], s[3] ); + move64(); s[0] = CL_add( x[13], x[7] ); + move64(); s[3] = CL_sub( x[13], x[7] ); + move64(); s[2] = CL_add( x[1], x[4] ); + move64(); s[1] = CL_sub( x[1], x[4] ); + move64(); t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); s[0] = CL_add( s[0], s[2] ); + move64(); y[10] = CL_add( x[10], s[0] ); + move64(); s[0] = CL_add( y[10], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); + move64(); s[2] = CL_sub( s[0], t ); + move64(); s[0] = CL_add( s[0], t ); + move64(); t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); + move64(); s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); + move64(); y[11] = CL_msu_j( s[0], s[1] ); + move64(); y[14] = CL_mac_j( s[0], s[1] ); + move64(); y[12] = CL_mac_j( s[2], s[3] ); + move64(); y[13] = CL_msu_j( s[2], s[3] ); + move64(); s[0] = CL_add( y[5], y[10] ); + move64(); s[1] = CL_scale( CL_sub( y[5], y[10] ), FFT_C31 ); + move64(); x[0] = CL_add( y[0], s[0] ); + move64(); s[0] = CL_sub( y[0], CL_shr( s[0], 1 ) ); + move64(); x[10] = CL_mac_j( s[0], s[1] ); + move64(); x[5] = CL_msu_j( s[0], s[1] ); + move64(); s[0] = CL_add( y[6], y[11] ); + move64(); s[1] = CL_scale( CL_sub( y[6], y[11] ), FFT_C31 ); + move64(); x[6] = CL_add( y[1], s[0] ); + move64(); s[0] = CL_sub( y[1], CL_shr( s[0], 1 ) ); + move64(); x[1] = CL_mac_j( s[0], s[1] ); + move64(); x[11] = CL_msu_j( s[0], s[1] ); + move64(); s[0] = CL_add( y[7], y[12] ); + move64(); s[1] = CL_scale( CL_sub( y[7], y[12] ), FFT_C31 ); + move64(); x[12] = CL_add( y[2], s[0] ); + move64(); s[0] = CL_sub( y[2], CL_shr( s[0], 1 ) ); + move64(); x[7] = CL_mac_j( s[0], s[1] ); + move64(); x[2] = CL_msu_j( s[0], s[1] ); + move64(); s[0] = CL_add( y[8], y[13] ); + move64(); s[1] = CL_scale( CL_sub( y[8], y[13] ), FFT_C31 ); + move64(); x[3] = CL_add( y[3], s[0] ); + move64(); s[0] = CL_sub( y[3], CL_shr( s[0], 1 ) ); + move64(); x[13] = CL_mac_j( s[0], s[1] ); + move64(); x[8] = CL_msu_j( s[0], s[1] ); + move64(); s[0] = CL_add( y[9], y[14] ); + move64(); s[1] = CL_scale( CL_sub( y[9], y[14] ), FFT_C31 ); + move64(); x[9] = CL_add( y[4], s[0] ); + move64(); s[0] = CL_sub( y[4], CL_shr( s[0], 1 ) ); + move64(); x[4] = CL_mac_j( s[0], s[1] ); + move64(); x[14] = CL_msu_j( s[0], s[1] ); + move64(); return; } @@ -3821,137 +4748,242 @@ static void fft_len16( cmplx y[16]; s[0] = CL_shr( x[0], SCALEFACTOR16 ); + move64(); s[1] = CL_shr( x[4], SCALEFACTOR16 ); + move64(); s[2] = CL_shr( x[8], SCALEFACTOR16 ); + move64(); s[3] = CL_shr( x[12], SCALEFACTOR16 ); + move64(); t[0] = CL_add( s[0], s[2] ); + move64(); t[1] = CL_sub( s[0], s[2] ); + move64(); t[2] = CL_add( s[1], s[3] ); + move64(); t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) ); + move64(); y[0] = CL_add( t[0], t[2] ); + move64(); y[1] = CL_sub( t[1], t[3] ); + move64(); y[2] = CL_sub( t[0], t[2] ); + move64(); y[3] = CL_add( t[1], t[3] ); + move64(); s[0] = CL_shr( x[1], SCALEFACTOR16 ); + move64(); s[1] = CL_shr( x[5], SCALEFACTOR16 ); + move64(); s[2] = CL_shr( x[9], SCALEFACTOR16 ); + move64(); s[3] = CL_shr( x[13], SCALEFACTOR16 ); + move64(); t[0] = CL_add( s[0], s[2] ); + move64(); t[1] = CL_sub( s[0], s[2] ); + move64(); t[2] = CL_add( s[1], s[3] ); + move64(); t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) ); + move64(); y[4] = CL_add( t[0], t[2] ); + move64(); y[5] = CL_sub( t[1], t[3] ); + move64(); y[6] = CL_sub( t[0], t[2] ); + move64(); y[7] = CL_add( t[1], t[3] ); + move64(); s[0] = CL_shr( x[2], SCALEFACTOR16 ); + move64(); s[1] = CL_shr( x[6], SCALEFACTOR16 ); + move64(); s[2] = CL_shr( x[10], SCALEFACTOR16 ); + move64(); s[3] = CL_shr( x[14], SCALEFACTOR16 ); + move64(); t[0] = CL_add( s[0], s[2] ); + move64(); t[1] = CL_sub( s[0], s[2] ); + move64(); t[2] = CL_add( s[1], s[3] ); + move64(); t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) ); + move64(); y[8] = CL_add( t[0], t[2] ); + move64(); y[9] = CL_sub( t[1], t[3] ); + move64(); y[10] = CL_swap_real_imag( CL_sub( t[0], t[2] ) ); + move64(); y[10] = CL_conjugate( y[10] ); + move64(); y[11] = CL_add( t[1], t[3] ); + move64(); s[0] = CL_shr( x[3], SCALEFACTOR16 ); + move64(); s[1] = CL_shr( x[7], SCALEFACTOR16 ); + move64(); s[2] = CL_shr( x[11], SCALEFACTOR16 ); + move64(); s[3] = CL_shr( x[15], SCALEFACTOR16 ); + move64(); t[0] = CL_add( s[0], s[2] ); + move64(); t[1] = CL_sub( s[0], s[2] ); + move64(); t[2] = CL_add( s[1], s[3] ); + move64(); t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) ); + move64(); y[12] = CL_add( t[0], t[2] ); + move64(); y[13] = CL_sub( t[1], t[3] ); + move64(); y[14] = CL_sub( t[0], t[2] ); + move64(); y[15] = CL_add( t[1], t[3] ); + move64(); s[0] = CL_scale( y[11], FFT_C162 ); + move64(); y[11] = CL_mac_j( s[0], s[0] ); + move64(); s[0] = CL_scale( y[14], FFT_C162 ); + move64(); y[14] = CL_mac_j( s[0], s[0] ); + move64(); s[0] = CL_scale( y[6], FFT_C161 ); + move64(); y[6] = CL_mac_j( s[0], s[0] ); + move64(); y[6] = CL_swap_real_imag( y[6] ); + move64(); y[6] = CL_conjugate( y[6] ); + move64(); s[0] = CL_scale( y[9], FFT_C161 ); + move64(); y[9] = CL_mac_j( s[0], s[0] ); + move64(); y[9] = CL_swap_real_imag( y[9] ); + move64(); y[9] = CL_conjugate( y[9] ); + move64(); s[0] = CL_scale( y[5], FFT_C163 ); + move64(); s[1] = CL_scale( y[5], FFT_C166 ); + move64(); y[5] = CL_mac_j( s[0], s[1] ); + move64(); s[0] = CL_scale( y[7], FFT_C165 ); + move64(); s[1] = CL_scale( y[7], FFT_C164 ); + move64(); y[7] = CL_mac_j( s[0], s[1] ); + move64(); s[0] = CL_scale( y[13], FFT_C165 ); + move64(); s[1] = CL_scale( y[13], FFT_C164 ); + move64(); y[13] = CL_mac_j( s[0], s[1] ); + move64(); s[0] = CL_scale( y[15], FFT_C164 ); + move64(); s[1] = CL_scale( y[15], FFT_C165 ); + move64(); y[15] = CL_mac_j( s[0], s[1] ); + move64(); t[0] = CL_add( y[0], y[8] ); + move64(); t[1] = CL_sub( y[0], y[8] ); + move64(); t[2] = CL_add( y[4], y[12] ); + move64(); t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[4] ), CL_conjugate( y[12] ) ) ); + move64(); x[0] = CL_add( t[0], t[2] ); + move64(); x[4] = CL_sub( t[1], t[3] ); + move64(); x[8] = CL_sub( t[0], t[2] ); + move64(); x[12] = CL_add( t[1], t[3] ); + move64(); t[0] = CL_add( y[1], y[9] ); + move64(); t[1] = CL_sub( y[1], y[9] ); + move64(); t[2] = CL_add( y[5], y[13] ); + move64(); t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[5] ), CL_conjugate( y[13] ) ) ); + move64(); x[1] = CL_add( t[0], t[2] ); + move64(); x[5] = CL_sub( t[1], t[3] ); + move64(); x[9] = CL_sub( t[0], t[2] ); + move64(); x[13] = CL_add( t[1], t[3] ); + move64(); t[0] = CL_add( y[2], y[10] ); + move64(); t[1] = CL_sub( y[2], y[10] ); + move64(); t[2] = CL_add( y[6], y[14] ); + move64(); t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[6] ), CL_conjugate( y[14] ) ) ); + move64(); x[2] = CL_add( t[0], t[2] ); + move64(); x[6] = CL_sub( t[1], t[3] ); + move64(); x[10] = CL_sub( t[0], t[2] ); + move64(); x[14] = CL_add( t[1], t[3] ); + move64(); t[0] = CL_add( y[3], y[11] ); + move64(); t[1] = CL_sub( y[3], y[11] ); + move64(); t[2] = CL_add( y[7], y[15] ); + move64(); t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[7] ), CL_conjugate( y[15] ) ) ); + move64(); x[3] = CL_add( t[0], t[2] ); + move64(); x[7] = CL_sub( t[1], t[3] ); + move64(); x[11] = CL_sub( t[0], t[2] ); + move64(); x[15] = CL_add( t[1], t[3] ); + move64(); return; } @@ -3966,154 +4998,274 @@ static void fft_len20_fx( cmplx y[20]; xx[0] = CL_shr( x[0], SCALEFACTOR20 ); + move64(); xx[1] = CL_shr( x[16], SCALEFACTOR20 ); + move64(); xx[2] = CL_shr( x[12], SCALEFACTOR20 ); + move64(); xx[3] = CL_shr( x[8], SCALEFACTOR20 ); + move64(); xx[4] = CL_shr( x[4], SCALEFACTOR20 ); + move64(); s[0] = CL_add( xx[1], xx[4] ); + move64(); s[3] = CL_sub( xx[1], xx[4] ); + move64(); s[2] = CL_add( xx[2], xx[3] ); + move64(); s[1] = CL_sub( xx[2], xx[3] ); + move64(); t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); s[0] = CL_add( s[0], s[2] ); + move64(); y[0] = CL_add( xx[0], s[0] ); + move64(); s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); + move64(); s[2] = CL_sub( s[0], t ); + move64(); s[0] = CL_add( s[0], t ); + move64(); t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); + move64(); s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); + move64(); y[4] = CL_msu_j( s[0], s[1] ); + move64(); y[16] = CL_mac_j( s[0], s[1] ); + move64(); y[8] = CL_mac_j( s[2], s[3] ); + move64(); y[12] = CL_msu_j( s[2], s[3] ); + move64(); xx[0] = CL_shr( x[5], SCALEFACTOR20 ); + move64(); xx[1] = CL_shr( x[1], SCALEFACTOR20 ); + move64(); xx[2] = CL_shr( x[17], SCALEFACTOR20 ); + move64(); xx[3] = CL_shr( x[13], SCALEFACTOR20 ); + move64(); xx[4] = CL_shr( x[9], SCALEFACTOR20 ); + move64(); s[0] = CL_add( xx[1], xx[4] ); + move64(); s[3] = CL_sub( xx[1], xx[4] ); + move64(); s[2] = CL_add( xx[2], xx[3] ); + move64(); s[1] = CL_sub( xx[2], xx[3] ); + move64(); t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); s[0] = CL_add( s[0], s[2] ); + move64(); y[1] = CL_add( xx[0], s[0] ); + move64(); s[0] = CL_add( y[1], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); + move64(); s[2] = CL_sub( s[0], t ); + move64(); s[0] = CL_add( s[0], t ); + move64(); t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); + move64(); s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); + move64(); y[5] = CL_msu_j( s[0], s[1] ); + move64(); y[17] = CL_mac_j( s[0], s[1] ); + move64(); y[9] = CL_mac_j( s[2], s[3] ); + move64(); y[13] = CL_msu_j( s[2], s[3] ); + move64(); xx[0] = CL_shr( x[10], SCALEFACTOR20 ); + move64(); xx[1] = CL_shr( x[6], SCALEFACTOR20 ); + move64(); xx[2] = CL_shr( x[2], SCALEFACTOR20 ); + move64(); xx[3] = CL_shr( x[18], SCALEFACTOR20 ); + move64(); xx[4] = CL_shr( x[14], SCALEFACTOR20 ); + move64(); s[0] = CL_add( xx[1], xx[4] ); + move64(); s[3] = CL_sub( xx[1], xx[4] ); + move64(); s[2] = CL_add( xx[2], xx[3] ); + move64(); s[1] = CL_sub( xx[2], xx[3] ); + move64(); t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); s[0] = CL_add( s[0], s[2] ); + move64(); y[2] = CL_add( xx[0], s[0] ); + move64(); s[0] = CL_add( y[2], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); + move64(); s[2] = CL_sub( s[0], t ); + move64(); s[0] = CL_add( s[0], t ); + move64(); t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); + move64(); s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); + move64(); y[6] = CL_msu_j( s[0], s[1] ); + move64(); y[18] = CL_mac_j( s[0], s[1] ); + move64(); y[10] = CL_mac_j( s[2], s[3] ); + move64(); y[14] = CL_msu_j( s[2], s[3] ); + move64(); xx[0] = CL_shr( x[15], SCALEFACTOR20 ); + move64(); xx[1] = CL_shr( x[11], SCALEFACTOR20 ); + move64(); xx[2] = CL_shr( x[7], SCALEFACTOR20 ); + move64(); xx[3] = CL_shr( x[3], SCALEFACTOR20 ); + move64(); xx[4] = CL_shr( x[19], SCALEFACTOR20 ); + move64(); s[0] = CL_add( xx[1], xx[4] ); + move64(); s[3] = CL_sub( xx[1], xx[4] ); + move64(); s[2] = CL_add( xx[2], xx[3] ); + move64(); s[1] = CL_sub( xx[2], xx[3] ); + move64(); t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); s[0] = CL_add( s[0], s[2] ); + move64(); y[3] = CL_add( xx[0], s[0] ); + move64(); s[0] = CL_add( y[3], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); + move64(); s[2] = CL_sub( s[0], t ); + move64(); s[0] = CL_add( s[0], t ); + move64(); t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); + move64(); s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); + move64(); y[7] = CL_msu_j( s[0], s[1] ); + move64(); y[19] = CL_mac_j( s[0], s[1] ); + move64(); y[11] = CL_mac_j( s[2], s[3] ); + move64(); y[15] = CL_msu_j( s[2], s[3] ); + move64(); tt[0] = CL_add( y[0], y[2] ); + move64(); tt[1] = CL_sub( y[0], y[2] ); + move64(); tt[2] = CL_add( y[1], y[3] ); + move64(); tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[1], y[3] ) ) ); + move64(); x[0] = CL_add( tt[0], tt[2] ); + move64(); x[5] = CL_sub( tt[1], tt[3] ); + move64(); x[10] = CL_sub( tt[0], tt[2] ); + move64(); x[15] = CL_add( tt[1], tt[3] ); + move64(); tt[0] = CL_add( y[4], y[6] ); + move64(); tt[1] = CL_sub( y[4], y[6] ); + move64(); tt[2] = CL_add( y[5], y[7] ); + move64(); tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[5], y[7] ) ) ); + move64(); x[4] = CL_add( tt[0], tt[2] ); + move64(); x[9] = CL_sub( tt[1], tt[3] ); + move64(); x[14] = CL_sub( tt[0], tt[2] ); + move64(); x[19] = CL_add( tt[1], tt[3] ); + move64(); tt[0] = CL_add( y[8], y[10] ); + move64(); tt[1] = CL_sub( y[8], y[10] ); + move64(); tt[2] = CL_add( y[9], y[11] ); + move64(); tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[9], y[11] ) ) ); + move64(); x[8] = CL_add( tt[0], tt[2] ); + move64(); x[13] = CL_sub( tt[1], tt[3] ); + move64(); x[18] = CL_sub( tt[0], tt[2] ); + move64(); x[3] = CL_add( tt[1], tt[3] ); + move64(); tt[0] = CL_add( y[12], y[14] ); + move64(); tt[1] = CL_sub( y[12], y[14] ); + move64(); tt[2] = CL_add( y[13], y[15] ); + move64(); tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[13], y[15] ) ) ); + move64(); x[12] = CL_add( tt[0], tt[2] ); + move64(); x[17] = CL_sub( tt[1], tt[3] ); + move64(); x[2] = CL_sub( tt[0], tt[2] ); + move64(); x[7] = CL_add( tt[1], tt[3] ); + move64(); tt[0] = CL_add( y[16], y[18] ); + move64(); tt[1] = CL_sub( y[16], y[18] ); + move64(); tt[2] = CL_add( y[17], y[19] ); + move64(); tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[17], y[19] ) ) ); + move64(); x[16] = CL_add( tt[0], tt[2] ); + move64(); x[1] = CL_sub( tt[1], tt[3] ); + move64(); x[6] = CL_sub( tt[0], tt[2] ); + move64(); x[11] = CL_add( tt[1], tt[3] ); + move64(); return; } @@ -4132,323 +5284,561 @@ static void fft_len30( h = &x[15]; xx[0] = x[0]; + move64(); xx[1] = x[18]; + move64(); xx[2] = x[6]; + move64(); xx[3] = x[24]; + move64(); xx[4] = x[12]; + move64(); xx[5] = x[20]; + move64(); xx[6] = x[8]; + move64(); xx[7] = x[26]; + move64(); xx[8] = x[14]; + move64(); xx[9] = x[2]; + move64(); xx[10] = x[10]; + move64(); xx[11] = x[28]; + move64(); xx[12] = x[16]; + move64(); xx[13] = x[4]; + move64(); xx[14] = x[22]; + move64(); s[0] = CL_add( xx[1], xx[4] ); + move64(); s[3] = CL_sub( xx[1], xx[4] ); + move64(); s[2] = CL_add( xx[2], xx[3] ); + move64(); s[1] = CL_sub( xx[2], xx[3] ); + move64(); t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); s[0] = CL_add( s[0], s[2] ); + move64(); y[0] = CL_add( xx[0], s[0] ); s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); + move64(); s[2] = CL_sub( s[0], t ); + move64(); s[0] = CL_add( s[0], t ); + move64(); t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); + move64(); s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); + move64(); y[1] = CL_msu_j( s[0], s[1] ); + move64(); y[4] = CL_mac_j( s[0], s[1] ); + move64(); y[2] = CL_mac_j( s[2], s[3] ); + move64(); y[3] = CL_msu_j( s[2], s[3] ); + move64(); s[0] = CL_add( xx[6], xx[9] ); + move64(); s[3] = CL_sub( xx[6], xx[9] ); + move64(); s[2] = CL_add( xx[7], xx[8] ); + move64(); s[1] = CL_sub( xx[7], xx[8] ); + move64(); t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); s[0] = CL_add( s[0], s[2] ); + move64(); y[5] = CL_add( xx[5], s[0] ); + move64(); s[0] = CL_add( y[5], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); + move64(); s[2] = CL_sub( s[0], t ); + move64(); s[0] = CL_add( s[0], t ); + move64(); t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); + move64(); s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); + move64(); y[6] = CL_msu_j( s[0], s[1] ); + move64(); y[9] = CL_mac_j( s[0], s[1] ); + move64(); y[7] = CL_mac_j( s[2], s[3] ); + move64(); y[8] = CL_msu_j( s[2], s[3] ); + move64(); s[0] = CL_add( xx[11], xx[14] ); + move64(); s[3] = CL_sub( xx[11], xx[14] ); + move64(); s[2] = CL_add( xx[12], xx[13] ); + move64(); s[1] = CL_sub( xx[12], xx[13] ); + move64(); t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); s[0] = CL_add( s[0], s[2] ); + move64(); y[10] = CL_add( xx[10], s[0] ); + move64(); s[0] = CL_add( y[10], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); s[2] = CL_sub( s[0], t ); + move64(); s[0] = CL_add( s[0], t ); + move64(); t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); + move64(); s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); + move64(); y[11] = CL_msu_j( s[0], s[1] ); + move64(); y[14] = CL_mac_j( s[0], s[1] ); + move64(); y[12] = CL_mac_j( s[2], s[3] ); + move64(); y[13] = CL_msu_j( s[2], s[3] ); + move64(); s[0] = CL_add( y[5], y[10] ); + move64(); s[1] = CL_scale( CL_sub( y[5], y[10] ), FFT_C31 ); + move64(); z[0] = CL_add( y[0], s[0] ); + move64(); s[0] = CL_sub( y[0], CL_shr( s[0], 1 ) ); + move64(); z[10] = CL_mac_j( s[0], s[1] ); + move64(); z[5] = CL_msu_j( s[0], s[1] ); + move64(); s[0] = CL_add( y[6], y[11] ); + move64(); s[1] = CL_scale( CL_sub( y[6], y[11] ), FFT_C31 ); + move64(); z[6] = CL_add( y[1], s[0] ); + move64(); s[0] = CL_sub( y[1], CL_shr( s[0], 1 ) ); + move64(); z[1] = CL_mac_j( s[0], s[1] ); + move64(); z[11] = CL_msu_j( s[0], s[1] ); + move64(); s[0] = CL_add( y[7], y[12] ); + move64(); s[1] = CL_scale( CL_sub( y[7], y[12] ), FFT_C31 ); + move64(); z[12] = CL_add( y[2], s[0] ); + move64(); s[0] = CL_sub( y[2], CL_shr( s[0], 1 ) ); + move64(); z[7] = CL_mac_j( s[0], s[1] ); + move64(); z[2] = CL_msu_j( s[0], s[1] ); + move64(); s[0] = CL_add( y[8], y[13] ); + move64(); s[1] = CL_scale( CL_sub( y[8], y[13] ), FFT_C31 ); + move64(); z[3] = CL_add( y[3], s[0] ); + move64(); s[0] = CL_sub( y[3], CL_shr( s[0], 1 ) ); + move64(); z[13] = CL_mac_j( s[0], s[1] ); + move64(); z[8] = CL_msu_j( s[0], s[1] ); + move64(); s[0] = CL_add( y[9], y[14] ); + move64(); s[1] = CL_scale( CL_sub( y[9], y[14] ), FFT_C31 ); + move64(); z[9] = CL_add( y[4], s[0] ); + move64(); s[0] = CL_sub( y[4], CL_shr( s[0], 1 ) ); + move64(); z[4] = CL_mac_j( s[0], s[1] ); + move64(); z[14] = CL_msu_j( s[0], s[1] ); + move64(); xx[0] = x[15]; + move64(); xx[1] = x[3]; + move64(); xx[2] = x[21]; + move64(); xx[3] = x[9]; + move64(); xx[4] = x[27]; + move64(); xx[5] = x[5]; + move64(); xx[6] = x[23]; + move64(); xx[7] = x[11]; + move64(); xx[8] = x[29]; + move64(); xx[9] = x[17]; + move64(); xx[10] = x[25]; + move64(); xx[11] = x[13]; + move64(); xx[12] = x[1]; + move64(); xx[13] = x[19]; + move64(); xx[14] = x[7]; + move64(); s[0] = CL_add( xx[1], xx[4] ); + move64(); s[3] = CL_sub( xx[1], xx[4] ); + move64(); s[2] = CL_add( xx[2], xx[3] ); + move64(); s[1] = CL_sub( xx[2], xx[3] ); + move64(); t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); s[0] = CL_add( s[0], s[2] ); + move64(); y[0] = CL_add( xx[0], s[0] ); + move64(); s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); + move64(); s[2] = CL_sub( s[0], t ); + move64(); s[0] = CL_add( s[0], t ); + move64(); t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); + move64(); s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); + move64(); y[1] = CL_msu_j( s[0], s[1] ); + move64(); y[4] = CL_mac_j( s[0], s[1] ); + move64(); y[2] = CL_mac_j( s[2], s[3] ); + move64(); y[3] = CL_msu_j( s[2], s[3] ); + move64(); s[0] = CL_add( xx[6], xx[9] ); + move64(); s[3] = CL_sub( xx[6], xx[9] ); + move64(); s[2] = CL_add( xx[7], xx[8] ); + move64(); s[1] = CL_sub( xx[7], xx[8] ); + move64(); t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); s[0] = CL_add( s[0], s[2] ); + move64(); y[5] = CL_add( xx[5], s[0] ); + move64(); s[0] = CL_add( y[5], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); + move64(); s[2] = CL_sub( s[0], t ); + move64(); s[0] = CL_add( s[0], t ); + move64(); t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); + move64(); s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); + move64(); y[6] = CL_msu_j( s[0], s[1] ); + move64(); y[9] = CL_mac_j( s[0], s[1] ); + move64(); y[7] = CL_mac_j( s[2], s[3] ); + move64(); y[8] = CL_msu_j( s[2], s[3] ); + move64(); s[0] = CL_add( xx[11], xx[14] ); + move64(); s[3] = CL_sub( xx[11], xx[14] ); + move64(); s[2] = CL_add( xx[12], xx[13] ); + move64(); s[1] = CL_sub( xx[12], xx[13] ); + move64(); t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); s[0] = CL_add( s[0], s[2] ); + move64(); y[10] = CL_add( xx[10], s[0] ); + move64(); s[0] = CL_add( y[10], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); + move64(); s[2] = CL_sub( s[0], t ); + move64(); s[0] = CL_add( s[0], t ); + move64(); t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); + move64(); s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); + move64(); y[11] = CL_msu_j( s[0], s[1] ); + move64(); y[14] = CL_mac_j( s[0], s[1] ); + move64(); y[12] = CL_mac_j( s[2], s[3] ); + move64(); y[13] = CL_msu_j( s[2], s[3] ); + move64(); s[0] = CL_add( y[5], y[10] ); + move64(); s[1] = CL_scale( CL_sub( y[5], y[10] ), FFT_C31 ); + move64(); z[15] = CL_add( y[0], s[0] ); + move64(); s[0] = CL_sub( y[0], CL_shr( s[0], 1 ) ); + move64(); z[25] = CL_mac_j( s[0], s[1] ); + move64(); z[20] = CL_msu_j( s[0], s[1] ); + move64(); s[0] = CL_add( y[6], y[11] ); + move64(); s[1] = CL_scale( CL_sub( y[6], y[11] ), FFT_C31 ); + move64(); z[21] = CL_add( y[1], s[0] ); + move64(); s[0] = CL_sub( y[1], CL_shr( s[0], 1 ) ); + move64(); z[16] = CL_mac_j( s[0], s[1] ); + move64(); z[26] = CL_msu_j( s[0], s[1] ); + move64(); s[0] = CL_add( y[7], y[12] ); + move64(); s[1] = CL_scale( CL_sub( y[7], y[12] ), FFT_C31 ); + move64(); z[27] = CL_add( y[2], s[0] ); + move64(); s[0] = CL_sub( y[2], CL_shr( s[0], 1 ) ); + move64(); z[22] = CL_mac_j( s[0], s[1] ); + move64(); z[17] = CL_msu_j( s[0], s[1] ); + move64(); s[0] = CL_add( y[8], y[13] ); + move64(); s[1] = CL_scale( CL_sub( y[8], y[13] ), FFT_C31 ); + move64(); z[18] = CL_add( y[3], s[0] ); + move64(); s[0] = CL_sub( y[3], CL_shr( s[0], 1 ) ); + move64(); z[28] = CL_mac_j( s[0], s[1] ); + move64(); z[23] = CL_msu_j( s[0], s[1] ); + move64(); s[0] = CL_add( y[9], y[14] ); + move64(); s[1] = CL_scale( CL_sub( y[9], y[14] ), FFT_C31 ); + move64(); z[24] = CL_add( y[4], s[0] ); + move64(); s[0] = CL_sub( y[4], CL_shr( s[0], 1 ) ); + move64(); z[19] = CL_mac_j( s[0], s[1] ); + move64(); z[29] = CL_msu_j( s[0], s[1] ); + move64(); s[0] = z[0]; + move64(); s[1] = z[15]; + move64(); *l = CL_add( s[0], s[1] ); + move64(); *h = CL_sub( s[0], s[1] ); + move64(); l += 1, h += 1; s[0] = z[8]; + move64(); s[1] = z[23]; + move64(); *h = CL_add( s[0], s[1] ); + move64(); *l = CL_sub( s[0], s[1] ); + move64(); l += 1, h += 1; s[0] = z[1]; + move64(); s[1] = z[16]; + move64(); *l = CL_add( s[0], s[1] ); + move64(); *h = CL_sub( s[0], s[1] ); + move64(); l += 1, h += 1; s[0] = z[9]; + move64(); s[1] = z[24]; + move64(); *h = CL_add( s[0], s[1] ); + move64(); *l = CL_sub( s[0], s[1] ); + move64(); l += 1, h += 1; s[0] = z[2]; + move64(); s[1] = z[17]; + move64(); *l = CL_add( s[0], s[1] ); + move64(); *h = CL_sub( s[0], s[1] ); + move64(); l += 1, h += 1; s[0] = z[10]; + move64(); s[1] = z[25]; + move64(); *h = CL_add( s[0], s[1] ); + move64(); *l = CL_sub( s[0], s[1] ); + move64(); l += 1, h += 1; s[0] = z[3]; + move64(); s[1] = z[18]; + move64(); *l = CL_add( s[0], s[1] ); + move64(); *h = CL_sub( s[0], s[1] ); + move64(); l += 1, h += 1; s[0] = z[11]; + move64(); s[1] = z[26]; + move64(); *h = CL_add( s[0], s[1] ); + move64(); *l = CL_sub( s[0], s[1] ); + move64(); l += 1, h += 1; s[0] = z[4]; + move64(); s[1] = z[19]; + move64(); *l = CL_add( s[0], s[1] ); + move64(); *h = CL_sub( s[0], s[1] ); + move64(); l += 1, h += 1; s[0] = z[12]; + move64(); s[1] = z[27]; + move64(); *h = CL_add( s[0], s[1] ); + move64(); *l = CL_sub( s[0], s[1] ); + move64(); l += 1, h += 1; s[0] = z[5]; + move64(); s[1] = z[20]; + move64(); *l = CL_add( s[0], s[1] ); + move64(); *h = CL_sub( s[0], s[1] ); + move64(); l += 1, h += 1; s[0] = z[13]; + move64(); s[1] = z[28]; + move64(); *h = CL_add( s[0], s[1] ); + move64(); *l = CL_sub( s[0], s[1] ); + move64(); l += 1, h += 1; s[0] = z[6]; + move64(); s[1] = z[21]; + move64(); *l = CL_add( s[0], s[1] ); + move64(); *h = CL_sub( s[0], s[1] ); + move64(); l += 1, h += 1; s[0] = z[14]; + move64(); s[1] = z[29]; + move64(); *h = CL_add( s[0], s[1] ); + move64(); *l = CL_sub( s[0], s[1] ); + move64(); l += 1, h += 1; s[0] = z[7]; + move64(); s[1] = z[22]; + move64(); *l = CL_add( s[0], s[1] ); + move64(); *h = CL_sub( s[0], s[1] ); + move64(); l += 1, h += 1; return; @@ -4462,333 +5852,577 @@ static void fft_len32( cmplx ab; xx[0] = x[0]; + move64(); xx[1] = x[4]; + move64(); xx[2] = x[8]; + move64(); xx[3] = x[12]; + move64(); xx[4] = x[16]; + move64(); xx[5] = x[20]; + move64(); xx[6] = x[24]; + move64(); xx[7] = x[28]; + move64(); t[0] = CL_add( xx[0], xx[4] ); + move64(); t[1] = CL_sub( xx[0], xx[4] ); + move64(); t[2] = CL_add( xx[1], xx[5] ); + move64(); t[3] = CL_sub( xx[1], xx[5] ); + move64(); t[4] = CL_add( xx[2], xx[6] ); + move64(); t[5] = CL_sub( xx[2], xx[6] ); + move64(); t[6] = CL_add( xx[3], xx[7] ); + move64(); t[7] = CL_sub( xx[3], xx[7] ); + move64(); s[0] = CL_add( t[0], t[4] ); + move64(); s[2] = CL_sub( t[0], t[4] ); + move64(); s[4] = CL_mac_j( t[1], t[5] ); + move64(); s[5] = CL_msu_j( t[1], t[5] ); + move64(); s[1] = CL_add( t[2], t[6] ); + move64(); s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) ); + move64(); t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) ); + move64(); t[1] = CL_sub( t[3], t[7] ); + move64(); { s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); + move64(); s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); + move64(); s[7] = CL_conjugate( s[7] ); + move64(); }; y[0] = CL_add( s[0], s[1] ); + move64(); y[4] = CL_sub( s[0], s[1] ); + move64(); y[2] = CL_sub( s[2], s[3] ); + move64(); y[6] = CL_add( s[2], s[3] ); + move64(); y[3] = CL_add( s[4], s[7] ); + move64(); y[7] = CL_sub( s[4], s[7] ); + move64(); y[1] = CL_add( s[5], s[6] ); + move64(); y[5] = CL_sub( s[5], s[6] ); + move64(); xx[0] = x[1]; + move64(); xx[1] = x[5]; + move64(); xx[2] = x[9]; + move64(); xx[3] = x[13]; + move64(); xx[4] = x[17]; + move64(); xx[5] = x[21]; + move64(); xx[6] = x[25]; + move64(); xx[7] = x[29]; + move64(); t[0] = CL_add( xx[0], xx[4] ); + move64(); t[1] = CL_sub( xx[0], xx[4] ); + move64(); t[2] = CL_add( xx[1], xx[5] ); + move64(); t[3] = CL_sub( xx[1], xx[5] ); + move64(); t[4] = CL_add( xx[2], xx[6] ); + move64(); t[5] = CL_sub( xx[2], xx[6] ); + move64(); t[6] = CL_add( xx[3], xx[7] ); + move64(); t[7] = CL_sub( xx[3], xx[7] ); + move64(); s[0] = CL_add( t[0], t[4] ); + move64(); s[2] = CL_sub( t[0], t[4] ); + move64(); s[4] = CL_mac_j( t[1], t[5] ); + move64(); s[5] = CL_msu_j( t[1], t[5] ); + move64(); s[1] = CL_add( t[2], t[6] ); + move64(); s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) ); + move64(); t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) ); + move64(); t[1] = CL_sub( t[3], t[7] ); + move64(); { s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); + move64(); s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); + move64(); s[7] = CL_conjugate( s[7] ); + move64(); }; y[8] = CL_add( s[0], s[1] ); + move64(); y[12] = CL_sub( s[0], s[1] ); + move64(); y[10] = CL_sub( s[2], s[3] ); + move64(); y[14] = CL_add( s[2], s[3] ); + move64(); y[11] = CL_add( s[4], s[7] ); + move64(); y[15] = CL_sub( s[4], s[7] ); + move64(); y[9] = CL_add( s[5], s[6] ); + move64(); y[13] = CL_sub( s[5], s[6] ); + move64(); xx[0] = x[2]; + move64(); xx[1] = x[6]; + move64(); xx[2] = x[10]; + move64(); xx[3] = x[14]; + move64(); xx[4] = x[18]; + move64(); xx[5] = x[22]; + move64(); xx[6] = x[26]; + move64(); xx[7] = x[30]; + move64(); t[0] = CL_add( xx[0], xx[4] ); + move64(); t[1] = CL_sub( xx[0], xx[4] ); + move64(); t[2] = CL_add( xx[1], xx[5] ); + move64(); t[3] = CL_sub( xx[1], xx[5] ); + move64(); t[4] = CL_add( xx[2], xx[6] ); + move64(); t[5] = CL_sub( xx[2], xx[6] ); + move64(); t[6] = CL_add( xx[3], xx[7] ); + move64(); t[7] = CL_sub( xx[3], xx[7] ); + move64(); s[0] = CL_add( t[0], t[4] ); + move64(); s[2] = CL_sub( t[0], t[4] ); + move64(); s[4] = CL_mac_j( t[1], t[5] ); + move64(); s[5] = CL_msu_j( t[1], t[5] ); + move64(); s[1] = CL_add( t[2], t[6] ); + move64(); s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) ); + move64(); t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) ); + move64(); t[1] = CL_sub( t[3], t[7] ); + move64(); { s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); + move64(); s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); + move64(); s[7] = CL_conjugate( s[7] ); + move64(); }; y[16] = CL_add( s[0], s[1] ); + move64(); y[20] = CL_sub( s[0], s[1] ); + move64(); y[18] = CL_sub( s[2], s[3] ); + move64(); y[22] = CL_add( s[2], s[3] ); + move64(); y[19] = CL_add( s[4], s[7] ); + move64(); y[23] = CL_sub( s[4], s[7] ); + move64(); y[17] = CL_add( s[5], s[6] ); + move64(); y[21] = CL_sub( s[5], s[6] ); + move64(); xx[0] = x[3]; + move64(); xx[1] = x[7]; + move64(); xx[2] = x[11]; + move64(); xx[3] = x[15]; + move64(); xx[4] = x[19]; + move64(); xx[5] = x[23]; + move64(); xx[6] = x[27]; + move64(); xx[7] = x[31]; + move64(); t[0] = CL_add( xx[0], xx[4] ); + move64(); t[1] = CL_sub( xx[0], xx[4] ); + move64(); t[2] = CL_add( xx[1], xx[5] ); + move64(); t[3] = CL_sub( xx[1], xx[5] ); + move64(); t[4] = CL_add( xx[2], xx[6] ); + move64(); t[5] = CL_sub( xx[2], xx[6] ); + move64(); t[6] = CL_add( xx[3], xx[7] ); + move64(); t[7] = CL_sub( xx[3], xx[7] ); + move64(); s[0] = CL_add( t[0], t[4] ); + move64(); s[2] = CL_sub( t[0], t[4] ); + move64(); s[4] = CL_mac_j( t[1], t[5] ); + move64(); s[5] = CL_msu_j( t[1], t[5] ); + move64(); s[1] = CL_add( t[2], t[6] ); + move64(); s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) ); + move64(); t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) ); + move64(); t[1] = CL_sub( t[3], t[7] ); + move64(); { s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); + move64(); s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); + move64(); s[7] = CL_conjugate( s[7] ); + move64(); }; y[24] = CL_add( s[0], s[1] ); + move64(); y[28] = CL_sub( s[0], s[1] ); + move64(); y[26] = CL_sub( s[2], s[3] ); + move64(); y[30] = CL_add( s[2], s[3] ); + move64(); y[27] = CL_add( s[4], s[7] ); + move64(); y[31] = CL_sub( s[4], s[7] ); + move64(); y[25] = CL_add( s[5], s[6] ); + move64(); y[29] = CL_sub( s[5], s[6] ); + move64(); { ab = y[9]; + move64(); y[9] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[0] ), CL_scale( ab, FFT_RotVector_32_fx[1] ) ); + move64(); }; { ab = y[10]; + move64(); y[10] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[2] ), CL_scale( ab, FFT_RotVector_32_fx[3] ) ); + move64(); }; { ab = y[11]; + move64(); y[11] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[4] ), CL_scale( ab, FFT_RotVector_32_fx[5] ) ); + move64(); }; { ab = y[12]; + move64(); y[12] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[6] ), CL_scale( ab, FFT_RotVector_32_fx[7] ) ); + move64(); }; { ab = y[13]; + move64(); y[13] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[8] ), CL_scale( ab, FFT_RotVector_32_fx[9] ) ); + move64(); }; { ab = y[14]; + move64(); y[14] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[10] ), CL_scale( ab, FFT_RotVector_32_fx[11] ) ); + move64(); }; { ab = y[15]; + move64(); y[15] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[12] ), CL_scale( ab, FFT_RotVector_32_fx[13] ) ); + move64(); }; { ab = y[17]; + move64(); y[17] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[14] ), CL_scale( ab, FFT_RotVector_32_fx[15] ) ); + move64(); }; { ab = y[18]; + move64(); y[18] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[16] ), CL_scale( ab, FFT_RotVector_32_fx[17] ) ); + move64(); }; { ab = y[19]; + move64(); y[19] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[18] ), CL_scale( ab, FFT_RotVector_32_fx[19] ) ); + move64(); }; { ab = y[21]; + move64(); y[21] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[20] ), CL_scale( ab, FFT_RotVector_32_fx[21] ) ); + move64(); }; { ab = y[22]; + move64(); y[22] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[22] ), CL_scale( ab, FFT_RotVector_32_fx[23] ) ); + move64(); }; { ab = y[23]; + move64(); y[23] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[24] ), CL_scale( ab, FFT_RotVector_32_fx[25] ) ); + move64(); }; { ab = y[25]; + move64(); y[25] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[26] ), CL_scale( ab, FFT_RotVector_32_fx[27] ) ); + move64(); }; { ab = y[26]; + move64(); y[26] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[28] ), CL_scale( ab, FFT_RotVector_32_fx[29] ) ); + move64(); }; { ab = y[27]; + move64(); y[27] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[30] ), CL_scale( ab, FFT_RotVector_32_fx[31] ) ); + move64(); }; { ab = y[28]; + move64(); y[28] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[32] ), CL_scale( ab, FFT_RotVector_32_fx[33] ) ); + move64(); }; { ab = y[29]; + move64(); y[29] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[34] ), CL_scale( ab, FFT_RotVector_32_fx[35] ) ); + move64(); }; { ab = y[30]; + move64(); y[30] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[36] ), CL_scale( ab, FFT_RotVector_32_fx[37] ) ); + move64(); }; { ab = y[31]; + move64(); y[31] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[38] ), CL_scale( ab, FFT_RotVector_32_fx[39] ) ); + move64(); }; t[0] = CL_add( y[0], y[16] ); + move64(); t[1] = CL_sub( y[0], y[16] ); + move64(); t[2] = CL_add( y[8], y[24] ); + move64(); t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[8] ), CL_conjugate( y[24] ) ) ); + move64(); x[0] = CL_add( t[0], t[2] ); + move64(); x[8] = CL_sub( t[1], t[3] ); + move64(); x[16] = CL_sub( t[0], t[2] ); + move64(); x[24] = CL_add( t[1], t[3] ); + move64(); t[0] = CL_add( y[1], y[17] ); + move64(); t[1] = CL_sub( y[1], y[17] ); + move64(); t[2] = CL_add( y[9], y[25] ); + move64(); t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[9] ), CL_conjugate( y[25] ) ) ); + move64(); x[1] = CL_add( t[0], t[2] ); + move64(); x[9] = CL_sub( t[1], t[3] ); + move64(); x[17] = CL_sub( t[0], t[2] ); + move64(); x[25] = CL_add( t[1], t[3] ); + move64(); t[0] = CL_add( y[2], y[18] ); + move64(); t[1] = CL_sub( y[2], y[18] ); + move64(); t[2] = CL_add( y[10], y[26] ); + move64(); t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[10] ), CL_conjugate( y[26] ) ) ); + move64(); x[2] = CL_add( t[0], t[2] ); + move64(); x[10] = CL_sub( t[1], t[3] ); + move64(); x[18] = CL_sub( t[0], t[2] ); + move64(); x[26] = CL_add( t[1], t[3] ); + move64(); t[0] = CL_add( y[3], y[19] ); + move64(); t[1] = CL_sub( y[3], y[19] ); + move64(); t[2] = CL_add( y[11], y[27] ); + move64(); t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[11] ), CL_conjugate( y[27] ) ) ); + move64(); x[3] = CL_add( t[0], t[2] ); + move64(); x[11] = CL_sub( t[1], t[3] ); + move64(); x[19] = CL_sub( t[0], t[2] ); + move64(); x[27] = CL_add( t[1], t[3] ); + move64(); t[0] = CL_msu_j( y[4], y[20] ); + move64(); t[1] = CL_mac_j( y[4], y[20] ); + move64(); t[2] = CL_add( y[12], y[28] ); + move64(); t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[12] ), CL_conjugate( y[28] ) ) ); + move64(); x[4] = CL_add( t[0], t[2] ); + move64(); x[12] = CL_sub( t[1], t[3] ); + move64(); x[20] = CL_sub( t[0], t[2] ); + move64(); x[28] = CL_add( t[1], t[3] ); + move64(); t[0] = CL_add( y[5], y[21] ); + move64(); t[1] = CL_sub( y[5], y[21] ); + move64(); t[2] = CL_add( y[13], y[29] ); + move64(); t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[13] ), CL_conjugate( y[29] ) ) ); + move64(); x[5] = CL_add( t[0], t[2] ); + move64(); x[13] = CL_sub( t[1], t[3] ); + move64(); x[21] = CL_sub( t[0], t[2] ); + move64(); x[29] = CL_add( t[1], t[3] ); + move64(); t[0] = CL_add( y[6], y[22] ); + move64(); t[1] = CL_sub( y[6], y[22] ); + move64(); t[2] = CL_add( y[14], y[30] ); + move64(); t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[14] ), CL_conjugate( y[30] ) ) ); + move64(); x[6] = CL_add( t[0], t[2] ); + move64(); x[14] = CL_sub( t[1], t[3] ); + move64(); x[22] = CL_sub( t[0], t[2] ); + move64(); x[30] = CL_add( t[1], t[3] ); + move64(); t[0] = CL_add( y[7], y[23] ); + move64(); t[1] = CL_sub( y[7], y[23] ); + move64(); t[2] = CL_add( y[15], y[31] ); + move64(); t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[15] ), CL_conjugate( y[31] ) ) ); + move64(); x[7] = CL_add( t[0], t[2] ); + move64(); x[15] = CL_sub( t[1], t[3] ); + move64(); x[23] = CL_sub( t[0], t[2] ); + move64(); x[31] = CL_add( t[1], t[3] ); + move64(); return; } @@ -4809,8 +6443,10 @@ static void fft_lenN( { FOR( j = 0; j < dim1; j++ ) { - xx[i * dim1 + j].re = x[i + j * dim2].re; - xx[i * dim1 + j].im = x[i + j * dim2].im; + xx[add( i_mult( i, dim1 ), j )].re = x[add( i, i_mult( j, dim2 ) )].re; + move64(); + xx[add( i_mult( i, dim1 ), j )].im = x[add( i, i_mult( j, dim2 ) )].im; + move64(); } } @@ -4819,56 +6455,56 @@ static void fft_lenN( case 5: FOR( i = 0; i < dim2; i++ ) { - fft_len5( &xx[i * dim1] ); + fft_len5( &xx[i_mult( i, dim1 )] ); } BREAK; case 8: FOR( i = 0; i < dim2; i++ ) { - fft_len8( &xx[i * dim1] ); + fft_len8( &xx[i_mult( i, dim1 )] ); } BREAK; case 10: FOR( i = 0; i < dim2; i++ ) { - fft_len10( &xx[i * dim1] ); + fft_len10( &xx[i_mult( i, dim1 )] ); } BREAK; case 15: FOR( i = 0; i < dim2; i++ ) { - fft_len15( &xx[i * dim1] ); + fft_len15( &xx[i_mult( i, dim1 )] ); } BREAK; case 16: FOR( i = 0; i < dim2; i++ ) { - fft_len16( &xx[i * dim1] ); + fft_len16( &xx[i_mult( i, dim1 )] ); } BREAK; case 20: FOR( i = 0; i < dim2; i++ ) { - fft_len20_fx( &xx[i * dim1] ); + fft_len20_fx( &xx[i_mult( i, dim1 )] ); } BREAK; case 30: FOR( i = 0; i < dim2; i++ ) { - fft_len30( &xx[i * dim1] ); + fft_len30( &xx[i_mult( i, dim1 )] ); } BREAK; case 32: FOR( i = 0; i < dim2; i++ ) { - fft_len32( &xx[i * dim1] ); + fft_len32( &xx[i_mult( i, dim1 )] ); } BREAK; } @@ -4882,100 +6518,145 @@ static void fft_lenN( cmplx s[8]; cmplx y[8]; + test(); + test(); + test(); + test(); IF( EQ_16( dim1, 30 ) || EQ_16( dim1, 20 ) || EQ_16( dim1, 15 ) || EQ_16( dim1, 10 ) || EQ_16( dim1, 5 ) ) { FOR( i = 0; i < dim1; i++ ) { { - y[0] = xx[i + 0 * dim1]; + y[0] = xx[i]; // y[0] = xx[i + 0 * dim1] }; - IF( EQ_16( i, 0 ) ) + IF( i == 0 ) { { - y[1] = xx[i + 1 * dim1]; + y[1] = xx[add( i, i_mult( 1, dim1 ) )]; + move64(); }; { - y[2] = xx[i + 2 * dim1]; + y[2] = xx[add( i, i_mult( 2, dim1 ) )]; + move64(); }; { - y[3] = xx[i + 3 * dim1]; + y[3] = xx[add( i, i_mult( 3, dim1 ) )]; + move64(); }; { - y[4] = xx[i + 4 * dim1]; + y[4] = xx[add( i, i_mult( 4, dim1 ) )]; + move64(); }; { - y[5] = xx[i + 5 * dim1]; + y[5] = xx[add( i, i_mult( 5, dim1 ) )]; + move64(); }; { - y[6] = xx[i + 6 * dim1]; + y[6] = xx[add( i, i_mult( 6, dim1 ) )]; + move64(); }; { - y[7] = xx[i + 7 * dim1]; + y[7] = xx[add( i, i_mult( 7, dim1 ) )]; + move64(); }; } ELSE { { - y[1] = CL_mac_j( CL_scale( xx[i + 1 * dim1], W[sc * i + sc * 1 * dim1 * 2 - Woff] ), - CL_scale( xx[i + 1 * dim1], W[sc * i + sc * 1 * dim1 * 2 + 1 - Woff] ) ); + y[1] = CL_mac_j( CL_scale( xx[add( i, i_mult( 1, dim1 ) )], W[sub( add( i_mult( sc, i ), shl( i_mult( i_mult( sc, 1 ), dim1 ), 1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( 1, dim1 ) )], W[sub( add( add( i_mult( sc, i ), shl( i_mult( i_mult( sc, 1 ), dim1 ), 1 ) ), 1 ), Woff )] ) ); + move64(); }; { - y[2] = CL_mac_j( CL_scale( xx[i + 2 * dim1], W[sc * i + sc * 2 * dim1 * 2 - Woff] ), - CL_scale( xx[i + 2 * dim1], W[sc * i + sc * 2 * dim1 * 2 + 1 - Woff] ) ); + y[2] = CL_mac_j( CL_scale( xx[add( i, i_mult( 2, dim1 ) )], W[sub( add( i_mult( sc, i ), shl( i_mult( i_mult( sc, 2 ), dim1 ), 1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( 2, dim1 ) )], W[sub( add( add( i_mult( sc, i ), shl( i_mult( i_mult( sc, 2 ), dim1 ), 1 ) ), 1 ), Woff )] ) ); + move64(); }; { - y[3] = CL_mac_j( CL_scale( xx[i + 3 * dim1], W[sc * i + sc * 3 * dim1 * 2 - Woff] ), - CL_scale( xx[i + 3 * dim1], W[sc * i + sc * 3 * dim1 * 2 + 1 - Woff] ) ); + y[3] = CL_mac_j( CL_scale( xx[add( i, i_mult( 3, dim1 ) )], W[sub( add( i_mult( sc, i ), shl( i_mult( i_mult( sc, 3 ), dim1 ), 1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( 3, dim1 ) )], W[sub( add( add( i_mult( sc, i ), shl( i_mult( i_mult( sc, 3 ), dim1 ), 1 ) ), 1 ), Woff )] ) ); + move64(); }; { - y[4] = CL_mac_j( CL_scale( xx[i + 4 * dim1], W[sc * i + sc * 4 * dim1 * 2 - Woff] ), - CL_scale( xx[i + 4 * dim1], W[sc * i + sc * 4 * dim1 * 2 + 1 - Woff] ) ); + y[4] = CL_mac_j( CL_scale( xx[add( i, i_mult( 4, dim1 ) )], W[sub( add( i_mult( sc, i ), shl( i_mult( i_mult( sc, 4 ), dim1 ), 1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( 4, dim1 ) )], W[sub( add( add( i_mult( sc, i ), shl( i_mult( i_mult( sc, 4 ), dim1 ), 1 ) ), 1 ), Woff )] ) ); + move64(); }; { - y[5] = CL_mac_j( CL_scale( xx[i + 5 * dim1], W[sc * i + sc * 5 * dim1 * 2 - Woff] ), - CL_scale( xx[i + 5 * dim1], W[sc * i + sc * 5 * dim1 * 2 + 1 - Woff] ) ); + y[5] = CL_mac_j( CL_scale( xx[add( i, i_mult( 5, dim1 ) )], W[sub( add( i_mult( sc, i ), shl( i_mult( i_mult( sc, 5 ), dim1 ), 1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( 5, dim1 ) )], W[sub( add( add( i_mult( sc, i ), shl( i_mult( i_mult( sc, 5 ), dim1 ), 1 ) ), 1 ), Woff )] ) ); + move64(); }; { - y[6] = CL_mac_j( CL_scale( xx[i + 6 * dim1], W[sc * i + sc * 6 * dim1 * 2 - Woff] ), - CL_scale( xx[i + 6 * dim1], W[sc * i + sc * 6 * dim1 * 2 + 1 - Woff] ) ); + y[6] = CL_mac_j( CL_scale( xx[add( i, i_mult( 6, dim1 ) )], W[sub( add( i_mult( sc, i ), shl( i_mult( i_mult( sc, 6 ), dim1 ), 1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( 6, dim1 ) )], W[sub( add( add( i_mult( sc, i ), shl( i_mult( i_mult( sc, 6 ), dim1 ), 1 ) ), 1 ), Woff )] ) ); + move64(); }; { - y[7] = CL_mac_j( CL_scale( xx[i + 7 * dim1], W[sc * i + sc * 7 * dim1 * 2 - Woff] ), - CL_scale( xx[i + 7 * dim1], W[sc * i + sc * 7 * dim1 * 2 + 1 - Woff] ) ); + y[7] = CL_mac_j( CL_scale( xx[add( i, i_mult( 7, dim1 ) )], W[sub( add( i_mult( sc, i ), shl( i_mult( i_mult( sc, 7 ), dim1 ), 1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( 7, dim1 ) )], W[sub( add( add( i_mult( sc, i ), shl( i_mult( i_mult( sc, 7 ), dim1 ), 1 ) ), 1 ), Woff )] ) ); + move64(); }; } t[0] = CL_add( y[0], y[4] ); + move64(); t[1] = CL_sub( y[0], y[4] ); + move64(); t[2] = CL_add( y[1], y[5] ); + move64(); t[3] = CL_sub( y[1], y[5] ); + move64(); t[4] = CL_add( y[2], y[6] ); + move64(); t[5] = CL_sub( y[2], y[6] ); + move64(); t[6] = CL_add( y[3], y[7] ); + move64(); t[7] = CL_sub( y[3], y[7] ); + move64(); s[0] = CL_add( t[0], t[4] ); + move64(); s[2] = CL_sub( t[0], t[4] ); + move64(); s[4] = CL_mac_j( t[1], t[5] ); + move64(); s[5] = CL_msu_j( t[1], t[5] ); + move64(); s[1] = CL_add( t[2], t[6] ); + move64(); s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) ); + move64(); t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) ); + move64(); t[1] = CL_sub( t[3], t[7] ); + move64(); s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); + move64(); s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); + move64(); s[7] = CL_conjugate( s[7] ); - - x[i + 0 * dim1] = CL_add( s[0], s[1] ); - x[i + 1 * dim1] = CL_add( s[5], s[6] ); - x[i + 2 * dim1] = CL_sub( s[2], s[3] ); - x[i + 3 * dim1] = CL_add( s[4], s[7] ); - x[i + 4 * dim1] = CL_sub( s[0], s[1] ); - x[i + 5 * dim1] = CL_sub( s[5], s[6] ); - x[i + 6 * dim1] = CL_add( s[2], s[3] ); - x[i + 7 * dim1] = CL_sub( s[4], s[7] ); + move64(); + + x[i] = CL_add( s[0], s[1] ); /*x[add(i + i_mult(0 , dim1)] = CL_add( s[0], s[1] )*/ + move64(); + x[add( i, i_mult( 1, dim1 ) )] = CL_add( s[5], s[6] ); + move64(); + x[add( i, i_mult( 2, dim1 ) )] = CL_sub( s[2], s[3] ); + move64(); + x[add( i, i_mult( 3, dim1 ) )] = CL_add( s[4], s[7] ); + move64(); + x[add( i, i_mult( 4, dim1 ) )] = CL_sub( s[0], s[1] ); + move64(); + x[add( i, i_mult( 5, dim1 ) )] = CL_sub( s[5], s[6] ); + move64(); + x[add( i, i_mult( 6, dim1 ) )] = CL_add( s[2], s[3] ); + move64(); + x[add( i, i_mult( 7, dim1 ) )] = CL_sub( s[4], s[7] ); + move64(); } } ELSE @@ -4983,95 +6664,137 @@ static void fft_lenN( FOR( i = 0; i < dim1; i++ ) { { - y[0] = xx[i + 0 * dim1]; + y[0] = xx[i]; /* y[0] = xx[i + 0 * dim1] */ + move64(); }; - IF( EQ_16( i, 0 ) ) + IF( i == 0 ) { { - y[1] = xx[i + 1 * dim1]; + y[1] = xx[add( i, i_mult( 1, dim1 ) )]; + move64(); }; { - y[2] = xx[i + 2 * dim1]; + y[2] = xx[add( i, i_mult( 2, dim1 ) )]; + move64(); }; { - y[3] = xx[i + 3 * dim1]; + y[3] = xx[add( i, i_mult( 3, dim1 ) )]; + move64(); }; { - y[4] = xx[i + 4 * dim1]; + y[4] = xx[add( i, i_mult( 4, dim1 ) )]; + move64(); }; { - y[5] = xx[i + 5 * dim1]; + y[5] = xx[add( i, i_mult( 5, dim1 ) )]; + move64(); }; { - y[6] = xx[i + 6 * dim1]; + y[6] = xx[add( i, i_mult( 6, dim1 ) )]; + move64(); }; { - y[7] = xx[i + 7 * dim1]; + y[7] = xx[add( i, i_mult( 7, dim1 ) )]; + move64(); }; } ELSE { { - y[1] = CL_mac_j( CL_scale( xx[i + 1 * dim1], W[sc * i + sc * 1 * dim1 - Woff] ), - CL_scale( xx[i + 1 * dim1], W[sc * i + sc * 1 * dim1 + 1 - Woff] ) ); + y[1] = CL_mac_j( CL_scale( xx[add( i, i_mult( 1, dim1 ) )], W[sub( add( i_mult( sc, i ), i_mult( i_mult( sc, 1 ), dim1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( 1, dim1 ) )], W[sub( add( add( i_mult( sc, i ), i_mult( i_mult( sc, 1 ), dim1 ) ), 1 ), Woff )] ) ); + move64(); }; { - y[2] = CL_mac_j( CL_scale( xx[i + 2 * dim1], W[sc * i + sc * 2 * dim1 - Woff] ), - CL_scale( xx[i + 2 * dim1], W[sc * i + sc * 2 * dim1 + 1 - Woff] ) ); + y[2] = CL_mac_j( CL_scale( xx[add( i, i_mult( 2, dim1 ) )], W[sub( add( i_mult( sc, i ), i_mult( i_mult( sc, 2 ), dim1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( 2, dim1 ) )], W[sub( add( add( i_mult( sc, i ), i_mult( i_mult( sc, 2 ), dim1 ) ), 1 ), Woff )] ) ); + move64(); }; { - y[3] = CL_mac_j( CL_scale( xx[i + 3 * dim1], W[sc * i + sc * 3 * dim1 - Woff] ), - CL_scale( xx[i + 3 * dim1], W[sc * i + sc * 3 * dim1 + 1 - Woff] ) ); + y[3] = CL_mac_j( CL_scale( xx[add( i, i_mult( 3, dim1 ) )], W[sub( add( i_mult( sc, i ), i_mult( i_mult( sc, 3 ), dim1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( 3, dim1 ) )], W[sub( add( add( i_mult( sc, i ), i_mult( i_mult( sc, 3 ), dim1 ) ), 1 ), Woff )] ) ); + move64(); }; { - y[4] = CL_mac_j( CL_scale( xx[i + 4 * dim1], W[sc * i + sc * 4 * dim1 - Woff] ), - CL_scale( xx[i + 4 * dim1], W[sc * i + sc * 4 * dim1 + 1 - Woff] ) ); + y[4] = CL_mac_j( CL_scale( xx[add( i, i_mult( 4, dim1 ) )], W[sub( add( i_mult( sc, i ), i_mult( i_mult( sc, 4 ), dim1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( 4, dim1 ) )], W[sub( add( add( i_mult( sc, i ), i_mult( i_mult( sc, 4 ), dim1 ) ), 1 ), Woff )] ) ); + move64(); }; { - y[5] = CL_mac_j( CL_scale( xx[i + 5 * dim1], W[sc * i + sc * 5 * dim1 - Woff] ), - CL_scale( xx[i + 5 * dim1], W[sc * i + sc * 5 * dim1 + 1 - Woff] ) ); + y[5] = CL_mac_j( CL_scale( xx[add( i, i_mult( 5, dim1 ) )], W[sub( add( i_mult( sc, i ), i_mult( i_mult( sc, 5 ), dim1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( 5, dim1 ) )], W[sub( add( add( i_mult( sc, i ), i_mult( i_mult( sc, 5 ), dim1 ) ), 1 ), Woff )] ) ); + move64(); }; { - y[6] = CL_mac_j( CL_scale( xx[i + 6 * dim1], W[sc * i + sc * 6 * dim1 - Woff] ), - CL_scale( xx[i + 6 * dim1], W[sc * i + sc * 6 * dim1 + 1 - Woff] ) ); + y[6] = CL_mac_j( CL_scale( xx[add( i, i_mult( 6, dim1 ) )], W[sub( add( i_mult( sc, i ), i_mult( i_mult( sc, 6 ), dim1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( 6, dim1 ) )], W[sub( add( add( i_mult( sc, i ), i_mult( i_mult( sc, 6 ), dim1 ) ), 1 ), Woff )] ) ); + move64(); }; { - y[7] = CL_mac_j( CL_scale( xx[i + 7 * dim1], W[sc * i + sc * 7 * dim1 - Woff] ), - CL_scale( xx[i + 7 * dim1], W[sc * i + sc * 7 * dim1 + 1 - Woff] ) ); + y[7] = CL_mac_j( CL_scale( xx[add( i, i_mult( 7, dim1 ) )], W[sub( add( i_mult( sc, i ), i_mult( i_mult( sc, 7 ), dim1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( 7, dim1 ) )], W[sub( add( add( i_mult( sc, i ), i_mult( i_mult( sc, 7 ), dim1 ) ), 1 ), Woff )] ) ); + move64(); }; } t[0] = CL_add( y[0], y[4] ); + move64(); t[1] = CL_sub( y[0], y[4] ); + move64(); t[2] = CL_add( y[1], y[5] ); + move64(); t[3] = CL_sub( y[1], y[5] ); + move64(); t[4] = CL_add( y[2], y[6] ); + move64(); t[5] = CL_sub( y[2], y[6] ); + move64(); t[6] = CL_add( y[3], y[7] ); + move64(); t[7] = CL_sub( y[3], y[7] ); + move64(); s[0] = CL_add( t[0], t[4] ); + move64(); s[2] = CL_sub( t[0], t[4] ); + move64(); s[4] = CL_mac_j( t[1], t[5] ); + move64(); s[5] = CL_msu_j( t[1], t[5] ); + move64(); s[1] = CL_add( t[2], t[6] ); + move64(); s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) ); + move64(); t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) ); + move64(); t[1] = CL_sub( t[3], t[7] ); + move64(); s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); + move64(); s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); + move64(); s[7] = CL_conjugate( s[7] ); - - x[i + 0 * dim1] = CL_add( s[0], s[1] ); - x[i + 1 * dim1] = CL_add( s[5], s[6] ); - x[i + 2 * dim1] = CL_sub( s[2], s[3] ); - x[i + 3 * dim1] = CL_add( s[4], s[7] ); - x[i + 4 * dim1] = CL_sub( s[0], s[1] ); - x[i + 5 * dim1] = CL_sub( s[5], s[6] ); - x[i + 6 * dim1] = CL_add( s[2], s[3] ); - x[i + 7 * dim1] = CL_sub( s[4], s[7] ); + move64(); + + x[i] = CL_add( s[0], s[1] ); /*x[i + 0 * dim1] = CL_add( s[0], s[1] )*/ + move64(); + x[add( i, i_mult( 1, dim1 ) )] = CL_add( s[5], s[6] ); + move64(); + x[add( i, i_mult( 2, dim1 ) )] = CL_sub( s[2], s[3] ); + move64(); + x[add( i, i_mult( 3, dim1 ) )] = CL_add( s[4], s[7] ); + move64(); + x[add( i, i_mult( 4, dim1 ) )] = CL_sub( s[0], s[1] ); + move64(); + x[add( i, i_mult( 5, dim1 ) )] = CL_sub( s[5], s[6] ); + move64(); + x[add( i, i_mult( 6, dim1 ) )] = CL_add( s[2], s[3] ); + move64(); + x[add( i, i_mult( 7, dim1 ) )] = CL_sub( s[4], s[7] ); + move64(); } } BREAK; @@ -5083,32 +6806,35 @@ static void fft_lenN( FOR( j = 0; j < dim2; j++ ) { { - y[j] = xx[0 + j * dim1]; + y[j] = xx[0 + i_mult( j, dim1 )]; /*y[j] = xx[0 + j * dim1];*/ }; } fft_len10( &y[0] ); FOR( j = 0; j < dim2; j++ ) { - x[0 + j * dim1] = y[j]; + x[0 + i_mult( j, dim1 )] = y[j]; + move64(); } FOR( i = 1; i < dim1; i++ ) { { y[( 0 + 0 )] = xx[i + ( 0 + 0 ) * dim1]; + move64(); } FOR( j = 1; j < dim2; j++ ) { { - y[( j + 0 )] = CL_mac_j( CL_scale( xx[i + ( j + 0 ) * dim1], W[sc * i + sc * j * dim1 - Woff] ), - CL_scale( xx[i + ( j + 0 ) * dim1], W[sc * i + sc * j * dim1 + 1 - Woff] ) ); + y[( j + 0 )] = CL_mac_j( CL_scale( xx[add( i, i_mult( ( j + 0 ), dim1 ) )], W[sub( add( i_mult( sc, i ), i_mult( i_mult( sc, j ), dim1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( ( j + 0 ), dim1 ) )], W[sub( add( add( i_mult( sc, i ), i_mult( i_mult( sc, j ), dim1 ) ), 1 ), Woff )] ) ); + move64(); } } fft_len10( &y[0] ); FOR( j = 0; j < dim2; j++ ) { - x[i + j * dim1] = y[j]; + x[add( i, i_mult( j, dim1 ) )] = y[j]; } } BREAK; @@ -5120,14 +6846,15 @@ static void fft_lenN( FOR( j = 0; j < dim2; j++ ) { { - y[j] = xx[0 + j * dim1]; + y[j] = xx[0 + i_mult( j, dim1 )]; + move64(); }; } fft_len16( &y[0] ); FOR( j = 0; j < dim2; j++ ) { - x[0 + j * dim1] = y[j]; + x[0 + i_mult( j, dim1 )] = y[j]; } FOR( i = 1; i < dim1; i++ ) @@ -5139,14 +6866,16 @@ static void fft_lenN( FOR( j = 1; j < dim2; j++ ) { { - y[( j + 0 )] = CL_mac_j( CL_scale( xx[i + ( j + 0 ) * dim1], W[sc * i + sc * j * dim1 - Woff] ), - CL_scale( xx[i + ( j + 0 ) * dim1], W[sc * i + sc * j * dim1 + 1 - Woff] ) ); + y[( j + 0 )] = CL_mac_j( CL_scale( xx[add( i, i_mult( ( j + 0 ), dim1 ) )], W[sub( add( i_mult( sc, i ), i_mult( i_mult( sc, j ), dim1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( ( j + 0 ), dim1 ) )], W[sub( add( add( i_mult( sc, i ), i_mult( i_mult( sc, j ), dim1 ) ), 1 ), Woff )] ) ); + move64(); } } fft_len16( &y[0] ); FOR( j = 0; j < dim2; j++ ) { - x[i + j * dim1] = y[j]; + x[add( i, i_mult( j, dim1 ) )] = y[j]; + move64(); } } BREAK; @@ -5158,40 +6887,47 @@ static void fft_lenN( FOR( j = 0; j < dim2; j++ ) { { - y[j] = xx[0 + j * dim1]; + y[j] = xx[0 + i_mult( j, dim1 )]; + move64(); }; } fft_len20_fx( &y[0] ); FOR( j = 0; j < dim2; j++ ) { - x[0 + j * dim1] = y[j]; + x[0 + i_mult( j, dim1 )] = y[j]; + move64(); } FOR( i = 1; i < dim1; i++ ) { { - y[( 0 + 0 )] = xx[i + ( 0 + 0 ) * dim1]; + y[( 0 + 0 )] = xx[add( i, ( 0 + 0 ) * dim1 )]; + move64(); } { - y[( 0 + 1 )] = CL_mac_j( CL_scale( xx[i + ( 0 + 1 ) * dim1], W[len + sc * i + 0 * dim1 - Woff] ), - CL_scale( xx[i + ( 0 + 1 ) * dim1], W[len + sc * i + 0 * dim1 + 1 - Woff] ) ); + y[( 0 + 1 )] = CL_mac_j( CL_scale( xx[add( i, i_mult( ( 0 + 1 ), dim1 ) )], W[sub( add( len, i_mult( sc, i ) ) + 0 * dim1, Woff )] ), + CL_scale( xx[add( i, i_mult( ( 0 + 1 ), dim1 ) )], W[sub( add( add( len, i_mult( sc, i ) ) + 0 * dim1, 1 ), Woff )] ) ); + move64(); } FOR( j = 2; j < dim2; j = j + 2 ) { { - y[( j + 0 )] = CL_mac_j( CL_scale( xx[i + ( j + 0 ) * dim1], W[sc * i + j * dim1 - Woff] ), - CL_scale( xx[i + ( j + 0 ) * dim1], W[sc * i + j * dim1 + 1 - Woff] ) ); + y[( j + 0 )] = CL_mac_j( CL_scale( xx[add( i, i_mult( ( j + 0 ), dim1 ) )], W[sub( add( i_mult( sc, i ), i_mult( j, dim1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( ( j + 0 ), dim1 ) )], W[sub( add( add( i_mult( sc, i ), i_mult( j, dim1 ) ), 1 ), Woff )] ) ); + move64(); } { - y[( j + 1 )] = CL_mac_j( CL_scale( xx[i + ( j + 1 ) * dim1], W[len + sc * i + j * dim1 - Woff] ), - CL_scale( xx[i + ( j + 1 ) * dim1], W[len + sc * i + j * dim1 + 1 - Woff] ) ); + y[( j + 1 )] = CL_mac_j( CL_scale( xx[add( i, i_mult( ( j + 1 ), dim1 ) )], W[sub( add( add( len, i_mult( sc, i ) ), i_mult( j, dim1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( ( j + 1 ), dim1 ) )], W[sub( add( add( add( len, i_mult( sc, i ) ), i_mult( j, dim1 ) ), 1 ), Woff )] ) ); + move64(); } } fft_len20_fx( &y[0] ); FOR( j = 0; j < dim2; j++ ) { x[i + j * dim1] = y[j]; + move64(); } } BREAK; @@ -5204,39 +6940,46 @@ static void fft_lenN( { { y[j] = xx[0 + j * dim1]; + move64(); }; } fft_len32( &y[0] ); FOR( j = 0; j < dim2; j++ ) { x[0 + j * dim1] = y[j]; + move64(); } FOR( i = 1; i < dim1; i++ ) { { y[( 0 + 0 )] = xx[i + ( 0 + 0 ) * dim1]; + move64(); } { - y[( 0 + 1 )] = CL_mac_j( CL_scale( xx[i + ( 0 + 1 ) * dim1], W[len + sc * i + 0 * dim1 - Woff] ), - CL_scale( xx[i + ( 0 + 1 ) * dim1], W[len + sc * i + 0 * dim1 + 1 - Woff] ) ); + y[( 0 + 1 )] = CL_mac_j( CL_scale( xx[add( i, i_mult( ( 0 + 1 ), dim1 ) )], W[sub( add( len, i_mult( sc, i ) ) + 0 * dim1, Woff )] ), + CL_scale( xx[add( i, i_mult( ( 0 + 1 ), dim1 ) )], W[sub( add( add( len, i_mult( sc, i ) ) + 0 * dim1, 1 ), Woff )] ) ); + move64(); } FOR( j = 2; j < dim2; j = j + 2 ) { { - y[( j + 0 )] = CL_mac_j( CL_scale( xx[i + ( j + 0 ) * dim1], W[sc * i + j * dim1 - Woff] ), - CL_scale( xx[i + ( j + 0 ) * dim1], W[sc * i + j * dim1 + 1 - Woff] ) ); + y[( j + 0 )] = CL_mac_j( CL_scale( xx[add( i, i_mult( ( j + 0 ), dim1 ) )], W[sub( add( i_mult( sc, i ), i_mult( j, dim1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( ( j + 0 ), dim1 ) )], W[sub( add( add( i_mult( sc, i ), i_mult( j, dim1 ) ), 1 ), Woff )] ) ); + move64(); } { - y[( j + 1 )] = CL_mac_j( CL_scale( xx[i + ( j + 1 ) * dim1], W[len + sc * i + j * dim1 - Woff] ), - CL_scale( xx[i + ( j + 1 ) * dim1], W[len + sc * i + j * dim1 + 1 - Woff] ) ); + y[( j + 1 )] = CL_mac_j( CL_scale( xx[add( i, i_mult( ( j + 1 ), dim1 ) )], W[sub( add( add( len, i_mult( sc, i ) ), i_mult( j, dim1 ) ), Woff )] ), + CL_scale( xx[add( i, i_mult( ( j + 1 ), dim1 ) )], W[sub( add( add( add( len, i_mult( sc, i ) ), i_mult( j, dim1 ) ), 1 ), Woff )] ) ); + move64(); } } fft_len32( &y[0] ); FOR( j = 0; j < dim2; j++ ) { - x[i + j * dim1] = y[j]; + x[add( i, i_mult( j, dim1 ) )] = y[j]; + move64(); } } BREAK; @@ -5260,10 +7003,12 @@ void fft_fx( { cmplx x[960]; - FOR( Word32 j = 0; j < length; j++ ) + FOR( Word16 j = 0; j < length; j++ ) { - x[j].re = re[s * j]; - x[j].im = im[s * j]; + x[j].re = re[i_mult( s, j )]; + move32(); + x[j].im = im[i_mult( s, j )]; + move32(); } SWITCH( length ) @@ -5323,10 +7068,12 @@ void fft_fx( assert( !"fft length is not supported!" ); } - FOR( Word32 j = 0; j < length; j++ ) + FOR( Word16 j = 0; j < length; j++ ) { - re[s * j] = x[j].re; - im[s * j] = x[j].im; + re[i_mult( s, j )] = x[j].re; + move32(); + im[i_mult( s, j )] = x[j].im; + move32(); } return; @@ -5343,33 +7090,45 @@ void rfft_fx( Word32 tmp, t1, t2, t3, t4; Word16 s1, s2; - sizeOfFft2 = length >> 1; - sizeOfFft4 = length >> 2; + sizeOfFft2 = shr( length, 1 ); + sizeOfFft4 = shr( length, 2 ); SWITCH( sizeOfFft2 ) { case 80: s1 = 409; + move16(); s2 = -409; + move16(); BREAK; case 128: s1 = 256; + move16(); s2 = -256; + move16(); BREAK; case 160: s1 = 204; + move16(); s2 = -204; + move16(); BREAK; case 320: s1 = 102; + move16(); s2 = -102; + move16(); BREAK; case 480: s1 = 68; + move16(); s2 = -68; + move16(); BREAK; default: s1 = -1; + move16(); s2 = -1; + move16(); printf( "Configuration not supported" ); assert( 0 ); } @@ -5383,21 +7142,27 @@ void rfft_fx( tmp = L_add( x[0], x[1] ); x[1] = L_sub( x[0], x[1] ); + move32(); x[0] = tmp; + move32(); FOR( i = 1; i <= sizeOfFft4; i++ ) { - t1 = L_sub( x[2 * i], x[length - 2 * i] ); - t2 = L_add( x[2 * i + 1], x[length - 2 * i + 1] ); + t1 = L_sub( x[2 * i], x[sub( length, shl( i, 1 ) )] ); + t2 = L_add( x[add( shl( i, 1 ), 1 )], x[add( sub( length, shl( i, 1 ) ), 1 )] ); t3 = L_sub( Mpy_32_16_1( t1, w[i] ), Mpy_32_16_1( t2, w[i + sizeOfFft4] ) ); t4 = L_add( Mpy_32_16_1( t1, w[i + sizeOfFft4] ), Mpy_32_16_1( t2, w[i] ) ); - t1 = L_add( x[2 * i], x[length - 2 * i] ); - t2 = L_sub( x[2 * i + 1], x[length - 2 * i + 1] ); + t1 = L_add( x[2 * i], x[sub( length, shl( i, 1 ) )] ); + t2 = L_sub( x[add( shl( i, 1 ), 1 )], x[add( sub( length, shl( i, 1 ) ), 1 )] ); x[2 * i] = Mpy_32_16_1( L_sub( t1, t3 ), 16384 ); - x[2 * i + 1] = Mpy_32_16_1( L_sub( t2, t4 ), 16384 ); - x[length - 2 * i] = Mpy_32_16_1( L_add( t1, t3 ), 16384 ); - x[length - 2 * i + 1] = Mpy_32_16_1( L_negate( L_add( t2, t4 ) ), 16384 ); + move32(); + x[add( shl( i, 1 ), 1 )] = Mpy_32_16_1( L_sub( t2, t4 ), 16384 ); + move32(); + x[sub( length, shl( i, 1 ) )] = Mpy_32_16_1( L_add( t1, t3 ), 16384 ); + move32(); + x[add( sub( length, shl( i, 1 ) ), 1 )] = Mpy_32_16_1( L_negate( L_add( t2, t4 ) ), 16384 ); + move32(); } BREAK; @@ -5406,21 +7171,27 @@ void rfft_fx( tmp = Mpy_32_16_1( L_add( x[0], x[1] ), 16384 ); x[1] = Mpy_32_16_1( L_sub( x[1], x[0] ), 16384 ); + move32(); x[0] = tmp; + move32(); FOR( i = 1; i <= sizeOfFft4; i++ ) { - t1 = L_sub( x[2 * i], x[length - 2 * i] ); - t2 = L_add( x[2 * i + 1], x[length - 2 * i + 1] ); - t3 = L_add( Mpy_32_16_1( t1, w[i] ), Mpy_32_16_1( t2, w[i + sizeOfFft4] ) ); - t4 = L_sub( Mpy_32_16_1( t2, w[i] ), Mpy_32_16_1( t1, w[i + sizeOfFft4] ) ); - t1 = L_add( x[2 * i], x[length - 2 * i] ); - t2 = L_sub( x[2 * i + 1], x[length - 2 * i + 1] ); + t1 = L_sub( x[2 * i], x[sub( length, shl( i, 1 ) )] ); + t2 = L_add( x[add( shl( i, 1 ), 1 )], x[add( sub( length, shl( i, 1 ) ), 1 )] ); + t3 = L_add( Mpy_32_16_1( t1, w[i] ), Mpy_32_16_1( t2, w[add( i, sizeOfFft4 )] ) ); + t4 = L_sub( Mpy_32_16_1( t2, w[i] ), Mpy_32_16_1( t1, w[add( i, sizeOfFft4 )] ) ); + t1 = L_add( x[2 * i], x[sub( length, shl( i, 1 ) )] ); + t2 = L_sub( x[add( shl( i, 1 ), 1 )], x[add( sub( length, shl( i, 1 ) ), 1 )] ); x[2 * i] = Mpy_32_16_1( L_sub( t1, t3 ), 16384 ); - x[2 * i + 1] = Mpy_32_16_1( L_sub( t4, t2 ), 16384 ); - x[length - 2 * i] = Mpy_32_16_1( L_add( t1, t3 ), 16384 ); - x[length - 2 * i + 1] = Mpy_32_16_1( L_add( t2, t4 ), 16384 ); + move32(); + x[add( shl( i, 1 ), 1 )] = Mpy_32_16_1( L_sub( t4, t2 ), 16384 ); + move32(); + x[sub( length, shl( i, 1 ) )] = Mpy_32_16_1( L_add( t1, t3 ), 16384 ); + move32(); + x[add( sub( length, shl( i, 1 ) ), 1 )] = Mpy_32_16_1( L_add( t2, t4 ), 16384 ); + move32(); } fft_fx( x, x + 1, sizeOfFft2, 2 ); @@ -5428,7 +7199,9 @@ void rfft_fx( FOR( i = 0; i < length; i += 2 ) { x[i] = Mpy_32_16_1( x[i], s1 ); + move32(); x[i + 1] = Mpy_32_16_1( x[i + 1], s2 ); + move32(); } BREAK; @@ -5439,28 +7212,45 @@ void rfft_fx( Word16 find_guarded_bits_fx( Word32 n ) { - return n <= 1 ? 0 : n <= 2 ? 1 - : n <= 4 ? 2 - : n <= 8 ? 3 - : n <= 16 ? 4 - : n <= 32 ? 5 - : n <= 64 ? 6 - : n <= 128 ? 7 - : n <= 256 ? 8 - : n <= 512 ? 9 - : n <= 1024 ? 10 - : n <= 2048 ? 11 - : n <= 4096 ? 12 - : n <= 8192 ? 13 - : n <= 16384 ? 14 - : 15; + // return n <= 1 ? 0 : n <= 2 ? 1 + // : n <= 4 ? 2 + // : n <= 8 ? 3 + // : n <= 16 ? 4 + // : n <= 32 ? 5 + // : n <= 64 ? 6 + // : n <= 128 ? 7 + // : n <= 256 ? 8 + // : n <= 512 ? 9 + // : n <= 1024 ? 10 + // : n <= 2048 ? 11 + // : n <= 4096 ? 12 + // : n <= 8192 ? 13 + // : n <= 16384 ? 14 + // : 15; + /*Word16 val = 0; + move32(); + test(); + WHILE( GT_32( n, L_shl( 1, val ) ) && LT_32( val, 16 ) ) + { + val = add( val, 1 ); + }*/ + IF( LE_32( n, 1 ) ) + { + return 0; + } + ELSE + { + + return sub( 31, norm_l( L_sub( n, 1 ) ) ); + } } Word16 L_norm_arr( Word32 *arr, Word16 size ) { Word16 q = 31; - FOR( int i = 0; i < size; i++ ) - if ( arr[i] != 0 ) + move16(); + FOR( Word16 i = 0; i < size; i++ ) + IF( arr[i] != 0 ) { q = s_min( q, norm_l( arr[i] ) ); } @@ -5470,15 +7260,17 @@ Word16 L_norm_arr( Word32 *arr, Word16 size ) Word16 get_min_scalefactor( Word32 x, Word32 y ) { Word16 scf = Q31; - IF( EQ_32( x, 0 ) && EQ_32( y, 0 ) ) + move16(); + test(); + IF( x == 0 && y == 0 ) { return 0; } - IF( NE_32( x, 0 ) ) + IF( x != 0 ) { scf = s_min( scf, norm_l( x ) ); } - IF( NE_32( y, 0 ) ) + IF( y != 0 ) { scf = s_min( scf, norm_l( y ) ); } @@ -5487,8 +7279,8 @@ Word16 get_min_scalefactor( Word32 x, Word32 y ) Flag is_zero_arr( Word32 *arr, Word16 size ) { - FOR( int i = 0; i < size; i++ ) - if ( arr[i] != 0 ) + FOR( Word16 i = 0; i < size; i++ ) + IF( arr[i] != 0 ) { return 0; } diff --git a/lib_com/tcq_position_arith_fx.c b/lib_com/tcq_position_arith_fx.c index 12ed38196..459c4d362 100644 --- a/lib_com/tcq_position_arith_fx.c +++ b/lib_com/tcq_position_arith_fx.c @@ -78,15 +78,17 @@ static void bitstream_save_bit( cur = (UWord8) ( cur | L_shl( bit, pBS->curPos ) ); move16(); pBS->curPos = sub( pBS->curPos, 1 ); + move16(); pBS->buf[pBS->numByte] = cur; move16(); pBS->numbits = L_add( pBS->numbits, 1 ); - + move32(); IF( pBS->curPos < 0 ) { pBS->curPos = 7; move16(); pBS->numByte = L_add( pBS->numByte, 1 ); + move32(); } return; @@ -105,15 +107,13 @@ static UWord32 bitstream_load_bit( } curPos = &pBS->curPos; - move16(); - bit = ( ( pBS->buf[pBS->numByte] >> ( *curPos )-- ) & 0x00000001 ); - move16(); - move16(); - move16(); + bit = UL_and( UL_lshr( pBS->buf[pBS->numByte] , ( *curPos ) ) , 0x00000001 ); + *curPos = sub(*curPos, 1); IF( *curPos < 0 ) { pBS->numByte = L_add( pBS->numByte, 1 ); + move32(); *curPos = 7; move16(); } @@ -131,11 +131,13 @@ static void bitstream_rollback( pBS->curPos++; move16(); pBS->numbits = L_sub( pBS->numbits, 1 ); + move32(); IF( EQ_16( pBS->curPos, 8 ) ) { pBS->curPos = 0; move16(); pBS->numByte = L_sub( pBS->numByte, 1 ); + move32(); } } @@ -147,6 +149,7 @@ static void transmission_bits( { bitstream_save_bit( arInst->bsInst, bit ); arInst->num_bits = L_add( arInst->num_bits, 1 ); + move32(); bit = !bit; move32(); @@ -154,6 +157,7 @@ static void transmission_bits( { bitstream_save_bit( arInst->bsInst, bit ); arInst->num_bits = L_add( arInst->num_bits, 1 ); + move32(); } return; @@ -166,7 +170,9 @@ static Word32 ar_make_model_fx( { Word16 dist; Word32 sum = 0; + move32(); Word32 cum = 0; + move32(); Word16 i, tmp; FOR( i = 0; i < len; i++ ) @@ -183,7 +189,7 @@ static Word32 ar_make_model_fx( { /*model[i] = (short)( ( cum * MAX_AR_FREQ ) / sum ); */ model[i] = extract_l( ar_div( cum * MAX_AR_FREQ, sum ) ); - + move16(); if ( i ) cum = L_add( cum, freq[i - 1] ); } @@ -223,12 +229,14 @@ void ar_encoder_start_fx( move32(); arInst->low = L_deposit_l( 0 ); + move32(); arInst->high = AR_TOP; move32(); arInst->bits_to_follow = 0; move16(); arInst->num_bits = L_deposit_l( 0 ); + move32(); arInst->max_bits = max_bits; move32(); } @@ -246,8 +254,8 @@ static void ar_encode_fx( symbol = L_add( symbol, 1 ); range = L_add( L_sub( high, low ), 1 ); - high = L_sub( L_add( low, ar_div( range * model[symbol - 1], model[0] ) ), 1 ); - low = L_add( low, ar_div( range * model[symbol], model[0] ) ); + high = L_sub( L_add( low, ar_div( imult3216( range, model[symbol - 1] ), model[0] ) ), 1 ); + low = L_add( low, ar_div( imult3216( range, model[symbol] ), model[0] ) ); FOR( ;; ) { @@ -330,13 +338,15 @@ void ar_decoder_start_fx( move32(); arInst->low = L_deposit_l( 0 ); + move32(); arInst->high = AR_TOP; move32(); arInst->value = L_deposit_l( 0 ); - + move32(); FOR( i = 0; i < AR_BITS; i++ ) { arInst->value = L_add( L_shl( arInst->value, 1 ), bitstream_load_bit( arInst->bsInst ) ); + move32(); } return; @@ -356,7 +366,7 @@ static Word16 ar_decode_fx( range = L_add( L_sub( high, low ), 1 ); /*cum = (short)( ( ( (unsigned int)( arInst->value - arInst->low ) + 1 ) * model[0] - 1 ) / range ); */ - cum = extract_l( ar_div( L_sub( L_add( L_sub( value, low ), 1 ) * model[0], 1 ), range ) ); + cum = extract_l( ar_div( L_sub( imult3216( L_add( L_sub( value, low ), 1 ), model[0] ), 1 ), range ) ); symbol = 1; move16(); @@ -365,8 +375,8 @@ static Word16 ar_decode_fx( symbol = add( symbol, 1 ); } - high = L_sub( L_add( low, ar_div( range * model[symbol - 1], model[0] ) ), 1 ); - low = L_add( low, ar_div( range * model[symbol], model[0] ) ); + high = L_sub( L_add( low, ar_div( imult3216( range, model[symbol - 1] ), model[0] ) ), 1 ); + low = L_add( low, ar_div( imult3216( range, model[symbol] ), model[0] ) ); FOR( i = 0; i < 0x7FFF; i++ ) { @@ -396,7 +406,7 @@ static Word16 ar_decode_fx( arInst->value = value; move32(); - return ( symbol - 1 ); + return ( sub(symbol , 1) ); } void ar_decoder_done_fx( @@ -472,7 +482,7 @@ static Word32 GetBitsFromPulses_fx( exp1 = norm_l( pow_getbitsfrompulses_fx[temp_fx1] ); exp2 = norm_l( frac_fx32 ); frac_fx32 = Mult_32_32( L_shl( pow_getbitsfrompulses_fx[temp_fx1], exp1 ), L_shl( frac_fx32, exp2 ) ); /*21 + exp1 + 30 + exp2 - 31 */ - frac_fx32 = L_shr( frac_fx32, exp1 + exp2 ) + 1; /*20 */ + frac_fx32 = L_add( L_shr( frac_fx32, add( exp1, exp2 ) ), 1 ); /*20 */ IF( LT_16( exp, integer_fx ) ) { @@ -488,8 +498,7 @@ static Word32 GetBitsFromPulses_fx( } IF( GE_32( mantissa_fx, 0x200000 ) ) { - exp++; - move16(); + exp = add( exp, 1 ); mantissa_fx = L_shr( mantissa_fx, 1 ); } @@ -528,7 +537,7 @@ static void TCQnew_fx( { Word16 i, st, dminpos, position; Word16 pulsesnum, nzpos = 0; - + move16(); Word32 metric_fx[STATES][TCQ_MAX_BAND_SIZE]; Word16 path_fx[STATES][TCQ_MAX_BAND_SIZE]; Word16 quant_fx[STATES][TCQ_MAX_BAND_SIZE]; @@ -570,7 +579,7 @@ static void TCQnew_fx( exp = norm_l( scale_fx ); tmp32 = L_shl( scale_fx, exp ); tmp32 = Mult_32_16( v_fx[i], extract_h( tmp32 ) ); /*12 + 20 + exp - 16 - 15 + Qscale */ - exp1 = 26 - ( exp - 19 + Qscale ); + exp1 = sub( 26, add( sub( exp, 19 ), Qscale ) ); exp2 = norm_l( tmp32 ); IF( GE_16( exp2, exp1 ) ) { @@ -659,7 +668,7 @@ static void TCQnew_fx( move16(); if ( v_fx[i - 1] <= 0 ) { - vout_fx[i - 1] = -quant_fx[position][i]; + vout_fx[i - 1] = negate(quant_fx[position][i]); move16(); } position = path_fx[position][i]; @@ -720,10 +729,13 @@ Word32 GetISCScale_fx( Word16 SafeExp; Word32 magnbits_fx = 0, tcqmagnbits_fx /*, surplus_fx, bits_fx*/; + move32(); Word16 prob0_fx, prob1_fx, num, denum, quantum1_fx, quantum2_fx; Word32 dmin_fx, scale_fx32; Word32 actualt_fx; Word32 pt_fx, sxy_fx = 0, sy2_fx = 0; + move32(); + move32(); Word16 pn_fx, g_fx, scale_fx; Word16 tmp16, exp, exp1, exp2, Q_temp, hi, lo; Word32 m_fx, tmp32; @@ -733,8 +745,15 @@ Word32 GetISCScale_fx( Word16 Qscale; Word16 Qsxy = 4; - exp = 0; /* to avoid compilation warnings */ + move32(); + move32(); + move32(); + move16(); + + exp = 0; /* to avoid compilation warnings */ + move16(); Qscale = 0; /* to avoid compilation warnings */ + move16(); set32_fx( dist_fx, 0, size ); set16_fx( exp_dist, 31, size ); @@ -794,15 +813,16 @@ Word32 GetISCScale_fx( exp2 = norm_l( m_fx ); scale_fx = div_s( shl( pulsesnum, exp1 ), extract_h( L_shl( m_fx, exp2 ) ) ); /*15 + exp1 - (exp2 + 12 - 16) */ - exp = 15 + exp1 - ( exp2 + 12 - 16 ) + 2; + exp = add( sub( add( 15, exp1 ), sub( add( exp2, 12 ), 16 ) ), 2 ); move16(); t_fx = 0; move16(); FOR( i = 0; i < size; i++ ) { - tmp32 = Mult_32_16( aquants_fx[i], scale_fx ); /*12 + exp - 15 */ - tmp32 = L_shl( tmp32, sub( 16, 12 + exp - 15 ) ); /*16 */ + tmp32 = Mult_32_16( aquants_fx[i], scale_fx ); /*12 + exp - 15 */ + tmp32 = L_shl( tmp32, sub( 16, add( 12 - 15, exp ) ) ); /*16 */ magn_fx[i] = extract_h( L_add( 32768, tmp32 ) ); + move16(); t_fx = add( t_fx, magn_fx[i] ); } } @@ -837,8 +857,8 @@ Word32 GetISCScale_fx( { FOR( i = 0; i < size; i++ ) { - sxy_fx = L_add( sxy_fx, L_shl( Mult_32_16( aquants_fx[i], magn_fx[i] ), Qsxy + 3 ) ); /* 12+0-15 +9 -> 6 */ - sy2_fx = L_add( sy2_fx, L_mult0( magn_fx[i], magn_fx[i] ) ); /*0 */ + sxy_fx = L_add( sxy_fx, L_shl( Mult_32_16( aquants_fx[i], magn_fx[i] ), add( Qsxy, 3 ) ) ); /* 12+0-15 +9 -> 6 */ + sy2_fx = L_add( sy2_fx, L_mult0( magn_fx[i], magn_fx[i] ) ); /*0 */ } Q_temp = 32; move16(); @@ -876,20 +896,21 @@ Word32 GetISCScale_fx( { tmp16 = shl( tmp16, exp2 ); } - g_fx = div_s( extract_h( tmp32 ), tmp16 ); /*15 + 12 + exp1 - 16 - exp2; */ - exp = 15 + 12 + exp1 - 16 - exp2 - 2; + g_fx = div_s( extract_h( tmp32 ), tmp16 ); /*15 + 12 + exp1 - 16 - exp2; */ + exp = add( 15 + 12 - 16 - 2, sub( exp1, exp2 ) ); /*exp = 15 + 12 + exp1 - 16 - exp2 - 2*/ move16(); } IF( g_fx == 0 ) { dist_fx[i] = L_deposit_l( 0 ); + move32(); } ELSE { IF( direction > 0 ) { - tmp32 = L_add( sxy_fx, L_shr( aquants_fx[i], 12 - Qsxy ) ); /*Qsxy */ + tmp32 = L_add( sxy_fx, L_shr( aquants_fx[i], sub( 12, Qsxy ) ) ); /*Qsxy */ t32 = L_add( sy2_fx, L_add( 1, L_deposit_l( shl( magn_fx[i], 1 ) ) ) ); IF( LT_16( norm_l( t32 ), 15 ) ) @@ -906,7 +927,7 @@ Word32 GetISCScale_fx( } ELSE { - tmp32 = L_sub( sxy_fx, L_shr( aquants_fx[i], 12 - Qsxy ) ); /*Qsxy */ + tmp32 = L_sub( sxy_fx, L_shr( aquants_fx[i], sub( 12, Qsxy ) ) ); /*Qsxy */ t32 = L_add( sy2_fx, L_sub( 1, L_deposit_l( shl( magn_fx[i], 1 ) ) ) ); SafeExp = norm_l( t32 ); @@ -923,7 +944,7 @@ Word32 GetISCScale_fx( } } #ifdef BASOP_NOGLOB - tmp32 = L_shl_sat( tmp32, 1 - SafeExp ); /* *2 */ + tmp32 = L_shl_sat( tmp32, sub( 1, SafeExp ) ); /* *2 */ tmp32 = L_sub_sat( L_shl_sat( L_mult0( g_fx, tmp16 ), sub( Qsxy, exp ) ), tmp32 ); /*Qsxy */ #else tmp32 = L_shl( tmp32, 1 - SafeExp ); /* *2 */ @@ -931,7 +952,7 @@ Word32 GetISCScale_fx( #endif dist_fx[i] = Mult_32_16( tmp32, g_fx ); /*Qsxy + exp - 15 */ move32(); - exp_dist[i] = add( Qsxy - 15, exp ); + exp_dist[i] = add( sub( Qsxy, 15 ), exp ); move16(); if ( LT_16( exp_dist[i], Q_temp ) ) { @@ -1020,7 +1041,7 @@ Word32 GetISCScale_fx( exp2 = sub( norm_l( pulsesnum ), 1 ); lo = L_Extract_lc( L_shl( actualt_fx, exp1 ), &hi ); scale_fx32 = Div_32( L_shl( pulsesnum, exp2 ), hi, lo ); /*31 + exp2 - exp1 - 12 */ - Qscale = 31 + exp2 - exp1 - 12 + 2; + Qscale = add( 31 - 12 + 2, sub( exp2, exp1 ) ); /*31 + exp2 - exp1 - 12 + 2*/ move16(); } @@ -1172,8 +1193,7 @@ Word32 GetISCScale_fx( exp1 = sub( norm_s( num ), 1 ); exp2 = norm_s( denum ); prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */ - exp = 15 + exp1 - exp2; - move16(); + exp = add( 15, sub( exp1, exp2 ) ); prob1_fx = shl( prob1_fx, sub( 15, exp ) ); prob0_fx = sub( MAX_16, prob1_fx ); } @@ -1209,8 +1229,7 @@ Word32 GetISCScale_fx( } } - leftnz--; - move16(); + leftnz = sub( leftnz, 1 ); leftp = sub( leftp, abs_s( magn_fx[i] ) ); } @@ -1218,9 +1237,9 @@ Word32 GetISCScale_fx( } /* Update actual occurred surplus */ - tcqmagnbits_fx = L_sub( L_sub( table_logcum_fx[pulsescurr], table_logcum_fx[nzposcurr] ), table_logcum_fx[pulsescurr - ( nzposcurr - 1 )] ); + tcqmagnbits_fx = L_sub( L_sub( table_logcum_fx[pulsescurr], table_logcum_fx[nzposcurr] ), table_logcum_fx[sub( pulsescurr, sub( nzposcurr, 1 ) )] ); *surplus_fx = L_add( *surplus_fx, L_sub( tcqmagnbits_fx, L_shl( magnbits_fx, 1 ) ) ); - + move32(); *nzpout = nzposcurr; move16(); } /*magnitude coding */ @@ -1236,7 +1255,7 @@ Word32 GetISCScale_fx( exp2 = sub( norm_l( pulsesnum ), 1 ); lo = L_Extract_lc( L_shl( actualt_fx, exp1 ), &hi ); scale_fx32 = Div_32( L_shl( pulsesnum, exp2 ), hi, lo ); /*31 + exp2 - exp1 - 12 */ - Qscale = 31 + exp2 - exp1 - 12; + Qscale = add( 31 - 12, sub( exp2, exp1 ) ); /*31 + exp2 - exp1 - 12*/ move16(); } test(); @@ -1247,7 +1266,7 @@ Word32 GetISCScale_fx( FOR( i = 0; i < size; i++ ) { - if ( abs_s( magn_fx[i] ) > 1 ) + if ( GT_16( abs_s( magn_fx[i] ), 1 ) ) { flag_g1 = 1; move16(); @@ -1270,14 +1289,15 @@ Word32 GetISCScale_fx( move16(); /*sbuffer[*bcount] = scale_fx32;*/ exp = norm_s( pulsesnum ); - tmp16 = div_l( actualt_fx, shl( pulsesnum, exp - 1 ) ); + tmp16 = div_l( actualt_fx, shl( pulsesnum, sub( exp, 1 ) ) ); tmp32 = L_shl( L_deposit_l( tmp16 ), exp ); /*sbuffer[*bcount] = 1/((float)tmp32/pow(2.0, 12));*/ sbuffer[*bcount] = tmp32; /*Q12*/ move32(); /*sbuffer[*bcount] = (float)scale_fx32 / pow(2.0, Qscale);*/ - ( *bcount )++; + ( *bcount ) = add( *bcount, 1 ); + move16(); } } } @@ -1297,6 +1317,7 @@ void TCQLSB_fx( { Word16 i, st, dminpos, position; Word16 q_fx = 6554; /*Q15*/ + move16(); Word32 dmin_fx, curdist1_fx, curdist2_fx, newdist1_fx, newdist2_fx; Word16 path[STATES_LSB][TCQ_LSB_SIZE]; Word16 quant[STATES_LSB][TCQ_LSB_SIZE]; @@ -1338,9 +1359,9 @@ void TCQLSB_fx( exp2 = norm_l( s2_fx ); s1_fx16 = extract_h( L_shl( s1_fx, exp1 ) ); /*12 + exp1 - 16*/ s2_fx16 = extract_h( L_shl( s2_fx, exp2 ) ); /*12 + exp2 - 16*/ - exp1 = 12 + exp1 - 16; + exp1 = add( 12 - 16, exp1 ); move16(); - exp2 = 12 + exp2 - 16; + exp2 = add( 12 - 16, exp2 ); move16(); a1_fx = L_add( abuffer_fx[i], 0 ); @@ -1407,36 +1428,36 @@ void TCQLSB_fx( /* decision */ IF( LT_32( L_add( curdist1_fx, newdist1_fx ), L_add( curdist2_fx, newdist2_fx ) ) ) { - path[st][i / 2 + 1] = step_LSB[st][0]; + path[st][add( shr( i, 1 ), 1 )] = step_LSB[st][0]; move16(); - metric_fx[st][i / 2 + 1] = L_add( curdist1_fx, newdist1_fx ); + metric_fx[st][add( shr( i, 1 ), 1 )] = L_add( curdist1_fx, newdist1_fx ); move32(); - quant[st][i / 2 + 1] = 0; + quant[st][add( shr( i, 1 ), 1 )] = 0; move16(); - dquant[st][i / 2 + 1] = dqnt_LSB[step_LSB[st][0]][st]; + dquant[st][add( shr( i, 1 ), 1 )] = dqnt_LSB[step_LSB[st][0]][st]; move16(); } ELSE { - path[st][i / 2 + 1] = step_LSB[st][1]; + path[st][add( shr( i, 1 ), 1 )] = step_LSB[st][1]; move16(); - metric_fx[st][i / 2 + 1] = L_add( curdist2_fx, newdist2_fx ); + metric_fx[st][add( shr( i, 1 ), 1 )] = L_add( curdist2_fx, newdist2_fx ); move32(); - quant[st][i / 2 + 1] = 1; + quant[st][add( shr( i, 1 ), 1 )] = 1; move16(); - dquant[st][i / 2 + 1] = dqnt_LSB[step_LSB[st][0]][st]; + dquant[st][add( shr( i, 1 ), 1 )] = dqnt_LSB[step_LSB[st][0]][st]; move16(); } - if ( GT_32( MaxPath, metric_fx[st][i / 2 + 1] ) ) + if ( GT_32( MaxPath, metric_fx[st][add( shr( i, 1 ), 1 )] ) ) { - MaxPath = L_add( metric_fx[st][i / 2 + 1], 0 ); + MaxPath = L_add( metric_fx[st][add( shr( i, 1 ), 1 )], 0 ); } } /* Metric renormalization to prevent overflow */ FOR( st = 0; st < 4; st++ ) { - metric_fx[st][i / 2 + 1] = L_sub( metric_fx[st][i / 2 + 1], MaxPath ); + metric_fx[st][add( shr( i, 1 ), 1 )] = L_sub( metric_fx[st][add( shr( i, 1 ), 1 )], MaxPath ); move32(); } } @@ -1461,9 +1482,9 @@ void TCQLSB_fx( FOR( ; i >= 0; i -= 2 ) { - qout[i / 2] = quant[position][i / 2 + 1]; + qout[i / 2] = quant[position][add( shr( i, 1 ), 1 )]; move16(); - dpath[i / 2] = dquant[position][i / 2 + 1]; + dpath[i / 2] = dquant[position][add( shr( i, 1 ), 1 )]; move16(); IF( s_and( denc_LSB[position][qout[i / 2]], 0x1 ) ) @@ -1487,7 +1508,7 @@ void TCQLSB_fx( move16(); } - position = path[position][i / 2 + 1]; + position = path[position][add( shr( i, 1 ), 1 )]; move16(); } @@ -1495,6 +1516,7 @@ void TCQLSB_fx( FOR( i = 0; i < bcount; i++ ) { mbuffer_fx[i] = add( add( mbuffer_fx[i], shl( mbuffer_fx[i], 2 ) ), dbuffer_fx[i] ); + move16(); } return; @@ -1506,8 +1528,9 @@ void TCQLSBdec_fx( { /*float q = QTCQ;*/ Word16 q = 1; /*x5*/ + move16(); Word16 i, tmp, state = 0; - + move16(); tmp = shr( bcount, 1 ); FOR( i = 0; i < tmp; i++ ) { @@ -1519,16 +1542,18 @@ void TCQLSBdec_fx( ELSE { mbuffer[2 * i] = negate( q ); + move16(); } IF( s_and( ddec_LSB[state][dpath[i]], 0x2 ) ) { - mbuffer[2 * i + 1] = q; + mbuffer[add( shl( i, 1 ), 1 )] = q; move16(); } ELSE { - mbuffer[2 * i + 1] = negate( q ); + mbuffer[add( shl( i, 1 ), 1 )] = negate( q ); + move16(); } state = dstep_LSB[state][dpath[i]]; @@ -1544,7 +1569,8 @@ void RestoreTCQ_fx( Word16 *mbuffer ) { Word16 i, nzpos = 0, flag_g1 = 0; - + move16(); + move16(); /* calculate actual nz positions */ nzpos = 0; move16(); @@ -1576,6 +1602,7 @@ void RestoreTCQ_fx( magn[i] = mbuffer[*bcount]; move16(); *bcount = add( *bcount, 1 ); + move16(); } } } @@ -1589,7 +1616,8 @@ void RestoreTCQdec_fx( Word16 *mbuffer ) { Word16 i, nzpos = 0, flag_g1 = 0; - + move16(); + move16(); /* calculate actual nz positions */ nzpos = 0; move16(); @@ -1604,6 +1632,7 @@ void RestoreTCQdec_fx( move16(); } magn[i] = extract_l( L_mult0( magn[i], 5 ) ); + move16(); } } @@ -1624,6 +1653,7 @@ void RestoreTCQdec_fx( magn[i] = mbuffer[*bcount]; move16(); *bcount = add( *bcount, 1 ); + move16(); } } } @@ -1661,6 +1691,7 @@ void LoadTCQdata_fx( FOR( i = 0; i < bcount; i++ ) { dpath[i] = ar_decode_fx( arInst, uniform_model ); + move16(); } return; @@ -1675,12 +1706,15 @@ Word32 encode_position_ari_fx( { Word16 i, tmp; Word16 nz = 0, pulses = 0; + move16(); + move16(); Word16 prob[TCQ_MAX_BAND_SIZE]; Word16 model_num_nz[TCQ_MAX_BAND_SIZE]; Word16 *cur_quants = quants; Word16 integer, frac; Word32 /*est_bits_frame_fx, */ btcq_fx = 0, bits_fx = 0, pnzp_fx; - + move16(); + move16(); Word32 cp, scp, fxone, fxp1; Word16 pos; @@ -1704,26 +1738,26 @@ Word32 encode_position_ari_fx( btcq_fx = GetBitsFromPulses_fx( pulses, size ); /* Estimate TCQ bits */ - bits_fx = L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[size - nz + 1] ) ); - bits_fx = L_add( bits_fx, L_sub( btcq_fx, L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[size - nz + 1] ) ) ) ); - bits_fx = L_sub( bits_fx, L_sub( table_logcum_fx[pulses], L_add( table_logcum_fx[nz], table_logcum_fx[pulses - ( nz - 1 )] ) ) ); + bits_fx = L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[add( sub( size, nz ), 1 )] ) ); + bits_fx = L_add( bits_fx, L_sub( btcq_fx, L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[add(sub( size, nz ) , 1)] ) ) ) ); + bits_fx = L_sub( bits_fx, L_sub( table_logcum_fx[pulses], L_add( table_logcum_fx[nz], table_logcum_fx[add( pulses, sub( nz, 1 ) )] ) ) ); bits_fx = L_sub( bits_fx, nz ); *est_bits_frame_fx = L_add( *est_bits_frame_fx, bits_fx ); - + move32(); /*caculate the #nz probability */ tmp = s_min( pulses, size ); FOR( i = 0; i < tmp; i++ ) { pnzp_fx = L_sub( L_deposit_h( add( i, 1 ) ), btcq_fx ); - pnzp_fx = L_add( pnzp_fx, L_add( L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[i + 2], table_logcum_fx[size - i] ) ), - L_sub( table_logcum_fx[pulses], L_add( table_logcum_fx[i + 1], table_logcum_fx[pulses - i] ) ) ) ); + pnzp_fx = L_add( pnzp_fx, L_add( L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[i + 2], table_logcum_fx[sub( size, i )] ) ), + L_sub( table_logcum_fx[pulses], L_add( table_logcum_fx[i + 1], table_logcum_fx[sub( pulses, i )] ) ) ) ); pnzp_fx = L_add( pnzp_fx, 917498 ); /*16 */ IF( GT_32( pnzp_fx, 0 ) ) { integer = extract_h( pnzp_fx ); frac = extract_l( L_shr( L_sub( pnzp_fx, L_deposit_h( integer ) ), 1 ) ); /*15 */ prob[i] = extract_h( L_shl( Pow2( integer, frac ), 16 ) ); /*0 */ - + move16(); /*zero probability will incur problems in ar_make_model() */ if ( prob[i] == 0 ) { @@ -1742,7 +1776,7 @@ Word32 encode_position_ari_fx( IF( GT_16( nz, 1 ) ) { - ar_encode_fx( parenc, model_num_nz, nz - 1 ); /*encode #nz */ + ar_encode_fx( parenc, model_num_nz, sub( nz, 1 ) ); /*encode #nz */ scp = L_add( fxp1, 0 ); pos = 0; move16(); @@ -1759,11 +1793,11 @@ Word32 encode_position_ari_fx( } ELSE { - cp = L_sub( fxone, div_l( L_deposit_h( nz ), ( size - i ) ) ); + cp = L_sub( fxone, div_l( L_deposit_h( nz ), sub( size, i ) ) ); } scp = Mult_32_16( scp, extract_l( cp ) ); model_num_nz[pos + 1] = round_fx( L_shl( scp, 6 ) ); - + move16(); test(); test(); IF( ( model_num_nz[pos + 1] == 0 && scp > 0 ) || model_num_nz[pos] == model_num_nz[pos + 1] ) @@ -1806,8 +1840,8 @@ Word32 encode_position_ari_fx( move16(); FOR( i = 0; i < size; i++ ) { - model_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( div_l( L_deposit_h( size - i - 1 ), size ) ), 1 ) ); - + model_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( div_l( L_deposit_h( sub( sub( size, i ), 1 ) ), size ) ), 1 ) ); + move16(); if ( cur_quants[i] != 0 ) { pos = i; @@ -1839,7 +1873,7 @@ Word32 encode_magnitude_usq_fx( /*estimate fac bits */ - bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - nzpos + 1] ) ); + bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[add( sub( npulses, nzpos ), 1 )] ) ); *est_frame_bits_fx = L_add( *est_frame_bits_fx, bits_fx ); test(); @@ -1860,11 +1894,13 @@ Word32 encode_magnitude_usq_fx( tmp = sub( abs_s( magn_fx[i] ), 1 ); FOR( j = 0; j < tmp; j++ ) { - magn_position[k++] = 0; + magn_position[k] = 0; move16(); + k = add( k, 1 ); } - magn_position[k++] = 1; + magn_position[k] = 1; move16(); + k = add( k, 1 ); } } @@ -1892,7 +1928,7 @@ Word32 encode_magnitude_usq_fx( } scp = Mult_32_16( scp, extract_l( cp ) ); model_m[pos + 1] = round_fx( L_shl( scp, 6 ) ); - + move16(); test(); test(); IF( ( model_m[pos + 1] == 0 && scp > 0 ) || model_m[pos] == model_m[pos + 1] ) @@ -1903,8 +1939,7 @@ Word32 encode_magnitude_usq_fx( ar_encode_fx( parenc, model_m, pos ); pos = 0; move16(); - i--; - move16(); + i = sub( i, 1 ); scp = L_add( fxp1, 0 ); CONTINUE; } @@ -1914,17 +1949,16 @@ Word32 encode_magnitude_usq_fx( ar_encode_fx( parenc, model_m, pos ); pos = 0; move16(); - magnzp--; + magnzp = sub( magnzp, 1 ); move16(); scp = L_add( fxp1, 0 ); } ELSE { - pos++; - move16(); + pos = add( pos, 1 ); } - magnp--; + magnp = sub( magnp, 1 ); move16(); } return bits_fx; @@ -1945,6 +1979,9 @@ Word32 encode_magnitude_tcq_fx( Word16 i, j; Word32 st; Word16 magn_mode[3] = { MAX_AR_FREQ, 0, 0 }; + move16(); + move16(); + move16(); Word16 leftp = npulses; /*pulsesnum; */ Word16 leftnz = nzpos; /*nzpos; */ @@ -1952,8 +1989,9 @@ Word32 encode_magnitude_tcq_fx( move16(); bits_fx = L_deposit_l( 0 ); - tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - ( nzpos - 1 )] ) ); + tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[sub( npulses, sub( nzpos, 1 ) )] ) ); *est_frame_bits_fx = L_add( *est_frame_bits_fx, tcq_bits_fx ); + move32(); test(); IF( EQ_16( nzpos, npulses ) || EQ_16( nzpos, 1 ) ) @@ -1989,7 +2027,7 @@ Word32 encode_magnitude_tcq_fx( exp1 = sub( norm_s( num ), 1 ); exp2 = norm_s( denum ); prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */ - exp = 15 + exp1 - exp2; + exp = add( 15, sub( exp1, exp2 ) ); move16(); prob1_fx = shl( prob1_fx, sub( 15, exp ) ); prob0_fx = sub( MAX_16, prob1_fx ); @@ -2014,6 +2052,7 @@ Word32 encode_magnitude_tcq_fx( } magn_mode[1] = mult( prob1_fx, MAX_AR_FREQ ); + move16(); IF( LT_16( j, sub( abs_s( magn_fx[i] ), 1 ) ) ) { ar_encode_fx( parenc, magn_mode, 0 ); @@ -2046,6 +2085,7 @@ Word32 encode_signs_fx( Word32 i, sign; *est_frame_bits_fx = L_add( *est_frame_bits_fx, L_deposit_h( npos ) ); + move32(); FOR( i = 0; i < size; i++ ) { IF( magn[i] != 0 ) @@ -2076,6 +2116,8 @@ void decode_position_ari_fx( Word16 integer, frac; Word32 cp, scp, fxone, fxp1; Word16 stpos = 0, pos, ovrflag = 0, temppos, storepos; + move16(); + move16(); fxone = 32768; move32(); @@ -2104,14 +2146,15 @@ void decode_position_ari_fx( /*calculate the probability of #nz */ pnzp_fx = L_sub( L_deposit_h( add( i, 1 ) ), btcq_fx ); - pnzp_fx = L_add( pnzp_fx, L_add( L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[i + 2], table_logcum_fx[size - i] ) ), - L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[i + 1], table_logcum_fx[npulses - i] ) ) ) ); + pnzp_fx = L_add( pnzp_fx, L_add( L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[i + 2], table_logcum_fx[sub( size, i )] ) ), + L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[i + 1], table_logcum_fx[sub( npulses, i )] ) ) ) ); pnzp_fx = L_add( pnzp_fx, 917498 ); /*16 */ IF( GT_32( pnzp_fx, 0 ) ) { integer = extract_h( pnzp_fx ); frac = extract_l( L_shr( L_sub( pnzp_fx, L_deposit_h( integer ) ), 1 ) ); /*15 */ prob[i] = extract_h( L_shl( Pow2( integer, frac ), 16 ) ); /*0 */ + move16(); if ( prob[i] == 0 ) { prob[i] = 1; @@ -2127,6 +2170,7 @@ void decode_position_ari_fx( ar_make_model_fx( prob, mode_num_nz, s_min( npulses, size ) ); *nz = add( 1, ar_decode_fx( pardec, mode_num_nz ) ); /*get #nz */ + move16(); nzp = *nz; move16(); IF( nzp == 1 ) @@ -2135,7 +2179,8 @@ void decode_position_ari_fx( move16(); FOR( i = 0; i < size; i++ ) { - mode_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( div_l( L_deposit_h( size - i - 1 ), size ) ), 1 ) ); + mode_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( div_l( L_deposit_h( sub( sub( size, i ), 1 ) ), size ) ), 1 ) ); + move16(); } position[ar_decode_fx( pardec, mode_num_nz )] = 1; @@ -2159,34 +2204,32 @@ void decode_position_ari_fx( ovrflag = 0; move16(); - IF( nzp == ( size - i ) ) + IF( nzp == sub( size, i ) ) { cp = L_deposit_l( 0 ); } ELSE { - cp = L_sub( fxone, div_l( L_deposit_h( nzp ), ( size - i ) ) ); + cp = L_sub( fxone, div_l( L_deposit_h( nzp ), sub( size, i ) ) ); } scp = Mult_32_16( scp, extract_l( cp ) ); - mode_num_nz[i + 1 - storepos - stpos] = round_fx( L_shl( scp, 6 ) ); + mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] = round_fx( L_shl( scp, 6 ) ); test(); test(); - IF( ( mode_num_nz[i + 1 - storepos - stpos] == 0 && scp > 0 ) || mode_num_nz[i - storepos - stpos] == mode_num_nz[i + 1 - storepos - stpos] ) + IF( ( mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] == 0 && scp > 0 ) || EQ_16( mode_num_nz[sub( sub( i, storepos ), stpos )] , mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] ) ) { - mode_num_nz[i + 1 - storepos - stpos] = 0; + mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] = 0; move16(); ovrflag = 1; move16(); temppos = ar_decode_fx( pardec, mode_num_nz ); - move16(); - storepos += temppos; - move16(); + storepos = add( storepos, temppos ); scp = L_add( fxp1, 0 ); - IF( temppos == i - stpos ) /* esc transmitted */ + IF( temppos == sub( i, stpos ) ) /* esc transmitted */ { - i--; + i = sub( i, 1 ); move16(); } ELSE @@ -2197,7 +2240,7 @@ void decode_position_ari_fx( } IF( !ovrflag ) { - pos = ar_decode_fx( pardec, mode_num_nz ) + storepos; + pos = add( ar_decode_fx( pardec, mode_num_nz ), storepos ); move16(); } ELSE @@ -2206,10 +2249,9 @@ void decode_position_ari_fx( move16(); } - position[stpos + pos] = 1; - move16(); - stpos += pos + 1; + position[add( stpos, pos )] = 1; move16(); + stpos = add( stpos, add( pos, 1 ) ); } } } @@ -2223,7 +2265,8 @@ void decode_position_ari_fx( move16(); FOR( i = 0; i < size; i++ ) { - mode_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( div_l( L_deposit_h( size - i - 1 ), size ) ), 1 ) ); + mode_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( div_l( L_deposit_h( sub( sub( size, i ), 1 ) ), size ) ), 1 ) ); + move16(); } position[ar_decode_fx( pardec, mode_num_nz )] = 1; @@ -2247,7 +2290,10 @@ void decode_magnitude_usq_fx( { Word16 i, magnp, magnzp; Word16 magns[TCQ_MAX_BAND_SIZE], magncout = 0; + move16(); Word16 storemagn, ovrflag = 0, pos, tempmagn = 0, mmodel[MAX_PULSES + 2]; + move16(); + move16(); Word32 cp, scp, fxone, fxp1; fxone = 32768; @@ -2304,13 +2350,13 @@ void decode_magnitude_usq_fx( ovrflag = 0; move16(); - IF( magnzp == ( magnp - i ) ) + IF( magnzp == sub( magnp, i ) ) { cp = L_deposit_l( 0 ); } ELSE { - cp = L_sub( fxone, div_l( L_deposit_h( magnzp ), magnp - i ) ); + cp = L_sub( fxone, div_l( L_deposit_h( magnzp ), sub( magnp, i ) ) ); } IF( cp == fxone ) @@ -2319,18 +2365,17 @@ void decode_magnitude_usq_fx( } scp = Mult_32_16( scp, extract_l( cp ) ); - mmodel[i + 1 - storemagn] = round_fx( L_shl( scp, 6 ) ); - + mmodel[sub( add( i, 1 ), storemagn )] = round_fx( L_shl( scp, 6 ) ); + move16(); test(); test(); - IF( ( mmodel[i + 1 - storemagn] == 0 && scp > 0 ) || mmodel[i - storemagn] == mmodel[i + 1 - storemagn] ) + IF( ( mmodel[sub( add( i, 1 ), storemagn )] == 0 && scp > 0 ) || EQ_16( mmodel[sub( i, storemagn )], mmodel[sub( add( i, 1 ), storemagn )] ) ) { - mmodel[i + 1 - storemagn] = 0; + mmodel[sub( add( i, 1 ), storemagn )] = 0; move16(); /* read data */ tempmagn = ar_decode_fx( pardec, mmodel ); - storemagn += tempmagn; - move16(); + storemagn = add( storemagn, tempmagn ); IF( tempmagn < i ) { @@ -2343,8 +2388,7 @@ void decode_magnitude_usq_fx( { /* esc code */ scp = L_add( fxp1, 0 ); - i--; - move16(); + i = sub( i, 1 ); } } } @@ -2359,12 +2403,9 @@ void decode_magnitude_usq_fx( out[magncout] = ar_decode_fx( pardec, mmodel ) + storemagn + 1; move16(); } - magnp -= out[magncout]; - move16(); - magnzp--; - move16(); - magncout++; - move16(); + magnp = sub( magnp, out[magncout] ); + magnzp = sub( magnzp, 1 ); + magncout = add(magncout, 1 ); IF( magnzp == 0 ) /* last magnitude generation */ { @@ -2372,7 +2413,7 @@ void decode_magnitude_usq_fx( { IF( positions[pos] != 0 ) { - out[magncout] = magnp + 1; + out[magncout] = add( magnp, 1 ); move16(); return; } @@ -2380,7 +2421,7 @@ void decode_magnitude_usq_fx( { out[magncout] = 0; move16(); - magncout++; + magncout = add( magncout, 1 ); move16(); } } @@ -2391,8 +2432,7 @@ void decode_magnitude_usq_fx( { out[magncout] = positions[pos]; move16(); - magncout++; - move16(); + magncout = add( magncout, 1 ); } return; } @@ -2401,8 +2441,7 @@ void decode_magnitude_usq_fx( { out[magncout] = 0; move16(); - magncout++; - move16(); + magncout = add( magncout, 1 ); } } @@ -2424,11 +2463,16 @@ void decode_mangitude_tcq_fx( Word16 i, j, symbol, st; Word16 leftp = npulses; /*pulsesnum; */ - Word16 leftnz = nzpos; /*nzpos; */ + move16(); + Word16 leftnz = nzpos; /*nzpos; */ + move16(); Word16 magn_mode[3] = { MAX_AR_FREQ, 0, 0 }; + move16(); + move16(); + move16(); bits_fx = L_deposit_l( 0 ); - tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - ( nzpos - 1 )] ) ); + tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[sub( npulses, sub( nzpos, 1 ) )] ) ); IF( EQ_16( nzpos, npulses ) ) { @@ -2462,6 +2506,7 @@ void decode_mangitude_tcq_fx( } out[i] = positions[i]; + move16(); IF( positions[i] != 0 ) { /*generate the trellis path */ @@ -2483,7 +2528,7 @@ void decode_mangitude_tcq_fx( exp1 = sub( norm_s( num ), 1 ); exp2 = norm_s( denum ); prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */ - exp = 15 + exp1 - exp2; + exp = add(15 , sub(exp1 , exp2)); prob1_fx = shl( prob1_fx, sub( 15, exp ) ); prob0_fx = sub( MAX_16, prob1_fx ); } @@ -2514,7 +2559,7 @@ void decode_mangitude_tcq_fx( /*magn_mode[1] = (short)(prob1 * MAX_AR_FREQ); */ magn_mode[1] = mult( prob1_fx, MAX_AR_FREQ ); - + move16(); IF( ar_decode_fx( pardec, magn_mode ) ) { exp1 = norm_s( prob1_fx ); @@ -2564,6 +2609,7 @@ void decode_mangitude_tcq_fx( IF( positions[i] != 0 ) { out[i] = add( sub( leftp, leftnz ), 1 ); + move16(); } } @@ -2572,6 +2618,7 @@ void decode_mangitude_tcq_fx( { /*update the surplus */ *surplus_fx = L_add( *surplus_fx, L_sub( tcq_bits_fx, L_shl( bits_fx, 1 ) ) ); + move32(); } return; @@ -2594,6 +2641,7 @@ void decode_signs_fx( if ( tmp <= 0 ) { out[i] = negate( out[i] ); + move16(); } } } @@ -2608,18 +2656,19 @@ Word16 GetScale_fx( ) { Word16 pulses = MAX_PULSES, p_est, exp, exp1, exp2, magicnum; + move16(); Word32 t, a, b, ab, estbits_fx = 0; - + move32(); magicnum = 24773; move16(); /*Q17: 0.188992013101951f; */ t = L_shr( L_mult( magicnum, blen ), 2 ); exp = norm_l( t ); - a = L_shl( 14 - exp, 15 ) + Log2_norm_lc( L_shl( t, exp ) ); + a = L_add( L_shl( sub( 14, exp ), 15 ), Log2_norm_lc( L_shl( t, exp ) ) ); exp1 = sub( norm_l( bits_fx ), 1 ); - exp2 = norm_s( blen - 1 ); - b = L_shr( L_deposit_l( div_l( L_shl( bits_fx, exp1 ), shl( blen - 1, exp2 ) ) ), exp1 - exp2 ); + exp2 = norm_s( sub( blen, 1 ) ); + b = L_shr( L_deposit_l( div_l( L_shl( bits_fx, exp1 ), shl( sub( blen, 1 ), exp2 ) ) ), sub( exp1, exp2 ) ); ab = L_add( a, b ); @@ -2639,6 +2688,7 @@ Word16 GetScale_fx( IF( surplus_fx != 0 ) { *surplus_fx = L_add( *surplus_fx, L_sub( bits_fx, estbits_fx ) ); + move16(); } return pulses; diff --git a/lib_com/tcx_ltp_fx.c b/lib_com/tcx_ltp_fx.c index 0c3190705..88481ad6f 100644 --- a/lib_com/tcx_ltp_fx.c +++ b/lib_com/tcx_ltp_fx.c @@ -402,6 +402,7 @@ void predict_signal( const Word16 *x0, *win; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif x0 = &excI[-T0 - 1]; frac = negate( frac ); @@ -453,6 +454,7 @@ static void tcx_ltp_synth_filter( const Word16 *v0, *v1; const Word16 *w0, *w1; Word16 alpha, step = 0; /* initialize just to avoid compiler warning */ + move16(); Word16 i, j, k, L; IF( gain > 0 ) @@ -663,7 +665,7 @@ static void tcx_ltp_synth_filter32( L_tmp2 = Mpy_32_16_r( L_tmp2, alpha ); #ifdef BASOP_NOGLOB L_tmp2 = L_add_sat( synth[j], L_tmp2 ); - IF( zir != NULL ) + if( zir != NULL ) { L_tmp2 = L_sub_sat( L_tmp2, zir[j] ); } @@ -726,12 +728,13 @@ static void tcx_ltp_synth_filter_10( assert( GE_16( filtIdx, 0 ) ); w0 = &tcxLtpFilters[filtIdx].filt[pitch_fr]; - w1 = &tcxLtpFilters[filtIdx].filt[pitch_res - pitch_fr]; + w1 = &tcxLtpFilters[filtIdx].filt[sub(pitch_res , pitch_fr)]; v0 = &tcxLtpFilters[filtIdx].filt[0]; v1 = &tcxLtpFilters[filtIdx].filt[pitch_res]; L = tcxLtpFilters[filtIdx].length; curr_gain = gain; + move16(); gain_step = negate( gain ) / length; for ( j = 0; j < length; j++ ) @@ -784,7 +787,7 @@ static void tcx_ltp_synth_filter_10_fx( y0 = in; y1 = y0 - 1; - assert( GE_16( filtIdx, 0 ) ); + assert( filtIdx >= 0 ); w0 = &tcxLtpFilters[filtIdx].filt[pitch_fr]; w1 = &tcxLtpFilters[filtIdx].filt[pitch_res - pitch_fr]; @@ -793,12 +796,15 @@ static void tcx_ltp_synth_filter_10_fx( L = tcxLtpFilters[filtIdx].length; curr_gain = gain; - gain_step = negate( gain ) / length; + move16(); + gain_step = idiv1616(negate( gain ) , length); // TODO for ( j = 0; j < length; j++ ) { s = 0; + move16(); s2 = 0; + move16(); for ( i = 0, k = 0; i < L; i++, k += pitch_res ) { @@ -810,7 +816,7 @@ static void tcx_ltp_synth_filter_10_fx( // out[j] = in[j] - curr_gain * s2 * ALPHA + curr_gain * s; out[j] = L_add_sat( in[j], Mpy_32_16_1( L_sub_sat( s, Mpy_32_16_1( s2, ALPHA ) ), curr_gain ) ); - + move32(); x0++; x1++; y0++; @@ -845,7 +851,7 @@ static void tcx_ltp_synth_filter_01( y0 = in; y1 = y0 - 1; - assert( GE_16( filtIdx, 0 ) ); + assert( filtIdx >= 0 ); w0 = &tcxLtpFilters[filtIdx].filt[pitch_fr]; w1 = &tcxLtpFilters[filtIdx].filt[pitch_res - pitch_fr]; @@ -854,12 +860,16 @@ static void tcx_ltp_synth_filter_01( L = tcxLtpFilters[filtIdx].length; curr_gain = 0; - gain_step = gain / length; + move16(); + //gain_step = gain / length; // TODO + gain_step = idiv1616(gain , length); // TODO for ( j = 0; j < length; j++ ) { s = 0; + move16(); s2 = 0; + move16(); for ( i = 0, k = 0; i < L; i++, k = add( k, pitch_res ) ) { @@ -871,7 +881,7 @@ static void tcx_ltp_synth_filter_01( // out[j] = in[j] - curr_gain * s2 * ALPHA + curr_gain * s; out[j] = add_sat( in[j], mult_r_sat( curr_gain, sub_sat( round_fx_sat( s ), mult_r_sat( round_fx_sat( s2 ), ALPHA ) ) ) ); - + move32(); x0++; x1++; @@ -907,7 +917,7 @@ static void tcx_ltp_synth_filter_01_fx( y0 = in; y1 = y0 - 1; - assert( GE_16( filtIdx, 0 ) ); + assert( filtIdx >= 0 ); w0 = &tcxLtpFilters[filtIdx].filt[pitch_fr]; w1 = &tcxLtpFilters[filtIdx].filt[pitch_res - pitch_fr]; @@ -916,12 +926,16 @@ static void tcx_ltp_synth_filter_01_fx( L = tcxLtpFilters[filtIdx].length; curr_gain = 0; - gain_step = gain / length; + move16(); + //gain_step = gain / length; // TODO + gain_step = idiv1616(gain , length); // TODO for ( j = 0; j < length; j++ ) { s = 0; + move16(); s2 = 0; + move16(); for ( i = 0, k = 0; i < L; i++, k = add( k, pitch_res ) ) { @@ -933,7 +947,7 @@ static void tcx_ltp_synth_filter_01_fx( // out[j] = in[j] - curr_gain * s2 * ALPHA + curr_gain * s; out[j] = L_add_sat( in[j], Mpy_32_16_r( L_sub_sat( s, Mpy_32_16_1( s2, ALPHA ) ), curr_gain ) ); - + move32(); x0++; x1++; @@ -992,7 +1006,7 @@ static void tcx_ltp_synth_filter_11_unequal_pitch( y0 = in; y1 = y0 - 1; - assert( GE_16( filtIdx, 0 ) && GE_16( prev_filtIdx, 0 ) ); + assert( ( filtIdx >= 0 ) && ( prev_filtIdx >= 0 ) ); w0 = &tcxLtpFilters[prev_filtIdx].filt[prev_pitch_fr]; w1 = &tcxLtpFilters[prev_filtIdx].filt[prev_pitch_res - prev_pitch_fr]; @@ -1000,6 +1014,7 @@ static void tcx_ltp_synth_filter_11_unequal_pitch( v1 = &tcxLtpFilters[prev_filtIdx].filt[prev_pitch_res]; prev_L = tcxLtpFilters[prev_filtIdx].length; + move16(); p0 = &tcxLtpFilters[filtIdx].filt[cur_pitch_fr]; p1 = &tcxLtpFilters[filtIdx].filt[pitch_res - cur_pitch_fr]; @@ -1007,15 +1022,20 @@ static void tcx_ltp_synth_filter_11_unequal_pitch( q1 = &tcxLtpFilters[filtIdx].filt[pitch_res]; L = tcxLtpFilters[filtIdx].length; + move16(); /* 1. decreasing gain filter. The first filter unit with the parameters associated to the previous interval and scaling towards 0 */ gain = prev_gain; - gain_step = negate( prev_gain ) / length; + move16(); + //gain_step = negate( prev_gain ) / length; // TODO + gain_step = idiv1616(negate( prev_gain ) , length); // TODO for ( j = 0; j < length; j++ ) { s = 0; + move16(); s2 = 0; + move16(); for ( i = 0, k = 0; i < prev_L; i++, k += prev_pitch_res ) { @@ -1047,12 +1067,15 @@ static void tcx_ltp_synth_filter_11_unequal_pitch( /* 2. increasing gain filter. The second filter unit with the parameters associated to the current interval and scaling from 0 towards current gain */ gain = 0; - gain_step = cur_gain / length; + move16(); + gain_step = cur_gain / length; // TODO for ( j = 0; j < length; j++ ) { s3 = 0; + move16(); s4 = 0; + move16(); for ( i = 0, k = 0; i < L; i++, k += pitch_res ) { @@ -1064,7 +1087,7 @@ static void tcx_ltp_synth_filter_11_unequal_pitch( // out[j] = *(temp_ptr + j) - gain * s4 * ALPHA + gain * s3; out[j] = add_sat( *( temp_ptr + j ), mult_r_sat( gain, sub_sat( round_fx_sat( s3 ), mult_r_sat( round_fx_sat( s4 ), ALPHA ) ) ) ); - + move32(); l0++; l1++; @@ -1120,6 +1143,7 @@ static void tcx_ltp_synth_filter_11_unequal_pitch_fx( v1 = &tcxLtpFilters[prev_filtIdx].filt[prev_pitch_res]; prev_L = tcxLtpFilters[prev_filtIdx].length; + move16(); p0 = &tcxLtpFilters[filtIdx].filt[cur_pitch_fr]; p1 = &tcxLtpFilters[filtIdx].filt[pitch_res - cur_pitch_fr]; @@ -1127,15 +1151,19 @@ static void tcx_ltp_synth_filter_11_unequal_pitch_fx( q1 = &tcxLtpFilters[filtIdx].filt[pitch_res]; L = tcxLtpFilters[filtIdx].length; + move16(); /* 1. decreasing gain filter. The first filter unit with the parameters associated to the previous interval and scaling towards 0 */ gain = prev_gain; - gain_step = negate( prev_gain ) / length; + move16(); + gain_step = idiv1616(negate( prev_gain ) , length); // TODOD for ( j = 0; j < length; j++ ) { s = 0; + move16(); s2 = 0; + move16(); for ( i = 0, k = 0; i < prev_L; i++, k += prev_pitch_res ) { @@ -1147,7 +1175,7 @@ static void tcx_ltp_synth_filter_11_unequal_pitch_fx( // out[j] = in[j] - gain * s2 * ALPHA + gain * s; out[j] = L_add_sat( in[j], Mpy_32_16_r( L_sub_sat( s, Mpy_32_16_1( s2, ALPHA ) ), gain ) ); - + move32(); x0++; x1++; y0++; @@ -1167,12 +1195,15 @@ static void tcx_ltp_synth_filter_11_unequal_pitch_fx( /* 2. increasing gain filter. The second filter unit with the parameters associated to the current interval and scaling from 0 towards current gain */ gain = 0; - gain_step = cur_gain / length; + move16(); + gain_step = cur_gain / length; // TODO for ( j = 0; j < length; j++ ) { s3 = 0; + move16(); s4 = 0; + move16(); for ( i = 0, k = 0; i < L; i++, k += pitch_res ) { @@ -1184,7 +1215,7 @@ static void tcx_ltp_synth_filter_11_unequal_pitch_fx( // out[j] = *(temp_ptr + j) - gain * s4 * ALPHA + gain * s3; out[j] = L_add_sat( *( temp_ptr + j ), Mpy_32_16_r( L_sub_sat( s3, Mpy_32_16_1( s4, ALPHA ) ), gain ) ); - + move32(); l0++; l1++; @@ -1309,9 +1340,10 @@ void tcx_ltp_post( } filtIdx = 0; /* just to avoid comilation warnings */ + move16(); tcx_buf_len = NS2SA( st->output_Fs, TCXLTP_DELAY_NS ); SideInfoOnly = 0; - + move16(); if ( GE_32( total_brate, HQ_96k ) ) { SideInfoOnly = 1; @@ -1327,16 +1359,17 @@ void tcx_ltp_post( move16(); } - IF( EQ_16( core, ACELP_CORE ) ) + IF( core == ACELP_CORE ) { bfi = 0; + move16(); pitch_int = 0; - pitch_fr = 0; - gain = 0; - L_frame_core = st->L_frame_past; move16(); + pitch_fr = 0; move16(); + gain = 0; move16(); + L_frame_core = st->L_frame_past; move16(); } ELSE @@ -1388,6 +1421,7 @@ void tcx_ltp_post( ELSE IF( bfi == 0 ) { /* LTP and good frame */ + test(); IF( EQ_16( st->element_mode, EVS_MONO ) ) /* hard tunings for EVS_MONO, HQ_48k is TCX only */ { IF( NE_16( output_frame, L_frame_core ) ) @@ -1544,29 +1578,36 @@ void tcx_ltp_post( test(); test(); test(); - //#ifdef IVAS_CODE_TCX_LTP + // #ifdef IVAS_CODE_TCX_LTP if ( st->element_mode != EVS_MONO ) - { - if ( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev == 0 ) + { + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF ( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev == 0 ) { /* The filtering is deactivated, just copy input to the output */ Copy( sig_in + delay, sig_out + delay, L_transition ); } - else if ( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev != 0 ) + ELSE IF ( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev != 0 ) { /* Filtering with the first filter unit */ tcx_ltp_synth_filter_10( sig_out + delay, sig_in + delay, L_transition, hTcxLtpDec->tcxltp_pitch_int_post_prev, hTcxLtpDec->tcxltp_pitch_fr_post_prev, hTcxLtpDec->tcxltp_gain_post_prev, st->pit_res_max_past, hTcxLtpDec->tcxltp_filt_idx_prev ); } - else if ( gain != 0 && hTcxLtpDec->tcxltp_gain_post_prev == 0 ) + ELSE IF( gain != 0 && hTcxLtpDec->tcxltp_gain_post_prev == 0 ) { /* Filtering with the second filter unit */ tcx_ltp_synth_filter_01( sig_out + delay, sig_in + delay, L_transition, pitch_int, pitch_fr, gain, st->pit_res_max, filtIdx ); } - else if ( gain == hTcxLtpDec->tcxltp_gain_post_prev && pitch_int == hTcxLtpDec->tcxltp_pitch_int_post_prev && pitch_fr == hTcxLtpDec->tcxltp_pitch_fr_post_prev && st->pit_res_max == st->pit_res_max_past && filtIdx == hTcxLtpDec->tcxltp_filt_idx_prev ) + ELSE IF( EQ_16(gain ,hTcxLtpDec->tcxltp_gain_post_prev )&& EQ_16(pitch_int , hTcxLtpDec->tcxltp_pitch_int_post_prev) && EQ_16(pitch_fr, hTcxLtpDec->tcxltp_pitch_fr_post_prev )&& EQ_16(st->pit_res_max , st->pit_res_max_past )&& EQ_16(filtIdx , hTcxLtpDec->tcxltp_filt_idx_prev )) { tcx_ltp_synth_filter( sig_out + delay, sig_in + delay, L_transition, pitch_int, pitch_fr, gain, st->pit_res_max, NULL, 0, filtIdx ); } - else + ELSE { /* Filtering with the first filter unit, followed by the filtering with the second filter unit */ tcx_ltp_synth_filter_11_unequal_pitch( sig_out + delay, sig_in + delay, L_transition, pitch_int, pitch_fr, gain, st->pit_res_max, filtIdx, @@ -1574,8 +1615,12 @@ void tcx_ltp_post( } } ELSE - //#endif + // #endif { + test(); + test(); + test(); + test(); IF( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev == 0 ) { Copy( sig_in + delay, sig_out + delay, L_transition ); @@ -1626,6 +1671,7 @@ void tcx_ltp_post( hTcxLtpDec->tcxltp_filt_idx_prev = filtIdx; move16(); st->pit_res_max_past = st->pit_res_max; + move16(); Copy( sig_out, hTcxLtpDec->tcxltp_mem_out, output_frame ); } @@ -1653,14 +1699,16 @@ void tcx_ltp_post32( move32(); IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) { - total_brate = st->bits_frame_nominal * FRAMES_PER_SEC; + total_brate = st->bits_frame_nominal * FRAMES_PER_SEC; // TDO move32(); } filtIdx = 0; /* just to avoid comilation warnings */ + move16(); tcx_buf_len = NS2SA_fx2( st->output_Fs, TCXLTP_DELAY_NS ); + move16(); SideInfoOnly = 0; - + move16(); if ( GE_32( total_brate, HQ_96k ) ) { SideInfoOnly = 1; @@ -1745,7 +1793,7 @@ void tcx_ltp_post32( pitch_int = idiv1616U( tmp, st->pit_res_max ); pitch_fr = sub( tmp, imult1616( pitch_int, st->pit_res_max ) ); } - IF( EQ_16( st->element_mode, EVS_MONO ) ) /* hard tunings for EVS_MONO, HQ_48k is TCX only */ + IF( st->element_mode == EVS_MONO ) /* hard tunings for EVS_MONO, HQ_48k is TCX only */ { test(); test(); @@ -1893,7 +1941,7 @@ void tcx_ltp_post32( test(); test(); test(); - //#ifdef IVAS_CODE_TCX_LTP + // #ifdef IVAS_CODE_TCX_LTP if ( st->element_mode != EVS_MONO ) { if ( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev == 0 ) @@ -1923,7 +1971,7 @@ void tcx_ltp_post32( } } ELSE - //#endif + // #endif { IF( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev == 0 ) { diff --git a/lib_com/tcx_mdct_fx.c b/lib_com/tcx_mdct_fx.c index 76f8e414a..1281c027e 100644 --- a/lib_com/tcx_mdct_fx.c +++ b/lib_com/tcx_mdct_fx.c @@ -30,7 +30,7 @@ static Word16 TCX_MDCT_GetScaleFactor( *factor_e = 0; move16(); } - ELSE IF( EQ_16( L, 4 * NORM_MDCT_FACTOR ) ) + ELSE IF( EQ_16( L, shl( NORM_MDCT_FACTOR, 2 ) ) ) { factor = 16384; move16(); @@ -109,6 +109,7 @@ void TCX_MDCT( #endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif factor = TCX_MDCT_GetScaleFactor( add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &factor_e ); *y_e = add( *y_e, factor_e ); @@ -119,13 +120,13 @@ void TCX_MDCT( /* Init */ FOR( i = 0; i < m / 2; i++ ) { - y[m / 2 + r / 2 + i] = L_mult( x[l + m / 2 - 1 - i], neg_factor ); + y[add( add( shr( m, 1 ), shr( r, 1 ) ), i )] = L_mult( x[sub( sub( add( l, shr( m, 1 ) ), 1 ), i )], neg_factor ); move32(); } FOR( i = 0; i < l / 2; i++ ) { #ifdef BASOP_NOGLOB - y[m / 2 + r / 2 + m / 2 + i] = L_msu_o( L_mult( x[i], factor ), x[l - 1 - i], factor, &Overflow ); + y[add( add( add( shr( m, 1 ), shr( r, 1 ) ), shr( m, 1 ) ), i )] = L_msu_o( L_mult( x[i], factor ), x[sub(sub(l , 1) , i)], factor, &Overflow ); #else /* BASOP_NOGLOB */ y[m / 2 + r / 2 + m / 2 + i] = L_msu( L_mult( x[i], factor ), x[l - 1 - i], factor ); #endif /* BASOP_NOGLOB */ @@ -133,13 +134,13 @@ void TCX_MDCT( } FOR( i = 0; i < m / 2; i++ ) { - y[m / 2 + r / 2 - 1 - i] = L_mult( x[l + m / 2 + i], neg_factor ); + y[sub( sub( add( shr( m, 1 ), shr( r, 1 ) ), 1 ), i )] = L_mult( x[add(add(l , shr(m ,1)) , i)], neg_factor ); move32(); } FOR( i = 0; i < r / 2; i++ ) { #ifdef BASOP_NOGLOB - y[m / 2 + r / 2 - 1 - m / 2 - i] = L_mac_o( L_mult( x[l + m + i], neg_factor ), x[l + m + r - 1 - i], neg_factor, &Overflow ); + y[sub( sub( sub( add( shr( m, 1 ), shr( r, 1 ) ), 1 ), shr( m, 1 ) ), i )] = L_mac_o( L_mult( x[add( add( l, m ), i )], neg_factor ), x[sub(sub(add(add(l , m) , r) , 1) , i)], neg_factor, &Overflow ); #else /* BASOP_NOGLOB */ y[m / 2 + r / 2 - 1 - m / 2 - i] = L_mac( L_mult( x[l + m + i], neg_factor ), x[l + m + r - 1 - i], neg_factor ); #endif /* BASOP_NOGLOB */ @@ -147,8 +148,10 @@ void TCX_MDCT( } *y_e = sub( 15, *y_e ); + move16(); edct_fx( y, y, l / 2 + m + r / 2, y_e ); *y_e = sub( 15 - 1, *y_e ); + move16(); return; } @@ -170,6 +173,7 @@ void TCX_MDST( #endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif factor = TCX_MDCT_GetScaleFactor( add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &factor_e ); *y_e = add( *y_e, factor_e ); @@ -179,13 +183,13 @@ void TCX_MDST( /* Init */ FOR( i = 0; i < m / 2; i++ ) { - y[m / 2 + r / 2 + i] = L_mult( x[l + m / 2 - 1 - i], neg_factor ); + y[add( add( shr( m, 1 ), shr( r, 1 ) ), i )] = L_mult( x[sub( sub( add( l, shr( m, 1 ) ), 1 ), i )], neg_factor ); move32(); } FOR( i = 0; i < l / 2; i++ ) { #ifdef BASOP_NOGLOB - y[m / 2 + r / 2 + m / 2 + i] = L_msu_o( L_mult( x[i], neg_factor ), x[l - 1 - i], factor, &Overflow ); + y[add( add( add( shr(m ,1), shr(r ,1) ), shr(m ,1) ), i )] = L_msu_o( L_mult( x[i], neg_factor ), x[sub(sub(l , 1) , i)], factor, &Overflow ); #else /* BASOP_NOGLOB */ y[m / 2 + r / 2 + m / 2 + i] = L_msu( L_mult( x[i], neg_factor ), x[l - 1 - i], factor ); #endif @@ -193,13 +197,13 @@ void TCX_MDST( } FOR( i = 0; i < m / 2; i++ ) { - y[m / 2 + r / 2 - 1 - i] = L_mult( x[l + m / 2 + i], neg_factor ); + y[sub( sub( add( shr( m, 1 ), shr( r, 1 ) ), 1 ), i )] = L_mult( x[add( add( l, shr( m, 1 ) ), i )], neg_factor ); move32(); } FOR( i = 0; i < r / 2; i++ ) { #ifdef BASOP_NOGLOB - y[m / 2 + r / 2 - 1 - m / 2 - i] = L_mac_sat( L_mult( x[l + m + i], neg_factor ), x[l + m + r - 1 - i], factor ); + y[sub( sub( sub( add( shr( m, 1 ), shr( r, 1 ) ), 1 ), m / 2 ), i )] = L_mac_sat( L_mult( x[add( add( l, m ), i )], neg_factor ), x[sub( sub( add( add( l, m ), r ), 1 ), i )], factor ); #else y[m / 2 + r / 2 - 1 - m / 2 - i] = L_mac( L_mult( x[l + m + i], neg_factor ), x[l + m + r - 1 - i], factor ); #endif @@ -207,7 +211,7 @@ void TCX_MDST( } *y_e = sub( 15, *y_e ); - edst_fx( y, y, l / 2 + m + r / 2, y_e ); + edst_fx( y, y, add( add( shr( l, 1 ), m ), shr( r, 1 ) ), y_e ); *y_e = sub( 15 - 1, *y_e ); return; } @@ -233,7 +237,7 @@ void TCX_MDCT_Inverse( R2 = shr( r, 1 ); x_e = sub( 15, x_e ); - edct_fx( x, tmp_buf + L2, l / 2 + m + r / 2, &x_e ); + edct_fx( x, tmp_buf + L2, add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &x_e ); x_e = sub( 15, x_e ); fac = TCX_MDCT_Inverse_GetScaleFactor( add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &fac_e ); @@ -247,19 +251,22 @@ void TCX_MDCT_Inverse( FOR( i = 0; i < R2; i++ ) { #ifdef BASOP_NOGLOB - y[l + m + R2 + i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); /* fold out right end of DCT */ + y[add(add(add(l , m) , R2) , i)] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[add(L2 , i)], negfac ), s ) ); /* fold out right end of DCT */ #else y[l + m + R2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); /* fold out right end of DCT */ #endif + + move16(); } FOR( i = 0; i < L2; i++ ) { #ifdef BASOP_NOGLOB - y[i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], fac ), s ) ); /* negate, fold out left end of DCT */ + y[i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[add(add(add(L2 , m) , R2) , i)], fac ), s ) ); /* negate, fold out left end of DCT */ #else y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], fac ), s ) ); /* negate, fold out left end of DCT */ #endif + move16(); } FOR( i = 0; i < shr( add( L2, add( m, R2 ) ), 1 ); i++ ) @@ -267,14 +274,15 @@ void TCX_MDCT_Inverse( Word16 f; #ifdef BASOP_NOGLOB - f = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); - y[L2 + i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[l + m + R2 - 1 - i], negfac ), s ) ); /* time-reverse mid of DCT */ + f = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[add( L2, i )], negfac ), s ) ); + y[add( L2, i )] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[sub( sub( add( add( l, m ), R2 ), 1 ), i )], negfac ), s ) ); /* time-reverse mid of DCT */ #else f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); y[L2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[l + m + R2 - 1 - i], negfac ), s ) ); /* time-reverse mid of DCT */ #endif move16(); - y[l + m + R2 - 1 - i] = f; + y[sub( sub( add( add( l, m ), R2 ), 1 ), i )] = f; + move16(); } } @@ -290,6 +298,8 @@ void TCX_MDST_Inverse_fx( Word16 i, fac, negfac, s; Word16 L2 = l, R2 = r; + move16(); + move16(); Word32 tmp_buf[N_MAX + L_MDCT_OVLP_MAX / 2]; Word16 fac_e; @@ -297,7 +307,7 @@ void TCX_MDST_Inverse_fx( R2 = shr( r, 1 ); x_e = sub( 15, x_e ); - edst_fx( x, tmp_buf + L2, l / 2 + m + r / 2, &x_e ); + edst_fx( x, tmp_buf + L2, add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &x_e ); x_e = sub( 15, x_e ); fac = TCX_MDCT_Inverse_GetScaleFactor( add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &fac_e ); @@ -310,23 +320,26 @@ void TCX_MDST_Inverse_fx( FOR( i = 0; i < R2; i++ ) { - y[l + m + R2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], fac ), s ) ); /* fold out right end of DCT */ + y[add(add(add(l , m) , R2) , i)] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add(L2 , i)], fac ), s ) ); /* fold out right end of DCT */ + move16(); } FOR( i = 0; i < L2; i++ ) { - y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], negfac ), s ) ); /* negate, fold out left end of DCT */ + y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( add( add( L2, m ), R2 ), i )], negfac ), s ) ); /* negate, fold out left end of DCT */ + move16(); } FOR( i = 0; i < shr( add( L2, add( m, R2 ) ), 1 ); i++ ) { Word16 f; - f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], fac ), s ) ); + f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( L2, i )], fac ), s ) ); - y[L2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[l + m + R2 - 1 - i], negfac ), s ) ); /* time-reverse mid of DCT */ + y[add(L2 , i)] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[sub( sub( add( add( l, m ), R2 ), 1 ), i )], negfac ), s ) ); /* time-reverse mid of DCT */ + move16(); + y[sub( sub( add( add( l, m ), R2 ), 1 ), i )] = negate( f ); move16(); - y[l + m + R2 - 1 - i] = negate( f ); } } @@ -354,37 +367,54 @@ void TCX_MDXT_Inverse_fx( set32_fx( tmp_buf, 0, N_MAX + L_MDCT_OVLP_MAX / 2 ); - edxt_fx( x, tmp_buf + L2, L2 + m + R2, kernel_type, TRUE ); + edxt_fx( x, tmp_buf + L2, add(add(L2 , m) , R2), kernel_type, TRUE ); fac = TCX_MDCT_Inverse_GetScaleFactor( add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &fac_e ); x_e = add( x_e, fac_e ); negfac = negate( fac ); - signLeft = ( kernel_type >= MDCT_II ? negfac : fac ); - signRight = ( kernel_type & 1 ? fac : negfac ); + IF( GE_16( kernel_type, MDCT_II ) ) + { + signLeft = negfac; + } + ELSE + { + signLeft = fac; + } + //signRight = ( kernel_type & 1 ? fac : negfac ); + IF ( L_and( kernel_type, 1 ) ) + { + signRight = fac; + } + ELSE + { + signRight = negfac; + } s = x_e; move16(); FOR( i = 0; i < L2; i++ ) { - y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], signLeft ), s ) ); /* fold out the left end */ + y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add(add(add(L2 , m) , R2) , i)], signLeft ), s ) ); /* fold out the left end */ } FOR( i = 0; i < R2; i++ ) { - y[l + m + R2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], signRight ), s ) ); /* ...and right end */ + y[add(add(add(l , m) , R2) , i)] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add(L2 , i)], signRight ), s ) ); /* ...and right end */ + move16(); } - FOR( i = 0; i < ( ( L2 + m + R2 ) >> 1 ); i++ ) + FOR( i = 0; i < ( ( add(add(L2 , m) , R2) ) >> 1 ); i++ ) { - f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); + f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add(L2 , i)], negfac ), s ) ); - y[L2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[l + m + R2 - 1 - i], negfac ), s ) ); /* time-reverse mid of DCT */ + y[add(L2 , i)] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[sub(sub(add(add(l , m) , R2) , 1) , i)], negfac ), s ) ); /* time-reverse mid of DCT */ + move16(); + y[sub(sub(add(add(l , m) , R2) , 1) , i)] = f; move16(); - y[l + m + R2 - 1 - i] = f; } return; diff --git a/lib_com/tcx_mdct_window.c b/lib_com/tcx_mdct_window.c index 87333ccd4..44c1755ae 100644 --- a/lib_com/tcx_mdct_window.c +++ b/lib_com/tcx_mdct_window.c @@ -55,13 +55,13 @@ const PWord16 *getSineWindowTable( Word16 length ); void mdct_window_sine_flt( float *window, const int32_t Fs, - const int16_t n, - const int16_t window_type, - const int16_t element_mode ) + const Word16 n, + const Word16 window_type, + const Word16 element_mode ) { if ( element_mode == EVS_MONO ) { - int16_t i; + Word16 i; float c; c = EVS_PI / ( 2.0f * (float) n ); @@ -74,26 +74,26 @@ void mdct_window_sine_flt( else { const float *window_table = 0; - int16_t buf_in_size = 0; + Word16 buf_in_size = 0; switch ( window_type ) { case FULL_OVERLAP: window_table = tcx_mdct_window_48; buf_in_size = 420; - break; + BREAK; case HALF_OVERLAP: window_table = tcx_mdct_window_half_48; buf_in_size = 180; - break; + BREAK; case TRANSITION_OVERLAP: case MIN_OVERLAP: window_table = tcx_mdct_window_trans_48; buf_in_size = 60; - break; + BREAK; default: assert( 0 && "Unsupported window type" ); - break; + BREAK; } if ( Fs == 48000 ) @@ -116,56 +116,64 @@ void mdct_window_sine_IVAS_updated( const Word16 window_type, const Word16 element_mode ) { - if ( element_mode == EVS_MONO ) + IF (EQ_16( element_mode , EVS_MONO )) { const PWord16 *table; table = getSineWindowTable( n ); - for ( int i = 0; i < n / 2; i++ ) + FOR ( Word32 i = 0; i < shr( n, 1 ); i++ ) { window[i].v.re = table[i].v.re; + move16(); window[i].v.im = table[i].v.im; + move16(); } // PMT("getSineWindowTable needs to be updated for IVAS") } - else + ELSE { const Word16 *window_table = 0; - int16_t buf_in_size = 0; - Word16 temp[420] = { 0 }; - switch ( window_type ) + Word16 buf_in_size = 0; + move16(); + Word16 temp[420]; + set16_fx(temp, 0, 420); + SWITCH ( window_type ) { case FULL_OVERLAP: window_table = tcx_mdct_window_48_fx; buf_in_size = 420; - break; + move16(); + BREAK; case HALF_OVERLAP: window_table = tcx_mdct_window_half_48_fx; buf_in_size = 180; - break; + BREAK; case TRANSITION_OVERLAP: case MIN_OVERLAP: window_table = tcx_mdct_window_trans_48_fx; buf_in_size = 60; - break; + move16(); + BREAK; default: assert( 0 && "Unsupported window type" ); - break; + BREAK; } - if ( Fs == 48000 ) + IF( EQ_32( Fs , 48000 )) { Copy( window_table, temp, n ); } - else + ELSE { lerp( window_table, temp, n, buf_in_size ); } - for ( int i = 0; i < n / 2; i++ ) + FOR ( Word32 i = 0; i < shr(n, 1); i++ ) { window[i].v.re = temp[n - 1 - i]; + move16(); window[i].v.im = temp[i]; + move16(); } } } @@ -179,10 +187,12 @@ void mdct_window_sine( PWord16 *window, Word16 n ) { const PWord16 *table; table = getSineWindowTable( n ); - for ( int i = 0; i < n / 2; i++ ) + FOR ( Word32 i = 0; i < shr(n, 1); i++ ) { window[i].v.re = table[i].v.re; + move16(); window[i].v.im = table[i].v.im; + move16(); } // PMT("getSineWindowTable needs to be updated for IVAS") } @@ -190,7 +200,7 @@ void mdct_window_sine( PWord16 *window, Word16 n ) else { const float *window_table = 0; - int16_t buf_in_size = 0; + Word16 buf_in_size = 0; switch ( window_type ) { case FULL_OVERLAP: @@ -233,9 +243,9 @@ void mdct_window_sine( PWord16 *window, Word16 n ) void mdct_window_aldo_flt( float *window1, float *window2, - const int16_t n ) + const Word16 n ) { - int16_t i, n1, n2, d; + Word16 i, n1, n2, d; const float *p1, *p2; /* set table pointers and decimation factor */ @@ -394,6 +404,7 @@ void mdct_window_aldo( p1 = window_48kHz_fx + 2; p2 = window_48kHz_fx + 1110 - 3; d = 6; + move16(); BREAK; case 512 / 2: p1 = window_256kHz; @@ -404,11 +415,13 @@ void mdct_window_aldo( p1 = window_48kHz_fx + 1; p2 = window_48kHz_fx + 1110 - 2; d = 3; + move16(); BREAK; case 1024 / 2: p1 = window_256kHz; p2 = window_256kHz + 592 - 1; d = 1; + move16(); BREAK; case 1280 / 2: p1 = window_48kHz_fx + 1; @@ -419,6 +432,7 @@ void mdct_window_aldo( p1 = window_48kHz_fx; p2 = window_48kHz_fx + 1110 - 1; d = 1; + move16(); BREAK; default: assert( 0 ); diff --git a/lib_com/tcx_utils_fx.c b/lib_com/tcx_utils_fx.c index 74149f2be..0191e2a7c 100644 --- a/lib_com/tcx_utils_fx.c +++ b/lib_com/tcx_utils_fx.c @@ -75,7 +75,6 @@ static void tcx_get_windows( *left_overlap = hTcxCfg->tcx_mdct_window_length; move16(); *left_win = hTcxCfg->tcx_aldo_window_1_trunc; - move16(); BREAK; default: assert( !"Not supported overlap" ); @@ -98,7 +97,6 @@ static void tcx_get_windows( *right_overlap = hTcxCfg->tcx_mdct_window_delay; move16(); *right_win = hTcxCfg->tcx_aldo_window_2; - move16(); BREAK; default: assert( !"Not supported overlap" ); @@ -131,10 +129,8 @@ static void tcx_get_windows( BREAK; case FULL_OVERLAP: *left_overlap = hTcxCfg->tcx_mdct_window_lengthFB; - *left_win = hTcxCfg->tcx_aldo_window_1_FB_trunc; - move16(); move16(); - + *left_win = hTcxCfg->tcx_aldo_window_1_FB_trunc; BREAK; default: assert( !"Not supported overlap" ); @@ -161,7 +157,6 @@ static void tcx_get_windows( case FULL_OVERLAP: *right_overlap = hTcxCfg->tcx_mdct_window_delayFB; move16(); - move16(); *right_win = hTcxCfg->tcx_aldo_window_2_FB; BREAK; default: @@ -366,8 +361,8 @@ void tcx_windowing_synthesis_current_frame( { /*signal[i] *= (float)(i)/(float)(acelp_zir_len); signal[i] += acelp_zir[i]*(float)(acelp_zir_len-i)/(float)(acelp_zir_len);*/ - move16(); signal[i] = add( mult_r( signal[i], div_s( i, acelp_zir_len ) ), mult_r( acelp_zir[i], div_s( sub( acelp_zir_len, i ), acelp_zir_len ) ) ); + move16(); } } /* Rectangular window (past-frame is ACELP) */ @@ -706,8 +701,8 @@ void lpc2mdct( Word16 *mdct_gains_exp, Word16 *mdct_inv_gains, Word16 *mdct_inv_gains_exp, - const int16_t length, - const int16_t noInverse ) + const Word16 length, + const Word16 noInverse ) { Word32 ComplexData[2 * FDNS_NPTS]; Word16 i, j, k, sizeN, step, scale, s, tmp16; @@ -739,7 +734,9 @@ void lpc2mdct( FOR( ; i < FDNS_NPTS; i++ ) { ComplexData[2 * i] = L_deposit_l( 0 ); + move32(); ComplexData[2 * i + 1] = L_deposit_l( 0 ); + move32(); } move16(); @@ -873,14 +870,18 @@ void lpc2mdct_2( FOR( i = 0; i < lpcOrder + 1; i++ ) { RealData_fx[i] = L_mult( lpcCoeffs[i], ptwiddle->v.re ); + move32(); ImagData_fx[i] = L_negate( L_mult( lpcCoeffs[i], ptwiddle->v.im ) ); + move32(); ptwiddle += step; } FOR( ; i < sizeN; i++ ) { RealData_fx[i] = L_deposit_l( 0 ); + move32(); ImagData_fx[i] = L_deposit_l( 0 ); + move32(); } /* half length FFT */ @@ -888,7 +889,8 @@ void lpc2mdct_2( BASOP_cfft_ivas( RealData_fx, ImagData_fx, 1, &scale ); /*Get amplitude*/ - j = FDNS_NPTS - 1; + j = sub(FDNS_NPTS , 1); + move16(); k = 0; move16(); @@ -1172,11 +1174,13 @@ void mdct_noiseShaping_ivas_fx( Word16 m, n, k1, k2; j = 0; + move16(); /* FDNS_NPTS = 64 */ k = shr( lg, 6 ); m = s_and( lg, 0x3F ); Word16 max_e = MIN16B; + move16(); FOR( i = 0; i < FDNS_NPTS; i++ ) { max_e = s_max( max_e, add( *x_e, gains_exp[i] ) ); @@ -1223,7 +1227,9 @@ void mdct_noiseShaping_ivas_fx( FOR( l = 0; l < k; l++ ) { x_fx[i] = Mpy_32_16_1( x_fx[i], gains_fx[j] ); + move32(); x_fx[i] = L_shr( x_fx[i], sub( max_e, add( *x_e, gains_exp[j] ) ) ); + move32(); i = add( i, 1 ); } j = add( j, 1 ); @@ -1236,7 +1242,9 @@ void mdct_noiseShaping_ivas_fx( FOR( l = 0; l < k; l++ ) { x_fx[i] = Mpy_32_16_1( x_fx[i], gains_fx[j] ); + move32(); x_fx[i] = L_shr( x_fx[i], sub( max_e, add( *x_e, gains_exp[j] ) ) ); + move32(); i = add( i, 1 ); } j = add( j, 1 ); @@ -1739,7 +1747,6 @@ void tcx_noise_filling( nrg = L_deposit_l( 1 ); win = 0; move16(); - move16(); FOR( ; i < lowpassLine; i++ ) { @@ -1882,11 +1889,11 @@ void tcx_noise_filling_with_shift( } i = add( i, 1 ); segmentOffset = i; + move16(); } nrg = L_deposit_l( 1 ); win = 0; move16(); - move16(); FOR( ; i < lowpassLine; i++ ) { @@ -1909,13 +1916,15 @@ void tcx_noise_filling_with_shift( FOR( m = segmentOffset; m < tmp2; m++ ) { Word16 nrm = 31; - + move16(); Q[m] = Mpy_32_16_1( Q[m], tmp1 ); + move32(); IF( Q[m] ) { nrm = norm_l( Q[m] ); } Q[m] = L_shl( Q[m], nrm ); + move32(); new_Q_e[m] = sub( add( new_Q_e[m], s ), nrm ); move32(); } @@ -1928,11 +1937,13 @@ void tcx_noise_filling_with_shift( Word16 nrm = 31; Q[m] = Mpy_32_16_1( Q[m], tmp1 ); + move32(); IF( Q[m] ) { nrm = norm_l( Q[m] ); } Q[m] = L_shl( Q[m], nrm ); + move32(); new_Q_e[m] = sub( add( new_Q_e[m], s ), nrm ); move32(); win = sub( win, 1 ); @@ -1951,16 +1962,18 @@ void tcx_noise_filling_with_shift( } Word16 nrm = 31; + move16(); Random( &seed ); Q[i] = L_mult0( mult( seed, fac_ns ), win ); + move32(); IF( Q[i] ) { nrm = norm_l( Q[i] ); } Q[i] = L_shl( Q[i], nrm ); - new_Q_e[i] = 31 - nrm; move32(); + new_Q_e[i] = sub(31 , nrm); tmp1 = shr( seed, 4 ); nrg = L_mac0( nrg, tmp1, tmp1 ); /* sum up energy of current noise segment */ @@ -1985,24 +1998,27 @@ void tcx_noise_filling_with_shift( FOR( m = segmentOffset; m < lowpassLine; m++ ) { Word16 nrm = 31; - + move16(); /* at this point: - flt Q[m] = (Q[m] * 2^(new_Q_e[m] - 31)) / (nTransWidth*nTransWidth) - flt tmp1 = (tmp1 * 2^(s - 15)) * (nTransWidth*nTransWidth) */ Q[m] = Mpy_32_16_1( Q[m], tmp1 ); + move32(); IF( Q[m] ) { nrm = norm_l( Q[m] ); } Q[m] = L_shl( Q[m], nrm ); + move32(); new_Q_e[m] = add( new_Q_e[m], s - nrm ); move32(); } } Word16 max_e = 0; + move16(); FOR( i = 0; i < lowpassLine; i++ ) { max_e = s_max( max_e, new_Q_e[i] ); @@ -2011,6 +2027,7 @@ void tcx_noise_filling_with_shift( FOR( i = 0; i < lowpassLine; i++ ) { Q[i] = L_shr( Q[i], sub( max_e, new_Q_e[i] ) ); + move32(); } *Q_e = max_e; @@ -2028,8 +2045,8 @@ void InitTnsConfigs( STnsConfig tnsConfig[2][2], const Word16 igfStopFreq, const Word32 total_brate, - const int16_t element_mode, - const int16_t MCT_flag ) + const Word16 element_mode, + const Word16 MCT_flag ) { IF( GT_32( total_brate, ACELP_32k ) ) { @@ -2063,10 +2080,13 @@ void SetAllowTnsOnWhite( ) { tnsConfig[0][0].allowTnsOnWhite = allowTnsOnWhite; + move16(); tnsConfig[0][1].allowTnsOnWhite = allowTnsOnWhite; + move16(); tnsConfig[1][0].allowTnsOnWhite = allowTnsOnWhite; + move16(); tnsConfig[1][1].allowTnsOnWhite = allowTnsOnWhite; - + move16(); return; } #endif @@ -2216,27 +2236,31 @@ void init_TCX_config( { /* Initialize the TCX MDCT windows */ hTcxCfg->tcx_mdct_window_length = extract_l( L_shr( L_mult0( L_LOOK_12k8, fscale ), LD_FSCALE_DENOM ) ); + move16(); hTcxCfg->tcx_mdct_window_delay = hTcxCfg->tcx_mdct_window_length; move16(); hTcxCfg->tcx_mdct_window_half_length = extract_l( L_shr( L_mult0( L_LOOK_12k8 - NS2SA( 12800, 5000000L ), fscale ), LD_FSCALE_DENOM ) ); - - hTcxCfg->tcx_mdct_window_min_length = shr( L_frame, 4 ); /* 1.25ms */ + move16(); + hTcxCfg->tcx_mdct_window_min_length = shr( L_frame, 4 ); /* 1.25ms */ + move16(); hTcxCfg->tcx_mdct_window_trans_length = shr( L_frame, 4 ); /* 1.25ms */ - + move16(); hTcxCfg->tcx5Size = shr( L_frame, 2 ); /* 5ms */ - + move16(); hTcxCfg->tcx_mdct_window_lengthFB = extract_l( L_shr( L_mult0( L_LOOK_12k8, fscaleFB ), LD_FSCALE_DENOM ) ); + move16(); hTcxCfg->tcx_mdct_window_delayFB = hTcxCfg->tcx_mdct_window_lengthFB; move16(); hTcxCfg->tcx_mdct_window_half_lengthFB = extract_l( L_shr( L_mult0( L_LOOK_12k8 - NS2SA( 12800, 5000000L ), fscaleFB ), LD_FSCALE_DENOM ) ); - - hTcxCfg->tcx_mdct_window_min_lengthFB = shr( L_frameTCX, 4 ); /* 1.25ms */ + move16(); + hTcxCfg->tcx_mdct_window_min_lengthFB = shr( L_frameTCX, 4 ); /* 1.25ms */ + move16(); hTcxCfg->tcx_mdct_window_trans_lengthFB = shr( L_frameTCX, 4 ); /* 1.25ms */ - + move16(); hTcxCfg->tcx5SizeFB = shr( L_frameTCX, 2 ); /* 5ms */ - + move16(); mdct_window_sine( hTcxCfg->tcx_mdct_window, hTcxCfg->tcx_mdct_window_length ); mdct_window_sine( hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_half_length ); mdct_window_sine( hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_min_length ); diff --git a/lib_com/tec_com.c b/lib_com/tec_com.c index 5e32b842b..dd902ea4b 100644 --- a/lib_com/tec_com.c +++ b/lib_com/tec_com.c @@ -80,6 +80,7 @@ static Word32 calcVar_Fix( xx = L_deposit_l( 0 ); *x = L_deposit_l( 0 ); + move32(); FOR( i = 0; i < len; i++ ) { @@ -88,6 +89,7 @@ static Word32 calcVar_Fix( tmpX = L_shr( Mpy_32_32( L_shl( in[i], exp1 ), L_shl( in[i], exp1 ) ), r_sft ); xx = L_add( xx, tmpX ); *x = L_add( *x, in[i] ); + move32(); } ans = L_deposit_l( 0 ); @@ -213,11 +215,13 @@ static Word32 calcCorrelationCoefficient2_Fix( r_sft = sub( 8, sub( exp2, exp1 ) ); tmpCor = L_shr( tmpCor, r_sft ); ans = tmpCor; + move16(); } } ELSE { ans = 0; + move16(); } @@ -256,7 +260,6 @@ static void calcLoBufferEnc_Fx( li = TecLowBandTable[lb]; move16(); ui = sub( TecLowBandTable[lb + 1], 1 ); - move16(); assert( ( ui - li ) == 1 ); @@ -283,6 +286,7 @@ static void calcLoBufferEnc_Fx( /* 0.50171665944 = 10 * log10(2.0) / NbTecLowBand / 2.0 */ loBuffer[slot] = extract_h( L_shl( Mpy_32_16_1( tmp, 16440 /*0.50171665944 Q15*/ ), 1 ) ); + move16(); } } /*------------------------------------------------------------------- @@ -318,7 +322,6 @@ static void calcHiTempEnv_Fx( normFac = getNormReciprocalWord16( bwHigh ); scale = sub( scale, s1 ); - move16(); FOR( timeIndex = startPos; timeIndex < stopPos; timeIndex++ ) { @@ -350,6 +353,7 @@ static void calcHiTempEnv_Fx( /* 0.75257498916 = 10 * log10(2.0) / 4.0 */ hiTempEnv[timeIndex] = extract_h( L_shr( L_shl( Mpy_32_16_1( nrgLog, 24660 /*0.75257498916 Q15*/ ), 2 ), 1 ) ); + move16(); } } /*------------------------------------------------------------------- @@ -433,6 +437,7 @@ static void calcLoBufferDec_Fx( /* 0.50171665944 = 10 * log10(2.0) / NbTecLowBand / 2.0 */ loBuffer[slot] = extract_h( L_shl( Mpy_32_16_1( tmp, 16440 /*0.50171665944 Q15*/ ), 1 ) ); + move16(); } ELSE { @@ -468,6 +473,7 @@ static void calcLoTempEnv_Fx( } /* adjFac is scaled by factor 0.5 */ loTempEnv_Fx[slot] = extract_h( Mpy_32_16_1( accu, adjFac_Fx ) ); + move16(); } } /*------------------------------------------------------------------- @@ -506,6 +512,7 @@ static void calcLoTempEnv_TBE_Fx( Word16 slot; Word32 accu; Word16 delay = 1; + move16(); /* TecSC_Fx values are scaled by factor 2.0 */ FOR( slot = 0; slot < noCols; slot++ ) @@ -517,6 +524,7 @@ static void calcLoTempEnv_TBE_Fx( } /* adjFac is scaled by factor 0.5 */ loTempEnv_Fx[slot] = extract_h( Mpy_32_16_1( accu, adjFac_Fx ) ); + move16(); } } /*------------------------------------------------------------------- @@ -534,6 +542,7 @@ static void calcLoTempEnv_ns_TBE_Fx( Word16 slot; Word16 delay = 1; Word16 fac = 22938 /*1.4f * 0.5f Q15*/; + move16(); FOR( slot = 0; slot < noCols; slot++ ) { @@ -605,7 +614,9 @@ static void calcGainLinear_TBE_Fx( s2 = norm_l( tmp32 ); pGainTemp_m[slot] = extract_h( L_shl( tmp32, s2 ) ); + move16(); pGainTemp_e[slot] = sub( s, s2 ); + move16(); } } /*------------------------------------------------------------------- @@ -629,10 +640,11 @@ void calcGainTemp_TBE_Fx( Word16 loTempEnv_Fx[16]; const Word16 BW_LO = TecLowBandTable[NBTECLOWBAND]; + move16(); Word16 slot; - Word16 noCols = stopPos - startPos; - Word16 bandOffset = lowSubband - BW_LO; + Word16 noCols = sub( stopPos, startPos ); + Word16 bandOffset = sub( lowSubband, BW_LO ); assert( lowSubband >= BW_LO ); @@ -643,7 +655,7 @@ void calcGainTemp_TBE_Fx( startPos, stopPos, bandOffset, - 15 - cldfb_exp ); + sub(15 , cldfb_exp) ); IF( code > 0 ) { @@ -680,7 +692,9 @@ static void setSubfrConfig_Fix( const Word16 l_subfr ) { *n_subfr = sub( (Word16) N_TEC_TFA_SUBFR, i_offset ); + move16(); *k_offset = i_mult( i_offset, l_subfr ); + move16(); } /*------------------------------------------------------------------- * calcSum_Fx() @@ -699,7 +713,9 @@ static Word16 calcSum_Fx( Word16 sum16_e; /* Q0 */ *sum16_m = 0; + move16(); sum16_e = 0; + move16(); FOR( slot = 0; slot < len; slot++ ) { sum16_e = BASOP_Util_Add_MantExp( @@ -731,8 +747,10 @@ static Word16 calcSubfrNrg_Fx( Word16 s; Word16 sum16_e; Word16 s2 = 1; /* headroom for a summatoin of length l_subfr ( < 2^s2 = 64 ) */ + move16(); k = k_offset; + move16(); FOR( i = i_offset; i < N_TEC_TFA_SUBFR; i++ ) { Word32 nrg32; @@ -771,7 +789,9 @@ static Word16 calcSubfrNrg_Fx( } sum16_e = enr_e[i_offset]; + move16(); *sum16_m = enr_m[i_offset]; + move16(); FOR( i = i_offset + 1; i < N_TEC_TFA_SUBFR; i++ ) { @@ -868,6 +888,7 @@ static Word16 procTec_Fx( gain_ave_e = sub( gain_ave_e, 3 ); k = k_offset; + move16(); FOR( i = i_offset; i < N_TEC_TFA_SUBFR; i++ ) { IF( enr_m[i] > 0 ) @@ -943,7 +964,6 @@ static Word16 procTec_Fx( lower_limit_gain_m = min_curr_enr_m; move16(); lower_limit_gain_e = sub( min_curr_enr_e, 1 ); - move16(); } /* upper_limit_gain */ @@ -977,7 +997,9 @@ static Word16 procTec_Fx( } gain_m[i] = mult_r( gain_m[i], inv_curr_enr_m[i] ); + move16(); gain_e[i] = add( gain_e[i], inv_curr_enr_e[i] ); + move16(); s = norm_s( gain_m[i] ); gain_m[i] = shl( gain_m[i], s ); @@ -1009,8 +1031,7 @@ static Word16 procTec_Fx( s = norm_s( hb_synth_Fx[k] ); hb_synth_Fx[k] = mult_r( gain_m[i], shl( hb_synth_Fx[k], s ) ); move16(); - shift[k] = s - gain_e[i]; - move16(); + shift[k] = sub(s , gain_e[i]); if ( GT_16( min_shift, shift[k] ) ) { @@ -1040,6 +1061,7 @@ static Word16 procTec_Fx( min_shift = sub( s, exp_syn ); /* exp_syn(old) - exp_syn(new) */ k = k_offset; + move16(); FOR( i = i_offset; i < N_TEC_TFA_SUBFR; i++ ) { FOR( j = 0; j < l_subfr; j++ ) @@ -1203,6 +1225,7 @@ Word16 procTecTfa_TBE_Fx( Word16 code ) { Word16 i_offset = 0; + move16(); Word16 exp_syn_frame = sub( 15, hb_synth_fx_exp ); @@ -1252,8 +1275,11 @@ void calcHiEnvLoBuff_Fix( Word16 pCldfbPow_FixScale ) { const Word16 BW_LO = TecLowBandTable[NBTECLOWBAND]; + move16(); const Word16 lowSubband = pFreqBandTable[0]; + move16(); const Word16 highSubband = pFreqBandTable[nSfb]; + move16(); Word16 bandOffsetBottom; @@ -1300,7 +1326,9 @@ void calcLoEnvCheckCorrHiLo_Fix( ) { const Word16 BW_LO = TecLowBandTable[NBTECLOWBAND]; + move16(); const Word16 lowSubband = pFreqBandTable[0]; + move16(); Word16 i; Word16 bandOffsetBottom; @@ -1317,6 +1345,7 @@ void calcLoEnvCheckCorrHiLo_Fix( Word32 EQ4, EQ5, EQ6; Word16 code = 0; /* SET TENTATIVELY */ + move16(); Word32 loVar_ns_Fix; Word32 diff_hi_lo_sum_Fix; Word32 loSum_ns_Fix; @@ -1335,6 +1364,7 @@ void calcLoEnvCheckCorrHiLo_Fix( FOR( i = 0; i < noCols + DELAY_TEMP_ENV_BUFF_TEC; i++ ) { hiTempEnv32_Fix[i] = L_deposit_l( hiTempEnv[i] ); + move32(); } hiVar_Fix = calcVar_Fix( hiTempEnv32_Fix, (Word32) noCols, &hiSum_Fix ); @@ -1355,6 +1385,7 @@ void calcLoEnvCheckCorrHiLo_Fix( FOR( i = 0; i < noCols; i++ ) { loTempEnv32_ns_Fix[i] = L_deposit_l( loTempEnv_ns_Fix[i] ); + move32(); } loVar_ns_Fix = calcVar_Fix( loTempEnv32_ns_Fix, noCols, &loSum_ns_Fix ); @@ -1362,9 +1393,9 @@ void calcLoEnvCheckCorrHiLo_Fix( EQ4 = L_sub( L_shr( hiVar_Fix, 7 ), 800 ); EQ5 = L_sub( L_shr( loVar_ns_Fix, 7 ), 720 ); - ; + EQ6 = L_sub( L_shr( diff_hi_lo_sum_Fix, 7 ), 100 ); - ; + test(); test(); if ( EQ4 > 0 && EQ5 > 0 && EQ6 < 0 ) @@ -1393,6 +1424,7 @@ void calcLoEnvCheckCorrHiLo_Fix( move16(); maxPosHi = maxPosLo = 0; move16(); + move16(); FOR( i = 1; i < noCols; i++ ) { if ( LT_16( maxHiFix, hiTempEnv[i] ) ) @@ -1419,12 +1451,14 @@ void calcLoEnvCheckCorrHiLo_Fix( { Word16 feature_max_Fix = 0; + move16(); Word16 pos_feature_max = 0; + move16(); Word16 feature_Fix[16]; Word16 min_local_Fix, max_local_Fix; Word16 j; Word16 len_window = EXT_DELAY_HI_TEMP_ENV + 1; - + move16(); Word16 *curr_pos_Fix = hiTempEnv; move16(); @@ -1458,6 +1492,7 @@ void calcLoEnvCheckCorrHiLo_Fix( } } feature_Fix[i] = sub( max_local_Fix, min_local_Fix ); + move16(); if ( LT_16( feature_max_Fix, feature_Fix[i] ) ) { @@ -1492,6 +1527,7 @@ void calcLoEnvCheckCorrHiLo_Fix( FOR( i = 0; i < noCols; i++ ) { loTempEnv32_Fix[i] = L_deposit_l( loTempEnv_Fix[i] ); + move32(); } loVar_Fix = calcVar_Fix( loTempEnv32_Fix, noCols, &loSum_Fix ); /* = = */ diff --git a/lib_com/tns_base.c b/lib_com/tns_base.c index f89bf8e07..4e2ce9c96 100644 --- a/lib_com/tns_base.c +++ b/lib_com/tns_base.c @@ -90,6 +90,7 @@ void InitTnsConfiguration( const int16_t is_mct ) { Word16 iFilter = 0; + move16(); Word16 *startLineFilter; Word32 L_tmp; Word32 nSampleRate; @@ -105,7 +106,9 @@ void InitTnsConfiguration( /* Sanity checks */ assert( ( nSampleRate > 0 ) && ( frameLength > 0 ) && ( pTnsConfig != NULL ) ); - if ( ( nSampleRate <= 0 ) || ( frameLength <= 0 ) || ( pTnsConfig == NULL ) ) + test(); + test(); + IF ( ( nSampleRate <= 0 ) || ( frameLength <= 0 ) || ( pTnsConfig == NULL ) ) { return /*TNS_FATAL_ERROR*/; } @@ -250,8 +253,6 @@ void ApplyTnsFilter( Word16 parCoeff[TNS_MAX_FILTER_ORDER]; const STnsFilter *pFilter; - - move16(); move16(); move16(); pFilter = &pTnsData->filter[iFilter]; @@ -309,6 +310,7 @@ Word16 ITF_Detect_fx( Word16 spectrumLength; Word16 const nSubdivisions = MAX_SUBDIVISIONS; + move16(); Word16 iSubdivisions; Word16 iStartLine; Word16 iEndLine; @@ -323,6 +325,7 @@ Word16 ITF_Detect_fx( Word16 n, i; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif move16(); @@ -357,7 +360,7 @@ Word16 ITF_Detect_fx( /* Check threshold HLM_MIN_NRG */ BASOP_SATURATE_WARNING_OFF_EVS; #ifdef BASOP_NOGLOB - tmp32 = L_sub( L_shl_o( L_tmp, sub( shift, 24 - Q ), &Overflow ), 4194304l /*HLM_MIN_NRG Q7*/ ); + tmp32 = L_sub( L_shl_o( L_tmp, sub( shift, sub(24 , Q) ), &Overflow ), 4194304l /*HLM_MIN_NRG Q7*/ ); #else /* BASOP_NOGLOB */ tmp32 = L_sub( L_shl( L_tmp, sub( shift, 24 - Q ) ), 4194304l /*HLM_MIN_NRG Q7*/ ); #endif @@ -435,6 +438,7 @@ Word16 ITF_Detect_fx( FOR( i = 0; i < n; i++ ) { tmpbuf[i] = round_fx( L_shl( pSpectrum[iStartLine + i - IGF_START_MN], shift ) ); + move16(); } FOR( lag = 0; lag <= maxOrder; lag++ ) @@ -464,6 +468,7 @@ Word16 ITF_Detect_fx( ITF_GetFilterParameters_fx( rxx, s_min( maxOrder, shr( spectrumLength, 2 ) ), A, Q_A, predictionGain ); *curr_order = maxOrder; + move16(); } return 1; @@ -483,6 +488,7 @@ Word16 ITF_Detect_ivas_fx( Word16 spectrumLength; Word16 const nSubdivisions = MAX_SUBDIVISIONS; + move16(); Word16 iSubdivisions; Word16 iStartLine; Word16 iEndLine; @@ -497,6 +503,7 @@ Word16 ITF_Detect_ivas_fx( Word16 n, i; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif move16(); @@ -605,6 +612,7 @@ Word16 ITF_Detect_ivas_fx( FOR( i = 0; i < n; i++ ) { tmpbuf[i] = round_fx_o( L_shl( pSpectrum[iStartLine + i - IGF_START_MN], shift ), &Overflow ); + move16(); } FOR( lag = 0; lag <= maxOrder; lag++ ) @@ -634,6 +642,7 @@ Word16 ITF_Detect_ivas_fx( ITF_GetFilterParameters_fx( rxx, s_min( maxOrder, shr( spectrumLength, 2 ) ), A, Q_A, predictionGain ); *curr_order = maxOrder; + move16(); } return 1; @@ -672,6 +681,8 @@ static Word16 DecodeUsingTable( Decoder_State *st, Word16 *pValue, const Coding { Word16 code = 0; Word16 nBits = 0; + move16(); + move16(); Word16 valueIndex; assert( ( nSize >= 0 ) && ( nSize <= 256 ) ); @@ -688,7 +699,9 @@ static Word16 DecodeUsingTable( Decoder_State *st, Word16 *pValue, const Coding if ( nBits > nSize || nBits > 16 ) { st->BER_detect = 1; + move16(); *pValue = 0; + move16(); return -1; } @@ -705,12 +718,14 @@ static Word16 DecodeUsingTable( Decoder_State *st, Word16 *pValue, const Coding if ( valueIndex < nSize ) { *pValue = (Word16) codes[valueIndex].value; + move16(); } else { st->BER_detect = 1; + move16(); *pValue = 0; - + move16(); return -1; } @@ -723,12 +738,14 @@ static Word16 DecodeUsingTable( Decoder_State *st, Word16 *pValue, const Coding void const *GetTnsFilterCoeff( void const *p, const Word16 index, Word16 *pValue ) { *pValue = ( (Word16 const *) p )[index] + INDEX_SHIFT; + move16(); return NULL; } void *SetTnsFilterCoeff( void *p, const Word16 index, const Word16 value ) { ( (Word16 *) p )[index] = sub( value, INDEX_SHIFT ); + move16(); return NULL; } @@ -884,15 +901,17 @@ Word16 DecodeTnsFilterOrder( Decoder_State *st, const Word16 index, Word16 *pVal void const *GetNumOfTnsFilters( void const *p, const Word16 index, Word16 *pValue ) { + move16(); *pValue = ( (STnsData const *) p )[index].nFilters; - + move16(); return ( (STnsData const *) p )[index].filter; } void *SetNumOfTnsFilters( void *p, const Word16 index, Word16 value ) { + move16(); ( (STnsData *) p )[index].nFilters = value; - + move16(); return ( (STnsData *) p )[index].filter; } @@ -951,7 +970,9 @@ void const *GetTnsEnabledSingleFilter( void const *p, const Word16 index, Word16 void *SetTnsEnabledSingleFilter( void *p, const Word16 index, const Word16 value ) { + move16(); ( (STnsData *) p )[index].nFilters = value; + move16(); return ( (STnsData *) p )[index].filter; } @@ -966,13 +987,18 @@ void ResetTnsData( STnsData *pTnsData ) pTnsData->nFilters = 0; + move16(); pTnsData->tnsOnWhitenedSpectra = 0; + move16(); FOR( iFilter = 0; iFilter < (Word16) ( sizeof( pTnsData->filter ) / sizeof( pTnsData->filter[0] ) ); iFilter++ ) { STnsFilter *const pTnsFilter = &pTnsData->filter[iFilter]; pTnsFilter->spectrumLength = 0; + move16(); pTnsFilter->predictionGain = ONE_IN_Q7; + move16(); pTnsFilter->avgSqrCoef = 0; + move16(); /* TODO: remove float _flt dependencies */ pTnsFilter->predictionGain_flt = 1.0f; pTnsFilter->avgSqrCoef_flt = 0; @@ -990,6 +1016,7 @@ void ClearTnsFilterCoefficients( { move16(); pTnsFilter->order = 0; + move16(); assert( TNS_MAX_FILTER_ORDER == 8 ); move16(); move16(); @@ -1194,6 +1221,7 @@ static void ITF_GetFilterParameters_fx( L_tmp = E_LPC_schur( rxx, parCoeff, epsP, maxOrder ); BASOP_SATURATE_WARNING_OFF_EVS /* Allow saturation, this value is compared against a threshold. */ *predictionGain = divide3232( L_shr( epsP[0], PRED_GAIN_E ), L_tmp ); + move16(); BASOP_SATURATE_WARNING_ON_EVS { @@ -1202,8 +1230,9 @@ static void ITF_GetFilterParameters_fx( /* Convert ParCor / reflection coefficients to LPC */ A32[0] = 134217728l /*1.0 Q27*/; - move16(); /* Q11+16 */ + move32(); /* Q11+16 */ A32[1] = L_shr( L_deposit_h( parCoeff[0] ), 4 ); /* Q11+16 */ + move32(); FOR( i = 1; i < maxOrder; i++ ) { @@ -1239,8 +1268,10 @@ static void ITF_GetFilterParameters_fx( FOR( i = 0; i < maxOrder; i++ ) { A[i] = round_fx( L_shl( A32[i], tmp ) ); /* Q11+tmp */ + move16(); } *Q_A = add( 11, tmp ); + move16(); } return; } -- GitLab From 434df91271ea1c7a72a8f8d329efa2d4acb63c81 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 11 Jul 2024 12:28:03 +0530 Subject: [PATCH 059/110] Clang formatting changes --- lib_com/tcq_position_arith_fx.c | 18 +++++------ lib_com/tcx_ltp_fx.c | 54 ++++++++++++++++----------------- lib_com/tcx_mdct_fx.c | 34 ++++++++++----------- lib_com/tcx_mdct_window.c | 14 ++++----- lib_com/tcx_utils_fx.c | 4 +-- lib_com/tec_com.c | 4 +-- lib_com/tns_base.c | 4 +-- 7 files changed, 66 insertions(+), 66 deletions(-) diff --git a/lib_com/tcq_position_arith_fx.c b/lib_com/tcq_position_arith_fx.c index 459c4d362..2ae9e8505 100644 --- a/lib_com/tcq_position_arith_fx.c +++ b/lib_com/tcq_position_arith_fx.c @@ -107,8 +107,8 @@ static UWord32 bitstream_load_bit( } curPos = &pBS->curPos; - bit = UL_and( UL_lshr( pBS->buf[pBS->numByte] , ( *curPos ) ) , 0x00000001 ); - *curPos = sub(*curPos, 1); + bit = UL_and( UL_lshr( pBS->buf[pBS->numByte], ( *curPos ) ), 0x00000001 ); + *curPos = sub( *curPos, 1 ); IF( *curPos < 0 ) { @@ -406,7 +406,7 @@ static Word16 ar_decode_fx( arInst->value = value; move32(); - return ( sub(symbol , 1) ); + return ( sub( symbol, 1 ) ); } void ar_decoder_done_fx( @@ -668,7 +668,7 @@ static void TCQnew_fx( move16(); if ( v_fx[i - 1] <= 0 ) { - vout_fx[i - 1] = negate(quant_fx[position][i]); + vout_fx[i - 1] = negate( quant_fx[position][i] ); move16(); } position = path_fx[position][i]; @@ -1739,7 +1739,7 @@ Word32 encode_position_ari_fx( btcq_fx = GetBitsFromPulses_fx( pulses, size ); /* Estimate TCQ bits */ bits_fx = L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[add( sub( size, nz ), 1 )] ) ); - bits_fx = L_add( bits_fx, L_sub( btcq_fx, L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[add(sub( size, nz ) , 1)] ) ) ) ); + bits_fx = L_add( bits_fx, L_sub( btcq_fx, L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[add( sub( size, nz ), 1 )] ) ) ) ); bits_fx = L_sub( bits_fx, L_sub( table_logcum_fx[pulses], L_add( table_logcum_fx[nz], table_logcum_fx[add( pulses, sub( nz, 1 ) )] ) ) ); bits_fx = L_sub( bits_fx, nz ); *est_bits_frame_fx = L_add( *est_bits_frame_fx, bits_fx ); @@ -2217,7 +2217,7 @@ void decode_position_ari_fx( test(); test(); - IF( ( mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] == 0 && scp > 0 ) || EQ_16( mode_num_nz[sub( sub( i, storepos ), stpos )] , mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] ) ) + IF( ( mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] == 0 && scp > 0 ) || EQ_16( mode_num_nz[sub( sub( i, storepos ), stpos )], mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] ) ) { mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] = 0; move16(); @@ -2405,7 +2405,7 @@ void decode_magnitude_usq_fx( } magnp = sub( magnp, out[magncout] ); magnzp = sub( magnzp, 1 ); - magncout = add(magncout, 1 ); + magncout = add( magncout, 1 ); IF( magnzp == 0 ) /* last magnitude generation */ { @@ -2528,7 +2528,7 @@ void decode_mangitude_tcq_fx( exp1 = sub( norm_s( num ), 1 ); exp2 = norm_s( denum ); prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */ - exp = add(15 , sub(exp1 , exp2)); + exp = add( 15, sub( exp1, exp2 ) ); prob1_fx = shl( prob1_fx, sub( 15, exp ) ); prob0_fx = sub( MAX_16, prob1_fx ); } @@ -2658,7 +2658,7 @@ Word16 GetScale_fx( Word16 pulses = MAX_PULSES, p_est, exp, exp1, exp2, magicnum; move16(); Word32 t, a, b, ab, estbits_fx = 0; - move32(); + move32(); magicnum = 24773; move16(); /*Q17: 0.188992013101951f; */ diff --git a/lib_com/tcx_ltp_fx.c b/lib_com/tcx_ltp_fx.c index 88481ad6f..134e861af 100644 --- a/lib_com/tcx_ltp_fx.c +++ b/lib_com/tcx_ltp_fx.c @@ -665,7 +665,7 @@ static void tcx_ltp_synth_filter32( L_tmp2 = Mpy_32_16_r( L_tmp2, alpha ); #ifdef BASOP_NOGLOB L_tmp2 = L_add_sat( synth[j], L_tmp2 ); - if( zir != NULL ) + if ( zir != NULL ) { L_tmp2 = L_sub_sat( L_tmp2, zir[j] ); } @@ -728,7 +728,7 @@ static void tcx_ltp_synth_filter_10( assert( GE_16( filtIdx, 0 ) ); w0 = &tcxLtpFilters[filtIdx].filt[pitch_fr]; - w1 = &tcxLtpFilters[filtIdx].filt[sub(pitch_res , pitch_fr)]; + w1 = &tcxLtpFilters[filtIdx].filt[sub( pitch_res, pitch_fr )]; v0 = &tcxLtpFilters[filtIdx].filt[0]; v1 = &tcxLtpFilters[filtIdx].filt[pitch_res]; L = tcxLtpFilters[filtIdx].length; @@ -797,7 +797,7 @@ static void tcx_ltp_synth_filter_10_fx( curr_gain = gain; move16(); - gain_step = idiv1616(negate( gain ) , length); // TODO + gain_step = idiv1616( negate( gain ), length ); // TODO for ( j = 0; j < length; j++ ) { @@ -861,8 +861,8 @@ static void tcx_ltp_synth_filter_01( curr_gain = 0; move16(); - //gain_step = gain / length; // TODO - gain_step = idiv1616(gain , length); // TODO + // gain_step = gain / length; // TODO + gain_step = idiv1616( gain, length ); // TODO for ( j = 0; j < length; j++ ) { @@ -927,8 +927,8 @@ static void tcx_ltp_synth_filter_01_fx( curr_gain = 0; move16(); - //gain_step = gain / length; // TODO - gain_step = idiv1616(gain , length); // TODO + // gain_step = gain / length; // TODO + gain_step = idiv1616( gain, length ); // TODO for ( j = 0; j < length; j++ ) { @@ -1027,8 +1027,8 @@ static void tcx_ltp_synth_filter_11_unequal_pitch( /* 1. decreasing gain filter. The first filter unit with the parameters associated to the previous interval and scaling towards 0 */ gain = prev_gain; move16(); - //gain_step = negate( prev_gain ) / length; // TODO - gain_step = idiv1616(negate( prev_gain ) , length); // TODO + // gain_step = negate( prev_gain ) / length; // TODO + gain_step = idiv1616( negate( prev_gain ), length ); // TODO for ( j = 0; j < length; j++ ) { @@ -1156,7 +1156,7 @@ static void tcx_ltp_synth_filter_11_unequal_pitch_fx( /* 1. decreasing gain filter. The first filter unit with the parameters associated to the previous interval and scaling towards 0 */ gain = prev_gain; move16(); - gain_step = idiv1616(negate( prev_gain ) , length); // TODOD + gain_step = idiv1616( negate( prev_gain ), length ); // TODOD for ( j = 0; j < length; j++ ) { @@ -1359,7 +1359,7 @@ void tcx_ltp_post( move16(); } - IF( core == ACELP_CORE ) + IF( core == ACELP_CORE ) { bfi = 0; move16(); @@ -1421,7 +1421,7 @@ void tcx_ltp_post( ELSE IF( bfi == 0 ) { /* LTP and good frame */ - test(); + test(); IF( EQ_16( st->element_mode, EVS_MONO ) ) /* hard tunings for EVS_MONO, HQ_48k is TCX only */ { IF( NE_16( output_frame, L_frame_core ) ) @@ -1580,20 +1580,20 @@ void tcx_ltp_post( test(); // #ifdef IVAS_CODE_TCX_LTP if ( st->element_mode != EVS_MONO ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF ( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev == 0 ) + { + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev == 0 ) { /* The filtering is deactivated, just copy input to the output */ Copy( sig_in + delay, sig_out + delay, L_transition ); } - ELSE IF ( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev != 0 ) + ELSE IF( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev != 0 ) { /* Filtering with the first filter unit */ tcx_ltp_synth_filter_10( sig_out + delay, sig_in + delay, L_transition, hTcxLtpDec->tcxltp_pitch_int_post_prev, hTcxLtpDec->tcxltp_pitch_fr_post_prev, hTcxLtpDec->tcxltp_gain_post_prev, st->pit_res_max_past, hTcxLtpDec->tcxltp_filt_idx_prev ); @@ -1603,7 +1603,7 @@ void tcx_ltp_post( /* Filtering with the second filter unit */ tcx_ltp_synth_filter_01( sig_out + delay, sig_in + delay, L_transition, pitch_int, pitch_fr, gain, st->pit_res_max, filtIdx ); } - ELSE IF( EQ_16(gain ,hTcxLtpDec->tcxltp_gain_post_prev )&& EQ_16(pitch_int , hTcxLtpDec->tcxltp_pitch_int_post_prev) && EQ_16(pitch_fr, hTcxLtpDec->tcxltp_pitch_fr_post_prev )&& EQ_16(st->pit_res_max , st->pit_res_max_past )&& EQ_16(filtIdx , hTcxLtpDec->tcxltp_filt_idx_prev )) + ELSE IF( EQ_16( gain, hTcxLtpDec->tcxltp_gain_post_prev ) && EQ_16( pitch_int, hTcxLtpDec->tcxltp_pitch_int_post_prev ) && EQ_16( pitch_fr, hTcxLtpDec->tcxltp_pitch_fr_post_prev ) && EQ_16( st->pit_res_max, st->pit_res_max_past ) && EQ_16( filtIdx, hTcxLtpDec->tcxltp_filt_idx_prev ) ) { tcx_ltp_synth_filter( sig_out + delay, sig_in + delay, L_transition, pitch_int, pitch_fr, gain, st->pit_res_max, NULL, 0, filtIdx ); } @@ -1617,10 +1617,10 @@ void tcx_ltp_post( ELSE // #endif { - test(); - test(); - test(); - test(); + test(); + test(); + test(); + test(); IF( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev == 0 ) { Copy( sig_in + delay, sig_out + delay, L_transition ); diff --git a/lib_com/tcx_mdct_fx.c b/lib_com/tcx_mdct_fx.c index 1281c027e..f66ea0d76 100644 --- a/lib_com/tcx_mdct_fx.c +++ b/lib_com/tcx_mdct_fx.c @@ -126,7 +126,7 @@ void TCX_MDCT( FOR( i = 0; i < l / 2; i++ ) { #ifdef BASOP_NOGLOB - y[add( add( add( shr( m, 1 ), shr( r, 1 ) ), shr( m, 1 ) ), i )] = L_msu_o( L_mult( x[i], factor ), x[sub(sub(l , 1) , i)], factor, &Overflow ); + y[add( add( add( shr( m, 1 ), shr( r, 1 ) ), shr( m, 1 ) ), i )] = L_msu_o( L_mult( x[i], factor ), x[sub( sub( l, 1 ), i )], factor, &Overflow ); #else /* BASOP_NOGLOB */ y[m / 2 + r / 2 + m / 2 + i] = L_msu( L_mult( x[i], factor ), x[l - 1 - i], factor ); #endif /* BASOP_NOGLOB */ @@ -134,13 +134,13 @@ void TCX_MDCT( } FOR( i = 0; i < m / 2; i++ ) { - y[sub( sub( add( shr( m, 1 ), shr( r, 1 ) ), 1 ), i )] = L_mult( x[add(add(l , shr(m ,1)) , i)], neg_factor ); + y[sub( sub( add( shr( m, 1 ), shr( r, 1 ) ), 1 ), i )] = L_mult( x[add( add( l, shr( m, 1 ) ), i )], neg_factor ); move32(); } FOR( i = 0; i < r / 2; i++ ) { #ifdef BASOP_NOGLOB - y[sub( sub( sub( add( shr( m, 1 ), shr( r, 1 ) ), 1 ), shr( m, 1 ) ), i )] = L_mac_o( L_mult( x[add( add( l, m ), i )], neg_factor ), x[sub(sub(add(add(l , m) , r) , 1) , i)], neg_factor, &Overflow ); + y[sub( sub( sub( add( shr( m, 1 ), shr( r, 1 ) ), 1 ), shr( m, 1 ) ), i )] = L_mac_o( L_mult( x[add( add( l, m ), i )], neg_factor ), x[sub( sub( add( add( l, m ), r ), 1 ), i )], neg_factor, &Overflow ); #else /* BASOP_NOGLOB */ y[m / 2 + r / 2 - 1 - m / 2 - i] = L_mac( L_mult( x[l + m + i], neg_factor ), x[l + m + r - 1 - i], neg_factor ); #endif /* BASOP_NOGLOB */ @@ -189,7 +189,7 @@ void TCX_MDST( FOR( i = 0; i < l / 2; i++ ) { #ifdef BASOP_NOGLOB - y[add( add( add( shr(m ,1), shr(r ,1) ), shr(m ,1) ), i )] = L_msu_o( L_mult( x[i], neg_factor ), x[sub(sub(l , 1) , i)], factor, &Overflow ); + y[add( add( add( shr( m, 1 ), shr( r, 1 ) ), shr( m, 1 ) ), i )] = L_msu_o( L_mult( x[i], neg_factor ), x[sub( sub( l, 1 ), i )], factor, &Overflow ); #else /* BASOP_NOGLOB */ y[m / 2 + r / 2 + m / 2 + i] = L_msu( L_mult( x[i], neg_factor ), x[l - 1 - i], factor ); #endif @@ -251,7 +251,7 @@ void TCX_MDCT_Inverse( FOR( i = 0; i < R2; i++ ) { #ifdef BASOP_NOGLOB - y[add(add(add(l , m) , R2) , i)] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[add(L2 , i)], negfac ), s ) ); /* fold out right end of DCT */ + y[add( add( add( l, m ), R2 ), i )] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[add( L2, i )], negfac ), s ) ); /* fold out right end of DCT */ #else y[l + m + R2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); /* fold out right end of DCT */ #endif @@ -262,7 +262,7 @@ void TCX_MDCT_Inverse( FOR( i = 0; i < L2; i++ ) { #ifdef BASOP_NOGLOB - y[i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[add(add(add(L2 , m) , R2) , i)], fac ), s ) ); /* negate, fold out left end of DCT */ + y[i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[add( add( add( L2, m ), R2 ), i )], fac ), s ) ); /* negate, fold out left end of DCT */ #else y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], fac ), s ) ); /* negate, fold out left end of DCT */ #endif @@ -320,7 +320,7 @@ void TCX_MDST_Inverse_fx( FOR( i = 0; i < R2; i++ ) { - y[add(add(add(l , m) , R2) , i)] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add(L2 , i)], fac ), s ) ); /* fold out right end of DCT */ + y[add( add( add( l, m ), R2 ), i )] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( L2, i )], fac ), s ) ); /* fold out right end of DCT */ move16(); } @@ -335,7 +335,7 @@ void TCX_MDST_Inverse_fx( Word16 f; f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( L2, i )], fac ), s ) ); - y[add(L2 , i)] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[sub( sub( add( add( l, m ), R2 ), 1 ), i )], negfac ), s ) ); /* time-reverse mid of DCT */ + y[add( L2, i )] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[sub( sub( add( add( l, m ), R2 ), 1 ), i )], negfac ), s ) ); /* time-reverse mid of DCT */ move16(); y[sub( sub( add( add( l, m ), R2 ), 1 ), i )] = negate( f ); @@ -367,7 +367,7 @@ void TCX_MDXT_Inverse_fx( set32_fx( tmp_buf, 0, N_MAX + L_MDCT_OVLP_MAX / 2 ); - edxt_fx( x, tmp_buf + L2, add(add(L2 , m) , R2), kernel_type, TRUE ); + edxt_fx( x, tmp_buf + L2, add( add( L2, m ), R2 ), kernel_type, TRUE ); fac = TCX_MDCT_Inverse_GetScaleFactor( add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &fac_e ); x_e = add( x_e, fac_e ); @@ -381,8 +381,8 @@ void TCX_MDXT_Inverse_fx( { signLeft = fac; } - //signRight = ( kernel_type & 1 ? fac : negfac ); - IF ( L_and( kernel_type, 1 ) ) + // signRight = ( kernel_type & 1 ? fac : negfac ); + IF( L_and( kernel_type, 1 ) ) { signRight = fac; } @@ -396,24 +396,24 @@ void TCX_MDXT_Inverse_fx( FOR( i = 0; i < L2; i++ ) { - y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add(add(add(L2 , m) , R2) , i)], signLeft ), s ) ); /* fold out the left end */ + y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( add( add( L2, m ), R2 ), i )], signLeft ), s ) ); /* fold out the left end */ } FOR( i = 0; i < R2; i++ ) { - y[add(add(add(l , m) , R2) , i)] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add(L2 , i)], signRight ), s ) ); /* ...and right end */ + y[add( add( add( l, m ), R2 ), i )] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( L2, i )], signRight ), s ) ); /* ...and right end */ move16(); } - FOR( i = 0; i < ( ( add(add(L2 , m) , R2) ) >> 1 ); i++ ) + FOR( i = 0; i < ( ( add( add( L2, m ), R2 ) ) >> 1 ); i++ ) { - f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add(L2 , i)], negfac ), s ) ); + f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( L2, i )], negfac ), s ) ); - y[add(L2 , i)] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[sub(sub(add(add(l , m) , R2) , 1) , i)], negfac ), s ) ); /* time-reverse mid of DCT */ + y[add( L2, i )] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[sub( sub( add( add( l, m ), R2 ), 1 ), i )], negfac ), s ) ); /* time-reverse mid of DCT */ move16(); - y[sub(sub(add(add(l , m) , R2) , 1) , i)] = f; + y[sub( sub( add( add( l, m ), R2 ), 1 ), i )] = f; move16(); } diff --git a/lib_com/tcx_mdct_window.c b/lib_com/tcx_mdct_window.c index 44c1755ae..8276f07d4 100644 --- a/lib_com/tcx_mdct_window.c +++ b/lib_com/tcx_mdct_window.c @@ -116,11 +116,11 @@ void mdct_window_sine_IVAS_updated( const Word16 window_type, const Word16 element_mode ) { - IF (EQ_16( element_mode , EVS_MONO )) + IF( EQ_16( element_mode, EVS_MONO ) ) { const PWord16 *table; table = getSineWindowTable( n ); - FOR ( Word32 i = 0; i < shr( n, 1 ); i++ ) + FOR( Word32 i = 0; i < shr( n, 1 ); i++ ) { window[i].v.re = table[i].v.re; move16(); @@ -135,8 +135,8 @@ void mdct_window_sine_IVAS_updated( Word16 buf_in_size = 0; move16(); Word16 temp[420]; - set16_fx(temp, 0, 420); - SWITCH ( window_type ) + set16_fx( temp, 0, 420 ); + SWITCH( window_type ) { case FULL_OVERLAP: window_table = tcx_mdct_window_48_fx; @@ -159,7 +159,7 @@ void mdct_window_sine_IVAS_updated( BREAK; } - IF( EQ_32( Fs , 48000 )) + IF( EQ_32( Fs, 48000 ) ) { Copy( window_table, temp, n ); } @@ -168,7 +168,7 @@ void mdct_window_sine_IVAS_updated( lerp( window_table, temp, n, buf_in_size ); } - FOR ( Word32 i = 0; i < shr(n, 1); i++ ) + FOR( Word32 i = 0; i < shr( n, 1 ); i++ ) { window[i].v.re = temp[n - 1 - i]; move16(); @@ -187,7 +187,7 @@ void mdct_window_sine( PWord16 *window, Word16 n ) { const PWord16 *table; table = getSineWindowTable( n ); - FOR ( Word32 i = 0; i < shr(n, 1); i++ ) + FOR( Word32 i = 0; i < shr( n, 1 ); i++ ) { window[i].v.re = table[i].v.re; move16(); diff --git a/lib_com/tcx_utils_fx.c b/lib_com/tcx_utils_fx.c index 0191e2a7c..e5d9f1478 100644 --- a/lib_com/tcx_utils_fx.c +++ b/lib_com/tcx_utils_fx.c @@ -889,7 +889,7 @@ void lpc2mdct_2( BASOP_cfft_ivas( RealData_fx, ImagData_fx, 1, &scale ); /*Get amplitude*/ - j = sub(FDNS_NPTS , 1); + j = sub( FDNS_NPTS, 1 ); move16(); k = 0; move16(); @@ -1973,7 +1973,7 @@ void tcx_noise_filling_with_shift( } Q[i] = L_shl( Q[i], nrm ); move32(); - new_Q_e[i] = sub(31 , nrm); + new_Q_e[i] = sub( 31, nrm ); tmp1 = shr( seed, 4 ); nrg = L_mac0( nrg, tmp1, tmp1 ); /* sum up energy of current noise segment */ diff --git a/lib_com/tec_com.c b/lib_com/tec_com.c index dd902ea4b..d702c4330 100644 --- a/lib_com/tec_com.c +++ b/lib_com/tec_com.c @@ -655,7 +655,7 @@ void calcGainTemp_TBE_Fx( startPos, stopPos, bandOffset, - sub(15 , cldfb_exp) ); + sub( 15, cldfb_exp ) ); IF( code > 0 ) { @@ -1031,7 +1031,7 @@ static Word16 procTec_Fx( s = norm_s( hb_synth_Fx[k] ); hb_synth_Fx[k] = mult_r( gain_m[i], shl( hb_synth_Fx[k], s ) ); move16(); - shift[k] = sub(s , gain_e[i]); + shift[k] = sub( s, gain_e[i] ); if ( GT_16( min_shift, shift[k] ) ) { diff --git a/lib_com/tns_base.c b/lib_com/tns_base.c index 4e2ce9c96..6c62b0a3c 100644 --- a/lib_com/tns_base.c +++ b/lib_com/tns_base.c @@ -108,7 +108,7 @@ void InitTnsConfiguration( assert( ( nSampleRate > 0 ) && ( frameLength > 0 ) && ( pTnsConfig != NULL ) ); test(); test(); - IF ( ( nSampleRate <= 0 ) || ( frameLength <= 0 ) || ( pTnsConfig == NULL ) ) + IF( ( nSampleRate <= 0 ) || ( frameLength <= 0 ) || ( pTnsConfig == NULL ) ) { return /*TNS_FATAL_ERROR*/; } @@ -360,7 +360,7 @@ Word16 ITF_Detect_fx( /* Check threshold HLM_MIN_NRG */ BASOP_SATURATE_WARNING_OFF_EVS; #ifdef BASOP_NOGLOB - tmp32 = L_sub( L_shl_o( L_tmp, sub( shift, sub(24 , Q) ), &Overflow ), 4194304l /*HLM_MIN_NRG Q7*/ ); + tmp32 = L_sub( L_shl_o( L_tmp, sub( shift, sub( 24, Q ) ), &Overflow ), 4194304l /*HLM_MIN_NRG Q7*/ ); #else /* BASOP_NOGLOB */ tmp32 = L_sub( L_shl( L_tmp, sub( shift, 24 - Q ) ), 4194304l /*HLM_MIN_NRG Q7*/ ); #endif -- GitLab From f138125362da1fbcbfa4d22c178b63299fb9dec1 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 11 Jul 2024 13:40:20 +0530 Subject: [PATCH 060/110] IVAS encoder functions converted to fixed [x] Converted all functions in ivas_stereo_adapt_GR_enc.c file [x] Converted functions in LFE low pass filter path [x] Fixed implementation for subfunctions of ivas_ism_enc --- lib_com/bitstream.c | 249 ++++++++++++ lib_com/bitstream_fx.c | 76 ++-- lib_com/cldfb.c | 57 +-- lib_com/float_to_fix_ops.c | 17 +- lib_com/ivas_arith.c | 119 +++++- lib_com/ivas_cnst.h | 6 + lib_com/ivas_filters.c | 168 ++++---- lib_com/ivas_lfe_com.c | 23 +- lib_com/ivas_mdct_imdct_fx.c | 2 - lib_com/ivas_prot.h | 107 ++++- lib_com/ivas_prot_fx.h | 22 + lib_com/ivas_rom_com_fx.c | 35 +- lib_com/ivas_rom_com_fx.h | 3 + lib_com/ivas_stat_com.h | 10 +- lib_com/ivas_transient_det.c | 7 +- lib_com/prot_fx2.h | 25 +- lib_enc/acelp_core_enc_fx.c | 6 +- lib_enc/acelp_core_switch_enc_fx.c | 8 +- lib_enc/ari_enc.c | 15 + lib_enc/cng_enc_fx.c | 4 +- lib_enc/enc_prm_fx.c | 12 +- lib_enc/eval_pit_contr_fx.c | 12 +- lib_enc/evs_enc_fx.c | 4 +- lib_enc/gs_enc_fx.c | 2 +- lib_enc/hq_core_enc_fx.c | 2 +- lib_enc/init_enc.c | 19 +- lib_enc/init_enc_fx.c | 2 +- lib_enc/ivas_enc.c | 18 +- lib_enc/ivas_entropy_coder.c | 9 +- lib_enc/ivas_init_enc.c | 6 +- lib_enc/ivas_ism_dtx_enc.c | 418 +++++++++++++++++++ lib_enc/ivas_ism_enc.c | 36 +- lib_enc/ivas_ism_param_enc.c | 60 +++ lib_enc/ivas_lfe_enc.c | 105 ++++- lib_enc/ivas_masa_enc.c | 4 + lib_enc/ivas_omasa_enc.c | 4 + lib_enc/ivas_stat_enc.h | 11 +- lib_enc/ivas_stereo_adapt_GR_enc.c | 603 ++++++++++++++++++++++++++++ lib_enc/ivas_stereo_dft_enc.c | 11 + lib_enc/ivas_stereo_switching_enc.c | 13 + lib_enc/ivas_stereo_td_enc.c | 9 +- lib_enc/lib_enc.c | 6 +- lib_enc/stat_enc.h | 33 +- lib_enc/tcx_utils_enc_fx.c | 2 +- lib_enc/transition_enc_fx.c | 4 +- 45 files changed, 2098 insertions(+), 266 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 47c30f497..decc274e3 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -159,6 +159,138 @@ Word16 rate2EVSmode_float( * Re-allocate the list of indices *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ind_list_realloc( + INDICE_HANDLE old_ind_list, /* i : pointer to the beginning of the old buffer of indices */ + const Word16 max_num_indices, /* i : new maximum number of allowed indices in the list */ + Encoder_Struct *st_ivas /* i : IVAS encoder structure */ +) +{ + Word16 i, n, ch, n_channels, ind_list_pos, is_metadata, ivas_max_num_indices; + INDICE_HANDLE new_ind_list; + BSTR_ENC_HANDLE hBstr; + + IF( st_ivas == NULL ) + { + return IVAS_ERR_OK; + } + + /* get the pointer to the beginning of the old buffer of indices (either metadata or core coders) */ + IF( old_ind_list == st_ivas->ind_list_metadata ) + { + is_metadata = 1; + ivas_max_num_indices = st_ivas->ivas_max_num_indices_metadata; + } + ELSE + { + is_metadata = 0; + ivas_max_num_indices = st_ivas->ivas_max_num_indices; + } + move16(); + move16(); + + /* allocate new buffer of indices */ + IF( ( new_ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + /* move indices from the old list to the new list */ + FOR( i = 0; i < s_min( max_num_indices, ivas_max_num_indices ); i++ ) + { + IF( GT_16( old_ind_list[i].nb_bits, -1 ) ) + { + new_ind_list[i].id = old_ind_list[i].id; + new_ind_list[i].value = old_ind_list[i].value; + move16(); + move16(); + } + new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; + move16(); + } + + /* reset nb_bits of all other indices to -1 */ + FOR( ; i < max_num_indices; i++ ) + { + new_ind_list[i].nb_bits = -1; + move16(); + } + + /* update parameters in all SCE elements */ + FOR( n = 0; n < st_ivas->nSCE; n++ ) + { + /* get the pointer to hBstr */ + IF( is_metadata ) + { + hBstr = st_ivas->hSCE[n]->hMetaData; + } + ELSE + { + hBstr = st_ivas->hSCE[n]->hCoreCoder[0]->hBstr; + } + + IF( hBstr != NULL ) + { + /* get the current position inside the old list */ + ind_list_pos = (Word16) ( hBstr->ind_list - old_ind_list ); + + /* set pointers in the new list */ + *( hBstr->ivas_ind_list_zero ) = new_ind_list; + hBstr->ind_list = &new_ind_list[ind_list_pos]; + + /* set the new maximum number of indices */ + *( hBstr->ivas_max_num_indices ) = max_num_indices; + move16(); + } + } + + /* update parameters in all CPE elements */ + FOR( n = 0; n < st_ivas->nCPE; n++ ) + { + /* get the pointer to hBstr */ + IF( is_metadata ) + { + n_channels = 1; + } + ELSE + { + n_channels = CPE_CHANNELS; + } + move16(); + + FOR( ch = 0; ch < n_channels; ch++ ) + { + IF( is_metadata ) + { + hBstr = st_ivas->hCPE[n]->hMetaData; + } + ELSE + { + hBstr = st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr; + } + + IF( hBstr != NULL ) + { + /* get the current position inside the old list */ + ind_list_pos = (Word16) ( hBstr->ind_list - old_ind_list ); + + /* set pointers in the new list */ + *( hBstr->ivas_ind_list_zero ) = new_ind_list; + hBstr->ind_list = &new_ind_list[ind_list_pos]; + + /* set the new maximum number of indices */ + *( hBstr->ivas_max_num_indices ) = max_num_indices; + move16(); + } + } + } + + /* free the old list */ + free( old_ind_list ); + + return IVAS_ERR_OK; +} +#else ivas_error ind_list_realloc( INDICE_HANDLE old_ind_list, /* i : pointer to the beginning of the old buffer of indices */ const int16_t max_num_indices, /* i : new maximum number of allowed indices in the list */ @@ -280,6 +412,7 @@ ivas_error ind_list_realloc( return IVAS_ERR_OK; } +#endif // IVAS_FLOAT_FIXED /*-----------------------------------------------------------------------* @@ -1267,6 +1400,61 @@ void move_indices( * Check, if we will not overwrite an existing indice -> adjust the location *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error check_ind_list_limits( + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ +) +{ + Indice *ivas_ind_list_zero, *ivas_ind_list_last; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + ivas_ind_list_zero = *( hBstr->ivas_ind_list_zero ); + + /* check, if the maximum number of indices has been reached and re-allocate the buffer */ + /* the re-allocation can be avoided by increasing the limits in get_ivas_max_num_indices() or get_ivas_max_num_indices_metadata() */ + IF( GE_16( (Word16)( &hBstr->ind_list[hBstr->nb_ind_tot] - ivas_ind_list_zero ), *( hBstr->ivas_max_num_indices ) ) ) + { + + /* reallocate the buffer of indices with increased limit */ + IF( ( error = ind_list_realloc( *hBstr->ivas_ind_list_zero, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES, hBstr->st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* check, if we will not overwrite an existing indice */ + IF( hBstr->ind_list[hBstr->nb_ind_tot].nb_bits > 0 ) + { + IF( hBstr->nb_ind_tot == 0 ) + { + /* move the pointer to the next available empty slot */ + ivas_ind_list_last = &ivas_ind_list_zero[*( hBstr->ivas_max_num_indices )]; + WHILE( hBstr->ind_list[0].nb_bits > 0 && hBstr->ind_list < ivas_ind_list_last ) + { + hBstr->ind_list++; + } + + IF( hBstr->ind_list >= ivas_ind_list_last ) + { + + /* no available empty slot -> need to re-allocate the buffer */ + IF( ( error = ind_list_realloc( *hBstr->ivas_ind_list_zero, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES, hBstr->st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + ELSE + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Buffer of indices corrupted in frame %d! Attempt to overwrite indice ID = %d (value: %d, bits: %d)!\n", hBstr->ind_list[hBstr->nb_ind_tot].id, hBstr->ind_list[hBstr->nb_ind_tot].value, hBstr->ind_list[hBstr->nb_ind_tot].nb_bits ); + } + } + + return error; +} +#else ivas_error check_ind_list_limits( BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ ) @@ -1319,6 +1507,7 @@ ivas_error check_ind_list_limits( return error; } +#endif // IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* @@ -1327,6 +1516,65 @@ ivas_error check_ind_list_limits( * Push a new indice into the buffer *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error push_indice( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 id, /* i : ID of the indice */ + UWord16 value, /* i : value of the quantized indice */ + Word16 nb_bits /* i : number of bits used to quantize the indice */ +) +{ + Word16 i; + Word16 j; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + /* check the limits of the list of indices */ + IF( ( error = check_ind_list_limits( hBstr ) ) != IVAS_ERR_OK ) + { + return IVAS_ERROR( error, "Error occured in push_indice() while re-allocating the list of indices (frame %d) !\n" ); + } + + /* find the location in the list of indices based on ID */ + i = hBstr->nb_ind_tot; + move16(); + WHILE ( i > 0 && LT_16( id, hBstr->ind_list[i - 1].id ) ) + { + i = sub( i, 1 ); + } + + /* shift indices, if the new ID is to be written somewhere inside the list */ + IF ( i < hBstr->nb_ind_tot ) + { + FOR ( j = hBstr->nb_ind_tot; j > i; j-- ) + { + hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id; + hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits; + hBstr->ind_list[j].value = hBstr->ind_list[j - 1].value; + move16(); + move16(); + move16(); + } + } + + + /* store the new indice in the list */ + hBstr->ind_list[i].id = id; + hBstr->ind_list[i].value = value; + hBstr->ind_list[i].nb_bits = nb_bits; + move16(); + move16(); + move16(); + + /* updates */ + hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); + hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); + + return error; +} +#else ivas_error push_indice( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ int16_t id, /* i : ID of the indice */ @@ -1377,6 +1625,7 @@ ivas_error push_indice( return error; } +#endif // IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * push_next_indice() diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index 2fca67ff9..2bf4ecf91 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -280,23 +280,23 @@ void push_indice_fx( /* new indice - find an empty slot in the list */ i = id; move16(); - WHILE( NE_16( hBstr->ind_list_fx[i].nb_bits, -1 ) ) + WHILE( NE_16( hBstr->ind_list[i].nb_bits, -1 ) ) { i = add( i, 1 ); } } /* store the values in the list */ - hBstr->ind_list_fx[i].value = value; + hBstr->ind_list[i].value = value; move16(); - hBstr->ind_list_fx[i].nb_bits = nb_bits; + hBstr->ind_list[i].nb_bits = nb_bits; move16(); /* updates */ hBstr->next_ind_fx = add( i, 1 ); hBstr->last_ind_fx = id; move16(); - hBstr->nb_bits_tot_fx = add( hBstr->nb_bits_tot_fx, nb_bits ); + hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); return; } @@ -314,15 +314,15 @@ void push_next_indice_fx( { /* store the values in the list */ - hBstr->ind_list_fx[hBstr->next_ind_fx].value = value; + hBstr->ind_list[hBstr->next_ind_fx].value = value; move16(); - hBstr->ind_list_fx[hBstr->next_ind_fx].nb_bits = nb_bits; + hBstr->ind_list[hBstr->next_ind_fx].nb_bits = nb_bits; move16(); hBstr->next_ind_fx = add( hBstr->next_ind_fx, 1 ); /* update the total number of bits already written */ - hBstr->nb_bits_tot_fx = add( hBstr->nb_bits_tot_fx, nb_bits ); + hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); return; } @@ -343,7 +343,7 @@ void push_next_bits_fx( Word16 i, nb_bits_m15; Indice *ptr; - ptr = &hBstr->ind_list_fx[hBstr->next_ind_fx]; + ptr = &hBstr->ind_list[hBstr->next_ind_fx]; nb_bits_m15 = sub( nb_bits, 15 ); i = 0; move16(); @@ -374,8 +374,8 @@ void push_next_bits_fx( ++ptr; } } - hBstr->next_ind_fx = (Word16) ( ptr - hBstr->ind_list_fx ); - hBstr->nb_bits_tot_fx = add( hBstr->nb_bits_tot_fx, nb_bits ); + hBstr->next_ind_fx = (Word16) ( ptr - hBstr->ind_list ); + hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); } /*-------------------------------------------------------------------* @@ -532,7 +532,7 @@ void reset_indices_enc_fx( { Word16 i; - hBstr->nb_bits_tot_fx = 0; + hBstr->nb_bits_tot = 0; move16(); hBstr->next_ind_fx = 0; move16(); @@ -541,7 +541,7 @@ void reset_indices_enc_fx( FOR( i = 0; i < MAX_NUM_INDICES; i++ ) { - hBstr->ind_list_fx[i].nb_bits = -1; + hBstr->ind_list[i].nb_bits = -1; move16(); } @@ -596,7 +596,7 @@ void write_indices_fx( stream[i] = 0; } *pt_stream++ = (Word16) SYNC_GOOD_FRAME; - *pt_stream++ = hBstr->nb_bits_tot_fx; + *pt_stream++ = hBstr->nb_bits_tot; /*----------------------------------------------------------------* * Bitstream packing (conversion of individual indices into a serial stream) @@ -605,15 +605,15 @@ void write_indices_fx( for ( i = 0; i < MAX_NUM_INDICES; i++ ) { - if ( hBstr->ind_list_fx[i].nb_bits != -1 ) + if ( hBstr->ind_list[i].nb_bits != -1 ) { /* mask from MSB to LSB */ - mask = 1 << ( hBstr->ind_list_fx[i].nb_bits - 1 ); + mask = 1 << ( hBstr->ind_list[i].nb_bits - 1 ); /* write bit by bit */ - for ( k = 0; k < hBstr->ind_list_fx[i].nb_bits; k++ ) + for ( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) { - if ( hBstr->ind_list_fx[i].value & mask ) + if ( hBstr->ind_list[i].value & mask ) { *pt_stream++ = G192_BIN1; } @@ -631,7 +631,7 @@ void write_indices_fx( { /* Create and write ToC header */ /* qbit always set to 1 on encoder side for AMRWBIO , no qbit in use for EVS, but set to 0(bad) */ - header = (UWord8) ( st_fx->Opt_AMR_WB << 5 | st_fx->Opt_AMR_WB << 4 | rate2EVSmode( hBstr->nb_bits_tot_fx * 50, &isAmrWb ) ); + header = (UWord8) ( st_fx->Opt_AMR_WB << 5 | st_fx->Opt_AMR_WB << 4 | rate2EVSmode( hBstr->nb_bits_tot * 50, &isAmrWb ) ); fwrite( &header, sizeof( UWord8 ), 1, file ); /* Write speech bits */ fwrite( pFrame, sizeof( UWord8 ), ( pFrame_size + 7 ) >> 3, file ); @@ -640,7 +640,7 @@ void write_indices_fx( /* Clearing of indices */ FOR( i = 0; i < MAX_NUM_INDICES; i++ ) { - hBstr->ind_list_fx[i].nb_bits = -1; + hBstr->ind_list[i].nb_bits = -1; move16(); } @@ -651,7 +651,7 @@ void write_indices_fx( fwrite( stream, sizeof( unsigned short ), 2 + stream[1], file ); } /* reset index pointers */ - hBstr->nb_bits_tot_fx = 0; + hBstr->nb_bits_tot = 0; hBstr->next_ind_fx = 0; hBstr->last_ind_fx = -1; @@ -690,7 +690,7 @@ void write_indices_buf_fx( } //*pt_stream++ = (Word16) SYNC_GOOD_FRAME; //*pt_stream++ = hBstr->nb_bits_tot_fx; - *num_bits = hBstr->nb_bits_tot_fx; + *num_bits = hBstr->nb_bits_tot; /*----------------------------------------------------------------* * Bitstream packing (conversion of individual indices into a serial stream) @@ -698,15 +698,15 @@ void write_indices_buf_fx( *----------------------------------------------------------------*/ for ( i = 0; i < MAX_NUM_INDICES; i++ ) { - if ( hBstr->ind_list_fx[i].nb_bits != -1 ) + if ( hBstr->ind_list[i].nb_bits != -1 ) { /* mask from MSB to LSB */ - mask = 1 << ( hBstr->ind_list_fx[i].nb_bits - 1 ); + mask = 1 << ( hBstr->ind_list[i].nb_bits - 1 ); /* write bit by bit */ - for ( k = 0; k < hBstr->ind_list_fx[i].nb_bits; k++ ) + for ( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) { - if ( hBstr->ind_list_fx[i].value & mask ) + if ( hBstr->ind_list[i].value & mask ) { //*pt_stream++ = G192_BIN1; *pt_stream++ = 1; @@ -726,7 +726,7 @@ void write_indices_buf_fx( { /* Create and write ToC header */ /* qbit always set to 1 on encoder side for AMRWBIO , no qbit in use for EVS, but set to 0(bad) */ - header = (UWord8) ( st_fx->Opt_AMR_WB << 5 | st_fx->Opt_AMR_WB << 4 | rate2EVSmode( hBstr->nb_bits_tot_fx * 50, &isAmrWb ) ); + header = (UWord8) ( st_fx->Opt_AMR_WB << 5 | st_fx->Opt_AMR_WB << 4 | rate2EVSmode( hBstr->nb_bits_tot * 50, &isAmrWb ) ); // fwrite(&header, sizeof(UWord8), 1, file); memcpy( out_buf, &header, sizeof( UWord8 ) ); *num_bits += sizeof( UWord8 ); @@ -739,7 +739,7 @@ void write_indices_buf_fx( /* Clearing of indices */ FOR( i = 0; i < MAX_NUM_INDICES; i++ ) { - hBstr->ind_list_fx[i].nb_bits = -1; + hBstr->ind_list[i].nb_bits = -1; move16(); } @@ -755,7 +755,7 @@ void write_indices_buf_fx( //*num_bits += sizeof( unsigned short ) * ( 2 + stream[1] ); } /* reset index pointers */ - hBstr->nb_bits_tot_fx = 0; + hBstr->nb_bits_tot = 0; hBstr->next_ind_fx = 0; hBstr->last_ind_fx = -1; @@ -786,27 +786,27 @@ void indices_to_serial( if ( st_fx->Opt_AMR_WB ) { cmi = rate2EVSmode( st_fx->total_brate, &isAmrWb ); - core_mode = rate2EVSmode( hBstr->nb_bits_tot_fx * 50, &isAmrWb ); + core_mode = rate2EVSmode( hBstr->nb_bits_tot * 50, &isAmrWb ); j = 0; for ( i = 0; i < MAX_NUM_INDICES; i++ ) { - if ( hBstr->ind_list_fx[i].nb_bits != -1 ) + if ( hBstr->ind_list[i].nb_bits != -1 ) { /* mask from MSB to LSB */ - mask = 1 << ( hBstr->ind_list_fx[i].nb_bits - 1 ); + mask = 1 << ( hBstr->ind_list[i].nb_bits - 1 ); /* temporarily save bit */ - for ( k = 0; k < hBstr->ind_list_fx[i].nb_bits; k++ ) + for ( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) { - amrwb_bits[j++] = ( hBstr->ind_list_fx[i].value & mask ) > 0; + amrwb_bits[j++] = ( hBstr->ind_list[i].value & mask ) > 0; mask >>= 1; } } } } - *pFrame_size = hBstr->nb_bits_tot_fx; + *pFrame_size = hBstr->nb_bits_tot; /*----------------------------------------------------------------* * Bitstream packing (conversion of individual indices into a serial stream) @@ -814,13 +814,13 @@ void indices_to_serial( j = 0; for ( i = 0; i < MAX_NUM_INDICES; i++ ) { - if ( hBstr->ind_list_fx[i].nb_bits != -1 ) + if ( hBstr->ind_list[i].nb_bits != -1 ) { /* mask from MSB to LSB */ - mask = 1 << ( hBstr->ind_list_fx[i].nb_bits - 1 ); + mask = 1 << ( hBstr->ind_list[i].nb_bits - 1 ); /* write bit by bit */ - for ( k = 0; k < hBstr->ind_list_fx[i].nb_bits; k++ ) + for ( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) { if ( st_fx->Opt_AMR_WB ) { @@ -828,7 +828,7 @@ void indices_to_serial( } else { - pack_bit( hBstr->ind_list_fx[i].value & mask, &pt_pFrame, &omask ); + pack_bit( hBstr->ind_list[i].value & mask, &pt_pFrame, &omask ); j++; } mask >>= 1; diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index 6a4062a98..b319bf21c 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -1716,7 +1716,7 @@ ivas_error openCldfb_ivas_fx( return IVAS_ERR_OK; } -ivas_error openCldfb_ivas_enc( +ivas_error openCldfb_ivas( HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ CLDFB_TYPE type, /* i : analysis or synthesis */ const int32_t sampling_rate, /* i : sampling rate */ @@ -1734,25 +1734,17 @@ ivas_error openCldfb_ivas_enc( hs->type = type; hs->prototype = prototype; - configureCldfb_ivas_enc( hs, sampling_rate ); + configureCldfb_ivas( hs, sampling_rate ); hs->memory_flt = NULL; hs->memory_length = 0; if ( type == CLDFB_ANALYSIS ) { buf_len = hs->p_filter_length - hs->no_channels; -#ifdef IVAS_FLOAT_FIXED - hs->FilterStates = (Word16 *) malloc( ( 9 + 16 ) * CLDFB_getNumChannels( sampling_rate ) * sizeof( Word16 ) ); - hs->FilterStates_eg = 0; -#endif } else { buf_len = hs->p_filter_length; -#ifdef IVAS_FLOAT_FIXED - hs->FilterStates = (Word16 *) malloc( 2 * ( 9 + 16 ) * CLDFB_getNumChannels( sampling_rate ) * sizeof( Word16 ) ); - hs->FilterStates_eg = 0; -#endif } if ( ( hs->cldfb_state = (float *) malloc( buf_len * sizeof( float ) ) ) == NULL ) @@ -1768,8 +1760,7 @@ ivas_error openCldfb_ivas_enc( hs->cldfb_state_length = buf_len; // Temporarily added to store the length of buffer hs->cldfb_size = buf_len; /*for having original size at intermediatery conversion, will be removed on removing conversion*/ set32_fx( hs->cldfb_state_fx, 0, buf_len ); - set16_fx( hs->FilterStates, 0, i_mult( 9 + 16, hs->no_channels ) ); - set16_fx( hs->FilterStates_e, 0, sizeof( hs->FilterStates_e ) / sizeof( hs->FilterStates_e[0] ) ); + hs->Q_cldfb_state = Q11; #endif // IVAS_FLOAT_FIXED @@ -1777,6 +1768,7 @@ ivas_error openCldfb_ivas_enc( return IVAS_ERR_OK; } +#else ivas_error openCldfb_ivas( HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ CLDFB_TYPE type, /* i : analysis or synthesis */ @@ -1812,25 +1804,15 @@ ivas_error openCldfb_ivas( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); } - set_f( hs->cldfb_state, 0.0f, buf_len ); -#ifdef IVAS_FLOAT_FIXED - if ( ( hs->cldfb_state_fx = (Word32 *) malloc( buf_len * sizeof( Word32 ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); - } - hs->cldfb_state_length = buf_len; // Temporarily added to store the length of buffer - hs->cldfb_size = buf_len; /*for having original size at intermediatery conversion, will be removed on removing conversion*/ - set32_fx( hs->cldfb_state_fx, 0, buf_len ); - hs->Q_cldfb_state = Q11; -#endif // IVAS_FLOAT_FIXED + set_f( hs->cldfb_state, 0.0f, buf_len ); *h_cldfb = hs; return IVAS_ERR_OK; } -#else -ivas_error openCldfb_ivas( +#endif +ivas_error openCldfb_ivas_enc( HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ CLDFB_TYPE type, /* i : analysis or synthesis */ const int32_t sampling_rate, /* i : sampling rate */ @@ -1848,31 +1830,50 @@ ivas_error openCldfb_ivas( hs->type = type; hs->prototype = prototype; - configureCldfb_ivas( hs, sampling_rate ); + configureCldfb_ivas_enc( hs, sampling_rate ); hs->memory_flt = NULL; hs->memory_length = 0; if ( type == CLDFB_ANALYSIS ) { buf_len = hs->p_filter_length - hs->no_channels; +#ifdef IVAS_FLOAT_FIXED + hs->FilterStates = (Word16 *) malloc( ( 9 + 16 ) * CLDFB_getNumChannels( sampling_rate ) * sizeof( Word16 ) ); + hs->FilterStates_eg = 0; +#endif } else { buf_len = hs->p_filter_length; +#ifdef IVAS_FLOAT_FIXED + hs->FilterStates = (Word16 *) malloc( 2 * ( 9 + 16 ) * CLDFB_getNumChannels( sampling_rate ) * sizeof( Word16 ) ); + hs->FilterStates_eg = 0; +#endif } if ( ( hs->cldfb_state = (float *) malloc( buf_len * sizeof( float ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); } - set_f( hs->cldfb_state, 0.0f, buf_len ); +#ifdef IVAS_FLOAT_FIXED + if ( ( hs->cldfb_state_fx = (Word32 *) malloc( buf_len * sizeof( Word32 ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); + } + hs->cldfb_state_length = buf_len; // Temporarily added to store the length of buffer + hs->cldfb_size = buf_len; /*for having original size at intermediatery conversion, will be removed on removing conversion*/ + set32_fx( hs->cldfb_state_fx, 0, buf_len ); + set16_fx( hs->FilterStates, 0, i_mult( 9 + 16, hs->no_channels ) ); + set16_fx( hs->FilterStates_e, 0, sizeof( hs->FilterStates_e ) / sizeof( hs->FilterStates_e[0] ) ); +#endif // IVAS_FLOAT_FIXED + *h_cldfb = hs; return IVAS_ERR_OK; } -#endif + /*-------------------------------------------------------------------* * resampleCldfb_ivas() * diff --git a/lib_com/float_to_fix_ops.c b/lib_com/float_to_fix_ops.c index 7cf76a7cf..5547bb30c 100644 --- a/lib_com/float_to_fix_ops.c +++ b/lib_com/float_to_fix_ops.c @@ -5,24 +5,23 @@ #include "options.h" #include "prot.h" #include "prot_fx2.h" + Word32 floatToFixed( float f, Word16 Q ) { + Word64 result_32; if ( f == 1.0f && Q == Q15 ) return MAX16B; if ( f == 1.0f && Q == Q31 ) return MAXVAL_WORD32; if ( Q < 0 ) - return (Word32) ( (float) ( f ) / (double) ( 1llu << ( -Q ) ) + ( f >= 0 ? 0.5 : -0.5 ) ); + result_32 = (Word64) ( (float) ( f ) / (double) ( 1llu << ( -Q ) ) + ( f >= 0 ? 0.5 : -0.5 ) ); else - { - Word64 result_32; result_32 = (Word64) ( f * (double) ( 1llu << Q ) + ( f >= 0 ? 0.5 : -0.5 ) ); - if ( result_32 > MAX_32 ) - return MAX_32; - if ( result_32 < MIN_32 ) - return MIN_32; - return (Word32) result_32; - } + if ( result_32 > MAX_32 ) + return MAX_32; + if ( result_32 < MIN_32 ) + return MIN_32; + return (Word32) result_32; } float fixedToFloat( Word32 i, Word16 Q ) diff --git a/lib_com/ivas_arith.c b/lib_com/ivas_arith.c index 852ddee0d..47ac42fbd 100644 --- a/lib_com/ivas_arith.c +++ b/lib_com/ivas_arith.c @@ -35,6 +35,7 @@ #include "wmc_auto.h" #include "prot.h" #include "ivas_prot.h" +#include "ivas_prot_fx.h" #include "stat_dec.h" /*-----------------------------------------------------------------------------------------* @@ -188,7 +189,7 @@ void ivas_ari_done_decoding_14bits_ext_1_lfe( * * Arith encoding of last table entry *-------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void ivas_ari_done_encoding_14bits( BSTR_ENC_HANDLE hBstr, Tastat *s ) @@ -224,14 +225,51 @@ void ivas_ari_done_encoding_14bits( return; } +#else +void ivas_ari_done_encoding_14bits_fx( + BSTR_ENC_HANDLE hBstr, + Tastat *s ) +{ + Word32 low; + Word32 bits_to_follow; + + /* not needed, s points to s->low */ + low = s->low; + move32(); + bits_to_follow = L_add( s->bits_to_follow, 1 ); + + IF( LT_32( low, ari_q1new ) ) + { + push_next_indice( hBstr, 0, 1 ); /*send a zero*/ + + FOR( ; bits_to_follow > 0; bits_to_follow-- ) + { + push_next_indice( hBstr, 1, 1 ); /*send a one*/ + } + } + ELSE + { + push_next_indice( hBstr, 1, 1 ); /*send a one*/ + FOR( ; bits_to_follow > 0; bits_to_follow-- ) + { + push_next_indice( hBstr, 0, 1 ); /*send a zero*/ + } + } + /*It is done so no need to save values-> no counting*/ + /*s->low = low; + s->bits_to_follow = bits_to_follow;*/ + + return; +} +#endif /*--------------------------------------------------------------- * Function ivas_ari_encode_14bits_ext() * * Arith encode function for extended proba tables *-------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void ivas_ari_encode_14bits_ext( BSTR_ENC_HANDLE hBstr, Tastat *s, @@ -300,3 +338,80 @@ void ivas_ari_encode_14bits_ext( return; } +#else +void ivas_ari_encode_14bits_ext_fx( + BSTR_ENC_HANDLE hBstr, + Tastat *s, + Word32 symbol, + const UWord16 *cum_freq ) +{ + Word32 low, high, range; + Word32 bits_to_follow; + + /*for all operation using bit_ptr=&ptr[bp] */ + /* for reading s->high,low,bits_to_follow sequentially */ + high = s->high; + low = s->low; + range = L_add( L_sub( high, low ), 1 ); + move32(); + move32(); + + high = L_sub( L_add( low, mul_sbc_14bits_ivas( range, cum_freq[symbol] ) ), 1 ); + low = L_add( low, mul_sbc_14bits_ivas( range, cum_freq[L_add( symbol, 1 )] ) ); + + bits_to_follow = s->bits_to_follow; + move32(); + + FOR( ;; ) + { + IF( LT_32( high, ari_q2new ) ) + { + push_next_indice( hBstr, 0, 1 ); /*send a zero*/ + FOR( ; bits_to_follow > 0; bits_to_follow-- ) + { + push_next_indice( hBstr, 1, 1 ); /*send a one*/ + } + } + ELSE + { + IF( GE_32( low, ari_q2new ) ) + { + push_next_indice( hBstr, 1, 1 ); /*send a one*/ + FOR( ; bits_to_follow > 0; bits_to_follow-- ) + { + push_next_indice( hBstr, 0, 1 ); /*send a zero*/ + } + low = L_sub( low, ari_q2new ); + high = L_sub( high, ari_q2new ); /* Subtract offset to top. */ + } + ELSE + { + /* Output an opposite bit */ + test(); + IF( GE_32( low, ari_q1new ) && LT_32( high, ari_q3new ) ) /* Output an opposite bit */ + { + /* later if in middle half. */ + bits_to_follow = L_add( bits_to_follow, 1 ); + low = L_sub( low, ari_q1new ); /* Subtract offset to middle*/ + high = L_sub( high, ari_q1new ); + } + ELSE + { + BREAK; /* Otherwise exit loop. */ + } + } + } + low = L_add( low, low ); + high = L_add( L_add( high, high ), 1 ); /* Scale up code range. */ + } + + s->low = low; + s->high = high; + s->bits_to_follow = bits_to_follow; + move32(); + move32(); + move32(); + + return; +} +#endif diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 62183974c..b56c3d35b 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -586,8 +586,14 @@ typedef enum #define STEREO_DFT_FLAG_BITS 1 #define STEREO_DFT_SIDEGAIN_NBITS 5 #define STEREO_DFT_FEC_THRESHOLD 10 +#ifdef IVAS_FLOAT_FIXED +#define STEREO_DFT_FEC_THRESHOLD_PLUS_1_INV_Q31 ( 195225786 ) +#define STEREO_DFT_BITDIFF_LP_FAC_Q31 ( 128849019 ) /* Low-pass filter coefficient for filtering bit difference between absolute and differential coding */ +#define STEREO_DFT_BITDIFF_ABS_SELECT_Q31 ( 1717986918 ) /* Constant to set tendency for selecting absolute coding mode */ +#else #define STEREO_DFT_BITDIFF_LP_FAC (0.06f) /* Low-pass filter coefficient for filtering bit difference between absolute and differential coding */ #define STEREO_DFT_BITDIFF_ABS_SELECT (0.8f) /* Constant to set tendency for selecting absolute coding mode */ +#endif #define STEREO_DFT_BITDIFF_INIT (12.0f) /* Init value for low-pass bit difference */ #define STEREO_DFT_BITDIFF_INIT_FX (12288) /* Init value for low-pass bit difference in Q10*/ diff --git a/lib_com/ivas_filters.c b/lib_com/ivas_filters.c index 69a4e13c1..2790cfb5c 100644 --- a/lib_com/ivas_filters.c +++ b/lib_com/ivas_filters.c @@ -43,8 +43,9 @@ /*------------------------------------------------------------------------------------------* * Local functions declaration *------------------------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void ivas_iir_2_filter( ivas_filters_process_state_t *filter_state, float *pIn_Out, const int16_t length, const int16_t stage ); -#ifdef IVAS_FLOAT_FIXED +#else static void ivas_iir_2_filter_fx( ivas_filters_process_state_t *filter_state, Word32 *pIn_Out_fx, const Word16 length, const Word16 stage, Word16 q_fcator ); #endif /*-----------------------------------------------------------------------------------------* @@ -52,7 +53,7 @@ static void ivas_iir_2_filter_fx( ivas_filters_process_state_t *filter_state, Wo * * Initialisation call for filtering a signal *-----------------------------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void ivas_filters_init( ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ const float *filt_coeff, /* i : filter coefficients */ @@ -98,15 +99,17 @@ void ivas_filters_init( return; } -#ifdef IVAS_FLOAT_FIXED +#else void ivas_filters_init_fx( ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ const Word32 *filt_coeff_fx, /* i : filter coefficients */ + const Word16 *filt_coeff_e, /* i : exponents of filter coefficients */ const Word16 order ) /* i : filter order */ { Word16 i; filter_state->order = order; - + move16(); + test(); IF( EQ_16( order, IVAS_FILTER_ORDER_2 ) || EQ_16( order, IVAS_FILTER_ORDER_1 ) ) { filter_state->filt_len = add( order, 1 ); @@ -114,12 +117,27 @@ void ivas_filters_init_fx( FOR( i = 0; i < IVAS_BIQUAD_FILT_LEN; i++ ) { filter_state->num_fx[IVAS_FILTER_STAGE_0][i] = filt_coeff_fx[i]; - filter_state->den_fx[IVAS_FILTER_STAGE_0][i] = filt_coeff_fx[add( i, IVAS_BIQUAD_FILT_LEN )]; + filter_state->num_e[IVAS_FILTER_STAGE_0][i] = 1; + filter_state->den_fx[IVAS_FILTER_STAGE_0][i] = filt_coeff_fx[i + IVAS_BIQUAD_FILT_LEN]; + filter_state->den_e[IVAS_FILTER_STAGE_0][i] = 1; + move32(); + move32(); + move16(); + move16(); } filter_state->state_fx[0][0] = 0; + filter_state->state_e[0][0] = 0; filter_state->state_fx[0][1] = 0; + filter_state->state_e[0][1] = 0; filter_state->state_fx[0][2] = 0; + filter_state->state_e[0][2] = 0; + move32(); + move32(); + move32(); + move16(); + move16(); + move16(); } ELSE { @@ -129,17 +147,47 @@ void ivas_filters_init_fx( { filter_state->num_fx[IVAS_FILTER_STAGE_0][i] = filt_coeff_fx[i]; - filter_state->den_fx[IVAS_FILTER_STAGE_0][i] = filt_coeff_fx[add( i, IVAS_BIQUAD_FILT_LEN )]; - filter_state->num_fx[IVAS_FILTER_STAGE_1][i] = filt_coeff_fx[add( i, i_mult( IVAS_BIQUAD_FILT_LEN, 2 ) )]; - filter_state->den_fx[IVAS_FILTER_STAGE_1][i] = filt_coeff_fx[add( i, i_mult( IVAS_BIQUAD_FILT_LEN, 3 ) )]; + filter_state->num_e[IVAS_FILTER_STAGE_0][i] = filt_coeff_e[i]; + filter_state->den_fx[IVAS_FILTER_STAGE_0][i] = filt_coeff_fx[i + IVAS_BIQUAD_FILT_LEN]; + filter_state->den_e[IVAS_FILTER_STAGE_0][i] = filt_coeff_e[i + IVAS_BIQUAD_FILT_LEN]; + filter_state->num_fx[IVAS_FILTER_STAGE_1][i] = filt_coeff_fx[i + IVAS_BIQUAD_FILT_LEN * 2]; + filter_state->num_e[IVAS_FILTER_STAGE_1][i] = filt_coeff_e[i + IVAS_BIQUAD_FILT_LEN * 2]; + filter_state->den_fx[IVAS_FILTER_STAGE_1][i] = filt_coeff_fx[i + IVAS_BIQUAD_FILT_LEN * 3]; + filter_state->den_e[IVAS_FILTER_STAGE_1][i] = filt_coeff_e[i + IVAS_BIQUAD_FILT_LEN * 3]; + move32(); + move32(); + move32(); + move32(); + move16(); + move16(); + move16(); + move16(); } filter_state->state_fx[0][0] = 0; + filter_state->state_e[0][0] = 0; filter_state->state_fx[0][1] = 0; + filter_state->state_e[0][1] = 0; filter_state->state_fx[0][2] = 0; + filter_state->state_e[0][2] = 0; filter_state->state_fx[1][0] = 0; + filter_state->state_e[1][0] = 0; filter_state->state_fx[1][1] = 0; + filter_state->state_e[1][1] = 0; filter_state->state_fx[1][2] = 0; + filter_state->state_e[1][2] = 0; + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); } return; @@ -152,6 +200,7 @@ void ivas_filters_init_fx( * * Process call for selecting the type filter *-----------------------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ivas_filter_process( ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ float *pIn_Out, /* i/o: signal subject to filtering */ @@ -177,7 +226,7 @@ void ivas_filter_process( return; } -#ifdef IVAS_FLOAT_FIXED +#else void ivas_filter_process_fx( ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ Word32 *pIn_Out_fx, /* i/o: signal subject to filtering */ @@ -210,6 +259,7 @@ void ivas_filter_process_fx( * * Process call for filtering a signal *-----------------------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void ivas_iir_2_filter( ivas_filters_process_state_t *filter_state, float *pIn_Out, @@ -235,7 +285,7 @@ static void ivas_iir_2_filter( return; } -#ifdef IVAS_FLOAT_FIXED +#else static void ivas_iir_2_filter_fx( ivas_filters_process_state_t *filter_state, Word32 *pIn_Out_fx, @@ -247,92 +297,44 @@ static void ivas_iir_2_filter_fx( Word32 *pIn_fx = pIn_Out_fx; Word32 *pOut_fx = pIn_Out_fx; + Word16 pOut_e; Word32 tmp_pIn_buf_i_fx; - Word32 L_tmp, L_tmp_1; - Word64 L_tmp_2; - Word16 L_tmp_q_factor, L_tmp_2_q_factor, L_tmp_3_q_factor, L_tmp_4_q_factor, L_tmp_5_q_factor, L_tmp_6_q_factor; - - Word16 q_factor_diff; - - Word16 q_factor_filter_num = 30; - Word16 q_factor_filter_den = 30; + Word32 L_tmp_prod, L_tmp; + Word16 L_prod_e, L_tmp_e; FOR( i = 0; i < length; i++ ) { tmp_pIn_buf_i_fx = pIn_fx[i]; + move32(); - /*L_tmp = Mpy_32_32(pIn_fx[i], filter_state->num_fx[stage][0]);*/ + L_tmp_prod = Mpy_32_32( filter_state->num_fx[stage][0], pIn_fx[i] ); + L_prod_e = sub( 31, sub( q_factor, filter_state->num_e[stage][0] ) ); // 31 - ( ( q_factor + ( 31 - filter_state->num_e[stage][0] ) ) - 31 ) - L_tmp_q_factor = sub( add( q_factor, q_factor_filter_num ), 31 ); + pOut_fx[i] = BASOP_Util_Add_Mant32Exp( filter_state->state_fx[stage][0], filter_state->state_e[stage][0], L_tmp_prod, L_prod_e, &pOut_e ); + move32(); - IF( GE_16( L_tmp_q_factor, q_factor ) ) - { - q_factor_diff = sub( L_tmp_q_factor, q_factor ); - pOut_fx[i] = L_add( ( filter_state->state_fx[stage][0] ), L_shr( Mpy_32_32( filter_state->num_fx[stage][0], pIn_fx[i] ), q_factor_diff ) ); - L_tmp_2_q_factor = q_factor; - } - ELSE + FOR( j = 1; j < filter_state->filt_len; j++ ) { - q_factor_diff = sub( q_factor, L_tmp_q_factor ); - pOut_fx[i] = L_add( L_shr( filter_state->state_fx[stage][0], q_factor_diff ), ( Mpy_32_32( filter_state->num_fx[stage][0], pIn_fx[i] ) ) ); - pOut_fx[i] = L_shl( pOut_fx[i], q_factor_diff ); - L_tmp_2_q_factor = q_factor; - } + L_tmp_prod = Mpy_32_32( filter_state->num_fx[stage][j], tmp_pIn_buf_i_fx ); + L_prod_e = sub( 31, sub( q_factor, filter_state->num_e[stage][j] ) ); // 31 - ( ( q_factor + ( 31 - filter_state->num_e[stage][j] ) ) - 31 ) + L_tmp = BASOP_Util_Add_Mant32Exp( filter_state->state_fx[stage][j], filter_state->state_e[stage][j], L_tmp_prod, L_prod_e, &L_tmp_e ); - FOR( j = 1; j < filter_state->filt_len; j++ ) + L_tmp_prod = Mpy_32_32( filter_state->den_fx[stage][j], pOut_fx[i] ); + L_prod_e = add( pOut_e, filter_state->den_e[stage][j] ); // 31 - ( ( ( 31 - pOut_e ) + ( 31 - filter_state->den_e[stage][j] ) ) - 31 ); + + filter_state->state_fx[stage][j - 1] = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_e, L_negate( L_tmp_prod ), L_prod_e, &filter_state->state_e[stage][j - 1] ); + move32(); + } + + /* Scaling pOut_fx to Q11 */ + pOut_fx[i] = L_shr_sat( pOut_fx[i], sub( sub( 31, q_factor ), pOut_e ) ); + move32(); + IF( pOut_fx[i] < 0 ) { - /*L_tmp_1 = filter_state->num_fx[stage][j] * tmp_pIn_buf_i_fx;*/ - - L_tmp_3_q_factor = sub( add( q_factor_filter_num, q_factor ), 31 ); - - IF( GE_16( L_tmp_3_q_factor, q_factor ) ) - { - q_factor_diff = sub( L_tmp_3_q_factor, q_factor ); - L_tmp = L_add( ( filter_state->state_fx[stage][j] ), L_shr( Mpy_32_32( filter_state->num_fx[stage][j], tmp_pIn_buf_i_fx ), q_factor_diff ) ); - L_tmp_4_q_factor = q_factor; - } - ELSE - { - q_factor_diff = sub( q_factor, L_tmp_3_q_factor ); - L_tmp = L_add( L_shr( filter_state->state_fx[stage][j], q_factor_diff ), ( Mpy_32_32( filter_state->num_fx[stage][j], tmp_pIn_buf_i_fx ) ) ); - L_tmp_4_q_factor = L_tmp_3_q_factor; - } - - /*L_tmp_3 = filter_state->den_fx[stage][j] * pOut_fx[i];*/ - - L_tmp_5_q_factor = sub( add( q_factor_filter_den, L_tmp_2_q_factor ), 31 ); - - - IF( GE_16( L_tmp_5_q_factor, L_tmp_4_q_factor ) ) - { - q_factor_diff = sub( L_tmp_5_q_factor, L_tmp_4_q_factor ); - L_tmp_1 = L_sub( L_tmp, L_shr( Mpy_32_32( filter_state->den_fx[stage][j], pOut_fx[i] ), q_factor_diff ) ); - L_tmp_6_q_factor = L_tmp_4_q_factor; - } - ELSE - { - q_factor_diff = sub( L_tmp_4_q_factor, L_tmp_5_q_factor ); - L_tmp_1 = L_sub( L_shr( L_tmp, q_factor_diff ), Mpy_32_32( filter_state->den_fx[stage][j], pOut_fx[i] ) ); - L_tmp_6_q_factor = L_tmp_5_q_factor; - } - - IF( GE_16( L_tmp_6_q_factor, q_factor ) ) - { - q_factor_diff = sub( L_tmp_6_q_factor, q_factor ); - L_tmp_2 = W_shr( (Word64) L_tmp_1, q_factor_diff ); - } - ELSE - { - q_factor_diff = sub( q_factor, L_tmp_6_q_factor ); - L_tmp_2 = W_shl( (Word64) L_tmp_1, q_factor_diff ); - } - - - filter_state->state_fx[stage][j - 1] = W_extract_l( L_tmp_2 ); - - // filter_state->state[stage][j - 1] = WORD322FL_SCALE(filter_state->state_fx[stage][j - 1], sub(31, q_factor)); + pOut_fx[i] = L_add( pOut_fx[i], 1 ); + move32(); } } } diff --git a/lib_com/ivas_lfe_com.c b/lib_com/ivas_lfe_com.c index 99c7741c3..0249e288e 100644 --- a/lib_com/ivas_lfe_com.c +++ b/lib_com/ivas_lfe_com.c @@ -54,7 +54,7 @@ * * Selects LFE filter coeff based on config. *-----------------------------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void ivas_lfe_lpf_select_filt_coeff( const int32_t sampling_rate, /* i : sampling rate */ const int16_t order, /* i : filter order */ @@ -102,11 +102,12 @@ void ivas_lfe_lpf_select_filt_coeff( return; } -#ifdef IVAS_FLOAT_FIXED +#else void ivas_lfe_lpf_select_filt_coeff_fx( - const Word32 sampling_rate, /* i : sampling rate */ - const Word16 order, /* i : filter order */ - const Word32 **ppFilt_coeff_fx /* o : filter coefficients */ + const Word32 sampling_rate, /* i : sampling rate */ + const Word16 order, /* i : filter order */ + const Word32 **ppFilt_coeff_fx, /* o : filter coefficients */ + const Word16 **ppFilt_coeff_e /* o : exponents of filter coefficients */ ) { SWITCH( order ) @@ -132,12 +133,15 @@ void ivas_lfe_lpf_select_filt_coeff_fx( { case 16000: *ppFilt_coeff_fx = ivas_lpf_4_butter_16k_sos_fx; + *ppFilt_coeff_e = ivas_lpf_4_butter_16k_sos_e; BREAK; case 32000: *ppFilt_coeff_fx = ivas_lpf_4_butter_32k_sos_fx; + *ppFilt_coeff_e = ivas_lpf_4_butter_32k_sos_e; BREAK; case 48000: *ppFilt_coeff_fx = ivas_lpf_4_butter_48k_sos_fx; + *ppFilt_coeff_e = ivas_lpf_4_butter_48k_sos_e; BREAK; default: BREAK; @@ -185,15 +189,19 @@ void ivas_lfe_window_init_fx( /* 10ms stride, MDCT will be done in two iterations */ hLFEWindow->dct_len = shr( frame_len, 1 ); + move16(); /* 8ms of latency */ - hLFEWindow->fade_len = NS2SA( sampling_rate, IVAS_LFE_FADE_NS ); + hLFEWindow->fade_len = NS2SA_fx2( sampling_rate, IVAS_LFE_FADE_NS ); hLFEWindow->zero_pad_len = ( mult( IVAS_ZERO_PAD_LEN_MULT_FAC_fx, sub( hLFEWindow->dct_len, hLFEWindow->fade_len ) ) ); hLFEWindow->full_len = add( add( hLFEWindow->zero_pad_len, hLFEWindow->fade_len ), hLFEWindow->dct_len ); + move16(); + move16(); + move16(); return; } -#endif +#else void ivas_lfe_window_init( LFE_WINDOW_HANDLE hLFEWindow, /* i/o: LFE window handle */ const int32_t sampling_rate, /* i : sampling rate */ @@ -228,3 +236,4 @@ void ivas_lfe_window_init( return; } +#endif diff --git a/lib_com/ivas_mdct_imdct_fx.c b/lib_com/ivas_mdct_imdct_fx.c index 486f3a8db..e5bdfca19 100644 --- a/lib_com/ivas_mdct_imdct_fx.c +++ b/lib_com/ivas_mdct_imdct_fx.c @@ -355,7 +355,6 @@ void ivas_imdct_fx( * * Sets/Maps the fft twiddle tables based on fft length *-----------------------------------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED void ivas_get_twid_factors_fx1( const Word16 length, const Word16 **pTwid_re, @@ -388,7 +387,6 @@ void ivas_get_twid_factors_fx1( return; } -#endif /*-----------------------------------------------------------------------------------------* * Function ivas_get_mdct_scaling_gain_fx() diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index ffb1b6014..65b5e6c50 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1435,6 +1435,19 @@ void ivas_param_ism_params_to_masa_param_mapping( ivas_error ivas_ism_dtx_open( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); +#ifdef IVAS_FLOAT_FIXED +Word16 ivas_ism_dtx_enc_fx( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 nchan_ism, /* i : number of objects */ + const Word16 nchan_transport, /* i : number of transport channels */ + Word16 vad_flag[MAX_NUM_OBJECTS], /* i : VAD flag */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + Word16 md_diff_flag[], /* o : metadata differential flag */ + Word16 *sid_flag /* o : indication of SID frame */ +); +#endif // IVAS_FLOAT_FIXED /*! r: indication of DTX frame */ int16_t ivas_ism_dtx_enc( @@ -1485,6 +1498,14 @@ void ivas_ism_metadata_sid_dec( ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ int16_t nb_bits_metadata[] /* o : number of metadata bits */ ); +#ifdef IVAS_FLOAT_FIXED +void ivas_ism_get_sce_id_dtx_fx( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const Word16 nchan_transport, /* i : number of transport channels */ + const Word16 input_frame /* i : input frame length per channel */ +); +#endif // IVAS_FLOAT_FIXED void ivas_ism_get_sce_id_dtx( ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ @@ -1497,6 +1518,14 @@ void ivas_param_ism_compute_noisy_speech_flag( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); +#ifdef IVAS_FLOAT_FIXED +void ivas_ism_coh_estim_dtx_enc_fx( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const Word16 nchan_transport, /* i : number of transport channels */ + const Word16 input_frame /* i : input frame length */ +); +#endif // IVAS_FLOAT_FIXED void ivas_ism_coh_estim_dtx_enc( ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ @@ -1891,6 +1920,16 @@ void filter_with_allpass( ); /*! r: used GR order */ +#ifdef IVAS_FLOAT_FIXED +Word16 write_bitstream_adapt_GR( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const Word16 ind, /* i : bitstream index */ + const Word16 *in, /* i : values to be written in bitstream */ + const Word16 len, /* i : values vector length */ + const Word16 GR_ord, /* i : GR order to be used */ + const Word16 no_GR_ord /* i : speech/music 0/1 */ +); +#else int16_t write_bitstream_adapt_GR( BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ const int16_t Indice, /* i : identifier for bitstream index */ @@ -1899,8 +1938,27 @@ int16_t write_bitstream_adapt_GR( const int16_t GR_ord, /* i : GR order to be used */ const int16_t sp_aud_decision /* i : speech/music 0/1 */ ); +#endif /*! r: used GR order */ +#ifdef IVAS_FLOAT_FIXED +Word16 adapt_GR_ief_fx( + const Word16 *in, /* i : vector to encode */ + Word16 *in_diff, /* o : encoded symbols in case of differential encoding */ + const Word16 *prev, /* i : previous frame data */ + const Word16 len, /* i : input vector length */ + const Word16 no_symb, /* i : number of symbols */ + Word16 *nbits, /* o : number of used bits */ + Word16 *in_enc, /* o : symbold actually encoded after adapt_GR */ + const Word16 *map0, /* i : mapping array */ + const Word16 no_GR_ord, /* i : number of GR order to try 2: 0,1; 3:0,1,2 */ + Word16 *nbits_diff, /* o : number bits in diff encoding */ + const Word16 side_gain_counter, /* i : number of frames since last abs coding */ + Word16 *side_gain_bitdiff_lp, /* i/o: LP-filtered bit difference between abs/diff */ + Word16 *q_side_gain_bitdiff_lp, /* i/o: Q of LP-filtered bit difference between abs/diff */ + const Word16 try_diff /* i : diff coding allowed 1/0 */ +); +#else int16_t adapt_GR_ief( const int16_t *in, /* i : vector to encode */ int16_t *in_diff, /* o : encoded symbols in case of differential encoding */ @@ -1916,7 +1974,23 @@ int16_t adapt_GR_ief( float *side_gain_bitdiff_lp, /* i/o: LP-filtered bit difference between abs/diff */ const int16_t try_diff /* i : diff coding allowed 1/0 */ ); +#endif +#ifdef IVAS_FLOAT_FIXED +Word16 adapt_GR_rpg1_ief( + const Word16 *in, /* i : res pred gains input vector */ + Word16 *in_diff, /* o : encoded symbols in case of differential encoding */ + const Word16 *prev, /* i : previous frame data */ + const Word16 len, /* i : input vector length */ + const Word16 no_symb, /* i : number of symbols */ + Word16 *nbits, /* o : number of used bits */ + Word16 *in_enc, /* o : symbold actually encoded after adapt_GR */ + const Word16 *maps, /* i : mapping array */ + Word16 *nbits_diff, /* o : estimated no of bits for differential encoding */ + const Word16 no_GR_ord, /* i : number of GR order to try 2: 0,1; 3:0,1,2 */ + const Word16 try_diff /* i : diff coding allowed 1/0 */ +); +#else /*! r: used GR order */ int16_t adapt_GR_rpg1_ief( const int16_t *in, /* i : res pred gains input vector */ @@ -1931,16 +2005,35 @@ int16_t adapt_GR_rpg1_ief( const int16_t no_GR_ord, /* i : number of GR order to try 2: 0,1; 3:0,1,2 */ const int16_t try_diff /* i : diff coding allowed 1/0 */ ); +#endif /*! r: number of bits written */ +#ifdef IVAS_FLOAT_FIXED +Word16 write_GR1( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const Word16 ind, /* i : bitstream index */ + const Word16 *in, /* i : data to be encoded */ + const Word16 len /* i : input data length */ +); +#else int16_t write_GR1( BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ const int16_t ind, /* i : bitstream index */ const int16_t *in, /* i : input vector */ const int16_t len /* i : vector length */ ); +#endif /*! r: number of bits written */ +#ifdef IVAS_FLOAT_FIXED +Word16 write_bitstream_GR( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const Word16 ind, /* i : bitstream index */ + const Word16 *in, /* i : input vector */ + const Word16 len, /* i : input vector length */ + const Word16 GR_ord /* i : GR order */ +); +#else int16_t write_bitstream_GR( BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ const int16_t ind, /* i : bitstream index */ @@ -1948,6 +2041,7 @@ int16_t write_bitstream_GR( const int16_t len, /* i : input data length */ const int16_t GR_ord /* i : GR order to be used */ ); +#endif #ifndef IVAS_FLOAT_FIXED /*! r: number of bits read */ @@ -3649,12 +3743,21 @@ void stereo_mdct2dft_update_fx( Word32 synth0_fx[] /* i/o: synthesis @output Fs, ch0 */ ); /*! r: number of bits written */ +#ifdef IVAS_FLOAT_FIXED +Word16 write_GR0( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const Word16 ind, /* i : bitstream index */ + const Word16 *in, /* i : data to be encoded */ + const Word16 len /* i : input data length */ +); +#else int16_t write_GR0( BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ const int16_t ind, /* i : bitstream index */ const int16_t *in, /* i : data to be encoded */ const int16_t len /* i : input data length */ ); +#endif #ifndef IVAS_FLOAT_FIXED /*! r: number of bits read */ @@ -7219,7 +7322,8 @@ void ivas_lfe_lpf_select_filt_coeff( void ivas_lfe_lpf_select_filt_coeff_fx( const Word32 sampling_rate, /* i : sampling rate */ const Word16 order, /* i : filter order */ - const Word32 **ppFilt_coeff_fx /* o : filter coefficients */ + const Word32 **ppFilt_coeff_fx, /* o : filter coefficients */ + const Word16 **ppFilt_coeff_e /* o : exponents of filter coefficients */ ); #endif @@ -7234,6 +7338,7 @@ void ivas_filters_init( void ivas_filters_init_fx( ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ const Word32 *filt_coeff, /* i : filter coefficients */ + const Word16 *filt_coeff_e, /* i : exponents of filter coefficients */ const Word16 order /* i : filter order */ ); #endif diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 12a8e69c8..6be57ae48 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -2423,4 +2423,26 @@ void tdm_SCh_LSF_intra_pred_fx( const Word16 *tdm_lsfQ_PCh_fx, /* i : primary channel LSFs */ Word16 *pred_lsf_SCh_fx /* o : predicted secondary channel LSFs */ ); + +ivas_error ivas_create_lfe_lpf_enc_fx( + ivas_filters_process_state_t **hLfeLpf, /* o : LFE LPF handle */ + const Word32 input_Fs /* i : input sampling rate */ +); + +void ivas_lfe_lpf_enc_apply_fx( + ivas_filters_process_state_t *hLfeLpf, /* i/o: LFE LPF handle */ + Word32 data_lfe_ch[], /* i/o: LFE signal */ + const Word16 input_frame /* i : input frame length per channel */ +); + +// ivas_arith.c +void ivas_ari_done_encoding_14bits_fx( + BSTR_ENC_HANDLE hBstr, + Tastat *s ); + +void ivas_ari_encode_14bits_ext_fx( + BSTR_ENC_HANDLE hBstr, + Tastat *s, + Word32 symbol, + const UWord16 *cum_freq ); #endif diff --git a/lib_com/ivas_rom_com_fx.c b/lib_com/ivas_rom_com_fx.c index 6dddb795f..42176bf82 100644 --- a/lib_com/ivas_rom_com_fx.c +++ b/lib_com/ivas_rom_com_fx.c @@ -1664,33 +1664,46 @@ const Word32 ism_elevation_borders_fx[4] = { *----------------------------------------------------------------------------------*/ const Word32 ivas_lpf_4_butter_16k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2] = { - 0x1ab, 0x356, 0x1ab, 0x40000000, + // 0x1ab, 0x356, 0x1ab, 0x40000000, + 0x3558C94E, 0x3558C95D, 0x3558C94E, 0x40000000, 0x85ec0b80, 0x3a3cb940, 0x40000000, 0x7fffffff, 0x40000000, 0x40000000, 0x829d8180, 0x3d8c5e40 }; +const Word16 ivas_lpf_4_butter_16k_sos_e[IVAS_BIQUAD_FILT_LEN << 2] = { + -20, -19, -20, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; const Word32 ivas_lpf_4_butter_32k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2] = { - 0x1c, 0x37, 0x1c, 0x40000000, + // 0x1c, 0x37, 0x1c, 0x40000000, + 0x371ED5AA, 0x371ED5BA, 0x371ED5AA, 0x40000000, 0x82fd4b80, 0x3d0d2280, 0x40000000, 0x7fffffff, 0x40000000, 0x40000000, 0x81478600, 0x3ec30c00 }; +const Word16 ivas_lpf_4_butter_32k_sos_e[IVAS_BIQUAD_FILT_LEN << 2] = { + -24, -23, -24, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; const Word32 ivas_lpf_4_butter_48k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2] = { - 0x6, 0xb, 0x6, 0x40000000, - 0x81ffd700, 0x3e04d500, 0x40000000, 0x7fffff80, - 0x40000000, 0x40000000, 0x80d8b600, 0x3f2c0080 + // 6, 11, 6, 1073741824, /* Q30 */ + 1477520448, 1477520448, 1477520448, 1073741824, + -2113939767, 1040504054, 1073741824, 2147483480, + 1073741829, 1073741824, -2133281237, 1059848324 +}; +const Word16 ivas_lpf_4_butter_48k_sos_e[IVAS_BIQUAD_FILT_LEN << 2] = { + -27, -26, -27, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -const Word32 ivas_lpf_2_butter_16k_fx[IVAS_BIQUAD_FILT_LEN << 1] = { - 0xa4d0c, 0x149a17, 0xa4d0c, 0x40000000, 0x849e6300, 0x3b8ad140 +const Word32 ivas_lpf_2_butter_16k_fx[IVAS_BIQUAD_FILT_LEN << 1] = { /* Q30 */ + 0xa4d0c, 0x149a17, 0xa4d0c, 0x40000000, 0x849e6300, 0x3b8ad140 }; -const Word32 ivas_lpf_2_butter_32k_fx[IVAS_BIQUAD_FILT_LEN << 1] = { - 0x53e1a, 0x29f0d, 0x40000000, 0x824f6000, 0x3dbb1c80, 0x29f0d +const Word32 ivas_lpf_2_butter_32k_fx[IVAS_BIQUAD_FILT_LEN << 1] = { /* Q30 */ + // 0x53e1a, 0x29f0d, 0x40000000, 0x824f6000, 0x3dbb1c80, 0x29f0d + 0x29F0D, 0x53E1A, 0x29F0D, 0x40000000, 0x824F5FC3, 0x3DBB1C71 }; -const Word32 ivas_lpf_2_butter_48k_fx[IVAS_BIQUAD_FILT_LEN << 1] = { - 0x12c07, 0x2580d, 0x12c07, 0x40000000, 0x818a4580, 0x3e7a6a80 +const Word32 ivas_lpf_2_butter_48k_fx[IVAS_BIQUAD_FILT_LEN << 1] = { /* Q30 */ + 0x12c07, 0x2580d, 0x12c07, 0x40000000, 0x818a4580, 0x3e7a6a80 }; const Word32 ivas_lfe_window_coeff_48k_fx[IVAS_LFE_FADE_LEN_48K] = { diff --git a/lib_com/ivas_rom_com_fx.h b/lib_com/ivas_rom_com_fx.h index 049dd0aad..29a5b21cf 100644 --- a/lib_com/ivas_rom_com_fx.h +++ b/lib_com/ivas_rom_com_fx.h @@ -206,8 +206,11 @@ extern const Word32 ism_elevation_borders_fx[4]; *----------------------------------------------------------------------------------*/ extern const Word32 ivas_lpf_4_butter_16k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; +extern const Word16 ivas_lpf_4_butter_16k_sos_e[IVAS_BIQUAD_FILT_LEN << 2]; extern const Word32 ivas_lpf_4_butter_32k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; +extern const Word16 ivas_lpf_4_butter_32k_sos_e[IVAS_BIQUAD_FILT_LEN << 2]; extern const Word32 ivas_lpf_4_butter_48k_sos_fx[IVAS_BIQUAD_FILT_LEN << 2]; +extern const Word16 ivas_lpf_4_butter_48k_sos_e[IVAS_BIQUAD_FILT_LEN << 2]; extern const Word32 ivas_lpf_2_butter_16k_fx[IVAS_BIQUAD_FILT_LEN << 1]; extern const Word32 ivas_lpf_2_butter_32k_fx[IVAS_BIQUAD_FILT_LEN << 1]; extern const Word32 ivas_lpf_2_butter_48k_fx[IVAS_BIQUAD_FILT_LEN << 1]; diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 8a042ca26..0e26a892c 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -599,7 +599,7 @@ typedef struct ivas_masa_qmetadata_frame_struct #ifndef IVAS_FLOAT_FIXED float dir_comp_ratio; #else - Word16 dir_comp_ratio_fx; /* Q15 */ + Word16 dir_comp_ratio_fx; /* Q15 */ #endif uint8_t is_masa_ivas_format; @@ -731,12 +731,14 @@ typedef struct ivas_filters_process_state_t Word32 num_fx[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; Word32 den_fx[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; Word32 state_fx[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; - Word32 state_fx_q_factor[IVAS_FILTER_MAX_STAGES]; -#endif + Word16 num_e[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; + Word16 den_e[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; + Word16 state_e[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; +#else float num[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; float den[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; float state[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN]; - +#endif } ivas_filters_process_state_t; diff --git a/lib_com/ivas_transient_det.c b/lib_com/ivas_transient_det.c index 54539e383..a8841845a 100644 --- a/lib_com/ivas_transient_det.c +++ b/lib_com/ivas_transient_det.c @@ -134,6 +134,7 @@ static void ivas_transient_det_init( float filt_coeff_arr[3][IVAS_BIQUAD_FILT_LEN << 1]; #else Word32 filt_coeff_arr_fx[3][IVAS_BIQUAD_FILT_LEN << 1]; + const Word16 *filt_coeff_arr_e = NULL; #endif #ifdef IVAS_FLOAT_FIXED @@ -284,9 +285,9 @@ static void ivas_transient_det_init( ivas_filters_init( &hTranDet->env_fast, (const float *) filt_coeff_arr[1], IVAS_FILTER_ORDER_1 ); ivas_filters_init( &hTranDet->env_slow, (const float *) filt_coeff_arr[2], IVAS_FILTER_ORDER_1 ); #else - ivas_filters_init_fx( &hTranDet->env_hpf, (const Word32 *) filt_coeff_arr_fx[0], IVAS_FILTER_ORDER_1 ); - ivas_filters_init_fx( &hTranDet->env_fast, (const Word32 *) filt_coeff_arr_fx[1], IVAS_FILTER_ORDER_1 ); - ivas_filters_init_fx( &hTranDet->env_slow, (const Word32 *) filt_coeff_arr_fx[2], IVAS_FILTER_ORDER_1 ); + ivas_filters_init_fx( &hTranDet->env_hpf, (const Word32 *) filt_coeff_arr_fx[0], filt_coeff_arr_e, IVAS_FILTER_ORDER_1 ); + ivas_filters_init_fx( &hTranDet->env_fast, (const Word32 *) filt_coeff_arr_fx[1], filt_coeff_arr_e, IVAS_FILTER_ORDER_1 ); + ivas_filters_init_fx( &hTranDet->env_slow, (const Word32 *) filt_coeff_arr_fx[2], filt_coeff_arr_e, IVAS_FILTER_ORDER_1 ); #endif diff --git a/lib_com/prot_fx2.h b/lib_com/prot_fx2.h index e03108221..95ec1b4a8 100644 --- a/lib_com/prot_fx2.h +++ b/lib_com/prot_fx2.h @@ -2289,17 +2289,17 @@ Word32 Interpol_lc_fx( /* o : interpolated value ); -// modif_fs_fx.c -Word16 modify_Fs_fx( /* o : length of output Q0 */ - const Word16 sigIn_fx[], /* i : signal to decimate Q0 */ - Word16 lg, /* i : length of input Q0 */ - const Word32 fin, /* i : frequency of input Q0 */ - Word16 sigOut_fx[], /* o : decimated signal Q0 */ - const Word32 fout, /* i : frequency of output Q0 */ - Word16 mem_fx[], /* i/o: filter memory Q0 */ - const Word16 nblp, /* i : flag indicating if NB low-pass is applied */ - Word16 *Q_new_inp, // TO be removed - Word16 *mem_decim_size // TO be removed +//modif_fs_fx.c +Word16 modify_Fs_fx( /* o : length of output Q0 */ + const Word16 sigIn_fx[], /* i : signal to decimate Q0 */ + Word16 lg, /* i : length of input Q0 */ + const Word32 fin, /* i : frequency of input Q0 */ + Word16 sigOut_fx[], /* o : decimated signal Q0 */ + const Word32 fout, /* i : frequency of output Q0 */ + Word16 mem_fx[], /* i/o: filter memory Q0 */ + const Word16 nblp, /* i : flag indicating if NB low-pass is applied */ + Word16 *Q_new_inp, //TO be removed + Word16 *mem_decim_size //TO be removed ); Word16 modify_Fs_intcub3m_sup_fx( /* o : length of output */ @@ -9249,3 +9249,6 @@ void ivas_mdct_core_reconstruct_fx( const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ Word16 q_x, Word16 e_sig ); + +void ari_start_encoding_14bits_ivas_fx( + Tastat *s ); diff --git a/lib_enc/acelp_core_enc_fx.c b/lib_enc/acelp_core_enc_fx.c index 3d4eda605..c7688e7df 100644 --- a/lib_enc/acelp_core_enc_fx.c +++ b/lib_enc/acelp_core_enc_fx.c @@ -396,7 +396,7 @@ ivas_error acelp_core_enc_fx( IF( !nelp_mode && !ppp_mode ) { config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, - st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot_fx, st_fx->coder_type, + st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, tc_subfr_fx, 0, &nb_bits, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); } @@ -531,7 +531,7 @@ ivas_error acelp_core_enc_fx( tc_classif_enc_fx( Q_new, st_fx->L_frame, &tc_subfr_fx, &position, attack_flag, st_fx->pitch_fx[0], res_fx ); config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, - -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot_fx, st_fx->coder_type, tc_subfr_fx, 1, NULL, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, + -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, tc_subfr_fx, 1, NULL, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); } @@ -599,7 +599,7 @@ ivas_error acelp_core_enc_fx( /* Configure ACELP bit allocation */ config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, - -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot_fx, st_fx->coder_type, tc_subfr_fx, 0, &nb_bits, unbits_fx, 0, &uc_two_stage_flag, 0, 0, + -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, tc_subfr_fx, 0, &nb_bits, unbits_fx, 0, &uc_two_stage_flag, 0, 0, st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); /* redo LSF quantization */ diff --git a/lib_enc/acelp_core_switch_enc_fx.c b/lib_enc/acelp_core_switch_enc_fx.c index e71900fc2..bda7304c8 100644 --- a/lib_enc/acelp_core_switch_enc_fx.c +++ b/lib_enc/acelp_core_switch_enc_fx.c @@ -138,7 +138,7 @@ void acelp_core_switch_enc_fx( /*----------------------------------------------------------------* * Excitation encoding *----------------------------------------------------------------*/ - config_acelp1( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot_fx, + config_acelp1( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, GENERIC, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); encod_gen_voic_core_switch_fx( st_fx, st_fx->last_L_frame, inp, Aq, A, T_op, exc, cbrate, shift, Q_new ); @@ -160,11 +160,11 @@ void acelp_core_switch_enc_fx( #else FOR( i = 0; i < 20; i++ ) { - hBstr->ind_list_fx[IND_CORE_SWITCHING_CELP_SUBFRAME + i].value = hBstr->ind_list_fx[TAG_ACELP_SUBFR_LOOP_START + i].value; + hBstr->ind_list[IND_CORE_SWITCHING_CELP_SUBFRAME + i].value = hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].value; move16(); - hBstr->ind_list_fx[IND_CORE_SWITCHING_CELP_SUBFRAME + i].nb_bits = hBstr->ind_list_fx[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits; + hBstr->ind_list[IND_CORE_SWITCHING_CELP_SUBFRAME + i].nb_bits = hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits; move16(); - hBstr->ind_list_fx[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits = -1; + hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits = -1; move16(); } #endif diff --git a/lib_enc/ari_enc.c b/lib_enc/ari_enc.c index 2908310f8..192479aa6 100644 --- a/lib_enc/ari_enc.c +++ b/lib_enc/ari_enc.c @@ -39,6 +39,7 @@ #include "options.h" #include "cnst.h" #include "prot.h" +#include "prot_fx2.h" #include "stat_com.h" #include "basop_util.h" #include "wmc_auto.h" @@ -81,7 +82,21 @@ void ari_start_encoding_14bits( return; } +#ifdef IVAS_FLOAT_FIXED +void ari_start_encoding_14bits_ivas_fx( + Tastat *s ) +{ + /* : addressing is made with walking pointer s */ + s->low = 0; + s->high = ari_q4new; + s->bits_to_follow = 0; + move32(); + move32(); + move32(); + return; +} +#endif /*--------------------------------------------------------------- * ari_done_encoding_14bits() diff --git a/lib_enc/cng_enc_fx.c b/lib_enc/cng_enc_fx.c index c037a4c34..dc5ed20df 100644 --- a/lib_enc/cng_enc_fx.c +++ b/lib_enc/cng_enc_fx.c @@ -1319,8 +1319,8 @@ static void shb_CNG_encod_fx( push_indice_fx( hBstr, IND_SHB_CNG_GAIN, idx_ener_fx, 4 ); push_indice_fx( hBstr, IND_SID_BW, 1, 1 ); #ifndef IVAS_CODE - hBstr->nb_bits_tot_fx = sub( hBstr->nb_bits_tot_fx, hBstr->ind_list_fx[IND_CNG_ENV1].nb_bits ); - hBstr->ind_list_fx[IND_CNG_ENV1].nb_bits = -1; + hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, hBstr->ind_list[IND_CNG_ENV1].nb_bits ); + hBstr->ind_list[IND_CNG_ENV1].nb_bits = -1; #else delete_indice( hBstr, IND_CNG_ENV1 ); #endif diff --git a/lib_enc/enc_prm_fx.c b/lib_enc/enc_prm_fx.c index 93b4698fc..b32c0f2ae 100644 --- a/lib_enc/enc_prm_fx.c +++ b/lib_enc/enc_prm_fx.c @@ -301,7 +301,7 @@ void enc_prm_fx( move16(); move16(); j = 0; - nbits_start = hBstr->nb_bits_tot_fx; + nbits_start = hBstr->nb_bits_tot; /*--------------------------------------------------------------------------------* @@ -514,7 +514,7 @@ void enc_prm_fx( st->glr_reset = 0; move16(); - nbits_header = sub( hBstr->nb_bits_tot_fx, nbits_start ); + nbits_header = sub( hBstr->nb_bits_tot, nbits_start ); /*--------------------------------------------------------------------------------* @@ -744,7 +744,7 @@ void enc_prm_fx( IGFEncWriteBitstream_fx( st->hIGFEnc, hBstr, &st->hIGFEnc->infoTotalBitsPerFrameWritten, IGF_GRID_LB_NORM, 1 ); } } - total_nbbits = sub( hBstr->nb_bits_tot_fx, nbits_start ); + total_nbbits = sub( hBstr->nb_bits_tot, nbits_start ); if ( EQ_16( st->rf_mode, 1 ) ) { total_nbbits = add( total_nbbits, st->rf_target_bits_write ); @@ -798,7 +798,7 @@ void enc_prm_fx( j = 0; move16(); - nbits_tcx = total_nbbits = sub( hBstr->nb_bits_tot_fx, nbits_start ); + nbits_tcx = total_nbbits = sub( hBstr->nb_bits_tot, nbits_start ); test(); IF( st->enablePlcWaveadjust && k ) @@ -878,7 +878,7 @@ void enc_prm_fx( } j = add( j, NPRM_CTX_HM ); - total_nbbits = sub( hBstr->nb_bits_tot_fx, nbits_start ); + total_nbbits = sub( hBstr->nb_bits_tot, nbits_start ); nbits_tcx = sub( shr( sub( add( sub( sub( sub( st->bits_frame_core, nbits_header ), nbits_lpc ), nbits_igf ), 1 ), k ), 1 ), sub( total_nbbits, nbits_tcx ) ); @@ -903,7 +903,7 @@ void enc_prm_fx( *--------------------------------------------------------------------------------*/ - total_nbbits = sub( hBstr->nb_bits_tot_fx, nbits_start ); + total_nbbits = sub( hBstr->nb_bits_tot, nbits_start ); /* Check if total encoded bits does not exceed CBR target bits (->this must never happen) */ diff --git a/lib_enc/eval_pit_contr_fx.c b/lib_enc/eval_pit_contr_fx.c index 308f3ec4e..df7622653 100644 --- a/lib_enc/eval_pit_contr_fx.c +++ b/lib_enc/eval_pit_contr_fx.c @@ -382,10 +382,10 @@ Word16 Pit_exc_contribution_len_fx( /* o : bin where pit FOR( i = TAG_ACELP_SUBFR_LOOP_START; i < TAG_ACELP_SUBFR_LOOP_END; i++ ) { #ifndef IVAS_CODE_BITSTREAM - IF( hBstr->ind_list_fx[i].nb_bits != -1 ) + IF( hBstr->ind_list[i].nb_bits != -1 ) { - hBstr->nb_bits_tot_fx = sub( hBstr->nb_bits_tot_fx, hBstr->ind_list_fx[i].nb_bits ); - hBstr->ind_list_fx[i].nb_bits = -1; + hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, hBstr->ind_list[i].nb_bits ); + hBstr->ind_list[i].nb_bits = -1; move16(); } #else @@ -394,10 +394,10 @@ Word16 Pit_exc_contribution_len_fx( /* o : bin where pit } #ifndef IVAS_CODE_BITSTREAM - IF( hBstr->ind_list_fx[IND_ES_PRED].nb_bits != -1 ) + IF( hBstr->ind_list[IND_ES_PRED].nb_bits != -1 ) { - hBstr->nb_bits_tot_fx = sub( hBstr->nb_bits_tot_fx, hBstr->ind_list_fx[IND_ES_PRED].nb_bits ); - hBstr->ind_list_fx[IND_ES_PRED].nb_bits = -1; + hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, hBstr->ind_list[IND_ES_PRED].nb_bits ); + hBstr->ind_list[IND_ES_PRED].nb_bits = -1; move16(); } #else diff --git a/lib_enc/evs_enc_fx.c b/lib_enc/evs_enc_fx.c index 53b52d3dc..7cc08c96b 100644 --- a/lib_enc/evs_enc_fx.c +++ b/lib_enc/evs_enc_fx.c @@ -410,13 +410,13 @@ ivas_error evs_enc_fx( { /* padBits = ((st->bits_frame+7)/8)*8 - (st->nb_bits_tot + (st->rf_target_bits_write - ((st->Opt_RF_ON==1)?1:0) ) + get_tbe_bits(st->total_brate, st->bwidth, st->rf_mode )); */ tmp = add( get_tbe_bits_fx( st->total_brate, st->bwidth, st->rf_mode ), sub( st->rf_target_bits_write, st->rf_mode ) ); - padBits = sub( sub( shl( shr( add( st->bits_frame, 7 ), 3 ), 3 ), hBstr->nb_bits_tot_fx ), tmp ); + padBits = sub( sub( shl( shr( add( st->bits_frame, 7 ), 3 ), 3 ), hBstr->nb_bits_tot ), tmp ); } ELSE { /* padBits = ((st->bits_frame+7)/8)*8 - (st->nb_bits_tot + (st->rf_target_bits_write - ((st->Opt_RF_ON==1)?1:0) )); */ tmp = sub( st->rf_target_bits_write, st->rf_mode ); - padBits = sub( shl( shr( add( st->bits_frame, 7 ), 3 ), 3 ), add( hBstr->nb_bits_tot_fx, tmp ) ); + padBits = sub( shl( shr( add( st->bits_frame, 7 ), 3 ), 3 ), add( hBstr->nb_bits_tot, tmp ) ); } FOR( i = 0; i < padBits; i++ ) diff --git a/lib_enc/gs_enc_fx.c b/lib_enc/gs_enc_fx.c index a0396a97f..615b09fd0 100644 --- a/lib_enc/gs_enc_fx.c +++ b/lib_enc/gs_enc_fx.c @@ -303,7 +303,7 @@ void encod_audio_fx( *--------------------------------------------------------------------------------------*/ /* Find the current total number of bits used */ - tmp_nb_bits_tot = hBstr->nb_bits_tot_fx; + tmp_nb_bits_tot = hBstr->nb_bits_tot; move16(); diff --git a/lib_enc/hq_core_enc_fx.c b/lib_enc/hq_core_enc_fx.c index 700ac8726..132df11bb 100644 --- a/lib_enc/hq_core_enc_fx.c +++ b/lib_enc/hq_core_enc_fx.c @@ -147,7 +147,7 @@ void hq_core_enc_fx( } #ifndef ADD_IVAS_HQ_CODE /* subtract signalling bits */ - num_bits = sub( num_bits, hBstr->nb_bits_tot_fx ); + num_bits = sub( num_bits, hBstr->nb_bits_tot ); #endif direct_transform_fx( wtda_audio, t_audio, is_transient, input_frame, &Q_audio, st_fx->element_mode ); diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 02550d2bb..98d86d096 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -331,6 +331,8 @@ ivas_error init_encoder( set16_fx( st->old_inp_12k8_fx, 0, L_INP_MEM ); set16_fx( st->old_inp_16k_fx, 0, L_INP_MEM ); set16_fx( st->mem_decim_fx, 0, 2 * L_FILT_MAX ); + st->input_buff_fx = st->hSignalBuf->input_buff; + st->input_buff32_fx = st->hSignalBuf->input_buff32; #endif st->input_buff = st->hSignalBuf->input_buff_flt; set_zero( st->input_buff, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ); @@ -342,10 +344,18 @@ ivas_error init_encoder( #endif if ( st->element_mode == EVS_MONO ) { +#ifdef IVAS_FLOAT_FIXED + st->input_fx = st->input_buff_fx + st->input_Fs / FRAMES_PER_SEC + NS2SA_fx2( st->input_Fs, DELAY_FIR_RESAMPL_NS ); + st->input32_fx = st->input_buff32_fx + st->input_Fs / FRAMES_PER_SEC + NS2SA_fx2( st->input_Fs, DELAY_FIR_RESAMPL_NS ); +#endif // IVAS_FLOAT_FIXED st->input = st->input_buff + st->input_Fs / FRAMES_PER_SEC + NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ); } else { +#ifdef IVAS_FLOAT_FIXED + st->input_fx = st->input_buff_fx + st->input_Fs / FRAMES_PER_SEC; + st->input32_fx = st->input_buff32_fx + st->input_Fs / FRAMES_PER_SEC; +#endif // IVAS_FLOAT_FIXED st->input = st->input_buff + st->input_Fs / FRAMES_PER_SEC; #ifdef IVAS_FLOAT_FIXED st->input_fx = st->input_buff_fx + st->input_Fs / FRAMES_PER_SEC; @@ -550,7 +560,11 @@ ivas_error init_encoder( if ( ( st->element_mode != IVAS_CPE_MDCT && idchan == 0 ) || ( st->element_mode == IVAS_CPE_MDCT && st->Opt_DTX_ON ) ) { +#ifdef IVAS_FLOAT_FIXED if ( ( error = openCldfb_ivas_enc( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) +#else + if ( ( error = openCldfb_ivas( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -653,8 +667,11 @@ ivas_error init_encoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); } - +#ifdef IVAS_FLOAT_FIXED if ( ( error = openCldfb_ivas_enc( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) +#else + if ( ( error = openCldfb_ivas( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index 2607c50a5..d740915c1 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -149,7 +149,7 @@ ivas_error init_encoder_fx( { st_fx->hBstr = NULL; } - st_fx->hBstr->nb_bits_tot_fx = 0; + st_fx->hBstr->nb_bits_tot = 0; move16(); diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index cca282ff9..cdcdadb8e 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -991,7 +991,7 @@ ivas_error ivas_enc( } /* LFE low pass filter */ - ivas_lfe_lpf_enc_apply( st_ivas->hLfeLpf, data_f[LFE_CHANNEL], input_frame ); + ivas_lfe_lpf_enc_apply_fx( st_ivas->hLfeLpf, data_fx[LFE_CHANNEL], input_frame ); /* LFE channel encoder */ IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) ) @@ -1005,11 +1005,11 @@ ivas_error ivas_enc( st_ivas->hLFE->hBstr = st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; } -#if 1 // To be removed - floatToFixed_arr32( data_f[LFE_CHANNEL], data_fx[LFE_CHANNEL], st_ivas->q_data_fx, input_frame ); -#endif ivas_lfe_enc_fx( st_ivas->hLFE, data_fx[LFE_CHANNEL], st_ivas->q_data_fx, input_frame, st_ivas->hLFE->hBstr ); } +#if 1 // To be removed + fixedToFloat_arrL( data_fx[LFE_CHANNEL], data_f[LFE_CHANNEL], st_ivas->q_data_fx, input_frame ); +#endif if ( st_ivas->mc_mode == MC_MODE_MCT ) { @@ -1025,14 +1025,10 @@ ivas_error ivas_enc( st_ivas->hLFE->hBstr = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0]->hBstr : st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; -#ifdef IVAS_FLOAT_FIXED - floatToFixed_arr32( data_f[LFE_CHANNEL], data_fx[LFE_CHANNEL], st_ivas->q_data_fx, input_frame ); - ivas_lfe_enc_fx( st_ivas->hLFE, data_fx[LFE_CHANNEL], st_ivas->q_data_fx, input_frame, st_ivas->hLFE->hBstr ); -#else - ivas_lfe_enc( st_ivas->hLFE, data_f[LFE_CHANNEL], input_frame, st_ivas->hLFE->hBstr ); -#endif // IVAS_FLOAT_FIXED - +#if 1 // To be removed + fixedToFloat_arrL( data_fx[LFE_CHANNEL], data_f[LFE_CHANNEL], st_ivas->q_data_fx, input_frame ); +#endif if ( ( error = ivas_mct_enc( st_ivas, data_f, input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_enc/ivas_entropy_coder.c b/lib_enc/ivas_entropy_coder.c index 14ed149e1..dec1dfc26 100644 --- a/lib_enc/ivas_entropy_coder.c +++ b/lib_enc/ivas_entropy_coder.c @@ -246,15 +246,22 @@ static Word16 ivas_arith_encode_array( FOR( i = 0; i < in_len; i++ ) { ind = sub( pInput[i], pArith->vals[0] ); - +#ifdef IVAS_FLOAT_FIXED + ivas_ari_encode_14bits_ext_fx( hMetaData, &as, ind, (const UWord16 *) pCum_freq ); +#else ivas_ari_encode_14bits_ext( hMetaData, &as, ind, (const UWord16 *) pCum_freq ); +#endif IF( GT_16( hMetaData->nb_bits_tot, wc_strat_arith ) ) { return -1; } } +#ifdef IVAS_FLOAT_FIXED + ivas_ari_done_encoding_14bits_fx( hMetaData, &as ); +#else ivas_ari_done_encoding_14bits( hMetaData, &as ); +#endif IF( GT_16( hMetaData->nb_bits_tot, wc_strat_arith ) ) { return -1; diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index dc7c49756..5af37336d 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -869,7 +869,11 @@ ivas_error ivas_init_encoder( st_ivas->mc_mode = ivas_mc_mode_select_fx( hEncoderConfig->mc_input_setup, ivas_total_brate ); #endif +#ifndef IVAS_FLOAT_FIXED if ( ( error = ivas_create_lfe_lpf_enc( &st_ivas->hLfeLpf, hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_create_lfe_lpf_enc_fx( &st_ivas->hLfeLpf, hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -1487,7 +1491,7 @@ ivas_error ivas_init_encoder_fx( st_ivas->mc_mode = ivas_mc_mode_select_fx( hEncoderConfig->mc_input_setup, ivas_total_brate ); #endif - if ( ( error = ivas_create_lfe_lpf_enc( &st_ivas->hLfeLpf, hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_create_lfe_lpf_enc_fx( &st_ivas->hLfeLpf, hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c index db27d9085..3848cb725 100644 --- a/lib_enc/ivas_ism_dtx_enc.c +++ b/lib_enc/ivas_ism_dtx_enc.c @@ -37,11 +37,22 @@ #include "prot.h" #include "ivas_prot.h" #include "wmc_auto.h" +#ifdef IVAS_FLOAT_FIXED +#include "prot_fx2.h" +#include "prot_fx1.h" +#include "ivas_prot_fx.h" +#include "prot_fx_enc.h" +#define IVAS_FLOAT_FIXED_TO_BE_REMOVED +#endif // IVAS_FLOAT_FIXED /*-----------------------------------------------------------------------* * Local constants *-----------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +#define MD_MAX_DIFF_AZIMUTH_FX 41943040 +#define MD_MAX_DIFF_ELEVATION_FX 41943040 +#endif // IVAS_FLOAT_FIXED #define MD_MAX_DIFF_AZIMUTH 10 #define MD_MAX_DIFF_ELEVATION 10 @@ -93,6 +104,247 @@ ivas_error ivas_ism_dtx_open( *-------------------------------------------------------------------*/ /*! r: indication of DTX frame */ +#ifdef IVAS_FLOAT_FIXED +Word16 ivas_ism_dtx_enc_fx( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 nchan_ism, /* i : number of objects */ + const Word16 nchan_transport, /* i : number of transport channels */ + Word16 vad_flag[MAX_NUM_OBJECTS], /* i : VAD flag */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + Word16 md_diff_flag[], /* o : metadata differential flag */ + Word16 *sid_flag /* o : indication of SID frame */ +) +{ + Word16 ch, dtx_flag; + Word16 nBits, nBits_MD_max; + Word16 nBits_azimuth, nBits_elevation, nBits_coh, nBits_sce_id; + Word16 lp_noise_fx[MAX_NUM_OBJECTS], lp_noise_variation_fx, lp_noise_mean_fx; + Word16 lp_noise_max_fx; + Word32 tmp1_fx, tmp2_fx; + /* initialization */ + FOR( ch = 0; ch < nchan_transport; ch++ ) + { + hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; + move16(); + } + + /*------------------------------------------------------------------* + * compute global ISM DTX flag + *-----------------------------------------------------------------*/ + + /* compute global ISM based on localVAD */ + dtx_flag = 1; + move16(); + FOR( ch = 0; ch < nchan_transport; ch++ ) + { + dtx_flag = s_and( dtx_flag, !vad_flag[ch] ); + } + + /* compute global ISM based on long-term background noise */ + /* one of the channels is active -> no DTX */ + FOR( ch = 0; ch < nchan_transport; ch++ ) + { + lp_noise_fx[ch] = hSCE[ch]->hCoreCoder[0]->lp_noise_fx; /*Q8*/ + move16(); + } + + lp_noise_variation_fx = var_fx( lp_noise_fx, Q8, nchan_transport ); /*Q8*/ + lp_noise_mean_fx = mean_fx( lp_noise_fx, nchan_transport ); /*Q8*/ + + test(); + test(); + if( GT_16( lp_noise_mean_fx, ( 50 << 8 ) ) || ( GT_16( lp_noise_mean_fx, ( 25 << 8 ) ) && GT_16( lp_noise_variation_fx, ( 32 << 8 ) ) ) ) + { + dtx_flag = 0; + move16(); + } + + + /* default DTX is applied at lower bitrates; otherwise DTX is applied only in silence */ + maximum_fx( lp_noise_fx, nchan_transport, &lp_noise_max_fx ); /*Q8*/ + + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + if( !( ( EQ_16( nchan_ism, 1 ) && LE_32( ivas_total_brate, IVAS_24k4 ) ) || + ( EQ_16( nchan_ism, 2 ) && LE_32( ivas_total_brate, IVAS_48k ) ) || + ( EQ_16( nchan_ism, 3 ) && LE_32( ivas_total_brate, IVAS_80k ) ) || + ( EQ_16( nchan_ism, 4 ) && LE_32( ivas_total_brate, IVAS_96k ) ) || + LT_16( lp_noise_max_fx, ( 15 << 8 ) ) ) ) + { + dtx_flag = 0; + move16(); + } + + /*------------------------------------------------------------------* + * Reset the bitstream + *-----------------------------------------------------------------*/ + + IF( dtx_flag ) + { + /* reset the bitstream (IVAS format signaling was already written) */ + reset_indices_enc( hSCE[0]->hCoreCoder[0]->hBstr, hSCE[0]->hCoreCoder[0]->hBstr->nb_ind_tot ); + } + + /*------------------------------------------------------------------* + * decide about SID metadata to be sent or not (per object) + * estimate the MD bit-budget consumption + *-----------------------------------------------------------------*/ + + IF( dtx_flag ) + { + ivas_get_ism_sid_quan_bitbudget_fx( nchan_ism, &nBits_azimuth, &nBits_elevation, &tmp1_fx, &tmp2_fx, &nBits_coh, &nBits_sce_id ); + + nBits = 0; + move16(); + FOR( ch = 0; ch < nchan_ism; ch++ ) + { + /* check difference between current and last metadata */ + md_diff_flag[ch] = 0; + move16(); + if( GT_32( L_abs( L_sub( hIsmMeta[ch]->azimuth_fx, hIsmMeta[ch]->last_azimuth_fx ) ), MD_MAX_DIFF_AZIMUTH_FX ) ) + { + md_diff_flag[ch] = 1; + move16(); + } + + if( GT_32( L_abs( L_sub( hIsmMeta[ch]->elevation_fx, hIsmMeta[ch]->last_elevation_fx ) ), MD_MAX_DIFF_ELEVATION_FX ) ) + { + md_diff_flag[ch] = 1; + move16(); + } + + /* estimate SID metadata bit-budget */ + nBits = add( nBits, 1 ); /* number of objects */ + nBits = add( nBits, 1 ); /* SID metadata flag */ + IF( EQ_16( md_diff_flag[ch], 1 ) ) + { + nBits = add( nBits, nBits_azimuth ); + nBits = add( nBits, nBits_elevation ); + } + } + + /* calculate maximum available MD bit-budget */ + nBits_MD_max = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; + move16(); + nBits_MD_max = sub( nBits_MD_max, SID_FORMAT_NBITS ); + + if( GT_16( nchan_transport, 1 ) ) + { + nBits_MD_max = sub( nBits_MD_max, nBits_sce_id ); + } + + FOR( ch = 0; ch < nchan_transport - 1; ch++ ) + { + nBits_MD_max = sub( nBits_MD_max, nBits_coh ); /* coherence */ + } + + if( GT_16( nchan_ism, 3 ) ) + { + nBits_MD_max = sub( nBits_MD_max, 1 ); /* ism_mode flag */ + } + + /* too many metadata bits -> switch to active coding */ + if( GT_16( nBits, nBits_MD_max ) ) + { + dtx_flag = 0; + move16(); + } + } + + /*------------------------------------------------------------------* + * set core_brate for all channels + * get 'sid_flag' value + *-----------------------------------------------------------------*/ + + *sid_flag = 0; + move16(); + + IF( !dtx_flag ) + { + /* at least one of the channels is active -> no DTX */ + FOR( ch = 0; ch < nchan_transport; ch++ ) + { + hSCE[ch]->hCoreCoder[0]->core_brate = -1; + move32(); + set_bw_fx( IVAS_SCE, hSCE[ch]->element_brate, hSCE[ch]->hCoreCoder[0], MODE1 ); + } + + hISMDTX->cnt_SID_ISM = -1; + move16(); + + /* IVAS format signaling was erased in dtx() */ + IF( EQ_16( hSCE[0]->hCoreCoder[0]->hBstr->nb_bits_tot, 0 ) ) + { + /* replicate ivas_write_format() */ + Word16 ind = 2; + nBits = IVAS_FORMAT_SIGNALING_NBITS; + move16(); + move16(); + IF( GE_32( ivas_total_brate, IVAS_24k4 ) ) + { + ind = 4; + nBits = IVAS_FORMAT_SIGNALING_NBITS_EXTENDED; + move16(); + move16(); + } + + push_indice( hSCE[0]->hCoreCoder[0]->hBstr, IND_IVAS_FORMAT, ind, nBits ); + } + } + ELSE /* ism_dtx_flag == 1 */ + { + FOR( ch = 0; ch < nchan_transport; ch++ ) + { + hSCE[ch]->hCoreCoder[0]->cng_type = FD_CNG; + move16(); + } + + /* * update the global SID counter */ + hISMDTX->cnt_SID_ISM = add( hISMDTX->cnt_SID_ISM, 1 ); + move16(); + IF( GE_16( hISMDTX->cnt_SID_ISM, hSCE[0]->hCoreCoder[0]->hDtxEnc->max_SID ) ) + { + /* adaptive SID update interval */ + hSCE[0]->hCoreCoder[0]->hDtxEnc->max_SID = hSCE[0]->hCoreCoder[0]->hDtxEnc->interval_SID; + hISMDTX->cnt_SID_ISM = 0; + move16(); + move16(); + } + + /* encode SID in one channel only */ + FOR( ch = 0; ch < nchan_transport; ch++ ) + { + hSCE[ch]->hCoreCoder[0]->core_brate = FRAME_NO_DATA; + move32(); + } + + IF( EQ_16( hISMDTX->cnt_SID_ISM, 0 ) ) + { + hSCE[hISMDTX->sce_id_dtx]->hCoreCoder[0]->core_brate = SID_2k40; + *sid_flag = 1; + move32(); + move16(); + } + } + + test(); + IF( EQ_16( dtx_flag, 1 ) && EQ_16( *sid_flag, 0 ) ) + { + set16_fx( md_diff_flag, 0, nchan_transport ); + } + + return dtx_flag; +} +#endif // IVAS_FLOAT_FIXED + int16_t ivas_ism_dtx_enc( ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ @@ -301,6 +553,85 @@ int16_t ivas_ism_dtx_enc( * * *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_ism_get_sce_id_dtx_fx( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const Word16 nchan_transport, /* i : number of transport channels */ + const Word16 input_frame /* i : input frame length per channel */ +) +{ + Word32 tmp_energy[MAX_NUM_OBJECTS]; + Word16 tmp_energy_e[MAX_NUM_OBJECTS]; + Word16 i, j; + Word16 long_term_energy_stereo_dmx_enc_e[MAX_NUM_OBJECTS]; + Word16 max_exp; + + set16_fx( long_term_energy_stereo_dmx_enc_e, hISMDTX->long_term_energy_stereo_dmx_enc_e, nchan_transport ); + IF( EQ_16( nchan_transport, 1 ) ) + { + hISMDTX->sce_id_dtx = 0; + move16(); + + return; + } + + /* Initialize*/ + set32_fx( tmp_energy, 0, MAX_NUM_OBJECTS ); + set16_fx( tmp_energy_e, 0, MAX_NUM_OBJECTS ); + + /* compute long term energy parameter */ + FOR( j = 0; j < nchan_transport; j++ ) + { + FOR( i = 0; i < ( PARAM_ISM_HYS_BUF_SIZE - 1 ); i++ ) + { + hISMDTX->long_term_energy_stereo_dmx_enc_fx[j][i] = hISMDTX->long_term_energy_stereo_dmx_enc_fx[j][i + 1]; + move32(); + } + long_term_energy_stereo_dmx_enc_e[j] = 20; + move16(); + hISMDTX->long_term_energy_stereo_dmx_enc_fx[j][PARAM_ISM_HYS_BUF_SIZE - 1] = sum2_32_fx( hSCE[j]->hCoreCoder[0]->input32_fx, input_frame, &long_term_energy_stereo_dmx_enc_e[j] ); /*Resultant Q_lte=2*Q(input_fx)+1=2*-5+1=>-9*/ + move32(); + tmp_energy[j] = L_deposit_l( 0 ); + move32(); + FOR( i = 0; i < PARAM_ISM_HYS_BUF_SIZE - 1; i++ ) + { + tmp_energy[j] = BASOP_Util_Add_Mant32Exp( tmp_energy[j], tmp_energy_e[j], hISMDTX->long_term_energy_stereo_dmx_enc_fx[j][i], hISMDTX->long_term_energy_stereo_dmx_enc_e, &tmp_energy_e[j] ); /*Resultant Q(tmp_energy)=Q_lte*/ + move32(); + } + tmp_energy[j] = BASOP_Util_Add_Mant32Exp( tmp_energy[j], tmp_energy_e[j], hISMDTX->long_term_energy_stereo_dmx_enc_fx[j][PARAM_ISM_HYS_BUF_SIZE - 1], long_term_energy_stereo_dmx_enc_e[j], &tmp_energy_e[j] ); /*Resultant Q(tmp_energy)=Q_lte*/ + move32(); + } + + maximum_fx( long_term_energy_stereo_dmx_enc_e, nchan_transport, &max_exp ); + max_exp = s_max( max_exp, hISMDTX->long_term_energy_stereo_dmx_enc_e ); + FOR( j = 0; j < nchan_transport; j++ ) + { + FOR( i = 0; i < PARAM_ISM_HYS_BUF_SIZE - 1; i++ ) + { + hISMDTX->long_term_energy_stereo_dmx_enc_fx[j][i] = L_shr( hISMDTX->long_term_energy_stereo_dmx_enc_fx[j][i], max_exp - hISMDTX->long_term_energy_stereo_dmx_enc_e ); + move32(); + } + hISMDTX->long_term_energy_stereo_dmx_enc_fx[j][PARAM_ISM_HYS_BUF_SIZE - 1] = L_shr( hISMDTX->long_term_energy_stereo_dmx_enc_fx[j][PARAM_ISM_HYS_BUF_SIZE - 1], max_exp - long_term_energy_stereo_dmx_enc_e[j] ); + move32(); + } + hISMDTX->long_term_energy_stereo_dmx_enc_e = max_exp; + move16(); + /* determine the sce_id */ + hISMDTX->sce_id_dtx = 0; + move16(); + FOR( j = 1; j < nchan_transport; j++ ) + { + if ( BASOP_Util_Cmp_Mant32Exp( tmp_energy[j], tmp_energy_e[j], tmp_energy[hISMDTX->sce_id_dtx], tmp_energy_e[hISMDTX->sce_id_dtx] ) ) + { + hISMDTX->sce_id_dtx = j; + move16(); + } + } + + return; +} +#endif // IVAS_FLOAT_FIXED void ivas_ism_get_sce_id_dtx( ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ @@ -354,6 +685,93 @@ void ivas_ism_get_sce_id_dtx( * * *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_ism_coh_estim_dtx_enc_fx( + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ + const Word16 nchan_transport, /* i : number of transport channels */ + const Word16 input_frame /* i : input frame length */ +) +{ + Encoder_State *st, *st_id0; + Word16 sce_id, i; + Word32 acorr_ene_fx[MAX_NUM_OBJECTS], xcorr_ene_fx; + Word16 acorr_ene_e[MAX_NUM_OBJECTS], xcorr_ene_e; + Word16 norm_inp; + Word16 tot_exp; + Word32 scaled_inp; + set16_fx( acorr_ene_e, 0, MAX_NUM_OBJECTS ); + + IF( EQ_16( nchan_transport, 1 ) ) + { + hISMDTX->coh_fx[0] = 0; + move16(); + return; + } + + /* Compute Coherence */ + acorr_ene_fx[hISMDTX->sce_id_dtx] = 0; + move32(); + st_id0 = hSCE[hISMDTX->sce_id_dtx]->hCoreCoder[0]; + + FOR( i = 0; i < input_frame; i++ ) + { + norm_inp = norm_l( st_id0->input32_fx[i] ); + scaled_inp = L_shl( st_id0->input32_fx[i], norm_inp ); + tot_exp = shl( sub( 20, norm_inp), 1 ); + acorr_ene_fx[hISMDTX->sce_id_dtx] = BASOP_Util_Add_Mant32Exp( acorr_ene_fx[hISMDTX->sce_id_dtx], acorr_ene_e[hISMDTX->sce_id_dtx], Mult_32_32( scaled_inp, scaled_inp ), tot_exp, &acorr_ene_e[hISMDTX->sce_id_dtx] ); + move32(); + } + + FOR( sce_id = 0; sce_id < nchan_transport; sce_id++ ) + { + IF( EQ_16( sce_id, hISMDTX->sce_id_dtx ) ) + { + hISMDTX->coh_fx[sce_id] = 32767; + move16(); + continue; + } + + st = hSCE[sce_id]->hCoreCoder[0]; + + acorr_ene_fx[sce_id] = 0; + xcorr_ene_fx = 0; + xcorr_ene_e = 0; + move32(); + move32(); + move16(); + + FOR( i = 0; i < input_frame; i++ ) + { + norm_inp = norm_l( st->input32_fx[i] ); + scaled_inp = L_shl( st->input32_fx[i], norm_inp ); + tot_exp = shl( sub( 20, norm_inp), 1 ); + acorr_ene_fx[sce_id] = BASOP_Util_Add_Mant32Exp( acorr_ene_fx[sce_id], acorr_ene_e[sce_id], Mult_32_32( scaled_inp, scaled_inp ), tot_exp, &acorr_ene_e[sce_id] ); + move32(); + xcorr_ene_fx = BASOP_Util_Add_Mant32Exp( xcorr_ene_fx, xcorr_ene_e, Mult_32_32( scaled_inp, scaled_inp ), tot_exp, &xcorr_ene_e ); + } + Word16 coh_e; + Word16 temp_e = acorr_ene_e[hISMDTX->sce_id_dtx] + acorr_ene_e[sce_id]; + Word32 temp = Sqrt32( L_add( Mult_32_32( acorr_ene_fx[hISMDTX->sce_id_dtx], acorr_ene_fx[sce_id] ), EPSILON_FX ), &temp_e ); /*fabsf( xcorr_ene ) / ( sqrtf( ( acorr_ene[hISMDTX->sce_id_dtx] * acorr_ene[sce_id] ) + EPSILON ) );*/ + hISMDTX->coh_fx[sce_id] = BASOP_Util_Divide3232_Scale( L_abs( xcorr_ene_fx ), temp, &coh_e ); + move16(); + coh_e = add( coh_e, sub( xcorr_ene_e, temp_e ) ); + IF( coh_e < 0 ) + { + hISMDTX->coh_fx[sce_id] = shl( hISMDTX->coh_fx[sce_id], coh_e ); + move16(); + coh_e = 0; + } + /* ensure value of coherence is between [0,1] */ + hISMDTX->coh_fx[sce_id] = check_bounds_s( hISMDTX->coh_fx[sce_id], 0, shl_sat( 1, 15 - coh_e ) ); + hISMDTX->coh_fx[sce_id] = shl_sat( hISMDTX->coh_fx[sce_id], coh_e ); + move16(); + move16(); + } + + return; +} +#endif // IVAS_FLOAT_FIXED void ivas_ism_coh_estim_dtx_enc( ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 96b1f2460..92f486f37 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -39,6 +39,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" +#include "prot_fx2.h" #endif @@ -200,6 +201,38 @@ ivas_error ivas_ism_enc( if ( st_ivas->hEncoderConfig->Opt_DTX_ON ) { /* compute the dominant sce_id using long term energy */ +#ifdef IVAS_FLOAT_FIXED +#if 1 /************************flt_to_fix****************************/ + for( int j = 0; j < st_ivas->nchan_transport; j++ ) + { + floatToFixed_arrL( st_ivas->hSCE[j]->hCoreCoder[0]->input, st_ivas->hSCE[j]->hCoreCoder[0]->input32_fx, Q11, input_frame ); /*Q0*/ + } + f2me_buf( &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc[0][0], &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_fx[0][0], &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_e, st_ivas->nchan_transport * PARAM_ISM_HYS_BUF_SIZE ); + for( int ch = 0; ch < nchan_ism; ch++ ) + { + st_ivas->hIsmMetaData[ch]->azimuth_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->azimuth, Q22 ); + st_ivas->hIsmMetaData[ch]->last_azimuth_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->last_azimuth, Q22 ); + st_ivas->hIsmMetaData[ch]->elevation_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->elevation, Q22 ); + st_ivas->hIsmMetaData[ch]->last_elevation_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->last_elevation, Q22 ); + } + for ( int ch = 0; ch < st_ivas->nchan_transport; ch++ ) + { + st_ivas->hSCE[ch]->hCoreCoder[0]->lp_noise_fx = float_to_fix16( st_ivas->hSCE[ch]->hCoreCoder[0]->lp_noise, Q8 ); /*Q8*/ + } + floatToFixed_arr16( st_ivas->hISMDTX->coh, st_ivas->hISMDTX->coh_fx, Q15, st_ivas->nchan_transport ); +#endif /****************************ends here*********************************/ + ivas_ism_get_sce_id_dtx_fx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); + dtx_flag = ivas_ism_dtx_enc_fx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, st_ivas->nchan_transport, vad_flag, st_ivas->hIsmMetaData, md_diff_flag, &sid_flag ); + IF ( sid_flag ) + { + /* estimate coherence between objects */ + ivas_ism_coh_estim_dtx_enc_fx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); + } +#if 1 /************************fix_to_flt****************************/ + me2f_buf(&st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_fx[0][0], st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_e, &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc[0][0], st_ivas->nchan_transport * PARAM_ISM_HYS_BUF_SIZE); + fixedToFloat_arr( st_ivas->hISMDTX->coh_fx, st_ivas->hISMDTX->coh, Q15, st_ivas->nchan_transport ); +#endif/****************************ends here*********************************/ +#else ivas_ism_get_sce_id_dtx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); /* analysis and decision about DTX */ @@ -210,6 +243,7 @@ ivas_error ivas_ism_enc( /* estimate coherence between objects */ ivas_ism_coh_estim_dtx_enc( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); } +#endif // IVAS_FLOAT_FIXED } /*------------------------------------------------------------------* @@ -217,7 +251,7 @@ ivas_error ivas_ism_enc( * Metadata quantization and encoding *-----------------------------------------------------------------*/ - if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + IF( EQ_16( st_ivas->ism_mode, ISM_MODE_PARAM ) ) { ivas_param_ism_compute_noisy_speech_flag( st_ivas ); flag_noisy_speech = st_ivas->hParamIsm->flag_noisy_speech; diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index 10efa2f16..e34f4d1a1 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -548,6 +548,65 @@ void ivas_param_ism_enc( * *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_param_ism_compute_noisy_speech_flag( + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +) +{ + Word16 i; + + /* Move the Noisy speech buffer */ + FOR ( i = 0; i < ( PARAM_ISM_HYS_BUF_SIZE - 1 ); i++ ) + { + st_ivas->hParamIsm->noisy_speech_buffer[i] = st_ivas->hParamIsm->noisy_speech_buffer[i + 1]; + move16(); + } + + /* Set flag_noisy_speech to 0 for cases where object energies are not roughly equal */ + IF ( !st_ivas->hParamIsm->flag_equal_energy ) + { + st_ivas->hParamIsm->noisy_speech_buffer[i] = 0; + st_ivas->hParamIsm->flag_noisy_speech = 0; + move16(); + move16(); + } + ELSE + { + /* For the current frame, make a decision based on some core-coder flags */ + test(); + IF ( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr ) + { + test(); + IF ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) + { + st_ivas->hParamIsm->noisy_speech_buffer[i] = 0; + move16(); + } + ELSE + { + st_ivas->hParamIsm->noisy_speech_buffer[i] = 1; + move16(); + } + } + ELSE + { + st_ivas->hParamIsm->noisy_speech_buffer[i] = 0; + move16(); + } + + /* Do a decision based on hysteresis */ + st_ivas->hParamIsm->flag_noisy_speech = 1; + move16(); + FOR ( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ ) + { + test(); + st_ivas->hParamIsm->flag_noisy_speech = st_ivas->hParamIsm->flag_noisy_speech && st_ivas->hParamIsm->noisy_speech_buffer[i]; + } + } + + return; +} +#else void ivas_param_ism_compute_noisy_speech_flag( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ) @@ -595,3 +654,4 @@ void ivas_param_ism_compute_noisy_speech_flag( return; } +#endif // IVAS_FLOAT_FIXED diff --git a/lib_enc/ivas_lfe_enc.c b/lib_enc/ivas_lfe_enc.c index 8d0f57495..6a011d23c 100644 --- a/lib_enc/ivas_lfe_enc.c +++ b/lib_enc/ivas_lfe_enc.c @@ -51,7 +51,7 @@ * * LFE Arithmetic coding block. Writes encoded data to bitstream. *-----------------------------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED static void ivas_lfe_arith_coding( LFE_ENC_HANDLE hLFE, BSTR_ENC_HANDLE hBstr, @@ -87,7 +87,48 @@ static void ivas_lfe_arith_coding( return; } +#else +static void ivas_lfe_arith_coding_fx( + LFE_ENC_HANDLE hLFE, + BSTR_ENC_HANDLE hBstr, + const Word16 quant_strategy, + Word16 *values ) +{ + Tastat as; + Word16 index, i; + Word16 max_value, offset; + UWord16 num_ele_per_grp; + Word16 num_groups; + index = 0; + num_ele_per_grp = IVAS_LFE_NUM_COEFFS_IN_SUBGRP << 1; + num_groups = shr( ivas_lfe_num_dct_pass_bins_tbl[quant_strategy], 1 ); + move16(); + move16(); + move16(); + + FOR( i = 0; i < num_groups; i++ ) + { + max_value = ivas_lfe_num_ele_in_coder_models[quant_strategy][i]; + move16(); + ari_start_encoding_14bits_ivas_fx( &as ); + offset = imult1616( 4, i ); + + FOR( index = 0; index < num_ele_per_grp; index++ ) + { + IF( values[index + offset] > max_value ) + { + values[add( index, offset )] = max_value; + move16(); + } + ivas_ari_encode_14bits_ext_fx( hBstr, &as, values[index + offset], hLFE->cum_freq_models[quant_strategy][i] ); + } + + ivas_ari_done_encoding_14bits_fx( hBstr, &as ); + } + return; +} +#endif /*-----------------------------------------------------------------------------------------* * Function ivas_lfe_enc_quant() @@ -537,7 +578,7 @@ static void ivas_lfe_enc_quant_fx( push_next_indice( hBstr, coding_strategy, 1 ); base2_num_bits_tot = sub( hBstr->nb_bits_tot, bits_written ); - ivas_lfe_arith_coding( hLFE, hBstr, quant_strategy, values ); + ivas_lfe_arith_coding_fx( hLFE, hBstr, quant_strategy, values ); FOR( i = 0; i < num_groups; i++ ) { @@ -1021,7 +1062,36 @@ void ivas_lfe_enc_close( * * Create, allocate and initialize IVAS encoder LFE low pass filter state handle *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_create_lfe_lpf_enc_fx( + ivas_filters_process_state_t **hLfeLpf, /* o : LFE LPF handle */ + const Word32 input_Fs /* i : input sampling rate */ +) +{ + const Word32 *filt_coeff; + const Word16 *filt_coeff_e = NULL; + IF( hLfeLpf == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Can not allocate memory for LFE LPF\n" ) ); + } + + /*-----------------------------------------------------------------* + * Allocate LFE LPF handle + *-----------------------------------------------------------------*/ + + IF( ( *hLfeLpf = (ivas_filters_process_state_t *) malloc( sizeof( ivas_filters_process_state_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE LPF\n" ) ); + } + + ivas_lfe_lpf_select_filt_coeff_fx( input_Fs, IVAS_FILTER_ORDER_4, &filt_coeff, &filt_coeff_e ); + + ivas_filters_init_fx( *hLfeLpf, filt_coeff, filt_coeff_e, IVAS_FILTER_ORDER_4 ); + + return IVAS_ERR_OK; +} +#else ivas_error ivas_create_lfe_lpf_enc( ivas_filters_process_state_t **hLfeLpf, /* o : LFE LPF handle */ const int32_t input_Fs /* i : input sampling rate */ @@ -1049,14 +1119,30 @@ ivas_error ivas_create_lfe_lpf_enc( return IVAS_ERR_OK; } - +#endif /*------------------------------------------------------------------------- * ivas_lfe_lpf_enc_close() * * Destroy IVAS cncoder LFE low pass filter state *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_lfe_lpf_enc_close( + ivas_filters_process_state_t **hLfeLpf /* i/o: LFE LPF handle */ +) +{ + test(); + IF( hLfeLpf == NULL || *hLfeLpf == NULL ) + { + return; + } + free( ( *hLfeLpf ) ); + ( *hLfeLpf ) = NULL; + + return; +} +#else void ivas_lfe_lpf_enc_close( ivas_filters_process_state_t **hLfeLpf /* i/o: LFE LPF handle */ ) @@ -1071,6 +1157,7 @@ void ivas_lfe_lpf_enc_close( return; } +#endif /*------------------------------------------------------------------------- @@ -1078,7 +1165,18 @@ void ivas_lfe_lpf_enc_close( * * Apply IVAS cncoder LFE low pass filter *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_lfe_lpf_enc_apply_fx( + ivas_filters_process_state_t *hLfeLpf, /* i/o: LFE LPF handle */ + Word32 data_lfe_ch[], /* i/o: LFE signal */ + const Word16 input_frame /* i : input frame length per channel */ +) +{ + ivas_filter_process_fx( hLfeLpf, data_lfe_ch, input_frame, (Word16) Q11 ); + return; +} +#else void ivas_lfe_lpf_enc_apply( ivas_filters_process_state_t *hLfeLpf, /* i/o: LFE LPF handle */ float data_lfe_ch[], /* i/o: LFE signal */ @@ -1089,3 +1187,4 @@ void ivas_lfe_lpf_enc_apply( return; } +#endif diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 27b8e492c..6ccf6af51 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -136,7 +136,11 @@ ivas_error ivas_masa_enc_open( for ( i = 0; i < hMasa->data.num_Cldfb_instances; i++ ) { +#ifdef IVAS_FLOAT_FIXED if ( ( error = openCldfb_ivas_enc( &( hMasa->data.cldfbAnaEnc[i] ), CLDFB_ANALYSIS, hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) +#else + if ( ( error = openCldfb_ivas( &( hMasa->data.cldfbAnaEnc[i] ), CLDFB_ANALYSIS, hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_enc/ivas_omasa_enc.c b/lib_enc/ivas_omasa_enc.c index 353be1fec..9598804d9 100644 --- a/lib_enc/ivas_omasa_enc.c +++ b/lib_enc/ivas_omasa_enc.c @@ -90,7 +90,11 @@ ivas_error ivas_omasa_enc_open( hOMasa->num_Cldfb_instances = numAnalysisChannels; for ( i = 0; i < hOMasa->num_Cldfb_instances; i++ ) { +#ifdef IVAS_FLOAT_FIXED if ( ( error = openCldfb_ivas_enc( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, st_ivas->hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) +#else + if ( ( error = openCldfb_ivas( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, st_ivas->hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 37aebacef..37e9288e1 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -212,8 +212,12 @@ typedef struct stereo_dft_enc_data_struct int16_t side_gain_index_ECprevious[STEREO_DFT_BAND_MAX]; int16_t side_gain_index_EC[STEREO_DFT_BAND_MAX]; int16_t side_gain_counter; - float side_gain_bitdiff_lp; +#ifdef IVAS_FLOAT_FIXED Word16 side_gain_bitdiff_lp_fx; + Word16 q_side_gain_bitdiff_lp; +#else + float side_gain_bitdiff_lp; +#endif /* Stereo CNG */ float sidSideGain[STEREO_DFT_ERB4_BANDS]; @@ -735,6 +739,11 @@ typedef struct ivas_stereo_classifier_data_structure typedef struct { +#ifdef IVAS_FLOAT_FIXED + Word32 long_term_energy_stereo_dmx_enc_fx[MAX_NUM_OBJECTS][PARAM_ISM_HYS_BUF_SIZE]; + Word16 long_term_energy_stereo_dmx_enc_e; + Word16 coh_fx[MAX_NUM_OBJECTS]; +#endif // IVAS_FLOAT_FIXED int16_t dtx_flag; int16_t sce_id_dtx; diff --git a/lib_enc/ivas_stereo_adapt_GR_enc.c b/lib_enc/ivas_stereo_adapt_GR_enc.c index 0b7aac44c..f98b453a0 100644 --- a/lib_enc/ivas_stereo_adapt_GR_enc.c +++ b/lib_enc/ivas_stereo_adapt_GR_enc.c @@ -47,6 +47,48 @@ static int16_t adapt_GR_sg( const int16_t *in, const int16_t len, const int16_t no_symb, int16_t *nbits, int16_t *in_enc, const int16_t *map0, const int16_t no_GR_ord ); +#ifdef IVAS_FLOAT_FIXED +/*---------------------------------------------------------------------* + * calculate_diff() + * + * calculate difference wrt previous frame and maps it to positive integer + *---------------------------------------------------------------------*/ + +static void calculate_diff( + const Word16 *in, /* i : current frame values */ + const Word16 *prev, /* i : previous frmae values */ + Word16 *in_diff, /* o : difference values */ + const Word16 len /* i : vector length */ +) +{ + Word16 i, tmp; + + FOR( i = 0; i < len; i++ ) + { + tmp = sub( in[i], prev[i] ); + IF( tmp > 0 ) + { + in_diff[i] = sub( imult1616( 2, tmp ), 1 ); + move16(); + } + ELSE + { + IF( tmp < 0 ) + { + in_diff[i] = imult1616( -2, tmp ); + move16(); + } + ELSE + { + in_diff[i] = 0; + move16(); + } + } + } + + return; +} +#else /*---------------------------------------------------------------------* * calculate_diff() * @@ -84,8 +126,54 @@ static void calculate_diff( return; } +#endif + + +#ifdef IVAS_FLOAT_FIXED +/*---------------------------------------------------------------------* + * calculate_bit_diff() + * + * estimates the GR number of bits for encoding differential values + * selects between GR order 0 or 1 + *---------------------------------------------------------------------*/ + +/*! r: number of bits */ +static Word16 calculate_bit_diff( + Word16 *in_diff, /* i : values to be encoded */ + Word16 len, /* i : number of params */ + Word16 *flag_diff /* o : selected GR order */ +) +{ + Word16 i, nb, nb1; + + nb = 0; + move16(); + nb1 = 0; + move16(); + FOR( i = 0; i < len; i++ ) + { + nb = add( nb, in_diff[i] ); + nb1 = add( nb1, shr( in_diff[i], 1 ) ); + } + nb = add( nb, len ); + nb1 = add( nb1, imult1616( 2, len ) ); + IF( LT_16( nb1, nb ) ) + { + nb = add( nb1, 1 ); + *flag_diff = 1; /* GR order for differential coding */ + move16(); + } + ELSE + { + nb = add( nb, 1 ); + *flag_diff = 0; + move16(); + } + return nb; +} +#else /*---------------------------------------------------------------------* * calculate_bit_diff() * @@ -125,8 +213,76 @@ static int16_t calculate_bit_diff( return nb; } +#endif +#ifdef IVAS_FLOAT_FIXED +/*---------------------------------------------------------------------* + * adapt_GR_ief_fx() + * + * adaptive GR coding considering also the differential case + *---------------------------------------------------------------------*/ + +/*! r: used GR order */ +Word16 adapt_GR_ief_fx( + const Word16 *in, /* i : vector to encode */ + Word16 *in_diff, /* o : encoded symbols in case of differential encoding */ + const Word16 *prev, /* i : previous frame data */ + const Word16 len, /* i : input vector length */ + const Word16 no_symb, /* i : number of symbols */ + Word16 *nbits, /* o : number of used bits */ + Word16 *in_enc, /* o : symbold actually encoded after adapt_GR */ + const Word16 *map0, /* i : mapping array */ + const Word16 no_GR_ord, /* i : number of GR order to try 2: 0,1; 3:0,1,2 */ + Word16 *nbits_diff, /* o : number bits in diff encoding */ + const Word16 side_gain_counter, /* i : number of frames since last abs coding */ + Word16 *side_gain_bitdiff_lp, /* i/o: LP-filtered bit difference between abs/diff */ + Word16 *q_side_gain_bitdiff_lp, /* i/o: Q of LP-filtered bit difference between abs/diff */ + const Word16 try_diff /* i : diff coding allowed 1/0 */ +) +{ + Word16 nb_diff, flag, flag_diff; + Word16 bitdiff; + Word32 L_tmp, L_tmp1; + Word16 exp_diff; + + flag = adapt_GR_sg( in, len, no_symb, nbits, in_enc, map0, no_GR_ord ); + + IF( try_diff ) /* inter-frame prediction allowed */ + { + calculate_diff( in, prev, in_diff, len ); + nb_diff = calculate_bit_diff( in_diff, len, &flag_diff ); + *nbits_diff = nb_diff; + move16(); + + bitdiff = sub( s_min( imult1616( 5, len ), *nbits ), add( nb_diff, 1 ) ); + L_tmp = Mpy_32_16_1( STEREO_DFT_BITDIFF_LP_FAC_Q31, bitdiff ); // (Q31, Q0) -> Q16 + L_tmp1 = Mpy_32_16_1( L_sub( ONE_IN_Q31, STEREO_DFT_BITDIFF_LP_FAC_Q31 ), *side_gain_bitdiff_lp ); // (Q31, *q_side_gain_bitdiff_lp) -> *q_side_gain_bitdiff_lp + Q16 + *side_gain_bitdiff_lp = extract_h( BASOP_Util_Add_Mant32Exp( L_tmp, Q31 - Q16, L_tmp1, sub( Q31, add( *q_side_gain_bitdiff_lp, Q16 ) ), &exp_diff ) ); + *q_side_gain_bitdiff_lp = sub( Q15, exp_diff ); + move16(); + + L_tmp = Mpy_32_16_1( STEREO_DFT_BITDIFF_ABS_SELECT_Q31, *side_gain_bitdiff_lp ); // (Q31, *q_side_gain_bitdiff_lp) -> *q_side_gain_bitdiff_lp + Q16 + L_tmp1 = Mpy_32_16_1( STEREO_DFT_FEC_THRESHOLD_PLUS_1_INV_Q31, side_gain_counter ); // (Q31, Q0) -> Q16 + L_tmp = Mpy_32_32( L_tmp, L_tmp1 ); // (*q_side_gain_bitdiff_lp + Q16, Q16) -> *q_side_gain_bitdiff_lp + Q1 + IF( GT_32( L_shl( L_deposit_l( bitdiff ), add( *q_side_gain_bitdiff_lp, Q1 ) ), L_tmp ) ) + { + flag = add( no_GR_ord, flag_diff ); + *nbits = add( nb_diff, 1 ); + move16(); + } + } + ELSE + { + *nbits_diff = 100; + move16(); + flag_diff = -1; + move16(); + } + + return flag; +} +#else /*---------------------------------------------------------------------* * adapt_GR_ief() * @@ -176,8 +332,90 @@ int16_t adapt_GR_ief( return flag; } +#endif + + +#ifdef IVAS_FLOAT_FIXED +/*---------------------------------------------------------------------* + * adapt_GR_rpg1_ief() + * + * use adaptive GR for RPG's considering also the differential case + *---------------------------------------------------------------------*/ + +/*! r: used GR order */ +Word16 adapt_GR_rpg1_ief( + const Word16 *in, /* i : res pred gains input vector */ + Word16 *in_diff, /* o : encoded symbols in case of differential encoding */ + const Word16 *prev, /* i : previous frame data */ + const Word16 len, /* i : input vector length */ + const Word16 no_symb, /* i : number of symbols */ + Word16 *nbits, /* o : number of used bits */ + Word16 *in_enc, /* o : symbold actually encoded after adapt_GR */ + const Word16 *maps, /* i : mapping array */ + Word16 *nbits_diff, /* o : estimated no of bits for differential encoding */ + const Word16 no_GR_ord, /* i : number of GR order to try 2: 0,1; 3:0,1,2 */ + const Word16 try_diff /* i : diff coding allowed 1/0 */ +) +{ + const Word16 *map0; + Word16 s, i, GR_ord, flag_diff, nb_diff; + map0 = &maps[8 * NO_SYMB_GR_PRED_G]; + IF( in[0] == 0 ) + { + s = 0; + move16(); + FOR( i = 0; i < len; i++ ) + { + s = add( s, in[i] ); + } + + IF( s == 0 ) + { + /* encode only the first zero with GR1 */ + *nbits = add( shr( map0[0], 1 ), 2 ); + move16(); + in_enc[0] = map0[0]; + move16(); + } + ELSE + { + *nbits = 1000; /* large number such that the plain coding will be selected */ + move16(); + } + GR_ord = 1; + move16(); + } + ELSE + { + GR_ord = adapt_GR_sg( in, len, no_symb, nbits, in_enc, maps, no_GR_ord ); + } + + IF( try_diff ) + { + calculate_diff( in, prev, in_diff, len ); + nb_diff = calculate_bit_diff( in_diff, len, &flag_diff ); + *nbits_diff = nb_diff; + move16(); + + IF( LT_16( add( nb_diff, 1 ), *nbits ) ) /* there is one more bit to signal differential coding */ + { + GR_ord = add( no_GR_ord, flag_diff ); + + *nbits = add( nb_diff, 1 ); + move16(); + } + } + ELSE + { + *nbits_diff = 100; + move16(); + } + + return GR_ord; +} +#else /*---------------------------------------------------------------------* * adapt_GR_rpg1_ief() * @@ -249,8 +487,137 @@ int16_t adapt_GR_rpg1_ief( return GR_ord; } +#endif +#ifdef IVAS_FLOAT_FIXED +/*---------------------------------------------------------------------* + * adapt_GR_sg() + * + * adaptive GR coding + *---------------------------------------------------------------------*/ + +/*! r: GR order */ +static Word16 adapt_GR_sg( + const Word16 *in, /* i : data to be encoded */ + const Word16 len, /* i : number of params to be encoded */ + const Word16 no_symb, /* i : max number of symbols */ + Word16 *nbits, /* o : estimated number of bits */ + Word16 *in_enc, /* o : mapped symbols */ + const Word16 *map0, /* i : mapping */ + const Word16 no_GR_ord /* i : number of GR orders to be tested (2 or 3)*/ +) +{ + const Word16 *map; + Word16 nbits0, nbits1, nbits2, symb, map_symb, i, nb0, nb1, nb2; + + IF( EQ_16( no_symb, NO_SYMB_GR_SIDE_G ) ) + { + map = &map0[imult1616( 15, no_symb )]; + } + ELSE + { + map = &( map0[imult1616( 8, no_symb )] ); + } + + set_s( in_enc, 0, len ); + + nbits1 = 0; + move16(); + nbits0 = 0; + move16(); + nbits2 = 0; + move16(); + + FOR( i = 0; i < len; i++ ) + { + symb = in[i]; + move16(); + map_symb = map[symb]; + move16(); + + IF( i == 0 ) + { + /* GR order is 1 for first band*/ + nb0 = add( shr( map_symb, 1 ), 1 ); + nb2 = sub( nb0, 2 ); + } + ELSE + { + nb0 = map_symb; + move16(); + nb2 = shr( map_symb, 2 ); + } + nb1 = shr( map_symb, 1 ); + + in_enc[i] = map_symb; + move16(); + nbits0 = add( nbits0, nb0 ); + nbits1 = add( nbits1, nb1 ); + nbits2 = add( nbits2, nb2 ); + + /* update counts */ + map = &( map0[imult1616( symb, no_symb )] ); + } + + IF( EQ_16( no_GR_ord, 2 ) ) + { + nbits0 = add( nbits0, add( len, 1 ) ); + nbits1 = add( nbits1, add( imult1616( 2, len ), 1 ) ); + IF( LE_16( nbits0, nbits1 ) ) + { + *nbits = nbits0; + move16(); + return 0; + } + ELSE + { + *nbits = nbits1; + move16(); + return 1; + } + } + ELSE + { + IF( EQ_16( no_GR_ord, 3 ) ) + { + nbits0 = add( nbits0, add( len, 2 ) ); + nbits1 = add( nbits1, add( imult1616( 2, len ), 1 ) ); + nbits2 = add( nbits2, add( imult1616( 3, len ), 2 ) ); + + test(); + IF( LE_16( nbits1, nbits2 ) && LE_16( nbits1, nbits0 ) ) + { + *nbits = nbits1; + move16(); + return 1; + } + + test(); + IF( LE_16( nbits0, nbits2 ) && LE_16( nbits0, nbits1 ) ) + { + *nbits = nbits0; + move16(); + return 0; + } + + test(); + IF( LE_16( nbits2, nbits0 ) && LE_16( nbits2, nbits1 ) ) + { + *nbits = nbits2; + move16(); + return 2; + } + } + ELSE + { + IVAS_ERROR( IVAS_ERR_INTERNAL, "Wrong number of GR orders!" ); + } + } + + return -1; +} +#else /*---------------------------------------------------------------------* * adapt_GR_sg() * @@ -362,8 +729,50 @@ static int16_t adapt_GR_sg( return -1; } +#endif + + +#ifdef IVAS_FLOAT_FIXED +/*---------------------------------------------------------------------* + * write_GR0() + * + * write data with GR order 0 + *---------------------------------------------------------------------*/ + +/*! r: number of bits written */ +Word16 write_GR0( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const Word16 ind, /* i : bitstream index */ + const Word16 *in, /* i : data to be encoded */ + const Word16 len /* i : input data length */ +) +{ + Word16 nb, i, n, val; + nb = 0; + move16(); + + FOR( i = 0; i < len; i++ ) + { + n = add( in[i], 1 ); + IF( LT_16( n, 16 ) ) + { + val = sub( shl( 1, in[i] ), 1 ); + val = shl( val, 1 ); + push_indice( hBstr, ind, val, n ); + } + ELSE + { + push_indice( hBstr, ind, 16383, 14 ); + push_indice( hBstr, ind, sub( shl( 1, sub( n, 15 ) ), 1 ), sub( n, 15 ) ); + push_indice( hBstr, ind, 0, 1 ); + } + nb = add( nb, n ); + } + return nb; +} +#else /*---------------------------------------------------------------------* * write_GR0() * @@ -401,8 +810,53 @@ int16_t write_GR0( return nb; } +#endif +#ifdef IVAS_FLOAT_FIXED +/*---------------------------------------------------------------------* + * write_GR1() + * + * write data with GR order 1 + *---------------------------------------------------------------------*/ + +/*! r: number of bits written */ +Word16 write_GR1( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const Word16 ind, /* i : bitstream index */ + const Word16 *in, /* i : data to be encoded */ + const Word16 len /* i : input data length */ +) +{ + Word16 nb, i, n, val; + nb = 0; + move16(); + + FOR( i = 0; i < len; i++ ) + { + n = shr( in[i], 1 ); + IF( LT_16( n, 14 ) ) + { + val = sub( shl( 1, n ), 1 ); + val = add( shl( val, 2 ), s_and( in[i], 1 ) ); + push_indice( hBstr, ind, val, add( n, 2 ) ); + } + ELSE + { + push_indice( hBstr, ind, 16383, 14 ); + IF( GT_16( n, 14 ) ) + { + push_indice( hBstr, ind, sub( shl( 1, sub( n, 14 ) ), 1 ), sub( n, 14 ) ); /* 1 n times */ + } + push_indice( hBstr, ind, 0, 1 ); + push_indice( hBstr, ind, s_and( in[i], 1 ), 1 ); + } + nb = add( nb, add( n, 2 ) ); + } + + return nb; +} +#else /*---------------------------------------------------------------------* * write_GR1() * @@ -443,8 +897,56 @@ int16_t write_GR1( return nb; } +#endif +#ifdef IVAS_FLOAT_FIXED +/*---------------------------------------------------------------------* + * write_GR2() + * + * write data with GR order 2 + *---------------------------------------------------------------------*/ + +/*! r: number of bits written */ +static Word16 write_GR2( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const Word16 ind, /* i : bitstream index */ + const Word16 *in, /* i : data to be encoded */ + const Word16 len /* i : input data length */ +) +{ + Word16 nb, i, n; + nb = 0; + move16(); + + FOR( i = 0; i < len; i++ ) + { + n = shr( in[i], 2 ); + IF( LT_16( n, 14 ) ) + { + IF( n > 0 ) + { + push_indice( hBstr, ind, sub( shl( 1, n ), 1 ), n ); /* 1 n times */ + } + push_indice( hBstr, ind, 0, 1 ); + push_indice( hBstr, ind, s_and( in[i], 3 ), 2 ); + } + ELSE + { + push_indice( hBstr, ind, 16383, 14 ); + IF( GT_16( n, 14 ) ) + { + push_indice( hBstr, ind, sub( shl( 1, sub( n, 14 ) ), 1 ), sub( n, 14 ) ); /* 1 n times */ + } + push_indice( hBstr, ind, 0, 1 ); + push_indice( hBstr, ind, s_and( in[i], 3 ), 2 ); + } + nb = add( nb, add( n, 3 ) ); + } + + return nb; +} +#else /*---------------------------------------------------------------------* * write_GR2() * @@ -488,8 +990,44 @@ static int16_t write_GR2( return nb; } +#endif +#ifdef IVAS_FLOAT_FIXED +/*---------------------------------------------------------------------* + * write_bitstream_GR() + * + * generic GR encoder for GR order 0 or 1 + *---------------------------------------------------------------------*/ + +/*! r: number of bits written */ +Word16 write_bitstream_GR( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const Word16 ind, /* i : bitstream index */ + const Word16 *in, /* i : input vector */ + const Word16 len, /* i : input vector length */ + const Word16 GR_ord /* i : GR order */ +) +{ + Word16 nb; + nb = 0; + move16(); + + push_indice( hBstr, ind, GR_ord, 1 ); + nb = add( nb, 1 ); + + IF( GR_ord == 0 ) + { + nb = add( nb, write_GR0( hBstr, ind, in, len ) ); + } + ELSE + { + nb = add( nb, write_GR1( hBstr, ind, in, len ) ); + } + + return nb; +} +#else /*---------------------------------------------------------------------* * write_bitstream_GR() * @@ -521,8 +1059,72 @@ int16_t write_bitstream_GR( return nb; } +#endif + + +#ifdef IVAS_FLOAT_FIXED +/*---------------------------------------------------------------------* + * write_bitstream_adapt_GR() + * + * write encoded data using adaptive GR + *---------------------------------------------------------------------*/ + +/*! r: number of bits written */ +Word16 write_bitstream_adapt_GR( + BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */ + const Word16 ind, /* i : bitstream index */ + const Word16 *in, /* i : values to be written in bitstream */ + const Word16 len, /* i : values vector length */ + const Word16 GR_ord, /* i : GR order to be used */ + const Word16 no_GR_ord /* i : speech/music 0/1 */ +) +{ + Word16 nb; + + nb = 0; + /* first component first */ + nb = add( nb, write_GR1( hBstr, ind, in, 1 ) ); + + /* write the GR order */ + IF( EQ_16( no_GR_ord, 2 ) ) + { + push_indice( hBstr, ind, GR_ord, 1 ); + nb = add( nb, 1 ); + } + ELSE + { + IF( EQ_16( GR_ord, 1 ) ) + { + push_indice( hBstr, ind, 0, 1 ); /* GR order = 1*/ + nb = add( nb, 1 ); + } + ELSE + { + push_indice( hBstr, ind, 1, 1 ); + push_indice( hBstr, ind, shr( GR_ord, 1 ), 1 ); /* '10' for GR ord = 0; '11' for GR ord 2 */ + nb = add( nb, 2 ); + } + } + IF( GR_ord == 0 ) + { + nb = add( nb, write_GR0( hBstr, ind, &in[1], sub( len, 1 ) ) ); + } + ELSE + { + IF( EQ_16( GR_ord, 1 ) ) + { + nb = add( nb, write_GR1( hBstr, ind, &in[1], sub( len, 1 ) ) ); + } + ELSE + { + nb = add( nb, write_GR2( hBstr, ind, &in[1], sub( len, 1 ) ) ); + } + } + return nb; +} +#else /*---------------------------------------------------------------------* * write_bitstream_adapt_GR() * @@ -585,3 +1187,4 @@ int16_t write_bitstream_adapt_GR( return nb; } +#endif diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index 6959f9e5e..27552f50b 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -578,7 +578,12 @@ void stereo_dft_enc_reset( set_s( hStereoDft->side_gain_index_ECDiff, 0, STEREO_DFT_BAND_MAX ); set_s( hStereoDft->side_gain_index_ECprevious, 15, STEREO_DFT_BAND_MAX ); hStereoDft->side_gain_counter = 0; +#ifdef IVAS_FLOAT_FIXED + hStereoDft->side_gain_bitdiff_lp_fx = STEREO_DFT_BITDIFF_INIT_FX; + hStereoDft->q_side_gain_bitdiff_lp = Q10; +#else hStereoDft->side_gain_bitdiff_lp = STEREO_DFT_BITDIFF_INIT; +#endif set_zero( hStereoDft->gipd, STEREO_DFT_ENC_DFT_NB ); set_zero( hStereoDft->dot_prod_real_smooth, STEREO_DFT_BAND_MAX ); set_zero( hStereoDft->dot_prod_img_smooth, STEREO_DFT_BAND_MAX ); @@ -2966,9 +2971,15 @@ static void side_gain_mode_decision( try_diff = 0; } no_GR_ord = 3; +#ifdef IVAS_FLOAT_FIXED + hStereoDft->side_gain_flag_2 = adapt_GR_ief_fx( hStereoDft->side_gain_index_EC, hStereoDft->side_gain_index_ECDiff, hStereoDft->side_gain_index_ECprevious, + hStereoDft->nbands, NO_SYMB_GR_SIDE_G, &n_bits, encoded_ind_GR, dft_maps_sg, no_GR_ord, &nb_diff, + hStereoDft->side_gain_counter, &hStereoDft->side_gain_bitdiff_lp_fx, &hStereoDft->q_side_gain_bitdiff_lp, try_diff ); +#else hStereoDft->side_gain_flag_2 = adapt_GR_ief( hStereoDft->side_gain_index_EC, hStereoDft->side_gain_index_ECDiff, hStereoDft->side_gain_index_ECprevious, hStereoDft->nbands, NO_SYMB_GR_SIDE_G, &n_bits, encoded_ind_GR, dft_maps_sg, no_GR_ord, &nb_diff, hStereoDft->side_gain_counter, &hStereoDft->side_gain_bitdiff_lp, try_diff ); +#endif for ( i = 0; i < hStereoDft->nbands; i++ ) diff --git a/lib_enc/ivas_stereo_switching_enc.c b/lib_enc/ivas_stereo_switching_enc.c index 1e97552e3..c7ead90bc 100644 --- a/lib_enc/ivas_stereo_switching_enc.c +++ b/lib_enc/ivas_stereo_switching_enc.c @@ -403,7 +403,11 @@ ivas_error stereo_memory_enc( /* allocate CLDFB for primary channel */ if ( st->cldfbAnaEnc == NULL ) { +#ifdef IVAS_FLOAT_FIXED if ( ( error = openCldfb_ivas_enc( &st->cldfbAnaEnc, CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) +#else + if ( ( error = openCldfb_ivas( &st->cldfbAnaEnc, CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -419,7 +423,11 @@ ivas_error stereo_memory_enc( if ( st->cldfbSynTd == NULL ) { +#ifdef IVAS_FLOAT_FIXED if ( ( error = openCldfb_ivas_enc( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) +#else + if ( ( error = openCldfb_ivas( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -553,7 +561,12 @@ ivas_error stereo_memory_enc( for ( i = 0; i < CPE_CHANNELS; i++ ) { st = hCPE->hCoreCoder[i]; +#ifdef IVAS_FLOAT_FIXED if ( ( error = openCldfb_ivas_enc( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) +#else + if ( ( error = openCldfb_ivas( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) +#endif + { return error; } diff --git a/lib_enc/ivas_stereo_td_enc.c b/lib_enc/ivas_stereo_td_enc.c index 1c899987e..2dc3884cc 100644 --- a/lib_enc/ivas_stereo_td_enc.c +++ b/lib_enc/ivas_stereo_td_enc.c @@ -311,7 +311,11 @@ ivas_error stereo_set_tdm( /* allocate CLDFB ana for secondary channel */ if ( st->cldfbAnaEnc == NULL ) { +#ifdef IVAS_FLOAT_FIXED if ( ( error = openCldfb_ivas_enc( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) +#else + if ( ( error = openCldfb_ivas( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -324,8 +328,11 @@ ivas_error stereo_set_tdm( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); } - +#ifdef IVAS_FLOAT_FIXED if ( ( error = openCldfb_ivas_enc( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) +#else + if ( ( error = openCldfb_ivas( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 292956a0a..8ab7a8e9f 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -2634,17 +2634,17 @@ static ivas_error sanitizeBitrateISM_fx( return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for 3 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); } - IF( GT_32( hEncoderConfig->ivas_total_brate, IVAS_16k4 ) && EQ_16( hEncoderConfig->nchan_inp, 2 ) ) + IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_16k4 ) && EQ_16( hEncoderConfig->nchan_inp, 2 ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for 2 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); } - IF( GT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) && EQ_16( hEncoderConfig->nchan_inp, 3 ) ) + IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) && EQ_16( hEncoderConfig->nchan_inp, 3 ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for 3 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); } - IF( GT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) && EQ_16( hEncoderConfig->nchan_inp, 4 ) ) + IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) && EQ_16( hEncoderConfig->nchan_inp, 4 ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for 4 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); } diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 451ac33ee..cbccefeb9 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -91,8 +91,8 @@ typedef struct bitstream_enc_data_structure Indice **ivas_ind_list_zero; /* beginning of the buffer of indices */ void *st_ivas; /* IVAS encoder structure */ - Word16 nb_bits_tot_fx; /* total number of bits already written */ - Indice *ind_list_fx; /* list of indices */ + //Word16 nb_bits_tot_fx; /* total number of bits already written */ + //Indice *ind_list_fx; /* list of indices */ Word16 next_ind_fx; /* pointer to the next empty slot in the list of indices */ Word16 last_ind_fx; /* last written indice */ @@ -117,6 +117,7 @@ typedef struct signal_buffers_enc_data_structure float buf_wspeech_enc_flt[L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320]; /* increased by 320 to avoid memory overlap in find_wsp() and also to accomodate for the wspeech_enc */ // Fixed Word16 input_buff[L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS )]; + Word32 input_buff32[L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS )]; Word32 Bin_E_old_fx[L_FFT / 2]; /* per bin energy of old 2nd frames */ Word16 mem_decim_fx[2 * L_FILT_MAX]; /* decimation filter memory */ @@ -770,17 +771,17 @@ typedef struct noise_estimation_structure float lt_tn_dist; float lt_Ellp_dist; float lt_haco_ev; - Word16 Etot_l_fx; /* Q8 Noise estimator - Track energy from below */ - Word16 Etot_h_fx; /* Q8 Noise estimator - Track energy from above */ - Word16 Etot_l_lp_fx; /* Q8 Noise estimator - Smoothed low energy */ - Word16 Etot_last_fx; /*Q8*/ - Word16 Etot_lp_fx; /* Q8 Noise estimator - Filtered input energy */ - - Word32 Etot_l_32fx; /* Q8 Noise estimator - Track energy from below */ - Word32 Etot_h_32fx; /* Q8 Noise estimator - Track energy from above */ - Word32 Etot_l_lp_32fx; /* Q8 Noise estimator - Smoothed low energy */ - Word32 Etot_last_32fx; /*Q8*/ - Word32 Etot_lp_32fx; /* Q8 Noise estimator - Filtered input energy */ + Word16 Etot_l_fx; /* Q8 Noise estimator - Track energy from below */ + Word16 Etot_h_fx; /* Q8 Noise estimator - Track energy from above */ + Word16 Etot_l_lp_fx; /* Q8 Noise estimator - Smoothed low energy */ + Word16 Etot_last_fx; /*Q8*/ + Word16 Etot_lp_fx; /* Q8 Noise estimator - Filtered input energy */ + + Word32 Etot_l_32fx; /* Q8 Noise estimator - Track energy from below */ + Word32 Etot_h_32fx; /* Q8 Noise estimator - Track energy from above */ + Word32 Etot_l_lp_32fx; /* Q8 Noise estimator - Smoothed low energy */ + Word32 Etot_last_32fx; /*Q8*/ + Word32 Etot_lp_32fx; /* Q8 Noise estimator - Filtered input energy */ Word16 lt_tn_track_fx; /* Q15 */ Word16 lt_tn_dist_fx; /* Q8*/ @@ -806,10 +807,10 @@ typedef struct noise_estimation_structure float Etot_st_est; /* Noise estimation - short term estimate of E{ Etot } */ float Etot_sq_st_est; /* Noise estimation - short term estimate of E{ Etot^2 } */ Word16 Etot_v_h2_fx; - Word16 sign_dyn_lp_fx; /*Q8*/ + Word16 sign_dyn_lp_fx; /*Q8*/ Word32 Etot_v_h2_32fx; - Word32 sign_dyn_lp_32fx; /*Q8*/ + Word32 sign_dyn_lp_32fx; /*Q8*/ Word16 Etot_st_est_fx; /* Q8 Noise estimation - short term estimate of E{ Etot } */ Word16 Etot_sq_st_est_fx; /* Q2 Noise estimation - short term estimate of E{ Etot^2 } */ @@ -1924,7 +1925,9 @@ typedef struct enc_core_structure float *old_input_signal; Word16 *input_buff_fx; + Word32 *input_buff32_fx; Word16 *input_fx; + Word32 *input32_fx; Word16 *old_input_signal_fx; Word16 Q_old_wtda; diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index 5b461cd56..bfcdd8fdf 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -1977,7 +1977,7 @@ void ProcessIGF_fx( bsBits = sub( hBstr->next_ind_fx, bsStart ); IF( !isTCX20 ) { - IGFEncConcatenateBitstream_fx( hInstance, bsBits, &hBstr->next_ind_fx, &hBstr->nb_bits_tot_fx, hBstr->ind_list_fx ); + IGFEncConcatenateBitstream_fx( hInstance, bsBits, &hBstr->next_ind_fx, &hBstr->nb_bits_tot, hBstr->ind_list ); } #else PMT( "New bit stream implementation to be checked" ) diff --git a/lib_enc/transition_enc_fx.c b/lib_enc/transition_enc_fx.c index bc81a23c6..4e6b1f512 100644 --- a/lib_enc/transition_enc_fx.c +++ b/lib_enc/transition_enc_fx.c @@ -210,7 +210,7 @@ void transition_enc_fx( { /* this is called only to compute unused bits */ config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, - L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot_fx, TRANSITION, TC_0_0, 3, NULL, unbits_ACELP, + L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, TC_0_0, 3, NULL, unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); } @@ -319,7 +319,7 @@ void transition_enc_fx( IF( LE_16( sub( i_subfr, *tc_subfr ), L_SUBFR ) ) { config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, - st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot_fx, TRANSITION, *tc_subfr, 2, NULL, + st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, *tc_subfr, 2, NULL, unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); } /*-----------------------------------------------------------------* -- GitLab From 3bb7efc03c7b9dfa1207d6238454ac68f4490bab Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 11 Jul 2024 13:43:24 +0530 Subject: [PATCH 061/110] Clang formatting changes --- lib_com/bitstream.c | 8 ++++---- lib_com/ivas_stat_com.h | 2 +- lib_com/prot_fx2.h | 22 +++++++++++----------- lib_enc/ivas_ism_dtx_enc.c | 26 +++++++++++++------------- lib_enc/ivas_ism_enc.c | 12 ++++++------ lib_enc/ivas_ism_param_enc.c | 10 +++++----- lib_enc/stat_enc.h | 34 +++++++++++++++++----------------- 7 files changed, 57 insertions(+), 57 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index decc274e3..988d51489 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -1414,7 +1414,7 @@ ivas_error check_ind_list_limits( /* check, if the maximum number of indices has been reached and re-allocate the buffer */ /* the re-allocation can be avoided by increasing the limits in get_ivas_max_num_indices() or get_ivas_max_num_indices_metadata() */ - IF( GE_16( (Word16)( &hBstr->ind_list[hBstr->nb_ind_tot] - ivas_ind_list_zero ), *( hBstr->ivas_max_num_indices ) ) ) + IF( GE_16( (Word16) ( &hBstr->ind_list[hBstr->nb_ind_tot] - ivas_ind_list_zero ), *( hBstr->ivas_max_num_indices ) ) ) { /* reallocate the buffer of indices with increased limit */ @@ -1540,15 +1540,15 @@ ivas_error push_indice( /* find the location in the list of indices based on ID */ i = hBstr->nb_ind_tot; move16(); - WHILE ( i > 0 && LT_16( id, hBstr->ind_list[i - 1].id ) ) + WHILE( i > 0 && LT_16( id, hBstr->ind_list[i - 1].id ) ) { i = sub( i, 1 ); } /* shift indices, if the new ID is to be written somewhere inside the list */ - IF ( i < hBstr->nb_ind_tot ) + IF( i < hBstr->nb_ind_tot ) { - FOR ( j = hBstr->nb_ind_tot; j > i; j-- ) + FOR( j = hBstr->nb_ind_tot; j > i; j-- ) { hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id; hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits; diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 0e26a892c..67b03df52 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -599,7 +599,7 @@ typedef struct ivas_masa_qmetadata_frame_struct #ifndef IVAS_FLOAT_FIXED float dir_comp_ratio; #else - Word16 dir_comp_ratio_fx; /* Q15 */ + Word16 dir_comp_ratio_fx; /* Q15 */ #endif uint8_t is_masa_ivas_format; diff --git a/lib_com/prot_fx2.h b/lib_com/prot_fx2.h index 95ec1b4a8..c90e50f84 100644 --- a/lib_com/prot_fx2.h +++ b/lib_com/prot_fx2.h @@ -2289,17 +2289,17 @@ Word32 Interpol_lc_fx( /* o : interpolated value ); -//modif_fs_fx.c -Word16 modify_Fs_fx( /* o : length of output Q0 */ - const Word16 sigIn_fx[], /* i : signal to decimate Q0 */ - Word16 lg, /* i : length of input Q0 */ - const Word32 fin, /* i : frequency of input Q0 */ - Word16 sigOut_fx[], /* o : decimated signal Q0 */ - const Word32 fout, /* i : frequency of output Q0 */ - Word16 mem_fx[], /* i/o: filter memory Q0 */ - const Word16 nblp, /* i : flag indicating if NB low-pass is applied */ - Word16 *Q_new_inp, //TO be removed - Word16 *mem_decim_size //TO be removed +// modif_fs_fx.c +Word16 modify_Fs_fx( /* o : length of output Q0 */ + const Word16 sigIn_fx[], /* i : signal to decimate Q0 */ + Word16 lg, /* i : length of input Q0 */ + const Word32 fin, /* i : frequency of input Q0 */ + Word16 sigOut_fx[], /* o : decimated signal Q0 */ + const Word32 fout, /* i : frequency of output Q0 */ + Word16 mem_fx[], /* i/o: filter memory Q0 */ + const Word16 nblp, /* i : flag indicating if NB low-pass is applied */ + Word16 *Q_new_inp, // TO be removed + Word16 *mem_decim_size // TO be removed ); Word16 modify_Fs_intcub3m_sup_fx( /* o : length of output */ diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c index 3848cb725..157b81378 100644 --- a/lib_enc/ivas_ism_dtx_enc.c +++ b/lib_enc/ivas_ism_dtx_enc.c @@ -155,7 +155,7 @@ Word16 ivas_ism_dtx_enc_fx( test(); test(); - if( GT_16( lp_noise_mean_fx, ( 50 << 8 ) ) || ( GT_16( lp_noise_mean_fx, ( 25 << 8 ) ) && GT_16( lp_noise_variation_fx, ( 32 << 8 ) ) ) ) + if ( GT_16( lp_noise_mean_fx, ( 50 << 8 ) ) || ( GT_16( lp_noise_mean_fx, ( 25 << 8 ) ) && GT_16( lp_noise_variation_fx, ( 32 << 8 ) ) ) ) { dtx_flag = 0; move16(); @@ -173,11 +173,11 @@ Word16 ivas_ism_dtx_enc_fx( test(); test(); test(); - if( !( ( EQ_16( nchan_ism, 1 ) && LE_32( ivas_total_brate, IVAS_24k4 ) ) || - ( EQ_16( nchan_ism, 2 ) && LE_32( ivas_total_brate, IVAS_48k ) ) || - ( EQ_16( nchan_ism, 3 ) && LE_32( ivas_total_brate, IVAS_80k ) ) || - ( EQ_16( nchan_ism, 4 ) && LE_32( ivas_total_brate, IVAS_96k ) ) || - LT_16( lp_noise_max_fx, ( 15 << 8 ) ) ) ) + if ( !( ( EQ_16( nchan_ism, 1 ) && LE_32( ivas_total_brate, IVAS_24k4 ) ) || + ( EQ_16( nchan_ism, 2 ) && LE_32( ivas_total_brate, IVAS_48k ) ) || + ( EQ_16( nchan_ism, 3 ) && LE_32( ivas_total_brate, IVAS_80k ) ) || + ( EQ_16( nchan_ism, 4 ) && LE_32( ivas_total_brate, IVAS_96k ) ) || + LT_16( lp_noise_max_fx, ( 15 << 8 ) ) ) ) { dtx_flag = 0; move16(); @@ -209,13 +209,13 @@ Word16 ivas_ism_dtx_enc_fx( /* check difference between current and last metadata */ md_diff_flag[ch] = 0; move16(); - if( GT_32( L_abs( L_sub( hIsmMeta[ch]->azimuth_fx, hIsmMeta[ch]->last_azimuth_fx ) ), MD_MAX_DIFF_AZIMUTH_FX ) ) + if ( GT_32( L_abs( L_sub( hIsmMeta[ch]->azimuth_fx, hIsmMeta[ch]->last_azimuth_fx ) ), MD_MAX_DIFF_AZIMUTH_FX ) ) { md_diff_flag[ch] = 1; move16(); } - if( GT_32( L_abs( L_sub( hIsmMeta[ch]->elevation_fx, hIsmMeta[ch]->last_elevation_fx ) ), MD_MAX_DIFF_ELEVATION_FX ) ) + if ( GT_32( L_abs( L_sub( hIsmMeta[ch]->elevation_fx, hIsmMeta[ch]->last_elevation_fx ) ), MD_MAX_DIFF_ELEVATION_FX ) ) { md_diff_flag[ch] = 1; move16(); @@ -236,7 +236,7 @@ Word16 ivas_ism_dtx_enc_fx( move16(); nBits_MD_max = sub( nBits_MD_max, SID_FORMAT_NBITS ); - if( GT_16( nchan_transport, 1 ) ) + if ( GT_16( nchan_transport, 1 ) ) { nBits_MD_max = sub( nBits_MD_max, nBits_sce_id ); } @@ -246,13 +246,13 @@ Word16 ivas_ism_dtx_enc_fx( nBits_MD_max = sub( nBits_MD_max, nBits_coh ); /* coherence */ } - if( GT_16( nchan_ism, 3 ) ) + if ( GT_16( nchan_ism, 3 ) ) { nBits_MD_max = sub( nBits_MD_max, 1 ); /* ism_mode flag */ } /* too many metadata bits -> switch to active coding */ - if( GT_16( nBits, nBits_MD_max ) ) + if ( GT_16( nBits, nBits_MD_max ) ) { dtx_flag = 0; move16(); @@ -718,7 +718,7 @@ void ivas_ism_coh_estim_dtx_enc_fx( { norm_inp = norm_l( st_id0->input32_fx[i] ); scaled_inp = L_shl( st_id0->input32_fx[i], norm_inp ); - tot_exp = shl( sub( 20, norm_inp), 1 ); + tot_exp = shl( sub( 20, norm_inp ), 1 ); acorr_ene_fx[hISMDTX->sce_id_dtx] = BASOP_Util_Add_Mant32Exp( acorr_ene_fx[hISMDTX->sce_id_dtx], acorr_ene_e[hISMDTX->sce_id_dtx], Mult_32_32( scaled_inp, scaled_inp ), tot_exp, &acorr_ene_e[hISMDTX->sce_id_dtx] ); move32(); } @@ -745,7 +745,7 @@ void ivas_ism_coh_estim_dtx_enc_fx( { norm_inp = norm_l( st->input32_fx[i] ); scaled_inp = L_shl( st->input32_fx[i], norm_inp ); - tot_exp = shl( sub( 20, norm_inp), 1 ); + tot_exp = shl( sub( 20, norm_inp ), 1 ); acorr_ene_fx[sce_id] = BASOP_Util_Add_Mant32Exp( acorr_ene_fx[sce_id], acorr_ene_e[sce_id], Mult_32_32( scaled_inp, scaled_inp ), tot_exp, &acorr_ene_e[sce_id] ); move32(); xcorr_ene_fx = BASOP_Util_Add_Mant32Exp( xcorr_ene_fx, xcorr_ene_e, Mult_32_32( scaled_inp, scaled_inp ), tot_exp, &xcorr_ene_e ); diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 92f486f37..7a819965b 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -203,12 +203,12 @@ ivas_error ivas_ism_enc( /* compute the dominant sce_id using long term energy */ #ifdef IVAS_FLOAT_FIXED #if 1 /************************flt_to_fix****************************/ - for( int j = 0; j < st_ivas->nchan_transport; j++ ) + for ( int j = 0; j < st_ivas->nchan_transport; j++ ) { - floatToFixed_arrL( st_ivas->hSCE[j]->hCoreCoder[0]->input, st_ivas->hSCE[j]->hCoreCoder[0]->input32_fx, Q11, input_frame ); /*Q0*/ + floatToFixed_arrL( st_ivas->hSCE[j]->hCoreCoder[0]->input, st_ivas->hSCE[j]->hCoreCoder[0]->input32_fx, Q11, input_frame ); /*Q0*/ } f2me_buf( &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc[0][0], &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_fx[0][0], &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_e, st_ivas->nchan_transport * PARAM_ISM_HYS_BUF_SIZE ); - for( int ch = 0; ch < nchan_ism; ch++ ) + for ( int ch = 0; ch < nchan_ism; ch++ ) { st_ivas->hIsmMetaData[ch]->azimuth_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->azimuth, Q22 ); st_ivas->hIsmMetaData[ch]->last_azimuth_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->last_azimuth, Q22 ); @@ -223,15 +223,15 @@ ivas_error ivas_ism_enc( #endif /****************************ends here*********************************/ ivas_ism_get_sce_id_dtx_fx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); dtx_flag = ivas_ism_dtx_enc_fx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, st_ivas->nchan_transport, vad_flag, st_ivas->hIsmMetaData, md_diff_flag, &sid_flag ); - IF ( sid_flag ) + IF( sid_flag ) { /* estimate coherence between objects */ ivas_ism_coh_estim_dtx_enc_fx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); } #if 1 /************************fix_to_flt****************************/ - me2f_buf(&st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_fx[0][0], st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_e, &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc[0][0], st_ivas->nchan_transport * PARAM_ISM_HYS_BUF_SIZE); + me2f_buf( &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_fx[0][0], st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_e, &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc[0][0], st_ivas->nchan_transport * PARAM_ISM_HYS_BUF_SIZE ); fixedToFloat_arr( st_ivas->hISMDTX->coh_fx, st_ivas->hISMDTX->coh, Q15, st_ivas->nchan_transport ); -#endif/****************************ends here*********************************/ +#endif /****************************ends here*********************************/ #else ivas_ism_get_sce_id_dtx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index e34f4d1a1..49507f078 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -556,14 +556,14 @@ void ivas_param_ism_compute_noisy_speech_flag( Word16 i; /* Move the Noisy speech buffer */ - FOR ( i = 0; i < ( PARAM_ISM_HYS_BUF_SIZE - 1 ); i++ ) + FOR( i = 0; i < ( PARAM_ISM_HYS_BUF_SIZE - 1 ); i++ ) { st_ivas->hParamIsm->noisy_speech_buffer[i] = st_ivas->hParamIsm->noisy_speech_buffer[i + 1]; move16(); } /* Set flag_noisy_speech to 0 for cases where object energies are not roughly equal */ - IF ( !st_ivas->hParamIsm->flag_equal_energy ) + IF( !st_ivas->hParamIsm->flag_equal_energy ) { st_ivas->hParamIsm->noisy_speech_buffer[i] = 0; st_ivas->hParamIsm->flag_noisy_speech = 0; @@ -574,10 +574,10 @@ void ivas_param_ism_compute_noisy_speech_flag( { /* For the current frame, make a decision based on some core-coder flags */ test(); - IF ( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr ) + IF( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr ) { test(); - IF ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) + IF( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) { st_ivas->hParamIsm->noisy_speech_buffer[i] = 0; move16(); @@ -597,7 +597,7 @@ void ivas_param_ism_compute_noisy_speech_flag( /* Do a decision based on hysteresis */ st_ivas->hParamIsm->flag_noisy_speech = 1; move16(); - FOR ( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ ) + FOR( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ ) { test(); st_ivas->hParamIsm->flag_noisy_speech = st_ivas->hParamIsm->flag_noisy_speech && st_ivas->hParamIsm->noisy_speech_buffer[i]; diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index cbccefeb9..a439f7e8a 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -91,10 +91,10 @@ typedef struct bitstream_enc_data_structure Indice **ivas_ind_list_zero; /* beginning of the buffer of indices */ void *st_ivas; /* IVAS encoder structure */ - //Word16 nb_bits_tot_fx; /* total number of bits already written */ - //Indice *ind_list_fx; /* list of indices */ - Word16 next_ind_fx; /* pointer to the next empty slot in the list of indices */ - Word16 last_ind_fx; /* last written indice */ + // Word16 nb_bits_tot_fx; /* total number of bits already written */ + // Indice *ind_list_fx; /* list of indices */ + Word16 next_ind_fx; /* pointer to the next empty slot in the list of indices */ + Word16 last_ind_fx; /* last written indice */ } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; @@ -771,17 +771,17 @@ typedef struct noise_estimation_structure float lt_tn_dist; float lt_Ellp_dist; float lt_haco_ev; - Word16 Etot_l_fx; /* Q8 Noise estimator - Track energy from below */ - Word16 Etot_h_fx; /* Q8 Noise estimator - Track energy from above */ - Word16 Etot_l_lp_fx; /* Q8 Noise estimator - Smoothed low energy */ - Word16 Etot_last_fx; /*Q8*/ - Word16 Etot_lp_fx; /* Q8 Noise estimator - Filtered input energy */ - - Word32 Etot_l_32fx; /* Q8 Noise estimator - Track energy from below */ - Word32 Etot_h_32fx; /* Q8 Noise estimator - Track energy from above */ - Word32 Etot_l_lp_32fx; /* Q8 Noise estimator - Smoothed low energy */ - Word32 Etot_last_32fx; /*Q8*/ - Word32 Etot_lp_32fx; /* Q8 Noise estimator - Filtered input energy */ + Word16 Etot_l_fx; /* Q8 Noise estimator - Track energy from below */ + Word16 Etot_h_fx; /* Q8 Noise estimator - Track energy from above */ + Word16 Etot_l_lp_fx; /* Q8 Noise estimator - Smoothed low energy */ + Word16 Etot_last_fx; /*Q8*/ + Word16 Etot_lp_fx; /* Q8 Noise estimator - Filtered input energy */ + + Word32 Etot_l_32fx; /* Q8 Noise estimator - Track energy from below */ + Word32 Etot_h_32fx; /* Q8 Noise estimator - Track energy from above */ + Word32 Etot_l_lp_32fx; /* Q8 Noise estimator - Smoothed low energy */ + Word32 Etot_last_32fx; /*Q8*/ + Word32 Etot_lp_32fx; /* Q8 Noise estimator - Filtered input energy */ Word16 lt_tn_track_fx; /* Q15 */ Word16 lt_tn_dist_fx; /* Q8*/ @@ -807,10 +807,10 @@ typedef struct noise_estimation_structure float Etot_st_est; /* Noise estimation - short term estimate of E{ Etot } */ float Etot_sq_st_est; /* Noise estimation - short term estimate of E{ Etot^2 } */ Word16 Etot_v_h2_fx; - Word16 sign_dyn_lp_fx; /*Q8*/ + Word16 sign_dyn_lp_fx; /*Q8*/ Word32 Etot_v_h2_32fx; - Word32 sign_dyn_lp_32fx; /*Q8*/ + Word32 sign_dyn_lp_32fx; /*Q8*/ Word16 Etot_st_est_fx; /* Q8 Noise estimation - short term estimate of E{ Etot } */ Word16 Etot_sq_st_est_fx; /* Q2 Noise estimation - short term estimate of E{ Etot^2 } */ -- GitLab From 9d265649e0cd53ac17b2c1f12b1ae1aec42405b8 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 11 Jul 2024 14:20:55 +0530 Subject: [PATCH 062/110] Build fix with EVS_FLOAT_ENC disabled, MSVS warning fix --- lib_dec/ivas_stereo_dft_dec_fx.c | 2 +- lib_enc/stat_enc.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 1808c5384..52fc6e26c 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -2853,7 +2853,7 @@ void stereo_dft_generate_res_pred_fx( dmx_nrg = L_add( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )] ) ); } - hStereoDft->hb_nrg_fx[0] = dmx_nrg, L_shr( hStereoDft->NFFT, 1 ); + hStereoDft->hb_nrg_fx[0] = L_add( hStereoDft->hb_nrg_fx[0], div_l( dmx_nrg, shr( hStereoDft->NFFT, 2 ) ) ); move32(); *stop = bin0; move16(); diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index a439f7e8a..68910012b 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -92,9 +92,9 @@ typedef struct bitstream_enc_data_structure void *st_ivas; /* IVAS encoder structure */ // Word16 nb_bits_tot_fx; /* total number of bits already written */ - // Indice *ind_list_fx; /* list of indices */ - Word16 next_ind_fx; /* pointer to the next empty slot in the list of indices */ - Word16 last_ind_fx; /* last written indice */ + Indice *ind_list_fx; /* list of indices */ + Word16 next_ind_fx; /* pointer to the next empty slot in the list of indices */ + Word16 last_ind_fx; /* last written indice */ } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; -- GitLab From cce7647a0bb8a8db2dc8817fecb3af56fb5773ad Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 11 Jul 2024 14:59:00 +0530 Subject: [PATCH 063/110] EVS encoder BE fix --- lib_enc/ivas_sce_enc.c | 2 +- lib_enc/stat_enc.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index 396df4b64..c2b53d5f5 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -550,7 +550,7 @@ ivas_error create_evs_sce_enc( { return error; } - st_fx->hBstr->ind_list_fx = ind_list; + st_fx->hBstr->ind_list = ind_list; // st_fx->hBstr->ind_list_fx = st->hBstr->ind_list; reset_indices_enc_fx( st_fx->hBstr ); hSCE->hCoreCoder[0] = st_fx; diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 68910012b..719b7f661 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -92,9 +92,9 @@ typedef struct bitstream_enc_data_structure void *st_ivas; /* IVAS encoder structure */ // Word16 nb_bits_tot_fx; /* total number of bits already written */ - Indice *ind_list_fx; /* list of indices */ - Word16 next_ind_fx; /* pointer to the next empty slot in the list of indices */ - Word16 last_ind_fx; /* last written indice */ + // Indice *ind_list_fx; /* list of indices */ + Word16 next_ind_fx; /* pointer to the next empty slot in the list of indices */ + Word16 last_ind_fx; /* last written indice */ } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; -- GitLab From 69191ce7765831ead27e47e147ab0f33236bf70e Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 11 Jul 2024 16:57:41 +0530 Subject: [PATCH 064/110] EVS encoder BE fix - 2 --- lib_enc/lib_enc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 8ab7a8e9f..2887178f5 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1641,7 +1641,7 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( { if ( !( hIvasEnc->hCoreCoder == NULL && hEncoderConfig->ivas_format == MONO_FORMAT ) ) { - st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list; + //st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list; st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; } -- GitLab From e9b49165e4b8cdb0d771093687229fac0a25395c Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 11 Jul 2024 17:01:37 +0530 Subject: [PATCH 065/110] Clang formatting changes --- lib_enc/lib_enc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 2887178f5..2949e49ec 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1641,7 +1641,7 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( { if ( !( hIvasEnc->hCoreCoder == NULL && hEncoderConfig->ivas_format == MONO_FORMAT ) ) { - //st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list; + // st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list; st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; } -- GitLab From ba63850199db25beedfc623fa490401bf89986ca Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 11 Jul 2024 21:44:04 +0530 Subject: [PATCH 066/110] Fix for encoder pytest errors --- lib_enc/lib_enc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 2949e49ec..8d61700e4 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1641,7 +1641,10 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( { if ( !( hIvasEnc->hCoreCoder == NULL && hEncoderConfig->ivas_format == MONO_FORMAT ) ) { - // st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list; + if ( ( hEncoderConfig->element_mode_init != EVS_MONO ) ) + { + st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list; + } st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; } -- GitLab From 3ed639c2f63aad7da35b91a03a99341f1a63f879 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 11 Jul 2024 22:22:02 +0530 Subject: [PATCH 067/110] Fix for LTV crash for OMASA stream [x] Test case - ltv-OMASA 2Dir1TC 3ISM at 24.4 kbps, 48kHz in, 16kHz out, FOA out, FER at 10% --- lib_dec/fd_cng_dec_fx.c | 6 +++--- lib_dec/ivas_stereo_cng_dec.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index f4cf173f5..c02850ada 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -2853,10 +2853,10 @@ void perform_noise_estimation_dec_ivas_fx( /* energy significantly decreases in one of the larger partitions during active frames -> downward update */ FOR( p = CNA_ACT_DN_LARGE_PARTITION; p < npart; p++ ) { - L_tmp = L_shr( hFdCngDec->msPeriodog_ST_fx[p], sub( sub( 31, hFdCngDec->msPeriodog_ST_exp ), 4 ) ); - IF( LT_32( hFdCngDec->msPeriodog_ST_fx[p], msNoiseEst[p] ) ) + L_tmp = L_shr( hFdCngDec->msPeriodog_ST_fx[p], sub( hFdCngDec->msNoiseEst_exp, hFdCngDec->msPeriodog_ST_exp ) ); + IF( LT_32( L_tmp, msNoiseEst[p] ) ) { - msNoiseEst[p] = L_add( Mpy_32_16_1( msNoiseEst[p], CNA_ACT_DN_FACT_Q15 ), Mpy_32_16_1( L_tmp, (Word16) L_sub( ONE_IN_Q15, CNA_ACT_DN_FACT_Q15 ) ) ); + msNoiseEst[p] = L_add( Mpy_32_16_1( msNoiseEst[p], CNA_ACT_DN_FACT_Q15 ), Mpy_32_16_1( L_tmp, ONE_IN_Q15 - CNA_ACT_DN_FACT_Q15 ) ); move32(); } } diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index 5aef907a7..eef15da05 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -1377,7 +1377,7 @@ static void stereo_dft_generate_comfort_noise_fx( IF( ( st->hFdCngDec->smoothed_psd_fx[i] > 0 ) && GT_32( Mpy_32_16_1( ftmp, (Word16) 0x3333 ), L_shr_sat( st->hFdCngDec->smoothed_psd_fx[i], l_shift_val ) ) ) { /* prevent abrupt upward update steps */ - ftmp = L_add( L_shl( st->hFdCngDec->smoothed_psd_fx[i], 2 ), L_shr( st->hFdCngDec->smoothed_psd_fx[i], 1 ) ); + ftmp = L_add( L_shl( st->hFdCngDec->smoothed_psd_fx[i], 1 ), L_shr( st->hFdCngDec->smoothed_psd_fx[i], 1 ) ); l_shift_val = 0; move16(); } -- GitLab From a494932e69eba17e177b7e8c91948ddd5d345c2e Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 12 Jul 2024 09:24:21 +0200 Subject: [PATCH 068/110] add --odg arg to pytest call --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b4d7b432a..34b1755a4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -235,7 +235,7 @@ stages: ### run pytest - exit_code=0 - - python3 -m pytest --tb=no $TEST_SUITE -v --create_cut --html=report.html --self-contained-html --junit-xml=report-junit.xml --mld --ssnr --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || exit_code=$? + - python3 -m pytest --tb=no $TEST_SUITE -v --create_cut --html=report.html --self-contained-html --junit-xml=report-junit.xml --mld --ssnr --odg --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - python3 scripts/parse_xml_report.py report-junit.xml $MLD_ARTIFACT_NAME -- GitLab From e535eec7f0c1ed84dacb138bdf37bb7d01ddafc7 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 15 Jul 2024 11:25:15 +0530 Subject: [PATCH 069/110] ivas_front_vad_spar() functions/sub funcs, stereo mdct stereo enc funcs [x] Converted/Integrated the following functions and its sub functions in ivas_front_vad_spar(): noise_est_down(), correlation_shift(), dtx(), find_wsp(), StableHighPitchDetect(), multi_harm(), vad_param_updt(), ivas_smc_gmm(), ivas_long_enr() [x] In stereo mdct stereo encoder module, following functions are ported to fixed point: RCcontextMapping_encode2_estimate_bandWise, RCcontextMapping_encode2_estimate_bandWise_start, RCcontextMapping_encode2_estimate_no_mem_s17_LCS, find_last_nz_pair, IGFEncStereoEncoder, IGF_MsStereoDecision, calcCoh, FindSplitRatio, GetChannelEnergyRatio, MsStereoDecision, QuantSpecEstimateBits, SQ_gain_estimate_stereo, context_update, convertToBwMS, convertToMS, dft_ana_init, initMdctItdHandling, initMdctStereoEncData, ms_inv_mask_processing, ms_processing, stereo_coder_tcx, stereo_mdct_enc_destroy, write_itd_data, write_stereo_to_bitstream, tcx_scalar_quantization --- lib_com/ACcontextMapping.c | 23 + lib_com/cnst.h | 1 + lib_com/ivas_prot.h | 60 +- lib_com/ivas_prot_fx.h | 57 ++ lib_com/ivas_tools.c | 173 +++- lib_com/prot.h | 20 +- lib_com/prot_fx2.h | 34 + lib_com/swb_tbe_com_fx.c | 7 - lib_com/tools.c | 41 +- lib_enc/ACcontextMapping_enc.c | 637 ++++++++++++ lib_enc/core_enc_init.c | 4 + lib_enc/dtx_fx.c | 509 ++++++++- lib_enc/fd_cng_enc.c | 49 + lib_enc/find_wsp.c | 47 +- lib_enc/init_enc.c | 18 +- lib_enc/ivas_core_pre_proc_front.c | 3 + lib_enc/ivas_cpe_enc.c | 2 +- lib_enc/ivas_front_vad.c | 494 ++++++++- lib_enc/ivas_mct_enc_mct.c | 70 ++ lib_enc/ivas_rom_enc.c | 69 ++ lib_enc/ivas_rom_enc.h | 1 + lib_enc/ivas_sns_enc.c | 26 + lib_enc/ivas_stat_enc.h | 27 +- lib_enc/ivas_stereo_classifier.c | 9 +- lib_enc/ivas_stereo_mdct_core_enc.c | 87 ++ lib_enc/ivas_stereo_mdct_igf_enc.c | 278 ++++- lib_enc/ivas_stereo_mdct_stereo_enc.c | 1157 ++++++++++++++++++++- lib_enc/ivas_stereo_switching_enc.c | 4 + lib_enc/long_enr_fx.c | 124 ++- lib_enc/nois_est_fx.c | 1368 +++++++++++++++++++++++++ lib_enc/pitch_ol_fx.c | 1320 ++++++++++++++++++++++-- lib_enc/prot_fx_enc.h | 77 +- lib_enc/rom_enc.c | 423 +++++++- lib_enc/rom_enc.h | 17 + lib_enc/speech_music_classif.c | 12 +- lib_enc/speech_music_classif_fx.c | 816 +++++++++------ lib_enc/stat_enc.h | 82 +- lib_enc/tcx_utils_enc.c | 83 ++ 38 files changed, 7743 insertions(+), 486 deletions(-) diff --git a/lib_com/ACcontextMapping.c b/lib_com/ACcontextMapping.c index 07637ff32..54f5e18fe 100644 --- a/lib_com/ACcontextMapping.c +++ b/lib_com/ACcontextMapping.c @@ -47,6 +47,7 @@ *-------------------------------------------------------------------*/ /*! r: index of next coefficient */ +#ifndef IVAS_FLOAT_FIXED int16_t get_next_coeff_mapped_ivas( int16_t ii[2], /* i/o: coefficient indexes */ int32_t *pp, /* o : peak(1)/hole(0) indicator */ @@ -64,6 +65,28 @@ int16_t get_next_coeff_mapped_ivas( return hm_cfg->indexBuffer[*idx]; } +#else +Word16 get_next_coeff_mapped_ivas( + Word16 ii[2], /* i/o: coefficient indexes */ + Word32 *pp, /* o : peak(1)/hole(0) indicator */ + Word16 *idx, /* o : index in unmapped domain */ + CONTEXT_HM_CONFIG *hm_cfg /* i : HM configuration */ +) +{ + UWord32 p; + + p = s_and( sub( ii[1], hm_cfg->numPeakIndices ), sub( hm_cfg->indexBuffer[ii[1]], hm_cfg->indexBuffer[ii[0]] ) ); + p >>= sub( sizeof( p ) * 8, 1 ); + *pp = p; + move32(); + *idx = ii[p]; + move16(); + ii[p] = add( ii[p], 1 ); + move16(); + + return hm_cfg->indexBuffer[*idx]; +} +#endif /*-------------------------------------------------------------------* diff --git a/lib_com/cnst.h b/lib_com/cnst.h index e5dfef089..4bcab73ec 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -1919,6 +1919,7 @@ typedef enum _DCTTYPE #define N_SMC_MIXTURES 6 /* number of mixtures */ #define N_PCA_COEF 12 /* number of PCA components */ #define SMC_ST_MEAN_FACT 0.5 /* forgetting factor of short-term IIR mean filter */ +#define SMC_ST_MEAN_RSHIFT_FACT_FX 1 /* SMC_ST_MEAN_FACT equivalent right shift factor */ #define M_LSP_SPMUS 6 /* number of LSPs used in speech/music classifier */ #define NB_BANDS_SPMUS 15 diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 65b5e6c50..27ceb3c0b 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -720,7 +720,27 @@ int16_t ivas_smc_gmm( int16_t *high_lpn_flag, /* i/o: sp/mus LPN flag */ const int16_t flag_spitch /* i : flag to indicate very short stable pitch */ ); - +#ifdef IVAS_FLOAT_FIXED +/*! r: S/M decision (0=speech or noise,1=unclear,2=music) */ +Word16 ivas_smc_gmm_fx( + Encoder_State *st, /* i/o: state structure */ + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ + const Word16 Etot_fx, /* i : total frame energy */ + Word16 lsp_new_fx[M], /* i : LSPs in current frame TODO:For now removing 'const' to avoid warning */ + Word16 cor_map_sum_fx, /* i : correlation map sum (from multi-harmonic anal.) */ + Word32 epsP_fx[M + 1], /* i : LP prediciton error TODO:For now removing 'const' to avoid warning */ + Word32 PS_fx[], /* i : energy spectrum TODO:For now removing 'const' to avoid warning */ + const Word16 non_sta_fx, /* i : unbound non-stationarity */ + const Word16 relE_fx, /* i : relative frame energy */ + Word16 *high_lpn_flag, /* i/o: sp/mus LPN flag */ + const Word16 flag_spitch /* i : flag to indicate very short stable pitch */ + , + Word16 Qfact_PS, + Word16 Q_esp, + Word16 Qfact_PS_past +); +#endif void ivas_smc_mode_selection( Encoder_State *st, /* i/o: encoder state structure */ const int32_t element_brate, /* i : element bitrate */ @@ -2900,11 +2920,6 @@ ivas_error initMdctItdHandling( const int32_t input_Fs /* i : input sampling rate */ ); -ivas_error initMdctItdHandling_fx( - STEREO_MDCT_ENC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ - const Word32 input_Fs /* i : input sampling rate */ -); - void stereo_mdct_enc_destroy( STEREO_MDCT_ENC_DATA_HANDLE *hStereoMdct /* i/o: encoder MDCT stereo handle */ ); @@ -3195,10 +3210,12 @@ void parse_stereo_from_bitstream( ); #endif +#ifndef IVAS_FLOAT_FIXED void FindSplitRatio( CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ Encoder_State **sts /* i/o: Encoder state structure */ ); +#endif void ComputeSpectrumNoiseMeasure( const float *powerSpec, @@ -3514,6 +3531,20 @@ void v_add_inc_fx( const Word16 y_inc, /* i : increment for vector y[] */ const Word16 N /* i : Vector length */ ); +Word32 logsumexp_fx( + const Word32 x[], /* i : input array x */ + const Word16 x_e, + const Word16 N /* i : number of elements in array x */ +); +Word32 lin_interp32_fx( + const Word32 x, /* i : the value to be mapped */ + const Word32 x1, /* i : source range interval: low end */ + const Word32 y1, /* i : source range interval: high end */ + const Word32 x2, /* i : target range interval: low */ + const Word32 y2, /* i : target range interval: high */ + const Word16 flag_sat, /* i : flag to indicate whether to apply saturation */ + Word16 *Q_io /*i/o : i/o Q factor of the output*/ +); #endif void v_mult_inc( @@ -3622,8 +3653,15 @@ float dot_product_cholesky( Word32 dot_product_cholesky_fx( const Word32 *x, /* i : vector x */ const Word32 *A, /* i : Cholesky matrix A */ - const Word16 N /* i : vector & matrix size */ + const Word16 N /* i : vector & matrix size */ ); +Word32 dot_product_cholesky_fixed( + const Word32 *x, /* i : vector x */ + const Word32 *A, /* i : Cholesky matrix A */ + const Word16 N, /* i : vector & matrix size */ + const Word16 exp_x, + const Word16 exp_A, + Word16 *exp_sum ); #endif #ifdef IVAS_FLOAT_FIXED @@ -3637,6 +3675,14 @@ void v_mult_mat_fx( const Word16 N, /* i : number of rows */ const Word16 C /* i : number of columns */ ); +void v_mult_mat_fixed( + Word32 *y, /* o : the product x*A */ + const Word32 *x, /* i : vector x */ + const Word32 *A, /* i : matrix A */ + const Word16 Nr, /* i : number of rows */ + const Word16 Nc, /* i : number of columns */ + Word16 guardbits +); #endif void v_mult_mat( diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 6be57ae48..39e8de6a0 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -2445,4 +2445,61 @@ void ivas_ari_encode_14bits_ext_fx( Tastat *s, Word32 symbol, const UWord16 *cum_freq ); + +void ms_inv_mask_processing_fx( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT encoder structure */ + Encoder_State **sts, /* i/o: Encoder state structure */ + int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + const int16_t iSubframe, /* i : subframe number */ + const Word32 x_0_fx[], /* i : spectrum 1 */ + const Word32 x_1_fx[], /* i : spectrum 2 */ + Word32 x_inv_0_fx[], /* o : inverse spectrum 1 */ + Word32 x_inv_1_fx[], /* o : inverse spectrum 2 */ + int16_t maxSfb /* i : number of stereo frequency bands */ +); + +void ms_processing_fx( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ + Encoder_State **sts, /* i/o: Encoder state structure */ + Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + const int16_t iSubframe, /* i : subframe number */ + Word32 x_0_fx[], /* i/o: spectrum 1 */ + Word32 x_1_fx[], /* i/o: spectrum 1 */ + Word16 maxSfb /* i : number of stereo frequency bands*/ +); + +void convertToMS_fx( + const int16_t L_frame, /* i : frame length */ + Word32 x0[], /* i/o: mid/left channel coefficients */ + Word32 x1[], /* i/o: side/right channel coefficients */ + const Word32 norm_fac /* i : normalization factor */ +); + +void FindSplitRatio_fx( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + Encoder_State **sts /* i/o: Encoder state structure */ +); + +void IGFEncStereoEncoder_fx( + STEREO_MDCT_BAND_PARAMETERS *sfbParam, /* i/o: sfb parameters for the right channel */ + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : IGF handle */ + const Word32 *mdctSpectrumL_fx, /* i : left spectrum */ + const Word32 *mdctSpectrumR_fx, /* i : right spectrum */ + Word16 q_mdctSpectrum, + Word16 *msMask, /* i/o: MS mask */ + Word16 *igfStereoMode, /* o : IGF stereo mode */ + const Word16 mdct_stereo_mode, /* i : MDCT stereo mode */ + const Word16 isTCX20, /* i : flag for indicating TCX20 */ + const Word16 isTransition /* i : flag for transtition */ +); + +void stereo_coder_tcx_fx( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ + Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + Word32 *mdst_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i/o: MDST spectrum */ + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse spectrum */ + Word32 *inv_mdst_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ + const Word16 mct_on, /* i : flag mct block (1) or stereo (0) */ + Word16 q_spec ); #endif diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index e42efb441..f579e64fc 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -809,6 +809,27 @@ void v_sub_s16_fx( return; } #endif // IVAS_FLOAT_FIXED + + +#ifdef IVAS_FLOAT_FIXED +void v_sub32_fx( + const Word32 x1[], /* i : Input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 - vector 2 */ + const Word16 N /* i : Vector length */ +) +{ + Word16 i; + + FOR( i = 0; LT_16( i, N ); i++ ) + { + y[i] = L_sub( x1[i], x2[i] ); + } + + return; +} +#endif // IVAS_FLOAT_FIXED + void v_sub_s( const int16_t x1[], /* i : Input vector 1 */ const int16_t x2[], /* i : Input vector 2 */ @@ -855,7 +876,8 @@ float dot_product_cholesky( pt_x = x; for ( j = 0; j <= i; j++ ) { - tmp_sum += *pt_x++ * *pt_A++; + float mul = *pt_x++ * *pt_A++; + tmp_sum += mul; } suma += tmp_sum * tmp_sum; @@ -863,8 +885,73 @@ float dot_product_cholesky( return suma; } +#ifdef IVAS_FLOAT_FIXED +Word32 dot_product_cholesky_fixed( + const Word32 *x, /* i : vector x */ + const Word32 *A, /* i : Cholesky matrix A */ + const Word16 N, /* i : vector & matrix size */ + const Word16 exp_x, + const Word16 exp_A, + Word16 *exp_sum ) +{ + Word16 i, j; + Word32 suma, tmp_sum, mul; + const Word32 *pt_x, *pt_A; + Word16 mul_exp, tmp_sum_exp; + mul_exp = add( exp_x, exp_A ); + pt_A = A; + suma = 0; + move32(); + FOR( i = 0; i < N; i++ ) + { + tmp_sum = 0; + move32(); + tmp_sum_exp = 0; + move16(); + pt_x = x; + FOR( j = 0; j <= i; j++ ) + { + mul = Mpy_32_32( *pt_x++, *pt_A++ ); + tmp_sum = BASOP_Util_Add_Mant32Exp( tmp_sum, tmp_sum_exp, mul, mul_exp, &tmp_sum_exp ); // exp_x+exp_A + } + + suma = BASOP_Util_Add_Mant32Exp( suma, *exp_sum, Mpy_32_32( tmp_sum, tmp_sum ), shl( tmp_sum_exp, 1 ), exp_sum ); + } + + return suma; +} +#endif #ifdef IVAS_FLOAT_FIXED +void v_mult_mat_fixed( + Word32 *y, /* o : the product x*A */ + const Word32 *x, /* i : vector x */ + const Word32 *A, /* i : matrix A */ + const Word16 Nr, /* i : number of rows */ + const Word16 Nc, /* i : number of columns */ + Word16 guardbits ) +{ + Word16 i, j; + const Word32 *pt_x, *pt_A; + Word32 tmp_y[MAX_V_MULT_MAT]; + Word32 *pt_y; + + pt_y = tmp_y; + pt_A = A; + + FOR( i = 0; i < Nc; i++ ) + { + pt_x = x; + *pt_y = 0; + FOR( j = 0; j < Nr; j++ ) + { + *pt_y = L_add( *pt_y, L_shr( Mpy_32_32( ( *pt_x++ ), ( *pt_A++ ) ), guardbits ) ); + } + pt_y++; + } + + mvr2r_Word32( tmp_y, y, Nc ); +} Word32 dot_product_cholesky_fx( const Word32 *x, /* i : vector x */ const Word32 *A, /* i : Cholesky matrix A */ @@ -1045,14 +1132,98 @@ float logsumexp( return logf( sum ) + max_exp; } +#ifdef IVAS_FLOAT_FIXED +Word32 logsumexp_fx( + const Word32 x[], /* i : input array x */ + const Word16 x_e, + const Word16 N /* i : number of elements in array x */ +) +{ + Word32 max_exp, temp32_sub; + Word32 sum, temp32, pow_temp; + Word32 log2_e_fx = 1549082005; // Q30 of log2(e); + Word16 log2_e_fx_e = 1; + move16(); + move16(); + Word16 i; + Word16 pow_e, sum_e = 0; + move16(); + max_exp = x[0]; + move32(); + sum = 0; + move32(); + FOR( i = 1; i < N; i++ ) + { + IF( GT_32( x[i], max_exp ) ) + { + max_exp = x[i]; + move32(); + } + } + FOR( i = 0; i < N; i++ ) + { + temp32_sub = L_sub( x[i], max_exp ); + pow_e = 0; + move16(); + temp32 = Mpy_32_32( log2_e_fx, temp32_sub ); + pow_temp = BASOP_util_Pow2( temp32, add( x_e, log2_e_fx_e ), &pow_e ); + sum = BASOP_Util_Add_Mant32Exp( sum, sum_e, pow_temp, pow_e, &sum_e ); + } + temp32 = L_add( BASOP_Util_Log2( sum ), L_shl( sum_e, Q25 ) ); + temp32 = Mpy_32_32( temp32, 1488522239 ); /*logf(x) = log2(x)*logf(2)*/ + temp32 = L_add( L_shr( temp32, sub( x_e, 6 ) ), max_exp ); // q = 31-x_e + return temp32; +} +#endif /*---------------------------------------------------------------------* * lin_interp() * * Linearly maps x from source range to the target range *---------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +/*! r: mapped output value */ +Word32 lin_interp32_fx( + const Word32 x, /* i : the value to be mapped */ + const Word32 x1, /* i : source range interval: low end */ + const Word32 y1, /* i : source range interval: high end */ + const Word32 x2, /* i : target range interval: low */ + const Word32 y2, /* i : target range interval: high */ + const Word16 flag_sat, /* i : flag to indicate whether to apply saturation */ + Word16 *Q_io /*i/o : i/o Q factor of the output*/ +) +{ + Word32 temp32; + Word32 temp_div; + Word16 temp_e = 0; + Word16 exp_out = 0; + move16(); + move16(); + IF( L_sub( x2, x1 ) == 0 ) + { + return y1; + } + ELSE IF( flag_sat ) + { + IF( GE_32( x, L_max( x1, x2 ) ) ) + { + return GT_32( x1, x2 ) ? y1 : y2; + } + ELSE IF( LE_32( x, L_min( x1, x2 ) ) ) + { + return LT_32( x1, x2 ) ? y1 : y2; + } + } + temp32 = Mpy_32_32( L_sub( x, x1 ), L_sub( y2, y1 ) ); // Qin*2 -31 + temp_div = L_deposit_h( BASOP_Util_Divide3232_Scale( temp32, L_sub( x2, x1 ), &temp_e ) ); // 31-temp_e + 2*Qin -31 - Qin = Qin-temp_e + temp32 = BASOP_Util_Add_Mant32Exp( y1, sub( 31, *Q_io ), temp_div, sub( 31, sub( *Q_io, temp_e ) ), &exp_out ); // Qin-temp_e + *Q_io = sub( 31, exp_out ); + return temp32; +} + +#endif /*! r: mapped output value */ float lin_interp( const float x, /* i : the value to be mapped */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 7bfe52d3e..54444a92b 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -372,6 +372,12 @@ void v_sub_s16_fx( Word16 y[], /* o : Output vector that contains vector 1 - vector 2 */ const Word16 N /* i : Vector length */ ); +void v_sub32_fx( + const Word32 x1[], /* i : Input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 - vector 2 */ + const Word16 N /* i : Vector length */ +); #endif // IVAS_FLOAT_FIXED /*! r: index of the winning codeword */ @@ -3710,7 +3716,19 @@ void speech_music_classif( int16_t *high_lpn_flag, /* o : sp/mus LPN flag */ const int16_t flag_spitch /* i : flag to indicate very short stable pitch */ ); - +void ivas_find_wsp( + const Word16 L_frame, /* i : length of the frame */ + const Word16 L_subfr, /* i : length of subframe */ + const Word16 nb_subfr, /* i : number of subframes */ + const Word16 *A_fx, /* i : A(z) filter coefficients */ + Word16 *Aw_fx, /* o : weighted A(z) filter coefficients */ + const Word16 *speech_fx, /* i : pointer to the denoised speech frame */ + const Word16 tilt_fact, /* i : tilt factor */ + Word16 *wsp_fx, /* o : poitnter to the weighted speech frame */ + Word16 *mem_wsp_fx, /* i/o: W(Z) denominator memory */ + const Word16 gamma, /* i : weighting factor */ + const Word16 L_look /* i : look-ahead */ +); void find_wsp( const int16_t L_frame, /* i : length of the frame */ const int16_t L_subfr, /* i : length of subframe */ diff --git a/lib_com/prot_fx2.h b/lib_com/prot_fx2.h index c90e50f84..4f0a2cbbc 100644 --- a/lib_com/prot_fx2.h +++ b/lib_com/prot_fx2.h @@ -5631,6 +5631,14 @@ Word32 dotp_fixed_guarded( const Word32 y[], /* i : vector y[] */ const Word16 n /* i : vector length */ ); + +Word32 dotp_me_fx( + const Word32 x[], /* i : vector x[] */ + const Word32 y[], /* i : vector y[] */ + const Word16 n, /* i : vector length */ + Word16 exp_x, + Word16 exp_y, + Word16 *exp_suma ); #endif void lsf_end_dec_fx( @@ -9172,6 +9180,10 @@ Word32 sum2_f_16_fx( const Word16 *vec, /* i : input vector */ const Word16 lvec /* i : length of input vector */ ); +Word32 sum2_f_16_gb_fx( + const Word16 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word16 gb ); Word16 vq_dec_lvq_ivas_fx( Word16 sf_flag, /* i : safety net flag */ @@ -9252,3 +9264,25 @@ void ivas_mdct_core_reconstruct_fx( void ari_start_encoding_14bits_ivas_fx( Tastat *s ); + +void tcx_scalar_quantization_ivas_fx( + Word32 *x, /* i: input coefficients */ + Word16 x_e, /* i: exponent */ + Word16 *xq, /* o: quantized coefficients */ + Word16 L_frame, /* i: frame length */ + Word16 gain, /* i: quantization gain */ + Word16 gain_e, /* i: quantization gain exponent */ + Word16 offset, /* i: rounding offset (deadzone) */ + Word8 const *memQuantZeros_fx, /* i: coefficients to be set to 0 */ + const Word16 alfe_flag ); + +Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS( + Word16 *x, /* Spectral coefficients */ + const Word16 nt, /* L - size of spectrum (no. of spectral coefficients) */ + Word16 *lastnz_out, + Word16 *nEncoded, /* No. of spectral coefficients that can be coded without an overflow occuring */ + const Word16 target, /* Target bits */ + Word16 *stop, + Word16 mode, + CONTEXT_HM_CONFIG *hm_cfg /* context-based harmonic model configuration */ +); diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index fe77f4918..5b48dfada 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -897,13 +897,6 @@ static void filt_mu_fx( temp = add( temp, *ptrs ); /*Q12 */ #ifdef FIX_729_MISSING_RESCALING sig_out[n] = shl_o( mult_r( ga, temp ), 1, &Overflow ); -#ifdef DEBUGGING - if ( Overflow ) - { - fprintf( stderr, "Saturation in filt_mu_fx for ga = %d, temp = %d, result = %.2f at frame %d\n\n", ga, temp, (float) ga * temp * 4.0 / 65536.0, frame ); - Overflow = 0; - } -#endif #else sig_out[n] = shl( mult_r( ga, temp ), 1 ); #endif diff --git a/lib_com/tools.c b/lib_com/tools.c index 55d866a3e..4b1d12be2 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -197,6 +197,22 @@ Word32 sum2_f_16_fx( return tmp; } +Word32 sum2_f_16_gb_fx( + const Word16 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word16 gb ) +{ + int16_t i; + Word32 tmp; + + tmp = 0; + FOR( i = 0; i < lvec; i++ ) + { + tmp = L_add( tmp, L_shr( L_mult0( vec[i], vec[i] ), gb ) ); + } + + return tmp; +} #endif float sum2_f( const float *vec, /* i : input vector */ @@ -1087,6 +1103,28 @@ Word32 dotp_fixed( } #ifdef IVAS_FLOAT_FIXED +Word32 dotp_me_fx( + const Word32 x[], /* i : vector x[] */ + const Word32 y[], /* i : vector y[] */ + const Word16 n, /* i : vector length */ + Word16 exp_x, + Word16 exp_y, + Word16 *exp_suma ) +{ + Word16 i; + Word32 suma; + Word32 mul; + Word16 mul_exp = add( exp_x, exp_y ); + suma = Mpy_32_32( x[0], y[0] ); + *exp_suma = mul_exp; + FOR( i = 1; i < n; i++ ) + { + mul = Mpy_32_32( x[i], y[i] ); + suma = BASOP_Util_Add_Mant32Exp( suma, *exp_suma, mul, mul_exp, exp_suma ); // exp_x+exp_A + } + + return suma; +} Word32 dotp_fixed_guarded( const Word32 x[], /* i : vector x[] */ const Word32 y[], /* i : vector y[] */ @@ -1128,7 +1166,8 @@ Word32 dotp_fixed_o( *res_q = add( sub( *res_q, log_len ), 1 ); move16(); test(); - WHILE( GT_64( suma, MAX_32 ) || GT_16( *res_q, 31 ) ) + test(); + WHILE( GT_64( suma, MAX_32 ) || LT_64( suma, MIN_32 ) || GT_16( *res_q, 31 ) ) { suma = W_shr( suma, 1 ); *res_q = sub( *res_q, 1 ); diff --git a/lib_enc/ACcontextMapping_enc.c b/lib_enc/ACcontextMapping_enc.c index a83ae0aca..0f37e51de 100644 --- a/lib_enc/ACcontextMapping_enc.c +++ b/lib_enc/ACcontextMapping_enc.c @@ -371,6 +371,7 @@ void ACcontextMapping_encode2_no_mem_s17_LC( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static int16_t find_last_nz_pair( const int16_t x[], const int16_t length, @@ -413,6 +414,53 @@ static int16_t find_last_nz_pair( return last_nz; } +#else +static Word16 find_last_nz_pair( + const Word16 x[], + const Word16 length, + const CONTEXT_HM_CONFIG *hm_cfg ) +{ + Word16 last_nz, i; + const Word16 *tmp; + + last_nz = 2; + move16(); + + IF( hm_cfg ) + { + /* mapped kernel */ + tmp = hm_cfg->indexBuffer; + + FOR( i = length; i >= 4; i -= 2 ) + { + test(); + IF( x[tmp[i - 2]] || x[tmp[i - 1]] ) + { + last_nz = i; + move16(); + BREAK; + } + } + } + ELSE + { + /* unmapped kernel */ + + FOR( i = length; i >= 4; i -= 2 ) + { + test(); + IF( x[i - 2] || x[i - 1] ) + { + last_nz = i; + move16(); + BREAK; + } + } + } + + return last_nz; +} +#endif /*-------------------------------------------------------------------* @@ -1011,6 +1059,7 @@ void RCcontextMapping_encode2_no_mem_s17_LCS( * Range coder bit-estimation *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED int16_t RCcontextMapping_encode2_estimate_no_mem_s17_LCS( int16_t *x, /* Spectral coefficients */ const int16_t nt, /* L - size of spectrum (no. of spectral coefficients) */ @@ -1366,6 +1415,426 @@ int16_t RCcontextMapping_encode2_estimate_no_mem_s17_LCS( return tot_bits2; } } +#else +Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS( + Word16 *x, /* Spectral coefficients */ + const Word16 nt, /* L - size of spectrum (no. of spectral coefficients) */ + Word16 *lastnz_out, + Word16 *nEncoded, /* No. of spectral coefficients that can be coded without an overflow occuring */ + const Word16 target, /* Target bits */ + Word16 *stop, + Word16 mode, + CONTEXT_HM_CONFIG *hm_cfg /* context-based harmonic model configuration */ +) +{ + /* Common variables */ + Word16 a1, b1; + Word16 k, pki, lev1; + UWord16 t; + Word16 lastnz, lastnz2; + Word16 rateFlag; + Word32 bit_estimate_fx; + Word16 bit_estimate_e; + Word16 symbol; + const UWord8 *lookup; + Word32 nbits2_fx; // Q23 + Word16 nbits2_e; // Q23 + + /* Initialization */ + bit_estimate_fx = 2 * ONE_IN_Q29; + bit_estimate_e = 2; + move32(); + nbits2_fx = 0; + nbits2_e = 0; + move32(); + + /* bits to encode lastnz */ + k = 1; + move16(); + + WHILE( LT_16( k, nt / 2 ) ) + { + bit_estimate_fx = BASOP_Util_Add_Mant32Exp( bit_estimate_fx, bit_estimate_e, ONE_IN_Q30, 1, &bit_estimate_e ); + k = k << 1; + /* check while condition */ + } + + nbits2_fx = bit_estimate_fx; + nbits2_e = bit_estimate_e; + + IF( hm_cfg ) + { + Word16 a1_i, b1_i; + Word16 stop2; + Word16 total_output_bits; + Word16 nt_half; + Word32 c[2], *ctx; + Word32 p1, p2; + Word16 ii[2]; + Word16 idx1, idx2, idx; + Word16 numPeakIndicesOrig = 0, numHoleIndices = 0; /* only to avoid compiler warning */ + move16(); + move16(); + + /* Rate flag */ + IF( GT_16( target, 400 ) ) + { + rateFlag = 2 << NBITS_CONTEXT; /* Select context-A for higher bitrates */ + move16(); + } + ELSE + { + rateFlag = 0; /* Select context-B for lower bitrates */ + move16(); + } + + nt_half = shr( nt, 1 ); + move16(); + stop2 = 0; + move16(); + c[0] = c[1] = 0; + move32(); + move32(); + + /* Find last non-zero tuple in the mapped domain signal */ + lastnz = find_last_nz_pair( x, nt, hm_cfg ); + + lastnz2 = 2; + move16(); + + /* mapped domain */ + numPeakIndicesOrig = hm_cfg->numPeakIndices; + move16(); + hm_cfg->numPeakIndices = s_min( hm_cfg->numPeakIndices, lastnz ); + move16(); + numHoleIndices = sub( lastnz, hm_cfg->numPeakIndices ); + + /* Mark hole indices beyond lastnz as pruned */ + FOR( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k ) + { + hm_cfg->holeIndices[k] = add( hm_cfg->holeIndices[k], nt ); + move16(); + } + + ii[0] = numPeakIndicesOrig; + move16(); + ii[1] = 0; + move16(); + + p1 = p2 = 0; /* to avoid compilation warnings */ + move32(); + move32(); + + /* Main Loop through the 2-tuples */ + FOR( k = 0; k < lastnz; k += 2 ) + { + a1_i = get_next_coeff_mapped_ivas( ii, &p1, &idx1, hm_cfg ); + b1_i = get_next_coeff_mapped_ivas( ii, &p2, &idx2, hm_cfg ); + + idx = s_min( idx1, idx2 ); + + /* Get context */ + ctx = &c[L_or( p1, p2 )]; + + t = (UWord16) L_add( *ctx, rateFlag ); + IF( LT_16( nt_half, idx ) ) + { + t = add( t, ( 1 << NBITS_CONTEXT ) ); + } + + /* Init current 2-tuple encoding */ + a1 = (Word16) abs( x[a1_i] ); + b1 = (Word16) abs( x[b1_i] ); + lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); + + bit_estimate_fx = BASOP_Util_Add_Mant32Exp( bit_estimate_fx, bit_estimate_e, s_min( a1, 1 ) * ONE_IN_Q30, 1, &bit_estimate_e ); + bit_estimate_fx = BASOP_Util_Add_Mant32Exp( bit_estimate_fx, bit_estimate_e, s_min( b1, 1 ) * ONE_IN_Q30, 1, &bit_estimate_e ); + + /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */ + lookup = &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); + + /* check while condition */ + /* MSBs coding */ + WHILE( GE_16( s_max( a1, b1 ), A_THRES ) ) + { + pki = lookup[lev1]; /* ESC symbol */ + + bit_estimate_fx = BASOP_Util_Add_Mant32Exp( bit_estimate_fx, bit_estimate_e, ari_bit_estimate_s17_LC_fx[pki][VAL_ESC], 8, &bit_estimate_e ); + bit_estimate_fx = BASOP_Util_Add_Mant32Exp( bit_estimate_fx, bit_estimate_e, 2 * ONE_IN_Q29, 2, &bit_estimate_e ); /* Add 2 LSB bits corresponding to the bit-plane */ + + ( a1 ) = shr( a1, 1 ); + ( b1 ) = shr( b1, 1 ); + + lev1 = s_min( add( lev1, ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); + + /* check while condition */ + } + + pki = lookup[lev1]; + + symbol = add( a1, i_mult( A_THRES, b1 ) ); + bit_estimate_fx = BASOP_Util_Add_Mant32Exp( bit_estimate_fx, bit_estimate_e, ari_bit_estimate_s17_LC_fx[pki][symbol], 8, &bit_estimate_e ); + + /* Should we truncate? */ + IF( GT_32( L_shr( bit_estimate_fx, sub( Q16, bit_estimate_e ) ), L_shl( target, Q15 ) ) ) + { + stop2 = 1; + move16(); + + IF( *stop ) + { + BREAK; + } + } + ELSE + { + lastnz2 = add( b1_i, 1 ); + nbits2_fx = bit_estimate_fx; + move32(); + nbits2_e = bit_estimate_e; + move16(); + } + + /* Update context for next 2-tuple */ + IF( EQ_32( p1, p2 ) ) /* peak-peak or hole-hole context */ + { + lev1 = shr( lev1, NBITS_CONTEXT + NBITS_RATEQ ); + + IF( lev1 <= 0 ) + { + t = add( 1, i_mult( add( a1, b1 ), add( lev1, 2 ) ) ); + } + ELSE + { + t = add( 13, lev1 ); + } + + *ctx = L_add( imult3216( L_and( *ctx, 0xf ), 16 ), t ); + move32(); + } + ELSE + { + /* mixed context */ + + IF( s_and( idx1, 1 ) ) + { + /* update first context */ + c[p1] = update_mixed_context_ivas( c[p1], (int16_t) abs( x[a1_i] ) ); + move32(); + } + + IF( s_and( idx2, 1 ) ) + { + /* update second context */ + c[p2] = update_mixed_context_ivas( c[p2], (int16_t) abs( x[b1_i] ) ); + move32(); + } + } + + } /*end of the 2-tuples loop*/ + + total_output_bits = round_fx( L_shr( bit_estimate_fx, sub( Q15, bit_estimate_e ) ) ); + + IF( *stop ) + { + total_output_bits = round_fx( L_shr( nbits2_fx, sub( Q15, nbits2_e ) ) ); + } + + IF( stop2 ) + { + stop2 = total_output_bits; + move16(); + } + + *nEncoded = lastnz2; + move16(); + *stop = stop2; /* If zero, it means no overflow occured during bit-estimation */ + move16(); + *lastnz_out = lastnz; + move16(); + + /* Restore hole indices beyond lastnz */ + FOR( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k ) + { + hm_cfg->holeIndices[k] = sub( hm_cfg->holeIndices[k], nt ); + move16(); + } + hm_cfg->numPeakIndices = numPeakIndicesOrig; + move16(); + + return round_fx( L_add( L_shr( nbits2_fx, sub( Q15, nbits2_e ) ), ONE_IN_Q14 ) ); + } + ELSE /* if (!hm_cfg) */ + { + Word16 esc_nb, cp, rateQ; + UWord16 s; + Word16 tot_bits2; + Word16 overflow_flag = 0; + + /* Rate flag */ + IF( GT_16( target, 400 ) ) + { + rateFlag = 2; + move16(); + } + ELSE + { + rateFlag = 0; /* Select context-B for lower bitrates */ + move16(); + } + + t = 0; + move16(); + s = 0; + move16(); + cp = 0; + move16(); + lastnz = 1; + move16(); + lastnz2 = 0; + move16(); + tot_bits2 = 0; + move16(); + + /* Find last non-zero tuple in the mapped domain signal */ + FOR( lastnz = sub( nt, 2 ); lastnz >= 0; lastnz -= 2 ) + { + test(); + IF( ( x[lastnz] != 0 ) || ( x[lastnz + 1] != 0 ) ) + { + BREAK; + } + } + lastnz = add( lastnz, 2 ); + IF( LT_16( lastnz, 2 ) ) + { + lastnz = 2; /* At least one tuple is coded */ + move16(); + } + + lastnz2 = 2; + move16(); + + /* Main Loop through the 2-tuples */ + FOR( k = 0; k < lastnz; k += 2 ) + { + /* Init current 2-tuple encoding */ + a1 = abs_s( x[k] ); + b1 = abs_s( x[k + 1] ); + lev1 = 0; + move16(); + esc_nb = 0; + move16(); + rateQ = add( rateFlag, (Word16) GT_16( k, shr( nt, 1 ) ) ); + + bit_estimate_fx = BASOP_Util_Add_Mant32Exp( bit_estimate_fx, bit_estimate_e, s_min( a1, 1 ) * ONE_IN_Q30, 1, &bit_estimate_e ); + bit_estimate_fx = BASOP_Util_Add_Mant32Exp( bit_estimate_fx, bit_estimate_e, s_min( b1, 1 ) * ONE_IN_Q30, 1, &bit_estimate_e ); + + /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */ + lookup = &ari_lookup_s17_LC[t + shl( rateQ, NBITS_CONTEXT )]; + + /* check while condition */ + /* MSBs coding */ + WHILE( GE_16( s_max( a1, b1 ), A_THRES ) ) + { + pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; + + bit_estimate_fx = BASOP_Util_Add_Mant32Exp( bit_estimate_fx, bit_estimate_e, ari_bit_estimate_s17_LC_fx[pki][VAL_ESC], 8, &bit_estimate_e ); + bit_estimate_fx = BASOP_Util_Add_Mant32Exp( bit_estimate_fx, bit_estimate_e, 2 * ONE_IN_Q29, 2, &bit_estimate_e ); /* Add 2 LSB bits corresponding to the bit-plane */ + + ( a1 ) = shr( a1, 1 ); + ( b1 ) = shr( b1, 1 ); + + lev1 = add( lev1, 1 ); + esc_nb = s_min( lev1, 3 ); + + /* check while condition */ + } + + pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; + + symbol = add( a1, i_mult( A_THRES, b1 ) ); + bit_estimate_fx = BASOP_Util_Add_Mant32Exp( bit_estimate_fx, bit_estimate_e, ari_bit_estimate_s17_LC_fx[pki][symbol], 8, &bit_estimate_e ); + + /* Should we truncate? */ + IF( GT_32( L_shr( bit_estimate_fx, sub( Q16, bit_estimate_e ) ), L_shl( target, Q15 ) ) ) /* Overflow occured */ + { + overflow_flag = 1; + move16(); + } + ELSE + { + IF( abs_s( x[k] ) || abs_s( x[k + 1] ) ) /* No overflow & non-zero tuple */ + { + nbits2_fx = bit_estimate_fx; + nbits2_e = bit_estimate_e; + move32(); + lastnz2 = add( k, 2 ); + } + } + + /* Update context for next 2-tuple */ + IF( LT_16( esc_nb, 2 ) ) + { + cp = add( 1, i_mult( add( a1, b1 ), add( esc_nb, 1 ) ) ); + } + ELSE + { + cp = add( 12, esc_nb ); + } + /*shift old bits and replace last 4 bits*/ + s = ( s << 4 ) + cp; + t = ( s & 0xFF ); + + } /*end of the 2-tuples loop*/ + + tot_bits2 = round_fx( L_shr( nbits2_fx, sub( Q15, nbits2_e ) ) ); + IF( lastnz2 < lastnz ) /* Overflow occured because unable to code all tuples */ + { + overflow_flag = 1; + move16(); + } + IF( EQ_16( mode, -1 ) ) + { + tot_bits2 = round_fx( L_shr( bit_estimate_fx, sub( Q15, bit_estimate_e ) ) ); + } + IF( overflow_flag == 0 ) /* No overflow */ + { + *stop = 0; + move16(); + } + ELSE /* Overflow */ + { + IF( *stop ){ + *stop = tot_bits2; + move16(); + } + ELSE + { + *stop = round_fx( L_shr( bit_estimate_fx, sub( Q15, bit_estimate_e ) ) ); + move16(); + } +} + +*lastnz_out = lastnz; +move16(); +*nEncoded = lastnz2; +move16(); +/* Safety mechanism to avoid overflow */ +test(); +IF( EQ_16( lastnz2, 2 ) && EQ_16( overflow_flag, 1 ) ) +{ + FOR( k = 0; k < lastnz2; k++ ) + { + x[k] = 0; + move16(); + } +} + +return tot_bits2; +} +} +#endif /*-------------------------------------------------------------------* * RCcontextMapping_encode2_estimate_bandWise_start() @@ -1373,6 +1842,7 @@ int16_t RCcontextMapping_encode2_estimate_no_mem_s17_LCS( * Range coder - start bandwise bit-estimation *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED int16_t RCcontextMapping_encode2_estimate_bandWise_start( int16_t *x, const int16_t nt, @@ -1427,6 +1897,81 @@ int16_t RCcontextMapping_encode2_estimate_bandWise_start( return (int16_t) hContextMem->bit_estimate; } +#else +Word16 RCcontextMapping_encode2_estimate_bandWise_start( + Word16 *x, + const Word16 nt, + const Word16 target, + HANDLE_RC_CONTEXT_MEM hContextMem ) +{ + Word16 i, k; + + /* Rate flag */ + IF( GT_16( target, 400 ) ) + { + hContextMem->rateFlag = 2 << NBITS_CONTEXT; + move16(); + } + ELSE + { + hContextMem->rateFlag = 0; + move16(); + } + + hContextMem->bit_estimate_fx = 2; + move32(); + hContextMem->bit_estimate_e = Q31; + move16(); + + + /* Init */ + hContextMem->nt_half = shr( nt, 1 ); + move16(); + + /* bits to encode lastnz */ + k = 1; + move16(); + + WHILE( LT_16( k, hContextMem->nt_half ) ) + { + hContextMem->bit_estimate_fx = L_add( hContextMem->bit_estimate_fx, 1 ); + move32(); + + k = shl( k, 1 ); + /* check while condition */ + } + + /* bits to encode lastnz */ + hContextMem->nbits_old = extract_l( hContextMem->bit_estimate_fx ); + move16(); + + hContextMem->ctx = 0; + move16(); + hContextMem->lastnz = 2; + move16(); + + /* Find last non-zero tuple */ + + FOR( i = nt; i >= 4; i -= 2 ) + { + test(); + IF( x[i - 2] != 0 || x[i - 1] != 0 ) + { + hContextMem->lastnz = i; + move16(); + break; + } + } + Word16 tmp2 = extract_l( hContextMem->bit_estimate_fx ); + Word16 tmp = norm_l( hContextMem->bit_estimate_fx ); + hContextMem->bit_estimate_e = sub( Q31, tmp ); + move16(); + hContextMem->bit_estimate_fx = L_shl( hContextMem->bit_estimate_fx, tmp ); + move32(); + + return tmp2; +} +#endif /*-------------------------------------------------------------------* * RCcontextMapping_encode2_estimate_bandWise() @@ -1434,6 +1979,7 @@ int16_t RCcontextMapping_encode2_estimate_bandWise_start( * Range coder - bandwise bit-estimation *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED int16_t RCcontextMapping_encode2_estimate_bandWise( int16_t *x, const int16_t start_line, @@ -1515,3 +2061,94 @@ int16_t RCcontextMapping_encode2_estimate_bandWise( return bandBits; } +#else +Word16 RCcontextMapping_encode2_estimate_bandWise( + Word16 *x, + const Word16 start_line, + const Word16 end_line, + HANDLE_RC_CONTEXT_MEM hContextMem ) +{ + Word16 a1, b1, a1_i, b1_i; + Word16 k, pki, lev1; + UWord16 t; + Word16 bandBits = 0; + move16(); + Word16 total_output_bits; /* No. of bits after finalization */ + Word16 symbol; + const UWord8 *lookup; + Word16 idx; + + /* Main Loop through the 2-tuples */ + /*hContextMem->nt_half = end_line >> 1;*/ + FOR( k = start_line; k < min( hContextMem->lastnz, end_line ); k += 2 ) + { + a1_i = k; + move16(); + b1_i = add( k, 1 ); + + idx = k; + move16(); + + /* Get context */ + t = add( hContextMem->ctx, hContextMem->rateFlag ); + t = add( t, GE_16( hContextMem->nt_half, idx ) ? 0 : ( 1 << NBITS_CONTEXT ) ); + + /* Init current 2-tuple encoding */ + a1 = abs_s( x[a1_i] ); + b1 = abs_s( x[b1_i] ); + lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); + + /* Signs Bits */ + hContextMem->bit_estimate_fx = BASOP_Util_Add_Mant32Exp( hContextMem->bit_estimate_fx, hContextMem->bit_estimate_e, s_min( a1, 1 ) * ONE_IN_Q30, Q1, &hContextMem->bit_estimate_e ); + hContextMem->bit_estimate_fx = BASOP_Util_Add_Mant32Exp( hContextMem->bit_estimate_fx, hContextMem->bit_estimate_e, s_min( b1, 1 ) * ONE_IN_Q30, Q1, &hContextMem->bit_estimate_e ); + + /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */ + lookup = &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); + + /* check while condition */ + /* MSBs coding */ + WHILE( GE_16( s_max( a1, b1 ), A_THRES ) ) + { + pki = lookup[lev1]; + hContextMem->bit_estimate_fx = BASOP_Util_Add_Mant32Exp( hContextMem->bit_estimate_fx, hContextMem->bit_estimate_e, ari_bit_estimate_s17_LC_fx[pki][VAL_ESC], Q8, &hContextMem->bit_estimate_e ); + hContextMem->bit_estimate_fx = BASOP_Util_Add_Mant32Exp( hContextMem->bit_estimate_fx, hContextMem->bit_estimate_e, 2 * ONE_IN_Q29, Q2, &hContextMem->bit_estimate_e ); /* Add the 2 LSB bits that were shifted out */ + // hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC]; + // hContextMem->bit_estimate += 2; /* Add the 2 LSB bits that were shifted out */ + + ( a1 ) = shr( a1, 1 ); + ( b1 ) = shr( b1, 1 ); + + lev1 = s_min( add( lev1, ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); + /* check while condition */ + } + + pki = lookup[lev1]; + symbol = add( a1, i_mult( A_THRES, b1 ) ); /* MSB symbol */ + hContextMem->bit_estimate_fx = BASOP_Util_Add_Mant32Exp( hContextMem->bit_estimate_fx, hContextMem->bit_estimate_e, ari_bit_estimate_s17_LC_fx[pki][symbol], Q8, &hContextMem->bit_estimate_e ); + // hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][symbol]; + + /* Update context */ + lev1 = shr( lev1, NBITS_CONTEXT + NBITS_RATEQ ); + + IF( lev1 <= 0 ) + { + t = add( 1, i_mult( add( a1, b1 ), add( lev1, 2 ) ) ); + } + ELSE + { + t = add( 13, lev1 ); + } + + hContextMem->ctx = add( i_mult( s_and( hContextMem->ctx, 0xf ), 16 ), t ); + + } /*end of the 2-tuples loop*/ + total_output_bits = round_fx( L_shr( hContextMem->bit_estimate_fx, sub( Q15, hContextMem->bit_estimate_e ) ) ); + // total_output_bits = (Word16) ( hContextMem->bit_estimate + 0.5f ); + + bandBits = sub( total_output_bits, hContextMem->nbits_old ); + hContextMem->nbits_old = total_output_bits; + move16(); + + return bandBits; +} +#endif diff --git a/lib_enc/core_enc_init.c b/lib_enc/core_enc_init.c index 74a0f62e6..e84ed8f3a 100644 --- a/lib_enc/core_enc_init.c +++ b/lib_enc/core_enc_init.c @@ -257,6 +257,10 @@ static void init_tcx( /* Share the memories for 2xTCX10/4xTCX5 and for TCX20 */ hTcxEnc->spectrum[0] = hTcxEnc->spectrum_long; hTcxEnc->spectrum[1] = hTcxEnc->spectrum_long + N_TCX10_MAX; +#ifdef IVAS_FLOAT_FIXED + hTcxEnc->spectrum_fx[0] = hTcxEnc->spectrum_long_fx; + hTcxEnc->spectrum_fx[1] = hTcxEnc->spectrum_long_fx + N_TCX10_MAX; +#endif init_tcx_cfg( st->hTcxCfg, total_brate, st->sr_core, st->input_Fs, st->L_frame, st->bwidth, hTcxEnc->L_frameTCX, st->fscale, st->encoderLookahead_enc, st->encoderLookahead_FB, st->preemph_fac_flt, st->tcxonly, st->rf_mode, st->igf, st->hIGFEnc != NULL ? st->hIGFEnc->infoStopFrequency : 0, st->element_mode, st->ini_frame, MCT_flag ); diff --git a/lib_enc/dtx_fx.c b/lib_enc/dtx_fx.c index 2043d082f..aa3bd7fd6 100644 --- a/lib_enc/dtx_fx.c +++ b/lib_enc/dtx_fx.c @@ -4,14 +4,14 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -//#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" #include "rom_com.h" -//#include "basop_mpy.h" +// #include "basop_mpy.h" #include #include "prot_fx1.h" /* Function prototypes */ #include "prot_fx2.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ +#include "prot.h" /*-------------------------------------------------------------------* * Local constants @@ -34,6 +34,7 @@ /* _DIFF_FLOAT_FIX_ : lp_noise_fx threshold is different between float (15) and fix (5*256) */ #define LP_NOISE_LV 5 /* LP_NOISE level */ + #define MAX_BRATE_DTX_EVS ACELP_24k40 /* maximum bitrate to which the default DTX is applied in EVS; otherwise DTX is applied only in silence */ #define MAX_BRATE_DTX_IVAS IVAS_64k /* maximum bitrate to which the default DTX is applied in IVAS; otherwise DTX is applied only in silence */ @@ -42,7 +43,511 @@ *-------------------------------------------------------------------*/ static void update_SID_cnt( DTX_ENC_HANDLE hDtxEnc, const Word32 core_brate, const Word16 Opt_AMR_WB ); +/*==================================================================================*/ +/* FUNCTION : dtx_ivas_fx() */ +/*----------------------------------------------------------------------------------*/ +/* PURPOSE : Discontinuous transmission operation */ +/*----------------------------------------------------------------------------------*/ +/* INPUT ARGUMENTS : */ +/* _ (Encoder_State_Fx) st_fx : encoder state structure */ +/* _ (Word16) vad : vad flag Q0 */ +/* _ (Word16[]) speech_fx : Pointer to the speech frame qSpeech */ +/* _ (Word16) qSpeech : speech buffer qformat value */ +/* _ (Word16*) qener : frame_ener/lt_ener_voiced/lt_ener_noise buf qformat */ +/*----------------------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16*) qener : frame_ener/lt_ener_voiced/lt_ener_noise buf qformat */ +/* _ (Encoder_State_Fx) st_fx : encoder state structure */ +/*----------------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*==================================================================================*/ +void dtx_ivas_fx( + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 vad, /* i : vad flag for DTX */ + const Word16 speech[] /* i : Pointer to the speech frame */ + +) +{ + Word16 alpha; + Word32 L_tmp; + DTX_ENC_HANDLE hDtxEnc = st_fx->hDtxEnc; + TD_CNG_ENC_HANDLE hTdCngEnc = st_fx->hTdCngEnc; + + Word16 last_br_cng_flag, last_br_flag, br_dtx_flag; + + IF( st_fx->dtx_sce_sba != 0 ) + { + last_br_cng_flag = 1; + last_br_flag = 1; + br_dtx_flag = 1; + move16(); + move16(); + move16(); + } + ELSE + { + /* _DIFF_FLOAT_FIX_ : lp_noise_fx threshold is different between float (15) and fix (5*256) */ + last_br_cng_flag = LE_32( st_fx->last_total_brate_cng, ACELP_24k40 ) || LT_16( st_fx->lp_noise_fx, LP_NOISE_LV * 256 ) || ( EQ_16( st_fx->element_mode, IVAS_SCE ) && LE_32( st_fx->last_total_brate_cng, ACELP_32k ) ); + + last_br_flag = LE_32( st_fx->last_total_brate, ACELP_24k40 ) || LT_16( st_fx->lp_noise_fx, LP_NOISE_LV * 256 ) || ( EQ_16( st_fx->element_mode, IVAS_SCE ) && LE_32( st_fx->last_total_brate, ACELP_32k ) ); + br_dtx_flag = 0; + move16(); + } + /* Initialization */ + IF( st_fx->ini_frame == 0 ) + { + st_fx->active_fr_cnt_fx = CNG_TYPE_HO; + move16(); + + st_fx->cng_type = FD_CNG; + move16(); + test(); + if ( ( EQ_16( st_fx->codec_mode, MODE1 ) || st_fx->Opt_AMR_WB ) && EQ_16( st_fx->element_mode, IVAS_SCE ) && EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + { + st_fx->cng_type = LP_CNG; + move16(); + } + } + test(); + test(); + IF( st_fx->Opt_DTX_ON && vad == 0 && + GT_16( st_fx->ini_frame, 2 ) && /* CNG coding starts after 2 frames */ + st_fx->fd_cng_reset_flag == 0 && + NE_16( st_fx->last_core, AMR_WB_CORE ) && + st_fx->Opt_AMR_WB == 0 ) + { + test(); + test(); + test(); + IF( GT_32( st_fx->last_core_brate, SID_2k40 ) && NE_32( st_fx->last_total_brate_cng, -1 ) && + NE_32( st_fx->last_total_brate_cng, st_fx->total_brate ) && last_br_cng_flag ) + { + st_fx->total_brate = st_fx->last_total_brate_cng; + move32(); + test(); + if ( !( EQ_32( st_fx->total_brate, ACELP_7k20 ) && st_fx->Opt_SC_VBR ) ) + { + st_fx->Opt_SC_VBR = 0; + move16(); + } + st_fx->rf_mode = st_fx->last_rf_mode_cng; + move16(); + st_fx->bwidth = st_fx->last_bwidth_cng; + move16(); + st_fx->codec_mode = st_fx->last_codec_mode_cng; + move16(); + } + test(); + test(); + IF( LE_32( st_fx->last_core_brate, SID_2k40 ) && NE_32( st_fx->last_total_brate, st_fx->total_brate ) && last_br_flag ) + + { + st_fx->total_brate = st_fx->last_total_brate; + move32(); + test(); + if ( !( EQ_32( st_fx->total_brate, ACELP_7k20 ) && st_fx->Opt_SC_VBR ) ) + { + st_fx->Opt_SC_VBR = 0; + move16(); + } + + st_fx->Opt_RF_ON = 0; + move16(); + test(); + test(); + test(); + if ( st_fx->rf_mode && st_fx->rf_fec_offset > 0 && EQ_32( st_fx->total_brate, ACELP_13k20 ) && NE_16( st_fx->bwidth, NB ) ) + { + st_fx->Opt_RF_ON = 1; + move16(); + } + st_fx->rf_mode = st_fx->Opt_RF_ON; + move16(); + st_fx->bwidth = st_fx->last_bwidth; + move32(); + IF( GT_16( st_fx->element_mode, EVS_MONO ) ) + { + st_fx->codec_mode = MODE1; + move16(); + } + ELSE + { + st_fx->codec_mode = get_codec_mode( st_fx->total_brate ); + } + } + } + + /*------------------------------------------------------------------------* + * Select SID or FRAME_NO_DATA frame if DTX is enabled + *------------------------------------------------------------------------*/ + if ( st_fx->dtx_sce_sba == 0 ) + { +#if 0 + br_dtx_flag = LE_32( st_fx->total_brate, ACELP_24k40 ) || LT_16( st_fx->lp_noise_fx, LP_NOISE_LV * 256 ) || ( EQ_16( st_fx->element_mode, IVAS_SCE ) && LE_32( st_fx->total_brate, ACELP_32k ) ) || + EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) || ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && ( LE_32( st_fx->element_brate, IVAS_64k ) || LT_16( st_fx->lp_noise_fx, 15 * 256 ) ) ); +#else + br_dtx_flag = ( EQ_16( st_fx->element_mode, EVS_MONO ) && LE_32( st_fx->total_brate, MAX_BRATE_DTX_EVS ) ) || + ( NE_16( st_fx->element_mode, EVS_MONO ) && LE_32( ivas_total_brate, MAX_BRATE_DTX_IVAS ) ) || + LT_16( st_fx->lp_noise_fx, shl( 15, Q8 ) ); +#endif + } + test(); + test(); + test(); + test(); + IF( st_fx->Opt_DTX_ON && vad == 0 && + GT_16( st_fx->ini_frame, 2 ) && /* CNG coding starts after 2 frames */ + br_dtx_flag && + st_fx->fd_cng_reset_flag == 0 ) + { + /* reset counter */ + st_fx->active_fr_cnt_fx = 0; + move16(); + + IF( st_fx->Opt_AMR_WB ) + { + st_fx->last_total_brate_cng = -1; + st_fx->last_rf_mode_cng = st_fx->rf_mode; + move16(); + } + ELSE + { + st_fx->last_total_brate_cng = st_fx->total_brate; + st_fx->last_bwidth_cng = st_fx->bwidth; + st_fx->last_codec_mode_cng = st_fx->codec_mode; + } + + IF( hDtxEnc->cnt_SID == 0 ) + { + /* this will be a SID frame */ + IF( st_fx->Opt_AMR_WB ) + { + st_fx->core_brate = SID_1k75; + move32(); + } + ELSE + { + st_fx->core_brate = SID_2k40; + move32(); + } + } + ELSE + { + /* this will be a no data frame */ + st_fx->core_brate = FRAME_NO_DATA; + move32(); + } + + test(); + test(); + IF( EQ_32( st_fx->core_brate, FRAME_NO_DATA ) && NE_16( st_fx->last_core, ACELP_CORE ) && !st_fx->Opt_AMR_WB ) + { + /* force SID frame when switching from HQ core or AMR-WB IO mode into inactive frame in ACELP core when DTX is on */ + st_fx->core_brate = SID_2k40; + move32(); + } + // PMT("dtx_sce_sba code is missing") + IF( ( NE_16( st_fx->last_core, ACELP_CORE ) || EQ_16( st_fx->cng_type, FD_CNG ) ) && EQ_16( st_fx->dtx_sce_sba, 1 ) ) + { + st_fx->cng_type = FD_CNG; + move16(); + if ( EQ_16( st_fx->element_mode, EVS_MONO ) && ( EQ_32( st_fx->total_brate, ACELP_9k60 ) || EQ_32( st_fx->total_brate, ACELP_16k40 ) || EQ_32( st_fx->total_brate, ACELP_24k40 ) || EQ_32( st_fx->total_brate, ACELP_48k ) || EQ_32( st_fx->total_brate, HQ_96k ) || EQ_32( st_fx->total_brate, HQ_128k ) ) ) + { + st_fx->codec_mode = MODE2; + move16(); + } + } + ELSE + { + test(); + test(); + test(); + test(); + IF( ( EQ_16( st_fx->cng_type, FD_CNG ) && ( LE_32( st_fx->total_brate, ACELP_24k40 ) || ( NE_16( st_fx->element_mode, EVS_MONO ) && LE_32( st_fx->total_brate, ACELP_32k ) ) ) ) || ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) ) /* at highest bitrates, use exclusively LP_CNG */ + { + test(); + test(); + IF( EQ_16( st_fx->element_mode, EVS_MONO ) && ( EQ_32( st_fx->total_brate, ACELP_9k60 ) || EQ_32( st_fx->total_brate, ACELP_16k40 ) || EQ_32( st_fx->total_brate, ACELP_24k40 ) ) ) + { + st_fx->codec_mode = MODE2; + move16(); + } + } + ELSE + { + st_fx->cng_type = LP_CNG; + move16(); + IF( st_fx->codec_mode == MODE2 ) + { + hTdCngEnc->lp_cng_mode2 = 1; + move16(); + } + st_fx->codec_mode = MODE1; + move16(); + } + } + /* reset the bitstream (IVAS format signalling was already written) */ + IF( NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) && st_fx->hBstr != NULL ) + { + reset_indices_enc( st_fx->hBstr, st_fx->hBstr->nb_ind_tot ); + } + } + + /*------------------------------------------------------------------------* + * Reset counters when in active frame (not in SID or FRAME_NO_DATA frame) + *------------------------------------------------------------------------*/ + /* NB core bit rate can be "-1" at startup , so one can not use core_brate_fx <=2400 */ + test(); + test(); + IF( ( NE_32( st_fx->core_brate, SID_2k40 ) ) && ( NE_32( st_fx->core_brate, SID_1k75 ) ) && ( NE_32( st_fx->core_brate, FRAME_NO_DATA ) ) ) + { + IF( hDtxEnc != NULL ) + { + hDtxEnc->cnt_SID = 0; + move16(); + + /* change SID update rate */ + /* first SID update is only 8 (3) frames after the active speech end */ + IF( !st_fx->Opt_AMR_WB ) + { + hDtxEnc->max_SID = FIXED_SID_RATE; + move16(); + } + ELSE + { + hDtxEnc->max_SID = 3; + move16(); /* first SID update is only 3 frames after the active speech end */ + } + + IF( LT_16( hDtxEnc->interval_SID, hDtxEnc->max_SID ) ) + { + hDtxEnc->max_SID = hDtxEnc->interval_SID; + move16(); /* change SID update rate */ + } + + hDtxEnc->cng_cnt = 0; + move16(); /* reset the counter of CNG frames for averaging */ + } + test(); + IF( GE_16( st_fx->active_fr_cnt_fx, CNG_TYPE_HO ) && st_fx->Opt_AMR_WB == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + { + IF( EQ_16( st_fx->element_mode, IVAS_SCE ) ) + { + Word32 lp_thresh, fd_thresh; + // PMT( "lp_thresh scaling is to be found" ) + test(); + IF( st_fx->Opt_DTX_ON && EQ_16( st_fx->dtx_sce_sba, 1 ) ) + { + lp_thresh = L_shl( 5, Q27 ); + fd_thresh = L_shl( 2, Q27 ); + } + ELSE + + { + lp_thresh = L_shl( 10, Q27 ); + fd_thresh = L_shl( 5, Q27 ); + } + + /*More conservative selection of LP-CNG for SCE*/ + if ( st_fx->cng_type == LP_CNG && ( st_fx->bckr_tilt_lt > lp_thresh ) ) + { + st_fx->cng_type = FD_CNG; + } + else if ( st_fx->cng_type == FD_CNG && ( st_fx->bckr_tilt_lt < fd_thresh ) && ( st_fx->lp_noise > L_shl( 2, Q27 ) ) ) + { + st_fx->cng_type = LP_CNG; + } + } + ELSE + { + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( EQ_16( st_fx->cng_type, LP_CNG ) && ( ( EQ_16( st_fx->input_bwidth, NB ) && GT_32( st_fx->bckr_tilt_lt, 589824l /*9.f Q16*/ ) ) || ( GT_16( st_fx->input_bwidth, NB ) && GT_32( st_fx->bckr_tilt_lt, 2949120l /*45.f Q16*/ ) ) ) ) + { + st_fx->cng_type = FD_CNG; + move16(); + } + ELSE IF( EQ_16( st_fx->cng_type, FD_CNG ) && ( ( EQ_16( st_fx->input_bwidth, NB ) && LT_32( st_fx->bckr_tilt_lt, 131072l /*2.f Q16*/ ) ) || ( GT_16( st_fx->input_bwidth, NB ) && LT_32( st_fx->bckr_tilt_lt, 655360l /*10.f Q16*/ ) ) ) ) + { + st_fx->cng_type = LP_CNG; + move16(); + } + } + st_fx->last_total_brate_cng = -1; + } + ELSE IF( st_fx->Opt_AMR_WB ) + { + st_fx->cng_type = LP_CNG; + move16(); + } + st_fx->active_fr_cnt_fx = add( st_fx->active_fr_cnt_fx, 1 ); + st_fx->active_fr_cnt_fx = s_min( st_fx->active_fr_cnt_fx, 200 ); + } + + /*------------------------------------------------------------------------* + * Update speech and background noise long-term energy + *------------------------------------------------------------------------*/ + IF( hDtxEnc != NULL ) + { + hDtxEnc->frame_ener_fx = L_deposit_l( 0 ); + + IF( st_fx->Opt_DTX_ON ) + { +#if 0 + Q_speech2 = add( shl( Q_speech, 1 ), 7 ); + FOR( j = 0; j < 16; j++ ) + { + L_tmp = L_mult0( *speech, *speech ); + speech++; + FOR( i = 1; i < L_FRAME / 16; i++ ) + { +#ifdef BASOP_NOGLOB + L_tmp = L_mac0_o( L_tmp, *speech, *speech, &Overflow ); +#else /* BASOP_NOGLOB */ + L_tmp = L_mac0( L_tmp, *speech, *speech ); +#endif /* BASOP_NOGLOB */ + speech++; + } + hDtxEnc->frame_ener_fx = L_add( hDtxEnc->frame_ener_fx, L_shr( L_tmp, Q_speech2 ) ); /*Q(-7) */ + + } +#endif + // hDtxEnc->frame_ener = sum2_f( speech, L_FRAME ); + Word16 guard_bits = find_guarded_bits_fx( L_FRAME ); + // Word16 Q_frame_ener = 2 * Q_speech; + hDtxEnc->frame_ener_fx = sum2_f_16_gb_fx( speech, L_FRAME, guard_bits ); // 2*Q_speech-guard_bits + + /* Active speech (voiced) */ + + IF( EQ_16( st_fx->clas, VOICED_CLAS ) ) + { + alpha = ALPHA_ENER_SLOW_FX; + move16(); + if ( GT_32( hDtxEnc->frame_ener_fx, hDtxEnc->lt_ener_voiced_fx ) ) + { + alpha = ALPHA_ENER_FAST_FX; + move16(); /*Q15 */ + } + + /*st_fx->lt_ener_voiced_fx = alpha * st_fx->lt_ener_voiced_fx + (1.0f-alpha) * st_fx->frame_ener_fx;*/ + L_tmp = L_sub( hDtxEnc->lt_ener_voiced_fx, hDtxEnc->frame_ener_fx ); + L_tmp = Mult_32_16( L_tmp, alpha ); + hDtxEnc->lt_ener_voiced_fx = L_add( L_tmp, hDtxEnc->frame_ener_fx ); /*2*Q_speech-guard_bits */ + + hDtxEnc->VarDTX_cnt_voiced = add( hDtxEnc->VarDTX_cnt_voiced, 1 ); + + hDtxEnc->VarDTX_cnt_voiced = s_min( hDtxEnc->VarDTX_cnt_voiced, MIN_CNT ); + } + /* Background noise */ + ELSE IF( !st_fx->Opt_AMR_WB ) + { + alpha = ALPHA_ENER_SLOW_FX; + move16(); + if ( LT_32( hDtxEnc->frame_ener_fx, hDtxEnc->lt_ener_noise_fx ) ) + { + alpha = ALPHA_ENER_FAST_FX; + move16(); + } + + /*st_fx->lt_ener_noise_fx = alpha * st_fx->lt_ener_noise_fx + (1.0f-alpha) * st_fx->frame_ener_fx;*/ + L_tmp = L_sub( hDtxEnc->lt_ener_noise_fx, hDtxEnc->frame_ener_fx ); + L_tmp = Mult_32_16( L_tmp, alpha ); + hDtxEnc->lt_ener_noise_fx = L_add( L_tmp, hDtxEnc->frame_ener_fx ); + move32(); /*2*Q_speech-guard_bits */ + + hDtxEnc->VarDTX_cnt_noise = add( hDtxEnc->VarDTX_cnt_noise, 1 ); + + hDtxEnc->VarDTX_cnt_noise = s_min( hDtxEnc->VarDTX_cnt_noise, MIN_CNT ); + } + } + } + + /* Update of the SID counter */ + update_SID_cnt( hDtxEnc, st_fx->core_brate, st_fx->Opt_AMR_WB ); + + /* Update encoded bandwidth */ + test(); + test(); + IF( st_fx->Opt_DTX_ON && ( st_fx->core_brate == SID_2k40 || st_fx->core_brate == FRAME_NO_DATA ) ) + { + + st_fx->bwidth = st_fx->last_bwidth; + move16(); + test(); + if ( GT_32( st_fx->last_core_brate, SID_2k40 ) && NE_32( st_fx->last_total_brate_cng, -1 ) ) + { + st_fx->bwidth = st_fx->last_bwidth_cng; + move16(); + } + + test(); + test(); + IF( st_fx->Opt_RF_ON && ( EQ_32( st_fx->total_brate, ACELP_13k20 ) ) && ( EQ_16( st_fx->bwidth, NB ) ) ) + { + st_fx->codec_mode = MODE1; + move16(); + reset_rf_indices_fx( st_fx ); + st_fx->Opt_RF_ON = 0; + move16(); + st_fx->rf_mode = 0; + move16(); + } + + test(); + test(); + IF( st_fx->Opt_RF_ON && NE_32( st_fx->total_brate, ACELP_13k20 ) ) + { + reset_rf_indices_fx( st_fx ); + move16(); + st_fx->Opt_RF_ON = 0; + move16(); + st_fx->rf_mode = 0; + } + + /* Set and limit the encoded bandwidth */ + IF( EQ_16( st_fx->codec_mode, MODE2 ) ) + { + Word16 n, bits_frame_nominal; + + UWord16 lsb; + Word16 tmpbandwidthMin; + + Mpy_32_16_ss( st_fx->total_brate, 5243, &L_tmp, &lsb ); /* 5243 is 1/50 in Q18. (0+18-15=3) */ + bits_frame_nominal = extract_l( L_shr( L_tmp, 3 ) ); /* Q0 */ + + FOR( n = 0; n < FRAME_SIZE_NB; n++ ) + { + IF( EQ_16( FrameSizeConfig[n].frame_bits, bits_frame_nominal ) ) + { + BREAK; + } + } + if ( n == FRAME_SIZE_NB ) + { + assert( !"Bitrate not supported: not part of EVS" ); + } + tmpbandwidthMin = FrameSizeConfig[n].bandwidth_min; + if ( EQ_16( st_fx->rf_mode, 1 ) ) + { + tmpbandwidthMin = WB; + } + st_fx->bwidth = s_max( s_min( st_fx->bwidth, FrameSizeConfig[n].bandwidth_max ), tmpbandwidthMin ); + } + } + + return; +} /*==================================================================================*/ /* FUNCTION : dtx_fx() */ diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index fad93012f..d54d787f2 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -41,7 +41,9 @@ #include "rom_enc.h" #include "rom_com.h" #include "prot.h" +#include "prot_fx2.h" #include "ivas_prot.h" +#include "ivas_prot_fx.h" #include "stat_enc.h" #include "wmc_auto.h" @@ -1036,7 +1038,19 @@ void FdCngEncodeMDCTStereoSID( /* M/S transform on log envelopes */ if ( is_inp_ms == 0 ) { +#ifndef IVAS_FLOAT_FIXED convertToMS( N, ms_ptr[0], ms_ptr[1], 0.5f ); +#else + Word32 ms_ptr_fx[2][NPART]; + Word16 q = s_min( Q_factor_arrL( ms_ptr[0], N ), Q_factor_arrL( ms_ptr[1], N ) ) - 1; + floatToFixed_arrL( ms_ptr[0], ms_ptr_fx[0], q, N ); + floatToFixed_arrL( ms_ptr[1], ms_ptr_fx[1], q, N ); + + convertToMS_fx( N, ms_ptr_fx[0], ms_ptr_fx[1], ONE_IN_Q30 ); + + fixedToFloat_arrL( ms_ptr_fx[0], ms_ptr[0], q, N ); + fixedToFloat_arrL( ms_ptr_fx[1], ms_ptr[1], q, N ); +#endif } side_energy = sum2_f( ms_ptr[1], N ); @@ -1125,7 +1139,19 @@ void FdCngEncodeMDCTStereoSID( /* undo M/S */ if ( is_inp_ms == 0 ) { +#ifndef IVAS_FLOAT_FIXED convertToMS( N, ms_ptr[0], ms_ptr[1], 1.0f ); +#else + Word32 ms_ptr_fx[2][NPART]; + Word16 q = s_min( Q_factor_arrL( ms_ptr[0], N ), Q_factor_arrL( ms_ptr[1], N ) ) - 1; + floatToFixed_arrL( ms_ptr[0], ms_ptr_fx[0], q, N ); + floatToFixed_arrL( ms_ptr[1], ms_ptr_fx[1], q, N ); + + convertToMS_fx( N, ms_ptr_fx[0], ms_ptr_fx[1], ONE_IN_Q31 ); + + fixedToFloat_arrL( ms_ptr_fx[0], ms_ptr[0], q, N ); + fixedToFloat_arrL( ms_ptr_fx[1], ms_ptr[1], q, N ); +#endif } /* Compute gain against original left and right channels */ @@ -1260,7 +1286,19 @@ void FdCngEncodeDiracMDCTStereoSID( } /* M/S transform on log envelopes */ +#ifndef IVAS_FLOAT_FIXED convertToMS( N[0], ms_ptr[0], ms_ptr[1], 0.5f ); +#else + Word32 ms_ptr_fx[2][NPART]; + Word16 q = s_min( Q_factor_arrL( ms_ptr[0], N[0] ), Q_factor_arrL( ms_ptr[1], N[0] ) ) - 1; + floatToFixed_arrL( ms_ptr[0], ms_ptr_fx[0], q, N[0] ); + floatToFixed_arrL( ms_ptr[1], ms_ptr_fx[1], q, N[0] ); + + convertToMS_fx( N[0], ms_ptr_fx[0], ms_ptr_fx[1], ONE_IN_Q30 ); + + fixedToFloat_arrL( ms_ptr_fx[0], ms_ptr[0], q, N[0] ); + fixedToFloat_arrL( ms_ptr_fx[1], ms_ptr[1], q, N[0] ); +#endif E[0] = sum_f( ms_ptr[0], N[0] ); @@ -1309,7 +1347,18 @@ void FdCngEncodeDiracMDCTStereoSID( gain[1] = gain[0]; /* undo M/S */ +#ifndef IVAS_FLOAT_FIXED convertToMS( NPART, ms_ptr[0], ms_ptr[1], 1.0f ); +#else + q = s_min( Q_factor_arrL( ms_ptr[0], NPART ), Q_factor_arrL( ms_ptr[1], NPART ) ) - 1; + floatToFixed_arrL( ms_ptr[0], ms_ptr_fx[0], q, NPART ); + floatToFixed_arrL( ms_ptr[1], ms_ptr_fx[1], q, NPART ); + + convertToMS_fx( NPART, ms_ptr_fx[0], ms_ptr_fx[1], ONE_IN_Q31 ); + + fixedToFloat_arrL( ms_ptr_fx[0], ms_ptr[0], q, NPART ); + fixedToFloat_arrL( ms_ptr_fx[1], ms_ptr[1], q, NPART ); +#endif /* restore channel noise envelopes */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) diff --git a/lib_enc/find_wsp.c b/lib_enc/find_wsp.c index d38fd99d8..fb9efa29b 100644 --- a/lib_enc/find_wsp.c +++ b/lib_enc/find_wsp.c @@ -39,13 +39,12 @@ #include "cnst.h" #include "prot.h" #include "wmc_auto.h" - +#include "prot_fx2.h" /*-------------------------------------------------------------------* * find_wsp() * * Compute weighted speech used in open-loop pitch search *-------------------------------------------------------------------*/ - void find_wsp( const int16_t L_frame, /* i : length of the frame */ const int16_t L_subfr, /* i : length of subframe */ @@ -93,3 +92,47 @@ void find_wsp( return; } +void ivas_find_wsp( + const Word16 L_frame, /* i : length of the frame */ + const Word16 L_subfr, /* i : length of subframe */ + const Word16 nb_subfr, /* i : number of subframes */ + const Word16 *A_fx, /* i : A(z) filter coefficients */ + Word16 *Aw_fx, /* o : weighted A(z) filter coefficients */ + const Word16 *speech_fx, /* i : pointer to the denoised speech frame */ + const Word16 tilt_fact, /* i : tilt factor */ + Word16 *wsp_fx, /* o : poitnter to the weighted speech frame */ + Word16 *mem_wsp_fx, /* i/o: W(Z) denominator memory */ + const Word16 gamma, /* i : weighting factor */ + const Word16 L_look /* i : look-ahead */ +) +{ + Word16 *p_Aw_fx, tmp_fx; + Word16 i_subfr; + + + /*-----------------------------------------------------------------* + * Compute weighted A(z) unquantized for subframes + *-----------------------------------------------------------------*/ + weight_a_subfr_fx( nb_subfr, A_fx, Aw_fx, gamma, M ); + + /*-----------------------------------------------------------------* + * Compute weighted speech for all subframes + *-----------------------------------------------------------------*/ + p_Aw_fx = Aw_fx; + for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_subfr ) + { + Residu3_fx( p_Aw_fx, &speech_fx[i_subfr], &wsp_fx[i_subfr], L_subfr, 0 ); + p_Aw_fx += ( M + 1 ); + } + p_Aw_fx -= ( M + 1 ); + + /*-----------------------------------------------------------------* + * Weighted speech computation is extended on look-ahead + *-----------------------------------------------------------------*/ + + deemph_fx( wsp_fx, tilt_fact, L_frame, mem_wsp_fx ); + Residu3_fx( p_Aw_fx, &speech_fx[L_frame], &wsp_fx[L_frame], L_look, 0 ); + tmp_fx = *mem_wsp_fx; + deemph_fx( &wsp_fx[L_frame], tilt_fact, L_look, &tmp_fx ); + return; +} diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 98d86d096..f0e08363a 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -277,7 +277,13 @@ ivas_error init_encoder( st->predecision_flag = 0; st->diff_sm = 0; st->energy_sm = 0; - +#ifdef IVAS_FLOAT_FIXED + st->voicing0_sm_fx = 0; + st->voicing_sm_fx = 0; + st->LF_EnergyRatio_sm_fx = ONE_IN_Q7; + st->diff_sm_fx = 0; + st->energy_sm_fx = 0; +#endif set_s( st->pitch, L_SUBFR, 3 ); set_f( st->voicing, 0.0f, 3 ); @@ -488,6 +494,9 @@ ivas_error init_encoder( st->fd_cng_reset_flag = 0; st->cng_type = -1; st->bckr_tilt_lt_flt = 0.f; +#ifdef IVAS_FLOAT_FIXED + st->bckr_tilt_lt = 0; +#endif st->active_cnt = 0; if ( ( ( idchan == 0 && st->Opt_DTX_ON ) || st->element_mode == EVS_MONO ) || ( st->element_mode == IVAS_CPE_MDCT && st->Opt_DTX_ON ) ) @@ -497,6 +506,9 @@ ivas_error init_encoder( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DTX variables\n" ) ); } dtx_enc_init( st, var_SID_rate_flag, interval_SID ); +#ifdef IVAS_FLOAT_FIXED + dtx_enc_init_fx( st, var_SID_rate_flag, interval_SID ); +#endif } else { @@ -790,6 +802,10 @@ ivas_error init_encoder( /* Share the memories for 2xTCX10/4xTCX5 and for TCX20 */ st->hTcxEnc->spectrum[0] = st->hTcxEnc->spectrum_long; st->hTcxEnc->spectrum[1] = st->hTcxEnc->spectrum_long + N_TCX10_MAX; +#ifdef IVAS_FLOAT_FIXED + st->hTcxEnc->spectrum_fx[0] = st->hTcxEnc->spectrum_long_fx; + st->hTcxEnc->spectrum_fx[1] = st->hTcxEnc->spectrum_long_fx + N_TCX10_MAX; +#endif set_f( st->hTcxEnc->old_out, 0, L_FRAME32k ); diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index 48dff1e9c..45cce0aed 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -44,6 +44,9 @@ #include "wmc_auto.h" #include +#ifdef IVAS_FLOAT_FIXED +#include "prot_fx_enc.h" +#endif /*---------------------------------------------------------------* * Local constants diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 316d279da..cfd4348cb 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -1290,7 +1290,7 @@ ivas_error create_cpe_enc_fx( IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && LE_32( element_brate, MAX_MDCT_ITD_BRATE ) && EQ_16( ivas_format, STEREO_FORMAT ) ) { - IF( ( error = initMdctItdHandling_fx( hCPE->hStereoMdct, input_Fs ) ) != IVAS_ERR_OK ) + IF( ( error = initMdctItdHandling( hCPE->hStereoMdct, input_Fs ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_front_vad.c b/lib_enc/ivas_front_vad.c index 65748bfba..9e7eafdcd 100644 --- a/lib_enc/ivas_front_vad.c +++ b/lib_enc/ivas_front_vad.c @@ -43,7 +43,10 @@ #include #include "wmc_auto.h" #include - +#ifdef IVAS_FLOAT_FIXED +#include "prot_fx_enc.h" +#include "prot_fx2.h" +#endif /*-----------------------------------------------------------------------------------------* * Function front_vad() @@ -323,8 +326,8 @@ ivas_error front_vad_create_fx( hFrontVad->lp_speech_fx = 23040; /* Initialize the long-term active speech level in dB */ hFrontVad->lp_noise_fx = 0; /* Initialize the long-term noise level in dB */ - set32_fx( hFrontVad->mem_decim_fx, 0, shl( L_FILT_MAX, 1 ) ); - set32_fx( hFrontVad->buffer_12k8_fx, 0, i_mult( 3, shr( L_FRAME, 1 ) ) ); + set16_fx( hFrontVad->mem_decim_fx, 0, shl( L_FILT_MAX, 1 ) ); + set16_fx( hFrontVad->buffer_12k8_fx, 0, i_mult( 3, shr( L_FRAME, 1 ) ) ); hFrontVad->mem_preemph_fx = 0; hFrontVad->ini_frame = 0; hFrontVad->hVAD->vad_flag = 1; @@ -384,7 +387,490 @@ void front_vad_destroy( * * Standalone front-VAD module for SPAR *-----------------------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error front_vad_spar( + SPAR_ENC_HANDLE hSpar, /* i/o: SPAR encoder structure */ + const float *omni_in, /* i : omnidirectional input signal */ + ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ + const int16_t input_frame /* i : input frame length */ +) +{ + FRONT_VAD_ENC_HANDLE hFrontVad; + float input[L_FRAME48k]; + int16_t vad_flag_dtx[1]; + float fr_bands[1][2 * NB_BANDS]; + Word32 fr_bands_fx[1][2 * NB_BANDS] = { { 0 } }; + float Etot[1]; + Word16 Etot_fx[1]; + float lf_E[1][2 * VOIC_BINS]; + + int16_t localVAD_HE_SAD[1]; + int16_t vad_hover_flag[1]; + float band_energies[2 * NB_BANDS]; + int16_t high_lpn_flag; + Encoder_State *st; + float tmpN[NB_BANDS], tmpE[NB_BANDS]; + Word32 tmpN_fx[NB_BANDS] = { 0 }; + Word32 tmpE_fx[NB_BANDS] = { 0 }; + float corr_shift; + float dummy, res_energy; + Word16 corr_shift_fx; +#if 1 + + // Word32 res_energy_fx; + Word16 A_fx[NB_SUBFR16k * ( M + 1 )], Aw_fx[NB_SUBFR16k * ( M + 1 )]; + +// Word32 epsP_fx[M + 1]; +// Word16 epsP_h[M + 1]; +// Word16 epsP_l[M + 1]; +// Word16 alw_voicing_fx[2]; +// Word16 lsp_new_fx[M]; +// Word16 lsp_mid_fx[M]; +#endif + float A[NB_SUBFR16k * ( M + 1 )], Aw[NB_SUBFR16k * ( M + 1 )]; + float epsP[M + 1]; + float lsp_new[M]; + float lsp_mid[M]; + int16_t alw_pitch_lag_12k8[2]; + float alw_voicing[2]; + float cor_map_sum; + float ncharX; + float sp_div; + float non_staX; + int16_t loc_harm; + float S_map[L_FFT / 2]; +#if 1 + + + // Word32 lf_E_fx[1][2 * VOIC_BINS]; + + + // Word16 non_staX_fx; +#endif + + // Word16 sp_floor; + // Word16 sp_div_fx; + // Word16 Q_sp_div; + Word16 cor_map_sum_fx; + Word16 dummy_fx; + Word16 S_map_fx[L_FFT / 2]; + // Word16 relE_fx; + Word16 *wsp_fx; + float *inp_12k8; +#if 1 + Word16 *inp_12k8_fx; +#endif + float old_wsp[L_WSP]; + Word16 old_wsp_fx[L_WSP]; + float *wsp; + + float relE; + + int16_t flag_spitch; + float PS[L_FRAME / 2]; + int16_t old_pitch; + ivas_error error; +#ifdef DUMP_VAD_SPAR + FILE *fptmpN_fl = fopen( "tmpN_fl.txt", "ab+" ); + FILE *fptmpE_fl = fopen( "tmpE_fl.txt", "ab+" ); + FILE *fpbckr_fl = fopen( "bckr_fl.txt", "ab+" ); + + FILE *fptmpN_fx = fopen( "tmpN_fx.txt", "ab+" ); + FILE *fptmpE_fx = fopen( "tmpE_fx.txt", "ab+" ); + FILE *fpbckr_fx = fopen( "bckr_fx.txt", "ab+" ); +#endif +#if 1 + FILE *fp_pitch = fopen( "fp_pitch.txt", "ab+" ); + FILE *fp_voice = fopen( "fp_voice.txt", "ab+" ); + /* FILE *fpbckr_fl = fopen( "bckr_fl.txt", "ab+" ); + + FILE *fptmpN_fx = fopen( "tmpN_fx.txt", "ab+" ); + FILE *fptmpE_fx = fopen( "tmpE_fx.txt", "ab+" ); + FILE *fpbckr_fx = fopen( "bckr_fx.txt", "ab+" );*/ +#endif + push_wmops( "front_vad_SPAR" ); + error = IVAS_ERR_OK; + hFrontVad = hSpar->hFrontVad; + st = hSpar->hCoreCoderVAD; + + if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_total_brate <= SBA_DTX_BITRATE_THRESHOLD ) + { + /*------------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + inp_12k8 = hFrontVad->buffer_12k8; + Word16 Q_bands = Q31; +#if 1 + Word16 Q_inp_12k8 = Q10; +#endif +#if 1 + inp_12k8_fx = hFrontVad->buffer_12k8_fx; + +#endif + mvr2r( st->old_wsp, old_wsp, L_WSP_MEM ); + floatToFixed_arr( st->old_wsp, st->old_wsp_fx, Q10, L_WSP_MEM ); + floatToFixed_arr( st->old_wsp2, st->old_wsp2_fx, Q10, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ); + floatToFixed_arr( st->mem_decim2, st->mem_decim2_fx, Q10, 3 ); + // st->mem_wsp_fx = (Word16) floatToFixed( st->mem_wsp, Q_inp_12k8 ); + + mvr2r_Word16( st->old_wsp_fx, old_wsp_fx, L_WSP_MEM ); + wsp = old_wsp + L_WSP_MEM; + wsp_fx = old_wsp_fx + L_WSP_MEM; + + st->core_brate = -1; /* updated in dtx() */ + st->input_bwidth = st->last_input_bwidth; + + /*------------------------------------------------------------------* + * compensate for SPAR filterbank delay + *-----------------------------------------------------------------*/ + + st->input = input; + mvr2r( omni_in, st->input, input_frame ); + + delay_signal_float( st->input, input_frame, hFrontVad->delay_buf, hFrontVad->delay_samples ); + + /*------------------------------------------------------------------* + * Front-VAD + *-----------------------------------------------------------------*/ + + if ( ( error = front_vad( NULL, st, hEncoderConfig, &hFrontVad, 0 /* MCT_flag */, input_frame, vad_flag_dtx, fr_bands, Etot, lf_E, localVAD_HE_SAD, vad_hover_flag, band_energies, &PS[0], &st->Bin_E[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + Q_bands = Q10; + // floatToFixed_arr( inp_12k8, inp_12k8_fx, Q_inp_12k8, 3 * L_FRAME / 2 ); + // Q_bands = Q_factor_arrL( fr_bands[0], 2 * NB_BANDS ); + floatToFixed_arrL( fr_bands[0], fr_bands_fx[0], Q_bands + QSCALE, 2 * NB_BANDS ); + floatToFixed_arrL( hFrontVad->hNoiseEst->bckr, hFrontVad->hNoiseEst->bckr_fx, Q_bands + QSCALE, NB_BANDS ); + floatToFixed_arrL( tmpE, tmpE_fx, Q_bands + QSCALE, NB_BANDS ); + hFrontVad->hNoiseEst->totalNoise_fx = (Word16) ( hFrontVad->hNoiseEst->totalNoise * ONE_IN_Q8 ); + Etot_fx[0] = (Word16) ( Etot[0] * ONE_IN_Q8 ); + hFrontVad->hNoiseEst->Etot_last_fx = (Word16) ( hFrontVad->hNoiseEst->Etot_last * ONE_IN_Q8 ); + hFrontVad->hNoiseEst->Etot_v_h2_fx = (Word16) ( hFrontVad->hNoiseEst->Etot_v_h2 * ONE_IN_Q8 ); + noise_est_down_fx( fr_bands_fx[0], hFrontVad->hNoiseEst->bckr_fx, tmpN_fx, tmpE_fx, st->min_band, st->max_band, &hFrontVad->hNoiseEst->totalNoise_fx, Etot_fx[0], &hFrontVad->hNoiseEst->Etot_last_fx, &hFrontVad->hNoiseEst->Etot_v_h2_fx, Q_bands, Q_bands + QSCALE ); + // noise_est_down( fr_bands[0], hFrontVad->hNoiseEst->bckr, tmpN, tmpE, st->min_band, st->max_band, &hFrontVad->hNoiseEst->totalNoise, Etot[0], &hFrontVad->hNoiseEst->Etot_last, &hFrontVad->hNoiseEst->Etot_v_h2 ); +#ifdef DUMP_VAD_SPAR + for ( Word16 i = 0; i < 20; i++ ) + { + fprintf( fptmpN_fl, "%f\n", tmpN[i] ); + fprintf( fptmpE_fl, "%f\n", tmpE[i] ); + fprintf( fpbckr_fl, "%f\n", hFrontVad->hNoiseEst->bckr[i] ); + } +#endif + // fixedToFloat_arrL( fr_bands_fx[0], fr_bands[0], Q_bands, 2 * NB_BANDS ); + fixedToFloat_arrL( hFrontVad->hNoiseEst->bckr_fx, hFrontVad->hNoiseEst->bckr, Q_bands + Q7, NB_BANDS ); + hFrontVad->hNoiseEst->totalNoise = (float) hFrontVad->hNoiseEst->totalNoise_fx / ONE_IN_Q8; + fixedToFloat_arrL( tmpN_fx, tmpN, Q_bands + QSCALE, 20 ); + fixedToFloat_arrL( tmpE_fx, tmpE, Q_bands + QSCALE, 20 ); + // Etot[0] = (float) Etot_fx[0] / ONE_IN_Q8; + hFrontVad->hNoiseEst->Etot_last = (float) hFrontVad->hNoiseEst->Etot_last_fx / ONE_IN_Q8; + hFrontVad->hNoiseEst->Etot_v_h2 = (float) hFrontVad->hNoiseEst->Etot_v_h2_fx / ONE_IN_Q8; +#ifdef DUMP_VAD_SPAR + for ( Word16 i = 0; i < 20; i++ ) + { + fprintf( fptmpN_fx, "%f\n", tmpN[i] ); + fprintf( fptmpE_fx, "%f\n", tmpE[i] ); + fprintf( fpbckr_fx, "%f\n", hFrontVad->hNoiseEst->bckr[i] ); + } +#endif + // corr_shift = correlation_shift( hFrontVad->hNoiseEst->totalNoise ); + corr_shift_fx = correlation_shift_fx( hFrontVad->hNoiseEst->totalNoise_fx ); + corr_shift = fixedToFloat( corr_shift_fx, Q15 ); +#if 1 + Q_inp_12k8 = Q9; // Q_factor_arr( inp_12k8, 3 * L_FRAME / 2 ); + floatToFixed_arr( inp_12k8, inp_12k8_fx, Q_inp_12k8, 3 * L_FRAME / 2 ); + // Q_lp_noise = Q_factor( st->lp_noise ); + st->lp_noise_fx = (Word16) floatToFixed( st->lp_noise, Q8 ); + dtx_ivas_fx( st, hEncoderConfig->ivas_total_brate, vad_flag_dtx[0], inp_12k8_fx ); + Word16 guard_bits = find_guarded_bits_fx( L_FRAME ); + IF( st->Opt_DTX_ON ) + { + st->hDtxEnc->frame_ener = fixedToFloat( st->hDtxEnc->frame_ener_fx, 2 * Q_inp_12k8 - guard_bits ); // 2*Q_speech + } +#else + dtx( st, hEncoderConfig->ivas_total_brate, vad_flag_dtx[0], inp_12k8 ); +#endif + /* linear prediction analysis */ + alw_pitch_lag_12k8[0] = st->old_pitch_la; + alw_pitch_lag_12k8[1] = st->old_pitch_la; + alw_voicing[0] = st->voicing[2]; + alw_voicing[1] = st->voicing[2]; +#if 1 + analy_lp( inp_12k8, L_FRAME, L_LOOK_12k8, &res_energy, A, epsP, lsp_new, lsp_mid, st->lsp_old1, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, 0 /* <-- sec_chan_low_rate */ ); +#else + // analy_lp( inp_12k8, L_FRAME, L_LOOK_12k8, &res_energy, A, epsP, lsp_new, lsp_mid, st->lsp_old1, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, 0 /* <-- sec_chan_low_rate */ ); + + Word16 Q_r[2] = { 0 }; + floatToFixed_arr( st->lsp_old1, st->lsp_old1_fx, Q15, M ); + floatToFixed_arr( alw_voicing, alw_voicing_fx, Q15, 2 ); + Q_inp_12k8 = Q12; // Q_factor_arr( inp_12k8 - 90, 3 * L_FRAME / 2 + 90 ); + floatToFixed_arr( inp_12k8 - 90, inp_12k8_fx - 90, Q_inp_12k8, 3 * L_FRAME / 2 + 90 ); + analy_lp_fx( inp_12k8_fx, L_FRAME, L_LOOK_12k8, &res_energy_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, 0 /* <-- sec_chan_low_rate */, Q_inp_12k8, Q_r ); + for ( Word16 i = 0; i <= M; i++ ) + { + epsP_fx[i] = L_Comp( epsP_h[i], epsP_l[i] ); + } + fixedToFloat_arrL( epsP_fx, epsP, Q_r[0] - 24, M + 1 ); + fixedToFloat_arr( A_fx, A, Q14, NB_SUBFR16k * ( M + 1 ) ); + fixedToFloat_arr( lsp_new_fx, lsp_new, Q15, M ); + fixedToFloat_arr( lsp_mid_fx, lsp_mid, Q15, M ); + fixedToFloat_arr( st->lsp_old1_fx, st->lsp_old1, Q15, M ); + fixedToFloat_arr( st->mem_decim2_fx, st->mem_decim2, Q12, 3 ); + +#endif + relE = Etot[0] - st->lp_speech; +#if 0 + find_wsp( L_FRAME, L_SUBFR, NB_SUBFR, A, Aw, inp_12k8, TILT_FAC, wsp, &st->mem_wsp, GAMMA1_FLT, L_LOOK_12k8 ); +#else + + Q_inp_12k8 = Q9; // Q_factor_arr( inp_12k8-M, (3 * L_FRAME / 2)+M ); + floatToFixed_arr( inp_12k8 - M, inp_12k8_fx - M, Q_inp_12k8, ( 3 * L_FRAME / 2 ) + M ); + floatToFixed_arr( A, A_fx, Q12, NB_SUBFR16k * ( M + 1 ) ); + st->mem_wsp_fx = (Word16) floatToFixed( st->mem_wsp, Q_inp_12k8 ); + // find_wsp_fx( A_fx, inp_12k8_fx, wsp_fx, &st->mem_wsp_fx, TILT_FAC_FX, L_FRAME, L_LOOK_12k8, L_SUBFR, Aw_fx, GAMMA1, NB_SUBFR ); + ivas_find_wsp( L_FRAME, L_SUBFR, NB_SUBFR, A_fx, Aw_fx, inp_12k8_fx, TILT_FAC_FX, wsp_fx, &st->mem_wsp_fx, GAMMA1, L_LOOK_12k8 ); + fixedToFloat_arr( wsp_fx, wsp, Q_inp_12k8, 368 ); + fixedToFloat_arr( Aw_fx, Aw, Q12, NB_SUBFR16k * ( M + 1 ) ); + // st->mem_wsp = fixedToFloat( st->mem_wsp_fx, Q_inp_12k8 ); +#endif + + if ( st->vad_flag == 0 ) + { + /* reset the OL pitch tracker memories during inactive frames */ +#if 1 + pitch_ol_init( &st->old_thres, &st->old_pitch, &st->delta_pit, &st->old_corr ); +#else + pitch_ol_init_fx( &st->old_thres_fx, &st->old_pitch, &st->delta_pit, &st->old_corr_fx ); +#endif + } + + old_pitch = st->pitch[1]; +#if 0 + floatToFixed_arr( st->voicing, st->voicing_fx, Q15,3 ); + floatToFixed_arr( wsp, wsp_fx, Q12, 368 ); + floatToFixed_arr( st->old_wsp2, st->old_wsp2_fx, Q12, 115 ); + floatToFixed_arr( st->mem_decim2, st->mem_decim2_fx, Q12, 3 ); + // st->old_corr_fx = (Word16)floatToFixed( st->old_corr, Q15 ); + corr_shift_fx = (Word16)floatToFixed( corr_shift, Q15); + // st->old_thres_fx = (Word16) floatToFixed( st->old_thres, Q15 ); + relE_fx = (Word16) floatToFixed( relE, Q8 ); + pitch_ol_ivas_fx( st->pitch, st->voicing_fx, &st->old_pitch, &st->old_corr_fx, corr_shift_fx, &st->old_thres_fx, &st->delta_pit, st->old_wsp2_fx, wsp_fx, st->mem_decim2_fx, relE_fx, st->clas, st->input_bwidth, st->Opt_SC_VBR ); + + //pitch_ol( st->pitch, st->voicing, &st->old_pitch, &st->old_corr, corr_shift, &st->old_thres, &st->delta_pit, st->old_wsp2, wsp, st->mem_decim2, relE, L_LOOK_12k8, st->clas, st->input_bwidth, st->Opt_SC_VBR ); + + fixedToFloat_arr( st->voicing_fx, st->voicing, Q15, 3 ); + fixedToFloat_arr( st->old_wsp2_fx, st->old_wsp2, Q12, 115 ); + fixedToFloat_arr( st->mem_decim2_fx, st->mem_decim2, Q12, 3 ); + st->old_corr = fixedToFloat( st->old_corr_fx, Q15 ); + // corr_shift_fx = floatToFixed( corr_shift, Q15 ); + st->old_thres = fixedToFloat( st->old_thres_fx, Q15 ); + //st->old_thres_fx = floatToFixed( relE, Q8 ); + for ( Word16 i = 0; i < 3; i++ ) + { + fprintf( fp_pitch, "%d\n", st->pitch[i] ); + fprintf( fp_voice, "%f\n", st->voicing[i] ); + + } + // fprintf( fpbckr_fl, "%f\n", hFrontVad->hNoiseEst->bckr[i] ); +#else + pitch_ol( st->pitch, st->voicing, &st->old_pitch, &st->old_corr, corr_shift, &st->old_thres, &st->delta_pit, st->old_wsp2, wsp, st->mem_decim2, relE, L_LOOK_12k8, st->clas, st->input_bwidth, st->Opt_SC_VBR ); +#endif + /* Updates for adaptive lag window memory */ + st->old_pitch_la = st->pitch[2]; +#if 0 + /* Detection of very short stable pitch period */ + StableHighPitchDetect( &flag_spitch, st->pitch, st->voicing, st->Bin_E, wsp, st->localVAD, &st->voicing_sm, &st->voicing0_sm, &st->LF_EnergyRatio_sm, &st->predecision_flag, &st->diff_sm, &st->energy_sm ); +#else + // StableHighPitchDetect( &flag_spitch, st->pitch, st->voicing, st->Bin_E, wsp, st->localVAD, &st->voicing_sm, &st->voicing0_sm, &st->LF_EnergyRatio_sm, &st->predecision_flag, &st->diff_sm, &st->energy_sm ); + floatToFixed_arr( wsp, wsp_fx, Q9, 368 ); + floatToFixed_arr( st->voicing, st->voicing_fx, Q15, 3 ); + floatToFixed_arr( st->Bin_E, st->lgBin_E_fx, Q7, 128 ); + StableHighPitchDetect_fx( &flag_spitch, st->pitch, st->voicing_fx, wsp_fx, st->localVAD, &st->voicing_sm_fx, &st->voicing0_sm_fx, &st->LF_EnergyRatio_sm_fx, &st->predecision_flag, &st->diff_sm_fx, &st->energy_sm_fx, Q12, st->lgBin_E_fx ); + fixedToFloat_arr( st->lgBin_E_fx, st->Bin_E, Q7, 128 ); + st->LF_EnergyRatio_sm = fixedToFloat( st->LF_EnergyRatio_sm_fx, Q7 ); + st->voicing_sm = fixedToFloat( st->voicing_sm_fx, Q15 ); + st->voicing0_sm = fixedToFloat( st->voicing0_sm_fx, Q15 ); +#endif + if ( st->hSpMusClas != NULL ) + { + int16_t dummy_int; + dummy_int = 0; +#if 0 + loc_harm = multi_harm( st->Bin_E, hFrontVad->hNoiseEst->old_S, hFrontVad->hNoiseEst->cor_map, &hFrontVad->hNoiseEst->multi_harm_limit, st->total_brate, st->bwidth, ( st->hGSCEnc != NULL ) ? &st->hGSCEnc->cor_strong_limit : &dummy_int, &st->hSpMusClas->mean_avr_dyn, &st->hSpMusClas->last_sw_dyn, &cor_map_sum, &dummy, S_map ); +#else + floatToFixed_arr( hFrontVad->hNoiseEst->old_S, hFrontVad->hNoiseEst->old_S_fx, Q7, 128 ); + floatToFixed_arr( hFrontVad->hNoiseEst->cor_map, hFrontVad->hNoiseEst->cor_map_fx, Q15, 128 ); + // floatToFixed_arr( hFrontVad->hNoiseEst->cor_map, hFrontVad->hNoiseEst->old_S_fx, Q15, 128 ); + hFrontVad->hNoiseEst->multi_harm_limit_fx = (Word16) floatToFixed( hFrontVad->hNoiseEst->multi_harm_limit, Q9 ); + st->hSpMusClas->mean_avr_dyn_fx = (Word16) floatToFixed( st->hSpMusClas->mean_avr_dyn, Q7 ); + st->hSpMusClas->last_sw_dyn_fx = (Word16) floatToFixed( st->hSpMusClas->last_sw_dyn, Q7 ); + // cor_map_sum_fx = (Word16) floatToFixed( cor_map_sum, Q8 ); + // dummy_fx = (Word16) floatToFixed( dummy, Q7 ); + floatToFixed_arr( hFrontVad->hNoiseEst->old_S, hFrontVad->hNoiseEst->old_S_fx, Q7, 128 ); + // loc_harm = multi_harm( st->lgBin_E_fx, hFrontVad->hNoiseEst->old_S_fx, hFrontVad->hNoiseEst->cor_map_fx, &hFrontVad->hNoiseEst->multi_harm_limit, st->total_brate, st->bwidth, ( st->hGSCEnc != NULL ) ? &st->hGSCEnc->cor_strong_limit : &dummy_int, &st->hSpMusClas->mean_avr_dyn, &st->hSpMusClas->last_sw_dyn, &cor_map_sum, &dummy, S_map ); + loc_harm = multi_harm_fx( st->lgBin_E_fx, hFrontVad->hNoiseEst->old_S_fx, hFrontVad->hNoiseEst->cor_map_fx, &hFrontVad->hNoiseEst->multi_harm_limit_fx, st->total_brate, st->bwidth, ( st->hGSCEnc != NULL ) ? &st->hGSCEnc->cor_strong_limit : &dummy_int, &st->hSpMusClas->mean_avr_dyn_fx, &st->hSpMusClas->last_sw_dyn_fx, &cor_map_sum_fx, &dummy_fx, S_map_fx ); + fixedToFloat_arr( hFrontVad->hNoiseEst->old_S_fx, hFrontVad->hNoiseEst->old_S, Q7, 128 ); + fixedToFloat_arr( hFrontVad->hNoiseEst->cor_map_fx, hFrontVad->hNoiseEst->cor_map, Q15, 128 ); + // floatToFixed_arr( hFrontVad->hNoiseEst->cor_map, hFrontVad->hNoiseEst->old_S_fx, Q15, 128 ); + hFrontVad->hNoiseEst->multi_harm_limit = fixedToFloat( hFrontVad->hNoiseEst->multi_harm_limit_fx, Q9 ); + st->hSpMusClas->mean_avr_dyn = fixedToFloat( st->hSpMusClas->mean_avr_dyn_fx, Q7 ); + st->hSpMusClas->last_sw_dyn = fixedToFloat( st->hSpMusClas->last_sw_dyn_fx, Q7 ); + cor_map_sum = fixedToFloat( cor_map_sum_fx, Q8 ); + // dummy = fixedToFloat( dummy_fx, Q7 ); + fixedToFloat_arr( hFrontVad->hNoiseEst->old_S_fx, hFrontVad->hNoiseEst->old_S, Q7, 128 ); + +#endif + } +#if 1 + noise_est( st, old_pitch, tmpN, epsP, Etot[0], Etot[0] - hFrontVad->lp_speech, corr_shift, tmpE, fr_bands[0], &cor_map_sum, &ncharX, &sp_div, &non_staX, &loc_harm, lf_E[0], &hFrontVad->hNoiseEst->harm_cor_cnt, hFrontVad->hNoiseEst->Etot_l_lp, &dummy, S_map, NULL, hFrontVad, hFrontVad->ini_frame ); +#else + // noise_est( st, old_pitch, tmpN, epsP, Etot[0], Etot[0] - hFrontVad->lp_speech, corr_shift, tmpE, fr_bands[0], &cor_map_sum, &ncharX, &sp_div, &non_staX, &loc_harm, lf_E[0], &hFrontVad->hNoiseEst->harm_cor_cnt, hFrontVad->hNoiseEst->Etot_l_lp, &dummy, S_map, NULL, hFrontVad, hFrontVad->ini_frame ); + Word16 Q_esp = Q_factor_arrL( epsP, M + 1 ); + floatToFixed_arrL( epsP, epsP_fx, Q_esp, M + 1 ); + FOR( Word16 i = 0; i <= M; i++ ) + { + L_Extract( epsP_fx[i], &epsP_h[i], &epsP_l[i] ); + } + + floatToFixed_arrL( lf_E[0], lf_E_fx[0], Q_bands + QSCALE - 2, 148 ); + floatToFixed_arrL( hFrontVad->hNoiseEst->fr_bands1, hFrontVad->hNoiseEst->fr_bands1_fx, Q_bands + QSCALE, NB_BANDS ); + floatToFixed_arrL( hFrontVad->hNoiseEst->fr_bands2, hFrontVad->hNoiseEst->fr_bands2_fx, Q_bands + QSCALE, NB_BANDS ); + floatToFixed_arrL( hFrontVad->hNoiseEst->ave_enr, hFrontVad->hNoiseEst->ave_enr_fx, Q_bands + QSCALE, NB_BANDS ); + floatToFixed_arrL( hFrontVad->hNoiseEst->ave_enr2, hFrontVad->hNoiseEst->ave_enr2_fx, Q_bands + QSCALE, NB_BANDS ); + hFrontVad->hNoiseEst->noise_char_fx = (Word16) floatToFixed( hFrontVad->hNoiseEst->noise_char, Q11 ); + hFrontVad->hNoiseEst->act_pred_fx = (Word16) floatToFixed( hFrontVad->hNoiseEst->act_pred, Q15 ); + hFrontVad->hNoiseEst->lt_haco_ev_fx = (Word16) floatToFixed( hFrontVad->hNoiseEst->lt_haco_ev, Q15 ); + hFrontVad->hNoiseEst->lt_tn_track_fx = (Word16) floatToFixed( hFrontVad->hNoiseEst->lt_tn_track, Q15 ); + hFrontVad->hNoiseEst->lt_aEn_zero_fx = (Word16) floatToFixed( hFrontVad->hNoiseEst->lt_aEn_zero, Q15 ); + hFrontVad->hNoiseEst->epsP_0_2_ad_lp_fx = (Word16) floatToFixed( hFrontVad->hNoiseEst->epsP_0_2_ad_lp, Q12 ); + hFrontVad->hNoiseEst->epsP_0_2_lp_fx = (Word16) floatToFixed( hFrontVad->hNoiseEst->epsP_0_2_lp, Q12 ); + hFrontVad->hNoiseEst->epsP_2_16_dlp_lp2_fx = (Word16) floatToFixed( hFrontVad->hNoiseEst->epsP_2_16_dlp_lp2, Q12 ); + hFrontVad->hNoiseEst->epsP_2_16_lp2_fx = (Word16) floatToFixed( hFrontVad->hNoiseEst->epsP_2_16_lp2, Q12 ); + hFrontVad->hNoiseEst->epsP_2_16_lp_fx = (Word16) floatToFixed( hFrontVad->hNoiseEst->epsP_2_16_lp, Q12 ); + // hFrontVad->hNoiseEst->totalNoise_fx = (Word16) floatToFixed( hFrontVad->hNoiseEst->lt_tn_track, Q15 ); + + hFrontVad->hNoiseEst->Etot_l_lp_fx = (Word16) floatToFixed( hFrontVad->hNoiseEst->Etot_l_lp, Q8 ); + hFrontVad->hNoiseEst->Etot_lp_fx = (Word16) floatToFixed( hFrontVad->hNoiseEst->Etot_lp, Q8 ); + hFrontVad->hNoiseEst->Etot_v_h2_fx = (Word16) floatToFixed( hFrontVad->hNoiseEst->Etot_v_h2, Q8 ); + hFrontVad->lp_speech_fx = (Word16) floatToFixed( hFrontVad->lp_speech, Q8 ); + corr_shift_fx = (Word16) floatToFixed( corr_shift, Q15 ); + noise_est_ivas_fx( st, old_pitch, tmpN_fx, epsP_h, epsP_l, Etot_fx[0], Etot_fx[0] - hFrontVad->lp_speech_fx, corr_shift_fx, tmpE_fx, fr_bands_fx[0], &cor_map_sum_fx, &sp_div_fx, &Q_sp_div, &non_staX_fx, &loc_harm, lf_E_fx[0], &hFrontVad->hNoiseEst->harm_cor_cnt, hFrontVad->hNoiseEst->Etot_l_lp_fx, hFrontVad->hNoiseEst->Etot_v_h2_fx, &hFrontVad->hNoiseEst->bg_cnt, st->lgBin_E_fx, Q_bands, Q_bands + QSCALE, &sp_floor, S_map_fx, NULL, hFrontVad, hFrontVad->ini_frame ); + cor_map_sum = fixedToFloat( cor_map_sum_fx, Q8 ); + non_staX = fixedToFloat( non_staX_fx, Q8 ); + fixedToFloat_arr( S_map_fx, S_map, Q7, 128 ); +#endif +#if 0 + vad_param_updt( st, corr_shift, corr_shift, A, st->pitch[1], &hFrontVad, 1 ); +#else + mvr2r_Word16( st->pitch, st->pitch_fx, 3 ); + corr_shift_fx = (Word16) floatToFixed( corr_shift, Q15 ); + hFrontVad->hVAD->running_avg_fx = (Word16) floatToFixed( hFrontVad->hVAD->running_avg, Q15 ); + hFrontVad->hVAD->ra_deltasum_fx = (Word16) floatToFixed( hFrontVad->hVAD->ra_deltasum, Q15 ); + floatToFixed_arr( A, A_fx, Q12, NB_SUBFR16k * ( M + 1 ) ); + floatToFixed_arr( st->voicing, st->voicing_fx, Q15, 3 ); + vad_param_updt_fx( st, st->pitch[1], corr_shift_fx, corr_shift_fx, A_fx, &hFrontVad, 1 ); + hFrontVad->hVAD->running_avg = fixedToFloat( hFrontVad->hVAD->running_avg_fx, Q15 ); + hFrontVad->hVAD->ra_deltasum = fixedToFloat( hFrontVad->hVAD->ra_deltasum_fx, Q15 ); + +#endif + /* 1st stage speech/music classification (GMM model) */ + /* run only to get 'high_lpn_flag' parameter */ +#if 0 + ivas_smc_gmm( st, NULL, localVAD_HE_SAD[0], Etot[0], lsp_new, cor_map_sum, epsP, PS, non_staX, relE, &high_lpn_flag, flag_spitch ); +#else + SP_MUS_CLAS_HANDLE hSpMusClas = st->hSpMusClas; +#if 1 + Word16 relE_fx; + Word16 lsp_new_fx[M]; + Word32 PS_fx[128]; + Word32 epsP_fx[M + 1]; + cor_map_sum_fx = (Word16) floatToFixed( cor_map_sum, Q8 ); + Word16 non_sta_fx = (Word16) floatToFixed( non_staX, Q8 ); + // Word32 epsP_fx[M + 1]; + Word16 Etot_fx_0 = (Word16) floatToFixed( Etot[0], Q8 ); + floatToFixed_arr( lsp_new, lsp_new_fx, Q15, M ); + hSpMusClas->wdlp_0_95_sp_fx = (Word16) floatToFixed( hSpMusClas->wdlp_0_95_sp, Q8 ); + hSpMusClas->wdlp_xtalk_fx = floatToFixed( hSpMusClas->wdlp_xtalk, Q19 ); + hSpMusClas->wrise_fx = (Word16) ( hSpMusClas->wrise * ONE_IN_Q9 ); + relE_fx = (Word16) ( relE * ONE_IN_Q9 ); + hSpMusClas->prev_relE_fx = (Word16) ( hSpMusClas->prev_relE * ONE_IN_Q9 ); + hSpMusClas->relE_attack_sum_fx = (Word16) ( hSpMusClas->relE_attack_sum * ONE_IN_Q9 ); + Word16 Qfact_PS = Q_factor_arrL( PS, 128 ); + floatToFixed_arr32( PS, PS_fx, Qfact_PS, 128 ); + Word16 Q_esp = Q_factor_arrL( epsP, M + 1 ); + floatToFixed_arrL( epsP, epsP_fx, Q_esp, M + 1 ); + Word16 Qfact_PS_past = Q_factor_arrL( hSpMusClas->past_PS, 67 ); + floatToFixed_arr32( hSpMusClas->past_PS, hSpMusClas->past_PS_fx, Qfact_PS_past, 67 ); +#endif + ivas_smc_gmm_fx( st, NULL, localVAD_HE_SAD[0], Etot_fx_0, lsp_new_fx, cor_map_sum_fx, epsP_fx, PS_fx, non_sta_fx, relE_fx, &high_lpn_flag, flag_spitch, Qfact_PS, Q_esp, Qfact_PS_past ); +#if 1 + fixedToFloat_arr( hSpMusClas->past_dlp_fx, hSpMusClas->past_dlp, Q9, HANG_LEN - 1 ); + hSpMusClas->lpm = (Word16) fixedToFloat( hSpMusClas->lpm_fx, Q8 ); // Q8 + hSpMusClas->lps = (Word16) fixedToFloat( hSpMusClas->lps_fx, Q8 ); // Q8 + hSpMusClas->lpn = (Word16) fixedToFloat( hSpMusClas->lpn_fx, Q8 ); // Q8 + hSpMusClas->wdrop = (Word16) fixedToFloat( hSpMusClas->wdrop_fx, Q9 ); // Q8 + hSpMusClas->wrise = (Word16) fixedToFloat( hSpMusClas->wrise_fx, Q9 ); // Q8 + hSpMusClas->lt_dec_thres = (Word16) fixedToFloat( hSpMusClas->lt_dec_thres_fx, Q9 ); // Q8 + hSpMusClas->wdlp_0_95_sp = fixedToFloat( hSpMusClas->wdlp_0_95_sp_fx, Q8 ); + hSpMusClas->dlp_mean_LT = fixedToFloat_32( hSpMusClas->dlp_mean_LT_fx, Q19 ); + hSpMusClas->wdlp_xtalk = fixedToFloat( hSpMusClas->wdlp_xtalk_fx, Q19 ); + hSpMusClas->dlp_var_LT = fixedToFloat_32( hSpMusClas->dlp_var_LT_fx, Q19 ); + hSpMusClas->prev_relE = (Word16) fixedToFloat( hSpMusClas->prev_relE_fx, Q9 ); + hSpMusClas->prev_Etot = (Word16) fixedToFloat( hSpMusClas->prev_Etot_fx, Q8 ); + fixedToFloat_arrL32( hSpMusClas->past_PS_fx, hSpMusClas->past_PS, Qfact_PS_past, 67 ); + hSpMusClas->relE_attack_sum = (Word16) fixedToFloat( hSpMusClas->relE_attack_sum_fx, Q9 ); + fixedToFloat_arrL32( hSpMusClas->FV_st_fx, hSpMusClas->FV_st, Q20, 15 ); +#endif +#endif +#if 0 + /* long-term energy update */ + long_enr( st, -1, localVAD_HE_SAD[0], high_lpn_flag, &hFrontVad, 1, localVAD_HE_SAD, Etot ); +#else + hFrontVad->lp_speech_fx = (Word16) floatToFixed( hFrontVad->lp_speech, Q8 ); + hFrontVad->lp_noise_fx = (Word16) floatToFixed( hFrontVad->lp_noise, Q8 ); + /* long-term energy update */ + ivas_long_enr_fx( st, -1, localVAD_HE_SAD[0], high_lpn_flag, &hFrontVad, 1, localVAD_HE_SAD, Etot_fx ); + hFrontVad->lp_speech = fixedToFloat( hFrontVad->lp_speech_fx, Q8 ); + hFrontVad->lp_noise = fixedToFloat( hFrontVad->lp_noise_fx, Q8 ); + hFrontVad->hNoiseEst->Etot_last = fixedToFloat( hFrontVad->hNoiseEst->Etot_last_fx, Q8 ); +#endif + /* increase ini_frame counter */ + hFrontVad->ini_frame = min( hFrontVad->ini_frame + 1, MAX_FRAME_COUNTER ); + st->ini_frame = hFrontVad->ini_frame; + + hSpar->front_vad_flag = st->vad_flag; + hSpar->front_vad_dtx_flag = 1; + if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) + { + hSpar->front_vad_dtx_flag = 0; + } + hSpar->force_front_vad = 1; + st->last_core = 0; + } + else + { + hSpar->front_vad_flag = 1; + hSpar->front_vad_dtx_flag = 0; + hSpar->force_front_vad = 0; + } +#ifdef DUMP_VAD_SPAR + fclose( fptmpN_fl ); + fclose( fptmpE_fl ); + fclose( fpbckr_fl ); + + fclose( fptmpN_fx ); + fclose( fptmpE_fx ); + fclose( fpbckr_fx ); +#endif +#if 1 + fclose( fp_pitch ); + fclose( fp_voice ); +#endif + pop_wmops(); + return error; +} +#else ivas_error front_vad_spar( SPAR_ENC_HANDLE hSpar, /* i/o: SPAR encoder structure */ const float *omni_in, /* i : omnidirectional input signal */ @@ -436,7 +922,6 @@ ivas_error front_vad_spar( /*------------------------------------------------------------------* * Initialization *-----------------------------------------------------------------*/ - inp_12k8 = hFrontVad->buffer_12k8; mvr2r( st->old_wsp, old_wsp, L_WSP_MEM ); wsp = old_wsp + L_WSP_MEM; @@ -532,3 +1017,4 @@ ivas_error front_vad_spar( pop_wmops(); return error; } +#endif diff --git a/lib_enc/ivas_mct_enc_mct.c b/lib_enc/ivas_mct_enc_mct.c index 554b16008..4e4bdded5 100644 --- a/lib_enc/ivas_mct_enc_mct.c +++ b/lib_enc/ivas_mct_enc_mct.c @@ -35,7 +35,9 @@ #include #include "ivas_cnst.h" #include "ivas_prot.h" +#include "ivas_prot_fx.h" #include "prot.h" +#include "prot_fx2.h" #include "wmc_auto.h" #include @@ -280,7 +282,71 @@ static void getBlockValues( p_st[0] = sts[ch1]; p_st[1] = sts[ch2]; +#ifndef IVAS_FLOAT_FIXED stereo_coder_tcx( hBlock->hStereoMdct, p_st, hBlock->mask, p_mdst_spectrum, p_inv_spectrum, p_inv_mdst_spectrum, 1 ); +#else +#if 1 + Word16 k; + Word32 *p_inv_spectrum_fx[2][2]; + Word16 q_spec = Q31; + Word16 length; + Word32 *p_inv_mdst_spectrum_fx[2][2]; + Word32 *p_mdst_spectrum_fx[2][2]; + FOR( Word16 ch = 0; ch < CPE_CHANNELS; ch++ ) + { + length = p_st[ch]->hTcxEnc->L_frameTCX / ( ( p_st[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); + IF( p_st[ch]->last_core == ACELP_CORE ) + { + length += length / 4; + } + FOR( k = 0; k <= ( ( p_st[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) + { + p_inv_spectrum_fx[ch][k] = (Word32 *) malloc( sizeof( Word32 ) * length ); + p_inv_mdst_spectrum_fx[ch][k] = (Word32 *) malloc( sizeof( Word32 ) * length ); + p_mdst_spectrum_fx[ch][k] = (Word32 *) malloc( sizeof( Word32 ) * length ); + q_spec = s_min( q_spec, Q_factor_arrL( p_st[ch]->hTcxEnc->spectrum[k], length ) - 1 ); + q_spec = s_min( q_spec, Q_factor_arrL( p_mdst_spectrum[ch][k], length ) - 1 ); + } + } + + FOR( Word16 ch = 0; ch < CPE_CHANNELS; ch++ ) + { + length = p_st[ch]->hTcxEnc->L_frameTCX / ( ( p_st[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); + IF( p_st[ch]->last_core == ACELP_CORE ) + { + length += length / 4; + } + FOR( k = 0; k <= ( ( p_st[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) + { + floatToFixed_arrL32( p_st[ch]->hTcxEnc->spectrum[k], p_st[ch]->hTcxEnc->spectrum_fx[k], q_spec, length ); + p_st[ch]->hTcxEnc->spectrum_e[k] = sub( Q31, q_spec ); + floatToFixed_arrL32( p_mdst_spectrum[ch][k], p_mdst_spectrum_fx[ch][k], q_spec, length ); + } + } + +#endif + stereo_coder_tcx_fx( hBlock->hStereoMdct, p_st, hBlock->mask, p_mdst_spectrum_fx, p_inv_spectrum_fx, p_inv_mdst_spectrum_fx, 1, q_spec ); +#if 1 + FOR( Word16 ch = 0; ch < CPE_CHANNELS; ch++ ) + { + length = p_st[ch]->hTcxEnc->L_frameTCX / ( ( p_st[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); + IF( p_st[ch]->last_core == ACELP_CORE ) + { + length += length / 4; + } + FOR( k = 0; k <= ( ( p_st[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) + { + fixedToFloat_arrL32( p_st[ch]->hTcxEnc->spectrum_fx[k], p_st[ch]->hTcxEnc->spectrum[k], q_spec, length ); + fixedToFloat_arrL32( p_inv_spectrum_fx[ch][k], p_inv_spectrum[ch][k], q_spec, length ); + fixedToFloat_arrL32( p_inv_mdst_spectrum_fx[ch][k], p_inv_mdst_spectrum[ch][k], q_spec, length ); + fixedToFloat_arrL32( p_mdst_spectrum_fx[ch][k], p_mdst_spectrum[ch][k], q_spec, length ); + free( p_inv_spectrum_fx[ch][k] ); + free( p_inv_mdst_spectrum_fx[ch][k] ); + free( p_mdst_spectrum_fx[ch][k] ); + } + } +#endif +#endif if ( ( sts[ch1]->core == TCX_20_CORE && hBlock->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO ) || ( sts[ch1]->core == TCX_10_CORE && hBlock->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO && hBlock->hStereoMdct->mdct_stereo_mode[1] == SMDCT_DUAL_MONO ) ) { @@ -715,6 +781,10 @@ void write_mct_bitstream( p_st[1] = sts[hBlock->ch2]; /*then business as usual for each block pair */ +#ifdef IVAS_FLOAT_FIXED + IF( hMCT->hBlockData[pair]->hStereoMdct->hItd ) + hMCT->hBlockData[pair]->hStereoMdct->hItd->itd_fx[1] = float_to_fix( hMCT->hBlockData[pair]->hStereoMdct->hItd->itd[1], Q23 ); +#endif write_stereo_to_bitstream( hMCT->hBlockData[pair]->hStereoMdct, p_st, hBlock->mask, 1, hBstr ); } diff --git a/lib_enc/ivas_rom_enc.c b/lib_enc/ivas_rom_enc.c index 565093d56..1afadbb2c 100644 --- a/lib_enc/ivas_rom_enc.c +++ b/lib_enc/ivas_rom_enc.c @@ -722,6 +722,75 @@ const float ari_bit_estimate_s17_LC[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = { 1.2858f,2.9245f,5.1959f,6.8503f,2.9659f,3.2823f,5.0458f,6.4686f,5.1703f,5.0458f,6.3065f,7.6781f,6.8301f,6.5324f,7.6601f,8.7521f,4.3982f } }; +#ifdef IVAS_FLOAT_FIXED +const Word32 ari_bit_estimate_s17_LC_fx[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = // Q23 +{ + {83886080, 75881672, 61002796, 63255136, 77113120, 68724512, 57378916, 59202600, 63963136, 59104456, 60121992, 61117720, 66920960, 61587484, 62456544, 63393548, 1051931 }, + {9617539, 43694580, 72206624, 86402664, 16572534, 38999476, 65683640, 84666224, 30722438, 45647448, 68510600, 83886080, 42014344, 52961476, 74412824, 88424320, 32977296 }, + {16015530, 25555894, 41778624, 55004940, 25458586, 25380572, 38384592, 49867756, 40708236, 37617036, 46374740, 55574528, 53380068, 47898952, 54527628, 62716588, 26883810 }, + {20729090, 24146608, 39261204, 53876672, 24633986, 22665180, 34551836, 47295812, 39185704, 34411748, 42599028, 52902756, 53020196, 47149012, 52844876, 61468364, 30629324 }, + {19936366, 26554138, 39356832, 51112628, 24781626, 25550022, 36755524, 47112940, 35624740, 35102968, 45841228, 54935316, 45424312, 43887520, 53501704, 61952388, 26163230 }, + {31474896, 29648696, 39356832, 48656444, 30920410, 26409854, 34061104, 42327240, 41032876, 34942748, 40391988, 46968656, 50284672, 43667736, 47443452, 52786156, 15354508 }, + {27007124, 26188396, 38003748, 50051468, 27327568, 23485586, 33204628, 44083812, 39452464, 33841324, 40623512, 49204220, 51062296, 44572868, 49642944, 56482176, 21983186 }, + {32589742, 28184046, 37683304, 48452600, 28982640, 23729694, 31635118, 41501800, 37901408, 32003378, 38158100, 46685960, 48331804, 42327240, 47076868, 53380068, 21107416 }, + {4258477, 28757826, 59104456, 80595232, 26965180, 37290720, 61117720, 78978744, 53876672, 58165768, 75125016, 90848624, 72497704, 73740056, 86402664, 97962168, 63818012 }, + {8635233, 22469726, 47518108, 66920960, 23672652, 28382856, 48574236, 65189552, 48291540, 48864480, 62982508, 76688656, 65853088, 65029328, 75125016, 86402664, 50715848 }, + {36038300, 31635118, 39242748, 47518108, 32798618, 27027256, 33274252, 40771992, 40538788, 34049360, 38598500, 45021660, 48780596, 41825600, 45424312, 50570724, 14716974 }, + {12080434, 20354118, 46038360, 66374860, 21324680, 24359678, 45175172, 62982508, 47406540, 45488064, 57898172, 71371112, 67493064, 62982508, 71105200, 81185784, 49553184 }, + {15030708, 20736638, 38705876, 53876672, 24454470, 24260694, 38262120, 51418812, 43804472, 41054688, 51062296, 61952388, 58256364, 54797744, 62849128, 71921408, 37178312 }, + {37403964, 33390016, 40771992, 48093568, 35361340, 29546356, 35102968, 41254336, 43317932, 36526516, 40350884, 45361396, 50284672, 43239080, 46306792, 50618540, 11327137 }, + {17194968, 21221500, 35457808, 47295812, 27103592, 25865434, 36213620, 45841228, 43667736, 40412956, 48739492, 57128100, 55574528, 52387696, 59400572, 65853088, 29113502 }, + {21471482, 22235684, 39375288, 54593900, 23342140, 21510908, 35009856, 49075872, 40580732, 35610480, 44140016, 55144192, 55214656, 48906424, 55004940, 63674568, 32843078 }, + {43558684, 37952580, 43108216, 48615340, 38943272, 32362410, 36362100, 41411204, 44311144, 37162372, 40003592, 44140016, 49731864, 42205604, 44514148, 47937540, 9255151 }, + {117440512, 117440512, 28514556, 38314968, 117440512, 117440512, 31228272, 39568224, 30326496, 32182056, 38054920, 44691148, 40003592, 40751020, 45237248, 50570724, 10523509 }, + {22771716, 23176046, 39356832, 54729796, 23619804, 21598988, 35251448, 49075872, 39823240, 35333656, 44602228, 55357264, 54132528, 48291540, 54935316, 62849128, 28298130 }, + {34837052, 30657006, 38907204, 48093568, 31444698, 25984552, 32853984, 41098308, 39665532, 33332134, 38508744, 45456188, 48452600, 41662860, 45615572, 51214128, 16284805 }, + {22184512, 26574272, 40559760, 52387696, 26468574, 24628114, 35526592, 46273240, 39863504, 35049280, 42524372, 51418812, 51011964, 45175172, 50378624, 57635608, 21915238 }, + {4598131, 26208528, 62456544, 90848624, 25592804, 35865492, 65853088, 89573560, 59301588, 62982508, 82460856, 100663296, 84666224, 84666224, 97962168, 109051904, 80032352 }, + {46273240, 40902012, 45808512, 50426440, 41919552, 35361340, 38925656, 43030204, 47004728, 39665532, 42062160, 45456188, 51680536, 43859836, 45939372, 48615340, 7052806 }, + {18423900, 28789702, 43694580, 53380068, 27613620, 26883810, 38279736, 48015552, 41321444, 37004668, 43887520, 51522832, 50863484, 45424312, 51893608, 57045052, 19697290 }, + {117440512, 117440512, 39280496, 45051860, 117440512, 117440512, 39394580, 44168536, 40023728, 40206600, 43640056, 47480360, 46171736, 45456188, 48172420, 51470820, 4772195 }, + {34222164, 44111496, 59400572, 67889840, 33193722, 38071696, 51733384, 60664736, 41708996, 43056208, 53750004, 61707440, 47221992, 47004728, 56171796, 62849128, 5373071 }, + {5433133, 27810752, 53939588, 73740056, 25978680, 33625736, 55074568, 71643744, 49642944, 52220764, 67889840, 81806544, 66024216, 66736408, 78978744, 92274688, 55574528 }, + {9987477, 22437010, 48615340, 69164912, 22240716, 26003846, 46581100, 64257576, 47706852, 45808512, 57898172, 70590136, 67690192, 62716588, 70845152, 80032352, 50863484 }, + {30684690, 32469784, 43213076, 51418812, 33448736, 30093292, 37851076, 45113096, 43999088, 38123708, 42876692, 48015552, 51265300, 44631588, 48172420, 52056344, 10875830 }, + {14467832, 21260088, 43056208, 61117720, 22180318, 23276710, 40371016, 56095460, 43586368, 40454900, 51214128, 63532800, 61002796, 56019964, 62982508, 72797176, 41662860 }, + {14800021, 19242628, 44750708, 64870784, 20720700, 22442042, 42623356, 60554004, 46826048, 43531844, 55074568, 68300048, 66554376, 60776304, 68300048, 77553520, 46933424 }, + {15023158, 23893272, 42062160, 57378916, 23625676, 24059366, 38437440, 52331492, 41411204, 38020528, 47821776, 59007148, 56171796, 51112628, 58532352, 67493064, 34086268 }, + {19163774, 22665180, 36894776, 49117816, 25928348, 24032524, 35089548, 46443528, 41732484, 37258840, 45679328, 54327980, 53876672, 49642944, 56171796, 63963136, 29113502 }, + {22422750, 23110616, 36801664, 48864480, 26403144, 23583732, 34360576, 45144132, 41593236, 36709388, 44840464, 53380068, 54866528, 49247000, 54661848, 61233484, 24719550 }, + {52786156, 45939372, 49642944, 53440468, 47185920, 39943196, 42648520, 45873940, 51265300, 43749948, 45550980, 48054140, 55144192, 47295812, 48780596, 50764500, 4665324 }, + {25013152, 23957864, 37969356, 51839920, 25183440, 21892590, 33102286, 45550980, 38888748, 33757436, 41298796, 51470820, 52443900, 46071912, 51787072, 59602736, 28351818 }, + {28010400, 25815102, 37683304, 50051468, 26521424, 22399262, 32182056, 43749948, 38227724, 32437908, 39626944, 49290620, 50378624, 43722264, 49421484, 57045052, 25435098 }, + {63118404, 55429404, 54327980, 57549208, 56640720, 48822536, 48372068, 50962472, 56962844, 49822460, 51162960, 52844876, 60016296, 53020196, 53876672, 55429404, 2546613 }, + {24288376, 30110908, 42698852, 52165396, 29580748, 27722672, 37226964, 45679328, 41525288, 36111280, 42327240, 49204220, 50522068, 43776788, 48615340, 54067936, 15380513 }, + {31434630, 28298130, 38314968, 48739492, 29436464, 24498930, 32589742, 42182116, 39205000, 33011690, 38907204, 46826048, 49160600, 42401056, 46790816, 52961476, 19214106 }, + {3153193, 31766820, 62982508, 85505080, 29105114, 41990016, 66736408, 84666224, 56640720, 62849128, 80595232, 95755960, 75497472, 78010696, 92274688, 104144568, 68300048 }, + {28313230, 28063250, 39242748, 49777160, 28313230, 24805114, 34172672, 43640056, 39318244, 34098012, 40708236, 48697548, 49377864, 43265084, 48211848, 54593900, 18742666 }, + {40084124, 34889900, 41076496, 47821776, 35695204, 29411298, 34360576, 40517816, 41755136, 34903320, 38742788, 43804472, 48533968, 41142768, 44225580, 48412336, 12035136 }, + {6888557, 22805270, 47706852, 65853088, 26156518, 31920332, 51316472, 66374860, 52671232, 53079756, 66736408, 78978744, 70340992, 68724512, 78978744, 89573560, 51839920 }, + {6934359, 23031762, 55214656, 81185784, 23076222, 30317268, 56248972, 77553520, 54262548, 55285960, 70590136, 87367352, 79493808, 75881672, 84666224, 95755960, 66736408 }, + {10658565, 23201212, 47221992, 67299288, 22065394, 25833558, 45743920, 63393548, 44197060, 43722264, 57898172, 71643744, 61952388, 59202600, 69622088, 79493808, 44900024 }, + {9992510, 19614244, 42474876, 58720256, 25422516, 28283030, 45519944, 59400572, 50912980, 49075872, 60444952, 71643744, 68300048, 65351452, 74072248, 82460856, 45175172 }, + {14219529, 22078816, 44083812, 62585728, 21781020, 23573666, 42037832, 58256364, 42573864, 40538788, 53258432, 66198700, 59007148, 55285960, 64109096, 74412824, 37649752 }, + {17939038, 22324602, 41164576, 58076012, 22442042, 22171090, 37901408, 53139316, 40580732, 37371248, 48412336, 60335900, 56482176, 51733384, 59400572, 68510600, 33914304 }, + {12215491, 19329870, 37226964, 51893608, 27263814, 27497858, 41120956, 52786156, 47898952, 45550980, 55795148, 64257576, 63674568, 59501236, 67299288, 74412824, 38037304 }, + {20357474, 23951992, 40104256, 55214656, 23968770, 22699574, 36111280, 49822460, 39356832, 35639000, 44572868, 55285960, 53563780, 47860364, 54460520, 62456544, 28351818 }, + {25089488, 24195262, 37934964, 51367640, 25617132, 22588844, 33841324, 46139020, 39803944, 35143236, 42825520, 52557144, 53139316, 46968656, 52902756, 59705080, 24173452 }, + {15014769, 19723296, 34707028, 46409136, 28560694, 27271364, 37952580, 47745440, 46005644, 43291928, 51214128, 59007148, 59807420, 55795148, 61952388, 68510600, 31326418 }, + {19625988, 26674096, 40288808, 51733384, 27075910, 24902422, 35035860, 45615572, 40329912, 35049280, 42182116, 50522068, 52110872, 45582856, 50912980, 58165768, 24431820 }, + {26508002, 25118848, 36724488, 46512316, 29821502, 25716116, 33853904, 42085648, 43082212, 37550764, 43265084, 49959192, 53687932, 47480360, 51522832, 56640720, 18096744 }, + {17097660, 21086444, 42375892, 60888712, 21402694, 21901816, 39337540, 55720488, 42109972, 38961728, 50237696, 63118404, 59301588, 54327980, 61952388, 71643744, 38262120 }, + {29236816, 27179928, 37952580, 47976128, 29717482, 25555894, 33566176, 42351564, 41525288, 35624740, 40902012, 48331804, 51787072, 45424312, 49509564, 54797744, 17241106 }, + {1703306, 35808452, 78484656, 109051904, 34347996, 51575680, 85505080, 109051904, 74072248, 82460856, 104144568, 117440512, 104144568, 104144568, 117440512, 117440512, 109051904 }, + {117440512, 117440512, 22240716, 38455896, 117440512, 117440512, 26714362, 40559760, 21398500, 26298286, 36740424, 47706852, 36755524, 39491048, 47076868, 56019964, 20389350 }, + {25392316, 25195184, 39185704, 52500104, 25642296, 22694540, 33901720, 46071912, 39185704, 34049360, 41990016, 51470820, 51680536, 45615572, 51062296, 58347800, 23840424 }, + {9318905, 20827236, 51062296, 75125016, 21589760, 26707650, 51575680, 72206624, 51787072, 51316472, 66374860, 81806544, 75125016, 71921408, 81185784, 92274688, 60444952 }, + {20310498, 21762566, 40084124, 56404160, 22670214, 21554528, 36832700, 51575680, 41120956, 37258840, 47480360, 58720256, 57045052, 51627688, 58440076, 66736408, 31208978 }, + {7740001, 25753026, 52220764, 71921408, 23155914, 29666312, 51418812, 68942616, 45712040, 47258900, 62849128, 77113120, 61952388, 61002796, 73103360, 84666224, 47369632 }, + {10786072, 24532484, 43586368, 57464480, 24879772, 27533928, 42327240, 54262548, 43371620, 42327240, 52902756, 64408572, 57295032, 54797744, 64257576, 73417936, 36894776 }, +}; +#endif /*----------------------------------------------------------------------------------* * Stereo downmix to EVS ROM tables diff --git a/lib_enc/ivas_rom_enc.h b/lib_enc/ivas_rom_enc.h index 3c87e361e..bec7df357 100644 --- a/lib_enc/ivas_rom_enc.h +++ b/lib_enc/ivas_rom_enc.h @@ -114,6 +114,7 @@ extern const Word32 win_mdct_8k_fx[STEREO_DFT_OVL_8k]; *----------------------------------------------------------------------------------*/ extern const float ari_bit_estimate_s17_LC[RANGE_N_CONTEXT][RANGE_N_SYMBOLS]; +extern const Word32 ari_bit_estimate_s17_LC_fx[RANGE_N_CONTEXT][RANGE_N_SYMBOLS]; /*----------------------------------------------------------------------------------* * ECLVQ Stereo ROM tables diff --git a/lib_enc/ivas_sns_enc.c b/lib_enc/ivas_sns_enc.c index c59239052..7b1a19313 100644 --- a/lib_enc/ivas_sns_enc.c +++ b/lib_enc/ivas_sns_enc.c @@ -37,6 +37,8 @@ #include "cnst.h" #include "prot.h" #include "ivas_prot.h" +#include "ivas_prot_fx.h" +#include "prot_fx2.h" #include "rom_com.h" #include "ivas_rom_com.h" #include "ivas_cnst.h" @@ -427,7 +429,19 @@ int16_t quantize_sns( if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS ) { +#ifndef IVAS_FLOAT_FIXED convertToMS( M, snsQ_out[0][k], snsQ_out[1][k], 0.5f ); +#else + Word32 snsQ_out_fx[2][2][M]; + Word16 q = s_min( Q_factor_arrL( snsQ_out[0][k], M ), Q_factor_arrL( snsQ_out[1][k], M ) ) - 1; + floatToFixed_arrL( snsQ_out[0][k], snsQ_out_fx[0][k], q, M ); + floatToFixed_arrL( snsQ_out[1][k], snsQ_out_fx[1][k], q, M ); + + convertToMS_fx( M, snsQ_out_fx[0][k], snsQ_out_fx[1][k], ONE_IN_Q30 ); + + fixedToFloat_arrL( snsQ_out_fx[0][k], snsQ_out[0][k], q, M ); + fixedToFloat_arrL( snsQ_out_fx[1][k], snsQ_out[1][k], q, M ); +#endif } } } @@ -486,7 +500,19 @@ int16_t quantize_sns( { if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS ) { +#ifndef IVAS_FLOAT_FIXED convertToMS( M, snsQ_out[0][k], snsQ_out[1][k], 1.f ); +#else + Word32 snsQ_out_fx[2][2][M]; + Word16 q = s_min( Q_factor_arrL( snsQ_out[0][k], M ), Q_factor_arrL( snsQ_out[0][k], M ) ) - 1; + floatToFixed_arrL( snsQ_out[0][k], snsQ_out_fx[0][k], q, M ); + floatToFixed_arrL( snsQ_out[1][k], snsQ_out_fx[1][k], q, M ); + + convertToMS_fx( M, snsQ_out_fx[0][k], snsQ_out_fx[1][k], ONE_IN_Q31 ); + + fixedToFloat_arrL( snsQ_out_fx[0][k], snsQ_out[0][k], q, M ); + fixedToFloat_arrL( snsQ_out_fx[1][k], snsQ_out[1][k], q, M ); +#endif } } } diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 37e9288e1..ec2dbd2be 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -657,6 +657,7 @@ typedef struct ivas_stereo_classifier_data_structure float non_sta_ch1; float sp_div_ch1; float ps_diff_ch1, ps_diff_ch2; + Word32 ps_diff_ch1_fx, ps_diff_ch2_fx; float ps_sta_ch1, ps_sta_ch2; float prev_g_IPD; float prev_IPD; @@ -706,7 +707,6 @@ typedef struct ivas_stereo_classifier_data_structure Word32 nchar_ch1_fx, nchar_ch2_fx; Word32 non_sta_ch1_fx; Word32 sp_div_ch1_fx; - Word32 ps_diff_ch1_fx, ps_diff_ch2_fx; Word32 ps_sta_ch1_fx, ps_sta_ch2_fx; Word32 prev_g_IPD_fx; Word32 prev_IPD_fx; @@ -762,21 +762,28 @@ typedef struct front_vad_enc { int16_t ini_frame; /* initialization frames counter */ float lp_speech; /* long term speech average */ - Word16 lp_speech_fx; /* Q9 long term speech average */ + /* Q9 long term speech average */ float lp_noise; /* long term noise average */ - Word16 lp_noise_fx; /* long term noise average */ + /* long term noise average */ float mem_decim[2 * L_FILT_MAX]; /* decimation filter memory */ float buffer_12k8[3 * L_FRAME / 2]; /* 12k8 signal buffer */ - float mem_preemph; /* preemph filter memory */ - Word16 mem_preemph_fx; /* preemph filter memory */ - NOISE_EST_HANDLE hNoiseEst; /* Noise estimation handle */ - VAD_HANDLE hVAD; /* VAD handle */ + + float mem_preemph; /* preemph filter memory */ + Word16 mem_preemph_fx; /* preemph filter memory */ + NOISE_EST_HANDLE hNoiseEst; /* Noise estimation handle */ + VAD_HANDLE hVAD; /* VAD handle */ float *delay_buf; Word16 *delay_buf_fx; int16_t delay_samples; - int16_t rem_dtx_ho; /* Remaining hangover frames */ - Word32 mem_decim_fx[2 * L_FILT_MAX]; /* decimation filter memory */ - Word32 buffer_12k8_fx[3 * L_FRAME / 2]; /* 12k8 signal buffer */ + int16_t rem_dtx_ho; /* Remaining hangover frames */ + +#ifdef IVAS_FLOAT_FIXED + Word16 lp_speech_fx; + Word16 lp_noise_fx; + Word16 mem_decim_fx[2 * L_FILT_MAX]; /* decimation filter memory */ + Word16 buffer_12k8_fx[3 * L_FRAME / 2]; +#endif + // Word32 buffer_12k8_fx[3 * L_FRAME / 2]; /* 12k8 signal buffer */ } FRONT_VAD_ENC, *FRONT_VAD_ENC_HANDLE; diff --git a/lib_enc/ivas_stereo_classifier.c b/lib_enc/ivas_stereo_classifier.c index a755906d8..00e6acb31 100644 --- a/lib_enc/ivas_stereo_classifier.c +++ b/lib_enc/ivas_stereo_classifier.c @@ -233,8 +233,15 @@ void stereo_classifier_init( hStereoClassif->nchar_ch2 = 0.0f; hStereoClassif->non_sta_ch1 = 0.0f; hStereoClassif->sp_div_ch1 = 0.0f; + +#ifdef IVAS_FLOAT_FIXED + hStereoClassif->ps_diff_ch1_fx = 0; + hStereoClassif->ps_diff_ch2_fx = 0; + hStereoClassif->ps_sta_ch1_fx = 0; + hStereoClassif->ps_sta_ch2_fx = 0; +#endif hStereoClassif->ps_diff_ch1 = 0.0f; - hStereoClassif->ps_diff_ch2 = 0.0f; + hStereoClassif->ps_sta_ch1 = 0.0f; hStereoClassif->ps_sta_ch2 = 0.0f; hStereoClassif->prev_g_IPD = 0.5f; diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index 73081c98a..db45ca3f9 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -36,6 +36,7 @@ #include #include "cnst.h" #include "prot.h" +#include "prot_fx2.h" #include "ivas_prot.h" #include "rom_com.h" #include "wmc_auto.h" @@ -258,7 +259,71 @@ void stereo_mdct_core_enc( if ( !hStereoMdct->isSBAStereoMode ) { +#ifndef IVAS_FLOAT_FIXED stereo_coder_tcx( hStereoMdct, sts, ms_mask, mdst_spectrum, inv_spectrum, inv_mdst_spectrum, 0 ); +#else +#if 1 + Word16 k; + Word32 *inv_spectrum_fx[2][2]; + Word16 q_spec = Q31; + Word16 length; + Word32 *inv_mdst_spectrum_fx[2][2]; + Word32 *mdst_spectrum_fx[2][2]; + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + length = sts[ch]->hTcxEnc->L_frameTCX / ( ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); + IF( sts[ch]->last_core == ACELP_CORE ) + { + length += length / 4; + } + FOR( k = 0; k <= ( ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) + { + inv_spectrum_fx[ch][k] = (Word32 *) malloc( sizeof( Word32 ) * length ); + inv_mdst_spectrum_fx[ch][k] = (Word32 *) malloc( sizeof( Word32 ) * length ); + mdst_spectrum_fx[ch][k] = (Word32 *) malloc( sizeof( Word32 ) * length ); + q_spec = s_min( q_spec, Q_factor_arrL( sts[ch]->hTcxEnc->spectrum[k], length ) - 1 ); + q_spec = s_min( q_spec, Q_factor_arrL( mdst_spectrum[ch][k], length ) - 1 ); + } + } + + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + length = sts[ch]->hTcxEnc->L_frameTCX / ( ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); + IF( sts[ch]->last_core == ACELP_CORE ) + { + length += length / 4; + } + FOR( k = 0; k <= ( ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) + { + floatToFixed_arrL32( sts[ch]->hTcxEnc->spectrum[k], sts[ch]->hTcxEnc->spectrum_fx[k], q_spec, length ); + sts[ch]->hTcxEnc->spectrum_e[k] = sub( Q31, q_spec ); + floatToFixed_arrL32( mdst_spectrum[ch][k], mdst_spectrum_fx[ch][k], q_spec, length ); + } + } + +#endif + stereo_coder_tcx_fx( hStereoMdct, sts, ms_mask, mdst_spectrum_fx, inv_spectrum_fx, inv_mdst_spectrum_fx, 0, q_spec ); +#if 1 + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + length = sts[ch]->hTcxEnc->L_frameTCX / ( ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); + IF( sts[ch]->last_core == ACELP_CORE ) + { + length += length / 4; + } + FOR( k = 0; k <= ( ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) + { + fixedToFloat_arrL32( sts[ch]->hTcxEnc->spectrum_fx[k], sts[ch]->hTcxEnc->spectrum[k], q_spec, length ); + fixedToFloat_arrL32( inv_spectrum_fx[ch][k], inv_spectrum[ch][k], q_spec, length ); + fixedToFloat_arrL32( inv_mdst_spectrum_fx[ch][k], inv_mdst_spectrum[ch][k], q_spec, length ); + fixedToFloat_arrL32( mdst_spectrum_fx[ch][k], mdst_spectrum[ch][k], q_spec, length ); + free( inv_spectrum_fx[ch][k] ); + free( inv_mdst_spectrum_fx[ch][k] ); + free( mdst_spectrum_fx[ch][k] ); + } + } +#endif +#endif } /*--------------------------------------------------------------* @@ -404,6 +469,10 @@ void stereo_mdct_core_enc( sts[0]->side_bits_frame_channel -= SMDCT_NBBITS_SPLIT_RATIO; if ( !hStereoMdct->isSBAStereoMode ) { +#ifdef IVAS_FLOAT_FIXED + IF( hStereoMdct->hItd ) + hStereoMdct->hItd->itd_fx[1] = float_to_fix( hStereoMdct->hItd->itd[1], Q23 ); +#endif stereo_bits = write_stereo_to_bitstream( hStereoMdct, sts, ms_mask, 0, hBstr ); } else @@ -415,7 +484,25 @@ void stereo_mdct_core_enc( * Split available bits between channels *---------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED FindSplitRatio( hCPE, sts ); +#else +#if 1 + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + L_subframeTCX = sts[ch]->hTcxEnc->L_frameTCX / ( ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); + IF( sts[ch]->last_core == ACELP_CORE ) + { + L_subframeTCX += L_subframeTCX / 4; + } + FOR( n = 0; n <= ( ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ) - 1; n++ ) + { + f2me_buf( sts[ch]->hTcxEnc->spectrum[n], sts[ch]->hTcxEnc->spectrum_fx[n], &sts[ch]->hTcxEnc->spectrum_e[n], L_subframeTCX ); + } + } +#endif + FindSplitRatio_fx( hCPE, sts ); +#endif assert( hStereoMdct->split_ratio > 0 && hStereoMdct->split_ratio < SMDCT_BITRATE_RATIO_RANGE ); diff --git a/lib_enc/ivas_stereo_mdct_igf_enc.c b/lib_enc/ivas_stereo_mdct_igf_enc.c index d56e3d34d..329401343 100644 --- a/lib_enc/ivas_stereo_mdct_igf_enc.c +++ b/lib_enc/ivas_stereo_mdct_igf_enc.c @@ -35,21 +35,26 @@ #include "options.h" #include #include "prot.h" +#include "prot_fx2.h" #include "cnst.h" #include "stat_enc.h" #include "ivas_stat_enc.h" #include "ivas_prot.h" +#include "ivas_prot_fx.h" #include "wmc_auto.h" /*-------------------------------------------------------------------* * Local constants *-------------------------------------------------------------------*/ -#define IGF_PATCH_MS 1 -#define IGF_PATCH_LR 0 -#define TARGET_COH_THRESHOLD 0.6f -#define SOURCE_COH_THRESHOLD 0.7f -#define PANNING_THRESHOLD 0.07f +#define IGF_PATCH_MS 1 +#define IGF_PATCH_LR 0 +#define TARGET_COH_THRESHOLD 0.6f +#define TARGET_COH_THRESHOLD_FX 19661 +#define SOURCE_COH_THRESHOLD 0.7f +#define SOURCE_COH_THRESHOLD_FX 22938 +#define PANNING_THRESHOLD 0.07f +#define PANNING_THRESHOLD_FX 2294 /*-------------------------------------------------------------------* @@ -58,6 +63,7 @@ * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static float calcCoh( const float *sig1, const float *sig2, @@ -94,6 +100,68 @@ static float calcCoh( return coh; } +#else +static Word16 calcCoh_fx( // Q15 + const Word32 *sig1_fx, // Q( q_sig ) + const Word32 *sig2_fx, // Q( q_sig ) + const Word16 q_sig, + const Word16 nSamples, + Word32 *corr, + Word16 *corr_e, + Word16 *predCoeff, + Word16 *predCoeff_e ) +{ + Word32 ener1_fx, ener2_fx, cEner_fx, cc_fx; + Word16 coh_fx, coh_e; + Word16 q_ener1, q_ener2, q_cEner, q_cc; + + coh_fx = 0; + move16(); + Word16 gB = find_guarded_bits_fx( nSamples ); + q_ener1 = shl( q_sig, 1 ); + q_ener2 = q_ener1; + move16(); + q_cc = q_ener1; + move16(); + ener1_fx = dotp_fixed_o( sig1_fx, sig1_fx, nSamples, gB, &q_ener1 ); + ener2_fx = dotp_fixed_o( sig2_fx, sig2_fx, nSamples, gB, &q_ener2 ); + cEner_fx = Mpy_32_32( ener1_fx, ener2_fx ); + q_cEner = sub( 62, add( q_ener1, q_ener2 ) ); + cEner_fx = Sqrt32( cEner_fx, &q_cEner ); + q_cEner = sub( Q31, q_cEner ); + cc_fx = dotp_fixed_o( sig1_fx, sig2_fx, nSamples, gB, &q_cc ); + + IF( corr != NULL ) + { + *corr = cc_fx; + *corr_e = sub( Q31, q_cc ); + move16(); + move32(); + } + + IF( cEner_fx > 0 ) + { + coh_fx = BASOP_Util_Divide3232_Scale( cc_fx, cEner_fx, &coh_e ); + coh_e = add( coh_e, sub( q_cEner, q_cc ) ); + coh_fx = shl_sat( coh_fx, coh_e ); // Q15 + } + + IF( predCoeff != NULL ) + { + *predCoeff = 0; + move32(); + IF( ener1_fx > 0 ) + { + *predCoeff = BASOP_Util_Divide3232_Scale( cc_fx, ener1_fx, predCoeff_e ); + move32(); + *predCoeff_e = add( *predCoeff_e, sub( q_ener1, q_cc ) ); + move16(); + } + } + + return coh_fx; +} +#endif /*-------------------------------------------------------------------* @@ -102,6 +170,7 @@ static float calcCoh( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void IGF_MsStereoDecision( STEREO_MDCT_BAND_PARAMETERS *sfbParam, H_IGF_GRID hGrid, @@ -226,6 +295,164 @@ static void IGF_MsStereoDecision( return; } +#else +static void IGF_MsStereoDecision_fx( + STEREO_MDCT_BAND_PARAMETERS *sfbParam, + H_IGF_GRID hGrid, + const Word32 *specL_fx, + const Word32 *specR_fx, + Word16 q_spec, + Word16 *igfStereoMode, /* output*/ + Word16 *msMask, /* output*/ + const Word16 mdct_stereo_mode ) +{ + Word16 sfb; + Word16 msMaskTrueSomewhere, msMaskFalseSomewhere; + Word16 numMsMaskTrue, numMsMaskFalse, numMsMaskThresh, numMsMaskMSForLR; + Word16 tile_idx; + Word16 strt_cpy; + Word16 thresh; + + thresh = TARGET_COH_THRESHOLD_FX; + move16(); + + if ( EQ_16( mdct_stereo_mode, SMDCT_MS_FULL ) ) + { + thresh = 13762; /* lower threshold if core is already MS */ + move16(); + } + + FOR( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ ) + { + strt_cpy = hGrid->sbWrap[tile_idx]; + move16(); + + FOR( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ ) + { + Word16 width = sub( hGrid->swb_offset[sfb + 1], hGrid->swb_offset[sfb] ); + Word32 cc_src_fx, cc_target_fx; + Word16 cc_src_e, cc_target_e; + Word16 pc_target_fx, pc_src_fx; + Word16 pc_target_e, pc_src_e; + Word16 tmp1, tmp1_e, tmp2, tmp2_e; + + Word16 coh_src = calcCoh_fx( &specL_fx[strt_cpy], &specR_fx[strt_cpy], q_spec, width, &cc_src_fx, &cc_src_e, &pc_src_fx, &pc_src_e ); + Word16 coh_target = calcCoh_fx( &specL_fx[hGrid->swb_offset[sfb]], &specR_fx[hGrid->swb_offset[sfb]], q_spec, width, &cc_target_fx, &cc_target_e, &pc_target_fx, &pc_target_e ); + tmp1_e = BASOP_Util_Add_MantExp( pc_target_fx, pc_target_e, negate( pc_src_fx ), pc_src_e, &tmp1 ); + tmp2_e = BASOP_Util_Add_MantExp( pc_target_fx, pc_target_e, -16384, 1, &tmp2 ); + + strt_cpy = add( strt_cpy, width ); + IF( GT_16( abs_s( coh_target ), thresh ) ) + { + /* target is very coherent */ + IF( GT_16( abs_s( coh_src ), SOURCE_COH_THRESHOLD_FX ) ) + { + test(); + IF( LT_16( abs_s( shl_sat( tmp1, tmp1_e ) ), PANNING_THRESHOLD_FX ) && GT_16( abs_s( shl_sat( tmp2, tmp2_e ) ), 2 * PANNING_THRESHOLD_FX ) ) /* same position but not close to the MID */ + { + /* same for the source, stereo pos are close, stay on LR */ + msMask[sfb] = IGF_PATCH_LR; + move16(); + } + ELSE + { + msMask[sfb] = IGF_PATCH_MS; + move16(); + } + } + ELSE + { + /* we need to get the coherent patch, do MS */ + msMask[sfb] = IGF_PATCH_MS; + move16(); + } + } + ELSE + { + /* target is not coherent, stick to LR patching */ + msMask[sfb] = IGF_PATCH_LR; + move16(); + } + } + } + + msMaskTrueSomewhere = 0; + move16(); + msMaskFalseSomewhere = 0; + move16(); + numMsMaskTrue = 0; + move16(); + numMsMaskFalse = 0; + move16(); + numMsMaskThresh = shr( sub( sfbParam->sfbCnt, sfbParam->nBandsStereoCore ), 2 ); + numMsMaskMSForLR = 0; + move16(); + + FOR( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ ) + { + FOR( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ ) + { + SWITCH( msMask[sfb] ) + { + case IGF_PATCH_LR: + msMask[sfb] = 0; + move16(); + numMsMaskFalse = add( numMsMaskFalse, 1 ); + msMaskFalseSomewhere = 1; + move16(); + break; + case IGF_PATCH_MS: + msMask[sfb] = 1; + move16(); + numMsMaskTrue = add( numMsMaskTrue, 1 ); + msMaskTrueSomewhere = 1; + move16(); + break; + default: + assert( 0 ); + break; + } + } + } + + IF( msMaskTrueSomewhere ) + { + IF( msMaskFalseSomewhere ) + { + *igfStereoMode = SMDCT_BW_MS; + move16(); + + test(); + IF( LE_16( numMsMaskFalse, numMsMaskThresh ) ) + { + *igfStereoMode = SMDCT_MS_FULL; + move16(); + set_s( &msMask[0], 1, sub( sfbParam->sfbCnt, sfbParam->nBandsStereoCore ) ); + } + ELSE IF( LE_16( numMsMaskTrue, numMsMaskThresh ) && !numMsMaskMSForLR ) + { + *igfStereoMode = SMDCT_DUAL_MONO; + move16(); + set_s( &msMask[0], 0, sub( sfbParam->sfbCnt, sfbParam->nBandsStereoCore ) ); + } + } + ELSE + { + *igfStereoMode = SMDCT_MS_FULL; + move16(); + set_s( &msMask[0], 1, sub( sfbParam->sfbCnt, sfbParam->nBandsStereoCore ) ); + } + } + ELSE + { + *igfStereoMode = SMDCT_DUAL_MONO; + move16(); + set_s( &msMask[0], 0, sub( sfbParam->sfbCnt, sfbParam->nBandsStereoCore ) ); + } + + return; +} +#endif /*-------------------------------------------------------------------* @@ -234,6 +461,7 @@ static void IGF_MsStereoDecision( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void IGFEncStereoEncoder( STEREO_MDCT_BAND_PARAMETERS *sfbParam, /* i/o: sfb parameters for the right channel */ const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : IGF handle */ @@ -269,3 +497,43 @@ void IGFEncStereoEncoder( return; } +#else +void IGFEncStereoEncoder_fx( + STEREO_MDCT_BAND_PARAMETERS *sfbParam, /* i/o: sfb parameters for the right channel */ + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : IGF handle */ + const Word32 *mdctSpectrumL_fx, /* i : left spectrum */ + const Word32 *mdctSpectrumR_fx, /* i : right spectrum */ + Word16 q_mdctSpectrum, + Word16 *msMask, /* i/o: MS mask */ + Word16 *igfStereoMode, /* o : IGF stereo mode */ + const Word16 mdct_stereo_mode, /* i : MDCT stereo mode */ + const Word16 isTCX20, /* i : flag for indicating TCX20 */ + const Word16 isTransition /* i : flag for transtition */ +) +{ + Word16 igfGridIdx; + H_IGF_GRID hGrid; + + IF( isTransition && isTCX20 ) + { + igfGridIdx = IGF_GRID_LB_TRAN; + move16(); + } + ELSE IF( isTCX20 ) + { + igfGridIdx = IGF_GRID_LB_NORM; + move16(); + } + ELSE + { + /* It is short block */ + igfGridIdx = IGF_GRID_LB_SHORT; + move16(); + } + + hGrid = &hIGFEnc->igfData.igfInfo.grid[igfGridIdx]; + IGF_MsStereoDecision_fx( sfbParam, hGrid, mdctSpectrumL_fx, mdctSpectrumR_fx, q_mdctSpectrum, igfStereoMode, msMask + sfbParam->nBandsStereoCore, mdct_stereo_mode ); + + return; +} +#endif diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc.c b/lib_enc/ivas_stereo_mdct_stereo_enc.c index ea78be94e..54618a32a 100644 --- a/lib_enc/ivas_stereo_mdct_stereo_enc.c +++ b/lib_enc/ivas_stereo_mdct_stereo_enc.c @@ -37,8 +37,10 @@ #include "ivas_cnst.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" +#include "prot_fx2.h" #include "prot.h" #include "prot_fx1.h" +#include "prot_fx_enc.h" #include "ivas_rom_com.h" #include "ivas_rom_com_fx.h" #include "ivas_rom_enc.h" @@ -58,13 +60,29 @@ * Local function prototypes *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void convertToBwMS( const int16_t startLine, const int16_t stopLine, float x0[], float x1[], const float norm_fac ); +#else +static void convertToBwMS_fx( const Word16 startLine, const Word16 stopLine, Word32 x0[], Word32 x1[], const Word32 norm_fac ); +#endif +#ifndef IVAS_FLOAT_FIXED void convertToMS( const int16_t L_frame, float x0[], float x1[], const float norm_fac ); +#else +void convertToMS_fx( const Word16 L_frame, Word32 x0_fx[], Word32 x1_fx[], const Word32 norm_fac ); +#endif +#ifndef IVAS_FLOAT_FIXED static float GetChannelEnergyRatio( Encoder_State **st, const int16_t iFirstSubframe, const int16_t iLastSubframe, const uint8_t ratioInRmsDomain ); +#else +static Word16 GetChannelEnergyRatio_fx( Encoder_State **st, const Word16 iFirstSubframe, const Word16 iLastSubframe, const UWord8 ratioInRmsDomain ); +#endif +#ifndef IVAS_FLOAT_FIXED static void MsStereoDecision( STEREO_MDCT_BAND_PARAMETERS *sfbParam, float *specL, float *specR, float *specM, float *specS, int16_t *mdct_stereo_mode, int16_t *msMask, const int16_t nBitsAvailable ); +#else +static void MsStereoDecision_fx( STEREO_MDCT_BAND_PARAMETERS *sfbParam, Word32 *specL_fx, Word32 *specR_fx, Word32 *specM_fx, Word32 *specS_fx, Word16 q_spec, Word16 *mdct_stereo_mode, Word16 *msMask, const Word16 nBitsAvailable ); +#endif /*-------------------------------------------------------------------* @@ -74,6 +92,7 @@ static void MsStereoDecision( STEREO_MDCT_BAND_PARAMETERS *sfbParam, float *spec * MDCT-stereo *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void dft_ana_init( DFT_ANA_HANDLE hDft_ana, /*i : DFT analysis handle */ const int32_t input_Fs /*i : Input sampling frequency */ @@ -108,20 +127,16 @@ static void dft_ana_init( return; } -#ifdef IVAS_FLOAT_FIXED -static void dft_ana_init_fx( +#else +static void dft_ana_init( DFT_ANA_HANDLE hDft_ana, /*i : DFT analysis handle */ const Word32 input_Fs /*i : Input sampling frequency */ ) { - Word16 div1; - /* input_Fs / 48000 */ - div1 = extract_l( Mpy_32_32_r( input_Fs, 44739 /* 1 / 48000 in Q31 */ ) ); - - hDft_ana->N = i_mult( STEREO_DFT_HOP_MAX_ENC, div1 ); - hDft_ana->NFFT = i_mult( STEREO_DFT_N_MAX_ENC, div1 ); - hDft_ana->dft_ovl = i_mult( STEREO_DFT_OVL_MAX, div1 ); - hDft_ana->dft_zp = i_mult( STEREO_DFT_ZP_MAX_ENC, div1 ); + hDft_ana->N = extract_l( Mpy_32_16_1( input_Fs, 656 ) ); + hDft_ana->NFFT = extract_l( Mpy_32_16_1( input_Fs, 1311 ) ); + hDft_ana->dft_ovl = extract_l( Mpy_32_16_1( input_Fs, 287 ) ); + hDft_ana->dft_zp = extract_l( Mpy_32_16_1( input_Fs, 185 ) ); hDft_ana->dft_trigo_32k_fx = dft_trigo_32k_fx; @@ -139,21 +154,42 @@ static void dft_ana_init_fx( } ELSE { - assert( EQ_32( input_Fs, 48000 ) ); + assert( input_Fs == 48000 ); hDft_ana->dft_trigo_fx = dft_trigo_48k_fx; hDft_ana->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP; hDft_ana->win_ana_fx = win_ana_48k_fx; } +#if 1 // TODO: To be removed later + hDft_ana->dft_trigo_32k = dft_trigo_32k; + if ( input_Fs == 16000 ) + { + hDft_ana->dft_trigo = dft_trigo_32k; + hDft_ana->win_ana = win_ana_16k; + } + else if ( input_Fs == 32000 ) + { + hDft_ana->dft_trigo = dft_trigo_32k; + hDft_ana->win_ana = win_ana_32k; + } + else + { + hDft_ana->dft_trigo = dft_trigo_48k; + hDft_ana->win_ana = win_ana_48k; + } +#endif + return; } #endif + /*-------------------------------------------------------------------* * write_itd_data() * * Bitstream writing of ITDs *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void write_itd_data( ITD_DATA_HANDLE hItd, /* i : ITD data handle */ BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ @@ -203,7 +239,58 @@ static void write_itd_data( } return; } +#else +static void write_itd_data_fx( + ITD_DATA_HANDLE hItd, /* i : ITD data handle */ + BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ +) +{ + Word16 k_offset; + Word16 itd; + k_offset = 1; + move16(); + + push_next_indice( hBstr, ( hItd->itd[k_offset] != 0 ), STEREO_DFT_ITD_MODE_NBITS ); + + IF( hItd->itd_fx[k_offset] != 0 ) + { + itd = hItd->itd_index[k_offset]; + IF( GT_16( itd, 255 ) ) + { + itd = sub( itd, 256 ); + + IF( LT_16( itd, 20 ) ) + { + push_next_indice( hBstr, 1, 1 ); /* use Huffman*/ + push_next_indice( hBstr, 1, 1 ); /* negative */ + push_next_indice( hBstr, dft_code_itd[itd], dft_len_itd[itd] ); + } + ELSE + { + push_next_indice( hBstr, 0, 1 ); /* don't use Huffman */ + push_next_indice( hBstr, 1, 1 ); /* negative */ + push_next_indice( hBstr, itd, STEREO_DFT_ITD_NBITS - 1 ); + } + } + ELSE + { + IF( LT_16( itd, 20 ) ) + { + push_next_indice( hBstr, 1, 1 ); /* use Huffman*/ + push_next_indice( hBstr, 0, 1 ); /* positive */ + push_next_indice( hBstr, dft_code_itd[itd], dft_len_itd[itd] ); + } + ELSE + { + /* don't use Huffman and positive*/ + push_next_indice( hBstr, itd, STEREO_DFT_ITD_NBITS + 1 ); + } + } + } + return; +} +#endif /*-------------------------------------------------------------------* * stereo_coder_tcx() @@ -211,6 +298,7 @@ static void write_itd_data( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void stereo_coder_tcx( STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ Encoder_State **sts, /* i/o: encoder state structure */ @@ -418,14 +506,341 @@ void stereo_coder_tcx( return; } +#else +void stereo_coder_tcx_fx( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ + Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + Word32 *mdst_spectrum_fx[CPE_CHANNELS][NB_DIV], + /* i/o: MDST spectrum */ // Q( q_spec ) (same as spectrum buffer in hTcxEnc) + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], + /* i/o: inverse spectrum */ // Q( q_spec ) (same as spectrum buffer in hTcxEnc) + Word32 *inv_mdst_spectrum_fx[CPE_CHANNELS][NB_DIV], + /* i/o: inverse MDST spectrum */ // Q( q_spec ) (same as spectrum buffer in hTcxEnc) + const Word16 mct_on, /* i : flag mct block (1) or stereo (0) */ + Word16 q_spec ) +{ + STEREO_MDCT_BAND_PARAMETERS *sfbConf = NULL; + Word32 nrgRatio_fx[CPE_CHANNELS]; + Word16 nrgRatio_e[CPE_CHANNELS]; + Word16 nonQNrgRatio_fx[CPE_CHANNELS]; // Q15 + Word16 k; + Word16 nSubframes, L_frameTCX; + Word16 nAvailBitsMS[NB_DIV]; + Word16 tmp, e_tmp; + push_wmops( "stereo_coder_tcx" ); + + + set16_fx( nAvailBitsMS, 0, NB_DIV ); + + nSubframes = ( sts[0]->core == TCX_20_CORE && sts[1]->core == TCX_20_CORE ) ? 1 : NB_DIV; + L_frameTCX = sts[0]->hTcxEnc->L_frameTCX / nSubframes; + + set16_fx( &ms_mask[0][0], 0, MAX_SFB ); + set16_fx( &ms_mask[1][0], 0, MAX_SFB ); + + IF( !mct_on ) + { + IF( EQ_16( sts[0]->core, sts[1]->core ) ) + { + FOR( k = 0; k < nSubframes; k++ ) + { + nonQNrgRatio_fx[k] = GetChannelEnergyRatio_fx( sts, k, k, 1 ); // Q15 + move16(); + + hStereoMdct->global_ild[k] = s_max( 1, s_min( SMDCT_ILD_RANGE - 1, round_fx( L_mult( SMDCT_ILD_RANGE, nonQNrgRatio_fx[k] ) ) ) ); + move16(); + nrgRatio_fx[k] = L_deposit_h( BASOP_Util_Divide1616_Scale( sub( SMDCT_ILD_RANGE, hStereoMdct->global_ild[k] ), hStereoMdct->global_ild[k], &nrgRatio_e[k] ) ); + move32(); + /*nonQNrgRatio[k] = max( 0.5f / SMDCT_ILD_RANGE, min( ( SMDCT_ILD_RANGE - 0.5f ) / SMDCT_ILD_RANGE, nonQNrgRatio[k] ) ); + nonQNrgRatio[k] = 1.0f / nonQNrgRatio[k] - 1.0f;*/ + // Not getting used further + } + } + ELSE + { + nonQNrgRatio_fx[0] = nonQNrgRatio_fx[1] = GetChannelEnergyRatio_fx( sts, 0, nSubframes - 1, 1 ); + move16(); + hStereoMdct->global_ild[0] = s_max( 1, s_min( SMDCT_ILD_RANGE - 1, round_fx( L_mult( SMDCT_ILD_RANGE, nonQNrgRatio_fx[0] ) ) ) ); + move16(); + nrgRatio_fx[0] = nrgRatio_fx[1] = L_deposit_h( BASOP_Util_Divide1616_Scale( sub( SMDCT_ILD_RANGE, hStereoMdct->global_ild[0] ), hStereoMdct->global_ild[0], &nrgRatio_e[0] ) ); /* nrgRatio = nrg[1]/nrg[0] */ + move32(); + nrgRatio_e[1] = nrgRatio_e[0]; + move16(); + /*nonQNrgRatio[0] = nonQNrgRatio[1] = max( 0.5f / SMDCT_ILD_RANGE, min( ( SMDCT_ILD_RANGE - 0.5f ) / SMDCT_ILD_RANGE, nonQNrgRatio[0] ) ); + nonQNrgRatio[0] = nonQNrgRatio[1] = 1.0f / nonQNrgRatio[0] - 1.0f;*/ + // Not getting used further + } + + FOR( k = 0; k < nSubframes; k++ ) + { + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( nrgRatio_fx[k], nrgRatio_e[k], ONE_IN_Q27, 4 ), 1 ) && LT_16( k, ( EQ_16( sts[1]->core, TCX_20_CORE ) ? 1 : NB_DIV ) ) ) + { + L_frameTCX = add( sts[1]->hTcxEnc->L_frameTCX, ( ( sts[1]->last_core == 0 ) ? shr( sts[1]->hTcxEnc->L_frameTCX, 2 ) : 0 ) ); + L_frameTCX = idiv1616( L_frameTCX, ( sts[1]->core == TCX_20_CORE ) ? 1 : NB_DIV ); + + e_tmp = nrgRatio_e[k]; + tmp = Inv16( extract_h( nrgRatio_fx[k] ), &e_tmp ); + tmp = shl( tmp, e_tmp ); + + v_multc_fixed_16( sts[1]->hTcxEnc->spectrum_fx[k], tmp, sts[1]->hTcxEnc->spectrum_fx[k], L_frameTCX ); + v_multc_fixed_16( mdst_spectrum_fx[1][k], tmp, mdst_spectrum_fx[1][k], L_frameTCX ); + } + ELSE IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( nrgRatio_fx[k], nrgRatio_e[k], ONE_IN_Q27, 4 ), -1 ) && LT_16( k, EQ_16( sts[0]->core, TCX_20_CORE ) ? 1 : NB_DIV ) ) + { + L_frameTCX = add( sts[0]->hTcxEnc->L_frameTCX, EQ_16( sts[0]->last_core, 0 ) ? shr( sts[0]->hTcxEnc->L_frameTCX, 2 ) : 0 ); + L_frameTCX = idiv1616( L_frameTCX, ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV ); + + /* This operation is resulting in some high MLDs in fixed point. */ + v_multc_fixed_16( sts[0]->hTcxEnc->spectrum_fx[k], extract_l( L_shr( nrgRatio_fx[k], 16 - nrgRatio_e[k] ) ), sts[0]->hTcxEnc->spectrum_fx[k], L_frameTCX ); + v_multc_fixed_16( mdst_spectrum_fx[0][k], extract_l( L_shr( nrgRatio_fx[k], 16 - nrgRatio_e[k] ) ), mdst_spectrum_fx[0][k], L_frameTCX ); + } + } + } + + IF( + ( NE_16( sts[0]->hTcxEnc->transform_type[0], sts[1]->hTcxEnc->transform_type[0] ) ) || NE_16( sts[0]->hTcxEnc->transform_type[1], sts[1]->hTcxEnc->transform_type[1] ) || ( NE_16( sts[0]->last_core, sts[1]->last_core ) && ( EQ_16( sts[0]->last_core, ACELP_CORE ) || EQ_16( sts[1]->last_core, ACELP_CORE ) ) ) || EQ_16( sts[0]->last_core, ACELP_CORE ) || EQ_16( sts[1]->last_core, ACELP_CORE ) ) + { + hStereoMdct->mdct_stereo_mode[0] = SMDCT_DUAL_MONO; + move16(); + hStereoMdct->mdct_stereo_mode[1] = SMDCT_DUAL_MONO; + move16(); + + + IF( sts[0]->igf ) + { + hStereoMdct->IGFStereoMode[0] = SMDCT_DUAL_MONO; + move16(); + hStereoMdct->IGFStereoMode[1] = SMDCT_DUAL_MONO; + move16(); + } + hStereoMdct->sw_uncorr = 1; + move16(); + + pop_wmops(); + return; + } + ELSE /* decide based on signal */ + { + FOR( k = 0; k < nSubframes; k++ ) + { + IF( EQ_16( sts[0]->core, TCX_20_CORE ) ) + { + sfbConf = &hStereoMdct->stbParamsTCX20; + } + ELSE + { + sfbConf = &hStereoMdct->stbParamsTCX10; + } + IF( EQ_16( sts[0]->last_core, ACELP_CORE ) ) + { + sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; + } + + IF( LT_32( sts[0]->element_brate, IVAS_80k ) && EQ_16( sts[0]->core, sts[1]->core ) && !mct_on ) /* band-wise HF ILD alignment to increase channel compaction */ + { + Word16 sfb = 1; + move16(); + + test(); + WHILE( LT_16( sfb, sfbConf->nBandsStereoCore ) && LT_16( sub( sfbConf->sfbOffset[sfb + 1], sfbConf->sfbOffset[sfb] ), 12 ) ) + { + test(); + sfb = add( sfb, 1 ); /* find start offset */ + } + + FOR( sfb--; sfb < sfbConf->nBandsStereoCore; sfb++ ) /* start one SFB early for the fade-in */ + { + const Word16 startLine = sfbConf->sfbOffset[sfb]; + move16(); + const Word16 endLine = sfbConf->sfbOffset[sfb + 1]; + move16(); + const Word16 sfbWidth = sub( endLine, startLine ); + + nrgRatio_e[0] = nrgRatio_e[1] = sub( Q31, q_spec ); + move16(); + move16(); + + nrgRatio_fx[0] = sum2_32_fx( &sts[0]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth, &nrgRatio_e[0] ); + move32(); + nrgRatio_fx[1] = sum2_32_fx( &sts[1]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth, &nrgRatio_e[1] ); + move32(); + + test(); + IF( !sts[0]->hTcxEnc->fUseTns[k] && !sts[1]->hTcxEnc->fUseTns[k] ) /* no TNS in either ch */ + { + Word32 tmp_fx; + Word16 tmp_e; + tmp_e = sub( Q31, q_spec ); + tmp_fx = sum2_32_fx( &mdst_spectrum_fx[0][k][startLine], sfbWidth, &tmp_e ); + nrgRatio_fx[0] = BASOP_Util_Add_Mant32Exp( nrgRatio_fx[0], nrgRatio_e[0], tmp_fx, tmp_e, &nrgRatio_e[0] ); + tmp_e = sub( Q31, q_spec ); + tmp_fx = sum2_32_fx( &mdst_spectrum_fx[1][k][startLine], sfbWidth, &tmp_e ); + nrgRatio_fx[1] = BASOP_Util_Add_Mant32Exp( nrgRatio_fx[1], nrgRatio_e[1], tmp_fx, tmp_e, &nrgRatio_e[1] ); + } + IF( ( nrgRatio_fx[0] > 0 ) && ( nrgRatio_fx[1] > 0 ) && BASOP_Util_Cmp_Mant32Exp( nrgRatio_fx[0], nrgRatio_e[0], nrgRatio_fx[1], nrgRatio_e[1] ) ) + { + Word16 fTemp_e, tmp_e; + Word32 fTemp_fx = BASOP_Util_Add_Mant32Exp( nrgRatio_fx[0], nrgRatio_e[0], nrgRatio_fx[1], nrgRatio_e[1], &fTemp_e ); + fTemp_e = sub( fTemp_e, 1 ); + nrgRatio_fx[0] = BASOP_Util_Divide3232_Scale_cadence( fTemp_fx, nrgRatio_fx[0], &tmp_e ); + move32(); + nrgRatio_e[0] = add( tmp_e, sub( fTemp_e, nrgRatio_e[0] ) ); + move16(); + nrgRatio_fx[0] = Sqrt32( nrgRatio_fx[0], &nrgRatio_e[0] ); + move32(); + + nrgRatio_fx[1] = BASOP_Util_Divide3232_Scale_cadence( fTemp_fx, nrgRatio_fx[1], &tmp_e ); + move32(); + nrgRatio_e[1] = add( tmp_e, sub( fTemp_e, nrgRatio_e[1] ) ); + move16(); + nrgRatio_fx[1] = Sqrt32( nrgRatio_fx[1], &nrgRatio_e[1] ); + move32(); + + nrgRatio_fx[0] = L_max( ONE_IN_Q27, L_shl_sat( nrgRatio_fx[0], sub( nrgRatio_e[0], 2 ) ) ); // max( 0.25f, min( 4.f, nrgRatio[0] ) ); + move32(); + nrgRatio_fx[1] = L_max( ONE_IN_Q27, L_shl_sat( nrgRatio_fx[1], sub( nrgRatio_e[1], 2 ) ) ); // Q29 + move32(); + nrgRatio_e[0] = Q2; + move16(); + nrgRatio_e[1] = Q2; + move16(); + + IF( ( LT_16( sfbWidth, 12 ) && LT_16( add( sfb, 1 ), sfbConf->nBandsStereoCore ) ) || GT_32( sts[0]->element_brate, IVAS_48k ) ) /* attenuate ILD alignment in the first SFB or at 64k */ + { + nrgRatio_fx[0] = BASOP_Util_fPow( nrgRatio_fx[0], nrgRatio_e[0], ONE_IN_Q29, 0, &nrgRatio_e[0] ); + move32(); + nrgRatio_fx[1] = BASOP_Util_fPow( nrgRatio_fx[1], nrgRatio_e[1], ONE_IN_Q29, 0, &nrgRatio_e[1] ); + move32(); + } + ELSE + { + nrgRatio_fx[0] = Sqrt32( nrgRatio_fx[0], &nrgRatio_e[0] ); + move32(); + nrgRatio_fx[1] = Sqrt32( nrgRatio_fx[1], &nrgRatio_e[1] ); + move32(); + } + + nrgRatio_fx[0] = L_shl( nrgRatio_fx[0], sub( nrgRatio_e[0], 1 ) ); // Q30 + move32(); + nrgRatio_fx[1] = L_shl( nrgRatio_fx[1], sub( nrgRatio_e[1], 1 ) ); // Q30 + move32(); + + + v_multc_fixed( &sts[0]->hTcxEnc->spectrum_fx[k][startLine], nrgRatio_fx[0], &sts[0]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth ); + v_multc_fixed( &mdst_spectrum_fx[0][k][startLine], nrgRatio_fx[0], &mdst_spectrum_fx[0][k][startLine], sfbWidth ); + scale_sig32( &sts[0]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth, Q1 ); // Scaling back to q_spec + scale_sig32( &mdst_spectrum_fx[0][k][startLine], sfbWidth, Q1 ); // Scaling back to q_spec + + v_multc_fixed( &sts[1]->hTcxEnc->spectrum_fx[k][startLine], nrgRatio_fx[1], &sts[1]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth ); + v_multc_fixed( &mdst_spectrum_fx[1][k][startLine], nrgRatio_fx[1], &mdst_spectrum_fx[1][k][startLine], sfbWidth ); + scale_sig32( &sts[1]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth, Q1 ); // Scaling back to q_spec + scale_sig32( &mdst_spectrum_fx[1][k][startLine], sfbWidth, Q1 ); // Scaling back to q_spec + } + } + } + + /* set mask to zero */ + set16_fx( &ms_mask[k][0], 0, MAX_SFB ); + IF( mct_on ) + { + nAvailBitsMS[k] = shl( sts[0]->bits_frame_channel, 1 ); + move16(); + } + ELSE + { + nAvailBitsMS[k] = sts[0]->bits_frame_nominal; + move16(); + } + + nAvailBitsMS[k] = sub( nAvailBitsMS[k], add( sts[0]->side_bits_frame_channel, sts[1]->side_bits_frame_channel ) ); + move16(); + + IF( EQ_16( nSubframes, 2 ) ) + { + nAvailBitsMS[k] = sub( nAvailBitsMS[k], OFFSET_BITS_TCX10 ); + move16(); + } + ELSE + { + nAvailBitsMS[k] = sub( nAvailBitsMS[k], OFFSET_BITS_TCX20 ); + move16(); + } + + nAvailBitsMS[k] = idiv1616( nAvailBitsMS[k], nSubframes ); + move16(); + + MsStereoDecision_fx( sfbConf, sts[0]->hTcxEnc->spectrum_fx[k], sts[1]->hTcxEnc->spectrum_fx[k], inv_spectrum_fx[0][k], inv_spectrum_fx[1][k], q_spec, &hStereoMdct->mdct_stereo_mode[k], &ms_mask[k][0], nAvailBitsMS[k] ); + + IF( sts[0]->igf ) + { + IGFEncStereoEncoder_fx( sfbConf, sts[0]->hIGFEnc, sts[0]->hTcxEnc->spectrum_fx[k], sts[1]->hTcxEnc->spectrum_fx[k], q_spec, &ms_mask[k][0], + &hStereoMdct->IGFStereoMode[k], hStereoMdct->mdct_stereo_mode[k], (Word16) EQ_16( sts[0]->core, TCX_20_CORE ), (Word16) EQ_16( sts[0]->last_core, ACELP_CORE ) ); + } + ELSE + { + hStereoMdct->IGFStereoMode[k] = hStereoMdct->mdct_stereo_mode[k]; + move16(); + } + IF( NE_16( hStereoMdct->mdct_stereo_mode[k], SMDCT_DUAL_MONO ) || NE_16( hStereoMdct->IGFStereoMode[k], SMDCT_DUAL_MONO ) ) + { + + ms_inv_mask_processing_fx( hStereoMdct, sts, ms_mask, k, sts[0]->hTcxEnc->spectrum_fx[k], sts[1]->hTcxEnc->spectrum_fx[k], inv_spectrum_fx[0][k], inv_spectrum_fx[1][k], sfbConf->sfbCnt ); + + ms_processing_fx( hStereoMdct, sts, ms_mask, k, sts[0]->hTcxEnc->spectrum_fx[k], sts[1]->hTcxEnc->spectrum_fx[k], sfbConf->sfbCnt ); + + IF( !sts[0]->hTcxEnc->fUseTns[k] && !sts[1]->hTcxEnc->fUseTns[k] ) + { + sts[0]->hTcxEnc->tns_ms_flag[k] = 1; + move16(); + sts[1]->hTcxEnc->tns_ms_flag[k] = 1; + move16(); + ms_inv_mask_processing_fx( hStereoMdct, sts, ms_mask, k, mdst_spectrum_fx[0][k], mdst_spectrum_fx[1][k], inv_mdst_spectrum_fx[0][k], inv_mdst_spectrum_fx[1][k], -1 ); + + ms_processing_fx( hStereoMdct, sts, ms_mask, k, mdst_spectrum_fx[0][k], mdst_spectrum_fx[1][k], sfbConf->sfbCnt ); + } + } + } /* for k */ + } + /* for bitrate switching determine correlation depending on m/s decision */ + { + Word16 ms_bands[2]; + Word16 sw_uncorr[2], sw_uncorr_mean; + FOR( k = 0; k < nSubframes; k++ ) + { + sfbConf = EQ_16( sts[0]->core, TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + ms_bands[k] = sum_s( ms_mask[k], sfbConf->nBandsStereoCore ); + move16(); + sw_uncorr[k] = sub( 32767, div_s( ms_bands[k], sfbConf->nBandsStereoCore ) ); + move16(); + } + IF( EQ_16( sts[0]->core, TCX_20_CORE ) ) + { + sw_uncorr_mean = sw_uncorr[0]; + move16(); + } + ELSE + { + sw_uncorr_mean = add( shr( sw_uncorr[0], 1 ), shr( sw_uncorr[1], 1 ) ); + } + hStereoMdct->sw_uncorr = extract_l( GT_16( sw_uncorr_mean, 19661 ) ); + move16(); + } + + pop_wmops(); + return; +} +#endif + /*-------------------------------------------------------------------* * ms_processing() * * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ms_processing( STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ Encoder_State **sts, /* i/o: Encoder state structure */ @@ -462,7 +877,47 @@ void ms_processing( return; } +#else +void ms_processing_fx( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ + Encoder_State **sts, /* i/o: Encoder state structure */ + Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + const int16_t iSubframe, /* i : subframe number */ + Word32 x_0_fx[], + /* i/o: spectrum 1 */ // Q( q_x ) + Word32 x_1_fx[], + /* i/o: spectrum 1 */ // Q( q_x ) + Word16 maxSfb /* i : number of stereo frequency bands*/ +) +{ + Word16 sfb; + STEREO_MDCT_BAND_PARAMETERS *sfbConf; + sfbConf = EQ_16( sts[0]->core, TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + + IF( sts[0]->last_core == ACELP_CORE ) + { + assert( EQ_16( sts[1]->last_core, ACELP_CORE ) ); + sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; + } + + if ( EQ_16( maxSfb, -1 ) ) + { + maxSfb = sfbConf->sfbCnt; + move16(); + } + + FOR( sfb = 0; sfb < maxSfb; sfb++ ) + { + IF( NE_16( ms_mask[iSubframe][sfb], 0 ) ) + { + convertToBwMS_fx( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], x_0_fx, x_1_fx, SQRT2_OVER_2_FIXED ); + } + } + + return; +} +#endif /*-------------------------------------------------------------------* * ms_inv_mask_processing() @@ -470,6 +925,7 @@ void ms_processing( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ms_inv_mask_processing( STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ Encoder_State **sts, /* i/o: Encoder state structure */ @@ -521,6 +977,64 @@ void ms_inv_mask_processing( return; } +#else +void ms_inv_mask_processing_fx( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ + Encoder_State **sts, /* i/o: Encoder state structure */ + Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + const Word16 iSubframe, /* i : subframe number */ + const Word32 x_0_fx[], + /* i : spectrum 1 */ // Q( q_x ) + const Word32 x_1_fx[], + /* i : spectrum 2 */ // Q( q_x ) + Word32 x_inv_0_fx[], + /* o : inverse spectrum 1 */ // Q( q_x ) + Word32 x_inv_1_fx[], + /* o : inverse spectrum 2 */ // Q( q_x ) + Word16 maxSfb /* i : number of stereo frequency bands*/ +) +{ + Word16 sfb; + STEREO_MDCT_BAND_PARAMETERS *sfbConf; + Word16 nSubframes, L_subframeTCX; + + nSubframes = ( sts[0]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + L_subframeTCX = idiv1616( sts[0]->hTcxEnc->L_frameTCX, nSubframes ); + sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + + IF( EQ_16( sts[0]->last_core, ACELP_CORE ) ) + { + assert( EQ_16( sts[1]->last_core, ACELP_CORE ) ); + sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; + } + + IF( EQ_16( maxSfb, -1 ) ) + { + maxSfb = sfbConf->sfbCnt; + move16(); + } + + FOR( sfb = 0; sfb < maxSfb; sfb++ ) + { + mvl2l( &x_0_fx[sfbConf->sfbOffset[sfb]], &x_inv_0_fx[sfbConf->sfbOffset[sfb]], sfbConf->sfbOffset[sfb + 1] - sfbConf->sfbOffset[sfb] ); + mvl2l( &x_1_fx[sfbConf->sfbOffset[sfb]], &x_inv_1_fx[sfbConf->sfbOffset[sfb]], sfbConf->sfbOffset[sfb + 1] - sfbConf->sfbOffset[sfb] ); + + IF( EQ_16( ms_mask[iSubframe][sfb], 0 ) ) + { + convertToBwMS_fx( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], x_inv_0_fx, x_inv_1_fx, SQRT2_OVER_2_FIXED ); + } + } + + /* set rest of inverse spectrum to zero */ + IF( GT_16( L_subframeTCX, sfbConf->sfbOffset[maxSfb] ) ) + { + set_zero_fx( &x_inv_0_fx[sfbConf->sfbOffset[maxSfb]], sub( L_subframeTCX, sfbConf->sfbOffset[maxSfb] ) ); + set_zero_fx( &x_inv_1_fx[sfbConf->sfbOffset[maxSfb]], sub( L_subframeTCX, sfbConf->sfbOffset[maxSfb] ) ); + } + + return; +} +#endif /*-------------------------------------------------------------------* @@ -529,6 +1043,7 @@ void ms_inv_mask_processing( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED int16_t write_stereo_to_bitstream( STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ Encoder_State **sts, /* i/o: Encoder state structure */ @@ -629,7 +1144,137 @@ int16_t write_stereo_to_bitstream( if ( hStereoMdct->IGFStereoMode[k] == SMDCT_BW_MS ) { - for ( i = sfbConf->nBandsStereoCore; i < sfbConf->sfbCnt; i++ ) + for ( i = sfbConf->nBandsStereoCore; i < sfbConf->sfbCnt; i++ ) + { + push_next_indice( hBstr, ms_mask[k][i] ? 1 : 0, 1 ); + } + } + } + } + + return ( hBstr->nb_bits_tot - start_bits ); +} +#else +Word16 write_stereo_to_bitstream( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ + Encoder_State **sts, /* i/o: Encoder state structure */ + Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ + const Word16 mct_on, /* i : flag mct block (1) or stereo (0)*/ + BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ +) +{ + Word16 i, k, nSubframes; + UWord16 mdct_stereo_mode, stereo_mode_bits; + STEREO_MDCT_BAND_PARAMETERS *sfbConf; + Word16 start_bits = hBstr->nb_bits_tot; + move16(); + + if ( !mct_on ) + { + assert( ( EQ_16( sts[0]->hTcxEnc->transform_type[0], sts[1]->hTcxEnc->transform_type[0] ) && EQ_16( sts[0]->hTcxEnc->transform_type[1], sts[1]->hTcxEnc->transform_type[1] ) ) || ( EQ_16( hStereoMdct->mdct_stereo_mode[0], SMDCT_DUAL_MONO ) && EQ_16( hStereoMdct->mdct_stereo_mode[1], SMDCT_DUAL_MONO ) ) ); + } + + nSubframes = ( EQ_16( sts[0]->core, TCX_10_CORE ) || NE_16( sts[0]->core, sts[1]->core ) ) ? NB_DIV : 1; + move16(); + sfbConf = EQ_16( sts[0]->core, TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + move16(); + + IF( EQ_16( sts[0]->last_core, ACELP_CORE ) ) + { + assert( EQ_16( sts[1]->ini_frame, 0 ) || EQ_16( sts[1]->last_core, ACELP_CORE ) ); + sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; + } + + IF( hStereoMdct->hItd != NULL ) + { + write_itd_data_fx( hStereoMdct->hItd, hBstr ); + } + + FOR( k = 0; k < nSubframes; k++ ) + { + mdct_stereo_mode = 0; + move16(); + stereo_mode_bits = 1; + move16(); + + SWITCH( hStereoMdct->mdct_stereo_mode[k] ) + { + case SMDCT_DUAL_MONO: + mdct_stereo_mode = 0; + move16(); + stereo_mode_bits = 1; + move16(); + BREAK; + case SMDCT_MS_FULL: + mdct_stereo_mode = 2; + move16(); + stereo_mode_bits = 2; + move16(); + BREAK; + case SMDCT_BW_MS: + mdct_stereo_mode = 3; + move16(); + stereo_mode_bits = 2; + move16(); + BREAK; + default: + assert( !"Not supported MDCT stereo mode\n" ); + } + + push_next_indice( hBstr, mdct_stereo_mode, stereo_mode_bits ); + + IF( !mct_on ) + { + IF( EQ_16( sts[0]->core, sts[1]->core ) || ( k == 0 ) ) + { + push_next_indice( hBstr, hStereoMdct->global_ild[k], SMDCT_GLOBAL_ILD_BITS ); + } + } + + IF( EQ_16( hStereoMdct->mdct_stereo_mode[k], SMDCT_BW_MS ) ) + { + FOR( i = 0; i < sfbConf->nBandsStereoCore; i++ ) + { + push_next_indice( hBstr, ms_mask[k][i] ? 1 : 0, 1 ); + } + } + + IF( sts[0]->igf ) + { + mdct_stereo_mode = 0; + move16(); + stereo_mode_bits = 1; + move16(); + SWITCH( hStereoMdct->IGFStereoMode[k] ) + { + case SMDCT_DUAL_MONO: + mdct_stereo_mode = 0; + move16(); + stereo_mode_bits = 1; + move16(); + BREAK; + case SMDCT_MS_FULL: + mdct_stereo_mode = 2; + move16(); + stereo_mode_bits = 2; + move16(); + BREAK; + case SMDCT_BW_MS: + mdct_stereo_mode = 3; + move16(); + stereo_mode_bits = 2; + move16(); + BREAK; + default: + assert( !"Not supported MDCT stereo mode\n" ); + } + + push_next_indice( hBstr, mdct_stereo_mode, stereo_mode_bits ); + + + IF( EQ_16( hStereoMdct->IGFStereoMode[k], SMDCT_BW_MS ) ) + { + FOR( i = sfbConf->nBandsStereoCore; i < sfbConf->sfbCnt; i++ ) { push_next_indice( hBstr, ms_mask[k][i] ? 1 : 0, 1 ); } @@ -637,8 +1282,9 @@ int16_t write_stereo_to_bitstream( } } - return ( hBstr->nb_bits_tot - start_bits ); + return sub( hBstr->nb_bits_tot, start_bits ); } +#endif /*-------------------------------------------------------------------* * Band-wise M/S stereo processing @@ -646,6 +1292,7 @@ int16_t write_stereo_to_bitstream( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void convertToBwMS( const int16_t startLine, /* i : start line of sfb */ const int16_t stopLine, /* i : stop line of sfb */ @@ -666,6 +1313,33 @@ static void convertToBwMS( return; } +#else +static void convertToBwMS_fx( + const Word16 startLine, /* i : start line of sfb */ + const Word16 stopLine, /* i : stop line of sfb */ + Word32 x0[], + /* i/o: mid/left channel coefficients */ /* Q_x */ + Word32 x1[], + /* i/o: side/right channel coefficients */ /* Q_x */ + const Word32 norm_fac /* i : normalization factor */ /* Q31 */ +) +{ + Word16 j; + Word32 tmpValue_fx; + + FOR( j = startLine; j < stopLine; j++ ) + { + tmpValue_fx = x0[j]; + move32(); + x0[j] = Mpy_32_32( L_add( x0[j], x1[j] ), norm_fac ); + move32(); + x1[j] = Mpy_32_32( L_sub( tmpValue_fx, x1[j] ), norm_fac ); + move32(); + } + + return; +} +#endif /*-------------------------------------------------------------------* * convertToMS() @@ -673,6 +1347,7 @@ static void convertToBwMS( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void convertToMS( const int16_t L_frame, /* i : frame length */ float x0[], /* i/o: mid/left channel coefficients */ @@ -684,6 +1359,21 @@ void convertToMS( return; } +#else +void convertToMS_fx( + const Word16 L_frame, /* i : frame length */ + Word32 x0[], + /* i/o: mid/left channel coefficients */ // Q(q_x) + Word32 x1[], + /* i/o: side/right channel coefficients */ // Q(q_x) + const Word32 norm_fac /* i : normalization factor */ // Q31 +) +{ + convertToBwMS_fx( 0, L_frame, x0, x1, norm_fac ); + + return; +} +#endif /*-------------------------------------------------------------------* * SQ_gain_estimate_stereo() @@ -692,6 +1382,7 @@ void convertToMS( *-------------------------------------------------------------------*/ /*! r: SQ gain */ +#ifndef IVAS_FLOAT_FIXED static float SQ_gain_estimate_stereo( float xL[], /* i : L vector to quantize */ float xR[], /* i : R vector to quantize */ @@ -761,6 +1452,104 @@ static float SQ_gain_estimate_stereo( /* return gain */ return powf( 10.0f, 0.45f + 0.5f * offset ); } +#else +static Word32 SQ_gain_estimate_stereo_fx( // e_res + Word32 xL_fx[], + /* i : L vector to quantize */ // e_xL + Word16 e_xL, + Word32 xR_fx[], + /* i : R vector to quantize */ // e_xR + Word16 e_xR, + const Word16 nbitsSQ, /* i : number of bits targeted */ + const Word16 lg, /* i : vector size (2048 max) */ + Word16 *e_res ) +{ + Word16 i, q, iter, e_ener, e_tmp; + Word32 ener_fx, tmp_32, target_fx, fac_fx, offset_fx; + Word32 en_fx[N_MAX / 2]; // Q(26) + Word16 lg2, lg_4, lg2_4; + + lg_4 = shr( lg, 2 ); + lg2_4 = shl( lg_4, 1 ); + lg2 = shl( lg2_4, 2 ); + i = 0; + move16(); + + set32_fx( en_fx, 21474836 /* 0.01 in Q31 */, N_MAX / 2 ); + + /* energy of quadruples with 9dB offset */ + /* ignore that we may take no all lines into account, max. 3 lines at the upper end of the spectrum can be missed (if lg is not a multiple of 4, happens also in SQGain()*/ + + FOR( q = 0; q < lg_4; q++ ) + { + ener_fx = BASOP_Util_Add_Mant32Exp( 21474836, 0, Mpy_32_32( xL_fx[i], xL_fx[i] ), e_xL * 2, &e_ener ); + ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xL_fx[i + 1], xL_fx[i + 1] ), e_xL * 2, &e_ener ); + ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xL_fx[i + 2], xL_fx[i + 2] ), e_xL * 2, &e_ener ); + ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xL_fx[i + 3], xL_fx[i + 3] ), e_xL * 2, &e_ener ); + en_fx[q] = BASOP_Util_Log2( ener_fx ); /* saves a MAC */ + move32(); + en_fx[q] = Mpy_32_16_1( L_add( e_ener * ONE_IN_Q25, en_fx[q] ), 9864 /* log10(2) in Q15 */ ); // Q(25) + move32(); + i = add( i, 4 ); + } + i = 0; + FOR( ; q < lg2_4; q++ ) + { + ener_fx = BASOP_Util_Add_Mant32Exp( 21474836, 0, Mpy_32_32( xR_fx[i], xR_fx[i] ), e_xR * 2, &e_ener ); + ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xR_fx[i + 1], xR_fx[i + 1] ), e_xR * 2, &e_ener ); + ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xR_fx[i + 2], xR_fx[i + 2] ), e_xR * 2, &e_ener ); + ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xR_fx[i + 3], xR_fx[i + 3] ), e_xR * 2, &e_ener ); + en_fx[q] = BASOP_Util_Log2( ener_fx ); /* saves a MAC */ + move32(); + en_fx[q] = Mpy_32_16_1( L_add( e_ener * ONE_IN_Q25, en_fx[q] ), 9864 /* log10(2) in Q15 */ ); // Q(25) + move32(); + i = add( i, 4 ); + } + + /* SQ scale: 4 bits / 6 dB per quadruple */ + target_fx = L_mult( 19660 /* 0.15 in Q17 */, sub( nbitsSQ, shr( lg2, 4 ) ) ); // Q(18) + fac_fx = 429496729; /* 12.8 in Q25 */ + move32(); + offset_fx = fac_fx; + move32(); + + /* find offset (0 to 128 dB with step of 0.125dB) */ + FOR( iter = 0; iter < 10; iter++ ) + { + fac_fx = L_shr( fac_fx, 1 ); + offset_fx = L_sub( offset_fx, fac_fx ); + ener_fx = 0; + move32(); + e_ener = 0; + move16(); + + FOR( i = 0; i < lg2_4; i++ ) + { + tmp_32 = L_sub( en_fx[i], offset_fx ); + e_tmp = 6; + move16(); + + /* avoid SV with 1 bin of amp < 0.5f */ + IF( GT_32( tmp_32, 10066329 ) ) + { + ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, tmp_32, e_tmp, &e_ener ); + + /* if ener is above target -> break and increase offset */ + IF( L_shl_sat( ener_fx, sub( e_ener, Q13 ) ) > target_fx ) + { + offset_fx = L_add( offset_fx, fac_fx ); + BREAK; + } + } + } + } + + /* return gain */ + tmp_32 = L_add( 12539858, Mpy_32_16_1( offset_fx, 13606 ) ); // Q23 + + return BASOP_util_Pow2( tmp_32, Q8, e_res ); +} +#endif /*-------------------------------------------------------------------* * QuantSpecEstimateBits() @@ -768,6 +1557,7 @@ static float SQ_gain_estimate_stereo( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static int16_t QuantSpecEstimateBits( float *spec, float G, @@ -791,6 +1581,35 @@ static int16_t QuantSpecEstimateBits( return sqBits; } +#else +static Word16 QuantSpecEstimateBits_fx( + Word32 *spec_fx, + Word16 spec_e, + Word16 G_fx, + Word16 G_e, + const Word16 length, + const Word16 nBitsAvailable, + Word16 sqQ[] ) +{ + Word16 stop, sqBits, nEncoded; + Word16 lastnz; + + tcx_scalar_quantization_ivas_fx( spec_fx, spec_e, sqQ, length, G_fx, G_e, 16384, NULL, 1 ); + + stop = 0; + move16(); + + sqBits = RCcontextMapping_encode2_estimate_no_mem_s17_LCS( sqQ, length, &lastnz, &nEncoded, nBitsAvailable, &stop, 0, NULL ); + + if ( stop != 0 ) + { + sqBits = stop; + move16(); + } + + return sqBits; +} +#endif /*-------------------------------------------------------------------* * context_update() @@ -798,6 +1617,7 @@ static int16_t QuantSpecEstimateBits( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void context_update( HANDLE_RC_CONTEXT_MEM ctxSrc, HANDLE_RC_CONTEXT_MEM ctxTarget, @@ -813,6 +1633,24 @@ static void context_update( return; } +#else +static void context_update( + HANDLE_RC_CONTEXT_MEM ctxSrc, + HANDLE_RC_CONTEXT_MEM ctxTarget, + const Word16 endLine ) +{ + Word16 last_nz; + + /* check if last_nz of target is smaller than endLine, save and update */ + last_nz = s_max( ctxTarget->lastnz, endLine ); + + mvc2c( (UWord8 *) ctxSrc, (UWord8 *) ctxTarget, sizeof( RC_CONTEXT_MEM ) ); + ctxTarget->lastnz = last_nz; + move16(); + + return; +} +#endif /*-------------------------------------------------------------------* * GetChannelEnergyRatio() @@ -820,6 +1658,7 @@ static void context_update( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static float GetChannelEnergyRatio( Encoder_State **sts, /* i/o: Encoder state structure */ const int16_t iFirstSubframe, @@ -858,6 +1697,75 @@ static float GetChannelEnergyRatio( return ( nrg[0] + nrg[1] ) > 0 ? nrg[0] / ( nrg[0] + nrg[1] ) : -1.0f; } +#else +static Word16 GetChannelEnergyRatio_fx( // Q15 + Encoder_State **sts, /* i/o: Encoder state structure */ + const Word16 iFirstSubframe, + const Word16 iLastSubframe, + const UWord8 ratioInRmsDomain ) +{ + Word16 ch, n, i; + Word32 nrg_fx[2]; + Word16 nrg_e[2]; + + /* Calculate energies per channel */ + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + const Encoder_State *st = sts[ch]; + + Word16 nSubframes = NB_DIV; + move16(); + + if ( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) ) + { + nSubframes = 1; + move16(); + } + + Word16 L_subframeTCX = shr( st->hTcxEnc->L_frameTCX, sub( nSubframes, 1 ) ); + + if ( st->last_core == ACELP_CORE ) + { + L_subframeTCX = add( L_subframeTCX, shr( L_subframeTCX, 2 ) ); + } + assert( iFirstSubframe >= 0 && ( iFirstSubframe <= iLastSubframe ) ); + + nrg_fx[ch] = 0; + move32(); + nrg_e[ch] = 0; + move16(); + + FOR( n = iFirstSubframe; n <= s_min( nSubframes - 1, iLastSubframe ); n++ ) + { + FOR( i = 0; i < L_subframeTCX; i++ ) + { + nrg_fx[ch] = BASOP_Util_Add_Mant32Exp( nrg_fx[ch], nrg_e[ch], Mpy_32_32( st->hTcxEnc->spectrum_fx[n][i], st->hTcxEnc->spectrum_fx[n][i] ), shl( st->hTcxEnc->spectrum_e[n], 1 ), &nrg_e[ch] ); + move32(); + } + } + IF( ratioInRmsDomain && nrg_fx[ch] ) + { + nrg_fx[ch] = Sqrt32( nrg_fx[ch], &nrg_e[ch] ); + move32(); + } + } + + IF( L_add_sat( nrg_fx[0], nrg_fx[1] ) ) + { + nrg_fx[1] = BASOP_Util_Add_Mant32Exp( nrg_fx[0], nrg_e[0], nrg_fx[1], nrg_e[1], &nrg_e[1] ); + move32(); + + IF( NE_16( nrg_e[1], nrg_e[0] ) ) + { + nrg_fx[0] = L_shr( nrg_fx[0], sub( nrg_e[1], nrg_e[0] ) ); + move32(); + } + return divide3232( nrg_fx[0], nrg_fx[1] ); + } + + return MIN_16; +} +#endif /*-------------------------------------------------------------------* * FindSplitRatio() @@ -865,6 +1773,7 @@ static float GetChannelEnergyRatio( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void FindSplitRatio( CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ Encoder_State **sts /* i/o: Encoder state structure */ @@ -875,7 +1784,6 @@ void FindSplitRatio( /* Calculate split ratio and quantize it */ hCPE->hStereoMdct->split_ratio = SMDCT_EQUAL_RATIO_RANGE; /* Equal bits to both channels */ - ratio_float = GetChannelEnergyRatio( sts, 0, 1, highRateMdctStereo ); if ( ratio_float >= 0 ) @@ -896,6 +1804,45 @@ void FindSplitRatio( return; } +#else +void FindSplitRatio_fx( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + Encoder_State **sts /* i/o: Encoder state structure */ +) +{ + const UWord8 highRateMdctStereo = ( LT_32( sts[0]->element_brate, IVAS_80k ) && EQ_16( sts[0]->core, sts[1]->core ) && EQ_16( sts[0]->element_mode, IVAS_CPE_MDCT ) && sts[0]->hTcxEnc->enc_ste_pre_corr_past ? 0 : 1 ); + move16(); + Word16 ratio_fx; + + /* Calculate split ratio and quantize it */ + hCPE->hStereoMdct->split_ratio = SMDCT_EQUAL_RATIO_RANGE; /* Equal bits to both channels */ + move16(); + + ratio_fx = GetChannelEnergyRatio_fx( sts, 0, 1, highRateMdctStereo ); // Q15 + + IF( ratio_fx >= 0 ) + { + hCPE->hStereoMdct->split_ratio = round_fx( L_mult( SMDCT_BITRATE_RATIO_RANGE, ratio_fx ) ); + move16(); + /* Tuning to get closer to the optimal split ratio */ + IF( LT_32( L_mult0( 9, ratio_fx ), 8 * ONE_IN_Q15 ) && GT_16( hCPE->hStereoMdct->split_ratio, SMDCT_EQUAL_RATIO_RANGE + ( SMDCT_BITRATE_RATIO_RANGE >> 4 ) ) ) + { + hCPE->hStereoMdct->split_ratio = sub( hCPE->hStereoMdct->split_ratio, SMDCT_BITRATE_RATIO_RANGE >> 3 ); + move16(); + } + IF( GT_32( L_mult0( 9, ratio_fx ), 1 * ONE_IN_Q15 ) && LT_16( hCPE->hStereoMdct->split_ratio, SMDCT_EQUAL_RATIO_RANGE - ( SMDCT_BITRATE_RATIO_RANGE >> 4 ) ) ) + { + hCPE->hStereoMdct->split_ratio = add( hCPE->hStereoMdct->split_ratio, SMDCT_BITRATE_RATIO_RANGE >> 3 ); + move16(); + } + + hCPE->hStereoMdct->split_ratio = s_min( SMDCT_BITRATE_RATIO_RANGE - 1, s_max( 1, hCPE->hStereoMdct->split_ratio ) ); + move16(); + } + + return; +} +#endif /*-------------------------------------------------------------------* * MsStereoDecision() @@ -903,6 +1850,7 @@ void FindSplitRatio( * *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED static void MsStereoDecision( STEREO_MDCT_BAND_PARAMETERS *sfbParam, float *specL, @@ -1023,6 +1971,153 @@ static void MsStereoDecision( return; } +#else +static void MsStereoDecision_fx( + STEREO_MDCT_BAND_PARAMETERS *sfbParam, + Word32 *specL_fx, /* Q( q_spec ) */ + Word32 *specR_fx, /* Q( q_spec ) */ + Word32 *specM_fx, + /* scratch buffer for M, use buffer for inverse MS mask spectrum */ /* Q( q_spec ) */ + Word32 *specS_fx, + /* scratch buffer for M, use buffer for inverse MS mask spectrum */ /* Q( q_spec ) */ + Word16 q_spec, + Word16 *mdct_stereo_mode, /* output */ + Word16 *msMask, /* output */ + const Word16 nBitsAvailable ) +{ + Word16 length = sfbParam->sfbOffset[sfbParam->nBandsStereoCore]; + + Word16 bitsL, bitsR, bitsM, bitsS; + Word16 bitsBW, bitsLR, bitsMS; + Word16 sfb, i; + Word16 nMSOn; /* Number of MS active bands */ + Word16 quantSpecL[N_MAX]; + Word16 quantSpecR[N_MAX]; + Word16 quantSpecM[N_MAX]; + Word16 quantSpecS[N_MAX]; + RC_CONTEXT_MEM ctxMem[4]; + HANDLE_RC_CONTEXT_MEM ctxL, ctxR, ctxM, ctxS; + + set16_fx( quantSpecL, 0, N_MAX ); + set16_fx( quantSpecR, 0, N_MAX ); + set16_fx( quantSpecM, 0, N_MAX ); + set16_fx( quantSpecS, 0, N_MAX ); + + assert( GT_16( nBitsAvailable, 0 ) ); + + ctxL = &ctxMem[0]; + ctxR = &ctxMem[1]; + ctxM = &ctxMem[2]; + ctxS = &ctxMem[3]; + Word16 specL_e, specR_e, specM_e, specS_e, G_fx, G_e; + Word16 e_GLR; + Word32 GLR_fx; + + specL_e = sub( Q31, q_spec ); + specR_e = sub( Q31, q_spec ); + specM_e = sub( Q31, q_spec ); + specS_e = sub( Q31, q_spec ); + + GLR_fx = SQ_gain_estimate_stereo_fx( specL_fx, specL_e, specR_fx, specR_e, nBitsAvailable, length, &e_GLR ); + + FOR( i = 0; i < length; i++ ) + { + specM_fx[i] = Mpy_32_32( L_add( specL_fx[i], specR_fx[i] ), SQRT2_OVER_2_FIXED ); // Q( q_spec ) + move32(); + specS_fx[i] = Mpy_32_32( L_sub( specL_fx[i], specR_fx[i] ), SQRT2_OVER_2_FIXED ); // Q( q_spec ) + move32(); + } + + G_fx = extract_h( GLR_fx ); /* seems to be favourable to underestimate a bit */ + G_e = sub( e_GLR, 1 ); + + /* do the full spectrum estimates already here, as side effect we get the quantized spectra... */ + bitsLR = add( QuantSpecEstimateBits_fx( specL_fx, specL_e, G_fx, G_e, length, nBitsAvailable, quantSpecL ), QuantSpecEstimateBits_fx( specR_fx, specR_e, G_fx, G_e, length, nBitsAvailable, quantSpecR ) ); + bitsMS = add( QuantSpecEstimateBits_fx( specM_fx, specM_e, G_fx, G_e, length, nBitsAvailable, quantSpecM ), QuantSpecEstimateBits_fx( specS_fx, specS_e, G_fx, G_e, length, nBitsAvailable, quantSpecS ) ); + + /* clean-up MS scratch buffers */ + set32_fx( specM_fx, 0, length ); + set32_fx( specS_fx, 0, length ); + + nMSOn = 0; + move16(); + bitsBW = 0; + move16(); + + RCcontextMapping_encode2_estimate_bandWise_start( quantSpecL, length, nBitsAvailable, ctxL ); + RCcontextMapping_encode2_estimate_bandWise_start( quantSpecR, length, nBitsAvailable, ctxR ); + + bitsBW = add( bitsBW, RCcontextMapping_encode2_estimate_bandWise_start( quantSpecM, length, nBitsAvailable, ctxM ) ); + bitsBW = add( bitsBW, RCcontextMapping_encode2_estimate_bandWise_start( quantSpecS, length, nBitsAvailable, ctxS ) ); + + /*find_max_lastnz(ctxL,ctxR,ctxM,ctxS);*/ + + FOR( sfb = 0; sfb < sfbParam->nBandsStereoCore; sfb++ ) + { + const Word16 startline = sfbParam->sfbOffset[sfb]; + move16(); + const Word16 endline = sfbParam->sfbOffset[sfb + 1]; + move16(); + + bitsL = RCcontextMapping_encode2_estimate_bandWise( quantSpecL, startline, endline, ctxL ); + bitsR = RCcontextMapping_encode2_estimate_bandWise( quantSpecR, startline, endline, ctxR ); + bitsM = RCcontextMapping_encode2_estimate_bandWise( quantSpecM, startline, endline, ctxM ); + bitsS = RCcontextMapping_encode2_estimate_bandWise( quantSpecS, startline, endline, ctxS ); + + IF( LE_16( add( bitsM, bitsS ), add( bitsL, bitsR ) ) ) + { + msMask[sfb] = 1; + move16(); + nMSOn = add( nMSOn, 1 ); + context_update( ctxM, ctxL, endline ); + context_update( ctxS, ctxR, endline ); + bitsBW = add( bitsBW, add( bitsM, bitsS ) ); + } + ELSE + { + msMask[sfb] = 0; + move16(); + + context_update( ctxL, ctxM, endline ); + context_update( ctxR, ctxS, endline ); + bitsBW = add( bitsBW, add( bitsL, bitsR ) ); + } + } + + bitsBW = add( bitsBW, sfbParam->nBandsStereoCore ); /* Signaling bits */ + + IF( LT_16( bitsLR, bitsBW ) ) + { + nMSOn = 0; + move16(); + set16_fx( msMask, 0, sfbParam->sfbCnt ); + bitsBW = bitsLR; + move16(); + } + + IF( LT_16( bitsMS, bitsBW ) ) + { + nMSOn = sfbParam->nBandsStereoCore; + move16(); + set16_fx( msMask, 1, sfbParam->sfbCnt ); + } + + *mdct_stereo_mode = SMDCT_BW_MS; + move16(); + IF( EQ_16( nMSOn, sfbParam->nBandsStereoCore ) ) + { + *mdct_stereo_mode = SMDCT_MS_FULL; + move16(); + } + ELSE IF( nMSOn == 0 ) + { + *mdct_stereo_mode = SMDCT_DUAL_MONO; + move16(); + } + + return; +} +#endif /*-----------------------------------------------------------------------* @@ -1161,6 +2256,7 @@ void initMdctStereoEncData_fx( * initialize encoder mdct ITD handling structures *-----------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED ivas_error initMdctItdHandling( STEREO_MDCT_ENC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ const int32_t input_Fs /* i : input sampling rate */ @@ -1190,8 +2286,8 @@ ivas_error initMdctItdHandling( return IVAS_ERR_OK; } -#ifdef IVAS_FLOAT_FIXED -ivas_error initMdctItdHandling_fx( +#else +ivas_error initMdctItdHandling( STEREO_MDCT_ENC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ const Word32 input_Fs /* i : input sampling rate */ ) @@ -1214,9 +2310,12 @@ ivas_error initMdctItdHandling_fx( /*Initialize ITD parameters*/ stereo_enc_itd_init_fx( hStereoMdct->hItd ); +#if 1 // TODO: To be removed later + stereo_enc_itd_init( hStereoMdct->hItd ); +#endif /*Initialize DFT analysis parameters*/ - dft_ana_init_fx( hStereoMdct->hDft_ana, input_Fs ); + dft_ana_init( hStereoMdct->hDft_ana, input_Fs ); return IVAS_ERR_OK; } @@ -1227,6 +2326,7 @@ ivas_error initMdctItdHandling_fx( * destroy MDCT stereo handle *-------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void stereo_mdct_enc_destroy( STEREO_MDCT_ENC_DATA_HANDLE *hStereoMdct /* i/o: encoder MDCT stereo handle */ ) @@ -1248,3 +2348,26 @@ void stereo_mdct_enc_destroy( return; } +#else +void stereo_mdct_enc_destroy( + STEREO_MDCT_ENC_DATA_HANDLE *hStereoMdct /* i/o: encoder MDCT stereo handle */ +) +{ + IF( ( *hStereoMdct )->hDft_ana != NULL ) + { + free( ( *hStereoMdct )->hDft_ana ); + ( *hStereoMdct )->hDft_ana = NULL; + } + + IF( ( *hStereoMdct )->hItd != NULL ) + { + free( ( *hStereoMdct )->hItd ); + ( *hStereoMdct )->hItd = NULL; + } + + free( *hStereoMdct ); + *hStereoMdct = NULL; + + return; +} +#endif diff --git a/lib_enc/ivas_stereo_switching_enc.c b/lib_enc/ivas_stereo_switching_enc.c index c7ead90bc..1a333aaf7 100644 --- a/lib_enc/ivas_stereo_switching_enc.c +++ b/lib_enc/ivas_stereo_switching_enc.c @@ -513,6 +513,10 @@ ivas_error stereo_memory_enc( } st->hTcxEnc->spectrum[0] = st->hTcxEnc->spectrum_long; st->hTcxEnc->spectrum[1] = st->hTcxEnc->spectrum_long + N_TCX10_MAX; +#ifdef IVAS_FLOAT_FIXED + st->hTcxEnc->spectrum_fx[0] = st->hTcxEnc->spectrum_long_fx; + st->hTcxEnc->spectrum_fx[1] = st->hTcxEnc->spectrum_long_fx + N_TCX10_MAX; +#endif set_f( st->hTcxEnc->old_out, 0, L_FRAME32k ); set_f( st->hTcxEnc->spectrum_long, 0, N_MAX ); st->hTcxEnc->tfm_mem = 0.75f; diff --git a/lib_enc/long_enr_fx.c b/lib_enc/long_enr_fx.c index e7f141b5f..05ea4ee26 100644 --- a/lib_enc/long_enr_fx.c +++ b/lib_enc/long_enr_fx.c @@ -4,7 +4,6 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -//#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" #include "stl.h" #include "prot_fx1.h" /* Function prototypes */ @@ -17,6 +16,129 @@ * * Compute relative energy, long-term average total noise energy and total active speech energy *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_long_enr_fx( + Encoder_State *st_fx, /* i/o: state structure */ + const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) */ + const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ + Word16 high_lpn_flag, /* i : sp/mus LPN flag */ + FRONT_VAD_ENC_HANDLE hFrontVad[], /* i/o: front-VAD handles */ + const Word16 n_chan, /* i : number of channels */ + const Word16 localVAD_HE_SAD_LR[], /* i : HE-SAD flag without hangover LR channels */ + const Word16 Etot_LR[] /* i : total channel energy LR channels */ + +) +{ + Word16 tmp; + Word16 alpha; + NOISE_EST_HANDLE hNoiseEst = st_fx->hNoiseEst; + + /*-----------------------------------------------------------------* + * Compute long term estimate of total noise energy + * and total active speech energy + *-----------------------------------------------------------------*/ + Word16 n; + IF( hFrontVad != NULL ) + { + IF( LT_16( hFrontVad[0]->ini_frame, 4 ) ) + { + FOR( n = 0; n < n_chan; n++ ) + { + hFrontVad[n]->lp_noise_fx = hFrontVad[n]->hNoiseEst->totalNoise_fx; + tmp = add( hFrontVad[n]->lp_noise_fx, 2560 ); + + IF( LT_16( hFrontVad[n]->lp_speech_fx, tmp ) ) + { + hFrontVad[n]->lp_speech_fx = tmp; + move16(); + } + } + } + ELSE + { + Word16 smooth_prev, smooth_curr; + + IF( LT_16( hFrontVad[0]->ini_frame, 150 ) ) + { + smooth_prev = 31130; + smooth_curr = 1638; + } + ELSE + { + smooth_prev = 32113; + smooth_curr = 655; + } + + FOR( n = 0; n < n_chan; n++ ) + { + hFrontVad[n]->lp_noise_fx = add( mult_r( smooth_prev, hFrontVad[n]->lp_noise_fx ), mult_r( smooth_curr, hFrontVad[n]->hNoiseEst->totalNoise_fx ) ); + + IF( localVAD_HE_SAD_LR[n] && !high_lpn_flag ) + { + IF( LT_16( sub( hFrontVad[n]->lp_speech_fx, Etot_LR[n] ), 2560 ) ) + { + hFrontVad[n]->lp_speech_fx = add( mult_r( 32113, hFrontVad[n]->lp_speech_fx ), mult_r( 655, Etot_LR[n] ) ); + } + ELSE + { + hFrontVad[n]->lp_speech_fx = sub( hFrontVad[n]->lp_speech_fx, 13 ); + } + } + } + } + FOR( n = 0; n < n_chan; n++ ) + { + hFrontVad[n]->hNoiseEst->Etot_last_fx = Etot_LR[n]; + move16(); + } + } + ELSE + { + IF( LT_16( st_fx->ini_frame, 4 ) ) + { + st_fx->lp_noise_fx = hNoiseEst->totalNoise_fx; + move16(); + tmp = add( st_fx->lp_noise_fx, 2560 ); /*10.0 in Q8*/ + st_fx->lp_speech_fx = s_max( st_fx->lp_speech_fx, tmp ); + } + ELSE + { + /* if ( st->ini_frame < 150 ) { + st->lp_noise = 0.95f * st->lp_noise + 0.05f * st->totalNoise; + } else { + st->lp_noise = 0.98f * st->lp_noise + 0.02f * st->totalNoise; + } */ + alpha = 655; + move16(); /* 0.02 Q15 */ + if ( LT_16( st_fx->ini_frame, 150 ) ) /* should match HE_LT_CNT_INIT_FX */ + { + alpha = 1638; + move16(); /* 0.05 Q15 */ + } + st_fx->lp_noise_fx = noise_est_AR1_Qx( hNoiseEst->totalNoise_fx, st_fx->lp_noise_fx, alpha ); /* Q8 state, alpha in Q15 */ + + test(); + IF( ( localVAD_HE_SAD != 0 ) && ( high_lpn_flag == 0 ) ) + { + IF( LT_16( sub( st_fx->lp_speech_fx, Etot ), 2560 ) ) /* 10.0 in Q8 */ + { + /* st->lp_speech = 0.98f * st->lp_speech + 0.02f * Etot; */ + st_fx->lp_speech_fx = noise_est_AR1_Qx( Etot, st_fx->lp_speech_fx, 655 ); /* Q8 state, 0.02 in Q15 */ + } + ELSE + { + st_fx->lp_speech_fx = sub( st_fx->lp_speech_fx, 13 ); /* st->lp_speech = st->lp_speech - 0.05f; linear decay*/ + } + } + } + } + + /*-----------------------------------------------------------------* + * Initialize parameters for energy tracking and signal dynamics + *-----------------------------------------------------------------*/ + return; +} +#endif void long_enr_fx( Encoder_State *st_fx, /* i/o: state structure */ const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) */ diff --git a/lib_enc/nois_est_fx.c b/lib_enc/nois_est_fx.c index 855d25ce5..b8ce1a186 100644 --- a/lib_enc/nois_est_fx.c +++ b/lib_enc/nois_est_fx.c @@ -2007,3 +2007,1371 @@ void noise_est_fx( return; } +#ifdef IVAS_FLOAT_FIXED + +/*-----------------------------------------------------------------* + * noise_est_fx() + * + * Noise energy estimation (noise energy is updated in case of noise-only frame) + *-----------------------------------------------------------------*/ +void noise_est_ivas_fx( + Encoder_State *st_fx, /* i/o: state structure */ + const Word16 old_pitch1, /* i : previous frame OL pitch[1] */ + const Word32 tmpN[], /* i : temporary noise update Q_new + QSCALE */ + const Word16 epsP_h[], /* i : msb prediction error energies Q_r-1 */ + const Word16 epsP_l[], /* i : msb prediction error energies Q_r-1 */ + const Word16 Etot, /* i : total channel E (see find_enr_fx.c) Q8 */ + const Word16 relE, /* i : (VA_CHECK addition) relative frame energy Q8? */ + const Word16 corr_shift, /* i : normalized correlation correction Q15 */ + const Word32 enr[], /* i : averaged energy over both subframes Q_new + Q_SCALE */ + Word32 fr_bands[], /* i : spectrum per critical bands of the current frame Q_new + Q_SCALE */ + Word16 *cor_map_sum, /* o : Q8 */ + Word16 *sp_div, /* o : Q_sp_div */ + Word16 *Q_sp_div, /* o : Q factor for sp_div */ + Word16 *non_staX, /* o : non-stationarity for sp/mus classifier */ + Word16 *loc_harm, /* o : multi-harmonicity flag for UV classifier */ + const Word32 *lf_E, /* i : per bin energy for low frequencies Q_new + Q_SCALE -2 */ + Word16 *st_harm_cor_cnt, /* i/o : 1st harm correlation timer Q0 */ + const Word16 Etot_l_lp, /* i : Smoothed low energy Q8 */ + const Word16 Etot_v_h2, /* i : Energy variations Q8 */ + Word16 *bg_cnt, /* i : Background burst length timer Q0 */ + Word16 EspecdB[], /* i/o: log E spectrum (with f=0) of the current frame Q7 for multi harm */ + Word16 Q_new, /* i : SCaling of current frame */ + const Word32 Le_min_scaled, /*i : Minimum energy value in Q_new + Q_SCALE */ + Word16 *sp_floor, /* o : noise floor estimate Q7 */ + Word16 S_map[], /* o : short-term correlation map Q7 */ + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + FRONT_VAD_ENC_HANDLE hFrontVad, /* i/o: front-VAD handle */ + const Word16 ini_frame /* i : Frame number (init) */ +) +{ + Word16 alpha, alpha2, alpha2m1, alpham1; + Word16 cor_min, cor_max, num, den, ExpNum, ExpDen, noise_chartmp; + Word16 wtmp1, wtmp, ExpLmax, ExpLmax2, tmpExp, nchar_thr, cor_tmp; + Word16 i, tmp_pc, pc, th_eps; + Word32 th_sta, Lnum, Lden, non_sta, LepsP, Ltmpden; + Word16 e_ener, f_ener; + Word32 Ltmp, Ltmp1, Lsum_num, Lsum_den, *pt1, *pt2, Ltmp2, Lnon_sta2; + Word16 spec_div, noise_char; + Word16 log_enr16; + Word16 updt_step; /* Q15 */ + Word16 aE_bgd, sd1_bgd, bg_bgd2; + Word16 tn_ini; + Word16 epsP_0_2, epsP_0_2_ad, epsP_0_2_ad_lp_max; + Word16 epsP_2_16, epsP_2_16_dlp, epsP_2_16_dlp_max; + Word16 PAU, BG_1, NEW_POS_BG; + + Word16 haco_ev_max; + Word16 Etot_l_lp_thr; + Word16 comb_ahc_epsP, comb_hcm_epsP; + + Word16 enr_bgd, cns_bgd, lp_bgd, ns_mask; + Word16 lt_haco_mask, bg_haco_mask; + Word16 SD_1, SD_1_inv, bg_bgd3, PD_1, PD_2, PD_3, PD_4, PD_5; + + Word16 non_staB; /* Q8 */ + Word32 L_tmp_enr, L_tmp_ave_enr, L_tmp_ave_enr2; + Word16 tmp_Q; + Word16 tmp, tmp2; /* general temp registers */ + Word16 tmp_enr, tmp_floor; /* constants in Q8 */ + Word16 vad_bwidth_fx; /* vad ns control variabel for input bwidth from teh BWD */ + /* for DTX operation */ + Word16 vad_2nd_stage_fx; + + Word16 lim_Etot_fx; /* Q8 */ + Word16 lim_Etot_sq_fx; /* Q2 */ + Word16 st_E_var_est_fx; /* Q2 */ + NOISE_EST_HANDLE hNoiseEst; + SP_MUS_CLAS_HANDLE hSpMusClas; + hSpMusClas = st_fx->hSpMusClas; + /* Check if LR-VAD */ + IF( hFrontVad != NULL ) + { + hNoiseEst = hFrontVad->hNoiseEst; + } + ELSE + { + hNoiseEst = st_fx->hNoiseEst; + } + + GSC_ENC_HANDLE hGSCEnc = st_fx->hGSCEnc; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; +#endif + + /*-----------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + vad_bwidth_fx = st_fx->input_bwidth; + move16(); + + /*st_fx->ener_RAT = 10.0f * (float)log10( mean(lf_E, 8));*/ + + IF( hFrontVad == NULL ) + { + if ( hSpMusClas != NULL ) + { + Ltmp = L_shr( lf_E[0], 3 ); + FOR( i = 1; i < 8; i++ ) + { + Ltmp = L_add( Ltmp, L_shr( lf_E[i], 3 ) ); + } + IF( LT_32( Ltmp, L_shl( 1, add( Q_new, Q_SCALE - 2 ) ) ) ) + { + hSpMusClas->ener_RAT_fx = 0; + // PMT("hSpMusClas->ener_RAT_fx = 0, that should be validated") + } + ELSE + { + Ltmp = L_max( Ltmp, (Word32) 1L ); /* make sure log2_norm_lc does not cause table reading out of bounds */ + e_ener = norm_l( Ltmp ); + f_ener = Log2_norm_lc( L_shl( Ltmp, e_ener ) ); + e_ener = sub( 30, e_ener ); + e_ener = sub( e_ener, sub( add( Q_new, QSCALE ), 2 ) ); + Ltmp = Mpy_32_16( e_ener, f_ener, LG10 ); + wtmp = round_fx( L_shl( Ltmp, 10 ) ); /*Q8*/ + + /* st_fx->ener_RAT /= (Etot + 0.01f); */ + wtmp1 = add( Etot, 3 ); /*3 is 0.01 in Q8 */ + /* st_fx->ener_RAT_fx = wtmp/wtmp1 */ + hSpMusClas->ener_RAT_fx = 0; + move16(); + IF( wtmp > 0 ) + { + hSpMusClas->ener_RAT_fx = 32767; + move16(); /*Q15*/ + if ( GE_16( wtmp1, wtmp ) ) + { + hSpMusClas->ener_RAT_fx = div_s( wtmp, wtmp1 ); /*Q15*/ /* wtmp1 gte than wtmp */ + } + } + } + } + } + /*-----------------------------------------------------------------* + * Set the threshold for eps & non_sta based on input sampling rate + * The reason is that in case of 8kHz sampling input, there is nothing + * between 4kHz-6.4kHz. In noisy conditions, this makes a fast + * transition even in noise-only parts, hence producing a "higher + * order" spectral envelope => the epsP ratio is much less effective. + *-----------------------------------------------------------------*/ + + IF( NE_16( vad_bwidth_fx, NB ) ) /* WB input */ + { + th_eps = TH_EPS16_FX; + move16(); /*Q11*/ + th_sta = TH_STA16_FX; + move16(); /*Q10 */ + cor_min = COR_MIN16_FX; + move16(); /*Q15*/ + cor_max = COR_MAX16_FX; + move16(); /*Q15*/ + } + ELSE /* NB input */ + { + th_eps = TH_EPS8_FX; + move16(); /* Q11 */ + th_sta = TH_STA8_FX; + move16(); /* Q10 */ + cor_min = COR_MIN8_FX; + move16(); + cor_max = COR_MAX8_FX; + move16(); + } + + + /*-----------------------------------------------------------------* + * Estimation of pitch stationarity + *-----------------------------------------------------------------*/ + + /* pc = abs(pit[0] - pitO) + abs(pit[1] - pit[0]) */ /* needed in signal_clas() */ + wtmp = abs_s( sub( st_fx->pitch[0], old_pitch1 ) ); + wtmp1 = abs_s( sub( st_fx->pitch[1], st_fx->pitch[0] ) ); + pc = add( wtmp, wtmp1 ); + + + Ltmp = L_deposit_h( corr_shift ); + Ltmp = L_mac( Ltmp, st_fx->voicing_fx[0], 10923 ); +#ifdef BASOP_NOGLOB + Ltmp = L_mac_o( Ltmp, st_fx->voicing_fx[1], 10923, &Overflow ); + wtmp = mac_ro( Ltmp, st_fx->voicing_fx[2], 10923, &Overflow ); +#else /* BASOP_NOGLOB */ + Ltmp = L_mac( Ltmp, st_fx->voicing_fx[1], 10923 ); + wtmp = mac_r( Ltmp, st_fx->voicing_fx[2], 10923 ); +#endif /* BASOP_NOGLOB */ + + tmp_pc = pc; + move16(); + if ( LT_16( wtmp, cor_min ) ) + { + tmp_pc = TH_PC_FX; + move16(); /* low correlation -> probably inactive signal */ + } + + move16(); /* Update */ + + /*-----------------------------------------------------------------* + * Multi-harmonic analysis + *-----------------------------------------------------------------*/ + IF( hFrontVad == NULL ) + { + IF( st_fx->hSpMusClas != NULL ) + { + i = 0; + move16(); + *loc_harm = multi_harm_fx( EspecdB, hNoiseEst->old_S_fx, hNoiseEst->cor_map_fx, &hNoiseEst->multi_harm_limit_fx, st_fx->total_brate, + st_fx->bwidth, ( st_fx->hGSCEnc != NULL ) ? &hGSCEnc->cor_strong_limit : &i, &hSpMusClas->mean_avr_dyn_fx, &hSpMusClas->last_sw_dyn_fx, cor_map_sum, sp_floor, S_map ); + } + } + /*-----------------------------------------------------------------* + * Detection of frames with non-stationary spectral content + *-----------------------------------------------------------------*/ + + /* weighted sum of spectral changes per critical bands */ + Lsum_num = L_deposit_l( 0 ); + Lsum_den = L_deposit_l( 0 ); + + /* Find a proper scaling to prevent overflow, but acheiving good computation on low level signals */ + tmpExp = 0; + move16(); + ExpLmax = sub( 30, norm_l( fr_bands[10] ) ); + ExpLmax2 = sub( 30, norm_l( hNoiseEst->fr_bands2_fx[10] ) ); + tmpExp = s_max( tmpExp, sub( shl( s_max( ExpLmax, ExpLmax2 ), 1 ), s_min( ExpLmax, ExpLmax2 ) ) ); + FOR( i = 11; i <= st_fx->max_band; i++ ) + { + ExpLmax = sub( 30, norm_l( fr_bands[i] ) ); + ExpLmax2 = sub( 30, norm_l( hNoiseEst->fr_bands2_fx[i] ) ); + tmpExp = s_max( tmpExp, sub( shl( s_max( ExpLmax, ExpLmax2 ), 1 ), s_min( ExpLmax, ExpLmax2 ) ) ); + } + tmpExp = sub( tmpExp, 30 - 4 - 4 ); /* 4bits for internal summation and 4 bits for comparaison */ + + pt1 = fr_bands + 10; + pt2 = hNoiseEst->fr_bands2_fx + 10; + FOR( i = 10; i <= st_fx->max_band; i++ ) + { + Lnum = L_max( *pt1, *pt2 ); /* Don't need if anymore */ +#ifdef BASOP_NOGLOB + Lsum_den = L_add_o( Lsum_den, Lnum, &Overflow ); +#else /* BASOP_NOGLOB */ + Lsum_den = L_add( Lsum_den, Lnum ); +#endif /* BASOP_NOGLOB */ + Ltmpden = L_min( *pt1, *pt2 ); + if ( Ltmpden == 0 ) + { + Ltmpden = L_add( Ltmpden, 1 ); + } + ExpNum = sub( norm_l( Lnum ), 1 ); + num = extract_h( L_shl( Lnum, ExpNum ) ); + num = mult_r( num, num ); + ExpDen = norm_l( Ltmpden ); + den = extract_h( L_shl( Ltmpden, ExpDen ) ); + num = div_s( num, den ); + Ltmp = L_shr( num, add( sub( sub( shl( ExpNum, 1 ), ExpDen ), 15 + 1 ), tmpExp ) ); + Lsum_num = L_add( Lsum_num, Ltmp ); + + pt1++; + pt2++; + } + Lsum_den = L_shr( Lsum_den, tmpExp ); + + + /* calculation of spectral diversity */ + /* THR_SPDIV_FX = 5 , 1/5 Q15 = 6554 */ + spec_div = 0; + move16(); + if ( GT_32( Mult_32_16( Lsum_num, 6554 ), Lsum_den ) ) /* Qx+Q15+1-16 ==> Qx */ + { + spec_div = 1; + move16(); + } + + /* *sp_div = Lsum_num / (Lsum_den + 1e-5f); */ + ExpNum = sub( norm_l( Lsum_num ), 1 ); + num = extract_h( L_shl( Lsum_num, ExpNum ) ); + + Lsum_den = L_add( Lsum_den, 1 ); + + ExpDen = norm_l( Lsum_den ); + den = extract_h( L_shl( Lsum_den, ExpDen ) ); + + *sp_div = div_s( num, den ); + move16(); + + *Q_sp_div = add( 15, sub( ExpNum, ExpDen ) ); + move16(); + + /*-----------------------------------------------------------------* + * Detection of frames with high energy content in high frequencies + *-----------------------------------------------------------------*/ + + /* calculation of energy in first 10 critical bands */ + Ltmp = sum32_fx( &fr_bands[st_fx->min_band], sub( 10, st_fx->min_band ) ); + + /* calculation of energy in the rest of bands */ + Ltmp2 = sum32_fx( &fr_bands[10], sub( st_fx->max_band, 9 ) ); + +#ifdef BASOP_NOGLOB + wtmp = shl_o( 1, sub( add( Q_new, QSCALE ), 1 ), &Overflow ); +#else /* BASOP_NOGLOB */ + wtmp = shl( 1, sub( add( Q_new, QSCALE ), 1 ) ); +#endif /* BASOP_NOGLOB */ + test(); + IF( L_msu( Ltmp, 100, wtmp ) < 0 || L_msu( Ltmp2, 100, wtmp ) < 0 ) + { + noise_chartmp = 0; + move16(); + } + ELSE + { + /* ftemp2 /= ftemp */ + ExpNum = sub( norm_l( Ltmp2 ), 1 ); + num = extract_h( L_shl( Ltmp2, ExpNum ) ); + + ExpDen = norm_l( Ltmp ); + den = extract_h( L_shl( Ltmp, ExpDen ) ); + num = div_s( num, den ); +#ifdef BASOP_NOGLOB + noise_chartmp = extract_h( L_shr_o( num, add( sub( ExpNum, ExpDen ), 4 - 16 ), &Overflow ) ); /* Q11 */ +#else /* BASOP_NOGLOB */ + noise_chartmp = extract_h( L_shr( num, add( sub( ExpNum, ExpDen ), 4 - 16 ) ) ); /* Q11 */ +#endif /* BASOP_NOGLOB */ + } + + noise_chartmp = s_min( noise_chartmp, (Word16) 10 << 11 ); /* Q11 */ + + /* update LT value of the final parameter */ + /* *st_noise_char = M_ALPHA * *st_noise_char + (1-M_ALPHA) * noise_chartmp */ + hNoiseEst->noise_char_fx = mac_r( L_mult( M_ALPHA_FX, hNoiseEst->noise_char_fx ), ONE_MINUS_M_ALPHA, noise_chartmp ); + + + nchar_thr = THR_NCHAR_WB_FX; + move16(); /* 1.0 Q11 */ + if ( EQ_16( vad_bwidth_fx, NB ) ) + { + nchar_thr = THR_NCHAR_NB_FX; + move16(); /* 1.0 Q11 */ + } + + noise_char = 0; + move16(); + if ( GT_16( hNoiseEst->noise_char_fx, nchar_thr ) ) + { + noise_char = 1; + move16(); + } + + /* save the 2 last spectra per crit. bands for the future */ + Copy32( hNoiseEst->fr_bands1_fx, hNoiseEst->fr_bands2_fx, NB_BANDS ); + Copy32( fr_bands + NB_BANDS, hNoiseEst->fr_bands1_fx, NB_BANDS ); + + /*-----------------------------------------------------------------* + * Non-stationarity estimation for each band + * Handicap high E frames in average computing + *-----------------------------------------------------------------*/ + + /* set averaging factor */ + /* ftemp = relE; */ + /* if( ftemp < 0.0f ) { ftemp = 0.0f; } */ + tmp = s_max( relE, 0 ); /* Q8 */ + + /* alpha = 0.064f * ftemp + 0.75f; */ + Ltmp = Mult_32_16( (Word32) 137438953L, tmp ); /* Q31(.064)+Q8+1-16 --> Q24 */ + Ltmp = L_mac( Ltmp, 256, 24576 ); /* Q8+Q15(.75)+1 --> Q24 */ +#ifdef BASOP_NOGLOB + alpha = round_fx_o( L_shl_o( Ltmp, 7, &Overflow ), &Overflow ); /*Q24 +7 --> Q31 Q15*/ +#else /* BASOP_NOGLOB */ + alpha = round_fx( L_shl( Ltmp, 7 ) ); /*Q24 +7 --> Q31 Q15*/ +#endif /* BASOP_NOGLOB */ + + /*if( alpha > 0.999f { alpha = 0.999f;} */ + alpha = s_min( alpha, 32735 ); /*.999 in Q15*/ + alpham1 = negate( add( -32768, alpha ) ); /* 1.0 - alpha */ + /*--------------------------------------------------------------* + * during significant attacks, replace the LT energy by the + * current energy this will cause non_sta2 failures to occur in + * different frames than non_sta failures + *--------------------------------------------------------------*/ + + alpha2 = alpha; + move16(); + alpha2m1 = alpham1; + move16(); + IF( spec_div > 0 ) + { + alpha2 = 0; + move16(); + alpha2m1 = 32767; + move16(); + } + Lnon_sta2 = L_deposit_l( 1 << 10 ); + + non_sta = L_deposit_l( 1 << 10 ); + *non_staX = 0; + move16(); + non_staB = 0; + move16(); + + FOR( i = st_fx->min_band; i <= st_fx->max_band; i++ ) + { + /* + 1.0f added to reduce sensitivity to non stationarity in low energies */ + /* tmp_enr = enr[i] + 1.0f; */ + tmp_Q = add( Q_new, Q_SCALE ); + Ltmp = L_shl( (Word32) 1L, tmp_Q ); /* 1.0 added in the right dynamic domain */ +#ifdef BASOP_NOGLOB + L_tmp_enr = L_add_o( enr[i], Ltmp, &Overflow ); /* enr scale dynamic */ + L_tmp_ave_enr = L_add_o( hNoiseEst->ave_enr_fx[i], Ltmp, &Overflow ); /* ave__enr scale dynamic */ +#else /* BASOP_NOGLOB */ + L_tmp_enr = L_add( enr[i], Ltmp ); /* enr scale dynamic */ + L_tmp_ave_enr = L_add( hNoiseEst->ave_enr_fx[i], Ltmp ); /* ave__enr scale dynamic */ +#endif /* BASOP_NOGLOB */ + + IF( LE_32( non_sta, th_sta ) ) /* Just to limit the saturation */ + { + /* if( enr[i] > st_ave_enr2[i] ) */ + /* non_sta2 = non_sta2 * ((enr[i]+1) / (st_ave_enr2[i]+1)) */ + Lnum = L_max( L_tmp_enr, L_tmp_ave_enr ); + + /* else */ + /* non_sta2 = non_sta2 * ((st_ave_enr2[i]+1) / (enr[i]+1)) */ + Lden = L_min( L_tmp_enr, L_tmp_ave_enr ); + + ExpNum = sub( norm_l( Lnum ), 1 ); + num = extract_h( L_shl( Lnum, ExpNum ) ); + Lnum = L_shl( Lnum, ExpNum ); + ExpDen = norm_l( Lden ); + den = extract_h( L_shl( Lden, ExpDen ) ); + num = div_s( num, den ); + Ltmp = Mult_32_16( non_sta, num ); +#ifdef BASOP_NOGLOB + non_sta = L_shr_o( Ltmp, sub( ExpNum, ExpDen ), &Overflow ); /* Q10 */ +#else /* BASOP_NOGLOB */ + non_sta = L_shr( Ltmp, sub( ExpNum, ExpDen ) ); /* Q10 */ +#endif /* BASOP_NOGLOB */ + } + + /* st->ave_enr[i] = alpha * st->ave_enr[i] + (1-alpha) * enr[i];*/ /* update long-term average */ + Ltmp = Mult_32_16( hNoiseEst->ave_enr_fx[i], alpha ); + Ltmp = L_add( Ltmp, Mult_32_16( enr[i], alpham1 ) ); + hNoiseEst->ave_enr_fx[i] = L_max( Le_min_scaled, Ltmp ); + move32(); + + /* calculation of another non-stationarity measure (following attacks) */ + /*if( non_sta2 <= th_sta ){ + tmp_ave2 = st->ave_enr2[i] + 1.0f; + if( tmp_enr > tmp_ave2 ){ + non_sta2 = non_sta2 * ( tmp_enr / tmp_ave2 ); + } else { + non_sta2 = non_sta2 * (tmp_ave2 / tmp_enr ); + } + } */ + + /* ave_enr2:: calculation of another non-stationarity measure (following attacks) */ + Ltmp = L_shl( (Word32) 1L, tmp_Q ); /* 1.0 added in the right dynamic domain */ + /*L_tmp_enr = L_add(enr[i] , Ltmp );*/ /* enr scale dynamic , done above */ +#ifdef BASOP_NOGLOB + L_tmp_ave_enr2 = L_add_o( hNoiseEst->ave_enr2_fx[i], Ltmp, &Overflow ); /* ave__enr scale dynamic */ +#else + L_tmp_ave_enr2 = L_add( hNoiseEst->ave_enr2_fx[i], Ltmp ); /* ave__enr scale dynamic */ +#endif + IF( LE_32( Lnon_sta2, th_sta ) ) /* Just to limit the saturation */ + { + Lnum = L_max( L_tmp_enr, L_tmp_ave_enr2 ); + Lden = L_min( L_tmp_enr, L_tmp_ave_enr2 ); + + ExpNum = sub( norm_l( Lnum ), 1 ); + num = extract_h( L_shl( Lnum, ExpNum ) ); + Lnum = L_shl( Lnum, ExpNum ); + ExpDen = norm_l( Lden ); + den = extract_h( L_shl( Lden, ExpDen ) ); + num = div_s( num, den ); + Ltmp1 = Mult_32_16( Lnon_sta2, num ); +#ifdef BASOP_NOGLOB + Lnon_sta2 = L_shr_o( Ltmp1, sub( ExpNum, ExpDen ), &Overflow ); /* Q10 */ +#else /* BASOP_NOGLOB */ + Lnon_sta2 = L_shr( Ltmp1, sub( ExpNum, ExpDen ) ); /* Q10 */ +#endif /* BASOP_NOGLOB */ + } + + /* st_ave_enr2[i] = (float)alpha2 * st_ave_enr2[i] + + (1.0f - alpha2) * (enr[i]) */ + Ltmp1 = Mult_32_16( hNoiseEst->ave_enr2_fx[i], alpha2 ); + Ltmp1 = L_add( Ltmp1, Mult_32_16( enr[i], alpha2m1 ) ); + hNoiseEst->ave_enr2_fx[i] = L_max( Le_min_scaled, Ltmp1 ); + move32(); + + /* calculation of non-stationarity measure for speech/music classification */ + IF( hFrontVad == NULL ) + { + test(); + test(); + IF( GE_16( i, START_BAND_SPMUS ) && LT_16( i, NB_BANDS_SPMUS + START_BAND_SPMUS ) && st_fx->hSpMusClas != NULL ) + { + /* log_enr = (float)ln_fx(enr[i]); */ + log_enr16 = noise_est_ln_q8_fx( enr[i], 0, tmp_Q ); + wtmp = abs_s( sub( log_enr16, hSpMusClas->past_log_enr_fx[i - START_BAND_SPMUS] ) ); +#ifdef BASOP_NOGLOB + *non_staX = add_o( *non_staX, wtmp, &Overflow ); +#else /* BASOP_NOGLOB */ + *non_staX = add( *non_staX, wtmp ); +#endif /* BASOP_NOGLOB */ + move16(); /* Q8 */ + hSpMusClas->past_log_enr_fx[i - START_BAND_SPMUS] = log_enr16; + move16(); + } + } + IF( GE_16( i, 2 ) && LE_16( i, 16 ) ) + { + IF( GE_16( ini_frame, 100 ) ) + { + /* calculate non-stationarity feature relative background */ + tmp_enr = noise_est_ln_q8_fx( enr[i], 1, tmp_Q ); /* 1.0f added */ + tmp_floor = LN_E_MIN_PLUS_ONE_FX; + move16(); /* non dynamic init constant in Q8 */ + tmp_floor = noise_est_ln_q8_fx( hNoiseEst->bckr_fx[i], 1, tmp_Q ); +#ifdef BASOP_NOGLOB + non_staB = add_o( non_staB, abs_s( sub( tmp_enr, tmp_floor ) ), &Overflow ); /* Q8 */ +#else /* BASOP_NOGLOB */ + non_staB = add( non_staB, abs_s( sub( tmp_enr, tmp_floor ) ) ); /* Q8 */ +#endif /* BASOP_NOGLOB */ + } + ELSE /*ini_frame < 100*/ + { + /* calculate non-stationarity feature relative background */ + tmp_enr = noise_est_ln_q8_fx( enr[i], 1, tmp_Q ); /* 1.0f added */ + tmp_floor = LN_E_MIN_PLUS_ONE_FX; + move16(); /* non dynamic init constant in Q8 */ + tmp_floor = noise_est_ln_q8_fx( E_MIN_FX, 1, tmp_Q ); +#ifdef BASOP_NOGLOB + non_staB = add_o( non_staB, abs_s( sub( tmp_enr, tmp_floor ) ), &Overflow ); /* Q8 */ +#else /* BASOP_NOGLOB */ + non_staB = add( non_staB, abs_s( sub( tmp_enr, tmp_floor ) ) ); /* Q8 */ +#endif /* BASOP_NOGLOB */ + } + } + + } /* end of band loop FOR( i = st_fx->min_band; i <= st_fx->max_band; i++ ) */ + + IF( LT_16( Etot, -1280 ) ) + { + non_sta = L_deposit_l( 1024 ); /* 1.0 in Q10 */ + Lnon_sta2 = L_deposit_l( 1024 ); /* 1.0 in Q10 */ + } + + lim_Etot_fx = s_max( 5120, Etot ); /* 20.0f Q8 */ + lim_Etot_sq_fx = extract_h( L_shl_r( L_mult( lim_Etot_fx, lim_Etot_fx ), 1 ) ); /* Q2 */ + + if ( st_fx->ini_frame < 150 ) + { + /* Allow use of quicker filter during init - if needed */ + /* st->Etot_st_est = 0.25f * lim_Etot + (1.0f-0.25F) * st->Etot_st_est; */ + hNoiseEst->Etot_st_est_fx = mac_r( L_mult( 8192, lim_Etot_fx ), 24576, hNoiseEst->Etot_st_est_fx ); + move16(); + /* st->Etot_sq_st_est = 0.25f * lim_Etot * lim_Etot + (1.0f-0.25f) * st->Etot_sq_st_est; */ + hNoiseEst->Etot_sq_st_est_fx = mac_r( L_mult( 8192, lim_Etot_sq_fx ), 24576, hNoiseEst->Etot_sq_st_est_fx ); + move16(); + } + else + { + /* st->Etot_st_est = 0.25f * lim_Etot + (1.0f-0.25F) * st->Etot_st_est; */ + hNoiseEst->Etot_st_est_fx = mac_r( L_mult( 8192, lim_Etot_fx ), 24576, hNoiseEst->Etot_st_est_fx ); + move16(); + /* st->Etot_sq_st_est = 0.25f * lim_Etot * lim_Etot + (1.0f-0.25f) * st->Etot_sq_st_est; */ + hNoiseEst->Etot_sq_st_est_fx = mac_r( L_mult( 8192, lim_Etot_sq_fx ), 24576, hNoiseEst->Etot_sq_st_est_fx ); + move16(); + } + + st_E_var_est_fx = sub( hNoiseEst->Etot_sq_st_est_fx, extract_h( L_shl_r( L_mult( hNoiseEst->Etot_st_est_fx, hNoiseEst->Etot_st_est_fx ), 1 ) ) ); + + + /*-----------------------------------------------------------------* + * Count frames since last correlation or harmonic event + *-----------------------------------------------------------------*/ + + Ltmp = L_mult( st_fx->voicing_fx[0], 16384 ); + Ltmp = L_mac( Ltmp, st_fx->voicing_fx[1], 16384 ); + + test(); + test(); + *st_harm_cor_cnt = add( *st_harm_cor_cnt, 1 ); + if ( ( Etot > 0 ) && ( ( *loc_harm > 0 ) || ( GT_16( round_fx( Ltmp ), COR_MAX_NNE_FX ) ) ) ) + { + *st_harm_cor_cnt = 0; + move16(); + } + + IF( ( GT_16( *st_harm_cor_cnt, 1 ) ) && ( ( LT_16( Etot, 3840 ) ) || /* 15 in Q8 */ + ( GT_16( st_fx->ini_frame, 10 ) && + GT_16( sub( Etot, hNoiseEst->Etot_lp_fx ), 1792 ) ) ) /* 7 in Q8 */ + ) + { + *st_harm_cor_cnt = 1; + } + + if ( GT_16( *st_harm_cor_cnt, 1 ) && + GT_16( Etot, 7680 ) && /* 30.0f in Q8 */ + GT_16( st_E_var_est_fx, 32 ) /* 8.0f in Q2 */ + ) + { + + /* st->harm_cor_cnt = max(1, (short) round_f( (float) st->harm_cor_cnt / 4.0f )) ; */ + *st_harm_cor_cnt = s_max( 1, shr( add( *st_harm_cor_cnt, 2 ), 1 ) ); + } + + + /*-----------------------------------------------------------------* + * Energy based pause length counter + *-----------------------------------------------------------------*/ + test(); + IF( ( *bg_cnt >= 0 ) && ( GT_16( sub( Etot, Etot_l_lp ), 1280 ) /*5.0 in Q8*/ ) ) + { + /* Possible speech burst */ + *bg_cnt = -1; + move16(); + } + ELSE + { + test(); + if ( EQ_16( *bg_cnt, -1 ) && ( LT_16( sub( Etot, Etot_l_lp ), 1280 ) ) /*5 in Q8*/ ) + { + /* Possible start of speech pause */ + *bg_cnt = 0; + move16(); + } + } + if ( *bg_cnt >= 0 ) + { + *bg_cnt = add( *bg_cnt, 1 ); + move16(); + } + + /*-----------------------------------------------------------------* + * Linear predition efficiency 0 to 2 order + *-----------------------------------------------------------------*/ + + /*epsP_0_2 = max(0 , min(8, epsP[0] / epsP[2])); */ + Ltmp = eps_quota_fx( epsP_h[0], epsP_l[0], + epsP_h[2], epsP_l[2], 12 ); /* Word32 Q12 */ + BASOP_SATURATE_WARNING_OFF_EVS /* may saturate*/ +#ifdef BASOP_NOGLOB + epsP_0_2 = round_fx_o( L_shl_o( Ltmp, 16, &Overflow ), &Overflow ); /* Q12+16 -16 -> Q12 , NB saturation in Q12 sets max value to 7,999 */ +#else /* BASOP_NOGLOB */ + epsP_0_2 = round_fx( L_shl( Ltmp, 16 ) ); /* Q12+16 -16 -> Q12 , NB saturation in Q12 sets max value to 7,999 */ +#endif /* BASOP_NOGLOB */ + BASOP_SATURATE_WARNING_ON_EVS + + epsP_0_2 = s_max( 0, epsP_0_2 ); /* min value is 0 , Q12 */ + + + /* st->epsP_0_2_lp = 0.15f * epsP_0_2 + (1.0f-0.15f) * st->epsP_0_2_lp; */ + alpha = 4915; + move16(); /*0.15 in Q15 */ + hNoiseEst->epsP_0_2_lp_fx = noise_est_AR1_Qx( epsP_0_2, hNoiseEst->epsP_0_2_lp_fx, alpha ); + + /* epsP_0_2_ad = (float) fabs(epsP_0_2 - st->epsP_0_2_lp ); */ + epsP_0_2_ad = abs_s( sub( epsP_0_2, hNoiseEst->epsP_0_2_lp_fx ) ); /* Q12 */ + + /*if (epsP_0_2_ad < st->epsP_0_2_ad_lp) { + st->epsP_0_2_ad_lp = 0.1f * epsP_0_2_ad + (1.0f - 0.1f) * st->epsP_0_2_ad_lp; + } else { + st->epsP_0_2_ad_lp = 0.2f * epsP_0_2_ad + (1.0f - 0.2f) * st->epsP_0_2_ad_lp; + } */ + alpha = 6554; + move16(); /* 0.2 Q15 */ + if ( LT_16( epsP_0_2_ad, hNoiseEst->epsP_0_2_ad_lp_fx ) ) + { + alpha = shr( alpha, 1 ); /* 0.1 Q15 */ + } + hNoiseEst->epsP_0_2_ad_lp_fx = noise_est_AR1_Qx( epsP_0_2_ad, hNoiseEst->epsP_0_2_ad_lp_fx, alpha ); + + /* epsP_0_2_ad_lp_max = max(epsP_0_2_ad,st->epsP_0_2_ad_lp);*/ + epsP_0_2_ad_lp_max = s_max( epsP_0_2_ad, hNoiseEst->epsP_0_2_ad_lp_fx ); /* Q12 */ + + + /*-----------------------------------------------------------------* + * Linear predition efficiency 2 to 16 order + *-----------------------------------------------------------------*/ + + /* epsP_2_16 = max(0 , min(8, epsP[2] / epsP[16])); */ + Ltmp = eps_quota_fx( epsP_h[2], epsP_l[2], + epsP_h[16], epsP_l[16], 12 ); /* Word32 Q12 */ + BASOP_SATURATE_WARNING_OFF_EVS /* may saturate*/ +#ifdef BASOP_NOGLOB + epsP_2_16 = round_fx_o( L_shl_o( Ltmp, 16, &Overflow ), &Overflow ); /* Q12+16 -16 -> Q12 , + NB saturation in Q12 sets max value to 7,999 */ +#else /* BASOP_NOGLOB */ + epsP_2_16 = round_fx( L_shl( Ltmp, 16 ) ); /* Q12+16 -16 -> Q12 , + NB saturation in Q12 sets max value to 7,999 */ +#endif /* BASOP_NOGLOB */ + BASOP_SATURATE_WARNING_ON_EVS + + epsP_2_16 = s_max( 0, epsP_2_16 ); /* min value is 0 , Q12 */ + + + /* if (epsP_2_16 > st->epsP_2_16_lp){ + st->epsP_2_16_lp = 0.2f * epsP_2_16 + (1.0f-0.2f) * st->epsP_2_16_lp; + } else { + st->epsP_2_16_lp = 0.03f * epsP_2_16 + (1.0f-0.03f) * st->epsP_2_16_lp; + } + + st->epsP_2_16_lp2 = 0.02f * epsP_2_16 + (1.0f-0.02f) * st->epsP_2_16_lp2; */ + + alpha = 983; + move16(); /* 0.03 Q15 */ + if ( GT_16( epsP_2_16, hNoiseEst->epsP_2_16_lp_fx ) ) + { + alpha = 6554; + move16(); /* 0.2 Q15 */ + } + hNoiseEst->epsP_2_16_lp_fx = noise_est_AR1_Qx( epsP_2_16, hNoiseEst->epsP_2_16_lp_fx, alpha ); + + hNoiseEst->epsP_2_16_lp2_fx = noise_est_AR1_Qx( epsP_2_16, hNoiseEst->epsP_2_16_lp2_fx, 655 ); /* 0.02 */ + + epsP_2_16_dlp = sub( hNoiseEst->epsP_2_16_lp_fx, hNoiseEst->epsP_2_16_lp2_fx ); + + + /* if (epsP_2_16_dlp < st->epsP_2_16_dlp_lp2 ) { + st->epsP_2_16_dlp_lp2 = 0.02f * epsP_2_16_dlp + (1.0f-0.02f) * st->epsP_2_16_dlp_lp2; + } else { + st->epsP_2_16_dlp_lp2 = 0.05f * epsP_2_16_dlp + (1.0f-0.05f) * st->epsP_2_16_dlp_lp2; + }*/ + alpha = 1638; + move16(); /* 0.05 Q15 */ + if ( LT_16( epsP_2_16_dlp, hNoiseEst->epsP_2_16_dlp_lp2_fx ) ) + { + alpha = 655; + move16(); /* 0.02 Q15 */ + } + hNoiseEst->epsP_2_16_dlp_lp2_fx = noise_est_AR1_Qx( epsP_2_16_dlp, hNoiseEst->epsP_2_16_dlp_lp2_fx, alpha ); + + /* epsP_2_16_dlp_max = max(epsP_2_16_dlp,st->epsP_2_16_dlp_lp2); */ + epsP_2_16_dlp_max = s_max( epsP_2_16_dlp, hNoiseEst->epsP_2_16_dlp_lp2_fx ); + + /*-----------------------------------------------------------------* + * long term extensions of frame features + *-----------------------------------------------------------------*/ + + tmp = sub( Etot, hNoiseEst->totalNoise_fx ); /* Q8 */ + /* st->lt_tn_track = 0.03f* (Etot - st->totalNoise < 10) + 0.97f*st->lt_tn_track; */ + tmp2 = 0; + move16(); + if ( LT_16( tmp, 2560 ) ) /*10 in Q8 */ + { + tmp2 = 32767; + move16(); + } + hNoiseEst->lt_tn_track_fx = noise_est_AR1_Qx( tmp2, hNoiseEst->lt_tn_track_fx, 983 ); /*0.03 in Q15 ,Q15 state*/ + + /* st->lt_tn_dist = 0.03f* (Etot - st->totalNoise) + 0.97f*st->lt_tn_dist; */ + hNoiseEst->lt_tn_dist_fx = noise_est_AR1_Qx( tmp, hNoiseEst->lt_tn_dist_fx, 983 ); /*0.03 in Q15 ,Q8 state*/ + + /* st->lt_Ellp_dist = 0.03f* (Etot - st->Etot_l_lp) + 0.97f*st->lt_Ellp_dist;*/ + tmp = sub( Etot, hNoiseEst->Etot_l_lp_fx ); /* Q8 */ + hNoiseEst->lt_Ellp_dist_fx = noise_est_AR1_Qx( tmp, hNoiseEst->lt_Ellp_dist_fx, 983 ); /*0.03 in Q15 ,Q8 state*/ + + + /* if (st->harm_cor_cnt == 0) { + st->lt_haco_ev = 0.03f*1.0 + 0.97f*st->lt_haco_ev; + } else { + st->lt_haco_ev = 0.99f*st->lt_haco_ev; + } */ + IF( *st_harm_cor_cnt == 0 ) + { + hNoiseEst->lt_haco_ev_fx = noise_est_AR1_Qx( (Word16) 32767, hNoiseEst->lt_haco_ev_fx, 983 ); /*.03 in Q15 , Q15 state */ + } + ELSE + { + hNoiseEst->lt_haco_ev_fx = mult_r( 32440, hNoiseEst->lt_haco_ev_fx ); /*.99 in Q15 , Q15 state */ + } + + + /* if (st->lt_tn_track < 0.05f) { + st->low_tn_track_cnt++; + } else { + st->low_tn_track_cnt=0; + }*/ + tmp = 0; + move16(); + move16(); + if ( LT_16( hNoiseEst->lt_tn_track_fx, 1638 ) ) /* 0.05 in Q15*/ + { + tmp = add( hNoiseEst->low_tn_track_cnt, 1 ); + } + hNoiseEst->low_tn_track_cnt = tmp; + move16(); + + + /* update of the long-term non-stationarity measure (between 0 and 1) */ + /* if ( (non_sta > th_sta) || (*loc_harm > 0) ) { + st->act_pred = M_GAMMA * st->act_pred + (1-M_GAMMA) * 1; + } else { + st->act_pred = M_GAMMA * st->act_pred + (1-M_GAMMA) * 0; + }*/ + Ltmp = L_mult( M_GAMMA_FX, hNoiseEst->act_pred_fx ); /*Q15*Q15+1 --> Q31 , 32440= .99 Q15 */ + tmp = round_fx( Ltmp ); /* Q15 */ + test(); + if ( ( GT_32( non_sta, th_sta ) ) /* float th_sta NB 5e10 , WB 3.5e10*/ + || ( *loc_harm > 0 ) ) + { + tmp = mac_r( Ltmp, ( -32768 + M_GAMMA_FX ), -32768 ); /* (-0.01)*(-1.0) */ + } + hNoiseEst->act_pred_fx = tmp; + move16(); + + + /*-----------------------------------------------------------------* + * Background noise adaptation enable flag + *-----------------------------------------------------------------*/ + Ltmp = L_mult( st_fx->voicing_fx[0], 16384 ); + Ltmp = L_mac( Ltmp, st_fx->voicing_fx[1], 16384 ); +#ifdef BASOP_NOGLOB + cor_tmp = mac_ro( Ltmp, corr_shift, MAX_16, &Overflow ); +#else /* BASOP_NOGLOB */ + cor_tmp = mac_r( Ltmp, corr_shift, MAX_16 ); +#endif + + LepsP = eps_quota_fx( epsP_h[2], epsP_l[2], + epsP_h[16], epsP_l[16], 11 ); /* L_epsP in Q11 */ + /* note this epsP2/eps16 is not limited to 8 as, epsP_2_16 is !! */ + + vad_2nd_stage_fx = 0; + move16(); /* background noise present - decrement counter */ + /* + if( ( (*st_harm_cor_cnt < 3*HC_CNT_SLOW ) + && ( ( non_sta > th_sta ) || + ( tmp_pc < TH_PC ) || + ( noise_char > 0) ) + ) + || + ( (st->ini_frame > 150) && (Etot - Etot_l_lp) > 10 ) || + ( 0.5f * (voicing[0]+voicing[1]) > cor_max ) || + ( epsP[2] / epsP[16] > th_eps ) || + ( *loc_harm > 0) || + ((st->act_pred > 0.8f) && (non_sta2 > th_sta)) + ) */ + + Ltmp = L_mult( st_fx->voicing_fx[0], 16384 ); /* Q15 + Q15(.5)) + 1 -> Q31 */ + cor_tmp = mac_r( Ltmp, st_fx->voicing_fx[1], 16384 ); /* Q31 -16 -> Q15 */ + if ( Etot < 0 ) + { + cor_tmp = 0; + move16(); + } + + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + + if ( ( ( LT_16( *st_harm_cor_cnt, ( 3 * HC_CNT_SLOW_FX ) ) ) && ( ( GT_32( non_sta, th_sta ) ) || ( LT_16( tmp_pc, TH_PC_FX ) ) || ( GT_16( noise_char, 0 ) ) ) ) || + ( ( GT_16( st_fx->ini_frame, HE_LT_CNT_INIT_FX ) ) && ( GT_16( sub( Etot, Etot_l_lp ), 2560 ) ) ) || + ( GT_16( cor_tmp, cor_max ) ) || /* Q15 */ + ( GT_32( LepsP, th_eps ) ) || /* Q11 */ + ( GT_16( *loc_harm, 0 ) ) || + ( ( GT_16( hNoiseEst->act_pred_fx, 26214 ) ) && ( GT_32( Lnon_sta2, th_sta ) ) ) /*act_pred in Q15 , th_sta in Q10 */ + ) + { + vad_2nd_stage_fx = 1; + move16(); /* active signal present - increment counter */ + } + + tmp = 2; + move16(); /* Signal present */ + if ( vad_2nd_stage_fx == 0 ) + { + tmp = -1; + move16(); /* Background present */ + } + hNoiseEst->aEn = add( hNoiseEst->aEn, tmp ); + + + hNoiseEst->aEn = s_min( hNoiseEst->aEn, 6 ); + hNoiseEst->aEn = s_max( hNoiseEst->aEn, 0 ); + /*-----------------------------------------------------------------* + * Stereo classifier - save raw aEn + *-----------------------------------------------------------------*/ + + if ( hStereoClassif != NULL ) + { + /* + if ( ( non_sta > th_sta ) || + ( tmp_pc < TH_PC ) || + ( 0.5f * ( st->voicing[0] + st->voicing[1] ) > cor_max ) || + ( epsP[2] / epsP[16] > th_eps ) || + ( ( hNoiseEst->act_pred > 0.8f ) && ( non_sta2 > th_sta ) ) )*/ + if ( ( GT_32( non_sta, th_sta ) ) || ( LT_16( tmp_pc, TH_PC_FX ) ) || + ( GT_16( cor_tmp, cor_max ) ) || + ( GT_32( LepsP, th_eps ) ) || + ( ( GT_16( hNoiseEst->act_pred_fx, 26214 ) ) && ( GT_32( Lnon_sta2, th_sta ) ) ) ) /*act_pred in Q15 , th_sta in Q10 */ + { + /* active signal present - increment counter */ + hStereoClassif->aEn_raw[st_fx->idchan] = hStereoClassif->aEn_raw[st_fx->idchan] + 2; + } + else + { + /* background noise present - decrement counter */ + hStereoClassif->aEn_raw[st_fx->idchan] = hStereoClassif->aEn_raw[st_fx->idchan] - 1; + } + + if ( hStereoClassif->aEn_raw[st_fx->idchan] > 6 ) + { + hStereoClassif->aEn_raw[st_fx->idchan] = 6; + } + else if ( hStereoClassif->aEn_raw[st_fx->idchan] < 0 ) + { + hStereoClassif->aEn_raw[st_fx->idchan] = 0; + } + } + + + /* Additional NNE detectors */ + + /* comb_ahc_epsP = max(max(st->act_pred, st->lt_haco_ev), epsP_2_16_dlp); */ + /* Q15 Q15 Q12 */ + comb_ahc_epsP = s_max( s_max( shr( hNoiseEst->act_pred_fx, 15 - 12 ), shr( hNoiseEst->lt_haco_ev_fx, 15 - 12 ) ), epsP_2_16_dlp ); /* Q12 */ + + + /* comb_hcm_epsP = max(max(st->lt_haco_ev,epsP_2_16_dlp_max),epsP_0_2_ad_lp_max); */ + /* Q15 Q12 Q12 */ + comb_hcm_epsP = s_max( s_max( shr( hNoiseEst->lt_haco_ev_fx, 15 - 12 ), epsP_2_16_dlp_max ), epsP_0_2_ad_lp_max ); /* Q12 */ + + /*haco_ev_max = max(*st_harm_cor_cnt==0,st->lt_haco_ev); */ + tmp = 0; + move16(); + if ( *st_harm_cor_cnt == 0 ) + { + tmp = (Word16) 32767; + move16(); + } + haco_ev_max = s_max( tmp, hNoiseEst->lt_haco_ev_fx ); /* Q15 */ + + /* Etot_l_lp_thr = st->Etot_l_lp + (1.5f + 1.5f * (st->Etot_lp<50.0f))*st->Etot_v_h2; */ + tmp = 12288; + move16(); /* 1.5 Q13 */ + if ( LT_16( hNoiseEst->Etot_lp_fx, 12800 ) ) /* 50.0 in Q8 */ + { + tmp = shl( tmp, 1 ); /*1.5 + 1.5 Q13 */ + } + Ltmp = L_deposit_h( hNoiseEst->Etot_l_lp_fx ); + Etot_l_lp_thr = round_fx( L_add( Ltmp, L_shl( L_mult( tmp, Etot_v_h2 ), 2 ) ) ); /* Q13+Q8+1 +2 = Q24 -> Q8*/ + + /* enr_bgd = Etot < Etot_l_lp_thr; */ + enr_bgd = 0; + move16(); + if ( LT_16( Etot, Etot_l_lp_thr ) ) /* Q8 */ + { + enr_bgd = 1; + move16(); /* Q0 */ + } + + /* cns_bgd = (epsP_0_2 > 7.95f) && (non_sta< 1e3f); */ + cns_bgd = 0; + move16(); + test(); + if ( ( GT_16( epsP_0_2, 32563 ) ) /* 7.95 in Q12 */ + && ( LT_32( non_sta, 1024000L ) ) ) /* 1e3f in Q10 ? */ + { + cns_bgd = 1; + move16(); /* Q0 */ + } + + /*lp_bgd = epsP_2_16_dlp_max < 0.10f; */ + lp_bgd = 0; + move16(); + if ( LT_16( epsP_2_16_dlp_max, 410 ) ) /*0.10 Q12 */ + { + lp_bgd = 1; + move16(); /* Q0 */ + } + + + /* ns_mask = non_sta < 1e5f; */ + ns_mask = 0; + move16(); + if ( LT_32( non_sta, (Word32) 102400000L ) ) /* (1e5f in Q10)*/ + { + ns_mask = 1; + move16(); /* Q0 */ + } + + + /* lt_haco_mask = st->lt_haco_ev < 0.5f; */ + lt_haco_mask = 0; + move16(); + if ( LT_16( hNoiseEst->lt_haco_ev_fx, 16384 ) ) /* ( .5 in Q15)*/ + { + lt_haco_mask = 1; + move16(); /* Q0 */ + } + + /* bg_haco_mask = haco_ev_max < 0.4f; */ + bg_haco_mask = 0; + move16(); + if ( LT_16( haco_ev_max, 13107 ) ) /* ( 0.4 in Q15)*/ + { + bg_haco_mask = 1; + move16(); /* Q0 */ + } + + + /* SD_1 = ( (epsP_0_2_ad > 0.5f) && (epsP_0_2 > 7.95f) ); */ + SD_1 = 0; + move16(); + test(); + if ( ( GT_16( epsP_0_2_ad, 2048 ) ) /* 0.5 in Q12 */ + && ( GT_16( epsP_0_2, 32563 ) ) ) /* 7.95 in Q12 */ + { + SD_1 = 1; + move16(); /* Q0 */ + } + SD_1_inv = sub( 1, SD_1 ); /* Q0 */ + + /* NB "STL::test()"; has a cost of 2, using bitwise "s_and" , "s_or" at a cost of 1 */ + /* NB only lowest bit position is used, result is always 0 or 1 */ + + /* bg_bgd3 = enr_bgd || ( ( cns_bgd || lp_bgd ) && ns_mask && lt_haco_mask && SD_1==0 ); */ + tmp = s_and( s_and( s_and( s_or( cns_bgd, lp_bgd ), ns_mask ), lt_haco_mask ), SD_1_inv ); + bg_bgd3 = s_or( enr_bgd, tmp ); + + /*PD_1 = (epsP_2_16_dlp_max < 0.10f ) ; */ + PD_1 = 0; + move16(); + if ( ( LT_16( epsP_2_16_dlp_max, 410 ) ) ) /* 0.10 in Q12 */ + { + PD_1 = 1; + move16(); /* Q0 */ + } + + /*PD_2 = (epsP_0_2_ad_lp_max < 0.10f ) ; */ + PD_2 = 0; + move16(); + if ( ( LT_16( epsP_0_2_ad_lp_max, 410 ) ) ) /* 0.10 in Q12 */ + { + PD_2 = 1; + move16(); /* Q0 */ + } + + /*PD_3 = (comb_ahc_epsP < 0.85f ); */ + PD_3 = 0; + move16(); + if ( ( LT_16( comb_ahc_epsP, 3482 ) ) ) /* 0.85 in Q12 */ + { + PD_3 = 1; + move16(); /* Q0 */ + } + + /* PD_4 = comb_ahc_epsP < 0.15f; */ + PD_4 = 0; + move16(); + if ( ( LT_16( comb_ahc_epsP, 614 ) ) ) /* 0.15 in Q12 */ + { + PD_4 = 1; + move16(); /* Q0 */ + } + + /*PD_5 = comb_hcm_epsP < 0.30f; */ + PD_5 = 0; + move16(); + if ( ( LT_16( comb_hcm_epsP, 1229 ) ) ) /* 0.30 in Q12 */ + { + PD_5 = 1; + move16(); /* Q0 */ + } + + /* BG_1 = ( (SD_1==0) || (Etot < Etot_l_lp_thr) ) + && bg_haco_mask && (st->act_pred < 0.85f) && (st->Etot_lp < 50.0f); */ + BG_1 = 0; + move16(); + test(); + test(); + test(); + test(); + if ( ( ( SD_1 == 0 ) || ( LT_16( Etot, Etot_l_lp_thr ) ) ) && ( bg_haco_mask != 0 ) && ( LT_16( hNoiseEst->act_pred_fx, 27853 ) ) /* 0.85f in Q15 */ + && ( LT_16( hNoiseEst->Etot_lp_fx, 50 * 256 ) ) ) /* 50.0 in Q8 */ + { + BG_1 = 1; + move16(); + } + + /* PAU = (st->aEn==0) + || ( (Etot < 55.0f) && (SD_1==0) + && ( ( PD_3 && (PD_1 || PD_2 ) ) || ( PD_4 || PD_5 ) ) ); */ + PAU = 0; + move16(); /*Q0*/ + if ( hNoiseEst->aEn == 0 ) + { + PAU = 1; + move16(); /*Q0*/ + } + tmp = 0; + move16(); /*Q0*/ + if ( LT_16( Etot, 55 * 256 ) ) /*55.0 in Q8 */ + { + tmp = 1; + move16(); /*Q0*/ + } + tmp = s_and( tmp, SD_1_inv ); + PAU = s_or( PAU, s_and( tmp, s_or( s_and( PD_3, s_or( PD_1, PD_2 ) ), s_or( PD_4, PD_5 ) ) ) ); + + + /* NEW_POS_BG = (PAU | BG_1) & bg_bgd3; note bitwise logic in float */ + NEW_POS_BG = s_and( s_or( PAU, BG_1 ), bg_bgd3 ); + + /* Original silence detector works in most cases */ + /* aE_bgd = (st->aEn == 0);*/ + aE_bgd = 0; + move16(); + if ( hNoiseEst->aEn == 0 ) + { + aE_bgd = 1; + move16(); + } + + + /* When the signal dynamics is high and the energy is close to the background estimate */ + /* sd1_bgd = (st->sign_dyn_lp > 15) + && (Etot - st->Etot_l_lp ) < 2*st->Etot_v_h2 + && st->harm_cor_cnt > 20; */ + sd1_bgd = 0; + move16(); + test(); + test(); + if ( ( GT_16( hNoiseEst->sign_dyn_lp_fx, 15 * 256 ) ) /* 15 in Q8 */ + && ( LT_16( sub( Etot, hNoiseEst->Etot_l_lp_fx ), shl( Etot_v_h2, 1 ) ) ) /* Q8 , Etot_v_h2 has limited dynmics can be upscaled*/ + && ( GT_16( *st_harm_cor_cnt, 20 ) ) ) + { + sd1_bgd = 1; + move16(); + } + + /* tn_ini = st->ini_frame < 150 && st->harm_cor_cnt > 5 && + ( (st->act_pred < 0.59f && st->lt_haco_ev <0.23f ) || + st->act_pred < 0.38f || + st->lt_haco_ev < 0.15f || + non_staB < 50.0f || + aE_bgd );*/ + + tmp = 0; + move16(); + test(); + test(); + test(); + test(); + test(); + if ( ( ( LT_16( hNoiseEst->act_pred_fx, 19333 ) ) && ( LT_16( hNoiseEst->lt_haco_ev_fx, 7537 ) ) ) /* .59 in Q15 .23 in Q15 */ + || ( LT_16( hNoiseEst->act_pred_fx, 12452 ) ) /* .38 in Q15 */ + || ( ( EQ_16( st_fx->element_mode, EVS_MONO ) && LT_16( hNoiseEst->lt_haco_ev_fx, 4915 ) ) || ( GT_16( st_fx->element_mode, EVS_MONO ) && LT_16( hNoiseEst->lt_haco_ev_fx, 2621 ) ) ) /* .15 in Q15 || 0.08 */ + || ( LT_16( non_staB, 50 * 256 ) ) /* 50.0 in Q8 */ + || aE_bgd != 0 || ( ( LT_16( Etot, 10752 ) ) /* 42 in Q8 */ + && ( GT_16( hNoiseEst->harm_cor_cnt, 10 ) ) && ( LT_16( hNoiseEst->lt_haco_ev_fx, 11469 ) ) /* 0.35 in Q15 */ + && ( LT_16( hNoiseEst->act_pred_fx, 26214 ) ) /* 0.80 in Q15 */ + ) ) + { + tmp = 1; + move16(); + } + + tn_ini = 0; + move16(); + test(); + test(); + if ( ( LT_16( st_fx->ini_frame, HE_LT_CNT_INIT_FX ) ) && ( GT_16( hNoiseEst->harm_cor_cnt, 5 ) ) /* > 5 Q0 */ + && ( LT_16( sub( Etot, hNoiseEst->Etot_lp_fx ), 1792 ) ) /* 7 in Q8 */ + && ( NE_16( tmp, 0 ) ) ) + { + tn_ini = 1; + move16(); + } + + /* Energy close to the background estimate serves as a mask for other background detectors */ + /* bg_bgd2 = Etot < Etot_l_lp_thr || tn_ini ; */ + bg_bgd2 = 0; + move16(); + test(); + if ( ( LT_16( Etot, Etot_l_lp_thr ) ) || ( tn_ini != 0 ) ) + { + bg_bgd2 = 1; + move16(); /* Q0 */ + } + + updt_step = 0; + move16(); /* Q15 */ + /*if (( bg_bgd2 && ( aE_bgd || sd1_bgd || st->lt_tn_track >0.90f || NEW_POS_BG ) ) + || tn_ini ) */ + tmp = 0; + move16(); + if ( GT_16( hNoiseEst->lt_tn_track_fx, 29491 ) ) /* .90 in Q15 */ + { + tmp = 1; + move16(); + } + + IF( s_or( s_and( bg_bgd2, s_or( aE_bgd, s_or( sd1_bgd, s_or( tmp, NEW_POS_BG ) ) ) ), tn_ini ) ) + { + /*if( ( ( st->act_pred < 0.85f ) + && (aE_bgd !=0) + && ( st->lt_Ellp_dist < 10 || sd1_bgd ) + && (st->lt_tn_dist<40) + && ( ( Etot - st->totalNoise ) < 10.0f ) + ) + || ( (st->first_noise_updt == 0) && (st->harm_cor_cnt > 80) && (aE_bgd!=0) && (st->lt_aEn_zero > 0.5f) ) + || ( (tn_ini!=0) && ( aE_bgd != 0) || (non_staB < 10.0) || (st->harm_cor_cnt > 80) ) + )*/ + + test(); + test(); + test(); + test(); + test(); + test(); + test(); /* for the ELSE IF below*/ + test(); + test(); + test(); + test(); + test(); + test(); /* for the ELSE IF below*/ + + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( ( LT_16( hNoiseEst->act_pred_fx, 27853 ) ) /* 0.85 in Q15 */ + && ( NE_16( aE_bgd, 0 ) ) && ( ( LT_16( hNoiseEst->lt_Ellp_dist_fx, 10 * 256 ) ) || ( NE_16( sd1_bgd, 0 ) ) ) /* 10.0 in Q8*/ + && ( LT_16( hNoiseEst->lt_tn_dist_fx, 40 * 256 ) ) /* 40.0 in Q8*/ + && ( LT_16( sub( Etot, hNoiseEst->totalNoise_fx ), 10 * 256 ) ) /* 10.0 in Q8*/ + ) || + ( ( hNoiseEst->first_noise_updt == 0 ) && ( GT_16( hNoiseEst->harm_cor_cnt, 80 ) ) && ( aE_bgd != 0 ) && ( GT_16( hNoiseEst->lt_aEn_zero_fx, 16384 ) ) /*.5 in Q15*/ + ) || + ( ( tn_ini != 0 ) && ( ( aE_bgd != 0 ) || ( LT_16( non_staB, 10 * 256 ) ) || ( GT_16( hNoiseEst->harm_cor_cnt, 80 ) ) ) /* 10.0 in Q8*/ + ) ) + + { + updt_step = 32767; + move16(); + hNoiseEst->first_noise_updt = 1; + FOR( i = 0; i < NB_BANDS; i++ ) + { + hNoiseEst->bckr_fx[i] = tmpN[i]; + move32(); + } + } + /* else if ( ( ( st->act_pred < 0.80f ) && ( aE_bgd || PAU ) && st->lt_haco_ev < 0.10f ) + || ( ( st->act_pred < 0.70f ) && ( aE_bgd || non_staB < 17.0f ) && PAU && st->lt_haco_ev < 0.15f ) + || ( st->harm_cor_cnt > 80 && st->totalNoise > 5.0f && Etot < max(1.0f,Etot_l_lp + 1.5f* st->Etot_v_h2) ) + || + ( st->harm_cor_cnt > 50 && st->first_noise_updt > 30 && aE_bgd && st->lt_aEn_zero>0.5f ) + || tn_ini + ) */ + ELSE IF( ( ( LT_16( hNoiseEst->act_pred_fx, 26214 ) ) /* .8 in Q15*/ + && ( ( aE_bgd != 0 ) || ( PAU != 0 ) ) && ( LT_16( hNoiseEst->lt_haco_ev_fx, 3277 ) ) ) /* .10 in q15*/ + || ( ( LT_16( hNoiseEst->act_pred_fx, 22938 ) ) /* 0.70 in Q15 */ + && ( ( aE_bgd != 0 ) || ( LT_16( non_staB, 17 * 256 ) ) ) /* 17.0 in Q8 */ + && ( PAU != 0 ) && ( LT_16( hNoiseEst->lt_haco_ev_fx, 4915 ) ) /* 0.15 in Q15 */ + ) || + ( ( GT_16( hNoiseEst->harm_cor_cnt, 80 ) ) && ( GT_16( hNoiseEst->totalNoise_fx, 5 * 256 ) ) /* 5.0 in Q8 */ + && ( LT_16( Etot, s_max( (Word16) 1 * 256, add( Etot_l_lp, add( hNoiseEst->Etot_v_h2_fx, shr( hNoiseEst->Etot_v_h2_fx, 1 ) ) ) ) ) ) /* 1.5= 1.0+.5 */ + ) || + ( ( GT_16( hNoiseEst->harm_cor_cnt, 50 ) ) && ( GT_16( hNoiseEst->first_noise_updt, 30 ) ) && ( aE_bgd != 0 ) && ( GT_16( hNoiseEst->lt_aEn_zero_fx, 16384 ) ) ) /*.5 in Q15*/ + || ( tn_ini != 0 ) ) + + { + updt_step = 3277; + move16(); /* 0.1 in Q15 */ + /* if ( !aE_bgd && st->harm_cor_cnt < 50 + && ( (st->act_pred > 0.6f) + || ( (tn_ini==0) && (Etot_l_lp - st->totalNoise < 10.0f) && non_staB > 8.0f ) + ) + ) + */ + test(); + test(); + test(); + test(); + test(); + IF( ( aE_bgd == 0 ) && ( LT_16( hNoiseEst->harm_cor_cnt, 50 ) ) && ( ( GT_16( hNoiseEst->act_pred_fx, 19661 ) ) /* 0.6 in Q15*/ + || ( ( tn_ini == 0 ) && ( LT_16( sub( Etot_l_lp, hNoiseEst->totalNoise_fx ), 10 * 256 ) ) /* 10.0 in Q8 */ + && ( GT_16( non_staB, 8 * 256 ) ) /* 8.0 in in Q8*/ + ) ) ) + { + updt_step = 328; + move16(); /* 0.01 Q15 */ + } + /* + IF (updt_step > 0 ) + { + */ + hNoiseEst->first_noise_updt = 1; + move16(); + FOR( i = 0; i < NB_BANDS; i++ ) + { + /* st->bckr[i] = st->bckr[i] + updt_step * (tmpN[i]-st->bckr[i]);*/ + /* 32 bit state update */ + Ltmp = L_sub( tmpN[i], hNoiseEst->bckr_fx[i] ); /*Q_new+Q_SCALE*/ + Ltmp = Mult_32_16( Ltmp, updt_step ); /* Q_new+Q_SCALE+15+1 -16*/ + hNoiseEst->bckr_fx[i] = L_add( Ltmp, hNoiseEst->bckr_fx[i] ); + move32(); + } + /* + } */ + } + /*else if (aE_bgd || st->harm_cor_cnt > 100 )*/ + ELSE IF( ( aE_bgd != 0 ) || ( GT_16( hNoiseEst->harm_cor_cnt, 100 ) ) ) + { + hNoiseEst->first_noise_updt = add( hNoiseEst->first_noise_updt, 1 ); + } + } + ELSE + { + /* If in music lower bckr to drop further */ + test(); + test(); + IF( ( GT_16( hNoiseEst->low_tn_track_cnt, 300 ) ) && ( GT_16( hNoiseEst->lt_haco_ev_fx, 29491 ) ) /*.9 in Q15 */ + && ( hNoiseEst->totalNoise_fx > 0 ) ) + { + updt_step = -655; + move16(); /* for debug purposes */ + FOR( i = 0; i < NB_BANDS; i++ ) + { + IF( GT_32( hNoiseEst->bckr_fx[i], L_shl( Le_min_scaled, 1L ) ) ) /* 2*E_MIN(float) in float, here we use 2*Le_min_scaled Q_new+Q_SCALE */ + { + /* st->bckr[i] = 0.98f*st->bckr[i]; */ + hNoiseEst->bckr_fx[i] = Mult_32_16( hNoiseEst->bckr_fx[i], 32113 ); /* .98 in Q15 */ + move32(); /* move to array */ + } + } + } + /*st->lt_aEn_zero = 0.2f * (st->aEn==0) + (1-0.2f) *st->lt_aEn_zero;*/ + /* y(n+1)= alpha*tmp + (1-alpha)*y(n) */ + tmp = 0; + move16(); + if ( hNoiseEst->aEn == 0 ) + { + tmp = 32767; + move16(); + } + hNoiseEst->lt_aEn_zero_fx = noise_est_AR1_Qx( tmp, hNoiseEst->lt_aEn_zero_fx, 6554 ); /* alpha=0.2 , Q15 */ + } + + return; +} + +#endif diff --git a/lib_enc/pitch_ol_fx.c b/lib_enc/pitch_ol_fx.c index deb99d727..692e06ad9 100644 --- a/lib_enc/pitch_ol_fx.c +++ b/lib_enc/pitch_ol_fx.c @@ -5,7 +5,7 @@ #include #include "options.h" #include "cnst.h" -//#include "prot_fx.h" +// #include "prot_fx.h" #include "basop_util.h" #include "rom_com_fx.h" #include "rom_com.h" @@ -47,101 +47,1240 @@ /*-----------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------*/ +static Word32 Dot_product12_o_ivas( /* (o) Q31: normalized result (1 < val <= -1) */ + const Word16 x[], /* (i) 12bits: x vector */ + const Word16 y[], /* (i) 12bits: y vector */ + const Word16 lg, /* (i) : vector length */ + Word16 *exp, /* (o) : exponent of result (0..+30) */ + Flag *Overflow_out /* o : propagating the Overflow flag to upper level, set to NULL to ignore internal overflows */ +); +static Word32 Dot_product12_ivas( /* (o) Q31: normalized result (1 < val <= -1) */ + const Word16 x[], /* (i) 12bits: x vector */ + const Word16 y[], /* (i) 12bits: y vector */ + const Word16 lg, /* (i) : vector length */ + Word16 *exp /* (o) : exponent of result (0..+30) */ +); +static Word32 Dot_product12_OL_ivas( Word16 *sum1, const Word16 x[], const Word16 y[], const Word16 lg, const Word16 lg2, Word16 *exp, Word16 *exp2 ); +static Word32 Dot_product12_OL_back_ivas( Word16 *sum1, const Word16 x[], const Word16 y[], const Word16 lg, const Word16 lg2, Word16 *exp, Word16 *exp2 ); + static void LP_Decim2_Copy( const Word16 x[], Word16 y[], Word16 l, Word16 mem[] ); -static void pitch_neighbour_fx( Word16 sect0, Word16 pitch_tmp[], Word16 pitch[3][2 * NSECT], Word16 corr_tmp[], Word16 corr[3][2 * NSECT], Word16 thres1[2 * NHFR], Word16 ind_tmp[2 * NHFR] ); +static void pitch_neighbour_fx( Word16 sect0, Word16 pitch_tmp[], Word16 pitch[3][2 * NSECT], Word16 corr_tmp[], Word16 corr[3][2 * NSECT], Word16 thres1[2 * NHFR], Word16 ind_tmp[2 * NHFR] ); + +static void find_mult_fx( Word16 *fac, Word16 pitch0, Word16 pitch1, Word16 pit_max0, Word16 *corr, Word16 *old_pitch, Word16 *old_corr, Word16 delta, Word16 step ); + +static Word16 pitch_coherence_fx( Word16 pitch0, Word16 pitch1, Word16 fac_max, Word16 diff_max ); + +static Word32 Dot_product12_OL( Word16 *sum1, const Word16 x[], const Word16 y[], const Word16 lg, const Word16 lg2, Word16 *exp, Word16 *exp2 ); + +static Word32 Dot_product12_OL_back( Word16 *sum1, const Word16 x[], const Word16 y[], const Word16 lg, const Word16 lg2, Word16 *exp, Word16 *exp2 ); +#ifdef BASOP_NOGLOB +static Word32 Dot_product12_o_ivas( /* (o) Q31: normalized result (1 < val <= -1) */ + const Word16 x[], /* (i) 12bits: x vector */ + const Word16 y[], /* (i) 12bits: y vector */ + const Word16 lg, /* (i) : vector length */ + Word16 *exp, /* (o) : exponent of result (0..+30) */ + Flag *Overflow_out /* o : propagating the Overflow flag to upper level, set to NULL to ignore internal overflows */ +) +#else /* BASOP_NOGLOB */ +Word32 Dot_product12_ivas( /* (o) Q31: normalized result (1 < val <= -1) */ + const Word16 x[], /* (i) 12bits: x vector */ + const Word16 y[], /* (i) 12bits: y vector */ + const Word16 lg, /* (i) : vector length */ + Word16 *exp /* (o) : exponent of result (0..+30) */ +) +#endif /* BASOP_NOGLOB */ +{ + Word16 i, sft; + Word32 L_sum; +#ifdef BASOP_NOGLOB + Flag Overflow_ignored = 0; +#endif /* BASOP_NOGLOB */ + +#ifdef BASOP_NOGLOB + L_sum = L_mac_o( 0, x[0], y[0], &Overflow_ignored ); +#else + L_sum = L_mac( 1, x[0], y[0] ); +#endif + FOR( i = 1; i < lg; i++ ) + { +#ifdef BASOP_NOGLOB + L_sum = L_mac_o( L_sum, x[i], y[i], Overflow_out ? Overflow_out : &Overflow_ignored ); +#else /* BASOP_NOGLOB */ + L_sum = L_mac( L_sum, x[i], y[i] ); +#endif /* BASOP_NOGLOB */ + } + + /* Normalize acc in Q31 */ + + sft = norm_l( L_sum ); + L_sum = L_shl( L_sum, sft ); + + *exp = sub( 30, sft ); + move16(); /* exponent = 0..30 */ + + return L_sum; +} + +static Word32 Dot_product12_ivas( /* (o) Q31: normalized result (1 < val <= -1) */ + const Word16 x[], /* (i) 12bits: x vector */ + const Word16 y[], /* (i) 12bits: y vector */ + const Word16 lg, /* (i) : vector length */ + Word16 *exp /* (o) : exponent of result (0..+30) */ +) +{ + /* Ignore internal overflows */ + return Dot_product12_o_ivas( x, y, lg, exp, NULL ); +} +/*---------------------------------------------------------------------* + * Dot_product12_OL_back() + * + * two different length dot products of x and y, computed backward + *---------------------------------------------------------------------*/ +static Word32 Dot_product12_OL_back_ivas( /* o : Q31: normalized result (1 < val <= -1) */ + Word16 *sum1, /* o : Q31: normalized result 2 */ + const Word16 x[], /* i : 12bits: x vector */ + const Word16 y[], /* i : 12bits: y vector */ + const Word16 lg, /* i : vector length */ + const Word16 lg2, /* i : vector length 2 */ + Word16 *exp, /* o : exponent of result (0..+30) */ + Word16 *exp2 /* o : exponent of result 2 (0..+30) */ +) +{ + Word16 i, sft; + Word32 L_sum, L_sum2; + Flag Overflow_ignored = 0; + + L_sum = L_mac( 0, x[0], y[0] ); + IF( LE_16( lg, lg2 ) ) + { + FOR( i = 1; i < lg; i++ ) + { + L_sum = L_mac_o( L_sum, x[-i], y[-i], &Overflow_ignored ); + } + /* sets to 'L_sum' in 1 clock */ + L_sum2 = L_sum; + move32(); + FOR( ; i < lg2; i++ ) + { + L_sum2 = L_mac_o( L_sum2, x[-i], y[-i], &Overflow_ignored ); + } + } + ELSE + { + FOR( i = 1; i < lg2; i++ ) + { + L_sum = L_mac_o( L_sum, x[-i], y[-i], &Overflow_ignored ); + } + /* sets to 'L_sum' in 1 clock */ + L_sum2 = L_sum; + move32(); + FOR( ; i < lg; i++ ) + { + L_sum = L_mac_o( L_sum, x[-i], y[-i], &Overflow_ignored ); + } + } + + /* Q31 */ + sft = norm_l( L_sum ); + L_sum = L_shl( L_sum, sft ); + *exp = sub( 30, sft ); + move16(); /* exponent = 0..30 */ + + sft = norm_l( L_sum2 ); + L_sum2 = L_shl( L_sum2, sft ); + *exp2 = sub( 30, sft ); + move16(); /* exponent = 0..30 */ + + *sum1 = extract_h( L_shr( L_sum2, 1 ) ); + + return L_sum; +} +/*---------------------------------------------------------------------* + * Dot_product12_OL + * + * two different length dot products of x and y + *---------------------------------------------------------------------*/ +static Word32 Dot_product12_OL_ivas( /* o : Q31: normalized result (1 < val <= -1) */ + Word16 *sum1, /* o : Q31: normalized result 2 */ + const Word16 x[], /* i : 12bits: x vector */ + const Word16 y[], /* i : 12bits: y vector */ + const Word16 lg, /* i : vector length */ + const Word16 lg2, /* i : vector length 2 */ + Word16 *exp, /* o : exponent of result (0..+30) */ + Word16 *exp2 /* o : exponent of result 2 (0..+30) */ +) +{ + Word16 i, sft; + Word32 L_sum, L_sum2; + Flag Overflow_ignored = 0; + L_sum = L_mac( 0, x[0], y[0] ); + IF( LE_16( lg, lg2 ) ) + { + FOR( i = 1; i < lg; i++ ) + { + L_sum = L_mac_o( L_sum, x[i], y[i], &Overflow_ignored ); + } + /* sets to 'L_sum' in 1 clock */ + L_sum2 = L_sum; + move32(); + FOR( ; i < lg2; i++ ) + { + L_sum2 = L_mac_o( L_sum2, x[i], y[i], &Overflow_ignored ); + } + } + ELSE + { + FOR( i = 1; i < lg2; i++ ) + { + L_sum = L_mac_o( L_sum, x[i], y[i], &Overflow_ignored ); + } + /* sets to 'L_sum' in 1 clock */ + L_sum2 = L_sum; + move32(); + FOR( ; i < lg; i++ ) + { + L_sum = L_mac_o( L_sum, x[i], y[i], &Overflow_ignored ); + } + } + + /* Q31 */ + sft = norm_l( L_sum ); + L_sum = L_shl( L_sum, sft ); + *exp = sub( 30, sft ); + move16(); /* exponent = 0..30 */ + + sft = norm_l( L_sum2 ); + L_sum2 = L_shl( L_sum2, sft ); + *exp2 = sub( 30, sft ); + move16(); /* exponent = 0..30 */ + + *sum1 = extract_h( L_shr( L_sum2, 1 ) ); + + return L_sum; +} +/*-----------------------------------------------------------------* + * pitch_ol_init() + * + * Open loop pitch variable initialization + *-----------------------------------------------------------------*/ +void pitch_ol_init_fx( + Word16 *old_thres, /* o : threshold for reinforcement of past pitch influence */ + Word16 *old_pitch, /* o : pitch of the 2nd half-frame of previous frame */ + Word16 *delta_pit, /* o : pitch evolution extrapolation */ + Word16 *old_corr /* o : correlation */ +) +{ + *old_thres = 0; + move16(); + *old_pitch = 0; + move16(); + *delta_pit = 0; + move16(); + *old_corr = 0; + move16(); +} + + +/*==================================================================================*/ +/* FUNCTION : pitch_ol_fx() */ +/*----------------------------------------------------------------------------------*/ +/* PURPOSE : + * Compute the open loop pitch lag. + * + * The pitch lag search is divided into two sets. + * Each set is divided into three sections. + * Each section cannot have a pitch multiple. + * We find a maximum for each section. + * We compare the maxima of each section. + * + * 1st set 2nd set + * 1st section: lag delay = 115 down to 62 and 115 down to 78 + * 2nd section: lag delay = 61 down to 32 and 77 down to 41 + * 3rd section: lag delay = 31 down to 17 and 40 down to 22 + * 4th section: lag delay = 16 down to 10 and 21 down to 12 + * + * As there is a margin between section overlaps, especially for + * longer delays, this section selection is more robust for not + * to find multiples in the same section when pitch evolves rapidly. + * + * For each section, the length of the vectors to correlate is + * greater/equal to the longest pitch delay. */ +/*----------------------------------------------------------------------------------*/ +/* INPUT ARGUMENTS : */ +/* _ (Word16[]) old_pitch : OL pitch of the 2nd half-frame of the last frame Q0 */ +/* _ (Word16[]) old_corr_fx : correlation Q15 */ +/* _ (Word16[]) corr_shift_fx : normalized correlation correction Q15 */ +/* _ (Word16[]) old_thres_fx : maximum correlation weighting with respect */ +/* to past frame pitch Q15 */ +/* _ (Word16[]) delta_pit : old pitch extrapolation correction Q0 */ +/* _ (Word16[]) st_old_wsp2_fx: weighted speech memory qwsp */ +/* _ (Word16[]) wsp_fx : weighted speech for current frame & look-ahead qwsp */ +/* _ (Word16[]) mem_decim2_fx : wsp decimation filter memory qwsp */ +/* _ (Word16[]) relE_fx : relative frame energy Q8 */ +/* _ (Word16[]) L_look : look-ahead Q0 */ +/* _ (Word16[]) Opt_SC_VBR : SC-VBR flag Q0 */ +/* _ (Word16*) qwsp : wsp & filter memory Qformat */ +/*----------------------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) pitch : open loop pitch lag for each half-frame Q0 */ +/* _ (Word16[]) T_op : open loop pitch lag for each half-frm for quant Q0 */ +/* _ (Word16[]) voicing_fx : max normalized correlation for each half-frame QIn */ +/* _ (Word16[]) old_pitch : OL pitch of the 2nd half-frame of the last frame Q0 */ +/* _ (Word16[]) old_corr_fx : correlation Q15 */ +/* _ (Word16[]) old_thres_fx : maximum correlation weighting with respect */ +/* to past frame pitch Q15 */ +/* _ (Word16[]) delta_pit : old pitch extrapolation correction Q0 */ +/* _ (Word16[]) st_old_wsp2_fx: weighted speech memory qwsp */ +/* _ (Word16[]) mem_decim2_fx : wsp decimation filter memory qwsp */ +/*----------------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*==================================================================================*/ + +void pitch_ol_fx( + Word16 pitch[3], /* o : open loop pitch lag for each half-frame in range [29,231] Q0 */ + Word16 voicing[3], /* o : maximum normalized correlation for each half-frame in [0,1.0[ Q15 */ + Word16 *old_pitch, /* i/o: pitch of the 2nd half-frame of previous frame (i.e. pitch[1]) Q0 */ + Word16 *old_corr, /* i/o: correlation of old_pitch (i.e. voicing[1] or corr_mean) Q15 */ + Word16 corr_shift, /* i : normalized correlation correction Q15 */ + Word16 *old_thres, /* i/o: maximum correlation weighting with respect to past frame pitch Q15 */ + Word16 *delta_pit, /* i/o: old pitch extrapolation correction in range [-14,+14] Q0 */ + Word16 *st_old_wsp2, /* i/o: weighted speech memory qwsp */ + const Word16 *wsp, /* i : weighted speech for current frame and look-ahead qwsp */ + Word16 mem_decim2[3], /* i/o: wsp decimation filter memory qwsp */ + const Word16 relE, /* i : relative frame energy Q8 */ + const Word16 last_class, /* i : frame classification of last frame */ + const Word16 bwidth, /* i : bandwidth */ + const Word16 Opt_SC_VBR /* i : SC-VBR flag */ +) +{ + Word16 ftmp, old_wsp2[( L_WSP - L_INTERPOL ) / OPL_DECIM], *wsp2; + Word16 tmp_mem[3]; + + Word16 scale1[2 * DELTA_COH - 1]; + Word16 scaled_buf[2 * LEN_X + 3 * ( DELTA_COH - 1 )]; + Word16 scaled_buf_exp[2 * LEN_X + 3 * ( DELTA_COH - 1 )], exp_sect[8], exp_sect1[8], exp_sect0; + Word16 cor_buf[2 * LEN_X]; + Word16 *pt_exp1, *pt_exp2, *pt_exp3, *pt_exp4; + Word16 *pt1, *pt2, *pt3, *pt4, *pt5, *pt6; + Word16 *pt_cor0, *pt_cor1, *pt_cor2, *pt_cor3, *pt_cor4, *pt_cor5, *pt_cor6; + Word16 thres1[6]; + Word16 diff, cnt, ind, ind1, offset, offset1, offset_la, offset_la1, coh_flag, coh_flag1; + Word16 ind_corX, ind1_corX; + + Word16 i, j, k, m, pit_min, pit_min1, sect0, subsect0, add_sect0, sub_sect0, old_tmp, old_tmp1, len_x, len_x1; + Word16 len_temp; + Word16 pitchX[NHFR][2 * NSECT], pitch_tmp[2 * NHFR], ind_tmp[2 * NHFR], tmp_buf[NHFR + 1]; + + Word16 enr0[NSECT], enr0_exp[NSECT], enr0_1[NSECT], enr0_1_exp[NSECT], enr1, enr1_exp, enr2_exp; + Word32 enr, enr2, Ltmp; + Word16 fac, tmp16, tmp16_2; + Word16 qCorX, qScaledX; + Word16 scaledX[NHFR][2 * NSECT], corX[NHFR][2 * NSECT], cor_tmp[2 * NHFR], cor_mean; + const Word16 *len, *len1, *sublen, *sublen1, *pit_max, *sec_length, *sec_length1; + + Word16 pit_min_coding; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; +#endif + + /*--------------------------------------------------------------* + * Initialization + *--------------------------------------------------------------*/ + len = len_12k8; + len1 = len1_12k8; + sublen = sublen_12k8; + sublen1 = sublen1_12k8; + pit_max = pit_max_12k8; + sec_length = sec_length_12k8; + sec_length1 = sec_length1_12k8; + + test(); + if ( ( LT_16( last_class, VOICED_TRANSITION ) ) && ( NE_16( bwidth, NB ) ) ) + { + /*reset last pitch reinforcement in case of unvoiced or transitions: it avoids some pitch doublings*/ + *old_thres = 0; + move16(); + } + + pit_min_coding = PIT_MIN_EXTEND; + move16(); + test(); + test(); + test(); + test(); + IF( ( ( NE_16( bwidth, NB ) ) && ( GT_16( *old_pitch, PIT_MIN ) ) ) || + ( ( EQ_16( bwidth, NB ) ) && ( ( GT_16( *old_pitch, PIT_MIN2_1 ) ) || ( LT_16( *old_thres, 3277 ) ) ) ) ) /* 0.1 inQ15*/ + { + pit_min = PIT_MIN / OPL_DECIM; + move16(); + pit_min1 = PIT_MIN_1 / OPL_DECIM; + move16(); + subsect0 = 2; + move16(); + sect0 = 1; + move16(); + } + ELSE + { + pit_min = PIT_MIN2 / OPL_DECIM; + move16(); + pit_min1 = PIT_MIN2_1 / OPL_DECIM; + move16(); + subsect0 = 0; + move16(); + sect0 = 0; + move16(); + } + + len_x = ( PIT_MAX / OPL_DECIM - pit_min + 1 ); + move16(); + len_x1 = ( PIT_MAX / OPL_DECIM - pit_min1 + 1 ); + move16(); + + /*--------------------------------------------------------------* + * Find decimated weighted speech + * Update wsp buffer with the memory + * decimation of wsp[] to search pitch in LF and to reduce complexity + * Extend the decimation of wsp to the end of the speech buffer + * Update wsp memory + *--------------------------------------------------------------*/ + Copy( st_old_wsp2, old_wsp2, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ); + wsp2 = old_wsp2 + ( ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ); + + LP_Decim2_Copy( wsp, wsp2, L_FRAME, mem_decim2 ); + + /* Avoid uninitialized memory access */ + set16_fx( wsp2 + L_FRAME / 2, 0, sizeof( old_wsp2 ) / sizeof( Word16 ) - ( ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ) - L_FRAME / 2 ); + tmp_mem[0] = mem_decim2[0]; + move16(); + tmp_mem[1] = mem_decim2[1]; + move16(); + tmp_mem[2] = mem_decim2[2]; + move16(); + + LP_Decim2_Copy( &wsp[L_FRAME], &wsp2[shr( L_FRAME, 1 )], L_LOOK_12k8, tmp_mem ); /* shr() used instead of division by OPL_DECIM*/ + + Copy( &old_wsp2[shr( L_FRAME, 1 )], st_old_wsp2, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ); + + /*-----------------------------------------------------------------* + * Attenuate the correlation correction factor due to noise. + * Reset correlation buffer outside the useful range. + * Find the scaling functions for immediate neigbours and + * further ones. + *-----------------------------------------------------------------*/ + + corr_shift = shr( corr_shift, 1 ); + + set16_fx( scaled_buf, 0, DELTA_COH - 1 ); + set16_fx( scaled_buf + ( DELTA_COH - 1 ) + len_x, 0, DELTA_COH - 1 ); + set16_fx( scaled_buf + 2 * ( DELTA_COH - 1 ) + len_x + len_x1, 0, DELTA_COH - 1 ); + set16_fx( scaled_buf_exp, 0, len_x + len_x1 + 3 * ( DELTA_COH - 1 ) ); + + pt1 = scale1 + DELTA_COH - 1; + pt2 = pt1; + tmp16 = mult( negate( *old_thres ), MAX_16 / DELTA_COH ); + k = *old_thres; + move16(); + FOR( i = 0; i < DELTA_COH; i++ ) + { + /* + * *pt1 = ( -(*old_thres)/DELTA_COH * i + *old_thres+1.0f ); + * To keep Q15 values, the following code does not add 1 to the result. + * A scaling factor must be applied accordingly (see next use of scale1) + */ + *pt1 = k; + move16(); + k = add( k, tmp16 ); + *pt2-- = *pt1++; + move16(); + } + + /*-----------------------------------------------------------------------------* + * Estimate the new pitch by extrapolating the old pitch value for 2 half-frames + *-----------------------------------------------------------------------------*/ + old_tmp = add( *old_pitch, *delta_pit ); + old_tmp = s_min( old_tmp, PIT_MAX / OPL_DECIM ); + old_tmp = s_max( old_tmp, pit_min ); + old_tmp1 = add( old_tmp, *delta_pit ); + old_tmp1 = s_min( old_tmp1, PIT_MAX / OPL_DECIM ); + old_tmp1 = s_max( old_tmp1, pit_min ); + + /*-----------------------------------------------------------------* + * Loop for all three half-frames (current frame + look-ahead) + *-----------------------------------------------------------------*/ + pt_cor0 = scaled_buf + DELTA_COH - 1; + + pt_cor2 = pt_cor0 - pit_min + old_tmp; + pt_cor4 = pt_cor0 - pit_min1 + old_tmp + ( DELTA_COH - 1 ) + len_x; + + FOR( i = 0; i < NHFR; i++ ) /* i = 0, 1, 2 */ + { + pt1 = wsp2 + i * 2 * ( L_SUBFR / OPL_DECIM ); /* *pt1 -> Q12 */ + pt2 = pt1 - pit_min; /* *pt2 -> Q12 */ + pt4 = pt1 - pit_min1; /* *pt4 -> Q12 */ + + enr = L_deposit_l( 1 ); + + pt_cor1 = pt_cor0; + pt_cor3 = pt_cor0 + ( DELTA_COH - 1 ) + len_x; + + pt_exp1 = scaled_buf_exp + DELTA_COH - 1; + pt_exp2 = pt_exp1; + pt_exp3 = scaled_buf_exp + 2 * ( DELTA_COH - 1 ) + len_x; + pt_exp4 = pt_exp3; + + IF( LT_16( i, NHFR - 1 ) ) /* First two half-frames (current frame) */ + { + pt3 = pt1; + pt5 = pt1; + + FOR( j = sect0; j < NSECT; j++ ) /* loop for each section */ + { + /*-----------------------------------------------------------------* + * Find fixed vector energy + *-----------------------------------------------------------------*/ + + /* 1st set */ + k = (Word16) ( pt1 - pt3 ); + move16(); + + FOR( k = add( k, len[j] ); k > 0; k-- ) + { + enr = L_mac0( enr, *pt3, *pt3 ); + pt3++; + } + /* keep Q15 normalized result */ + cnt = norm_l( enr ); + enr0[j] = extract_h( L_shl( enr, cnt ) ); + enr0_exp[j] = sub( 30, cnt ); + move16(); + + /* Reduce complexity (length of 'enr2' section is equal or larger than 'enr') */ + pt5 = pt3; + enr2 = enr; /* sets to 'enr' in 1 clock */ + move32(); + + /* 2nd set */ + k = (Word16) ( pt1 - pt5 ); + move16(); + + FOR( k = add( k, len1[j] ); k > 0; k-- ) + { + enr2 = L_mac0( enr2, *pt5, *pt5 ); + pt5++; + } + cnt = norm_l( enr2 ); + enr0_1[j] = extract_h( L_shl( enr2, cnt ) ); + enr0_1_exp[j] = sub( 30, cnt ); + move16(); + } + + /*----------------------------------------------------------* + * Find correlation for the non-overlapping pitch lag values + *----------------------------------------------------------*/ + exp_sect[subsect0] = 0; + move16(); + pt_cor5 = pt_cor1; + pt_cor6 = pt_cor3; + + tmp16 = exp_sect[subsect0]; + move16(); + + k = (Word16) ( pt2 - pt1 + pit_max[subsect0] ); + + IF( k >= 0 ) + { + len_temp = sublen[0]; + move16(); + + FOR( ; k >= 0; k-- ) + { + /* Keep Q15 normalized result */ + /* shr by 1 to make room for scaling in the neighbourhood of the extrapolated pitch */ + /* Update exponent to reflect shr by 1 */ + *pt_cor1 = extract_h( L_shr( Dot_product12( pt1, pt2--, len_temp, pt_exp1 ), 1 ) ); + + /* save the biggest exponent */ + tmp16 = s_max( tmp16, *pt_exp1 ); + + pt_cor1++; + pt_exp1++; + } + } + exp_sect[subsect0] = tmp16; + move16(); + + /*----------------------------------------------------------* + * For each subsection, find the correlation + *----------------------------------------------------------*/ + FOR( j = subsect0; j < NSUBSECT; j++ ) + { + len_temp = sublen[j]; + move16(); + + k = (Word16) ( pt2 - pt1 ); + move16(); + k = add( k, pit_max[j + 1] ); + exp_sect[j + 1] = 0; + move16(); + exp_sect1[j] = 0; + move16(); + + IF( k >= 0 ) + { + ind = exp_sect[j + 1]; + move16(); + ind1 = exp_sect1[j]; + move16(); + + FOR( ; k >= 0; k-- ) + { + /* Keep Q15 normalized result */ + /* shr by 1 to make room for scaling in the neighbourhood of the extrapolated pitch */ + /* Update exponent to reflect shr by 1 (done in Dot_product12_OL() for pt_cor3/pt_exp3) */ + *pt_cor1 = extract_h( L_shr( Dot_product12_OL( pt_cor3, pt1, pt2--, sublen[j], sublen1[j], pt_exp1, pt_exp3 ), 1 ) ); + /* The line above replaces: + * *pt_cor1 = shr(extract_h(Dot_product12(pt1, pt2, Sublen[j], pt_exp1)),1); move16(); + * *pt_cor3 = shr(extract_h(Dot_product12(pt1, pt2--, Sublen1[j+i*7], pt_exp3)),1); move16(); + */ + + /* save the biggest exponent */ + ind = s_max( ind, *pt_exp1 ); + ind1 = s_max( ind1, *pt_exp3 ); + + pt_cor1++; + pt_exp1++; + pt_cor3++; + pt_exp3++; + } + exp_sect[j + 1] = ind; + move16(); + exp_sect1[j] = ind1; + move16(); + } /* IF (k >= 0) */ + } /* FOR (j = subsect0; ... */ + } + ELSE /* 3rd half-frame (look-ahead) */ + { + pt6 = pt1 + L_LOOK_12k8 / OPL_DECIM - 1; + pt3 = pt6; + pt5 = pt6; + + /*-----------------------------------------------------------------* + * For each section in both sets, find fixed vector energy + *-----------------------------------------------------------------*/ + + FOR( j = sect0; j < NSECT; j++ ) /* loop for each section */ + { + /* 1st set */ + k = (Word16) ( pt3 - pt6 ); + move16(); + + FOR( k = add( k, len[j] ); k > 0; k-- ) + { + enr = L_mac0( enr, *pt3, *pt3 ); + pt3--; + } + + cnt = norm_l( enr ); + enr0[j] = extract_h( L_shl( enr, cnt ) ); /*qwsp+cnt-16*/ + enr0_exp[j] = sub( 30, cnt ); + move16(); + + /* Reduce complexity (length of 'enr2' section is equal or larger than 'enr') */ + pt5 = pt3; + enr2 = enr; + move16(); + + /* 2nd set */ + k = (Word16) ( pt5 - pt6 ); + move16(); + + FOR( k = add( k, len1[j] ); k > 0; k-- ) + { + enr2 = L_mac0( enr2, *pt5, *pt5 ); + pt5--; + } + + cnt = norm_l( enr2 ); + enr0_1[j] = extract_h( L_shl( enr2, cnt ) ); /*qwsp+cnt-16*/ + enr0_1_exp[j] = sub( 30, cnt ); + move16(); + } + + /* Set pointers */ + IF( sect0 != 0 ) + { + pt2 = pt6 - add( pit_max[1], 1 ); + k = sub( pit_max[2], pit_max[1] ); + move16(); + } + ELSE + { + pt2 = pt6 - pit_min; + k = 2; + move16(); + } + + /*-----------------------------------------------------------------* + * Find correlation for the non-overlapping pitch lag values + *-----------------------------------------------------------------*/ + exp_sect[subsect0] = 0; + move16(); + pt_cor5 = pt_cor1; + pt_cor6 = pt_cor3; + + tmp16 = exp_sect[subsect0]; + move16(); + + IF( k > 0 ) + { + len_temp = sublen[0]; + move16(); + + FOR( ; k > 0; k-- ) + { + /* Following lines are equivalent of Dot_product12() but with a backward incrementing */ + Ltmp = L_deposit_l( 1 ); + FOR( m = 0; m < len_temp; m++ ) + { + Ltmp = L_mac( Ltmp, pt6[-m], pt2[-m] ); + } + + /* Normalize acc in Q31 */ + tmp16_2 = norm_l( Ltmp ); + Ltmp = L_shl( Ltmp, tmp16_2 ); + *pt_exp1 = sub( 30, tmp16_2 ); + move16(); /* exponent = 0..30 */ + + /* Save result */ + *pt_cor1 = extract_h( L_shr( Ltmp, 1 ) ); + + /* Save the biggest exponent */ + tmp16 = s_max( tmp16, *pt_exp1 ); + + pt_cor1++; + pt_exp1++; + pt2--; + } + exp_sect[subsect0] = tmp16; + move16(); + } + + /*-----------------------------------------------------------------* + * For each subsection, find the correlation (overlapping pitch lag values) + *-----------------------------------------------------------------*/ + + FOR( j = subsect0; j < NSUBSECT; j++ ) + { + exp_sect[j + 1] = 0; + move16(); + exp_sect1[j] = 0; + move16(); + + ind = exp_sect[j + 1]; + move16(); + ind1 = exp_sect1[j]; + move16(); + + k = sub( pit_max[j + 1], pit_max[j] ); + + FOR( ; k > 0; k-- ) + { + *pt_cor1 = extract_h( L_shr( Dot_product12_OL_back( pt_cor3, pt6, pt2--, sublen[j], sublen1[j], pt_exp1, pt_exp3 ), 1 ) ); + + /* Save the biggest exponent */ + ind = s_max( ind, *pt_exp1 ); + ind1 = s_max( ind1, *pt_exp3 ); + + pt_cor1++; + pt_exp1++; + pt_cor3++; + pt_exp3++; + } + exp_sect[j + 1] = ind; + move16(); + exp_sect1[j] = ind1; + move16(); + } + } /* 3rd half-frame (look-ahead) */ + + /* Scale all values in each section to the same exponent for upcoming Find_max() */ + offset = 0; + move16(); + offset1 = 0; + move16(); + exp_sect1[7] = 0; /* padding */ + move16(); + FOR( j = sect0; j < NSECT; j++ ) + { + exp_sect0 = s_max( exp_sect[j * 2], exp_sect[j * 2 + 1] ); + + /* scaling of exp for track 1 */ + offset = add( offset, sec_length[j] ); + k = (Word16) ( pt_cor0 - pt_cor5 ); + move16(); + FOR( k = add( k, offset ); k > 0; k-- ) + { + cnt = sub( exp_sect0, *pt_exp2 ); + tmp16 = s_min( 15, cnt ); + if ( cnt > 0 ) + { + tmp16 = shr( *pt_cor5, tmp16 ); + } + if ( cnt > 0 ) + { + *pt_cor5 = tmp16; + move16(); + } + *pt_exp2 = s_max( *pt_exp2, exp_sect0 ); + move16(); + pt_cor5++; + pt_exp2++; + } + + exp_sect0 = s_max( exp_sect1[j * 2], exp_sect1[j * 2 + 1] ); + + /* scaling of exp for track 2 */ + offset1 = add( offset1, sec_length1[j] ); + k = (Word16) ( pt_cor0 - pt_cor6 + ( DELTA_COH - 1 ) ); + move16(); + k = add( k, len_x ); + FOR( k = add( k, offset1 ); k > 0; k-- ) + { + cnt = sub( exp_sect0, *pt_exp4 ); + tmp16 = s_min( 15, cnt ); + if ( cnt > 0 ) + { + tmp16 = shr( *pt_cor6, tmp16 ); + } + if ( cnt > 0 ) + { + *pt_cor6 = tmp16; + move16(); + } + *pt_exp4 = s_max( *pt_exp4, exp_sect0 ); + move16(); + pt_cor6++; + pt_exp4++; + } + } /* FOR (j = sect0; ... */ + + Copy( pt_cor0, cor_buf, len_x ); /* Save unscaled correlation vector */ + Copy( pt_cor0 + ( DELTA_COH - 1 ) + len_x, cor_buf + len_x, len_x1 ); + + /*-----------------------------------------------------------------* + * Scale correlation function in the neighbourhood of + * the extrapolated pitch + *-----------------------------------------------------------------*/ + pt_cor1 = pt_cor2 - ( DELTA_COH - 1 ); + pt_cor3 = pt_cor4 - ( DELTA_COH - 1 ); + pt2 = scale1; + + FOR( k = 0; k < 2 * DELTA_COH - 1; k++ ) + { + /* all Q15 here */ + *pt_cor1 = add( *pt_cor1, mult( *pt_cor1, *pt2 ) ); + move16(); + *pt_cor3 = add( *pt_cor3, mult( *pt_cor3, *pt2++ ) ); + move16(); + + pt_cor1++; + pt_cor3++; + } + + /* Update for next half-frame & look-ahead */ + pt_cor2 = pt_cor0 - pit_min + old_tmp1; + pt_cor4 = pt_cor0 - pit_min1 + old_tmp1 + ( DELTA_COH - 1 ) + len_x; + + /*-----------------------------------------------------------------* + * For each section, find maximum correlation and compute + * normalized correlation + *-----------------------------------------------------------------*/ + + pt_cor1 = pt_cor0; + pt_exp1 = scaled_buf_exp + DELTA_COH - 1; + offset = 0; + move16(); + pt_cor3 = pt_cor0 + ( DELTA_COH - 1 ) + len_x; + pt_exp3 = scaled_buf_exp + 2 * ( DELTA_COH - 1 ) + len_x; + offset1 = 0; + move16(); + + FOR( j = sect0; j < NSECT; j++ ) /* loop for each section */ + { + /* 1st set */ + offset_la = 0; + move16(); + if ( EQ_16( i, 2 ) ) + { + offset_la = sub( L_LOOK_12k8 / OPL_DECIM, len[j] ); + } + + /* 2nd set */ + offset_la1 = 0; + move16(); + if ( EQ_16( i, 2 ) ) + { + offset_la1 = sub( L_LOOK_12k8 / OPL_DECIM, len1[j] ); + } + + /* 1st set of candidates */ + ind = add( maximum_fx( pt_cor1, sec_length[j], &ftmp ), offset ); + pitchX[i][j] = add( ind, pit_min ); + move16(); + pt2 = pt1 - pitchX[i][j] + /*-*/ offset_la; /* selected moving vector */ + + enr1_exp = 0; + move16(); +#ifdef BASOP_NOGLOB + enr1 = add_o( extract_h( dotp_fx( pt2, pt2, len[j], &enr1_exp ) ), 1, &Overflow ); +#else + enr1 = add( extract_h( dotp_fx( pt2, pt2, len[j], &enr1_exp ) ), 1 ); +#endif + + enr2 = L_mult( enr0[j], enr1 ); + enr2_exp = norm_l( enr2 ); + enr2 = L_shl( enr2, enr2_exp ); + enr2_exp = sub( 31, add( sub( 28, add( enr0_exp[j], enr1_exp ) ), add( enr2_exp, 1 ) ) ); + + enr2 = Isqrt_lc( enr2, &enr2_exp ); /* 1/sqrt(energy) */ /*31-enr2_exp*/ + enr1_exp = norm_l( enr2 ); + enr1 = extract_h( L_shl( enr2, enr1_exp ) ); /*31-enr2_exp+enr1_exp-16*/ + enr1_exp = sub( enr2_exp, enr1_exp ); /*15-enr1_exp*/ + + Ltmp = L_mult0( cor_buf[ind], enr1 ); + qCorX = add( sub( 15, enr1_exp ), sub( 14, pt_exp1[ind] ) ); +#ifdef BASOP_NOGLOB + corX[i][j] = extract_h( L_shr_o( Ltmp, sub( qCorX, 31 ), &Overflow ) ); +#else /* BASOP_NOGLOB */ + corX[i][j] = extract_h( L_shr( Ltmp, sub( qCorX, 31 ) ) ); +#endif /* BASOP_NOGLOB */ + qCorX = 31; + move16(); + + Ltmp = L_mult0( pt_cor0[ind], enr1 ); + qScaledX = add( sub( 15, enr1_exp ), sub( 14, pt_exp1[ind] ) ); + scaledX[i][j] = round_fx( L_shl( Ltmp, sub( 16 + 12, qScaledX ) ) ); + qScaledX = 12; + move16(); + + pt_cor1 += sec_length[j]; + move16(); + offset = add( offset, sec_length[j] ); + + /* 2nd set of candidates */ + ind1 = add( maximum_fx( pt_cor3, sec_length1[j], &ftmp ), offset1 ); + pitchX[i][j + NSECT] = add( ind1, pit_min1 ); + move16(); + pt4 = pt1 - pitchX[i][j + NSECT] + /*-*/ offset_la1; + move16(); /* selected moving vector */ + enr1_exp = 0; + move16(); +#ifdef BASOP_NOGLOB + enr1 = add_o( extract_h( dotp_fx( pt4, pt4, len1[j], &enr1_exp ) ), 1, &Overflow ); +#else + enr1 = add( extract_h( dotp_fx( pt4, pt4, len1[j], &enr1_exp ) ), 1 ); +#endif + + enr2 = L_mult( enr0_1[j], enr1 ); + enr2_exp = norm_l( enr2 ); + enr2 = L_shl( enr2, enr2_exp ); + + enr2_exp = sub( 31, add( sub( 28, add( enr0_1_exp[j], enr1_exp ) ), add( enr2_exp, 1 ) ) ); + enr2 = Isqrt_lc( enr2, &enr2_exp ); /* 1/sqrt(energy) */ /*31-enr2_exp*/ + enr1_exp = norm_l( enr2 ); + enr1 = extract_h( L_shl( enr2, enr1_exp ) ); /*31-enr2_exp+enr1_exp-16*/ + enr1_exp = sub( enr2_exp, enr1_exp ); /*15-enr1_exp*/ + + Ltmp = L_mult0( cor_buf[ind1 + len_x], enr1 ); + + qCorX = add( sub( 15, enr1_exp ), sub( 14, pt_exp3[ind1] ) ); +#ifdef BASOP_NOGLOB + corX[i][j + NSECT] = extract_h( L_shr_o( Ltmp, qCorX - 31, &Overflow ) ); +#else /* BASOP_NOGLOB */ + corX[i][j + NSECT] = extract_h( L_shr( Ltmp, qCorX - 31 ) ); +#endif /* BASOP_NOGLOB */ + qCorX = 31; + move16(); + + Ltmp = L_mult0( pt_cor0[ind1 + ( DELTA_COH - 1 ) + len_x], enr1 ); + qScaledX = add( sub( 15, enr1_exp ), sub( 14, pt_exp3[ind1] ) ); + scaledX[i][j + NSECT] = round_fx( L_shl( Ltmp, sub( 16 + 12, qScaledX ) ) ); + /*scaledX[i][j+NSECT] = saturate(L_shr(Ltmp, qScaledX-12));*/ + qScaledX = 12; + move16(); + + pt_cor3 += sec_length1[j]; + move16(); + offset1 = add( offset1, sec_length1[j] ); + + } /* FOR j < NSECT */ + } /* FOR i < NHFR */ + + /*-----------------------------------------------------------------* + * Favor a smaller delay if it happens that it has its multiple + * in the longer-delay sections (harmonics check) + *-----------------------------------------------------------------*/ + + FOR( i = 0; i < 2; i++ ) /* loop for the 2 half-frames */ + { + fac = THRES0; + move16(); + find_mult_fx( &fac, pitchX[i][2], pitchX[i][3], pit_max[7], &scaledX[i][2], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 3rd section */ + find_mult_fx( &fac, pitchX[i][1], pitchX[i][2], pit_max[5], &scaledX[i][1], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 2nd section */ + test(); + IF( ( sect0 == 0 ) && GE_16( shl( pitchX[i][0], 1 ), pit_min_coding ) ) + { + find_mult_fx( &fac, pitchX[i][0], pitchX[i][1], pit_max[3], &scaledX[i][0], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 2nd section */ + } + fac = THRES0; + move16(); + find_mult_fx( &fac, pitchX[i][NSECT + 2], pitchX[i][NSECT + 3], pit_max[7], &scaledX[i][NSECT + 2], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 3rd section */ + find_mult_fx( &fac, pitchX[i][NSECT + 1], pitchX[i][NSECT + 2], pit_max[6], &scaledX[i][NSECT + 1], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 2nd section */ + test(); + IF( ( sect0 == 0 ) && GE_16( shl( pitchX[i][NSECT + 0], 1 ), pit_min_coding ) ) + { + find_mult_fx( &fac, pitchX[i][NSECT + 0], pitchX[i][NSECT + 1], pit_max[4], &scaledX[i][NSECT + 0], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 2nd section */ + } + } + fac = THRES0; + move16(); /* the look-ahead */ + find_mult_fx( &fac, pitchX[i][2], pitchX[i][3], pit_max[7], &scaledX[i][2], old_pitch, old_corr, 2, 2 ); /* Multiples in 3rd section */ + find_mult_fx( &fac, pitchX[i][1], pitchX[i][2], pit_max[5], &scaledX[i][1], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 2nd section */ + test(); + IF( ( sect0 == 0 ) && GE_16( shl( pitchX[i][0], 1 ), pit_min_coding ) ) + { + find_mult_fx( &fac, pitchX[i][0], pitchX[i][1], pit_max[3], &scaledX[i][0], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 2nd section */ + } + fac = THRES0; + move16(); + find_mult_fx( &fac, pitchX[i][NSECT + 2], pitchX[i][NSECT + 3], pit_max[7], &scaledX[i][NSECT + 2], old_pitch, old_corr, 2, 2 ); /* Multiples in 3rd section */ + find_mult_fx( &fac, pitchX[i][NSECT + 1], pitchX[i][NSECT + 2], pit_max[6], &scaledX[i][NSECT + 1], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 2nd section */ + test(); + IF( ( sect0 == 0 ) && GE_16( shl( pitchX[i][NSECT + 0], 1 ), pit_min_coding ) ) + { + find_mult_fx( &fac, pitchX[i][NSECT + 0], pitchX[i][NSECT + 1], pit_max[4], &scaledX[i][NSECT + 0], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 2nd section */ /* Multiples in 2nd section */ + } + + /*-----------------------------------------------------------------* + * Do 1st estimate for pitch values + * Adjust the normalized correlation using estimated noise level + * Compute the maximum scaling for the neighbour correlation + * reinforcement + *-----------------------------------------------------------------*/ + add_sect0 = add( NSECT, sect0 ); + sub_sect0 = sub( NSECT, sect0 ); + FOR( i = 0; i < NHFR; i++ ) + { + /* 1st set of pitch candidates */ + ind = add( maximum_fx( scaledX[i] + sect0, sub_sect0, &ftmp ), sect0 ); + ind_tmp[i] = ind; + move16(); + pitch_tmp[i] = pitchX[i][ind]; + move16(); +#ifdef BASOP_NOGLOB + cor_tmp[i] = add_o( corX[i][ind], corr_shift, &Overflow ); +#else /* BASOP_NOGLOB */ + cor_tmp[i] = add( corX[i][ind], corr_shift ); +#endif /* BASOP_NOGLOB */ + move16(); + + /* Higher is the neighbour's correlation, higher is the weighting */ + /* operands are Q15, result is Q15 */ + thres1[i] = mult( THRES1, cor_tmp[i] ); + move16(); + + /* 2nd set of pitch candidates */ + ind1 = add( maximum_fx( scaledX[i] + add_sect0, sub_sect0, &ftmp ), add_sect0 ); + ind_tmp[i + NHFR] = ind1; + move16(); + pitch_tmp[i + NHFR] = pitchX[i][ind1]; + move16(); +#ifdef BASOP_NOGLOB + cor_tmp[i + NHFR] = add_o( corX[i][ind1], corr_shift, &Overflow ); +#else /* BASOP_NOGLOB */ + cor_tmp[i + NHFR] = add( corX[i][ind1], corr_shift ); +#endif + move16(); + + /* Higher is the neighbour's correlation, higher is the weighting */ + /* operands are Q15, result is Q15 */ + thres1[i + NHFR] = mult( THRES1, cor_tmp[i + NHFR] ); + move16(); + } + /*-----------------------------------------------------------------* + * Take into account previous and next pitch values of the present + * frame and look-ahead. Choose the pitch lags and normalize + * correlations for each half-frame & look-ahead + *-----------------------------------------------------------------*/ -static void find_mult_fx( Word16 *fac, Word16 pitch0, Word16 pitch1, Word16 pit_max0, Word16 *corr, Word16 *old_pitch, Word16 *old_corr, Word16 delta, Word16 step ); + pitch_neighbour_fx( sect0, pitch_tmp, pitchX, cor_tmp, scaledX, thres1, ind_tmp ); + FOR( i = 0; i < NHFR; i++ ) + { + ind = add( maximum_fx( scaledX[i] + sect0, sub_sect0, &ftmp ), sect0 ); + ind_corX = add( maximum_fx( corX[i] + sect0, sub_sect0, &ftmp ), sect0 ); -static Word16 pitch_coherence_fx( Word16 pitch0, Word16 pitch1, Word16 fac_max, Word16 diff_max ); + ind1 = add( maximum_fx( scaledX[i] + add_sect0, sub_sect0, &ftmp ), add_sect0 ); + ind1_corX = add( maximum_fx( corX[i] + add_sect0, sub_sect0, &ftmp ), add_sect0 ); -static Word32 Dot_product12_OL( Word16 *sum1, const Word16 x[], const Word16 y[], const Word16 lg, const Word16 lg2, Word16 *exp, Word16 *exp2 ); + if ( GT_16( scaledX[i][ind1], scaledX[i][ind] ) ) + { + ind = ind1; + move16(); + } + test(); + if ( Opt_SC_VBR && GT_16( corX[i][ind1_corX], corX[i][ind_corX] ) ) + { + ind_corX = ind1_corX; + move16(); + } + test(); + test(); + test(); + IF( Opt_SC_VBR && ( LT_16( mult( pitchX[i][ind], 13107 /*0.4 in Q15*/ ), pitchX[i][ind_corX] ) ) && + ( GT_16( mult( pitchX[i][ind], 19661 /*0.6 in Q15*/ ), pitchX[i][ind_corX] ) ) && + ( GE_16( corX[i][ind_corX], 29491 /*0.9 in Q15*/ ) ) ) + { + pitch[i] = pitchX[i][ind_corX]; + move16(); + voicing[i] = corX[i][ind_corX]; + move16(); + } + ELSE + { + pitch[i] = pitchX[i][ind]; + move16(); + voicing[i] = corX[i][ind]; + move16(); + } + } -static Word32 Dot_product12_OL_back( Word16 *sum1, const Word16 x[], const Word16 y[], const Word16 lg, const Word16 lg2, Word16 *exp, Word16 *exp2 ); + /*-----------------------------------------------------------------* + * Increase the threshold for correlation reinforcement with + * the past if correlation high and pitch stable + *-----------------------------------------------------------------*/ + /* all Q15 here */ + /* cor_mean = 0.5f * (voicing[0] + voicing[1]) + corr_shift; */ + Ltmp = L_mult( voicing[0], 16384 ); + Ltmp = L_mac( Ltmp, voicing[1], 16384 ); + cor_mean = round_fx( L_add( Ltmp, corr_shift ) ); -/*-----------------------------------------------------------------* - * pitch_ol_init() - * - * Open loop pitch variable initialization - *-----------------------------------------------------------------*/ -void pitch_ol_init_fx( - Word16 *old_thres, /* o : threshold for reinforcement of past pitch influence */ - Word16 *old_pitch, /* o : pitch of the 2nd half-frame of previous frame */ - Word16 *delta_pit, /* o : pitch evolution extrapolation */ - Word16 *old_corr /* o : correlation */ -) -{ - *old_thres = 0; + /* pitch unstable in present frame or from previous frame or normalized correlation too low */ + coh_flag = pitch_coherence_fx( pitch[0], pitch[1], COH_FAC, DELTA_COH ); move16(); - *old_pitch = 0; + coh_flag1 = pitch_coherence_fx( pitch[0], *old_pitch, COH_FAC, DELTA_COH ); + move16(); + + test(); + test(); + test(); + IF( ( coh_flag == 0 ) || ( coh_flag1 == 0 ) || ( LT_16( cor_mean, CORR_TH0 ) ) || ( LT_16( relE, THR_relE ) ) ) + { + /* Reset the threshold */ + *old_thres = 0; + move16(); + } + ELSE + { + /* The threshold increase is directly dependent on normalized correlation */ + /* *old_thres += (0.16f * cor_mean); */ + *old_thres = round_fx( L_mac( L_deposit_h( *old_thres ), 5243, cor_mean ) ); + } + + *old_thres = s_min( *old_thres, THRES3 ); + move16(); + + IF( GT_16( voicing[1], voicing[0] ) ) + { + *old_corr = voicing[1]; + move16(); + } + ELSE + { + *old_corr = cor_mean; + move16(); + } + + /*-----------------------------------------------------------------* + * Extrapolate the pitch value for the next frame by estimating + * the pitch evolution. This value is added to the old_pitch + * in the next frame and is then used when the normalized + * correlation is reinforced by the past estimate + *-----------------------------------------------------------------*/ + tmp_buf[0] = *old_pitch; move16(); + FOR( i = 0; i < NHFR; i++ ) + { + tmp_buf[i + 1] = pitch[i]; + move16(); + } + *delta_pit = 0; move16(); - *old_corr = 0; + cnt = 0; move16(); -} + FOR( i = 0; i < NHFR; i++ ) + { + diff = sub( tmp_buf[i + 1], tmp_buf[i] ); + move16(); + coh_flag = pitch_coherence_fx( tmp_buf[i], tmp_buf[i + 1], COH_FAC, DELTA_COH ); -/*==================================================================================*/ -/* FUNCTION : pitch_ol_fx() */ -/*----------------------------------------------------------------------------------*/ -/* PURPOSE : - * Compute the open loop pitch lag. - * - * The pitch lag search is divided into two sets. - * Each set is divided into three sections. - * Each section cannot have a pitch multiple. - * We find a maximum for each section. - * We compare the maxima of each section. - * - * 1st set 2nd set - * 1st section: lag delay = 115 down to 62 and 115 down to 78 - * 2nd section: lag delay = 61 down to 32 and 77 down to 41 - * 3rd section: lag delay = 31 down to 17 and 40 down to 22 - * 4th section: lag delay = 16 down to 10 and 21 down to 12 - * - * As there is a margin between section overlaps, especially for - * longer delays, this section selection is more robust for not - * to find multiples in the same section when pitch evolves rapidly. - * - * For each section, the length of the vectors to correlate is - * greater/equal to the longest pitch delay. */ -/*----------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16[]) old_pitch : OL pitch of the 2nd half-frame of the last frame Q0 */ -/* _ (Word16[]) old_corr_fx : correlation Q15 */ -/* _ (Word16[]) corr_shift_fx : normalized correlation correction Q15 */ -/* _ (Word16[]) old_thres_fx : maximum correlation weighting with respect */ -/* to past frame pitch Q15 */ -/* _ (Word16[]) delta_pit : old pitch extrapolation correction Q0 */ -/* _ (Word16[]) st_old_wsp2_fx: weighted speech memory qwsp */ -/* _ (Word16[]) wsp_fx : weighted speech for current frame & look-ahead qwsp */ -/* _ (Word16[]) mem_decim2_fx : wsp decimation filter memory qwsp */ -/* _ (Word16[]) relE_fx : relative frame energy Q8 */ -/* _ (Word16[]) L_look : look-ahead Q0 */ -/* _ (Word16[]) Opt_SC_VBR : SC-VBR flag Q0 */ -/* _ (Word16*) qwsp : wsp & filter memory Qformat */ -/*----------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) pitch : open loop pitch lag for each half-frame Q0 */ -/* _ (Word16[]) T_op : open loop pitch lag for each half-frm for quant Q0 */ -/* _ (Word16[]) voicing_fx : max normalized correlation for each half-frame QIn */ -/* _ (Word16[]) old_pitch : OL pitch of the 2nd half-frame of the last frame Q0 */ -/* _ (Word16[]) old_corr_fx : correlation Q15 */ -/* _ (Word16[]) old_thres_fx : maximum correlation weighting with respect */ -/* to past frame pitch Q15 */ -/* _ (Word16[]) delta_pit : old pitch extrapolation correction Q0 */ -/* _ (Word16[]) st_old_wsp2_fx: weighted speech memory qwsp */ -/* _ (Word16[]) mem_decim2_fx : wsp decimation filter memory qwsp */ -/*----------------------------------------------------------------------------------*/ + if ( coh_flag != 0 ) + { + *delta_pit = add( *delta_pit, diff ); + move16(); + } + cnt = add( cnt, coh_flag ); + } + if ( EQ_16( cnt, 2 ) ) + { + /* *delta_pit /= 2; */ + *delta_pit = shr( *delta_pit, 1 ); + move16(); + } + IF( EQ_16( cnt, 3 ) ) + { + k = *delta_pit; + move16(); + /* *delta_pit /= 3; */ + if ( k < 0 ) + { + *delta_pit = mult( *delta_pit, -32768 ); + move16(); + } + tmp16 = mult( *delta_pit, 10923 ); + if ( k < 0 ) + { + tmp16 = mult( tmp16, -32768 ); + } + *delta_pit = tmp16; + move16(); + } -/*----------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*==================================================================================*/ + /*--------------------------------------------------------------* + * Update old pitch, upsample pitch, + *--------------------------------------------------------------*/ + *old_pitch = pitch[1]; + move16(); -void pitch_ol_fx( + FOR( i = 0; i < NHFR; i++ ) + { + /* compensate decimation */ + pitch[i] = i_mult2( pitch[i], OPL_DECIM ); + move16(); + } + + return; +} + +void pitch_ol_ivas_fx( Word16 pitch[3], /* o : open loop pitch lag for each half-frame in range [29,231] Q0 */ Word16 voicing[3], /* o : maximum normalized correlation for each half-frame in [0,1.0[ Q15 */ Word16 *old_pitch, /* i/o: pitch of the 2nd half-frame of previous frame (i.e. pitch[1]) Q0 */ @@ -324,7 +1463,7 @@ void pitch_ol_fx( pt2 = pt1 - pit_min; /* *pt2 -> Q12 */ pt4 = pt1 - pit_min1; /* *pt4 -> Q12 */ - enr = L_deposit_l( 1 ); + enr = 0; pt_cor1 = pt_cor0; pt_cor3 = pt_cor0 + ( DELTA_COH - 1 ) + len_x; @@ -348,10 +1487,10 @@ void pitch_ol_fx( /* 1st set */ k = (Word16) ( pt1 - pt3 ); move16(); - + Flag overflow = 0; FOR( k = add( k, len[j] ); k > 0; k-- ) { - enr = L_mac0( enr, *pt3, *pt3 ); + enr = L_mac0_o( enr, *pt3, *pt3, &overflow ); pt3++; } /* keep Q15 normalized result */ @@ -371,7 +1510,7 @@ void pitch_ol_fx( FOR( k = add( k, len1[j] ); k > 0; k-- ) { - enr2 = L_mac0( enr2, *pt5, *pt5 ); + enr2 = L_mac0_o( enr2, *pt5, *pt5, &overflow ); pt5++; } cnt = norm_l( enr2 ); @@ -403,7 +1542,7 @@ void pitch_ol_fx( /* Keep Q15 normalized result */ /* shr by 1 to make room for scaling in the neighbourhood of the extrapolated pitch */ /* Update exponent to reflect shr by 1 */ - *pt_cor1 = extract_h( L_shr( Dot_product12( pt1, pt2--, len_temp, pt_exp1 ), 1 ) ); + *pt_cor1 = extract_h( L_shr( Dot_product12_ivas( pt1, pt2--, len_temp, pt_exp1 ), 1 ) ); /* save the biggest exponent */ tmp16 = s_max( tmp16, *pt_exp1 ); @@ -443,7 +1582,7 @@ void pitch_ol_fx( /* Keep Q15 normalized result */ /* shr by 1 to make room for scaling in the neighbourhood of the extrapolated pitch */ /* Update exponent to reflect shr by 1 (done in Dot_product12_OL() for pt_cor3/pt_exp3) */ - *pt_cor1 = extract_h( L_shr( Dot_product12_OL( pt_cor3, pt1, pt2--, sublen[j], sublen1[j], pt_exp1, pt_exp3 ), 1 ) ); + *pt_cor1 = extract_h( L_shr( Dot_product12_OL_ivas( pt_cor3, pt1, pt2--, sublen[j], sublen1[j], pt_exp1, pt_exp3 ), 1 ) ); /* The line above replaces: * *pt_cor1 = shr(extract_h(Dot_product12(pt1, pt2, Sublen[j], pt_exp1)),1); move16(); * *pt_cor3 = shr(extract_h(Dot_product12(pt1, pt2--, Sublen1[j+i*7], pt_exp3)),1); move16(); @@ -474,7 +1613,7 @@ void pitch_ol_fx( /*-----------------------------------------------------------------* * For each section in both sets, find fixed vector energy *-----------------------------------------------------------------*/ - + Flag overflow = 0; FOR( j = sect0; j < NSECT; j++ ) /* loop for each section */ { /* 1st set */ @@ -483,7 +1622,7 @@ void pitch_ol_fx( FOR( k = add( k, len[j] ); k > 0; k-- ) { - enr = L_mac0( enr, *pt3, *pt3 ); + enr = L_mac0_o( enr, *pt3, *pt3, &overflow ); pt3--; } @@ -503,7 +1642,7 @@ void pitch_ol_fx( FOR( k = add( k, len1[j] ); k > 0; k-- ) { - enr2 = L_mac0( enr2, *pt5, *pt5 ); + enr2 = L_mac0_o( enr2, *pt5, *pt5, &overflow ); pt5--; } @@ -549,7 +1688,7 @@ void pitch_ol_fx( Ltmp = L_deposit_l( 1 ); FOR( m = 0; m < len_temp; m++ ) { - Ltmp = L_mac( Ltmp, pt6[-m], pt2[-m] ); + Ltmp = L_mac_o( Ltmp, pt6[-m], pt2[-m], &overflow ); } /* Normalize acc in Q31 */ @@ -592,7 +1731,7 @@ void pitch_ol_fx( FOR( ; k > 0; k-- ) { - *pt_cor1 = extract_h( L_shr( Dot_product12_OL_back( pt_cor3, pt6, pt2--, sublen[j], sublen1[j], pt_exp1, pt_exp3 ), 1 ) ); + *pt_cor1 = extract_h( L_shr( Dot_product12_OL_back_ivas( pt_cor3, pt6, pt2--, sublen[j], sublen1[j], pt_exp1, pt_exp3 ), 1 ) ); /* Save the biggest exponent */ ind = s_max( ind, *pt_exp1 ); @@ -1462,7 +2601,6 @@ static Word32 Dot_product12_OL_back( /* o : Q31: normalized r return L_sum; } - void pitchDoubling_det_fx( Word16 *wspeech, Word16 *pitch_ol, diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index b05dfcce2..37b8eb340 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -149,6 +149,14 @@ void dtx_fx( ); +void dtx_ivas_fx( + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 vad, /* i : vad flag for DTX */ + const Word16 speech[] /* i : Pointer to the speech frame */ + +); + Word16 dtx_hangover_addition_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ const Word16 vad_flag, /* i Q0 */ @@ -238,7 +246,19 @@ void long_enr_fx( const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) */ const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ Word16 high_lpn_flag ); +#ifdef IVAS_FLOAT_FIXED +void ivas_long_enr_fx( + Encoder_State *st_fx, /* i/o: state structure */ + const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) */ + const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ + Word16 high_lpn_flag, /* i : sp/mus LPN flag */ + FRONT_VAD_ENC_HANDLE hFrontVad[], /* i/o: front-VAD handles */ + const Word16 n_chan, /* i : number of channels */ + const Word16 localVAD_HE_SAD_LR[], /* i : HE-SAD flag without hangover LR channels */ + const Word16 Etot_LR[] /* i : total channel energy LR channels */ +); +#endif Word16 mdct_classifier_fx( /* o: MDCT A/B decision */ const Word16 *Y, /* i: re[0], re[1], ..., re[n/2], im[n/2 - 1], im[n/2 - 2], ..., im[1] */ Encoder_State *st_fx, /* i/o: Encoder state variable */ @@ -295,7 +315,38 @@ void noise_est_fx( #endif const Word16 ini_frame /* i : Frame number (init) */ ); - +#ifdef IVAS_FLOAT_FIXED +void noise_est_ivas_fx( + Encoder_State *st_fx, /* i/o: state structure */ + const Word16 old_pitch1, /* i : previous frame OL pitch[1] */ + const Word32 tmpN[], /* i : temporary noise update Q_new + QSCALE */ + const Word16 epsP_h[], /* i : msb prediction error energies Q_r-1 */ + const Word16 epsP_l[], /* i : msb prediction error energies Q_r-1 */ + const Word16 Etot, /* i : total channel E (see find_enr_fx.c) Q8 */ + const Word16 relE, /* i : (VA_CHECK addition) relative frame energy Q8? */ + const Word16 corr_shift, /* i : normalized correlation correction Q15 */ + const Word32 enr[], /* i : averaged energy over both subframes Q_new + Q_SCALE */ + Word32 fr_bands[], /* i : spectrum per critical bands of the current frame Q_new + Q_SCALE */ + Word16 *cor_map_sum, /* o : Q8 */ + Word16 *sp_div, /* o : Q_sp_div */ + Word16 *Q_sp_div, /* o : Q factor for sp_div */ + Word16 *non_staX, /* o : non-stationarity for sp/mus classifier */ + Word16 *loc_harm, /* o : multi-harmonicity flag for UV classifier */ + const Word32 *lf_E, /* i : per bin energy for low frequencies Q_new + Q_SCALE -2 */ + Word16 *st_harm_cor_cnt, /* i/o : 1st harm correlation timer Q0 */ + const Word16 Etot_l_lp, /* i : Smoothed low energy Q8 */ + const Word16 Etot_v_h2, /* i : Energy variations Q8 */ + Word16 *bg_cnt, /* i : Background burst length timer Q0 */ + Word16 EspecdB[], /* i/o: log E spectrum (with f=0) of the current frame Q7 for multi harm */ + Word16 Q_new, /* i : SCaling of current frame */ + const Word32 Le_min_scaled, /*i : Minimum energy value in Q_new + Q_SCALE */ + Word16 *sp_floor, /* o : noise floor estimate Q7 */ + Word16 S_map[], /* o : short-term correlation map Q7 */ + STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ + FRONT_VAD_ENC_HANDLE hFrontVad, /* i/o: front-VAD handle */ + const Word16 ini_frame /* i : Frame number (init) */ +); +#endif void noise_est_pre_fx( const Word16 Etot, /* i : Energy of current frame */ const Word16 ini_frame_fx, /* i : Frame number (init) */ @@ -329,6 +380,23 @@ void pitch_ol2_fx( const Word16 delta /* i : delta for pitch search (2 or 7) */ ); +void pitch_ol_ivas_fx( + Word16 pitch[3], /* o : open loop pitch lag for each half-frame in range [29,231] Q0 */ + Word16 voicing[3], /* o : maximum normalized correlation for each half-frame in [0,1.0[ Q15 */ + Word16 *old_pitch, /* i/o: pitch of the 2nd half-frame of previous frame (i.e. pitch[1]) Q0 */ + Word16 *old_corr, /* i/o: correlation of old_pitch (i.e. voicing[1] or corr_mean) Q15 */ + Word16 corr_shift, /* i : normalized correlation correction Q15 */ + Word16 *old_thres, /* i/o: maximum correlation weighting with respect to past frame pitch Q15 */ + Word16 *delta_pit, /* i/o: old pitch extrapolation correction in range [-14,+14] Q0 */ + Word16 *st_old_wsp2, /* i/o: weighted speech memory qwsp */ + const Word16 *wsp, /* i : weighted speech for current frame and look-ahead qwsp */ + Word16 mem_decim2[3], /* i/o: wsp decimation filter memory qwsp */ + const Word16 relE, /* i : relative frame energy Q8 */ + const Word16 last_class, /* i : frame classification of last frame */ + const Word16 bwidth, /* i : bandwidth */ + const Word16 Opt_SC_VBR /* i : SC-VBR flag */ +); + void pitch_ol_fx( Word16 pitch[3], /* o : open loop pitch lag for each half-frame in range [29,231] Q0 */ Word16 voicing[3], /* o : maximum normalized correlation for each half-frame in [0,1.0[ Q15 */ @@ -2755,10 +2823,9 @@ void pre_proc_fx( Word16 lsp_new[M], /* o : LSPs at the end of the frame */ Word16 lsp_mid[M], /* o : LSPs in the middle of the frame */ Word16 *vad_hover_flag, - Word16 *attack_flag, /* o : flag signalling attack encoded by AC mode (GSC) */ - Word16 *new_inp_resamp16k, /* o : new i signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */ - Word16 *Voicing_flag, /* o : voicing flag for HQ FEC */ - + Word16 *attack_flag, /* o : flag signalling attack encoded by AC mode (GSC) */ + Word16 *new_inp_resamp16k, /* o : new i signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */ + Word16 *Voicing_flag, /* o : voicing flag for HQ FEC */ Word32 realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o : cldfb real buffer */ Word32 imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o : cldfb imag buffer */ CLDFB_SCALE_FACTOR *cldfbScale, /* o : cldfb scale */ diff --git a/lib_enc/rom_enc.c b/lib_enc/rom_enc.c index 9b4d998d6..3b9302765 100644 --- a/lib_enc/rom_enc.c +++ b/lib_enc/rom_enc.c @@ -412,12 +412,24 @@ const float sm_means[N_SMC_FEATURES] = { 109.073304f, 0.727576f, 0.246557f, 0.291464f, 0.836498f, 1.021915f, 1.213649f, 64.230265f, 1.236224f, -2.347783f, 1.795570f, -0.039230f, -0.292081f, 0.611993f, 5.587905f, }; - +#ifdef IVAS_FLOAT_FIXED +const Word32 sm_means_fx[N_SMC_FEATURES] = +{ +114371648, 762918, 258533, 305622, 877131, 1071555, 1272603, 67350312, +1296274, -2461829, 1882791, -41135, -306269, 641721, 5859343, +}; +#endif const float sm_scale[N_SMC_FEATURES] = { 44.621579f, 0.159182f, 0.063806f, 0.067614f, 0.112130f, 0.103447f, 0.091769f, 16.522003f, 0.115806f, 1.284023f, 3.337835f, 1.726416f, 1.422670f, 0.270914f, 0.422958f, }; - +#ifdef IVAS_FLOAT_FIXED +const Word32 sm_scale_fx[N_SMC_FEATURES] = +{//Q20 +46789116, 166914, 66905, 70898, 117576, 108472, 96226, 17324576, +121431, 1346395, 3499973, 1810278, 1491777, 284073, 443503, +}; +#endif const float hout_intervals[N_SMC_FEATURES * 2] = { 18.000000f, 230.000000f, 0.000000f, 0.999769f, 0.119389f, 0.990880f, 0.255791f, 1.181627f, @@ -426,25 +438,51 @@ const float hout_intervals[N_SMC_FEATURES * 2] = -11.751500f, 10.883281f, 0.000793f, 1.994476f, 3.021017f, 10.545962f, }; - +#ifdef IVAS_FLOAT_FIXED +const Word32 hout_intervals_fx[N_SMC_FEATURES * 2] = +{//Q20 +18874368, 241172480, 0, 1048333, 125188, 1039013, 268216, 1239025, +426065, 1451491, 608719, 1618445, 818630, 1973136, 0, 127492952, +0, 275457504, -8950052, -58, -15134888, 18681054, -11149023, 12630839, +-12322341, 11411947, 831, 2091359, 3167766, 11058243, +}; +#endif const float bcox_add_cnst[N_SMC_FEATURES] = { 0.000000f, 0.000000f, -0.878682f, -0.726044f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.778993f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f }; - +#ifdef IVAS_FLOAT_FIXED +const Word32 bcox_add_cnst_fx[N_SMC_FEATURES] = +{ + 0, 0, -1886955264, -1559167616, 0, 0, 0, 0, +-1672874752, 0, 0, 0, 0, 0, 0, +}; +#endif const float bcox_lmbd[N_SMC_FEATURES] = { 0.000000f, 0.000000f, -0.664282f, -0.422504f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.634475f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, }; - +#ifdef IVAS_FLOAT_FIXED +const Word32 bcox_lmbd_fx[N_SMC_FEATURES] = +{ +0, 0, -1426534784, -907320448, 0, 0, 0, 0, +-1362524672, 0, 0, 0, 0, 0, 0, +}; +#endif const float pca_mean_[N_SMC_FEATURES] = { 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.000000f, -0.000000f, 0.000000f, -0.000000f, -0.000000f, 0.000000f, 0.000000f, -0.000000f, 0.000000f, 0.000000f, 0.000000f }; - +#ifdef IVAS_FLOAT_FIXED +const Word32 pca_mean_fx[N_SMC_FEATURES] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, +}; +#endif const float pca_components_[N_SMC_FEATURES * N_PCA_COEF] = { 0.025076f, -0.242897f, 0.309604f, 0.391805f, 0.384930f, 0.378366f, 0.352165f, -0.191363f, 0.158511f, 0.329501f, 0.145794f, 0.086507f, 0.009591f, 0.276506f, -0.007154f, @@ -460,7 +498,35 @@ const float pca_components_[N_SMC_FEATURES * N_PCA_COEF] = -0.025136f, -0.058113f, 0.137926f, 0.044374f, -0.239076f, 0.007627f, 0.343252f, 0.516920f, 0.447960f, -0.427809f, 0.100915f, 0.071696f, 0.016780f, 0.162128f, 0.327376f, -0.016076f, -0.042889f, -0.441975f, 0.409942f, -0.243623f, -0.482644f, 0.460423f, 0.052715f, -0.067754f, 0.305681f, 0.058106f, -0.008628f, 0.098064f, -0.032513f, -0.123637f, }; - +#ifdef IVAS_FLOAT_FIXED +const Word32 pca_components_fx[N_SMC_FEATURES * N_PCA_COEF] = +{ + //Q31 +53850300, -521617344, 664869504, 841394816, 826630912, 812534784, 756268608, -410948928, +340399776, 707598016, 313090240, 185772368, 20596516, 593792128, -15363098, 552253312, +-333467712, 528749120, 182890448, 96868696, 32978906, -34922380, 862927680, -1019088384, +569624320, -298519552, 97158600, 415727072, -688403776, 1008881344, 39696236, 883947200, +-590381888, 251015072, 628265664, 568803968, 309151744, 270411136, -356222432, -344628160, +1206892288, -198603584, -495733728, -719314688, 159293888, -1166596864, 280759872, 331511360, +-81920056, 75333728, 215553664, 490723648, 432773792, -99411312, 345044800, -779497920, +-1242942080, -503838304, -167628272, -107908904, -391501312, 80378168, 131556992, 200443984, +127420944, -416188768, -172488032, 193806112, -74691632, 242253328, -305453792, 1222304768, +-1564175488, 12887049, 198238512, -1246255616, 574915712, 215371136, 530961024, 363511008, +-221427040, -658203712, 398349632, 82134808, 83833464, 233839488, 623672192, 1075657344, +30015378, -106077104, -140690240, 98930280, -510246400, -587343232, 286442112, 674346368, +982237568, -34930968, -186231936, -322264288, -911922496, 959551552, 488664192, -448772544, +-378040864, -1026978240, -1448578688, -578708160, -296335552, 35369056, 95511480, -66737348, +-386493376, -261140448, -263822656, 508893504, -20220706, -31720480, -254169728, 639462656, +-167057040, 899647488, -181004960, -47577500, -325298688, 48760764, 203744656, -1062381632, +244351424, 282318944, -274137024, 26607322, 168482976, 159102768, 1480558976, -177899696, +29734058, 1058730944, 682360768, -553178880, -241886112, 403883680, -807309952, -628843328, +-992895488, 53388592, 67669360, -22754736, -593890880, -267031008, -53979148, -124796720, +296193824, 95292440, -513411808, 16378858, 737128064, 1110077184, 961986752, -918712832, +216713312, 153965984, 36034776, 348167232, 703034624, -34522948, -92103424, -949134080, +880343744, -523176416, -1036470080, 988750848, 113204600, -145500608, 656444928, 124781688, +-18528488, 210590832, -69821136, -265508432, +}; +#endif const float means_speech[N_SMC_MIXTURES*N_PCA_COEF] = { 4.144528f, -0.445994f, -0.070302f, 0.359876f, -0.040196f, -0.118265f, 0.644765f, -0.174143f, -0.114585f, 0.658716f, 0.278107f, -0.260928f, @@ -470,7 +536,21 @@ const float means_speech[N_SMC_MIXTURES*N_PCA_COEF] = -0.413334f, -1.784803f, -0.187205f, -0.391714f, -0.243155f, -0.223117f, -0.018042f, 0.129642f, 0.137285f, -0.049526f, 0.029685f, -0.024247f, -0.694581f, -1.756488f, 0.597206f, 1.030080f, 0.297682f, 0.383268f, 0.135800f, -0.177134f, 0.096645f, -0.268388f, -0.151836f, -0.101950f, }; - +#ifdef IVAS_FLOAT_FIXED +const Word32 means_speech_fx[N_SMC_MIXTURES*N_PCA_COEF] = +{ + //Q27 + 556269120, -59860300, -9435775, 48301740, -5395016, -15873260, 86538896, -23373078, +-15379338, 88411368, 37326888, -35021164, -4035256, -161975568, 85803920, -81899120, +-7169642, 64167884, -82728320, -29112898, 81431240, 15287399, -468956, 29038140, +-256403904, -208488720, 86349912, 56074020, 36843036, 19549348, 1753688, -32431970, +29630308, 14530545, -8338545, 4083037, 253332208, -116034448, -127942512, -33905276, +8696369, -14094204, -30782970, 37237904, 4475893, -12044833, -4461531, 2582617, +-55476752, -239552208, -25126230, -52574964, -32635712, -29946256, -2421556, 17400254, +18426080, -6647267, 3984253, -3254377, -93225080, -235751824, 80155632, 138254992, +39954200, 51441360, 18226768, -23774524, 12971472, -36022428, -20379082, -13683497, +}; +#endif const float log_det_chol_speech[N_SMC_MIXTURES] = { 6.500575f, 5.852711f, 5.579274f, 6.652653f, 4.752021f, 5.338445f, @@ -487,7 +567,69 @@ const float prec_chol_speech[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_COEF) }; #ifdef IVAS_FLOAT_FIXED -const Word32 prec_chol_speech_fx[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_COEF) / 2] = { 232432352, -59879628, 304533312, -125429152, 99142344, 326068544, -56826444, 46350480, 37527544, 329625600, 31308164, -19632564, 32069984, 57804624, 403167520, 3554890, 64722740, -62716724, 56281252, -4959882, 478142080, -101929504, -14876156, 39897560, -40777760, -47372952, 187926288, 341264960, 21311090, -155172336, 108759040, -143880592, -20300968, -5616206, 73920144, 570679040, 218755296, -162775504, -64450816, -7369627, -36893500, -37446476, -80293072, 8201777, 597213568, -152507040, -256513440, -45927696, -77678512, -140313632, -170642272, -94367944, 112342656, 201967072, 756224576, -208080960, 225792336, 58484840, 66006132, -48434348, 7039720, -102562208, 39706704, -339747744, -90058216, 796577920, 202634944, 37851548, 10156524, 82895824, 73911016, -121567440, -148495536, -112251120, 27724282, 54130280, 84421344, 906663552, 209343680, 32186754, 306301216, -116259936, -36924908, 224391904, -24221736, 35642860, 46462152, 312121440, -39075344, -7622225, 60599840, 68880272, 244525904, -58326728, -36760892, 23687014, 173225968, 23444078, 473461088, -15582947, -34961840, 37741220, 31105764, -74304544, 12497281, 425261888, 33453500, 9509863, -120815016, 63221652, 7134209, 101693816, 61658284, 770215168, -17228724, -276690656, 128551864, -10146055, -15149155, 107287480, -8414646, -387697024, 649792832, 50705580, -73682312, -57487332, 8967623, -3074928, 20067160, 135318848, 273094432, -35929816, 819158720, -19654308, -23457232, 20863072, 11649830, -4230006, 119185344, 150983408, -51511960, -81179712, 365100416, 677546368, -1104880, 67182952, -148998320, -17748684, -31462514, 36981012, -243459152, -30465546, 39841460, -70792064, -7307618, 793560192, 196828960, -32199102, 232271296, -76255536, 20992994, 207772000, 19910932, 13635984, 32428882, 280196960, -25198842, -1165278, 42992624, -13211856, 237527792, -62810408, -99852624, 47340472, 231473232, -57426664, 489151424, 19632028, 2961111, -8761465, 94918512, -12379975, 80280456, 362603424, 142636400, 32065152, -350124672, 127381216, 47764332, 62010736, -35439924, 1157346560, -346969728, -366012832, 596499264, 170357456, 55534196, 444685088, 84101632, -1036655616, 1080018176, 147994640, -5793911, -7695776, 55731228, 16318191, 137087568, 107977896, 172195712, -159871568, 713860352, 105155024, -52278340, -47440328, 26797374, 11704323, 154628224, 63859720, 177926800, -3174517, 294978624, 586304384, -55530976, 100304664, -184816464, -121156736, -22429392, -187445792, -66290940, 399174784, -145260096, -435817856, -227558112, 632079616, 235678272, -8552354, 240827680, -37353868, -9822859, 337976896, -48387368, -7377143, 35740572, 353392864, 21862994, -32516660, 28525294, 31415538, 414974112, -20909780, 53856472, -18235358, 45784888, -63774628, 489165088, -36009004, -13625515, 11037798, -62288300, 22793928, 41337988, 507775744, 36684656, -117420112, 22649242, -64967556, -21585164, -59302760, 61845652, 551227904, 28334704, -96908688, -10986795, -3158680, -1148098, -1090116, -21733072, -98534064, 548509440, -12526541, -124452312, -39815688, 28119150, -82867096, -48626816, 41780368, 15056276, 114722336, 752520384, -72335840, 138609600, 457950, 58517588, -34335848, 7930120, 68274944, 71795744, -218303520, 30022896, 684244416, 29311810, 24879134, -5031822, -3604014, -107700064, 34280548, -161518960, -29972698, 45524776, -28767690, 70451960, 997068864, 181172464, -10389794, 282143392, -18262200, -9411616, 194651136, -34642400, 14696036, 32774090, 266709152, -12321724, -7934147, 42899744, 17961822, 326197120, -61064236, 2757905, -9434969, 114016616, -45294724, 423241632, 44844560, 7194607, -20771536, 17406428, -12688407, 27344446, 398144544, -20988432, 7578201, -36547220, 31998848, 1553972, 12336757, 23499376, 524998272, 38193264, -220705488, -3866007, -51896088, -8053332, 4608500, 2672543, 105980736, 617651200, 138849584, -138894416, -16658031, 14451491, -13349295, 42108932, 90309472, 45946488, 90752120, 714260864, -36247644, 218070784, 60232888, 133086544, 36377836, 146851648, 21597244, -80293880, -242705376, -25434260, 721932224, -73526080, 12684917, -26789322, -47208132, -29985852, -50325744, 4686614, 48175036, 81419696, -245451200, -121876408, 664714368, 166866720, 2983391, 263386720, -68162208, -7784091, 192441376, -145223, -15735686, -35828080, 344984128, 6308501, -28874260, 1040187, 139961712, 251922656, -73661104, -232072656, 127662000, 362434304, 189085392, 530900640, -2567048, -48370192, -40885672, 82937160, 128033784, 63094680, 384248448, 54663660, -320496640, -208546160, 766008512, 371514944, 699983808, 56493048, 1276140544, -85480856, -172129408, 182972048, 17228992, 16679505, 132060848, 21129896, -319555488, 617272960, 74918456, -142655184, 15233981, 243838976, 160190736, 297619744, 148904096, 314365024, -1673695, 579634560, 47073380, -135740560, 44690208, 97419520, 61031752, 157764080, 80927112, 97527968, 62705448, 190179008, 603058240, -73368240, 30219122, -3786282, -19939118, -20823612, -51310096, -75429024, 90901104, 18365818, -393250432, -234402672, 705817728 }; +const Word32 prec_chol_speech_fx[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_COEF) / 2] = +{ + //Q28 + 232432352, -59879628, 304533312, -125429152, 99142344, 326068544, -56826444, 46350480, +37527544, 329625600, 31308164, -19632564, 32069984, 57804624, 403167520, 3554890, +64722740, -62716724, 56281252, -4959882, 478142080, -101929504, -14876156, 39897560, +-40777760, -47372952, 187926288, 341264960, 21311090, -155172336, 108759040, -143880592, +-20300968, -5616206, 73920144, 570679040, 218755296, -162775504, -64450816, -7369627, +-36893500, -37446476, -80293072, 8201777, 597213568, -152507040, -256513440, -45927696, +-77678512, -140313632, -170642272, -94367944, 112342656, 201967072, 756224576, -208080960, +225792336, 58484840, 66006132, -48434348, 7039720, -102562208, 39706704, -339747744, +-90058216, 796577920, 202634944, 37851548, 10156524, 82895824, 73911016, -121567440, +-148495536, -112251120, 27724282, 54130280, 84421344, 906663552, 209343680, 32186754, +306301216, -116259936, -36924908, 224391904, -24221736, 35642860, 46462152, 312121440, +-39075344, -7622225, 60599840, 68880272, 244525904, -58326728, -36760892, 23687014, +173225968, 23444078, 473461088, -15582947, -34961840, 37741220, 31105764, -74304544, +12497281, 425261888, 33453500, 9509863, -120815016, 63221652, 7134209, 101693816, +61658284, 770215168, -17228724, -276690656, 128551864, -10146055, -15149155, 107287480, +-8414646, -387697024, 649792832, 50705580, -73682312, -57487332, 8967623, -3074928, +20067160, 135318848, 273094432, -35929816, 819158720, -19654308, -23457232, 20863072, +11649830, -4230006, 119185344, 150983408, -51511960, -81179712, 365100416, 677546368, +-1104880, 67182952, -148998320, -17748684, -31462514, 36981012, -243459152, -30465546, +39841460, -70792064, -7307618, 793560192, 196828960, -32199102, 232271296, -76255536, +20992994, 207772000, 19910932, 13635984, 32428882, 280196960, -25198842, -1165278, +42992624, -13211856, 237527792, -62810408, -99852624, 47340472, 231473232, -57426664, +489151424, 19632028, 2961111, -8761465, 94918512, -12379975, 80280456, 362603424, +142636400, 32065152, -350124672, 127381216, 47764332, 62010736, -35439924, 1157346560, +-346969728, -366012832, 596499264, 170357456, 55534196, 444685088, 84101632, -1036655616, +1080018176, 147994640, -5793911, -7695776, 55731228, 16318191, 137087568, 107977896, +172195712, -159871568, 713860352, 105155024, -52278340, -47440328, 26797374, 11704323, +154628224, 63859720, 177926800, -3174517, 294978624, 586304384, -55530976, 100304664, +-184816464, -121156736, -22429392, -187445792, -66290940, 399174784, -145260096, -435817856, +-227558112, 632079616, 235678272, -8552354, 240827680, -37353868, -9822859, 337976896, +-48387368, -7377143, 35740572, 353392864, 21862994, -32516660, 28525294, 31415538, +414974112, -20909780, 53856472, -18235358, 45784888, -63774628, 489165088, -36009004, +-13625515, 11037798, -62288300, 22793928, 41337988, 507775744, 36684656, -117420112, +22649242, -64967556, -21585164, -59302760, 61845652, 551227904, 28334704, -96908688, +-10986795, -3158680, -1148098, -1090116, -21733072, -98534064, 548509440, -12526541, +-124452312, -39815688, 28119150, -82867096, -48626816, 41780368, 15056276, 114722336, +752520384, -72335840, 138609600, 457950, 58517588, -34335848, 7930120, 68274944, +71795744, -218303520, 30022896, 684244416, 29311810, 24879134, -5031822, -3604014, +-107700064, 34280548, -161518960, -29972698, 45524776, -28767690, 70451960, 997068864, +181172464, -10389794, 282143392, -18262200, -9411616, 194651136, -34642400, 14696036, +32774090, 266709152, -12321724, -7934147, 42899744, 17961822, 326197120, -61064236, +2757905, -9434969, 114016616, -45294724, 423241632, 44844560, 7194607, -20771536, +17406428, -12688407, 27344446, 398144544, -20988432, 7578201, -36547220, 31998848, +1553972, 12336757, 23499376, 524998272, 38193264, -220705488, -3866007, -51896088, +-8053332, 4608500, 2672543, 105980736, 617651200, 138849584, -138894416, -16658031, +14451491, -13349295, 42108932, 90309472, 45946488, 90752120, 714260864, -36247644, +218070784, 60232888, 133086544, 36377836, 146851648, 21597244, -80293880, -242705376, +-25434260, 721932224, -73526080, 12684917, -26789322, -47208132, -29985852, -50325744, +4686614, 48175036, 81419696, -245451200, -121876408, 664714368, 166866720, 2983391, +263386720, -68162208, -7784091, 192441376, -145223, -15735686, -35828080, 344984128, +6308501, -28874260, 1040187, 139961712, 251922656, -73661104, -232072656, 127662000, +362434304, 189085392, 530900640, -2567048, -48370192, -40885672, 82937160, 128033784, +63094680, 384248448, 54663660, -320496640, -208546160, 766008512, 371514944, 699983808, +56493048, 1276140544, -85480856, -172129408, 182972048, 17228992, 16679505, 132060848, +21129896, -319555488, 617272960, 74918456, -142655184, 15233981, 243838976, 160190736, +297619744, 148904096, 314365024, -1673695, 579634560, 47073380, -135740560, 44690208, +97419520, 61031752, 157764080, 80927112, 97527968, 62705448, 190179008, 603058240, +-73368240, 30219122, -3786282, -19939118, -20823612, -51310096, -75429024, 90901104, +18365818, -393250432, -234402672, 705817728, +}; #endif const float weights_speech[N_SMC_MIXTURES] = @@ -504,7 +646,21 @@ const float means_music[N_SMC_MIXTURES*N_PCA_COEF] = -0.944544f, 1.303678f, 0.326616f, 0.443005f, 0.339787f, 0.353776f, 0.811425f, -0.201050f, 0.056356f, 0.825931f, 0.425448f, -0.400853f, 2.416758f, 0.991434f, -0.249973f, -0.264729f, -0.003941f, -0.242565f, -0.114334f, 0.179267f, 0.085679f, -0.001649f, -0.267403f, 0.028878f, }; - +#ifdef IVAS_FLOAT_FIXED +const Word32 means_music_fx[N_SMC_MIXTURES*N_PCA_COEF] = +{ + //Q27 + 88128840, 204692912, 12705453, 71462352, 12596468, 40563280, -1386066, -52265056, +-39146480, -6666997, 9846481, 10781844, -57806772, -1044348, 8851928, -134822384, +-26193530, -61436556, 53966400, 37307696, -3429397, 19347082, 13950591, -11268518, +-48344556, 197877728, -36032360, -8134399, -1136958, -20838778, -32593702, 16027207, +-26324122, -40342764, -3959959, 8085410, -332178944, 164642336, -341718, 34049964, +-15855543, 8985877, 22481872, 6408225, -40554556, 2538594, 4626216, 1585111, +-126774552, 174976704, 43837656, 59459124, 45605440, 47483012, 108907616, -26984474, +7563974, 110854584, 57102664, -53801580, 324371776, 133068016, -33550808, -35531324, +-528952, -32556524, -15345650, 24060810, 11499641, -221325, -35890224, 3875939, +}; +#endif const float log_det_chol_music[N_SMC_MIXTURES] = { 3.236255f, 3.517110f, 5.675361f, 2.875446f, -2.234983f, 7.961542f, @@ -523,7 +679,66 @@ const float prec_chol_music[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_COEF) #ifdef IVAS_FLOAT_FIXED const Word32 prec_chol_music_fx[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_COEF) / 2] = { -232322304, 25836912, 235062480, -21970368, -88834688, 289087264, 38061464, 12829336, 25661356, 216226640, 3946806, 35926596, -49888460, 17696070, 235923888, -6313870, -29279598, 78824728, -1208764, 27664958, 273027328, -37742024, -71072048, 103689640, -10025259, -37697196, -61880548, 396421184, -26288422, 15300284, -459293, -23770764, 3474360, -25473720, 47310944, 332768160, 39007700, 9191767, -7766106, -35545148, 21523424, 6770747, -124619552, 1410091, 508736736, -25959320, -7817109, 19565456, 1404185, -51538532, -45457932, 165445904, -28407450, -81223736, 586521024, -46704816, -52083996, 9754944, -31150324, -39091720, -40270152, 66884720, 30225296, 100608000, 24531512, 657688896, 68076576, 48213692, -48020152, 49097380, -4268929, 59026004, -192775040, -50962204, -31122406, -117876448, -182476256, 625576192, 144678656, -9655086, 218327952, 6044361, -48620372, 254562448, -42861896, -13298292, 33123862, 287620000, -12122277, -30804848, 33071786, 16293764, 388198208, -19213268, 24338774, 14173929, -33506382, -87690080, 361291840, 34886676, 52138220, -48904644, -17044846, 2490812, 73471056, 354929120, 40659380, 38784092, 24256364, -112064552, -5929471, -94763888, -36720092, 322304000, -56521232, -65294776, 11020081, -15673409, 12677670, -51147960, -59997204, 68434128, 456261088, 44138304, 4000225, -77793136, 61852092, -3655554, -41457440, 71121976, -86157848, -69391640, 621925248, 56908, 50305072, -2964869, 102686760, -14214731, -68874360, 41617696, -34848560, -20007568, 56042344, 554498560, -36107792, -20590342, -25757992, -64163052, 53273432, 35053644, -77861048, -7609071, 98731368, 8330089, 81691888, 807686592, 206408080, 29242554, 246745872, -30320054, -141839152, 416885632, -31085094, 1968705, -7943542, 294907488, 972004, 26633630, -66413080, -21165868, 367168960, 11512928, -20904948, 56274004, -44399224, -4818953, 360435008, -49596404, 13496398, 7960453, 47073916, -4338185, -43219720, 462487456, 13815031, 2689991, 103510592, -71014872, -75477072, -97242624, -9769708, 371118464, -17768548, -22740510, -33236068, -8622415, 24936848, 18291192, -70021120, 2836020, 476147872, 63471028, 25856776, -21647440, 32818918, 34664144, 29404152, 114646368, -122478512, -68419632, 815255936, 35136860, -35646080, -34052916, 1725771, 2581812, -62708940, 215970288, -82662016, -34325112, 447461504, 753578304, -99274408, -3290213, 4633733, -15484968, -36483064, 40284916, -407272960, 58910844, 134671648, -601330048, -345841248, 981086208, 206335056, 1025423, 222901824, -58332100, -39948832, 262789184, -18609020, 1410628, -1774089, 212590416, 18125298, 28513752, -59463552, 4719095, 246369264, -81872, -23613194, 15571135, -16710912, 46739712, 268572096, 29908542, 37123820, 22983444, 55254756, 2779112, -57131120, 341562368, 5126580, 21001584, -6036039, -24000546, -46808700, -51209432, -9852655, 337137760, -8485513, -113351704, -16093779, -60946660, 8815152, -10634339, -80527416, 50575120, 478848064, 149115360, 27080038, 22408992, -24449906, 61073900, 40576168, 139484976, -77672608, -93439968, 705148288, 18536542, 21612006, -26196616, -17896592, 48906792, 10430328, 52505440, -55231936, -34737696, 181267760, 633243008, -77855408, -1544846, -16549583, -11117523, 31134218, 10136123, -124216360, 27077622, 80264352, -345837472, -203551920, 593004544, 99558952, 18271060, 165076528, -18376286, -30611842, 213814752, -21311628, -7249636, 15457856, 170620528, -4867540, -16669573, -49741896, 22724940, 143143472, -39989100, -10398384, 72010760, 44482440, 6079526, 200783008, -1092263, 15936208, 13659607, 18654116, -27689922, -23768886, 188797104, 12175964, -32829120, -61108256, 16816140, 3177470, 18617342, -5304821, 286432992, 28388660, -118288232, 51768048, -15788031, 7528809, 37260184, -33815620, -179149264, 306826016, -17569370, 22469390, -41274636, -16302085, -108179, -24384408, 16991428, -10070088, 94377344, 317392448, -28549990, -4354291, -2879238, 26857504, 15448729, 28430268, -357556, -21060910, -72179608, -65214248, 414794528, 6270384, -21697370, 62073552, -9898557, 21225192, 16768895, 1158030, 20269024, 9883257, 18578686, -97534416, 397891136, 324576576, 23795998, 325167936, -97054984, -170963328, 433155232, -19735912, 25351044, 93515664, 372817920, 21614692, -10068209, 19011672, 14128295, 503773088, -8658386, 33526246, -13009456, -61316296, -60996588, 463537312, -78218872, -20931524, 80347832, -46129292, 3235184, 61337772, 540847488, -10609643, -67685192, 110726408, -146586160, -74121744, -133886744, 76196480, 465427072, 12021882, -46549660, 25719874, -9411616, 1885759, 63607392, -72460128, -51621212, 528433184, -179129392, -56301116, -69872408, 23375360, -64939904, -75586056, 97111088, -49225964, 47048952, 831205824, -126763272, -4281814, -11618423, -14073534, -94524984, -89800784, 104806864, 30433332, -80776520, 390530912, 774659392, 128537096, 13576928, -10674873, 30707942, -18166370, 3521068, -300103584, -56028652, 119586656, -8497861, 3017751, 1177908480, + //Q28 +232322304, 25836912, 235062480, -21970368, -88834688, 289087264, 38061464, 12829336, +25661356, 216226640, 3946806, 35926596, -49888460, 17696070, 235923888, -6313870, +-29279598, 78824728, -1208764, 27664958, 273027328, -37742024, -71072048, 103689640, +-10025259, -37697196, -61880548, 396421184, -26288422, 15300284, -459293, -23770764, +3474360, -25473720, 47310944, 332768160, 39007700, 9191767, -7766106, -35545148, +21523424, 6770747, -124619552, 1410091, 508736736, -25959320, -7817109, 19565456, +1404185, -51538532, -45457932, 165445904, -28407450, -81223736, 586521024, -46704816, +-52083996, 9754944, -31150324, -39091720, -40270152, 66884720, 30225296, 100608000, +24531512, 657688896, 68076576, 48213692, -48020152, 49097380, -4268929, 59026004, +-192775040, -50962204, -31122406, -117876448, -182476256, 625576192, 144678656, -9655086, +218327952, 6044361, -48620372, 254562448, -42861896, -13298292, 33123862, 287620000, +-12122277, -30804848, 33071786, 16293764, 388198208, -19213268, 24338774, 14173929, +-33506382, -87690080, 361291840, 34886676, 52138220, -48904644, -17044846, 2490812, +73471056, 354929120, 40659380, 38784092, 24256364, -112064552, -5929471, -94763888, +-36720092, 322304000, -56521232, -65294776, 11020081, -15673409, 12677670, -51147960, +-59997204, 68434128, 456261088, 44138304, 4000225, -77793136, 61852092, -3655554, +-41457440, 71121976, -86157848, -69391640, 621925248, 56908, 50305072, -2964869, +102686760, -14214731, -68874360, 41617696, -34848560, -20007568, 56042344, 554498560, +-36107792, -20590342, -25757992, -64163052, 53273432, 35053644, -77861048, -7609071, +98731368, 8330089, 81691888, 807686592, 206408080, 29242554, 246745872, -30320054, +-141839152, 416885632, -31085094, 1968705, -7943542, 294907488, 972004, 26633630, +-66413080, -21165868, 367168960, 11512928, -20904948, 56274004, -44399224, -4818953, +360435008, -49596404, 13496398, 7960453, 47073916, -4338185, -43219720, 462487456, +13815031, 2689991, 103510592, -71014872, -75477072, -97242624, -9769708, 371118464, +-17768548, -22740510, -33236068, -8622415, 24936848, 18291192, -70021120, 2836020, +476147872, 63471028, 25856776, -21647440, 32818918, 34664144, 29404152, 114646368, +-122478512, -68419632, 815255936, 35136860, -35646080, -34052916, 1725771, 2581812, +-62708940, 215970288, -82662016, -34325112, 447461504, 753578304, -99274408, -3290213, +4633733, -15484968, -36483064, 40284916, -407272960, 58910844, 134671648, -601330048, +-345841248, 981086208, 206335056, 1025423, 222901824, -58332100, -39948832, 262789184, +-18609020, 1410628, -1774089, 212590416, 18125298, 28513752, -59463552, 4719095, +246369264, -81872, -23613194, 15571135, -16710912, 46739712, 268572096, 29908542, +37123820, 22983444, 55254756, 2779112, -57131120, 341562368, 5126580, 21001584, +-6036039, -24000546, -46808700, -51209432, -9852655, 337137760, -8485513, -113351704, +-16093779, -60946660, 8815152, -10634339, -80527416, 50575120, 478848064, 149115360, +27080038, 22408992, -24449906, 61073900, 40576168, 139484976, -77672608, -93439968, +705148288, 18536542, 21612006, -26196616, -17896592, 48906792, 10430328, 52505440, +-55231936, -34737696, 181267760, 633243008, -77855408, -1544846, -16549583, -11117523, +31134218, 10136123, -124216360, 27077622, 80264352, -345837472, -203551920, 593004544, +99558952, 18271060, 165076528, -18376286, -30611842, 213814752, -21311628, -7249636, +15457856, 170620528, -4867540, -16669573, -49741896, 22724940, 143143472, -39989100, +-10398384, 72010760, 44482440, 6079526, 200783008, -1092263, 15936208, 13659607, +18654116, -27689922, -23768886, 188797104, 12175964, -32829120, -61108256, 16816140, +3177470, 18617342, -5304821, 286432992, 28388660, -118288232, 51768048, -15788031, +7528809, 37260184, -33815620, -179149264, 306826016, -17569370, 22469390, -41274636, +-16302085, -108179, -24384408, 16991428, -10070088, 94377344, 317392448, -28549990, +-4354291, -2879238, 26857504, 15448729, 28430268, -357556, -21060910, -72179608, +-65214248, 414794528, 6270384, -21697370, 62073552, -9898557, 21225192, 16768895, +1158030, 20269024, 9883257, 18578686, -97534416, 397891136, 324576576, 23795998, +325167936, -97054984, -170963328, 433155232, -19735912, 25351044, 93515664, 372817920, +21614692, -10068209, 19011672, 14128295, 503773088, -8658386, 33526246, -13009456, +-61316296, -60996588, 463537312, -78218872, -20931524, 80347832, -46129292, 3235184, +61337772, 540847488, -10609643, -67685192, 110726408, -146586160, -74121744, -133886744, +76196480, 465427072, 12021882, -46549660, 25719874, -9411616, 1885759, 63607392, +-72460128, -51621212, 528433184, -179129392, -56301116, -69872408, 23375360, -64939904, +-75586056, 97111088, -49225964, 47048952, 831205824, -126763272, -4281814, -11618423, +-14073534, -94524984, -89800784, 104806864, 30433332, -80776520, 390530912, 774659392, +128537096, 13576928, -10674873, 30707942, -18166370, 3521068, -300103584, -56028652, +119586656, -8497861, 3017751, 1177908480, }; #endif @@ -541,7 +756,21 @@ const float means_noise[N_SMC_MIXTURES*N_PCA_COEF] = -1.990813f, -0.723883f, -1.196019f, -1.768941f, -0.344735f, -0.677093f, -0.256214f, 1.351858f, -0.353724f, 0.768104f, -0.384513f, -0.371595f, -2.101499f, -1.294068f, -0.188406f, -1.843713f, -0.786294f, -0.539876f, 0.241184f, 1.600162f, -0.300266f, 1.225627f, 0.080940f, -0.231195f, }; - +#ifdef IVAS_FLOAT_FIXED +const Word32 means_noise_fx[N_SMC_MIXTURES*N_PCA_COEF] = +{ + //Q27 + 139344176, 85522728, -140739360, -127496240, -11822971, -83343840, -30885916, 128914920, +55142280, 43453528, -85148664, 1472368, -161889936, -113373848, -98158928, -153415568, +-42456556, -57162792, 60016264, 208695008, -13554783, 127521472, -30868064, -26999372, +178972768, 74413936, -168077904, -33409476, 6877316, -59676692, -21294850, 147021424, +33076482, 7783688, -105503456, 23490786, 165446160, 44187832, -118290112, -7072334, +20942126, -40746756, -14936017, 106057376, 17580778, 8650601, -64193252, 13850330, +-267202400, -97157928, -160526960, -237423248, -46269548, -90877888, -34388460, 181443312, +-47476032, 103093176, -51608460, -49874636, -282058432, -173686864, -25287426, -247458976, +-105534592, -72460928, 32371168, 214770112, -40301020, 164500864, 10863583, -31030468, +}; +#endif const float log_det_chol_noise[N_SMC_MIXTURES] = { 11.878154f, 13.025598f, 12.831137f, 7.099546f, 13.242941f, 11.898383f, @@ -559,7 +788,67 @@ const float prec_chol_noise[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_COEF) #ifdef IVAS_FLOAT_FIXED const Word32 prec_chol_noise_fx[N_SMC_MIXTURES*(N_PCA_COEF*N_PCA_COEF + N_PCA_COEF) / 2] = -{ 438274304, -101757704, 527959936, -92401656, -40066944, 569343040, -172637280, 92605400, 90126936, 502116576, -70281768, 15855140, 42644192, -75216424, 659778944, 21871852, 200184128, -66884720, -206631952, -271753600, 579995584, -41937404, 180430768, -70175472, 31213406, -61285692, -15286594, 914624320, 95589064, -197632384, 189309536, -378043296, -192572912, -278483808, 89525912, 667027200, 86715120, -398169504, -134308192, -24187914, -117845048, -77955000, 87847112, -65235184, 674295616, 118658400, 141179872, -385477600, 90381952, 47387716, -172783040, 213091584, -92059136, 180518816, 1113415808, 89164056, 159457376, -287768704, 140198736, 53548040, 12615661, 211052816, -195082784, -315002016, 199766976, 1060323264, -162984080, -169212048, 275297472, -209311472, -148597008, 90449592, -308289792, 131478344, 206830864, -316232544, -116264224, 1640643200, 575459840, -110880488, 540680576, -20299626, -120988960, 592097728, 75230912, 156925216, 72533680, 553807552, -272710816, -155779808, 38634840, -156862400, 752763072, -182010784, 94162056, -90105192, -416297760, -234046992, 690654080, 181351232, 128870224, -96438120, 75957304, 10280273, -216431728, 1041874240, -2115271, -161272000, 112353664, -387182976, 14206141, -50861004, -182521616, 664376128, -13428752, -358865984, -61852360, -3840774, -153737552, -335891136, 127812056, 72605352, 719982528, -11629161, -73992352, -370089824, -83219288, -95394448, -78352816, -28330678, -1691143, 79366160, 1178542208, -85602184, 94195616, -206783344, 134659312, -21508390, -89069568, 127365104, -119468808, -308679296, 307254432, 1144636160, 19030194, -8984535, -70737840, -155128048, 221865936, 50559280, 68931808, -94236416, 266750224, 260988512, 297829664, 1781693056, 421042624, -59415772, 527790560, -98705864, -94187288, 738609024, -33151778, 77225928, -97992632, 568460672, 43811888, 22125524, -44354932, -38434856, 696296640, 8982924, 76764488, 78076064, -148321856, -92465280, 669700032, 31240518, 1078842, -80158048, 17065784, 42776532, -97703528, 836559488, 101995008, -23285702, -44140184, -65183912, -32696244, -173090400, 116281136, 675435968, 24943022, -289375584, -28602066, -60206048, -67754184, -46702400, 88339696, -173576816, 792158656, 13933948, -103396240, -80619760, 4375229, 22152636, 20907632, 211938912, -232494096, 278967264, 1247803392, -70594232, 74254616, -54600844, 26415928, -10635144, 33370554, 298018912, -152319936, -244328336, 782944064, 1259614592, 20826564, 8513699, 101483096, -35796672, -149573040, -20171850, -532795264, 142151072, 163440688, -597162880, -376404768, 1708897920, 209270944, -23997324, 331448000, 6588480, -58776092, 382514624, -18828332, 39394512, -32496796, 381425568, 21953188, -17026056, -17383880, 29140548, 410380096, -22143510, 714575, 45383844, 30147180, -75072000, 468424448, 6863357, -2480612, -3718636, -18806856, 45715632, -12727867, 520436480, 52698712, 758061, -3390071, -57345060, -19137300, -94494648, 48669764, 553184256, 15456245, -55625196, 37220456, -21190832, 14073266, 37691024, -82113600, -125746712, 566309184, 24663312, -79263352, -81187768, 18228110, -23309324, -35227592, 45638592, -100310304, 111057384, 747604032, -38703024, -49378972, -1829387, -24915374, -44106092, 3890166, 95093528, 4453076, -105516344, 61340456, 779151360, 14067092, 24841018, 46075604, 14026826, -73798008, -27891786, -172234896, 22042846, 8342168, -136356624, -15677436, 917865664, 323919712, -183311616, 550143680, -136109392, -92123024, 508834976, -36581580, 25082610, 186993744, 612834112, 3323231, -41768288, 10869757, -32662958, 900676672, -132146208, 173920944, -285617472, -265424416, -17592454, 746075264, 174698064, 87668608, -12579422, 50304000, -52162648, -8793140, 1121056000, 147971552, -143892672, 40492148, -332957664, -99433056, -229635520, 90426776, 754189248, 91340536, -315738880, 3497714, 95215400, -131254200, -125219504, 210190864, -40012452, 774223424, 323906560, 82644032, -378786592, 18817058, 56163140, 78116600, -101264320, -171897472, 108985600, 1384031744, 217351648, 179599424, -252806064, 287773824, -31378494, -40052984, 121498448, -198681968, -319067488, 616561856, 1259752576, -10863851, -35322348, 214155392, -580386432, 360088192, 294499200, -423245408, 122124976, 92175096, -14300899, 19809194, 1852783360, 372837536, -142020880, 513938464, -66074584, -101171176, 458718880, -55148724, 84335712, 174501568, 494334368, -23007872, -3568849, -19046838, -125238024, 850134528, -69946760, 193497408, -212820192, -393971456, -100102000, 727705408, 162900592, 171089760, -145332032, -88654296, 45897900, 17440252, 800112128, 49616000, -91281208, 77360680, -280252256, -125265672, -100565856, -62217164, 572262784, 35549444, -258559712, -79083232, 11355357, -30667678, -250266672, -44622024, 54628764, 688208640, 147327840, -118213336, -250863936, -92370248, 8184597, -101297072, -22858352, -70537856, 128080216, 1281079808, 22687360, 96064192, -115392352, 184689760, 94979176, -117889608, 20655572, -206588192, -316042752, 525827200, 1154297216, -55784644, 65338264, -189560800, -157846496, 258337456, 90826744, -80055240, -94396936, 206332112, 185089200, 185797056, 1643156480, +{ + //Q28 + 438274304, -101757704, 527959936, -92401656, -40066944, 569343040, -172637280, 92605400, +90126936, 502116576, -70281768, 15855140, 42644192, -75216424, 659778944, 21871852, +200184128, -66884720, -206631952, -271753600, 579995584, -41937404, 180430768, -70175472, +31213406, -61285692, -15286594, 914624320, 95589064, -197632384, 189309536, -378043296, +-192572912, -278483808, 89525912, 667027200, 86715120, -398169504, -134308192, -24187914, +-117845048, -77955000, 87847112, -65235184, 674295616, 118658400, 141179872, -385477600, +90381952, 47387716, -172783040, 213091584, -92059136, 180518816, 1113415808, 89164056, +159457376, -287768704, 140198736, 53548040, 12615661, 211052816, -195082784, -315002016, +199766976, 1060323264, -162984080, -169212048, 275297472, -209311472, -148597008, 90449592, +-308289792, 131478344, 206830864, -316232544, -116264224, 1640643200, 575459840, -110880488, +540680576, -20299626, -120988960, 592097728, 75230912, 156925216, 72533680, 553807552, +-272710816, -155779808, 38634840, -156862400, 752763072, -182010784, 94162056, -90105192, +-416297760, -234046992, 690654080, 181351232, 128870224, -96438120, 75957304, 10280273, +-216431728, 1041874240, -2115271, -161272000, 112353664, -387182976, 14206141, -50861004, +-182521616, 664376128, -13428752, -358865984, -61852360, -3840774, -153737552, -335891136, +127812056, 72605352, 719982528, -11629161, -73992352, -370089824, -83219288, -95394448, +-78352816, -28330678, -1691143, 79366160, 1178542208, -85602184, 94195616, -206783344, +134659312, -21508390, -89069568, 127365104, -119468808, -308679296, 307254432, 1144636160, +19030194, -8984535, -70737840, -155128048, 221865936, 50559280, 68931808, -94236416, +266750224, 260988512, 297829664, 1781693056, 421042624, -59415772, 527790560, -98705864, +-94187288, 738609024, -33151778, 77225928, -97992632, 568460672, 43811888, 22125524, +-44354932, -38434856, 696296640, 8982924, 76764488, 78076064, -148321856, -92465280, +669700032, 31240518, 1078842, -80158048, 17065784, 42776532, -97703528, 836559488, +101995008, -23285702, -44140184, -65183912, -32696244, -173090400, 116281136, 675435968, +24943022, -289375584, -28602066, -60206048, -67754184, -46702400, 88339696, -173576816, +792158656, 13933948, -103396240, -80619760, 4375229, 22152636, 20907632, 211938912, +-232494096, 278967264, 1247803392, -70594232, 74254616, -54600844, 26415928, -10635144, +33370554, 298018912, -152319936, -244328336, 782944064, 1259614592, 20826564, 8513699, +101483096, -35796672, -149573040, -20171850, -532795264, 142151072, 163440688, -597162880, +-376404768, 1708897920, 209270944, -23997324, 331448000, 6588480, -58776092, 382514624, +-18828332, 39394512, -32496796, 381425568, 21953188, -17026056, -17383880, 29140548, +410380096, -22143510, 714575, 45383844, 30147180, -75072000, 468424448, 6863357, +-2480612, -3718636, -18806856, 45715632, -12727867, 520436480, 52698712, 758061, +-3390071, -57345060, -19137300, -94494648, 48669764, 553184256, 15456245, -55625196, +37220456, -21190832, 14073266, 37691024, -82113600, -125746712, 566309184, 24663312, +-79263352, -81187768, 18228110, -23309324, -35227592, 45638592, -100310304, 111057384, +747604032, -38703024, -49378972, -1829387, -24915374, -44106092, 3890166, 95093528, +4453076, -105516344, 61340456, 779151360, 14067092, 24841018, 46075604, 14026826, +-73798008, -27891786, -172234896, 22042846, 8342168, -136356624, -15677436, 917865664, +323919712, -183311616, 550143680, -136109392, -92123024, 508834976, -36581580, 25082610, +186993744, 612834112, 3323231, -41768288, 10869757, -32662958, 900676672, -132146208, +173920944, -285617472, -265424416, -17592454, 746075264, 174698064, 87668608, -12579422, +50304000, -52162648, -8793140, 1121056000, 147971552, -143892672, 40492148, -332957664, +-99433056, -229635520, 90426776, 754189248, 91340536, -315738880, 3497714, 95215400, +-131254200, -125219504, 210190864, -40012452, 774223424, 323906560, 82644032, -378786592, +18817058, 56163140, 78116600, -101264320, -171897472, 108985600, 1384031744, 217351648, +179599424, -252806064, 287773824, -31378494, -40052984, 121498448, -198681968, -319067488, +616561856, 1259752576, -10863851, -35322348, 214155392, -580386432, 360088192, 294499200, +-423245408, 122124976, 92175096, -14300899, 19809194, 1852783360, 372837536, -142020880, +513938464, -66074584, -101171176, 458718880, -55148724, 84335712, 174501568, 494334368, +-23007872, -3568849, -19046838, -125238024, 850134528, -69946760, 193497408, -212820192, +-393971456, -100102000, 727705408, 162900592, 171089760, -145332032, -88654296, 45897900, +17440252, 800112128, 49616000, -91281208, 77360680, -280252256, -125265672, -100565856, +-62217164, 572262784, 35549444, -258559712, -79083232, 11355357, -30667678, -250266672, +-44622024, 54628764, 688208640, 147327840, -118213336, -250863936, -92370248, 8184597, +-101297072, -22858352, -70537856, 128080216, 1281079808, 22687360, 96064192, -115392352, +184689760, 94979176, -117889608, 20655572, -206588192, -316042752, 525827200, 1154297216, +-55784644, 65338264, -189560800, -157846496, 258337456, 90826744, -80055240, -94396936, +206332112, 185089200, 185797056, 1643156480, }; #endif @@ -1178,7 +1467,42 @@ const float mel_fb[246] = 1.43369924f, 1.19031958f, 0.94874676f, 0.70895416f, 0.47091573f, 0.23460598f }; - +#ifdef IVAS_FLOAT_FIXED +const Word32 mel_fb_fx[246] = +{ +1306887040, 840596608, 701826176, 1445657472, 297866656, 1849617024, 67613584, 2079870080, +2136398336, 43602444, 11085289, 2103881216, 216592064, 1930891520, 495221376, 1652262272, +868758208, 1278725376, 1328027264, 819456448, 1865122304, 325699488, 282361312, 1821784192, +998734592, 1148749056, 1731480576, 371805248, 416003072, 1775678336, 1210549888, 936933760, +2096551936, 879033408, 50931740, 1268450304, 1850000256, 711813440, 297483360, 1435670272, +1757021184, 688459456, 390462400, 1459024128, 1799094144, 792129792, 348389472, 1355353856, +1960859008, 1008777088, 81952272, 186624608, 1138706560, 2065531392, 1326562816, 446434464, +820920896, 1701049216, 1735416832, 897505024, 79218296, 412066848, 1249978624, 2068265344, +1427142016, 645470720, 720341696, 1502012928, 2028388992, 1280196608, 547690816, 119094688, +867287040, 1599792768, 1977710976, 1274684288, 585524928, 169772688, 872799360, 1561958656, +2057180032, 1394176384, 743519808, 104758968, 90303584, 753307264, 1403963776, 2042724736, +1624950272, 1008721792, 403173792, 522533408, 1138761856, 1744309888, 1955425920, 1370165248, +794546816, 228258160, 192057744, 777318400, 1352936832, 1919225472, 1818485248, 1269977216, +729947136, 198137088, 328998400, 877506496, 1417536512, 1949346560, 1821784192, 1305685504, +797099392, 295810368, 325699488, 841798208, 1350384256, 1851673344, 1949095552, 1461789952, +981187520, 507106368, 39371848, 198388080, 685693696, 1166296064, 1640377344, 2108111744, +1725299968, 1269762304, 820087488, 376126688, 422183712, 877721408, 1327396096, 1771356928, +2085220096, 1652262272, 1224604032, 802116992, 384677824, 62263592, 495221376, 922879680, +1345366656, 1762805888, 2119650816, 1711953664, 1308959104, 910559680, 516651968, 127135704, +27832838, 435529952, 838524608, 1236923904, 1630831744, 2020347904, 1889397760, 1508377088, +1131466752, 758579072, 389629024, 24534324, 258085904, 639106560, 1016016832, 1388904576, +1757854592, 2122949376, 1810698880, 1453078016, 1099080704, 748633920, 401667360, 58112508, +336784768, 694405568, 1048403008, 1398849664, 1745816320, 2089371136, 1865386624, 1528457728, +1194747136, 864193536, 536738048, 212323040, 282097056, 619025856, 952736576, 1283290112, +1610745600, 1935160576, 2038376192, 1719875840, 1404252672, 1091455232, 781433280, 474137984, +169521872, 109107440, 427607776, 743230976, 1056028416, 1366050432, 1673345664, 1977961728, +2015022208, 1715626752, 1418774912, 1124424064, 832532224, 543058752, 255963904, 132461384, +431856928, 728708736, 1023059648, 1314951424, 1604424960, 1891519744, 2118692480, 1836239488, +1556051584, 1278092800, 1002327744, 728722176, 457242624, 187856208, 28791110, 311244128, +591432000, 869390912, 1145155968, 1418761472, 1690241024, 1959627392, 2068014592, 1802719104, +1539422848, 1278095872, 1018709056, 761233728, 505641920, 251906256, +}; +#endif const float dct_mtx[NB_MEL_BANDS * NB_MEL_COEF] = { 2.23434405e-01f, 2.22056858e-01f, 2.19310256e-01f, 2.15211533e-01f, 2.09785960e-01f, 2.03066987e-01f, 1.95096038e-01f, 1.85922257e-01f, 1.75602204e-01f, 1.64199505e-01f, 1.51784461e-01f, 1.38433616e-01f, @@ -1246,7 +1570,76 @@ const float dct_mtx[NB_MEL_BANDS * NB_MEL_COEF] = 2.22056858e-01f, 1.38433616e-01f, -7.73941268e-02f, -2.19310256e-01f, -1.51784461e-01f, 6.06959298e-02f, 2.15211533e-01f, 1.64199505e-01f, -4.36235222e-02f, -2.09785960e-01f, -1.75602204e-01f, 2.62821611e-02f, 2.03066987e-01f, 1.85922257e-01f, -8.77876168e-03f, -1.95096038e-01f }; - +#ifdef IVAS_FLOAT_FIXED +const Word32 dct_mtx_fx[NB_MEL_BANDS * NB_MEL_COEF] = +{ //Q31 + 479821728, 476863456, 470965184, 462163232, 450511904, 436083040, 418965536, 399264992, +377102848, 352615744, 325954656, 297283936, 266780352, 234631984, 201037040, 166202624, +130343520, 93680800, 56440512, 18852248, -18852248, -56440512, -93680800, -130343520, +-166202624, -201037040, -234631984, -266780352, -297283936, -325954656, -352615744, -377102848, +-399264992, -418965536, -436083040, -450511904, -462163232, -470965184, -476863456, -479821728, +478711680, 466924192, 443639520, 409430944, 365140832, 311859712, 250899600, 183761504, +112098584, 37675424, -37675424, -112098584, -183761504, -250899600, -311859712, -365140832, +-409430944, -443639520, -466924192, -478711680, -478711680, -466924192, -443639520, -409430944, +-365140832, -311859712, -250899600, -183761504, -112098584, -37675424, 37675424, 112098584, +183761504, 250899600, 311859712, 365140832, 409430944, 443639520, 466924192, 478711680, +476863456, 450511904, 399264992, 325954656, 234631984, 130343520, 18852248, -93680800, +-201037040, -297283936, -377102848, -436083040, -470965184, -479821728, -462163232, -418965536, +-352615744, -266780352, -166202624, -56440512, 56440512, 166202624, 266780352, 352615744, +418965536, 462163232, 479821728, 470965184, 436083040, 377102848, 297283936, 201037040, +93680800, -18852248, -130343520, -234631984, -325954656, -399264992, -450511904, -476863456, +474279968, 427854144, 339546976, 218002576, 75118568, -75118568, -218002576, -339546976, +-427854144, -474279968, -474279968, -427854144, -339546976, -218002576, -75118568, 75118568, +218002576, 339546976, 427854144, 474279968, 474279968, 427854144, 339546976, 218002576, +75118568, -75118568, -218002576, -339546976, -427854144, -474279968, -474279968, -427854144, +-339546976, -218002576, -75118568, 75118568, 218002576, 339546976, 427854144, 474279968, +470965184, 399264992, 266780352, 93680800, -93680800, -266780352, -399264992, -470965184, +-470965184, -399264992, -266780352, -93680800, 93680800, 266780352, 399264992, 470965184, +470965184, 399264992, 266780352, 93680800, -93680800, -266780352, -399264992, -470965184, +-470965184, -399264992, -266780352, -93680800, 93680800, 266780352, 399264992, 470965184, +470965184, 399264992, 266780352, 93680800, -93680800, -266780352, -399264992, -470965184, +466924192, 365140832, 183761504, -37675424, -250899600, -409430944, -478711680, -443639520, +-311859712, -112098584, 112098584, 311859712, 443639520, 478711680, 409430944, 250899600, +37675424, -183761504, -365140832, -466924192, -466924192, -365140832, -183761504, 37675424, +250899600, 409430944, 478711680, 443639520, 311859712, 112098584, -112098584, -311859712, +-443639520, -478711680, -409430944, -250899600, -37675424, 183761504, 365140832, 466924192, +462163232, 325954656, 93680800, -166202624, -377102848, -476863456, -436083040, -266780352, +-18852248, 234631984, 418965536, 479821728, 399264992, 201037040, -56440512, -297283936, +-450511904, -470965184, -352615744, -130343520, 130343520, 352615744, 470965184, 450511904, +297283936, 56440512, -201037040, -399264992, -479821728, -418965536, -234631984, 18852248, +266780352, 436083040, 476863456, 377102848, 166202624, -93680800, -325954656, -462163232, +456689664, 282249728, 0, -282249728, -456689664, -456689664, -282249728, 0, +282249728, 456689664, 456689664, 282249728, 0, -282249728, -456689664, -456689664, +-282249728, 0, 282249728, 456689664, 456689664, 282249728, 0, -282249728, +-456689664, -456689664, -282249728, 0, 282249728, 456689664, 456689664, 282249728, +0, -282249728, -456689664, -456689664, -282249728, 0, 282249728, 456689664, +450511904, 234631984, -93680800, -377102848, -479821728, -352615744, -56440512, 266780352, +462163232, 436083040, 201037040, -130343520, -399264992, -476863456, -325954656, -18852248, +297283936, 470965184, 418965536, 166202624, -166202624, -418965536, -470965184, -297283936, +18852248, 325954656, 476863456, 399264992, 130343520, -201037040, -436083040, -462163232, +-266780352, 56440512, 352615744, 479821728, 377102848, 93680800, -234631984, -450511904, +443639520, 183761504, -183761504, -443639520, -443639520, -183761504, 183761504, 443639520, +443639520, 183761504, -183761504, -443639520, -443639520, -183761504, 183761504, 443639520, +443639520, 183761504, -183761504, -443639520, -443639520, -183761504, 183761504, 443639520, +443639520, 183761504, -183761504, -443639520, -443639520, -183761504, 183761504, 443639520, +443639520, 183761504, -183761504, -443639520, -443639520, -183761504, 183761504, 443639520, +436083040, 130343520, -266780352, -476863456, -352615744, 18852248, 377102848, 470965184, +234631984, -166202624, -450511904, -418965536, -93680800, 297283936, 479821728, 325954656, +-56440512, -399264992, -462163232, -201037040, 201037040, 462163232, 399264992, 56440512, +-325954656, -479821728, -297283936, 93680800, 418965536, 450511904, 166202624, -234631984, +-470965184, -377102848, -18852248, 352615744, 476863456, 266780352, -130343520, -436083040, +427854144, 75118568, -339546976, -474279968, -218002576, 218002576, 474279968, 339546976, +-75118568, -427854144, -427854144, -75118568, 339546976, 474279968, 218002576, -218002576, +-474279968, -339546976, 75118568, 427854144, 427854144, 75118568, -339546976, -474279968, +-218002576, 218002576, 474279968, 339546976, -75118568, -427854144, -427854144, -75118568, +339546976, 474279968, 218002576, -218002576, -474279968, -339546976, 75118568, 427854144, +418965536, 18852248, -399264992, -436083040, -56440512, 377102848, 450511904, 93680800, +-352615744, -462163232, -130343520, 325954656, 470965184, 166202624, -297283936, -476863456, +-201037040, 266780352, 479821728, 234631984, -234631984, -479821728, -266780352, 201037040, +476863456, 297283936, -166202624, -470965184, -325954656, 130343520, 462163232, 352615744, +-93680800, -450511904, -377102848, 56440512, 436083040, 399264992, -18852248, -418965536, +}; +#endif const float SF[N_FEATURES*2] = { 0.0048f, -0.0952f, diff --git a/lib_enc/rom_enc.h b/lib_enc/rom_enc.h index 812db4821..3542e43a6 100644 --- a/lib_enc/rom_enc.h +++ b/lib_enc/rom_enc.h @@ -124,6 +124,23 @@ extern const float means_music[]; extern const float weights_noise[]; extern const float means_noise[]; extern const float prec_chol_speech[]; +#ifdef IVAS_FLOAT_FIXED +extern const Word32 pca_components_fx[]; +extern const Word32 pca_mean_fx[]; +extern const Word32 sm_means_fx[]; +extern const Word32 sm_scale_fx[]; +extern const Word32 bcox_lmbd_fx[N_SMC_FEATURES]; +extern const Word32 hout_intervals_fx[]; +extern const Word32 bcox_add_cnst_fx[N_SMC_FEATURES]; +extern const Word32 prec_chol_speech_fx[]; +extern const Word32 prec_chol_music_fx[]; +extern const Word32 prec_chol_noise_fx[]; +extern const Word32 means_speech_fx[]; +extern const Word32 means_music_fx[]; +extern const Word32 means_noise_fx[]; +extern const Word32 mel_fb_fx[]; +extern const Word32 dct_mtx_fx[]; +#endif extern const float log_det_chol_speech[]; extern const float prec_chol_music[]; extern const float log_det_chol_music[]; diff --git a/lib_enc/speech_music_classif.c b/lib_enc/speech_music_classif.c index d529e73a6..6a5aa1c4a 100644 --- a/lib_enc/speech_music_classif.c +++ b/lib_enc/speech_music_classif.c @@ -113,18 +113,27 @@ void speech_music_clas_init( int16_t i; set_f( hSpMusClas->FV_st, 0.0f, N_SMC_FEATURES ); - +#ifdef IVAS_FLOAT_FIXED + set_zero_fx( hSpMusClas->FV_st_fx, N_SMC_FEATURES ); +#endif hSpMusClas->inact_cnt = 0; set_s( hSpMusClas->past_dec, 0, HANG_LEN - 1 ); set_f( hSpMusClas->past_dlp, 0, HANG_LEN - 1 ); set_f( hSpMusClas->past_dlp_mean_ST, 0, HANG_LEN - 1 ); hSpMusClas->dlp_mean_ST = 0.0f; +#ifdef IVAS_FLOAT_FIXED + hSpMusClas->dlp_mean_ST_fx = 0; + hSpMusClas->dlp_var_LT_fx = 0; +#endif hSpMusClas->dlp_mean_LT = 0.0f; hSpMusClas->dlp_var_LT = 0.0f; for ( i = 0; i < N_SMC_FEATURES; i++ ) { hSpMusClas->prev_FV[i] = 0.5f * hout_intervals[2 * i] + 0.5f * hout_intervals[2 * i + 1]; +#ifdef IVAS_FLOAT_FIXED + hSpMusClas->prev_FV_fx[i] = (Word32) ( hSpMusClas->prev_FV[i] * ONE_IN_Q20 ); +#endif } for ( i = 0; i < NB_BANDS_SPMUS; i++ ) @@ -1129,7 +1138,6 @@ static int16_t attack_det( * * 1st stage of the speech/music classification (based on the GMM model) *---------------------------------------------------------------------*/ - /*! r: S/M decision (0=speech or noise,1=unclear,2=music) */ #ifdef IVAS_FLOAT_FIXED diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index bba2c502a..26170c4d2 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -6,7 +6,7 @@ #include #include "options.h" #include "cnst.h" -//#include "prot_fx.h" +// #include "prot_fx.h" #include "rom_enc.h" #include "rom_com_fx.h" #include "rom_com.h" @@ -14,7 +14,11 @@ #include "prot_fx1.h" /* Function prototypes */ #include "prot_fx2.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ - +#ifdef IVAS_FLOAT_FIXED +#include +#include "ivas_prot.h" +#include "prot.h" +#endif /*---------------------------------------------------------------------* * Local constants *---------------------------------------------------------------------*/ @@ -24,7 +28,8 @@ #define ATT_3LSUB_POS_16k 26 /* (short)((4.0f * ATT_NSEG / (float)NB_SUBFR16k) + 0.5f) */ #define LOG_PROB_CONST 11292 /*0.5f * N_FEATURES * LOG_PI2 in Q10 */ - +#define DLP_BIAS 0.138121f +#define DLP_BIAS_FX 72415 /*Q19*/ /*---------------------------------------------------------------------* * Local functions *---------------------------------------------------------------------*/ @@ -54,6 +59,31 @@ static Word16 attack_det_fx( const Word16 *inp, const Word16 Qx, const Word16 la static void order_spectrum_fx( Word16 *vec, Word16 len ); static void detect_sparseness_fx( Encoder_State *st_fx, const Word16 localVAD_HE_SAD, const Word16 voi_fv ); +// Q19 +Word32 log_weights_speech_compute[N_SMC_MIXTURES] = { + -3529378, + -3679759, + -3803054, + -3229859, + -4048972, + -3929047, +}; +Word32 log_weights_music_compute[N_SMC_MIXTURES] = { + -5058325, + -4983143, + -3436984, + -5133896, + -8505198, + -2561831, +}; +Word32 log_weights_noise_compute[N_SMC_MIXTURES] = { + -433769, + -105783, + 407264, + -3350157, + 103199, + -627672, +}; /*---------------------------------------------------------------------* * speech_music_clas_init_fx() * @@ -1469,322 +1499,447 @@ static Word16 attack_det_fx( /* o : attack flag return attack; } -#ifdef IVAS_CODE +#ifdef IVAS_FLOAT_FIXED /* -------------------------------------------------------------------- - * *ivas_smc_gmm() * *1st stage of the speech / music classification(based on the GMM model) * -------------------------------------------------------------------- - */ /*! r: S/M decision (0=speech or noise,1=unclear,2=music) */ -int16_t ivas_smc_gmm( +Word16 ivas_smc_gmm_fx( Encoder_State *st, /* i/o: state structure */ STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ - const int16_t localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ - const float Etot, /* i : total frame energy */ - const float lsp_new[M], /* i : LSPs in current frame */ - const float cor_map_sum, /* i : correlation map sum (from multi-harmonic anal.) */ - const float epsP[M + 1], /* i : LP prediciton error */ - const float PS[], /* i : energy spectrum */ - const float non_sta, /* i : unbound non-stationarity */ - const float relE, /* i : relative frame energy */ - int16_t *high_lpn_flag, /* i/o: sp/mus LPN flag */ - const int16_t flag_spitch /* i : flag to indicate very short stable pitch */ -) + const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ + const Word16 Etot_fx, /* i : total frame energy */ + Word16 lsp_new_fx[M], /* i : LSPs in current frame TODO:For now removing 'const' to avoid warning */ + Word16 cor_map_sum_fx, /* i : correlation map sum (from multi-harmonic anal.) */ + Word32 epsP_fx[M + 1], /* i : LP prediciton error TODO:For now removing 'const' to avoid warning */ + Word32 PS_fx[], /* i : energy spectrum TODO:For now removing 'const' to avoid warning */ + const Word16 non_sta_fx, /* i : unbound non-stationarity */ + const Word16 relE_fx, /* i : relative frame energy */ + Word16 *high_lpn_flag, /* i/o: sp/mus LPN flag */ + const Word16 flag_spitch /* i : flag to indicate very short stable pitch */ + , + Word16 Qfact_PS, + Word16 Q_esp, + Word16 Qfact_PS_past ) { - int16_t i, m, dec; - int16_t flag_odv; - float lps, lpm, lpn; - float ps[N_SMC_MIXTURES], pm[N_SMC_MIXTURES], pn[N_SMC_MIXTURES]; - float fvm[N_PCA_COEF], lprob; - float dlp, ftmp, sum_PS, ps_diff, ps_sta, wrelE, wdrop, wght; - float wrise; - float dlp_mean2var; - float FV[N_SMC_FEATURES], *pFV, PS_norm[128], dPS[128]; - const float *pODV; - float *pFV_st, smc_st_mean_fact; - int16_t relE_attack_flag; - int16_t j, len; - const float *pt_mel_fb; - float melS[NB_MEL_BANDS], mfcc[NB_MEL_BANDS]; - int16_t odv_cnt; - int16_t i_out[N_SMC_FEATURES], *p_out; - + Word16 i, m, dec; + Word16 flag_odv; + Word32 lps_fx, lpm_fx, lpn_fx; + Word32 ps_fx[N_SMC_MIXTURES], pm_fx[N_SMC_MIXTURES], pn_fx[N_SMC_MIXTURES]; + Word32 lprob_fx; + Word16 lprob_exp = 0; + Word32 fvm_fx[N_PCA_COEF]; + Word16 fvm_exp = 0; + Word32 sum_PS_fx, ps_diff_fx, ps_sta_fx; + Word32 dlp_fx, wrelE_fx, wdrop_fx, wght_fx; + Word32 wrise_fx; + Word16 dlp_mean2var_fx; + Word16 dlp_mean2var_q; + Word32 FV_fx[N_SMC_FEATURES], *pFV_fx; + Word32 dPS_fx[128]; + Word32 PS_norm_fx[128]; + const Word32 *pODV_fx; + Word32 *pFV_st_fx; + Word16 relE_attack_flag, smc_st_mean_fact_fx; + Word16 j, len; + const Word32 *pt_mel_fb_fx; + Word32 melS_fx[NB_MEL_BANDS], mfcc_fx[NB_MEL_BANDS]; + Word16 odv_cnt; + Word16 i_out[N_SMC_FEATURES], *p_out; + Word16 temp_exp; + Word16 Qfact_FV; + Word32 temp32, temp32_log; + Word32 temp32_log1, temp32_log2; + Word16 temp16; + Word16 dotp_exp = 0; /*------------------------------------------------------------------* * Initialization *------------------------------------------------------------------*/ SP_MUS_CLAS_HANDLE hSpMusClas = st->hSpMusClas; - + Word32 temp_sqrt, temp_acos; /*------------------------------------------------------------------* * State machine (sp_mus_state: -8 = INACTIVE, -7:-1 = UNSTABLE, 0:7 = ENTRY, 8 = STABLE ) *------------------------------------------------------------------*/ - if ( localVAD_HE_SAD ) + IF( localVAD_HE_SAD ) { - if ( relE < -20 ) + test(); + IF( LT_16( relE_fx, -10240 ) ) { - if ( hSpMusClas->sp_mus_state > 0 ) + IF( hSpMusClas->sp_mus_state > 0 ) { - if ( hSpMusClas->sp_mus_state < HANG_LEN ) + if ( LT_16( hSpMusClas->sp_mus_state, HANG_LEN ) ) { /* energy is too low but we are in entry period -> reset the inactive counter to allow new entry later */ hSpMusClas->inact_cnt = 0; + move16(); } /* energy is too low -> we are going to instable state */ hSpMusClas->sp_mus_state = 0; + move16(); } - else if ( hSpMusClas->sp_mus_state > -HANG_LEN ) + ELSE IF( GT_16( hSpMusClas->sp_mus_state, -HANG_LEN ) ) { /* energy is still too low -> we are still in instable state */ - hSpMusClas->sp_mus_state--; + hSpMusClas->sp_mus_state = sub( hSpMusClas->sp_mus_state, 1 ); } } - else if ( hSpMusClas->sp_mus_state <= 0 ) + ELSE IF( hSpMusClas->sp_mus_state <= 0 ) { - if ( hSpMusClas->inact_cnt == 0 ) + IF( hSpMusClas->inact_cnt == 0 ) { hSpMusClas->sp_mus_state = 1; + move16(); } - else + ELSE { hSpMusClas->sp_mus_state = HANG_LEN; + move16(); } hSpMusClas->inact_cnt = 12; + move16(); } - else if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + ELSE IF( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) { /* we are inside an entry period -> increment the counter of entry frames */ - hSpMusClas->sp_mus_state++; + hSpMusClas->sp_mus_state = add( hSpMusClas->sp_mus_state, 1 ); } - if ( hSpMusClas->sp_mus_state < 0 && hSpMusClas->inact_cnt > 0 ) + IF( hSpMusClas->sp_mus_state < 0 && hSpMusClas->inact_cnt > 0 ) { - hSpMusClas->inact_cnt--; + hSpMusClas->inact_cnt = sub( hSpMusClas->inact_cnt, 1 ); } } - else + ELSE { - if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + test(); + test(); + IF( hSpMusClas->sp_mus_state > 0 && LT_16( hSpMusClas->sp_mus_state, HANG_LEN ) ) { hSpMusClas->inact_cnt = 0; + move16(); } - else if ( hSpMusClas->inact_cnt > 0 ) + ELSE IF( hSpMusClas->inact_cnt > 0 ) { - hSpMusClas->inact_cnt--; + hSpMusClas->inact_cnt = sub( hSpMusClas->inact_cnt, 1 ); } - if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + IF( hSpMusClas->sp_mus_state > 0 && LT_16( hSpMusClas->sp_mus_state, HANG_LEN ) ) { hSpMusClas->sp_mus_state = -HANG_LEN; + move16(); } - else if ( hSpMusClas->sp_mus_state > 0 ) + ELSE IF( hSpMusClas->sp_mus_state > 0 ) { hSpMusClas->sp_mus_state = -1; + move16(); } - else if ( hSpMusClas->sp_mus_state > -HANG_LEN ) + ELSE IF( GT_16( hSpMusClas->sp_mus_state, -HANG_LEN ) ) { /* we are in inactive state */ - hSpMusClas->sp_mus_state--; + hSpMusClas->sp_mus_state = sub( hSpMusClas->sp_mus_state, 1 ); } } /* detect attacks based on relE */ - if ( relE > hSpMusClas->prev_relE ) + IF( GT_16( relE_fx, hSpMusClas->prev_relE_fx ) ) { - hSpMusClas->relE_attack_sum += relE - hSpMusClas->prev_relE; + hSpMusClas->relE_attack_sum_fx = add_sat( sub_sat( relE_fx, hSpMusClas->prev_relE_fx ), hSpMusClas->relE_attack_sum_fx ); } - else + ELSE { - hSpMusClas->relE_attack_sum = 0; + hSpMusClas->relE_attack_sum_fx = 0; + move16(); } - hSpMusClas->prev_relE = relE; - + hSpMusClas->prev_relE_fx = relE_fx; + move16(); + test(); + test(); + test(); /* update counter from last VAD 0->1 change */ - if ( hSpMusClas->prev_vad == 0 && localVAD_HE_SAD == 1 ) + IF( hSpMusClas->prev_vad == 0 && EQ_16( localVAD_HE_SAD, 1 ) ) { hSpMusClas->vad_0_1_cnt = 1; + move16(); } - else if ( localVAD_HE_SAD == 1 && hSpMusClas->vad_0_1_cnt > 0 && hSpMusClas->vad_0_1_cnt < 50 ) + ELSE IF( EQ_16( localVAD_HE_SAD, 1 ) && hSpMusClas->vad_0_1_cnt > 0 && LT_16( hSpMusClas->vad_0_1_cnt, 50 ) ) { - hSpMusClas->vad_0_1_cnt++; + hSpMusClas->vad_0_1_cnt = add( hSpMusClas->vad_0_1_cnt, 1 ); } - else + ELSE { hSpMusClas->vad_0_1_cnt = 0; + move16(); } hSpMusClas->prev_vad = localVAD_HE_SAD; - - if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN && hSpMusClas->relE_attack_sum > 5.0f ) + move16(); + test(); + test(); + IF( hSpMusClas->sp_mus_state > 0 && LT_16( hSpMusClas->sp_mus_state, HANG_LEN ) && GT_16( hSpMusClas->relE_attack_sum_fx, 2560 ) ) { - hSpMusClas->relE_attack_cnt++; + hSpMusClas->relE_attack_cnt = add( hSpMusClas->relE_attack_cnt, 1 ); /* set flag only in the first X frames in a series */ - if ( hSpMusClas->relE_attack_cnt > 0 && hSpMusClas->relE_attack_cnt < 3 ) + IF( hSpMusClas->relE_attack_cnt > 0 && LT_16( hSpMusClas->relE_attack_cnt, 3 ) ) { relE_attack_flag = 1; } - else + ELSE { relE_attack_flag = 0; } + move16(); } - else + ELSE { hSpMusClas->relE_attack_cnt = 0; relE_attack_flag = 0; + move16(); + move16(); } - hSpMusClas->prev_Etot = Etot; + hSpMusClas->prev_Etot_fx = Etot_fx; /*------------------------------------------------------------------* * Preparation of the feature vector *------------------------------------------------------------------*/ - pFV = FV; - + pFV_fx = FV_fx; + test(); + test(); /* [0] OL pitch */ - if ( relE_attack_flag || st->tc_cnt == 1 || st->tc_cnt == 2 ) + IF( relE_attack_flag || EQ_16( st->tc_cnt, 1 ) || EQ_16( st->tc_cnt, 2 ) ) { - *pFV++ = (float) st->pitch[2]; + *pFV_fx++ = L_shl( st->pitch[2], Q20 ); } - else + ELSE { - *pFV++ = (float) ( st->pitch[0] + st->pitch[1] + st->pitch[2] ) / 3.0f; + // *pFV_fx++ = (float) ( st->pitch[0] + st->pitch[1] + st->pitch[2] ) / 3.0f; + *pFV_fx++ = Mpy_32_32( L_shl( add( add( st->pitch[0], st->pitch[1] ), st->pitch[2] ), Q20 ), 715827883 ); } - + test(); + test(); /* [1] voicing */ - if ( relE_attack_flag || st->tc_cnt == 1 || st->tc_cnt == 2 ) + IF( relE_attack_flag || EQ_16( st->tc_cnt, 1 ) || EQ_16( st->tc_cnt, 2 ) ) { - *pFV++ = st->voicing[2]; + *pFV_fx++ = st->voicing_fx[2]; } - else + ELSE { - *pFV++ = ( st->voicing[0] + st->voicing[1] + st->voicing[2] ) / 3.0f; + // *pFV++ = ( st->voicing[0] + st->voicing[1] + st->voicing[2] ) / 3.0f; + *pFV_fx++ = Mpy_32_32( L_shl( L_add( L_add( st->voicing_fx[0], st->voicing_fx[1] ), st->voicing_fx[2] ), Q5 ), 715827883 ); } + temp_exp = 1; + move16(); + temp16 = lsp_new_fx[2]; + move16(); + temp32 = L_sub( ONE_IN_Q30, L_mult0( temp16, temp16 ) ); // Q30 + temp_sqrt = Sqrt32( temp32, &temp_exp ); + temp_acos = BASOP_util_atan2( temp_sqrt, L_deposit_h( temp16 ), temp_exp ); + *pFV_fx++ = L_shl( temp_acos, Q7 ); // Q20 + temp_exp = 1; + move16(); + temp16 = lsp_new_fx[3]; + move16(); + temp32 = L_sub( ONE_IN_Q30, L_mult0( temp16, temp16 ) ); // Q30 + temp_sqrt = Sqrt32( temp32, &temp_exp ); + temp_acos = BASOP_util_atan2( temp_sqrt, L_deposit_h( temp16 ), temp_exp ); + *pFV_fx++ = L_shl( temp_acos, Q7 ); // Q20 + temp_exp = 1; + move16(); + temp16 = lsp_new_fx[4]; + move16(); + temp32 = L_sub( ONE_IN_Q30, L_mult0( temp16, temp16 ) ); // Q30 + temp_sqrt = Sqrt32( temp32, &temp_exp ); + temp_acos = BASOP_util_atan2( temp_sqrt, L_deposit_h( temp16 ), temp_exp ); + *pFV_fx++ = L_shl( temp_acos, Q7 ); // Q20 + temp_exp = 1; + move16(); + temp16 = lsp_new_fx[5]; + move16(); + temp32 = L_sub( ONE_IN_Q30, L_mult0( temp16, temp16 ) ); // Q30 + temp_sqrt = Sqrt32( temp32, &temp_exp ); + temp_acos = BASOP_util_atan2( temp_sqrt, L_deposit_h( temp16 ), temp_exp ); + *pFV_fx++ = L_shl( temp_acos, Q7 ); // Q20 + temp_exp = 1; + move16(); + temp16 = lsp_new_fx[6]; + move16(); + temp32 = L_sub( ONE_IN_Q30, L_mult0( temp16, temp16 ) ); // Q30 + temp_sqrt = Sqrt32( temp32, &temp_exp ); + temp_acos = BASOP_util_atan2( temp_sqrt, L_deposit_h( temp16 ), temp_exp ); + *pFV_fx++ = L_shl( temp_acos, Q7 ); // Q20 + // temf = acosf( lsp_new[2] ); /* [2,3,4,5,6] LSFs */ - *pFV++ = acosf( lsp_new[2] ); - *pFV++ = acosf( lsp_new[3] ); - *pFV++ = acosf( lsp_new[4] ); - *pFV++ = acosf( lsp_new[5] ); - *pFV++ = acosf( lsp_new[6] ); + /* *pFV++ = acosf( lsp_new[2] ); + *pFV++ = acosf( lsp_new[3] ); + *pFV++ = acosf( lsp_new[4] ); + *pFV++ = acosf( lsp_new[5] ); + *pFV++ = acosf( lsp_new[6] );*/ /* [7] cor_map_sum */ - *pFV++ = cor_map_sum; + *pFV_fx++ = L_shl( cor_map_sum_fx, Q12 ); /* [8] non_sta */ - *pFV++ = non_sta; + *pFV_fx++ = L_shl( non_sta_fx, Q12 ); /* [9] epsP */ - *pFV++ = logf( epsP[14] + 1e-5f ) - logf( epsP[0] + 1e-5f ); + temp32 = epsP_fx[14]; + move32(); + temp32_log = L_add( BASOP_Util_Log2( temp32 ), L_shl( sub( Q31, Q_esp ), Q25 ) ); + temp32_log1 = Mpy_32_32( temp32_log, 1488522239 ); /*logf(x) = log2(x)*logf(2)*/ + + temp32 = epsP_fx[0]; + move32(); + temp32_log = L_add( BASOP_Util_Log2( temp32 ), L_shl( sub( Q31, Q_esp ), Q25 ) ); + temp32_log2 = Mpy_32_32( temp32_log, 1488522239 ); /*logf(x) = log2(x)*logf(2)*/ + + *pFV_fx++ = L_shr( L_add( temp32_log1, temp32_log2 ), Q5 ); + //*pFV++ = logf( epsP[14] + 1e-5f ) - logf( epsP[0] + 1e-5f ); /* [10,11,12] MFCCs */ - set_zero( melS, NB_MEL_BANDS ); - pt_mel_fb = mel_fb; - for ( i = 0; i < NB_MEL_BANDS; i++ ) + set_zero_fx( melS_fx, NB_MEL_BANDS ); + + pt_mel_fb_fx = mel_fb_fx; + move32(); + + FOR( i = 0; i < NB_MEL_BANDS; i++ ) { j = mel_fb_start[i]; + move16(); len = mel_fb_len[i]; - melS[i] = logf( dotp( &PS[j], pt_mel_fb, len ) + 1e-5f ); - pt_mel_fb += len; + move16(); + temp32 = dotp_me_fx( &PS_fx[j], pt_mel_fb_fx, len, 31 - Qfact_PS, Q1, &dotp_exp ); + temp32_log = L_add( BASOP_Util_Log2( temp32 ), L_shl( dotp_exp, Q25 ) ); + temp32_log = Mpy_32_32( temp32_log, 1488522239 ); /*logf(x) = log2(x)*logf(2)*/ + melS_fx[i] = temp32_log; + move32(); + // melS[i] = logf( dotp( &PS[j], pt_mel_fb, len ) + 1e-5f ); + pt_mel_fb_fx += len; } - v_mult_mat( mfcc, melS, dct_mtx, NB_MEL_BANDS, NB_MEL_COEF ); - - *pFV++ = mfcc[2]; - *pFV++ = mfcc[6]; - *pFV++ = mfcc[12]; + Word16 guard_bits = find_guarded_bits_fx( NB_MEL_BANDS ); + v_mult_mat_fixed( mfcc_fx, melS_fx, dct_mtx_fx, NB_MEL_BANDS, NB_MEL_COEF, guard_bits ); // Q19 + *pFV_fx++ = L_shl( mfcc_fx[2], 1 ); // Q20 + *pFV_fx++ = L_shl( mfcc_fx[6], 1 ); + *pFV_fx++ = L_shl( mfcc_fx[12], 1 ); + /* *pFV++ = mfcc[2]; + *pFV++ = mfcc[6]; + *pFV++ = mfcc[12];*/ /* calculation of differential normalized power spectrum */ - sum_PS = 1e-5f; - for ( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) + sum_PS_fx = 1; + move32(); + FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { - sum_PS += PS[i]; + sum_PS_fx = L_add( L_shr( PS_fx[i], Q7 ), sum_PS_fx ); // Qfact_PS - Q7 } - for ( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) + temp_exp = 0; + move16(); + FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { - PS_norm[i] = PS[i] / sum_PS; - dPS[i] = fabsf( PS_norm[i] - hSpMusClas->past_PS[i - LOWEST_FBIN] ); + temp32 = BASOP_Util_Divide3232_Scale( PS_fx[i], sum_PS_fx, &temp_exp ); + PS_norm_fx[i] = L_shl( temp32, sub( Qfact_PS_past, add( sub( 15, temp_exp ), 7 ) ) ); // Qfact_PS_past + move32(); + dPS_fx[i] = L_abs( L_sub( PS_norm_fx[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ) ); + move32(); } /* [13] ps_diff (spectral difference) */ - ps_diff = 0; - for ( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) + ps_diff_fx = 0; + move32(); + FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { - ps_diff += dPS[i]; + ps_diff_fx = L_add( L_shr( dPS_fx[i], Q7 ), ps_diff_fx ); // Qfact_PS_past-7 } - *pFV++ = ps_diff; + *pFV_fx++ = L_shr( ps_diff_fx, sub( sub( Qfact_PS_past, Q7 ), Q20 ) ); /// ps_diff; /* [14] ps_sta (spectral stationarity) */ - ps_sta = 0; - for ( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) + ps_sta_fx = 0; + move32(); + Word16 ps_sta_exp = 0; + move16(); + FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { - if ( PS_norm[i] > hSpMusClas->past_PS[i - LOWEST_FBIN] ) + IF( GT_32( PS_norm_fx[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ) ) { - ps_sta += PS_norm[i] / ( dPS[i] + 1e-5f ); + temp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( PS_norm_fx[i], ( dPS_fx[i] + 1 ), &temp_exp ) ); // 31-temp_exp + ps_sta_fx = BASOP_Util_Add_Mant32Exp( temp32, temp_exp, ps_sta_fx, ps_sta_exp, &ps_sta_exp ); } - else + ELSE { - ps_sta += hSpMusClas->past_PS[i - LOWEST_FBIN] / ( dPS[i] + 1e-5f ); + // ps_sta += hSpMusClas->past_PS[i - LOWEST_FBIN] / ( dPS[i] + 1e-5f ); + temp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( hSpMusClas->past_PS_fx[i - LOWEST_FBIN], ( dPS_fx[i] + 1 ), &temp_exp ) ); // 31-temp_exp + move32(); + ps_sta_fx = BASOP_Util_Add_Mant32Exp( temp32, temp_exp, ps_sta_fx, ps_sta_exp, &ps_sta_exp ); } } - - *pFV++ = logf( ps_sta + 1e-5f ); - mvr2r( &PS_norm[LOWEST_FBIN], hSpMusClas->past_PS, HIGHEST_FBIN - LOWEST_FBIN ); + temp32_log = L_add( BASOP_Util_Log2( ps_sta_fx ), L_shl( ps_sta_exp, Q25 ) ); + temp32_log = Mpy_32_32( temp32_log, 1488522239 ); /*logf(x) = log2(x)*logf(2)*/ + *pFV_fx++ = L_shr( temp32_log, Q5 ); // logf( ps_sta + 1e-5f ); + mvr2r_Word32( &PS_norm_fx[LOWEST_FBIN], hSpMusClas->past_PS_fx, HIGHEST_FBIN - LOWEST_FBIN ); /* save ps_diff and ps_sta features for XTALK and UNCLR classifier */ - if ( hStereoClassif != NULL ) + IF( hStereoClassif != NULL ) { - if ( st->idchan == 0 ) + IF( st->idchan == 0 ) { - hStereoClassif->ps_diff_ch1 = ps_diff; - hStereoClassif->ps_sta_ch1 = logf( ps_sta + 1e-5f ); + hStereoClassif->ps_diff_ch1_fx = ps_diff_fx; // Qfact_PS_past - 7 + hStereoClassif->ps_sta_ch1_fx = temp32_log; // logf( ps_sta + 1e-5f );Q25 } - else + ELSE { - hStereoClassif->ps_diff_ch2 = ps_diff; - hStereoClassif->ps_sta_ch2 = logf( ps_sta + 1e-5f ); + hStereoClassif->ps_diff_ch2_fx = ps_diff_fx; + hStereoClassif->ps_sta_ch2_fx = temp32_log; // logf( ps_sta + 1e-5f );Q25 } + move32(); + move32(); } /*------------------------------------------------------------------* * Outlier detection based on feature histograms *------------------------------------------------------------------*/ - flag_odv = 0; - if ( localVAD_HE_SAD ) + move16(); + IF( localVAD_HE_SAD ) { - pFV = FV; - pODV = hout_intervals; + pFV_fx = FV_fx; + pODV_fx = hout_intervals_fx; p_out = i_out; odv_cnt = 0; - for ( i = 0; i < N_SMC_FEATURES; i++ ) + move16(); + FOR( i = 0; i < N_SMC_FEATURES; i++ ) { - if ( *pFV < pODV[0] || *pFV > pODV[1] ) + IF( LT_32( *pFV_fx, pODV_fx[0] ) || GT_32( *pFV_fx, pODV_fx[1] ) ) { *p_out++ = i; - odv_cnt++; + odv_cnt = add( odv_cnt, 1 ); } - pFV++; - pODV += 2; + pFV_fx++; + pODV_fx += 2; } /* set outlier flag */ - if ( odv_cnt >= 2 ) + IF( GE_16( odv_cnt, 2 ) ) { flag_odv = 1; - + move16(); /* replace outlying features with values from the previous frame */ - for ( i = 0; i < odv_cnt; i++ ) + FOR( i = 0; i < odv_cnt; i++ ) { - FV[i_out[i]] = hSpMusClas->prev_FV[i_out[i]]; + FV_fx[i_out[i]] = hSpMusClas->prev_FV_fx[i_out[i]]; + move32(); } } } @@ -1792,54 +1947,70 @@ int16_t ivas_smc_gmm( /*------------------------------------------------------------------* * Adaptive short-term mean filter on feature vector *------------------------------------------------------------------*/ - - pFV = FV; - pFV_st = hSpMusClas->FV_st; - smc_st_mean_fact = SMC_ST_MEAN_FACT; - for ( i = 0; i < N_SMC_FEATURES; i++ ) + Qfact_FV = 20; + move16(); + pFV_fx = FV_fx; + pFV_st_fx = hSpMusClas->FV_st_fx; + smc_st_mean_fact_fx = SMC_ST_MEAN_RSHIFT_FACT_FX; + move16(); + FOR( i = 0; i < N_SMC_FEATURES; i++ ) { - *pFV_st = smc_st_mean_fact * ( *pFV_st ) + ( 1 - smc_st_mean_fact ) * ( *pFV ); - - if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN && ( relE_attack_flag || flag_odv ) ) + //*pFV_st = smc_st_mean_fact * ( *pFV_st ) + ( 1 - smc_st_mean_fact ) * ( *pFV ); + *pFV_st_fx = L_add( L_shr( *pFV_st_fx, smc_st_mean_fact_fx ), L_shr( *pFV_fx, 1 ) ); + test(); + test(); + test(); + test(); + test(); + IF( hSpMusClas->sp_mus_state > 0 && LT_16( hSpMusClas->sp_mus_state, HANG_LEN ) && ( relE_attack_flag || flag_odv ) ) { /* strong attack or outlier frame during entry state -> features cannot be trusted but there is also no useful past info -> */ /* -> do whatever you want because dlp will be reset to 0 anyway */ - pFV++; - pFV_st++; + pFV_fx++; + pFV_st_fx++; } - else if ( hSpMusClas->sp_mus_state == HANG_LEN && ( st->tc_cnt == 1 || st->tc_cnt == 2 ) ) + ELSE IF( hSpMusClas->sp_mus_state == HANG_LEN && ( EQ_16( st->tc_cnt, 1 ) || EQ_16( st->tc_cnt, 2 ) ) ) { /* energy attack in stable state -> use current features intead of the long-term average */ - pFV++; - pFV_st++; + pFV_fx++; + pFV_st_fx++; } - else + ELSE { - *pFV++ = *pFV_st++; + *pFV_fx++ = *pFV_st_fx++; } } /* update */ - mvr2r( FV, hSpMusClas->prev_FV, N_SMC_FEATURES ); - + mvr2r_Word32( FV_fx, hSpMusClas->prev_FV_fx, N_SMC_FEATURES ); /*------------------------------------------------------------------* * Non-linear power transformation (boxcox) on certain features *------------------------------------------------------------------*/ - - pFV = FV; - for ( i = 0; i < N_SMC_FEATURES; i++ ) + pFV_fx = FV_fx; + FOR( i = 0; i < N_SMC_FEATURES; i++ ) { - if ( bcox_lmbd[i] != 0 ) + IF( bcox_lmbd_fx[i] != 0 ) { - *pFV -= bcox_add_cnst[i]; - if ( *pFV < 1 ) + *pFV_fx = L_sub( *pFV_fx, L_shr( bcox_add_cnst_fx[i], sub( 31, Qfact_FV ) ) ); + IF( LT_32( *pFV_fx, L_shl( 1, Qfact_FV ) ) ) { - *pFV = 1; + *pFV_fx = L_shl( 1, Qfact_FV ); } - *pFV = ( powf( *pFV, bcox_lmbd[i] ) - 1 ) / bcox_lmbd[i]; + Word16 pow_e = 0; + move32(); + temp32_log = L_add( BASOP_Util_Log2( *pFV_fx ), L_shl( sub( 31, Qfact_FV ), Q25 ) ); // Q25 + temp32 = Mpy_32_32( temp32_log, bcox_lmbd_fx[i] ); // Q25 + Word32 pow_temp = BASOP_util_Pow2( temp32, sub( 31, Q25 ), &pow_e ); + temp32 = L_sub( pow_temp, L_shl( 1, 31 - pow_e ) ); + temp_exp = 0; + move32(); + temp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( temp32, bcox_lmbd_fx[i], &temp_exp ) ); + *pFV_fx = L_shl( temp32, sub( Qfact_FV, sub( 31, add( temp_exp, pow_e ) ) ) ); + // float temp = powf( *pFV, bcox_lmbd[i] ); + // *pFV = ( powf( *pFV, bcox_lmbd[i] ) - 1 ) / bcox_lmbd[i]; } - pFV++; + pFV_fx++; } /*------------------------------------------------------------------* @@ -1847,302 +2018,375 @@ int16_t ivas_smc_gmm( * PCA *------------------------------------------------------------------*/ - pFV = FV; - for ( i = 0; i < N_SMC_FEATURES; i++ ) + pFV_fx = FV_fx; + FOR( i = 0; i < N_SMC_FEATURES; i++ ) { /* Standard scaler - mean and variance normalization */ - *pFV = ( *pFV - sm_means[i] ) / sm_scale[i]; - pFV++; - + // *pFV = ( *pFV - sm_means[i] ) / sm_scale[i]; + temp32 = L_sub( *pFV_fx, sm_means_fx[i] ); + temp_exp = 0; + temp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( temp32, sm_scale_fx[i], &temp_exp ) ); + *pFV_fx = L_shl( temp32, Qfact_FV - ( 31 - temp_exp ) ); + pFV_fx++; /* MinMax sclaer - mean and variance normalization */ /**pFV = *pFV * sm_scale[i] + sm_min[i];*/ - /*pFV++;*/ } /* PCA */ - v_sub( FV, pca_mean_, FV, N_SMC_FEATURES ); - v_mult_mat( FV, FV, pca_components_, N_SMC_FEATURES, N_PCA_COEF ); - + v_sub_fixed( FV_fx, pca_mean_fx, FV_fx, N_SMC_FEATURES, 0 ); + v_mult_mat_fixed( FV_fx, FV_fx, pca_components_fx, N_SMC_FEATURES, N_PCA_COEF, 0 ); /*------------------------------------------------------------------* * Calculation of posterior probability * Log-probability *------------------------------------------------------------------*/ /* run loop for all mixtures (for each mixture, calculate the probability of speech, music and noise) */ - lps = lpm = lpn = 0; - for ( m = 0; m < N_SMC_MIXTURES; m++ ) + lps_fx = lpm_fx = lpn_fx = 0; + move32(); + move32(); + move32(); + FOR( m = 0; m < N_SMC_MIXTURES; m++ ) { - v_sub( FV, &means_speech[m * N_PCA_COEF], fvm, N_PCA_COEF ); - lprob = dot_product_cholesky( fvm, &prec_chol_speech[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); - ps[m] = logf( weights_speech[m] ) + log_det_chol_speech[m] - 0.5f * N_PCA_COEF * logf( PI2 ) - 0.5f * lprob; - - v_sub( FV, &means_music[m * N_PCA_COEF], fvm, N_PCA_COEF ); - lprob = dot_product_cholesky( fvm, &prec_chol_music[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); - pm[m] = logf( weights_music[m] ) + log_det_chol_music[m] - 0.5f * N_PCA_COEF * logf( PI2 ) - 0.5f * lprob; + v_sub32_fx( FV_fx, &means_speech_fx[m * N_PCA_COEF], fvm_fx, N_PCA_COEF ); + fvm_exp = sub( 31, Qfact_FV ); + lprob_exp = 0; + move16(); + lprob_fx = dot_product_cholesky_fixed( fvm_fx, &prec_chol_speech_fx[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF, fvm_exp, 31 - 28, &lprob_exp ); + ps_fx[m] = L_sub( log_weights_speech_compute[m], L_shr( L_shl_sat( lprob_fx, sub( Q19, sub( Q31, lprob_exp ) ) ), 1 ) ); + move32(); + v_sub32_fx( FV_fx, &means_music_fx[m * N_PCA_COEF], fvm_fx, N_PCA_COEF ); + lprob_exp = 0; + move16(); + lprob_fx = dot_product_cholesky_fixed( fvm_fx, &prec_chol_music_fx[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF, fvm_exp, 31 - 28, &lprob_exp ); + pm_fx[m] = L_sub( log_weights_music_compute[m], L_shr( L_shl_sat( lprob_fx, sub( Q19, sub( Q31, lprob_exp ) ) ), 1 ) ); + move32(); + v_sub32_fx( FV_fx, &means_noise_fx[m * N_PCA_COEF], fvm_fx, N_PCA_COEF ); - v_sub( FV, &means_noise[m * N_PCA_COEF], fvm, N_PCA_COEF ); - lprob = dot_product_cholesky( fvm, &prec_chol_noise[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF ); - pn[m] = logf( weights_noise[m] ) + log_det_chol_noise[m] - 0.5f * N_PCA_COEF * logf( PI2 ) - 0.5f * lprob; + lprob_exp = 0; + move16(); + lprob_fx = dot_product_cholesky_fixed( fvm_fx, &prec_chol_noise_fx[m * ( N_PCA_COEF * N_PCA_COEF + N_PCA_COEF ) / 2], N_PCA_COEF, fvm_exp, 31 - 28, &lprob_exp ); + pn_fx[m] = L_sub( log_weights_music_compute[m], L_shr( L_shl_sat( lprob_fx, sub( Q19, sub( Q31, lprob_exp ) ) ), 1 ) ); + move32(); } - lps = logsumexp( ps, N_SMC_MIXTURES ); - lpm = logsumexp( pm, N_SMC_MIXTURES ); - lpn = logsumexp( pn, N_SMC_MIXTURES ); - + lps_fx = logsumexp_fx( ps_fx, sub( 31, Q19 ), N_SMC_MIXTURES ); + lpm_fx = logsumexp_fx( pm_fx, sub( 31, Q19 ), N_SMC_MIXTURES ); + lpn_fx = logsumexp_fx( pn_fx, sub( 31, Q19 ), N_SMC_MIXTURES ); *high_lpn_flag = 0; - if ( lpn > lps && lpn > lpm ) + move16(); + if ( GT_32( lpn_fx, lps_fx ) && GT_32( lpn_fx, lpm_fx ) ) { *high_lpn_flag = 1; + move32(); } - hSpMusClas->lpm = lpm; - hSpMusClas->lps = lps; - hSpMusClas->lpn = lpn; + hSpMusClas->lpm_fx = extract_l( L_shr( lpm_fx, 11 ) ); // Q8 + hSpMusClas->lps_fx = extract_l( L_shr( lps_fx, 11 ) ); // Q8 + hSpMusClas->lpn_fx = extract_l( L_shr( lpn_fx, 11 ) ); // Q8 /* determine HQ Generic speech class */ - if ( st->hHQ_core != NULL ) + IF( st->hHQ_core != NULL ) { - if ( lps > lpm + 0.5f ) + IF( GT_32( lps_fx, L_add( lpm_fx, ONE_IN_Q18 ) ) ) { st->hHQ_core->hq_generic_speech_class = 1; } - else + ELSE { st->hHQ_core->hq_generic_speech_class = 0; } + move16(); } /*------------------------------------------------------------------* * Decision without hangover * Weighted decision *------------------------------------------------------------------*/ - + test(); + test(); + test(); + test(); + test(); /* decision without hangover (0 - speech/noise, 1 - music) */ - if ( !localVAD_HE_SAD || Etot < 10 || ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN && ( relE_attack_flag || flag_odv ) ) ) + IF( !localVAD_HE_SAD || LT_16( Etot_fx, 2560 ) || ( hSpMusClas->sp_mus_state > 0 && LT_16( hSpMusClas->sp_mus_state, HANG_LEN ) && ( relE_attack_flag || flag_odv ) ) ) { - dlp = 0; + dlp_fx = 0; + move32(); } - else + ELSE { - dlp = lpm - lps + DLP_BIAS; + dlp_fx = L_add( L_sub( lpm_fx, lps_fx ), DLP_BIAS_FX ); - if ( dlp > 30.0f ) + IF( GT_32( dlp_fx, 15728640 ) ) /*30.0f in Q19*/ { - dlp = 30.0f; + dlp_fx = 15728640; } - else if ( dlp < -30.0f ) + ELSE IF( LT_32( dlp_fx, -15728640 ) ) { - dlp = -30.0f; + dlp_fx = -15728640; } + move32(); } - dec = dlp > 0; - + dec = (Word16) GT_32( dlp_fx, 0 ); /* calculate weight based on relE (higher relE -> lower weight, lower relE -> higher weight) */ - wrelE = lin_interp( relE, 15.0f, 0.9f, -15.0f, 0.99f, 1 ); + Word16 Qio = Q25; + move16(); + wrelE_fx = lin_interp32_fx( L_deposit_h( relE_fx ), 503316480, 30198989, -503316480, 33218888, 1, &Qio ); // Q25 + wrelE_fx = L_shr( wrelE_fx, sub( Qio, 25 ) ); /* calculate weight based on drops of dlp (close to 1 during sudden drops of dlp, close to 0 otherwise) */ - hSpMusClas->dlp_mean_ST = 0.8f * hSpMusClas->dlp_mean_ST + 0.2f * dlp; - hSpMusClas->lt_dec_thres = hSpMusClas->dlp_mean_ST; - - if ( dlp < 0 && dlp < hSpMusClas->dlp_mean_ST ) + // hSpMusClas->dlp_mean_ST = 0.8f * hSpMusClas->dlp_mean_ST + 0.2f * dlp; + hSpMusClas->dlp_mean_ST_fx = L_add( Mpy_32_32( 419430, hSpMusClas->dlp_mean_ST_fx ), Mpy_32_32( 104858, dlp_fx ) ); + hSpMusClas->lt_dec_thres_fx = extract_l( L_shr( hSpMusClas->dlp_mean_ST_fx, 10 ) ); + test(); + IF( dlp_fx < 0 && LT_32( dlp_fx, hSpMusClas->dlp_mean_ST_fx ) ) { - if ( hSpMusClas->dlp_mean_ST > 0 ) + IF( hSpMusClas->dlp_mean_ST_fx > 0 ) { - hSpMusClas->wdrop = -dlp; + hSpMusClas->wdrop_fx = -extract_l( L_shr( dlp_fx, 10 ) ); // Q9 } - else if ( hSpMusClas->wdrop > 0 ) + ELSE IF( hSpMusClas->wdrop_fx > 0 ) { - hSpMusClas->wdrop += hSpMusClas->dlp_mean_ST - dlp; + hSpMusClas->wdrop_fx = extract_l( L_shr( L_sub( hSpMusClas->dlp_mean_ST_fx, dlp_fx ), 10 ) ); } } - else + ELSE { - hSpMusClas->wdrop = 0; + hSpMusClas->wdrop_fx = 0; + move16(); } - - wdrop = lin_interp( hSpMusClas->wdrop, 15.0f, 0.7f, 0.0f, 1.0f, 1 ); - + Qio = Q25; + move16(); + wdrop_fx = lin_interp32_fx( L_deposit_h( hSpMusClas->wdrop_fx ), 503316480, 23488102, 0, ONE_IN_Q25, 1, &Qio ); + wdrop_fx = L_shr( wdrop_fx, sub( Qio, 25 ) ); + test(); + test(); /* calculate weight based on rises of dlp (close to 1 during sudden rise of dlp, close to 0 otherwise) */ - if ( hSpMusClas->sp_mus_state == HANG_LEN && hSpMusClas->dlp_mean_ST > 0 && hSpMusClas->dlp_mean_ST > hSpMusClas->past_dlp_mean_ST[0] ) + IF( EQ_16( hSpMusClas->sp_mus_state, HANG_LEN ) && hSpMusClas->dlp_mean_ST_fx > 0 && hSpMusClas->dlp_mean_ST_fx > hSpMusClas->past_dlp_mean_ST_fx[0] ) { - if ( hSpMusClas->past_dlp_mean_ST[0] < 0 ) + IF( hSpMusClas->past_dlp_mean_ST_fx[0] < 0 ) { - hSpMusClas->wrise = hSpMusClas->dlp_mean_ST; + hSpMusClas->wrise_fx = extract_l( L_shr( hSpMusClas->dlp_mean_ST_fx, 10 ) ); } - else if ( hSpMusClas->wrise > 0 ) + ELSE IF( hSpMusClas->wrise_fx > 0 ) { - hSpMusClas->wrise += hSpMusClas->dlp_mean_ST - hSpMusClas->past_dlp_mean_ST[0]; + hSpMusClas->wrise_fx = add( hSpMusClas->wrise_fx, extract_l( L_shr( L_sub( hSpMusClas->dlp_mean_ST_fx, hSpMusClas->past_dlp_mean_ST_fx[0] ), 10 ) ) ); } } - else + ELSE { - hSpMusClas->wrise = 0; + hSpMusClas->wrise_fx = 0; + move16(); } - wrise = lin_interp( hSpMusClas->wrise, 5.0f, 0.95f, 0.0f, 1.0f, 1 ); + Qio = Q25; + move16(); + wrise_fx = lin_interp32_fx( L_deposit_h( hSpMusClas->wrise_fx ), 167772160, 31876710, 0, ONE_IN_Q25, 1, &Qio ); + wrise_fx = L_shr( wrise_fx, sub( Qio, 25 ) ); /* combine weights into one */ - wght = wrelE * wdrop * wrise; - + // wght = wrelE * wdrop * wrise; + wght_fx = Mpy_32_32( Mpy_32_32( wrelE_fx, wdrop_fx ), wrise_fx ); // Q13 + test(); /* ratio of delta means vs. delta variances */ - if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + if ( hSpMusClas->sp_mus_state > 0 && LT_16( hSpMusClas->sp_mus_state, HANG_LEN ) ) { - hSpMusClas->dlp_mean_LT = dlp; - hSpMusClas->dlp_var_LT = 0; + + hSpMusClas->dlp_mean_LT_fx = dlp_fx; + hSpMusClas->dlp_var_LT_fx = 0; + move32(); + move32(); } - hSpMusClas->dlp_mean_LT = 0.9f * hSpMusClas->dlp_mean_LT + 0.1f * dlp; - ftmp = dlp - hSpMusClas->dlp_mean_LT; - hSpMusClas->dlp_var_LT = 0.9f * hSpMusClas->dlp_var_LT + 0.1f * ( ftmp * ftmp ); + hSpMusClas->dlp_mean_LT_fx = L_add( Mpy_32_32( 1932735283, hSpMusClas->dlp_mean_LT_fx ), Mpy_32_32( 214748365, dlp_fx ) ); // Q19 - if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + temp32 = L_sub( dlp_fx, hSpMusClas->dlp_mean_LT_fx ); + hSpMusClas->dlp_var_LT_fx = L_add( Mpy_32_32( 1932735283, hSpMusClas->dlp_var_LT_fx ), Mpy_32_32( 214748365, temp32 ) ); + + test(); + IF( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) { - dlp_mean2var = 0; + dlp_mean2var_fx = 0; + dlp_mean2var_q = 0; + move16(); + move16(); } - else + ELSE { - dlp_mean2var = fabsf( hSpMusClas->dlp_mean_LT ) / ( sqrtf( fabsf( hSpMusClas->dlp_var_LT ) ) + 1.0f ); + temp_exp = sub( Q31, Q19 ); + Word16 div_e = 0; + move16(); + temp32 = Sqrt32( L_abs( hSpMusClas->dlp_var_LT_fx ), &temp_exp ); + temp_sqrt = L_add( Sqrt32( L_abs( hSpMusClas->dlp_var_LT_fx ), &temp_exp ), 1 ); + dlp_mean2var_fx = BASOP_Util_Divide3232_Scale( L_abs( hSpMusClas->dlp_mean_LT_fx ), temp_sqrt, &div_e ); + dlp_mean2var_q = sub( add( Q3, temp_exp ), div_e ); // 15-div_e+Q19 -(31-temp_exp) } - if ( dlp_mean2var > 15.0f ) + if ( GT_32( L_deposit_l( dlp_mean2var_fx ), L_shl( 15, dlp_mean2var_q ) ) ) { /* decrease the weight little bit when the classifier indicates "strong speech" or "strong music" */ - wght *= 0.9f; + // wght *= 0.9f; + wght_fx = Mpy_32_32( wght_fx, 1932735283 ); // Q13 } - if ( wght > 1.0f ) + IF( GT_32( wght_fx, ONE_IN_Q13 ) ) { - wght = 1.0f; + wght_fx = ONE_IN_Q13; } - else if ( wght < 0.01f ) + ELSE IF( LT_32( wght_fx, 82 ) ) { - wght = 0.01f; + wght_fx = 82; } - - if ( Etot < 10 ) + move32(); + if ( LT_16( Etot_fx, 256 ) ) { /* silence */ - wght = 0.92f; + wght_fx = 7537; + move32(); } /* calculate weighted decision */ - hSpMusClas->wdlp_0_95_sp = wght * hSpMusClas->wdlp_0_95_sp + ( 1 - wght ) * dlp; + // hSpMusClas->wdlp_0_95_sp = wght * hSpMusClas->wdlp_0_95_sp + ( 1 - wght ) * dlp; + + hSpMusClas->wdlp_0_95_sp_fx = (Word16) L_add( L_shl( Mpy_32_16_1( wght_fx, hSpMusClas->wdlp_0_95_sp_fx ), Q2 ), L_shl( Mpy_32_32( L_sub( ONE_IN_Q13, wght_fx ), dlp_fx ), Q5 ) ); // Q8 /* xtalk classifier: apply long hysteresis to prevent LRTD on music */ - hSpMusClas->wdlp_xtalk = 0.995f * hSpMusClas->wdlp_xtalk + 0.005f * dlp; + + hSpMusClas->wdlp_xtalk_fx = L_add( Mpy_32_32( 2136746229, hSpMusClas->wdlp_xtalk_fx ), Mpy_32_32( 10737418, dlp_fx ) ); /*------------------------------------------------------------------* * Final speech/music decision *------------------------------------------------------------------*/ - if ( flag_spitch ) + IF( flag_spitch ) { hSpMusClas->flag_spitch_cnt = 5; + move16(); } - else if ( hSpMusClas->flag_spitch_cnt > 0 ) + ELSE IF( hSpMusClas->flag_spitch_cnt > 0 ) { - hSpMusClas->flag_spitch_cnt--; + hSpMusClas->flag_spitch_cnt = sub( hSpMusClas->flag_spitch_cnt, 1 ); } - - if ( Etot < 10 ) + test(); + IF( Etot_fx < 2560 ) { /* silence */ dec = 0; + move16(); } - else if ( hSpMusClas->sp_mus_state > 0 && hSpMusClas->sp_mus_state < HANG_LEN ) + ELSE IF( hSpMusClas->sp_mus_state > 0 && LT_16( hSpMusClas->sp_mus_state, HANG_LEN ) ) { + temp32 = L_mult( w_spmus_fx[hSpMusClas->sp_mus_state - 1][0], (Word16) L_shr( dlp_fx, 10 ) ); /*Q25 */ + temp32 = L_add( temp32, Dot_product( &w_spmus_fx[hSpMusClas->sp_mus_state - 1][1], hSpMusClas->past_dlp_fx, sub( HANG_LEN, 1 ) ) ); + move16(); /* entry state -> final decision is calculated based on weighted average of past non-binary decisions */ - ftmp = w_spmus[hSpMusClas->sp_mus_state - 1][0] * dlp; - ftmp += dotp( &w_spmus[hSpMusClas->sp_mus_state - 1][1], hSpMusClas->past_dlp, HANG_LEN - 1 ); - if ( ftmp > 2.0f ) + IF( GT_32( temp32, L_shl( 2, 25 ) ) ) { - if ( dlp > 2.0f ) + IF( GT_32( dlp_fx, L_shl( 2, 19 ) ) ) { dec = 2; } - else + ELSE { dec = 1; } } - else + ELSE { dec = 0; } + move16(); } - else + ELSE { + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); /* stable active state */ - if ( hSpMusClas->past_dec[0] == 0 && hSpMusClas->past_dec[1] == 0 && hSpMusClas->past_dec[2] == 0 && - ( ( hSpMusClas->flag_spitch_cnt > 0 && hSpMusClas->wdlp_0_95_sp > 3.4f ) || ( hSpMusClas->flag_spitch_cnt == 0 && hSpMusClas->wdlp_0_95_sp > 2.1f ) ) ) + IF( hSpMusClas->past_dec[0] == 0 && hSpMusClas->past_dec[1] == 0 && hSpMusClas->past_dec[2] == 0 && + ( ( hSpMusClas->flag_spitch_cnt > 0 && GT_16( hSpMusClas->wdlp_0_95_sp_fx, 870 ) ) || ( hSpMusClas->flag_spitch_cnt == 0 && GT_16( hSpMusClas->wdlp_0_95_sp_fx, 538 ) ) ) ) { /* switching from speech to unclear */ dec = 1; } - else if ( hSpMusClas->past_dec[0] == 0 && hSpMusClas->vad_0_1_cnt < 50 && hSpMusClas->relE_attack_sum == 0.0f && hSpMusClas->wdlp_0_95_sp > 1.0f ) + ELSE IF( hSpMusClas->past_dec[0] == 0 && LT_16( hSpMusClas->vad_0_1_cnt, 50 ) && hSpMusClas->relE_attack_sum_fx == 0 && GT_16( hSpMusClas->wdlp_0_95_sp_fx, 256 ) ) { /* switch from speech to unclear also during slowly rising weak music onsets */ dec = 1; } - else if ( hSpMusClas->past_dec[0] == 1 && hSpMusClas->wdlp_0_95_sp > 2.5f ) + ELSE IF( EQ_16( hSpMusClas->past_dec[0], 1 ) && GT_16( hSpMusClas->wdlp_0_95_sp_fx, 640 ) ) { /* switching from unclear to music */ dec = 2; } - else if ( hSpMusClas->past_dec[0] == 2 && hSpMusClas->past_dec[1] == 2 && hSpMusClas->past_dec[2] == 2 && hSpMusClas->wdlp_0_95_sp < -1.0f ) + ELSE IF( EQ_16( hSpMusClas->past_dec[0], 2 ) && EQ_16( hSpMusClas->past_dec[1], 2 ) && EQ_16( hSpMusClas->past_dec[2], 2 ) && LT_16( hSpMusClas->wdlp_0_95_sp_fx, -256 ) ) { /* switching from music to unclear */ dec = 1; } - else if ( hSpMusClas->past_dec[0] == 1 && hSpMusClas->wdlp_0_95_sp < -2.5f ) + ELSE IF( EQ_16( hSpMusClas->past_dec[0], 1 ) && LT_16( hSpMusClas->wdlp_0_95_sp_fx, -640 ) ) { /* switching from unclear to speech */ dec = 0; } - else + ELSE { dec = hSpMusClas->past_dec[0]; } + move16(); } /*------------------------------------------------------------------* * raw S/M decision based on smoothed GMM score *------------------------------------------------------------------*/ - - if ( dec == 0 || st->hSpMusClas->wdlp_0_95_sp <= 0 ) + test(); + IF( dec == 0 || st->hSpMusClas->wdlp_0_95_sp_fx <= 0 ) { st->sp_aud_decision0 = 0; st->sp_aud_decision1 = 0; } - else + ELSE { st->sp_aud_decision0 = 1; st->sp_aud_decision1 = 1; } - + move16(); + move16(); /*------------------------------------------------------------------* * Updates *------------------------------------------------------------------*/ /* update buffer of past non-binary decisions */ - mvr2r( &hSpMusClas->past_dlp[0], &hSpMusClas->past_dlp[1], HANG_LEN - 2 ); - hSpMusClas->past_dlp[0] = dlp; - + mvr2r_Word16( &hSpMusClas->past_dlp_fx[0], &hSpMusClas->past_dlp_fx[1], HANG_LEN - 2 ); + hSpMusClas->past_dlp_fx[0] = extract_l( L_shr( dlp_fx, 10 ) ); + move16(); mvr2r( &hSpMusClas->past_dlp_mean_ST[0], &hSpMusClas->past_dlp_mean_ST[1], HANG_LEN - 2 ); - hSpMusClas->past_dlp_mean_ST[0] = hSpMusClas->dlp_mean_ST; - + hSpMusClas->past_dlp_mean_ST_fx[0] = hSpMusClas->dlp_mean_ST_fx; + move32(); /* update buffer of past binary decisions */ mvs2s( &hSpMusClas->past_dec[0], &hSpMusClas->past_dec[1], HANG_LEN - 2 ); hSpMusClas->past_dec[0] = dec; - + move16(); #ifdef DEBUG_MODE_INFO dbgwrite( &st->hSpMusClas->wdlp_0_95_sp, sizeof( float ), 1, 1, "res/wdlp_0_95_sp.x" ); #endif return dec; } - +#endif +#ifdef IVAS_CODE /*---------------------------------------------------------------------* * ivas_smc_mode_selection() * diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 719b7f661..a7ff97e14 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -92,7 +92,7 @@ typedef struct bitstream_enc_data_structure void *st_ivas; /* IVAS encoder structure */ // Word16 nb_bits_tot_fx; /* total number of bits already written */ - // Indice *ind_list_fx; /* list of indices */ + // Indice *ind_list_fx; /* list of indices */ Word16 next_ind_fx; /* pointer to the next empty slot in the list of indices */ Word16 last_ind_fx; /* last written indice */ @@ -432,6 +432,7 @@ typedef struct td_cng_enc_structure int16_t cng_ener_seed; /* CNG and DTX - seed for random generator for variation of excitation energy */ int16_t cng_ener_seed1; float lp_sp_enr; + Word16 lp_sp_enr_fx; /*Q8*/ int16_t last_allow_cn_step; int16_t ho_hist_size; /* CNG and DTX - size of DTX hangover history buffer for averaging, <0,HO_HIST_SIZE> */ @@ -443,6 +444,7 @@ typedef struct td_cng_enc_structure float ho_lsp_hist[HO_HIST_SIZE * M]; /* CNG and DTX - old LSP buffer for averaging */ float ho_ener_hist[HO_HIST_SIZE]; /* CNG and DTX - energy buffer for averaging */ float ho_env_hist[HO_HIST_SIZE * NUM_ENV_CNG]; + Word16 ho_lsp_circ_fx[HO_HIST_SIZE * M]; /* CNG and DTX - old LSP buffer for averaging */ Word32 ho_ener_circ_fx[HO_HIST_SIZE]; /* CNG and DTX - energy buffer for averaging */ Word32 ho_env_circ_fx[HO_HIST_SIZE * NUM_ENV_CNG]; @@ -615,6 +617,7 @@ typedef struct fd_cng_enc_structure typedef struct dtx_enc_structure { + int16_t cnt_SID; /* CNG and DTX - counter of SID update for the interop. mode or DTX, if enabled */ int16_t first_CNG; /* CNG and DTX - first CNG frame flag */ int16_t cng_cnt; /* CNG and DTX - counter of CNG frames for averaging */ @@ -629,6 +632,7 @@ typedef struct dtx_enc_structure float frame_ener; Word32 lt_ener_voiced_fx; /* CNG and DTX - long-term energy of signal (measured on voiced parts) */ Word32 lt_ener_noise_fx; /* CNG and DTX - long-term energy of background noise */ + Word32 frame_ener_fx; int16_t cng_hist_size; /* CNG and DTX - size of CNG history buffer for averaging, <0,DTX_HIST_SIZE> */ float lt_ener_last_SID; /* CNG and DTX - long-term energy of last SID frame */ @@ -767,6 +771,7 @@ typedef struct noise_estimation_structure float Etot_l_lp; /* Noise estimator - Smoothed low energy */ float Etot_last; /* Noise estimator - Energy of last frame */ float Etot_lp; /* Noise estimator - Filtered input energy */ + float lt_tn_track; float lt_tn_dist; float lt_Ellp_dist; @@ -825,12 +830,14 @@ typedef struct noise_estimation_structure typedef struct sp_mus_clas_structure { - float FV_st[N_SMC_FEATURES]; /* Speech/music classifier - short-term mean of the feature vector */ + float FV_st[N_SMC_FEATURES]; /* Speech/music classifier - short-term mean of the feature vector */ + Word32 FV_st_fx[N_SMC_FEATURES]; /* Speech/music classifier - short-term mean of the feature vector */ float past_PS[HIGHEST_FBIN - LOWEST_FBIN]; float past_ps_diff; Word32 past_PS_fx[HIGHEST_FBIN - LOWEST_FBIN]; Word16 past_ps_diff_fx; float prev_FV[N_SMC_FEATURES]; + Word32 prev_FV_fx[N_SMC_FEATURES]; float past_epsP; float past_epsP2; Word16 past_epsP2_fx; @@ -838,18 +845,24 @@ typedef struct sp_mus_clas_structure float wdrop; Word16 wdrop_fx; float wrise; + Word16 wrise_fx; float wdlp_0_95_sp; Word16 wdlp_0_95_sp_fx; float wdlp_xtalk; + Word32 wdlp_xtalk_fx; int16_t sp_mus_state; int16_t past_dec[HANG_LEN - 1]; /* Speech/music classifier - buffer of past binary decisions */ float past_dlp[HANG_LEN - 1]; /* Speech/music classifier - buffer of past non-binary decisions */ Word16 past_dlp_fx[HANG_LEN - 1]; - float past_dlp_mean_ST[HANG_LEN - 1]; /* Speech/music classifier - buffer of past non-binary decisions (with ST smoothing) */ + float past_dlp_mean_ST[HANG_LEN - 1]; /* Speech/music classifier - buffer of past non-binary decisions (with ST smoothing) */ + Word32 past_dlp_mean_ST_fx[HANG_LEN - 1]; /* Speech/music classifier - buffer of past non-binary decisions (with ST smoothing) */ float dlp_mean_ST; + Word32 dlp_mean_ST_fx; int16_t flag_spitch_cnt; float dlp_mean_LT; + Word32 dlp_mean_LT_fx; float dlp_var_LT; + Word32 dlp_var_LT_fx; float last_lsp[M_LSP_SPMUS]; float last_cor_map_sum; float last_non_sta; @@ -874,6 +887,7 @@ typedef struct sp_mus_clas_structure float lt_dec_thres; /* Speech/music classifier - Long term speech/music thresold values */ float ener_RAT; /* Speech/music classifier - LF/to total energy ratio */ Word16 mold_corr_fx; + Word16 mean_avr_dyn_fx; /* Q7 Speech/music classifier - long term average dynamic */ Word16 last_sw_dyn_fx; /* Q7 Speech/music classifier - last dynamic */ Word16 lt_dec_thres_fx; /* Speech/music classifier - Long term speech/music thresold values */ @@ -881,10 +895,13 @@ typedef struct sp_mus_clas_structure int16_t relE_attack_cnt; float prev_relE; + Word16 prev_relE_fx; float prev_Etot; + Word16 prev_Etot_fx; int16_t prev_vad; int16_t vad_0_1_cnt; float relE_attack_sum; + Word16 relE_attack_sum_fx; /* speech/music classifier improvement parameters */ float old_Bin_E[3 * N_OLD_BIN_E]; @@ -978,6 +995,7 @@ typedef struct sp_mus_clas_structure float lpm; Word16 lps_fx; Word16 lpm_fx; + Word16 lpn_fx; float lpn; @@ -1006,6 +1024,7 @@ typedef struct lpd_state_structure float mem_syn2_flt[M]; /* ACELP synthesis memory (pe) after post-proc */ float mem_syn_r_flt[L_SYN_MEM]; /* ACELP synthesis memory for 1.25ms */ float mem_syn3_flt[M]; + Word16 mem_syn[M]; /* ACELP synthesis memory (pe) before post-proc */ Word16 mem_syn1_fx[M]; /* synthesis filter memory (for core switching and FD BWE) */ Word16 mem_syn2[M]; /* ACELP synthesis memory (pe) after post-proc */ @@ -1063,8 +1082,8 @@ typedef struct gsc_enc_structure float mid_dyn; /* AC mode (GSC) - signal dynamic */ Word16 mem_w0_tmp_fx; Word16 mem_syn_tmp_fx[M]; - Word16 mid_dyn_fx; /* AC mode (GSC) - signal dynamic */ + Word16 mid_dyn_fx; /* AC mode (GSC) - signal dynamic */ int16_t noise_lev; /* AC mode (GSC) - noise level */ int16_t past_dyn_dec; /* AC mode (GSC) - Past noise level decision */ float Last_frame_ener; /* AC mode (GSC) - Last frame energy */ @@ -1076,7 +1095,9 @@ typedef struct gsc_enc_structure Word16 last_ener_fx; /* AC mode (GSC) - previous energy */ int16_t last_bitallocation_band[6]; /* AC mode (GSC) - previous bit allocation of each band */ float lt_gpitch; + Word16 lt_gpitch_fx; /*Q15 */ + } GSC_ENC_DATA, *GSC_ENC_HANDLE; /*----------------------------------------------------------------------------------* @@ -1646,7 +1667,8 @@ typedef struct tcx_enc_structure Word16 tcx_target_bits_fac; int16_t tns_ms_flag[2]; - Word32 *spectrum_fx[2]; /* MDCT output for a short block */ + Word32 *spectrum_fx[2]; /* MDCT output for a short block */ + Word16 spectrum_e[2]; Word32 spectrum_long_fx[N_MAX]; /* MDCT output for a long block. Points to spectrum */ } TCX_ENC_DATA, *TCX_ENC_HANDLE; @@ -1787,14 +1809,13 @@ typedef struct enc_core_structure int16_t pstreaklen; /* LSF quantizer */ - float streaklimit; /* LSF quantizer */ - float stab_fac; /* LSF stability factor */ - float mem_preemph; /* preemphasis filter memory */ - float old_wsp[L_WSP_MEM]; /* old weighted signal vector */ - float old_wsp2[( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM]; /* old decimated weighted signal vector */ - float mem_wsp; /* weighted signal vector memory */ - float mem_decim2[3]; /* weighted signal decimation filter memory */ - + float streaklimit; /* LSF quantizer */ + float stab_fac; /* LSF stability factor */ + float mem_preemph; /* preemphasis filter memory */ + float old_wsp[L_WSP_MEM]; /* old weighted signal vector */ + float old_wsp2[( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM]; /* old decimated weighted signal vector */ + float mem_wsp; /* weighted signal vector memory */ + float mem_decim2[3]; /* weighted signal decimation filter memory */ float clip_var[6]; /* pitch gain clipping memory */ float mem_AR[M]; /* AR memory of LSF quantizer (past quantized LSFs without mean) */ float mem_MA[M]; /* MA memory of LSF quantizer (past quantized residual) (used also in AMR-WB IO mode) */ @@ -1807,19 +1828,20 @@ typedef struct enc_core_structure Word16 no_scales_fx[MAX_NO_MODES][2]; /* LSF LVQ structure Q0*/ Word16 no_scales_p_fx[MAX_NO_MODES_p][2]; /* LSF LVQ structure Q0*/ Word16 stab_fac_fx; /* LSF stability factor */ - Word16 mem_deemph_fx; /* deemphasis filter memory */ - Word16 mem_preemph_fx; /* preemphasis filter memory */ - Word32 mem_hp20_in_fx[5]; /* HP filter memory for AMR-WB IO */ - Word16 old_wsp_fx[L_WSP_MEM]; /* old weighted signal vector */ - /*Word16 old_exc_fx[L_EXC_MEM];*/ /* old excitation vector */ - Word16 old_wsp2_fx[( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM]; /* old decimated weighted signal vector qwsp */ - Word16 mem_wsp_fx; /* weighted signal vector memory */ - Word16 mem_decim2_fx[3]; /* weighted signal decimation filter memory qwsp */ - Word16 clip_var_fx[6]; - Word16 mem_AR_fx[M]; /* AR memory of LSF quantizer (past quantized LSFs without mean) */ - Word16 mem_MA_fx[M]; /* MA memory of LSF quantizer (past quantized residual) (used also in AMR-WB IO mode) */ - Word16 mCb1_fx; /* LSF quantizer - counter of stationary frames after a transition frame */ + Word16 mem_preemph_fx; /* preemphasis filter memory */ + + Word16 old_wsp_fx[L_WSP_MEM]; /* old weighted signal vector */ + /*Word16 old_exc_fx[L_EXC_MEM];*/ /* old excitation vector */ + Word16 old_wsp2_fx[( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM]; /* old decimated weighted signal vector qwsp */ + Word16 mem_wsp_fx; /* weighted signal vector memory */ + Word16 mem_decim2_fx[3]; /* weighted signal decimation filter memory qwsp */ + Word16 clip_var_fx[6]; + Word16 mem_deemph_fx; /* deemphasis filter memory */ + Word32 mem_hp20_in_fx[5]; /* HP filter memory for AMR-WB IO */ + Word16 mem_AR_fx[M]; /* AR memory of LSF quantizer (past quantized LSFs without mean) */ + Word16 mem_MA_fx[M]; /* MA memory of LSF quantizer (past quantized residual) (used also in AMR-WB IO mode) */ + Word16 mCb1_fx; /* LSF quantizer - counter of stationary frames after a transition frame */ int16_t GSC_noisy_speech; /* AC mode (GSC) - flag to indicate GSC on SWB noisy speech */ int16_t GSC_IVAS_mode; @@ -1857,6 +1879,7 @@ typedef struct enc_core_structure int16_t old_pitch; /* previous pitch for open-loop pitch search */ int16_t delta_pit; /* open-loop pitch extrapolation correction */ float ee_old; /* previous frame low/high frequency energy ratio */ + Word32 ee_old_fx; int16_t min_band; /* minimum critical band of useful bandwidth */ int16_t max_band; /* maximum critical band of useful bandwidth */ @@ -1876,7 +1899,6 @@ typedef struct enc_core_structure Word16 music_hysteresis_fx; /* Counter of frames after AUDIO coding mode to prevent UC */ Word16 last_vad_spa_fx; - Word16 last_L_frame; /* ACELP@16kHz - last L_frame value */ float mem_preemph16k; /* ACELP@16kHz - preemphasis filter memory @16kHz */ float mem_deemp_preQ; /* ACELP@16kHz - prequantizer deemhasis memory */ @@ -2159,6 +2181,7 @@ typedef struct enc_core_structure float preemph_fac_flt; /* Preemphasis factor */ float gamma_flt; + Word16 preemph_fac; /*Preemphasis factor*/ Word16 gamma; @@ -2192,6 +2215,7 @@ typedef struct enc_core_structure int16_t encoderLookahead_FB; /* pitch_ol for adaptive lag window */ + int16_t old_pitch_la; /* past open loop pitch lag from look-ahead before very short stable pitch detection */ Word16 old_voicing_la; /* past open loop pitch gain from look-ahead */ @@ -2328,6 +2352,7 @@ typedef struct enc_core_structure // // /*----------------------------------------------------------------------------------* // * Common parameters + // *----------------------------------------------------------------------------------*/ // /*----------------------------------------------------------------------------------* // * Stereo/IVAS parameters @@ -2562,6 +2587,7 @@ typedef struct enc_core_structure // /*----------------------------------------------------------------------------------* // * AMR-WB IO handle // *----------------------------------------------------------------------------------*/ +// HANDLE_CLDFB_FILTER_BANK cldfbAna_Fx; // // AMRWB_IO_ENC_HANDLE hAmrwb_IO; /* AMR-WB IO encoder handle */ // @@ -2864,6 +2890,10 @@ typedef struct context_rc_mem_struct int16_t rateFlag; int16_t lastnz; int16_t nt_half; +#ifdef IVAS_FLOAT_FIXED + Word32 bit_estimate_fx; + Word16 bit_estimate_e; +#endif } RC_CONTEXT_MEM, *HANDLE_RC_CONTEXT_MEM; diff --git a/lib_enc/tcx_utils_enc.c b/lib_enc/tcx_utils_enc.c index 6b95cae29..609e03bf4 100644 --- a/lib_enc/tcx_utils_enc.c +++ b/lib_enc/tcx_utils_enc.c @@ -39,6 +39,8 @@ #include "options.h" #include #include "prot.h" +#include "prot_fx2.h" +#include "prot_fx_enc.h" #include "rom_com.h" #include "cnst.h" #include "wmc_auto.h" @@ -614,6 +616,87 @@ void tcx_scalar_quantization( return; } +#ifdef IVAS_FLOAT_FIXED +void tcx_scalar_quantization_ivas_fx( + Word32 *x, + /* i: input coefficients */ // x_e + Word16 x_e, /* i: exponent */ + Word16 *xq, /* o: quantized coefficients */ + Word16 L_frame, /* i: frame length */ + Word16 gain, + /* i: quantization gain */ // gain_e + Word16 gain_e, /* i: quantization gain exponent */ + Word16 offset, /* i: rounding offset (deadzone) */ + Word8 const *memQuantZeros_fx, /* i: coefficients to be set to 0 */ + const Word16 alfe_flag ) +{ + Word16 i, tmp16, s; + Word32 tmp32, offs32; + + + /* common exponent for x and gain for comparison */ + tmp16 = sub( gain_e, x_e ); + tmp32 = L_shl( L_deposit_h( gain ), s_max( -31, s_min( tmp16, 0 ) ) ); + tmp16 = negate( s_max( tmp16, 0 ) ); + + i = sub( L_frame, 1 ); + IF( memQuantZeros_fx != NULL ) + { + test(); + WHILE( ( memQuantZeros_fx[i] != 0 ) && ( LT_32( L_abs( L_shl( x[i], tmp16 ) ), tmp32 ) ) ) + { + test(); + xq[i] = 0; + move16(); + i = sub( i, 1 ); + } + } + + /* invert gain */ + gain = Inv16( gain, &gain_e ); + + s = sub( add( x_e, gain_e ), 15 ); + + /*It should almost never happen and if so the quantization will be discarded later on (saturation of gain Quantizer).*/ + IF( GT_16( s, 31 ) ) + { + /* Limit the inverse gain to maximal possible value=sqrtL_spec/NORM_MDCT_FACTOR)*/ + gain = 22435; /*sqrt(1200/NORM_MDCT_FACTOR) in 2Q13*/ + gain_e = 2; + + s = sub( add( x_e, gain_e ), 15 ); + } + + /* substract 0x8000 to affect the mac_r in the following loop + so it acts like extract_h. the 0x4000 will be multiplied by 2 + by the mac_r to get to 0x8000 and disable the round. */ + offset = sub( offset, 0x4000 ); + + FOR( ; i >= 0; i-- ) + { + offs32 = Mpy_32_16_1( L_abs( x[i] ), gain ); /* multiply */ +#ifdef BASOP_NOGLOB + offs32 = L_shl_sat( offs32, s ); /* convert to 15Q16 */ + tmp16 = mac_r_sat( offs32, offset, 1 ); /* add offset and truncate */ +#else + offs32 = L_shl( offs32, s ); /* convert to 15Q16 */ + tmp16 = mac_r( offs32, offset, 1 ); /* add offset and truncate */ +#endif + if ( x[i] < 0 ) + tmp16 = negate( tmp16 ); /* restore sign */ + + xq[i] = tmp16; + move16(); + } + + IF( alfe_flag == 0 ) + { + AdaptLowFreqEmph_fx( x, x_e, xq, gain, gain_e, + 0, NULL, NULL, + L_frame ); + } +} +#endif /*---------------------------------------------------------------------* * tcx_scalar_quantization_rateloop() -- GitLab From 39294083dd00fe0845d735390cbeca7b4a8ea664 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 15 Jul 2024 12:35:47 +0530 Subject: [PATCH 070/110] BASOP updates for lib_com, lib_dec, WMOPS optimization changes [x] BASOP and instrumentation changes for lib_com, lib_dec and lib_rend files [x] Replaced some of the basops where MAC operation were performed with Madd_* and Msub_* operations. [x] Crash fix for OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 384 kbps, 48kHz in, 16kHz out, BINAURAL out (Model from file) --- lib_com/arith_coder.c | 4 +- lib_com/cldfb.c | 274 +++++----- lib_com/core_com_config.c | 210 ++++++-- lib_com/deemph.c | 21 +- lib_com/delay_comp.c | 13 +- lib_com/dlpc_bfi_fx.c | 2 +- lib_com/edct_fx.c | 220 +++++--- lib_com/enhancer_fx.c | 205 ++++---- lib_com/fd_cng_com.c | 11 +- lib_com/fd_cng_com_fx.c | 9 +- lib_com/int_lsp.c | 8 +- lib_com/interleave_spectrum.c | 1 + lib_com/isf_dec_amr_wb_fx.c | 8 +- lib_com/ivas_agc_com_fx.c | 18 +- lib_com/ivas_arith.c | 147 +++++- lib_com/ivas_avq_pos_reorder_com.c | 29 ++ lib_com/ivas_cov_smooth.c | 12 +- lib_com/ivas_dirac_com.c | 266 +++++++--- lib_com/ivas_fb_mixer.c | 274 ++++++---- lib_com/ivas_filters.c | 7 + lib_com/ivas_ism_com.c | 139 ++++- lib_com/ivas_lfe_com.c | 5 + lib_com/ivas_prot.h | 47 ++ lib_com/ivas_rom_com.c | 2 +- lib_com/ivas_sns_com_fx.c | 12 +- lib_com/ivas_stereo_ica_com_fx.c | 2 +- lib_com/prot.h | 14 +- lib_com/prot_fx1.h | 6 + lib_com/prot_fx2.h | 8 +- lib_com/stat_noise_uv_mod_fx.c | 10 +- lib_com/swb_bwe_com_fx.c | 74 ++- lib_com/swb_bwe_com_lr_fx.c | 90 +++- lib_com/swb_tbe_com.c | 83 +-- lib_com/swb_tbe_com_fx.c | 249 +++++++-- lib_com/syn_filt_fx.c | 15 +- lib_com/tcq_position_arith.c | 577 ++++++++++++--------- lib_com/tns_base.c | 6 +- lib_com/tools_fx.c | 18 + lib_com/weight_a_fx.c | 49 +- lib_dec/amr_wb_dec_fx.c | 35 +- lib_dec/arith_coder_dec.c | 6 +- lib_dec/fd_cng_dec.c | 4 +- lib_dec/ivas_init_dec.c | 57 +- lib_dec/ivas_mdct_core_dec.c | 2 +- lib_dec/ivas_spar_decoder.c | 55 +- lib_dec/lsf_dec_fx.c | 79 ++- lib_dec/lsf_msvq_ma_dec_fx.c | 12 +- lib_dec/nelp_dec_fx.c | 38 +- lib_dec/peak_vq_dec_fx.c | 27 +- lib_dec/pit_dec_fx.c | 62 ++- lib_dec/pitch_extr_fx.c | 18 +- lib_dec/post_dec_fx.c | 97 ++-- lib_dec/ppp_dec_fx.c | 47 +- lib_enc/arith_coder_enc.c | 4 +- lib_rend/ivas_dirac_output_synthesis_dec.c | 59 +-- lib_rend/ivas_limiter.c | 4 +- 56 files changed, 2563 insertions(+), 1188 deletions(-) diff --git a/lib_com/arith_coder.c b/lib_com/arith_coder.c index 08c972ea9..bba7ab973 100644 --- a/lib_com/arith_coder.c +++ b/lib_com/arith_coder.c @@ -223,7 +223,7 @@ void powfp_odd2_evs( * and decoder remain synchronized. *-------------------------------------------------------------------------*/ -void tcx_arith_scale_envelope_flt( +void tcx_arith_scale_envelope_ivas( const Word16 L_spec_core, /* i : number of lines to scale Q0 */ Word16 L_frame, /* i : number of lines Q0 */ const Word32 env[], /* i : unscaled envelope Q16 */ @@ -518,7 +518,7 @@ void tcx_arith_scale_envelope_flt( * and decoder remain synchronized. *-------------------------------------------------------------------------*/ -void tcx_arith_render_envelope_flt( +void tcx_arith_render_envelope_ivas( const Word16 A_ind[], /* i : LPC coefficients of signal envelope */ const Word16 L_frame, /* i : number of spectral lines */ const Word16 L_spec, /* i : length of the coded spectrum */ diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index b319bf21c..e3d9912f2 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -330,29 +330,29 @@ void cldfbAnalysis_ivas_fx( FOR( k = 0; k < M4; k++ ) { /* prototype filter */ - r1_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ) ); // Qx - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ) ); // Qx - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ) ); // Qx - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ) ); // Qx - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ) ); // Qx - - r2_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ) ); // Qx - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ) ); // Qx - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ) ); // Qx - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ) ); // Qx - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ) ); // Qx - - i1_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ) ); // Qx - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ) ); // Qx - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ) ); // Qx - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ) ); // Qx - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ) ); // Qx - - i2_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ) ); // Qx - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ) ); // Qx - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ) ); // Qx - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ) ); // Qx - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ) ); // Qx + r1_fx = Msub_32_16( 0, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx + + r2_fx = Msub_32_16( 0, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // Qx + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // Qx + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // Qx + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // Qx + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // Qx + + i1_fx = Msub_32_16( 0, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx + + i2_fx = Msub_32_16( 0, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // Qx - 1 r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // Qx - 1 @@ -363,47 +363,47 @@ void cldfbAnalysis_ivas_fx( rr12_fx = L_sub( r1_fx, r2_fx ); // Qx - 1 ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // Qx - 1 // cplxMult( &rBuffer_fx[2 * k], &rBuffer_fx[2 * k + 1], rr12_fx, ri12_fx, rot_vctr_re_fx[k], rot_vctr_im_fx[k] ); - rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // Qx - 3 + rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // Qx - 3 move32(); - rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // Qx - 3 + rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // Qx - 3 move32(); /* folding + pre modulation of DCT IV */ ir12_fx = L_add( r1_fx, r2_fx ); // Qx - 1 ii12_fx = L_sub( i1_fx, i2_fx ); // Qx - 1 // cplxMult( &iBuffer_fx[2 * k], &iBuffer_fx[2 * k + 1], ir12_fx, ii12_fx, rot_vctr_re_fx[k], rot_vctr_im_fx[k] ); - iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // Qx - 3 + iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // Qx - 3 move32(); - iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // Qx - 3 + iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // Qx - 3 move32(); } FOR( k = M4; k < M2; k++ ) { /* prototype filter */ - r1_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ) ); // Qx - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ) ); // Qx - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ) ); // Qx - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ) ); // Qx - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ) ); // Qx - - r2_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ) ); // Qx - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ) ); // Qx - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ) ); // Qx - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ) ); // Qx - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ) ); // Qx - - i1_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ) ); // Qx - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ) ); // Qx - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ) ); // Qx - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ) ); // Qx - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ) ); // Qx - - i2_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ) ); // Qx - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ) ); // Qx - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ) ); // Qx - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ) ); // Qx - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ) ); // Qx + r1_fx = Msub_32_16( 0, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx + + r2_fx = Msub_32_16( 0, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx + + i1_fx = Msub_32_16( 0, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx + + i2_fx = Msub_32_16( 0, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // Qx - 1 r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // Qx - 1 @@ -414,18 +414,18 @@ void cldfbAnalysis_ivas_fx( rr12_fx = L_add( r1_fx, r2_fx ); // Qx - 1 ri12_fx = L_sub( i1_fx, i2_fx ); // Qx - 1 // cplxMult( &rBuffer_fx[2 * k], &rBuffer[2 * k + 1], rr12, ri12, rot_vctr_re[k], rot_vctr_im[k] ); - rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // Qx - 3 + rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // Qx - 3 move32(); - rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // Qx - 3 + rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // Qx - 3 move32(); /* folding + pre modulation of DCT IV */ ir12_fx = L_sub( r1_fx, r2_fx ); // Qx - 1 ii12_fx = L_add( i1_fx, i2_fx ); // Qx - 1 // cplxMult( &iBuffer[2 * k], &iBuffer[2 * k + 1], ir12, ii12, rot_vctr_re[k], rot_vctr_im[k] ); - iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // Qx - 3 + iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // Qx - 3 move32(); - iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // Qx - 3 + iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // Qx - 3 move32(); } @@ -437,9 +437,9 @@ void cldfbAnalysis_ivas_fx( FOR( k = 0; k < M2; k++ ) { // cplxMult( &realBuffer[i][M1 - 1 - ( 2 * k )], &realBuffer[i][2 * k], rBuffer[2 * k], rBuffer[2 * k + 1], rot_vctr_re[k], rot_vctr_im[k] ); - realBuffer_fx[i][M1 - 1 - ( 2 * k )] = L_sub( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ) ); // Qx - 5 + realBuffer_fx[i][M1 - 1 - ( 2 * k )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // Qx - 5 move32(); - realBuffer_fx[i][2 * k] = L_add( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ) ); // Qx - 5 + realBuffer_fx[i][2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // Qx - 5 move32(); } @@ -452,9 +452,9 @@ void cldfbAnalysis_ivas_fx( { /* do it inplace */ // cplxMult( &imagBuffer[i][2 * k], &imagBuffer[i][M1 - 1 - ( 2 * k )], iBuffer[2 * k], iBuffer[2 * k + 1], rot_vctr_re[k], rot_vctr_im[k] ); - imagBuffer_fx[i][2 * k] = L_sub( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ) ); // QX - 5 + imagBuffer_fx[i][2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // QX - 5 move32(); - imagBuffer_fx[i][M1 - 1 - ( 2 * k )] = L_add( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ) ); // Qx - 5 + imagBuffer_fx[i][M1 - 1 - ( 2 * k )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // Qx - 5 move32(); } @@ -1022,29 +1022,29 @@ void cldfbAnalysis_ts_fx_fixed_q( for ( k = 0; k < M4; k++ ) { /* prototype filter */ - r1_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ) ); // q - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ) ); // q - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ) ); // q - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ) ); // q - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ) ); // q - - r2_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ) ); // q - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ) ); // q - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ) ); // q - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ) ); // q - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ) ); // q - - i1_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ) ); // q - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ) ); // q - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ) ); // q - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ) ); // q - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ) ); // q - - i2_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ) ); // q - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ) ); // q - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ) ); // q - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ) ); // q - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ) ); // q + r1_fx = Msub_32_16( 0, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + r2_fx = Msub_32_16( 0, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i1_fx = Msub_32_16( 0, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i2_fx = Msub_32_16( 0, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 @@ -1055,43 +1055,43 @@ void cldfbAnalysis_ts_fx_fixed_q( rr12_fx = L_sub( r1_fx, r2_fx ); // q -1 ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // q - 1 /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ - rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 + rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 ///* folding + pre modulation of DCT IV */ ir12_fx = L_add( r1_fx, r2_fx ); // q - 1 ii12_fx = L_sub( i1_fx, i2_fx ); // q - 1 /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ - iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 + iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 } for ( k = M4; k < M2; k++ ) { /* prototype filter */ - r1_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ) ); // q - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ) ); // q - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ) ); // q - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ) ); // q - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ) ); // q - - r2_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ) ); // q - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ) ); // q - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ) ); // q - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ) ); // q - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ) ); // q - - i1_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ) ); // q - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ) ); // q - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ) ); // q - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ) ); // q - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ) ); // q - - i2_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ) ); // q - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ) ); // q - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ) ); // q - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ) ); // q - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ) ); // q + r1_fx = Msub_32_16( 0, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + r2_fx = Msub_32_16( 0, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i1_fx = Msub_32_16( 0, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + i2_fx = Msub_32_16( 0, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 @@ -1102,15 +1102,15 @@ void cldfbAnalysis_ts_fx_fixed_q( rr12_fx = L_add( r1_fx, r2_fx ); // q - 1 ri12_fx = L_sub( i1_fx, i2_fx ); // q - 1 /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ - rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 + rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 /* folding + pre modulation of DCT IV */ ir12_fx = L_sub( r1_fx, r2_fx ); // q - 1 ii12_fx = L_add( i1_fx, i2_fx ); // q - 1 /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ - iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 + iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 } *q_cldfb = sub( *q_cldfb, 3 ); @@ -1122,8 +1122,8 @@ void cldfbAnalysis_ts_fx_fixed_q( for ( k = 0; k < M2; k++ ) { /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ - realBuffer_fx[M1 - 1 - ( 2 * k )] = L_sub( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ) ); // q - 5 - realBuffer_fx[2 * k] = L_add( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ) ); // q - 5 + realBuffer_fx[M1 - 1 - ( 2 * k )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5 + realBuffer_fx[2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5 } *q_cldfb = sub( *q_cldfb, 2 ); @@ -1135,8 +1135,8 @@ void cldfbAnalysis_ts_fx_fixed_q( { /* do it inplace */ /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ - imagBuffer_fx[2 * k] = L_sub( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ) ); // q - 5 - imagBuffer_fx[M1 - 1 - ( 2 * k )] = L_add( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ) ); // q - 5 + imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5 + imagBuffer_fx[M1 - 1 - ( 2 * k )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5 } if ( h_cldfb->prototype == CLDFB_PROTOTYPE_5_00MS ) @@ -1155,8 +1155,8 @@ void cldfbAnalysis_ts_fx_fixed_q( /*cplxMult(&realBuffer[k], &imagBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/ /*realBuffer[k] = rBuffer[k]; imagBuffer[k] = iBuffer[k];*/ - cplx_aux_fx = L_sub( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), Mpy_32_32( imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ) ); // q - 5 - imagBuffer_fx[k] = L_add( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), Mpy_32_32( imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ) ); // q - 5 + cplx_aux_fx = Msub_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ); // q - 5 + imagBuffer_fx[k] = Madd_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ); // q - 5 realBuffer_fx[k] = cplx_aux_fx; } } @@ -1450,8 +1450,8 @@ void cldfbSynthesis_ivas_fx( sin((EVS_PI/M1)*(i+0.5)*(-(h_cldfb->ds-M1)*0.5)));*/ /*cplxMult(&rBuffer[i], &iBuffer[i], realBuffer[k][i], imagBuffer[k][i], rot_vctr_delay_re[i], rot_vctr_delay_im[i]);*/ /*cplxMult(&realBuffer[k][i], &imagBuffer[k][i], realBuffer[k][i], imagBuffer[k][i], rot_vctr_delay_re[i], rot_vctr_delay_im[i]);*/ - cplx_aux = L_sub( Mpy_32_32( realBuffer_fx[k][i], rot_vctr_delay_re_fx[i] ), Mpy_32_32( imagBuffer_fx[k][i], rot_vctr_delay_im_fx[i] ) ); // Qx - imagBuffer_fx[k][i] = L_add( Mpy_32_32( realBuffer_fx[k][i], rot_vctr_delay_im_fx[i] ), Mpy_32_32( imagBuffer_fx[k][i], rot_vctr_delay_re_fx[i] ) ); + cplx_aux = Msub_32_32( Mpy_32_32( realBuffer_fx[k][i], rot_vctr_delay_re_fx[i] ), imagBuffer_fx[k][i], rot_vctr_delay_im_fx[i] ); // Qx + imagBuffer_fx[k][i] = Madd_32_32( Mpy_32_32( realBuffer_fx[k][i], rot_vctr_delay_im_fx[i] ), imagBuffer_fx[k][i], rot_vctr_delay_re_fx[i] ); move32(); realBuffer_fx[k][i] = cplx_aux; move32(); @@ -1472,16 +1472,16 @@ void cldfbSynthesis_ivas_fx( { /* pre modulation of DST IV */ /*cplxMult(&rBuffer[2*i], &rBuffer[2*i+1], realBuffer[k][2*i], realBuffer[k][M1-1-2*i], rot_vctr_re[i], rot_vctr_im[i]);*/ - rBuffer_fx[2 * i] = L_sub( Mpy_32_32( realBuffer_fx[k][2 * i], rot_vctr_re_fx[i] ), Mpy_32_32( realBuffer_fx[k][M1 - 1 - 2 * i], rot_vctr_im_fx[i] ) ); // Qx + rBuffer_fx[2 * i] = Msub_32_32( Mpy_32_32( realBuffer_fx[k][2 * i], rot_vctr_re_fx[i] ), realBuffer_fx[k][M1 - 1 - 2 * i], rot_vctr_im_fx[i] ); // Qx move32(); - rBuffer_fx[2 * i + 1] = L_add( Mpy_32_32( realBuffer_fx[k][2 * i], rot_vctr_im_fx[i] ), Mpy_32_32( realBuffer_fx[k][M1 - 1 - 2 * i], rot_vctr_re_fx[i] ) ); // Qx + rBuffer_fx[2 * i + 1] = Madd_32_32( Mpy_32_32( realBuffer_fx[k][2 * i], rot_vctr_im_fx[i] ), realBuffer_fx[k][M1 - 1 - 2 * i], rot_vctr_re_fx[i] ); // Qx move32(); /* pre modulation of DCT IV */ /*cplxMult(&iBuffer[2*i], &iBuffer[2*i+1],-imagBuffer[k][2*i], imagBuffer[k][M1-1-2*i], rot_vctr_re[i], rot_vctr_im[i]);*/ - iBuffer_fx[2 * i] = L_sub( Mpy_32_32( ( L_negate( imagBuffer_fx[k][2 * i] ) ), rot_vctr_re_fx[i] ), Mpy_32_32( imagBuffer_fx[k][M1 - 1 - 2 * i], rot_vctr_im_fx[i] ) ); // Qx + iBuffer_fx[2 * i] = Msub_32_32( Mpy_32_32( ( L_negate( imagBuffer_fx[k][2 * i] ) ), rot_vctr_re_fx[i] ), imagBuffer_fx[k][M1 - 1 - 2 * i], rot_vctr_im_fx[i] ); // Qx move32(); - iBuffer_fx[2 * i + 1] = L_add( Mpy_32_32( ( L_negate( imagBuffer_fx[k][2 * i] ) ), rot_vctr_im_fx[i] ), Mpy_32_32( imagBuffer_fx[k][M1 - 1 - 2 * i], rot_vctr_re_fx[i] ) ); // Qx + iBuffer_fx[2 * i + 1] = Madd_32_32( Mpy_32_32( ( L_negate( imagBuffer_fx[k][2 * i] ) ), rot_vctr_im_fx[i] ), imagBuffer_fx[k][M1 - 1 - 2 * i], rot_vctr_re_fx[i] ); // Qx move32(); } @@ -1495,12 +1495,12 @@ void cldfbSynthesis_ivas_fx( FOR( i = 0; i < M41; i++ ) { /* post modulation of DST IV */ - rr12_fx = L_sub( Mpy_32_32( rBuffer_fx[M1 - 2 - 2 * i], rot_vctr_re_fx[M2 - 1 - i] ), Mpy_32_32( rBuffer_fx[M1 - 1 - 2 * i], rot_vctr_im_fx[M2 - 1 - i] ) ); // Qx - ri12_fx = L_add( Mpy_32_32( rBuffer_fx[M1 - 2 - 2 * i], rot_vctr_im_fx[M2 - 1 - i] ), Mpy_32_32( rBuffer_fx[M1 - 1 - 2 * i], rot_vctr_re_fx[M2 - 1 - i] ) ); // Qx + rr12_fx = Msub_32_32( Mpy_32_32( rBuffer_fx[M1 - 2 - 2 * i], rot_vctr_re_fx[M2 - 1 - i] ), rBuffer_fx[M1 - 1 - 2 * i], rot_vctr_im_fx[M2 - 1 - i] ); // Qx + ri12_fx = Madd_32_32( Mpy_32_32( rBuffer_fx[M1 - 2 - 2 * i], rot_vctr_im_fx[M2 - 1 - i] ), rBuffer_fx[M1 - 1 - 2 * i], rot_vctr_re_fx[M2 - 1 - i] ); // Qx /* post modulation of DCT IV */ - ir12_fx = L_sub( Mpy_32_32( iBuffer_fx[M1 - 2 - 2 * i], rot_vctr_re_fx[M2 - 1 - i] ), Mpy_32_32( iBuffer_fx[M1 - 1 - 2 * i], rot_vctr_im_fx[M2 - 1 - i] ) ); // Qx - ii12_fx = L_add( Mpy_32_32( iBuffer_fx[M1 - 2 - 2 * i], rot_vctr_im_fx[M2 - 1 - i] ), Mpy_32_32( iBuffer_fx[M1 - 1 - 2 * i], rot_vctr_re_fx[M2 - 1 - i] ) ); // Qx + ir12_fx = Msub_32_32( Mpy_32_32( iBuffer_fx[M1 - 2 - 2 * i], rot_vctr_re_fx[M2 - 1 - i] ), iBuffer_fx[M1 - 1 - 2 * i], rot_vctr_im_fx[M2 - 1 - i] ); // Qx + ii12_fx = Madd_32_32( Mpy_32_32( iBuffer_fx[M1 - 2 - 2 * i], rot_vctr_im_fx[M2 - 1 - i] ), iBuffer_fx[M1 - 1 - 2 * i], rot_vctr_re_fx[M2 - 1 - i] ); // Qx new_samples_fx[M1 + M2 + 1 + 2 * i] = L_negate( L_add( rr12_fx, ii12_fx ) ); // Qx move32(); @@ -1516,12 +1516,12 @@ void cldfbSynthesis_ivas_fx( FOR( i = 0; i < M42; i++ ) { /* post modulation of DST IV */ - rr12_fx = L_sub( Mpy_32_32( rBuffer_fx[2 * i], rot_vctr_re_fx[i] ), Mpy_32_32( rBuffer_fx[2 * i + 1], rot_vctr_im_fx[i] ) ); // Qx - ri12_fx = L_add( Mpy_32_32( rBuffer_fx[2 * i], rot_vctr_im_fx[i] ), Mpy_32_32( rBuffer_fx[2 * i + 1], rot_vctr_re_fx[i] ) ); // Qx + rr12_fx = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * i], rot_vctr_re_fx[i] ), rBuffer_fx[2 * i + 1], rot_vctr_im_fx[i] ); // Qx + ri12_fx = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * i], rot_vctr_im_fx[i] ), rBuffer_fx[2 * i + 1], rot_vctr_re_fx[i] ); // Qx /* post modulation of DCT IV */ - ir12_fx = L_sub( Mpy_32_32( iBuffer_fx[2 * i], rot_vctr_re_fx[i] ), Mpy_32_32( iBuffer_fx[2 * i + 1], rot_vctr_im_fx[i] ) ); // Qx - ii12_fx = L_add( Mpy_32_32( iBuffer_fx[2 * i], rot_vctr_im_fx[i] ), Mpy_32_32( iBuffer_fx[2 * i + 1], rot_vctr_re_fx[i] ) ); // Qx + ir12_fx = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * i], rot_vctr_re_fx[i] ), iBuffer_fx[2 * i + 1], rot_vctr_im_fx[i] ); // Qx + ii12_fx = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * i], rot_vctr_im_fx[i] ), iBuffer_fx[2 * i + 1], rot_vctr_re_fx[i] ); // Qx new_samples_fx[M1 + M2 + 2 * i] = L_add( ri12_fx, ir12_fx ); // Qx move32(); @@ -1537,11 +1537,11 @@ void cldfbSynthesis_ivas_fx( /* synthesis prototype filter */ FOR( i = 0; i < L2; i++ ) { - accu0 = L_add( synthesisBuffer_fx[0 * L2 + i], Mpy_32_16_1( Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 0 * L2 + i )] ), p_filter_sf ) ); // Qx - 1 - accu1 = L_add( synthesisBuffer_fx[1 * L2 + i], Mpy_32_16_1( Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 1 * L2 + i )] ), p_filter_sf ) ); // Qx - 1 - accu2 = L_add( synthesisBuffer_fx[2 * L2 + i], Mpy_32_16_1( Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 2 * L2 + i )] ), p_filter_sf ) ); // Qx - 1 - accu3 = L_add( synthesisBuffer_fx[3 * L2 + i], Mpy_32_16_1( Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 3 * L2 + i )] ), p_filter_sf ) ); // Qx - 1 - accu4 = L_add( synthesisBuffer_fx[4 * L2 + i], Mpy_32_16_1( Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 4 * L2 + i )] ), p_filter_sf ) ); // Qx - 1 + accu0 = Madd_32_16( synthesisBuffer_fx[0 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 0 * L2 + i )] ), p_filter_sf ); // Qx - 1 + accu1 = Madd_32_16( synthesisBuffer_fx[1 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 1 * L2 + i )] ), p_filter_sf ); // Qx - 1 + accu2 = Madd_32_16( synthesisBuffer_fx[2 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 2 * L2 + i )] ), p_filter_sf ); // Qx - 1 + accu3 = Madd_32_16( synthesisBuffer_fx[3 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 3 * L2 + i )] ), p_filter_sf ); // Qx - 1 + accu4 = Madd_32_16( synthesisBuffer_fx[4 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 4 * L2 + i )] ), p_filter_sf ); // Qx - 1 synthesisBuffer_fx[0 * L2 + i] = accu0; move32(); diff --git a/lib_com/core_com_config.c b/lib_com/core_com_config.c index c91e6f782..e01bb339a 100644 --- a/lib_com/core_com_config.c +++ b/lib_com/core_com_config.c @@ -43,6 +43,7 @@ #include "ivas_prot.h" #include "prot_fx2.h" +#define FSCALE_DENOM_BY_12800_Q15 1311 /*-------------------------------------------------------------------* * is_EVS_bitrate() * @@ -58,9 +59,11 @@ Word16 is_EVS_bitrate( Word16 j; j = 0; + move16(); WHILE( LT_16( j, SIZE_BRATE_TBL ) && NE_32( ivas_total_brate, brate_tbl[j] ) ) { - j++; + test(); + j = add( j, 1 ); } /* AMR-WB IO mode/EVS primary mode determination */ @@ -86,10 +89,12 @@ Word16 is_EVS_bitrate( } *Opt_AMR_WB = 1; + move16(); } ELSE { *Opt_AMR_WB = 0; + move16(); } return 1; @@ -107,45 +112,59 @@ Word16 get_codec_mode( const Word32 total_brate /* i : total bitrate */ ) { - Word16 codec_mode = -1; + Word16 codec_mode; + codec_mode = -1; + move16(); SWITCH( total_brate ) { case 5900: codec_mode = MODE1; + move16(); BREAK; case 7200: codec_mode = MODE1; + move16(); BREAK; case 8000: codec_mode = MODE1; + move16(); BREAK; case 9600: codec_mode = MODE2; + move16(); BREAK; case 13200: codec_mode = MODE1; + move16(); BREAK; case 16400: codec_mode = MODE2; + move16(); BREAK; case 24400: codec_mode = MODE2; + move16(); BREAK; case 32000: codec_mode = MODE1; + move16(); BREAK; case 48000: codec_mode = MODE2; + move16(); BREAK; case 64000: codec_mode = MODE1; + move16(); BREAK; case 96000: codec_mode = MODE2; + move16(); BREAK; case 128000: codec_mode = MODE2; + move16(); BREAK; } @@ -280,44 +299,63 @@ Word16 getTcxonly( const Word16 is_ism_format /* i : flag indicating ISM format */ ) { - Word16 tcxonly = 0; + Word16 tcxonly; + tcxonly = 0; + move16(); SWITCH( element_mode ) { case EVS_MONO: - IF( GT_32( total_brate, ACELP_32k ) ) + if ( GT_32( total_brate, ACELP_32k ) ) { tcxonly = 1; + move16(); } BREAK; case IVAS_SCE: IF( is_ism_format ) { - IF( GT_32( total_brate, MAX_ACELP_BRATE_ISM ) ) + if ( GT_32( total_brate, MAX_ACELP_BRATE_ISM ) ) { tcxonly = 1; + move16(); } } ELSE { - IF( GT_32( total_brate, MAX_ACELP_BRATE ) ) + if ( GT_32( total_brate, MAX_ACELP_BRATE ) ) { tcxonly = 1; + move16(); } } BREAK; case IVAS_CPE_DFT: case IVAS_CPE_TD: - IF( GT_32( total_brate, MAX_ACELP_BRATE ) ) + if ( GT_32( total_brate, MAX_ACELP_BRATE ) ) { tcxonly = 1; + move16(); } BREAK; case IVAS_CPE_MDCT: - IF( GE_32( total_brate, ( MCT_flag ? IVAS_32k : IVAS_48k ) ) ) + IF( MCT_flag ) { - tcxonly = 1; + + if ( GE_32( total_brate, IVAS_32k ) ) + { + tcxonly = 1; + move16(); + } + } + ELSE + { + if ( GE_32( total_brate, IVAS_48k ) ) + { + tcxonly = 1; + move16(); + } } BREAK; } @@ -349,6 +387,7 @@ Word16 getTcxonly( test(); test(); test(); + test(); if ( ( ( LE_16( element_mode, IVAS_SCE ) && GT_32( total_brate, LPC_SHAPED_ARI_MAX_RATE ) ) || ( GT_16( element_mode, IVAS_SCE ) && GT_32( total_brate, LPC_SHAPED_ARI_MAX_RATE_CPE ) ) ) && !rf_flag && ( ( LE_32( total_brate, IVAS_64k ) && NE_16( element_mode, IVAS_CPE_DFT ) ) || ( LT_32( total_brate, 24400 ) && EQ_16( element_mode, IVAS_CPE_DFT ) ) ) && NE_16( element_mode, IVAS_CPE_MDCT ) ) { ctx_hm = 1; @@ -372,7 +411,7 @@ Word16 getTcxonly( resq = 0; move16(); - IF( LE_32( total_brate, IVAS_64k ) ) + if ( LE_32( total_brate, IVAS_64k ) ) { resq = 1; move16(); @@ -393,13 +432,15 @@ Word16 getTcxonly( const Word16 element_mode /* i : IVAS element mode */ ) { - Word16 tnsAllowed = 0; + Word16 tnsAllowed; tnsAllowed = 0; move16(); - IF( NE_16( igf, 0 ) ) + IF( igf != 0 ) { - IF( GT_32( total_brate, HQ_16k40 ) || ( GT_32( total_brate, HQ_13k20 ) && EQ_16( element_mode, IVAS_CPE_DFT ) ) ) + test(); + test(); + if ( GT_32( total_brate, HQ_16k40 ) || ( GT_32( total_brate, HQ_13k20 ) && EQ_16( element_mode, IVAS_CPE_DFT ) ) ) { tnsAllowed = 1; move16(); @@ -407,7 +448,7 @@ Word16 getTcxonly( } ELSE { - IF( GT_32( total_brate, HQ_32k ) ) + if ( GT_32( total_brate, HQ_32k ) ) { tnsAllowed = 1; move16(); @@ -429,19 +470,28 @@ Word16 getTcxonly( const Word16 Opt_AMR_WB /* i : flag indicating AMR-WB IO mode */ ) { - Word16 restrictedMode = 3; + Word16 restrictedMode; + restrictedMode = 3; + move16(); + test(); + test(); + test(); + test(); IF( !Opt_AMR_WB && ( GT_32( total_brate, HQ_32k ) && NE_16( element_mode, IVAS_SCE ) ) ) { restrictedMode = 6; + move16(); } ELSE IF( !Opt_AMR_WB && ( GT_32( total_brate, HQ_48k ) && EQ_16( element_mode, IVAS_SCE ) ) ) { restrictedMode = 6; + move16(); } ELSE IF( Opt_AMR_WB ) { restrictedMode = 1; + move16(); } return restrictedMode; @@ -483,7 +533,7 @@ Word16 getTcxonly( const Word32 sr_core /* i : internal sampling rate */ ) { - return (Word16) ( ( FSCALE_DENOM * sr_core ) / 12800 ); + return extract_l( Mpy_32_16_1( sr_core, FSCALE_DENOM_BY_12800_Q15 ) ); } #endif @@ -590,19 +640,19 @@ Word16 getTcxonly( test(); test(); test(); - IF( EQ_32( bwidth, NB ) ) + test(); + IF( bwidth == NB ) { sr_core = INT_FS_12k8; move32(); } - ELSE IF( EQ_16( element_mode, EVS_MONO ) && ( L_and( EQ_32( bwidth, WB ), LT_32( total_brate, ACELP_13k20 ) ) || - L_and( EQ_32( bwidth, SWB ), LE_32( total_brate, ACELP_13k20 ) ) || EQ_16( rf_mode, 1 ) ) ) - + ELSE IF( element_mode == EVS_MONO && ( L_and( EQ_32( bwidth, WB ), LT_32( total_brate, ACELP_13k20 ) ) || + L_and( EQ_32( bwidth, SWB ), LE_32( total_brate, ACELP_13k20 ) ) || EQ_16( rf_mode, 1 ) ) ) { sr_core = INT_FS_12k8; move32(); } - ELSE IF( GT_16( element_mode, EVS_MONO ) && flag_ACELP16k == 0 ) + ELSE IF( element_mode > EVS_MONO && flag_ACELP16k == 0 ) { sr_core = INT_FS_12k8; move32(); @@ -620,12 +670,14 @@ Word16 getTcxonly( ELSE IF( bwd_swb_or_fb_flag && LE_32( total_brate, MAX_ACELP_BRATE_ISM ) && EQ_16( element_mode, IVAS_SCE ) && is_ism_format ) { sr_core = INT_FS_16k; + move32(); } ELSE IF( bwd_swb_or_fb_flag && LE_32( total_brate, MAX_ACELP_BRATE ) && EQ_16( element_mode, IVAS_SCE ) && is_ism_format ) { sr_core = 25600; + move32(); } - ELSE IF( ( EQ_16( element_mode, EVS_MONO ) && ( bwd_swb_or_fb_flag && LE_32( total_brate, HQ_64k ) ) ) || ( GT_16( element_mode, IVAS_SCE ) && ( ( EQ_16( bwidth, SWB ) && LE_32( total_brate, IVAS_96k ) ) || ( EQ_16( bwidth, FB ) && LE_32( total_brate, IVAS_96k ) ) ) ) ) + ELSE IF( ( element_mode == EVS_MONO && ( bwd_swb_or_fb_flag && LE_32( total_brate, HQ_64k ) ) ) || ( GT_16( element_mode, IVAS_SCE ) && ( ( EQ_16( bwidth, SWB ) && LE_32( total_brate, IVAS_96k ) ) || ( EQ_16( bwidth, FB ) && LE_32( total_brate, IVAS_96k ) ) ) ) ) { sr_core = 25600; move32(); @@ -652,7 +704,7 @@ Word16 getTcxonly( tcxBandwidth = 16384 /*0.5f Q15*/; move16(); - if ( EQ_16( bwidth, NB ) ) + if ( bwidth == NB ) { tcxBandwidth = 10240 /*0.3125f Q15*/; move16(); @@ -786,7 +838,8 @@ Word16 getTcxonly( const Word16 rf_mode /* i : flag to signal the RF mode */ ) { - Word16 igfPresent = 0; + Word16 igfPresent; + igfPresent = 0; move16(); IF( EQ_16( bwidth, SWB ) ) @@ -795,7 +848,7 @@ Word16 getTcxonly( { case EVS_MONO: case IVAS_SCE: - IF( LE_32( total_brate, HQ_64k ) ) + if ( LE_32( total_brate, HQ_64k ) ) { igfPresent = 1; move16(); @@ -803,14 +856,14 @@ Word16 getTcxonly( BREAK; case IVAS_CPE_DFT: case IVAS_CPE_TD: - IF( LE_32( total_brate, HQ_48k ) ) + if ( LE_32( total_brate, HQ_48k ) ) { igfPresent = 1; move16(); } BREAK; case IVAS_CPE_MDCT: - IF( LE_32( total_brate, IVAS_96k ) ) + if ( LE_32( total_brate, IVAS_96k ) ) { igfPresent = 1; move16(); @@ -824,7 +877,7 @@ Word16 getTcxonly( { case EVS_MONO: case IVAS_SCE: - IF( LE_32( total_brate, IVAS_128k ) ) + if ( LE_32( total_brate, IVAS_128k ) ) { igfPresent = 1; move16(); @@ -832,14 +885,14 @@ Word16 getTcxonly( BREAK; case IVAS_CPE_DFT: case IVAS_CPE_TD: - IF( LE_32( total_brate, IVAS_48k ) ) + if ( LE_32( total_brate, IVAS_48k ) ) { igfPresent = 1; move16(); } BREAK; case IVAS_CPE_MDCT: - IF( LE_32( total_brate, IVAS_128k ) ) + if ( LE_32( total_brate, IVAS_128k ) ) { igfPresent = 1; move16(); @@ -847,13 +900,13 @@ Word16 getTcxonly( BREAK; } } - ELSE IF( bwidth == WB ) + ELSE IF( EQ_16( bwidth, WB ) ) { SWITCH( element_mode ) { case EVS_MONO: case IVAS_SCE: - IF( LE_32( total_brate, ACELP_9k60 ) ) + if ( LE_32( total_brate, ACELP_9k60 ) ) { igfPresent = 1; move16(); @@ -862,7 +915,7 @@ Word16 getTcxonly( case IVAS_CPE_DFT: case IVAS_CPE_TD: case IVAS_CPE_MDCT: - IF( LE_32( total_brate, ACELP_13k20 ) ) + if ( LE_32( total_brate, ACELP_13k20 ) ) { igfPresent = 1; move16(); @@ -873,7 +926,7 @@ Word16 getTcxonly( test(); test(); test(); - IF( ( ( EQ_16( bwidth, WB ) ) || ( EQ_16( bwidth, SWB ) ) ) && ( EQ_16( rf_mode, 1 ) ) && ( EQ_32( total_brate, ACELP_13k20 ) ) ) + if ( ( ( EQ_16( bwidth, WB ) ) || ( EQ_16( bwidth, SWB ) ) ) && ( EQ_16( rf_mode, 1 ) ) && ( EQ_32( total_brate, ACELP_13k20 ) ) ) { igfPresent = 1; move16(); @@ -928,17 +981,20 @@ Word16 getTcxonly( const Word16 bwidth /* i : audio bandwidth */ ) { - Word16 flag_cna = 0; + Word16 flag_cna; + flag_cna = 0; + move16(); + test(); IF( EQ_16( element_mode, IVAS_CPE_DFT ) && LE_32( element_brate, CNA_MAX_BRATE_DFT_STEREO ) ) { flag_cna = 1; + move16(); } ELSE { - move16(); test(); - IF( LE_16( bwidth, SWB ) && ( LE_32( total_brate, ACELP_13k20 ) ) ) + if ( LE_16( bwidth, SWB ) && ( LE_32( total_brate, ACELP_13k20 ) ) ) { flag_cna = 1; move16(); @@ -957,12 +1013,12 @@ Word16 getTcxonly( const Word32 sr_core /* i : internal sampling rate */ ) { - Word16 tcxltp = 0; + Word16 tcxltp; tcxltp = 0; move16(); - test(); - IF( ( LE_32( sr_core, 25600 ) ) ) + + if ( ( LE_32( sr_core, 25600 ) ) ) { tcxltp = 1; move16(); @@ -1070,18 +1126,23 @@ Word16 getTcxonly( { case NB: tcx_coded_lines = 160; + move16(); BREAK; case WB: tcx_coded_lines = 320; + move16(); BREAK; case SWB: tcx_coded_lines = 640; + move16(); BREAK; case FB: tcx_coded_lines = 960; + move16(); BREAK; default: tcx_coded_lines = 0; + move16(); BREAK; } @@ -1100,13 +1161,15 @@ Word16 getTcxonly( const Word16 element_mode /* i : IVAS element mode */ ) { - Word16 tcx_lpc_shaped_ari = 0; - + Word16 tcx_lpc_shaped_ari; + tcx_lpc_shaped_ari = 0; move16(); + + test(); test(); test(); test(); - IF( ( ( LE_16( element_mode, IVAS_SCE ) && LE_32( total_brate, LPC_SHAPED_ARI_MAX_RATE ) ) || ( GT_16( element_mode, IVAS_SCE ) && LE_32( total_brate, LPC_SHAPED_ARI_MAX_RATE_CPE ) ) ) || rf_mode ) + if ( ( ( LE_16( element_mode, IVAS_SCE ) && LE_32( total_brate, LPC_SHAPED_ARI_MAX_RATE ) ) || ( GT_16( element_mode, IVAS_SCE ) && LE_32( total_brate, LPC_SHAPED_ARI_MAX_RATE_CPE ) ) ) || rf_mode ) { tcx_lpc_shaped_ari = 1; move16(); @@ -1363,11 +1426,15 @@ Word16 getTcxonly( hTcxCfg->tcx_mdct_window_delayFB = mdctWindowLengthFB; hTcxCfg->tcx_mdct_window_length = mdctWindowLength; hTcxCfg->tcx_mdct_window_lengthFB = mdctWindowLengthFB; + move16(); + move16(); + move16(); + move16(); mdct_window_sine_IVAS_updated( hTcxCfg->tcx_mdct_window, sr_core, hTcxCfg->tcx_mdct_window_length, FULL_OVERLAP, element_mode ); IF( EQ_16( hTcxCfg->tcx_mdct_window_length, hTcxCfg->tcx_mdct_window_lengthFB ) ) { - Copy_pword( hTcxCfg->tcx_mdct_window, hTcxCfg->tcx_mdct_windowFB, hTcxCfg->tcx_mdct_window_length / 2 ); + Copy_pword( hTcxCfg->tcx_mdct_window, hTcxCfg->tcx_mdct_windowFB, shr( hTcxCfg->tcx_mdct_window_length, 1 ) ); } ELSE { @@ -1380,11 +1447,13 @@ Word16 getTcxonly( /*1.25ms transition window for ACELP->TCX*/ hTcxCfg->tcx_mdct_window_trans_length = NS2SA_fx2( sr_core, ACELP_TCX_TRANS_NS ); + move16(); mdct_window_sine_IVAS_updated( hTcxCfg->tcx_mdct_window_trans, sr_core, hTcxCfg->tcx_mdct_window_trans_length, TRANSITION_OVERLAP, element_mode ); hTcxCfg->tcx_mdct_window_trans_lengthFB = NS2SA_fx2( input_Fs, ACELP_TCX_TRANS_NS ); + move16(); IF( EQ_16( hTcxCfg->tcx_mdct_window_trans_length, hTcxCfg->tcx_mdct_window_trans_lengthFB ) ) { - Copy_pword( hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_trans_length / 2 ); + Copy_pword( hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_transFB, shr( hTcxCfg->tcx_mdct_window_trans_length, 1 ) ); } ELSE { @@ -1394,12 +1463,14 @@ Word16 getTcxonly( /*compute minimum length for "half" window: lookahead - 5ms. It must be also multiple of 2*/ hTcxCfg->tcx_mdct_window_half_length = extract_l( L_shr( L_mult0( L_LOOK_12k8 - NS2SA_fx2( 12800, 5000000L ), sr2fscale( sr_core ) ), LD_FSCALE_DENOM ) ); hTcxCfg->tcx_mdct_window_half_lengthFB = extract_l( L_shr( L_mult0( L_LOOK_12k8 - NS2SA_fx2( 12800, 5000000L ), sr2fscale( input_Fs ) ), LD_FSCALE_DENOM ) ); + move16(); + move16(); assert( GT_16( hTcxCfg->tcx_mdct_window_half_length, 16 ) && "Half window can not be large enough!" ); mdct_window_sine_IVAS_updated( hTcxCfg->tcx_mdct_window_half, sr_core, hTcxCfg->tcx_mdct_window_half_length, HALF_OVERLAP, element_mode ); IF( EQ_16( hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_half_lengthFB ) ) { - Copy_pword( hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_half_length / 2 ); + Copy_pword( hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_halfFB, shr( hTcxCfg->tcx_mdct_window_half_length, 1 ) ); } ELSE { @@ -1409,10 +1480,12 @@ Word16 getTcxonly( /* minimum overlap 1.25 ms */ hTcxCfg->tcx_mdct_window_min_length = shr( L_frame, 4 ); /* 1.25ms */ hTcxCfg->tcx_mdct_window_min_lengthFB = shr( L_frameTCX, 4 ); /* 1.25ms */ + move16(); + move16(); /* save complexity by copying the small windows if they have the same length */ IF( EQ_16( hTcxCfg->tcx_mdct_window_min_length, hTcxCfg->tcx_mdct_window_trans_length ) ) { - Copy_pword( hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_min_length / 2 ); + Copy_pword( hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_minimum, shr( hTcxCfg->tcx_mdct_window_min_length, 1 ) ); } ELSE { @@ -1421,11 +1494,11 @@ Word16 getTcxonly( IF( EQ_16( hTcxCfg->tcx_mdct_window_min_lengthFB, hTcxCfg->tcx_mdct_window_trans_lengthFB ) ) { - Copy_pword( hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_min_lengthFB / 2 ); + Copy_pword( hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_minimumFB, shr( hTcxCfg->tcx_mdct_window_min_lengthFB, 1 ) ); } ELSE IF( EQ_16( hTcxCfg->tcx_mdct_window_min_length, hTcxCfg->tcx_mdct_window_min_lengthFB ) ) { - Copy_pword( hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_min_lengthFB / 2 ); + Copy_pword( hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_minimumFB, shr( hTcxCfg->tcx_mdct_window_min_lengthFB, 1 ) ); } ELSE { @@ -1437,6 +1510,10 @@ Word16 getTcxonly( /*<0 rectangular transition with optimized window size = L_frame+L_frame/4*/ hTcxCfg->lfacNext = sub( hTcxCfg->tcx_offset, shr( L_frame, 2 ) ); hTcxCfg->lfacNextFB = sub( hTcxCfg->tcx_offsetFB, shr( L_frameTCX, 2 ) ); + move16(); + move16(); + move16(); + move16(); return; } @@ -1470,6 +1547,8 @@ Word16 getTcxonly( hTcxCfg->tcx5Size = shr( L_frame, 2 ); /* Always 5 ms */ hTcxCfg->tcx5SizeFB = shr( L_frameTCX, 2 ); /* Always 5 ms */ + move16(); + move16(); hTcxCfg->tcx_mdct_window_length_old = hTcxCfg->tcx_mdct_window_length; move16(); @@ -1484,49 +1563,60 @@ Word16 getTcxonly( hTcxCfg->tcxRateLoopOpt = 0; move16(); - IF( tcxonly != 0 ) + if ( tcxonly != 0 ) { hTcxCfg->tcxRateLoopOpt = 2; move16(); } - IF( EQ_16( element_mode, IVAS_CPE_MDCT ) ) - hTcxCfg->tcxRateLoopOpt = 3; + if ( EQ_16( element_mode, IVAS_CPE_MDCT ) ) + { + hTcxCfg->tcxRateLoopOpt = 3; + move16(); + } hTcxCfg->bandwidth = getTcxBandwidth( bwidth ); move16(); /* set number of coded lines */ hTcxCfg->tcx_coded_lines = getNumTcxCodedLines( bwidth ); + move16(); /* TNS in TCX */ hTcxCfg->pCurrentTnsConfig = NULL; hTcxCfg->fIsTNSAllowed = getTnsAllowed( total_brate, igf, element_mode ); + move16(); IF( hTcxCfg->fIsTNSAllowed ) { InitTnsConfigs( bwidth, hTcxCfg->tcx_coded_lines, hTcxCfg->tnsConfig, infoIGFStopFreq, total_brate, element_mode, MCT_flag ); - SetAllowTnsOnWhite( hTcxCfg->tnsConfig, element_mode == IVAS_CPE_MDCT ); + SetAllowTnsOnWhite( hTcxCfg->tnsConfig, (Word8) EQ_16( element_mode, IVAS_CPE_MDCT ) ); } IF( ini_frame == 0 ) { hTcxCfg->tcx_curr_overlap_mode = hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW; hTcxCfg->last_aldo = 1; + move16(); + move16(); + move16(); } /* Context HM*/ hTcxCfg->ctx_hm = getCtxHm( element_mode, total_brate, rf_mode ); + move16(); /* Residual Coding*/ hTcxCfg->resq = getResq( total_brate ); - IF( hTcxCfg->resq && !tcxonly ) + move16(); + test(); + if ( hTcxCfg->resq && !tcxonly ) { hTcxCfg->tcxRateLoopOpt = 1; move16(); } /*Set bandwidth scale*/ - IF( EQ_16( bwidth, NB ) ) + IF( bwidth == NB ) { na_scale_bwidth = NB; } @@ -1538,21 +1628,27 @@ Word16 getTcxonly( { na_scale_bwidth = SWB; } + move16(); hTcxCfg->na_scale = 32767 /*1.0f Q15*/; + move16(); + test(); IF( LT_16( na_scale_bwidth, SWB ) && !tcxonly ) { FOR( i = 0; i < SIZE_SCALE_TABLE_TCX; i++ ) { + test(); + test(); IF( ( EQ_16( na_scale_bwidth, scaleTcxTable[i].bwmode ) ) && ( GE_32( total_brate, scaleTcxTable[i].bitrateFrom ) ) && ( LT_32( total_brate, scaleTcxTable[i].bitrateTo ) ) ) { - IF( rf_mode ) + if ( rf_mode ) { - i--; + i = sub( i, 1 ); } hTcxCfg->na_scale = scaleTcxTable[i].scale; + move16(); BREAK; } } diff --git a/lib_com/deemph.c b/lib_com/deemph.c index a746d326e..1c00dde1a 100644 --- a/lib_com/deemph.c +++ b/lib_com/deemph.c @@ -79,13 +79,16 @@ void deemph_fx_32( Word32 *mem /* i/o: memory (y[-1]) Qx*/ ) { - int16_t i; + Word16 i; signal[0] = L_add( signal[0], Mpy_32_16_1( ( *mem ), mu ) ); + move32(); FOR( i = 1; i < L; i++ ) { signal[i] = L_add( signal[i], Mpy_32_16_1( signal[i - 1], mu ) ); signal[i] = L_shl( signal[i], shift ); + move32(); + move32(); } *mem = signal[L - 1]; @@ -125,7 +128,9 @@ void deemph_fx( Word16 i; Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; + Flag Overflow; + Overflow = 0; + move32(); #endif L_tmp = L_deposit_h( signal[0] ); @@ -136,6 +141,7 @@ void deemph_fx( L_tmp = L_mac( L_tmp, *mem, mu ); signal[0] = round_fx( L_tmp ); #endif + move16(); FOR( i = 1; i < L; i++ ) { @@ -147,6 +153,7 @@ void deemph_fx( L_tmp = L_mac( L_tmp, signal[i - 1], mu ); signal[i] = round_fx( L_tmp ); #endif /* BASOP_NOGLOB */ + move16(); } *mem = signal[L - 1]; @@ -169,7 +176,9 @@ void Deemph2( Word16 i; Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; + Flag Overflow; + Overflow = 0; + move32(); #endif /* saturation can occur in L_mac() */ @@ -215,7 +224,9 @@ void E_UTIL_deemph2( Word16 shift, Word16 *x, const Word16 mu, const Word16 L, W Word16 i; Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; + Flag Overflow; + Overflow = 0; + move32(); #endif /* signal[0] = signal[0] + mu * (*mem); */ @@ -232,6 +243,7 @@ void E_UTIL_deemph2( Word16 shift, Word16 *x, const Word16 mu, const Word16 L, W L_tmp = L_msu( Mpy_32_16_1( L_tmp, mu ), x[i], shift ); x[i] = round_fx( L_tmp ); #endif + move16(); } } ELSE @@ -245,6 +257,7 @@ void E_UTIL_deemph2( Word16 shift, Word16 *x, const Word16 mu, const Word16 L, W L_tmp = L_msu( Mpy_32_16_1( L_tmp, mu ), shr( x[i], shift ), -32768 ); x[i] = round_fx( L_tmp ); #endif + move16(); } } diff --git a/lib_com/delay_comp.c b/lib_com/delay_comp.c index 0c0beef9e..b0ccb9888 100644 --- a/lib_com/delay_comp.c +++ b/lib_com/delay_comp.c @@ -124,10 +124,11 @@ Word32 get_delay_fx( /* o : delay value in ms #endif ) { - Word32 delay = 0; + Word32 delay; + delay = 0; move32(); - IF( EQ_16( what_delay, ENC ) ) + IF( what_delay == ENC ) { IF( EQ_16( ivas_format, MONO_FORMAT ) ) /* EVS mono */ { @@ -139,14 +140,14 @@ Word32 get_delay_fx( /* o : delay value in ms delay = IVAS_ENC_DELAY_NS; move32(); test(); - IF( EQ_16( ivas_format, MASA_FORMAT ) || EQ_16( ivas_format, MASA_ISM_FORMAT ) ) + if ( EQ_16( ivas_format, MASA_FORMAT ) || EQ_16( ivas_format, MASA_ISM_FORMAT ) ) { delay = 0; /* All delay is compensated in the decoder with MASA */ move32(); } } test(); - IF( EQ_16( ivas_format, SBA_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) + if ( EQ_16( ivas_format, SBA_FORMAT ) || EQ_16( ivas_format, SBA_ISM_FORMAT ) ) { /* compensate for DirAC/SPAR filterbank delay */ delay = L_add( delay, IVAS_FB_ENC_DELAY_NS ); @@ -177,7 +178,7 @@ Word32 get_delay_fx( /* o : delay value in ms IF( NE_16( output_config, AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) { #endif - IF( hCldfb != NULL ) + if ( hCldfb != NULL ) { /* compensate for filterbank delay */ delay = L_add( delay, IVAS_FB_DEC_DELAY_NS ); @@ -186,7 +187,7 @@ Word32 get_delay_fx( /* o : delay value in ms } #endif test(); - IF( EQ_16( ivas_format, MASA_FORMAT ) || EQ_16( ivas_format, MASA_ISM_FORMAT ) ) + if ( EQ_16( ivas_format, MASA_FORMAT ) || EQ_16( ivas_format, MASA_ISM_FORMAT ) ) { delay = L_add( delay, IVAS_ENC_DELAY_NS ); /* Compensate also the encoder delay in the decoder with MASA */ } diff --git a/lib_com/dlpc_bfi_fx.c b/lib_com/dlpc_bfi_fx.c index 63391f6d0..43a8c360c 100644 --- a/lib_com/dlpc_bfi_fx.c +++ b/lib_com/dlpc_bfi_fx.c @@ -35,7 +35,7 @@ void dlpc_bfi( { /* Decode the second LPC */ lsf_dec_bfi( MODE2, &lsf_q[M], &lsf_q[0], lsf_adaptive_mean, lsfBase, mem_MA, mem_AR, *stab_fac, - 0, L_frame, last_good, nbLostCmpt + 1, plcBackgroundNoiseUpdated, lsf_q_cng, lsf_cng, old_lsf_q_cng, 0, 0, tcxonly, 0 ); + 0, L_frame, last_good, add( nbLostCmpt, 1 ), plcBackgroundNoiseUpdated, lsf_q_cng, lsf_cng, old_lsf_q_cng, 0, 0, tcxonly, 0 ); } /**/ /*No local variabvles defined*/ } diff --git a/lib_com/edct_fx.c b/lib_com/edct_fx.c index 0bc9234c2..721a5bf25 100644 --- a/lib_com/edct_fx.c +++ b/lib_com/edct_fx.c @@ -18,140 +18,146 @@ static Word16 get_edxt_factor( Word16 length ) /* Returns value of sqrtf(2.f/length) in Q15 */ { - Word16 factor = 0; /*Q15*/ + Word16 factor; /*Q15*/ + factor = 0; + move16(); IF( EQ_16( length, 512 ) ) { factor = 2048; + move16(); } ELSE IF( EQ_16( length, 256 ) ) { factor = 2896; + move16(); } ELSE IF( EQ_16( length, 128 ) ) { factor = 4096; + move16(); } ELSE IF( EQ_16( length, 640 ) ) { factor = 1832; + move16(); } ELSE IF( EQ_16( length, 320 ) ) { factor = 2590; + move16(); } ELSE IF( EQ_16( length, 160 ) ) { factor = 3663; + move16(); } ELSE IF( EQ_16( length, 80 ) ) { factor = 5181; + move16(); } ELSE IF( EQ_16( length, 40 ) ) { factor = 7327; + move16(); } ELSE IF( EQ_16( length, 960 ) ) { factor = 1496; + move16(); } ELSE IF( EQ_16( length, 480 ) ) { factor = 2115; + move16(); } ELSE IF( EQ_16( length, 240 ) ) { factor = 2991; + move16(); } ELSE IF( EQ_16( length, 120 ) ) { factor = 4230; + move16(); } ELSE IF( EQ_16( length, 1200 ) ) { factor = 1338; + move16(); } ELSE IF( EQ_16( length, 800 ) ) { factor = 1638; + move16(); } ELSE IF( EQ_16( length, 400 ) ) { factor = 2317; + move16(); } ELSE IF( EQ_16( length, 200 ) ) { factor = 3277; + move16(); } return factor; } static Word16 const *get_edct_table( Word16 length, Word16 *q ) { - Word16 const *edct_table = NULL; + Word16 const *edct_table; + edct_table = NULL; SWITCH( length ) { case 1200: edct_table = edct_table_600_fx; - move16(); *q = add( *q, 2 ); + move16(); BREAK; case 960: edct_table = edct_table_480_fx; - move16(); BREAK; case 640: edct_table = edct_table_320_fx; - move16(); BREAK; case 320: edct_table = edct_table_160_fx; - move16(); BREAK; case 256: edct_table = edct_table_128_fx; - move16(); BREAK; case 240: edct_table = edct_table_120_fx; - move16(); BREAK; case 200: edct_table = edct_table_100_fx; - move16(); BREAK; case 160: edct_table = edct_table_80_fx; - move16(); BREAK; case 40: edct_table = edct_table_20_fx; - move16(); BREAK; case 800: edct_table = edct_table_400_fx; - move16(); *q = add( *q, 2 ); + move16(); BREAK; case 512: edct_table = edct_table_256_fx; - move16(); BREAK; case 480: edct_table = edct_table_240_fx; - move16(); BREAK; case 400: edct_table = edct_table_200_fx; - move16(); BREAK; case 128: edct_table = edct_table_64_fx; - move16(); BREAK; case 80: edct_table = edct_table_40_fx; - move16(); BREAK; default: BREAK; @@ -182,7 +188,7 @@ void edct_fx( Word16 i; Word32 re; Word32 im; - const Word16 *edct_table = 0; /*Q16 */ + const Word16 *edct_table; /*Q16 */ Word32 complex_buf[2 * ( L_FRAME48k / 2 + 240 )]; Word32 L_tmp; Word16 tmp; @@ -193,32 +199,34 @@ void edct_fx( /* Twiddling and Pre-rotate */ FOR( i = 0; i < len1; i++ ) { - L_tmp = Mult_32_16( x[2 * i], edct_table[i] ); /*Q(q+1) */ - complex_buf[2 * i] = Madd_32_16( L_tmp, x[length - 1 - 2 * i], edct_table[len1 - 1 - i] ); /*Q(q+1) */ + L_tmp = Mult_32_16( x[2 * i], edct_table[i] ); /*Q(q+1) */ + complex_buf[2 * i] = Madd_32_16( L_tmp, x[sub( length, add( 1, shl( i, 1 ) ) )], edct_table[sub( len1, add( 1, i ) )] ); /*Q(q+1) */ move32(); - L_tmp = Mult_32_16( x[length - 1 - 2 * i], edct_table[i] ); /*Q(q+1) */ + L_tmp = Mult_32_16( x[sub( length, add( 1, shl( i, 1 ) ) )], edct_table[i] ); /*Q(q+1) */ - complex_buf[2 * i + 1] = Msub_32_16( L_tmp, x[2 * i], edct_table[len1 - 1 - i] ); /*Q(q+1) */ + complex_buf[add( shl( i, 1 ), 1 )] = Msub_32_16( L_tmp, x[shl( i, 1 )], edct_table[sub( len1, add( 1, i ) )] ); /*Q(q+1) */ move32(); } *q = sub( 15, *q ); + move16(); BASOP_cfft( (cmplx *) complex_buf, len1, q, y ); tmp = div_s( 1, length ); /*Q15 */ tmp = round_fx( L_shl( L_mult( tmp, 19302 ), 2 ) ); /*Q15 */ FOR( i = 0; i < len1; i++ ) { - re = Msub_32_16( complex_buf[2 * i], complex_buf[2 * i + 1], tmp ); - im = Madd_32_16( complex_buf[2 * i + 1], complex_buf[2 * i], tmp ); - y[2 * i] = L_add( Mult_32_16( re, edct_table[i] ), Mult_32_16( im, edct_table[len1 - 1 - i] ) ); + re = Msub_32_16( complex_buf[2 * i], complex_buf[add( shl( i, 1 ), 1 )], tmp ); + im = Madd_32_16( complex_buf[add( shl( i, 1 ), 1 )], complex_buf[2 * i], tmp ); + y[2 * i] = L_add( Mult_32_16( re, edct_table[i] ), Mult_32_16( im, edct_table[sub( len1, add( 1, i ) )] ) ); move32(); - y[length - 1 - 2 * i] = L_sub( Mult_32_16( re, edct_table[len1 - 1 - i] ), Mult_32_16( im, edct_table[i] ) ); + y[sub( length, add( 1, shl( i, 1 ) ) )] = L_sub( Mult_32_16( re, edct_table[sub( len1, add( 1, i ) )] ), Mult_32_16( im, edct_table[i] ) ); move32(); } /*Q(q-2) */ *q = sub( 15 + 2, *q ); + move16(); return; } @@ -245,7 +253,7 @@ void edst_fx( Word16 i; Word32 re; Word32 im; - const Word16 *edct_table = 0; /*Q16 */ + const Word16 *edct_table; /*Q16 */ Word32 complex_buf[2 * ( L_FRAME48k / 2 + 240 )]; Word32 L_tmp; Word16 tmp; @@ -256,31 +264,33 @@ void edst_fx( /* Twiddling and Pre-rotate */ FOR( i = 0; i < len1; i++ ) { - L_tmp = Mult_32_16( x[length - 1 - 2 * i], edct_table[i] ); - complex_buf[2 * i] = Madd_32_16( L_tmp, x[2 * i], edct_table[len1 - 1 - i] ); + L_tmp = Mult_32_16( x[sub( length, add( 1, shl( i, 1 ) ) )], edct_table[i] ); + complex_buf[2 * i] = Madd_32_16( L_tmp, x[2 * i], edct_table[sub( len1, add( 1, i ) )] ); move32(); L_tmp = Mult_32_16( x[2 * i], edct_table[i] ); - complex_buf[2 * i + 1] = Msub_32_16( L_tmp, x[length - 1 - 2 * i], edct_table[len1 - 1 - i] ); + complex_buf[add( shl( i, 1 ), 1 )] = Msub_32_16( L_tmp, x[sub( length, add( 1, shl( i, 1 ) ) )], edct_table[sub( len1, add( 1, i ) )] ); move32(); } *q = sub( 15, *q ); + move16(); BASOP_cfft( (cmplx *) complex_buf, len1, q, y ); tmp = div_s( 1, length ); /*Q15 */ tmp = round_fx( L_shl( L_mult( tmp, 19302 ), 2 ) ); /*Q15 */ FOR( i = 0; i < len1; i++ ) { - re = Msub_32_16( complex_buf[2 * i], complex_buf[2 * i + 1], tmp ); - im = Madd_32_16( complex_buf[2 * i + 1], complex_buf[2 * i], tmp ); - y[2 * i] = L_add( Mult_32_16( re, edct_table[i] ), Mult_32_16( im, edct_table[len1 - 1 - i] ) ); + re = Msub_32_16( complex_buf[2 * i], complex_buf[add( shl( i, 1 ), 1 )], tmp ); + im = Madd_32_16( complex_buf[add( shl( i, 1 ), 1 )], complex_buf[2 * i], tmp ); + y[2 * i] = L_add( Mult_32_16( re, edct_table[i] ), Mult_32_16( im, edct_table[sub( len1, add( 1, i ) )] ) ); move32(); - y[length - 1 - 2 * i] = L_sub( Mult_32_16( im, edct_table[i] ), Mult_32_16( re, edct_table[len1 - 1 - i] ) ); + y[sub( length, add( 1, shl( i, 1 ) ) )] = L_sub( Mult_32_16( im, edct_table[i] ), Mult_32_16( re, edct_table[sub( len1, add( 1, i ) )] ) ); move32(); } /*Q(q) */ *q = sub( 15 + 2, *q ); + move16(); return; } @@ -316,7 +326,7 @@ void edct_16fx( Word16 i; Word16 re[L_FRAME48k / 2]; Word16 im[L_FRAME48k / 2]; - const Word16 *edct_table = 0; + const Word16 *edct_table = NULL; Word16 re2[L_FRAME48k / 2]; Word16 im2[L_FRAME48k / 2]; @@ -330,24 +340,23 @@ void edct_16fx( (void) element_mode; #endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; + Flag Overflow; + Overflow = 0; + move32(); #endif /*COMPLETE: some eDCT sub function are missing */ IF( EQ_16( length, L_FRAME32k ) ) { edct_table = &edct_table_320_16fx[0]; - move16(); } ELSE IF( EQ_16( length, L_FRAME ) ) { edct_table = &edct_table_128_16fx[0]; - move16(); } ELSE IF( EQ_16( length, L_FRAME16k ) ) { edct_table = &edct_table_160_16fx[0]; - move16(); } ELSE { @@ -356,8 +365,8 @@ void edct_16fx( /* Twiddling and Pre-rotate */ Lmax = L_deposit_l( 0 ); Len2 = shr( length, 1 ); - px = x + length - 1; - pt = edct_table + Len2 - 1; + px = x + sub( length, 1 ); + pt = edct_table + sub( Len2, 1 ); FOR( i = 0; i < Len2; i++ ) { i2 = shl( i, 1 ); @@ -376,14 +385,15 @@ void edct_16fx( } tmp = 31; + move16(); if ( Lmax != 0 ) { tmp = norm_l( Lmax ); } Q_edct = sub( tmp, bh ); /*creating a bit-headroom */ - px = x + length - 1; - pt = edct_table + Len2 - 1; + px = x + sub( length, 1 ); + pt = edct_table + sub( Len2, 1 ); FOR( i = 0; i < Len2; i++ ) { i2 = shl( i, 1 ); @@ -396,7 +406,7 @@ void edct_16fx( Lacc = L_mac( L_tmp, *px, *pt ); /*Q(Qx+16) */ re2[i] = round_fx( L_shl( Lacc, Q_edct ) ); /* Q(Qx+Q_edct) */ #endif - + move16(); L_tmp = L_mult( *px, edct_table[i] ); /*Q(Qx+16) */ #ifdef BASOP_NOGLOB Lacc = L_msu_o( L_tmp, x[i2], *pt, &Overflow ); /*Q(Qx+16) */ @@ -405,6 +415,7 @@ void edct_16fx( Lacc = L_msu( L_tmp, x[i2], *pt ); /*Q(Qx+16) */ im2[i] = round_fx( L_shl( Lacc, Q_edct ) ); /* Q(Qx+Q_edct) */ #endif + move16(); px -= 2; pt--; } @@ -426,7 +437,7 @@ void edct_16fx( tmp = div_s( 1, length ); /*Q15 */ L_tmp = L_mult( tmp, 19302 ); /*Q29, (3*PI/4) in Q13 */ fact = round_fx( L_shl( L_tmp, 2 ) ); /*Q15 */ - FOR( i = 0; i < length / 2; i++ ) + FOR( i = 0; i < shr( length, 1 ); i++ ) { tmp = mult_r( im2[i], fact ); /*Q(Qx+Q_edct) */ #ifdef BASOP_NOGLOB @@ -448,8 +459,8 @@ void edct_16fx( } /* Post-rotate and obtain the output data */ - py = y + length - 1; - pt = edct_table + Len2 - 1; + py = y + sub( length, 1 ); + pt = edct_table + sub( Len2, 1 ); FOR( i = 0; i < Len2; i++ ) { i2 = shl( i, 1 ); @@ -462,14 +473,16 @@ void edct_16fx( Lacc = L_mac( L_tmp, im[i], *pt ); /*Q(Qx+Q_edct+16) */ y[i2] = round_fx( L_shr( Lacc, Q_edct ) ); /* Q(Qx) */ #endif /* BASOP_NOGLOB */ + move16(); - L_tmp = L_mult( re[i], edct_table[length / 2 - 1 - i] ); /*Q(Qx+Q_edct+16) */ - Lacc = L_msu( L_tmp, im[i], edct_table[i] ); /*Q(Qx+Q_edct+16) */ + L_tmp = L_mult( re[i], edct_table[sub( shr( length, 1 ), add( 1, i ) )] ); /*Q(Qx+Q_edct+16) */ + Lacc = L_msu( L_tmp, im[i], edct_table[i] ); /*Q(Qx+Q_edct+16) */ #ifdef BASOP_NOGLOB *py = round_fx_o( L_shr_o( Lacc, Q_edct, &Overflow ), &Overflow ); /* Q(Qx) */ #else /* BASOP_NOGLOB */ *py = round_fx( L_shr( Lacc, Q_edct ) ); /* Q(Qx) */ #endif + move16(); py -= 2; pt--; @@ -521,13 +534,13 @@ void iedct_short_fx( } FOR( i = 0; i < seg_len_div4; i++ ) { - out[i] = alias[seg_len_div4 + i]; + out[i] = alias[add( seg_len_div4, i )]; move32(); - out[seg_len_div4 + i] = L_negate( alias[seg_len_div2 - 1 - i] ); + out[add( seg_len_div4, i )] = L_negate( alias[sub( sub( seg_len_div2, 1 ), i )] ); move32(); - out[seg_len_div2 + i] = L_negate( alias[seg_len_div4 - 1 - i] ); + out[add( seg_len_div2, i )] = L_negate( alias[sub( sub( seg_len_div4, 1 ), i )] ); move32(); - out[seg_len_3mul_div4 + i] = L_negate( alias[i] ); + out[add( seg_len_3mul_div4, i )] = L_negate( alias[i] ); move32(); } @@ -549,112 +562,132 @@ void edxt_fx( const UWord16 synthesis /* i : nonzero for inverse */ ) { - Word16 k, m, fac = 0; - const Word16 *cosPtr = NULL, *sinPtr = NULL; - Word16 n = 0; - + Word16 k, m, fac; + const Word16 *cosPtr, *sinPtr; + Word16 n; + n = 0; + move16(); + cosPtr = NULL; + sinPtr = NULL; IF( EQ_16( length, 512 ) ) { cosPtr = cos_scale_tbl_512; sinPtr = sin_scale_tbl_512; n = 1; + move16(); } ELSE IF( EQ_16( length, 256 ) ) { cosPtr = cos_scale_tbl_512; sinPtr = sin_scale_tbl_512; n = 2; + move16(); } ELSE IF( EQ_16( length, 128 ) ) { cosPtr = cos_scale_tbl_512; sinPtr = sin_scale_tbl_512; n = 4; + move16(); } ELSE IF( EQ_16( length, 640 ) ) { cosPtr = cos_scale_tbl_640; sinPtr = sin_scale_tbl_640; n = 1; + move16(); } ELSE IF( EQ_16( length, 320 ) ) { cosPtr = cos_scale_tbl_640; sinPtr = sin_scale_tbl_640; n = 2; + move16(); } ELSE IF( EQ_16( length, 160 ) ) { cosPtr = cos_scale_tbl_640; sinPtr = sin_scale_tbl_640; n = 4; + move16(); } ELSE IF( EQ_16( length, 80 ) ) { cosPtr = cos_scale_tbl_640; sinPtr = sin_scale_tbl_640; n = 8; + move16(); } ELSE IF( EQ_16( length, 40 ) ) { cosPtr = cos_scale_tbl_640; sinPtr = sin_scale_tbl_640; n = 16; + move16(); } ELSE IF( EQ_16( length, 960 ) ) { cosPtr = cos_scale_tbl_960; sinPtr = sin_scale_tbl_960; n = 1; + move16(); } ELSE IF( EQ_16( length, 480 ) ) { cosPtr = cos_scale_tbl_960; sinPtr = sin_scale_tbl_960; n = 2; + move16(); } ELSE IF( EQ_16( length, 240 ) ) { cosPtr = cos_scale_tbl_960; sinPtr = sin_scale_tbl_960; n = 4; + move16(); } ELSE IF( EQ_16( length, 120 ) ) { cosPtr = cos_scale_tbl_960; sinPtr = sin_scale_tbl_960; n = 8; + move16(); } ELSE IF( EQ_16( length, 1200 ) ) { cosPtr = cos_scale_tbl_1200; sinPtr = sin_scale_tbl_1200; n = 1; + move16(); } ELSE IF( EQ_16( length, 800 ) ) { cosPtr = cos_scale_tbl_800; sinPtr = sin_scale_tbl_800; n = 1; + move16(); } ELSE IF( EQ_16( length, 400 ) ) { cosPtr = cos_scale_tbl_800; sinPtr = sin_scale_tbl_800; n = 2; + move16(); } ELSE IF( EQ_16( length, 200 ) ) { cosPtr = cos_scale_tbl_800; sinPtr = sin_scale_tbl_800; n = 4; + move16(); } #ifdef FAST_EDXT + test(); IF( EQ_16( kernelType, MDST_II ) || EQ_16( kernelType, MDCT_II ) ) { const Word16 Nm1 = sub( length, 1 ); - const Word16 xSign = 2 * ( kernelType >> 1 ) - 1; + const Word16 xSign = sub( imult1616( 2, shr( kernelType, 1 ) ), 1 ); Word32 re[L_FRAME_PLUS]; Word32 im[L_FRAME_PLUS]; @@ -663,8 +696,11 @@ void edxt_fx( FOR( k = shr( Nm1, 1 ); k >= 0; k-- ) /* pre-modulation of audio input */ { re[k] = x[2 * k]; - re[Nm1 - k] = Mpy_32_16_1( x[2 * k + 1], shl_sat( xSign, 15 ) ); - im[k] = im[Nm1 - k] = 0; + re[sub( Nm1, k )] = Mpy_32_16_1( x[add( shl( k, 1 ), 1 )], shl_sat( xSign, 15 ) ); + im[k] = im[sub( Nm1, k )] = 0; + move32(); + move32(); + move32(); } IF( EQ_16( length, 512 ) ) @@ -682,13 +718,16 @@ void edxt_fx( { // const float wRe = cosf( scale * k ); // const float wIm = sinf( scale * k ); - const Word16 wRe = cosPtr[k * n]; - const Word16 wIm = sinPtr[k * n]; + const Word16 wRe = cosPtr[imult1616( k, n )]; + const Word16 wIm = sinPtr[imult1616( k, n )]; y[k] /*pt 1*/ = L_add( Mpy_32_16_1( re[k], wRe ), Mpy_32_16_1( im[k], wIm ) ); - y[length - k] = L_sub( Mpy_32_16_1( re[k], wIm ), Mpy_32_16_1( im[k], wRe ) ); + y[sub( length, k )] = L_sub( Mpy_32_16_1( re[k], wIm ), Mpy_32_16_1( im[k], wRe ) ); + move32(); + move32(); } y[shr( length, 1 )] = Mpy_32_16_1( re[shr( length, 1 )], INV_SQRT_2_Q15 ); + move32(); } ELSE /* forw. DST-II */ { @@ -696,16 +735,20 @@ void edxt_fx( { // const float wRe = cosf( scale * k ); // const float wIm = sinf( scale * k ); - const Word16 wRe = cosPtr[k * n]; - const Word16 wIm = sinPtr[k * n]; + const Word16 wRe = cosPtr[imult1616( k, n )]; + const Word16 wIm = sinPtr[imult1616( k, n )]; - y[Nm1 - k] = L_add( Mpy_32_16_1( re[k], wRe ), Mpy_32_16_1( im[k], wIm ) ); + y[sub( Nm1, k )] = L_add( Mpy_32_16_1( re[k], wRe ), Mpy_32_16_1( im[k], wIm ) ); y[k - 1] = L_sub( Mpy_32_16_1( re[k], wIm ), Mpy_32_16_1( im[k], wRe ) ); + move32(); + move32(); } y[shr( Nm1, 1 )] = Mpy_32_16_1( re[shr( length, 1 )], INV_SQRT_2_Q15 ); + move32(); } - y[Nm1 - Nm1 * ( kernelType >> 1 )] = L_shr( re[0], 1 ); + y[sub( Nm1, imult1616( Nm1, shl( kernelType, 1 ) ) )] = L_shr( re[0], 1 ); + move32(); } ELSE /* inverse II = III */ { @@ -715,13 +758,16 @@ void edxt_fx( { // const float wRe = cosf( scale * k ) * 0.5f; // const float wIm = sinf( scale * k ) * 0.5f; - const Word16 wRe = shr( cosPtr[k * n], 1 ); - const Word16 wIm = shr( sinPtr[k * n], 1 ); + const Word16 wRe = shr( cosPtr[imult1616( k, n )], 1 ); + const Word16 wIm = shr( sinPtr[imult1616( k, n )], 1 ); - re[k] = L_add( Mpy_32_16_1( x[k], wRe ), Mpy_32_16_1( x[length - k], wIm ) ); - im[k] = L_sub( Mpy_32_16_1( x[length - k], wRe ), Mpy_32_16_1( x[k], wIm ) ); + re[k] = L_add( Mpy_32_16_1( x[k], wRe ), Mpy_32_16_1( x[sub( length, k )], wIm ) ); + im[k] = L_sub( Mpy_32_16_1( x[sub( length, k )], wRe ), Mpy_32_16_1( x[k], wIm ) ); + move32(); + move32(); } re[shr( length, 1 )] = Mpy_32_16_1( x[shr( length, 1 )], INV_SQRT_2_Q15 ); + move32(); } ELSE /* DST type III */ { @@ -729,21 +775,28 @@ void edxt_fx( { // const float wRe = cosf( scale * k ) * 0.5f; // const float wIm = sinf( scale * k ) * 0.5f; - const Word16 wRe = shr( cosPtr[k * n], 1 ); - const Word16 wIm = shr( sinPtr[k * n], 1 ); + const Word16 wRe = shr( cosPtr[imult1616( k, n )], 1 ); + const Word16 wIm = shr( sinPtr[imult1616( k, n )], 1 ); - re[k] = L_add( Mpy_32_16_1( x[Nm1 - k], wRe ), Mpy_32_16_1( x[k - 1], wIm ) ); - im[k] = L_sub( Mpy_32_16_1( x[k - 1], wRe ), Mpy_32_16_1( x[Nm1 - k], wIm ) ); + re[k] = L_add( Mpy_32_16_1( x[sub( Nm1, k )], wRe ), Mpy_32_16_1( x[sub( k, 1 )], wIm ) ); + im[k] = L_sub( Mpy_32_16_1( x[sub( k, 1 )], wRe ), Mpy_32_16_1( x[sub( Nm1, k )], wIm ) ); + move32(); + move32(); } re[shr( length, 1 )] = Mpy_32_16_1( x[shr( Nm1, 1 )], INV_SQRT_2_Q15 ); + move32(); } - re[0] = x[Nm1 - Nm1 * shr( kernelType, 1 )]; + re[0] = x[sub( Nm1, imult1616( Nm1, shr( kernelType, 1 ) ) )]; im[0] = im[shr( length, 1 )] = 0; + move32(); + move32(); FOR( k = shr( Nm1, 1 ); k > 0; k-- ) { - re[length - k] = re[k]; - im[length - k] = L_negate( im[k] ); + re[sub( length, k )] = re[k]; + im[sub( length, k )] = L_negate( im[k] ); + move32(); + move32(); } IF( EQ_16( length, 512 ) ) @@ -758,14 +811,16 @@ void edxt_fx( FOR( k = shr( Nm1, 1 ); k >= 0; k-- ) /* post-modulation of FFT output */ { y[2 * k] = re[k]; - IF( NE_16( xSign, 0 ) ) + move32(); + IF( xSign != 0 ) { - y[2 * k + 1] = Mpy_32_16_1( re[sub( Nm1, k )], shl_sat( xSign, 15 ) ); + y[add( shl( k, 1 ), 1 )] = Mpy_32_16_1( re[sub( Nm1, k )], shl_sat( xSign, 15 ) ); } ELSE { - y[2 * k + 1] = 0; + y[add( shl( k, 1 ), 1 )] = 0; } + move32(); } } } @@ -812,7 +867,7 @@ void edxt_fx( #endif // IVAS_FLOAT_FIXED_TO_BE_DONE /*v_multc(y, (kernelType == MDCT_II ? -1.f : 1.f) * sqrtf(2.f / length), y, length);*/ fac = get_edxt_factor( length ); /* Q15 */ - IF( EQ_16( kernelType, MDCT_II ) ) + if ( EQ_16( kernelType, MDCT_II ) ) { fac = negate( fac ); } @@ -820,6 +875,7 @@ void edxt_fx( FOR( m = 0; m < length; m++ ) { y[m] = Mpy_32_16_1( y[m], fac ); + move32(); } return; } diff --git a/lib_com/enhancer_fx.c b/lib_com/enhancer_fx.c index 6336dd685..2482bf58b 100644 --- a/lib_com/enhancer_fx.c +++ b/lib_com/enhancer_fx.c @@ -25,38 +25,38 @@ static void phase_dispersion_fx( Word32 gain_code, Word16 gain_pit, Word16 code[ static void agc2_fx( const Word16 *sig_in, Word16 *sig_out, const Word16 l_trm ); /*======================================================================================*/ -/* FUNCTION : enhancer_fx() */ +/* FUNCTION : enhancer_fx() */ /*--------------------------------------------------------------------------------------*/ -/* PURPOSE : Enhancement of the excitation signal before synthesis */ +/* PURPOSE : Enhancement of the excitation signal before synthesis */ /*--------------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word32) core_brate : decoder bitrate */ -/* _ (Word16) Opt_AMR_WB : flag indicating AMR-WB IO mode */ -/* _ (Word16) coder_type : coder type */ -/* _ (Word16) i_subfr : subframe number */ -/* _ (Word16) voice_fac : subframe voicing estimation (Q15) */ -/* _ (Word16) stab_fac : LP filter stablility measure (Q15) */ -/* _ (Word32) norm_gain_code : normalised innovative cb. gain (Q16) */ -/* _ (Word16) gain_inov : gain of the unscaled innovation (Q12) */ -/* _ (Word16) gain_pit_fx : Pitch gain (Q14) */ -/* _ (Word16) Q_exc : Q of the excitation */ -/* _ (Word16) Enc : Encoder = 1; decoder = 0 */ +/* INPUT ARGUMENTS : */ +/* _ (Word32) core_brate : decoder bitrate */ +/* _ (Word16) Opt_AMR_WB : flag indicating AMR-WB IO mode */ +/* _ (Word16) coder_type : coder type */ +/* _ (Word16) i_subfr : subframe number */ +/* _ (Word16) voice_fac : subframe voicing estimation (Q15) */ +/* _ (Word16) stab_fac : LP filter stablility measure (Q15) */ +/* _ (Word32) norm_gain_code : normalised innovative cb. gain (Q16) */ +/* _ (Word16) gain_inov : gain of the unscaled innovation (Q12) */ +/* _ (Word16) gain_pit_fx : Pitch gain (Q14) */ +/* _ (Word16) Q_exc : Q of the excitation */ +/* _ (Word16) Enc : Encoder = 1; decoder = 0 */ /*--------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) voice_factors_fx : TBE voicing factor (Q15) */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16*) voice_factors_fx : TBE voicing factor (Q15) */ /*--------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word32*) gc_threshold : gain code threshold (Q16) */ -/* _ (Word16*[]) code : innovation (Q12) */ -/* _ (Word16*[]) exc2 : adapt. excitation/total exc (Q0) */ -/* _ (struct dispMem_fx*) dm_fx : phase dispersion algorithm memory */ -/* (a[0]->Q0,a[1]->Q16,a[2-7]->Q14) */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ (Word32*) gc_threshold : gain code threshold (Q16) */ +/* _ (Word16*[]) code : innovation (Q12) */ +/* _ (Word16*[]) exc2 : adapt. excitation/total exc (Q0) */ +/* _ (struct dispMem_fx*) dm_fx : phase dispersion algorithm memory */ +/* (a[0]->Q0,a[1]->Q16,a[2-7]->Q14) */ /*--------------------------------------------------------------------------------------*/ -/* _ None */ +/* _ None */ /*--------------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*======================================================================================*/ void enhancer_fx( const Word32 core_brate, /* i : decoder bitrate */ @@ -87,7 +87,6 @@ void enhancer_fx( pit_sharp = gain_pit; move16(); /* to remove gcc warning */ pt_exc2 = exc2 + i_subfr; - move16(); /*------------------------------------------------------------* * Phase dispersion to enhance noise at low bit rate @@ -120,7 +119,7 @@ void enhancer_fx( i = 0; move16(); /* high dispersion */ } - ELSE if ( ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) || EQ_16( coder_type, AUDIO ) || EQ_16( coder_type, INACTIVE ) ) && LE_32( core_brate, ACELP_9k60 ) ) + ELSE if ( ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) || EQ_16( coder_type, AUDIO ) || coder_type == INACTIVE ) && LE_32( core_brate, ACELP_9k60 ) ) { i = 1; move16(); /* low dispersion */ @@ -186,6 +185,7 @@ void enhancer_fx( FOR( i = 0; i < L_SUBFR; i++ ) { pt_exc2[i] = round_fx( L_shl( L_mult( gain_code_hi, code[i] ), sc ) ); /*Q0 */ /* code in Q12 (Q9 for encoder) */ + move16(); } } ELSE @@ -236,9 +236,11 @@ void enhancer_fx( #ifdef BASOP_NOGLOB L_tmp = L_shl_sat( L_mult( gain_code_hi, extract_h( L_tmp ) ), sc ); pt_exc2[0] = msu_r_sat( L_tmp, -32768, pt_exc2[0] ); + move16(); #else L_tmp = L_shl( L_mult( gain_code_hi, extract_h( L_tmp ) ), sc ); pt_exc2[0] = msu_r( L_tmp, -32768, pt_exc2[0] ); + move16(); #endif move16(); /* in Q_exc */ @@ -251,6 +253,7 @@ void enhancer_fx( tmp16 = msu_r_sat( L_tmp, code[i - 1], tmp ); L_tmp = L_shl_sat( L_mult( gain_code_hi, tmp16 ), sc ); pt_exc2[i] = msu_r_sat( L_tmp, -32768, pt_exc2[i] ); + move16(); #else tmp16 = msu_r( L_tmp, code[i - 1], tmp ); L_tmp = L_shl( L_mult( gain_code_hi, tmp16 ), sc ); @@ -265,8 +268,10 @@ void enhancer_fx( L_tmp = L_shl( L_mult( gain_code_hi, extract_h( L_tmp ) ), sc ); #ifdef BASOP_NOGLOB pt_exc2[L_SUBFR - 1] = msu_r_sat( L_tmp, -32768, pt_exc2[L_SUBFR - 1] ); + move16(); #else pt_exc2[L_SUBFR - 1] = msu_r( L_tmp, -32768, pt_exc2[L_SUBFR - 1] ); + move16(); #endif move16(); /* in Q_exc */ test(); @@ -294,38 +299,38 @@ void enhancer_fx( /*======================================================================================*/ -/* FUNCTION : enhancer_fx() */ +/* FUNCTION : enhancer_fx() */ /*--------------------------------------------------------------------------------------*/ -/* PURPOSE : Enhancement of the excitation signal before synthesis */ +/* PURPOSE : Enhancement of the excitation signal before synthesis */ /*--------------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word32) core_brate : decoder bitrate */ -/* _ (Word16) Opt_AMR_WB : flag indicating AMR-WB IO mode */ -/* _ (Word16) coder_type : coder type */ -/* _ (Word16) i_subfr : subframe number */ -/* _ (Word16) voice_fac : subframe voicing estimation (Q15) */ -/* _ (Word16) stab_fac : LP filter stablility measure (Q15) */ -/* _ (Word32) norm_gain_code : normalised innovative cb. gain (Q16) */ -/* _ (Word16) gain_inov : gain of the unscaled innovation (Q12) */ -/* _ (Word16) gain_pit_fx : Pitch gain (Q14) */ -/* _ (Word16) Q_exc : Q of the excitation */ -/* _ (Word16) Enc : Encoder = 1; decoder = 0 */ +/* INPUT ARGUMENTS : */ +/* _ (Word32) core_brate : decoder bitrate */ +/* _ (Word16) Opt_AMR_WB : flag indicating AMR-WB IO mode */ +/* _ (Word16) coder_type : coder type */ +/* _ (Word16) i_subfr : subframe number */ +/* _ (Word16) voice_fac : subframe voicing estimation (Q15) */ +/* _ (Word16) stab_fac : LP filter stablility measure (Q15) */ +/* _ (Word32) norm_gain_code : normalised innovative cb. gain (Q16) */ +/* _ (Word16) gain_inov : gain of the unscaled innovation (Q12) */ +/* _ (Word16) gain_pit_fx : Pitch gain (Q14) */ +/* _ (Word16) Q_exc : Q of the excitation */ +/* _ (Word16) Enc : Encoder = 1; decoder = 0 */ /*--------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) voice_factors_fx : TBE voicing factor (Q15) */ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16*) voice_factors_fx : TBE voicing factor (Q15) */ /*--------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word32*) gc_threshold : gain code threshold (Q16) */ -/* _ (Word16*[]) code : innovation (Q12) */ -/* _ (Word16*[]) exc2 : adapt. excitation/total exc (Q0) */ -/* _ (struct dispMem_fx*) dm_fx : phase dispersion algorithm memory */ -/* (a[0]->Q0,a[1]->Q16,a[2-7]->Q14) */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ (Word32*) gc_threshold : gain code threshold (Q16) */ +/* _ (Word16*[]) code : innovation (Q12) */ +/* _ (Word16*[]) exc2 : adapt. excitation/total exc (Q0) */ +/* _ (struct dispMem_fx*) dm_fx : phase dispersion algorithm memory */ +/* (a[0]->Q0,a[1]->Q16,a[2-7]->Q14) */ /*--------------------------------------------------------------------------------------*/ -/* _ None */ +/* _ None */ /*--------------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*======================================================================================*/ void enhancer_ivas_fx( const Word16 codec_mode, /* i : flag indicating Codec Mode */ @@ -358,7 +363,6 @@ void enhancer_ivas_fx( pit_sharp = gain_pit; move16(); /* to remove gcc warning */ pt_exc2 = exc2 + i_subfr; - move16(); /*------------------------------------------------------------* * Phase dispersion to enhance noise at low bit rate @@ -366,6 +370,9 @@ void enhancer_ivas_fx( i = 2; move16(); /* no dispersion */ + test(); + test(); + test(); IF( Opt_AMR_WB ) { IF( LE_32( core_brate, ACELP_6k60 ) ) @@ -391,7 +398,7 @@ void enhancer_ivas_fx( i = 0; move16(); /* high dispersion */ } - ELSE IF( ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) || EQ_16( coder_type, AUDIO ) || EQ_16( coder_type, INACTIVE ) ) && LE_32( core_brate, ACELP_9k60 ) ) + ELSE IF( ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) || EQ_16( coder_type, AUDIO ) || coder_type == INACTIVE ) && LE_32( core_brate, ACELP_9k60 ) ) { i = 1; move16(); /* low dispersion */ @@ -399,18 +406,29 @@ void enhancer_ivas_fx( } ELSE IF( EQ_16( codec_mode, MODE2 ) ) { + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); IF( ( NE_16( coder_type, VOICED ) && LE_16( cbk_index, 2 ) ) || ( EQ_16( coder_type, UNVOICED ) && EQ_16( L_frame, L_FRAME ) && LE_16( cbk_index, 10 ) ) || ( EQ_16( coder_type, UNVOICED ) && EQ_16( L_frame, L_FRAME16k ) && LE_16( cbk_index, 14 ) ) ) { i = 0; /* high dispersion */ + move16(); } ELSE IF( NE_16( coder_type, VOICED ) && LE_16( cbk_index, 7 ) ) { i = 1; /* low dispersion */ + move16(); } } ELSE IF( EQ_16( codec_mode, MODE1 ) && EQ_16( coder_type, UNVOICED ) && cbk_index /*uc_two_stage_flag*/ ) { i = 0; /* high dispersion */ + move16(); } phase_dispersion_fx( norm_gain_code, gain_pit, code, i, dm_fx ); @@ -472,6 +490,7 @@ void enhancer_ivas_fx( FOR( i = 0; i < L_SUBFR; i++ ) { pt_exc2[i] = round_fx( L_shl( L_mult( gain_code_hi, code[i] ), sc ) ); /*Q0 */ /* code in Q12 (Q9 for encoder) */ + move16(); } } ELSE @@ -593,7 +612,7 @@ Word16 E_UTIL_enhancer( move16(); code_exp = 15 - 9; - exc2_exp = 15 - Q_new; + exc2_exp = sub( 15, Q_new ); gain_inov = shr( gain_inov, 1 ); /*-----------------------------------------------------------------* * Phase dispersion to enhance noise at low bit rates @@ -659,8 +678,9 @@ Word16 E_UTIL_enhancer( L_tmp = Mpy_32_32( L_tmp, 1804608000l /*1.0f/1.19f Q31*/ ); L_tmp = L_max( L_tmp, *gc_threshold ); } - move32(); + *gc_threshold = L_tmp; /* in 15Q16 */ + move32(); /* gain = ( (fac * L_tmp) + (gain_code - fac*gain_code) ) * gain_inov */ /* exponent of L_tmp: 31-16 + 15-11 */ @@ -670,7 +690,6 @@ Word16 E_UTIL_enhancer( tmp = norm_l( L_tmp ); /* exponent of code: 31-16 + 15-11 - tmp + code_exp */ - move16(); code_exp = sub( add( 31 - 16 + 15 - 11, code_exp ), tmp ); #ifdef BASOP_NOGLOB @@ -699,7 +718,7 @@ Word16 E_UTIL_enhancer( gain = add( sub( code_exp, exc2_exp ), 1 ); tmp = mac_r( 268435456l /*0.125f Q31*/, 4096 /*0.125f Q15*/, voice_fac ); /* 0.25=voiced, 0=unvoiced */ - if ( EQ_16( L_frame, L_FRAME16k ) ) + IF( EQ_16( L_frame, L_FRAME16k ) ) { tmp = mac_r( 322122560l /*0.150f Q31*/, 4915 /*0.150f Q15*/, voice_fac ); /* 0.30=voiced, 0=unvoiced */ } @@ -707,7 +726,7 @@ Word16 E_UTIL_enhancer( /* exc2[0] = exc2[0] + code[0] - tmp*code[1]; */ L_tmp = L_mult( code[0], 16384 ); L_tmp = L_msu0( L_tmp, tmp, code[1] ); - if ( gain ) + IF( gain ) { #ifdef BASOP_NOGLOB L_tmp = L_shl_sat( L_tmp, gain ); @@ -722,14 +741,14 @@ Word16 E_UTIL_enhancer( #endif move16(); - FOR( i = 1; i < L_subfr - 1; i++ ) + FOR( i = 1; i < sub( L_subfr, 1 ); i++ ) { /* exc2[i] = exc2[i] + code[i] - tmp*(code[i+1]+code[i-1]); */ L_tmp = L_mult( code[i], 16384 ); #ifdef BASOP_NOGLOB L_tmp = L_msu0_sat( L_tmp, tmp, code[i - 1] ); L_tmp = L_msu0_sat( L_tmp, tmp, code[i + 1] ); - if ( gain ) + IF( gain ) { L_tmp = L_shl_sat( L_tmp, gain ); } @@ -749,7 +768,7 @@ Word16 E_UTIL_enhancer( L_tmp = L_mult( code[i], 16384 ); #ifdef BASOP_NOGLOB L_tmp = L_msu0_sat( L_tmp, tmp, code[i - 1] ); - if ( gain ) + IF( gain ) { L_tmp = L_shl_sat( L_tmp, gain ); } @@ -774,28 +793,28 @@ Word16 E_UTIL_enhancer( * post-processing to enhance noise in low bit rate. *-----------------------------------------------------------------------*/ /*======================================================================================*/ -/* FUNCTION : phase_dispersion_fx() */ +/* FUNCTION : phase_dispersion_fx() */ /*--------------------------------------------------------------------------------------*/ -/* PURPOSE : post-processing to enhance noise in low bit rate. */ +/* PURPOSE : post-processing to enhance noise in low bit rate. */ /*--------------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word32) gain_code : gain of code Q16 */ -/* _ (Word16) gain_pit : gain of pitch Q14 */ -/* _ (Word16) mode : level, 0=hi, 1=lo, 2=off */ +/* INPUT ARGUMENTS : */ +/* _ (Word32) gain_code : gain of code Q16 */ +/* _ (Word16) gain_pit : gain of pitch Q14 */ +/* _ (Word16) mode : level, 0=hi, 1=lo, 2=off */ /*--------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ None */ +/* OUTPUT ARGUMENTS : */ +/* _ None */ /*--------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word16[]) code : code vector (Q12) */ -/* _ (struct dispMem_fx*) dm_fx : static memory (size = 8) */ -/* (a[0]->Q0,a[1]->Q16,a[2-7]->Q14) */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ (Word16[]) code : code vector (Q12) */ +/* _ (struct dispMem_fx*) dm_fx : static memory (size = 8) */ +/* (a[0]->Q0,a[1]->Q16,a[2-7]->Q14) */ /*--------------------------------------------------------------------------------------*/ -/* _ None */ +/* _ None */ /*--------------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*======================================================================================*/ static void phase_dispersion_fx( Word32 gain_code, /* i : gain of code Q16 */ @@ -886,26 +905,19 @@ static void phase_dispersion_fx( r_fft_fx_lc( phs_tbl_dec, SIZE, SIZE2, NUM_STAGES, code, code2, 1 ); h_real = Mid_H_phasedisp; - move16(); if ( state == 0 ) { h_real = Low_H_phasedisp; - move16(); } /* FFT Coefs are in code2 */ code2_real = code2; - move16(); code2_imag = code2 + L_SUBFR - 1; - move16(); code_real = code; - move16(); code_imag = code + L_SUBFR - 1; - move16(); h_imag = h_real + L_SUBFR - 1; - move16(); *code_real++ = mult( *code2_real++, *h_real++ ); move16(); /* DC */ @@ -937,25 +949,25 @@ static void phase_dispersion_fx( } /*======================================================================================*/ -/* FUNCTION : agc2_fx() */ +/* FUNCTION : agc2_fx() */ /*--------------------------------------------------------------------------------------*/ -/* PURPOSE : AGC post-processing for lower G722.2 modes */ +/* PURPOSE : AGC post-processing for lower G722.2 modes */ /*--------------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16*[]) sig_in : postfilter input signal (Q0) */ -/* _ (Word16) l_trm : subframe size */ +/* INPUT ARGUMENTS : */ +/* _ (Word16*[]) sig_in : postfilter input signal (Q0) */ +/* _ (Word16) l_trm : subframe size */ /*--------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ None */ +/* OUTPUT ARGUMENTS : */ +/* _ None */ /*--------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word16*[]) sig_out : postfilter output signal (Q0) */ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ (Word16*[]) sig_out : postfilter output signal (Q0) */ /*--------------------------------------------------------------------------------------*/ -/* _ None */ +/* _ None */ /*--------------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ +/* RETURN ARGUMENTS : */ +/* _ None */ /*======================================================================================*/ static void agc2_fx( const Word16 *sig_in, /* i : postfilter input signal */ @@ -1034,6 +1046,7 @@ static void agc2_fx( #else sig_out[i] = round_fx( L_shl( L_mac( -8192, sig_out[i], g0 ), 2 ) ); #endif + move16(); } } } diff --git a/lib_com/fd_cng_com.c b/lib_com/fd_cng_com.c index 32df6893f..8a03d64ca 100644 --- a/lib_com/fd_cng_com.c +++ b/lib_com/fd_cng_com.c @@ -957,7 +957,6 @@ void SynthesisSTFT_flt( void SynthesisSTFT_fx( Word32 *fftBuffer, /* i : FFT bins */ - Word16 Q_in, Word32 *timeDomainOutput, Word32 *olapBuffer, const Word16 *olapWin, @@ -1064,11 +1063,11 @@ void SynthesisSTFT_fx( // floatToFixed_arr( hFdCngCom->A_cng_flt, hFdCngCom->A_cng, Q13, M + 1 ); // residu_ivas_fx( hFdCngCom->A_cng, Q13, M, buf_fx + 1 + M, hFdCngCom->exc_cng_32fx, hFdCngCom->frameSize ); - residu_ivas_fx( hFdCngCom->A_cng, sub( 15, norm_s( hFdCngCom->A_cng[0] - 1 ) ), M, buf_fx + 1 + M, hFdCngCom->exc_cng_32fx, hFdCngCom->frameSize ); - for ( i = 0; i < hFdCngCom->frameSize; i++ ) - { - hFdCngCom->exc_cng_flt[i] = fix_to_float( hFdCngCom->exc_cng_32fx[i], sub( Q_in, 9 ) ); - } + residu_ivas_fx( hFdCngCom->A_cng, ( 15 - norm_s( hFdCngCom->A_cng[0] - 1 ) ), M, buf_fx + 1 + M, hFdCngCom->exc_cng_32fx, hFdCngCom->frameSize ); + // for ( i = 0; i < hFdCngCom->frameSize; i++ ) + //{ + // hFdCngCom->exc_cng_flt[i] = fix_to_float( hFdCngCom->exc_cng_32fx[i], Q_in - 9 ); + // } return; } diff --git a/lib_com/fd_cng_com_fx.c b/lib_com/fd_cng_com_fx.c index 7ba5cf7c6..9e0f2e375 100644 --- a/lib_com/fd_cng_com_fx.c +++ b/lib_com/fd_cng_com_fx.c @@ -2174,7 +2174,14 @@ void scalebands_fx( nint = sub( midband[j], midband[j - 1] ); /* log-linear interpolation */ - partpowLD64 = BASOP_Util_Log2( L_add( partpow[j], DELTA_FX ) ); + IF( NE_32( partpow[j], MAX_32 ) ) + { + partpowLD64 = BASOP_Util_Log2( L_add( partpow[j], DELTA_FX ) ); + } + ELSE + { + partpowLD64 = BASOP_Util_Log2( partpow[j] ); + } tmp = L_sub( partpowLD64, partpowLD64M1 ); tmp = Mpy_32_16_1( tmp, getNormReciprocalWord16( nint ) ); diff --git a/lib_com/int_lsp.c b/lib_com/int_lsp.c index a340281f7..a79a6bba5 100644 --- a/lib_com/int_lsp.c +++ b/lib_com/int_lsp.c @@ -130,13 +130,17 @@ void int_lsp_fx( move16(); fold = sub( 32767, fnew ); /* 1.0 - fac_new */ if ( fold != 0 ) + { fold = add( fold, 1 ); + } FOR( i = 0; i < m; i++ ) { L_tmp = L_mult( lsp_old[i], fold ); L_tmp = L_mac( L_tmp, lsp_new[i], fnew ); - if ( fold == 0 ) + IF( fold == 0 ) + { L_tmp = L_mac( L_tmp, lsp_new[i], 1 ); /* 'fnew' should have been 32768 */ + } lsp[i] = round_fx( L_tmp ); } IF( Opt_AMR_WB ) @@ -302,7 +306,7 @@ void int_lsp4_fx( move16(); E_LPC_f_lsp_a_conversion( lsp, Aq, m ); - Aq += ( m + 1 ); + Aq += add( m, 1 ); move16(); } diff --git a/lib_com/interleave_spectrum.c b/lib_com/interleave_spectrum.c index 12e628fb7..f5e6acf31 100644 --- a/lib_com/interleave_spectrum.c +++ b/lib_com/interleave_spectrum.c @@ -321,6 +321,7 @@ void ivas_de_interleave_spectrum_fx( grps = N_INTL_GRP_48; move16(); l_frame = L_FRAME48k; + move16(); p2 = coefs_out + sublen[2]; /* 240, length/4 */ p3 = coefs_out + sublen[4]; /* 480, 2*length/4 */ p4 = coefs_out + sublen[5]; /* 720, 3*length/4 */ diff --git a/lib_com/isf_dec_amr_wb_fx.c b/lib_com/isf_dec_amr_wb_fx.c index b97bee56d..4327339b8 100644 --- a/lib_com/isf_dec_amr_wb_fx.c +++ b/lib_com/isf_dec_amr_wb_fx.c @@ -146,7 +146,7 @@ void isf_dec_amr_wb_fx( * A(z) calculation *-------------------------------------------------------------------------------------*/ - if ( st->rate_switching_reset ) + IF( st->rate_switching_reset ) { /*extrapolation instead of interpolation*/ Copy( isp_new, st->lsp_old_fx, M ); @@ -160,13 +160,15 @@ void isf_dec_amr_wb_fx( * Check ISF stability : distance between old ISF and current ISF *------------------------------------------------------------------*/ - IF( EQ_16( st->element_mode, EVS_MONO ) ) + IF( st->element_mode == EVS_MONO ) { st->stab_fac_fx = lsf_stab_fx( isf_new, st->lsf_old_fx, 1, st->L_frame ); + move16(); } - else + ELSE { st->stab_fac_fx = lsf_stab_ivas_fx( isf_new, st->lsf_old_fx, 1, st->L_frame ); + move16(); } return; diff --git a/lib_com/ivas_agc_com_fx.c b/lib_com/ivas_agc_com_fx.c index 3b8a95e93..c173e79a2 100644 --- a/lib_com/ivas_agc_com_fx.c +++ b/lib_com/ivas_agc_com_fx.c @@ -45,9 +45,9 @@ * Local constants *------------------------------------------------------------------------------------------*/ -#define SQRKMAX ( 1.5f ) -#define NBITS_DIFFG ( 2 ) -#define DBSTEP ( -6.f ) /* desired dB step value in dB*/ +//#define SQRKMAX ( 1.5f ) +//#define NBITS_DIFFG ( 2 ) +//#define DBSTEP ( -6.f ) /* desired dB step value in dB*/ #define ABS_EMIN_MAX ( 3 ) #define MAXATTEXP ( 1 ) /* the desired maximum attenuation exponent range per frame*/ @@ -70,6 +70,7 @@ void ivas_agc_initWindowFunc_fx( const Word16 *cos_val; a = A_FX; /* for DBSTEP -6.f */ + move16(); SWITCH( length ) { @@ -87,9 +88,10 @@ void ivas_agc_initWindowFunc_fx( BREAK; } - for ( i = 0; i < length; i++ ) + FOR( i = 0; i < length; i++ ) { - pWinFunc[i] = add( MAX_16, (Word16) Mpy_32_16_1( L_sub( (Word32) cos_val[i], (Word32) MAX_16 ), a ) ); + pWinFunc[i] = add( MAX_16, extract_l( Mpy_32_16_1( L_sub( cos_val[i], MAX_16 ), a ) ) ); + move16(); } return; @@ -112,12 +114,14 @@ void ivas_agc_calcGainParams_fx( // Word16 nbits; // nbits = NBITS_DIFFG; - assert( EQ_16( numCoeffs, IVAS_SPAR_MAX_DMX_CHS ) ); + assert( numCoeffs == IVAS_SPAR_MAX_DMX_CHS ); *absEmin = s_max( ABS_EMIN_MAX, LOG2_NUMCOEFF_SQRKMAX ); + move16(); // totExp = add( add( *absEmin, AGC_EMAX ), 1 ); /**betaE = (UWord16)ceilf(logf(totExp) * INV_LOG_2);*/ *betaE = (UWord16) LOG2_4; + move16(); /*Bm = (UWord16)ceilf(logf((AGC_EMAX + 1 + 1)) * INV_LOG_2);*/ // Bm = 1; @@ -130,6 +134,8 @@ void ivas_agc_calcGainParams_fx( /**maxAttExp = ((UWord16) powf( 2, Bm ) ) - 2;*/ *maxAttExp = sub( shl( 2, 1 ), 2 ); *maxAttExp = s_min( MAXATTEXP, *maxAttExp ); + move16(); + move16(); return; } diff --git a/lib_com/ivas_arith.c b/lib_com/ivas_arith.c index 47ac42fbd..92357f05e 100644 --- a/lib_com/ivas_arith.c +++ b/lib_com/ivas_arith.c @@ -46,6 +46,39 @@ * Similar to ari_start_decoding_14bits_fx(), but do not read past frame boundary. *-----------------------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_ari_start_decoding_14bits_ext_1_lfe( + Decoder_State *st, + Tastat *s, + Word16 *extra_bits_read ) +{ + Word32 val; + + IF( GE_16( st->bits_frame, add( st->next_bit_pos, cbitsnew ) ) ) + { + val = get_next_indice( st, cbitsnew ); + } + ELSE + { + Word16 rem_bits; + rem_bits = sub( st->bits_frame, st->next_bit_pos ); + val = get_next_indice( st, rem_bits ); + val = L_shl( val, sub( cbitsnew, rem_bits ) ); + *extra_bits_read = add( *extra_bits_read, sub( cbitsnew, rem_bits ) ); + move16(); + } + + s->low = 0; + s->high = ari_q4new; + s->value = val; + + move32(); + move32(); + move32(); + + return; +} +#else void ivas_ari_start_decoding_14bits_ext_1_lfe( Decoder_State *st, Tastat *s, @@ -72,9 +105,28 @@ void ivas_ari_start_decoding_14bits_ext_1_lfe( return; } - +#endif /* Helper function to determine the symbol. */ +#ifdef IVAS_FLOAT_FIXED +static UWord16 ivas_ari_get_symbol( + const UWord16 *p, + UWord32 range, + UWord32 cum ) +{ + UWord16 symbol; + + symbol = 0; + move16(); + + WHILE( GT_64( W_mult0_32_32( p[symbol + 1], range ), cum ) ) + { + symbol = u_extract_l( UL_addNsD( symbol, 1 ) ); + } + + return symbol; +} +#else static uint16_t ivas_ari_get_symbol( const uint16_t *p, uint32_t range, @@ -92,6 +144,7 @@ static uint16_t ivas_ari_get_symbol( return symbol; } +#endif /*--------------------------------------------------------------- * Function ivas_ari_decode_14bits_bit_ext_1_lfe() @@ -99,6 +152,86 @@ static uint16_t ivas_ari_get_symbol( * *-------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +UWord16 ivas_ari_decode_14bits_bit_ext_1_lfe( + Decoder_State *st, + Tastat *s, + const UWord16 *cum_freq, + Word16 *extra_bits_read ) +{ + UWord16 symbol; + UWord32 low, high, range, value; + UWord32 cum; + + /* read s->low,high,value sequentially */ + low = s->low; + high = s->high; + value = s->value; + + move32(); + move32(); + move32(); + + range = UL_addNsD( UL_subNsD( high, low ), 1 ); + cum = UL_subNsD( UL_lshl( ( UL_addNsD( UL_subNsD( value, low ), 1 ) ), stat_bitsnew ), 1 ); + + symbol = ivas_ari_get_symbol( cum_freq, range, cum ); + + high = UL_subNsD( UL_addNsD( low, mul_sbc_14bits_ivas( range, cum_freq[symbol] ) ), 1 ); + low = UL_addNsD( low, mul_sbc_14bits_ivas( range, cum_freq[symbol + 1] ) ); + + FOR( ;; ) + { + IF( GE_32( high, ari_q2new ) ) + { + IF( GE_32( low, ari_q2new ) ) + { + value = UL_subNsD( value, ari_q2new ); + low = UL_subNsD( low, ari_q2new ); + high = UL_subNsD( high, ari_q2new ); + } + ELSE + { + test(); + IF( GE_32( low, ari_q1new ) && LT_32( high, ari_q3new ) ) + { + value = UL_subNsD( value, ari_q1new ); + low = UL_subNsD( low, ari_q1new ); + high = UL_subNsD( high, ari_q1new ); + } + ELSE + { + BREAK; + } + } + } + + low = UL_addNsD( low, low ); + high = UL_addNsD( high, UL_addNsD( high, 1 ) ); + + IF( GE_16( st->next_bit_pos, st->bits_frame ) ) + { + value = UL_lshl( value, 1 ); + *extra_bits_read = add( *extra_bits_read, 1 ); + move16(); + } + ELSE + { + value = UL_or( UL_lshl( value, 1 ), get_next_indice_1( st ) ); + } + } + + s->low = low; + s->high = high; + s->value = value; + + move32(); + move32(); + move32(); + + return symbol; +} +#else uint16_t ivas_ari_decode_14bits_bit_ext_1_lfe( Decoder_State *st, Tastat *s, @@ -167,6 +300,7 @@ uint16_t ivas_ari_decode_14bits_bit_ext_1_lfe( return symbol; } +#endif /*--------------------------------------------------------------- * Function ivas_ari_done_decoding_14bits_ext_1_lfe() @@ -174,6 +308,16 @@ uint16_t ivas_ari_decode_14bits_bit_ext_1_lfe( * *-------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_ari_done_decoding_14bits_ext_1_lfe( + Decoder_State *st, + const Word16 extra_bits_read ) +{ + get_next_indice_tmp( st, negate( sub( cbitsnew - 2, extra_bits_read ) ) ); + + return; +} +#else void ivas_ari_done_decoding_14bits_ext_1_lfe( Decoder_State *st, const int16_t extra_bits_read ) @@ -182,6 +326,7 @@ void ivas_ari_done_decoding_14bits_ext_1_lfe( return; } +#endif /*--------------------------------------------------------------- diff --git a/lib_com/ivas_avq_pos_reorder_com.c b/lib_com/ivas_avq_pos_reorder_com.c index 27878028d..f47aead34 100644 --- a/lib_com/ivas_avq_pos_reorder_com.c +++ b/lib_com/ivas_avq_pos_reorder_com.c @@ -41,6 +41,7 @@ * *-----------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ordr_esti( const int16_t svLength, /* i : sub-vector index */ int16_t *Mpos, /* i/o: dominant sub-vector position from ACV */ @@ -61,3 +62,31 @@ void ordr_esti( return; } +#else +void ordr_esti( + const Word16 svLength, /* i : sub-vector index */ + Word16 *Mpos, /* i/o: dominant sub-vector position from ACV */ + Word16 svOrder[], /* i/o: AVQ sub-vector order */ + const Word16 Nsv /* i : total sub-vectors in a sub-frames */ +) +{ + Word16 i, tmp; + + tmp = svOrder[0]; + svOrder[0] = *Mpos; + *Mpos = sub( Nsv, 1 ); + + move16(); + move16(); + move16(); + + FOR( i = 1; i < svLength; ( tmp++, i++ ) ) + { + svOrder[i] = tmp; + move16(); + } + + return; +} + +#endif \ No newline at end of file diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index c1d35c45e..0be1c40ff 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -56,6 +56,7 @@ static Word32 ivas_calculate_update_factor_fx( Word16 active_bins ) { Word32 update_factor_temp = 0; + move32(); Word16 k; FOR( k = 0; k < active_bins; k++ ) @@ -107,6 +108,8 @@ static void ivas_calculate_smoothning_factor_fx( { Word32 smooth_fact, L_tmp = 0; Word16 tmp, exp_diff = 0; + move32(); + move16(); tmp = BASOP_Util_Divide3232_Scale( update_factor, L_shl( L_deposit_l( min_pool_size ), Q22 ), &exp_diff ); // (Q15 - exp_diff) *Smoothing_factor = L_shl_sat( L_deposit_l( tmp ), add( Q16, exp_diff ) ); // Q31 @@ -204,6 +207,7 @@ static void ivas_set_up_cov_smoothing_fx( FOR( j = 0; j < pFb->filterbank_num_bands; j++ ) { Word16 active_bins = pFb->fb_bin_to_band.pFb_active_bins_per_band[j]; + move16(); update_factor = ivas_calculate_update_factor_fx( pFb->fb_bin_to_band.pFb_bin_to_band_fx[j], active_bins ); ivas_calculate_smoothning_factor_fx( &hCovState->pSmoothing_factor_fx[j], update_factor, min_pool_size, max_update_rate, smooth_mode, ivas_total_brate, j ); } @@ -214,6 +218,7 @@ static void ivas_set_up_cov_smoothing_fx( { Word32 *p_bin_to_band = pFb->fb_bin_to_band.pp_short_stride_bin_to_band_fx[j]; Word16 active_bins = pFb->fb_bin_to_band.p_short_stride_num_bins_per_band[j]; + move16(); update_factor = ivas_calculate_update_factor_fx( p_bin_to_band, active_bins ); ivas_calculate_smoothning_factor_fx( &hCovState->pSmoothing_factor_fx[j], update_factor, min_pool_size, max_update_rate, smooth_mode, ivas_total_brate, j ); } @@ -476,9 +481,12 @@ static void ivas_compute_smooth_cov_fx( sm_b = BAND_SMOOTH_REST_START_IDX; move16(); + move16(); + move32(); - assert( LE_16( end_band, pFb->filterbank_num_bands ) ); + assert( end_band <= pFb->filterbank_num_bands ); + test(); IF( EQ_16( prev_idx, -1 ) || EQ_16( transient_det[1], 1 ) ) { FOR( i = 0; i < num_ch; i++ ) @@ -542,7 +550,7 @@ static void ivas_compute_smooth_cov_fx( } } } - ELSE IF( EQ_16( prev_idx, 0 ) ) + ELSE IF( prev_idx == 0 ) { FOR( i = 0; i < num_ch; i++ ) { diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index e2d4abf3f..1762c9f68 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -121,14 +121,19 @@ ivas_error ivas_dirac_config_fx( Word16 *dirac_to_spar_md_bands; error = IVAS_ERR_OK; + move32(); - IF( EQ_16( enc_dec, ENC ) ) + IF( enc_dec == ENC ) { ivas_format = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->ivas_format; + move32(); element_mode = &( (Encoder_Struct *) st_ivas )->hEncoderConfig->element_mode_init; sba_order = ( (Encoder_Struct *) st_ivas )->sba_analysis_order; + move16(); ivas_total_brate = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->ivas_total_brate; + move32(); Fs = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->input_Fs; + move32(); band_grouping = ( (Encoder_Struct *) st_ivas )->hDirAC->band_grouping; hConfig = ( (Encoder_Struct *) st_ivas )->hDirAC->hConfig; hQMetaData = ( (Encoder_Struct *) st_ivas )->hQMetaData; @@ -148,8 +153,11 @@ ivas_error ivas_dirac_config_fx( ivas_format = ( (Decoder_Struct *) st_ivas )->ivas_format; element_mode = &( (Decoder_Struct *) st_ivas )->element_mode_init; sba_order = ( (Decoder_Struct *) st_ivas )->sba_analysis_order; + move16(); ivas_total_brate = ( (Decoder_Struct *) st_ivas )->hDecoderConfig->ivas_total_brate; + move32(); Fs = ( (Decoder_Struct *) st_ivas )->hDecoderConfig->output_Fs; + move32(); band_grouping = ( (Decoder_Struct *) st_ivas )->hDirAC->band_grouping; hConfig = ( (Decoder_Struct *) st_ivas )->hDirAC->hConfig; hQMetaData = ( (Decoder_Struct *) st_ivas )->hQMetaData; @@ -166,45 +174,61 @@ ivas_error ivas_dirac_config_fx( ( (Decoder_Struct *) st_ivas )->hDirAC->hFbMdft = hFbMdft; } - IF( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) + test(); + IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) { hConfig->nbands = IVAS_MAX_NUM_BANDS; + move16(); spar_dirac_split_band = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); IF( ivas_get_hodirac_flag_fx( ivas_total_brate, sba_order ) ) // add call after merge of 100861_dirac_dec { spar_dirac_split_band = 0; + move16(); } } ELSE { hConfig->nbands = 5; spar_dirac_split_band = 0; + + move16(); + move16(); } hConfig->enc_param_start_band = 0; hConfig->dec_param_estim = FALSE; - IF( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) /* skip for MASA decoder */ + + move16(); + move16(); + + test(); + IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) /* skip for MASA decoder */ { - IF( ( error = ivas_dirac_sba_config_fx( hQMetaData, element_mode, ivas_total_brate, sba_order, hConfig->nbands - spar_dirac_split_band, - ivas_format ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_dirac_sba_config_fx( hQMetaData, element_mode, ivas_total_brate, sba_order, sub( hConfig->nbands, spar_dirac_split_band ), + ivas_format ) ), + IVAS_ERR_OK ) ) { return error; } IF( hQMetaData != NULL ) { - IF( enc_dec == ENC ) + if ( enc_dec == ENC ) { hConfig->nbands = hQMetaData->q_direction[0].cfg.nbands; + move16(); } hConfig->enc_param_start_band = add( hQMetaData->q_direction[0].cfg.start_band, spar_dirac_split_band ); + move16(); } hConfig->dec_param_estim = TRUE; - IF( hConfig->dec_param_estim == TRUE ) + move16(); + if ( EQ_16( hConfig->dec_param_estim, TRUE ) ) { hConfig->enc_param_start_band = spar_dirac_split_band; + move16(); } IF( ivas_get_hodirac_flag_fx( ivas_total_brate, sba_order ) ) @@ -212,12 +236,16 @@ ivas_error ivas_dirac_config_fx( hConfig->dec_param_estim = FALSE; hConfig->enc_param_start_band = 0; - set_c( (int8_t *) hQMetaData->twoDirBands, (int8_t) 1, hQMetaData->q_direction[0].cfg.nbands ); - hQMetaData->numTwoDirBands = (uint8_t) hQMetaData->q_direction[0].cfg.nbands; + move16(); + move16(); + + set_c( (Word8 *) hQMetaData->twoDirBands, (Word8) 1, hQMetaData->q_direction[0].cfg.nbands ); + hQMetaData->numTwoDirBands = (UWord8) hQMetaData->q_direction[0].cfg.nbands; } } - IF( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) + test(); + IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) { // 100861_dirac_dec ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); @@ -590,55 +618,83 @@ void ivas_get_dirac_sba_max_md_bits_fx( const Word16 nbands, IVAS_FORMAT ivas_format ) { - IF( sba_total_brate <= IVAS_13k2 ) + IF( LE_32( sba_total_brate, IVAS_13k2 ) ) { *bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; *metadata_max_bits = 70; + + move16(); + move16(); } - ELSE IF( sba_total_brate <= IVAS_16k4 ) + ELSE IF( LE_32( sba_total_brate, IVAS_16k4 ) ) { *bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC; *metadata_max_bits = 80; + + move16(); + move16(); } - ELSE IF( sba_total_brate <= IVAS_24k4 ) + ELSE IF( LE_32( sba_total_brate, IVAS_24k4 ) ) { *bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; *metadata_max_bits = 103; + + move16(); + move16(); /* OSBA needs an additional 2-bits safety margin to avoid acelp crashes */ - IF( ivas_format == SBA_ISM_FORMAT ) + IF( EQ_32( ivas_format, SBA_ISM_FORMAT ) ) { ( *metadata_max_bits ) = sub( ( *metadata_max_bits ), 3 ); + move16(); } } - ELSE IF( sba_total_brate <= IVAS_32k ) + ELSE IF( LE_32( sba_total_brate, IVAS_32k ) ) { *bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC; *metadata_max_bits = 214; + + move16(); + move16(); } - ELSE IF( sba_total_brate <= IVAS_48k ) + ELSE IF( LE_32( sba_total_brate, IVAS_48k ) ) { *bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC; *metadata_max_bits = 240; + + move16(); + move16(); } - ELSE IF( sba_total_brate <= IVAS_64k ) + ELSE IF( LE_32( sba_total_brate, IVAS_64k ) ) { *bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC; *metadata_max_bits = 200; + + move16(); + move16(); } - ELSE IF( sba_total_brate <= IVAS_80k ) + ELSE IF( LE_32( sba_total_brate, IVAS_80k ) ) { *bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC; *metadata_max_bits = 200; + + move16(); + move16(); } - ELSE IF( sba_total_brate <= IVAS_96k ) + ELSE IF( LE_32( sba_total_brate, IVAS_96k ) ) { *bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC; *metadata_max_bits = 200; + + move16(); + move16(); } - ELSE IF( sba_total_brate <= IVAS_128k ) + ELSE IF( LE_32( sba_total_brate, IVAS_128k ) ) { *bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC; *metadata_max_bits = 250; + + move16(); + move16(); } ELSE { @@ -653,6 +709,9 @@ void ivas_get_dirac_sba_max_md_bits_fx( Word32 var2_32 = L_deposit_h( var2 ); Word32 var4 = var2_32; + move16(); + move32(); + Word16 exp_res = 0; IF( var1 % 5 != 0 ) { @@ -661,19 +720,25 @@ void ivas_get_dirac_sba_max_md_bits_fx( } Word16 flag = BASOP_Util_Cmp_Mant32Exp( MAX16B, 31, var4, exp ); Word32 tmp; - if ( flag == 1 ) + IF( EQ_16( flag, 1 ) ) { tmp = var4; + move32(); } - else + ELSE { tmp = MAX16B; exp = 31; + + move32(); + move16(); } *metadata_max_bits = (Word16) L_shr( tmp, 31 - exp ); - ; *qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; + move16(); + move16(); + return; } #else @@ -769,12 +834,19 @@ ivas_error ivas_dirac_sba_config_fx( Word32 tmp1 = IVAS_192k; Word32 tmp2 = SPAR_DIRAC_SPLIT_START_BAND; Word16 exp = 0; + + move32(); + move32(); + move16(); Word16 tmp3 = BASOP_Util_Divide3232_Scale( tmp1, tmp2, &exp ); - Word32 res = L_shr( L_deposit_h( tmp3 ), 31 - exp ); + Word32 res = L_shr( L_deposit_h( tmp3 ), sub( 31, exp ) ); error = IVAS_ERR_OK; hQMetaData->is_masa_ivas_format = 0; - hodirac_flag = ivas_get_hodirac_flag( sba_total_brate, sba_order ); // implemented on 100861_dirac_dec + move32(); + move16(); + + hodirac_flag = ivas_get_hodirac_flag_fx( sba_total_brate, sba_order ); // implemented on 100861_dirac_dec /* map the bitrate for SID frame */ IF( EQ_32( sba_total_brate, IVAS_SID_5k2 ) ) @@ -782,10 +854,12 @@ ivas_error ivas_dirac_sba_config_fx( IF( EQ_16( *element_mode, IVAS_SCE ) ) { sba_total_brate = ACELP_24k40; + move32(); } ELSE { sba_total_brate = ACELP_48k; + move32(); } } @@ -794,10 +868,12 @@ ivas_error ivas_dirac_sba_config_fx( IF( LE_32( sba_total_brate, IVAS_16k4 ) ) { hQMetaData->useLowerRes = 1; + move16(); } ELSE { hQMetaData->useLowerRes = 0; + move16(); } nbands_coded = nbands; @@ -806,25 +882,31 @@ ivas_error ivas_dirac_sba_config_fx( { hQMetaData->useLowerBandRes = 1; Word16 tmp = nbands % 2; + + move16(); + move16(); nbands_coded = add( shr( nbands, 1 ), tmp ); } ELSE { hQMetaData->useLowerBandRes = 0; + move16(); IF( hodirac_flag == 0 ) { - nbands_coded = nbands - 1; /* always combine the last two bands */ + nbands_coded = sub( nbands, 1 ); /* always combine the last two bands */ } } { Word16 no_dirs = 1; + move16(); IF( hodirac_flag ) { no_dirs = 2; + move16(); } - IF( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ) != IVAS_ERR_OK ) // WIP + IF( NE_32( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ), IVAS_ERR_OK ) ) // WIP { return error; } @@ -933,7 +1015,7 @@ void computeDirectionVectors_fixed( Word16 norm_x, norm_y, norm_z; Word32 scaled_x, scaled_y, scaled_z; Word16 e_x, e_y, e_z; - for ( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; ++i ) + FOR( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; ++i ) { norm_x = norm_l( *intensity_real_x ); norm_y = norm_l( *intensity_real_y ); @@ -941,9 +1023,9 @@ void computeDirectionVectors_fixed( scaled_x = L_shl( *intensity_real_x, norm_x ); scaled_y = L_shl( *intensity_real_y, norm_y ); scaled_z = L_shl( *intensity_real_z, norm_z ); - e_x = i_e - norm_x; - e_y = i_e - norm_y; - e_z = i_e - norm_z; + e_x = sub( i_e, norm_x ); + e_y = sub( i_e, norm_y ); + e_z = sub( i_e, norm_z ); temp1 = BASOP_Util_Add_Mant32Exp( Mult_32_32( scaled_x, scaled_x ), 2 * e_x, Mult_32_32( scaled_y, scaled_y ), 2 * e_y, &exp1 ); intensityNorm = BASOP_Util_Add_Mant32Exp( temp1, exp1, Mult_32_32( scaled_z, scaled_z ), 2 * e_z, &intensityNorm_e ); @@ -953,6 +1035,10 @@ void computeDirectionVectors_fixed( *( direction_vector_x++ ) = ONE_IN_Q30; *( direction_vector_y++ ) = 0; *( direction_vector_z++ ) = 0; + + move32(); + move32(); + move32(); intensity_real_x++; intensity_real_y++; intensity_real_z++; @@ -966,6 +1052,10 @@ void computeDirectionVectors_fixed( intensity_real_y++; *( direction_vector_z++ ) = L_shl( Mult_32_32( scaled_z, intensityNorm ), e_z + intensityNorm_e - 1 ); /*Q30*/ intensity_real_z++; + + move32(); + move32(); + move32(); } } @@ -992,48 +1082,55 @@ void computeDirectionVectors_fx( Word16 i; Word32 intensityNorm; - Word16 sq = 31 - ( 2 * ( *i_q ) - 31 ); - Word16 sq1 = ( 2 * ( *i_q ) - 31 ); + Word16 sq = sub( 31, sub( 2 * ( *i_q ), 31 ) ); + Word16 sq1 = sub( 2 * ( *i_q ), 31 ); Word16 exp = sq; Word16 local_i_q = sq1; Word16 min_factor = 30; + + move16(); + move16(); + move16(); + Word32 *init_x = intensity_real_x; Word32 *init_y = intensity_real_y; Word32 *init_z = intensity_real_z; // First loop to determine the Q for the direction vector - for ( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; ++i ) + FOR( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; ++i ) { intensityNorm = L_add( L_add( Mpy_32_32_r( *( intensity_real_x ), *( intensity_real_x ) ), Mpy_32_32_r( *( intensity_real_y ), *( intensity_real_y ) ) ), Mpy_32_32_r( *( intensity_real_z ), *( intensity_real_z ) ) ); /*Q (2*i_q - 31) */ exp = sq; - if ( intensityNorm <= EPSILON_FX ) + move16(); + IF( LE_32( intensityNorm, EPSILON_FX ) ) { intensity_real_x++; intensity_real_y++; intensity_real_z++; } - else + ELSE { intensityNorm = ISqrt32( intensityNorm, &exp ); // Q31-exp intensity_real_x++; // i_q + Q31-exp -31 = i_q -exp intensity_real_y++; // i_q + Q31-exp -31 = i_q -exp intensity_real_z++; // i_q + Q31-exp-31 = i_q -exo - local_i_q = *i_q - exp; - min_factor = min( min_factor, local_i_q ); + local_i_q = sub( *i_q, exp ); + min_factor = s_min( min_factor, local_i_q ); } } intensity_real_x = init_x; intensity_real_y = init_y; intensity_real_z = init_z; // Actual processing loop for the direction vector - for ( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; ++i ) + FOR( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; ++i ) { intensityNorm = L_add( L_add( Mpy_32_32_r( *( intensity_real_x ), *( intensity_real_x ) ), Mpy_32_32_r( *( intensity_real_y ), *( intensity_real_y ) ) ), Mpy_32_32_r( *( intensity_real_z ), *( intensity_real_z ) ) ); /*Q (2*i_q - 31) */ exp = sq; - if ( intensityNorm <= EPSILON_FX ) + move16(); + IF( LE_32( intensityNorm, EPSILON_FX ) ) { intensityNorm = L_shl( 1, min_factor ); *( direction_vector_x++ ) = L_shl( 1, min_factor ); @@ -1042,8 +1139,12 @@ void computeDirectionVectors_fx( intensity_real_x++; intensity_real_y++; intensity_real_z++; + + move32(); + move32(); + move32(); } - else + ELSE { intensityNorm = ISqrt32( intensityNorm, &exp ); // Q31-exp Word32 temp = L_shr( Mpy_32_32( *( intensity_real_x++ ), intensityNorm ), ( *i_q - exp - min_factor ) ); @@ -1052,9 +1153,14 @@ void computeDirectionVectors_fx( *( direction_vector_y++ ) = temp; // i_q + Q31-exp -31 = i_q -exp temp = L_shr( Mpy_32_32( *( intensity_real_z++ ), intensityNorm ), ( *i_q - exp - min_factor ) ); *( direction_vector_z++ ) = temp; // i_q + Q31-exp-31 = i_q -exp + + move32(); + move32(); + move32(); } } *i_q = min_factor; + move16(); return; } #endif @@ -1127,6 +1233,7 @@ void computeDiffuseness_fx( Word32 energy_slow[CLDFB_NO_CHANNELS_MAX]; Word16 i, j, k; Word32 tmp = 0, tmp_1; + move32(); Word32 *p_tmp; const Word32 *p_tmp_c; @@ -1136,58 +1243,83 @@ void computeDiffuseness_fx( set_val_Word32( intensity_slow_abs, 0, CLDFB_NO_CHANNELS_MAX ); set_val_Word32( energy_slow, 0, CLDFB_NO_CHANNELS_MAX ); - for ( i = 0; i < DIRAC_NO_COL_AVG_DIFF; ++i ) + FOR( i = 0; i < DIRAC_NO_COL_AVG_DIFF; ++i ) { /* Energy slow */ p_tmp_c = buffer_energy + i * num_freq_bands; - for ( k = 0; k < num_freq_bands; k++ ) + FOR( k = 0; k < num_freq_bands; k++ ) { energy_slow[k] = L_add( *( p_tmp_c++ ), energy_slow[k] ); // Q(q_factor_energy) + move32(); } /* Intensity slow */ - for ( j = 0; j < DIRAC_NUM_DIMS; ++j ) + FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) { p_tmp = buffer_intensity[j][i]; - for ( k = 0; k < num_freq_bands; k++ ) + FOR( k = 0; k < num_freq_bands; k++ ) { intensity_slow[j * num_freq_bands + k] = L_add( *( p_tmp++ ), intensity_slow[j * num_freq_bands + k] ); + move32(); } } } /* intensity_slow.^2 + intensity_slow_abs*/ - for ( j = 0; j < DIRAC_NUM_DIMS; ++j ) + FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) { - p_tmp = intensity_slow + j * num_freq_bands; + p_tmp = intensity_slow + imult1616( j, num_freq_bands ); - for ( k = 0; k < num_freq_bands; k++ ) + FOR( k = 0; k < num_freq_bands; k++ ) { *( p_tmp ) = Mpy_32_32( *p_tmp, *( p_tmp ) ); // Q( 2*(q_factor_intensity + scale_fact - 1) -31 ) intensity_slow_abs[k] = L_add( *( p_tmp++ ), intensity_slow_abs[k] ); + move32(); + move32(); } } - Word16 init_exp = 31 - ( ( 2 * ( q_factor_intensity ) ) - 31 ), exp; + Word16 init_exp = sub( 31, sub( ( ( 2 * ( q_factor_intensity ) ) ), 31 ) ), exp; Word16 exp1 = 0, exp2; + move16(); /* Compute Diffuseness */ p_tmp = intensity_slow_abs; - for ( i = 0; i < num_freq_bands; ++i ) + FOR( i = 0; i < num_freq_bands; ++i ) { exp = init_exp; Word32 temp = *( p_tmp++ ); + move32(); tmp_1 = Sqrt32( temp, &exp ); tmp = L_deposit_h( BASOP_Util_Divide3232_Scale( tmp_1, L_add( energy_slow[i], 1 ), &exp1 ) ); - exp2 = 31 - exp1 + ( 31 - exp - q_factor_energy ); - if ( exp2 > 30 ) + exp2 = add( sub( 31, exp1 ), sub( sub( 31, exp ), q_factor_energy ) ); + IF( GT_32( exp2, 30 ) ) { - tmp = L_shr( tmp, ( exp2 - 30 ) ); - exp2 -= ( exp2 - 30 ); + tmp = L_shr( tmp, sub( exp2, 30 ) ); + exp2 = sub( exp2, sub( exp2, 30 ) ); } tmp = L_sub( L_shl( 1, exp2 ), tmp ); - diffuseness[i] = ( ( tmp < L_shl( 1, exp2 ) ) ? ( ( tmp < 0 ) ? 0 : tmp ) : L_shl( 1, exp2 ) ); + // diffuseness[i] = ( ( tmp < L_shl( 1, exp2 ) ) ? ( ( tmp < 0 ) ? 0 : tmp ) : L_shl( 1, exp2 ) ); + + IF( LT_32( tmp, L_shl( 1, exp2 ) ) ) + { + IF( tmp < 0 ) + { + diffuseness[i] = 0; + } + ELSE + { + diffuseness[i] = tmp; + } + } + ELSE + { + diffuseness[i] = L_shl( 1, exp2 ); + } out_exp[i] = exp2; + + move32(); + move16(); } return; } @@ -1319,7 +1451,7 @@ void computeDiffuseness_fixed( tmp = Sqrt32( p_tmp[i], &exp1 ); tmp = BASOP_Util_Divide3232_Scale_cadence( tmp, L_add( energy_slow[i], EPSILLON_FX ), &exp2 ); - q_tmp = sub( 31, exp2 ) + sub( sub( 31, exp1 ), q_ene ); + q_tmp = add( sub( 31, exp2 ), sub( sub( 31, exp1 ), q_ene ) ); IF( LT_16( q_tmp, Q30 ) ) { @@ -1329,6 +1461,7 @@ void computeDiffuseness_fixed( { tmp = L_sub( ONE_IN_Q30, L_shr( tmp, sub( q_tmp, Q30 ) ) ); q_tmp = Q30; + move16(); } IF( GE_32( tmp, L_shl( 1, q_tmp ) ) ) @@ -1336,7 +1469,7 @@ void computeDiffuseness_fixed( diffuseness[i] = ONE_IN_Q30; move32(); } - ELSE IF( LE_32( tmp, 0 ) ) + ELSE IF( tmp <= 0 ) { diffuseness[i] = 0; move32(); @@ -1498,9 +1631,10 @@ Word32 deindex_azimuth_fx( test(); IF( NE_32( mc_format, MC_LS_SETUP_INVALID ) && EQ_16( no_bits, 2 ) ) { - IF( EQ_16( s_and( id_phi, 1 ), 0 ) ) + IF( s_and( id_phi, 1 ) == 0 ) { phi_hat_fx = cb_azi_chan_fx[shr( id_phi, 1 )]; + move32(); } ELSE { @@ -1508,7 +1642,7 @@ Word32 deindex_azimuth_fx( } return phi_hat_fx; } - flag_delta = (Word16) EQ_16( s_and( id_th, 1 ), 1 ); + flag_delta = extract_l( EQ_16( s_and( id_th, 1 ), 1 ) ); IF( remap ) { @@ -1625,9 +1759,11 @@ void deindex_spherical_component_fx( *az_idx = sph_idx; move16(); *az_fx = deindex_azimuth_fx( *az_idx, no_bits, 0, 0, mc_format ); + move16(); BREAK; default: *el_idx = deindex_sph_idx_general_fx( sph_idx, no_bits, el_fx, az_fx, az_idx, mc_format ); + move16(); BREAK; } @@ -2060,14 +2196,15 @@ static UWord16 deindex_sph_idx_general_fx( } } - IF( EQ_32( id_th, 0 ) ) + IF( id_th == 0 ) { id_phi = idx_sph; move16(); } ELSE { - IF( EQ_32( id_th, sub( no_th, 1 ) ) && GT_16( no_bits, 4 ) ) + test(); + if ( EQ_32( id_th, sub( no_th, 1 ) ) && GT_16( no_bits, 4 ) ) { id_phi = 0; move16(); @@ -2077,10 +2214,12 @@ static UWord16 deindex_sph_idx_general_fx( q_id_th = norm_l( id_th ); id_th_fx = L_shl( id_th, q_id_th ); *theta_dec_fx = L_shl( Mpy_32_32( id_th_fx, delta_theta_masa_fx[no_bits - 3] ), sub( 31, q_id_th ) ); + move32(); - IF( GE_32( *theta_dec_fx, L_shl( 90, Q22 ) ) ) + IF( GE_32( *theta_dec_fx, 90 << Q22 ) ) { - *theta_dec_fx = L_shl( 90, 22 ) * sign_theta; + *theta_dec_fx = 90 << 22 * sign_theta; + move32(); *phi_dec_fx = 0; move32(); *p_id_phi = 0; @@ -2091,6 +2230,7 @@ static UWord16 deindex_sph_idx_general_fx( *theta_dec_fx *= sign_theta; *phi_dec_fx = deindex_azimuth_fx( id_phi, no_bits, id_th, 0, mc_format ); + move32(); *p_id_phi = id_phi; move16(); } diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index a72aba04a..0b890d7a8 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -57,7 +57,7 @@ static void ivas_get_ld_fb_resp_fx( Word32 **ppIdeal_FRs_re_fx, Word32 **ppIdeal #endif static ivas_error ivas_filterbank_setup( IVAS_FB_MIXER_HANDLE hFbMixer, const int32_t sampling_rate ); #ifdef IVAS_FLOAT_FIXED -static ivas_error ivas_filterbank_setup_fx( IVAS_FB_MIXER_HANDLE hFbMixer, const int32_t sampling_rate, Word16 *index ); +static ivas_error ivas_filterbank_setup_fx( IVAS_FB_MIXER_HANDLE hFbMixer, const Word32 sampling_rate, Word16 *index ); #endif static ivas_error ivas_fb_mixer_get_window( const int16_t fade_len, const int32_t sampling_rate, const float **pWindow ); #ifdef IVAS_FLOAT_FIXED @@ -80,7 +80,7 @@ Word16 ivas_get_num_bands_from_bw_idx( Word16 num_active_bands; assert( bwidth > 0 ); /*NB BW is not supported*/ - num_active_bands = ivas_num_active_bands[bwidth - 1]; + num_active_bands = ivas_num_active_bands[sub( bwidth, 1 )]; move16(); return num_active_bands; @@ -166,31 +166,54 @@ ivas_error ivas_fb_set_cfg( pFb_cfg->active_w_mixing = active_w_mixing; pFb_cfg->windowed_fr_offset = 0; - IF( ivas_format == ISM_FORMAT ) + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + + IF( EQ_16( ivas_format, ISM_FORMAT ) ) { pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_4_NS ); pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_4_NS ); pFb_cfg->prior_input_length = NS2SA( sampling_rate, DELAY_DIRAC_ENC_CMP_NS_PARAM_ISM ) + NS2SA( sampling_rate, DIRAC_SLOT_ENC_NS ); + + move16(); + move16(); + move16(); } - ELSE IF( ivas_format == SBA_FORMAT ) + ELSE IF( EQ_16( ivas_format, SBA_FORMAT ) ) { pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_1_NS ); pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_4_NS ); pFb_cfg->prior_input_length = NS2SA( sampling_rate, FRAME_SIZE_NS ); pFb_cfg->windowed_fr_offset = (Word16) ( (float) ( sampling_rate / FRAMES_PER_SEC ) * 3.0f / 4.0f ) - NS2SA( sampling_rate, DELAY_DIRAC_SPAR_ENC_CMP_NS ); + + move16(); + move16(); + move16(); } - ELSE IF( ivas_format == MASA_FORMAT ) + ELSE IF( EQ_16( ivas_format, MASA_FORMAT ) ) { pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_1_NS ); pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_1_NS ); pFb_cfg->prior_input_length = NS2SA( sampling_rate, DELAY_DIRAC_ENC_CMP_NS ) + NS2SA( sampling_rate, DIRAC_SLOT_ENC_NS ); + + move16(); + move16(); + move16(); } - ELSE IF( ivas_format == MC_FORMAT ) + ELSE IF( EQ_16( ivas_format, MC_FORMAT ) ) { pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_1_NS ); pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_1_NS ); pFb_cfg->prior_input_length = NS2SA( sampling_rate, DELAY_DIRAC_ENC_CMP_NS ) + NS2SA( sampling_rate, PARAM_MC_SLOT_ENC_NS ); + + move16(); + move16(); + move16(); } *pFb_cfg_out = pFb_cfg; @@ -467,13 +490,15 @@ ivas_error ivas_FB_mixer_open_fx( ) { IVAS_FB_MIXER_HANDLE hFbMixer; - int16_t i, j, frame_len, num_bands; - int16_t num_chs_alloc; + Word16 i, j, frame_len, num_bands; + Word16 num_chs_alloc, exp; ivas_error error; error = IVAS_ERR_OK; + move32(); - frame_len = (int16_t) ( sampling_rate / FRAMES_PER_SEC ); + frame_len = BASOP_Util_Divide3232_Scale( sampling_rate, FRAMES_PER_SEC, &exp ); + frame_len = shr( frame_len, sub( 15, exp ) ); hFbMixer = *hFbMixer_out; @@ -497,18 +522,19 @@ ivas_error ivas_FB_mixer_open_fx( } } - IF( fb_cfg->active_w_mixing == -1 ) + IF( EQ_16( fb_cfg->active_w_mixing, -1 ) ) { num_chs_alloc = 0; move16(); } ELSE IF( fb_cfg->active_w_mixing ) { - num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); + num_chs_alloc = s_max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); } ELSE { num_chs_alloc = 1; /* only W channel processed for predicting YZX */ + move16(); } #ifndef IVAS_FLOAT_FIXED /////////////////////////////// FLOAT /////////////////////////////////////////////// @@ -535,23 +561,23 @@ ivas_error ivas_FB_mixer_open_fx( } } #else - for ( i = 0; i < num_chs_alloc; i++ ) + FOR( i = 0; i < num_chs_alloc; i++ ) { - if ( fb_cfg->num_out_chans == 0 ) + IF( fb_cfg->num_out_chans == 0 ) { hFbMixer->ppFilterbank_inFR_re_fx[i] = NULL; hFbMixer->ppFilterbank_inFR_im_fx[i] = NULL; } - else + ELSE { j = fb_cfg->remix_order[i]; - if ( ( hFbMixer->ppFilterbank_inFR_re_fx[j] = (Word32 *) malloc( sizeof( Word32 ) * frame_len ) ) == NULL ) + IF( ( hFbMixer->ppFilterbank_inFR_re_fx[j] = (Word32 *) malloc( sizeof( Word32 ) * frame_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer encoder" ); } - if ( ( hFbMixer->ppFilterbank_inFR_im_fx[j] = (Word32 *) malloc( sizeof( Word32 ) * frame_len ) ) == NULL ) + IF( ( hFbMixer->ppFilterbank_inFR_im_fx[j] = (Word32 *) malloc( sizeof( Word32 ) * frame_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer encoder" ); } @@ -559,14 +585,14 @@ ivas_error ivas_FB_mixer_open_fx( } #endif - IF( fb_cfg->active_w_mixing == -1 ) + IF( EQ_16( fb_cfg->active_w_mixing, -1 ) ) { num_chs_alloc = 0; move16(); } ELSE { - num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); + num_chs_alloc = s_max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); } #ifndef IVAS_FLOAT_FIXED //////////////////////////// Float ////////////////////////////////////// @@ -589,7 +615,8 @@ ivas_error ivas_FB_mixer_open_fx( } #endif - IF( ( fb_cfg->active_w_mixing != -1 ) && ( fb_cfg->num_out_chans > 0 ) ) + test(); + IF( ( NE_16( fb_cfg->active_w_mixing, -1 ) ) && ( fb_cfg->num_out_chans > 0 ) ) { #ifndef IVAS_FLOAT_FIXED ////////////////////////////////////////// FLOAT ////////////////////////////////////////////////////// float *pTemp_mem; @@ -628,13 +655,13 @@ ivas_error ivas_FB_mixer_open_fx( { IF( fb_cfg->num_out_chans > 0 ) { - const int16_t *pActive_bins_per_band, *pActive_bins_per_band_abs, *pStart_offset, *pStart_offset_abs; + const Word16 *pActive_bins_per_band, *pActive_bins_per_band_abs, *pStart_offset, *pStart_offset_abs; num_bands = ivas_get_num_bands( sampling_rate ); ivas_get_active_bins( &pActive_bins_per_band, &pActive_bins_per_band_abs, &pStart_offset, &pStart_offset_abs, sampling_rate ); - IF( fb_cfg->active_w_mixing != -1 ) + IF( NE_16( fb_cfg->active_w_mixing, -1 ) ) { FOR( i = 0; i < num_bands; i++ ) { @@ -651,16 +678,18 @@ ivas_error ivas_FB_mixer_open_fx( } } - IF( sampling_rate != 48000 ) + IF( NE_32( sampling_rate, 48000 ) ) { - int16_t num_diff_bands, start_diff_band_non48k; + Word16 num_diff_bands, start_diff_band_non48k; num_diff_bands = MAX_NUM_BANDS_DIFF_NON48K; - start_diff_band_non48k = num_bands - num_diff_bands; + move16(); + start_diff_band_non48k = sub( num_bands, num_diff_bands ); hFbMixer->num_diff_bands = num_diff_bands; + move16(); - for ( j = start_diff_band_non48k; j < num_bands; j++ ) + FOR( j = start_diff_band_non48k; j < num_bands; j++ ) { #if 0 ////////////////////////////////// FLOAT //////////////////////// if ( ( hFbMixer->pFb->fb_consts.ppFilterbank_FRs_non48k[0][j] = (float *) malloc( sizeof( float ) * pActive_bins_per_band[j] ) ) == NULL ) @@ -695,9 +724,9 @@ ivas_error ivas_FB_mixer_open_fx( hFbMixer->fb_cfg = fb_cfg; set_s( hFbMixer->first_frame, 1, hFbMixer->fb_cfg->num_out_chans ); - set_s( hFbMixer->first_frame + hFbMixer->fb_cfg->num_out_chans, 0, IVAS_SPAR_MAX_CH - hFbMixer->fb_cfg->num_out_chans ); + set_s( hFbMixer->first_frame + hFbMixer->fb_cfg->num_out_chans, 0, sub( IVAS_SPAR_MAX_CH, hFbMixer->fb_cfg->num_out_chans ) ); - if ( !spar_reconfig_flag ) + IF( !spar_reconfig_flag ) { #ifdef IVAS_FLOAT_FIXED #if 1 /*********************Intermediate Conversion that needs to remove *****************************/ @@ -722,7 +751,7 @@ ivas_error ivas_FB_mixer_open_fx( // } /************************************* Float table is gettin assigned here **************************************/ - if ( ( error = ivas_fb_mixer_get_window( hFbMixer->fb_cfg->fade_len, sampling_rate, &( hFbMixer->pFilterbank_cross_fade ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_fb_mixer_get_window( hFbMixer->fb_cfg->fade_len, sampling_rate, &( hFbMixer->pFilterbank_cross_fade ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -777,7 +806,7 @@ ivas_error ivas_FB_mixer_open_fx( set16_fx( index, 0, IVAS_MAX_NUM_FB_BANDS ); #endif /*********************Intermediate Conversion that needs to remove *****************************/ - IF( ( error = ivas_filterbank_setup_fx( hFbMixer, sampling_rate, index ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_filterbank_setup_fx( hFbMixer, sampling_rate, index ) ), IVAS_ERR_OK ) ) { return error; } @@ -875,6 +904,7 @@ ivas_error ivas_FB_mixer_open_fx( * Deallocate FB mixer handle *------------------------------------------------------------------------*/ + void ivas_FB_mixer_close( IVAS_FB_MIXER_HANDLE *hFbMixer_in, /* i/o: FB mixer handle */ const int32_t sampling_rate, /* i : sampling rate in Hz */ @@ -1007,32 +1037,35 @@ void ivas_FB_mixer_close( return; } + #ifdef IVAS_FLOAT_FIXED void ivas_FB_mixer_close_fx( IVAS_FB_MIXER_HANDLE *hFbMixer_in, /* i/o: FB mixer handle */ - const int32_t sampling_rate, /* i : sampling rate in Hz */ - const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ + const Word32 sampling_rate, /* i : sampling rate in Hz */ + const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ ) { IVAS_FB_MIXER_HANDLE hFbMixer; IVAS_FB_CFG *fb_cfg; - int16_t i, j, num_bands; - int16_t num_chs_alloc; + Word16 i, j, num_bands; + Word16 num_chs_alloc; hFbMixer = *hFbMixer_in; fb_cfg = hFbMixer->fb_cfg; - IF( fb_cfg->active_w_mixing == -1 ) + IF( EQ_16( fb_cfg->active_w_mixing, -1 ) ) { num_chs_alloc = 0; + move16(); } ELSE IF( fb_cfg->active_w_mixing ) { - num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); + num_chs_alloc = s_max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); } ELSE { num_chs_alloc = 1; /* only W channel processed for predicting YZX */ + move16(); } IF( hFbMixer != NULL ) @@ -1042,6 +1075,7 @@ void ivas_FB_mixer_close_fx( IF( fb_cfg->num_out_chans > 0 ) { j = fb_cfg->remix_order[i]; + move16(); free( hFbMixer->ppFilterbank_inFR_re_fx[j] ); hFbMixer->ppFilterbank_inFR_re_fx[j] = NULL; @@ -1051,13 +1085,14 @@ void ivas_FB_mixer_close_fx( } } - IF( fb_cfg->active_w_mixing == -1 ) + IF( EQ_16( fb_cfg->active_w_mixing, -1 ) ) { num_chs_alloc = 0; + move16(); } ELSE { - num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); + num_chs_alloc = s_max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); } FOR( i = 0; i < num_chs_alloc; i++ ) @@ -1066,7 +1101,8 @@ void ivas_FB_mixer_close_fx( hFbMixer->ppFilterbank_prior_input_fx[i] = NULL; } - IF( ( fb_cfg->active_w_mixing != -1 ) && ( fb_cfg->num_out_chans > 0 ) ) + test(); + IF( NE_16( fb_cfg->active_w_mixing, -1 ) && ( fb_cfg->num_out_chans > 0 ) ) { free( hFbMixer->prior_mixer_fx[0][0] ); hFbMixer->prior_mixer_fx[0][0] = NULL; @@ -1078,7 +1114,7 @@ void ivas_FB_mixer_close_fx( { num_bands = hFbMixer->pFb->filterbank_num_bands; - IF( fb_cfg->active_w_mixing != -1 ) + IF( NE_16( fb_cfg->active_w_mixing, -1 ) ) { FOR( i = 0; i < num_bands; i++ ) { @@ -1087,10 +1123,10 @@ void ivas_FB_mixer_close_fx( } } - IF( sampling_rate != 48000 ) + IF( NE_32( sampling_rate, 48000 ) ) { - int16_t start_diff_band_non48k; - start_diff_band_non48k = num_bands - hFbMixer->num_diff_bands; + Word16 start_diff_band_non48k; + start_diff_band_non48k = sub( num_bands, hFbMixer->num_diff_bands ); FOR( j = start_diff_band_non48k; j < num_bands; j++ ) { @@ -1125,7 +1161,6 @@ void ivas_FB_mixer_close_fx( return; } #endif - /*-----------------------------------------------------------------------------------------* * Function ivas_fb_mixer_pcm_ingest() * @@ -1305,33 +1340,40 @@ void ivas_fb_mixer_cross_fading_fx( { Word16 k, fade_start_offset, fade_end_offset; - if ( hFbMixer->first_frame[ch] == 0 ) + IF( hFbMixer->first_frame[ch] == 0 ) { fade_start_offset = hFbMixer->cross_fade_start_offset; fade_end_offset = hFbMixer->cross_fade_end_offset; + move16(); + move16(); - for ( k = 0; k < fade_start_offset; k++ ) + FOR( k = 0; k < fade_start_offset; k++ ) { ppOut_pcm_fx[ch][k] = pMdft_out_old_fx[k + cf_offset]; + move32(); } - for ( k = fade_start_offset; k < fade_end_offset; k++ ) + FOR( k = fade_start_offset; k < fade_end_offset; k++ ) { - ppOut_pcm_fx[ch][k] = L_add( Mpy_32_16_1( pMdft_out_new_fx[k + cf_offset], hFbMixer->pFilterbank_cross_fade_fx[k - fade_start_offset] ), Mpy_32_16_1( pMdft_out_old_fx[k + cf_offset], ( ONE_IN_Q15 - hFbMixer->pFilterbank_cross_fade_fx[k - fade_start_offset] ) ) ); + ppOut_pcm_fx[ch][k] = L_add( Mpy_32_16_1( pMdft_out_new_fx[k + cf_offset], hFbMixer->pFilterbank_cross_fade_fx[k - fade_start_offset] ), Mpy_32_16_1( pMdft_out_old_fx[k + cf_offset], sub( 32767, hFbMixer->pFilterbank_cross_fade_fx[k - fade_start_offset] ) ) ); + move32(); } - for ( k = fade_end_offset; k < frame_len; k++ ) + FOR( k = fade_end_offset; k < frame_len; k++ ) { ppOut_pcm_fx[ch][k] = pMdft_out_new_fx[k + cf_offset]; + move32(); } } - else + ELSE { hFbMixer->first_frame[ch] = 0; + move32(); - for ( k = 0; k < frame_len; k++ ) + FOR( k = 0; k < frame_len; k++ ) { ppOut_pcm_fx[ch][k] = pMdft_out_new_fx[k + cf_offset]; + move32(); } } @@ -1758,6 +1800,7 @@ static Word16 ivas_calculate_abs_fr_fx( Word32 cldfb_nrg_fx = 0; Word16 cldfb_nrg_e = 0; move16(); + move16(); Word16 short_stride = pFb->fb_bin_to_band.short_stride; move16(); const Word16 num_bins_per_short_stride_bin = ( const Word16 )( ( sampling_rate / FRAMES_PER_SEC ) / short_stride ); @@ -1802,7 +1845,7 @@ static Word16 ivas_calculate_abs_fr_fx( /* accumulate bin energies within a short stride bin */ - short_stride_nrg_fx = L_add( short_stride_nrg_fx, L_shl( sq_abs_fx, Q22 - ( Q31 - sq_abs_e ) ) ); + short_stride_nrg_fx = L_add( short_stride_nrg_fx, L_shl( sq_abs_fx, sub( Q22, sub( Q31, sq_abs_e ) ) ) ); move32(); IF( !( ( j + 1 ) % num_bins_per_short_stride_bin ) ) @@ -1818,7 +1861,6 @@ static Word16 ivas_calculate_abs_fr_fx( /* accumulate bin energies within a CLDFB band */ cldfb_nrg_fx = BASOP_Util_Add_Mant32Exp( cldfb_nrg_fx, cldfb_nrg_e, sq_abs_fx, sq_abs_e, &cldfb_nrg_e ); - move32(); IF( !( ( j + 1 ) % num_bins_per_cldfb_band ) ) { @@ -1828,6 +1870,7 @@ static Word16 ivas_calculate_abs_fr_fx( move32(); pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band_fx[j / num_bins_per_cldfb_band][i] = temp; cldfb_nrg_fx = 0; + move32(); cldfb_nrg_e = 0; move16(); } @@ -1840,17 +1883,17 @@ static Word16 ivas_calculate_abs_fr_fx( move16(); short_stride_pow_spec_fx[j] = L_shl( L_deposit_l( tmp ), add( Q7, exp_diff ) ); // Q22 move32(); - short_stride_pow_spec_fx[j] = L_max( L_sub( short_stride_pow_spec_fx[j], (Word32) ( 0.3f * ONE_IN_Q22 ) ), 0 ); + short_stride_pow_spec_fx[j] = L_max( L_sub( short_stride_pow_spec_fx[j], 1258291 ), 0 ); // 0.3f * ONE_IN_Q22c move32(); - tmp = BASOP_Util_Divide3232_Scale( short_stride_pow_spec_fx[j], (Word32) ( 0.7f * ONE_IN_Q22 ), &exp_diff ); + tmp = BASOP_Util_Divide3232_Scale( short_stride_pow_spec_fx[j], 2936012, &exp_diff ); // 0.7f * ONE_IN_Q22 move16(); short_stride_pow_spec_fx[j] = L_shl( L_deposit_l( tmp ), add( Q7, exp_diff ) ); // Q22 move32(); - IF( GT_32( short_stride_pow_spec_fx[j], 0 ) ) + IF( short_stride_pow_spec_fx[j] > 0 ) { assert( idx_short_stride_bin_to_band < 2 * MDFT_FB_BANDS_240 ); /* array size of p_short_stride_bin_to_band */ - IF( short_mdft_start_bin == -1 ) + IF( EQ_16( short_mdft_start_bin, -1 ) ) { short_mdft_start_bin = j; move16(); @@ -1859,13 +1902,15 @@ static Word16 ivas_calculate_abs_fr_fx( pFb->fb_bin_to_band.pp_short_stride_bin_to_band_fx[i] = &pFb->fb_bin_to_band.p_short_stride_bin_to_band_fx[idx_short_stride_bin_to_band]; index[i] = idx_short_stride_bin_to_band; + move16(); } pFb->fb_bin_to_band.p_short_stride_bin_to_band_fx[idx_short_stride_bin_to_band] = short_stride_pow_spec_fx[j]; move32(); - idx_short_stride_bin_to_band++; + idx_short_stride_bin_to_band = add( idx_short_stride_bin_to_band, 1 ); - pFb->fb_bin_to_band.p_short_stride_num_bins_per_band[i]++; + pFb->fb_bin_to_band.p_short_stride_num_bins_per_band[i] = add( pFb->fb_bin_to_band.p_short_stride_num_bins_per_band[i], 1 ); + move16(); } } } @@ -1897,14 +1942,15 @@ static Word16 ivas_calculate_abs_fr_fx( } } - sum_over_spar_bands_fx = max( sum_over_spar_bands_fx, EPSILON_FX ); + sum_over_spar_bands_fx = L_max( sum_over_spar_bands_fx, EPSILON_FX ); move32(); FOR( i = 0; i < bands; i++ ) { + test(); IF( pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band_fx[j][i] == 0 && !any_non_zero ) { - spar_start++; + spar_start = add( spar_start, 1 ); } ELSE { @@ -1923,7 +1969,9 @@ static Word16 ivas_calculate_abs_fr_fx( move16(); } - frame_len = (int16_t) ( sampling_rate / FRAMES_PER_SEC ); + Word16 exp; + frame_len = BASOP_Util_Divide3232_Scale( sampling_rate, FRAMES_PER_SEC, &exp ); + frame_len = shr( frame_len, sub( 15, exp ) ); set_l( ppFilterbank_FRs_s_fx, 0, frame_len ); @@ -1981,13 +2029,15 @@ static Word16 ivas_calculate_abs_fr_fx( temp_fx = L_sub( temp_fx, 1258291 ); move32(); - IF( temp_fx < 0 ) + if ( temp_fx < 0 ) { temp_fx = 0; move32(); } - IF( j < ( abs_active_bins + abs_start_offset ) && j >= abs_start_offset && alloc_fb_resp != -1 ) + test(); + test(); + IF( LT_16( j, add( abs_active_bins, abs_start_offset ) ) && GE_16( j, abs_start_offset ) && NE_16( alloc_fb_resp, -1 ) ) { pFb->fb_bin_to_band.pFb_bin_to_band_fx[i][idx] = temp_fx; move32(); @@ -2002,13 +2052,14 @@ static Word16 ivas_calculate_abs_fr_fx( FOR( i = 0; i < frame_len; i++ ) { - IF( ppFilterbank_FRs_s_fx[i] < 0 ) + if ( ppFilterbank_FRs_s_fx[i] < 0 ) { ppFilterbank_FRs_s_fx[i] = 419430; + move32(); } } - IF( alloc_fb_resp != -1 ) + IF( NE_16( alloc_fb_resp, -1 ) ) { FOR( j = 0; j < bands; j++ ) { @@ -2016,6 +2067,10 @@ static Word16 ivas_calculate_abs_fr_fx( Word16 abs_start_offset = pFb->fb_bin_to_band.pFb_start_bin_per_band[j]; Word16 exp_diff = 0, tmp; + move16(); + move16(); + move16(); + FOR( i = 0; i < abs_active_bins; i++ ) { tmp = BASOP_Util_Divide3232_Scale( pFb->fb_bin_to_band.pFb_bin_to_band_fx[j][i], ppFilterbank_FRs_s_fx[i + abs_start_offset], &exp_diff ); @@ -2236,10 +2291,10 @@ static ivas_error ivas_filterbank_setup( #ifdef IVAS_FLOAT_FIXED static ivas_error ivas_filterbank_setup_fx( IVAS_FB_MIXER_HANDLE hFbMixer, - const int32_t sampling_rate, + const Word32 sampling_rate, Word16 *index ) { - Word16 i, j; + Word16 i, j, exp, tmp; const Word32 *pAll_fb_fr_fx[2]; const Word16 *pAll_bins_start_offset = NULL; const Word16 *pAll_bins_per_band = NULL; @@ -2250,14 +2305,16 @@ static ivas_error ivas_filterbank_setup_fx( IVAS_FB_CFG *pCfg = hFbMixer->fb_cfg; error = IVAS_ERR_OK; + move32(); IF( pCfg->num_out_chans > 0 ) { hFbMixer->pFb->filterbank_num_bands = ivas_get_num_bands( sampling_rate ); + move16(); ivas_get_active_bins( &pAll_bins_per_band, &pAll_bins_per_band_abs, &pAll_bins_start_offset, &pAll_bins_start_offset_abs, sampling_rate ); - IF( pCfg->fb_latency == NS2SA( sampling_rate, DELAY_FB_1_NS ) ) + IF( EQ_16( pCfg->fb_latency, NS2SA( sampling_rate, DELAY_FB_1_NS ) ) ) { pAll_fb_fr_fx[0] = ivas_fb_fr_12band_1ms_re_fx; // Q30 move32(); @@ -2273,19 +2330,19 @@ static ivas_error ivas_filterbank_setup_fx( } } - hFbMixer->cross_fade_end_offset = pCfg->fade_len + pCfg->pcm_offset; + hFbMixer->cross_fade_end_offset = add( pCfg->fade_len, pCfg->pcm_offset ); move16(); - hFbMixer->cross_fade_start_offset = hFbMixer->cross_fade_end_offset - pCfg->fade_len; + hFbMixer->cross_fade_start_offset = sub( hFbMixer->cross_fade_end_offset, pCfg->fade_len ); move16(); - hFbMixer->ana_window_offset = pCfg->fb_latency + pCfg->pcm_offset; + hFbMixer->ana_window_offset = add( pCfg->fb_latency, pCfg->pcm_offset ); move16(); - IF( ( error = ivas_fb_mixer_get_window_fx( pCfg->fb_latency, sampling_rate, &( hFbMixer->pAna_window_fx ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_fb_mixer_get_window_fx( pCfg->fb_latency, sampling_rate, &( hFbMixer->pAna_window_fx ) ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_fb_mixer_get_window_fx( pCfg->fade_len, sampling_rate, &( hFbMixer->pFilterbank_cross_fade_fx ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_fb_mixer_get_window_fx( pCfg->fade_len, sampling_rate, &( hFbMixer->pFilterbank_cross_fade_fx ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -2294,6 +2351,7 @@ static ivas_error ivas_filterbank_setup_fx( { ivas_filterbank_t *pFb = hFbMixer->pFb; Word16 offset = 0; + move16(); pFb->fb_consts.pFilterbank_bins_per_band = pAll_bins_per_band; pFb->fb_consts.pFilterbank_bins_start_offset = pAll_bins_start_offset; @@ -2306,19 +2364,23 @@ static ivas_error ivas_filterbank_setup_fx( case 48000: pFb->fb_bin_to_band.num_cldfb_bands = 60; /* sampling_rate * 1.0f / 800.0f */ move16(); - break; + BREAK; case 32000: pFb->fb_bin_to_band.num_cldfb_bands = 40; move16(); - break; + BREAK; case 16000: pFb->fb_bin_to_band.num_cldfb_bands = 20; move16(); - break; + BREAK; } /*pFb->fb_bin_to_band.cldfb_stride = ( int16_t )( ( sampling_rate / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX );*/ /* equals num_cldfb_bands*/ - pFb->fb_bin_to_band.short_stride = extract_l( ( sampling_rate / FRAMES_PER_SEC ) / 4 ); + // pFb->fb_bin_to_band.short_stride = extract_l( ( sampling_rate / FRAMES_PER_SEC ) / 4 ); + tmp = BASOP_Util_Divide3232_Scale( sampling_rate, FRAMES_PER_SEC, &exp ); + pFb->fb_bin_to_band.short_stride = shr( tmp, sub( 15, exp ) + 2 ); + + move16(); set_l( pFb->fb_bin_to_band.p_short_stride_bin_to_band_fx, 0, 2 * MDFT_FB_BANDS_240 ); @@ -2341,7 +2403,7 @@ static ivas_error ivas_filterbank_setup_fx( move32(); } } - IF( sampling_rate == 48000 ) + IF( EQ_32( sampling_rate, 48000 ) ) { FOR( j = 0; j < pFb->filterbank_num_bands; j++ ) { @@ -2400,6 +2462,8 @@ static ivas_error ivas_filterbank_setup_fx( active_bins_temp[j - start_diff_band_non48k] = pFb->fb_consts.pFilterbank_bins_per_band[j]; start_offset_temp[j - start_diff_band_non48k] = pFb->fb_consts.pFilterbank_bins_start_offset[j]; + move16(); + move16(); } ivas_get_ld_fb_resp_fx( ppFilterbank_FRs_re_temp_fx, ppFilterbank_FRs_im_temp_fx, ppFilterbank_FRs_re_temp_fx, ppFilterbank_FRs_im_temp_fx, @@ -2491,6 +2555,7 @@ static ivas_error ivas_fb_mixer_get_window_fx( ivas_error error; error = IVAS_ERR_OK; + move32(); IF( EQ_16( fade_len, NS2SA( sampling_rate, DELAY_FB_4_NS ) ) ) { @@ -2501,10 +2566,10 @@ static ivas_error ivas_fb_mixer_get_window_fx( BREAK; case 32000: *pWindow = ivas_fb_cf_4ms_32k_fx; - break; + BREAK; case 16000: *pWindow = ivas_fb_cf_4ms_16k_fx; - break; + BREAK; default: return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Unsupported Sampling frequency!" ); } @@ -2566,10 +2631,10 @@ static const Word32 *ivas_get_cheby_ramp_fx( { case IVAS_FB_1MS_32K_SAMP: pCheby_fx = ivas_fb_resp_cheby_ramp_32del_fx; - break; + BREAK; case IVAS_FB_1MS_16K_SAMP: pCheby_fx = ivas_fb_resp_cheby_ramp_16del_fx; - break; + BREAK; default: assert( !"Unsupported cheby ramp length!" ); } @@ -2726,6 +2791,7 @@ static void ivas_get_ld_fb_resp_fx( Word16 b, s, frame_len; const Word32 *pCheby_fx; frame_len = 0; + move16(); /*common scratch buffers for computing impulse/frequency responses, pre-ring, post-ring and circular shifted outputs to optimize stack*/ Word32 scratch1_fx[L_FRAME32k * 2]; @@ -2740,22 +2806,27 @@ static void ivas_get_ld_fb_resp_fx( { case 48000: frame_len = 960; + move16(); han_win_fx = ivas_han_win_48k_fx; // Q31 - break; + BREAK; case 32000: frame_len = 640; + move16(); han_win_fx = ivas_han_win_32k_fx; // Q31 - break; + BREAK; case 16000: frame_len = 320; + move16(); han_win_fx = ivas_han_win_16k_fx; // Q31 - break; + BREAK; } pCheby_fx = ivas_get_cheby_ramp_fx( delay ); // Q31 b = 0; s = 0; + move16(); + move16(); assert( sampling_rate == 32000 || sampling_rate == 16000 ); @@ -2766,7 +2837,7 @@ static void ivas_get_ld_fb_resp_fx( Copy32( ppIdeal_FRs_re_fx[b], &scratch2_fx[pStart_offset[b]], pActive_bins[b] ); Copy32( ppIdeal_FRs_im_fx[b], &scratch2_fx[frame_len + pStart_offset[b]], pActive_bins[b] ); // Q30 - Word16 guard_bits = L_norm_arr( scratch2_fx, shl( L_FRAME32k, 1 ) ) - find_guarded_bits_fx( shl( frame_len, 1 ) ); + Word16 guard_bits = sub( L_norm_arr( scratch2_fx, shl( L_FRAME32k, 1 ) ), find_guarded_bits_fx( shl( frame_len, 1 ) ) ); Scale_sig32( scratch2_fx, shl( L_FRAME32k, 1 ), guard_bits ); ivas_imdft_fx( scratch2_fx, &scratch2_fx[frame_len], scratch1_fx, frame_len ); @@ -2775,6 +2846,9 @@ static void ivas_get_ld_fb_resp_fx( { scratch2_fx[x] = L_shr( scratch2_fx[x], guard_bits ); scratch1_fx[x] = L_shr( scratch1_fx[x], guard_bits ); + + move32(); + move32(); } /*apply circular shift and hanning window*/ @@ -2783,18 +2857,21 @@ static void ivas_get_ld_fb_resp_fx( { scratch2_fx[sub( s, delay )] = Mpy_32_32( scratch1_fx[s], L_sub( ONE_IN_Q31, han_win_fx[sub( s, delay )] ) ); // Q(30 + 31 - 31) == Q30 + move32(); } FOR( ; s < 2 * frame_len; s++ ) { scratch2_fx[sub( s, delay )] = Mpy_32_32( scratch1_fx[s], han_win_fx[sub( s, add( frame_len, delay ) )] ); // Q30 + move32(); } FOR( s = 0; s < delay; s++ ) { scratch2_fx[add( sub( shl( frame_len, 1 ), delay ), s )] = L_negate( Mpy_32_32( scratch1_fx[s], han_win_fx[add( sub( frame_len, delay ), s )] ) ); // Q30 + move32(); } /*apply heavy/cheby ramp window and compute pre ring*/ @@ -2802,6 +2879,7 @@ static void ivas_get_ld_fb_resp_fx( FOR( s = 0; s < delay + 1; s++ ) { scratch1_fx[s] = Mpy_32_32( scratch2_fx[s], pCheby_fx[sub( delay, s )] ); // Q30 + move32(); } FOR( ; s < frame_len; s++ ) @@ -2813,27 +2891,32 @@ static void ivas_get_ld_fb_resp_fx( FOR( ; s < 2 * frame_len - delay; s++ ) { scratch1_fx[s] = scratch2_fx[s]; + move32(); } FOR( ; s < 2 * frame_len; s++ ) { scratch1_fx[s] = Mpy_32_32( scratch2_fx[s], L_sub( ONE_IN_Q31, pCheby_fx[sub( s, sub( shl( frame_len, 1 ), delay ) )] ) ); // Q30 + move32(); } /*IR - pre ring + post ring*/ FOR( s = 1; s < 2 * frame_len; s++ ) { scratch2_fx[s] = L_sub( L_sub( scratch2_fx[s] /*pre ring*/, scratch1_fx[s] /*post ring*/ ), scratch1_fx[sub( shl( frame_len, 1 ), s )] ); + move32(); } FOR( s = 0; s < 2 * frame_len - delay; s++ ) { scratch1_fx[add( s, delay )] = scratch2_fx[s]; + move32(); } FOR( ; s < 2 * frame_len; s++ ) { scratch1_fx[sub( s, sub( shl( frame_len, 1 ), delay ) )] = L_negate( scratch2_fx[s] ); + move32(); } /* apply final window*/ @@ -2841,21 +2924,28 @@ static void ivas_get_ld_fb_resp_fx( Word16 offset = 1; Word16 delay_16 = 0; - IF( delay == IVAS_FB_1MS_16K_SAMP ) + move16(); + move16(); + + if ( EQ_16( delay, IVAS_FB_1MS_16K_SAMP ) ) { delay_16 = 1; + move16(); } FOR( s = 0; s < delay; s++ ) { - scratch1_fx[s] = Mpy_32_32( scratch1_fx[s], sine_till_delay[s + ( offset * delay_16 )] ); + scratch1_fx[s] = Mpy_32_32( scratch1_fx[s], sine_till_delay[add( s, imult1616( offset, delay_16 ) )] ); offset = add( offset, 1 ); scratch1_fx[s] = L_shl( scratch1_fx[s], 1 ); // Q30 + + move32(); + move32(); } const Word32 *sine_till_frame_len = NULL; - IF( delay == IVAS_FB_1MS_16K_SAMP ) + IF( EQ_16( delay, IVAS_FB_1MS_16K_SAMP ) ) { sine_till_frame_len = ivas_sine_frame_len_640_del_16_fx; // Q30 } @@ -2864,18 +2954,24 @@ static void ivas_get_ld_fb_resp_fx( sine_till_frame_len = ivas_sine_frame_len_640_del_32_fx; // Q30 } Word16 iterator = 0; + move16(); FOR( s = 2 * delay; s < frame_len + 1; s++ ) { scratch1_fx[s] = Mpy_32_32( scratch1_fx[s], sine_till_frame_len[iterator] ); iterator = add( iterator, 1 ); scratch1_fx[s] = L_shl( scratch1_fx[s], 1 ); // Q30 + move32(); + move32(); + // assert(fabs(scratch1[s]) - fabs(fix_to_float(scratc h1_fx[s], 30)) < 0.00001); } FOR( ; s < 2 * frame_len; s++ ) { scratch1_fx[s] = 0; + + move32(); } /*compute frequency response*/ diff --git a/lib_com/ivas_filters.c b/lib_com/ivas_filters.c index 2790cfb5c..21ec2a2a4 100644 --- a/lib_com/ivas_filters.c +++ b/lib_com/ivas_filters.c @@ -109,10 +109,13 @@ void ivas_filters_init_fx( Word16 i; filter_state->order = order; move16(); + + test(); IF( EQ_16( order, IVAS_FILTER_ORDER_2 ) || EQ_16( order, IVAS_FILTER_ORDER_1 ) ) { filter_state->filt_len = add( order, 1 ); + move16(); FOR( i = 0; i < IVAS_BIQUAD_FILT_LEN; i++ ) { @@ -142,6 +145,7 @@ void ivas_filters_init_fx( ELSE { filter_state->filt_len = IVAS_BIQUAD_FILT_LEN; + move16(); FOR( i = 0; i < IVAS_BIQUAD_FILT_LEN; i++ ) { @@ -303,6 +307,9 @@ static void ivas_iir_2_filter_fx( Word32 L_tmp_prod, L_tmp; Word16 L_prod_e, L_tmp_e; + move16(); + move16(); + FOR( i = 0; i < length; i++ ) { tmp_pIn_buf_i_fx = pIn_fx[i]; diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index aab90fab5..6955e83e3 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -73,6 +73,7 @@ * Convert bit-budget to bitrate *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED void bitbudget_to_brate( const Word16 x[], /* i : bitbudgets */ Word32 y[], /* o : bitrates */ @@ -82,6 +83,23 @@ void bitbudget_to_brate( Word16 i; FOR( i = 0; i < N; i++ ) + { + y[i] = FRAMES_PER_SEC * x[i]; + move32(); + } + + return; +} +#else +void bitbudget_to_brate( + const int16_t x[], /* i : bitbudgets */ + int32_t y[], /* o : bitrates */ + const int16_t N /* i : number of entries to be converted */ +) +{ + int16_t i; + + for ( i = 0; i < N; i++ ) { y[i] = FRAMES_PER_SEC * x[i]; } @@ -89,6 +107,8 @@ void bitbudget_to_brate( return; } +#endif + /*-------------------------------------------------------------------* * ivas_ism_config() @@ -417,7 +437,7 @@ ivas_error ivas_ism_config_fx( ivas_error error; error = IVAS_ERR_OK; - move16(); + move32(); IF( combined_format_flag ) { n_ISms = nchan_ism; @@ -449,8 +469,9 @@ ivas_error ivas_ism_config_fx( // bits_ism = (Word16) ( ism_total_brate / FRAMES_PER_SEC ); bits_ism = (Word16) Mpy_32_32( 42949673, ism_total_brate ); tmp1 = BASOP_Util_Divide1616_Scale( bits_ism, n_ISms, &exp ); - set_s( bits_element, shr( tmp1, ( 15 - exp ) ), n_ISms ); + set_s( bits_element, shr( tmp1, sub( 15, exp ) ), n_ISms ); bits_element[n_ISms - 1] = add( bits_element[n_ISms - 1], bits_ism % n_ISms ); + move16(); /* ISM common signaling bits are counted in MASA MD bit-budget */ } @@ -462,22 +483,26 @@ ivas_error ivas_ism_config_fx( //(Q31 +Q0) - Q31 --> Q0 bits_ism = (Word16) Mpy_32_32( 42949673, ism_total_brate ); tmp1 = BASOP_Util_Divide1616_Scale( bits_ism, n_ISms, &exp ); - set_s( bits_element, shr( tmp1, ( 15 - exp ) ), n_ISms ); + set_s( bits_element, shr( tmp1, sub( 15, exp ) ), n_ISms ); bits_element[n_ISms - 1] = add( bits_element[n_ISms - 1], bits_ism % n_ISms ); + move16(); bitbudget_to_brate( bits_element, element_brate, n_ISms ); /* count ISm common signaling bits */ IF( hIsmMeta != NULL ) { nb_bits_metadata[0] = add( nb_bits_metadata[0], add( n_ISms * ISM_METADATA_FLAG_BITS, nchan_ism ) ); + move16(); IF( GE_32( ism_total_brate, ISM_EXTENDED_METADATA_BRATE ) ) { nb_bits_metadata[0] = add( nb_bits_metadata[0], ISM_EXTENDED_METADATA_BITS ); + move16(); IF( ism_extended_metadata_flag ) { nb_bits_metadata[0] = add( nb_bits_metadata[0], ISM_METADATA_IS_NDP_BITS ); + move16(); } } @@ -487,6 +512,9 @@ ivas_error ivas_ism_config_fx( { nb_bits_metadata[0] = add( nb_bits_metadata[0], ISM_METADATA_MD_FLAG_BITS ); nb_bits_metadata[0] = add( nb_bits_metadata[0], ISM_METADATA_FLAG_BITS ); + + move16(); + move16(); } ELSE { @@ -494,6 +522,9 @@ ivas_error ivas_ism_config_fx( { nb_bits_metadata[0] = add( nb_bits_metadata[0], ISM_METADATA_MD_FLAG_BITS ); nb_bits_metadata[0] = add( nb_bits_metadata[0], ISM_METADATA_INACTIVE_FLAG_BITS ); + + move16(); + move16(); } } } @@ -507,6 +538,7 @@ ivas_error ivas_ism_config_fx( tmp1 = BASOP_Util_Divide1616_Scale( bits_side, n_ISms, &exp ); set_s( nb_bits_metadata, shr( tmp1, ( 15 - exp ) ), n_ISms ); nb_bits_metadata[n_ISms - 1] = add( nb_bits_metadata[n_ISms - 1], bits_side % n_ISms ); + move16(); v_sub_s( bits_element, nb_bits_metadata, bits_CoreCoder, n_ISms ); bitbudget_to_brate( bits_CoreCoder, total_brate, n_ISms ); @@ -529,21 +561,24 @@ ivas_error ivas_ism_config_fx( diff = add( diff, sub( bits_CoreCoder[ch], BITS_ISM_INACTIVE ) ); bits_CoreCoder[ch] = BITS_ISM_INACTIVE; flag_higher[ch] = 0; + move16(); + move16(); } } n_higher = sum_s( flag_higher, n_ISms ); test(); - IF( GT_16( diff, 0 ) && GT_16( n_higher, 0 ) ) + IF( diff > 0 && n_higher > 0 ) { tmp = BASOP_Util_Divide1616_Scale( diff, n_higher, &exp ); - tmp = shr( tmp, ( 15 - exp ) ); + tmp = shr( tmp, sub( 15, exp ) ); FOR( ch = 0; ch < n_ISms; ch++ ) { IF( flag_higher[ch] ) { bits_CoreCoder[ch] = add( bits_CoreCoder[ch], tmp ); + move16(); } } @@ -551,11 +586,12 @@ ivas_error ivas_ism_config_fx( move16(); ch = 0; move16(); - WHILE( EQ_16( flag_higher[ch], 0 ) ) + WHILE( flag_higher[ch] == 0 ) { ch = add( ch, 1 ); } bits_CoreCoder[ch] = add( bits_CoreCoder[ch], tmp ); + move16(); } bitbudget_to_brate( bits_CoreCoder, total_brate, n_ISms ); @@ -609,15 +645,16 @@ ivas_error ivas_ism_config_fx( } test(); - IF( GT_16( diff, 0 ) && GT_16( n_higher, 0 ) ) + IF( diff > 0 && n_higher > 0 ) { tmp = BASOP_Util_Divide1616_Scale( diff, n_higher, &exp ); - tmp = shr( tmp, ( 15 - exp ) ); + tmp = shr( tmp, sub( 15, exp ) ); FOR( ch = 0; ch < n_ISms; ch++ ) { IF( flag_higher[ch] ) { bits_CoreCoder[ch] = add( bits_CoreCoder[ch], tmp ); + move16(); } } @@ -625,11 +662,12 @@ ivas_error ivas_ism_config_fx( move16(); ch = 0; move16(); - WHILE( EQ_16( flag_higher[ch], 0 ) ) + WHILE( flag_higher[ch] == 0 ) { ch = add( ch, 1 ); } bits_CoreCoder[ch] = add( bits_CoreCoder[ch], tmp ); + move16(); } /* verify for the maximum bitrate @12.8kHz core */ @@ -639,7 +677,7 @@ ivas_error ivas_ism_config_fx( { limit_high = BITS_IVAS_512k; move16(); - IF( LT_32( element_brate[ch], SCE_CORE_16k_LOW_LIMIT ) ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */ + if ( LT_32( element_brate[ch], SCE_CORE_16k_LOW_LIMIT ) ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */ { limit_high = BITS_ACELP_12k8_HIGH_LIMIT; move16(); @@ -670,13 +708,13 @@ ivas_error ivas_ism_config_fx( } } - IF( GT_16( diff, 0 ) ) + IF( diff > 0 ) { ch = 0; move16(); FOR( ch = 0; ch < n_ISms; ch++ ) { - IF( EQ_16( flag_higher[ch], 0 ) ) + IF( flag_higher[ch] == 0 ) { IF( GT_16( diff, limit_high ) ) { @@ -687,8 +725,9 @@ ivas_error ivas_ism_config_fx( ELSE { bits_CoreCoder[ch] = add( bits_CoreCoder[ch], diff ); + move16(); - IF( combined_format_flag ) + if ( combined_format_flag ) { diff = 0; move16(); @@ -701,7 +740,7 @@ ivas_error ivas_ism_config_fx( IF( combined_format_flag ) { - IF( GT_16( diff, 0 ) ) + IF( diff > 0 ) { FOR( ch = 0; ch < n_ISms; ch++ ) { @@ -853,7 +892,7 @@ Word16 ism_quant_meta_fx( Word32 qlow_fx, step_fx; Word16 tmp, tmp_e; - IF( val <= borders_fx[1] ) + IF( LE_32( val, borders_fx[1] ) ) { qlow_fx = borders_fx[0]; move32(); @@ -862,7 +901,7 @@ Word16 ism_quant_meta_fx( step_fx = q_step_border_fx; move32(); } - ELSE IF( val <= borders_fx[2] ) + ELSE IF( LE_32( val, borders_fx[2] ) ) { qlow_fx = borders_fx[1]; move32(); @@ -890,6 +929,7 @@ Word16 ism_quant_meta_fx( // idx = idx_start + (int16_t) max( 0.f, min( cbsize - 1, ( ( val - qlow_fx ) / step_fx + 0.5f ) ) ); *valQ = L_add( imult3216( step_fx, sub( idx, idx_start ) ), qlow_fx ); + move32(); return idx; } @@ -949,29 +989,48 @@ Word32 ism_dequant_meta_fx( const Word16 cbsize /* i : codebook size */ ) { - Word16 idx_start; + Word16 idx_start, tmp1, tmp2, exp1, exp2; Word32 qlow_fx, step_fx, valQ_fx; - IF( idx <= L_shr( L_sub( borders_fx[1], borders_fx[0] ), 21 ) / L_shr( q_step_border_fx, 21 ) ) + tmp1 = BASOP_Util_Divide3232_Scale( L_shr( L_sub( borders_fx[1], borders_fx[0] ), 21 ), L_shr( q_step_border_fx, 21 ), &exp1 ); + tmp1 = shr( tmp1, sub( 15, exp1 ) ); + + tmp2 = BASOP_Util_Divide3232_Scale( L_shr( L_sub( borders_fx[3], borders_fx[2] ), 21 ), L_shr( q_step_border_fx, 21 ), &exp2 ); + tmp2 = shr( tmp2, sub( 15, exp2 ) ); + + + IF( LE_16( idx, tmp1 ) ) { qlow_fx = borders_fx[0]; idx_start = 0; step_fx = q_step_border_fx; + + move32(); + move32(); + move16(); } - ELSE IF( idx <= cbsize - 1 - L_shr( L_sub( borders_fx[3], borders_fx[2] ), 21 ) / L_shr( q_step_border_fx, 21 ) ) + ELSE IF( LE_16( idx, sub( sub( cbsize, 1 ), tmp2 ) ) ) { qlow_fx = borders_fx[1]; - idx_start = (Word16) ( L_shr( L_sub( borders_fx[1], borders_fx[0] ), 21 ) / L_shr( q_step_border_fx, 21 ) ); + idx_start = tmp1; step_fx = q_step_fx; + + move32(); + move32(); + move16(); } ELSE { qlow_fx = borders_fx[2]; - idx_start = (Word16) ( cbsize - 1 - L_shr( L_sub( borders_fx[3], borders_fx[2] ), 21 ) / L_shr( q_step_border_fx, 21 ) ); + idx_start = (Word16) sub( sub( cbsize, 1 ), tmp2 ); step_fx = q_step_border_fx; + + move32(); + move32(); + move16(); } - valQ_fx = sub( idx, idx_start ) * step_fx + qlow_fx; + valQ_fx = L_add( sub( idx, idx_start ) * step_fx, qlow_fx ); return valQ_fx; } @@ -1094,6 +1153,7 @@ void ivas_param_ism_config_fx( * ---------------------------------------------------------------*/ /*! r : ISM format mode */ +#ifdef IVAS_FLOAT_FIXED ISM_MODE ivas_ism_mode_select( const Word16 nchan_inp, /* i : number of input objects */ const Word32 ivas_total_brate /* i : IVAS total bitrate */ @@ -1116,7 +1176,27 @@ ISM_MODE ivas_ism_mode_select( return ism_mode; } +#else +ISM_MODE ivas_ism_mode_select( + const int16_t nchan_inp, /* i : number of input objects */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + ISM_MODE ism_mode = ISM_MODE_NONE; + + if ( nchan_inp > 2 && ivas_total_brate <= ACELP_32k ) + { + ism_mode = ISM_MODE_PARAM; + } + else + { + ism_mode = ISM_MODE_DISC; + } + + return ism_mode; +} +#endif /*--------------------------------------------------------------- * ivas_ism_metadata_close() @@ -1253,13 +1333,26 @@ void ivas_get_ism_sid_quan_bitbudget_fx( *nBits_coh = ISM_DTX_COH_SCA_BITS; *nBits_sce_id = 1; - IF( nchan_ism >= 3 ) + move16(); + move16(); + move16(); + move16(); + move32(); + move32(); + + IF( GE_16( nchan_ism, 3 ) ) { *nBits_azimuth = ISM_DTX_AZI_BITS_LOW; *nBits_elevation = ISM_DTX_ELE_BITS_LOW; *q_step_fx = ISM_Q_STEP_LOW_FX; *q_step_border_fx = ISM_Q_STEP_BORDER_LOW_FX; *nBits_sce_id = 2; + + move16(); + move16(); + move16(); + move16(); + move32(); } return; diff --git a/lib_com/ivas_lfe_com.c b/lib_com/ivas_lfe_com.c index 0249e288e..7fdfe40fa 100644 --- a/lib_com/ivas_lfe_com.c +++ b/lib_com/ivas_lfe_com.c @@ -199,6 +199,11 @@ void ivas_lfe_window_init_fx( move16(); move16(); + move16(); + move16(); + move16(); + move16(); + return; } #else diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 27ceb3c0b..437e88399 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1200,11 +1200,19 @@ ivas_error ivas_ism_config( const int16_t combined_format_flag /* i : flag indicating combined format */ ); +#ifdef IVAS_FLOAT_FIXED void bitbudget_to_brate( const Word16 x[], /* i : bitbudgets */ Word32 y[], /* o : bitrates */ const Word16 N /* i : number of entries to be converted */ ); +#else +void bitbudget_to_brate( + const int16_t x[], /* i : bitbudgets */ + int32_t y[], /* o : bitrates */ + const int16_t N /* i : number of entries to be converted */ +); +#endif void ivas_ism_reset_metadata( ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handles */ @@ -1306,10 +1314,17 @@ ivas_error ivas_ism_metadata_dec( *----------------------------------------------------------------------------------*/ /*! r: ISM format mode */ +#ifdef IVAS_FLOAT_FIXED ISM_MODE ivas_ism_mode_select( const Word16 nchan_inp, /* i : number of input objects */ const Word32 ivas_total_brate /* i : IVAS total bitrate */ ); +#else +ISM_MODE ivas_ism_mode_select( + const int16_t nchan_inp, /* i : number of input objects */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); +#endif ivas_error ivas_param_ism_enc_open( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ @@ -6439,22 +6454,45 @@ void ivas_arith_decode_cmplx_cell_array( int16_t *pSymbol_re_old ); +#ifndef IVAS_FLOAT_FIXED void ivas_ari_start_decoding_14bits_ext_1_lfe( Decoder_State *st, Tastat *s, int16_t *extra_bits_read ); +#else +void ivas_ari_start_decoding_14bits_ext_1_lfe( + Decoder_State *st, + Tastat *s, + Word16 *extra_bits_read +); +#endif +#ifndef IVAS_FLOAT_FIXED uint16_t ivas_ari_decode_14bits_bit_ext_1_lfe( Decoder_State *st, Tastat *s, const uint16_t *cum_freq, int16_t *extra_bits_read ); +#else +UWord16 ivas_ari_decode_14bits_bit_ext_1_lfe( + Decoder_State *st, Tastat *s, + const UWord16 *cum_freq, + Word16 *extra_bits_read +); +#endif +#ifndef IVAS_FLOAT_FIXED void ivas_ari_done_decoding_14bits_ext_1_lfe( Decoder_State *st, const int16_t extra_bits_read ); +#else +void ivas_ari_done_decoding_14bits_ext_1_lfe( + Decoder_State *st, + const Word16 extra_bits_read +); +#endif void ivas_ari_done_encoding_14bits( BSTR_ENC_HANDLE hBstr, Tastat *s @@ -7773,6 +7811,15 @@ ivas_error ivas_FB_mixer_open( const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ ); +#ifdef IVAS_FLOAT_FIXED +void ivas_FB_mixer_close_fx( + IVAS_FB_MIXER_HANDLE *hFbMixer, /* i/o: FB mixer handle */ + const Word32 sampling_rate, /* i : sampling rate in Hz */ + const Word16 spar_reconfig_flag /* i : SPAR reconfiguration flag */ +); + +#endif + void ivas_FB_mixer_close( IVAS_FB_MIXER_HANDLE *hFbMixer, /* i/o: FB mixer handle */ const int32_t sampling_rate, /* i : sampling rate in Hz */ diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 8733ad0bd..ace600eab 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -6835,4 +6835,4 @@ const ACPL_QUANT_TABLE ivas_mc_paramupmix_beta_quant_table[9] = 0, /* offset */ { +0.000000e+000f, +5.937500e-002f, +1.375000e-001f, +2.343750e-001f, +3.500000e-001f, +4.843750e-001f, +6.375000e-001f, +8.093750e-001f, +1.000000e+000f } /* data */ } -}; +}; \ No newline at end of file diff --git a/lib_com/ivas_sns_com_fx.c b/lib_com/ivas_sns_com_fx.c index d053e957f..9e83cd240 100644 --- a/lib_com/ivas_sns_com_fx.c +++ b/lib_com/ivas_sns_com_fx.c @@ -280,14 +280,14 @@ void sns_interpolate_scalefactors_fx( FOR( n = 0; n <= M - 2; n++ ) { - scf_int[add( n * 4, 2 )] = L_add( scf[n], Mpy_32_16_1( L_sub( scf[n + 1], scf[n] ), 4096 ) ); /* 4096 -> 1/8 in Q15 */ - scf_int[add( n * 4, 3 )] = L_add( scf[n], Mpy_32_16_1( L_sub( scf[n + 1], scf[n] ), 12288 ) ); /* 12288 -> 3/8 in Q15 */ - scf_int[add( n * 4, 4 )] = L_add( scf[n], Mpy_32_16_1( L_sub( scf[n + 1], scf[n] ), 20480 ) ); /* 20480 -> 5/8 in Q15 */ - scf_int[add( n * 4, 5 )] = L_add( scf[n], Mpy_32_16_1( L_sub( scf[n + 1], scf[n] ), 28672 ) ); /* 28672 -> 7/8 in Q15 */ + scf_int[add( n * 4, 2 )] = Madd_32_16( scf[n], L_sub( scf[n + 1], scf[n] ), 4096 ); /* 4096 -> 1/8 in Q15 */ + scf_int[add( n * 4, 3 )] = Madd_32_16( scf[n], L_sub( scf[n + 1], scf[n] ), 12288 ); /* 12288 -> 3/8 in Q15 */ + scf_int[add( n * 4, 4 )] = Madd_32_16( scf[n], L_sub( scf[n + 1], scf[n] ), 20480 ); /* 20480 -> 5/8 in Q15 */ + scf_int[add( n * 4, 5 )] = Madd_32_16( scf[n], L_sub( scf[n + 1], scf[n] ), 28672 ); /* 28672 -> 7/8 in Q15 */ } - scf_int[FDNS_NPTS - 2] = L_add( scf[M - 1], Mpy_32_16_1( L_sub( scf[M - 1], scf[M - 2] ), 4096 ) ); - scf_int[FDNS_NPTS - 1] = L_add( scf[M - 1], Mpy_32_16_1( L_sub( scf[M - 1], scf[M - 2] ), 12288 ) ); + scf_int[FDNS_NPTS - 2] = Madd_32_16( scf[M - 1], L_sub( scf[M - 1], scf[M - 2] ), 4096 ); + scf_int[FDNS_NPTS - 1] = Madd_32_16( scf[M - 1], L_sub( scf[M - 1], scf[M - 2] ), 12288 ); /* Inversion at encoder-side */ IF( encoder_side == ENC ) diff --git a/lib_com/ivas_stereo_ica_com_fx.c b/lib_com/ivas_stereo_ica_com_fx.c index 6ffce03e4..d96d64c7c 100644 --- a/lib_com/ivas_stereo_ica_com_fx.c +++ b/lib_com/ivas_stereo_ica_com_fx.c @@ -397,4 +397,4 @@ void adjustTargetSignal_fx( return; } -#endif +#endif \ No newline at end of file diff --git a/lib_com/prot.h b/lib_com/prot.h index 54444a92b..96bdd1952 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -4201,12 +4201,21 @@ void AVQ_encmux( int16_t trgtSvPos /* i : target SV for AVQ bit savings */ ); +#ifndef IVAS_FLOAT_FIXED void ordr_esti( const int16_t k, /* i : sub-vector index */ int16_t *Mpos, /* i/o: dominant sub-vector position from ACV */ int16_t svOrder[], /* i/o: AVQ sub-vector order */ const int16_t Nsv /* i : total sub-vectors in a sub-frames */ ); +#else +void ordr_esti( + const Word16 k, /* i : sub-vector index */ + Word16 *Mpos, /* i/o: dominant sub-vector position from ACV */ + Word16 svOrder[], /* i/o: AVQ sub-vector order */ + const Word16 Nsv /* i : total sub-vectors in a sub-frames */ +); +#endif void re8_cod( int16_t x[], /* i : point in RE8 (8-dimensional integer vector) */ @@ -7907,7 +7916,7 @@ void powfp_odd2_evs( Word16 *pout2 /* Q15 */ ); -void tcx_arith_scale_envelope_flt( +void tcx_arith_scale_envelope_ivas( const Word16 L_spec_core, /* i : number of lines to scale Q0 */ Word16 L_frame, /* i : number of lines Q0 */ const Word32 env[], /* i : unscaled envelope Q16 */ @@ -7917,7 +7926,7 @@ void tcx_arith_scale_envelope_flt( Word16 *s_env_e /* o : scaled envelope exponent Q0 */ ); -void tcx_arith_render_envelope_flt( +void tcx_arith_render_envelope_ivas( const Word16 A_ind[], /* i : LPC coefficients of signal envelope */ const Word16 L_frame, /* i : number of spectral lines */ const Word16 L_spec, /* i : length of the coded spectrum */ @@ -9049,7 +9058,6 @@ void SynthesisSTFT_flt( #ifdef IVAS_FLOAT_FIXED void SynthesisSTFT_fx( Word32 *fftBuffer, /* i : FFT bins */ - Word16 Q_in, Word32 *timeDomainOutput, Word32 *olapBuffer, const Word16 *olapWin, diff --git a/lib_com/prot_fx1.h b/lib_com/prot_fx1.h index d560a67a7..b7867429b 100644 --- a/lib_com/prot_fx1.h +++ b/lib_com/prot_fx1.h @@ -93,6 +93,12 @@ void Copy32( const Word16 L /* i : vector length */ ); +void set8_fx( + Word8 y[], /* i/o: Vector to set */ + const Word8 a, /* i : Value to set the vector to */ + const Word16 N /* i : Lenght of the vector */ +); + void set16_fx( Word16 y[], /* i/o: Vector to set */ const Word16 a, /* i : Value to set the vector to */ diff --git a/lib_com/prot_fx2.h b/lib_com/prot_fx2.h index 4f0a2cbbc..fc488f233 100644 --- a/lib_com/prot_fx2.h +++ b/lib_com/prot_fx2.h @@ -144,6 +144,12 @@ void Vr_add( Word16 Len /* i : Vector lenght */ ); +void set8_fx( + Word8 y[], /* i/o: Vector to set */ + const Word8 a, /* i : Value to set the vector to */ + const Word16 N /* i : Lenght of the vector */ +); + void set16_fx( Word16 y[], /* i/o: Vector to set */ const Word16 a, /* i : Value to set the vector to */ @@ -2762,7 +2768,7 @@ void ScaleShapedSHB_fx( Word16 prev_Q_bwe_syn2 ); void ScaleShapedSHB_32( - const int16_t length, /* i : SHB overlap length */ + const Word16 length, /* i : SHB overlap length */ Word32 *synSHB_fx, /* i/o: synthesized shb signal Qx */ Word32 *overlap_fx, /* i/o: buffer for overlap-add Qx */ const Word16 *subgain_fx, /* i : subframe gain Q15 */ diff --git a/lib_com/stat_noise_uv_mod_fx.c b/lib_com/stat_noise_uv_mod_fx.c index 8d8949758..4d3badffc 100644 --- a/lib_com/stat_noise_uv_mod_fx.c +++ b/lib_com/stat_noise_uv_mod_fx.c @@ -77,6 +77,7 @@ void stat_noise_uv_mod_fx( Word16 Exc2_local[L_FRAME]; /* local_copy in scaled Q_local*/ #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif /*---------------------------------------------------------* @@ -188,7 +189,7 @@ void stat_noise_uv_mod_fx( ELSE { *uv_count = s_min( *uv_count, FULL_NG ); - + move16(); tmp_nom = sub( *uv_count, START_NG ); tmp_den = sub( FULL_NG, START_NG ); tmp_shift = norm_s( tmp_den ); @@ -228,6 +229,7 @@ void stat_noise_uv_mod_fx( IF( EQ_16( *uv_count, 1 ) ) { *ge_sm = L_shr( L_Ge, Q_local ); + move32(); } ELSE { @@ -300,8 +302,10 @@ void stat_noise_uv_mod_fx( L_tmp = L_add( L_tmp3, L_shl( Mult_32_16( L_tmp, tmp_res ), 1 ) ); /* Q_local+16+14-15+1 */ #endif Exc2_local[i] = extract_h( L_tmp ); /*Q_local */ + move16(); } - *Q_stat_noise = Q_local; /* update for next call, routine can only be called once every frame */ + *Q_stat_noise = Q_local; /* update for next call, routine can only be called once every frame */ + move16(); Qdiff = sub( Q_exc, Q_local ); /* local excitation and incoming excitation */ Scale_sig( Exc2_local, L_FRAME, Qdiff ); Copy( Exc2_local, exc2, L_FRAME ); @@ -376,7 +380,6 @@ static Word16 calc_tilt_fx( /* o : Excitation tilt Q15*/ r0 = L_deposit_l( 0 ); r1 = L_deposit_l( 0 ); xi = shr( x[0], Q_shift ); - move16(); FOR( i = 0; i < len - 1; i++ ) { @@ -403,7 +406,6 @@ static Word16 calc_tilt_fx( /* o : Excitation tilt Q15*/ } tmp_shift = norm_l( r0 ); - move16(); r0 = L_shl( r0, tmp_shift ); tmp_sign = 1; move16(); diff --git a/lib_com/swb_bwe_com_fx.c b/lib_com/swb_bwe_com_fx.c index f194355bf..ff4f55f9f 100644 --- a/lib_com/swb_bwe_com_fx.c +++ b/lib_com/swb_bwe_com_fx.c @@ -81,8 +81,10 @@ Word16 WB_BWE_gain_pred_fx( Word32 enerL; Word16 n_freq, mode, pitch; Word16 ener_var_flag = 0; + move16(); Word16 voice_factor, enerL_16, enerL_40, enerL_64; Word16 env_var_flag = 0; + move16(); Word16 exp; Word16 tmp, tmp1; Word32 L_tmp; @@ -128,7 +130,7 @@ Word16 WB_BWE_gain_pred_fx( voice_factor = extract_l( L_shr( L_tmp, 2 ) ); /*Q13 */ Copy_Scale_sig( pitch_buf, pitch_buf_tmp, 4, -1 ); pitch = sum16_fx( pitch_buf_tmp, 4 ); - move16(); /*Q5 */ + /*Q5 */ L_tmp = L_shr( enerL, 4 ); test(); @@ -201,6 +203,7 @@ Word16 WB_BWE_gain_pred_fx( #ifdef BASOP_NOGLOB WB_fenv[0] = round_fx_sat( L_shl_sat( L_tmp, sub( exp, 12 ) ) ); /* Q3 */ + move16(); #else WB_fenv[0] = round_fx( L_shl( L_tmp, sub( exp, 12 ) ) ); /* Q3 */ #endif @@ -252,12 +255,14 @@ Word16 WB_BWE_gain_pred_fx( tmp = s_min( tmp, 16384 ); L_tmp = L_shr( L_mult0( tmp, WB_fenv[0] ), 12 ); /*Q15 */ WB_fenv[0] = extract_l( L_tmp ); /*Q3 */ + move16(); } IF( GT_16( WB_fenv[0], prev_WB_fenv ) ) { /*WB_fenv[0]= add(mult_r(9830, WB_fenv[0]), mult_r(22938, prev_WB_fenv)); move16();//Q3 */ WB_fenv[0] = round_fx( L_mac( L_mult( 9830, WB_fenv[0] ), 22938, prev_WB_fenv ) ); /*Q3 */ + move16(); } } @@ -308,11 +313,12 @@ Word16 WB_BWE_gain_pred_fx( tmp = s_min( tmp, 16384 ); L_tmp = L_shr( L_mult0( tmp, WB_fenv[0] ), 12 ); /*Q3 */ WB_fenv[0] = extract_l( L_tmp ); /*Q3 */ - + move16(); IF( GT_16( WB_fenv[0], prev_WB_fenv ) ) { /*WB_fenv[0] = add(mult_r(9830, WB_fenv[0]), mult_r(22938, prev_WB_fenv));//Q3 */ WB_fenv[0] = round_fx( L_mac( L_mult( 9830, WB_fenv[0] ), 22938, prev_WB_fenv ) ); /*Q3 */ + move16(); } } @@ -332,12 +338,14 @@ Word16 WB_BWE_gain_pred_fx( L_tmp = L_mult( WB_fenv[0], tmp ); /*Q(21-exp) */ WB_fenv[0] = round_fx( L_shl( L_tmp, sub( exp, 2 ) ) ); /*Q3 */ - tmp1 = mult_r( 328, pitch ); /*Q7 */ - tmp = s_min( s_max( tmp1, 16 ), 256 ); /*Q7 */ - L_tmp = L_shr( L_mult0( WB_fenv[0], tmp ), 7 ); /*Q3 */ - /*WB_fenv[0] = saturate(L_tmp); //Q3 */ + move16(); + tmp1 = mult_r( 328, pitch ); /*Q7 */ + tmp = s_min( s_max( tmp1, 16 ), 256 ); /*Q7 */ + L_tmp = L_shr( L_mult0( WB_fenv[0], tmp ), 7 ); /*Q3 */ + /*WB_fenv[0] = saturate(L_tmp); //Q3 */ #ifdef BASOP_NOGLOB WB_fenv[0] = round_fx_sat( L_shl_sat( L_tmp, 16 ) ); /*Q3 */ + move16(); #else WB_fenv[0] = round_fx( L_shl( L_tmp, 16 ) ); /*Q3 */ #endif @@ -347,11 +355,13 @@ Word16 WB_BWE_gain_pred_fx( { /*WB_fenv[0]= add(mult_r(29491, last_wb_bwe_ener), mult_r(3277, WB_fenv[0]));//Q3 */ WB_fenv[0] = round_fx( L_mac( L_mult( 29491, last_wb_bwe_ener ), 3277, WB_fenv[0] ) ); /*Q3 */ + move16(); } IF( NE_16( last_extl_fx, WB_BWE ) && LT_16( tilt_wb_fx, 128 ) ) { WB_fenv[0] = mult_r( s_min( 16384, shl( tilt_wb_fx, 8 ) ), WB_fenv[0] ); + move16(); } IF( env_var_flag == 1 ) @@ -620,6 +630,7 @@ Word32 calc_tilt_bwe_fx( /* o : Tilt in Q24 */ Word16 exp2; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif BASOP_SATURATE_WARNING_OFF_EVS @@ -742,18 +753,17 @@ Word16 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ Word32 L_ener, L_ener_tot, L_temp; Word32 tmp1, tmp2; Word16 sign = 0; + move16(); const Word32 *ptr; Word16 exp2, tmp_exp; BASOP_SATURATE_WARNING_OFF_EVS /* this is required for adaptative precision energy summation loop, do not remove */ - move16(); exp2 = 0; move16(); - ptr = sp; - move16(); + L_ener_tot = L_deposit_l( 1 ); /* Divide Frame Length by 32 */ @@ -796,6 +806,7 @@ Word16 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ } L_temp = L_ener_tot; + move32(); tmp_exp = sub( Q31, sub( shl( exp_sp, 1 ), Q31 ) ); L_temp = Sqrt32( L_temp, &tmp_exp ); L_temp = L_shl( L_temp, sub( exp_sp, sub( Q31, tmp_exp ) ) ); @@ -805,6 +816,7 @@ Word16 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ IF( GT_16( sub( exp2, 4 ), norm_l( L_temp ) ) ) { L_temp = MAX_16; + move32(); } ELSE { @@ -833,7 +845,6 @@ void calc_norm_envelop_fx( Word16 i, lookback, env_index, n_freq, n_lag_now, n_lag, tmp; lookback = shr( L_swb_norm, 1 ); - move16(); env_index = add( swb_bwe_subband[0], st_offset ); n_lag_now = L_swb_norm; move16(); @@ -937,6 +948,8 @@ void WB_BWE_decoding_fx( Word16 alfa, beta; Word16 flag = 0; Word16 core_type = 1; + move16(); + move16(); Word16 tmp, tmp1, exp, tmp2; Word32 L_tmp, L_tmp1, L_tmp2; Word32 prev_ener_alpha, prev_ener_beta; @@ -984,6 +997,7 @@ void WB_BWE_decoding_fx( FOR( n_freq = swb_bwe_subband[0]; n_freq < swb_bwe_subband[4]; n_freq++ ) { signum[n_freq] = 1; + move16(); IF( WB_signal[n_freq] < 0 ) { signum[n_freq] = -1; @@ -996,10 +1010,12 @@ void WB_BWE_decoding_fx( L_tmp1 = L_deposit_l( WB_signal[n_freq] ); /* Q_syn */ L_tmp = L_sub( L_tmp1, L_tmp ); /* Q_syn */ WB_signal[n_freq] = extract_l( L_tmp ); /* Q_syn */ + move16(); IF( L_tmp > 0 ) { tmp = sub( 18022, weight ); /* Q15 */ WB_signal[n_freq] = extract_l( Mult_32_16( L_tmp, tmp ) ); /* Q_syn */ + move16(); } IF( NE_16( signum[n_freq], 1 ) ) @@ -1021,6 +1037,7 @@ void WB_BWE_decoding_fx( tmp = div_s( 16384, tmp ); L_tmp = L_shr( L_mult0( WB_signal[n_freq], tmp ), add( exp, Q_syn ) ); /*Q15 */ WB_signal[n_freq] = extract_l( L_tmp ); /*Q15 */ + move16(); } ELSE { @@ -1188,15 +1205,19 @@ void WB_BWE_decoding_fx( { /*wfenv[0]= add(mult_r(9830, WB_fenv[0]), mult_r(22938, prev_WB_fenv[0]));//Q3 */ wfenv[0] = round_fx( L_mac( L_mult( 9830, WB_fenv[0] ), 22938, prev_WB_fenv[0] ) ); /*Q3 */ + move16(); /*wfenv[1]= add(mult_r(9830, WB_fenv[1]), mult_r(22938, prev_WB_fenv[1]));//Q3 */ wfenv[1] = round_fx( L_mac( L_mult( 9830, WB_fenv[1] ), 22938, prev_WB_fenv[1] ) ); /*Q3 */ + move16(); } ELSE { /*wfenv[0]= add(mult_r(16384,WB_fenv[0]),mult_r(16384,prev_WB_fenv[0]));//Q3 */ wfenv[0] = round_fx( L_mac( L_mult( 16384, WB_fenv[0] ), 16384, prev_WB_fenv[0] ) ); /*Q3 */ + move16(); /*wfenv[1]= add(mult_r(13108,WB_fenv[1]),mult_r(13108,prev_WB_fenv[1]));//Q3 */ wfenv[1] = round_fx( L_mac( L_mult( 13108, WB_fenv[1] ), 13108, prev_WB_fenv[1] ) ); /*Q3 */ + move16(); } } ELSE IF( EQ_16( last_extl, WB_BWE ) && LT_32( L_tmp1, L_tmp2 ) && GT_16( WB_fenv[0], prev_WB_fenv[0] ) && @@ -1204,16 +1225,20 @@ void WB_BWE_decoding_fx( { /*wfenv[0]= add(mult_r(9830,WB_fenv[0]),mult_r(22938,prev_WB_fenv[0]));//Q3 */ wfenv[0] = round_fx( L_mac( L_mult( 9830, WB_fenv[0] ), 22938, prev_WB_fenv[0] ) ); /*Q3 */ + move16(); /*wfenv[1]= add(mult_r(9830,WB_fenv[1]),mult_r(22938,prev_WB_fenv[1]));//Q3 */ wfenv[1] = round_fx( L_mac( L_mult( 9830, WB_fenv[1] ), 22938, prev_WB_fenv[1] ) ); /*Q3 */ + move16(); } ELSE IF( EQ_16( last_extl, WB_BWE ) && GT_32( EnergyL, prev_ener_alpha ) && GT_32( prev_ener_beta, EnergyL ) && NE_16( prev_coder_type, UNVOICED ) ) { /*wfenv[0] = add(shr(WB_fenv[0],1), shr(prev_WB_fenv[0],1));//Q3 */ wfenv[0] = round_fx( L_mac( L_mult( WB_fenv[0], 16384 ), prev_WB_fenv[0], 16384 ) ); /*Q3 */ + move16(); /*wfenv[1] = add(shr(WB_fenv[1],1), shr(prev_WB_fenv[1],1));//Q3 */ wfenv[1] = round_fx( L_mac( L_mult( WB_fenv[1], 16384 ), prev_WB_fenv[1], 16384 ) ); /*Q3 */ + move16(); } ELSE { @@ -1309,6 +1334,7 @@ void WB_BWE_decoding_fx( move32(); } *Q_syn_hb = add( Q_syn, add( tmp, 3 ) ); + move16(); return; } @@ -1475,6 +1501,7 @@ void SWB_BWE_decoding_fx( tmp = div_s( 16384, tmp ); /*Q(15+exp) */ L_tmp = L_shr( L_mult0( SWB_signal[n_freq], tmp ), add( exp, Q_syn ) ); /*Q15 */ SWB_signal[n_freq] = extract_l( L_tmp ); /*Q15 */ + move16(); } ELSE { @@ -1535,12 +1562,14 @@ void SWB_BWE_decoding_fx( { L_tmp = L_mult( SWB_fenv[n_band / 4], SWB_fenv[n_band / 4] ); /*Q3 */ prev_SWB_fenv[n_band] = round_fx( L_shl( L_tmp, 14 ) ); /*Q1 */ + move16(); } FOR( n_band = 0; n_band < 6; n_band++ ) { L_tmp = L_mult( SWB_fenv[2 + n_band / 3], SWB_fenv[2 + n_band / 3] ); /*Q3 */ prev_SWB_fenv[8 + n_band] = round_fx( L_shl( L_tmp, 14 ) ); /*Q1 */ + move16(); } *prev_weight = 16384; @@ -1582,6 +1611,7 @@ void SWB_BWE_decoding_fx( FOR( n_band = 0; n_band < SWB_FENV; n_band++ ) { SWB_fenv[n_band] = mult_r( SWB_fenv[n_band], 6554 ); + move16(); } fenvL_16 = mult_r( fenvL_16, 6554 ); } @@ -1611,6 +1641,7 @@ void SWB_BWE_decoding_fx( FOR( n_freq = add( swb_bwe_subband[0], st_offset ); n_freq < tmp; n_freq++ ) { *Seed = extract_l( L_mac0( 20101L, 12345, *Seed ) ); + move16(); SWB_signal[n_freq] = mult_r( *Seed, 32767 ); move16(); /*Q15 */ } @@ -1693,7 +1724,7 @@ void SWB_BWE_decoding_fx( } pit1 = &SWB_signal[367 + st_offset]; - move16(); + IF( GT_16( mult_r( tmp1, 6554 ), tmp2 ) ) { /*20480 = 5 in Q12 */ @@ -1704,6 +1735,7 @@ void SWB_BWE_decoding_fx( #else *pit1 = round_fx( L_shl( L_mult( *pit1, tmp3 ), 3 ) ); /*Q_syn */ #endif + move16(); pit1--; } } @@ -1716,7 +1748,6 @@ void SWB_BWE_decoding_fx( tmp2 = add( add( abs_s( SWB_signal[492 + st_offset] ), abs_s( SWB_signal[493 + st_offset] ) ), add( abs_s( SWB_signal[494 + st_offset] ), abs_s( SWB_signal[495 + st_offset] ) ) ); #endif pit1 = &SWB_signal[496 + st_offset]; - move16(); test(); IF( ( tmp2 == 0 ) || ( LT_16( tmp2, mult_r( tmp1, 9830 ) ) ) ) @@ -1775,6 +1806,7 @@ void SWB_BWE_decoding_fx( { L_tmp = Mult_32_16( L_tmp3, *pit1 ); /*Q(16-exp) */ *pit1-- = round_fx( L_shl( L_tmp, exp ) ); /*Q_syn */ + move16(); L_tmp3 = L_sub( L_tmp3, L_tmp4 ); } @@ -1807,6 +1839,7 @@ void SWB_BWE_decoding_fx( FOR( n_freq = L; n_freq < swb_bwe_subband[SWB_FENV] + st_offset; n_freq++ ) { signum[n_freq] = 1; + move16(); IF( SWB_signal[n_freq] < 0 ) { signum[n_freq] = -1; @@ -1827,7 +1860,7 @@ void SWB_BWE_decoding_fx( { SWB_signal[n_freq] = extract_l( L_tmp ); /* Q_syn */ } - + move16(); IF( NE_16( signum[n_freq], 1 ) ) { SWB_signal[n_freq] = negate( SWB_signal[n_freq] ); @@ -1843,7 +1876,8 @@ void SWB_BWE_decoding_fx( exp = sub( sub( 30, exp ), Q_syn ); tmp = div_s( 16384, tmp ); /* Q(15+exp) */ L_tmp = L_shr( L_mult0( SWB_signal[n_freq], tmp ), add( exp, Q_syn ) ); /* Q15 */ - SWB_signal[n_freq] = extract_l( L_tmp ); /* Q15 */ + SWB_signal[n_freq] = extract_l( L_tmp ); + move16(); /* Q15 */ } ELSE { @@ -1852,6 +1886,7 @@ void SWB_BWE_decoding_fx( } } *prev_weight = weight; + move16(); } ELSE { @@ -1859,6 +1894,7 @@ ELSE tmp = shl( div_s( shl( 1, sub( 14, exp ) ), L_swb_norm ), sub( exp, 14 ) ); /* Q15 */ tmp = add( shl( tmp, 1 ), tmp ); *prev_weight = s_max( s_min( tmp, 16384 ), 6554 ); /* Q15 */ + move16(); } IF( EQ_16( mode, HARMONIC ) ) @@ -1875,7 +1911,6 @@ IF( EQ_16( mode, HARMONIC ) ) } mean = extract_l( Mult_32_16( L_mean, 2048 ) ); /*Q15 */ pit1 -= 16; - move16(); FOR( n_freq = 0; n_freq < 16; n_freq++ ) { if ( LT_16( abs_s( *pit1 ), mean ) ) @@ -1921,6 +1956,7 @@ FOR( n_band = 0; n_band < SWB_FENV; n_band += L ) FOR( n_freq = add( swb_bwe_subband[n_band], st_offset ); n_freq < tmp; n_freq++ ) { SWB_signal_32[n_freq] = L_shl( L_mult( tmp_ener, SWB_signal[n_freq] ), tmp_exp ); /*Qsyn */ + move32(); } } ELSE @@ -2120,7 +2156,6 @@ void time_envelop_shaping_fx( Word32 L_tmp; pit = werr; - move16(); exp_L = norm_s( L ); inv_L = div_s( shl( 1, sub( 14, exp_L ) ), L ); /*Q(29-exp_L) */ FOR( i = 0; i < SWB_TENV; i++ ) @@ -2189,6 +2224,7 @@ void time_envelop_shaping_fx( #else *pit = round_fx( L_shl( L_mult( tmp, *pit ), sub( exp, 1 ) ) ); /*Q(13-exp+1)->Q(14-exp)->Qsyn-3 */ #endif + move16(); pit++; } } @@ -2270,7 +2306,6 @@ void time_reduce_pre_echo_fx( FOR( i = 0; i < 3; i++ ) { L_tmp = Mult_32_16( energyL[i], 29491 ); /*Q14 */ - test(); IF( GT_32( L_shr( energyL[i + 1], 1 ), L_tmp ) && GT_32( energyL[i + 1], 1638400 ) ) { pos = add( i, 1 ); @@ -2287,7 +2322,6 @@ void time_reduce_pre_echo_fx( } energy = L_deposit_l( 0 ); j = i_mult( L, pos ); - move16(); FOR( i = 0; i < j; i++ ) { #ifdef BASOP_NOGLOB @@ -2340,6 +2374,7 @@ void time_reduce_pre_echo_fx( #else error[i] = round_fx( L_shl( Mult_32_16( L_tmp, error[i] ), tmp_exp ) ); /*Q(30-exp+1-16)->Q(15-exp)->Q_synth */ #endif + move16(); } energy = L_deposit_l( 0 ); @@ -2394,6 +2429,7 @@ void time_reduce_pre_echo_fx( tmp = round_fx( L_shl( Mult_32_16( L_tmp, *pit ), add( 1, exp ) ) ); /*Q0 */ #endif *pit++ = tmp; + move16(); } } @@ -2519,6 +2555,7 @@ void calc_normal_length_fx_32( *L_swb_norm = extract_h( L_add( L_mac( L_mult( L_swb_norm_cur, 3276 ), *prev_L_swb_norm, 29491 ), 32768 ) ); *prev_L_swb_norm = L_swb_norm_cur; move16(); + move16(); } return; @@ -2700,6 +2737,7 @@ void hq_generic_decoding_fx( IF( EQ_16( tmp, 0 ) ) { nband_lf = 0; + move16(); } ELSE { diff --git a/lib_com/swb_bwe_com_lr_fx.c b/lib_com/swb_bwe_com_lr_fx.c index 738cff591..386db3433 100644 --- a/lib_com/swb_bwe_com_lr_fx.c +++ b/lib_com/swb_bwe_com_lr_fx.c @@ -87,12 +87,14 @@ static void est_freq_har_decis_fx( ) { Word16 temp_hfe2 = 0; + move16(); Word16 har_freq_est2_2; Word16 prev_frm_hfe2_2; IF( k != 0 ) { *har_freq_est1 = div_s_ss( sharp, k ); + move16(); } test(); @@ -100,6 +102,7 @@ static void est_freq_har_decis_fx( IF( GT_16( k1, 1 ) ) { *har_freq_est2 = div_s_ss( sharp1, k1 ); + move16(); } ELSE IF( LT_16( k1, 2 ) && ( k2 != 0 || GT_16( k, 1 ) ) ) { @@ -257,6 +260,7 @@ Word16 har_est_fx( FOR( i = N; i < temp; i++ ) { L_input_abs[i] = L_deposit_l( 0 ); + move16(); } q = start_pos; @@ -315,6 +319,7 @@ Word16 har_est_fx( IF( GT_32( *p_L_blk_peak, *pm1_L_blk_peak ) ) { *pm1_L_blk_peak = L_deposit_l( 0 ); + move32(); *pm1_blk_peak_pos = 0; move16(); } @@ -325,6 +330,7 @@ Word16 har_est_fx( *p_blk_peak_pos = *pm1_blk_peak_pos; move16(); *pm1_L_blk_peak = L_deposit_l( 0 ); + move32(); *pm1_blk_peak_pos = 0; move16(); } @@ -569,7 +575,6 @@ Word16 har_est_fx( blk_peak_pos_hfsb2[ct_hfsb2] = blk_peak_pos_te[i]; move16(); ct_hfsb2 = add( ct_hfsb2, 1 ); - move16(); } } @@ -580,9 +585,11 @@ Word16 har_est_fx( FOR( i = 1; i < ct_hfsb2; i++ ) { diff_peak_pos_hfsb2[i - 1] = sub( blk_peak_pos_hfsb2[i], blk_peak_pos_hfsb2[i - 1] ); + move16(); sum_diff = add( sum_diff, diff_peak_pos_hfsb2[i - 1] ); } *har_freq_est2 = div_s_ss( sum_diff, ct_hfsb2 ); + move16(); } ELSE { @@ -648,7 +655,7 @@ void genhf_noise_fx( FOR( k = 0; k < 2; k++ ) { nlags[k] = shl( 1, bits_lagIndices_mode0_Har[k] ); - + move16(); l = 0; move16(); WHILE( LT_16( st_last_peakpos, add( fLenLow, subband_offsets[k] ) ) ) @@ -665,7 +672,7 @@ void genhf_noise_fx( FOR( j = 0; j < sbWidth[k]; j++ ) { L_xSynth_har[j] = L_shl( L_deposit_l( noise_flr_fx[st_pos + j] ), sub( QsL, Qss ) ); - + move32(); L_tmpbuf[j] = L_xSynth_har[j]; move32(); IF( predBuf_fx[st_pos + j] != 0x0 ) @@ -692,6 +699,7 @@ void genhf_noise_fx( /*xSynth_har[ii] = noise_flr[j];*/ L_xSynth_har[ii] = L_shl( L_deposit_l( noise_flr_fx[j] ), sub( QsL, Qss ) ); + move32(); L_tmpbuf[ii] = L_xSynth_har[ii]; move32(); IF( predBuf_fx[j] != 0x0 ) @@ -749,6 +757,8 @@ void genhf_noise_fx( { st_last_peakpos = add( st_last_peakpos, har_freq_est2 ); } + test(); + test(); WHILE( LT_16( st_last_peakpos, hfband_end[k] ) && LT_16( pul_res[k], pul_res[2 - l] ) && LE_16( l, 2 ) ) { test(); @@ -813,7 +823,7 @@ static void SmoothSpec_fx( lo = L_Extract_lc( L_sum, &hi ); *outBuf++ = round_fx( L_shl( Mpy_32_16( hi, lo, inItems ), 16 ) ); /* Q(8+15+1-16)=Q8 -> Q(8+16-16)=Q8 */ - + move16(); L_sum = L_mac0( L_sum, 0x0001, *newPtr++ ); /* nItems += 2, * only used value is 5 --> @@ -831,6 +841,7 @@ static void SmoothSpec_fx( lo = L_Extract_lc( L_sum, &hi ); /* 4681 (in Q15) = 0.1428 = 1/7 */ *outBuf++ = round_fx( L_shl( Mpy_32_16( hi, lo, 4681 ), 16 ) ); /* Q(8+15+1-16)=Q8 -> Q(8+16-16)=Q8 */ + move16(); i = add( i, 1 ); /*-- Moving average. --*/ @@ -843,6 +854,7 @@ static void SmoothSpec_fx( lo = L_Extract_lc( L_sum, &hi ); /* 4681 (in Q15) = 0.1428 = 1/7 */ *outBuf++ = round_fx( L_shl( Mpy_32_16( hi, lo, 4681 ), 16 ) ); /* Q(8+15+1-16)=Q8 -> Q(8+16-16)=Q8 */ + move16(); inBuf++; } @@ -921,10 +933,11 @@ void SpectrumSmoothing_fx( Word16 exp_norm; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif *Qss = 10; - + move16(); num_subband_smooth_pre_fx = mult( fLen, 21845 ); /* 1/L_SB = 1/12 = 21845(Q18) Q = exp_normn-18 */ num_subband_smooth_fx = shr( num_subband_smooth_pre_fx, 18 - 15 ); IF( NE_16( num_subband_smooth_pre_fx, shl( num_subband_smooth_fx, 18 - 15 ) ) ) @@ -943,14 +956,17 @@ void SpectrumSmoothing_fx( FOR( i = fLen; i < fLen + ( num_subband_smooth_fx * L_SB - fLen ); i++ ) { L_inBuf_pss[i] = L_deposit_l( 0 ); + move32(); outBuf_pss_fx[i] = 0; move16(); } j = 0; + move16(); FOR( i = 0; i < num_subband_smooth_fx; i++ ) { L_max_val[i] = L_deposit_l( 0 ); + move32(); FOR( k = 0; k < L_SB; k++ ) { L_inBuf_abs = L_abs( L_inBuf_pss[j] ); @@ -966,6 +982,7 @@ void SpectrumSmoothing_fx( /* convert to maximum amplitude frequency log scale envelope */ j = 0; + move16(); FOR( i = 0; i < num_subband_smooth_fx; i++ ) { /* max_val_norm = 10.0f / (max_val[i] + 0.001f); */ @@ -1017,6 +1034,7 @@ void SpectrumSmoothing_fx( #else outBuf_pss_fx[j] = negate( round_fx( L_shl( Mpy_32_16_r( L_shl( L_abs( L_inBuf_pss[j] ), exp_norm ), max_val_norm_fx ), sub( exp_shift, exp_norm ) ) ) ); #endif + move16(); } } ELSE @@ -1154,6 +1172,7 @@ void Get20Log10Spec_fx( L_tmp = Mpy_32_16_1( L_tmp, 24660 ); /* 6.0206 in Q12 */ L_tmp = L_shl( L_tmp, 2 + 8 ); /* Q7 */ *outBuf_fx++ = round_fx( L_tmp ); + move16(); } return; @@ -1318,9 +1337,11 @@ void SpectrumSmoothing_nss_fx( Word16 exp_shift; L_tmp[0] = L_deposit_l( 0 ); + move32(); FOR( i = 0; i < fLen; i++ ) { L_tmp[0] = L_or( L_tmp[0], L_abs( L_inBuf[i] ) ); + move32(); } exp_norm = norm_l( L_tmp[0] ); Qm = sub( exp_norm, 4 ); /* Qm = sub(add(12, exp_norm), 16); */ @@ -1330,6 +1351,7 @@ void SpectrumSmoothing_nss_fx( L_tmp[i] = L_shl( L_inBuf[i], exp_norm ); /* Q(12+exp_norm) */ move32(); inBuf_fx[i] = round_fx( L_tmp[i] ); /* Qm */ + move16(); } num_subband_smooth_fx = shr( fLen, 3 ); /* L_SB_NSS=8 shr(target, 3); */ @@ -1404,7 +1426,8 @@ void SpectrumSmoothing_nss_fx( { L_temp_sum_1[i] = L_deposit_l( 0 ); L_temp_sum_2[i] = L_deposit_l( 0 ); - + move32(); + move32(); FOR( k = 0; k < L_SB_NSS_HALF; k++ ) { L_temp_sum_1[i] = L_add( L_temp_sum_1[i], extract_l( abs_s( inBufw_fx[k + L_SB_NSS * i] ) ) ); /* Qm */ @@ -1444,7 +1467,9 @@ void SpectrumSmoothing_nss_fx( L_temp1 = L_negate( L_temp1 ); temp_lo = L_Extract_lc( L_temp1, &temp_hi ); Qsumdiv[i] = sub( 14, temp_hi ); + move16(); temp_sum_div_fx[i] = extract_l( Pow2( 14, temp_lo ) ); /* Qsumdiv[i] */ + move16(); exp_norm = norm_s( temp_sum_div_fx[i] ); temp_sum_div_fx[i] = shl( temp_sum_div_fx[i], exp_norm ); move16(); @@ -1457,6 +1482,7 @@ void SpectrumSmoothing_nss_fx( FOR( i = 0; i < num_subband_smooth_fx; i++ ) { Qo[i] = add( add( Qm, Qsumdiv[i] ), 1 ); + move16(); L_temp1 = 0x0L; FOR( k = 0; k < L_SB_NSS; k++ ) { @@ -1489,6 +1515,7 @@ void SpectrumSmoothing_nss_fx( L_outBufw[k + L_SB_NSS * i] = L_shl( L_outBufw[k + L_SB_NSS * i], exp_shift ); move16(); outBufw_fx[k + L_SB_NSS * i] = round_fx( L_outBufw[k + L_SB_NSS * i] ); + move16(); } } *Qss = sub( *Qss, 16 ); @@ -1652,7 +1679,6 @@ void post_hq2_swb_fx( ELSE { k = sub( bands_fx, NB_SWB_SUBBANDS ); - move16(); } FOR( ; k < bands_fx; k++ ) @@ -1709,7 +1735,8 @@ void GetSynthesizedSpecThinOut_fx( { fLen_fx = sbWidth_fx[sb]; lag_fx = lagIndices_fx[sb]; - + move16(); + move16(); if ( GT_16( add( lag_fx, fLen_fx ), predBufLen_fx ) ) { /* should never happen */ @@ -1963,6 +1990,7 @@ void GetlagGains_fx( /* Sqrt part sqrt(pow (2.0f, band_energy[i])/lagEnergy) */ QlagGains[sb] = add( Qdiv, 16 ); + move16(); IF( s_and( Qdiv, 1 ) == 0 ) /* Qdiv % 2 == 0 */ { L_temp = Sqrt_l( L_shr( L_deposit_h( temp_fx ), 1 ), &exp_norm ); @@ -1970,6 +1998,7 @@ void GetlagGains_fx( QlagGains[sb] = sub( shr( QlagGains[sb], 1 ), 1 ); move16(); lagGains_fx[sb] = round_fx( L_temp ); + move16(); } ELSE { @@ -1978,6 +2007,7 @@ void GetlagGains_fx( QlagGains[sb] = shr( QlagGains[sb], 1 ); move16(); lagGains_fx[sb] = round_fx( L_temp ); + move16(); } } ELSE @@ -2022,6 +2052,7 @@ void noise_extr_corcod_fx( SpectrumSmoothing_nss_fx( L_spectra, sspectra_fx, &Qss_s, fLenLow_fx ); Copy( sspectra_fx, sspectra_ni_fx, fLenLow_fx ); tmp_fx = 0; + move16(); FOR( i = 0; i < fLenLow_fx; i++ ) { tmp_fx |= abs_s( sspectra_fx[i] ); @@ -2043,6 +2074,7 @@ void noise_extr_corcod_fx( } SpectrumSmoothing_nss_fx( L_spectra_diff, sspectra_diff_fx, &Qss_d, fLenLow_fx ); tmp_fx = 0; + move16(); FOR( i = 0; i < fLenLow_fx; i++ ) { tmp_fx |= abs_s( sspectra_diff_fx[i] ); @@ -2083,7 +2115,7 @@ void noise_extr_corcod_fx( /*Smoothing the noise components*/ br_adj_fx = 29491; /* br_adj = 0.9f; Q15 */ - + move16(); pulse_num_fx = 0; move16(); FOR( i = 0; i < fLenLow_fx; i++ ) @@ -2211,6 +2243,7 @@ void ton_ene_est_fx( #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif *QbeL = 3; @@ -2241,6 +2274,7 @@ void ton_ene_est_fx( QsN = sub( add( QsL, 11 ), 15 ); exp_safe = 4; /*move16();*/ + move16(); norm_vec_32_16_scale_fx( L_xSynth_har, QsN, fLenHigh, xSynth_har_fx, &QxSynth, exp_safe ); pos = 0; @@ -2302,6 +2336,7 @@ void ton_ene_est_fx( #else L_band_energy_Linear[i] = L_shl( L_band_energy_Linear[i], sub( *QbeL, exp_pow ) ); #endif + move32(); /* Div Part */ E_r_fx = 0x7fff; move16(); @@ -2320,7 +2355,7 @@ void ton_ene_est_fx( L_E = L_shl( L_E, sub( *QbeL, QE ) ); QE = *QbeL; - + move16(); /* 0.06=15729(Q18) */ exp_shift = sub( 18, QE_r ); #ifdef BASOP_NOGLOB @@ -2339,6 +2374,7 @@ void ton_ene_est_fx( sqrt_32n_16_fx( L_temp, Qtemp, &avg_pe_fx[k], &Qavg_pe[k] ); fac_fx = 19661; /* 0.6(Q15) */ + move16(); IF( pul_res_bnd[k] != 0 ) { /* Div Part */ @@ -2376,9 +2412,10 @@ void ton_ene_est_fx( Overflow = 0; move16(); ni_gain_fx[k] = shl( ni_gain_fx[k], sub( Qni_gain, Qavg_pe[k] ) ); + move16(); assert( Qni_gain == 8 ); /* 358 is '(short)(1.4*pow(2,Qni_gain))' */ ni_gain_fx[k] = s_max( ni_gain_fx[k], 358 ); /* 1.4 -> 22938(Q14) */ - + move16(); exp_shift = QsL - ( QxSynth + Qni_gain + 1 ); /* QsL - (QxSynth+Qni_gain+1) */ FOR( j = band_start[i]; j <= band_end[i]; j++ ) { @@ -2387,6 +2424,7 @@ void ton_ene_est_fx( } exp_safe = 4; /* move16(); */ + move16(); norm_vec_32_16_scale_fx( &L_xSynth_har[band_start[i] - fLenLow], QsL, band_width[i], &xSynth_har_fx[band_start[i] - fLenLow], &QxSynth_sft, exp_safe ); L_E = sum2_fx( &xSynth_har_fx[sub( band_start[i], fLenLow )], band_width[i] ); @@ -2398,6 +2436,7 @@ void ton_ene_est_fx( L_E = L_shl( L_E, sub( *QbeL, QE ) ); #endif QE = *QbeL; + move16(); } ELSE { @@ -2412,7 +2451,7 @@ void ton_ene_est_fx( k = add( k, 1 ); L_be_tonal[i] = L_sub( L_band_energy_Linear[i], L_E ); - + move32(); IF( L_be_tonal[i] < 0x0L ) { L_E = L_deposit_l( 0 ); @@ -2523,6 +2562,7 @@ void Gettonl_scalfact_fx( band_pos_fx = add( k_fx, harmonic_band ); count_pos_st_fx = pos_fx; move16(); + test(); WHILE( LE_16( sb_ton_loc_fx[pos_fx], sub( band_end[band_pos_fx], fLenLow ) ) && sb_ton_loc_fx[pos_fx] >= 0 ) { test(); @@ -2532,6 +2572,7 @@ void Gettonl_scalfact_fx( move16(); exp_safe = 2; /* move16(); */ + move16(); QetEne = add( shl( sub( Qss, exp_safe ), 1 ), 1 ); L_temp = L_add( L_est_ton_ene[k_fx], 0 ); FOR( i = count_pos_st_fx; i < count_pos_end_fx; i++ ) @@ -2607,6 +2648,7 @@ void Gettonl_scalfact_fx( #else L_band_energy_Linear[band_pos_fx] = L_shl( L_band_energy_Linear[band_pos_fx], sub( QbeL, exp_pow ) ); #endif + move32(); /* Div Part */ exp_normd = norm_l( L_be_tonal[band_pos_fx] ); exp_normd = sub( exp_normd, 1 ); @@ -2691,6 +2733,7 @@ void sqrt_32n_16_fx( L_in_t = L_shr( L_in_t, exp_norm ); *Qout = shr( Qin_t, 1 ); } + move16(); *out_fx = round_fx( L_in_t ); } @@ -2724,6 +2767,7 @@ void norm_vec_32_16_scale_fx( FOR( i = 0; i < length_fx; i++ ) { vec_out_fx[i] = round_fx( L_shl( L_vec_in[i], exp_shift ) ); + move16(); } } @@ -2771,6 +2815,7 @@ void get_sigma_fx_har( FOR( i = 0; i < length_fx; i++ ) { L_x_abs_sh[i] = L_shl( L_x_abs[i], exp_norm ); + move32(); } L_d = L_deposit_l( 0 ); @@ -2830,7 +2875,8 @@ void get_sigma_fx_har( *Qsigma = shr( Qd, 1 ); *sigma_fx = round_fx( L_temp ); } - + move16(); + move16(); return; } @@ -2870,7 +2916,8 @@ void FindNBiggest2_simple_fx_har( { L_abs_in[j] = L_abs( L_inBuf[j] ); /* Qabs_in */ L_abs_in_sft[j] = L_shr( L_abs_in[j], 8 ); /* 8 is safe shift */ - + move32(); + move32(); if ( LT_32( L_max_in, L_abs_in_sft[j] ) ) { L_max_in = L_abs_in_sft[j]; @@ -2923,6 +2970,7 @@ void FindNBiggest2_simple_fx_har( IF( GT_32( L_abs_in[j], L_thr ) ) { pk_sf_fx[peak_cnt_fx].nmrValue_fx = round_fx( L_abs_in[j] ); /* Qabs_in-16 */ + move16(); pk_sf_fx[peak_cnt_fx].gainIndex_fx = j; move16(); L_abs_in[j] = L_deposit_l( 0 ); @@ -3026,6 +3074,7 @@ Word16 spectrumsmooth_noiseton_fx( /* o : Qss ss_ Word32 L_temp; Word32 L_spectra_rm[L_FRAME32k]; Word32 L_cut_input = 410; + move32(); Word16 rand_a_fx[L_FRAME32k]; @@ -3033,6 +3082,7 @@ Word16 spectrumsmooth_noiseton_fx( /* o : Qss ss_ FOR( i = 0; i < fLenLow_fx; i++ ) { rand_a_fx[i] = Random( ni_seed_fx ); + move16(); } @@ -3090,6 +3140,7 @@ Word16 spectrumsmooth_noiseton_fx( /* o : Qss ss_ FOR( i = 0; i < fLenLow_fx; i++ ) { L_spectra_rm[i] = L_deposit_l( 0 ); + move32(); if ( GE_32( L_abs( L_spectra_diff[i] ), L_cut_input ) ) { L_spectra_rm[i] = L_spectra_diff[i]; @@ -3114,6 +3165,7 @@ Word16 spectrumsmooth_noiseton_fx( /* o : Qss ss_ { /*sspectra[i] = sign*((10-ss_min)/10.0f*(float)fabs(sspectra[i])+ss_min);*/ sspectra_fx[i] = add( mult_r( ratio_fx, abs_s( sspectra_fx[i] ) ), ss_min_fx ); + move16(); IF( sign_fx != 0 ) { sspectra_fx[i] = negate( sspectra_fx[i] ); @@ -3137,6 +3189,7 @@ Word16 spectrumsmooth_noiseton_fx( /* o : Qss ss_ L_temp = L_mult( ni_ratio_fx, 20480 ); /* ni_ratio*5 */ L_temp = Mult_32_16( L_temp, rand_a_fx[i] ); /* Q28 */ sspectra_ni_fx[i] = round_fx( L_shr( L_temp, 2 ) ); /* Qss */ + move16(); } } @@ -3166,11 +3219,12 @@ void noiseinj_hf_fx( Word16 *p_prev_En_sb_fx; Word16 QbeL = 7; /* Don't need 3, because this E only use under th samples */ /* QsEn=3 */ - + move16(); Word16 map_pulse_t_fx[L_FRAME32k]; Word16 map_pulse_fx[L_FRAME32k]; Word16 QsEn = 4; /* kiken */ + move16(); Word32 L_En[NB_SWB_SUBBANDS]; Word32 *p_L_En; Word16 QE; @@ -3196,20 +3250,24 @@ void noiseinj_hf_fx( Word16 Qdiv; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif set16_fx( map_pulse_t_fx, 0, band_end_fx[BANDS_fx - 1] + 1 ); set16_fx( map_pulse_fx, 0, band_end_fx[BANDS_fx - 1] + 1 ); /*level adjust the missing bands in the core coder */ exp_safe = 4; /*move16();*/ + move16(); norm_vec_32_16_scale_fx( L_xSynth_har, Qs, fLenHigh_fx, xSynth_har_fx, &QxSynth, exp_safe ); QE = add( shl( QxSynth, 1 ), 1 ); p_L_En = L_En; + move32(); p_sqrt_En_fx = sqrt_En_fx; FOR( k = sub( BANDS_fx, NB_SWB_SUBBANDS ); k < BANDS_fx; k++ ) { *p_L_En = L_deposit_l( 0 ); + move32(); IF( p2a_flags_fx[k] == 0 ) { FOR( i = band_start_fx[k]; i <= band_end_fx[k]; i++ ) @@ -3217,6 +3275,7 @@ void noiseinj_hf_fx( IF( LE_32( L_abs( L_xSynth_har[i - fLenLow_fx] ), L_th_g[k - ( BANDS_fx - NB_SWB_SUBBANDS )] ) ) { *p_L_En = L_mac( *p_L_En, xSynth_har_fx[i - fLenLow_fx], xSynth_har_fx[i - fLenLow_fx] ); + move32(); } ELSE { @@ -3267,6 +3326,7 @@ void noiseinj_hf_fx( /* 0.8: 26214.4(Q15) 0.2:6553.6(Q15) */ *p_Enn_sm_sb_fx = round_fx( L_mac( L_mult( *p_sqrt_En_fx, 26214 ), *p_prev_En_sb_fx, 6554 ) ); } + move16(); } p_Enn_sm_sb_fx++; diff --git a/lib_com/swb_tbe_com.c b/lib_com/swb_tbe_com.c index ede212bb1..5229543ab 100644 --- a/lib_com/swb_tbe_com.c +++ b/lib_com/swb_tbe_com.c @@ -1218,11 +1218,11 @@ void GenSHBSynth_fx_32( Word32 *shb_syn_speech_32k, /* o : output highband component Qx*/ Word32 Hilbert_Mem[], /* i/o: memory Qx*/ Word32 state_lsyn_filt_shb_local[], /* i/o: memory Qx*/ - const int16_t L_frame, /* i : ACELP frame length */ - int16_t *syn_dm_phase ) + const Word16 L_frame, /* i : ACELP frame length */ + Word16 *syn_dm_phase ) { Word32 speech_buf_32k[L_FRAME32k]; - int16_t i; + Word16 i; Interpolate_allpass_steep_32( input_synspeech, state_lsyn_filt_shb_local, L_FRAME16k, speech_buf_32k ); @@ -1235,14 +1235,15 @@ void GenSHBSynth_fx_32( FOR( i = 0; i < L_FRAME32k; i++ ) { // shb_syn_speech_32k[i] = ( ( i % 2 ) == 0 ) ? ( -speech_buf_32k[i] ) : ( speech_buf_32k[i] ); - IF( EQ_16( i % 2, 0 ) ) + IF( i % 2 == 0 ) { - shb_syn_speech_32k[i] = -speech_buf_32k[i]; + shb_syn_speech_32k[i] = L_negate( speech_buf_32k[i] ); } ELSE { shb_syn_speech_32k[i] = speech_buf_32k[i]; } + move32(); } } @@ -1364,7 +1365,7 @@ void ScaleShapedSHB( } #ifdef IVAS_FLOAT_FIXED void ScaleShapedSHB_32( - const int16_t length, /* i : SHB overlap length */ + const Word16 length, /* i : SHB overlap length */ Word32 *synSHB_fx, /* i/o: synthesized shb signal Q_inp/Q_new */ Word32 *overlap_fx, /* i/o: buffer for overlap-add Q_inp/Q_new */ const Word16 *subgain_fx, /* i : subframe gain Q15 */ @@ -1383,26 +1384,33 @@ void ScaleShapedSHB_32( /* initilaization */ l_frame = L_FRAME16k; l_shb_lahead = L_SHB_LAHEAD; + move16(); + move16(); skip = skip_bands_SWB_TBE; - IF( length == SHB_OVERLAP_LEN / 2 ) + IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) ) { skip = skip_bands_WB_TBE; l_frame = L_FRAME16k / 4; l_shb_lahead = L_SHB_LAHEAD / 4; + move16(); + move16(); } /* apply gain for each subframe, and store noise output signal using overlap-add */ set32_fx( mod_syn_fx, 0, l_frame + l_shb_lahead ); - IF( length == SHB_OVERLAP_LEN / 2 ) + IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) ) { sum_gain_fx = 0; - FOR( k = 0; k < length / 2; k++ ) + move16(); + FOR( k = 0; k < shr( length, 1 ); k++ ) { sum_gain_fx = mult_r( subwin_fx[2 * k + 2], subgain_fx[0] ); - mod_syn_fx[skip[0] + k] = Mpy_32_16_1( synSHB_fx[skip[0] + k], sum_gain_fx ); // Qx - mod_syn_fx[skip[0] + k + length / 2] = Mpy_32_16_1( synSHB_fx[skip[0] + k + length / 2], subgain_fx[0] ); // Qx + mod_syn_fx[add( skip[0], k )] = Mpy_32_16_1( synSHB_fx[add( skip[0], k )], sum_gain_fx ); + move32(); // Qx + mod_syn_fx[add( add( skip[0], k ), shr( length, 1 ) )] = Mpy_32_16_1( synSHB_fx[add( add( skip[0], k ), shr( length, 1 ) )], subgain_fx[0] ); // Qx + move32(); } FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ ) { @@ -1410,13 +1418,15 @@ void ScaleShapedSHB_32( { L_tmp = L_mult0( subwin_fx[k + 1], subgain_fx[i] ); sum_gain_fx = round_fx( L_mac0( L_tmp, subwin_fx[length - k - 1], subgain_fx[i - 1] ) ); - mod_syn_fx[skip[i] + k] = L_shl( Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ), 1 ); // Qx + mod_syn_fx[add( skip[i], k )] = L_shl( Mpy_32_16_1( synSHB_fx[add( skip[i], k )], sum_gain_fx ), 1 ); // Qx + move32(); } } - FOR( k = 0; k < length / 2; k++ ) + FOR( k = 0; k < shr( length, 1 ); k++ ) { - sum_gain_fx = mult_r( subwin_fx[length - 2 * k - 2], subgain_fx[i - 1] ); - mod_syn_fx[skip[i] + k] = Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ); // Qx + sum_gain_fx = mult_r( subwin_fx[sub( sub( length, shl( k, 1 ) ), 2 )], subgain_fx[i - 1] ); + mod_syn_fx[add( skip[i], k )] = Mpy_32_16_1( synSHB_fx[add( skip[i], k )], sum_gain_fx ); // Qx + move32(); } } ELSE @@ -1424,52 +1434,61 @@ void ScaleShapedSHB_32( num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS; join_length = i_mult( num_join, length ); j = 0; + move16(); + move16(); FOR( k = 0; k < length; k++ ) { mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[k + 1], subgain_fx[0] ) ); // Qx - j++; + move32(); + j = add( j, 1 ); } FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ ) { FOR( k = 0; k < join_length - length; k++ ) { - mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[i * num_join] ); // Qx - j++; + mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[i_mult( i, num_join )] ); // Qx + move32(); + j = add( j, 1 ); } FOR( k = 0; k < length; k++ ) { - L_tmp = L_mult0( subwin_fx[length - k - 1], subgain_fx[i * num_join] ); - mod_syn_fx[j] = L_shl( Mpy_32_16_1( synSHB_fx[j], round_fx( L_mac0( L_tmp, subwin_fx[k + 1], subgain_fx[( i + 1 ) * num_join] ) ) ), 1 ); // Qx - j++; + L_tmp = L_mult0( subwin_fx[length - k - 1], subgain_fx[i_mult( i, num_join )] ); + mod_syn_fx[j] = L_shl( Mpy_32_16_1( synSHB_fx[j], round_fx( L_mac0( L_tmp, subwin_fx[k + 1], subgain_fx[i_mult( ( i + 1 ), num_join )] ) ) ), 1 ); // Qx + move32(); + j = add( j, 1 ); } } FOR( k = 0; k < join_length - length; k++ ) { mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); // Qx - j++; + move32(); + j = add( j, 1 ); } FOR( k = 0; k < length; k++ ) { - mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[length - k - 1], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ) ); // Qx - j++; + mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[sub( sub( length, k ), 1 )], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ) ); // Qx + move32(); + j = add( j, 1 ); } } Word16 norm_shift = norm_l( frame_gain_fx ); - IF( frame_gain_fx == 0 ) + if ( frame_gain_fx == 0 ) { norm_shift = 31; + move16(); } norm_shift = s_min( norm_shift, 14 ); norm_shift = sub( norm_shift, 1 ); *Q_new = add( *Q_inp, sub( norm_shift, 13 ) ); // Q_new = Q_inp + min(norm_shift,14) - 14; - + move16(); FOR( i = 0; i < L_SHB_LAHEAD; i++ ) { - overlap_fx[i] = L_shl( overlap_fx[i], *Q_new - *Q_inp ); + overlap_fx[i] = L_shl( overlap_fx[i], sub( *Q_new, *Q_inp ) ); + move32(); } FOR( i = 0; i < l_shb_lahead; i++ ) @@ -1477,21 +1496,27 @@ void ScaleShapedSHB_32( synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[i] ) ); // Q_new synSHB_fx[i] = L_add( synSHB_fx[i], overlap_fx[i] ); synSHB_fx[i + l_shb_lahead] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new + move32(); + move32(); + move32(); } FOR( ; i < l_frame; i++ ) { synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new + move32(); } FOR( ; i < l_frame + l_shb_lahead; i++ ) { - synSHB_fx[i] = L_shl( synSHB_fx[i], *Q_new - *Q_inp ); + synSHB_fx[i] = L_shl( synSHB_fx[i], sub( *Q_new, *Q_inp ) ); overlap_fx[i - l_frame] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[l_frame + l_shb_lahead - 1 - i] ) ); // Q_new + move32(); + move32(); } *Q_inp = *Q_new; - + move16(); return; } #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 5b48dfada..42cab91fb 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -204,6 +204,7 @@ void tbe_celp_exc( tmp_fx = extract_l( L_mult( tmp_fx, 5 ) ); /*Q5, 2.5 in Q1*/ tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*Q5*/ *error_fx = add( *error_fx, tmp_fx ); /*Q5*/ + move16(); } ELSE { @@ -233,6 +234,7 @@ void tbe_celp_exc( tmp_fx = shl( tmp_fx, 2 ); /*now above tmp_fx in Q5*/ tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*move offset_fx to Q5, tmp_fx in Q5, ans tmp_fx in Q5*/ *error_fx = add( *error_fx, tmp_fx ); /*error_fx in Q5*/ + move16(); } } @@ -290,6 +292,7 @@ void tbe_celp_exc_ivas( tmp_fx = extract_l( L_mult( tmp_fx, 5 ) ); /*Q5, 2.5 in Q1*/ tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*Q5*/ *error_fx = add( *error_fx, tmp_fx ); /*Q5*/ + move16(); } ELSE { @@ -319,6 +322,7 @@ void tbe_celp_exc_ivas( tmp_fx = shl( tmp_fx, 2 ); /*now above tmp_fx in Q5*/ tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*move offset_fx to Q5, tmp_fx in Q5, ans tmp_fx in Q5*/ *error_fx = add( *error_fx, tmp_fx ); /*error_fx in Q5*/ + move16(); } } @@ -398,6 +402,7 @@ void flip_and_downmix_generic_fx( FOR( i = 0; i < HILBERT_ORDER1; i++ ) { tmp_16[i] = extract_h( mem1_ext[i] ); /* mem1_ext (Qx+16) tmp16 (Qx) */ + move16(); } /* Hilber transform stage - 0 - single precision */ @@ -411,6 +416,7 @@ void flip_and_downmix_generic_fx( FOR( i = 0; i < HILBERT_ORDER1; i++ ) { mem1_ext[i] = L_deposit_h( tmp_16[i + length] ); /* mem1_ext (Qx+16) tmp16 (Qx) */ + move32(); } Copy32( mem2_ext, tmpi2_R, HILBERT_ORDER2 ); @@ -467,6 +473,7 @@ void flip_and_downmix_generic_fx( L_tmp = Mult_32_16( tmp_R[i + 4], local_cos_table[j] ); /*//Qx+16 */ L_tmp = Madd_32_16( L_tmp, tmp_I[i + 4], local_negsin_table[j] ); /*Qx+16 */ output[i] = round_fx( L_tmp ); /*Qx */ + move16(); i++; j++; } @@ -854,6 +861,7 @@ static void filt_mu_fx( Word16 tmp, exp; #ifdef FIX_729_MISSING_RESCALING Flag Overflow = 0; + move32(); #endif @@ -1005,6 +1013,7 @@ static void scale_st_swb( L_temp = L_shl( L_temp, 1 ); /*14 + Q_bwe_exc +1 */ sig_out_fx[i] = round_fx( L_temp ); /*Q_bwe_exc +15 -16 = Q_bwe_exc-1 */ #endif + move16(); } *gain_prec_fx = gain_fx; move16(); @@ -1233,6 +1242,7 @@ void ivas_GenShapedWBExcitation_fx( FOR( i = 0; i < L_FRAME16k / 4; i++ ) { exc4kWhtnd[i] = shl_r( exc4kWhtnd[i], sub( Q_bwe_exc, 5 ) ); /*Q(Q_bwe_exc)/Q5(if Q_bwe_exc > 5) */ + move16(); } } } @@ -1259,6 +1269,7 @@ void ivas_GenShapedWBExcitation_fx( /* Ensure pow1 is greater than zero when computing normalization */ max_val = 0; + move16(); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { excTmp2[i] = abs_s( exc4kWhtnd[i] ); @@ -1288,6 +1299,7 @@ void ivas_GenShapedWBExcitation_fx( } n1 = sub( sub( 14, n1 ), Q_bwe_exc ); pow1 = 1; + move32(); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { #ifdef BASOP_NOGLOB @@ -1341,9 +1353,11 @@ void ivas_GenShapedWBExcitation_fx( #else exc4k_frac[i] = extract_h( L_shl( exc4k_32[i], n2 ) ); /* Q(14-n2) */ #endif + move16(); } n2 = 30 - n2 - ( Q_bwe_exc + 6 ); pow22 = 1; + move32(); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { #ifdef BASOP_NOGLOB @@ -1374,6 +1388,7 @@ void ivas_GenShapedWBExcitation_fx( #else exc4kWhtnd[i] = round_fx( L_shl( L_mult( exc4k_frac[i], scale ), sc ) ); /* Q_bwe_exc+n2-10+16+ Q_bwe_exc + n2 -14 -16 = //Q_bwe_exc */ #endif + move16(); } } ELSE @@ -1426,6 +1441,7 @@ void ivas_GenShapedWBExcitation_fx( L_tmp = L_add( L_tmp, L_shl( L_mult( temp2, exc4k_frac[k] ), sc ) ); /* Q(16+Q_bwe_exc) */ exc4kWhtnd[k] = round_fx( L_tmp ); /* Q_bwe_exc */ #endif + move16(); k++; } } @@ -1480,6 +1496,7 @@ void GenShapedWBExcitation_fx( Word16 avg_voice_fac; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif /*0.25f*sum_f(voice_factors, NB_SUBFR)*/ @@ -1521,6 +1538,7 @@ void GenShapedWBExcitation_fx( FOR( i = 0; i < L_FRAME16k / 4; i++ ) { exc4kWhtnd[i] = shl_r( exc4kWhtnd[i], sub( Q_bwe_exc, 5 ) ); /*Q(Q_bwe_exc)/Q5(if Q_bwe_exc > 5) */ + move16(); } } } @@ -1576,6 +1594,7 @@ void GenShapedWBExcitation_fx( } n1 = sub( sub( 14, n1 ), Q_bwe_exc ); pow1 = 1; + move32(); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { #ifdef BASOP_NOGLOB @@ -1629,9 +1648,11 @@ void GenShapedWBExcitation_fx( #else exc4k_frac[i] = extract_h( L_shl( exc4k_32[i], n2 ) ); /* Q(14-n2) */ #endif + move16(); } n2 = 30 - n2 - ( Q_bwe_exc + 6 ); pow22 = 1; + move32(); FOR( i = 0; i < L_FRAME16k / 4; i++ ) { #ifdef BASOP_NOGLOB @@ -1662,6 +1683,7 @@ void GenShapedWBExcitation_fx( #else exc4kWhtnd[i] = round_fx( L_shl( L_mult( exc4k_frac[i], scale ), sc ) ); /* Q_bwe_exc+n2-10+16+ Q_bwe_exc + n2 -14 -16 = //Q_bwe_exc */ #endif + move16(); } } ELSE @@ -1669,6 +1691,7 @@ void GenShapedWBExcitation_fx( sc = sub( add( n2, Q_bwe_exc ), 14 ); /* Q_bwe_exc+n2-14*/ k = 0; + move16(); FOR( i = 0; i < 4; i++ ) { test(); @@ -1714,6 +1737,7 @@ void GenShapedWBExcitation_fx( L_tmp = L_add( L_tmp, L_shl( L_mult( temp2, exc4k_frac[k] ), sc ) ); /* Q(16+Q_bwe_exc) */ exc4kWhtnd[k] = round_fx( L_tmp ); /* Q_bwe_exc */ #endif + move16(); k++; } } @@ -1936,10 +1960,14 @@ void GenShapedSHBExcitation_fx( Word16 excTmp2[L_FRAME16k]; Word16 *White_exc16k; Word16 excNoisyEnv[L_FRAME16k]; - Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */ + Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */ + move16(); Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */ + move16(); + move16(); Word16 varEnvShape; Word16 fb_deemph_fac = 15729; /*0.48f in Q15 */ + move16(); Word16 exc16kWhtnd[L_FRAME16k]; Word32 L_tmp; @@ -2020,6 +2048,7 @@ void GenShapedSHBExcitation_fx( FOR( i = 0; i < 80; i++ ) { exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); + move16(); /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */ } temp2 = add( temp2, 80 ); @@ -2224,6 +2253,7 @@ void GenShapedSHBExcitation_fx( if ( L_tmp == 0 ) { Q_temp = 31; + move16(); } /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/ /* White_exc16k in Q6 */ @@ -2348,10 +2378,13 @@ void GenShapedSHBExcitation_fx( Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind ); tmp = voiceFacEst[0]; + move16(); tmp2 = MAX_16; + move16(); if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) { tmp2 = 26214 /*0.8f Q15*/; + move16(); } } } @@ -2376,9 +2409,11 @@ void GenShapedSHBExcitation_fx( /* *vf_ind is an integer scale by 0.125f*/ tmp = shl( *vf_ind, ( 15 - 3 ) ); tmp2 = MAX_16; + move16(); if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) { tmp2 = 26214 /*0.8f Q15*/; + move16(); } } } @@ -2413,8 +2448,9 @@ void GenShapedSHBExcitation_fx( White_exc16k_FB[k] = round_fx( L_shl( White_exc16k_32[k], tmp ) ); /* Q_bwe_exc +5 +1 +Q_temp -16 -3 */ } prev_Q_bwe_exc_fb = *Q_bwe_exc_fb; + move16(); *Q_bwe_exc_fb = sub( add( *Q_bwe_exc, Q_temp ), 13 ); - + move16(); deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph ); /* i/o: White_exc16k (Q_bwe_exc-NOISE_QADJ) */ /* i: tbe_demph (Q_bwe_exc-NOISE_QADJ) */ @@ -2472,6 +2508,7 @@ void GenShapedSHBExcitation_fx( L_tmp = L_mult( White_exc16k[k], scale ); /* L_tmp: (Q_bwe_exc-NOISE_QADJ) + 15 + 1 */ exc16kWhtnd[k] = round_fx( L_shl( L_tmp, NOISE_QADJ ) ); + move16(); /* exc16kWhtnd: Q_bwe_exc */ } preemph_fx( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); @@ -2500,9 +2537,11 @@ void GenShapedSHBExcitation_fx( IF( EQ_16( coder_type, VOICED ) && ( LT_32( bitrate, ACELP_24k40 ) ) ) { exp = 0; + move16(); tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */ temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ exp = 0; + move16(); tempQ15 = Sqrt16( temp, &exp ); /* Q15 */ temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ @@ -2525,6 +2564,7 @@ void GenShapedSHBExcitation_fx( vf_tmp = mult_r( voice_factors[i], vf_tmp ); exp = 0; + move16(); tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */ temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ @@ -2558,6 +2598,7 @@ void GenShapedSHBExcitation_fx( /* estimate the pre-emph factor */ tempQ15 = sub( MAX_16, voice_factors[i] ); exp = 0; + move16(); temp = Sqrt16( tempQ15, &exp ); temp = shl( temp, exp - 1 ); @@ -2750,8 +2791,11 @@ void GenShapedSHBExcitation_ivas_fx( Word16 excTmp2[L_FRAME16k]; Word16 *White_exc16k; Word16 excNoisyEnv[L_FRAME16k]; - Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */ + Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */ + move16(); Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */ + move16(); + move16(); Word16 varEnvShape; Word16 fb_deemph_fac = 15729; /*0.48f in Q15 */ Word16 exc16kWhtnd[L_FRAME16k]; @@ -2759,6 +2803,7 @@ void GenShapedSHBExcitation_ivas_fx( Word32 L_tmp; Word16 vf_tmp; Word16 tmp, exp, tmp2 = 0; + move16(); Word16 voiceFacEst[NB_SUBFR16k]; Word16 zero_mem[LPC_SHB_ORDER]; Word32 syn_shb_ener_sf[4]; @@ -2785,6 +2830,7 @@ void GenShapedSHBExcitation_ivas_fx( Word16 c0_part[NUM_SHB_SUBGAINS], c1_part[NUM_SHB_SUBGAINS], c2_part[NUM_SHB_SUBGAINS], c3_part[NUM_SHB_SUBGAINS], c4_part[NUM_SHB_SUBGAINS], c5_part[NUM_SHB_SUBGAINS]; mix_factor = 0; + move16(); #endif set16_fx( zero_mem, 0, LPC_SHB_ORDER ); set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER ); @@ -2833,6 +2879,7 @@ void GenShapedSHBExcitation_ivas_fx( FOR( i = 0; i < 80; i++ ) { exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); + move16(); /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */ } temp2 = add( temp2, 80 ); @@ -2949,13 +2996,18 @@ void GenShapedSHBExcitation_ivas_fx( { // varEnvShape = 0.995f; varEnvShape = 32604; - // csfilt_num2[0] = 1.0f - varEnvShape; + move16(); csfilt_num2[0] = 32768 - varEnvShape; + // csfilt_num2[0] = sub( 32767, varEnvShape ); + move16(); neg_csfilt_den2[1] = varEnvShape; + move16(); } White_exc16k = exc16k; - Word16 Q_excTmp2 = getScaleFactor16( excTmp2, L_FRAME16k ) + *Q_bwe_exc; + move16(); + Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc ); + test(); /* Track the low band envelope */ IF( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) { @@ -2963,25 +3015,32 @@ void GenShapedSHBExcitation_ivas_fx( { mem_csfilt_left = 0; mem_csfilt_right = 0; + move16(); + move16(); FOR( k = 0; k < L_FRAME16k; k++ ) { // excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k]; excNoisyEnvLeft[k] = add( mem_csfilt_left, mult_r( csfilt_num2[0], shl( excTmp2[k], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2 + move16(); // mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k]; mem_csfilt_left = mult_r( neg_csfilt_den2[1], excNoisyEnvLeft[k] ); // Q_excTmp2 // excNoisyEnvRight[L_FRAME16k - k - 1] = mem_csfilt_right + csfilt_num2[0] * excTmp2[L_FRAME16k - k - 1]; excNoisyEnvRight[L_FRAME16k - k - 1] = add( mem_csfilt_right, mult_r( csfilt_num2[0], shl( excTmp2[L_FRAME16k - k - 1], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2 + move16(); // mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1]; mem_csfilt_right = mult_r( neg_csfilt_den2[1], excNoisyEnvRight[L_FRAME16k - k - 1] ); // Q_excTmp2 } alpha = 0; + move16(); // step = 1.0f / L_FRAME16k; step = 102; // Q15 + move16(); FOR( k = 0; k < L_FRAME16k; k++ ) { // excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + (1 - alpha) * excNoisyEnvRight[k]; - excNoisyEnv[k] = add( mult_r( alpha, excNoisyEnvLeft[k] ), mult_r( ( 32767 - alpha ), excNoisyEnvRight[k] ) ); // Q_excTmp2 + excNoisyEnv[k] = add( mult_r( alpha, excNoisyEnvLeft[k] ), mult_r( sub( 32767, alpha ), excNoisyEnvRight[k] ) ); // Q_excTmp2 + move16(); alpha = add( alpha, step ); } } @@ -3004,20 +3063,25 @@ void GenShapedSHBExcitation_ivas_fx( move32(); } #if 1 // def ADD_IVAS_TBE_CODE - IF( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) + test(); + IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) { /* generate gaussian (white) excitation */ FOR( k = 0; k < L_FRAME16k; k++ ) { White_exc16k[k] = own_random( &bwe_seed[0] ); + move16(); } /* normalize the amplitude of the gaussian excitation to that of the LB exc. */ Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT; + move32(); + move32(); pow22 = POW_EXC16k_WHTND_FX; Q_pow22 = -6; + move16(); // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), White_exc16k, L_FRAME16k); - Word16 pow1_exp = Q31 - Q_pow1; + Word16 pow1_exp = sub( Q31, Q_pow1 ); Word32 temp_pow = Sqrt32( pow1, &pow1_exp ); temp_pow = L_shl( Mpy_32_32( temp_pow, pow22_inv ), pow1_exp ); /*Word16 out_exp; @@ -3025,16 +3089,20 @@ void GenShapedSHBExcitation_ivas_fx( temp_pow1 = L_shl(temp_pow1, out_exp);*/ // v_multc_fixed_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k); L_tmp = 0; + move32(); FOR( k = 0; k < L_FRAME16k; k++ ) { White_exc16k_32[k] = L_mult( White_exc16k[k], round_fx( temp_pow ) ); + move32(); White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], *Q_bwe_exc - NOISE_QADJ ) ); // Q_bwe_exc - NOISE_QADJ + move16(); L_tmp = max( L_tmp, L_abs( White_exc16k_32[k] ) ); } Q_temp = norm_l( L_tmp ); IF( L_tmp == 0 ) { Q_temp = 31; + move16(); } } ELSE @@ -3042,6 +3110,7 @@ void GenShapedSHBExcitation_ivas_fx( { /* create a random excitation - Reuse exc16k memory */ White_exc16k = exc16k; + move16(); create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed ); create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); @@ -3066,6 +3135,7 @@ void GenShapedSHBExcitation_ivas_fx( IF( L_tmp == 0 ) { Q_temp = 31; + move16(); } /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/ /* White_exc16k in Q6 */ @@ -3218,22 +3288,28 @@ void GenShapedSHBExcitation_ivas_fx( ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind ); tmp = voiceFacEst[0]; tmp2 = MAX_16; + move16(); + move16(); if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) { tmp2 = 26214 /*0.8f Q15*/; + move16(); } } } ELSE /* decoder side */ { + test(); #if 1 // def ADD_IVAS_TBE_CODE - IF( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) + IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) { IF( *vf_ind == 0 ) { // mix_factor = 0.0f; mix_factor = 0; + move16(); flag_plosive = 1; + move16(); } ELSE { @@ -3247,9 +3323,11 @@ void GenShapedSHBExcitation_ivas_fx( /* *vf_ind is an integer scale by 0.125f*/ tmp = shl( *vf_ind, ( 15 - 3 ) ); tmp2 = MAX_16; + move16(); IF( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) { tmp2 = 26214 /*0.8f Q15*/; + move16(); } } } @@ -3270,7 +3348,7 @@ void GenShapedSHBExcitation_ivas_fx( } } #if 1 // def ADD_IVAS_TBE_CODE - IF( element_mode >= IVAS_CPE_DFT && nlExc16k != NULL ) + IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL ) { /* save buffers for IC-BWE */ // mvr2r(exc16kWhtnd, nlExc16k, L_FRAME16k); @@ -3285,6 +3363,7 @@ void GenShapedSHBExcitation_ivas_fx( FOR( k = 0; k < L_FRAME16k; k++ ) { mixExc16k[k] = mult_r( White_exc16k[k], temp_fac ); + move16(); } } #endif @@ -3295,13 +3374,15 @@ void GenShapedSHBExcitation_ivas_fx( White_exc16k_FB[k] = round_fx( L_shl( White_exc16k_32[k], tmp ) ); /* Q_bwe_exc +5 +1 +Q_temp -16 -3 */ } prev_Q_bwe_exc_fb = *Q_bwe_exc_fb; + move16(); *Q_bwe_exc_fb = sub( add( *Q_bwe_exc, Q_temp ), 13 ); - + move16(); deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph ); /* i/o: White_exc16k (Q_bwe_exc-NOISE_QADJ) */ /* i: tbe_demph (Q_bwe_exc-NOISE_QADJ) */ #if 1 // def ADD_IVAS_TBE_CODE - IF( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) + test(); + IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) { IF( !flag_plosive ) /* use only LB excitation in case of plosives */ { @@ -3315,17 +3396,20 @@ void GenShapedSHBExcitation_ivas_fx( old_scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15 // new_scale = 1.0f; new_scale = 32767; + move16(); // step_scale = (new_scale - old_scale) / (L_FRAME16k / 2); step_scale = mult_r( sub( new_scale, old_scale ), 205 ); scale = old_scale; - + move16(); /* interpolate between the old and the new value of the mixing factor */ old_fact = *prev_mix_factor; + move16(); new_fact = mix_factor; + move16(); // step = (new_fact - old_fact) / (L_FRAME16k / 2); step = mult_r( sub( new_fact, old_fact ), 205 ); fact = old_fact; - + move16(); /* mixing of LB and gaussian excitation in the first half of the frame */ FOR( k = 0; k < L_FRAME16k / 2; k++ ) { @@ -3334,6 +3418,7 @@ void GenShapedSHBExcitation_ivas_fx( L_tmp = L_add( L_shl( L_mult( fact, mult_r( White_exc16k[k], scale ) ), NOISE_QADJ ), L_mult( sub( 32767, fact ), exc16kWhtnd[k] ) ); // Q_bwe_exc exc16kWhtnd[k] = round_fx( L_tmp ); + move16(); fact = add_sat( fact, step ); scale = add_sat( scale, step_scale ); } @@ -3346,6 +3431,7 @@ void GenShapedSHBExcitation_ivas_fx( L_tmp = L_add( L_shl( L_mult( new_fact, White_exc16k[k] ), NOISE_QADJ ), mult_r( sub( 32767, new_fact ), exc16kWhtnd[k] ) ); // Q_bwe_exc exc16kWhtnd[k] = round_fx( L_tmp ); + move16(); } } // preemph(exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph); @@ -3372,6 +3458,7 @@ void GenShapedSHBExcitation_ivas_fx( L_tmp = L_mult( White_exc16k[k], scale ); /* L_tmp: (Q_bwe_exc-NOISE_QADJ) + 15 + 1 */ exc16kWhtnd[k] = round_fx( L_shl( L_tmp, NOISE_QADJ ) ); + move16(); /* exc16kWhtnd: Q_bwe_exc */ } preemph_fx( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); @@ -3386,6 +3473,8 @@ void GenShapedSHBExcitation_ivas_fx( /*nbSubFr = ( bitrate < ACELP_24k40 )? NB_SUBFR : NB_SUBFR16k;*/ nbSubFr = NB_SUBFR16k; lSubFr = ( L_FRAME16k / NB_SUBFR16k ); + move16(); + move16(); IF( LT_32( bitrate, ACELP_24k40 ) ) { nbSubFr = NB_SUBFR; @@ -3394,15 +3483,18 @@ void GenShapedSHBExcitation_ivas_fx( move16(); } k = 0; + move16(); FOR( i = 0; i < nbSubFr; i++ ) { test(); IF( EQ_16( coder_type, VOICED ) && ( LT_32( bitrate, ACELP_24k40 ) ) ) { exp = 0; + move16(); tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */ temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ exp = 0; + move16(); tempQ15 = Sqrt16( temp, &exp ); /* Q15 */ temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ @@ -3425,6 +3517,7 @@ void GenShapedSHBExcitation_ivas_fx( vf_tmp = mult_r( voice_factors[i], vf_tmp ); exp = 0; + move16(); tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */ temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ @@ -3458,6 +3551,7 @@ void GenShapedSHBExcitation_ivas_fx( /* estimate the pre-emph factor */ tempQ15 = sub( MAX_16, voice_factors[i] ); exp = 0; + move16(); temp = Sqrt16( tempQ15, &exp ); temp = shl( temp, exp - 1 ); @@ -3527,6 +3621,7 @@ void GenShapedSHBExcitation_ivas_fx( { L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */ exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */ + move16(); } } /* i: L_tmp2 in (Q31-exp) */ @@ -3749,6 +3844,7 @@ void ScaleShapedSHB_fx( move16(); sum_gain = 0; + move16(); FOR( k = 0; k < length / 2; k++ ) { sum_gain = mult_r( subwin[2 * k + 2], subgain[0] ); /* Q15 */ @@ -3836,7 +3932,10 @@ void ScaleShapedSHB_fx( Q_gFr_norm = norm_l( frame_gain ); if ( frame_gain == 0 ) + { Q_gFr_norm = 31; + move16(); + } Q_gFr_norm = sub( Q_gFr_norm, 1 ); /* give some headroom */ gain_frame_Q16 = round_fx( L_shl( frame_gain, Q_gFr_norm ) ); /* Q = 18 + Q_gFr_norm - 16 @@ -3854,14 +3953,16 @@ void ScaleShapedSHB_fx( } *Qx = *Q_bwe_exc; - + move16(); /* rescale the overlap memory */ FOR( i = 0; i < L_SHB_LAHEAD; i++ ) { temp2 = 1; + move16(); if ( overlap[i] < 0 ) { temp2 = -1; + move16(); } temp1 = abs_s( overlap[i] ); temp1 = shl( temp1, ( *Q_bwe_exc - prev_Q_bwe_syn2 ) ); @@ -3876,12 +3977,14 @@ void ScaleShapedSHB_fx( synSHB[i] = mac_r( L_tmp2, overlap[i], MAX_16 ); move16(); /* Q_bwe_exc + Q_gFr_norm - 13 */ synSHB[i + l_shb_lahead] = round_fx( L_tmp ); /* Q_bwe_exc + Q_gFr_norm - 13 */ + move16(); } FOR( ; i < l_frame; i++ ) { L_tmp = Mult_32_16( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */ synSHB[i] = round_fx( L_tmp ); /* Q_bwe_exc + Q_gFr_norm - 13 */ + move16(); } l_frame_tmp = add( l_frame, l_shb_lahead ); @@ -4053,6 +4156,7 @@ void ScaleShapedWB_fx( { shift = sub( 13, Q_bwe_exc ); /* earlier = (10 - Q_bwe_exc) but we changed GainFrame Q21 to Q18 */ *Qx = 0; + move16(); } ELSE IF( EQ_16( L_frame, L_FRAME ) ) /* 12.8k core */ { @@ -4068,6 +4172,7 @@ void ScaleShapedWB_fx( shift = s_min( min_shift, max_shift2 ); *Qx = ( Q_bwe_exc + 3 ) + shift - 16; + move16(); } ELSE /* 16k core */ { @@ -4076,17 +4181,21 @@ void ScaleShapedWB_fx( /* Qx = (Q_bwe_exc+3) + shift - 16 */ /* make sure 14 > Qx > 3 */ min_shift = 3 - ( Q_bwe_exc + 3 - 16 ); + move16(); max_shift = 13 - ( Q_bwe_exc + 3 - 16 ); + move16(); max_shift2 = s_min( max_shift, max_headroom ); /* avoid shifting more than the available max_val headroom to avoid overflow */ shift = s_min( min_shift, max_shift2 ); *Qx = ( Q_bwe_exc + 3 ) + shift - 16; + move16(); } /* bring memory st_fx->syn_overlap_fx[] = overlap[i] to new Q = Qx to prepare for addition */ FOR( i = 0; i < l_shb_lahead; i++ ) { overlap[i] = shl( overlap[i], ( *Qx - prev_Qx ) ); + move16(); } FOR( i = 0; i < l_shb_lahead; i++ ) @@ -4095,6 +4204,7 @@ void ScaleShapedWB_fx( L_tmp = Mult_32_32( mod_syn[i], frame_gain ); /* L_tmp in (Q_bwe_exc+3) */ #ifdef BASOP_NOGLOB synSHB[i] = round_fx_sat( L_shl_sat( Mult_32_16( L_tmp, win[i] ), shift ) ); /* Qx */ + move16(); synSHB[i] = add_sat( synSHB[i], overlap[i] ); move16(); /* Qx */ synSHB[i + l_shb_lahead] = round_fx_sat( L_shl_sat( L_tmp, shift ) ); /* Qx */ @@ -4114,6 +4224,7 @@ void ScaleShapedWB_fx( #else synSHB[i] = round_fx( L_shl( L_tmp, shift ) ); /* Qx; */ #endif + move16(); } l_frame_tmp = add( l_frame, l_shb_lahead ); @@ -4125,6 +4236,7 @@ void ScaleShapedWB_fx( #else overlap[i - l_frame] = round_fx( L_shl( Mult_32_16( L_tmp, win[l_frame + l_shb_lahead - 1 - i] ), shift ) ); /* Qx */ #endif + move16(); } return; @@ -4385,6 +4497,7 @@ void non_linearity_fx( Word16 length_half; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif @@ -4924,6 +5037,7 @@ void create_random_vector_fx( j = s_and( j, 0xff ); k = s_and( k, 0xff ); output[i] = round_fx( L_add( L_mult( scale1, gaus_dico_swb_fx[j] ), L_mult( scale2, gaus_dico_swb_fx[k] ) ) ); /*Q5 */ + move16(); j++; k++; } @@ -4965,19 +5079,29 @@ void interp_code_5over2_fx( Word16 i, kk, kkp1, i_len2; Word32 Ltemp; Word16 factor_i_fx[5] = { 6554, 19661, 32767, 19661, 6554 }; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); Word16 factor_j_fx[5] = { 26214, 13107, 0, 13107, 26214 }; - + move16(); + move16(); + move16(); + move16(); + move16(); interp_code_fx[0] = inp_code_fx[0]; move16(); /* Qx */ Ltemp = L_mult( inp_code_fx[0], factor_i_fx[3] ); /* Q(16+x) */ Ltemp = L_mac( Ltemp, inp_code_fx[1], factor_j_fx[3] ); /* Q(16+x) */ interp_code_fx[1] = round_fx( Ltemp ); /*Qx */ - + move16(); Ltemp = L_mult( inp_code_fx[0], factor_i_fx[4] ); /*Q(16+x) */ Ltemp = L_mac( Ltemp, inp_code_fx[1], factor_j_fx[4] ); /*Q(16+x) */ interp_code_fx[2] = round_fx( Ltemp ); /* Qx */ - + move16(); kk = 1; move16(); kkp1 = 2; @@ -4993,35 +5117,35 @@ void interp_code_5over2_fx( Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[0] ); /*Q(16+x) */ Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_i_fx[0] ); /*Q(16+x) */ interp_code_fx[i] = round_fx( Ltemp ); /*Qx */ - + move16(); Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[1] ); /*Q(16+x) */ Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_i_fx[1] ); /*Q(16+x) */ interp_code_fx[i + 1] = round_fx( Ltemp ); /*Qx */ - + move16(); Ltemp = L_mult( inp_code_fx[kkp1], factor_i_fx[2] ); /*Q(16+x) */ interp_code_fx[i + 2] = round_fx( Ltemp ); /*Qx */ - + move16(); kk++; kkp1++; Ltemp = L_mult( inp_code_fx[kk], factor_i_fx[3] ); /*Q(16+x) */ Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_j_fx[3] ); /*Q(16+x) */ interp_code_fx[i + 3] = round_fx( Ltemp ); /*Qx */ - + move16(); Ltemp = L_mult( inp_code_fx[kk], factor_i_fx[4] ); /*Q(16+x) */ Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_j_fx[4] ); /*Q(16+x) */ interp_code_fx[i + 4] = round_fx( Ltemp ); /*Qx */ - + move16(); kk++; kkp1++; } Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[0] ); /*Q(16+x) */ interp_code_fx[i] = round_fx( Ltemp ); /*Qx */ - + move16(); Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[1] ); /*Q(16+x) */ interp_code_fx[i + 1] = round_fx( Ltemp ); /*Qx */ - + move16(); return; } @@ -5127,6 +5251,11 @@ void elliptic_bpf_48k_generic_fx( memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); + move32(); + move32(); + move32(); + move32(); + move32(); #else memory_fx[0][i] = shl( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); memory2_fx[1][i] = L_shl( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); @@ -5240,7 +5369,11 @@ void elliptic_bpf_48k_generic_fx( memory_fx2[0][1] = input_fx[sub( L_FRAME48k, 3 )]; memory_fx2[0][2] = input_fx[sub( L_FRAME48k, 2 )]; memory_fx2[0][3] = input_fx[sub( L_FRAME48k, 1 )]; - + move32(); + move32(); + move32(); + move32(); + move32(); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -5357,7 +5490,11 @@ void elliptic_bpf_48k_generic_fx( memory_fx2[1][1] = L_tmp[sub( L_FRAME48k, 3 )]; memory_fx2[1][2] = L_tmp[sub( L_FRAME48k, 2 )]; memory_fx2[1][3] = L_tmp[sub( L_FRAME48k, 1 )]; - + move32(); + move32(); + move32(); + move32(); + move32(); FOR( j = 0; j < 4; j++ ) { #ifdef BASOP_NOGLOB @@ -5367,6 +5504,9 @@ void elliptic_bpf_48k_generic_fx( memory2_fx_2[j] = L_shl( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); memory2_fx_3[j] = L_shl( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); #endif + move32(); + move32(); + move32(); } #ifdef BASOP_NOGLOB L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ @@ -5509,19 +5649,32 @@ void elliptic_bpf_48k_generic_fx( memory_fx2[3][1] = L_output[sub( L_FRAME48k, 3 )]; memory_fx2[3][2] = L_output[sub( L_FRAME48k, 2 )]; memory_fx2[3][3] = L_output[sub( L_FRAME48k, 1 )]; - + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); memory_fx_Q[0] = *Q_input_fx; memory_fx_Q[1] = add( *Q_input_fx, 11 ); memory_fx_Q[2] = add( add( *Q_input_fx, 6 ), Q_temp ); memory_fx_Q[3] = add( add( *Q_input_fx, 1 ), Q_temp ); - + move16(); + move16(); + move16(); + move16(); Q_temp2 = norm_l( L_tmpMax ); Scale_sig32( L_output, 960, Q_temp2 ); FOR( i = 0; i < 960; i++ ) { output_fx[i] = extract_h( L_output[i] ); + move16(); } *Q_input_fx = sub( add( add( *Q_input_fx, Q_temp ), Q_temp2 ), 15 ); + move16(); /* BASOP_NOGLOB */ return; } @@ -5635,6 +5788,7 @@ void synthesise_fb_high_band_fx( { #ifdef BASOP_NOGLOB output[i] = negate( extract_h( L_shl_sat( L_negate( L_tmp ), tmp3 ) ) ); /*Qout*/ + move16(); #else output[i] = negate( extract_h( L_shl( L_negate( L_tmp ), tmp3 ) ) ); /*Qout*/ #endif @@ -5643,6 +5797,7 @@ void synthesise_fb_high_band_fx( { #ifdef BASOP_NOGLOB output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/ + move16(); #else output[i] = extract_h( L_shl( L_tmp, tmp3 ) ); /*Qout*/ #endif @@ -5680,6 +5835,7 @@ void Estimate_mix_factors_fx( Word32 L_tmp1, L_tmp2; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif Copy( shb_res, shb_res_local, L_FRAME16k ); @@ -5692,6 +5848,7 @@ void Estimate_mix_factors_fx( if ( pow3 == 0 ) { pow3 = 1; + move32(); } /* temp_p1_p2 = (float)sqrt(pow1/pow2); */ @@ -5703,21 +5860,23 @@ void Estimate_mix_factors_fx( sc1 = Q_bwe_exc - ( Q_frac - exp1 ); sc2 = Q_bwe_exc - ( Q_shb - exp2 ); - + move16(); + move16(); FOR( i = 0; i < L_FRAME16k; i++ ) { L_tmp1 = Mult_32_16( temp_p1_p2, WN_exc_local[i] ); /* (Q_frac - exp1) +16 */ WN_exc_local[i] = round_fx( L_tmp1 ); - + move16(); L_tmp2 = Mult_32_16( temp_p1_p3, shb_res_local[i] ); /* (Q_shb - exp2) +16 */ shb_res_local[i] = round_fx( L_tmp2 ); - + move16(); /* temp_numer1[i] = sub(shb_res_local[i], WN_exc_local[i]); */ #ifdef BASOP_NOGLOB temp_numer1[i] = round_fx_sat( L_sub_sat( L_shl_sat( L_tmp2, sc2 ), L_shl_sat( L_tmp1, sc1 ) ) ); #else temp_numer1[i] = round_fx( L_sub( L_shl( L_tmp2, sc2 ), L_shl( L_tmp1, sc1 ) ) ); #endif + move16(); /* (Q_bwe_exc) */ /* temp_numer2[i] = sub(exc16kWhtnd[i], WN_exc_local[i]); */ @@ -5789,6 +5948,7 @@ void Estimate_mix_factors_fx( ELSE { tmp = 0; + move16(); } vf_modified[0] = s_min( s_max( tmp, 3277 /* 0.1f in Q15*/ ), 32440 /* 0.99f in Q15 */ ); @@ -5922,6 +6082,7 @@ void prep_tbe_exc_fx( Word16 tmp_code_fx[2 * L_SUBFR * HIBND_ACB_L_FAC]; Word16 tmp_code_preInt_fx[L_SUBFR]; Word16 gain_code16 = 0; + move16(); Word16 tmp /*, tmp1, tmp2*/; /*Word16 random_code[L_SUBFR * HIBND_ACB_L_FAC];*/ Word16 pitch; @@ -5931,9 +6092,11 @@ void prep_tbe_exc_fx( Word16 tempQ15; #ifndef ADD_IVAS_TBE_CODE Word16 L_subfr = L_SUBFR; + move16(); #endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif /**voice_factors = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac; @@ -5943,7 +6106,7 @@ void prep_tbe_exc_fx( tempQ15 = mac_r( tempQ31, VF_2nd_PARAM_FX, voice_fac_fx ); tempQ31 = L_deposit_h( VF_0th_PARAM_FX ); *voice_factors_fx = mac_r( tempQ31, voice_fac_fx, tempQ15 ); - + move16(); tmp = 32767; move16(); @@ -5960,6 +6123,7 @@ void prep_tbe_exc_fx( tmp = MAX_16; move16(); *voice_factors_fx = mult_r( *voice_factors_fx, tmp ); + move16(); } *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 ); @@ -6000,6 +6164,7 @@ void prep_tbe_exc_fx( L_tmp = L_shl( L_tmp, 1 ); /*16+Q_exc */ /* saturation can occur here */ bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx( L_tmp ); /*Q_exc */ #endif /* BASOP_NOGLOB */ + move16(); } } ELSE @@ -6158,6 +6323,7 @@ void prep_tbe_exc_ivas_fx( tmp = MAX_16; move16(); *voice_factors_fx = mult_r( *voice_factors_fx, tmp ); + move16(); } *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 ); @@ -6193,6 +6359,7 @@ void prep_tbe_exc_ivas_fx( L_tmp = L_shl( L_tmp, 1 ); /*16+Q_exc */ /* saturation can occur here */ bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx( L_tmp ); /*Q_exc */ #endif /* BASOP_NOGLOB */ + move16(); } } ELSE @@ -6206,8 +6373,8 @@ void prep_tbe_exc_ivas_fx( Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12 */ #ifdef BASOP_NOGLOB - Ltemp1 = L_shl_o( Ltemp1, Q_exc + 6 /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - Ltemp2 = L_shl_o( Ltemp2, Q_exc + 4 /*Q_exc+16-13*/, &Overflow ); /*Q_exc+16 */ + Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ + Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, 4 ) /*Q_exc+16-13*/, &Overflow ); /*Q_exc+16 */ tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc */ #else /* BASOP_NOGLOB */ @@ -6216,6 +6383,7 @@ void prep_tbe_exc_ivas_fx( tmp_code_preInt_fx[i] = round_fx( L_add( Ltemp1, Ltemp2 ) ); /* Q_exc */ #endif /* BASOP_NOGLOB */ + move16(); } } ELSE @@ -6225,22 +6393,23 @@ void prep_tbe_exc_ivas_fx( /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ #ifdef BASOP_NOGLOB - Ltemp1 = L_shl_o( Ltemp1, Q_exc + 6 /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */ + Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ + tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */ #else Ltemp1 = L_shl( Ltemp1, Q_exc + 6 /*Q_exc+16-19*/ ); /*Q_exc+16 */ tmp_code_preInt_fx[i] = round_fx( Ltemp1 ); /* Q_exc */ #endif + move16(); } } interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */ - FOR( i = 0; i < L_subfr * 2; i++ ) + FOR( i = 0; i < shl( L_subfr, 1 ); i++ ) { - L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * 2] ); /*Q14+Q_exc+1 */ + L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + shl( i_subfr_fx, 1 )] ); /*Q14+Q_exc+1 */ #ifdef BASOP_NOGLOB tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */ - bwe_exc_fx[i + i_subfr_fx * 2] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */ + bwe_exc_fx[i + shl( i_subfr_fx, 1 )] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */ move16(); #else /* BASOP_NOGLOB */ tmp = round_fx( L_shl( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/ ) ); /* tmp in Q_exc */ diff --git a/lib_com/syn_filt_fx.c b/lib_com/syn_filt_fx.c index 5b7fcc4c3..5ce65c316 100644 --- a/lib_com/syn_filt_fx.c +++ b/lib_com/syn_filt_fx.c @@ -150,6 +150,7 @@ void syn_filt_s_lc_fx( L_tmp = L_shl( L_tmp, q ); *y++ = round_fx( L_tmp ); #endif + move16(); } FOR( ; i < lg; i++ ) @@ -162,6 +163,7 @@ void syn_filt_s_lc_fx( L_tmp = L_shl( L_tmp, q ); *y++ = round_fx( L_tmp ); #endif + move16(); } } @@ -213,6 +215,7 @@ void E_UTIL_synthesis( const Word16 shift, const Word16 a[], const Word16 x[], W Word32 ( *syn_kern )( Word32 L_tmp, const Word16 a[], const Word16 y[] ) = NULL; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif if ( EQ_16( m, 6 ) ) @@ -257,6 +260,7 @@ void E_UTIL_synthesis( const Word16 shift, const Word16 a[], const Word16 x[], W L_tmp = L_shl( L_tmp, q ); *y++ = round_fx( L_tmp ); #endif + move16(); /* Filtering from Input + Mix of Memory & Output Signal Past */ FOR( i = 1; i < m; i++ ) @@ -287,6 +291,7 @@ void E_UTIL_synthesis( const Word16 shift, const Word16 a[], const Word16 x[], W L_tmp = L_shl( L_tmp, q ); *y++ = round_fx( L_tmp ); #endif + move16(); } /* Filtering from Input + Output Signal Past */ @@ -300,6 +305,7 @@ void E_UTIL_synthesis( const Word16 shift, const Word16 a[], const Word16 x[], W L_tmp = L_shl( L_tmp, q ); *y++ = round_fx( L_tmp ); #endif + move16(); } /*-----------------------------------------------------------------------* @@ -378,6 +384,7 @@ void E_UTIL_synthesis_fx( const Word16 shift, const Word32 a[], const Word32 x[] } L_tmp = L_shl_o( L_tmp, q, &Overflow ); *y++ = L_tmp; + move32(); } /* Filtering from Input + Output Signal Past */ @@ -386,6 +393,7 @@ void E_UTIL_synthesis_fx( const Word16 shift, const Word32 a[], const Word32 x[] L_tmp = syn_kern( Mpy_32_32( a0, *x++ ), a, y ); L_tmp = L_shl_o( L_tmp, q, &Overflow ); *y++ = L_tmp; + move32(); } /*-----------------------------------------------------------------------* @@ -452,12 +460,12 @@ void ivas_synth_mem_updt2_fx( } ELSE { - en1_e = 30 - 2 * Q; - en2_e = 30 - 2 * Q; + en1_e = sub( 30, shl( Q, 1 ) ); + en2_e = sub( 30, shl( Q, 1 ) ); tmp1 = Sqrt32( en1, &en1_e ); tmp2 = Sqrt32( en2, &en2_e ); tmp = BASOP_Util_Divide3232_Scale( tmp1, tmp2, &tmp_e ); - loc_rat_e = en1_e - en2_e + tmp_e; + loc_rat_e = add( sub( en1_e, en2_e ), tmp_e ); loc_rat = shl_sat( tmp, loc_rat_e ); // Q15 } @@ -466,6 +474,7 @@ void ivas_synth_mem_updt2_fx( { // mem_syn_r[L_SYN_MEM - M + i] *= loc_rat; mem_syn_r[L_SYN_MEM - M + i] = mult_r( mem_syn_r[L_SYN_MEM - M + i], loc_rat ); + move16(); } } } diff --git a/lib_com/tcq_position_arith.c b/lib_com/tcq_position_arith.c index 4c9764fac..4368c569f 100644 --- a/lib_com/tcq_position_arith.c +++ b/lib_com/tcq_position_arith.c @@ -61,9 +61,10 @@ static void set16_fx( { Word16 i; - for ( i = 0; i < N; i++ ) + FOR( i = 0; i < N; i++ ) { y[i] = a; + move16(); } return; @@ -76,9 +77,10 @@ static void set32_fx( ) { Word16 i; - for ( i = 0; i < N; i++ ) + FOR( i = 0; i < N; i++ ) { y[i] = a; + move16(); } return; @@ -97,15 +99,15 @@ Word32 ar_div_ivas( num = L_abs( num ); denum = L_abs( denum ); - if ( L_sub( num, denum ) < 0 || denum == 0 ) + IF( L_sub( num, denum ) < 0 || denum == 0 ) { return 0; } - else if ( L_sub( num, denum ) == 0 ) + ELSE IF( L_sub( num, denum ) == 0 ) { return 1; } - else + ELSE { exp1 = norm_l( num ); exp2 = norm_l( denum ); @@ -113,16 +115,17 @@ Word32 ar_div_ivas( denum = L_shl( denum, exp ); exp = add( exp, 1 ); varout = 0; - for ( i = 0; i < exp; i++ ) + move32(); + FOR( i = 0; i < exp; i++ ) { num = L_sub( num, denum ); varout = L_shl( varout, 1 ); - if ( num >= 0 ) + IF( num >= 0 ) { num = L_shl( num, 1 ); varout = L_add( varout, 1 ); } - else + ELSE { num = L_add( num, denum ); num = L_shl( num, 1 ); @@ -149,30 +152,35 @@ void srt_vec_ind_fx_ivas( Word32 valMem; /*initialize */ - for ( pos = 0; pos < length; pos++ ) + FOR( pos = 0; pos < length; pos++ ) { I[pos] = pos; + move16(); } - for ( pos = 0; pos < length; pos++ ) + FOR( pos = 0; pos < length; pos++ ) { srt[pos] = linear[pos]; + move32(); } /* now iterate */ - for ( pos = 0; pos < ( length - 1 ); pos++ ) + FOR( pos = 0; pos < sub( length, 1 ); pos++ ) { - for ( npos = ( pos + 1 ); npos < length; npos++ ) + FOR( npos = add( pos, 1 ); npos < length; npos++ ) { if ( L_sub( srt[npos], srt[pos] ) < 0 ) { idxMem = I[pos]; I[pos] = I[npos]; I[npos] = idxMem; - + move16(); + move16(); valMem = srt[pos]; srt[pos] = srt[npos]; srt[npos] = valMem; + move32(); + move32(); } } } @@ -189,14 +197,15 @@ static Word32 GetBitsFromPulses_fx( Word32 frac_fx32; Word32 logCoeff_fx; Word16 exp = 0; + move16(); Word32 mantissa_fx = 0; - - if ( m == 0 ) + move32(); + IF( m == 0 ) { return 0; } - for ( i = 0; i < min( m, n ); i++ ) + FOR( i = 0; i < min( m, n ); i++ ) { logCoeff_fx = L_add( L_shl( i + 1, 16 ), L_sub( table_logcum_fx[n + 1], L_add( table_logcum_fx[i + 2], table_logcum_fx[n - i] ) ) ); logCoeff_fx = L_add( logCoeff_fx, L_sub( table_logcum_fx[m], L_add( table_logcum_fx[i + 1], table_logcum_fx[m - i] ) ) ); /*Q16 */ @@ -220,22 +229,23 @@ static Word32 GetBitsFromPulses_fx( exp1 = norm_l( pow_getbitsfrompulses_fx[temp_fx1] ); exp2 = norm_l( frac_fx32 ); frac_fx32 = Mult_32_32( L_shl( pow_getbitsfrompulses_fx[temp_fx1], exp1 ), L_shl( frac_fx32, exp2 ) ); /*21 + exp1 + 30 + exp2 - 31 */ - frac_fx32 = L_shr( frac_fx32, exp1 + exp2 ) + 1; /*20 */ + frac_fx32 = L_add( L_shr( frac_fx32, add( exp1, exp2 ) ), 1 ); /*20 */ - if ( sub( exp, integer_fx ) < 0 ) + IF( sub( exp, integer_fx ) < 0 ) { mantissa_fx = L_shr( mantissa_fx, sub( integer_fx, exp ) ); mantissa_fx = L_add( mantissa_fx, frac_fx32 ); exp = integer_fx; + move16(); } - else + ELSE { mantissa_fx = L_add( mantissa_fx, L_shr( frac_fx32, sub( exp, integer_fx ) ) ); } if ( L_sub( mantissa_fx, 0x200000 ) >= 0 ) { - exp++; + exp = add( exp, 1 ); mantissa_fx = L_shr( mantissa_fx, 1 ); } @@ -246,14 +256,14 @@ static Word32 GetBitsFromPulses_fx( temp32 = L_shl( L_sub( mantissa_fx, L_deposit_h( temp_fx1 ) ), 15 ); /*31 */ exp1 = sub( norm_l( temp32 ), 1 ); temp32 = ar_div_ivas( L_shl( temp32, exp1 ), temp_fx1 ); /*31 + exp1 */ - temp32 = L_shr( temp32, exp1 + 1 ); /*30 */ + temp32 = L_shr( temp32, add( exp1, 1 ) ); /*30 */ frac_fx32 = L_sub( 0x40000000, L_shr( temp32, 1 ) ); /*30 */ frac_fx32 = Mult_32_32( frac_fx32, temp32 ); /*29 */ frac_fx32 = L_shr( frac_fx32, 13 ); /*16 */ exp1 = norm_l( temp_fx1 ); - temp_fx1 = Log2_norm_lc( L_shl( temp_fx1, exp1 ) ); /*15 */ - frac_fx32 = frac_fx32 + Mult_32_32( frac_fx32, 950680361 ); /* frac_fx32 *= 1/ln(2) */ + temp_fx1 = Log2_norm_lc( L_shl( temp_fx1, exp1 ) ); /*15 */ + frac_fx32 = L_add( frac_fx32, Mult_32_32( frac_fx32, 950680361 ) ); /* frac_fx32 *= 1/ln(2) */ return L_add( L_deposit_h( exp ), L_add( L_shl( temp_fx1, 1 ), frac_fx32 ) ); } @@ -273,138 +283,159 @@ void decode_position_ari_fx_ivas( Word32 cp, scp, fxone, fxp1; Word16 stpos = 0, pos, ovrflag, temppos, storepos; - + move16(); fxone = 32768; fxp1 = 512 * 32768; + move32(); + move32(); temppos = 0; storepos = 0; ovrflag = 0; - + move16(); + move16(); + move16(); set16_fx( mode_num_nz, 0, TCQ_MAX_BAND_SIZE ); set16_fx( prob, 0, TCQ_MAX_BAND_SIZE ); - for ( i = 0; i < size; i++ ) + FOR( i = 0; i < size; i++ ) { position[i] = 0; + move32(); } - if ( L_sub( npulses, 1 ) > 0 ) + IF( L_sub( npulses, 1 ) > 0 ) { btcq_fx = GetBitsFromPulses_fx( npulses, size ); - for ( i = 0; i < L_min( npulses, size ); i++ ) + FOR( i = 0; i < L_min( npulses, size ); i++ ) { /*calculate the probability of #nz */ pnzp_fx = L_sub( L_deposit_h( add( i, 1 ) ), btcq_fx ); pnzp_fx = L_add( pnzp_fx, L_add( L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[i + 2], table_logcum_fx[size - i] ) ), L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[i + 1], table_logcum_fx[npulses - i] ) ) ) ); pnzp_fx = L_add( pnzp_fx, 917498 ); /*16 */ - if ( L_sub( pnzp_fx, 0 ) > 0 ) + IF( L_sub( pnzp_fx, 0 ) > 0 ) { integer = extract_h( pnzp_fx ); frac = extract_l( L_shr( L_sub( pnzp_fx, L_deposit_h( integer ) ), 1 ) ); /*15 */ prob[i] = extract_h( L_shl( Pow2( integer, frac ), 16 ) ); /*0 */ + move16(); if ( prob[i] == 0 ) { prob[i] = 1; + move16(); } } - else + ELSE { prob[i] = 1; + move16(); } } ar_make_model( prob, mode_num_nz, min( npulses, size ) ); *nz = add( 1, (Word16) ar_decode( pardec, mode_num_nz ) ); /*get #nz */ nzp = *nz; - - if ( nzp == 1 ) + move16(); + move16(); + IF( EQ_16( nzp, 1 ) ) { Word16 tmp; mode_num_nz[0] = MAX_AR_FREQ; - for ( i = 0; i < size; i++ ) + FOR( i = 0; i < size; i++ ) { - tmp = div_l( L_deposit_h( size - i - 1 ), size ); + tmp = div_l( L_deposit_h( sub( sub( size, i ), 1 ) ), size ); mode_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( tmp ), 1 ) ); } position[ar_decode( pardec, mode_num_nz )] = 1; + move32(); } - else + ELSE { Word16 tmp; mode_num_nz[0] = MAX_AR_FREQ; - - for ( ; nzp > 0; nzp-- ) + move16(); + FOR( ; nzp > 0; nzp-- ) { scp = fxp1; + move32(); temppos = 0; storepos = 0; - - for ( i = stpos; i < size; i++ ) + move16(); + move16(); + FOR( i = stpos; i < size; i++ ) { ovrflag = 0; - - if ( nzp == ( size - i ) ) + move16(); + IF( EQ_16( nzp, sub( size, i ) ) ) { cp = 0; + move32(); } - else + ELSE { tmp = div_l( L_deposit_h( nzp ), ( size - i ) ); cp = L_sub( fxone, tmp ); } scp = Mult_32_16( scp, extract_l( cp ) ); - mode_num_nz[i + 1 - storepos - stpos] = round_fx( L_shl( scp, 6 ) ); + mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] = round_fx( L_shl( scp, 6 ) ); - if ( ( mode_num_nz[i + 1 - storepos - stpos] == 0 && scp > 0 ) || mode_num_nz[i - storepos - stpos] == mode_num_nz[i + 1 - storepos - stpos] ) + IF( ( mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] == 0 && scp > 0 ) || EQ_16( mode_num_nz[sub( sub( i, storepos ), stpos )], mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] ) ) { ovrflag = 1; + move16(); temppos = (Word16) ar_decode( pardec, mode_num_nz ); - storepos += temppos; + storepos = add( storepos, temppos ); scp = fxp1; - - if ( temppos == i - stpos ) /* esc transmitted */ + move32(); + IF( EQ_16( temppos, sub( i, stpos ) ) ) /* esc transmitted */ { - i--; + i = sub( i, 1 ); } - else + ELSE { - break; + BREAK; } } } - if ( !ovrflag ) + IF( !ovrflag ) { pos = (Word16) ar_decode( pardec, mode_num_nz ) + storepos; } - else + ELSE { pos = storepos; + move16(); } position[stpos + pos] = 1; - stpos += pos + 1; + move32(); + stpos = add( stpos, add( pos, 1 ) ); } } } - else if ( L_sub( npulses, 1 ) == 0 ) + ELSE IF( L_sub( npulses, 1 ) == 0 ) { Word16 tmp; *nz = npulses; nzp = *nz; + move16(); + move16(); mode_num_nz[0] = MAX_AR_FREQ; - for ( i = 0; i < size; i++ ) + FOR( i = 0; i < size; i++ ) { - tmp = div_l( L_deposit_h( size - i - 1 ), size ); + tmp = div_l( L_deposit_h( sub( sub( size, i ), 1 ) ), size ); mode_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( tmp ), 1 ) ); + move16(); } position[ar_decode( pardec, mode_num_nz )] = 1; + move32(); } - else + ELSE { *nz = 0; + move16(); } return; @@ -421,31 +452,36 @@ void decode_magnitude_usq_fx_ivas( { Word16 i, magnp, magnzp; Word16 magns[TCQ_MAX_BAND_SIZE], magncout = 0; - + move16(); Word16 storemagn, ovrflag, pos, tempmagn = 0, mmodel[MAX_PULSES + 2]; + move16(); Word32 cp, scp, fxone, fxp1; fxone = 32768; + move32(); fxp1 = 512 * 32768; + move32(); ovrflag = 0; - + move16(); set16_fx( magns, 1, TCQ_MAX_BAND_SIZE ); - if ( sub( nzpos, npulses ) == 0 ) + IF( sub( nzpos, npulses ) == 0 ) { - for ( i = 0; i < size; i++ ) + FOR( i = 0; i < size; i++ ) { out[i] = positions[i]; + move32(); } return; } - else if ( sub( nzpos, 1 ) == 0 ) + ELSE IF( sub( nzpos, 1 ) == 0 ) { - for ( i = 0; i < size; i++ ) + FOR( i = 0; i < size; i++ ) { if ( positions[i] != 0 ) { out[i] = npulses; + move32(); return; } } @@ -455,106 +491,119 @@ void decode_magnitude_usq_fx_ivas( magnp = sub( npulses, 1 ); magncout = 0; - + move16(); set32_fx( out, 0, size ); set16_fx( mmodel, 0, MAX_PULSES + 2 ); mmodel[0] = MAX_AR_FREQ; + move16(); magncout = 0; - for ( pos = 0; pos < size; pos++ ) + move16(); + FOR( pos = 0; pos < size; pos++ ) { scp = fxp1; - if ( positions[pos] != 0 ) + move32(); + IF( positions[pos] != 0 ) { storemagn = 0; - - for ( i = 0; i < magnp; i++ ) + move16(); + FOR( i = 0; i < magnp; i++ ) { ovrflag = 0; - - if ( magnzp == ( magnp - i ) ) + move16(); + IF( EQ_16( magnzp, sub( magnp, i ) ) ) { cp = 0; + move32(); } - else + ELSE { Word16 tmp; tmp = div_l( L_deposit_h( magnzp ), magnp - i ); cp = L_sub( fxone, tmp ); } - if ( cp == fxone ) + if ( EQ_32( cp, fxone ) ) { break; } scp = Mult_32_16( scp, extract_l( cp ) ); - mmodel[i + 1 - storemagn] = round_fx( L_shl( scp, 6 ) ); - - if ( ( mmodel[i + 1 - storemagn] == 0 && scp > 0 ) || mmodel[i - storemagn] == mmodel[i + 1 - storemagn] ) + mmodel[sub( add( i, 1 ), storemagn )] = round_fx( L_shl( scp, 6 ) ); + move16(); + IF( ( mmodel[sub( add( i, 1 ), storemagn )] == 0 && scp > 0 ) || EQ_16( mmodel[sub( i, storemagn )], mmodel[sub( add( i, 1 ), storemagn )] ) ) { - mmodel[i + 1 - storemagn] = 0; + mmodel[sub( add( i, 1 ), storemagn )] = 0; + move16(); /* read data */ tempmagn = (Word16) ar_decode( pardec, mmodel ); - storemagn += tempmagn; + storemagn = add( storemagn, tempmagn ); - if ( tempmagn < i ) + IF( LT_16( tempmagn, i ) ) { /* just magnitude */ ovrflag = 1; - break; + move16(); + BREAK; } - else + ELSE { /* esc code */ scp = fxp1; - i--; + move32(); + i = sub( i, 1 ); } } } - if ( ovrflag ) + IF( ovrflag ) { - out[magncout] = storemagn + 1; + out[magncout] = L_deposit_l( add( storemagn, 1 ) ); + move32(); } - else + ELSE { - out[magncout] = ar_decode( pardec, mmodel ) + storemagn + 1; + out[magncout] = L_add( ar_decode( pardec, mmodel ), L_deposit_l( add( storemagn, 1 ) ) ); + move32(); } - magnp -= (Word16) out[magncout]; - magnzp--; - magncout++; + magnp = sub( magnp, (Word16) out[magncout] ); + magnzp = sub( magnzp, 1 ); + magncout = add( magncout, 1 ); - if ( magnzp == 0 ) /* last magnitude generation */ + IF( magnzp == 0 ) /* last magnitude generation */ { - for ( pos = pos + 1; pos < size; pos++ ) + FOR( pos = add( pos, 1 ); pos < size; pos++ ) { - if ( positions[pos] != 0 ) + IF( positions[pos] != 0 ) { - out[magncout] = magnp + 1; + out[magncout] = L_deposit_l( add( magnp, 1 ) ); + move32(); return; } - else + ELSE { out[magncout] = 0; - magncout++; + move32(); + magncout = add( magncout, 1 ); } } } - else if ( magnzp == magnp ) /* rest magnitudes generation */ + ELSE IF( EQ_16( magnzp, magnp ) ) /* rest magnitudes generation */ { - for ( pos = pos + 1; pos < size; pos++ ) + FOR( pos = add( pos, 1 ); pos < size; pos++ ) { out[magncout] = positions[pos]; - magncout++; + move32(); + magncout = add( magncout, 1 ); } return; } } - else + ELSE { out[magncout] = 0; - magncout++; + move32(); + magncout = add( magncout, 1 ); } } @@ -571,11 +620,12 @@ static Word16 quantize_fx_ivas( qval4_fx = shr( abs_s( add( val, 512 ) ), 12 ); retval_fx = add( shl( qval4_fx, 2 ), DDP_fx[D] ); /* 2nd zero check */ - if ( D == 0 ) + IF( D == 0 ) { if ( sub( abs_s( sub( shl( abs_s( retval_fx ), 10 ), abs_s( val ) ) ), abs_s( val ) ) > 0 ) { retval_fx = 0; + move16(); } } @@ -600,57 +650,67 @@ void decode_mangitude_tcq_fx_ivas( Word16 leftp = npulses; /*pulsesnum; */ Word16 leftnz = nzpos; /*nzpos; */ Word16 magn_mode[3] = { MAX_AR_FREQ, 0, 0 }; - + move16(); + move16(); + move16(); bits_fx = 0; + move32(); tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - ( nzpos - 1 )] ) ); - if ( sub( nzpos, npulses ) == 0 ) + IF( sub( nzpos, npulses ) == 0 ) { - for ( i = 0; i < size; i++ ) + FOR( i = 0; i < size; i++ ) { out[i] = positions[i]; + move32(); } return; } - else if ( sub( nzpos, 1 ) == 0 ) + ELSE IF( sub( nzpos, 1 ) == 0 ) { - for ( i = 0; i < size; i++ ) + FOR( i = 0; i < size; i++ ) { - if ( positions[i] != 0 ) + IF( positions[i] != 0 ) { out[i] = npulses; + move32(); return; } } } st = 0; - for ( i = 0; i < size && leftnz > 1; i++ ) + move16(); + FOR( i = 0; i < size && leftnz > 1; i++ ) { out[i] = positions[i]; - if ( positions[i] != 0 ) + move32(); + IF( positions[i] != 0 ) { /*generate the trellis path */ symbol = 0; - for ( j = 0; j < leftp; j++ ) + move16(); + FOR( j = 0; j < leftp; j++ ) { num = sub( leftnz, 1 ); denum = sub( leftp, add( j, 1 ) ); - if ( sub( num, denum ) >= 0 ) + IF( sub( num, denum ) >= 0 ) { prob1_fx = MAX_16; prob0_fx = 0; + move16(); + move16(); } - else + ELSE { exp1 = sub( norm_s( num ), 1 ); exp2 = norm_s( denum ); prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */ - exp = 15 + exp1 - exp2; + exp = add( 15, sub( exp1, exp2 ) ); prob1_fx = shl( prob1_fx, sub( 15, exp ) ); prob0_fx = sub( MAX_16, prob1_fx ); } - if ( L_sub( sub( leftp, j ), leftnz ) == 0 ) + IF( L_sub( sub( leftp, j ), leftnz ) == 0 ) { symbol = add( j, 1 ); break; @@ -674,8 +734,8 @@ void decode_mangitude_tcq_fx_ivas( /*magn_mode[1] = (int16_t)(prob1 * MAX_AR_FREQ); */ magn_mode[1] = mult( prob1_fx, MAX_AR_FREQ ); - - if ( ar_decode( pardec, magn_mode ) ) + move16(); + IF( ar_decode( pardec, magn_mode ) ) { exp1 = norm_s( prob1_fx ); tmp32 = L_deposit_h( shl( prob1_fx, exp1 ) ); /*exp1 + 15 + 16 */ @@ -683,9 +743,9 @@ void decode_mangitude_tcq_fx_ivas( bits_fx = L_sub( bits_fx, L_sub( tmp16, L_shl( add( exp1, 1 ), 15 ) ) ); /*15 */ symbol = add( j, 1 ); - break; + BREAK; } - else + ELSE { exp1 = norm_s( prob0_fx ); tmp32 = L_deposit_h( shl( prob0_fx, exp1 ) ); /*exp1 + 15 + 16 */ @@ -694,32 +754,36 @@ void decode_mangitude_tcq_fx_ivas( } } out[i] = symbol; + move32(); /*leftp -= symbol; */ leftp = sub( leftp, symbol ); - leftnz--; + leftnz = sub( leftnz, 1 ); } quantum1_fx = quantize_fx_ivas( (Word16) out[i], ddec[st][0] ); quantum2_fx = quantize_fx_ivas( (Word16) out[i], ddec[st][1] ); /*generate the next state */ - if ( sub( quantum1_fx, (Word16) out[i] ) == 0 ) + IF( sub( quantum1_fx, (Word16) out[i] ) == 0 ) { st = nextstate[st][0]; } - else + ELSE { st = nextstate[st][1]; } + move16(); } /*generate the magnitudes */ - for ( ; i < size; i++ ) + FOR( ; i < size; i++ ) { out[i] = 0; + move32(); if ( positions[i] != 0 ) { out[i] = add( sub( leftp, leftnz ), 1 ); + move32(); } } @@ -727,6 +791,7 @@ void decode_mangitude_tcq_fx_ivas( { /*update the surplus */ *surplus_fx = L_add( *surplus_fx, L_sub( tcq_bits_fx, L_shl( bits_fx, 1 ) ) ); + move32(); } return; @@ -740,18 +805,18 @@ Word16 GetScale_fx_ivas( { Word16 pulses = MAX_PULSES, p_est, exp, exp1, exp2, magicnum, tmp; Word32 t, a, b, ab, estbits_fx = 0; - + move32(); magicnum = 24773; /*Q17: 0.188992013101951f; */ - + move16(); t = L_shr( L_mult( magicnum, blen ), 2 ); exp = norm_l( t ); - a = L_shl( 14 - exp, 15 ) + Log2_norm_lc( L_shl( t, exp ) ); + a = L_add( L_shl( L_deposit_l( sub( 14, exp ) ), 15 ), L_deposit_l( Log2_norm_lc( L_shl( t, exp ) ) ) ); exp1 = sub( norm_l( bits_fx ), 1 ); - exp2 = norm_s( blen - 1 ); + exp2 = norm_s( sub( blen, 1 ) ); - tmp = div_l( L_shl( bits_fx, exp1 ), shl( blen - 1, exp2 ) ); - b = L_shr( L_deposit_l( tmp ), exp1 - exp2 ); + tmp = div_l( L_shl( bits_fx, exp1 ), shl( sub( blen, 1 ), exp2 ) ); + b = L_shr( L_deposit_l( tmp ), sub( exp1, exp2 ) ); ab = L_add( a, b ); @@ -759,18 +824,19 @@ Word16 GetScale_fx_ivas( pulses = min( p_est, MAX_PULSES ); - for ( ; pulses >= 0; pulses-- ) + FOR( ; pulses >= 0; pulses-- ) { estbits_fx = GetBitsFromPulses_fx( pulses, blen ); - if ( L_sub( bits_fx, estbits_fx ) >= 0 ) + IF( L_sub( bits_fx, estbits_fx ) >= 0 ) { - break; + BREAK; } } if ( surplus_fx != NULL ) { *surplus_fx = L_add( *surplus_fx, L_sub( bits_fx, estbits_fx ) ); + move32(); } return pulses; @@ -784,11 +850,20 @@ void decode_signs_fx_ivas( { Word16 i; - for ( i = 0; i < size; i++ ) + FOR( i = 0; i < size; i++ ) { if ( out[i] != 0 ) { - out[i] = ( ar_decode( pardec, uniform_model ) > 0 ) ? out[i] : -out[i]; + IF( ar_decode( pardec, uniform_model ) > 0 ) + { + out[i] = out[i]; + } + ELSE + { + out[i] = L_negate( out[i] ); + } + + move32(); } } @@ -1144,16 +1219,17 @@ Word32 encode_magnitude_usq_fx_ivas( static void transmission_bits( PARCODEC arInst, - int16_t bit ) + Word16 bit ) { bitstream_save_bit( arInst->bsInst, bit ); - arInst->num_bits++; + arInst->num_bits = L_add( arInst->num_bits, 1 ); bit = !bit; - - for ( ; arInst->bits_to_follow > 0 && arInst->num_bits < arInst->max_bits; arInst->bits_to_follow-- ) + move16(); + FOR( ; arInst->bits_to_follow > 0 && arInst->num_bits < arInst->max_bits; arInst->bits_to_follow-- ) { bitstream_save_bit( arInst->bsInst, bit ); - arInst->num_bits++; + arInst->num_bits = L_add( arInst->num_bits, 1 ); + move32(); } return; @@ -1162,16 +1238,20 @@ static void transmission_bits( void ar_encoder_start( PARCODEC arInst, TCQ_PBITSTREAM bsInst, - int16_t max_bits ) + Word16 max_bits ) { arInst->bsInst = bsInst; arInst->low = 0; + move32(); arInst->high = AR_TOP; + move32(); arInst->bits_to_follow = 0; - + move16(); arInst->num_bits = 0; + move32(); arInst->max_bits = max_bits; + move32(); return; } @@ -1179,47 +1259,47 @@ void ar_encoder_start( static void ar_encode( PARCODEC arInst, - const int16_t *model, - int32_t symbol ) + const Word16 *model, + Word32 symbol ) { - uint32_t range, high, low; + UWord32 range, high, low; high = arInst->high; low = arInst->low; - symbol++; + symbol = L_add( symbol, 1 ); range = high - low + 1; high = low + ( range * model[symbol - 1] ) / model[0] - 1; low = low + ( range * model[symbol] ) / model[0]; - for ( ;; ) + FOR( ;; ) { - if ( high < AR_HALF ) + IF( high < AR_HALF ) { transmission_bits( arInst, 0 ); } - else + ELSE { - if ( low >= AR_HALF ) + IF( low >= AR_HALF ) { transmission_bits( arInst, 1 ); low -= AR_HALF; high -= AR_HALF; } - else + ELSE { - if ( low >= AR_FIRST && high < AR_THIRD ) + IF( low >= AR_FIRST && high < AR_THIRD ) { - arInst->bits_to_follow++; + arInst->bits_to_follow = add( arInst->bits_to_follow, 1 ); low -= AR_FIRST; high -= AR_FIRST; } - else + ELSE { - break; + BREAK; } } } @@ -1229,20 +1309,21 @@ static void ar_encode( } arInst->high = high; + move32(); arInst->low = low; - + move32(); return; } static void ar_encode_uniform( PARCODEC arInst, - uint16_t data, - const int16_t bits ) + UWord16 data, + const Word16 bits ) { - int16_t i; + Word16 i; - for ( i = 0; i < bits; i++ ) + FOR( i = 0; i < bits; i++ ) { ar_encode( arInst, uniform_model, data & 0x1 ); data >>= 1; @@ -1255,7 +1336,8 @@ static void ar_encode_uniform( void ar_encoder_done( PARCODEC arInst ) { - arInst->bits_to_follow++; + arInst->bits_to_follow = add( arInst->bits_to_follow, 1 ); + move16(); transmission_bits( arInst, arInst->low >= AR_FIRST ); return; @@ -1266,35 +1348,43 @@ void ar_decoder_start( PARCODEC arInst, TCQ_PBITSTREAM bsInst ) { - int16_t i; + Word16 i; arInst->bsInst = bsInst; - + move32(); + move32(); + move32(); + move32(); + move32(); + move16(); arInst->low = 0; arInst->high = AR_TOP; arInst->value = 0; - - for ( i = 0; i < AR_BITS; i++ ) + move32(); + move32(); + move32(); + FOR( i = 0; i < AR_BITS; i++ ) { - arInst->value = ( arInst->value << 1 ) + bitstream_load_bit( arInst->bsInst ); + arInst->value = L_add( L_shl( arInst->value, 1 ), bitstream_load_bit( arInst->bsInst ) ); + move32(); } return; } -static int32_t ar_decode( +static Word32 ar_decode( PARCODEC arInst, - const int16_t *model ) + const Word16 *model ) { - uint32_t range; - int16_t cum; - int16_t symbol; + UWord32 range; + Word16 cum; + Word16 symbol; - range = (uint32_t) ( arInst->high - arInst->low ) + 1; - cum = (int16_t) ( ( ( (uint32_t) ( arInst->value - arInst->low ) + 1 ) * model[0] - 1 ) / range ); + range = (UWord32) L_add( L_sub( arInst->high, arInst->low ), 1 ); + cum = (Word16) ( ( ( (UWord32) L_sub( arInst->value, arInst->low ) + 1 ) * model[0] - 1 ) / range ); - for ( symbol = 1; model[symbol] > cum; symbol++ ) + FOR( symbol = 1; model[symbol] > cum; symbol++ ) { ; } @@ -1302,36 +1392,45 @@ static int32_t ar_decode( arInst->high = arInst->low + ( range * model[symbol - 1] ) / model[0] - 1; arInst->low = arInst->low + ( range * model[symbol] ) / model[0]; - for ( ;; ) + FOR( ;; ) { - if ( arInst->high >= AR_HALF ) + IF( GE_32( arInst->high, AR_HALF ) ) { - if ( arInst->low >= AR_HALF ) + IF( GE_32( arInst->low, AR_HALF ) ) { - arInst->value -= AR_HALF; - arInst->low -= AR_HALF; - arInst->high -= AR_HALF; + arInst->value = L_sub( arInst->value, AR_HALF ); + move32(); + arInst->low = L_sub( arInst->low, AR_HALF ); + move32(); + arInst->high = L_sub( arInst->high, AR_HALF ); + move32(); } - else + ELSE { - if ( arInst->low >= AR_FIRST && arInst->high < AR_THIRD ) + IF( GE_32( arInst->low, AR_FIRST ) && LT_32( arInst->high, AR_THIRD ) ) { - arInst->value -= AR_FIRST; - arInst->low -= AR_FIRST; - arInst->high -= AR_FIRST; + arInst->value = L_sub( arInst->value, AR_FIRST ); + move32(); + arInst->low = L_sub( arInst->low, AR_FIRST ); + move32(); + arInst->high = L_sub( arInst->high, AR_FIRST ); + move32(); } - else + ELSE { - break; + BREAK; } } } - arInst->low <<= 1; - arInst->high = ( arInst->high << 1 ) + 1; - arInst->value = ( arInst->value << 1 ) + bitstream_load_bit( arInst->bsInst ); + arInst->low = L_shl( arInst->low, 1 ); + move32(); + arInst->high = L_add( L_shl( arInst->high, 1 ), 1 ); + move32(); + arInst->value = L_add( L_shl( arInst->value, 1 ), bitstream_load_bit( arInst->bsInst ) ); + move32(); } - return ( symbol - 1 ); + return ( sub( symbol, 1 ) ); } void ar_decoder_done( @@ -1343,17 +1442,17 @@ void ar_decoder_done( } -static int32_t ar_make_model( - const int16_t *freq, - int16_t *model, - const int16_t len ) +static Word32 ar_make_model( + const Word16 *freq, + Word16 *model, + const Word16 len ) { - int16_t dist; - uint32_t sum = 0; - uint32_t cum = 0; - int16_t i; + Word16 dist; + UWord32 sum = 0; + UWord32 cum = 0; + Word16 i; - for ( i = 0; i < len; i++ ) + FOR( i = 0; i < len; i++ ) { sum += freq[i]; } @@ -1363,58 +1462,62 @@ static int32_t ar_make_model( return 0; } - for ( i = len;; i-- ) + FOR( i = len;; i-- ) { - model[i] = (int16_t) ( ( cum * MAX_AR_FREQ ) / sum ); - + model[i] = (Word16) ( ( cum * MAX_AR_FREQ ) / sum ); + move16(); if ( !i ) { - break; + BREAK; } cum += freq[i - 1]; } - for ( i = 0; i < len - 1; i++ ) + FOR( i = 0; i < sub( len, 1 ); i++ ) { - dist = model[i] - model[i + 1]; + dist = sub( model[i], model[i + 1] ); if ( dist <= 0 ) { - model[i + 1] += dist - 1; + model[i + 1] = add( model[i + 1], sub( dist, 1 ) ); + move16(); } } - for ( i = len; i; i-- ) + FOR( i = len; i; i-- ) { - dist = model[i - 1] - model[i]; + dist = sub( model[i - 1], model[i] ); if ( dist <= 0 ) { - model[i - 1] -= dist - 1; + model[i - 1] = sub( model[i - 1], sub( dist, 1 ) ); + move16(); } } - return ( model[0] > model[1] ); + return ( GT_16( model[0], model[1] ) ); } static void bitstream_save_bit( TCQ_PBITSTREAM pBS, - const int16_t bit ) + const Word16 bit ) { - uint8_t cur; + UWord8 cur; cur = pBS->buf[pBS->numByte]; - cur = (uint8_t) ( cur | ( bit << pBS->curPos-- ) ); + cur = (UWord8) ( cur | shl( bit, pBS->curPos-- ) ); pBS->buf[pBS->numByte] = cur; - pBS->numbits++; + pBS->numbits = L_add( pBS->numbits, 1 ); if ( pBS->curPos < 0 ) { pBS->curPos = 7; - pBS->numByte++; + move16(); + pBS->numByte = L_add( pBS->numByte, 1 ); + move32(); } return; @@ -1424,22 +1527,25 @@ static void bitstream_save_bit( static uint32_t bitstream_load_bit( TCQ_PBITSTREAM pBS ) { - uint32_t bit; + UWord32 bit; Word16 *curPos; /* safety check in case of bit errors */ - if ( pBS->numByte >= pBS->maxBytes ) + if ( GE_32( pBS->numByte, pBS->maxBytes ) ) { return 0; } curPos = &pBS->curPos; + move16(); bit = ( ( pBS->buf[pBS->numByte] >> ( *curPos )-- ) & 0x00000001 ); if ( *curPos < 0 ) { - pBS->numByte++; + pBS->numByte = L_add( pBS->numByte, 1 ); + move32(); *curPos = 7; + move16(); } return bit; @@ -1448,18 +1554,20 @@ static uint32_t bitstream_load_bit( static void bitstream_rollback( TCQ_PBITSTREAM pBS, - int16_t numBits ) + Word16 numBits ) { - while ( numBits > 0 ) + WHILE( numBits > 0 ) { - pBS->curPos++; - pBS->numbits--; - if ( pBS->curPos == 8 ) + pBS->curPos = add( pBS->curPos, 1 ); + pBS->numbits = L_sub( pBS->numbits, 1 ); + IF( EQ_16( pBS->curPos, 8 ) ) { pBS->curPos = 0; - pBS->numByte--; + move16(); + pBS->numByte = L_sub( pBS->numByte, 1 ); + move32(); } - numBits--; + numBits = sub( numBits, 1 ); } return; @@ -1930,10 +2038,10 @@ float GetISCScale( void InitLSBTCQ( - int16_t *bcount ) + Word16 *bcount ) { *bcount = 0; - + move16(); return; } @@ -2068,12 +2176,12 @@ void TCQLSBdec( void SaveTCQdata( PARCODEC arInst, - int16_t *dpath, - int16_t bcount ) + Word16 *dpath, + Word16 bcount ) { - int16_t i; + Word16 i; - for ( i = 0; i < bcount; i++ ) + FOR( i = 0; i < bcount; i++ ) { ar_encode_uniform( arInst, dpath[i], 1 ); } @@ -2083,14 +2191,15 @@ void SaveTCQdata( void LoadTCQdata( PARCODEC arInst, - int16_t *dpath, - int16_t bcount ) + Word16 *dpath, + Word16 bcount ) { - int16_t i; + Word16 i; - for ( i = 0; i < bcount; i++ ) + FOR( i = 0; i < bcount; i++ ) { - dpath[i] = (int16_t) ar_decode( arInst, uniform_model ); + dpath[i] = (Word16) ar_decode( arInst, uniform_model ); + move16(); } return; diff --git a/lib_com/tns_base.c b/lib_com/tns_base.c index 6c62b0a3c..b0b8bb8e3 100644 --- a/lib_com/tns_base.c +++ b/lib_com/tns_base.c @@ -1097,12 +1097,12 @@ static Word32 IIRLattice( Word16 order, const Word16 *parCoeff, Word32 *state, W /* first stage: no need to calculate state[order-1] */ - x = L_sub( x, Mpy_32_16_1( state[order - 1], parCoeff[order - 1] ) ); + x = Msub_32_16( x, state[order - 1], parCoeff[order - 1] ); FOR( i = order - 2; i >= 0; i-- ) { - x = L_sub( x, Mpy_32_16_1( state[i], parCoeff[i] ) ); - state[i + 1] = L_add( state[i], Mpy_32_16_1( x, parCoeff[i] ) ); + x = Msub_32_16( x, state[i], parCoeff[i] ); + state[i + 1] = Madd_32_16( state[i], x, parCoeff[i] ); move32(); } diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 6d17d6a4a..c0f402d61 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -573,6 +573,24 @@ void Copy32( } } } + +void set8_fx( + Word8 y[], /* i/o: Vector to set */ + const Word8 a, /* i : Value to set the vector to */ + const Word16 N /* i : Lenght of the vector */ +) +{ + Word16 i; + + FOR( i = 0; i < N; i++ ) + { + y[i] = a; + move16(); + } + + return; +} + /*-------------------------------------------------------------------* * set16_fx() * set32_fx() diff --git a/lib_com/weight_a_fx.c b/lib_com/weight_a_fx.c index 3177fea34..61f453a20 100644 --- a/lib_com/weight_a_fx.c +++ b/lib_com/weight_a_fx.c @@ -29,7 +29,7 @@ void weight_a_subfr_fx( orderp1 = add( order, 1 ); FOR( k = 0; k < nb_subfr; k++ ) { - weight_a_fx( &A[k * ( orderp1 )], &Aw[k * ( orderp1 )], gamma, order ); + weight_a_fx( &A[imult1616( k, ( orderp1 ) )], &Aw[imult1616( k, ( orderp1 ) )], gamma, order ); } return; @@ -78,8 +78,10 @@ void weight_a_lc_fx( FOR( i = 1; i < m; i++ ) { ap[i] = round_fx( L_shl( L_mult0( a[i], *ptr_gamma++ ), shift ) ); + move16(); } ap[m] = round_fx( L_shl( L_mult0( a[m], *ptr_gamma++ ), shift ) ); + move16(); return; } @@ -100,7 +102,9 @@ void weight_a_fx( Word32 Amax; Word16 shift; #ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; + Flag Overflow; + Overflow = 0; + move32(); #endif fac = gamma; @@ -124,9 +128,11 @@ void weight_a_fx( #else /* BASOP_NOGLOB */ ap[i] = round_fx( L_shl( L_mult0( a[i], fac ), shift ) ); #endif + move16(); fac = mult_r( fac, gamma ); } ap[m] = round_fx( L_shl( L_mult0( a[m], fac ), shift ) ); + move16(); return; } @@ -157,13 +163,46 @@ void E_LPC_a_weight_inv( 17350, 18859, 20499, 22281, 24219, 26325, 28614, 31102 }; /* Q13 */ static const Word16 inv_gamma_tab_16k[16] = { 17430, 18542, 19726, 20985, 22324, 23749, 25265, 26878, /* Q14 */ 14297, 15209, 16180, 17213, 18312, 19480, 20724, 22047 }; /* Q13 */ + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + const Word16 *inv_gamma_tab; Word32 L_tmp; Word32 Amax; Word16 shift; - IF( inv_gamma == 16384 ) + IF( EQ_16( inv_gamma, 16384 ) ) { FOR( i = 0; i <= m; i++ ) { @@ -177,11 +216,9 @@ void E_LPC_a_weight_inv( assert( m == 16 ); inv_gamma_tab = inv_gamma_tab_12k8; - move16(); if ( EQ_16( inv_gamma, GAMMA16k_INV ) ) { inv_gamma_tab = inv_gamma_tab_16k; - move16(); } @@ -201,12 +238,14 @@ void E_LPC_a_weight_inv( { L_tmp = L_mult( a[i], inv_gamma_tab[i - 1] ); ap[i] = round_fx( L_shl( L_tmp, shift ) ); + move16(); } shift = add( shift, 1 ); FOR( i = 9; i < 17; i++ ) { L_tmp = L_mult( a[i], inv_gamma_tab[i - 1] ); ap[i] = round_fx( L_shl( L_tmp, shift ) ); + move16(); } diff --git a/lib_dec/amr_wb_dec_fx.c b/lib_dec/amr_wb_dec_fx.c index e1ffd2adf..2ea166a70 100644 --- a/lib_dec/amr_wb_dec_fx.c +++ b/lib_dec/amr_wb_dec_fx.c @@ -194,7 +194,7 @@ ivas_error amr_wb_dec_fx( st_fx->hPFstat->reset = 1; move16(); } - IF( GT_16( st_fx->bfi, 0 ) ) + IF( st_fx->bfi > 0 ) { st_fx->nbLostCmpt = add( st_fx->nbLostCmpt, 1 ); move16(); @@ -226,7 +226,7 @@ ivas_error amr_wb_dec_fx( move16(); test(); test(); - if ( st_fx->last_con_tcx && ( NE_16( st_fx->L_frameTCX_past, st_fx->L_frame ) ) && ( ( st_fx->last_core != 0 ) ) ) + if ( st_fx->last_con_tcx && ( NE_16( st_fx->L_frameTCX_past, st_fx->L_frame ) ) && ( st_fx->last_core != 0 ) ) { avoid_lpc_burst_on_recovery = 1; move16(); @@ -244,7 +244,6 @@ ivas_error amr_wb_dec_fx( /* in case of switching, do not apply BPF */ st_fx->bpf_off = 1; move16(); - IF( st_fx->hPFstat->on ) { Word16 mem_syn_r_size_old, mem_syn_r_size_new; @@ -353,7 +352,7 @@ ivas_error amr_wb_dec_fx( } /*End of _DIFF_FLOAT_FIX_*/ test(); - if ( EQ_16( st_fx->last_bwidth, NB ) && NE_16( st_fx->ini_frame, 0 ) ) + if ( EQ_16( st_fx->last_bwidth, NB ) && st_fx->ini_frame != 0 ) { st_fx->rate_switching_reset = 1; move16(); @@ -385,16 +384,9 @@ ivas_error amr_wb_dec_fx( class_para_fx = 0; move16(); - // has been moved to updt_dec_common_fx() - // if( st_fx->first_CNG == 0 ) - //{ - // st_fx->first_CNG = 1; - // move16(); - //} - delta_mem_scale = 3; move16(); - test(); + if ( LT_32( st_fx->lp_ener_fx, 40 ) ) /* very low energy frames, less than 0.3125 */ { delta_mem_scale = 0; @@ -432,6 +424,7 @@ ivas_error amr_wb_dec_fx( frame_energy_fx( L_FRAME, pitch_temp, syn_fx, 0, &frame_e_fx, st_fx->Q_syn ); /*st->psf_lp_noise = 0.99f * st->psf_lp_noise + 0.01f * frame_e; */ st_fx->psf_lp_noise_fx = round_fx( L_mac( L_mult( 32440, st_fx->psf_lp_noise_fx ), 328, frame_e_fx ) ); /*Q8*/ + move16(); } /* update old synthesis for classification */ Copy( syn_fx + L_FRAME - L_SYN_MEM_CLAS_ESTIM, st_fx->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); @@ -510,6 +503,7 @@ ivas_error amr_wb_dec_fx( /*st->lp_ener = 0.7f * st->lp_ener + 0.3f * ftmp;*/ L_tmp = Mult_32_16( st_fx->lp_ener_fx, 22938 ); st_fx->lp_ener_fx = L_add( L_tmp, Mult_32_16( L_tmp1, 9830 ) ); /*Q6 + Q6*/ + move32(); FOR( i = 0; i < M; i++ ) { L_tmp = L_mult( 3277, lsp_new_fx[i] ); @@ -539,7 +533,7 @@ ivas_error amr_wb_dec_fx( move16(); test(); test(); - IF( EQ_16( st_fx->coder_type, INACTIVE ) && st_fx->flag_cna && GE_16( st_fx->psf_lp_noise_fx, shl( 15, 7 ) ) ) + if ( EQ_16( st_fx->coder_type, INACTIVE ) && st_fx->flag_cna && GE_16( st_fx->psf_lp_noise_fx, shl( 15, 7 ) ) ) { tmp16 = 1; move16(); @@ -582,7 +576,7 @@ ivas_error amr_wb_dec_fx( tmp_coder_type = AUDIO; move16(); test(); - IF( EQ_16( st_fx->last_coder_type, INACTIVE ) || EQ_16( st_fx->last_coder_type, UNVOICED ) ) + if ( EQ_16( st_fx->last_coder_type, INACTIVE ) || EQ_16( st_fx->last_coder_type, UNVOICED ) ) { tmp_coder_type = INACTIVE; move16(); @@ -784,11 +778,11 @@ ivas_error amr_wb_dec_fx( flag_cna = 0; move16(); test(); - IF( ( GE_16( st_fx->psf_lp_noise_fx, ( 15 << 8 ) ) ) || EQ_16( st_fx->coder_type, INACTIVE ) ) + IF( ( GE_16( st_fx->psf_lp_noise_fx, ( 15 * ONE_IN_Q8 ) ) ) || EQ_16( st_fx->coder_type, INACTIVE ) ) { /*VAD only for non inactive frame*/ test(); - IF( EQ_16( st_fx->VAD, 1 ) && NE_16( st_fx->coder_type, INACTIVE ) ) + IF( EQ_16( st_fx->VAD, 1 ) && st_fx->coder_type != INACTIVE ) { st_fx->VAD = 1; move16(); @@ -811,7 +805,7 @@ ivas_error amr_wb_dec_fx( noisy_speech_detection_fx( st_fx->hFdCngDec, st_fx->VAD, syn_fx, st_fx->Q_syn ); st_fx->hFdCngDec->hFdCngCom->likelihood_noisy_speech = mult_r( st_fx->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 32440 /*0.99 Q15*/ ); - IF( NE_16( st_fx->hFdCngDec->hFdCngCom->flag_noisy_speech, 0 ) ) + IF( st_fx->hFdCngDec->hFdCngCom->flag_noisy_speech != 0 ) { st_fx->hFdCngDec->hFdCngCom->likelihood_noisy_speech = add( st_fx->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 328 /*0.01 Q15*/ ); move16(); @@ -838,7 +832,6 @@ ivas_error amr_wb_dec_fx( generate_masking_noise_update_seed_fx( st_fx->hFdCngDec->hFdCngCom ); } - IF( !flag_cna ) { test(); @@ -869,7 +862,7 @@ ivas_error amr_wb_dec_fx( resampleCldfb( st_fx->cldfbAna, newCldfbBands, L_FRAME, 0 ); resampleCldfb( st_fx->cldfbBPF, newCldfbBands, L_FRAME, 0 ); - if ( st_fx->ini_frame > 0 ) + IF( st_fx->ini_frame > 0 ) { st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, st_fx->cldfbAna->no_channels ); move16(); @@ -902,6 +895,7 @@ ivas_error amr_wb_dec_fx( { /* in case of BW switching, re-init to default */ st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, st_fx->cldfbAna->no_channels ); + move16(); } cldfb_synth_set_bandsToZero( st_fx, realBuffer, imagBuffer, CLDFB_NO_COL_MAX, scaleFactor ); /* CLDFB synthesis of the combined signal */ @@ -968,7 +962,7 @@ ivas_error amr_wb_dec_fx( test(); test(); test(); - test(); + if ( !st_fx->bfi && st_fx->prev_bfi && GE_32( st_fx->last_total_brate, HQ_48k ) && EQ_16( st_fx->last_codec_mode, MODE2 ) && ( EQ_16( st_fx->last_core_bfi, TCX_20_CORE ) || EQ_16( st_fx->last_core_bfi, TCX_10_CORE ) ) && EQ_16( st_fx->plcInfo.concealment_method, TCX_NONTONAL ) && LT_32( st_fx->plcInfo.nbLostCmpt, 4 ) ) { waveadj_rec = 1; @@ -1093,6 +1087,7 @@ ivas_error amr_wb_dec_fx( /* HP filter */ Scale_sig32( st_fx->L_mem_hp_out_fx, 4, sub( st_fx->Q_syn2, st_fx->Qprev_synth_buffer_fx ) ); st_fx->Qprev_synth_buffer_fx = st_fx->Q_syn2; + move16(); hp20( synth_out_fx, 1 /*stride*/, output_frame, st_fx->L_mem_hp_out_fx, L_mult0( output_frame, 50 ) ); /* save synthesis for core switching */ diff --git a/lib_dec/arith_coder_dec.c b/lib_dec/arith_coder_dec.c index 0bffd6963..507a8d2e0 100644 --- a/lib_dec/arith_coder_dec.c +++ b/lib_dec/arith_coder_dec.c @@ -245,7 +245,7 @@ void tcx_arith_decode_envelope( gamma_uw = 1.0f / st->gamma_float; #define WMC_TOOL_SKIP - tcx_arith_render_envelope_flt( A_ind, L_frame, L_spec, FL2WORD16( hTcxCfg->preemph_fac_flt ), FL2WORD16( gamma_w ), FL2WORD16( 0.5f * gamma_uw ), env ); + tcx_arith_render_envelope_ivas( A_ind, L_frame, L_spec, FL2WORD16( hTcxCfg->preemph_fac_flt ), FL2WORD16( gamma_w ), FL2WORD16( 0.5f * gamma_uw ), env ); #undef WMC_TOOL_SKIP if ( use_hm ) @@ -278,7 +278,7 @@ void tcx_arith_decode_envelope( } envelope = (Word16 *) env; - tcx_arith_scale_envelope_flt( L_spec, L_spec_core, env, target_bits, low_complexity, envelope, &envelope_e ); + tcx_arith_scale_envelope_ivas( L_spec, L_spec_core, env, target_bits, low_complexity, envelope, &envelope_e ); *arith_bits = tcx_arith_decode( L_spec, envelope, envelope_e, target_bits, prm, q_spectrum ); @@ -362,7 +362,7 @@ void tcx_arith_decode_envelope_ivas_fx( move16(); #define WMC_TOOL_SKIP - tcx_arith_render_envelope_flt( A_ind, L_frame, L_spec, hTcxCfg->preemph_fac, gamma_w, gamma_uw, env ); + tcx_arith_render_envelope_ivas( A_ind, L_frame, L_spec, hTcxCfg->preemph_fac, gamma_w, gamma_uw, env ); #undef WMC_TOOL_SKIP IF( use_hm != 0 ) diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index d1fb87d05..e4bab0bf9 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -2094,11 +2094,11 @@ void generate_masking_noise_ivas_fx( /* Perform STFT synthesis */ IF( secondary ) { - SynthesisSTFT_fx( fftBuffer_fx, *exp_out, maskingNoise_fx, hStereoCng->olapBufferSynth22_32fx, hFdCngCom->olapWinSyn_fx, 0, hFdCngCom, element_mode, nchan_out ); + SynthesisSTFT_fx( fftBuffer_fx, maskingNoise_fx, hStereoCng->olapBufferSynth22_32fx, hFdCngCom->olapWinSyn_fx, 0, hFdCngCom, element_mode, nchan_out ); } ELSE { - SynthesisSTFT_fx( fftBuffer_fx, *exp_out, maskingNoise_fx, hFdCngCom->olapBufferSynth2_fx, hFdCngCom->olapWinSyn_fx, 0, hFdCngCom, element_mode, nchan_out ); + SynthesisSTFT_fx( fftBuffer_fx, maskingNoise_fx, hFdCngCom->olapBufferSynth2_fx, hFdCngCom->olapWinSyn_fx, 0, hFdCngCom, element_mode, nchan_out ); } *exp_out = sub( *exp_out, Q9 ); move16(); diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 5840e553d..5e79a9ffc 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -204,6 +204,9 @@ ivas_error ivas_dec_setup( { IF( EQ_32( st_ivas->last_ivas_format, MASA_FORMAT ) ) { + test(); + test(); + test(); IF( ( st_ivas->ini_active_frame == 0 ) && NE_32( ivas_total_brate, FRAME_NO_DATA ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) && EQ_16( st_ivas->nCPE, 1 ) ) { st_ivas->hCPE[0]->nchan_out = 1; @@ -277,7 +280,7 @@ ivas_error ivas_dec_setup( num_bits_read = add( num_bits_read, SBA_ORDER_BITS ); /* read Ambisonic (SBA) order */ - IF( LT_32( ivas_total_brate, IVAS_256k ) ) + if ( LT_32( ivas_total_brate, IVAS_256k ) ) { st_ivas->sba_order = 3; move16(); @@ -326,7 +329,7 @@ ivas_error ivas_dec_setup( move16(); FOR( k = 0; k < MC_LS_SETUP_BITS; k++ ) { - IF( st_ivas->bit_stream[num_bits_read + k] ) + IF( st_ivas->bit_stream[add( num_bits_read, k )] ) { idx = add( idx, shl( 1, sub( ( MC_LS_SETUP_BITS - 1 ), k ) ) ); } @@ -390,8 +393,7 @@ ivas_error ivas_dec_setup( st_ivas->nchan_transport = 1; move16(); BREAK; - case SID_MASA_2TC: - move16(); + case SID_MASA_2TC:; // empyt statement for declaration Word32 res_dec, res_frac; iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); IF( EQ_16( st_ivas->bit_stream[L_sub( L_sub( res_dec, 1 ), SID_FORMAT_NBITS )], 1 ) ) @@ -481,7 +483,7 @@ ivas_error ivas_dec_setup( k = sub( k, 1 ); test(); - if ( st_ivas->ini_frame > 0 && nchan_ism != st_ivas->nchan_ism ) + if ( st_ivas->ini_frame > 0 && NE_16( nchan_ism, st_ivas->nchan_ism ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" ); } @@ -519,7 +521,7 @@ ivas_error ivas_dec_setup( * and number of transport channels *-------------------------------------------------------------------*/ - IF( st_ivas->ini_frame == 0 && NE_32( st_ivas->ivas_format, UNDEFINED_FORMAT ) ) + IF( st_ivas->ini_frame == 0 && st_ivas->ivas_format != UNDEFINED_FORMAT ) { IF( NE_32( ( error = doSanityChecks_IVAS( st_ivas ) ), IVAS_ERR_OK ) ) { @@ -990,7 +992,7 @@ static ivas_error ivas_read_format( /* read IVAS format */ k = 0; move16(); - IF( st_ivas->bit_stream[*num_bits_read] ) + if ( st_ivas->bit_stream[*num_bits_read] ) { k = 1; move16(); @@ -998,7 +1000,7 @@ static ivas_error ivas_read_format( k = shl( k, 1 ); ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); move16(); - IF( st_ivas->bit_stream[*num_bits_read] ) + if ( st_ivas->bit_stream[*num_bits_read] ) { k = add( k, 1 ); } @@ -1059,7 +1061,7 @@ static ivas_error ivas_read_format( move16(); st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[add( add( ( *num_bits_read ), 1 ), SBA_PLANAR_BITS )], 1 ) ); move16(); - IF( st_ivas->sba_order == 0 ) + if ( st_ivas->sba_order == 0 ) { st_ivas->ivas_format = SBA_ISM_FORMAT; move32(); @@ -1124,7 +1126,7 @@ static ivas_error ivas_read_format( move32(); Word32 res_dec, res_frac; iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - IF( st_ivas->bit_stream[res_dec - 1] == 1 ) + IF( EQ_32( st_ivas->bit_stream[res_dec - 1], 1 ) ) { st_ivas->element_mode_init = IVAS_CPE_MDCT; move16(); @@ -1142,7 +1144,7 @@ static ivas_error ivas_read_format( IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) { - IF( st_ivas->sba_analysis_order == 0 ) + if ( st_ivas->sba_analysis_order == 0 ) { st_ivas->sba_analysis_order = SBA_FOA_ORDER; move16(); @@ -1342,7 +1344,6 @@ Word16 getNumChanSynthesis( n = add( st_ivas->nSCE, imult1616( CPE_CHANNELS, st_ivas->nCPE ) ); test(); test(); - test(); IF( st_ivas->sba_dirac_stereo_flag ) { n = CPE_CHANNELS; @@ -1497,7 +1498,7 @@ ivas_error ivas_init_decoder_front( IF( st_ivas->hDecoderConfig->Opt_LsCustom ) { - IF( ( error = ivas_ls_custom_open_fx( &( st_ivas->hLsSetupCustom ) ) ) == IVAS_ERR_OK ) + IF( EQ_32( ( error = ivas_ls_custom_open_fx( &( st_ivas->hLsSetupCustom ) ) ), IVAS_ERR_OK ) ) { #ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED set_zero( ( st_ivas->hLsSetupCustom )->ls_azimuth, MAX_OUTPUT_CHANNELS ); @@ -1606,7 +1607,7 @@ ivas_error ivas_init_decoder_front( * Allocate and initialize Binaural Renderer configuration handle *--------------------------------------------------------------------*/ - IF( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { IF( NE_32( ( error = ivas_render_config_open( &( st_ivas->hRenderConfig ) ) ), IVAS_ERR_OK ) ) { @@ -1865,7 +1866,7 @@ ivas_error ivas_init_decoder_fx( IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - IF( ( error = ivas_ls_custom_output_init_fx( st_ivas ) ) == IVAS_ERR_OK ) + IF( EQ_16( ( error = ivas_ls_custom_output_init_fx( st_ivas ) ), IVAS_ERR_OK ) ) { st_ivas->hOutSetup.ls_azimuth_fx = st_ivas->hLsSetupCustom->ls_azimuth_fx; move32(); @@ -2020,6 +2021,7 @@ ivas_error ivas_init_decoder_fx( IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) { st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed2 = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed3; + move16(); } ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MODE_DISC ) ) { @@ -2093,7 +2095,7 @@ ivas_error ivas_init_decoder_fx( { st_ivas->hSpar->enc_param_start_band = 0; move16(); - set_c( (Word8 *) st_ivas->hQMetaData->twoDirBands, (Word8) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); + set8_fx( (Word8 *) st_ivas->hQMetaData->twoDirBands, (Word8) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); st_ivas->hQMetaData->numTwoDirBands = (UWord8) st_ivas->hQMetaData->q_direction[0].cfg.nbands; move16(); } @@ -2177,7 +2179,6 @@ ivas_error ivas_init_decoder_fx( test(); test(); test(); - test(); IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) @@ -2280,11 +2281,12 @@ ivas_error ivas_init_decoder_fx( Word16 band_grouping[IVAS_MAX_NUM_BANDS + 1]; st_ivas->hSpar->enc_param_start_band = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + move16(); IF( ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ) { st_ivas->hSpar->enc_param_start_band = 0; move16(); - set_c( (Word8 *) st_ivas->hQMetaData->twoDirBands, (Word8) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); + set8_fx( (Word8 *) st_ivas->hQMetaData->twoDirBands, (Word8) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); st_ivas->hQMetaData->numTwoDirBands = (UWord8) st_ivas->hQMetaData->q_direction[0].cfg.nbands; move16(); } @@ -2385,8 +2387,7 @@ ivas_error ivas_init_decoder_fx( test(); WHILE( LT_16( k, SIZE_IVAS_BRATE_TBL ) && NE_32( ivas_total_brate, ivas_brate_tbl[k] ) ) { - k++; - move16(); + k = add( k, 1 ); } test(); IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) @@ -2619,7 +2620,7 @@ ivas_error ivas_init_decoder_fx( st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); move16(); test(); - IF( NE_32( st_ivas->renderer_type, RENDERER_DISABLE ) && NE_32( st_ivas->renderer_type, RENDERER_MCMASA_MONO_STEREO ) ) + IF( st_ivas->renderer_type != RENDERER_DISABLE && NE_32( st_ivas->renderer_type, RENDERER_MCMASA_MONO_STEREO ) ) { IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) { @@ -2702,7 +2703,7 @@ ivas_error ivas_init_decoder_fx( } /* set CNA/CNG flags */ - IF( EQ_16( st_ivas->nchan_transport, 1 ) && ( ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) + IF( EQ_16( st_ivas->nchan_transport, 1 ) && ( ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) ) { st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1; move16(); @@ -2750,8 +2751,6 @@ ivas_error ivas_init_decoder_fx( test(); test(); test(); - test(); - test(); IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { IF( NE_32( ( error = ivas_binRenderer_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) @@ -2991,7 +2990,7 @@ ivas_error ivas_init_decoder_fx( FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) { TDREND_SRC_t *Src_p = st_ivas->hBinRendererTd->Sources[SrcInd[nS]]; - IF( Src_p->SrcSpatial_p != NULL ) + if ( Src_p->SrcSpatial_p != NULL ) { Src_p->SrcSpatial_p->q_Pos_p = Q31; move16(); @@ -3070,7 +3069,7 @@ ivas_error ivas_init_decoder_fx( test(); test(); test(); - IF( ( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 ) + IF( ( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) && !st_ivas->sba_dirac_stereo_flag && NE_16( st_ivas->hDecoderConfig->nchan_out, 1 ) ) { #ifdef IVAS_FLOAT_FIXED #if 1 @@ -5279,7 +5278,6 @@ void ivas_init_dec_get_num_cldfb_instances( } } - test(); IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) ) { test(); @@ -5791,7 +5789,6 @@ static ivas_error doSanityChecks_IVAS( IF( st_ivas->hDecoderConfig->Opt_Headrotation ) { - test(); test(); test(); IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) @@ -5802,7 +5799,6 @@ static ivas_error doSanityChecks_IVAS( IF( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) { - test(); test(); test(); IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) @@ -5822,7 +5818,7 @@ static ivas_error doSanityChecks_IVAS( IF( st_ivas->hDecoderConfig->Opt_aeid_on ) { - IF( output_config != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + IF( NE_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { return IVAS_ERROR( IVAS_ERR_ACOUSTIC_ENVIRONMENT_NOT_SUPPORTED, "Wrong set-up: Acoustic environment is not supported in this output configuration." ); } @@ -5833,6 +5829,7 @@ static ivas_error doSanityChecks_IVAS( test(); IF( NE_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for combined MASA and ISM format" ); } } diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index 6c2bc239e..4cb343648 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -2531,7 +2531,7 @@ void ivas_mdct_core_tns_ns_fx( FOR( Word16 i = 0; i < st->hTonalMDCTConc->nScaleFactors; i++ ) { - sns_int_scf_fx[i] = L_add( Mpy_32_16_1( L_shl( scf_last_m[i], add( 1, scf_last_e[i] ) ), fade_out ), Mpy_32_16_1( L_shl( scf_bg[i], 1 ), fade_in ) ); + sns_int_scf_fx[i] = Madd_32_16( Mpy_32_16_1( L_shl( scf_last_m[i], add( 1, scf_last_e[i] ) ), fade_out ), L_shl( scf_bg[i], 1 ), fade_in ); move32(); } } diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index e3d43dd5a..38df6b53f 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -66,13 +66,13 @@ static ivas_error ivas_spar_dec_MD( Decoder_Struct *st_ivas, Decoder_State *st0 #endif -#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- * ivas_spar_dec_open() * * Allocate and initialize SPAR decoder handle and sub-handles *------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED ivas_error ivas_spar_dec_open( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ @@ -531,6 +531,7 @@ ivas_error ivas_spar_dec_open_fx( } #endif + /*------------------------------------------------------------------------- * ivas_spar_dec_close() * @@ -556,7 +557,6 @@ void ivas_spar_dec_close( ivas_td_decorr_dec_close( &( *hSpar )->hTdDecorr ); /* FB mixer handle */ - ivas_FB_mixer_close( &( *hSpar )->hFbMixer, output_Fs, spar_reconfig_flag ); /* AGC */ @@ -959,6 +959,7 @@ static int16_t ivas_parse_spar_header( } #endif + #ifdef IVAS_FLOAT_FIXED static Word16 get_random_number_fx( Word16 *seed ) @@ -975,6 +976,7 @@ static float get_random_number( } #endif // IVAS_FLOAT_FIXED + #ifdef IVAS_FLOAT_FIXED static Word32 matrix_det_fx( const Word32 a00, @@ -984,9 +986,7 @@ static Word32 matrix_det_fx( { return L_sub( Mpy_32_32( a00, a11 ), Mpy_32_32( a01, a10 ) ); } -#endif - -#ifndef IVAS_FLOAT_FIXED +#else static float matrix_det( const float a00, const float a01, @@ -997,6 +997,7 @@ static float matrix_det( } #endif + #ifdef IVAS_FLOAT_FIXED static void matrix_inverse_fx( Word32 in[3][3], @@ -1078,9 +1079,7 @@ static void matrix_inverse_fx( return; } -#endif - -#ifndef IVAS_FLOAT_FIXED +#else static void matrix_inverse( float in[3][3], float out[3][3], @@ -1134,6 +1133,7 @@ static void matrix_inverse( * * *---------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED void ivas_spar_get_cldfb_gains_fx( SPAR_DEC_HANDLE hSpar, @@ -1276,7 +1276,7 @@ void ivas_spar_get_cldfb_gains_fx( /* target is synthesis output times the cross-fade window*/ FOR( sample = 0; sample < num_samples; sample++ ) { - tgt_fx[sample] = L_shl( Mult_32_32( tgt_fx[sample], L_add( T_fx[sample][0], L_add( T_fx[sample][1], T_fx[sample][2] ) ) ), 10 ); /*Q31*/ + tgt_fx[sample] = L_shl( Mpy_32_32( tgt_fx[sample], L_add( T_fx[sample][0], L_add( T_fx[sample][1], T_fx[sample][2] ) ) ), 10 ); /*Q31*/ move32(); } /* compute matrices */ @@ -1288,7 +1288,7 @@ void ivas_spar_get_cldfb_gains_fx( move32(); FOR( sample = 0; sample < num_samples; sample++ ) { - Tt_T_fx[slot_row][slot_col] = L_add( Tt_T_fx[slot_row][slot_col], Mult_32_32( L_shl( T_fx[sample][slot_row], 8 ), L_shl( T_fx[sample][slot_col], 8 ) ) ); /*Q58-Q31*/ + Tt_T_fx[slot_row][slot_col] = L_add( Tt_T_fx[slot_row][slot_col], Mpy_32_32( L_shl( T_fx[sample][slot_row], 8 ), L_shl( T_fx[sample][slot_col], 8 ) ) ); /*Q58-Q31*/ move32(); } } @@ -1306,7 +1306,7 @@ void ivas_spar_get_cldfb_gains_fx( move32(); FOR( sample = 0; sample < num_samples; sample++ ) { - Tt_tgt_fx[slot_row] = L_add( Tt_tgt_fx[slot_row], Mult_32_32( T_fx[sample][slot_row], tgt_fx[sample] ) ); + Tt_tgt_fx[slot_row] = L_add( Tt_tgt_fx[slot_row], Mpy_32_32( T_fx[sample][slot_row], tgt_fx[sample] ) ); move32(); } } @@ -1320,7 +1320,7 @@ void ivas_spar_get_cldfb_gains_fx( move32(); FOR( slot_col = 0; slot_col < num_cf_slots; slot_col++ ) { - tmp = L_add( tmp, Mult_32_32( Tt_T_inv_fx[slot_row][slot_col], Tt_tgt_fx[slot_col] ) ); + tmp = L_add( tmp, Mpy_32_32( Tt_T_inv_fx[slot_row][slot_col], Tt_tgt_fx[slot_col] ) ); } weights_fx[add( cf_cldfb_start, slot_row )] = extract_l( L_shr( L_max( L_min( tmp, L_shl( 1, sub( output_q, 10 ) ) ), 0 ), sub( sub( output_q, 10 ), Q_weights ) ) ); /*Q_weights*/ move16(); @@ -1799,6 +1799,7 @@ static ivas_error ivas_spar_dec_MD( * * *-------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED static Word16 ivas_spar_get_cldfb_slot_gain_fx( SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ @@ -1964,6 +1965,7 @@ static float ivas_spar_get_cldfb_slot_gain( * * *-------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED void ivas_spar_get_parameters_fx( SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ @@ -2026,7 +2028,6 @@ void ivas_spar_get_parameters_fx( return; } #else - void ivas_spar_get_parameters( SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ @@ -2081,6 +2082,7 @@ void ivas_spar_get_parameters( } #endif + /*-------------------------------------------------------------------* * ivas_spar_get_skip_mat() * @@ -2218,6 +2220,7 @@ static void ivas_spar_get_skip_mat_fx( } #endif + #ifdef IVAS_FLOAT_FIXED static void ivas_spar_calc_smooth_facs_fx( Word32 *cldfb_in_ts_re_fx[CLDFB_NO_COL_MAX], // i @@ -2457,6 +2460,7 @@ static void ivas_spar_calc_smooth_facs( } #endif + /*-------------------------------------------------------------------* * ivas_spar_dec_agc_pca() * @@ -2579,11 +2583,13 @@ void ivas_spar_dec_agc_pca_fx( } #endif + /*-------------------------------------------------------------------* * ivas_spar_dec_set_render_map() * * *-------------------------------------------------------------------*/ + #ifndef IVAS_FLOAT_FIXED void ivas_spar_dec_set_render_map( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ @@ -2651,13 +2657,14 @@ void ivas_spar_dec_set_render_map_fx( } #endif -#ifndef IVAS_FLOAT_FIXED + /*-------------------------------------------------------------------* * ivas_spar_dec_upmixer() * * IVAS SPAR upmixer *-------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ivas_spar_dec_set_render_params( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const int16_t n_cldfb_slots /* i : number of cldfb slots in this frame */ @@ -2699,11 +2706,13 @@ void ivas_spar_dec_set_render_params_fx( } #endif + /*-------------------------------------------------------------------* * ivas_spar_dec_digest_tc() * * *-------------------------------------------------------------------*/ + #ifndef IVAS_FLOAT_FIXED void ivas_spar_dec_digest_tc( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ @@ -2876,6 +2885,7 @@ void ivas_spar_dec_digest_tc_fx( } #endif + #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * ivas_spar_dec_upmixer() @@ -3002,6 +3012,14 @@ void ivas_spar_dec_upmixer( return; } #endif + + +/*-------------------------------------------------------------------* + * ivas_spar_dec_upmixer_sf() + * + * IVAS SPAR upmixer + *-------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED void ivas_spar_dec_upmixer_sf_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ @@ -3196,7 +3214,7 @@ void ivas_spar_dec_upmixer_sf_fx( { FOR( in_ch = 0; in_ch < numch_in; in_ch++ ) { - mixer_mat_fx[out_ch][in_ch][spar_band] = L_add( Mult_32_16( mixer_mat_fx[out_ch][in_ch][spar_band], sub( 32767, hSpar->hMdDec->smooth_fac_fx[spar_band] ) ), Mult_32_16( hSpar->hMdDec->mixer_mat_prev2_fx[out_ch][in_ch][spar_band], hSpar->hMdDec->smooth_fac_fx[spar_band] ) ); /*q1*/ + mixer_mat_fx[out_ch][in_ch][spar_band] = Madd_32_16( Mpy_32_16_1( mixer_mat_fx[out_ch][in_ch][spar_band], sub( 32767, hSpar->hMdDec->smooth_fac_fx[spar_band] ) ), hSpar->hMdDec->mixer_mat_prev2_fx[out_ch][in_ch][spar_band], hSpar->hMdDec->smooth_fac_fx[spar_band] ); /*q1*/ move32(); hSpar->hMdDec->mixer_mat_prev2_fx[out_ch][in_ch][spar_band] = mixer_mat_fx[out_ch][in_ch][spar_band]; move32(); @@ -3237,13 +3255,13 @@ void ivas_spar_dec_upmixer_sf_fx( { /* accumulate contributions from all SPAR bands */ Word16 tmp = extract_l( L_shr( bin2band->pp_cldfb_weights_per_spar_band_fx[cldfb_band][spar_band], 7 ) ); - cldfb_par_fx = L_add_sat( cldfb_par_fx, Mult_32_16( mixer_mat_fx[out_ch][in_ch][spar_band], tmp ) ); /*q1*/ + cldfb_par_fx = L_add_sat( cldfb_par_fx, Mpy_32_16_1( mixer_mat_fx[out_ch][in_ch][spar_band], tmp ) ); /*q1*/ } } - out_re_fx[out_ch] = L_add( out_re_fx[out_ch], Mult_32_32( cldfb_in_ts_re_fx[in_ch][ts][cldfb_band], cldfb_par_fx ) ); /*q1-25*/ + out_re_fx[out_ch] = Madd_32_32( out_re_fx[out_ch], cldfb_in_ts_re_fx[in_ch][ts][cldfb_band], cldfb_par_fx ); /*q1-25*/ move32(); - out_im_fx[out_ch] = L_add( out_im_fx[out_ch], Mult_32_32( cldfb_in_ts_im_fx[in_ch][ts][cldfb_band], cldfb_par_fx ) ); /*q1-25*/ + out_im_fx[out_ch] = Madd_32_32( out_im_fx[out_ch], cldfb_in_ts_im_fx[in_ch][ts][cldfb_band], cldfb_par_fx ); /*q1-25*/ move32(); } } @@ -3384,7 +3402,6 @@ void ivas_spar_dec_upmixer_sf_fx( return; } #else - void ivas_spar_dec_upmixer_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ float *output[], /* o : output audio channels */ diff --git a/lib_dec/lsf_dec_fx.c b/lib_dec/lsf_dec_fx.c index 39466c34b..4ac20d1e6 100644 --- a/lib_dec/lsf_dec_fx.c +++ b/lib_dec/lsf_dec_fx.c @@ -46,7 +46,7 @@ static void dqlsf_CNG_fx( move16(); /* deindex_lvq_cng decoder does not need to know the sampling rate, the sampling rate data is embedded inside the LSF coefficients */ - IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + IF( st_fx->element_mode == EVS_MONO ) { ber_flag = deindex_lvq_cng_fx( &indice[1], lsf_q, indice[0], LSF_BITS_CNG - 4, &st_fx->offset_scale1_fx[0][0], &st_fx->offset_scale2_fx[0][0], &st_fx->no_scales_fx[0][0] ); @@ -57,6 +57,7 @@ static void dqlsf_CNG_fx( deindex_lvq_cng_ivas_fx( &indice[1], lsf_q, indice[0], LSF_BITS_CNG - 4 ); } st_fx->BER_detect = s_or( ber_flag, st_fx->BER_detect ); + move16(); /* The sampling frequency of the LP-CNG frame can be determined by checking the value of the highest order LSF coefficient (last coefficient). If the last decoded LSF coefficient is larger than 6350 the decoded frame is WB2 with sampling rate of 16 kHz @@ -122,8 +123,11 @@ void lsf_dec_fx( Word16 param_lpc[NPRM_LPC_NEW]; Word32 L_tmp; Word16 nBits = 0; + move16(); Word16 tmp_old[M + 1], tmp_new[M + 1]; Word16 enr_old = 0, enr_new = 0; + move16(); + move16(); Word16 lsf_diff, coder_type; /* initialize */ @@ -134,7 +138,7 @@ void lsf_dec_fx( move16(); } test(); - if ( EQ_16( coder_type, AUDIO ) && GT_16( st_fx->GSC_IVAS_mode, 0 ) ) + if ( EQ_16( coder_type, AUDIO ) && st_fx->GSC_IVAS_mode > 0 ) { coder_type = GENERIC; move16(); @@ -164,7 +168,7 @@ void lsf_dec_fx( { nBits = 30; move16(); - if ( EQ_16( st_fx->bwidth, NB ) ) + if ( st_fx->bwidth == NB ) { nBits = 32; move16(); @@ -195,10 +199,11 @@ void lsf_dec_fx( { st_fx->seed_acelp = 0; move16(); - FOR( i = no_param_lpc - 1; i >= 0; i-- ) + FOR( i = sub( no_param_lpc, 1 ); i >= 0; i-- ) { /* rightshift before *seed_acelp+param_lpc[i] to avoid overflows*/ - st_fx->seed_acelp = (int16_t) ( ( ( ( st_fx->seed_acelp ) >> 1 ) + param_lpc[i] ) * 31821L + 13849L ); + st_fx->seed_acelp = extract_l( L_add( imult3216( 31821L, add( shr( ( st_fx->seed_acelp ), 1 ), param_lpc[i] ) ), 13849L ) ); + move16(); // PMTE() /*IVAS_CODE to be completed */ } } @@ -218,6 +223,7 @@ void lsf_dec_fx( L_tmp = L_mac( L_tmp, st_fx->lsfoldbfi1_fx[i], 10922 ); /*Q(x2.56+16)*/ L_tmp = L_mac( L_tmp, st_fx->lsfoldbfi0_fx[i], 10922 ); /*Q(x2.56+16)*/ st_fx->lsf_adaptive_mean_fx[i] = round_fx( L_tmp ); /*Q(x2.56)*/ + move16(); } test(); @@ -245,7 +251,7 @@ void lsf_dec_fx( * Mid-frame LSF decoding * LSP interpolation and conversion of LSPs to A(z) *-------------------------------------------------------------------------------------*/ - if ( st_fx->rate_switching_reset ) + IF( st_fx->rate_switching_reset ) { /*extrapolation in case of unstable LSF convert*/ Copy( lsp_new, st_fx->lsp_old_fx, M ); @@ -277,7 +283,7 @@ void lsf_dec_fx( test(); test(); test(); - if ( EQ_16( st_fx->clas_dec, UNVOICED_CLAS ) || EQ_16( st_fx->clas_dec, SIN_ONSET ) || EQ_16( st_fx->clas_dec, INACTIVE_CLAS ) || EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) ) + if ( st_fx->clas_dec == UNVOICED_CLAS || EQ_16( st_fx->clas_dec, SIN_ONSET ) || st_fx->clas_dec == INACTIVE_CLAS || EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) ) { st_fx->relax_prev_lsf_interp = 1; move16(); @@ -286,12 +292,13 @@ void lsf_dec_fx( } } test(); - IF( EQ_16( st_fx->last_core, HQ_CORE ) && EQ_16( st_fx->core, ACELP_CORE ) ) + IF( EQ_16( st_fx->last_core, HQ_CORE ) && st_fx->core == ACELP_CORE ) { /* update old LSPs/LSFs in case of HQ->ACELP core switching */ Copy( lsp_mid, st_fx->lsp_old_fx, M ); lsp2lsf_fx( lsp_mid, st_fx->lsf_old_fx, M, st_fx->sr_core ); } + test(); IF( EQ_16( tdm_low_rate_mode, 1 ) && GT_16( coder_type, UNVOICED ) ) { // PMT("To be verified") @@ -314,13 +321,15 @@ void lsf_dec_fx( * Check LSF stability (distance between old LSFs and current LSFs) *------------------------------------------------------------------*/ - IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + IF( st_fx->element_mode == EVS_MONO ) { st_fx->stab_fac_fx = lsf_stab_fx( lsf_new, st_fx->lsf_old_fx, 0, st_fx->L_frame ); /*Q15*/ + move16(); } - else + ELSE { st_fx->stab_fac_fx = lsf_stab_ivas_fx( lsf_new, st_fx->lsf_old_fx, 0, st_fx->L_frame ); + move16(); } return; @@ -413,6 +422,7 @@ void lsf_end_dec_fx( test(); test(); #ifdef LSF_RE_USE_SECONDARY_CHANNEL + test(); IF( ( EQ_16( coder_type_org, GENERIC ) ) && ( EQ_32( st->sr_core, INT_FS_16k ) ) && ( mode2_flag == 0 ) && ( st->idchan == 0 ) ) #else IF( ( EQ_16( coder_type_org, GENERIC ) ) && ( EQ_32( st->sr_core, INT_FS_16k ) ) && ( mode2_flag == 0 ) ) @@ -461,6 +471,8 @@ void lsf_end_dec_fx( * Select safety_net or predictive mode *--------------------------------------------------------------------------*/ #if defined LSF_RE_USE_SECONDARY_CHANNEL || defined FIX_798_LSF_SECONDARY_CH_MISSING_CODE + test(); + test(); IF( st->tdm_LRTD_flag == 0 && EQ_16( st->idchan, 1 ) && tdm_lsfQ_PCh != NULL ) { /* if secondary channel predmode is set to be > 2 */ @@ -484,6 +496,8 @@ void lsf_end_dec_fx( } ELSE { + test(); + test(); IF( EQ_16( mode2_flag, 1 ) || EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) ) { /* read from param_lpc */ @@ -505,11 +519,12 @@ void lsf_end_dec_fx( * Read indices from array *--------------------------------------------------------------------------*/ #if defined LSF_RE_USE_SECONDARY_CHANNEL || defined FIX_798_LSF_SECONDARY_CH_MISSING_CODE + test(); /* Make sure there are the correct bit allocations */ IF( EQ_16( st->idchan, 1 ) && GT_16( predmode, 2 ) ) { /* use same AR prediction bit allocation for intra and inter modes*/ - lsf_allocate_fx( nBits - 1, mode_lvq, 9, &stages0, &stages1, levels0, levels1, bits0, bits1 ); + lsf_allocate_fx( sub( nBits, 1 ), mode_lvq, 9, &stages0, &stages1, levels0, levels1, bits0, bits1 ); stages0 = stages1; Copy( levels1, levels0, stages0 ); Copy( bits1, bits0, stages0 ); @@ -527,8 +542,8 @@ void lsf_end_dec_fx( { *nb_indices = 10; move16(); - move16(); TCQIdx[0] = safety_net; + move16(); FOR( i = 1; i < *nb_indices; i++ ) { TCQIdx[i] = *p_lpc_param++; @@ -571,7 +586,7 @@ void lsf_end_dec_fx( test(); IF( EQ_16( mode2_flag, 1 ) || EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) ) { - FOR( i = 0; i < stages - 1; i++ ) + FOR( i = 0; i < sub( stages, 1 ); i++ ) { num_bits = bits[i]; move16(); @@ -607,6 +622,7 @@ void lsf_end_dec_fx( num_bits = bits[i]; move16(); lindice[i + 1] = (Word16) get_next_indice( st, num_bits ); + move16(); } cumleft = levels[sub( stages, 1 )]; @@ -627,6 +643,7 @@ void lsf_end_dec_fx( } lindice[i + 1] = (Word16) get_next_indice( st, num_bits ); + move16(); i = add( i, 1 ); } } @@ -639,6 +656,7 @@ void lsf_end_dec_fx( move16(); } st->reset_mem_AR = 0; + move16(); } /*------------------------------------------------------------------------------------------* @@ -653,7 +671,7 @@ void lsf_end_dec_fx( IF( EQ_32( st->sr_core, INT_FS_16k ) && EQ_16( coder_type, VOICED ) && flag_1bit_gran == 0 ) { /* BC-TCVQ decoder */ - safety_net = qlsf_ARSN_tcvq_Dec_16k_fx( qlsf, TCQIdx, nBits - 1 ); + safety_net = qlsf_ARSN_tcvq_Dec_16k_fx( qlsf, TCQIdx, sub( nBits, 1 ) ); /* Update mem_MA */ Copy( qlsf, st->mem_MA_fx, M ); @@ -667,6 +685,7 @@ void lsf_end_dec_fx( FOR( i = 0; i < M; i++ ) { pred0[i] = add( ModeMeans_fx[mode_lvq][i], mult( Predictors_fx[mode_lvq_p][i], ( sub( st->mem_AR_fx[i], ModeMeans_fx[mode_lvq][i] ) ) ) ); /* Q(x2.56)*/ + move16(); } *LSF_Q_prediction = AUTO_REGRESSIVE; move16(); @@ -682,10 +701,11 @@ void lsf_end_dec_fx( FOR( i = 0; i < M; i++ ) { pred1[i] = add( pred0[i], mult_r( MU_MA_FX, st->mem_MA_fx[i] ) ); + move16(); } #if defined LSF_RE_USE_SECONDARY_CHANNEL || defined FIX_798_LSF_SECONDARY_CH_MISSING_CODE /* TD stereo SCh: perform intra-frame prediction with pulling-to-mean */ - if ( st->tdm_LRTD_flag == 0 && EQ_16( st->idchan, 1 ) && tdm_lsfQ_PCh != NULL ) + IF( st->tdm_LRTD_flag == 0 && EQ_16( st->idchan, 1 ) && tdm_lsfQ_PCh != NULL ) { tdm_SCh_LSF_intra_pred_fx( st->element_brate, tdm_lsfQ_PCh, pred3 ); } @@ -694,30 +714,34 @@ void lsf_end_dec_fx( { /* LVQ */ #if defined LSF_RE_USE_SECONDARY_CHANNEL || defined FIX_798_LSF_SECONDARY_CH_MISSING_CODE - if ( st->tdm_LRTD_flag == 0 && EQ_16( st->idchan, 1 ) && tdm_lsfQ_PCh != NULL ) + test(); + test(); + IF( st->tdm_LRTD_flag == 0 && EQ_16( st->idchan, 1 ) && tdm_lsfQ_PCh != NULL ) { /* intra mode*/ - st->BER_detect = st->BER_detect | - vq_dec_lvq_ivas_fx( 0, qlsf, &lindice[1], stages0, M, 9, levels0[stages0 - 1] ); + st->BER_detect = s_or( st->BER_detect, + vq_dec_lvq_ivas_fx( 0, qlsf, &lindice[1], stages0, M, 9, levels0[stages0 - 1] ) ); + move16(); Vr_add( qlsf, pred3, qlsf, M ); Vr_subt( qlsf, pred1, st->mem_MA_fx, M ); } - else + ELSE #endif { - if ( st->element_mode != EVS_MONO ) + IF( st->element_mode != EVS_MONO ) { ber_flag = vq_dec_lvq_ivas_fx( 1, qlsf, &lindice[1], stages0, M, mode_lvq, levels0[stages0 - 1] ); } - else + ELSE { ber_flag = vq_dec_lvq_fx( 1, qlsf, &lindice[1], stages0, M, mode_lvq, levels0[stages0 - 1], &st->offset_scale1_fx[0][0], &st->offset_scale2_fx[0][0], &st->offset_scale1_p_fx[0][0], &st->offset_scale2_p_fx[0][0], &st->no_scales_fx[0][0], &st->no_scales_p_fx[0][0] ); } st->BER_detect = s_or( st->BER_detect, ber_flag ); + move16(); Vr_add( qlsf, pred0, qlsf, M ); Vr_subt( qlsf, pred1, st->mem_MA_fx, M ); } @@ -733,17 +757,18 @@ void lsf_end_dec_fx( move16(); } #endif - if ( st->element_mode != EVS_MONO ) + IF( st->element_mode != EVS_MONO ) { ber_flag = vq_dec_lvq_ivas_fx( 0, qlsf, &lindice[1], stages1, M, mode_lvq_p, levels1[stages1 - 1] ); } - else + ELSE { ber_flag = vq_dec_lvq_fx( 0, qlsf, &lindice[1], stages1, M, mode_lvq_p, levels1[stages1 - 1], &st->offset_scale1_fx[0][0], &st->offset_scale2_fx[0][0], &st->offset_scale1_p_fx[0][0], &st->offset_scale2_p_fx[0][0], &st->no_scales_fx[0][0], &st->no_scales_p_fx[0][0] ); } st->BER_detect = s_or( st->BER_detect, ber_flag ); + move16(); #if defined LSF_RE_USE_SECONDARY_CHANNEL || defined FIX_798_LSF_SECONDARY_CH_MISSING_CODE test(); IF( EQ_16( predmode, 1 ) || EQ_16( predmode, 4 ) ) /* MA only */ @@ -762,6 +787,7 @@ void lsf_end_dec_fx( FOR( i = 0; i < M; i++ ) { pred2[i] = add( pred0[i], mult( Predictors_fx[mode_lvq_p][i], sub( st->mem_AR_fx[i], pred0[i] ) ) ); + move16(); } Vr_add( qlsf, pred2, qlsf, M ); Vr_subt( qlsf, pred1, st->mem_MA_fx, M ); @@ -910,9 +936,10 @@ void lsf_mid_dec_fx( /* Calculation of mid-LSF vector */ FOR( j = 0; j < M; j++ ) { - L_tmp = L_mult( sub( 0x2000, ratio[idx * M + j] ), qlsf0[j] ); /*Q(x2.56+13+1)->Q(x2.56+14)*/ - L_tmp = L_mac( L_tmp, ratio[idx * M + j], qlsf1[j] ); /*Q(x2.56+14)*/ - qlsf[j] = round_fx( L_shl( L_tmp, 2 ) ); /*Q(x2.56)*/ + L_tmp = L_mult( sub( 0x2000, ratio[add( i_mult( idx, M ), j )] ), qlsf0[j] ); /*Q(x2.56+13+1)->Q(x2.56+14)*/ + L_tmp = L_mac( L_tmp, ratio[add( i_mult( idx, M ), j )], qlsf1[j] ); /*Q(x2.56+14)*/ + qlsf[j] = round_fx( L_shl( L_tmp, 2 ) ); /*Q(x2.56)*/ + move16(); } /* check for incorrect LSF ordering */ diff --git a/lib_dec/lsf_msvq_ma_dec_fx.c b/lib_dec/lsf_msvq_ma_dec_fx.c index 13e41a8d2..a8fb91fe3 100644 --- a/lib_dec/lsf_msvq_ma_dec_fx.c +++ b/lib_dec/lsf_msvq_ma_dec_fx.c @@ -42,19 +42,16 @@ Word16 lsf_msvq_ma_decprm( Decoder_State *st, Word16 *param_lpc ) { find_pred_mode( &predmode, GENERIC, sub( 1, st->narrowBand ) /*st->bwidth*/, st->sr_core, &mode_lvq, &mode_lvq_p, st->total_brate ); - move16(); } ELSE { IF( EQ_16( st->core, TCX_20_CORE ) ) { find_pred_mode( &predmode, AUDIO, sub( 1, st->narrowBand ) /*st->bwidth*/, st->sr_core, &mode_lvq, &mode_lvq_p, st->total_brate ); - move16(); } ELSE { find_pred_mode( &predmode, st->coder_type, sub( 1, st->narrowBand ) /*st->bwidth*/, st->sr_core, &mode_lvq, &mode_lvq_p, st->total_brate ); - move16(); } } lsf_allocate_fx( sub( ENDLSF_NBITS, shr( predmode, 1 ) ), mode_lvq, mode_lvq_p, &stages0, &stages1, levels0, levels1, bits0, bits1 ); @@ -100,15 +97,18 @@ Word16 lsf_msvq_ma_decprm( Decoder_State *st, Word16 *param_lpc ) FOR( i = 0; i < tmp; i++ ) { *param_lpc = get_next_indice_fx( st, bits[i] ); + move16(); param_lpc++; nbits_lpc = add( nbits_lpc, bits[i] ); } *param_lpc = get_next_indice_fx( st, LEN_INDICE ); + move16(); param_lpc++; nbits_lpc = add( nbits_lpc, LEN_INDICE ); - *param_lpc = get_next_indice_fx( st, bits[i] - LEN_INDICE ); + *param_lpc = get_next_indice_fx( st, sub( bits[i], LEN_INDICE ) ); + move16(); param_lpc++; nbits_lpc = add( nbits_lpc, sub( bits[i], LEN_INDICE ) ); @@ -119,6 +119,7 @@ Word16 lsf_msvq_ma_decprm( Decoder_State *st, Word16 *param_lpc ) { *param_lpc = get_next_indice_fx( st, bits_midlpc ); + move16(); nbits_lpc = add( nbits_lpc, bits_midlpc ); } @@ -135,14 +136,17 @@ Word16 lsf_bctcvq_decprm( const Word16 *bits1; num_par = 10; + move16(); bits1 = BC_TCVQ_BIT_ALLOC_40B; nbits_lpc = 0; + move16(); FOR( i = 0; i < num_par; i++ ) { *param_lpc = get_next_indice_fx( st, bits1[i] ); + move16(); param_lpc++; nbits_lpc = add( nbits_lpc, bits1[i] ); } diff --git a/lib_dec/nelp_dec_fx.c b/lib_dec/nelp_dec_fx.c index dfafc8d09..418e74bcb 100644 --- a/lib_dec/nelp_dec_fx.c +++ b/lib_dec/nelp_dec_fx.c @@ -32,6 +32,7 @@ static void normalize_arr( Word16 *arr, Word16 *qf, Word16 size, Word16 hdr ) { Word16 i; Word16 max_s = 0; + move16(); FOR( i = 0; i < size; i++ ) { @@ -46,7 +47,8 @@ static void normalize_arr( Word16 *arr, Word16 *qf, Word16 size, Word16 hdr ) move16(); } - *qf = *qf - hdr; + *qf = sub( *qf, hdr ); + move16(); FOR( i = 0; i < size; i++ ) { @@ -88,10 +90,12 @@ static void normalize_arr( Word16 *arr, Word16 *qf, Word16 size, Word16 hdr ) void nelp_decoder_fx( Decoder_State *st_fx, Word16 *exc_nelp, Word16 *exc, Word16 *Q_exc, Word16 bfi, const Word16 coder_type, Word16 *gain_buf ) { Word16 i, fid = 0; + move16(); Word16 ptr[L_FRAME], filtRes[L_FRAME], gain_fac; /*ptr, filtRes - Q0, gain_fac - Q14 */ Word16 Gains[10]; /* Q0 */ Word32 Gain, E3, E2; Word16 BP1_ORDER = 4; + move16(); Word16 ptr_tmp[L_FRAME]; /* Q0 */ Word16 iG1, iG2[2]; Word16 exp_E2, exp_E3, frac_E2, frac_E3; @@ -101,20 +105,25 @@ void nelp_decoder_fx( Decoder_State *st_fx, Word16 *exc_nelp, Word16 *exc, Word1 Word32 max_exc_sqr; Word16 n; Word16 max_val = 0, norm_val = 0; + move16(); + move16(); Word16 qGain = 0; + move16(); SC_VBR_DEC_HANDLE hSC_VBR; hSC_VBR = st_fx->hSC_VBR; + test(); if ( EQ_16( st_fx->last_nelp_mode_dec, 1 ) && NE_16( st_fx->bwidth, st_fx->last_bwidth ) ) { st_fx->last_nelp_mode_dec = 0; + move16(); } test(); test(); test(); - IF( EQ_16( coder_type, UNVOICED ) && EQ_16( st_fx->bwidth, NB ) ) + IF( EQ_16( coder_type, UNVOICED ) && st_fx->bwidth == NB ) { IF( NE_16( st_fx->last_nelp_mode_dec, 1 ) ) { @@ -130,7 +139,7 @@ void nelp_decoder_fx( Decoder_State *st_fx, Word16 *exc_nelp, Word16 *exc, Word1 move16(); IF( NE_16( st_fx->last_nelp_mode_dec, 1 ) ) { - set16_fx( hSC_VBR->bp1_filt_mem_wb_dec_fx, 0, BP1_ORDER * 2 ); + set16_fx( hSC_VBR->bp1_filt_mem_wb_dec_fx, 0, shl( BP1_ORDER, 1 ) ); } } @@ -147,8 +156,11 @@ void nelp_decoder_fx( Decoder_State *st_fx, Word16 *exc_nelp, Word16 *exc, Word1 IF( EQ_16( st_fx->rf_frame_type, RF_NELP ) && EQ_16( st_fx->use_partial_copy, 1 ) ) { iG1 = st_fx->rf_indx_nelp_iG1; + move16(); iG2[0] = st_fx->rf_indx_nelp_iG2[0]; + move16(); iG2[1] = st_fx->rf_indx_nelp_iG2[1]; + move16(); } ELSE { @@ -169,6 +181,7 @@ void nelp_decoder_fx( Decoder_State *st_fx, Word16 *exc_nelp, Word16 *exc, Word1 IF( EQ_16( st_fx->rf_frame_type, RF_NELP ) && EQ_16( st_fx->use_partial_copy, 1 ) ) { fid = st_fx->rf_indx_nelp_fid; + move16(); } ELSE { @@ -220,8 +233,8 @@ void nelp_decoder_fx( Decoder_State *st_fx, Word16 *exc_nelp, Word16 *exc, Word1 frac = round_fx( L_shl( Gain, n ) ); n = sub( add( n, 24 ), 30 ); frac = div_s( 16384, frac ); - Gain = Isqrt_lc( L_deposit_h( frac ), &n ); /*Q(31-n-exp) */ - tmp = round_fx( L_shl( Gain, sub( n + exp, 15 ) ) ); /*Q0 */ + Gain = Isqrt_lc( L_deposit_h( frac ), &n ); /*Q(31-n-exp) */ + tmp = round_fx( L_shl( Gain, sub( add( n, exp ), 15 ) ) ); /*Q0 */ } ELSE { @@ -245,6 +258,7 @@ void nelp_decoder_fx( Decoder_State *st_fx, Word16 *exc_nelp, Word16 *exc, Word1 move16(); /* 1.16f - Q14 */ } + test(); IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) ) { /* Normalize Gains[10] with headroom 4, qGain is the new Q value os Gains, not Q0*/ @@ -261,17 +275,17 @@ void nelp_decoder_fx( Decoder_State *st_fx, Word16 *exc_nelp, Word16 *exc, Word1 { BP1_ORDER = 4; move16(); - Scale_sig( hSC_VBR->bp1_filt_mem_wb_dec_fx, 2 * BP1_ORDER, qGain ); /* bring filter prev memory from Q0 to qGain */ + Scale_sig( hSC_VBR->bp1_filt_mem_wb_dec_fx, shl( BP1_ORDER, 1 ), qGain ); /* bring filter prev memory from Q0 to qGain */ pz_filter_sp_fx( bp1_num_coef_wb_fx, bp1_den_coef_wb_fx, ptr, ptr_tmp, hSC_VBR->bp1_filt_mem_wb_dec_fx, BP1_ORDER, BP1_ORDER, L_FRAME, ( sub( 16, BP1_COEF_WB_QF ) ) ); - Scale_sig( hSC_VBR->bp1_filt_mem_wb_dec_fx, 2 * BP1_ORDER, -qGain ); /* bring filter prev memory from qGain to Q0 */ - Scale_sig( ptr_tmp, L_FRAME, -qGain ); /* bring nelp_exc to Q0 */ + Scale_sig( hSC_VBR->bp1_filt_mem_wb_dec_fx, shl( BP1_ORDER, 1 ), negate( qGain ) ); /* bring filter prev memory from qGain to Q0 */ + Scale_sig( ptr_tmp, L_FRAME, -qGain ); /* bring nelp_exc to Q0 */ Copy( ptr_tmp, ptr, L_FRAME ); } test(); - IF( EQ_16( coder_type, UNVOICED ) && ( EQ_16( st_fx->bwidth, NB ) ) ) + IF( EQ_16( coder_type, UNVOICED ) && ( st_fx->bwidth == NB ) ) { BP1_ORDER = 7; move16(); @@ -296,6 +310,7 @@ void nelp_decoder_fx( Decoder_State *st_fx, Word16 *exc_nelp, Word16 *exc, Word1 Scale_sig32( hSC_VBR->bp1_filt_mem_nb_dec_fx, shl( BP1_ORDER, 1 ), norm_val ); Scale_sig( ptr, L_FRAME, norm_val ); *Q_exc = add( norm_val, *Q_exc ); + move16(); } BP1_ORDER = 7; @@ -306,7 +321,7 @@ void nelp_decoder_fx( Decoder_State *st_fx, Word16 *exc_nelp, Word16 *exc, Word1 IF( norm_val > 0 ) { - Scale_sig32( hSC_VBR->bp1_filt_mem_nb_dec_fx, shl( BP1_ORDER, 1 ), -norm_val ); + Scale_sig32( hSC_VBR->bp1_filt_mem_nb_dec_fx, shl( BP1_ORDER, 1 ), negate( norm_val ) ); } Copy( ptr_tmp, ptr, L_FRAME ); /*Q_exc */ @@ -387,7 +402,7 @@ void nelp_decoder_fx( Decoder_State *st_fx, Word16 *exc_nelp, Word16 *exc, Word1 #else frac_E2 = round_fx( L_shl( E2, exp_E2 ) ); #endif - exp_E2 = sub( 30, add( exp_E2, 2 * ( *Q_exc ) ) ); + exp_E2 = sub( 30, add( exp_E2, shl( ( *Q_exc ), 1 ) ) ); scale = shr( sub( frac_E3, frac_E2 ), 15 ); frac_E2 = shl( frac_E2, scale ); @@ -402,6 +417,7 @@ void nelp_decoder_fx( Decoder_State *st_fx, Word16 *exc_nelp, Word16 *exc, Word1 { L_tmp = Mult_32_16( L_tmp1, ptr[i] ); /*Q(16-exp+Q_exc) */ ptr[i] = round_fx( L_shl( L_tmp, exp ) ); /*Q_exc */ + move16(); } } diff --git a/lib_dec/peak_vq_dec_fx.c b/lib_dec/peak_vq_dec_fx.c index cb93bdd7c..356592067 100644 --- a/lib_dec/peak_vq_dec_fx.c +++ b/lib_dec/peak_vq_dec_fx.c @@ -43,6 +43,7 @@ void hvq_dec_fx( Word16 noise_level_idx; bits = num_bits; + move16(); FOR( i = 0; i < HVQ_BWE_NOISE_BANDS; i++ ) { @@ -114,7 +115,7 @@ static void peak_vq_dec_fx( assert( ( core_brate > HQ_16k40 && core_brate <= HQ_48k ) && "HVQ rate not supported" ); // PMT("max_peaks equation needs to be converted") - max_peaks = (Word16) ( ( core_brate * HVQ_PEAKS_PER_DELTA + HVQ_PEAKS_PER_DELTA_OFFS ) / HVQ_PEAKS_BPS_DELTA ); + max_peaks = extract_l( Mpy_32_32( ( L_add( imult3216( core_brate, HVQ_PEAKS_PER_DELTA ), HVQ_PEAKS_PER_DELTA_OFFS ) ), 282564 ) ); /* 1 / HVQ_PEAKS_BPS_DELTA in Q31 = 282564*/ /*max_peaks = ((core_brate * HVQ_PEAKS_PER_DELTA / HVQ_PEAKS_BPS_DELTA + HVQ_PEAKS_PER_DELTA_OFFS / HVQ_PEAKS_BPS_DELTA) );*/ #if 0 { @@ -126,10 +127,13 @@ static void peak_vq_dec_fx( } #endif bin_th = HVQ_THRES_BIN_24k; + move16(); bin_th2 = HVQ_THRES_BIN_24k / HVQ_NF_GROUPS; + move16(); IF( GE_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) ) { bin_th = HVQ_THRES_BIN_32k; + move16(); bin_th2 = HVQ_THRES_BIN_32k / HVQ_NF_GROUPS; move16(); } @@ -169,10 +173,12 @@ static void peak_vq_dec_fx( test(); FOR( i = 0; i < bin_th && j < vq_peaks; i++ ) /* safety check in case of bit errors */ { + test(); IF( res_vec[i] != 0 ) { - vq_peak_idx[j++] = i; + vq_peak_idx[j] = i; move16(); + j = add( j, 1 ); } } @@ -183,6 +189,7 @@ static void peak_vq_dec_fx( move16(); vq_peaks = sub( j, 1 ); *Npeaks = sub( j, 1 ); + move16(); } /* Huffman or differential coding */ @@ -190,6 +197,7 @@ static void peak_vq_dec_fx( /* De-quantize peak gains */ pgain_difidx[0] = get_next_indice( st_fx, GAIN0_BITS ); + move16(); /* safety check in case of bit errors */ IF( GT_16( pgain_difidx[0], 44 ) ) @@ -211,7 +219,7 @@ static void peak_vq_dec_fx( move16(); IF( FlagN ) { - huff_dec_fx( st_fx, vq_peaks - 1, MAX_PG_HUFFLEN, NUM_PG_HUFFLEN, hvq_pg_huff_thres, hvq_pg_huff_offset, hvq_pg_huff_tab, &pgain_difidx[1] ); + huff_dec_fx( st_fx, sub( vq_peaks, 1 ), MAX_PG_HUFFLEN, NUM_PG_HUFFLEN, hvq_pg_huff_thres, hvq_pg_huff_offset, hvq_pg_huff_tab, &pgain_difidx[1] ); FOR( i = 1; i < vq_peaks; i++ ) { @@ -298,7 +306,7 @@ static void peak_vq_dec_fx( /* safety check in case of bit errors */ test(); - if ( pvq_bands == 0 && EQ_16( st_fx->element_mode, EVS_MONO ) ) /* PVQ bands may be zero for IVAS */ + if ( pvq_bands == 0 && st_fx->element_mode == EVS_MONO ) /* PVQ bands may be zero for IVAS */ { st_fx->BER_detect = 1; move16(); @@ -328,11 +336,10 @@ static void peak_vq_dec_fx( pPvqVector = pvq_vector; pCoefsOut = coefs_out; pSelBnds = sel_bnds; - move16(); FOR( k = 0; k < pvq_bands; k++ ) { - pvq_norm[k] = get_next_indice( st_fx, HVQ_PVQ_GAIN_BITS ); - pvq_norm[k] = add( pvq_norm[k], 8 ); + pvq_norm[k] = add( get_next_indice( st_fx, HVQ_PVQ_GAIN_BITS ), 8 ); + // pvq_norm[k] = add( pvq_norm[k], 8 ); move16(); diff = add( diff, HVQ_PVQ_GAIN_BITS ); @@ -343,13 +350,12 @@ static void peak_vq_dec_fx( { i = band_start_harm[*pSelBnds++]; move16(); - move16(); pCoefsOut = coefs_out + i; } normq = L_add( dicn_fx[pvq_norm[k]], 0 ); WHILE( LT_16( j, hvq_band_width[k] ) ) { - IF( EQ_32( *pCoefsOut, 0 ) ) + IF( *pCoefsOut == 0 ) { Mpy_32_16_ss( normq, *pPvqVector++, &acc, &dontCare ); /* acc(Q11), normq(Q14), pvq_vector(Q12) */ *pCoefsOut = L_shl( acc, 12 - 11 ); /* Q12 */ @@ -439,6 +445,7 @@ static void dequant_peaks_fx( } ELSE { + test(); IF( vect_out[1] == 0 || ( LE_32( absPeakGain1, absPeakGain ) ) ) { Mpy_32_16_ss( *peak_gain, xq[1], &vect_out[1], &dontCare ); @@ -446,6 +453,7 @@ static void dequant_peaks_fx( } } vect_out[2] = *peak_gain; /* vect_out in Q12 */ + move16(); Mpy_32_16_ss( *peak_gain, xq[2], &vect_out[3], &dontCare ); Mpy_32_16_ss( *peak_gain, xq[3], &vect_out[4], &dontCare ); @@ -491,6 +499,7 @@ static Word16 hvq_dec_pos_fx( } peak_idx[0] = sub( delta[0], HVQ_CP_HUFF_OFFSET ); + move16(); /* safety check in case of bit errors */ IF( peak_idx[0] < 2 ) { diff --git a/lib_dec/pit_dec_fx.c b/lib_dec/pit_dec_fx.c index e4e6f4806..faa3cb2d3 100644 --- a/lib_dec/pit_dec_fx.c +++ b/lib_dec/pit_dec_fx.c @@ -80,6 +80,7 @@ Word32 Mode2_pit_decode( /* o: floating pitch value ELSE IF( EQ_16( coder_type, 3 ) ) /* 9/6/6/6 (HRs- VC) */ { Word16 pit_res_max2 = pit_res_max; + move16(); if ( EQ_16( pit_min, PIT_MIN_16k ) ) { pit_res_max2 = shr( pit_res_max, 1 ); @@ -100,6 +101,7 @@ Word32 Mode2_pit_decode( /* o: floating pitch value ELSE IF( EQ_16( coder_type, 4 ) ) /* 9/6/9/6 (AMRWB) */ { Word16 pit_res_max2 = pit_res_max; + move16(); if ( EQ_16( pit_min, PIT_MIN_16k ) ) { pit_res_max2 = shr( pit_res_max, 1 ); @@ -127,6 +129,7 @@ Word32 Mode2_pit_decode( /* o: floating pitch value { limit_T0_voiced( 5, shr( pit_res_max, 1 ), *T0, *T0_frac, *T0_res, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); *T0_res = shr( pit_res_max, 1 ); + move16(); Mode2_delta_pit_dec( T0, T0_frac, *T0_res, T0_min, T0_min_frac, pt_indice ); } } @@ -140,6 +143,7 @@ Word32 Mode2_pit_decode( /* o: floating pitch value { limit_T0_voiced( 4, shr( pit_res_max, 1 ), *T0, *T0_frac, *T0_res, T0_min, T0_min_frac, T0_max, T0_max_frac, pit_min, pit_max ); *T0_res = shr( pit_res_max, 1 ); + move16(); Mode2_delta_pit_dec( T0, T0_frac, *T0_res, T0_min, T0_min_frac, pt_indice ); } } @@ -183,6 +187,7 @@ void Mode2_abs_pit_dec( index = **pt_indice; move16(); ( *pt_indice )++; + move16(); pit_res_max_half = shr( pit_res_max, 1 ); tmp1 = i_mult( sub( pit_fr2, pit_min ), pit_res_max ); @@ -199,9 +204,11 @@ void Mode2_abs_pit_dec( } *T0 = mult( index, inv_T0_res[res] ); + move16(); if ( EQ_16( pit_res_max, 6 ) ) { *T0 = shr( *T0, 1 ); + move16(); } *T0 = add( pit_min, *T0 ); @@ -266,18 +273,22 @@ void Mode2_delta_pit_dec( index = **pt_indice; move16(); ( *pt_indice )++; + move16(); *T0 = mult( add( index, *T0_min_frac ), inv_T0_res[res] ); + move16(); if ( EQ_16( T0_res, 6 ) ) { *T0 = shr( *T0, 1 ); + move16(); } *T0 = add( *T0_min, *T0 ); move16(); *T0_frac = add( index, sub( *T0_min_frac, i_mult( sub( *T0, *T0_min ), T0_res ) ) ); + move16(); return; } @@ -335,6 +346,7 @@ Word16 pit_decode_fx( /* o : floating pitch value Word16 pitch_index, nBits, pit_flag; pitch_index = 0; + move16(); /*----------------------------------------------------------------* * Set pit_flag = 0 for every subframe with absolute pitch search @@ -395,8 +407,7 @@ Word16 pit_decode_fx( /* o : floating pitch value /* find the number of bits */ nBits = st_fx->acelp_cfg.pitch_bits[shr( i_subfr, 6 )]; move16(); - pitch_index = (Word16) get_next_indice( st_fx, nBits ); - move16(); + pitch_index = (Word16) get_next_indice_fx( st_fx, nBits ); } /*-------------------------------------------------------* @@ -422,15 +433,13 @@ Word16 pit_decode_fx( /* o : floating pitch value move16(); } - pitch_index = (Word16) get_next_indice( st_fx, nBits ); - move16(); + pitch_index = (Word16) get_next_indice_fx( st_fx, nBits ); test(); test(); IF( EQ_16( L_subfr, L_FRAME / 2 ) && i_subfr != 0 && GE_16( pitch_index, 32 ) ) /* safety check in case of bit errors */ { pitch_index = shr( pitch_index, 1 ); - move16(); st_fx->BER_detect = 1; move16(); } @@ -551,7 +560,7 @@ Word16 pit_decode_fx( /* o : floating pitch value } } - pitch_index = (Word16) get_next_indice( st_fx, nBits ); + pitch_index = (Word16) get_next_indice_fx( st_fx, nBits ); pit_Q_dec_fx( 1, pitch_index, nBits, 8, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); } @@ -617,6 +626,7 @@ Word16 pit_decode_ivas_fx( /* o : floating pitch value Word16 pitch_index, nBits, pit_flag; pitch_index = 0; + move16(); /*----------------------------------------------------------------* * Set pit_flag = 0 for every subframe with absolute pitch search @@ -675,16 +685,24 @@ Word16 pit_decode_ivas_fx( /* o : floating pitch value IF( NE_16( coder_type, AUDIO ) ) { /* find the number of bits */ - nBits = st_fx->acelp_cfg.pitch_bits[i_subfr / L_subfr]; - move16(); - pitch_index = (Word16) get_next_indice( st_fx, nBits ); + IF( i_subfr ) + { + nBits = st_fx->acelp_cfg.pitch_bits[idiv1616( i_subfr, L_subfr )]; + } + ELSE + { + nBits = st_fx->acelp_cfg.pitch_bits[0]; + } move16(); + pitch_index = (Word16) get_next_indice_fx( st_fx, nBits ); } /*-------------------------------------------------------* * Pitch decoding in AUDIO mode * (both ACELP@12k8 and ACELP@16k cores) *-------------------------------------------------------*/ + test(); + test(); IF( EQ_16( coder_type, AUDIO ) ) { test(); @@ -704,15 +722,13 @@ Word16 pit_decode_ivas_fx( /* o : floating pitch value move16(); } - pitch_index = (Word16) get_next_indice( st_fx, nBits ); - move16(); + pitch_index = (Word16) get_next_indice_fx( st_fx, nBits ); test(); test(); IF( EQ_16( L_subfr, L_FRAME / 2 ) && i_subfr != 0 && GE_16( pitch_index, 32 ) ) /* safety check in case of bit errors */ { pitch_index = shr( pitch_index, 1 ); - move16(); st_fx->BER_detect = 1; move16(); } @@ -736,8 +752,6 @@ Word16 pit_decode_ivas_fx( /* o : floating pitch value #if 1 // def ADD_LRTD ELSE IF( EQ_16( st_fx->idchan, 1 ) && ( EQ_16( tdm_Pitch_reuse_flag, 1 ) || EQ_16( nBits, 4 ) ) ) { - test(); - test(); /*-------------------------------------------------------* * Pitch decoding with reusing of primary channel information *-------------------------------------------------------*/ @@ -832,7 +846,7 @@ Word16 pit_decode_ivas_fx( /* o : floating pitch value } } - pitch_index = (Word16) get_next_indice( st_fx, nBits ); + pitch_index = (Word16) get_next_indice_fx( st_fx, nBits ); pit_Q_dec_fx( 1, pitch_index, nBits, 8, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); } @@ -872,17 +886,23 @@ void pit_Q_dec_fx( IF( limit_flag == 0 ) { *T0 = add( PIT_MIN, shr( pitch_index, 2 ) ); + move16(); *T0_frac = sub( pitch_index, shl( sub( *T0, PIT_MIN ), 2 ) ); + move16(); } ELSE IF( EQ_16( limit_flag, 1 ) ) { *T0 = add( PIT_MIN_EXTEND, shr( pitch_index, 2 ) ); + move16(); *T0_frac = sub( pitch_index, shl( sub( *T0, PIT_MIN_EXTEND ), 2 ) ); + move16(); } ELSE /* limit_flag == 2 */ { *T0 = add( PIT_MIN_DOUBLEEXTEND, shr( pitch_index, 2 ) ); + move16(); *T0_frac = sub( pitch_index, shl( sub( *T0, PIT_MIN_DOUBLEEXTEND ), 2 ) ); + move16(); } } ELSE IF( EQ_16( nBits, 9 ) ) /* absolute decoding with 9 bits */ @@ -935,7 +955,7 @@ void pit_Q_dec_fx( /* biterror detection mechanism */ test(); test(); - IF( GT_16( add( ( *T0 << 2 ), *T0_frac ), add( ( PIT_MAX << 2 ), 2 ) ) && pit_flag == 0 && !Opt_AMR_WB ) + IF( GT_16( add( shl( *T0, 2 ), *T0_frac ), ( PIT_MAX << 2 ) + 2 ) && pit_flag == 0 && !Opt_AMR_WB ) { *T0 = L_SUBFR; move16(); @@ -988,9 +1008,11 @@ void pit16k_Q_dec_fx( { index = sub( pitch_index, shl( ( PIT16k_FR2_EXTEND_10b - PIT16k_MIN_EXTEND ), 2 ) ); *T0 = add( PIT16k_FR2_EXTEND_10b, shr( index, 1 ) ); + move16(); *T0_frac = sub( index, shl( sub( *T0, PIT16k_FR2_EXTEND_10b ), 1 ) ); /*(*T0_frac) *= 2;*/ ( *T0_frac ) = shl( *T0_frac, 1 ); + move16(); } } } @@ -1011,7 +1033,8 @@ void pit16k_Q_dec_fx( move16(); *T0_frac = sub( index, shl( sub( *T0, PIT16k_FR2_EXTEND_9b ), 1 ) ); move16(); - ( *T0_frac ) *= shl( ( *T0_frac ), 1 ); + ( *T0_frac ) = imult1616( ( *T0_frac ), shl( ( *T0_frac ), 1 ) ); + move16(); } ELSE { @@ -1029,7 +1052,7 @@ void pit16k_Q_dec_fx( /* biterror detection mechanism */ test(); - IF( GT_16( add( ( *T0 << 2 ), *T0_frac ), ( PIT16k_MAX << 2 ) ) && GE_16( nBits, 9 ) ) + IF( GT_16( add( shl( *T0, 2 ), *T0_frac ), ( PIT16k_MAX << 2 ) ) && GE_16( nBits, 9 ) ) { *T0 = L_SUBFR; move16(); @@ -1122,6 +1145,7 @@ void abs_pit_dec_fx( *T0 = add( PIT_MIN_EXTEND, shr( pitch_index, 1 ) ); move16(); *T0_frac = sub( pitch_index, shl( sub( *T0, PIT_MIN_EXTEND ), 1 ) ); + move16(); *T0_frac = shl( *T0_frac, 1 ); move16(); } @@ -1149,7 +1173,9 @@ void abs_pit_dec_fx( /*pitch_index -= (PIT_FR2_EXTEND_9b-PIT_MIN_EXTEND)*4;*/ pitch_index = sub( pitch_index, PIT_FR2_EXT9b_MINUS_PIT_MIN_EXT_X4 ); *T0 = add( PIT_FR2_EXTEND_9b, shr( pitch_index, 1 ) ); + move16(); *T0_frac = sub( pitch_index, shl( sub( *T0, PIT_FR2_EXTEND_9b ), 1 ) ); + move16(); ( *T0_frac ) = shl( *T0_frac, 1 ); move16(); } diff --git a/lib_dec/pitch_extr_fx.c b/lib_dec/pitch_extr_fx.c index 78d0fc1f0..2e327938e 100644 --- a/lib_dec/pitch_extr_fx.c +++ b/lib_dec/pitch_extr_fx.c @@ -61,6 +61,11 @@ void pitch_pred_linear_fit( Word16 pg[8]; /* local buffer for pitch gain*/ Word32 ml[8]; /* local buffer for mem_lag*/ Word16 const timeWeight[5] = { 20480 /*1.25f Q14*/, 18432 /*1.125f Q14*/, 16384 /*1.f Q14*/, 14336 /*0.875f Q14*/, 12288 /*.75f Q14*/ }; /*Q14*/ + move16(); + move16(); + move16(); + move16(); + move16(); /*timeweight*/ Word16 no_subfr_pred; Word16 a1, a2, a3, a4, a5, tmpa, tmpb, b1, b2, b3, b4, b5; Word16 a_e, b_e, sum0_q; @@ -84,16 +89,13 @@ void pitch_pred_linear_fit( move32(); } } - move16(); - move16(); - move16(); - move16(); - move16(); /*timeweight*/ IF( LT_16( pit_max, extract_h( *old_fpitch ) ) ) { *extrapolationFailed = 1; + move16(); *T0_out = pit_max; + move16(); return; } @@ -114,8 +116,8 @@ void pitch_pred_linear_fit( } /* copy to local buffers, depending on availability of info about future subframes */ - Copy( mem_pitch_gain + no_subfr_pred - 2, pg, 8 ); - Copy32( mem_lag + no_subfr_pred - 2, ml, 8 ); + Copy( mem_pitch_gain + sub( no_subfr_pred, 2 ), pg, 8 ); + Copy32( mem_lag + sub( no_subfr_pred, 2 ), ml, 8 ); mdy = L_deposit_l( 0 ); @@ -164,6 +166,7 @@ void pitch_pred_linear_fit( Word16 e1, e2, e3, e4, e5, e6, e7; t1 = L_mult0( pg[4], pg[3] ); /*Q24*/ /* t1 = pg[4]*pg[3] */ e1 = 7; + move16(); t2 = L_add( L_deposit_l( pg[3] ), L_shl( L_deposit_l( pg[4] ), 2 ) ); /*Q12*/ e2 = norm_l( t2 ); t2 = L_shl( t2, e2 ); /*Q12,-e2*/ @@ -339,6 +342,7 @@ void get_subframe_pitch( pitchDelta = L_deposit_l( BASOP_Util_Divide3216_Scale( L_sub( pitchEnd, pitchStart ), nSubframes, &s ) ); /*Q15*/ pitchDelta = L_shl( pitchDelta, add( s, 1 ) ); /*Q16*/ pitchBuf[0] = L_add( pitchStart, pitchDelta ); + move32(); FOR( i = 1; i < nSubframes; i++ ) { pitchBuf[i] = L_add( pitchBuf[i - 1], pitchDelta ); diff --git a/lib_dec/post_dec_fx.c b/lib_dec/post_dec_fx.c index 1071b2389..e6e4fffa4 100644 --- a/lib_dec/post_dec_fx.c +++ b/lib_dec/post_dec_fx.c @@ -61,7 +61,7 @@ void post_decoder( move16(); bitrate = L_add( st->total_brate, 0 ); - if ( st->core_brate <= SID_2k40 ) + if ( LE_32( st->core_brate, SID_2k40 ) ) { bitrate = L_add( st->last_active_brate, 0 ); } @@ -89,7 +89,7 @@ void post_decoder( ELSE { /*Formant enhancement*/ - IF( EQ_16( st->last_bwidth, NB ) ) + IF( st->last_bwidth == NB ) { Copy( synth, synth2_pe, L_frame ); tmp = synth[-1]; @@ -114,11 +114,12 @@ void post_decoder( st->hPFstat->reset = 1; move16(); } - IF( EQ_16( st->bwidth, NB ) ) + IF( st->bwidth == NB ) { st->hPFstat->on = 1; move16(); tmp_noise = 0; + move16(); nb_post_filt_fx( L_frame, st->hPFstat, &tmp_noise, 0, synth2_pe, st->mem_Aq, pitch, GENERIC, st->BER_detect, tmp ); } ELSE @@ -126,6 +127,7 @@ void post_decoder( st->hPFstat->on = 0; move16(); tmp_noise = 0; + move16(); nb_post_filt_fx( L_frame, st->hPFstat, &tmp_noise, 0, synth2_pe, st->mem_Aq, pitch, AUDIO, st->BER_detect, tmp ); } Copy( synth2_pe, synth2, L_frame ); @@ -217,7 +219,7 @@ void post_decoder_ivas_fx( } bitrate = L_add( st->total_brate, 0 ); - IF( LE_32( st->core_brate, SID_2k40 ) ) + if ( LE_32( st->core_brate, SID_2k40 ) ) { bitrate = L_add( st->last_active_brate, 0 ); } @@ -240,17 +242,17 @@ void post_decoder_ivas_fx( IF( pfstat_on_previous ) { Copy( st->hPFstat->mem_pf_in + L_SYN_MEM - M, synth - M, M ); - Word16 L_subfr = st->L_frame / st->nb_subfr; + Word16 L_subfr = idiv1616( st->L_frame, st->nb_subfr ); Residu3_fx( st->old_Aq_12_8_fx, synth, synth_buf, L_subfr, 1 ); E_UTIL_synthesis( 1, st->old_Aq_12_8_fx, synth_buf, synth2, L_subfr, st->hPFstat->mem_stp + L_SYN_MEM - M, 0, M ); scale_st_fx( synth, synth2, &st->hPFstat->gain_prec, L_subfr ); - blend_subfr2_fx( synth2 + L_subfr / 2, synth + L_subfr / 2, synth2 + L_subfr / 2 ); + blend_subfr2_fx( synth2 + shr( L_subfr, 1 ), synth + shr( L_subfr, 1 ), synth2 + shr( L_subfr, 1 ) ); } } ELSE { /*Formant enhancement*/ - IF( EQ_16( st->last_bwidth, NB ) ) + IF( st->last_bwidth == NB ) { Copy( synth, synth2_pe, L_frame ); tmp = synth[-1]; @@ -270,16 +272,17 @@ void post_decoder_ivas_fx( move16(); } - IF( EQ_16( pfstat_on_previous, 0 ) ) + if ( pfstat_on_previous == 0 ) { st->hPFstat->reset = 1; move16(); } - IF( EQ_16( st->bwidth, NB ) ) + IF( st->bwidth == NB ) { st->hPFstat->on = 1; move16(); tmp_noise = 0; + move16(); nb_post_filt_fx( L_frame, st->hPFstat, &tmp_noise, 0, synth2_pe, st->mem_Aq, pitch, GENERIC, st->BER_detect, tmp ); } ELSE @@ -287,6 +290,7 @@ void post_decoder_ivas_fx( st->hPFstat->on = 0; move16(); tmp_noise = 0; + move16(); nb_post_filt_fx( L_frame, st->hPFstat, &tmp_noise, 0, synth2_pe, st->mem_Aq, pitch, AUDIO, st->BER_detect, tmp ); } Copy( synth2_pe, synth2, L_frame ); @@ -297,7 +301,7 @@ void post_decoder_ivas_fx( } ELSE { - IF( EQ_16( pfstat_on_previous, 0 ) ) + if ( pfstat_on_previous == 0 ) { st->hPFstat->reset = 1; move16(); @@ -383,7 +387,7 @@ static void bass_pf_1sf_delay( lg = 0; move16(); } - if ( lg > l_subfr ) + if ( GT_16( lg, l_subfr ) ) { lg = l_subfr; move16(); @@ -412,12 +416,12 @@ static void bass_pf_1sf_delay( Word64 nrg64 = W_deposit32_l( nrg ); FOR( i = 0; i < lg; i++ ) { - tmp32 = L_mult( syn[i + i_subfr - T], 0x4000 ); - tmp32 = L_mac( tmp32, syn[i + i_subfr + T], 0x4000 ); + tmp32 = L_mult( syn[sub( add( i, i_subfr ), T )], 0x4000 ); + tmp32 = L_mac( tmp32, syn[add( add( i, i_subfr ), T )], 0x4000 ); tmp16 = round_fx( L_shl( tmp32, s1 ) ); /* Q0+s1 */ - tmp64 = W_mac0_16_16( tmp64, shl( syn[i + i_subfr], s1 ), tmp16 ); /* Q0+2*s1 */ - nrg64 = W_mac0_16_16( nrg64, tmp16, tmp16 ); /* Q0+2*s1 */ + tmp64 = W_mac0_16_16( tmp64, shl( syn[add( i, i_subfr )], s1 ), tmp16 ); /* Q0+2*s1 */ + nrg64 = W_mac0_16_16( nrg64, tmp16, tmp16 ); /* Q0+2*s1 */ } tmp = W_sat_l( tmp64 ); nrg = W_sat_l( nrg64 ); @@ -432,9 +436,9 @@ static void bass_pf_1sf_delay( Word64 nrg64 = W_deposit32_l( nrg ); FOR( i = lg; i < l_subfr; i++ ) { - tmp16 = shl( syn[i + i_subfr - T], s1 ); /* Q0+s1 */ - tmp64 = W_mac0_16_16( tmp64, shl( syn[i + i_subfr], s1 ), tmp16 ); /* Q0+2*s1 */ - nrg64 = W_mac0_16_16( nrg64, tmp16, tmp16 ); /* Q0+2*s1 */ + tmp16 = shl( syn[sub( add( i, i_subfr ), T )], s1 ); /* Q0+s1 */ + tmp64 = W_mac0_16_16( tmp64, shl( syn[add( i, i_subfr )], s1 ), tmp16 ); /* Q0+2*s1 */ + nrg64 = W_mac0_16_16( nrg64, tmp16, tmp16 ); /* Q0+2*s1 */ } tmp = W_sat_l( tmp64 ); nrg = W_sat_l( nrg64 ); @@ -474,10 +478,10 @@ static void bass_pf_1sf_delay( Word64 ener2_64 = W_deposit32_l( ener2 ); FOR( i = 0; i < lg; i++ ) { - tmp32 = L_msu0( 0, gain, syn[i + i_subfr - T] ); - tmp32 = L_msu0( tmp32, gain, syn[i + i_subfr + T] ); + tmp32 = L_msu0( 0, gain, syn[sub( add( i, i_subfr ), T )] ); + tmp32 = L_msu0( tmp32, gain, syn[add( add( i, i_subfr ), T )] ); #ifdef BASOP_NOGLOB - tmp16 = mac_r_sat( tmp32, gain, syn[i + i_subfr] ); /* Q0 */ + tmp16 = mac_r_sat( tmp32, gain, syn[add( i, i_subfr )] ); /* Q0 */ #else tmp16 = mac_r( tmp32, gain, syn[i + i_subfr] ); /* Q0 */ #endif @@ -504,8 +508,8 @@ static void bass_pf_1sf_delay( FOR( i = lg; i < l_subfr; i++ ) { #ifdef BASOP_NOGLOB - tmp32 = L_mult0( gain, syn[i + i_subfr] ); - tmp32 = L_msu0_sat( tmp32, gain, syn[i + i_subfr - T] ); /* Q0 */ + tmp32 = L_mult0( gain, syn[add( i, i_subfr )] ); + tmp32 = L_msu0_sat( tmp32, gain, syn[sub( add( i, i_subfr ), T )] ); /* Q0 */ tmp16 = round_fx_sat( tmp32 ); lp_error = Mpy_32_16_1( lp_error, 29491 /*0.9f Q15*/ ); @@ -541,6 +545,7 @@ static void bass_pf_1sf_delay( } *lp_error_ener = L_add( Mpy_32_16_1( L_sub( *lp_error_ener, ener2 ), 32440 /*0.99f Q15*/ ), ener2 ); /* 15Q16 */ + move32(); st = add( st, 6 ); ener2 = L_sub( *lp_error_ener, L_deposit_h( sub( 31, st ) ) ); @@ -587,11 +592,12 @@ static void bass_pf_1sf_delay( { FOR( i = 0; i < lg; i++ ) { - tmp32 = L_msu0( 0, tmp16, syn[i + i_subfr - T] ); + tmp32 = L_msu0( 0, tmp16, syn[sub( add( i, i_subfr ), T )] ); #ifdef BASOP_NOGLOB - tmp32 = L_msu0_sat( tmp32, tmp16, syn[i + i_subfr + T] ); - tmp32 = L_mac_sat( tmp32, tmp16, syn[i + i_subfr] ); - bpf_noise_buf[i + i_subfr] = round_fx_sat( tmp32 ); /* Q0 */ + tmp32 = L_msu0_sat( tmp32, tmp16, syn[add( add( i, i_subfr ), T )] ); + tmp32 = L_mac_sat( tmp32, tmp16, syn[add( i, i_subfr )] ); + bpf_noise_buf[add( i, i_subfr )] = round_fx_sat( tmp32 ); /* Q0 */ + move16(); #else tmp32 = L_msu0( tmp32, tmp16, syn[i + i_subfr + T] ); tmp32 = L_mac( tmp32, tmp16, syn[i + i_subfr] ); @@ -604,10 +610,11 @@ static void bass_pf_1sf_delay( { FOR( i = lg; i < l_subfr; i++ ) { - tmp32 = L_mult0( tmp16, syn[i + i_subfr] ); + tmp32 = L_mult0( tmp16, syn[add( i, i_subfr )] ); #ifdef BASOP_NOGLOB - tmp32 = L_msu0_sat( tmp32, tmp16, syn[i + i_subfr - T] ); - bpf_noise_buf[i + i_subfr] = round_fx_sat( tmp32 ); /* Q0 */ + tmp32 = L_msu0_sat( tmp32, tmp16, syn[sub( add( i, i_subfr ), T )] ); + bpf_noise_buf[add( i, i_subfr )] = round_fx_sat( tmp32 ); /* Q0 */ + move16(); #else tmp32 = L_msu0( tmp32, tmp16, syn[i + i_subfr - T] ); bpf_noise_buf[i + i_subfr] = round_fx( tmp32 ); /* Q0 */ @@ -650,6 +657,7 @@ void cldfb_synth_set_bandsToZero( Word16 i, k, tmp1, tmp2, tmp3, tmp, update_perc; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif @@ -660,16 +668,23 @@ void cldfb_synth_set_bandsToZero( set32_fx( nrg_band, 0, CLDFB_NO_CHANNELS_MAX ); max_nrg = 0; + move32(); offset = 250; + move16(); WBcnt = 20; - perc_miss = 13107; /*0.80 in Q14*/ + move16(); + perc_miss = 13107; /*0.80 in Q14*/ + move16(); perc_detect = 14746; /*0.90 in Q14*/ + move16(); IF( EQ_16( st->VAD, 1 ) ) { st->active_frame_cnt_bwddec = add( st->active_frame_cnt_bwddec, 1 ); + move16(); st->total_frame_cnt_bwddec = add( st->total_frame_cnt_bwddec, 1 ); + move16(); if ( GT_16( st->active_frame_cnt_bwddec, 99 ) ) { st->active_frame_cnt_bwddec = 100; @@ -681,15 +696,15 @@ void cldfb_synth_set_bandsToZero( move16(); } - FOR( i = 0; i < ( st->cldfbSyn->no_channels - st->cldfbSyn->bandsToZero ); i++ ) + FOR( i = 0; i < sub( st->cldfbSyn->no_channels, st->cldfbSyn->bandsToZero ); i++ ) { nrgQ31 = 0; move32(); FOR( k = 0; k < nTimeSlots; k++ ) { /* use 16-bit precision of real and imag buffers */ - realQ1 = extract_l( L_shr( rAnalysis[k][i], 31 - ( 15 + scaleFactor.lb_scale ) + 3 ) ); - imagQ1 = extract_l( L_shr( iAnalysis[k][i], 31 - ( 15 + scaleFactor.lb_scale ) + 3 ) ); /* Q(-3), headroom */ + realQ1 = extract_l( L_shr( rAnalysis[k][i], sub( 31 + 3 - 15, scaleFactor.lb_scale ) ) ); /*31 - (15 + scaleFactor.lb_scale) + 3 )*/ + imagQ1 = extract_l( L_shr( iAnalysis[k][i], sub( 31 + 3 - 15, scaleFactor.lb_scale ) ) ); /* Q(-3), headroom */ #ifdef BASOP_NOGLOB nrgQ31 = L_mac0_o( nrgQ31, realQ1, realQ1, &Overflow ); nrgQ31 = L_mac0_o( nrgQ31, imagQ1, imagQ1, &Overflow ); /* keep in Q(-6) */ @@ -723,6 +738,7 @@ void cldfb_synth_set_bandsToZero( tempQ31 = L_shr( nrgQ31, 9 ); st->avg_nrg_LT = L_add( Mult_32_16( st->avg_nrg_LT, 32440 ), Mult_32_16( tempQ31, 327 ) ); /*0.99*avg_nrg_LT + 0.01*tempQ31*/ + move32(); update_perc = 1; move16(); if ( st->ini_frame >= 25 && tempQ31 < Mult_32_16( st->avg_nrg_LT, 164 ) ) @@ -739,7 +755,7 @@ void cldfb_synth_set_bandsToZero( move16(); } - FOR( i = 0; i < WBcnt - 1; i++ ) + FOR( i = 0; i < sub( WBcnt, 1 ); i++ ) { st->flag_buffer[i] = st->flag_buffer[i + 1]; move16(); @@ -753,6 +769,7 @@ void cldfb_synth_set_bandsToZero( IF( flag != 0 ) { tmp1 = sub( 16384, st->perc_bwddec ); /*Q14*/ + move16(); tmp = norm_s( st->active_frame_cnt_bwddec ); tmp3 = shl( st->active_frame_cnt_bwddec, tmp ); /*Qtmp*/ @@ -760,10 +777,12 @@ void cldfb_synth_set_bandsToZero( tmp2 = div_s( 16384, tmp3 ); /* 1/active_frames in Q15 + Q14 - Qtmp = Q29 - Qtmp */ tmp2 = mult_r( tmp2, tmp1 ); /*(1-perc)*(1/active_frames) in Q14 + Q29 - Qtmp - Q15 = Q28 - Qtmp*/ st->perc_bwddec = add( st->perc_bwddec, shl( tmp2, sub( tmp, 14 ) ) ); /* Q14 */ + move16(); } ELSE { tmp1 = ( st->perc_bwddec ); /*Q14*/ + move16(); tmp = norm_s( st->active_frame_cnt_bwddec ); tmp3 = shl( st->active_frame_cnt_bwddec, tmp ); /*Qtmp*/ @@ -771,11 +790,14 @@ void cldfb_synth_set_bandsToZero( tmp2 = div_s( 16384, tmp3 ); /* 1/active_frames in Q15 + Q14 - Qtmp = Q29 - Qtmp */ tmp2 = mult_r( tmp2, tmp1 ); /*(perc)*(1/active_frames) in Q14 + Q29 - Qtmp - Q15 = Q28 - Qtmp*/ st->perc_bwddec = sub( st->perc_bwddec, shl( tmp2, sub( tmp, 14 ) ) ); /* Q14 */ + move16(); } } test(); IF( GT_16( st->total_frame_cnt_bwddec, offset ) && GT_16( st->active_frame_cnt_bwddec, 50 ) ) { + test(); + test(); IF( ( st->perc_bwddec >= perc_detect || ( st->perc_bwddec >= perc_miss && st->last_flag_filter_NB ) ) && ( sum16_fx( st->flag_buffer, WBcnt ) != 0 ) ) /*decision hysterysis*/ { st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, 10 ); @@ -797,6 +819,7 @@ void cldfb_synth_set_bandsToZero( IF( sum16_fx( st->flag_buffer, WBcnt ) == 0 ) { st->perc_bwddec = 0; + move16(); st->active_frame_cnt_bwddec = 0; move16(); st->total_frame_cnt_bwddec = 0; @@ -807,12 +830,13 @@ void cldfb_synth_set_bandsToZero( } ELSE { - IF( st->last_flag_filter_NB == 1 ) + if ( EQ_16( st->last_flag_filter_NB, 1 ) ) { st->cldfbSyn->bandsToZero = st->last_active_bandsToZero_bwdec; move16(); } st->total_frame_cnt_bwddec = add( st->total_frame_cnt_bwddec, 1 ); + move16(); if ( GT_16( st->total_frame_cnt_bwddec, 500 ) ) { st->total_frame_cnt_bwddec = 500; @@ -821,6 +845,7 @@ void cldfb_synth_set_bandsToZero( } st->last_active_bandsToZero_bwdec = st->cldfbSyn->bandsToZero; + move16(); return; } diff --git a/lib_dec/ppp_dec_fx.c b/lib_dec/ppp_dec_fx.c index 24461a7fb..1f0f485df 100644 --- a/lib_dec/ppp_dec_fx.c +++ b/lib_dec/ppp_dec_fx.c @@ -58,12 +58,12 @@ static void DTFS_dequant_cw_fx( Word32 L_tmp, L_temp; Word32 L_tmp2; - IF( num_erb_fx == NUM_ERB_NB ) + IF( EQ_16( num_erb_fx, NUM_ERB_NB ) ) { PowerCB_fx = PowerCB_NB_fx; move16(); } - ELSE IF( num_erb_fx == NUM_ERB_WB ) + ELSE IF( EQ_16( num_erb_fx, NUM_ERB_WB ) ) { PowerCB_fx = PowerCB_WB_fx; move16(); @@ -73,12 +73,14 @@ static void DTFS_dequant_cw_fx( erb_add_fx( curr_erb_fx, X_fx->lag_fx, lasterbD_fx, pl_fx, AMP_IDX_fx, num_erb_fx ); - curr_erb_fx[0] = mult_r( curr_erb_fx[1], 9830 ); /* 0.3 inQ15 leaves curr_erb in Q13 */ + curr_erb_fx[0] = mult_r( curr_erb_fx[1], 9830 ); /* 0.3 inQ15 leaves curr_erb in Q13 */ + move16(); curr_erb_fx[sub( num_erb_fx, 2 )] = mult_r( curr_erb_fx[sub( num_erb_fx, 3 )], 9830 ); /* Q13 */ - move16(); + curr_erb_fx[sub( num_erb_fx, 1 )] = 0; + move16(); erb_slot_fx( X_fx->lag_fx, slot_fx, mfreq_fx, num_erb_fx ); @@ -93,7 +95,8 @@ static void DTFS_dequant_cw_fx( /* Need to unify the Q factors of both bands */ X_fx->Q = s_min( Ql, Qh ); /* set Q factor to be the smaller one */ - n = sub( Ql, Qh ); /* compare band Q factors */ + move16(); + n = sub( Ql, Qh ); /* compare band Q factors */ /* This logic adjusts difference between Q formats of both bands */ @@ -115,6 +118,8 @@ static void DTFS_dequant_cw_fx( *lastLgainD_fx = add( *lastLgainD_fx, PowerCB_fx[tmp_fx] ); /* Q11 */ *lastHgainD_fx = add( *lastHgainD_fx, PowerCB_fx[tmp_fx + 1] ); /* Q11 */ #endif + move16(); + move16(); L_tmp = L_deposit_h( X_fx->lag_fx ); /* Q16 */ exp = norm_l( L_tmp ); L_tmp = L_shl( L_tmp, exp ); @@ -171,6 +176,7 @@ static void DTFS_dequant_cw_fx( L_temp = L_shl( L_tmp, exp1 + 15 ); /* Q15 */ #endif L_tmp2 = L_temp; + move32(); if ( GE_32( L_temp, 2147483647 ) ) { L_temp = L_shl( L_tmp, 15 ); /*Q(15-exp1) */ @@ -192,7 +198,8 @@ static void DTFS_dequant_cw_fx( /* Need to unify the Q factors of both bands */ X_fx->Q = s_min( Ql, Qh ); /* set Q factor to be the smaller one */ - n = sub( Ql, Qh ); /* compare band Q factors */ + move16(); + n = sub( Ql, Qh ); /* compare band Q factors */ IF( n < 0 ) @@ -255,11 +262,16 @@ ivas_error ppp_quarter_decoder_fx( DTFS_STRUCTURE *PREVDTFS_FX; Word16 AMP_IDX_fx[2]; Word16 temp_pl_fx = prevCW_lag_fx, temp_l_fx = CURRCW_Q_DTFS_FX->lag_fx; + move16(); + move16(); Word16 temp_fx; Word16 l_fx = CURRCW_Q_DTFS_FX->lag_fx; + move16(); Word16 POWER_IDX_fx; Word16 Erot_fx = 0; + move16(); Word16 num_erb_fx = 24; + move16(); Word32 temp32d_fx, temp32n_fx; Word32 L_tmp, L_tmp1; Word16 tmp, exp; @@ -267,7 +279,7 @@ ivas_error ppp_quarter_decoder_fx( error = IVAS_ERR_OK; move16(); - IF( ( error = DTFS_new_fx( &PREVDTFS_FX ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = DTFS_new_fx( &PREVDTFS_FX ) ), IVAS_ERR_OK ) ) { return error; } @@ -287,7 +299,6 @@ ivas_error ppp_quarter_decoder_fx( IF( bfi == 0 ) { POWER_IDX_fx = (Word16) get_next_indice( st_fx, 6 ); - move16(); AMP_IDX_fx[0] = (Word16) get_next_indice( st_fx, 6 ); move16(); AMP_IDX_fx[1] = (Word16) get_next_indice( st_fx, 6 ); @@ -299,18 +310,22 @@ ivas_error ppp_quarter_decoder_fx( This logic of normalisation is not employed in adjustlag, hence denormalisation is necessury.*/ /*As the upper cut of freqencies are normalized to 12800, we have to multiply upper cut off freq by 2.56(1/12800 in Q15) */ - temp32n_fx = L_mult( CURRCW_Q_DTFS_FX->upper_cut_off_freq_fx, 10486 ); /* Q0+Q27 = Q28 */ - CURRCW_Q_DTFS_FX->upper_cut_off_freq_fx = (Word16) L_shr( temp32n_fx, 13 ); /*Q15 */ - temp32n_fx = L_mult( CURRCW_Q_DTFS_FX->upper_cut_off_freq_of_interest_fx, 10486 ); /* Q0+Q27 = Q28 */ - CURRCW_Q_DTFS_FX->upper_cut_off_freq_of_interest_fx = (Word16) L_shr( temp32n_fx, 13 ); /*Q15 */ + temp32n_fx = L_mult( CURRCW_Q_DTFS_FX->upper_cut_off_freq_fx, 10486 ); /* Q0+Q27 = Q28 */ + CURRCW_Q_DTFS_FX->upper_cut_off_freq_fx = extract_l( L_shr( temp32n_fx, 13 ) ); /*Q15 */ + move16(); + temp32n_fx = L_mult( CURRCW_Q_DTFS_FX->upper_cut_off_freq_of_interest_fx, 10486 ); /* Q0+Q27 = Q28 */ + CURRCW_Q_DTFS_FX->upper_cut_off_freq_of_interest_fx = extract_l( L_shr( temp32n_fx, 13 ) ); /*Q15 */ + move16(); DTFS_dequant_cw_fx( prevCW_lag_fx, POWER_IDX_fx, AMP_IDX_fx, lastLgainD_fx, lastHgainD_fx, lasterbD_fx, CURRCW_Q_DTFS_FX, num_erb_fx ); /*De-normalize cut off frequencies */ - temp32n_fx = L_shl( (Word32) CURRCW_Q_DTFS_FX->upper_cut_off_freq_fx, 13 ); /*Q28 */ - CURRCW_Q_DTFS_FX->upper_cut_off_freq_fx = (Word16) find_remd( temp32n_fx, 20971, &temp32d_fx ); - temp32n_fx = L_shl( (Word32) CURRCW_Q_DTFS_FX->upper_cut_off_freq_of_interest_fx, 13 ); /*Q28 */ - CURRCW_Q_DTFS_FX->upper_cut_off_freq_of_interest_fx = (Word16) find_remd( temp32n_fx, 20971, &temp32d_fx ); + temp32n_fx = L_shl( L_deposit_l( CURRCW_Q_DTFS_FX->upper_cut_off_freq_fx ), 13 ); /*Q28 */ + CURRCW_Q_DTFS_FX->upper_cut_off_freq_fx = extract_l( find_remd( temp32n_fx, 20971, &temp32d_fx ) ); + move16(); + temp32n_fx = L_shl( L_deposit_l( CURRCW_Q_DTFS_FX->upper_cut_off_freq_of_interest_fx ), 13 ); /*Q28 */ + CURRCW_Q_DTFS_FX->upper_cut_off_freq_of_interest_fx = extract_l( find_remd( temp32n_fx, 20971, &temp32d_fx ) ); + move16(); } /* Copying phase spectrum over */ diff --git a/lib_enc/arith_coder_enc.c b/lib_enc/arith_coder_enc.c index eedd260ee..f531d9ed0 100644 --- a/lib_enc/arith_coder_enc.c +++ b/lib_enc/arith_coder_enc.c @@ -609,7 +609,7 @@ void tcx_arith_encode_envelope( gamma_uw = 1.0f / st->gamma_flt; #define WMC_TOOL_SKIP - tcx_arith_render_envelope_flt( A_ind, L_frame, L_spec, FL2WORD16( hTcxCfg->preemph_fac_flt ), FL2WORD16( gamma_w ), FL2WORD16( 0.5f * gamma_uw ), env ); + tcx_arith_render_envelope_ivas( A_ind, L_frame, L_spec, FL2WORD16( hTcxCfg->preemph_fac_flt ), FL2WORD16( gamma_w ), FL2WORD16( 0.5f * gamma_uw ), env ); #undef WMC_TOOL_SKIP for ( k = 0; k < L_spec; ++k ) @@ -644,7 +644,7 @@ void tcx_arith_encode_envelope( L_spec_core = min( L_spec_core, st->hIGFEnc->infoStartLine ); } envelope = (Word16 *) env; - tcx_arith_scale_envelope_flt( L_spec, L_spec_core, env, target_bits, low_complexity, envelope, &envelope_e ); + tcx_arith_scale_envelope_ivas( L_spec, L_spec_core, env, target_bits, low_complexity, envelope, &envelope_e ); #define WMC_TOOL_SKIP tmp = sub( envelope_e, 1 ); diff --git a/lib_rend/ivas_dirac_output_synthesis_dec.c b/lib_rend/ivas_dirac_output_synthesis_dec.c index 013051554..78ebf3009 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec.c @@ -2124,9 +2124,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( { FOR( l = 0; l < num_freq_bands; l++ ) { - g1 = L_add( POINT_3679_Q31, - Mpy_32_32( onset_filter[l], - POINT_1175_Q31 - POINT_3679_Q31 ) ); // Q31, (Q31, Q31) -> Q31 + g1 = Madd_32_32( POINT_3679_Q31, onset_filter[l], POINT_1175_Q31 - POINT_3679_Q31 ); // Q31, (Q31, Q31) -> Q31 g2 = Mpy_32_32( L_sub( ONE_IN_Q31, g1 ), *( p_gains_dir ) ); // (Q31, p_gains_dir_q) -> p_gains_dir_q g2 = L_add_sat( g2, Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth++ ) ) ) ); // p_gains_diff_q, (Q31, p_gains_diff_q) -> p_gains_diff_q g2 = L_max( g2, Mpy_32_32( 2126008812 /* 0.99f in Q31 */, L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ) ); // p_gains_dir_q @@ -2142,9 +2140,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( { FOR( l = 0; l < num_freq_bands; l++ ) { - g1 = L_add( POINT_3679_Q31, - Mpy_32_32( onset_filter[l], - POINT_1175_Q31 - POINT_3679_Q31 ) ); // Q31, (Q31, Q31) -> Q31 + g1 = Madd_32_32( POINT_3679_Q31, onset_filter[l], POINT_1175_Q31 - POINT_3679_Q31 ); // Q31, (Q31, Q31) -> Q31 g2 = Mpy_32_32( L_sub( ONE_IN_Q31, g1 ), *( p_gains_dir ) ); // (Q31, p_gains_dir_q) -> p_gains_dir_q g2 = L_add_sat( g2, Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth++ ) ) ) ); // p_gains_diff_q, (Q31, p_gains_diff_q) -> p_gains_diff_q g2 = L_max( g2, Mpy_32_32( 1825361101 /* 0.85f in Q31 */, L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ) ); // p_gains_dir_q @@ -2160,9 +2156,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( { FOR( l = 0; l < num_freq_bands; l++ ) { - g1 = L_add( POINT_3679_Q31, - Mpy_32_32( onset_filter[l], - POINT_1175_Q31 - POINT_3679_Q31 ) ); // Q31, (Q31, Q31) -> Q31 + g1 = Madd_32_32( POINT_3679_Q31, onset_filter[l], POINT_1175_Q31 - POINT_3679_Q31 ); // Q31, (Q31, Q31) -> Q31 g2 = Mpy_32_32( L_sub( ONE_IN_Q31, g1 ), *( p_gains_dir ) ); // (Q31, p_gains_dir_q) -> p_gains_dir_q g2 = L_add_sat( g2, Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth++ ) ) ) ); // p_gains_diff_q, (Q31, p_gains_diff_q) -> p_gains_diff_q g2 = L_max( g2, W_extract_h( W_shl( W_mult_32_32( -DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ), Q5 ) ) ); // p_gains_dir_q @@ -2192,9 +2186,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( { FOR( l = 0; l < num_freq_bands; l++ ) { - g1 = L_add( POINT_3679_Q31, - Mpy_32_32( onset_filter[l], - POINT_1175_Q31 - POINT_3679_Q31 ) ); // Q31, (Q31, Q31) -> Q31 + g1 = Madd_32_32( POINT_3679_Q31, onset_filter[l], POINT_1175_Q31 - POINT_3679_Q31 ); // Q31, (Q31, Q31) -> Q31 g2 = Mpy_32_32( L_sub( ONE_IN_Q31, g1 ), *( p_gains_dir ) ); // (Q31, p_gains_dir_q) -> p_gains_dir_q g2 = L_add_sat( g2, Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth++ ) ) ) ); // (p_gains_diff_q, (Q31, p_gains_diff_q) -> p_gains_diff_q g2 = L_max( g2, W_extract_h( W_shl( W_mult_32_32( -DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ) ), Q5 ) ) ); // p_gains_dir_q @@ -2251,8 +2243,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( shl( i_mult( ch_idx, num_freq_bands ), Q1 ); FOR( l = 0; l < num_freq_bands; l++ ) { - g = L_add( Mpy_32_32( g1, ( *( p_gains_dir++ ) ) ), - Mpy_32_32( g2, ( *( p_gains_dir_prev++ ) ) ) ); // (Q31, p_gains_dir_q) -> (p_gains_dir_q) + g = Madd_32_32( Mpy_32_32( g1, ( *( p_gains_dir++ ) ) ), g2, ( *( p_gains_dir_prev++ ) ) ); // (Q31, p_gains_dir_q) -> (p_gains_dir_q) output_real[add( imult1616( l, num_channels_dir ), ch_idx )] = Mpy_32_32( g, ( *( p_proto_diff++ ) ) ); // (p_gains_dir_q, p_proto_diff_q) -> (p_gains_dir_q + p_proto_diff_q - 31) move32(); @@ -2278,31 +2269,25 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( shl( i_mult( proto_direct_index[1], num_freq_bands ), Q1 ); FOR( l = 0; l < num_freq_bands; l++ ) { - gs1 = L_add( Mpy_32_32( g1, ( *( p_gains_dir ) ) ), - Mpy_32_32( g2, ( *( p_gains_dir_prev ) ) ) ); // (Q31, p_gains_dir_q) -> (p_gains_dir_q) - gs2 = L_add( Mpy_32_32( g1, ( *( p_gains_dir + imult1616( num_freq_bands, num_channels_dir ) ) ) ), - Mpy_32_32( g2, ( *( p_gains_dir_prev + imult1616( num_freq_bands, num_channels_dir ) ) ) ) ); // (Q31, p_gains_dir_q) -> (p_gains_dir_q) + gs1 = Madd_32_32( Mpy_32_32( g1, ( *( p_gains_dir ) ) ), g2, ( *( p_gains_dir_prev ) ) ); // (Q31, p_gains_dir_q) -> (p_gains_dir_q) + gs2 = Madd_32_32( Mpy_32_32( g1, ( *( p_gains_dir + imult1616( num_freq_bands, num_channels_dir ) ) ) ), g2, ( *( p_gains_dir_prev + imult1616( num_freq_bands, num_channels_dir ) ) ) ); // (Q31, p_gains_dir_q) -> (p_gains_dir_q) p_gains_dir++; p_gains_dir_prev++; // ((p_gains_dir_q, p_proto_dir_q) >> 1) -> (p_gains_dir_q + p_proto_dir_q - 31) output_real[add( imult1616( l, num_channels_dir ), ch_idx )] = - L_add( - Mpy_32_32( gs1, ( L_add( Mpy_32_32( 1903158016 /* 1.772454e+00f / 2 in Q31 */, ( *p_proto ) ), - Mpy_32_32( 1098788992 /* 1.023327e+00f / 2 in Q31 */, ( *p_proto2 ) ) ) ) ), /* s1 */ - Mpy_32_32( gs2, ( L_sub( Mpy_32_32( 1903158016 /* 1.772454e+00f / 2 in Q31 */, ( *p_proto ) ), - Mpy_32_32( 1098788992 /* 1.023327e+00f / 2 in Q31 */, ( *p_proto2 ) ) ) ) ) ); /* s2 */ + Madd_32_32( + Mpy_32_32( gs1, ( L_add( Mpy_32_32( 1903158016 /* 1.772454e+00f / 2 in Q31 */, ( *p_proto ) ), Mpy_32_32( 1098788992 /* 1.023327e+00f / 2 in Q31 */, ( *p_proto2 ) ) ) ) ), /* s1 */ + gs2, L_sub( Mpy_32_32( 1903158016 /* 1.772454e+00f / 2 in Q31 */, ( *p_proto ) ), Mpy_32_32( 1098788992 /* 1.023327e+00f / 2 in Q31 */, ( *p_proto2 ) ) ) ); /* s2 */ move32(); p_proto++; p_proto2++; // ((p_gains_dir_q, p_proto_dir_q) >> 1) -> (p_gains_dir_q + p_proto_dir_q - 31) output_imag[add( imult1616( l, num_channels_dir ), ch_idx )] = - L_add( - Mpy_32_32( gs1, ( L_add( Mpy_32_32( 1903158016 /* 1.772454e+00f / 2 in Q31 */, ( *p_proto ) ), - Mpy_32_32( 1098788992 /* 1.023327e+00f / 2 in Q31 */, ( *p_proto2 ) ) ) ) ), - Mpy_32_32( gs2, ( L_sub( Mpy_32_32( 1903158016 /* 1.772454e+00f / 2 in Q31 */, ( *p_proto ) ), - Mpy_32_32( 1098788992 /* 1.023327e+00f / 2 in Q31 */, ( *p_proto2 ) ) ) ) ) ); + Madd_32_32( + Mpy_32_32( gs1, ( L_add( Mpy_32_32( 1903158016 /* 1.772454e+00f / 2 in Q31 */, ( *p_proto ) ), Mpy_32_32( 1098788992 /* 1.023327e+00f / 2 in Q31 */, ( *p_proto2 ) ) ) ) ), + gs2, L_sub( Mpy_32_32( 1903158016 /* 1.772454e+00f / 2 in Q31 */, ( *p_proto ) ), Mpy_32_32( 1098788992 /* 1.023327e+00f / 2 in Q31 */, ( *p_proto2 ) ) ) ); move32(); p_proto++; p_proto2++; @@ -2334,8 +2319,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( { FOR( l = 0; l < num_freq_bands; l++ ) { - g = L_add( Mpy_32_32( g1, ( *( p_gains_dir++ ) ) ), - Mpy_32_32( g2, ( *( p_gains_dir_prev++ ) ) ) ); // (Q31, p_gains_dir_q) -> (p_gains_dir_q) + g = Madd_32_32( Mpy_32_32( g1, ( *( p_gains_dir++ ) ) ), g2, ( *( p_gains_dir_prev++ ) ) ); // (Q31, p_gains_dir_q) -> (p_gains_dir_q) output_real[add( imult1616( l, num_channels_dir ), ch_idx )] = Mpy_32_32( g, ( *( p_proto++ ) ) ); // (p_gains_dir_q, p_proto_dir_q) -> (p_gains_dir_q + p_proto_dir_q - 31) move32(); @@ -2383,19 +2367,18 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( ch_idx_diff = add( ch_idx_diff, 1 ); FOR( l = 0; l < num_freq_bands_diff; l++ ) { - g = L_add( Mpy_32_32( g1, ( *( p_gains_diff++ ) ) ), - Mpy_32_32( g2, ( *( p_gains_diff_prev++ ) ) ) ); // (Q31, p_gains_diff_q) -> p_gains_diff_q + g = Madd_32_32( Mpy_32_32( g1, ( *( p_gains_diff++ ) ) ), g2, ( *( p_gains_diff_prev++ ) ) ); // (Q31, p_gains_diff_q) -> p_gains_diff_q // ((p_gains_diff_q, p_proto_diff_q) >> Q1) -> (p_gains_diff_q + p_proto_diff_q - 31) output_real[add( imult1616( l, num_channels_dir ), hDirACRend->sba_map_tc[ch_idx] )] = - L_add( output_real[add( imult1616( l, num_channels_dir ), hDirACRend->sba_map_tc[ch_idx] )], - Mpy_32_32( g, ( *( p_proto++ ) ) ) ); + Madd_32_32( output_real[add( imult1616( l, num_channels_dir ), hDirACRend->sba_map_tc[ch_idx] )], + g, ( *( p_proto++ ) ) ); move32(); // ((p_gains_diff_q, p_proto_diff_q) >> Q1) -> (p_gains_diff_q + p_proto_diff_q - 31) output_imag[add( imult1616( l, num_channels_dir ), hDirACRend->sba_map_tc[ch_idx] )] = - L_add( output_imag[add( imult1616( l, num_channels_dir ), hDirACRend->sba_map_tc[ch_idx] )], - Mpy_32_32( g, ( *( p_proto++ ) ) ) ); + Madd_32_32( output_imag[add( imult1616( l, num_channels_dir ), hDirACRend->sba_map_tc[ch_idx] )], + g, ( *( p_proto++ ) ) ); move32(); } } @@ -2436,9 +2419,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( move32(); FOR( i = 1; i < num_channels_dir; i++ ) { - p_real[l] = L_add( p_real[l], Mpy_32_32( *( p_out_real++ ), hoa_decoder[i] ) ); // (q, Q29) -> q - Q2 + p_real[l] = Madd_32_32( p_real[l], *( p_out_real++ ), hoa_decoder[i] ); // (q, Q29) -> q - Q2 move32(); - p_imag[l] = L_add( p_imag[l], Mpy_32_32( *( p_out_imag++ ), hoa_decoder[i] ) ); // (q, Q29) -> q - Q2 + p_imag[l] = Madd_32_32( p_imag[l], *( p_out_imag++ ), hoa_decoder[i] ); // (q, Q29) -> q - Q2 move32(); } } diff --git a/lib_rend/ivas_limiter.c b/lib_rend/ivas_limiter.c index 07f2ca72d..94f291ea1 100644 --- a/lib_rend/ivas_limiter.c +++ b/lib_rend/ivas_limiter.c @@ -796,11 +796,11 @@ void limiter_process_fx( /* Update gain */ IF( LT_32( frame_gain, gain ) ) { - gain = L_add( Mpy_32_32( attack_constant, ( L_sub( gain, frame_gain ) ) ), frame_gain ); /* Q30 */ + gain = Madd_32_32( frame_gain, attack_constant, L_sub( gain, frame_gain ) ); /* Q30 */ } ELSE { - gain = L_add( Mpy_32_32( release_constant, ( L_sub( gain, frame_gain ) ) ), frame_gain ); /* Q30 */ + gain = Madd_32_32( frame_gain, release_constant, L_sub( gain, frame_gain ) ); /* Q30 */ } FOR( c = 0; c < num_channels; c++ ) -- GitLab From d4ae4a4081bfd7cb810e2013677bc26ae11282fa Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 15 Jul 2024 12:38:26 +0530 Subject: [PATCH 071/110] Clang formatting changes --- lib_com/ivas_avq_pos_reorder_com.c | 2 +- lib_com/ivas_rom_com.c | 2 +- lib_com/ivas_stereo_ica_com_fx.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_com/ivas_avq_pos_reorder_com.c b/lib_com/ivas_avq_pos_reorder_com.c index f47aead34..692e89f86 100644 --- a/lib_com/ivas_avq_pos_reorder_com.c +++ b/lib_com/ivas_avq_pos_reorder_com.c @@ -89,4 +89,4 @@ void ordr_esti( return; } -#endif \ No newline at end of file +#endif diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index ace600eab..8733ad0bd 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -6835,4 +6835,4 @@ const ACPL_QUANT_TABLE ivas_mc_paramupmix_beta_quant_table[9] = 0, /* offset */ { +0.000000e+000f, +5.937500e-002f, +1.375000e-001f, +2.343750e-001f, +3.500000e-001f, +4.843750e-001f, +6.375000e-001f, +8.093750e-001f, +1.000000e+000f } /* data */ } -}; \ No newline at end of file +}; diff --git a/lib_com/ivas_stereo_ica_com_fx.c b/lib_com/ivas_stereo_ica_com_fx.c index d96d64c7c..6ffce03e4 100644 --- a/lib_com/ivas_stereo_ica_com_fx.c +++ b/lib_com/ivas_stereo_ica_com_fx.c @@ -397,4 +397,4 @@ void adjustTargetSignal_fx( return; } -#endif \ No newline at end of file +#endif -- GitLab From e69fb98b93916e69d179d67405783379d74f8f12 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 16 Jul 2024 10:52:16 +0530 Subject: [PATCH 072/110] Functions in ivas_ism_metadata_enc.c converted to fixed point --- lib_com/ivas_prot.h | 56 +- lib_com/ivas_stat_com.h | 7 + lib_enc/ivas_enc.c | 58 +- lib_enc/ivas_ism_enc.c | 134 ++++ lib_enc/ivas_ism_metadata_enc.c | 1199 ++++++++++++++++++++++++------- lib_enc/ivas_omasa_enc.c | 73 +- lib_enc/ivas_stat_enc.h | 5 +- lib_enc/lib_enc.c | 18 +- 8 files changed, 1278 insertions(+), 272 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 437e88399..5dcff25ea 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1226,6 +1226,17 @@ void ivas_ism_reset_metadata_API( ); /*! r: index of the winning codeword */ +#ifdef IVAS_FLOAT_FIXED +Word16 ism_quant_meta_fx( + const Word32 val, /* i : scalar value to quantize */ + Word32 *valQ, /* o : quantized value */ + const Word32 borders_fx[], /* i : level borders */ + const Word32 q_step_fx, /* i : quantization step */ + const Word32 q_step_border_fx, /* i : quantization step at the border */ + const Word16 cbsize /* i : codebook size */ +); +#endif + int16_t ism_quant_meta( const float val, /* i : scalar value to quantize */ float *valQ, /* o : quantized value */ @@ -1244,6 +1255,17 @@ float ism_dequant_meta( const int16_t cbsize /* i : codebook size */ ); +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_set_ism_metadata_fx( + ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */ + const Word32 azimuth, /* i : azimuth value */ + const Word32 elevation, /* i : elevation value */ + const Word16 radius_meta, /* i : radius */ + const Word32 yaw, /* i : yaw */ + const Word32 pitch, /* i : pitch */ + const Word16 non_diegetic_flag /* i : non-diegetic object flag */ +); +#else ivas_error ivas_set_ism_metadata( ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */ const float azimuth, /* i : azimuth value */ @@ -1253,7 +1275,7 @@ ivas_error ivas_set_ism_metadata( const float pitch, /* i : pitch */ const int16_t non_diegetic_flag /* i : non-diegetic object flag */ ); - +#endif ivas_error ivas_ism_metadata_enc_create( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ const int16_t n_ISms, /* i : number of objects */ @@ -1274,6 +1296,25 @@ ivas_error ivas_ism_enc( const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ ); +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_ism_metadata_enc( + Word32 *ism_total_brate, /* i/o: ISM total bitrate */ + const Word16 nchan_ism, /* i : number of ISM channels */ + const Word16 nchan_transport, /* i : number of transport channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + Word16 nb_bits_metadata[], /* o : number of metadata bits */ + const Word16 localVAD[], /* i : VAD flag */ + const Word16 ism_mode, /* i : ISM mode */ + const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Config Handle */ + const Word16 ism_extended_metadata_flag, /* i : Extended metadata flag */ + const Word32 lp_noise_CPE, /* i : LP filtered total noise estimation */ + const Word16 flag_omasa_ener_brate, /* i : less bitrate for objects in OMASA flag */ + Word16 *omasa_stereo_sw_cnt, + const Word16 ini_frame +); +#else ivas_error ivas_ism_metadata_enc( int32_t *ism_total_brate, /* i/o: ISM total bitrate */ const int16_t nchan_ism, /* i : number of ISM channels */ @@ -1291,7 +1332,7 @@ ivas_error ivas_ism_metadata_enc( int16_t *omasa_stereo_sw_cnt, const int16_t ini_frame ); - +#endif ivas_error ivas_ism_metadata_dec( const int32_t ism_total_brate, /* i : ISM total bitrate */ const int16_t nchan_ism, /* i : number of ISM channels */ @@ -7589,6 +7630,17 @@ void ivas_set_surplus_brate_dec( int32_t *ism_total_brate /* i : ISM total bitrate */ ); +#ifdef IVAS_FLOAT_FIXED +void ivas_set_ism_importance_interformat_fx( + const Word32 ism_total_brate, /* i/o: ISms total bitrate */ + const Word16 nchan_transport, /* i : number of transported channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ + const Word32 lp_noise_CPE_fx, /* i : LP filtered total noise estimation */ + Word16 ism_imp[] /* o : ISM importance flags */ +); +#endif + void ivas_set_ism_importance_interformat( const int32_t ism_total_brate, /* i/o: ISms total bitrate */ const int16_t nchan_transport, /* i : number of transported channels */ diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 67b03df52..0b7519f44 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -93,10 +93,17 @@ typedef struct int16_t ism_md_fec_cnt_enc; /* counter of continuous frames where MD are not transmitted */ int16_t ism_md_inc_diff_cnt; /* counter of continuous frames where MD are transmitted in inactive segments when MD significantly changes */ float last_true_radius; /* last true Q radius value */ +#ifdef IVAS_FLOAT_FIXED + Word16 last_true_radius_fx; /* last true Q radius value */ +#endif int16_t ism_imp; /* ISM importance flag */ int16_t ism_md_null_flag; int16_t ism_md_lowrate_flag; +#ifdef IVAS_FLOAT_FIXED + Word32 q_azimuth_old_fx; + Word32 q_elevation_old_fx; +#endif float q_azimuth_old; float q_elevation_old; diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index cdcdadb8e..d7e2d24b2 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -407,12 +407,68 @@ ivas_error ivas_enc( { n = hEncoderConfig->nchan_ism; hMetaData = st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; +#ifdef IVAS_FLOAT_FIXED + /*===============================flt-to-fix=============================================*/ + IF( NE_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || NE_16( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) + { + FOR( int ch = 0; ch < st_ivas->hEncoderConfig->nchan_ism; ch++ ) + { + IF( EQ_16( st_ivas->ism_mode, ISM_MODE_DISC ) || EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + IF( EQ_16( st_ivas->hIsmMetaData[ch]->ism_metadata_flag, 1 ) ) + { + /*IF( NE_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + hSCE[ch]->hCoreCoder[0]->lp_noise_fx = float_to_fix16( hSCE[ch]->hCoreCoder[0]->lp_noise, Q8 ); + }*/ + IF( st_ivas->hIsmMetaData[ch]->ism_metadata_flag == 0 ) + { + st_ivas->hIsmMetaData[ch]->azimuth_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->azimuth, Q22 ); + st_ivas->hIsmMetaData[ch]->last_true_azimuth_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->last_true_azimuth, Q22 ); + st_ivas->hIsmMetaData[ch]->elevation_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->elevation, Q22 ); + st_ivas->hIsmMetaData[ch]->last_true_elevation_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->last_true_elevation, Q22 ); + st_ivas->hIsmMetaData[ch]->radius_fx = float_to_fix16( st_ivas->hIsmMetaData[ch]->radius, Q9 ); + st_ivas->hIsmMetaData[ch]->last_true_radius_fx = float_to_fix16( st_ivas->hIsmMetaData[ch]->last_true_radius, Q9 ); + } + } + } + } + } + IF( st_ivas->hIsmMetaData != NULL ) + { + FOR( int ch = 0; ch < st_ivas->hEncoderConfig->nchan_ism; ch++ ) + { + st_ivas->hIsmMetaData[ch]->azimuth_fx = floatToFixed( st_ivas->hIsmMetaData[ch]->azimuth, Q22 ); + st_ivas->hIsmMetaData[ch]->elevation_fx = floatToFixed( st_ivas->hIsmMetaData[ch]->elevation, Q22 ); + st_ivas->hIsmMetaData[ch]->yaw_fx = floatToFixed( st_ivas->hIsmMetaData[ch]->yaw, Q22 ); + st_ivas->hIsmMetaData[ch]->pitch_fx = floatToFixed( st_ivas->hIsmMetaData[ch]->pitch, Q22 ); + st_ivas->hIsmMetaData[ch]->radius_fx = float_to_fix16( st_ivas->hIsmMetaData[ch]->radius, Q9 ); + } + } + /*===============================flt-to-fix=============================================*/ - if ( ( error = ivas_ism_metadata_enc( &st_ivas->hEncoderConfig->ivas_total_brate, n, st_ivas->hEncoderConfig->nchan_ism, st_ivas->hIsmMetaData, NULL, hMetaData, &nb_bits_metadata[1], 0, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hCPE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_ism_metadata_enc( &st_ivas->hEncoderConfig->ivas_total_brate, n, st_ivas->hEncoderConfig->nchan_ism, st_ivas->hIsmMetaData, NULL, hMetaData, &nb_bits_metadata[1], 0, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, L_negate( ONE_IN_Q8 ), 0, NULL, st_ivas->hCPE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) { return error; } + /*===============================flt-2-fix======================================*/ + IF( st_ivas->hIsmMetaData != NULL ) + { + FOR( int ch = 0; ch < st_ivas->hEncoderConfig->nchan_ism; ch++ ) + { + st_ivas->hIsmMetaData[ch]->last_true_azimuth = fix_to_float( st_ivas->hIsmMetaData[ch]->last_true_azimuth_fx, Q22 ); + st_ivas->hIsmMetaData[ch]->last_true_elevation = fix_to_float( st_ivas->hIsmMetaData[ch]->last_true_elevation_fx, Q22 ); + st_ivas->hIsmMetaData[ch]->last_true_radius = fix16_to_float( st_ivas->hIsmMetaData[ch]->last_true_radius_fx, Q9 ); + } + } + /*===============================fix-2-flt======================================*/ +#else + if ( ( error = ivas_ism_metadata_enc( &st_ivas->hEncoderConfig->ivas_total_brate, n, st_ivas->hEncoderConfig->nchan_ism, st_ivas->hIsmMetaData, NULL, hMetaData, &nb_bits_metadata[1], 0, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hCPE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif /* SBA metadata encoding and SBA metadata bitstream writing */ if ( ( error = ivas_spar_enc( st_ivas, &data_f[n], input_frame, nb_bits_metadata, hMetaData ) ) != IVAS_ERR_OK ) { diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 7a819965b..45e4f6534 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -39,6 +39,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" +#include "prot_fx1.h" #include "prot_fx2.h" #endif @@ -259,15 +260,86 @@ ivas_error ivas_ism_enc( if ( dtx_flag ) { +#ifdef IVAS_FLOAT_FIXED + /*================flt-to-fix===================================*/ + IF( sid_flag ) + { + IF( GT_16( st_ivas->nchan_transport, 1 ) ) + { + /* write sce id */ + /* quantize and write coherence */ + floatToFixed_arr16( st_ivas->hISMDTX->coh, st_ivas->hISMDTX->coh_fx, Q15, st_ivas->nchan_transport ); + } + } + /*================flt-to-fix===================================*/ +#endif ivas_ism_metadata_sid_enc( st_ivas->hISMDTX, flag_noisy_speech, nchan_ism, st_ivas->nchan_transport, st_ivas->ism_mode, st_ivas->hIsmMetaData, sid_flag, md_diff_flag, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata ); } else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { +#ifdef IVAS_FLOAT_FIXED + /*===============================flt-to-fix=============================================*/ + IF( NE_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || NE_16( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) + { + FOR( int ch = 0; ch < st_ivas->hEncoderConfig->nchan_ism; ch++ ) + { + IF( EQ_16( st_ivas->ism_mode, ISM_MODE_DISC ) || EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + IF( EQ_16( st_ivas->hIsmMetaData[ch]->ism_metadata_flag, 1 ) ) + { + IF( NE_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + st_ivas->hSCE[ch]->hCoreCoder[0]->lp_noise_fx = float_to_fix16( st_ivas->hSCE[ch]->hCoreCoder[0]->lp_noise, Q8 ); + } + IF( st_ivas->hIsmMetaData[ch]->ism_metadata_flag == 0 ) + { + st_ivas->hIsmMetaData[ch]->azimuth_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->azimuth, Q22 ); + st_ivas->hIsmMetaData[ch]->last_true_azimuth_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->last_true_azimuth, Q22 ); + st_ivas->hIsmMetaData[ch]->elevation_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->elevation, Q22 ); + st_ivas->hIsmMetaData[ch]->last_true_elevation_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->last_true_elevation, Q22 ); + st_ivas->hIsmMetaData[ch]->radius_fx = float_to_fix16( st_ivas->hIsmMetaData[ch]->radius, Q9 ); + st_ivas->hIsmMetaData[ch]->last_true_radius_fx = float_to_fix16( st_ivas->hIsmMetaData[ch]->last_true_radius, Q9 ); + } + } + } + } + } + IF( st_ivas->hIsmMetaData != NULL ) + { + FOR( int ch = 0; ch < st_ivas->hEncoderConfig->nchan_ism; ch++ ) + { + st_ivas->hIsmMetaData[ch]->azimuth_fx = floatToFixed( st_ivas->hIsmMetaData[ch]->azimuth, Q22 ); + st_ivas->hIsmMetaData[ch]->elevation_fx = floatToFixed( st_ivas->hIsmMetaData[ch]->elevation, Q22 ); + st_ivas->hIsmMetaData[ch]->yaw_fx = floatToFixed( st_ivas->hIsmMetaData[ch]->yaw, Q22 ); + st_ivas->hIsmMetaData[ch]->pitch_fx = floatToFixed( st_ivas->hIsmMetaData[ch]->pitch, Q22 ); + st_ivas->hIsmMetaData[ch]->radius_fx = float_to_fix16( st_ivas->hIsmMetaData[ch]->radius, Q9 ); + } + } + /*===============================flt-to-fix=============================================*/ + IF( ( error = ivas_ism_metadata_enc( &st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, + nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag, L_negate( ONE_IN_Q8 ), 0, NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*===============================flt-2-fix======================================*/ + IF( st_ivas->hIsmMetaData != NULL ) + { + FOR( int ch = 0; ch < st_ivas->hEncoderConfig->nchan_ism; ch++ ) + { + st_ivas->hIsmMetaData[ch]->last_true_azimuth = fix_to_float( st_ivas->hIsmMetaData[ch]->last_true_azimuth_fx, Q22 ); + st_ivas->hIsmMetaData[ch]->last_true_elevation = fix_to_float( st_ivas->hIsmMetaData[ch]->last_true_elevation_fx, Q22 ); + st_ivas->hIsmMetaData[ch]->last_true_radius = fix16_to_float( st_ivas->hIsmMetaData[ch]->last_true_radius_fx, Q9 ); + } + } + /*===============================fix-2-flt======================================*/ +#else if ( ( error = ivas_ism_metadata_enc( &st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) { return error; } +#endif } else /* ISM_MODE_DISC */ { @@ -285,12 +357,74 @@ ivas_error ivas_ism_enc( } ism_total_brate_ref = ism_total_brate; +#ifdef IVAS_FLOAT_FIXED + IF( st_ivas->hMasa != NULL ) + { + st_ivas->hMasa->data.hOmasaData->lp_noise_CPE_fx = floatToFixed( st_ivas->hMasa->data.hOmasaData->lp_noise_CPE, Q8 ); + } + /*===============================flt-to-fix=============================================*/ + IF( NE_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || NE_16( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) + { + FOR( int ch = 0; ch < st_ivas->hEncoderConfig->nchan_ism; ch++ ) + { + IF( EQ_16( st_ivas->ism_mode, ISM_MODE_DISC ) || EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + IF( EQ_16( st_ivas->hIsmMetaData[ch]->ism_metadata_flag, 1 ) ) + { + IF( NE_16( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + st_ivas->hSCE[ch]->hCoreCoder[0]->lp_noise_fx = float_to_fix16( st_ivas->hSCE[ch]->hCoreCoder[0]->lp_noise, Q8 ); + } + IF( st_ivas->hIsmMetaData[ch]->ism_metadata_flag == 0 ) + { + st_ivas->hIsmMetaData[ch]->azimuth_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->azimuth, Q22 ); + st_ivas->hIsmMetaData[ch]->last_true_azimuth_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->last_true_azimuth, Q22 ); + st_ivas->hIsmMetaData[ch]->elevation_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->elevation, Q22 ); + st_ivas->hIsmMetaData[ch]->last_true_elevation_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->last_true_elevation, Q22 ); + st_ivas->hIsmMetaData[ch]->radius_fx = float_to_fix16( st_ivas->hIsmMetaData[ch]->radius, Q9 ); + st_ivas->hIsmMetaData[ch]->last_true_radius_fx = float_to_fix16( st_ivas->hIsmMetaData[ch]->last_true_radius, Q9 ); + } + } + } + } + } + IF( st_ivas->hIsmMetaData != NULL ) + { + FOR( int ch = 0; ch < st_ivas->hEncoderConfig->nchan_ism; ch++ ) + { + st_ivas->hIsmMetaData[ch]->azimuth_fx = floatToFixed( st_ivas->hIsmMetaData[ch]->azimuth, Q22 ); + st_ivas->hIsmMetaData[ch]->elevation_fx = floatToFixed( st_ivas->hIsmMetaData[ch]->elevation, Q22 ); + st_ivas->hIsmMetaData[ch]->yaw_fx = floatToFixed( st_ivas->hIsmMetaData[ch]->yaw, Q22 ); + st_ivas->hIsmMetaData[ch]->pitch_fx = floatToFixed( st_ivas->hIsmMetaData[ch]->pitch, Q22 ); + st_ivas->hIsmMetaData[ch]->radius_fx = float_to_fix16( st_ivas->hIsmMetaData[ch]->radius, Q9 ); + } + } + /*===============================flt-to-fix=============================================*/ + + IF( ( error = ivas_ism_metadata_enc( &ism_total_brate, nchan_ism, nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, + nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, st_ivas->hMasa != NULL ? st_ivas->hMasa->data.hOmasaData->lp_noise_CPE_fx : 0, flag_omasa_ener_brate, st_ivas->hMasa != NULL ? &( st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt ) : NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + /*===============================flt-2-fix======================================*/ + IF( st_ivas->hIsmMetaData != NULL ) + { + FOR( int ch = 0; ch < st_ivas->hEncoderConfig->nchan_ism; ch++ ) + { + st_ivas->hIsmMetaData[ch]->last_true_azimuth = fix_to_float( st_ivas->hIsmMetaData[ch]->last_true_azimuth_fx, Q22 ); + st_ivas->hIsmMetaData[ch]->last_true_elevation = fix_to_float( st_ivas->hIsmMetaData[ch]->last_true_elevation_fx, Q22 ); + st_ivas->hIsmMetaData[ch]->last_true_radius = fix16_to_float( st_ivas->hIsmMetaData[ch]->last_true_radius_fx, Q9 ); + } + } + /*===============================fix-2-flt======================================*/ +#else if ( ( error = ivas_ism_metadata_enc( &ism_total_brate, nchan_ism, nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, st_ivas->hMasa != NULL ? st_ivas->hMasa->data.hOmasaData->lp_noise_CPE : 0, flag_omasa_ener_brate, st_ivas->hMasa != NULL ? &( st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt ) : NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) { return error; } +#endif if ( st_ivas->hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) { diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 8eaf2d7a0..dd90f0711 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -45,12 +45,15 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" +#include "prot_fx1.h" +#include "prot_fx2.h" +#include "ivas_rom_com_fx.h" +#define IVAS_FLOAT_FIXED_TO_BE_REMOVED #endif #ifdef IVAS_FLOAT_FIXED #include "ivas_rom_com_fx.h" #endif - /*-----------------------------------------------------------------------* * Local constants *-----------------------------------------------------------------------*/ @@ -61,11 +64,14 @@ #define ISM_MAX_ELEVATION_DIFF_IDX ( ISM_ELEVATION_NBITS - 1 /*zero*/ - 1 /*sign*/ ) #define ISM_MAX_RADIUS_DIFF_IDX ( ISM_RADIUS_NBITS - 1 /*zero*/ - 1 /*sign*/ ) -#define ISM_FEC_MAX 10 -#define ISM_MD_FEC_DIFF 10 -#define ISM_MD_INC_DIFF_CNT_MAX 6 -#define ISM_MD_FEC_CNT_MAX 25 -#define ISM_MD_RAD_FEC_DIFF 1 +#define ISM_FEC_MAX 10 +#define ISM_MD_FEC_DIFF 10 +#define ISM_MD_FEC_DIFF_Q22 41943040 +#define ISM_MD_INC_DIFF_CNT_MAX 6 +#define ISM_MD_FEC_CNT_MAX 25 +#define ISM_MD_RAD_FEC_DIFF 1 +#define ISM_MD_RAD_FEC_DIFF_Q9 ONE_IN_Q9 + #define INTER_OBJECT_PARAM_CHECK ( ( ISM_FEC_MAX / 2 ) - 2 ) /* note: constant must be less than (ISM_FEC_MAX / number of coded parameters) */ @@ -83,7 +89,43 @@ static void encode_radius( BSTR_ENC_HANDLE hBstr, int16_t *last_radius_idx, int1 * * Set metadata of one ISM MD handle *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_set_ism_metadata_fx( + ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */ + const Word32 azimuth, /* i : azimuth value */ + const Word32 elevation, /* i : elevation */ + const Word16 radius_meta, /* i : radius */ + const Word32 yaw, /* i : yaw */ + const Word32 pitch, /* i : pitch */ + const Word16 non_diegetic_flag /* i : non-diegetic object flag*/ +) +{ + + IF( hIsmMeta == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hIsmMeta->ism_metadata_flag = 1; + move16(); + + /* save read metadata parameters to the internal codec structure */ + hIsmMeta->azimuth_fx = azimuth; + move32(); + hIsmMeta->elevation_fx = elevation; + move32(); + hIsmMeta->radius_fx = radius_meta; + move16(); + hIsmMeta->yaw_fx = yaw; + move16(); + hIsmMeta->pitch_fx = pitch; + move16(); + hIsmMeta->non_diegetic_flag = non_diegetic_flag; + move16(); + return IVAS_ERR_OK; +} +#else ivas_error ivas_set_ism_metadata( ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */ const float azimuth, /* i : azimuth value */ @@ -111,7 +153,7 @@ ivas_error ivas_set_ism_metadata( return IVAS_ERR_OK; } - +#endif /*-------------------------------------------------------------------------* * rate_ism_importance() @@ -119,6 +161,63 @@ ivas_error ivas_set_ism_metadata( * Rate importance of particular ISM streams *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static void rate_ism_importance( + const Word16 nchan_transport, /* i : number of transported channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ + const Word16 lowrate_metadata_flag[MAX_NUM_OBJECTS], /* i : low-rate MD flag */ + Word16 ism_imp[] /* o : ISM importance flags */ +) +{ + Word16 ch, ctype; + + FOR( ch = 0; ch < nchan_transport; ch++ ) + { + ctype = hSCE[ch]->hCoreCoder[0]->coder_type_raw; + + IF( hSCE[ch]->hCoreCoder[0]->tcxonly ) + { + IF( EQ_16( hSCE[ch]->hCoreCoder[0]->localVAD, 0 ) ) + { + ctype = INACTIVE; + move16(); + } + ELSE IF( EQ_16( ctype, UNVOICED ) ) + { + ctype = GENERIC; + move16(); + } + } + + test(); + test(); + test(); + IF( ( EQ_16( hIsmMeta[ch]->ism_metadata_flag, 0 ) || EQ_16( lowrate_metadata_flag[ch], 1 ) ) && EQ_16( hSCE[ch]->hCoreCoder[0]->localVAD, 0 ) ) + { + ism_imp[ch] = ISM_NO_META; + move16(); + } + ELSE IF( EQ_16( ctype, INACTIVE ) || EQ_16( ctype, UNVOICED ) ) + { + ism_imp[ch] = ISM_LOW_IMP; + move16(); + } + ELSE IF( EQ_16( ctype, VOICED ) ) + { + ism_imp[ch] = ISM_MEDIUM_IMP; + move16(); + } + ELSE /* GENERIC */ + { + ism_imp[ch] = ISM_HIGH_IMP; + move16(); + } + } + + return; +} +#else static void rate_ism_importance( const int16_t nchan_transport, /* i : number of transported channels */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ @@ -165,7 +264,7 @@ static void rate_ism_importance( return; } - +#endif /*-------------------------------------------------------------------------* * ivas_ism_metadata_enc() @@ -175,42 +274,43 @@ static void rate_ism_importance( #ifdef IVAS_FLOAT_FIXED ivas_error ivas_ism_metadata_enc( - int32_t *ism_total_brate, /* i/o: ISM total bitrate */ - const int16_t nchan_ism, /* i : number of ISM channels */ - const int16_t nchan_transport, /* i : number of transport channels */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - int16_t nb_bits_metadata[], /* o : number of metadata bits */ - const int16_t vad_flag[], /* i : VAD flag */ - const int16_t ism_mode, /* i : ISM mode */ - const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Enc Handle */ - const int16_t ism_extended_metadata_flag, /* i : Extended metadata flag */ - const float lp_noise_CPE, - const int16_t flag_omasa_ener_brate, /* i : less bitrate for objects in OMASA flag */ - int16_t *omasa_stereo_sw_cnt, - const int16_t ini_frame ) + Word32 *ism_total_brate, /* i/o: ISM total bitrate */ + const Word16 nchan_ism, /* i : number of ISM channels */ + const Word16 nchan_transport, /* i : number of transport channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + Word16 nb_bits_metadata[], /* o : number of metadata bits */ + const Word16 vad_flag[], /* i : VAD flag */ + const Word16 ism_mode, /* i : ISM mode */ + const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Enc Handle */ + const Word16 ism_extended_metadata_flag, /* i : Extended metadata flag */ + const Word32 lp_noise_CPE_fx, + const Word16 flag_omasa_ener_brate, /* i : less bitrate for objects in OMASA flag */ + Word16 *omasa_stereo_sw_cnt, + const Word16 ini_frame ) { - int16_t i, ch, nb_bits_start = 0; - int16_t flag_abs_azimuth[MAX_NUM_OBJECTS]; - int16_t flag_abs_elevation[MAX_NUM_OBJECTS]; - int16_t idx_angle1_abs = 0; - int16_t idx_angle2_abs = 0; - int16_t flag_abs_yaw[MAX_NUM_OBJECTS]; - int16_t flag_abs_pitch[MAX_NUM_OBJECTS]; - int16_t idx_radius_abs = 0, flag_abs_radius[MAX_NUM_OBJECTS]; - float valQ; -#ifdef IVAS_FLOAT_FIXED + Word16 i, ch, nb_bits_start = 0; + move16(); + Word16 flag_abs_azimuth[MAX_NUM_OBJECTS]; + Word16 flag_abs_elevation[MAX_NUM_OBJECTS]; + Word16 idx_angle1_abs = 0; + move16(); + Word16 idx_angle2_abs = 0; + move16(); + Word16 flag_abs_yaw[MAX_NUM_OBJECTS]; + Word16 flag_abs_pitch[MAX_NUM_OBJECTS]; + Word16 idx_radius_abs = 0, flag_abs_radius[MAX_NUM_OBJECTS]; + move16(); Word32 valQ_fx; -#endif ISM_METADATA_HANDLE hIsmMetaData; int32_t element_brate[MAX_NUM_OBJECTS], total_brate[MAX_NUM_OBJECTS]; - int16_t ism_metadata_flag_global; - int16_t non_diegetic_flag_global; - int16_t ism_imp[MAX_NUM_OBJECTS]; - int16_t null_metadata_flag[MAX_NUM_OBJECTS]; - int16_t lowrate_metadata_flag[MAX_NUM_OBJECTS]; - int16_t nbands, nblocks; + Word16 ism_metadata_flag_global; + Word16 non_diegetic_flag_global; + Word16 ism_imp[MAX_NUM_OBJECTS]; + Word16 null_metadata_flag[MAX_NUM_OBJECTS]; + Word16 lowrate_metadata_flag[MAX_NUM_OBJECTS]; + Word16 nbands, nblocks; ivas_error error; error = IVAS_ERR_OK; @@ -219,6 +319,8 @@ ivas_error ivas_ism_metadata_enc( /* initialization */ ism_metadata_flag_global = 0; non_diegetic_flag_global = 0; + move16(); + move16(); set_s( nb_bits_metadata, 0, nchan_transport ); set_s( flag_abs_azimuth, 0, nchan_ism ); set_s( flag_abs_elevation, 0, nchan_ism ); @@ -228,69 +330,82 @@ ivas_error ivas_ism_metadata_enc( set_s( null_metadata_flag, 0, nchan_ism ); set_s( lowrate_metadata_flag, 0, nchan_ism ); - if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + test(); + + IF( EQ_16( ism_mode, ISM_MASA_MODE_DISC ) || EQ_16( ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) { /*----------------------------------------------------------------* * Rate importance of particular ISM streams in combined format coding *----------------------------------------------------------------*/ - - ivas_set_ism_importance_interformat( *ism_total_brate, nchan_transport, hIsmMeta, hSCE, lp_noise_CPE, ism_imp ); + ivas_set_ism_importance_interformat_fx( *ism_total_brate, nchan_transport, hIsmMeta, hSCE, lp_noise_CPE_fx, ism_imp ); } - else + ELSE { /*----------------------------------------------------------------* * Set Metadata presence / importance flag *----------------------------------------------------------------*/ - for ( ch = 0; ch < nchan_ism; ch++ ) + FOR( ch = 0; ch < nchan_ism; ch++ ) { - if ( ism_mode == ISM_MODE_PARAM ) + test(); + test(); + IF( EQ_16( ism_mode, ISM_MODE_PARAM ) ) { hIsmMeta[ch]->ism_metadata_flag = 1; + move16(); } - else if ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_SBA_MODE_DISC ) + ELSE IF( EQ_16( ism_mode, ISM_MODE_DISC ) || EQ_16( ism_mode, ISM_MASA_MODE_DISC ) || EQ_16( ism_mode, ISM_SBA_MODE_DISC ) ) { null_metadata_flag[ch] = !hIsmMeta[ch]->ism_metadata_flag; + move16(); - if ( hIsmMeta[ch]->ism_metadata_flag == 1 ) + IF( EQ_16( hIsmMeta[ch]->ism_metadata_flag, 1 ) ) { - if ( ism_mode != ISM_SBA_MODE_DISC ) + IF( NE_16( ism_mode, ISM_SBA_MODE_DISC ) ) { /* In case of low level noise for low bitrate inactive frames, do not sent metadata */ - hIsmMeta[ch]->ism_metadata_flag = vad_flag[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10 || hSCE[ch]->hCoreCoder[0]->tcxonly; + hIsmMeta[ch]->ism_metadata_flag = vad_flag[ch] || GT_16( hSCE[ch]->hCoreCoder[0]->lp_noise_fx, 2560 /*10 Q8*/ ) || hSCE[ch]->hCoreCoder[0]->tcxonly; + move16(); } /* in inactive frames, send MD 1) in ISM_MD_INC_DIFF_CNT_MAX consecutive frames when MD significantly change, 2) at least every ISM_MD_FEC_DIFF frames */ - if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) + IF( hIsmMeta[ch]->ism_metadata_flag == 0 ) { - if ( ( fabsf( hIsmMeta[ch]->azimuth - hIsmMeta[ch]->last_true_azimuth ) > ISM_MD_FEC_DIFF ) || - ( fabsf( hIsmMeta[ch]->elevation - hIsmMeta[ch]->last_true_elevation ) > ISM_MD_FEC_DIFF ) || ( fabsf( hIsmMeta[ch]->radius - hIsmMeta[ch]->last_true_radius ) > ISM_MD_RAD_FEC_DIFF ) ) + test(); + test(); + IF( ( GT_32( L_abs( L_sub( hIsmMeta[ch]->azimuth_fx, hIsmMeta[ch]->last_true_azimuth_fx ) ), ISM_MD_FEC_DIFF_Q22 ) ) || + ( GT_32( L_abs( L_sub( hIsmMeta[ch]->elevation_fx, hIsmMeta[ch]->last_true_elevation_fx ) ), ISM_MD_FEC_DIFF_Q22 ) ) || ( GT_16( abs_s( sub( hIsmMeta[ch]->radius_fx, hIsmMeta[ch]->last_true_radius_fx ) ), ISM_MD_RAD_FEC_DIFF_Q9 ) ) ) { lowrate_metadata_flag[ch] = 1; + move16(); hIsmMeta[ch]->ism_md_inc_diff_cnt = 0; + move16(); } - else if ( hIsmMeta[ch]->ism_md_inc_diff_cnt < ISM_MD_INC_DIFF_CNT_MAX ) + ELSE IF( LT_16( hIsmMeta[ch]->ism_md_inc_diff_cnt, ISM_MD_INC_DIFF_CNT_MAX ) ) { lowrate_metadata_flag[ch] = 1; - - if ( hIsmMeta[ch]->ism_md_inc_diff_cnt % 2 == 0 ) + move16(); + IF( hIsmMeta[ch]->ism_md_inc_diff_cnt % 2 == 0 ) { hIsmMeta[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; + move16(); } - else + ELSE { hIsmMeta[ch]->position_angle.angle2_diff_cnt = ISM_FEC_MAX; + move16(); } } - else if ( hIsmMeta[ch]->ism_md_fec_cnt_enc == ISM_MD_FEC_CNT_MAX ) + ELSE IF( EQ_16( hIsmMeta[ch]->ism_md_fec_cnt_enc, ISM_MD_FEC_CNT_MAX ) ) { lowrate_metadata_flag[ch] = 1; - + move16(); hIsmMeta[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; + move16(); } } } @@ -301,7 +416,7 @@ ivas_error ivas_ism_metadata_enc( * Rate importance of particular ISM streams *----------------------------------------------------------------*/ - if ( ism_mode != ISM_SBA_MODE_DISC ) + IF( NE_16( ism_mode, ISM_SBA_MODE_DISC ) ) { rate_ism_importance( nchan_transport, hIsmMeta, hSCE, lowrate_metadata_flag, ism_imp ); } @@ -310,18 +425,19 @@ ivas_error ivas_ism_metadata_enc( /*----------------------------------------------------------------* * Write ISM common signaling *----------------------------------------------------------------*/ - - if ( ism_mode != ISM_MASA_MODE_DISC && ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ && ism_mode != ISM_SBA_MODE_DISC ) + test(); + test(); + IF( NE_16( ism_mode, ISM_MASA_MODE_DISC ) && NE_16( ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) && NE_16( ism_mode, ISM_SBA_MODE_DISC ) ) { /* write number of objects - unary coding */ - for ( ch = 1; ch < nchan_ism; ch++ ) + FOR( ch = 1; ch < nchan_ism; ch++ ) { push_indice( hBstr, IND_ISM_NUM_OBJECTS, 1, 1 ); } push_indice( hBstr, IND_ISM_NUM_OBJECTS, 0, 1 ); } - for ( ch = 0; ch < nchan_ism; ch++ ) + FOR( ch = 0; ch < nchan_ism; ch++ ) { ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; ism_metadata_flag_global |= lowrate_metadata_flag[ch]; @@ -329,50 +445,56 @@ ivas_error ivas_ism_metadata_enc( } /* write extended metadata presence flag */ - if ( ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_SBA_MODE_DISC ) && *ism_total_brate >= ISM_EXTENDED_METADATA_BRATE ) + test(); + test(); + IF( ( EQ_16( ism_mode, ISM_MODE_DISC ) || EQ_16( ism_mode, ISM_SBA_MODE_DISC ) ) && GE_32( *ism_total_brate, ISM_EXTENDED_METADATA_BRATE ) ) { push_indice( hBstr, IND_ISM_EXTENDED_FLAG, ism_extended_metadata_flag, ISM_EXTENDED_METADATA_BITS ); /* Write global non-diegetic object flag */ - if ( ism_extended_metadata_flag ) + IF( ism_extended_metadata_flag ) { push_indice( hBstr, IND_ISM_EXTENDED_NDP_FLAG, non_diegetic_flag_global, ISM_EXTENDED_METADATA_BITS ); } } /* write ISM metadata flag (one per object) */ - for ( ch = 0; ch < nchan_transport; ch++ ) + FOR( ch = 0; ch < nchan_transport; ch++ ) { - if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + test(); + IF( EQ_16( ism_mode, ISM_MASA_MODE_DISC ) || EQ_16( ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) { /* flags will be written in ivas_masa_encode() */ hIsmMeta[ch]->ism_imp = ism_imp[ch]; + move16(); hIsmMeta[ch]->ism_md_null_flag = null_metadata_flag[ch]; + move16(); hIsmMeta[ch]->ism_md_lowrate_flag = lowrate_metadata_flag[ch]; + move16(); } - else + ELSE { - if ( null_metadata_flag[ch] ) + IF( null_metadata_flag[ch] ) { /* signal NULL metadata frame */ push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 1, ISM_METADATA_MD_FLAG_BITS ); /* write the ISM class to ISM_NO_META and again the true ISM class */ - if ( ism_mode != ISM_SBA_MODE_DISC ) + IF( NE_16( ism_mode, ISM_SBA_MODE_DISC ) ) { push_indice( hBstr, IND_ISM_METADATA_FLAG, ISM_NO_META, ISM_METADATA_FLAG_BITS ); push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); } - else + ELSE { push_indice( hBstr, IND_ISM_METADATA_FLAG, ISM_NO_META, 1 ); } } - else if ( ism_mode != ISM_SBA_MODE_DISC ) + ELSE IF( NE_16( ism_mode, ISM_SBA_MODE_DISC ) ) { push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); - if ( ism_imp[ch] == ISM_NO_META ) + IF( EQ_16( ism_imp[ch], ISM_NO_META ) ) { /* signal low-rate ISM_NO_META frame */ push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 0, ISM_METADATA_MD_FLAG_BITS ); @@ -381,7 +503,7 @@ ivas_error ivas_ism_metadata_enc( push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, lowrate_metadata_flag[ch], ISM_METADATA_INACTIVE_FLAG_BITS ); } } - else /*ism_mode == ISM_SBA_MODE_DISC*/ + ELSE /*ism_mode == ISM_SBA_MODE_DISC*/ { /* all objects are considered active*/ push_indice( hBstr, IND_ISM_METADATA_FLAG, 1, 1 ); @@ -390,129 +512,134 @@ ivas_error ivas_ism_metadata_enc( } - if ( ism_metadata_flag_global ) + IF( ism_metadata_flag_global ) { /*----------------------------------------------------------------* * Metadata quantization and coding, loop over all objects *----------------------------------------------------------------*/ - int16_t total_bits_metadata = 0; - int16_t bits_metadata_ism = 0; - int16_t nb_bits_objcod_written; + Word16 total_bits_metadata = 0; + move16(); + Word16 bits_metadata_ism = 0; + move16(); + Word16 nb_bits_objcod_written; - if ( ism_mode == ISM_MODE_PARAM ) + IF( EQ_16( ism_mode, ISM_MODE_PARAM ) ) { nb_bits_start = hBstr->nb_bits_tot; + move16(); } - for ( ch = 0; ch < nchan_ism; ch++ ) + FOR( ch = 0; ch < nchan_ism; ch++ ) { hIsmMetaData = hIsmMeta[ch]; - if ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || ism_mode == ISM_SBA_MODE_DISC ) + test(); + test(); + test(); + IF( EQ_16( ism_mode, ISM_MODE_DISC ) || EQ_16( ism_mode, ISM_MASA_MODE_DISC ) || EQ_16( ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_16( ism_mode, ISM_SBA_MODE_DISC ) ) { nb_bits_start = hBstr->nb_bits_tot; + move16(); } - - if ( hIsmMeta[ch]->ism_metadata_flag || lowrate_metadata_flag[ch] ) + test(); + IF( hIsmMeta[ch]->ism_metadata_flag || lowrate_metadata_flag[ch] ) { /*----------------------------------------------------------------* * Quantize and encode azimuth and elevation *----------------------------------------------------------------*/ - - if ( ism_extended_metadata_flag && non_diegetic_flag_global ) + test(); + IF( ism_extended_metadata_flag && non_diegetic_flag_global ) { /* Write non-diegetic flag for each object */ push_indice( hBstr, IND_ISM_NDP_FLAG, hIsmMeta[ch]->non_diegetic_flag, ISM_METADATA_IS_NDP_BITS ); } - - if ( hIsmMeta[ch]->non_diegetic_flag && ism_extended_metadata_flag ) + test(); + IF( hIsmMeta[ch]->non_diegetic_flag && ism_extended_metadata_flag ) { /* Map azimuth to panning range [-90:90] */ - if ( hIsmMetaData->azimuth > 90.0f ) + IF( GT_32( hIsmMetaData->azimuth_fx, 377487360 /*90.0f Q22*/ ) ) { - hIsmMetaData->azimuth = 180.0f - hIsmMetaData->azimuth; + hIsmMetaData->azimuth_fx = L_sub( 754974720 /*180.0f Q22*/, hIsmMetaData->azimuth_fx ); + move32(); } - if ( hIsmMetaData->azimuth < -90.0f ) + IF( LT_32( hIsmMetaData->azimuth_fx, L_negate( 377487360 ) ) ) { - hIsmMetaData->azimuth = -180.0f - hIsmMetaData->azimuth; + hIsmMetaData->azimuth_fx = L_sub( L_negate( 754974720 ), hIsmMetaData->azimuth_fx ); + move32(); } #ifdef IVAS_FLOAT_FIXED - /*===============================flt-2-fix======================================*/ - hIsmMetaData->azimuth_fx = floatToFixed( hIsmMetaData->azimuth, Q22 ); - /*===============================flt-2-fix======================================*/ idx_angle1_abs = ism_quant_meta_fx( hIsmMetaData->azimuth_fx, &valQ_fx, ism_azimuth_borders_fx, ISM_Q_STEP_FX, ISM_Q_STEP_BORDER_FX, 1 << ISM_AZIMUTH_NBITS ); - /*===============================fix-2-flt======================================*/ - valQ = fixedToFloat( valQ_fx, Q22 ); - /*===============================fix-2-flt======================================*/ #else idx_angle1_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); #endif encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, 0, &flag_abs_azimuth[ch], NULL ); } - else + ELSE { - if ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || ism_mode == ISM_SBA_MODE_DISC ) + test(); + test(); + test(); + IF( EQ_16( ism_mode, ISM_MODE_DISC ) || EQ_16( ism_mode, ISM_MASA_MODE_DISC ) || EQ_16( ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_16( ism_mode, ISM_SBA_MODE_DISC ) ) { #ifdef IVAS_FLOAT_FIXED - /*===============================flt-2-fix======================================*/ - hIsmMetaData->azimuth_fx = floatToFixed( hIsmMetaData->azimuth, Q22 ); - hIsmMetaData->elevation_fx = floatToFixed( hIsmMetaData->elevation, Q22 ); - /*===============================flt-2-fix======================================*/ idx_angle1_abs = ism_quant_meta_fx( hIsmMetaData->azimuth_fx, &valQ_fx, ism_azimuth_borders_fx, ISM_Q_STEP_FX, ISM_Q_STEP_BORDER_FX, 1 << ISM_AZIMUTH_NBITS ); idx_angle2_abs = ism_quant_meta_fx( hIsmMetaData->elevation_fx, &valQ_fx, ism_elevation_borders_fx, ISM_Q_STEP_FX, ISM_Q_STEP_BORDER_FX, 1 << ISM_ELEVATION_NBITS ); - /*===============================fix-2-flt======================================*/ - valQ = fixedToFloat( valQ_fx, Q22 ); - /*===============================fix-2-flt======================================*/ + // valQ = fixedToFloat( valQ_fx, Q22 ); #else idx_angle1_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); idx_angle2_abs = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); #endif } - else /* ISM_MODE_PARAM */ + ELSE /* ISM_MODE_PARAM */ { idx_angle1_abs = hParamIsm->azi_index[ch]; + move16(); idx_angle2_abs = hParamIsm->ele_index[ch]; + move16(); } encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch] ); - /*----------------------------------------------------------------* * Quantize and encode radius, yaw, and pitch *----------------------------------------------------------------*/ - if ( ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_SBA_MODE_DISC ) && ism_extended_metadata_flag ) + test(); + test(); + IF( ( EQ_16( ism_mode, ISM_MODE_DISC ) || EQ_16( ism_mode, ISM_SBA_MODE_DISC ) ) && ism_extended_metadata_flag ) { #ifdef IVAS_FLOAT_FIXED - /*===============================flt-2-fix======================================*/ - hIsmMetaData->yaw_fx = floatToFixed( hIsmMetaData->yaw, Q22 ); - hIsmMetaData->pitch_fx = floatToFixed( hIsmMetaData->pitch, Q22 ); - /*===============================flt-2-fix======================================*/ idx_angle1_abs = ism_quant_meta_fx( hIsmMetaData->yaw_fx, &valQ_fx, ism_azimuth_borders_fx, ISM_Q_STEP_FX, ISM_Q_STEP_BORDER_FX, 1 << ISM_AZIMUTH_NBITS ); idx_angle2_abs = ism_quant_meta_fx( hIsmMetaData->pitch_fx, &valQ_fx, ism_elevation_borders_fx, ISM_Q_STEP_FX, ISM_Q_STEP_BORDER_FX, 1 << ISM_ELEVATION_NBITS ); - /*===============================fix-2-flt======================================*/ - valQ = fixedToFloat( valQ_fx, Q22 ); - /*===============================fix-2-flt======================================*/ + Word16 valQ_fx_tmp = extract_h( valQ_fx ); // 22 - 16 = 6 + idx_radius_abs = usquant_fx( hIsmMetaData->radius_fx, &valQ_fx_tmp, ISM_RADIUS_MIN_Q9, ISM_RADIUS_DELTA_Q8, 1 << ISM_RADIUS_NBITS ); + valQ_fx = L_shr( L_deposit_h( valQ_fx_tmp ), 3 ); // Q22 + // valQ = fixedToFloat( valQ_fx, Q22 ); #else idx_angle1_abs = ism_quant_meta( hIsmMetaData->yaw, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); idx_angle2_abs = ism_quant_meta( hIsmMetaData->pitch, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); -#endif idx_radius_abs = usquant( hIsmMetaData->radius, &valQ, ISM_RADIUS_MIN, ISM_RADIUS_DELTA, 1 << ISM_RADIUS_NBITS ); - +#endif encode_angle_indices( hBstr, &( hIsmMetaData->orientation_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_yaw[ch], &flag_abs_pitch[ch] ); encode_radius( hBstr, &hIsmMetaData->last_radius_idx, &hIsmMetaData->radius_diff_cnt, hIsmMetaData->last_ism_metadata_flag, idx_radius_abs, &flag_abs_radius[ch] ); } } /* save number of metadata bits written */ - if ( ism_mode == ISM_MODE_DISC || ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || ism_mode == ISM_SBA_MODE_DISC ) + test(); + test(); + test(); + IF( EQ_16( ism_mode, ISM_MODE_DISC ) || EQ_16( ism_mode, ISM_MASA_MODE_DISC ) || EQ_16( ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_16( ism_mode, ISM_SBA_MODE_DISC ) ) { nb_bits_metadata[ch] = hBstr->nb_bits_tot - nb_bits_start; } /* Updates */ - hIsmMeta[ch]->last_true_azimuth = hIsmMeta[ch]->azimuth; - hIsmMeta[ch]->last_true_elevation = hIsmMeta[ch]->elevation; - hIsmMeta[ch]->last_true_radius = hIsmMeta[ch]->radius; + hIsmMeta[ch]->last_true_azimuth_fx = hIsmMeta[ch]->azimuth_fx; + move32(); + hIsmMeta[ch]->last_true_elevation_fx = hIsmMeta[ch]->elevation_fx; + move32(); + hIsmMeta[ch]->last_true_radius_fx = hIsmMeta[ch]->radius_fx; + move16(); } } @@ -522,61 +649,64 @@ ivas_error ivas_ism_metadata_enc( *----------------------------------------------------------------*/ i = 0; - while ( i == 0 || i < nchan_ism / INTER_OBJECT_PARAM_CHECK ) + WHILE( i == 0 || i < nchan_ism / INTER_OBJECT_PARAM_CHECK ) { - int16_t num, abs_num, abs_first, abs_next, pos_zero; - int16_t abs_matrice[INTER_OBJECT_PARAM_CHECK * ISM_NUM_PARAM]; + Word16 num, abs_num, abs_first, abs_next, pos_zero; + Word16 abs_matrice[INTER_OBJECT_PARAM_CHECK * ISM_NUM_PARAM]; num = min( INTER_OBJECT_PARAM_CHECK, nchan_ism - i * INTER_OBJECT_PARAM_CHECK ); i++; set_s( abs_matrice, 0, INTER_OBJECT_PARAM_CHECK * ISM_NUM_PARAM ); - for ( ch = 0; ch < num; ch++ ) + FOR( ch = 0; ch < num; ch++ ) { - if ( flag_abs_azimuth[ch] == 1 ) + IF( EQ_16( flag_abs_azimuth[ch], 1 ) ) { abs_matrice[ch * ISM_NUM_PARAM] = 1; + move16(); } - if ( flag_abs_elevation[ch] == 1 ) + IF( EQ_16( flag_abs_elevation[ch], 1 ) ) { abs_matrice[ch * ISM_NUM_PARAM + 1] = 1; + move16(); } } abs_num = sum_s( abs_matrice, INTER_OBJECT_PARAM_CHECK * ISM_NUM_PARAM ); abs_first = 0; - while ( abs_num > 1 ) + move16(); + WHILE( GT_16( abs_num, 1 ) ) { /* find first "1" entry */ - while ( abs_matrice[abs_first] == 0 ) + WHILE( abs_matrice[abs_first] == 0 ) { abs_first++; } /* find next "1" entry */ abs_next = abs_first + 1; - while ( abs_matrice[abs_next] == 0 ) + WHILE( abs_matrice[abs_next] == 0 ) { abs_next++; } /* find "0" position */ pos_zero = 0; - while ( abs_matrice[pos_zero] == 1 ) + WHILE( abs_matrice[pos_zero] == 1 ) { pos_zero++; } ch = abs_next / ISM_NUM_PARAM; - if ( abs_next % ISM_NUM_PARAM == 0 ) + IF( abs_next % ISM_NUM_PARAM == 0 ) { hIsmMeta[ch]->position_angle.angle1_diff_cnt = abs_num - 1; } - if ( abs_next % ISM_NUM_PARAM == 1 ) + IF( abs_next % ISM_NUM_PARAM == 1 ) { hIsmMeta[ch]->position_angle.angle2_diff_cnt = abs_num - 1; /*hIsmMeta[ch]->elevation_diff_cnt = min( hIsmMeta[ch]->elevation_diff_cnt, ISM_FEC_MAX );*/ @@ -587,22 +717,23 @@ ivas_error ivas_ism_metadata_enc( } } - if ( ism_mode == ISM_SBA_MODE_DISC ) + IF( EQ_16( ism_mode, ISM_SBA_MODE_DISC ) ) { - int16_t md_diff_flag[MAX_NUM_OBJECTS]; + Word16 md_diff_flag[MAX_NUM_OBJECTS]; set_s( md_diff_flag, 1, nchan_ism ); - for ( ch = 0; ch < nchan_ism; ch++ ) + FOR( ch = 0; ch < nchan_ism; ch++ ) { hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; - if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) + IF( hIsmMeta[ch]->ism_metadata_flag == 0 ) { hIsmMeta[ch]->ism_md_fec_cnt_enc++; } - else + ELSE { hIsmMeta[ch]->ism_md_fec_cnt_enc = 0; + move16(); } hIsmMeta[ch]->ism_md_inc_diff_cnt++; hIsmMeta[ch]->ism_md_inc_diff_cnt = min( hIsmMeta[ch]->ism_md_inc_diff_cnt, ISM_MD_INC_DIFF_CNT_MAX ); @@ -613,18 +744,18 @@ ivas_error ivas_ism_metadata_enc( pop_wmops(); return error; } - if ( ism_mode == ISM_MODE_PARAM ) + IF( EQ_16( ism_mode, ISM_MODE_PARAM ) ) { /* Keep the metdata transmission as is during active parts */ /* But send the flag with 1 bit */ push_next_indice( hBstr, hParamIsm->flag_noisy_speech, 1 ); /* Loop over multiwave to write the object indices into bitstream */ - for ( ch = 0; ch < MAX_PARAM_ISM_WAVE; ch++ ) + FOR( ch = 0; ch < MAX_PARAM_ISM_WAVE; ch++ ) { - for ( nbands = 0; nbands < hParamIsm->nbands; nbands++ ) + FOR( nbands = 0; nbands < hParamIsm->nbands; nbands++ ) { - for ( nblocks = 0; nblocks < hParamIsm->nblocks[nbands]; nblocks++ ) + FOR( nblocks = 0; nblocks < hParamIsm->nblocks[nbands]; nblocks++ ) { push_next_indice( hBstr, hParamIsm->obj_indices[nbands][nblocks][ch], PARAM_ISM_OBJ_IND_NBITS ); } @@ -632,29 +763,29 @@ ivas_error ivas_ism_metadata_enc( } /* Loop over bands to write the power ratio's indices into bitstream */ - for ( nbands = 0; nbands < hParamIsm->nbands; nbands++ ) + FOR( nbands = 0; nbands < hParamIsm->nbands; nbands++ ) { - for ( nblocks = 0; nblocks < hParamIsm->nblocks[nbands]; nblocks++ ) + FOR( nblocks = 0; nblocks < hParamIsm->nblocks[nbands]; nblocks++ ) { push_next_indice( hBstr, hParamIsm->power_ratios_idx[nbands][nblocks], PARAM_ISM_POW_RATIO_NBITS ); } } /* total metadata bits */ - total_bits_metadata = hBstr->nb_bits_tot - nb_bits_start; + total_bits_metadata = sub( hBstr->nb_bits_tot, nb_bits_start ); /* bits per ISM*/ - bits_metadata_ism = (int16_t) ( total_bits_metadata / nchan_transport ); + bits_metadata_ism = (Word16) ( total_bits_metadata / nchan_transport ); /* Divide the metadata bits into n_Isms*/ nb_bits_objcod_written = 0; - for ( ch = 0; ch < nchan_transport; ch++ ) + FOR( ch = 0; ch < nchan_transport; ch++ ) { - if ( ch == nchan_transport - 1 ) + IF( EQ_16( ch, sub( nchan_transport, 1 ) ) ) { nb_bits_metadata[ch] = total_bits_metadata - nb_bits_objcod_written; } - else + ELSE { nb_bits_metadata[ch] = bits_metadata_ism; nb_bits_objcod_written += bits_metadata_ism; @@ -662,7 +793,7 @@ ivas_error ivas_ism_metadata_enc( } } } - else if ( ism_mode == ISM_SBA_MODE_DISC ) + ELSE IF( EQ_16( ism_mode, ISM_SBA_MODE_DISC ) ) { pop_wmops(); return error; @@ -671,12 +802,12 @@ ivas_error ivas_ism_metadata_enc( /*----------------------------------------------------------------* * Take into account the combined format bit-budget distribution *----------------------------------------------------------------*/ - - if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + test(); + IF( EQ_16( ism_mode, ISM_MASA_MODE_DISC ) || EQ_16( ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) { - int16_t bits_ism, bits_element[MAX_NUM_OBJECTS]; - int16_t brate_limit_flag; - int32_t ism_total_brate_ref; + Word16 bits_ism, bits_element[MAX_NUM_OBJECTS]; + Word16 brate_limit_flag; + Word32 ism_total_brate_ref; ism_total_brate_ref = *ism_total_brate; #ifndef IVAS_FLOAT_FIXED brate_limit_flag = calculate_brate_limit_flag( ism_imp, nchan_ism ); @@ -684,44 +815,44 @@ ivas_error ivas_ism_metadata_enc( brate_limit_flag = calculate_brate_limit_flag_fx( ism_imp, nchan_ism ); #endif - bits_ism = (int16_t) ( *ism_total_brate / FRAMES_PER_SEC ); + bits_ism = (Word16) ( *ism_total_brate / FRAMES_PER_SEC ); set_s( bits_element, bits_ism / nchan_ism, nchan_ism ); bits_element[nchan_ism - 1] += bits_ism % nchan_ism; bitbudget_to_brate( bits_element, element_brate, nchan_ism ); *ism_total_brate = 0; - for ( ch = 0; ch < nchan_ism; ch++ ) + FOR( ch = 0; ch < nchan_ism; ch++ ) { #ifndef IVAS_FLOAT_FIXED *ism_total_brate += ivas_interformat_brate( ism_mode, nchan_ism, hSCE[ch]->element_brate, ism_imp[ch], brate_limit_flag ); #else *ism_total_brate = L_add( *ism_total_brate, ivas_interformat_brate_fx( ism_mode, nchan_ism, hSCE[ch]->element_brate, ism_imp[ch], brate_limit_flag ) ); - move32(); #endif - - if ( ism_imp[ch] > 1 && flag_omasa_ener_brate == 1 && brate_limit_flag >= 0 ) + IF( GT_16( ism_imp[ch], 1 ) && EQ_16( flag_omasa_ener_brate, 1 ) && brate_limit_flag >= 0 ) { *ism_total_brate -= ADJUST_ISM_BRATE_NEG; } - if ( brate_limit_flag == -1 && ism_imp[ch] >= 1 && nchan_ism >= 3 && ( ism_total_brate_ref - *ism_total_brate > IVAS_48k ) ) + IF( EQ_16( brate_limit_flag, -1 ) && GE_16( ism_imp[ch], 1 ) && GE_16( nchan_ism, 3 ) && ( GT_32( L_sub( ism_total_brate_ref, *ism_total_brate ), IVAS_48k ) ) ) { *ism_total_brate += ADJUST_ISM_BRATE_POS; } } ism_metadata_flag_global = 1; + move16(); - if ( ism_mode == ISM_MASA_MODE_DISC ) + IF( EQ_16( ism_mode, ISM_MASA_MODE_DISC ) ) { brate_limit_flag = 0; - for ( int16_t n = 0; n < nchan_ism; n++ ) + FOR( Word16 n = 0; n < nchan_ism; n++ ) { brate_limit_flag += ism_imp[n]; } - if ( brate_limit_flag >= nchan_ism * ISM_HIGH_IMP - 2 ) + IF( brate_limit_flag >= nchan_ism * ISM_HIGH_IMP - 2 ) { *omasa_stereo_sw_cnt = OMASA_STEREO_SW_CNT_MAX; + move16(); } } } @@ -730,62 +861,69 @@ ivas_error ivas_ism_metadata_enc( * Configuration and decision about bitrates per channel *----------------------------------------------------------------*/ - if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + IF( EQ_16( ism_mode, ISM_MASA_MODE_DISC ) || EQ_16( ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) { - if ( ( error = ivas_ism_config( *ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, null_metadata_flag, ism_imp, element_brate, total_brate, nb_bits_metadata, 1 ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_ism_config( *ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, null_metadata_flag, ism_imp, element_brate, total_brate, nb_bits_metadata, 1 ) ) != IVAS_ERR_OK ) { return error; } } - else + ELSE { - if ( ( error = ivas_ism_config( *ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, null_metadata_flag, ism_imp, element_brate, total_brate, nb_bits_metadata, 0 ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_ism_config( *ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, null_metadata_flag, ism_imp, element_brate, total_brate, nb_bits_metadata, 0 ) ) != IVAS_ERR_OK ) { return error; } } - for ( ch = 0; ch < nchan_ism; ch++ ) + FOR( ch = 0; ch < nchan_ism; ch++ ) { hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; + move16(); - if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) + IF( hIsmMeta[ch]->ism_metadata_flag == 0 ) { hIsmMeta[ch]->ism_md_fec_cnt_enc++; } - else + ELSE { hIsmMeta[ch]->ism_md_fec_cnt_enc = 0; + move16(); } hIsmMeta[ch]->ism_md_inc_diff_cnt++; - hIsmMeta[ch]->ism_md_inc_diff_cnt = min( hIsmMeta[ch]->ism_md_inc_diff_cnt, ISM_MD_INC_DIFF_CNT_MAX ); + hIsmMeta[ch]->ism_md_inc_diff_cnt = s_min( hIsmMeta[ch]->ism_md_inc_diff_cnt, ISM_MD_INC_DIFF_CNT_MAX ); } - for ( ch = 0; ch < nchan_transport; ch++ ) + FOR( ch = 0; ch < nchan_transport; ch++ ) { hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; - if ( ism_mode == ISM_MODE_DISC ) + move16(); + IF( EQ_16( ism_mode, ISM_MODE_DISC ) ) { - if ( ism_imp[ch] == ISM_NO_META && ( ( total_brate[ch] < ACELP_8k00 && element_brate[ch] < SCE_CORE_16k_LOW_LIMIT ) || - ( total_brate[ch] <= ACELP_16k_LOW_LIMIT && element_brate[ch] >= SCE_CORE_16k_LOW_LIMIT ) ) ) + IF( EQ_16( ism_imp[ch], ISM_NO_META ) && ( ( LT_32( total_brate[ch], ACELP_8k00 ) && LT_32( element_brate[ch], SCE_CORE_16k_LOW_LIMIT ) ) || + ( LE_32( total_brate[ch], ACELP_16k_LOW_LIMIT ) && GE_32( element_brate[ch], SCE_CORE_16k_LOW_LIMIT ) ) ) ) { hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1; + move16(); } hSCE[ch]->element_brate = element_brate[ch]; + move32(); } - else if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + ELSE IF( EQ_16( ism_mode, ISM_MASA_MODE_DISC ) || EQ_16( ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) { - if ( ism_imp[ch] == ISM_INACTIVE_IMP ) + IF( EQ_16( ism_imp[ch], ISM_INACTIVE_IMP ) ) { hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1; + move16(); } } hSCE[ch]->hCoreCoder[0]->total_brate = total_brate[ch]; + move32(); /* write metadata only in active frames */ - if ( hSCE[0]->hCoreCoder[0]->core_brate > SID_2k40 ) + IF( GT_32( hSCE[0]->hCoreCoder[0]->core_brate, SID_2k40 ) ) { reset_indices_enc( hSCE[ch]->hMetaData, hSCE[ch]->hMetaData->nb_ind_tot ); } @@ -1374,24 +1512,25 @@ ivas_error ivas_ism_metadata_enc( } #endif - /*------------------------------------------------------------------------- * ivas_ism_metadata_enc_create() * * Create, allocate, initialize and configure IVAS encoder ISM metadata handles *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED ivas_error ivas_ism_metadata_enc_create( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const int16_t n_ISms, /* i : number of objects */ - int32_t element_brate_tmp[] /* o : element bitrate per object */ + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t n_ISms, /* i : number of objects */ + Word32 element_brate_tmp[] /* o : element bitrate per object */ ) { - int16_t ch, nchan_transport; + Word16 ch, nchan_transport; ivas_error error; nchan_transport = st_ivas->nchan_transport; - if ( st_ivas->hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) + move16(); + IF( st_ivas->hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) { nchan_transport = MAX_PARAM_ISM_WAVE; #ifndef IVAS_FLOAT_FIXED @@ -1400,65 +1539,97 @@ ivas_error ivas_ism_metadata_enc_create( ivas_set_omasa_TC_fx( st_ivas->ism_mode, n_ISms, &st_ivas->nSCE, &st_ivas->nCPE ); #endif } - else if ( st_ivas->hEncoderConfig->ivas_format == SBA_ISM_FORMAT ) + ELSE IF( st_ivas->hEncoderConfig->ivas_format == SBA_ISM_FORMAT ) { nchan_transport = n_ISms; } - else + ELSE { - if ( st_ivas->ism_mode == ISM_MODE_NONE ) + IF( st_ivas->ism_mode == ISM_MODE_NONE ) { nchan_transport = st_ivas->nchan_transport; + move16(); - if ( nchan_transport == 1 ) + IF( nchan_transport == 1 ) { st_ivas->nSCE = 1; + move16(); st_ivas->nCPE = 0; + move16(); } - else + ELSE { st_ivas->nSCE = 0; + move16(); st_ivas->nCPE = 1; + move16(); } } - else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + ELSE IF( st_ivas->ism_mode == ISM_MODE_PARAM ) { nchan_transport = 2; + move16(); } - else + ELSE { nchan_transport = n_ISms; + move16(); } st_ivas->nchan_transport = nchan_transport; st_ivas->nSCE = nchan_transport; st_ivas->nCPE = 0; + move16(); + move16(); + move16(); } /* allocate ISM metadata handles */ - for ( ch = 0; ch < n_ISms; ch++ ) + FOR( ch = 0; ch < n_ISms; ch++ ) { - if ( ( st_ivas->hIsmMetaData[ch] = (ISM_METADATA_HANDLE) malloc( sizeof( ISM_METADATA_FRAME ) ) ) == NULL ) + IF( ( st_ivas->hIsmMetaData[ch] = (ISM_METADATA_HANDLE) malloc( sizeof( ISM_METADATA_FRAME ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM MetaData\n" ) ); } st_ivas->hIsmMetaData[ch]->position_angle.last_angle1_idx = 0; + move16(); st_ivas->hIsmMetaData[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; + move16(); st_ivas->hIsmMetaData[ch]->position_angle.last_angle2_idx = 0; + move16(); st_ivas->hIsmMetaData[ch]->position_angle.angle2_diff_cnt = ISM_FEC_MAX - 1; + move16(); st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle1_idx = 0; + move16(); st_ivas->hIsmMetaData[ch]->orientation_angle.angle1_diff_cnt = ISM_FEC_MAX - 2; + move16(); st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle2_idx = 0; + move16(); st_ivas->hIsmMetaData[ch]->orientation_angle.angle2_diff_cnt = ISM_FEC_MAX - 2; + move16(); st_ivas->hIsmMetaData[ch]->last_radius_idx = 0; + move16(); st_ivas->hIsmMetaData[ch]->radius_diff_cnt = ISM_FEC_MAX - 2; + move16(); st_ivas->hIsmMetaData[ch]->last_ism_metadata_flag = 0; + move16(); st_ivas->hIsmMetaData[ch]->ism_imp = -1; + move16(); st_ivas->hIsmMetaData[ch]->ism_md_null_flag = 0; + move16(); st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = 0; - st_ivas->hIsmMetaData[ch]->q_azimuth_old = 0.0f; - st_ivas->hIsmMetaData[ch]->q_elevation_old = 0.0f; + move16(); + + st_ivas->hIsmMetaData[ch]->q_azimuth_old_fx = 0; + move16(); + st_ivas->hIsmMetaData[ch]->q_elevation_old_fx = 0; + move16(); + /*===============fix-to-flt====================*/ + st_ivas->hIsmMetaData[ch]->q_azimuth_old = fix_to_float( st_ivas->hIsmMetaData[ch]->q_azimuth_old_fx, Q22 ); + st_ivas->hIsmMetaData[ch]->q_elevation_old = fix_to_float( st_ivas->hIsmMetaData[ch]->q_elevation_old_fx, Q22 ); + /*===============fix-to-flt====================*/ + #ifdef IVAS_FLOAT_FIXED ivas_ism_reset_metadata_enc( st_ivas->hIsmMetaData[ch] ); @@ -1466,36 +1637,48 @@ ivas_error ivas_ism_metadata_enc_create( ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); #endif - st_ivas->hIsmMetaData[ch]->last_azimuth = 0.0f; - st_ivas->hIsmMetaData[ch]->last_elevation = 0.0f; - st_ivas->hIsmMetaData[ch]->last_true_azimuth = 0.0f; - st_ivas->hIsmMetaData[ch]->last_true_elevation = 0.0f; + st_ivas->hIsmMetaData[ch]->last_azimuth_fx = 0; + st_ivas->hIsmMetaData[ch]->last_elevation_fx = 0; + + st_ivas->hIsmMetaData[ch]->last_true_azimuth_fx = 0; + st_ivas->hIsmMetaData[ch]->last_true_elevation_fx = 0; + st_ivas->hIsmMetaData[ch]->ism_md_fec_cnt_enc = 0; st_ivas->hIsmMetaData[ch]->ism_md_inc_diff_cnt = ISM_MD_INC_DIFF_CNT_MAX; - st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f; + st_ivas->hIsmMetaData[ch]->last_true_radius_fx = ONE_IN_Q9; + + /*===============fix-to-flt====================*/ + st_ivas->hIsmMetaData[ch]->last_azimuth = fix_to_float( st_ivas->hIsmMetaData[ch]->last_azimuth_fx, Q22 ); + st_ivas->hIsmMetaData[ch]->last_elevation = fix_to_float( st_ivas->hIsmMetaData[ch]->last_elevation_fx, Q22 ); + + st_ivas->hIsmMetaData[ch]->last_true_azimuth = fix_to_float( st_ivas->hIsmMetaData[ch]->last_true_azimuth_fx, Q22 ); + st_ivas->hIsmMetaData[ch]->last_true_elevation = fix_to_float( st_ivas->hIsmMetaData[ch]->last_true_elevation_fx, Q22 ); + st_ivas->hIsmMetaData[ch]->last_true_radius = fix16_to_float( st_ivas->hIsmMetaData[ch]->last_true_radius_fx, Q9 ); + /*===============fix-to-flt====================*/ } - if ( st_ivas->hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) + IF( EQ_16( st_ivas->hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) ) { - if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + test(); + IF( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) { - if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, 1, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 1 ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_ism_config_fx( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, 1, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 1 ) ) != IVAS_ERR_OK ) { return error; } } - else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + ELSE IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { - if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 1 ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_ism_config_fx( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 1 ) ) != IVAS_ERR_OK ) { return error; } } } - else + ELSE { - if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 0 ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_ism_config_fx( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 0 ) ) != IVAS_ERR_OK ) { return error; } @@ -1503,14 +1686,243 @@ ivas_error ivas_ism_metadata_enc_create( return IVAS_ERR_OK; } - - -/*------------------------------------------------------------------------- - * encode_radius() - * - * Radius index encoding +#else +ivas_error ivas_ism_metadata_enc_create( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t n_ISms, /* i : number of objects */ + int32_t element_brate_tmp[] /* o : element bitrate per object */ +) +{ + int16_t ch, nchan_transport; + ivas_error error; + + nchan_transport = st_ivas->nchan_transport; + if ( st_ivas->hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) + { + nchan_transport = MAX_PARAM_ISM_WAVE; +#ifndef IVAS_FLOAT_FIXED + ivas_set_omasa_TC( st_ivas->ism_mode, n_ISms, &st_ivas->nSCE, &st_ivas->nCPE ); +#else + ivas_set_omasa_TC_fx( st_ivas->ism_mode, n_ISms, &st_ivas->nSCE, &st_ivas->nCPE ); +#endif + } + else if ( st_ivas->hEncoderConfig->ivas_format == SBA_ISM_FORMAT ) + { + nchan_transport = n_ISms; + } + else + { + if ( st_ivas->ism_mode == ISM_MODE_NONE ) + { + nchan_transport = st_ivas->nchan_transport; + + if ( nchan_transport == 1 ) + { + st_ivas->nSCE = 1; + st_ivas->nCPE = 0; + } + else + { + st_ivas->nSCE = 0; + st_ivas->nCPE = 1; + } + } + else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + nchan_transport = 2; + } + else + { + nchan_transport = n_ISms; + } + + st_ivas->nchan_transport = nchan_transport; + st_ivas->nSCE = nchan_transport; + st_ivas->nCPE = 0; + } + + /* allocate ISM metadata handles */ + for ( ch = 0; ch < n_ISms; ch++ ) + { + if ( ( st_ivas->hIsmMetaData[ch] = (ISM_METADATA_HANDLE) malloc( sizeof( ISM_METADATA_FRAME ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM MetaData\n" ) ); + } + st_ivas->hIsmMetaData[ch]->position_angle.last_angle1_idx = 0; + st_ivas->hIsmMetaData[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; + st_ivas->hIsmMetaData[ch]->position_angle.last_angle2_idx = 0; + st_ivas->hIsmMetaData[ch]->position_angle.angle2_diff_cnt = ISM_FEC_MAX - 1; + st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle1_idx = 0; + st_ivas->hIsmMetaData[ch]->orientation_angle.angle1_diff_cnt = ISM_FEC_MAX - 2; + st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle2_idx = 0; + st_ivas->hIsmMetaData[ch]->orientation_angle.angle2_diff_cnt = ISM_FEC_MAX - 2; + st_ivas->hIsmMetaData[ch]->last_radius_idx = 0; + st_ivas->hIsmMetaData[ch]->radius_diff_cnt = ISM_FEC_MAX - 2; + st_ivas->hIsmMetaData[ch]->last_ism_metadata_flag = 0; + + st_ivas->hIsmMetaData[ch]->ism_imp = -1; + st_ivas->hIsmMetaData[ch]->ism_md_null_flag = 0; + st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = 0; + st_ivas->hIsmMetaData[ch]->q_azimuth_old = 0.0f; + st_ivas->hIsmMetaData[ch]->q_elevation_old = 0.0f; + +#ifdef IVAS_FLOAT_FIXED + ivas_ism_reset_metadata_enc( st_ivas->hIsmMetaData[ch] ); +#else + ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); +#endif + + st_ivas->hIsmMetaData[ch]->last_azimuth = 0.0f; + st_ivas->hIsmMetaData[ch]->last_elevation = 0.0f; + + st_ivas->hIsmMetaData[ch]->last_true_azimuth = 0.0f; + st_ivas->hIsmMetaData[ch]->last_true_elevation = 0.0f; + st_ivas->hIsmMetaData[ch]->ism_md_fec_cnt_enc = 0; + st_ivas->hIsmMetaData[ch]->ism_md_inc_diff_cnt = ISM_MD_INC_DIFF_CNT_MAX; + st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f; + } + + if ( st_ivas->hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) + { + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, 1, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + return IVAS_ERR_OK; +} +#endif + +/*------------------------------------------------------------------------- + * encode_radius() + * + * Radius index encoding *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static void encode_radius( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + Word16 *last_radius_idx, /* i/o: last radius index */ + Word16 *radius_diff_cnt, /* i/o: radius diff coding counter */ + const Word16 last_ism_metadata_flag, /* last frame ism_metadata_flag */ + const Word16 idx_radius_abs, /* i : Azimuth index */ + Word16 *flag_abs_radius /* o : Radius encoding mode */ +) +{ + Word16 idx_radius, nbits_diff_radius, diff; + idx_radius = idx_radius_abs; + nbits_diff_radius = 0; + move16(); + *flag_abs_radius = 0; /* differential coding by default */ + move16(); + + test(); + IF( EQ_16( *radius_diff_cnt, ISM_FEC_MAX ) /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ + || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ + ) + { + *flag_abs_radius = 1; + move16(); + } + + diff = sub( idx_radius_abs, *last_radius_idx ); + + /* try differential coding */ + IF( EQ_16( *flag_abs_radius, 0 ) ) + { + IF( EQ_16( diff, 0 ) ) + { + idx_radius = 0; + move16(); + nbits_diff_radius = 1; + move16(); + } + ELSE IF( LE_16( ABSVAL( diff ), ISM_MAX_RADIUS_DIFF_IDX ) ) + { + idx_radius = shl( 1, 1 ); + nbits_diff_radius = 1; + move16(); + + IF( LT_16( diff, 0 ) ) + { + idx_radius = add( idx_radius, 1 ); /* negative sign */ + diff = imult1616( diff, -1 ); + } + ELSE + { + idx_radius = add( idx_radius, 0 ); /* positive sign */ + } + + idx_radius = shl( idx_radius, diff ); + nbits_diff_radius = add( nbits_diff_radius, 1 ); + + /* unary coding of "diff */ + idx_radius = add( idx_radius, sub( shl( 1, diff ), 1 ) ); + nbits_diff_radius = add( nbits_diff_radius, diff ); + + IF( LT_16( nbits_diff_radius, ISM_RADIUS_NBITS ) ) + { + /* add stop bit */ + idx_radius = shl( idx_radius, 1 ); + nbits_diff_radius = add( nbits_diff_radius, 1 ); + } + } + ELSE + { + *flag_abs_radius = 1; + move16(); + } + } + + /* update counter */ + IF( EQ_16( *flag_abs_radius, 0 ) ) + { + ( *radius_diff_cnt )++; + *radius_diff_cnt = min( *radius_diff_cnt, ISM_FEC_MAX ); + } + ELSE + { + *radius_diff_cnt = 0; + move16(); + } + + /* Write radius */ + push_indice( hBstr, IND_ISM_RADIUS_DIFF_FLAG, *flag_abs_radius, 1 ); + + IF( *flag_abs_radius ) + { + push_indice( hBstr, IND_ISM_RADIUS, idx_radius, ISM_RADIUS_NBITS ); + } + ELSE + { + push_indice( hBstr, IND_ISM_RADIUS, idx_radius, nbits_diff_radius ); + } + + /* Updates */ + *last_radius_idx = idx_radius_abs; + move16(); + + return; +} +#else static void encode_radius( BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ int16_t *last_radius_idx, /* i/o: last radius index */ @@ -1606,7 +2018,7 @@ static void encode_radius( return; } - +#endif /*----------------------------------------------------------------* * encode_angle_indices() @@ -1614,6 +2026,268 @@ static void encode_radius( * Encoding of an angle *----------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static void encode_angle_indices( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */ + const Word16 last_ism_metadata_flag, /* i : last frame ism_metadata_flag */ + const Word16 ini_frame, /* i : initialization frames counter */ + const Word16 idx_angle1_abs, /* i : Azimuth index */ + const Word16 idx_angle2_abs, /* i : Elevation index */ + Word16 *flag_abs_angle1, /* o : Azimuth/yaw encoding mode */ + Word16 *flag_abs_angle2 /* o : Elevation/pitch encoding mode */ +) +{ + Word16 idx_angle1, nbits_diff_angle1, diff; + Word16 idx_angle2, nbits_diff_angle2; + + /*----------------------------------------------------------------* + * Azimuth/yaw index encoding + *----------------------------------------------------------------*/ + + idx_angle1 = idx_angle1_abs; + + nbits_diff_angle1 = 0; + move16(); + *flag_abs_angle1 = 0; /* differential coding by default */ + test(); + if ( EQ_16( angle->angle1_diff_cnt, ISM_FEC_MAX ) /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ + || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ + ) + { + *flag_abs_angle1 = 1; + move16(); + } + + /* try differential coding */ + IF( *flag_abs_angle1 == 0 ) + { + diff = sub( idx_angle1_abs, angle->last_angle1_idx ); + + /* azimuth is on a circle - check for diff coding for -180° -> 180° and vice versa changes */ + IF( abs( diff ) > ( ( 1 << ISM_AZIMUTH_NBITS ) - 1 ) - ISM_MAX_AZIMUTH_DIFF_IDX ) + { + IF( diff > 0 ) + { + diff = sub( diff, ( 1 << ISM_AZIMUTH_NBITS ) - 1 ); + } + ELSE + { + diff = add( diff, ( 1 << ISM_AZIMUTH_NBITS ) - 1 ); + } + } + + IF( diff == 0 ) + { + idx_angle1 = 0; + move16(); + nbits_diff_angle1 = 1; + move16(); + } + ELSE IF( LT_16( ABSVAL( diff ), ISM_MAX_AZIMUTH_DIFF_IDX ) ) /* when diff bits >= abs bits, prefer abs */ + { + idx_angle1 = shl( 1, 1 ); + nbits_diff_angle1 = 1; + move16(); + + IF( diff < 0 ) + { + idx_angle1 = add( idx_angle1, 1 ); /* negative sign */ + diff = imult1616( diff, -1 ); + } + ELSE + { + idx_angle1 = add( idx_angle1, 0 ); /* positive sign */ + } + + idx_angle1 = shl( idx_angle1, diff ); + nbits_diff_angle1 = add( nbits_diff_angle1, 1 ); + + /* unary coding of "diff */ + idx_angle1 = add( idx_angle1, sub( shl( 1, diff ), 1 ) ); + nbits_diff_angle1 = add( nbits_diff_angle1, diff ); + + IF( LT_16( nbits_diff_angle1, ( ISM_AZIMUTH_NBITS - 1 ) ) ) + { + /* add stop bit - only for codewords shorter than ISM_AZIMUTH_NBITS */ + idx_angle1 = shl( idx_angle1, 1 ); + nbits_diff_angle1 = add( nbits_diff_angle1, 1 ); + } + } + ELSE + { + *flag_abs_angle1 = 1; + move16(); + } + } + + /* update counter */ + IF( *flag_abs_angle1 == 0 ) + { + angle->angle1_diff_cnt = add( angle->angle1_diff_cnt, 1 ); + angle->angle1_diff_cnt = s_min( angle->angle1_diff_cnt, ISM_FEC_MAX ); + } + ELSE + { + angle->angle1_diff_cnt = 0; + move16(); + } + + /* Write azimuth/yaw */ + push_indice( hBstr, IND_ISM_AZIMUTH_DIFF_FLAG, *flag_abs_angle1, 1 ); + + IF( *flag_abs_angle1 ) + { + push_indice( hBstr, IND_ISM_AZIMUTH, idx_angle1, ISM_AZIMUTH_NBITS ); + } + ELSE + { + push_indice( hBstr, IND_ISM_AZIMUTH, idx_angle1, nbits_diff_angle1 ); + } + + /*----------------------------------------------------------------* + * Elevation/pitch index encoding + *----------------------------------------------------------------*/ + + IF( flag_abs_angle2 ) + { + idx_angle2 = idx_angle2_abs; + move16(); + nbits_diff_angle2 = 0; + move16(); + *flag_abs_angle2 = 0; /* differential coding by default */ + move16(); + IF( EQ_16( angle->angle2_diff_cnt, ISM_FEC_MAX ) /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ + || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ + ) + { + *flag_abs_angle2 = 1; + move16(); + } + + /* note: elevation/pitch is coded starting from the second frame only (it is meaningless in the init_frame) */ + IF( ini_frame == 0 ) + { + *flag_abs_angle2 = 1; + move16(); + angle->last_angle2_idx = idx_angle2_abs; + move16(); + } + + diff = sub( idx_angle2_abs, angle->last_angle2_idx ); + + /* avoid absolute coding of elevation/pitch if absolute coding was already used for azimuth/yaw */ + IF( EQ_16( *flag_abs_angle1, 1 ) ) + { + Word16 diff_orig = diff; + + *flag_abs_angle2 = 0; + move16(); + + + IF( diff >= 0 ) + { + diff = min( diff, ISM_MAX_ELEVATION_DIFF_IDX ); + } + ELSE + { + diff = imult1616( -1, min( -diff, ISM_MAX_ELEVATION_DIFF_IDX ) ); + } + + IF( last_ism_metadata_flag == 0 || abs( diff_orig - diff ) > ISM_MAX_ELEVATION_DIFF_IDX ) + { + angle->angle2_diff_cnt = ISM_FEC_MAX - 1; + move16(); + } + } + + /* try differential coding */ + IF( *flag_abs_angle2 == 0 ) + { + IF( diff == 0 ) + { + idx_angle2 = 0; + move16(); + nbits_diff_angle2 = 1; + move16(); + } + ELSE IF( LE_16( ABSVAL( diff ), ISM_MAX_ELEVATION_DIFF_IDX ) ) + { + idx_angle2 = shl( 1, 1 ); + nbits_diff_angle2 = 1; + move16(); + + IF( diff < 0 ) + { + idx_angle2 = add( idx_angle2, 1 ); /* negative sign */ + diff = imult1616( diff, -1 ); + } + ELSE + { + idx_angle2 = add( idx_angle2, 0 ); /* positive sign */ + } + + idx_angle2 = shl( idx_angle2, diff ); + nbits_diff_angle2 = add( nbits_diff_angle2, 1 ); + + /* unary coding of "diff */ + idx_angle2 = add( idx_angle2, sub( shl( 1, diff ), 1 ) ); + nbits_diff_angle2 = add( nbits_diff_angle2, diff ); + + IF( LT_16( nbits_diff_angle2, ISM_ELEVATION_NBITS ) ) + { + /* add stop bit */ + idx_angle2 = shl( idx_angle2, 1 ); + nbits_diff_angle2 = add( nbits_diff_angle2, 1 ); + } + } + ELSE + { + *flag_abs_angle2 = 1; + move16(); + } + } + + /* update counter */ + IF( *flag_abs_angle2 == 0 ) + { + angle->angle2_diff_cnt = add( angle->angle2_diff_cnt, 1 ); + angle->angle2_diff_cnt = s_min( angle->angle2_diff_cnt, ISM_FEC_MAX ); + } + ELSE + { + angle->angle2_diff_cnt = 0; + move16(); + } + + /* Write elevation */ + IF( *flag_abs_angle1 == 0 ) /* do not write "flag_abs_elevation/pitch" if "flag_abs_azimuth/yaw == 1" */ + { + push_indice( hBstr, IND_ISM_ELEVATION_DIFF_FLAG, *flag_abs_angle2, 1 ); + } + + IF( *flag_abs_angle2 ) + { + push_indice( hBstr, IND_ISM_ELEVATION, idx_angle2, ISM_ELEVATION_NBITS ); + } + ELSE + { + push_indice( hBstr, IND_ISM_ELEVATION, idx_angle2, nbits_diff_angle2 ); + } + } + + /*----------------------------------------------------------------* + * Updates + *----------------------------------------------------------------*/ + + angle->last_angle1_idx = idx_angle1_abs; + move16(); + angle->last_angle2_idx = idx_angle2_abs; + move16(); + + return; +} +#else static void encode_angle_indices( BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */ @@ -1852,7 +2526,7 @@ static void encode_angle_indices( return; } - +#endif /*-------------------------------------------------------------------* * ivas_ism_metadata_sid_enc() @@ -1862,34 +2536,30 @@ static void encode_angle_indices( #ifdef IVAS_FLOAT_FIXED void ivas_ism_metadata_sid_enc( - ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - const int16_t flag_noisy_speech, /* i : noisy speech flag */ - const int16_t nchan_ism, /* i : number of objects */ - const int16_t nchan_transport, /* i : number of transport channels */ - const ISM_MODE ism_mode, /* i : ISM mode */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - const int16_t sid_flag, /* i : indication of SID frame */ - const int16_t md_diff_flag[], /* i : metadata differental flag */ - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - int16_t nb_bits_metadata[] /* o : number of metadata bits */ + ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ + const Word16 flag_noisy_speech, /* i : noisy speech flag */ + const Word16 nchan_ism, /* i : number of objects */ + const Word16 nchan_transport, /* i : number of transport channels */ + const ISM_MODE ism_mode, /* i : ISM mode */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const Word16 sid_flag, /* i : indication of SID frame */ + const Word16 md_diff_flag[], /* i : metadata differental flag */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + Word16 nb_bits_metadata[] /* o : number of metadata bits */ ) { - int16_t i, ch, nBits, nBits_start, nBits_unused; - float q_step, q_step_border; -#ifdef IVAS_FLOAT_FIXED + Word16 i, ch, nBits, nBits_start, nBits_unused; Word32 q_step_fx, q_step_border_fx; -#endif - int16_t idx, idx_azimuth, idx_elevation; - int16_t nBits_azimuth, nBits_elevation, nBits_coh, nBits_sce_id; -#ifdef IVAS_FLOAT_FIXED + Word16 idx, idx_azimuth, idx_elevation; + Word16 nBits_azimuth, nBits_elevation, nBits_coh, nBits_sce_id; Word32 valQ_fx; -#endif + ISM_METADATA_HANDLE hIsmMetaData; - if ( sid_flag ) + IF( sid_flag ) { nBits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; - nBits -= SID_FORMAT_NBITS; + nBits = sub( nBits, SID_FORMAT_NBITS ); nBits_start = hBstr->nb_bits_tot; /*----------------------------------------------------------------* @@ -1897,14 +2567,14 @@ void ivas_ism_metadata_sid_enc( *----------------------------------------------------------------*/ /* write number of objects - unary coding */ - for ( ch = 1; ch < nchan_ism; ch++ ) + FOR( ch = 1; ch < nchan_ism; ch++ ) { push_indice( hBstr, IND_ISM_NUM_OBJECTS, 1, 1 ); } push_indice( hBstr, IND_ISM_NUM_OBJECTS, 0, 1 ); /* write SID metadata flag (one per object) */ - for ( ch = 0; ch < nchan_ism; ch++ ) + FOR( ch = 0; ch < nchan_ism; ch++ ) { push_indice( hBstr, IND_ISM_METADATA_FLAG, md_diff_flag[ch], 1 ); } @@ -1913,25 +2583,25 @@ void ivas_ism_metadata_sid_enc( * Set quantization bits based on the number of coded objects *----------------------------------------------------------------*/ - ivas_get_ism_sid_quan_bitbudget( nchan_ism, &nBits_azimuth, &nBits_elevation, &q_step, &q_step_border, &nBits_coh, &nBits_sce_id ); + ivas_get_ism_sid_quan_bitbudget_fx( nchan_ism, &nBits_azimuth, &nBits_elevation, &q_step_fx, &q_step_border_fx, &nBits_coh, &nBits_sce_id ); /*----------------------------------------------------------------* * Spatial parameters, loop over TCs - 1 *----------------------------------------------------------------*/ /* write ISM mode flag to explicitly signal number of spatial parameters */ - if ( nchan_ism > 2 ) + IF( GT_16( nchan_ism, 2 ) ) { - if ( ism_mode == ISM_MODE_DISC ) + IF( EQ_16( ism_mode, ISM_MODE_DISC ) ) { push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, 0, 1 ); } - else + ELSE { push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, 1, 1 ); } - if ( ism_mode == ISM_MODE_PARAM ) + IF( EQ_16( ism_mode, ISM_MODE_PARAM ) ) { /* write noisy speech flag */ push_indice( hBstr, IND_ISM_NOISY_SPEECH_FLAG, flag_noisy_speech, 1 ); @@ -1939,20 +2609,22 @@ void ivas_ism_metadata_sid_enc( } } - if ( nchan_transport > 1 ) + IF( GT_16( nchan_transport, 1 ) ) { /* write sce id */ push_indice( hBstr, IND_ISM_SCE_ID_DTX, hISMDTX->sce_id_dtx, nBits_sce_id ); /* quantize and write coherence */ - for ( ch = 0; ch < nchan_transport; ch++ ) + FOR( ch = 0; ch < nchan_transport; ch++ ) { - if ( ch == hISMDTX->sce_id_dtx ) + IF( EQ_16( ch, hISMDTX->sce_id_dtx ) ) { continue; } - - idx = (int16_t) ( hISMDTX->coh[ch] * ( ( 1 << nBits_coh ) - 1 ) + 0.5f ); + Word32 tmp = Mpy_32_32( L_shr( L_deposit_h( hISMDTX->coh_fx[ch] ), 1 ) /*Q30*/, L_deposit_h( sub( shl( 1, nBits_coh ), 1 ) ) ); // Q15 + Word32 tmp_2 = L_add( tmp, 16384 /*0.5f in Q15*/ ); + idx = (Word16) L_shr( tmp_2, Q15 ); + // idx = (Word16) ( hISMDTX->coh[ch] * sub( shl( 1, nBits_coh ), 1 ) + 0.5f ); assert( ( idx >= 0 ) && ( idx <= ( ( 1 << nBits_coh ) - 1 ) ) ); push_indice( hBstr, IND_ISM_DTX_COH_SCA, idx, nBits_coh ); } @@ -1962,9 +2634,9 @@ void ivas_ism_metadata_sid_enc( * Metadata quantization and coding, loop over all objects *----------------------------------------------------------------*/ - for ( ch = 0; ch < nchan_ism; ch++ ) + FOR( ch = 0; ch < nchan_ism; ch++ ) { - if ( md_diff_flag[ch] == 1 ) + IF( md_diff_flag[ch] == 1 ) { hIsmMetaData = hIsmMeta[ch]; @@ -1972,8 +2644,6 @@ void ivas_ism_metadata_sid_enc( /*===============================flt-2-fix======================================*/ hIsmMetaData->azimuth_fx = floatToFixed( hIsmMetaData->azimuth, Q22 ); hIsmMetaData->elevation_fx = floatToFixed( hIsmMetaData->elevation, Q22 ); - q_step_fx = floatToFixed( q_step, Q22 ); - q_step_border_fx = floatToFixed( q_step_border, Q22 ); /*===============================flt-2-fix======================================*/ idx_azimuth = ism_quant_meta_fx( hIsmMetaData->azimuth_fx, &valQ_fx, ism_azimuth_borders_fx, q_step_fx, q_step_border_fx, 1 << nBits_azimuth ); idx_elevation = ism_quant_meta_fx( hIsmMetaData->elevation_fx, &valQ_fx, ism_elevation_borders_fx, q_step_fx, q_step_border_fx, 1 << nBits_elevation ); @@ -1981,20 +2651,19 @@ void ivas_ism_metadata_sid_enc( idx_azimuth = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, q_step, q_step_border, 1 << nBits_azimuth ); idx_elevation = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, q_step, q_step_border, 1 << nBits_elevation ); #endif - push_indice( hBstr, IND_ISM_AZIMUTH, idx_azimuth, nBits_azimuth ); push_indice( hBstr, IND_ISM_ELEVATION, idx_elevation, nBits_elevation ); /* update last indexes to correspond to active frames coding */ - if ( nBits_azimuth > ISM_AZIMUTH_NBITS ) + IF( GT_16( nBits_azimuth, ISM_AZIMUTH_NBITS ) ) { - hIsmMetaData->position_angle.last_angle1_idx = idx_azimuth >> ( nBits_azimuth - ISM_AZIMUTH_NBITS ); - hIsmMetaData->position_angle.last_angle2_idx = idx_elevation >> ( nBits_elevation - ISM_ELEVATION_NBITS ); + hIsmMetaData->position_angle.last_angle1_idx = shr( idx_azimuth, sub( nBits_azimuth, ISM_AZIMUTH_NBITS ) ); + hIsmMetaData->position_angle.last_angle2_idx = shr( idx_elevation, sub( nBits_elevation, ISM_ELEVATION_NBITS ) ); } - else + ELSE { - hIsmMetaData->position_angle.last_angle1_idx = idx_azimuth << ( ISM_AZIMUTH_NBITS - nBits_azimuth ); - hIsmMetaData->position_angle.last_angle2_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation ); + hIsmMetaData->position_angle.last_angle1_idx = shl( idx_azimuth, sub( ISM_AZIMUTH_NBITS, nBits_azimuth ) ); + hIsmMetaData->position_angle.last_angle2_idx = shl( idx_elevation, sub( ISM_ELEVATION_NBITS, nBits_elevation ) ); } hIsmMetaData->ism_md_fec_cnt_enc = 0; @@ -2003,15 +2672,15 @@ void ivas_ism_metadata_sid_enc( } /* Write unused (padding) bits */ - nBits_unused = nBits - hBstr->nb_bits_tot; - while ( nBits_unused > 0 ) + nBits_unused = sub( nBits, hBstr->nb_bits_tot ); + WHILE( nBits_unused > 0 ) { i = min( nBits_unused, 16 ); push_indice( hBstr, IND_UNUSED, 0, i ); - nBits_unused -= i; + nBits_unused = sub( nBits_unused, i ); } - nb_bits_metadata[0] = hBstr->nb_bits_tot - nBits_start; + nb_bits_metadata[0] = sub( hBstr->nb_bits_tot, nBits_start ); } return; diff --git a/lib_enc/ivas_omasa_enc.c b/lib_enc/ivas_omasa_enc.c index 9598804d9..8f3d726a5 100644 --- a/lib_enc/ivas_omasa_enc.c +++ b/lib_enc/ivas_omasa_enc.c @@ -613,6 +613,78 @@ void ivas_omasa_enc( * * Set the importance of particular ISM streams in combined-format coding *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_set_ism_importance_interformat_fx( + const Word32 ism_total_brate, /* i/o: ISms total bitrate */ + const Word16 nchan_transport, /* i : number of transported channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ + const Word32 lp_noise_CPE_fx, /* i : LP filtered total noise estimation Q8*/ + Word16 ism_imp[] /* o : ISM importance flags */ +) +{ + Encoder_State *st; + Word16 ch, ctype, active_flag; + + FOR( ch = 0; ch < nchan_transport; ch++ ) + { + st = hSCE[ch]->hCoreCoder[0]; + + active_flag = st->vad_flag; + move16(); + + IF( active_flag == 0 ) + { + if ( GT_32( st->lp_noise_fx, 3840 /*15 in Q8*/ ) || LT_32( L_sub( lp_noise_CPE_fx, st->lp_noise_fx ), 7680 /*30*/ ) ) + { + active_flag = 1; + move16(); + } + } + + Word32 quo, rem; + iDiv_and_mod_32( ism_total_brate, nchan_transport, &quo, &rem, 0 ); + + /* do not use the low-rate core-coder mode at highest bit-rates */ + if ( GT_32( quo, IVAS_48k ) ) + { + active_flag = 1; + move16(); + } + + ctype = hSCE[ch]->hCoreCoder[0]->coder_type_raw; + + st->low_rate_mode = 0; + IF( active_flag == 0 ) + { + ism_imp[ch] = ISM_INACTIVE_IMP; + move16(); + st->low_rate_mode = 1; + move16(); + } + ELSE IF( EQ_16( ctype, INACTIVE ) || EQ_16( ctype, UNVOICED ) ) + { + ism_imp[ch] = ISM_LOW_IMP; + move16(); + } + ELSE IF( EQ_16( ctype, VOICED ) ) + { + ism_imp[ch] = ISM_MEDIUM_IMP; + move16(); + } + ELSE /* GENERIC */ + { + ism_imp[ch] = ISM_HIGH_IMP; + move16(); + } + + hIsmMeta[ch]->ism_metadata_flag = active_flag; /* flag is needed for the MD coding */ + move16(); + } + + return; +} +#endif void ivas_set_ism_importance_interformat( const int32_t ism_total_brate, /* i/o: ISms total bitrate */ @@ -673,7 +745,6 @@ void ivas_set_ism_importance_interformat( return; } - /*--------------------------------------------------------------------------* * ivas_set_surplus_brate_enc() * diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index ec2dbd2be..fa8970e00 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -751,7 +751,6 @@ typedef struct float long_term_energy_stereo_dmx_enc[MAX_NUM_OBJECTS][PARAM_ISM_HYS_BUF_SIZE]; float coh[MAX_NUM_OBJECTS]; - } ISM_DTX_DATA, *ISM_DTX_HANDLE; /*----------------------------------------------------------------------------------* @@ -1034,7 +1033,9 @@ typedef struct ivas_omasa_encoder_one_data_struct Word32 q_energy_ratio_ism_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; /* Q30 */ Word32 masa_to_total_energy_ratio_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; /* Q30 */ #endif - float lp_noise_CPE; /* LP filtered total noise estimation */ + float lp_noise_CPE; /* LP filtered total noise estimation */ + Word32 lp_noise_CPE_fx; /* LP filtered total noise estimation */ /*Q8*/ + int16_t omasa_stereo_sw_cnt; } OMASA_ENCODER_DATA_STATE, *OMASA_ENCODER_DATA_HANDLE; diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 8d61700e4..b35609ce1 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -472,8 +472,24 @@ ivas_error IVAS_ENC_FeedObjectMetadata( { return IVAS_ERR_INVALID_INDEX; } - +#ifdef IVAS_FLOAT_FIXED + Word32 azimuth_fx = float_to_fix( metadata.azimuth, Q22 ); /* Q22 */ + Word32 elevation_fx = float_to_fix( metadata.elevation, Q22 ); /* Q22 */ + Word16 radius_fx = float_to_fix16( metadata.radius, Q9 ); /* Q9 */ + Word32 yaw_fx = float_to_fix( metadata.yaw, Q22 ); /* Q22 */ + Word32 pitch_fx = float_to_fix( metadata.pitch, Q22 ); /* Q22 */ + error = ivas_set_ism_metadata_fx( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], azimuth_fx, elevation_fx, radius_fx, yaw_fx, pitch_fx, metadata.non_diegetic_flag ); + + /*================fix-to-flt====================*/ + hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->azimuth = fix_to_float( azimuth_fx, Q22 ); + hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->elevation = fix_to_float( elevation_fx, Q22 ); + hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->radius = fix_to_float( radius_fx, Q9 ); + hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->yaw = fix_to_float( yaw_fx, Q22 ); + hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->pitch = fix_to_float( pitch_fx, Q22 ); + /*================fix-to-flt====================*/ +#else error = ivas_set_ism_metadata( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth, metadata.elevation, metadata.radius, metadata.yaw, metadata.pitch, metadata.non_diegetic_flag ); +#endif if ( error != IVAS_ERR_OK ) { -- GitLab From 6db2002b93c8308b373114fe24bd03aa9a6a67bb Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 16 Jul 2024 11:28:59 +0530 Subject: [PATCH 073/110] Fix for ASAN and MSAN errors added --- lib_com/cldfb.c | 4 ---- lib_dec/ivas_spar_decoder.c | 3 +++ lib_enc/ivas_core_pre_proc_front.c | 9 +++++++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index e3d9912f2..52a94b1b1 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -1681,15 +1681,11 @@ ivas_error openCldfb_ivas_fx( IF( EQ_32( type, CLDFB_ANALYSIS ) ) { buf_len = sub( hs->p_filter_length, hs->no_channels ); - hs->FilterStates = (Word16 *) malloc( ( 9 + 16 ) * CLDFB_getNumChannels( sampling_rate ) * sizeof( Word16 ) ); - hs->FilterStates_eg = 0; } ELSE { buf_len = hs->p_filter_length; move16(); - hs->FilterStates = (Word16 *) malloc( 2 * ( 9 + 16 ) * CLDFB_getNumChannels( sampling_rate ) * sizeof( Word16 ) ); - hs->FilterStates_eg = 0; } IF( ( hs->cldfb_state_fx = (Word32 *) malloc( buf_len * sizeof( Word32 ) ) ) == NULL ) diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 38df6b53f..416ac4f73 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -3122,6 +3122,9 @@ void ivas_spar_dec_upmixer_sf_fx( * Prepare CLDFB buffers *---------------------------------------------------------------------*/ +#ifdef MSAN_FIX + set_zero_fx( &Pcm_tmp_fx[0][0], ( MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS ) * L_FRAME48k ); +#endif // MSAN_FIX /* set-up pointers */ IF( NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) { diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index 45cce0aed..acf656866 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -996,7 +996,9 @@ ivas_error pre_proc_front_ivas_fx( Word32 imagBuffer_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; Word16 sf_energySum[CLDFB_NO_CHANNELS_MAX]; +#ifndef MSAN_FIX floatToFixed_arr( old_inp_12k8, old_inp_12k8_fx, 0, 496 ); +#endif // MSAN_FIX #endif /*------------------------------------------------------------------* * Initialization @@ -1352,6 +1354,7 @@ ivas_error pre_proc_front_ivas_fx( { mvr2r( new_inp_12k8, st->buf_speech_enc_flt + L_FRAME32k, L_FRAME ); } +#ifndef MSAN_FIX /*To be enabled when updations related to new_inp_12k8_fx is enabled */ #if 1 IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) { @@ -1369,6 +1372,7 @@ ivas_error pre_proc_front_ivas_fx( Scale_sig( st->buf_speech_enc + L_FRAME32k, L_FRAME, 1 ); } #endif +#endif // !MSAN_FIX /*------------------------------------------------------------------* * Perform fixed preemphasis (12.8 kHz signal) through 1 - g*z^-1 *-----------------------------------------------------------------*/ @@ -1722,6 +1726,11 @@ ivas_error pre_proc_front_ivas_fx( { st->cldfbAnaEnc->scale = (Word16) ( st->cldfbAnaEnc->scale_flt * ( 1 << 8 ) ); floatToFixed_arr( st->input, st->input_fx, 0, 480 ); +#ifdef MSAN_FIX + st->lt_mean_NB_fx = (Word16) st->lt_mean_NB * ( 1 << 11 ); + st->lt_mean_WB_fx = (Word16) st->lt_mean_WB * ( 1 << 11 ); + st->lt_mean_SWB_fx = (Word16) st->lt_mean_SWB * ( 1 << 11 ); +#endif bw_detect_fx( st, st->input_fx, NULL, enerBuffer_fx, sf_energySum, ivas_format, 0 ); -- GitLab From b0aca655465482abb5a292d04c07dbaa0b6569d0 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 16 Jul 2024 21:22:41 +0530 Subject: [PATCH 074/110] Fix-2 for ASAN and MSAN errors --- lib_com/cldfb.c | 6 ++++++ lib_dec/ivas_init_dec.c | 4 ++-- lib_enc/ivas_front_vad.c | 11 +++++++++++ lib_enc/speech_music_classif.c | 3 +++ lib_rend/ivas_mcmasa_ana.c | 2 +- lib_rend/ivas_omasa_ana.c | 2 +- 6 files changed, 24 insertions(+), 4 deletions(-) diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index 52a94b1b1..9083ac14f 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -1675,6 +1675,7 @@ ivas_error openCldfb_ivas_fx( // configureCldfb_ivas( hs, sampling_rate ); configureCldfb_ivas_fx( hs, sampling_rate ); hs->memory_flt = NULL; + hs->FilterStates = NULL; hs->memory_length = 0; move16(); @@ -2087,6 +2088,11 @@ void deleteCldfb_ivas( { free( hs->cldfb_state_fx ); } + + IF( hs->FilterStates ) + { + free( hs->FilterStates ); + } #endif free( hs ); diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 5e79a9ffc..6119dde7d 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -3043,7 +3043,7 @@ ivas_error ivas_init_decoder_fx( FOR( i = 0; i < numCldfbAnalyses; i++ ) { - IF( NE_32( ( error = openCldfb_ivas( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) { return error; } @@ -3055,7 +3055,7 @@ ivas_error ivas_init_decoder_fx( FOR( i = 0; i < numCldfbSyntheses; i++ ) { - IF( NE_32( ( error = openCldfb_ivas( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_enc/ivas_front_vad.c b/lib_enc/ivas_front_vad.c index 9e7eafdcd..be9a837de 100644 --- a/lib_enc/ivas_front_vad.c +++ b/lib_enc/ivas_front_vad.c @@ -543,7 +543,9 @@ ivas_error front_vad_spar( // Q_bands = Q_factor_arrL( fr_bands[0], 2 * NB_BANDS ); floatToFixed_arrL( fr_bands[0], fr_bands_fx[0], Q_bands + QSCALE, 2 * NB_BANDS ); floatToFixed_arrL( hFrontVad->hNoiseEst->bckr, hFrontVad->hNoiseEst->bckr_fx, Q_bands + QSCALE, NB_BANDS ); +#ifndef MSAN_FIX floatToFixed_arrL( tmpE, tmpE_fx, Q_bands + QSCALE, NB_BANDS ); +#endif hFrontVad->hNoiseEst->totalNoise_fx = (Word16) ( hFrontVad->hNoiseEst->totalNoise * ONE_IN_Q8 ); Etot_fx[0] = (Word16) ( Etot[0] * ONE_IN_Q8 ); hFrontVad->hNoiseEst->Etot_last_fx = (Word16) ( hFrontVad->hNoiseEst->Etot_last * ONE_IN_Q8 ); @@ -626,7 +628,12 @@ ivas_error front_vad_spar( Q_inp_12k8 = Q9; // Q_factor_arr( inp_12k8-M, (3 * L_FRAME / 2)+M ); floatToFixed_arr( inp_12k8 - M, inp_12k8_fx - M, Q_inp_12k8, ( 3 * L_FRAME / 2 ) + M ); +#ifdef MSAN_FIX + floatToFixed_arr( A, A_fx, Q12, ( L_FRAME / L_SUBFR ) * ( M + 1 ) ); +#else floatToFixed_arr( A, A_fx, Q12, NB_SUBFR16k * ( M + 1 ) ); +#endif // MSAN_FIX + st->mem_wsp_fx = (Word16) floatToFixed( st->mem_wsp, Q_inp_12k8 ); // find_wsp_fx( A_fx, inp_12k8_fx, wsp_fx, &st->mem_wsp_fx, TILT_FAC_FX, L_FRAME, L_LOOK_12k8, L_SUBFR, Aw_fx, GAMMA1, NB_SUBFR ); ivas_find_wsp( L_FRAME, L_SUBFR, NB_SUBFR, A_fx, Aw_fx, inp_12k8_fx, TILT_FAC_FX, wsp_fx, &st->mem_wsp_fx, GAMMA1, L_LOOK_12k8 ); @@ -767,7 +774,11 @@ ivas_error front_vad_spar( corr_shift_fx = (Word16) floatToFixed( corr_shift, Q15 ); hFrontVad->hVAD->running_avg_fx = (Word16) floatToFixed( hFrontVad->hVAD->running_avg, Q15 ); hFrontVad->hVAD->ra_deltasum_fx = (Word16) floatToFixed( hFrontVad->hVAD->ra_deltasum, Q15 ); +#ifdef MSAN_FIX + floatToFixed_arr( A, A_fx, Q12, ( L_FRAME / L_SUBFR ) * ( M + 1 ) ); +#else floatToFixed_arr( A, A_fx, Q12, NB_SUBFR16k * ( M + 1 ) ); +#endif // MSAN_FIX floatToFixed_arr( st->voicing, st->voicing_fx, Q15, 3 ); vad_param_updt_fx( st, st->pitch[1], corr_shift_fx, corr_shift_fx, A_fx, &hFrontVad, 1 ); hFrontVad->hVAD->running_avg = fixedToFloat( hFrontVad->hVAD->running_avg_fx, Q15 ); diff --git a/lib_enc/speech_music_classif.c b/lib_enc/speech_music_classif.c index 6a5aa1c4a..8f536dbd5 100644 --- a/lib_enc/speech_music_classif.c +++ b/lib_enc/speech_music_classif.c @@ -124,6 +124,9 @@ void speech_music_clas_init( #ifdef IVAS_FLOAT_FIXED hSpMusClas->dlp_mean_ST_fx = 0; hSpMusClas->dlp_var_LT_fx = 0; +#ifdef MSAN_FIX + hSpMusClas->dlp_mean_LT_fx = 0; +#endif // MSAN_FIX #endif hSpMusClas->dlp_mean_LT = 0.0f; hSpMusClas->dlp_var_LT = 0.0f; diff --git a/lib_rend/ivas_mcmasa_ana.c b/lib_rend/ivas_mcmasa_ana.c index b0c4e82a0..531ab686e 100644 --- a/lib_rend/ivas_mcmasa_ana.c +++ b/lib_rend/ivas_mcmasa_ana.c @@ -253,7 +253,7 @@ ivas_error ivas_mcmasa_ana_open( move16(); FOR( i = 0; i < hMcMasa->num_Cldfb_instances; i++ ) { - IF( NE_32( ( error = openCldfb_ivas( &( hMcMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( hMcMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_rend/ivas_omasa_ana.c b/lib_rend/ivas_omasa_ana.c index f5aa07318..cbf60f70f 100644 --- a/lib_rend/ivas_omasa_ana.c +++ b/lib_rend/ivas_omasa_ana.c @@ -146,7 +146,7 @@ ivas_error ivas_omasa_ana_open( hOMasa->num_Cldfb_instances = numAnalysisChannels; FOR( i = 0; i < hOMasa->num_Cldfb_instances; i++ ) { - IF( NE_32( ( error = openCldfb_ivas( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) { return error; } -- GitLab From 32a76b95f15c3fa39268c8e88cc232f4d40d4664 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 16 Jul 2024 21:44:37 +0530 Subject: [PATCH 075/110] Fix for LTV crash for stereo at 13.2 kbps, 32kHz in, 32kHz out, DTX on, random FER at 5%, bandwidth switching --- lib_com/prot_fx2.h | 10 +++ lib_dec/dec_gen_voic_fx.c | 2 +- lib_dec/dec_pit_exc_fx.c | 4 +- lib_dec/dec_tran_fx.c | 8 +- lib_dec/dec_uv_fx.c | 2 +- lib_dec/gain_dec_fx.c | 141 +++++++++++++++++++++++++++++++++ lib_dec/gaus_dec_fx.c | 9 ++- lib_dec/ivas_td_low_rate_dec.c | 4 +- 8 files changed, 170 insertions(+), 10 deletions(-) diff --git a/lib_com/prot_fx2.h b/lib_com/prot_fx2.h index fc488f233..8185faf56 100644 --- a/lib_com/prot_fx2.h +++ b/lib_com/prot_fx2.h @@ -6392,6 +6392,16 @@ void lp_gain_updt_fx( Word16 *lp_gainc, /* i/o: LP-filtered code gain (FEC) Q3 */ const Word16 L_frame /* i : length of the frame */ ); + +void lp_gain_updt_ivas_fx( + const Word16 i_subfr, /* i : subframe number Q0 */ + const Word16 gain_pit, /* i : Decoded gain pitch Q14 */ + const Word32 norm_gain_code, /* i : Normalised gain code Q16 */ + Word16 *lp_gainp, /* i/o: LP-filtered pitch gain(FEC) Q14 */ + Word16 *lp_gainc, /* i/o: LP-filtered code gain (FEC) Q3 */ + const Word16 L_frame /* i : length of the frame */ +); + Word32 gain_dec_gaus_fx( /* o : quantized codebook gain Q16 */ Word16 index, /* i : quantization index */ const Word16 bits, /* i : number of bits to quantize */ diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 1fd514e1c..e48c4aae2 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -708,7 +708,7 @@ ivas_error decod_gen_voic_ivas_fx( } /* update LP filtered gains for the case of frame erasures */ - lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame ); + lp_gain_updt_ivas_fx( i_subfr_fx, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame ); /*----------------------------------------------------------------------* * Find the total excitation diff --git a/lib_dec/dec_pit_exc_fx.c b/lib_dec/dec_pit_exc_fx.c index aba8af9b2..6b56f264a 100644 --- a/lib_dec/dec_pit_exc_fx.c +++ b/lib_dec/dec_pit_exc_fx.c @@ -150,7 +150,7 @@ void dec_pit_exc_fx( test(); test(); test(); - IF( ( ( GE_32( st_fx->core_brate, MIN_RATE_FCB ) || ( EQ_16( st_fx->GSC_noisy_speech, 1 ) && ( ( EQ_16( st_fx->L_frame, L_FRAME ) && GE_32( st_fx->core_brate, ACELP_13k20 ) ) || ( EQ_16( st_fx->L_frame, L_FRAME16k ) && GE_32( st_fx->core_brate, GSC_H_RATE_STG ) ) || st_fx->GSC_IVAS_mode == 0 ) ) ) && EQ_16( L_subfr_fx, L_SUBFR ) ) ) + IF ( ( ( GE_32( st_fx->core_brate, MIN_RATE_FCB ) || ( EQ_16( st_fx->GSC_noisy_speech, 1 ) && ( ( EQ_16( st_fx->L_frame, L_FRAME ) && GE_32( st_fx->core_brate, ACELP_13k20 ) ) || ( EQ_16( st_fx->L_frame, L_FRAME16k ) && GE_32( st_fx->core_brate, GSC_H_RATE_STG ) ) || st_fx->GSC_IVAS_mode == 0 ) ) ) && EQ_16( L_subfr_fx, L_SUBFR ) ) ) { use_fcb = 1; move16(); @@ -864,7 +864,7 @@ void dec_pit_exc_ivas_fx( move16(); pt_gain++; - lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, 0, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, st_fx->L_frame ); + lp_gain_updt_ivas_fx( i_subfr_fx, gain_pit_fx, 0, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, st_fx->L_frame ); } } diff --git a/lib_dec/dec_tran_fx.c b/lib_dec/dec_tran_fx.c index 85497cc84..95c0fb1ce 100644 --- a/lib_dec/dec_tran_fx.c +++ b/lib_dec/dec_tran_fx.c @@ -160,15 +160,17 @@ void decod_tran_fx( } /* update LP filtered gains for the case of frame erasures */ - lp_gain_updt_fx( i_subfr, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame_fx ); - - IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + IF( st_fx->element_mode == EVS_MONO ) { + lp_gain_updt_fx( i_subfr, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame_fx ); + st_fx->tilt_code_fx = est_tilt_fx( exc_fx + i_subfr, gain_pit_fx, code_fx, gain_code_fx, &voice_fac_fx, st_fx->Q_exc ); move16(); } ELSE { + lp_gain_updt_ivas_fx( i_subfr, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame_fx ); + st_fx->tilt_code_fx = est_tilt_ivas_fx( exc_fx + i_subfr, gain_pit_fx, code_fx, gain_code_fx, &voice_fac_fx, st_fx->Q_exc, L_SUBFR, 0 ); move16(); } diff --git a/lib_dec/dec_uv_fx.c b/lib_dec/dec_uv_fx.c index cbdb9407f..1b6c4b424 100644 --- a/lib_dec/dec_uv_fx.c +++ b/lib_dec/dec_uv_fx.c @@ -205,7 +205,7 @@ void decod_unvoiced_ivas_fx( /* update LP filtered gains for the case of frame erasures */ // lp_gain_updt(i_subfr, gain_pit, norm_gain_code, &st->lp_gainp, &st->lp_gainc, L_FRAME); - lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, norm_gain_code_fx, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_FRAME ); + lp_gain_updt_ivas_fx( i_subfr_fx, gain_pit_fx, norm_gain_code_fx, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_FRAME ); /*-------------------------------------------------------* * - Find the total excitation. * diff --git a/lib_dec/gain_dec_fx.c b/lib_dec/gain_dec_fx.c index ff97e81cd..ae4a95966 100644 --- a/lib_dec/gain_dec_fx.c +++ b/lib_dec/gain_dec_fx.c @@ -1109,6 +1109,147 @@ void lp_gain_updt_fx( return; } +/*====================================================================== */ +/* FUNCTION : lp_gain_updt_ivas_fx() */ +/*-----------------------------------------------------------------------*/ +/* PURPOSE : Update of LP pitch and code gains (FEC) */ +/* */ +/*-----------------------------------------------------------------------*/ +/* INPUT ARGUMENTS : */ +/* _ (Word16) i_subfr : subframe number Q0 */ +/* _ (Word16) gain_pit : Decoded gain pitch Q14 */ +/* _ (Word32) norm_gain_code : Normalised gain code Q16 */ +/* _ (Word16) L_frame : length of the frame Q0 */ +/*-----------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16 *) T0 : close loop integer pitch */ +/* _ (Word16 *) T0_frac : close loop fractional part of the pitch */ +/* _ (Word16 ) pitch : pitch value Q6 */ +/*-----------------------------------------------------------------------*/ +/* INPUT OUTPUT ARGUMENTS */ +/* _ (Word16 *) lp_gainp : LP-filtered pitch gain(FEC) Q14 */ +/* _ (Word16 *) lp_gainc : LP-filtered code gain (FEC) Q3 */ +/*-----------------------------------------------------------------------*/ + +/*-----------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*=======================================================================*/ + + +void lp_gain_updt_ivas_fx( + const Word16 i_subfr, /* i : subframe number Q0 */ + const Word16 gain_pit, /* i : Decoded gain pitch Q14 */ + const Word32 norm_gain_code, /* i : Normalised gain code Q16 */ + Word16 *lp_gainp, /* i/o: LP-filtered pitch gain(FEC) Q14 */ + Word16 *lp_gainc, /* i/o: LP-filtered code gain (FEC) Q3 */ + const Word16 L_frame /* i : length of the frame */ +) +{ + Word16 tmp; + +#ifdef BASOP_NOGLOB + tmp = extract_h( L_shl_sat( norm_gain_code, 3 ) ); /*(16+3)-16 -> Q3*/ +#else + tmp = extract_h( L_shl( norm_gain_code, 3 ) ); /*(16+3)-16 -> Q3*/ +#endif + /* To handle extremely low values */ + test(); + if ( norm_gain_code != 0 && tmp == 0 ) + { + tmp = 1; + move16(); + } + + IF( EQ_16( L_frame, L_FRAME ) ) + { + IF( EQ_16( i_subfr, 0 ) ) + { + *lp_gainp = mult( 3277, gain_pit ); + move16(); /*0.1 in Q15 = 3277 , (15+14)-15 -> Q14*/ + *lp_gainc = mult_r( 3277, tmp ); + move16(); /* (15+3)-15 -> Q3*/ + } + ELSE IF( EQ_16( i_subfr, L_SUBFR ) ) + { + *lp_gainp = add( *lp_gainp, mult( 6554, gain_pit ) ); + move16(); /*Q14 (0.2 in Q15 = 6554)*/ + *lp_gainc = mac_r( L_deposit_h( *lp_gainc ), 6554, tmp ); + move16(); /*Q3*/ + } + ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) ) + { + *lp_gainp = add( *lp_gainp, mult( 9830, gain_pit ) ); + move16(); /*Q14 (0.3 in Q15 = 9830)*/ + *lp_gainc = mac_r( L_deposit_h( *lp_gainc ), 9830, tmp ); + move16(); /*Q3*/ + } + ELSE /* i_subfr == 3*L_SUBFR */ + { + *lp_gainp = add( *lp_gainp, mult( 13107, gain_pit ) ); + move16(); /*Q14 (0.4 in Q15 = 13107)*/ +#ifdef BASOP_NOGLOB + *lp_gainc = mac_r_sat( L_deposit_h( *lp_gainc ), 13107, tmp ); +#else + *lp_gainc = mac_r( L_deposit_h( *lp_gainc ), 13107, tmp ); +#endif + move16(); /*Q3*/ + } + } + ELSE + { + IF( i_subfr == 0 ) + { + *lp_gainp = mult( 2185, gain_pit ); + move16(); /*(1.0/15.0) in Q15 = 2185 , (15+14)-15 -> Q14*/ + *lp_gainc = mult_r( 2185, tmp ); + move16(); /* (15+3)-15 -> Q3*/ + } + ELSE IF( EQ_16( i_subfr, L_SUBFR ) ) + { + *lp_gainp = add( *lp_gainp, mult( 4369, gain_pit ) ); + move16(); /*Q14 (2.0/15.0 in Q15 = 4369)*/ + *lp_gainc = mac_r( L_deposit_h( *lp_gainc ), 4369, tmp ); + move16(); /*Q3*/ + } + ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) ) + { + *lp_gainp = add( *lp_gainp, mult( 6554, gain_pit ) ); + move16(); /*Q14 (3.0/15.0 in Q15 = 6554)*/ + *lp_gainc = mac_r( L_deposit_h( *lp_gainc ), 6554, tmp ); + move16(); /*Q3*/ + } + ELSE IF( EQ_16( i_subfr, 3 * L_SUBFR ) ) + { + *lp_gainp = add( *lp_gainp, mult( 8738, gain_pit ) ); + move16(); /*Q14 (4.0/15.0 in Q15 = 8738)*/ + *lp_gainc = mac_r( L_deposit_h( *lp_gainc ), 8738, tmp ); + move16(); /*Q3*/ + } + ELSE /* i_subfr == 4*L_SUBFR */ + { + *lp_gainp = add( *lp_gainp, mult( 10923, gain_pit ) ); + move16(); /*Q14 (5.0/15.0 in Q15 = 10923)*/ +#ifdef BASOP_NOGLOB + *lp_gainc = mac_r_sat( L_deposit_h( *lp_gainc ), 10923, tmp ); +#else + *lp_gainc = mac_r( L_deposit_h( *lp_gainc ), 10923, tmp ); +#endif + move16(); /*Q3*/ + } + } + + /* To handle extremely low values */ + test(); + if ( tmp != 0 && *lp_gainc == 0 ) + { + *lp_gainc = 1; + move16(); + } + + return; +} + /*-------------------------------------------------* * Gain_dec_gaus_vbr * diff --git a/lib_dec/gaus_dec_fx.c b/lib_dec/gaus_dec_fx.c index dc999e3f0..516dfc498 100644 --- a/lib_dec/gaus_dec_fx.c +++ b/lib_dec/gaus_dec_fx.c @@ -87,7 +87,14 @@ void gaus_dec_fx( move32(); /* update LP filtered gains for the case of frame erasures */ - lp_gain_updt_fx( i_subfr, 0, *L_norm_gain_code, lp_gainp, lp_gainc, L_FRAME ); /* supposes that gain_dec_gaus() is used for ACELP@12k8 only */ + IF( st_fx->element_mode == EVS_MONO ) + { + lp_gain_updt_fx( i_subfr, 0, *L_norm_gain_code, lp_gainp, lp_gainc, L_FRAME ); /* supposes that gain_dec_gaus() is used for ACELP@12k8 only */ + } + ELSE + { + lp_gain_updt_ivas_fx( i_subfr, 0, *L_norm_gain_code, lp_gainp, lp_gainc, L_FRAME ); /* supposes that gain_dec_gaus() is used for ACELP@12k8 only */ + } /*------------------------------------------------------------------------------------------* * Updates diff --git a/lib_dec/ivas_td_low_rate_dec.c b/lib_dec/ivas_td_low_rate_dec.c index feae9373c..bdaa26ebc 100644 --- a/lib_dec/ivas_td_low_rate_dec.c +++ b/lib_dec/ivas_td_low_rate_dec.c @@ -639,8 +639,8 @@ void decod_gen_2sbfr_ivas_fx( /* update LP filtered gains for the case of frame erasures */ // lp_gain_updt(i_subfr, gain_pit, norm_gain_code, &st->lp_gainp, &st->lp_gainc, L_frame); // lp_gain_updt(i_subfr + L_SUBFR, gain_pit, norm_gain_code, &st->lp_gainp, &st->lp_gainc, L_frame); - lp_gain_updt_fx( i_subfr, gain_pit, norm_gain_code, &st->lp_gainp_fx, &st->lp_gainc_fx, L_frame ); - lp_gain_updt_fx( i_subfr + L_SUBFR, gain_pit, norm_gain_code, &st->lp_gainp_fx, &st->lp_gainc_fx, L_frame ); + lp_gain_updt_ivas_fx( i_subfr, gain_pit, norm_gain_code, &st->lp_gainp_fx, &st->lp_gainc_fx, L_frame ); + lp_gain_updt_ivas_fx( i_subfr + L_SUBFR, gain_pit, norm_gain_code, &st->lp_gainp_fx, &st->lp_gainc_fx, L_frame ); /*----------------------------------------------------------------------* * Find the total excitation -- GitLab From 6e7a2aae2cd783fe949fda2a814eb0ff8f83b4f8 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 16 Jul 2024 21:48:21 +0530 Subject: [PATCH 076/110] Clang formatting --- lib_dec/dec_pit_exc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/dec_pit_exc_fx.c b/lib_dec/dec_pit_exc_fx.c index 6b56f264a..0197fe36d 100644 --- a/lib_dec/dec_pit_exc_fx.c +++ b/lib_dec/dec_pit_exc_fx.c @@ -150,7 +150,7 @@ void dec_pit_exc_fx( test(); test(); test(); - IF ( ( ( GE_32( st_fx->core_brate, MIN_RATE_FCB ) || ( EQ_16( st_fx->GSC_noisy_speech, 1 ) && ( ( EQ_16( st_fx->L_frame, L_FRAME ) && GE_32( st_fx->core_brate, ACELP_13k20 ) ) || ( EQ_16( st_fx->L_frame, L_FRAME16k ) && GE_32( st_fx->core_brate, GSC_H_RATE_STG ) ) || st_fx->GSC_IVAS_mode == 0 ) ) ) && EQ_16( L_subfr_fx, L_SUBFR ) ) ) + IF( ( ( GE_32( st_fx->core_brate, MIN_RATE_FCB ) || ( EQ_16( st_fx->GSC_noisy_speech, 1 ) && ( ( EQ_16( st_fx->L_frame, L_FRAME ) && GE_32( st_fx->core_brate, ACELP_13k20 ) ) || ( EQ_16( st_fx->L_frame, L_FRAME16k ) && GE_32( st_fx->core_brate, GSC_H_RATE_STG ) ) || st_fx->GSC_IVAS_mode == 0 ) ) ) && EQ_16( L_subfr_fx, L_SUBFR ) ) ) { use_fcb = 1; move16(); -- GitLab From 2db4f9f05c3e3fb5c500f3e565d10e155072207d Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 17 Jul 2024 21:54:40 +0530 Subject: [PATCH 077/110] ASAN and MSAN fixes, LTV crash fix for -10dB stereo stream [x] ASAN error fixes [x] MSAN error fixes [x] Fix for ltv-Stereo downmix to bit-exact EVS at 13200 kbps, 32kHz in, 32kHz out crash for -10dB stream --- lib_com/hq2_bit_alloc_fx.c | 12 ++++++++++++ lib_com/ivas_prot.h | 14 +++++++------- lib_dec/ivas_sba_rendering_internal.c | 5 +++-- lib_enc/init_enc.c | 3 +++ lib_enc/ivas_core_pre_proc_front.c | 9 +++++---- lib_enc/ivas_mc_paramupmix_enc.c | 4 ++++ lib_enc/speech_music_classif.c | 5 +++-- 7 files changed, 37 insertions(+), 15 deletions(-) diff --git a/lib_com/hq2_bit_alloc_fx.c b/lib_com/hq2_bit_alloc_fx.c index 1f5a146c0..c43b11ae5 100644 --- a/lib_com/hq2_bit_alloc_fx.c +++ b/lib_com/hq2_bit_alloc_fx.c @@ -312,6 +312,12 @@ void hq2_bit_alloc_har_fx( Word16 exp_shift; +#ifdef BASOP_NOGLOB + Flag Overflow; + Overflow = 0; + move32(); +#endif + L_THR1 = L_shl( L_deposit_l( THR1 ), SWB_BWE_LR_QRk ); L_THR2 = L_shl( L_deposit_l( THR2 ), SWB_BWE_LR_QRk ); L_THR3 = L_shl( L_deposit_l( THR3 ), SWB_BWE_LR_QRk ); @@ -566,7 +572,13 @@ void hq2_bit_alloc_har_fx( L_temp = Mult_32_16( L_Ravg_sub[GRP_SB - 1], sub( GRP_SB, 1 ) ); /* Qbe+0+1 */ L_temp = Mult_32_16( L_temp, Inv_norm_sum_fx ); /* Qbe+1+QIpb+1 */ +#ifdef BASOP_NOGLOB + lf_hf_ge_r_fx = round_fx_o( L_shl_o( L_temp, sub( 15 + 16, sub( add( SWB_BWE_LR_Qbe, QIns ), 30 ) ), &Overflow ), &Overflow ); + Overflow = 0; /* reset BASOP Overflow */ + move32(); +#else lf_hf_ge_r_fx = round_fx( L_shl( L_temp, sub( 15 + 16, sub( add( SWB_BWE_LR_Qbe, QIns ), 30 ) ) ) ); +#endif exp_normn = norm_s( norm_sum_fx ); exp_normn = sub( exp_normn, 1 ); diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 5dcff25ea..e476e3a49 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5521,13 +5521,13 @@ ivas_error ivas_sba_linear_renderer( ); #ifdef IVAS_FLOAT_FIXED void ivas_sba_mix_matrix_determiner_fx( - SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ - Word32 *output_fx[], /* i/o: transport/output audio channels */ - const Word16 bfi, /* i : BFI flag */ - const Word16 nchan_remapped, /* i : num channels after remapping of TCs */ - const Word16 output_frame, /* i : output frame length */ - const Word16 num_md_sub_frames, /* i : number of subframes in mixing matrix */ - const Word16 Q_p_Output /* i : number of subframes in mixing matrix */ + SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ + Word32 *output_fx[], /* i/o: transport/output audio channels */ + const Word16 bfi, /* i : BFI flag */ + const Word16 nchan_remapped, /* i : num channels after remapping of TCs */ + const Word16 output_frame, /* i : output frame length */ + const Word16 num_md_sub_frames, /* i : number of subframes in mixing matrix*/ + const Word16 Q_output /* i : Q of transport/output audio channels */ ); #endif // IVAS_FLOAT_FIXED diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index e925bd3e6..19113a09a 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -861,7 +861,7 @@ void ivas_sba_mix_matrix_determiner_fx( const Word16 nchan_remapped, /* i : num channels after remapping of TCs */ const Word16 output_frame, /* i : output frame length */ const Word16 num_md_sub_frames, /* i : number of subframes in mixing matrix*/ - const Word16 Q_output /* i : number of subframes in mixing matrix*/ + const Word16 Q_output /* i : Q of transport/output audio channels */ ) { Word16 i, ch; @@ -899,6 +899,7 @@ void ivas_sba_mix_matrix_determiner_fx( nchan_out = nchan_transport; move16(); ivas_agc_dec_process_fx( hSpar->hAgcDec, ( output_fx ), ( output_fx ), nchan_transport, output_frame ); + Q_p_output = sub( Q_p_output, 3 ); #ifdef DUMPS_ENABLED dbgwrite_txt( &output[0][0], output_frame, "fix_ivas_agc_dec_process_output.txt", NULL ); #endif // DUMPS_ENABLED @@ -908,7 +909,7 @@ void ivas_sba_mix_matrix_determiner_fx( { FOR( i = 0; i < output_frame; i++ ) { - output_fx[ch][i] = Mult_32_32( L_shl_sat( output_fx[ch][i], sub( 18, Q_p_output ) ), L_shl_sat( PCM16_TO_FLT_FAC_FX, 16 ) ); /*Q-0*/ + output_fx[ch][i] = Mult_32_32( L_shl_sat( output_fx[ch][i], sub( 15, Q_p_output ) ), L_shl_sat( PCM16_TO_FLT_FAC_FX, 16 ) ); /* Q0 */ } } diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index f0e08363a..44b398a89 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -490,6 +490,9 @@ ivas_error init_encoder( st->lp_speech = 45.0f; /* Initialize the long-term active speech level in dB */ st->lp_noise = 0.0f; +#ifdef IVAS_FLOAT_FIXED + st->lp_noise_fx = 0; +#endif st->flag_noisy_speech_snr = 0; st->fd_cng_reset_flag = 0; st->cng_type = -1; diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index acf656866..344d03098 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -920,7 +920,7 @@ ivas_error pre_proc_front_ivas_fx( float sp_div, PS[128]; /* speech/music clasif. parameters */ int16_t L_look; /* length of look-ahead */ #if 1 - float snr_sum_he; /* HE SAD parameters */ + float snr_sum_he; /* HE SAD parameters */ #endif float mem_decim_dummy[2 * L_FILT_MAX]; /* dummy decimation filter memory */ float temp1F_icatdmResampBuf[L_FILT_MAX]; /* temp buffers for ICA TDM resamplers */ @@ -962,8 +962,8 @@ ivas_error pre_proc_front_ivas_fx( Word16 *temp1F_icatdmResampBuf_fx; Word16 *old_inp_12k8_fx; Word16 *old_inp_16k_fx; - Word16 *mem_decim_dummy_fx; /* dummy decimation filter memory */ - Word32 Etot_fx; /* total energy */ + Word16 *mem_decim_dummy_fx; /* dummy decimation filter memory */ + Word32 Etot_fx; /* total energy */ #if 0 Word32 fr_bands_fx[2 * NB_BANDS]; /* energy in frequency bands */ Word16 Q_new; @@ -1354,7 +1354,7 @@ ivas_error pre_proc_front_ivas_fx( { mvr2r( new_inp_12k8, st->buf_speech_enc_flt + L_FRAME32k, L_FRAME ); } -#ifndef MSAN_FIX /*To be enabled when updations related to new_inp_12k8_fx is enabled */ +#ifndef MSAN_FIX/*To be enabled when updations related to new_inp_12k8_fx is enabled */ #if 1 IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) { @@ -1730,6 +1730,7 @@ ivas_error pre_proc_front_ivas_fx( st->lt_mean_NB_fx = (Word16) st->lt_mean_NB * ( 1 << 11 ); st->lt_mean_WB_fx = (Word16) st->lt_mean_WB * ( 1 << 11 ); st->lt_mean_SWB_fx = (Word16) st->lt_mean_SWB * ( 1 << 11 ); + st->lp_noise_fx = (Word16) st->lp_noise * ( 1 << 8 ); //have taken Q8 as above one functions uses Q8 #endif bw_detect_fx( st, st->input_fx, NULL, enerBuffer_fx, sf_energySum, ivas_format, 0 ); diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index ea0fd5bfb..9c3d0bfb1 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -859,7 +859,11 @@ static void ivas_mc_paramupmix_param_est_enc( } set_s( q_ppIn_FR, Q31, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH ); +#ifdef MSAN_FIX + FOR( i = 0; i < MC_PARAMUPMIX_NCH; i++ ) +#else FOR( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) +#endif { q_ppIn_FR[i] = L_get_q_buf1( pp_in_fr_real[i], input_frame ); q_ppIn_FR[i] = min( q_ppIn_FR[i], L_get_q_buf1( pp_in_fr_imag[i], input_frame ) ); diff --git a/lib_enc/speech_music_classif.c b/lib_enc/speech_music_classif.c index 8f536dbd5..8ff7d2545 100644 --- a/lib_enc/speech_music_classif.c +++ b/lib_enc/speech_music_classif.c @@ -126,6 +126,7 @@ void speech_music_clas_init( hSpMusClas->dlp_var_LT_fx = 0; #ifdef MSAN_FIX hSpMusClas->dlp_mean_LT_fx = 0; + set16_fx( hSpMusClas->past_dlp_fx, 0, HANG_LEN - 1 ); #endif // MSAN_FIX #endif hSpMusClas->dlp_mean_LT = 0.0f; @@ -135,8 +136,8 @@ void speech_music_clas_init( { hSpMusClas->prev_FV[i] = 0.5f * hout_intervals[2 * i] + 0.5f * hout_intervals[2 * i + 1]; #ifdef IVAS_FLOAT_FIXED - hSpMusClas->prev_FV_fx[i] = (Word32) ( hSpMusClas->prev_FV[i] * ONE_IN_Q20 ); -#endif + hSpMusClas->prev_FV_fx[i] =( Word32)( hSpMusClas->prev_FV[i] * ONE_IN_Q20 ); + #endif } for ( i = 0; i < NB_BANDS_SPMUS; i++ ) -- GitLab From cda92559b6c5c1012724cf35323b5b3faa6dc3bc Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 17 Jul 2024 22:02:32 +0530 Subject: [PATCH 078/110] Clang formatting changes --- lib_enc/ivas_core_pre_proc_front.c | 10 +++++----- lib_enc/speech_music_classif.c | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index 344d03098..616d5cc15 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -920,7 +920,7 @@ ivas_error pre_proc_front_ivas_fx( float sp_div, PS[128]; /* speech/music clasif. parameters */ int16_t L_look; /* length of look-ahead */ #if 1 - float snr_sum_he; /* HE SAD parameters */ + float snr_sum_he; /* HE SAD parameters */ #endif float mem_decim_dummy[2 * L_FILT_MAX]; /* dummy decimation filter memory */ float temp1F_icatdmResampBuf[L_FILT_MAX]; /* temp buffers for ICA TDM resamplers */ @@ -962,8 +962,8 @@ ivas_error pre_proc_front_ivas_fx( Word16 *temp1F_icatdmResampBuf_fx; Word16 *old_inp_12k8_fx; Word16 *old_inp_16k_fx; - Word16 *mem_decim_dummy_fx; /* dummy decimation filter memory */ - Word32 Etot_fx; /* total energy */ + Word16 *mem_decim_dummy_fx; /* dummy decimation filter memory */ + Word32 Etot_fx; /* total energy */ #if 0 Word32 fr_bands_fx[2 * NB_BANDS]; /* energy in frequency bands */ Word16 Q_new; @@ -1354,7 +1354,7 @@ ivas_error pre_proc_front_ivas_fx( { mvr2r( new_inp_12k8, st->buf_speech_enc_flt + L_FRAME32k, L_FRAME ); } -#ifndef MSAN_FIX/*To be enabled when updations related to new_inp_12k8_fx is enabled */ +#ifndef MSAN_FIX /*To be enabled when updations related to new_inp_12k8_fx is enabled */ #if 1 IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) { @@ -1730,7 +1730,7 @@ ivas_error pre_proc_front_ivas_fx( st->lt_mean_NB_fx = (Word16) st->lt_mean_NB * ( 1 << 11 ); st->lt_mean_WB_fx = (Word16) st->lt_mean_WB * ( 1 << 11 ); st->lt_mean_SWB_fx = (Word16) st->lt_mean_SWB * ( 1 << 11 ); - st->lp_noise_fx = (Word16) st->lp_noise * ( 1 << 8 ); //have taken Q8 as above one functions uses Q8 + st->lp_noise_fx = (Word16) st->lp_noise * ( 1 << 8 ); // have taken Q8 as above one functions uses Q8 #endif bw_detect_fx( st, st->input_fx, NULL, enerBuffer_fx, sf_energySum, ivas_format, 0 ); diff --git a/lib_enc/speech_music_classif.c b/lib_enc/speech_music_classif.c index 8ff7d2545..e41e50052 100644 --- a/lib_enc/speech_music_classif.c +++ b/lib_enc/speech_music_classif.c @@ -136,8 +136,8 @@ void speech_music_clas_init( { hSpMusClas->prev_FV[i] = 0.5f * hout_intervals[2 * i] + 0.5f * hout_intervals[2 * i + 1]; #ifdef IVAS_FLOAT_FIXED - hSpMusClas->prev_FV_fx[i] =( Word32)( hSpMusClas->prev_FV[i] * ONE_IN_Q20 ); - #endif + hSpMusClas->prev_FV_fx[i] = (Word32) ( hSpMusClas->prev_FV[i] * ONE_IN_Q20 ); +#endif } for ( i = 0; i < NB_BANDS_SPMUS; i++ ) -- GitLab From 8d51792c9607878430377166f6ac2be50f024eb2 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 18 Jul 2024 11:07:24 +0530 Subject: [PATCH 079/110] LTV streams +10dB scaled input crash fixes [x] LTV crash occurring in SynthesisSTFT function resolved. --- lib_com/fd_cng_com_fx.c | 12 +- lib_com/prot_fx2.h | 10 + lib_dec/acelp_core_dec_ivas_fx.c | 2 +- lib_dec/fd_cng_dec_fx.c | 543 +++++++++++++++++++++++++++++++ 4 files changed, 561 insertions(+), 6 deletions(-) diff --git a/lib_com/fd_cng_com_fx.c b/lib_com/fd_cng_com_fx.c index 9e0f2e375..c8387c40a 100644 --- a/lib_com/fd_cng_com_fx.c +++ b/lib_com/fd_cng_com_fx.c @@ -2511,7 +2511,7 @@ void SynthesisSTFT( { FOR( i = 0; i < len; i++ ) { - olapBuffer[i] = round_fx( L_shl( fftBuffer[i], fftBufferExp - 15 ) ); + olapBuffer[i] = extract_l( L_shr_r( fftBuffer[i], 31 - fftBufferExp ) ); move16(); } } @@ -2519,9 +2519,11 @@ void SynthesisSTFT( { FOR( i = 0; i < len4; i++ ) { - olapBuffer[i + 1 * len4] = add_sat( olapBuffer[i + 1 * len4], mult_r( round_fx( L_shl( fftBuffer[i + 1 * len4], fftBufferExp - 15 ) ), olapWin[i].v.im ) ); + // olapBuffer[i + 1 * len4] = add_sat( olapBuffer[i + 1 * len4], mult_r( round_fx( L_shl( fftBuffer[i + 1 * len4], fftBufferExp - 15 ) ), olapWin[i].v.im ) ); + olapBuffer[i + 1 * len4] = add_sat( olapBuffer[i + 1 * len4], mult_r( extract_l( L_shr_r( fftBuffer[i + 1 * len4], 31 - fftBufferExp ) ), olapWin[i].v.im ) ); move16(); - olapBuffer[i + 2 * len4] = add_sat( olapBuffer[i + 2 * len4], mult_r( round_fx( L_shl( fftBuffer[i + 2 * len4], fftBufferExp - 15 ) ), olapWin[len4 - 1 - i].v.re ) ); + // olapBuffer[i + 2 * len4] = add_sat( olapBuffer[i + 2 * len4], mult_r( round_fx( L_shl( fftBuffer[i + 2 * len4], fftBufferExp - 15 ) ), olapWin[len4 - 1 - i].v.re ) ); + olapBuffer[i + 2 * len4] = add_sat( olapBuffer[i + 2 * len4], mult_r( extract_l( L_shr_r( fftBuffer[i + 2 * len4], 31 - fftBufferExp ) ), olapWin[len4 - 1 - i].v.re ) ); move16(); } FOR( i = len3; i < len; i++ ) @@ -2532,9 +2534,9 @@ void SynthesisSTFT( FOR( i = 0; i < len4; i++ ) { - olapBuffer[i + 5 * len4] = mult_r( round_fx( L_shl( fftBuffer[i + 5 * len4], fftBufferExp - 15 ) ), olapWin[i].v.re ); + olapBuffer[i + 5 * len4] = mult_r( extract_l( L_shr_r( fftBuffer[i + 5 * len4], 31 - fftBufferExp ) ), olapWin[i].v.re ); move16(); - olapBuffer[i + 6 * len4] = mult_r( round_fx( L_shl( fftBuffer[i + 6 * len4], fftBufferExp - 15 ) ), olapWin[len4 - 1 - i].v.im ); + olapBuffer[i + 6 * len4] = mult_r( extract_l( L_shr_r( fftBuffer[i + 6 * len4], 31 - fftBufferExp ) ), olapWin[len4 - 1 - i].v.im ); move16(); } diff --git a/lib_com/prot_fx2.h b/lib_com/prot_fx2.h index 8185faf56..5ea27f5d8 100644 --- a/lib_com/prot_fx2.h +++ b/lib_com/prot_fx2.h @@ -7056,6 +7056,16 @@ void generate_comfort_noise_dec_fx( const Word16 nchan_out /* i : number of output channels */ ); +void generate_comfort_noise_dec_ivas_fx( + Word32 **bufferReal, /* o : matrix to real part of i bands */ + Word32 **bufferImag, /* o : matrix to imaginary part of i bands */ + Word16 *bufferScale, /* o : pointer to scalefactor for real and imaginary part of i bands */ + Decoder_State *stdec, + Word16 *Q_new, + Word16 gen_exc, + const Word16 nchan_out /* i : number of output channels */ +); + void generate_comfort_noise_dec_hf_fx( Word32 **bufferReal, /* o : matrix to real part of i bands */ Word32 **bufferImag, /* o : matrix to imaginary part of i bands */ Word16 *bufferScale, /* o : pointer to scalefactor for real and imaginary part of i bands */ diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index 422d9c5c6..8e84bc1ed 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -692,7 +692,7 @@ ivas_error acelp_core_dec_ivas_fx( } } - generate_comfort_noise_dec_fx( NULL, NULL, NULL, st, &( st->Q_exc ), 1, nchan_out ); + generate_comfort_noise_dec_ivas_fx( NULL, NULL, NULL, st, &( st->Q_exc ), 1, nchan_out ); FdCng_exc( st->hFdCngDec->hFdCngCom, &st->CNG_mode, st->L_frame, st->lsp_old_fx, st->first_CNG, st->lspCNG_fx, Aq_fx, lsp_new_fx, lsf_new_fx, exc_fx, exc2_fx, bwe_exc_fx ); diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index c02850ada..a97ac3809 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -3803,6 +3803,549 @@ void generate_comfort_noise_dec_fx( } } +void generate_comfort_noise_dec_ivas_fx( + Word32 **bufferReal, /* o : Real part of input bands */ + Word32 **bufferImag, /* o : Imaginary part of input bands */ + Word16 *bufferScale, /* o : pointer to scalefactor for real and imaginary part of input bands */ + Decoder_State *st, /* i/o: decoder state structure */ + Word16 *Q_new, + Word16 gen_exc, + const Word16 nchan_out /* i : number of output channels */ +) +{ + Word16 i, j, s; + Word32 *ptr_r, *ptr_i; + HANDLE_FD_CNG_DEC hFdCngDec = st->hFdCngDec; + HANDLE_FD_CNG_COM hFdCngCom = hFdCngDec->hFdCngCom; + Word32 *cngNoiseLevel = hFdCngCom->cngNoiseLevel; + Word16 cngNoiseLevel_exp = hFdCngCom->cngNoiseLevelExp; + + Word32 *ptr_level = cngNoiseLevel; + Word16 *seed = &( hFdCngCom->seed ); + Word16 *seed2; + Word16 c1, c2; + Word32 tmp1, tmp2; + Word16 scaleCldfb; + Word32 *fftBuffer = hFdCngCom->fftBuffer; + Word16 fftBuffer_exp = hFdCngCom->fftBuffer_exp; + Word16 fftBuffer_temp_exp[FFTLEN]; + Word16 *timeDomainOutput = hFdCngCom->timeDomainBuffer; + Word16 temp; + Word32 sqrtNoiseLevel; + Word16 sqrtNoiseLevel_exp; + Word16 idx = 0; + move16(); + Word16 preemph_fac; + Word16 old_syn_pe_tmp[16]; + Word16 tcx_transition = 0; + TCX_DEC_HANDLE hTcxDec; + move16(); + + hTcxDec = st->hTcxDec; + + scaleCldfb = mult( hFdCngCom->invScalingFactor, CLDFB_SCALING ); + + temp = 0; + move16(); + c1 = Sqrt16( hFdCngCom->coherence_fx, &temp ); + c1 = shl( c1, temp ); + temp = 0; + move16(); + c2 = Sqrt16( sub( MAX_16, hFdCngCom->coherence_fx ), &temp ); + c2 = shl( c2, temp ); + + temp = getScaleFactor32( fftBuffer, FFTLEN ); + scale_sig32( fftBuffer, FFTLEN, temp ); + fftBuffer_exp = sub( fftBuffer_exp, temp ); + hFdCngCom->fftBuffer_exp = fftBuffer_exp; + move16(); + set16_fx( fftBuffer_temp_exp, fftBuffer_exp, FFTLEN ); + fftBuffer_exp = 0; + move16(); + + seed2 = &( hFdCngCom->seed2 ); + if ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && EQ_16( st->idchan, 1 ) ) + { + seed2 = &( hFdCngCom->seed3 ); + } + + /* Generate Gaussian random noise in real and imaginary parts of the FFT bins + Amplitudes are adjusted to the estimated noise level cngNoiseLevel_flt in each bin */ + + IF( hFdCngCom->startBand == 0 ) + { + test(); + test(); + IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) || ( EQ_16( st->element_mode, IVAS_SCE ) && st->cng_ism_flag ) ) + { + rand_gauss_fx( &tmp1, seed, Q15 ); + rand_gauss_fx( &tmp2, seed2, Q15 ); + fftBuffer[0] = L_add( Mpy_32_16_1( tmp1, c1 ), Mpy_32_16_1( tmp2, c2 ) ); + move32(); + fftBuffer_temp_exp[0] = Q16 + Q15; + } + ELSE + { + rand_gauss_fx( &fftBuffer[0], seed, Q15 ); + fftBuffer_temp_exp[0] = Q16; + move16(); + } + sqrtNoiseLevel_exp = cngNoiseLevel_exp; + move16(); + sqrtNoiseLevel = Sqrt32( *ptr_level, &sqrtNoiseLevel_exp ); + fftBuffer[0] = Mpy_32_32( fftBuffer[0], sqrtNoiseLevel ); + move32(); + fftBuffer_temp_exp[0] = add( sqrtNoiseLevel_exp, fftBuffer_temp_exp[0] ); + move16(); + ptr_level++; + ptr_r = fftBuffer + 2; + idx = 2; + } + ELSE + { + fftBuffer[0] = 0; + move16(); + set32_fx( fftBuffer + 2, 0, shl( sub( hFdCngCom->startBand, 1 ), 1 ) ); + ptr_r = fftBuffer + shl( hFdCngCom->startBand, 1 ); + idx = shl( hFdCngCom->startBand, 1 ); + } + + ptr_i = ptr_r + 1; + FOR( ; ptr_level < cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); ptr_level++ ) + { + /* Real part in FFT bins */ + test(); + test(); + IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) || ( EQ_16( st->element_mode, IVAS_SCE ) && st->cng_ism_flag ) ) + { + rand_gauss_fx( &tmp1, seed, Q15 ); + rand_gauss_fx( &tmp2, seed2, Q15 ); + *ptr_r = L_add( Mpy_32_16_1( tmp1, c1 ), Mpy_32_16_1( tmp2, c2 ) ); + move32(); + fftBuffer_temp_exp[idx] = Q16; + move16(); + } + ELSE + { + rand_gauss_fx( ptr_r, seed, Q15 ); + fftBuffer_temp_exp[idx] = Q16; + move16(); + } + + sqrtNoiseLevel_exp = sub( cngNoiseLevel_exp, 1 ); + sqrtNoiseLevel = Sqrt32( *ptr_level, &sqrtNoiseLevel_exp ); + ( *ptr_r ) = Mpy_32_32( ( *ptr_r ), sqrtNoiseLevel ); + move32(); + fftBuffer_temp_exp[idx] = add( fftBuffer_temp_exp[idx], sqrtNoiseLevel_exp ); + move16(); + idx = add( idx, 1 ); + ptr_r += 2; + + /* Imaginary part in FFT bins */ + test(); + test(); + IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) || ( EQ_16( st->element_mode, IVAS_SCE ) && st->cng_ism_flag ) ) + { + rand_gauss_fx( &tmp1, seed, Q15 ); + rand_gauss_fx( &tmp2, seed2, Q15 ); + *ptr_i = L_add( Mpy_32_16_1( tmp1, c1 ), Mpy_32_16_1( tmp2, c2 ) ); + move32(); + fftBuffer_temp_exp[idx] = Q16; + move16(); + } + ELSE + { + rand_gauss_fx( ptr_i, seed, Q15 ); + fftBuffer_temp_exp[idx] = Q16; + move16(); + } + sqrtNoiseLevel_exp = sub( cngNoiseLevel_exp, 1 ); + sqrtNoiseLevel = Sqrt32( *ptr_level, &sqrtNoiseLevel_exp ); + ( *ptr_i ) = Mpy_32_32( ( *ptr_i ), sqrtNoiseLevel ); + move32(); + fftBuffer_temp_exp[idx] = add( fftBuffer_temp_exp[idx], sqrtNoiseLevel_exp ); + move16(); + idx = add( idx, 1 ); + ptr_i += 2; + } + + /* Remaining FFT bins are set to zero */ + set32_fx( fftBuffer + shl( hFdCngCom->stopFFTbin, 1 ), 0, sub( hFdCngCom->fftlen, shl( hFdCngCom->stopFFTbin, 1 ) ) ); + set16_fx( fftBuffer_temp_exp + shl( hFdCngCom->stopFFTbin, 1 ), 0, sub( hFdCngCom->fftlen, shl( hFdCngCom->stopFFTbin, 1 ) ) ); + + /* Nyquist frequency is discarded */ + fftBuffer[1] = 0; + move32(); + + fftBuffer_exp = MAX_16; + move16(); + FOR( i = 0; i < FFTLEN; i++ ) + { + if ( fftBuffer[i] != 0 ) + { + fftBuffer_exp = s_min( fftBuffer_exp, add( sub( 31, fftBuffer_temp_exp[i] ), norm_l( fftBuffer[i] ) ) ); + } + } + if ( EQ_16( fftBuffer_exp, MAX_16 ) ) + { + fftBuffer_exp = 0; + move16(); + } + fftBuffer_exp = sub( 31, fftBuffer_exp ); + FOR( i = 0; i < FFTLEN; i++ ) + { + fftBuffer[i] = L_shr( fftBuffer[i], sub( fftBuffer_exp, fftBuffer_temp_exp[i] ) ); + move32(); + } + + /* If previous frame is active, reset the overlap-add buffer */ + tcx_transition = 0; + move16(); + IF( EQ_16( hFdCngCom->frame_type_previous, ACTIVE_FRAME ) ) + { + set16_fx( hFdCngCom->olapBufferSynth, 0, hFdCngCom->fftlen ); + test(); + test(); + if ( ( st->last_core_bfi > ACELP_CORE && EQ_16( st->codec_mode, MODE2 ) ) || EQ_16( st->codec_mode, MODE1 ) ) + { + tcx_transition = 1; + move16(); + } + } + + /* Perform STFT synthesis */ + SynthesisSTFT( fftBuffer, fftBuffer_exp, timeDomainOutput, hFdCngCom->olapBufferSynth, hFdCngCom->olapWinSyn, + tcx_transition, hFdCngCom, gen_exc, Q_new, st->element_mode, nchan_out ); + scale_sig32( fftBuffer + hFdCngCom->fftlen, sub( FFTLEN, hFdCngCom->fftlen ), sub( fftBuffer_exp, hFdCngCom->fftBuffer_exp ) ); + + { + Word32 Lener, att; + Word16 exp; + /* update CNG excitation energy for LP_CNG */ + + /* calculate the residual signal energy */ + /*enr = dotp( hFdCngCom->exc_cng, hFdCngCom->exc_cng, hFdCngCom->frameSize ) / hFdCngCom->frameSize;*/ + Lener = Dot_productSq16HQ( 1, hFdCngCom->exc_cng, st->L_frame, &exp ); + exp = add( sub( shl( sub( 15, *Q_new ), 1 ), 8 ), exp ); /*8 = log2(256)*/ + + /* convert log2 of residual signal energy */ + /*(float)log10( enr + 0.1f ) / (float)log10( 2.0f );*/ + Lener = BASOP_Util_Log2( Lener ); + Lener = L_add( Lener, L_shl( L_deposit_l( exp ), WORD32_BITS - 1 - LD_DATA_SCALE ) ); /*Q25*/ + if ( EQ_16( st->L_frame, L_FRAME16k ) ) + { + Lener = L_sub( Lener, 10802114l /*0.3219280949f Q25*/ ); /*log2(320) = 8.3219280949f*/ + } + /* decrease the energy in case of WB input */ + IF( st->bwidth != NB ) + { + IF( EQ_16( st->bwidth, WB ) ) + { + IF( st->CNG_mode >= 0 ) + { + /* Bitrate adapted attenuation */ + att = L_shl( L_deposit_l( ENR_ATT_fx[st->CNG_mode] ), 17 ); + } + ELSE + { + /* Use least attenuation for higher bitrates */ + att = L_shl( L_deposit_l( ENR_ATT_fx[4] ), 17 ); + } + } + ELSE + { + att = 384 << 17; + move16(); /*1.5 Q8<<17=Q25*/ + } + Lener = L_sub( Lener, att ); + } + /*st->lp_ener = 0.8f * stcod->lp_ener + 0.2f * pow( 2.0f, enr );*/ + Lener = BASOP_util_Pow2( Lener, 6, &exp ); + Lener = Mult_32_16( Lener, 6554 /*0.2f Q15*/ ); + exp = sub( 25, exp ); + Lener = L_shr( Lener, exp ); /*Q6*/ + st->lp_ener_fx = L_add( Mult_32_16( st->lp_ener_fx, 26214 /*0.8f Q15*/ ), Lener ); /*Q6*/ + } + + /* Generate Gaussian random noise in real and imaginary parts of the CLDFB bands + Amplitudes are adjusted to the estimated noise level cngNoiseLevel_flt in each band */ + + test(); + IF( bufferReal != NULL && ( LT_16( hFdCngCom->numCoreBands, hFdCngCom->regularStopBand ) ) ) + { + Word16 bufferReal_exp[CLDFB_NO_COL_MAX]; + Word16 bufferImag_exp[CLDFB_NO_COL_MAX]; + *bufferScale = 0; + move16(); + FOR( j = hFdCngCom->numCoreBands; j < hFdCngCom->regularStopBand; j++ ) + { + sqrtNoiseLevel_exp = add( CLDFBinvScalingFactor_EXP, sub( cngNoiseLevel_exp, 1 ) ); + sqrtNoiseLevel = Sqrt32( Mpy_32_16_1( *ptr_level, scaleCldfb ), &sqrtNoiseLevel_exp ); + + FOR( i = 0; i < hFdCngCom->numSlots; i++ ) + { + /* Real part in CLDFB band */ + IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) || ( EQ_16( st->element_mode, IVAS_SCE ) && st->cng_ism_flag ) ) + { + rand_gauss_fx( &tmp1, seed, Q15 ); + rand_gauss_fx( &tmp2, seed2, Q15 ); + bufferReal[i][j] = L_add( Mpy_32_16_1( tmp1, c1 ), Mpy_32_16_1( tmp2, c2 ) ); + move32(); + bufferReal_exp[j] = Q16; + move16(); + } + ELSE + { + rand_gauss_fx( &bufferReal[i][j], seed, Q15 ); + move32(); + bufferReal_exp[j] = Q16; + move16(); + } + + bufferReal[i][j] = Mpy_32_32( bufferReal[i][j], sqrtNoiseLevel ); + move32(); + bufferReal_exp[j] = add( bufferReal_exp[j], sqrtNoiseLevel_exp ); + move16(); + + /* Imaginary part in CLDFB band */ + IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) || ( EQ_16( st->element_mode, IVAS_SCE ) && st->cng_ism_flag ) ) + { + rand_gauss_fx( &tmp1, seed, Q15 ); + rand_gauss_fx( &tmp2, seed2, Q15 ); + bufferImag[i][j] = L_add( Mpy_32_16_1( tmp1, c1 ), Mpy_32_16_1( tmp2, c2 ) ); + move32(); + bufferImag_exp[j] = Q16; + move16(); + } + ELSE + { + rand_gauss_fx( &bufferImag[i][j], seed, Q15 ); + bufferImag_exp[j] = Q16; + move16(); + } + bufferImag[i][j] = Mpy_32_32( bufferImag[i][j], sqrtNoiseLevel ); + bufferImag_exp[j] = add( bufferImag_exp[j], sqrtNoiseLevel_exp ); + move16(); + + move32(); + } + ptr_level++; + } + + FOR( j = hFdCngCom->numCoreBands; j < hFdCngCom->regularStopBand; j++ ) + { + *bufferScale = s_max( *bufferScale, bufferReal_exp[j] ); + move16(); + *bufferScale = s_max( *bufferScale, bufferImag_exp[j] ); + move16(); + } + + FOR( j = hFdCngCom->numCoreBands; j < hFdCngCom->regularStopBand; j++ ) + { + FOR( i = 0; i < hFdCngCom->numSlots; i++ ) + { + bufferImag[i][j] = L_shr( bufferImag[i][j], sub( *bufferScale, bufferImag_exp[j] ) ); + move32(); + bufferReal[i][j] = L_shr( bufferReal[i][j], sub( *bufferScale, bufferReal_exp[j] ) ); + move32(); + } + } + } + + test(); + IF( EQ_16( hFdCngCom->frame_type_previous, ACTIVE_FRAME ) && EQ_16( st->codec_mode, MODE2 ) ) + { + Word32 old_exc_ener, gain, noise32; + Word16 seed_loc, lpcorder, old_syn, tmp, gain16, N, N2, N4, N8; + Word16 old_exc_ener_exp, gain_exp; + Word16 normFacE, normShiftE, normShiftEM1; + Word16 normFacG, normShiftG, normShiftGM1; + Word16 noiseExp, *old_exc, *old_Aq, *old_syn_pe; + Word16 noise[640], normShiftP2; + Word16 Q_exc, Q_syn; + + + assert( hFdCngCom->frameSize <= 640 ); + + seed_loc = hFdCngCom->seed; + move16(); + N = hFdCngCom->frameSize; + move16(); + N2 = shr( hFdCngCom->frameSize, 1 ); + + IF( st->last_core_bfi > ACELP_CORE ) + { + Word16 left_overlap_mode; + left_overlap_mode = st->hTcxCfg->tcx_last_overlap_mode; + move16(); + if ( EQ_16( left_overlap_mode, ALDO_WINDOW ) ) + { + left_overlap_mode = FULL_OVERLAP; + move16(); + } + tcx_windowing_synthesis_current_frame( timeDomainOutput, st->hTcxCfg->tcx_mdct_window, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, st->hTcxCfg->tcx_mdct_window_length, st->hTcxCfg->tcx_mdct_window_half_length, + st->hTcxCfg->tcx_mdct_window_min_length, 0, left_overlap_mode, NULL, NULL, NULL, NULL, NULL, shr( N, 1 ), shr( sub( abs_s( st->hTcxCfg->tcx_offset ), st->hTcxCfg->tcx_offset ), 1 ), 1, 0, 0 ); + + IF( st->hTcxCfg->last_aldo != 0 ) + { + FOR( i = 0; i < sub( hFdCngCom->frameSize, NS2SA( st->sr_core, N_ZERO_MDCT_NS ) ); i++ ) + { + timeDomainOutput[i] = add( timeDomainOutput[i], shr_r( st->hHQ_core->old_out_LB_fx[i + NS2SA( st->sr_core, N_ZERO_MDCT_NS )], st->hHQ_core->Q_old_wtda_LB ) ); + move16(); + } + } + ELSE + { + tcx_windowing_synthesis_past_frame( hTcxDec->syn_Overl, st->hTcxCfg->tcx_mdct_window, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, + st->hTcxCfg->tcx_mdct_window_length, st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, st->hTcxCfg->tcx_last_overlap_mode ); + + FOR( i = 0; i < st->hTcxCfg->tcx_mdct_window_length; i++ ) + { + timeDomainOutput[i] = add( timeDomainOutput[i], shl( hTcxDec->syn_Overl[i], TCX_IMDCT_HEADROOM ) ); + move16(); + } + } + } + ELSE + { + + /* + - the scaling of the LPCs (e.g. old_Aq) is always Q12 (encoder or decoder) + + - the scaling of the deemphasized signals (e.g. old_syn) is always Q0 (encoder or decoder) + + - the scaling of the excitation signals in the encoder (e.g. old_exc) is Q_new + - the scaling of the preemphasized signals in the encoder (e.g. old_syn_pe) is Q_new-1 + + - the scaling of the excitation signals in the decoder (e.g. old_exc) is Q_exc (or stdec->Q_exc) + - the scaling of the preemphasized signals in the decoder (e.g. old_syn_pe) is Q_syn (or stdec->Q_syn) + */ + + lpcorder = M; + move16(); + old_Aq = st->old_Aq_12_8_fx; + old_exc = st->old_exc_fx + sub( L_EXC_MEM_DEC, N2 ); + old_syn_pe = st->mem_syn2_fx; + old_syn = st->syn[lpcorder]; + move16(); + preemph_fac = st->preemph_fac; + move16(); + Q_exc = st->Q_exc; + move16(); + Q_syn = st->Q_syn; + move16(); + + /* shift to be in the range of values supported by getNormReciprocalWord16() */ + N8 = shr( N2, CNG_NORM_RECIPROCAL_RANGE_SHIFT ); + + assert( N2 == ( N8 << CNG_NORM_RECIPROCAL_RANGE_SHIFT ) ); + + normFacE = getNormReciprocalWord16( N8 ); + normShiftE = BASOP_util_norm_s_bands2shift( N8 ); + normShiftEM1 = sub( normShiftE, 1 ); + normShiftP2 = add( normShiftE, CNG_NORM_RECIPROCAL_RANGE_SHIFT ); + + old_exc_ener = L_shr( L_mult( old_exc[0], old_exc[0] ), normShiftP2 ); + FOR( i = 1; i < N2; i++ ) + { + old_exc_ener = L_add( old_exc_ener, L_shr( L_mult( old_exc[i], old_exc[i] ), normShiftP2 ) ); + } + old_exc_ener = L_shl( Mpy_32_16_1( old_exc_ener, shl( normFacE, normShiftEM1 ) ), 1 ); + + old_exc_ener_exp = 0; + move16(); + old_exc_ener = Sqrt32( old_exc_ener, &old_exc_ener_exp ); + old_exc_ener_exp = add( old_exc_ener_exp, ( sub( 15, Q_exc ) ) ); + + /* shift to be in the range of values supported by getNormReciprocalWord16() */ + N4 = shr( N, CNG_NORM_RECIPROCAL_RANGE_SHIFT ); + + assert( N == ( N4 << CNG_NORM_RECIPROCAL_RANGE_SHIFT ) ); + + normFacG = getNormReciprocalWord16( N4 ); + normShiftG = BASOP_util_norm_s_bands2shift( N4 ); + normShiftGM1 = sub( normShiftG, 1 ); + normShiftP2 = add( normShiftG, CNG_NORM_RECIPROCAL_RANGE_SHIFT ); + + gain = L_deposit_l( 0 ); + FOR( i = 0; i < N; i++ ) + { + noise32 = rand_gauss( &seed_loc ); + noise[i] = extract_h( noise32 ); + move16(); + gain = L_add( gain, L_shr( L_mult( noise[i], noise[i] ), normShiftP2 ) ); + } + gain = L_shl( Mpy_32_16_1( gain, shl( normFacG, normShiftGM1 ) ), 1 ); + + gain_exp = 2 * CNG_RAND_GAUSS_SHIFT; + move16(); + gain = ISqrt32( gain, &gain_exp ); + + gain = Mpy_32_32( old_exc_ener, gain ); + gain16 = extract_h( gain ); + + gain_exp = add( old_exc_ener_exp, gain_exp ); + noiseExp = add( CNG_RAND_GAUSS_SHIFT, gain_exp ); + + s = sub( 15 - NOISE_HEADROOM, noiseExp ); + FOR( i = 0; i < N; i++ ) + { +#ifdef BASOP_NOGLOB + noise[i] = shr_sat( mult( noise[i], gain16 ), s ); +#else + noise[i] = shr( mult( noise[i], gain16 ), s ); +#endif + move16(); + } + + assert( lpcorder <= 16 ); + + s = sub( 15 - NOISE_HEADROOM, ( sub( 15, Q_syn ) ) ); + FOR( i = 0; i < lpcorder; i++ ) + { +#ifdef BASOP_NOGLOB + old_syn_pe_tmp[i] = shr_sat( old_syn_pe[i], s ); +#else + old_syn_pe_tmp[i] = shr( old_syn_pe[i], s ); +#endif + move16(); + } + + E_UTIL_synthesis( + 0, /* i : scaling to apply for a[0] Q0 */ + old_Aq, /* i : LP filter coefficients Q12 */ + noise, /* i : input signal Qx */ + noise, /* o : output signal Qx-s */ + N, /* i : size of filtering Q0 */ + old_syn_pe_tmp, /* i/o: memory associated with this filtering. Q0 */ + 0, /* i : 0=no update, 1=update of memory. Q0 */ + lpcorder /* i : order of LP filter Q0 */ + ); + + tmp = old_syn; + move16(); + + E_UTIL_deemph2( + NOISE_HEADROOM, + noise, /* I/O: signal Qx */ + preemph_fac, /* I: deemphasis factor Qx */ + N, /* I: vector size */ + &tmp /* I/O: memory (signal[-1]) Qx */ + ); + + FOR( i = 0; i < N4; i++ ) + { + tmp = mult( noise[i], hFdCngCom->olapWinSyn[i].v.re ); + timeDomainOutput[i] = add( timeDomainOutput[i], tmp ); + move16(); + tmp = mult( noise[add( i, N4 )], hFdCngCom->olapWinSyn[sub( sub( N4, 1 ), i )].v.im ); + timeDomainOutput[add( i, N4 )] = add( timeDomainOutput[add( i, N4 )], tmp ); + move16(); + } + } + } + return; +} void generate_comfort_noise_dec_hf_fx( Word32 **bufferReal, /* o : matrix to real part of input bands */ -- GitLab From 8b76c75bac9ee160e0db65f920c7f86acb1a9827 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 18 Jul 2024 12:31:54 +0530 Subject: [PATCH 080/110] prot_fx1.h and prot_fx2.h replaced with single prot_fx.h --- Workspace_msvc/lib_com.vcxproj | 3 +- Workspace_msvc/lib_com.vcxproj.filters | 3 +- Workspace_msvc/renderer.vcxproj | 2 +- apps/renderer.c | 2 +- lib_com/ACcontextMapping_fx.c | 3 +- lib_com/ari_fx.c | 3 +- lib_com/ari_hm_fx.c | 3 +- lib_com/arith_coder_fx.c | 3 +- lib_com/bitalloc_fx.c | 3 +- lib_com/bitallocsum_fx.c | 3 +- lib_com/bits_alloc_fx.c | 3 +- lib_com/bitstream_fx.c | 2 +- lib_com/cb_shape_fx.c | 3 +- lib_com/cldfb.c | 3 +- lib_com/cldfb_evs.c | 5 +- lib_com/cng_exc_fx.c | 3 +- lib_com/codec_tcx_common.c | 3 +- lib_com/core_com_config.c | 2 +- lib_com/deemph.c | 3 +- lib_com/delay_comp.c | 3 +- lib_com/dlpc_bfi_fx.c | 3 +- lib_com/edct_fx.c | 3 +- lib_com/enhancer_fx.c | 19 +- lib_com/enr_1_az.c | 2 +- lib_com/env_adj.c | 3 +- lib_com/env_stab.c | 3 +- lib_com/env_stab_trans.c | 3 +- lib_com/est_tilt_fx.c | 3 +- lib_com/fd_cng_com.c | 2 +- lib_com/fd_cng_com_fx.c | 3 +- lib_com/fft_cldfb_fx.c | 2 +- lib_com/fft_evs.c | 3 +- lib_com/fft_fx.c | 3 +- lib_com/fft_fx_evs.c | 3 +- lib_com/fft_rel.c | 3 +- lib_com/fft_rel_fx.c | 3 +- lib_com/fill_spectrum.c | 3 +- lib_com/findpulse.c | 3 +- lib_com/fine_gain_bits_fx.c | 3 +- lib_com/float_to_fix_ops.c | 2 +- lib_com/frame_ener.c | 3 +- lib_com/gain_inov_fx.c | 3 +- lib_com/get_gain.c | 3 +- lib_com/gs_bitallocation_fx.c | 3 +- lib_com/gs_bitallocation_ivas_fx.c | 3 +- lib_com/gs_gains_fx.c | 3 +- lib_com/gs_inact_switching_fx.c | 3 +- lib_com/gs_noisefill_fx.c | 3 +- lib_com/gs_preech.c | 3 +- lib_com/guided_plc_util_fx.c | 3 +- lib_com/hp50.c | 3 +- lib_com/hq2_bit_alloc_fx.c | 2 +- lib_com/hq2_core_com_fx.c | 2 +- lib_com/hq2_noise_inject_fx.c | 2 +- lib_com/hq_bit_allocation_fx.c | 3 +- lib_com/hq_conf.c | 3 +- lib_com/hq_conf_fx.c | 3 +- lib_com/hq_tools_fx.c | 2 +- lib_com/hvq_pvq_bitalloc_fx.c | 3 +- lib_com/ifft_rel.c | 3 +- lib_com/igf_base.c | 2 +- lib_com/igf_base_fx.c | 3 +- lib_com/index_pvq_opt_fx.c | 3 +- lib_com/int_lsp.c | 3 +- lib_com/interleave_spectrum.c | 3 +- lib_com/interpol.c | 3 +- lib_com/isf_dec_amr_wb_fx.c | 2 +- lib_com/ivas_cov_smooth.c | 2 +- lib_com/ivas_dirac_com.c | 3 +- lib_com/ivas_fb_mixer.c | 3 +- lib_com/ivas_ism_com.c | 3 +- lib_com/ivas_masa_com.c | 2 +- lib_com/ivas_mc_param_com.c | 2 +- lib_com/ivas_mct_com.c | 1 - lib_com/ivas_mdct_core_com.c | 3 +- lib_com/ivas_mdct_imdct_fx.c | 2 +- lib_com/ivas_mdft_imdft.c | 3 +- lib_com/ivas_omasa_com.c | 3 +- lib_com/ivas_pca_tools.c | 2 +- lib_com/ivas_qmetadata_com.c | 3 +- lib_com/ivas_sns_com_fx.c | 3 +- lib_com/ivas_spar_com.c | 3 +- lib_com/ivas_spar_com_quant_util.c | 4 +- lib_com/ivas_stereo_ica_com_fx.c | 3 +- lib_com/ivas_stereo_mdct_bands_com.c | 3 +- lib_com/ivas_stereo_mdct_stereo_com.c | 3 +- lib_com/ivas_stereo_td_bit_alloc.c | 3 +- lib_com/ivas_tools.c | 4 +- lib_com/ivas_transient_det.c | 2 +- lib_com/lag_wind.c | 3 +- lib_com/lerp.c | 3 +- lib_com/limit_t0_fx.c | 3 +- lib_com/logqnorm_fx.c | 2 +- lib_com/longarith.c | 2 +- lib_com/low_rate_band_att_fx.c | 3 +- lib_com/lpc_tools.c | 2 +- lib_com/lpc_tools_fx.c | 2 +- lib_com/lsf_dec_bfi_fx.c | 3 +- lib_com/lsf_msvq_ma_fx.c | 3 +- lib_com/lsf_tools.c | 3 +- lib_com/lsf_tools_fx.c | 2 +- lib_com/lsp_conv_poly_fx.c | 2 +- lib_com/modif_fs.c | 2 +- lib_com/modif_fs_fx.c | 3 +- lib_com/mslvq_com.c | 2 +- lib_com/mslvq_com_fx.c | 2 +- lib_com/nelp_fx.c | 2 +- lib_com/parameter_bitmaping.c | 2 +- lib_com/parameter_bitmaping_fx.c | 2 +- lib_com/phase_dispersion_fx.c | 3 +- lib_com/ppp_fx.c | 2 +- lib_com/pred_lt4_fx.c | 3 +- lib_com/preemph_fx.c | 3 +- lib_com/prot.h | 289 +------ lib_com/{prot_fx2.h => prot_fx.h} | 759 ++++++++++++++++++- lib_com/prot_fx1.h | 636 ---------------- lib_com/pvq_com_fx.c | 3 +- lib_com/range_com_fx.c | 3 +- lib_com/re8_ppv_fx.c | 3 +- lib_com/re8_util_fx.c | 3 +- lib_com/recovernorm_fx.c | 3 +- lib_com/reordvct_fx.c | 2 +- lib_com/residu_fx.c | 3 +- lib_com/rom_com.c | 2 +- lib_com/scale_mem_fx.c | 2 +- lib_com/stab_est_fx.c | 3 +- lib_com/stat_noise_uv_mod_fx.c | 5 +- lib_com/swb_bwe_com_fx.c | 3 +- lib_com/swb_bwe_com_hr_fx.c | 3 +- lib_com/swb_bwe_com_lr_fx.c | 2 +- lib_com/swb_tbe_com.c | 32 +- lib_com/swb_tbe_com_fx.c | 19 +- lib_com/syn_12k8_fx.c | 3 +- lib_com/syn_filt_fx.c | 7 +- lib_com/tcq_position_arith_fx.c | 21 +- lib_com/tcx_ltp_fx.c | 57 +- lib_com/tcx_mdct_fx.c | 37 +- lib_com/tcx_mdct_window.c | 17 +- lib_com/tcx_utils_fx.c | 7 +- lib_com/tec_com.c | 7 +- lib_com/tns_base.c | 3 +- lib_com/tools.c | 3 +- lib_com/tools_fx.c | 3 +- lib_com/trans_direct_fx.c | 3 +- lib_com/trans_inv_fx.c | 3 +- lib_com/vlpc_2st_com_fx.c | 3 +- lib_com/weight_a_fx.c | 3 +- lib_com/weight_fx.c | 3 +- lib_com/wi_fx.c | 3 +- lib_com/window_fx.c | 3 +- lib_com/window_ola_fx.c | 3 +- lib_com/wtda.c | 2 +- lib_com/wtda_fx.c | 3 +- lib_dec/ACcontextMapping_dec_fx.c | 3 +- lib_dec/FEC_HQ_core.c | 27 +- lib_dec/FEC_HQ_core_fx.c | 3 +- lib_dec/FEC_HQ_phase_ecu_fx.c | 179 +++-- lib_dec/FEC_adapt_codebook_fx.c | 3 +- lib_dec/FEC_clas_estim_fx.c | 3 +- lib_dec/FEC_fx.c | 3 +- lib_dec/FEC_lsf_estim_fx.c | 3 +- lib_dec/FEC_pitch_estim_fx.c | 7 +- lib_dec/FEC_scale_syn_fx.c | 7 +- lib_dec/LD_music_post_filter_fx.c | 3 +- lib_dec/TonalComponentDetection_fx.c | 6 +- lib_dec/acelp_core_dec.c | 3 +- lib_dec/acelp_core_dec_fx.c | 3 +- lib_dec/acelp_core_dec_ivas_fx.c | 3 +- lib_dec/acelp_core_switch_dec_fx.c | 3 +- lib_dec/amr_wb_dec.c | 2 +- lib_dec/amr_wb_dec_fx.c | 3 +- lib_dec/ari_dec.c | 1 + lib_dec/ari_dec_fx.c | 3 +- lib_dec/ari_hm_dec.c | 2 +- lib_dec/arith_coder_dec.c | 3 +- lib_dec/arith_coder_dec_fx.c | 3 +- lib_dec/avq_dec_fx.c | 3 +- lib_dec/bass_psfilter.c | 3 +- lib_dec/bass_psfilter_fx.c | 3 +- lib_dec/cng_dec.c | 1 - lib_dec/cng_dec_fx.c | 3 +- lib_dec/core_dec_init.c | 2 +- lib_dec/core_dec_init_fx.c | 3 +- lib_dec/core_dec_reconf.c | 2 +- lib_dec/core_dec_reconf_fx.c | 3 +- lib_dec/core_dec_switch_fx.c | 3 +- lib_dec/core_switching_dec.c | 3 +- lib_dec/core_switching_dec_fx.c | 3 +- lib_dec/d_gain2p_fx.c | 3 +- lib_dec/dec2t32_fx.c | 3 +- lib_dec/dec4t64_fx.c | 9 +- lib_dec/dec_LPD.c | 2 +- lib_dec/dec_LPD_fx.c | 3 +- lib_dec/dec_ace_fx.c | 3 +- lib_dec/dec_acelp_fx.c | 3 +- lib_dec/dec_acelp_tcx_main_fx.c | 3 +- lib_dec/dec_amr_wb_fx.c | 3 +- lib_dec/dec_gen_voic_fx.c | 3 +- lib_dec/dec_higher_acelp.c | 2 +- lib_dec/dec_higher_acelp_fx.c | 3 +- lib_dec/dec_nelp_fx.c | 3 +- lib_dec/dec_pit_exc_fx.c | 5 +- lib_dec/dec_post_fx.c | 3 +- lib_dec/dec_ppp_fx.c | 5 +- lib_dec/dec_prm.c | 4 +- lib_dec/dec_prm_fx.c | 25 +- lib_dec/dec_tcx.c | 4 +- lib_dec/dec_tcx_fx.c | 3 +- lib_dec/dec_tran_fx.c | 3 +- lib_dec/dec_uv_fx.c | 3 +- lib_dec/decision_matrix_dec_fx.c | 3 +- lib_dec/dlpc_avq_fx.c | 3 +- lib_dec/dlpc_stoch_fx.c | 3 +- lib_dec/er_dec_acelp_fx.c | 3 +- lib_dec/er_dec_tcx_fx.c | 3 +- lib_dec/er_scale_syn_fx.c | 3 +- lib_dec/er_sync_exc_fx.c | 3 +- lib_dec/er_util_fx.c | 3 +- lib_dec/evs_dec.c | 3 +- lib_dec/evs_dec_fx.c | 3 +- lib_dec/fd_cng_dec.c | 3 +- lib_dec/fd_cng_dec_fx.c | 3 +- lib_dec/gain_dec_fx.c | 3 +- lib_dec/gaus_dec_fx.c | 3 +- lib_dec/gs_dec_amr_wb_fx.c | 19 +- lib_dec/gs_dec_fx.c | 29 +- lib_dec/hdecnrm_fx.c | 3 +- lib_dec/hf_synth.c | 3 +- lib_dec/hf_synth_fx.c | 17 +- lib_dec/hq_classifier_dec_fx.c | 7 +- lib_dec/hq_conf_fec_fx.c | 3 +- lib_dec/hq_core_dec_fx.c | 3 +- lib_dec/hq_env_dec_fx.c | 3 +- lib_dec/hq_hr_dec_fx.c | 3 +- lib_dec/hq_lr_dec_fx.c | 3 +- lib_dec/igf_dec.c | 2 +- lib_dec/igf_dec_fx.c | 3 +- lib_dec/igf_scf_dec_fx.c | 3 +- lib_dec/init_dec.c | 5 +- lib_dec/init_dec_fx.c | 3 +- lib_dec/inov_dec.c | 2 +- lib_dec/inov_dec_fx.c | 3 +- lib_dec/ivas_agc_dec_fx.c | 2 +- lib_dec/ivas_binRenderer_internal.c | 3 +- lib_dec/ivas_core_dec.c | 3 +- lib_dec/ivas_corecoder_dec_reconfig.c | 3 +- lib_dec/ivas_cpe_dec.c | 2 +- lib_dec/ivas_cpe_dec_fx.c | 3 +- lib_dec/ivas_dirac_dec.c | 5 +- lib_dec/ivas_dirac_output_synthesis_cov.c | 3 +- lib_dec/ivas_init_dec.c | 3 +- lib_dec/ivas_ism_dec.c | 2 +- lib_dec/ivas_ism_dtx_dec.c | 2 +- lib_dec/ivas_ism_metadata_dec.c | 3 +- lib_dec/ivas_ism_param_dec.c | 3 +- lib_dec/ivas_ism_renderer.c | 3 +- lib_dec/ivas_jbm_dec.c | 3 +- lib_dec/ivas_lfe_dec_fx.c | 3 +- lib_dec/ivas_lfe_plc_fx.c | 3 +- lib_dec/ivas_ls_custom_dec.c | 2 +- lib_dec/ivas_masa_dec.c | 5 +- lib_dec/ivas_mc_param_dec.c | 3 +- lib_dec/ivas_mc_paramupmix_dec.c | 4 +- lib_dec/ivas_mct_core_dec.c | 3 +- lib_dec/ivas_mct_dec.c | 3 +- lib_dec/ivas_mct_dec_mct_fx.c | 3 +- lib_dec/ivas_mdct_core_dec.c | 4 +- lib_dec/ivas_mono_dmx_renderer.c | 3 +- lib_dec/ivas_objectRenderer_internal.c | 3 +- lib_dec/ivas_omasa_dec.c | 2 +- lib_dec/ivas_osba_dec.c | 3 +- lib_dec/ivas_out_setup_conversion.c | 3 +- lib_dec/ivas_pca_dec_fx.c | 2 +- lib_dec/ivas_post_proc.c | 3 +- lib_dec/ivas_qmetadata_dec.c | 3 +- lib_dec/ivas_sba_dec.c | 2 +- lib_dec/ivas_sba_dirac_stereo_dec_fx.c | 3 +- lib_dec/ivas_sba_rendering_internal.c | 2 +- lib_dec/ivas_sce_dec.c | 3 +- lib_dec/ivas_sce_dec_fx.c | 3 +- lib_dec/ivas_sns_dec_fx.c | 3 +- lib_dec/ivas_spar_decoder.c | 4 +- lib_dec/ivas_spar_md_dec.c | 4 +- lib_dec/ivas_stereo_cng_dec.c | 3 +- lib_dec/ivas_stereo_dft_dec.c | 2 +- lib_dec/ivas_stereo_dft_dec_dmx.c | 13 +- lib_dec/ivas_stereo_dft_dec_fx.c | 3 +- lib_dec/ivas_stereo_dft_plc_fx.c | 21 +- lib_dec/ivas_stereo_ica_dec.c | 6 +- lib_dec/ivas_stereo_icbwe_dec.c | 3 +- lib_dec/ivas_stereo_mdct_core_dec.c | 2 +- lib_dec/ivas_stereo_mdct_core_dec_fx.c | 11 +- lib_dec/ivas_stereo_mdct_stereo_dec.c | 3 +- lib_dec/ivas_stereo_switching_dec.c | 4 +- lib_dec/ivas_stereo_td_dec.c | 3 +- lib_dec/ivas_svd_dec.c | 3 +- lib_dec/ivas_tcx_core_dec.c | 5 +- lib_dec/ivas_td_low_rate_dec.c | 3 +- lib_dec/jbm_jb4sb.c | 2 +- lib_dec/jbm_pcmdsp_apa.c | 2 +- lib_dec/lead_deindexing_fx.c | 3 +- lib_dec/lib_dec.c | 3 +- lib_dec/lib_dec_fx.c | 3 +- lib_dec/lp_exc_d_fx.c | 3 +- lib_dec/lsf_dec.c | 2 +- lib_dec/lsf_dec_fx.c | 3 +- lib_dec/lsf_msvq_ma_dec_fx.c | 3 +- lib_dec/nelp_dec_fx.c | 3 +- lib_dec/peak_vq_dec_fx.c | 3 +- lib_dec/pit_dec_fx.c | 3 +- lib_dec/pitch_extr_fx.c | 3 +- lib_dec/post_dec_fx.c | 3 +- lib_dec/ppp_dec_fx.c | 3 +- lib_dec/pvq_core_dec_fx.c | 3 +- lib_dec/pvq_decode_fx.c | 3 +- lib_dec/range_dec_fx.c | 3 +- lib_dec/re8_dec_fx.c | 3 +- lib_dec/rst_dec_fx.c | 3 +- lib_dec/stat_noise_uv_dec_fx.c | 3 +- lib_dec/swb_bwe_dec.c | 3 +- lib_dec/swb_bwe_dec_fx.c | 3 +- lib_dec/swb_bwe_dec_hr.c | 2 +- lib_dec/swb_bwe_dec_hr_fx.c | 3 +- lib_dec/swb_bwe_dec_lr_fx.c | 3 +- lib_dec/swb_tbe_dec.c | 3 +- lib_dec/swb_tbe_dec_fx.c | 3 +- lib_dec/syn_outp_fx.c | 3 +- lib_dec/tcq_core_dec_fx.c | 3 +- lib_dec/tcx_utils_dec_fx.c | 3 +- lib_dec/tns_base_dec_fx.c | 3 +- lib_dec/tonalMDCTconcealment.c | 3 +- lib_dec/tonalMDCTconcealment_fx.c | 5 +- lib_dec/transition_dec_fx.c | 3 +- lib_dec/updt_dec_fx.c | 3 +- lib_dec/vlpc_1st_dec_fx.c | 3 +- lib_dec/vlpc_2st_dec_fx.c | 3 +- lib_dec/voiced_dec_fx.c | 3 +- lib_dec/waveadjust_fec_dec_fx.c | 3 +- lib_enc/ACcontextMapping_enc_fx.c | 3 +- lib_enc/FEC_enc_fx.c | 3 +- lib_enc/SNR_calc_fx.c | 3 +- lib_enc/acelp_core_enc.c | 2 +- lib_enc/acelp_core_enc_fx.c | 3 +- lib_enc/acelp_core_switch_enc_fx.c | 3 +- lib_enc/acelp_enc_util_fx.c | 3 +- lib_enc/amr_wb_enc_fx.c | 3 +- lib_enc/analy_lp_fx.c | 3 +- lib_enc/analy_sp_fx.c | 3 +- lib_enc/ari_enc.c | 2 +- lib_enc/ari_enc_fx.c | 3 +- lib_enc/ari_hm_enc_fx.c | 3 +- lib_enc/arith_coder_enc_fx.c | 3 +- lib_enc/avq_cod_fx.c | 3 +- lib_enc/bass_psfilter_enc_fx.c | 3 +- lib_enc/bw_detect_fx.c | 3 +- lib_enc/cng_enc_fx.c | 3 +- lib_enc/cod2t32_fx.c | 3 +- lib_enc/cod4t64_fx.c | 3 +- lib_enc/cod_ace_fx.c | 3 +- lib_enc/cod_tcx_fx.c | 3 +- lib_enc/cod_uv_fx.c | 3 +- lib_enc/comvad_decision_fx.c | 3 +- lib_enc/cor_shif_fx.c | 3 +- lib_enc/core_enc_2div_fx.c | 3 +- lib_enc/core_enc_init_fx.c | 3 +- lib_enc/core_enc_ol_fx.c | 3 +- lib_enc/core_enc_reconf_fx.c | 3 +- lib_enc/core_enc_switch_fx.c | 3 +- lib_enc/core_enc_updt_fx.c | 3 +- lib_enc/core_switching_enc_fx.c | 3 +- lib_enc/corr_xh_fx.c | 3 +- lib_enc/decision_matrix_enc_fx.c | 3 +- lib_enc/detect_transient_fx.c | 3 +- lib_enc/diffcod_fx.c | 3 +- lib_enc/dtx_fx.c | 9 +- lib_enc/enc_acelp_fx.c | 3 +- lib_enc/enc_acelp_tcx_main_fx.c | 3 +- lib_enc/enc_acelpx_fx.c | 3 +- lib_enc/enc_amr_wb_fx.c | 3 +- lib_enc/enc_gain_fx.c | 3 +- lib_enc/enc_gen_voic_fx.c | 3 +- lib_enc/enc_gen_voic_rf.c | 2 +- lib_enc/enc_gen_voic_rf_fx.c | 3 +- lib_enc/enc_higher_acelp_fx.c | 3 +- lib_enc/enc_nelp_fx.c | 3 +- lib_enc/enc_pit_exc_fx.c | 3 +- lib_enc/enc_ppp_fx.c | 3 +- lib_enc/enc_prm_fx.c | 3 +- lib_enc/enc_tran_fx.c | 3 +- lib_enc/enc_uv_fx.c | 3 +- lib_enc/energy_fx.c | 3 +- lib_enc/eval_pit_contr_fx.c | 3 +- lib_enc/evs_enc_fx.c | 3 +- lib_enc/ext_sig_ana_fx.c | 3 +- lib_enc/fd_cng_enc.c | 2 +- lib_enc/fd_cng_enc_fx.c | 3 +- lib_enc/find_tar_fx.c | 3 +- lib_enc/find_tilt_fx.c | 3 +- lib_enc/find_uv_fx.c | 3 +- lib_enc/find_wsp.c | 26 +- lib_enc/find_wsp_fx.c | 3 +- lib_enc/frame_spec_dif_cor_rate_fx.c | 3 +- lib_enc/gain_enc_fx.c | 3 +- lib_enc/gaus_enc_fx.c | 3 +- lib_enc/gp_clip_fx.c | 3 +- lib_enc/gs_enc_fx.c | 3 +- lib_enc/guided_plc_enc_fx.c | 3 +- lib_enc/hf_cod_amrwb_fx.c | 3 +- lib_enc/hq_classifier_enc_fx.c | 3 +- lib_enc/hq_core_enc_fx.c | 3 +- lib_enc/hq_env_enc_fx.c | 3 +- lib_enc/hq_hr_enc_fx.c | 3 +- lib_enc/hq_lr_enc_fx.c | 3 +- lib_enc/hvq_enc_fx.c | 3 +- lib_enc/igf_enc_fx.c | 3 +- lib_enc/igf_scf_enc_fx.c | 3 +- lib_enc/init_enc.c | 2 +- lib_enc/init_enc_fx.c | 3 +- lib_enc/inov_enc_fx.c | 3 +- lib_enc/isf_enc_amr_wb_fx.c | 3 +- lib_enc/ivas_agc_enc.c | 3 +- lib_enc/ivas_core_pre_proc_front.c | 13 +- lib_enc/ivas_cpe_enc.c | 3 +- lib_enc/ivas_dirac_enc.c | 3 +- lib_enc/ivas_enc.c | 3 +- lib_enc/ivas_enc_cov_handler.c | 2 +- lib_enc/ivas_front_vad.c | 3 +- lib_enc/ivas_init_enc.c | 2 +- lib_enc/ivas_ism_dtx_enc.c | 29 +- lib_enc/ivas_ism_enc.c | 15 +- lib_enc/ivas_ism_metadata_enc.c | 17 +- lib_enc/ivas_ism_param_enc.c | 13 +- lib_enc/ivas_lfe_enc.c | 3 +- lib_enc/ivas_masa_enc.c | 5 +- lib_enc/ivas_mc_paramupmix_enc.c | 2 +- lib_enc/ivas_mcmasa_enc.c | 19 +- lib_enc/ivas_mct_enc_mct.c | 2 +- lib_enc/ivas_omasa_enc.c | 3 +- lib_enc/ivas_osba_enc.c | 3 +- lib_enc/ivas_qmetadata_enc.c | 3 +- lib_enc/ivas_sba_enc.c | 3 +- lib_enc/ivas_sce_enc.c | 2 +- lib_enc/ivas_sns_enc.c | 2 +- lib_enc/ivas_spar_encoder.c | 4 +- lib_enc/ivas_stereo_classifier.c | 4 +- lib_enc/ivas_stereo_cng_enc.c | 2 +- lib_enc/ivas_stereo_dft_enc.c | 2 +- lib_enc/ivas_stereo_ica_enc.c | 3 +- lib_enc/ivas_stereo_icbwe_enc.c | 2 +- lib_enc/ivas_stereo_mdct_core_enc.c | 16 +- lib_enc/ivas_stereo_mdct_igf_enc.c | 2 +- lib_enc/ivas_stereo_mdct_stereo_enc.c | 3 +- lib_enc/lead_indexing_fx.c | 3 +- lib_enc/lib_enc.c | 12 +- lib_enc/long_enr_fx.c | 41 +- lib_enc/lp_exc_e_fx.c | 3 +- lib_enc/lsf_enc.c | 2 +- lib_enc/lsf_enc_fx.c | 3 +- lib_enc/lsf_msvq_ma_enc_fx.c | 3 +- lib_enc/ltd_stable_fx.c | 3 +- lib_enc/mdct_classifier_fx.c | 3 +- lib_enc/mdct_selector_fx.c | 3 +- lib_enc/mslvq_enc_fx.c | 3 +- lib_enc/multi_harm_fx.c | 3 +- lib_enc/nelp_enc_fx.c | 3 +- lib_enc/nois_est_fx.c | 3 +- lib_enc/noise_adjust_fx.c | 3 +- lib_enc/normalizecoefs_fx.c | 3 +- lib_enc/peak_vq_enc_fx.c | 3 +- lib_enc/pit_enc_fx.c | 3 +- lib_enc/pitch_ol2_fx.c | 3 +- lib_enc/pitch_ol_fx.c | 5 +- lib_enc/plc_enc_ext_fx.c | 3 +- lib_enc/ppp_enc_fx.c | 3 +- lib_enc/pre_proc_fx.c | 3 +- lib_enc/pvq_core_enc_fx.c | 3 +- lib_enc/pvq_encode_fx.c | 3 +- lib_enc/q_gain2p_fx.c | 3 +- lib_enc/qlpc_avq_fx.c | 3 +- lib_enc/qlpc_stoch_fx.c | 3 +- lib_enc/range_enc_fx.c | 3 +- lib_enc/re8_cod_fx.c | 3 +- lib_enc/reordernorm_fx.c | 3 +- lib_enc/rst_enc_fx.c | 3 +- lib_enc/scale_enc_fx.c | 3 +- lib_enc/set_impulse_fx.c | 3 +- lib_enc/setmodeindex_fx.c | 3 +- lib_enc/sig_clas_fx.c | 3 +- lib_enc/spec_center_fx.c | 3 +- lib_enc/spec_flatness_fx.c | 3 +- lib_enc/speech_music_classif.c | 6 +- lib_enc/speech_music_classif_fx.c | 5 +- lib_enc/stat_noise_uv_enc_fx.c | 3 +- lib_enc/subband_fft_fx.c | 3 +- lib_enc/swb_bwe_enc_fx.c | 3 +- lib_enc/swb_bwe_enc_hr_fx.c | 3 +- lib_enc/swb_bwe_enc_lr_fx.c | 3 +- lib_enc/swb_pre_proc_fx.c | 3 +- lib_enc/swb_tbe_enc_fx.c | 3 +- lib_enc/tcq_core_enc_fx.c | 3 +- lib_enc/tcx_ltp_enc_fx.c | 3 +- lib_enc/tcx_utils_enc.c | 2 +- lib_enc/tcx_utils_enc_fx.c | 3 +- lib_enc/tfa_enc_fx.c | 3 +- lib_enc/tns_base_enc_fx.c | 3 +- lib_enc/transient_detection_fx.c | 3 +- lib_enc/transition_enc.c | 2 +- lib_enc/transition_enc_fx.c | 3 +- lib_enc/update_decision_fx.c | 3 +- lib_enc/updt_enc_fx.c | 3 +- lib_enc/updt_tar_fx.c | 3 +- lib_enc/vad_basop_fx.c | 3 +- lib_enc/vad_fx.c | 3 +- lib_enc/vad_param_updt_fx.c | 3 +- lib_enc/vad_proc_fx.c | 3 +- lib_enc/vbr_average_rate_fx.c | 3 +- lib_enc/vlpc_1st_cod_fx.c | 3 +- lib_enc/vlpc_2st_cod_fx.c | 3 +- lib_enc/voiced_enc_fx.c | 3 +- lib_enc/waveadjust_fec_cod_fx.c | 3 +- lib_rend/ivas_crend.c | 5 +- lib_rend/ivas_dirac_ana.c | 3 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 11 +- lib_rend/ivas_dirac_decorr_dec.c | 21 +- lib_rend/ivas_dirac_onsets_dec.c | 3 +- lib_rend/ivas_dirac_output_synthesis_dec.c | 3 +- lib_rend/ivas_dirac_rend.c | 3 +- lib_rend/ivas_efap.c | 2 +- lib_rend/ivas_masa_merge.c | 2 +- lib_rend/ivas_mcmasa_ana.c | 3 +- lib_rend/ivas_objectRenderer.c | 3 +- lib_rend/ivas_objectRenderer_hrFilt.c | 3 +- lib_rend/ivas_objectRenderer_mix.c | 2 +- lib_rend/ivas_objectRenderer_sfx.c | 2 +- lib_rend/ivas_objectRenderer_sources.c | 3 +- lib_rend/ivas_objectRenderer_vec.c | 3 +- lib_rend/ivas_omasa_ana.c | 2 +- lib_rend/ivas_orient_trk.c | 3 +- lib_rend/ivas_reflections.c | 3 +- lib_rend/ivas_render_config.c | 2 +- lib_rend/ivas_reverb.c | 9 +- lib_rend/ivas_reverb_delay_line.c | 3 +- lib_rend/ivas_reverb_fft_filter.c | 3 +- lib_rend/ivas_reverb_filter_design.c | 2 +- lib_rend/ivas_reverb_iir_filter.c | 3 +- lib_rend/ivas_reverb_utils.c | 2 +- lib_rend/ivas_rotation.c | 3 +- lib_rend/ivas_sba_rendering.c | 3 +- lib_rend/ivas_td_decorr.c | 3 +- lib_rend/ivas_vbap.c | 4 +- lib_rend/lib_rend.c | 3 +- lib_util/hrtf_file_reader.c | 2 +- lib_util/ism_file_reader.c | 2 +- lib_util/rotation_file_reader.c | 2 +- lib_util/vector3_pair_file_reader.c | 3 +- 555 files changed, 1700 insertions(+), 2325 deletions(-) rename lib_com/{prot_fx2.h => prot_fx.h} (92%) delete mode 100644 lib_com/prot_fx1.h diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index f55a30abb..28dae4b83 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -399,8 +399,7 @@ - - + diff --git a/Workspace_msvc/lib_com.vcxproj.filters b/Workspace_msvc/lib_com.vcxproj.filters index d46cc4712..46d83453a 100644 --- a/Workspace_msvc/lib_com.vcxproj.filters +++ b/Workspace_msvc/lib_com.vcxproj.filters @@ -593,11 +593,10 @@ common_h - - common_h + diff --git a/Workspace_msvc/renderer.vcxproj b/Workspace_msvc/renderer.vcxproj index c62874ec0..1f95040e1 100644 --- a/Workspace_msvc/renderer.vcxproj +++ b/Workspace_msvc/renderer.vcxproj @@ -65,7 +65,7 @@ Disabled - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;..\lib_dec;..\lib_enc;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) EnableFastChecks diff --git a/apps/renderer.c b/apps/renderer.c index 1cc4c1a32..fcc1a04b7 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -49,7 +49,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" +#include "prot_fx.h" #endif #define WMC_TOOL_SKIP diff --git a/lib_com/ACcontextMapping_fx.c b/lib_com/ACcontextMapping_fx.c index 6cf368a46..ef5508692 100644 --- a/lib_com/ACcontextMapping_fx.c +++ b/lib_com/ACcontextMapping_fx.c @@ -6,8 +6,7 @@ #include "options.h" #include "basop_util.h" #include "cnst.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" /* Returns: index of next coefficient */ diff --git a/lib_com/ari_fx.c b/lib_com/ari_fx.c index a16885a62..3b36d10b3 100644 --- a/lib_com/ari_fx.c +++ b/lib_com/ari_fx.c @@ -5,8 +5,7 @@ #include #include "assert.h" #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "cnst.h" /** diff --git a/lib_com/ari_hm_fx.c b/lib_com/ari_hm_fx.c index 425823d27..767aea860 100644 --- a/lib_com/ari_hm_fx.c +++ b/lib_com/ari_hm_fx.c @@ -9,8 +9,7 @@ #include "cnst.h" #include "basop_util.h" #include "rom_com.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #define GET_ADJ2( T, L, F ) ( ( ( L ) << ( F ) ) - ( T ) ) void UnmapIndex( diff --git a/lib_com/arith_coder_fx.c b/lib_com/arith_coder_fx.c index 54533aaca..64cc81d04 100644 --- a/lib_com/arith_coder_fx.c +++ b/lib_com/arith_coder_fx.c @@ -5,8 +5,7 @@ #include #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "cnst.h" diff --git a/lib_com/bitalloc_fx.c b/lib_com/bitalloc_fx.c index 78f6ac276..491c9bb95 100644 --- a/lib_com/bitalloc_fx.c +++ b/lib_com/bitalloc_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ void bitalloc_fx( Word16 *y, /* i : reordered norm of sub-vectors Q0 */ diff --git a/lib_com/bitallocsum_fx.c b/lib_com/bitallocsum_fx.c index fd34a0c1d..2a077b1de 100644 --- a/lib_com/bitallocsum_fx.c +++ b/lib_com/bitallocsum_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------------- * bitallocsum_fx() diff --git a/lib_com/bits_alloc_fx.c b/lib_com/bits_alloc_fx.c index 0638b903c..da120dc82 100644 --- a/lib_com/bits_alloc_fx.c +++ b/lib_com/bits_alloc_fx.c @@ -5,8 +5,7 @@ #include #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #include "basop_util.h" #include "rom_com.h" diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index 2bf4ecf91..d910b657a 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -39,7 +39,7 @@ #include #include "options.h" #include "ivas_cnst.h" /* Common constants */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "ivas_prot_fx.h" #include "basop_util.h" #include "rom_com.h" diff --git a/lib_com/cb_shape_fx.c b/lib_com/cb_shape_fx.c index d8dec57d6..6a27fd395 100644 --- a/lib_com/cb_shape_fx.c +++ b/lib_com/cb_shape_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* */ /* diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index 9083ac14f..4b618f556 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -40,11 +40,10 @@ #include #include "stat_dec.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #include "rom_com_fx.h" #include "wmc_auto.h" -#include "prot_fx2.h" #if __STDC_VERSION__ >= 199901L #if defined __ICL #define restrict __restrict diff --git a/lib_com/cldfb_evs.c b/lib_com/cldfb_evs.c index 1e7d5bd8f..317ff899f 100644 --- a/lib_com/cldfb_evs.c +++ b/lib_com/cldfb_evs.c @@ -20,8 +20,7 @@ #include "stat_com.h" #include "rom_com.h" #include "basop_util.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include #define STATE_BUFFER_SIZE ( 9 + 16 ) @@ -1286,7 +1285,7 @@ void GetEnergyCldfb( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) } } - IF( GE_16( numberBands, freqTable[1] ) && hTecEnc != NULL ) + IF( GE_16( numberBands, freqTable[1] ) && hTecEnc != NULL) { Word32 *tempEnergyValuesArry[CLDFB_NO_COL_MAX]; Word16 ScaleX2; diff --git a/lib_com/cng_exc_fx.c b/lib_com/cng_exc_fx.c index c43d08014..c25ed489a 100644 --- a/lib_com/cng_exc_fx.c +++ b/lib_com/cng_exc_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" #include "ivas_rom_com_fx.h" diff --git a/lib_com/codec_tcx_common.c b/lib_com/codec_tcx_common.c index 79f0fa4c5..f956cba9b 100644 --- a/lib_com/codec_tcx_common.c +++ b/lib_com/codec_tcx_common.c @@ -7,8 +7,7 @@ #include #include "options.h" #include "prot.h" -#include "prot_fx2.h" -#include "prot_fx1.h" +#include "prot_fx.h" #include "basop_util.h" #include "rom_basop_util.h" #include "rom_com.h" diff --git a/lib_com/core_com_config.c b/lib_com/core_com_config.c index e01bb339a..a10ecac19 100644 --- a/lib_com/core_com_config.c +++ b/lib_com/core_com_config.c @@ -41,7 +41,7 @@ #include "prot.h" #include "wmc_auto.h" #include "ivas_prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #define FSCALE_DENOM_BY_12800_Q15 1311 /*-------------------------------------------------------------------* diff --git a/lib_com/deemph.c b/lib_com/deemph.c index 1c00dde1a..9583a79d4 100644 --- a/lib_com/deemph.c +++ b/lib_com/deemph.c @@ -38,8 +38,7 @@ #include "options.h" #include "prot.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-------------------------------------------------------------------* * deemph() * diff --git a/lib_com/delay_comp.c b/lib_com/delay_comp.c index b0ccb9888..c1e1e869c 100644 --- a/lib_com/delay_comp.c +++ b/lib_com/delay_comp.c @@ -39,8 +39,7 @@ #include "prot.h" #include "ivas_cnst.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-------------------------------------------------------------------------- * get_delay() diff --git a/lib_com/dlpc_bfi_fx.c b/lib_com/dlpc_bfi_fx.c index 43a8c360c..be4b27696 100644 --- a/lib_com/dlpc_bfi_fx.c +++ b/lib_com/dlpc_bfi_fx.c @@ -6,8 +6,7 @@ /* Header files */ #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" void dlpc_bfi( const Word16 L_frame, diff --git a/lib_com/edct_fx.c b/lib_com/edct_fx.c index 721a5bf25..e3cf39fcd 100644 --- a/lib_com/edct_fx.c +++ b/lib_com/edct_fx.c @@ -7,8 +7,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "stl.h" diff --git a/lib_com/enhancer_fx.c b/lib_com/enhancer_fx.c index 2482bf58b..a3d569edc 100644 --- a/lib_com/enhancer_fx.c +++ b/lib_com/enhancer_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "basop_util.h" @@ -101,7 +100,7 @@ void enhancer_fx( i = 0; move16(); /* high dispersion */ } - ELSE if ( LE_32( core_brate, ACELP_8k85 ) ) + ELSE if( LE_32( core_brate, ACELP_8k85 ) ) { i = 1; move16(); /* low dispersion */ @@ -119,7 +118,7 @@ void enhancer_fx( i = 0; move16(); /* high dispersion */ } - ELSE if ( ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) || EQ_16( coder_type, AUDIO ) || coder_type == INACTIVE ) && LE_32( core_brate, ACELP_9k60 ) ) + ELSE if( ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) || EQ_16( coder_type, AUDIO ) || coder_type == INACTIVE ) && LE_32( core_brate, ACELP_9k60 ) ) { i = 1; move16(); /* low dispersion */ @@ -380,7 +379,7 @@ void enhancer_ivas_fx( i = 0; move16(); /* high dispersion */ } - ELSE if ( LE_32( core_brate, ACELP_8k85 ) ) + ELSE if( LE_32( core_brate, ACELP_8k85 ) ) { i = 1; move16(); /* low dispersion */ @@ -718,7 +717,7 @@ Word16 E_UTIL_enhancer( gain = add( sub( code_exp, exc2_exp ), 1 ); tmp = mac_r( 268435456l /*0.125f Q31*/, 4096 /*0.125f Q15*/, voice_fac ); /* 0.25=voiced, 0=unvoiced */ - IF( EQ_16( L_frame, L_FRAME16k ) ) + IF ( EQ_16( L_frame, L_FRAME16k ) ) { tmp = mac_r( 322122560l /*0.150f Q31*/, 4915 /*0.150f Q15*/, voice_fac ); /* 0.30=voiced, 0=unvoiced */ } @@ -726,7 +725,7 @@ Word16 E_UTIL_enhancer( /* exc2[0] = exc2[0] + code[0] - tmp*code[1]; */ L_tmp = L_mult( code[0], 16384 ); L_tmp = L_msu0( L_tmp, tmp, code[1] ); - IF( gain ) + IF ( gain ) { #ifdef BASOP_NOGLOB L_tmp = L_shl_sat( L_tmp, gain ); @@ -741,14 +740,14 @@ Word16 E_UTIL_enhancer( #endif move16(); - FOR( i = 1; i < sub( L_subfr, 1 ); i++ ) + FOR( i = 1; i < sub(L_subfr , 1); i++ ) { /* exc2[i] = exc2[i] + code[i] - tmp*(code[i+1]+code[i-1]); */ L_tmp = L_mult( code[i], 16384 ); #ifdef BASOP_NOGLOB L_tmp = L_msu0_sat( L_tmp, tmp, code[i - 1] ); L_tmp = L_msu0_sat( L_tmp, tmp, code[i + 1] ); - IF( gain ) + IF ( gain ) { L_tmp = L_shl_sat( L_tmp, gain ); } @@ -768,7 +767,7 @@ Word16 E_UTIL_enhancer( L_tmp = L_mult( code[i], 16384 ); #ifdef BASOP_NOGLOB L_tmp = L_msu0_sat( L_tmp, tmp, code[i - 1] ); - IF( gain ) + IF ( gain ) { L_tmp = L_shl_sat( L_tmp, gain ); } diff --git a/lib_com/enr_1_az.c b/lib_com/enr_1_az.c index 2f663deaf..3285c515a 100644 --- a/lib_com/enr_1_az.c +++ b/lib_com/enr_1_az.c @@ -39,7 +39,7 @@ #include "cnst.h" #include "prot.h" #include "wmc_auto.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-------------------------------------------------------------------* * enr_1_Az() diff --git a/lib_com/env_adj.c b/lib_com/env_adj.c index 874bf4aa8..39e29e8fa 100644 --- a/lib_com/env_adj.c +++ b/lib_com/env_adj.c @@ -40,8 +40,7 @@ #include "rom_com.h" #include "prot.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*--------------------------------------------------------------------------* * env_adj() diff --git a/lib_com/env_stab.c b/lib_com/env_stab.c index a05cb79ba..1ccdd1184 100644 --- a/lib_com/env_stab.c +++ b/lib_com/env_stab.c @@ -43,8 +43,7 @@ #include "rom_com.h" #include "wmc_auto.h" #include "stl.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*--------------------------------------------------------------------------* * Local constants *--------------------------------------------------------------------------*/ diff --git a/lib_com/env_stab_trans.c b/lib_com/env_stab_trans.c index 29473bd66..1d1ccff32 100644 --- a/lib_com/env_stab_trans.c +++ b/lib_com/env_stab_trans.c @@ -41,8 +41,7 @@ #include "prot.h" #include "rom_com.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*--------------------------------------------------------------------------* * env_stab_transient_detect() * diff --git a/lib_com/est_tilt_fx.c b/lib_com/est_tilt_fx.c index c556536e4..0b9c39b38 100644 --- a/lib_com/est_tilt_fx.c +++ b/lib_com/est_tilt_fx.c @@ -4,8 +4,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "stl.h" #include "basop_util.h" diff --git a/lib_com/fd_cng_com.c b/lib_com/fd_cng_com.c index 8a03d64ca..bf501e2f7 100644 --- a/lib_com/fd_cng_com.c +++ b/lib_com/fd_cng_com.c @@ -39,7 +39,7 @@ #include "options.h" #include #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #include "wmc_auto.h" diff --git a/lib_com/fd_cng_com_fx.c b/lib_com/fd_cng_com_fx.c index c8387c40a..dd84969a9 100644 --- a/lib_com/fd_cng_com_fx.c +++ b/lib_com/fd_cng_com_fx.c @@ -9,8 +9,7 @@ #include "options.h" #include "rom_basop_util.h" #include "rom_com.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #define DELTA_SHIFT 2 diff --git a/lib_com/fft_cldfb_fx.c b/lib_com/fft_cldfb_fx.c index 6271eea26..d60a285f5 100644 --- a/lib_com/fft_cldfb_fx.c +++ b/lib_com/fft_cldfb_fx.c @@ -37,7 +37,7 @@ #include #include "options.h" #include -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_cnst.h" #include "wmc_auto.h" #include "basop_util.h" diff --git a/lib_com/fft_evs.c b/lib_com/fft_evs.c index 3ff15a5c6..56b735804 100644 --- a/lib_com/fft_evs.c +++ b/lib_com/fft_evs.c @@ -3,8 +3,7 @@ ====================================================================================*/ #include -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "rom_basop_util.h" #include "rom_com.h" diff --git a/lib_com/fft_fx.c b/lib_com/fft_fx.c index 4fe9aac60..d7a1aa12f 100644 --- a/lib_com/fft_fx.c +++ b/lib_com/fft_fx.c @@ -45,8 +45,7 @@ #include #include "cnst.h" // #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" //#include "cnst_fx.h" #include "rom_com.h" #include "rom_com_fx.h" diff --git a/lib_com/fft_fx_evs.c b/lib_com/fft_fx_evs.c index fa25f6847..ddcbae49a 100644 --- a/lib_com/fft_fx_evs.c +++ b/lib_com/fft_fx_evs.c @@ -4,8 +4,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "stl.h" #include diff --git a/lib_com/fft_rel.c b/lib_com/fft_rel.c index 1cf917f8f..4682fb65e 100644 --- a/lib_com/fft_rel.c +++ b/lib_com/fft_rel.c @@ -39,8 +39,7 @@ #include "prot.h" #include "rom_com.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*---------------------------------------------------------------------* * Local constants diff --git a/lib_com/fft_rel_fx.c b/lib_com/fft_rel_fx.c index 846099592..42cf4deff 100644 --- a/lib_com/fft_rel_fx.c +++ b/lib_com/fft_rel_fx.c @@ -3,8 +3,7 @@ ====================================================================================*/ #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "stl.h" diff --git a/lib_com/fill_spectrum.c b/lib_com/fill_spectrum.c index 7571b03ba..b75a67017 100644 --- a/lib_com/fill_spectrum.c +++ b/lib_com/fill_spectrum.c @@ -40,8 +40,7 @@ #include "rom_com.h" #include "prot.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif diff --git a/lib_com/findpulse.c b/lib_com/findpulse.c index c04b13a4d..e7104810c 100644 --- a/lib_com/findpulse.c +++ b/lib_com/findpulse.c @@ -40,8 +40,7 @@ #include "prot.h" #include "cnst.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*----------------------------------------------------------------------------------* * findpulse() diff --git a/lib_com/fine_gain_bits_fx.c b/lib_com/fine_gain_bits_fx.c index e2f1dd8c7..339e11096 100644 --- a/lib_com/fine_gain_bits_fx.c +++ b/lib_com/fine_gain_bits_fx.c @@ -5,8 +5,7 @@ #include #include "options.h" /* Compilation switches */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif diff --git a/lib_com/float_to_fix_ops.c b/lib_com/float_to_fix_ops.c index 5547bb30c..5ba9b55a6 100644 --- a/lib_com/float_to_fix_ops.c +++ b/lib_com/float_to_fix_ops.c @@ -4,7 +4,7 @@ #include #include "options.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" Word32 floatToFixed( float f, Word16 Q ) { diff --git a/lib_com/frame_ener.c b/lib_com/frame_ener.c index 4fa6e41ba..5af9eed54 100644 --- a/lib_com/frame_ener.c +++ b/lib_com/frame_ener.c @@ -40,8 +40,7 @@ #include "cnst.h" #include "prot.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*----------------------------------------------------------------------------------* * fer_energy() * diff --git a/lib_com/gain_inov_fx.c b/lib_com/gain_inov_fx.c index 7f767c028..e2f65421a 100644 --- a/lib_com/gain_inov_fx.c +++ b/lib_com/gain_inov_fx.c @@ -5,8 +5,7 @@ #include #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "rom_com.h" diff --git a/lib_com/get_gain.c b/lib_com/get_gain.c index 43d39ae31..5f9c8f56a 100644 --- a/lib_com/get_gain.c +++ b/lib_com/get_gain.c @@ -38,8 +38,7 @@ #include "options.h" #include "prot.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*----------------------------------------------------------------------------------* * get_gain() diff --git a/lib_com/gs_bitallocation_fx.c b/lib_com/gs_bitallocation_fx.c index 112d94e51..004cdb3d3 100644 --- a/lib_com/gs_bitallocation_fx.c +++ b/lib_com/gs_bitallocation_fx.c @@ -5,8 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "assert.h" /* Debug prototypes */ #include "stl.h" diff --git a/lib_com/gs_bitallocation_ivas_fx.c b/lib_com/gs_bitallocation_ivas_fx.c index 0e7426120..510506147 100644 --- a/lib_com/gs_bitallocation_ivas_fx.c +++ b/lib_com/gs_bitallocation_ivas_fx.c @@ -6,8 +6,7 @@ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ #include "prot.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "ivas_prot.h" /* Function prototypes */ #include "assert.h" /* Debug prototypes */ #include "stl.h" diff --git a/lib_com/gs_gains_fx.c b/lib_com/gs_gains_fx.c index 048099e25..4de024088 100644 --- a/lib_com/gs_gains_fx.c +++ b/lib_com/gs_gains_fx.c @@ -37,8 +37,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "stl.h" /*-------------------------------------------------------------------* diff --git a/lib_com/gs_inact_switching_fx.c b/lib_com/gs_inact_switching_fx.c index 446f9849b..27b1efb08 100644 --- a/lib_com/gs_inact_switching_fx.c +++ b/lib_com/gs_inact_switching_fx.c @@ -5,8 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "stl.h" /*-------------------------------------------------------------------* diff --git a/lib_com/gs_noisefill_fx.c b/lib_com/gs_noisefill_fx.c index 3e5bfab96..2dea2adef 100644 --- a/lib_com/gs_noisefill_fx.c +++ b/lib_com/gs_noisefill_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" #include "rom_com.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-------------------------------------------------------------------* * gs_noisf() diff --git a/lib_com/gs_preech.c b/lib_com/gs_preech.c index 8765dc7e0..1c3c3ccfe 100644 --- a/lib_com/gs_preech.c +++ b/lib_com/gs_preech.c @@ -41,8 +41,7 @@ #include "rom_com.h" #include "prot.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-------------------------------------------------------------------* * Local constants diff --git a/lib_com/guided_plc_util_fx.c b/lib_com/guided_plc_util_fx.c index a95e9a5c4..2610a7693 100644 --- a/lib_com/guided_plc_util_fx.c +++ b/lib_com/guided_plc_util_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #include "basop_util.h" #include "rom_basop_util.h" diff --git a/lib_com/hp50.c b/lib_com/hp50.c index d6aaebea2..dbabd5632 100644 --- a/lib_com/hp50.c +++ b/lib_com/hp50.c @@ -39,8 +39,7 @@ #include "options.h" #include "prot.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /* * hp20 diff --git a/lib_com/hq2_bit_alloc_fx.c b/lib_com/hq2_bit_alloc_fx.c index c43b11ae5..486de81de 100644 --- a/lib_com/hq2_bit_alloc_fx.c +++ b/lib_com/hq2_bit_alloc_fx.c @@ -32,7 +32,7 @@ #include #include "options.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #define MIN_BITS_FIX 0 /* QRk=18 */ diff --git a/lib_com/hq2_core_com_fx.c b/lib_com/hq2_core_com_fx.c index b00a25aaa..206a37bc8 100644 --- a/lib_com/hq2_core_com_fx.c +++ b/lib_com/hq2_core_com_fx.c @@ -35,7 +35,7 @@ #include "options.h" #include "cnst.h" /* Audio core constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx2.h" +#include "prot_fx.h" /*--------------------------------------------------------------------------* diff --git a/lib_com/hq2_noise_inject_fx.c b/lib_com/hq2_noise_inject_fx.c index c47bb5cfd..c7326bd8e 100644 --- a/lib_com/hq2_noise_inject_fx.c +++ b/lib_com/hq2_noise_inject_fx.c @@ -32,7 +32,7 @@ #include #include "options.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "oper_32b.h" #include "move.h" #include "count.h" diff --git a/lib_com/hq_bit_allocation_fx.c b/lib_com/hq_bit_allocation_fx.c index 8b476fb07..79d6bb1a4 100644 --- a/lib_com/hq_bit_allocation_fx.c +++ b/lib_com/hq_bit_allocation_fx.c @@ -4,8 +4,7 @@ #include "options.h" /* Compilation switches */ #include "stl.h" /* required for wmc_tool */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "cnst.h" /* Common constants */ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" diff --git a/lib_com/hq_conf.c b/lib_com/hq_conf.c index 4dfe55d80..d96448b02 100644 --- a/lib_com/hq_conf.c +++ b/lib_com/hq_conf.c @@ -40,8 +40,7 @@ #include "rom_com.h" #include "prot.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*--------------------------------------------------------------------------* * hq_configure() diff --git a/lib_com/hq_conf_fx.c b/lib_com/hq_conf_fx.c index bed185ae1..21f70e1a0 100644 --- a/lib_com/hq_conf_fx.c +++ b/lib_com/hq_conf_fx.c @@ -6,8 +6,7 @@ #include "options.h" #include "cnst.h" /* Audio core constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif diff --git a/lib_com/hq_tools_fx.c b/lib_com/hq_tools_fx.c index ae3468c9a..ddc12e4eb 100644 --- a/lib_com/hq_tools_fx.c +++ b/lib_com/hq_tools_fx.c @@ -38,7 +38,7 @@ #include "options.h" /* Compilation switches */ #include "rom_com.h" /* Static table prototypes FIP version */ #include "stl.h" /* required for wmc_tool */ -#include "prot_fx2.h" +#include "prot_fx.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif diff --git a/lib_com/hvq_pvq_bitalloc_fx.c b/lib_com/hvq_pvq_bitalloc_fx.c index 487aaf2ea..2066ea993 100644 --- a/lib_com/hvq_pvq_bitalloc_fx.c +++ b/lib_com/hvq_pvq_bitalloc_fx.c @@ -5,8 +5,7 @@ #include "options.h" /* Compilation switches */ #include "rom_com.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "cnst.h" /* Common constants */ /*--------------------------------------------------------------------------*/ diff --git a/lib_com/ifft_rel.c b/lib_com/ifft_rel.c index c1e868716..43aa3f122 100644 --- a/lib_com/ifft_rel.c +++ b/lib_com/ifft_rel.c @@ -39,8 +39,7 @@ #include "prot.h" #include "rom_com.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-----------------------------------------------------------------* * Local constants *-----------------------------------------------------------------*/ diff --git a/lib_com/igf_base.c b/lib_com/igf_base.c index 658707947..637dd0270 100644 --- a/lib_com/igf_base.c +++ b/lib_com/igf_base.c @@ -41,7 +41,7 @@ #include "rom_com.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #endif /*---------------------------------------------------------------------* diff --git a/lib_com/igf_base_fx.c b/lib_com/igf_base_fx.c index ac1a1bcde..022720707 100644 --- a/lib_com/igf_base_fx.c +++ b/lib_com/igf_base_fx.c @@ -8,8 +8,7 @@ #include #include "options.h" #include "stl.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #include "basop_util.h" diff --git a/lib_com/index_pvq_opt_fx.c b/lib_com/index_pvq_opt_fx.c index 2f75d8ac8..3ca87f638 100644 --- a/lib_com/index_pvq_opt_fx.c +++ b/lib_com/index_pvq_opt_fx.c @@ -7,8 +7,7 @@ #include "options.h" #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #define N_OPT_FX 5 /* complexity setting, direct functional calculation limit & low dim recursion limit */ diff --git a/lib_com/int_lsp.c b/lib_com/int_lsp.c index a79a6bba5..b6528030e 100644 --- a/lib_com/int_lsp.c +++ b/lib_com/int_lsp.c @@ -40,8 +40,7 @@ #include "prot.h" #include "rom_com.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*---------------------------------------------------------------------* * int_lsp() diff --git a/lib_com/interleave_spectrum.c b/lib_com/interleave_spectrum.c index f5e6acf31..9fdba4c77 100644 --- a/lib_com/interleave_spectrum.c +++ b/lib_com/interleave_spectrum.c @@ -40,8 +40,7 @@ #include "prot.h" #include "rom_com.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif diff --git a/lib_com/interpol.c b/lib_com/interpol.c index 2dfab173b..f4e42de2c 100644 --- a/lib_com/interpol.c +++ b/lib_com/interpol.c @@ -39,8 +39,7 @@ #include "prot.h" #include "wmc_auto.h" #include "rom_com.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "prot_fx_enc.h" /*-------------------------------------------------------------------* diff --git a/lib_com/isf_dec_amr_wb_fx.c b/lib_com/isf_dec_amr_wb_fx.c index 4327339b8..e0b891273 100644 --- a/lib_com/isf_dec_amr_wb_fx.c +++ b/lib_com/isf_dec_amr_wb_fx.c @@ -34,7 +34,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #ifdef _MSC_VER void E_LPC_isf_isp_conversion( const Word16 isf[], Word16 isp[], const Word16 m ); diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index 0be1c40ff..83269c34b 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -36,7 +36,7 @@ #include "ivas_prot.h" #include "wmc_auto.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-----------------------------------------------------------------------------------------* * Local constants diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 1762c9f68..cce2880bd 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -40,8 +40,7 @@ #include "prot.h" #include "cnst.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_rom_com_fx.h" diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index 0b890d7a8..59b62491c 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -39,8 +39,7 @@ #include #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_rom_com_fx.h" #endif diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index 6955e83e3..6a287d2da 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -41,8 +41,7 @@ #include "ivas_rom_com.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #define IVAS_FLOAT_FIXED_TO_BE_REMOVED diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c index e1aa643d6..e0005e4b8 100644 --- a/lib_com/ivas_masa_com.c +++ b/lib_com/ivas_masa_com.c @@ -41,7 +41,7 @@ #include "ivas_stat_dec.h" #include "wmc_auto.h" #include "ivas_rom_com_fx.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" diff --git a/lib_com/ivas_mc_param_com.c b/lib_com/ivas_mc_param_com.c index 5297d332a..1b19b9037 100644 --- a/lib_com/ivas_mc_param_com.c +++ b/lib_com/ivas_mc_param_com.c @@ -36,7 +36,7 @@ #include "options.h" #include "ivas_cnst.h" #include "prot.h" -#include "prot_fx1.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_stat_com.h" #include "ivas_rom_com.h" diff --git a/lib_com/ivas_mct_com.c b/lib_com/ivas_mct_com.c index f68f576f9..dd7910748 100644 --- a/lib_com/ivas_mct_com.c +++ b/lib_com/ivas_mct_com.c @@ -35,7 +35,6 @@ #include "ivas_cnst.h" #include "ivas_prot.h" #include "prot.h" -#include "prot_fx1.h" #include "wmc_auto.h" #include diff --git a/lib_com/ivas_mdct_core_com.c b/lib_com/ivas_mdct_core_com.c index a715790b8..7e7a00cfc 100644 --- a/lib_com/ivas_mdct_core_com.c +++ b/lib_com/ivas_mdct_core_com.c @@ -37,8 +37,7 @@ #include "prot.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif diff --git a/lib_com/ivas_mdct_imdct_fx.c b/lib_com/ivas_mdct_imdct_fx.c index e5bdfca19..c25f4fab4 100644 --- a/lib_com/ivas_mdct_imdct_fx.c +++ b/lib_com/ivas_mdct_imdct_fx.c @@ -32,7 +32,7 @@ #include #include "options.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #include "ivas_rom_com_fx.h" #ifdef DEBUGGING diff --git a/lib_com/ivas_mdft_imdft.c b/lib_com/ivas_mdft_imdft.c index 2a785bd34..564285b09 100644 --- a/lib_com/ivas_mdft_imdft.c +++ b/lib_com/ivas_mdft_imdft.c @@ -41,8 +41,7 @@ #ifdef IVAS_FLOAT_FIXED #include #include -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "debug.h" #define float_to_fix( n, factor ) ( round( n * ( 1 << factor ) ) ) #define fix_to_float( n, factor ) ( (float) n / ( 1 << factor ) ) diff --git a/lib_com/ivas_omasa_com.c b/lib_com/ivas_omasa_com.c index d7f25bfbb..5dbe03866 100644 --- a/lib_com/ivas_omasa_com.c +++ b/lib_com/ivas_omasa_com.c @@ -36,11 +36,10 @@ #include "ivas_prot.h" #include "ivas_prot_fx.h" #include "prot.h" -#include "prot_fx1.h" #include "ivas_rom_com.h" #include "rom_com.h" #include -#include "prot_fx2.h" +#include "prot_fx.h" /*--------------------------------------------------------------- * Local constants diff --git a/lib_com/ivas_pca_tools.c b/lib_com/ivas_pca_tools.c index 2fa1f11f0..f2c6d8d0e 100644 --- a/lib_com/ivas_pca_tools.c +++ b/lib_com/ivas_pca_tools.c @@ -40,7 +40,7 @@ #include "wmc_auto.h" #include "prot.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" +#include "prot_fx.h" #endif /*---------------------------------------------------------------------* diff --git a/lib_com/ivas_qmetadata_com.c b/lib_com/ivas_qmetadata_com.c index dcd68f04b..3bcec831e 100644 --- a/lib_com/ivas_qmetadata_com.c +++ b/lib_com/ivas_qmetadata_com.c @@ -38,11 +38,10 @@ #include "ivas_rom_com.h" #include "ivas_prot.h" #include "prot.h" -#include "prot_fx1.h" #include "cnst.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif #ifdef IVAS_FLOAT_FIXED diff --git a/lib_com/ivas_sns_com_fx.c b/lib_com/ivas_sns_com_fx.c index 9e83cd240..ee29a001d 100644 --- a/lib_com/ivas_sns_com_fx.c +++ b/lib_com/ivas_sns_com_fx.c @@ -34,8 +34,7 @@ #include "options.h" #include "cnst.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "rom_com.h" #include "ivas_rom_com.h" diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 36938507a..485424125 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -36,8 +36,7 @@ #include "basop_util.h" #include "ivas_stat_com.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "rom_com.h" #include "ivas_rom_com.h" diff --git a/lib_com/ivas_spar_com_quant_util.c b/lib_com/ivas_spar_com_quant_util.c index 667d21b7f..78541fd9d 100644 --- a/lib_com/ivas_spar_com_quant_util.c +++ b/lib_com/ivas_spar_com_quant_util.c @@ -34,13 +34,11 @@ #include "options.h" #include "math.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_rom_com.h" #include #include "wmc_auto.h" -#include "prot_fx1.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_rom_com_fx.h" #endif diff --git a/lib_com/ivas_stereo_ica_com_fx.c b/lib_com/ivas_stereo_ica_com_fx.c index 6ffce03e4..a4881b800 100644 --- a/lib_com/ivas_stereo_ica_com_fx.c +++ b/lib_com/ivas_stereo_ica_com_fx.c @@ -37,8 +37,7 @@ #include "cnst.h" #include "ivas_cnst.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "wmc_auto.h" #include "rom_com.h" diff --git a/lib_com/ivas_stereo_mdct_bands_com.c b/lib_com/ivas_stereo_mdct_bands_com.c index 3c06612c4..7fa5c100d 100644 --- a/lib_com/ivas_stereo_mdct_bands_com.c +++ b/lib_com/ivas_stereo_mdct_bands_com.c @@ -40,8 +40,7 @@ #include "prot.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif diff --git a/lib_com/ivas_stereo_mdct_stereo_com.c b/lib_com/ivas_stereo_mdct_stereo_com.c index 28e22b28c..a17ba876f 100644 --- a/lib_com/ivas_stereo_mdct_stereo_com.c +++ b/lib_com/ivas_stereo_mdct_stereo_com.c @@ -37,8 +37,7 @@ #include "wmc_auto.h" #include #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif diff --git a/lib_com/ivas_stereo_td_bit_alloc.c b/lib_com/ivas_stereo_td_bit_alloc.c index 737830827..a03100b25 100644 --- a/lib_com/ivas_stereo_td_bit_alloc.c +++ b/lib_com/ivas_stereo_td_bit_alloc.c @@ -41,8 +41,7 @@ #include "prot.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif #ifdef IVAS_FLOAT_FIXED diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index f579e64fc..0fd41f02f 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -35,12 +35,10 @@ #include "options.h" #include #include "prot.h" -#include "prot_fx1.h" #include "ivas_prot.h" #include "wmc_auto.h" #include "ivas_rom_com.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif diff --git a/lib_com/ivas_transient_det.c b/lib_com/ivas_transient_det.c index a8841845a..de238aa5b 100644 --- a/lib_com/ivas_transient_det.c +++ b/lib_com/ivas_transient_det.c @@ -39,7 +39,7 @@ #include "ivas_prot.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx1.h" +#include "prot_fx.h" #endif #include "ivas_stat_com.h" diff --git a/lib_com/lag_wind.c b/lib_com/lag_wind.c index e7fe28882..5e289b34f 100644 --- a/lib_com/lag_wind.c +++ b/lib_com/lag_wind.c @@ -38,8 +38,7 @@ #include #include "options.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "cnst.h" #include "rom_com.h" #include "wmc_auto.h" diff --git a/lib_com/lerp.c b/lib_com/lerp.c index eea745b81..80e789c4c 100644 --- a/lib_com/lerp.c +++ b/lib_com/lerp.c @@ -37,8 +37,7 @@ #include #include "options.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "wmc_auto.h" diff --git a/lib_com/limit_t0_fx.c b/lib_com/limit_t0_fx.c index 97aa4fd8f..07557fe72 100644 --- a/lib_com/limit_t0_fx.c +++ b/lib_com/limit_t0_fx.c @@ -5,8 +5,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" diff --git a/lib_com/logqnorm_fx.c b/lib_com/logqnorm_fx.c index 902a120b4..a4196a1b3 100644 --- a/lib_com/logqnorm_fx.c +++ b/lib_com/logqnorm_fx.c @@ -32,7 +32,7 @@ #include #include "options.h" /* Compilation switches */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "cnst.h" /* Common constants */ diff --git a/lib_com/longarith.c b/lib_com/longarith.c index 2617034d9..65070f093 100644 --- a/lib_com/longarith.c +++ b/lib_com/longarith.c @@ -41,7 +41,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif diff --git a/lib_com/low_rate_band_att_fx.c b/lib_com/low_rate_band_att_fx.c index a71311f38..f593089b1 100644 --- a/lib_com/low_rate_band_att_fx.c +++ b/lib_com/low_rate_band_att_fx.c @@ -5,8 +5,7 @@ #include #include "options.h" /* Compilation switches */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif diff --git a/lib_com/lpc_tools.c b/lib_com/lpc_tools.c index 382ca06d8..ff6dfea48 100644 --- a/lib_com/lpc_tools.c +++ b/lib_com/lpc_tools.c @@ -42,7 +42,7 @@ #include "prot.h" #include "rom_com.h" #include "wmc_auto.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-----------------------------------------------------------------* * Local constants diff --git a/lib_com/lpc_tools_fx.c b/lib_com/lpc_tools_fx.c index 83b59079a..f723a2725 100644 --- a/lib_com/lpc_tools_fx.c +++ b/lib_com/lpc_tools_fx.c @@ -38,7 +38,7 @@ #include #include "options.h" /* Compilation switches */ #include "ivas_cnst.h" /* Common constants */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" #include "basop_util.h" diff --git a/lib_com/lsf_dec_bfi_fx.c b/lib_com/lsf_dec_bfi_fx.c index 4c10059d0..14b842115 100644 --- a/lib_com/lsf_dec_bfi_fx.c +++ b/lib_com/lsf_dec_bfi_fx.c @@ -8,8 +8,7 @@ #include "basop_util.h" #include "rom_com.h" #include "cnst.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*---------------------------------------------------------------------* diff --git a/lib_com/lsf_msvq_ma_fx.c b/lib_com/lsf_msvq_ma_fx.c index a423cb951..409566ddc 100644 --- a/lib_com/lsf_msvq_ma_fx.c +++ b/lib_com/lsf_msvq_ma_fx.c @@ -6,8 +6,7 @@ #include "cnst.h" #include "options.h" #include "rom_com.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #ifndef swap diff --git a/lib_com/lsf_tools.c b/lib_com/lsf_tools.c index 0b9223922..ddce7c199 100644 --- a/lib_com/lsf_tools.c +++ b/lib_com/lsf_tools.c @@ -44,8 +44,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif /*-------------------------------------------------------------------* diff --git a/lib_com/lsf_tools_fx.c b/lib_com/lsf_tools_fx.c index c0f7bd613..c3a5fc40e 100644 --- a/lib_com/lsf_tools_fx.c +++ b/lib_com/lsf_tools_fx.c @@ -36,7 +36,7 @@ #include "basop_util.h" #include "rom_com.h" #include "ivas_cnst.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_error.h" diff --git a/lib_com/lsp_conv_poly_fx.c b/lib_com/lsp_conv_poly_fx.c index 0cda281ea..70b919002 100644 --- a/lib_com/lsp_conv_poly_fx.c +++ b/lib_com/lsp_conv_poly_fx.c @@ -10,7 +10,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" /*-------------------------------------------------------------------* * Local constants diff --git a/lib_com/modif_fs.c b/lib_com/modif_fs.c index 4bccd568b..67593def4 100644 --- a/lib_com/modif_fs.c +++ b/lib_com/modif_fs.c @@ -41,7 +41,7 @@ #include "prot.h" #include "rom_com.h" #include "wmc_auto.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-------------------------------------------------------------------* * modify_Fs() diff --git a/lib_com/modif_fs_fx.c b/lib_com/modif_fs_fx.c index 1845bcde2..c0c42d319 100644 --- a/lib_com/modif_fs_fx.c +++ b/lib_com/modif_fs_fx.c @@ -5,8 +5,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" /* Static table prototypes */ #include #include "rom_enc.h" /* prototypes */ diff --git a/lib_com/mslvq_com.c b/lib_com/mslvq_com.c index 00b77cebf..d7d4c427b 100644 --- a/lib_com/mslvq_com.c +++ b/lib_com/mslvq_com.c @@ -41,7 +41,7 @@ #include "prot.h" #include "wmc_auto.h" #include "ivas_prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" /*-----------------------------------------------------------------* diff --git a/lib_com/mslvq_com_fx.c b/lib_com/mslvq_com_fx.c index b2e0e0b23..cce159738 100644 --- a/lib_com/mslvq_com_fx.c +++ b/lib_com/mslvq_com_fx.c @@ -32,7 +32,7 @@ #include "options.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_cnst.h" #include "stl.h" #include "rom_com.h" diff --git a/lib_com/nelp_fx.c b/lib_com/nelp_fx.c index f0420e3db..690db5865 100644 --- a/lib_com/nelp_fx.c +++ b/lib_com/nelp_fx.c @@ -33,7 +33,7 @@ #include #include "options.h" #include "rom_com.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*===================================================================*/ diff --git a/lib_com/parameter_bitmaping.c b/lib_com/parameter_bitmaping.c index 5b6374ee0..2be70b058 100644 --- a/lib_com/parameter_bitmaping.c +++ b/lib_com/parameter_bitmaping.c @@ -39,7 +39,7 @@ #include "options.h" #include "stat_com.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "wmc_auto.h" diff --git a/lib_com/parameter_bitmaping_fx.c b/lib_com/parameter_bitmaping_fx.c index ee5dd7d73..e66d7b603 100644 --- a/lib_com/parameter_bitmaping_fx.c +++ b/lib_com/parameter_bitmaping_fx.c @@ -2,7 +2,7 @@ #include #include "options.h" #include "stat_com.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "wmc_auto.h" /** Get nBits long value from bitstream into *pStream. */ diff --git a/lib_com/phase_dispersion_fx.c b/lib_com/phase_dispersion_fx.c index 74ae7708c..b7ca7b739 100644 --- a/lib_com/phase_dispersion_fx.c +++ b/lib_com/phase_dispersion_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* EV-VBR compilation switches */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "rom_com.h" diff --git a/lib_com/ppp_fx.c b/lib_com/ppp_fx.c index 673ffd469..390c0a47c 100644 --- a/lib_com/ppp_fx.c +++ b/lib_com/ppp_fx.c @@ -33,7 +33,7 @@ #include #include "options.h" #include "cnst.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*===================================================================*/ /* FUNCTION : Interpol_delay_fx () */ diff --git a/lib_com/pred_lt4_fx.c b/lib_com/pred_lt4_fx.c index a6672c2b2..6cc06f28e 100644 --- a/lib_com/pred_lt4_fx.c +++ b/lib_com/pred_lt4_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_com/preemph_fx.c b/lib_com/preemph_fx.c index e610e9fd7..63de35dca 100644 --- a/lib_com/preemph_fx.c +++ b/lib_com/preemph_fx.c @@ -3,8 +3,7 @@ ====================================================================================*/ #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-------------------------------------------------------------* * preemph_copy_fx() * diff --git a/lib_com/prot.h b/lib_com/prot.h index 96bdd1952..1dbf548a6 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -166,18 +166,6 @@ float sum2_f( const int16_t lvec /* i : length of input vector */ ); -#ifdef IVAS_FLOAT_FIXED -Word32 sum2_f_32_fx( - const Word32 *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ - Word16 gb ); - -Word32 sum2_32_fx( - const Word32 *vec, /* i : input vector */ - const Word16 lvec, /* i : length of input vector */ - Word16 *e ); -#endif - void set_c( int8_t y[], /* i/o: Vector to set */ const int8_t a, /* i : Value to set the vector to */ @@ -276,14 +264,12 @@ int16_t minimum( float *min_val /* o : minimum value in the input vector */ ); -#ifndef IVAS_FLOAT_FIXED /*! r: index of the minimum value in the input vector */ int16_t minimum_s( const int16_t *vec, /* i : Input vector */ const int16_t lvec, /* i : Vector length */ int16_t *min_val /* o : minimum value in the input vector */ ); -#endif /*! r: return index with max energy value in vector */ int16_t emaximum( @@ -336,15 +322,6 @@ void v_sub( const int16_t N /* i : Vector length */ ); -#ifdef IVAS_FLOAT_FIXED -void v_mult_fixed( - const Word32 x1[], /* i : Input vector 1 */ - const Word32 x2[], /* i : Input vector 2 */ - Word32 y[], /* o : Output vector that contains vector 1 .* vector 2 */ - const Word16 N /* i : Vector length */ -); -#endif - void v_mult( const float x1[], /* i : Input vector 1 */ const float x2[], /* i : Input vector 2 */ @@ -365,20 +342,6 @@ void v_sub_s( int16_t y[], /* o : Output vector that contains vector 1 - vector 2 */ const int16_t N /* i : Vector length */ ); -#ifdef IVAS_FLOAT_FIXED -void v_sub_s16_fx( - const Word16 x1[], /* i : Input vector 1 */ - const Word16 x2[], /* i : Input vector 2 */ - Word16 y[], /* o : Output vector that contains vector 1 - vector 2 */ - const Word16 N /* i : Vector length */ -); -void v_sub32_fx( - const Word32 x1[], /* i : Input vector 1 */ - const Word32 x2[], /* i : Input vector 2 */ - Word32 y[], /* o : Output vector that contains vector 1 - vector 2 */ - const Word16 N /* i : Vector length */ -); -#endif // IVAS_FLOAT_FIXED /*! r: index of the winning codeword */ int16_t squant( @@ -505,22 +468,6 @@ void delay_signal_float( const int16_t delay /* i : delay in samples */ ); -#ifdef IVAS_FLOAT_FIXED -void delay_signal_fx( - Word32 x[], /* i/o: signal to be delayed */ - const int16_t len, /* i : length of the input signal */ - Word32 mem[], /* i/o: synchronization memory */ - const int16_t delay /* i : delay in samples */ -); -void delay_signal_q_adj_fx( - Word32 x[], /* i/o: signal to be delayed */ - const int16_t len, /* i : length of the input signal */ - Word32 mem[], /* i/o: synchronization memory */ - const int16_t delay, /* i : delay in samples */ - const Word16 q_x, - const Word16 q_mem ); -#endif - ivas_error push_indice( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ int16_t id, /* i : ID of the indice */ @@ -1754,7 +1701,6 @@ void diff_envelope_coding( int16_t *difidx /* o : differential code */ ); -#ifndef IVAS_FLOAT_FIXED /*! r: Number of bits */ int16_t decode_envelope_indices( Decoder_State *st, /* i/o: decoder state structure */ @@ -1765,9 +1711,7 @@ int16_t decode_envelope_indices( const int16_t flag_HQ2, /* i : indicator of HQ2 core */ const int16_t is_transient /* i : transient flag */ ); -#endif -#ifndef IVAS_FLOAT_FIXED /*! r: Number of bits */ void dequantize_norms( Decoder_State *st, /* i/o: decoder state structure */ @@ -1777,7 +1721,6 @@ void dequantize_norms( int16_t *ynrm, /* o : Decoded norm indices */ int16_t *normqlg2 /* o : Log2 of decoded norms */ ); -#endif void hq_configure( const int16_t length, /* i : Frame length */ @@ -1824,7 +1767,6 @@ int16_t hq_classifier_enc( int16_t *hqswb_clas /* o : HQ class */ ); -#ifndef IVAS_FLOAT_FIXED /*! r: Consumed bits */ int16_t hq_classifier_dec( Decoder_State *st, /* i/o: decoder state structure */ @@ -1833,7 +1775,6 @@ int16_t hq_classifier_dec( int16_t *is_transient, /* o : Transient flag */ int16_t *hqswb_clas /* o : HQ class */ ); -#endif void hq_bit_allocation( const int32_t core_brate, /* i : Core bitrate */ @@ -2361,7 +2302,7 @@ void pre_proc( float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer */ int16_t *hq_core_type /* o : HQ core type */ ); -#endif + /*! r: HQ_CORE/TCX_20_CORE decision */ int16_t mdct_classifier( @@ -2676,19 +2617,7 @@ void swb_tbe_enc( float *White_exc16k, /* o : shaped white excitation for the FB TBE */ const float pitch_buf[] /* i : pitch for each subframe */ ); -#ifdef IVAS_FLOAT_FIXED -void ivas_swb_tbe_dec_fx( - Decoder_State *st, /* i/o: decoder state structure */ - STEREO_ICBWE_DEC_HANDLE hStereoICBWE, /* i/o: IC-BWE state structure */ - const Word32 *bwe_exc_extended_fx, /* i : bandwidth extended excitation */ - Word16 Q_exc, - const Word16 voice_factors_fx[], /* i : voicing factors */ - const Word32 old_syn_12k8_16k_fx[], /* i : low band synthesis */ - Word16 *White_exc16k_fx, /* o : shaped white excitation for the FB TBE */ - Word32 *synth_fx, /* o : SHB synthesis/final synthesis */ - Word16 *pitch_buf_fx, - Word16 *Q_white_exc ); -#endif + void swb_tbe_dec( Decoder_State *st, /* i/o: decoder state structure */ STEREO_ICBWE_DEC_HANDLE hStereoICBWE, /* i/o: IC-BWE state structure */ @@ -2937,18 +2866,6 @@ void swb_bwe_dec_flt( const int16_t output_frame /* i : frame length */ ); -#ifdef IVAS_FLOAT_FIXED -Word16 swb_bwe_dec_fx32( - Decoder_State *st, /* i/o: decoder state structure */ - Word32 output[], /* i : synthesis @internal Fs Q11 */ - Word32 *synth, /* i : ACELP core synthesis/final synthesis Q11 */ - Word32 *hb_synth, /* o : SHB synthesis/final synthesis */ - Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ - Word16 output_frame /* i : frame length */ -); -#endif // IVAS_FLOAT_FIXED - - void hr_bwe_dec_init_flt( HR_BWE_DEC_HANDLE hBWE_FD_HR /* i/o: HR BWE data handle */ ); @@ -4201,21 +4118,12 @@ void AVQ_encmux( int16_t trgtSvPos /* i : target SV for AVQ bit savings */ ); -#ifndef IVAS_FLOAT_FIXED void ordr_esti( const int16_t k, /* i : sub-vector index */ int16_t *Mpos, /* i/o: dominant sub-vector position from ACV */ int16_t svOrder[], /* i/o: AVQ sub-vector order */ const int16_t Nsv /* i : total sub-vectors in a sub-frames */ ); -#else -void ordr_esti( - const Word16 k, /* i : sub-vector index */ - Word16 *Mpos, /* i/o: dominant sub-vector position from ACV */ - Word16 svOrder[], /* i/o: AVQ sub-vector order */ - const Word16 Nsv /* i : total sub-vectors in a sub-frames */ -); -#endif void re8_cod( int16_t x[], /* i : point in RE8 (8-dimensional integer vector) */ @@ -4648,7 +4556,6 @@ void signaling_enc_rf( Encoder_State *st /* i/o: encoder state structure */ ); -#ifndef IVAS_FLOAT_FIXED ivas_error acelp_core_dec( Decoder_State *st, /* i/o: Decoder state structure */ float output[], /* o : synthesis @internal Fs */ @@ -4672,33 +4579,6 @@ ivas_error acelp_core_dec( STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ const int16_t read_sid_info /* i : read SID info flag */ ); -#endif - -#ifdef IVAS_FLOAT_FIXED -ivas_error acelp_core_dec_ivas_fx( - Decoder_State *st, /* i/o: decoder state structure */ - Word16 output[], /* o : synthesis @internal Fs */ - Word16 synth[], /* o : synthesis */ - Word16 save_hb_synth[], /* o : HB synthesis */ - Word32 bwe_exc_extended[], /* i/o: bandwidth extended excitation */ - Word16 *voice_factors, /* o : voicing factors */ - Word16 old_syn_12k8_16k[], /* o : intermediate ACELP synthesis at 12.8kHz or 16kHz to be used by SWB BWE */ - const int16_t sharpFlag, /* i : formant sharpening flag */ - Word16 pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */ - int16_t *unbits, /* o : number of unused bits */ - int16_t *sid_bw, /* o : 0-NB/WB, 1-SWB SID */ - STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ - const Word16 tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */ - const Word16 tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ - const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ - const int16_t last_element_mode, /* i : last element mode */ - const int32_t last_element_brate, /* i : last element bitrate */ - const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ - const int16_t nchan_out, /* i : number of output channels */ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ - const int16_t read_sid_info /* i : read SID info flag */ -); -#endif void bass_psfilter_init( BPF_DEC_HANDLE hBPF /* o : BPF data handle */ @@ -5314,12 +5194,6 @@ ivas_error init_decoder( const MC_MODE mc_mode /* i : MC mode */ ); -#ifdef IVAS_FLOAT_FIXED -void destroy_cldfb_decoder_ivas_fx( - Decoder_State *st /* o : Decoder static variables structure */ -); -#endif // IVAS_FLOAT_FIXED - void destroy_cldfb_decoder_flt( Decoder_State *st /* o : Decoder static variables structure */ ); @@ -5397,17 +5271,6 @@ void wtda( const int16_t L /* i : length */ ); -#ifdef IVAS_FLOAT_FIXED -void wtda_fx32( - const Word32 *new_audio, /* i : input audio Q11 */ - Word32 *wtda_audio, /* o : windowed audio Q11 */ - Word32 *old_wtda, /* i/o: windowed audio from previous frame Q11 */ - const Word16 left_mode, /* i : window overlap of previous frame (0: full, 2: none, or 3: half) */ - const Word16 right_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */ - const Word16 L /* i : length */ -); -#endif - void wtda_ext( const float *new_audio, /* i : input audio */ float *wtda_audio, /* o : windowed audio */ @@ -5465,7 +5328,6 @@ void logqnorm( const int16_t N, /* i : sub-vector size */ const float *thren ); -#ifndef IVAS_FLOAT_FIXED void huff_dec( Decoder_State *st, /* i/o: decoder state structure */ const int16_t N, /* i : Number of codewords to decode */ @@ -5476,7 +5338,6 @@ void huff_dec( const int16_t *huff_tab, /* i : Huffman table order by codeword lengths */ int16_t *index /* o : Decoded index */ ); -#endif void calc_norm( const float *x, /* i : Input vector. */ @@ -5617,38 +5478,30 @@ void hq_hr_dec( ); -#ifndef IVAS_FLOAT_FIXED void hdecnrm_context( Decoder_State *st, /* i/o: decoder state structure */ const int16_t N, /* i : number of norms */ int16_t *index, /* o : indices of quantized norms */ int16_t *n_length /* o : decoded stream length */ ); -#endif -#ifndef IVAS_FLOAT_FIXED void hdecnrm_tran( Decoder_State *st, /* i/o: decoder state structure */ const int16_t N, /* i : number of norms */ int16_t *index /* o : indices of quantized norms */ ); -#endif -#ifndef IVAS_FLOAT_FIXED void hdecnrm_resize( Decoder_State *st, /* i/o: decoder state structure */ const int16_t N, /* i : number of SFMs */ int16_t *index /* o : norm quantization index vector */ ); -#endif -#ifndef IVAS_FLOAT_FIXED void hdecnrm( Decoder_State *st, /* i/o: decoder state structure */ const int16_t N, /* i : number of norms */ int16_t *index /* o : indices of quantized norms */ ); -#endif /*! r: index of last band */ int16_t find_last_band( @@ -6088,18 +5941,6 @@ ivas_error core_switching_post_dec( const int16_t nchan_out, /* i : number of output channels */ const int16_t last_element_mode /* i : element mode of previous frame */ ); -#ifdef IVAS_FLOAT_FIXED -ivas_error core_switching_pre_dec_ivas_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const Word16 output_frame, /* i : frame length */ - const Word32 last_core_brate_st0, /* i : channel 0 last core bitrate */ - const Word16 nchan_out, /* i : number of output channels */ - const Word16 last_element_mode, /* i : last_element_mode */ - const Word32 last_element_brate, /* i : last element bitrate */ - Word16 Q_old_synthFB, - Word16 *Q_olapBufferSynth, - Word16 *Q_olapBufferSynth2 ); -#endif // IVAS_FLOAT_FIXED ivas_error core_switching_pre_dec( Decoder_State *st, /* i/o: decoder state structure */ @@ -6937,14 +6778,6 @@ void hp20_flt( Float32 mem[], const Word32 Fs ); -#ifdef IVAS_FLOAT_FIXED -void hp20_fix32( - Word32 signal_fx[], - const Word16 lg, - Word32 mem_fx[], - const Word32 Fs ); -#endif // IVAS_FLOAT_FIXED - void ham_cos_window_flt( float *fh, const int16_t n1, @@ -6984,21 +6817,6 @@ void enc_acelp_tcx_main( const int16_t vad_hover_flag /* i : VAD hangover flag */ ); -#ifdef IVAS_FLOAT_FIXED -void getTCXMode_ivas_fx( - Decoder_State *st, /* i/o: decoder memory state */ - Decoder_State *st0, /* i : bitstream */ - const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ -); - -void getTCXWindowing_ivas_fx( - const Word16 core, /* i : current frame mode */ - const Word16 last_core, /* i : last frame mode */ - const Word16 element_mode, /* i : element mode */ - TCX_CONFIG_HANDLE hTcxCfg, /* i/o: TCX configuration handle */ - Decoder_State *st0 /* i : bitstream */ -); -#else void getTCXMode_ivas( Decoder_State *st, /* i/o: decoder memory state */ Decoder_State *st0, /* i : bitstream */ @@ -7012,7 +6830,7 @@ void getTCXWindowing_ivas( TCX_CONFIG_HANDLE hTcxCfg, /* i/o: TCX configuration handle */ Decoder_State *st0 /* i : bitstream */ ); -#endif +//#endif void getLPCparam_ivas( Decoder_State *st, /* i/o: decoder memory state */ @@ -7490,7 +7308,6 @@ void ACcontextMapping_encode2_no_mem_s17_LC( int16_t resQMaxBits, CONTEXT_HM_CONFIG *hm_cfg ); -#ifndef IVAS_FLOAT_FIXED int16_t ACcontextMapping_decode2_no_mem_s17_LC_ivas( Decoder_State *st, /* i/o: decoder state */ int16_t *x, /* o : decoded spectrum */ @@ -7499,7 +7316,6 @@ int16_t ACcontextMapping_decode2_no_mem_s17_LC_ivas( int16_t resQMaxBits, /* i : residual coding maximum bits */ CONTEXT_HM_CONFIG *hm_cfg /* i : context-based harmonic model configuration */ ); -#endif int16_t ACcontextMapping_encode2_estimate_no_mem_s17_LC( const int16_t *x, @@ -7519,7 +7335,6 @@ void RCcontextMapping_encode2_no_mem_s17_LCS( const int16_t resQMaxBits, CONTEXT_HM_CONFIG *hm_cfg ); -#ifndef IVAS_FLOAT_FIXED int16_t RCcontextMapping_decode2_no_mem_s17_LCS( Decoder_State *st, /* i/o: decoder state */ int16_t *x, /* o : decoded spectrum */ @@ -7528,7 +7343,6 @@ int16_t RCcontextMapping_decode2_no_mem_s17_LCS( const int16_t resQMaxBits, /* i : residual coding maximum bits */ CONTEXT_HM_CONFIG *hm_cfg /* i : context-based harmonic model configuration */ ); -#endif int16_t RCcontextMapping_encode2_estimate_no_mem_s17_LCS( int16_t *x, /* Spectral coefficients */ @@ -7879,13 +7693,6 @@ int16_t ari_start_decoding_14bits_prm_ivas( int16_t bp, Tastat *s ); -#ifdef IVAS_FLOAT_FIXED -Word16 ari_start_decoding_14bits_prm_ivas_fx( - const Word16 *ptr, - Word16 bp, - Tastat *s ); -#endif - void ari_decode_14bits_s17_ext_ivas( Decoder_State *st, uint16_t *res, @@ -8925,21 +8732,6 @@ void generate_masking_noise( const int16_t nchan_out /* i : number of output channels */ ); -#ifdef IVAS_FLOAT_FIXED -void generate_masking_noise_ivas_fx( - Word32 *timeDomainBuffer, /* i/o: time-domain signal */ - Word16 *exp_out, /* o : time-domain signal exp */ - HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ - const Word16 length, /* i : frame size */ - const Word16 core, /* i : core */ - const Word16 return_noise, /* i : noise is returned instead of added */ - const Word16 secondary, /* i : flag to indicate secondary noise generation */ - const Word16 element_mode, /* i : element mode */ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ - const Word16 nchan_out /* i : number of output channels */ -); -#endif - void generate_masking_noise_update_seed( HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ ); @@ -8957,16 +8749,7 @@ void SynthesisSTFT_dirac_flt( const int16_t samples_out, HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ ); -#ifdef IVAS_FLOAT_FIXED -void SynthesisSTFT_dirac_fx( - Word32 *fftBuffer, /* i : FFT bins */ - Word32 *timeDomainOutput, - Word32 *olapBuffer, - const Word16 *olapWin, - const Word16 samples_out, - HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ -); -#endif + void generate_masking_noise_dirac( HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */ @@ -8988,19 +8771,6 @@ void generate_stereo_masking_noise( const int16_t nchan_out /* i : number of output channels */ ); -#ifdef IVAS_FLOAT_FIXED -void generate_stereo_masking_noise_fx( - Word16 *syn, /* i/o: time-domain signal */ - Word16 Q_syn, - Decoder_State *st, /* i/o: decoder state structure */ - STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i : TD stereo structure */ - const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ - const int16_t fadeOut, /* i : only fade out of previous state */ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ - const int16_t nchan_out /* i : number of output channels */ -); -#endif - void apply_scale_flt( float *scale, /* i : scale factor */ const int16_t bwidth, /* i : audio bandwidth */ @@ -9055,19 +8825,6 @@ void SynthesisSTFT_flt( const int16_t nchan_out /* i : number of output channels */ ); -#ifdef IVAS_FLOAT_FIXED -void SynthesisSTFT_fx( - Word32 *fftBuffer, /* i : FFT bins */ - Word32 *timeDomainOutput, - Word32 *olapBuffer, - const Word16 *olapWin, - const int16_t tcx_transition, - HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ - const int16_t element_mode, /* i : element mode */ - const int16_t nchan_out /* i : number of output channels */ -); -#endif - float rand_gauss_flt( float *x, int16_t *seed ); @@ -9126,12 +8883,6 @@ void FdCng_decodeSID( Decoder_State *st /* i/o: decoder state structure */ ); -#ifdef IVAS_FLOAT_FIXED -void FdCng_decodeSID_ivas_fx( - Decoder_State *st /* i/o: decoder state structure */ -); -#endif - void FdCng_exc_flt( HANDLE_FD_CNG_COM hFdCngCom, int16_t *CNG_mode, @@ -9415,20 +9166,10 @@ void resampleCldfb_ivas( HANDLE_CLDFB_FILTER_BANK hs, /* i/o: filter bank handle */ const int32_t newSamplerate /* i : new samplerate to operate */ ); -#ifdef IVAS_FLOAT_FIXED -ivas_error cldfb_save_memory_ivas_fx( - HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ -); -#endif // IVAS_FLOAT_FIXED ivas_error cldfb_save_memory_ivas( HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ ); -#ifdef IVAS_FLOAT_FIXED -void cldfb_restore_memory_ivas_fx( - HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ -); -#endif // IVAS_FLOAT_FIXED void cldfb_restore_memory_ivas( HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ @@ -9491,7 +9232,6 @@ ivas_error config_acelp1_IVAS( /*! r: ACELP16k flag */ -#ifndef IVAS_FLOAT_FIXED int16_t set_ACELP_flag_IVAS( const int16_t element_mode, /* i : element mode */ const int32_t element_brate, /* i : element bitrate */ @@ -9501,7 +9241,6 @@ int16_t set_ACELP_flag_IVAS( const int16_t bwidth, /* i : audio bandwidth */ const int16_t cng_type /* i : CNG type */ ); -#endif void FEC_clas_estim( const float *syn, @@ -9959,14 +9698,12 @@ int16_t GetPLCModeDecision( Decoder_State *st /* i/o: decoder memory state pointer */ ); -#ifndef IVAS_FLOAT_FIXED void addBassPostFilter( const float *harm_timeIn, const int16_t samplesToProcess, float **rAnalysis, float **iAnalysis, HANDLE_CLDFB_FILTER_BANK cldfb ); -#endif ivas_error TonalMDCTConceal_Init_ivas( TonalMDCTConcealPtr hTonalMDCTConc, @@ -10156,15 +9893,11 @@ int16_t getRestrictedMode( int16_t getMdctWindowLength( const int16_t fscale ); -#ifdef IVAS_FLOAT_FIXED -Word16 sr2fscale( - const Word32 sr_core /* i : internal sampling rate */ -); -#else + int16_t sr2fscale( const int32_t sr_core /* i : internal sampling rate */ ); -#endif + int32_t getCoreSamplerateMode2_flt( const int16_t element_mode, /* i : IVAS element mode */ const int32_t total_brate, /* i : total bitrate */ @@ -10315,7 +10048,6 @@ void IGFDecReadData_flt( const int16_t isIndepFrame /* i : if 1: arith dec force reset, if 0: no reset */ ); -#ifndef IVAS_FLOAT_FIXED /*! r: return igfAllZero flag indicating if no envelope is transmitted */ int16_t IGFDecReadLevel_flt( const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* i/o: instance handle of IGF Deccoder */ @@ -10323,7 +10055,6 @@ int16_t IGFDecReadLevel_flt( const int16_t igfGridIdx, /* i : in case of CELP->TCX switching, use 1.25 framelength */ const int16_t isIndepFrame /* i : if 1: arith dec force reset, if 0: no reset */ ); -#endif void IGFDecRestoreTCX10SubFrameData_flt( const IGF_DEC_INSTANCE_HANDLE hIGFDec, /* o : instance handle of IGF Decoder */ @@ -10427,7 +10158,6 @@ void IGFSCFEncoderRestoreContextState( const int16_t igfGridIdx /* i : igf grid index see declaration of IGF_GRID_IDX for details */ ); -#ifndef IVAS_FLOAT_FIXED void IGFSCFDecoderOpen_ivas( IGFSCFDEC_INSTANCE_HANDLE hPublicData, /* i : handle to public data */ H_IGF_INFO hIgfInfo, /* i : IGF info handle */ @@ -10435,15 +10165,11 @@ void IGFSCFDecoderOpen_ivas( const int16_t bwidth, const int16_t element_mode, const int16_t rf_mode ); -#endif -#ifndef IVAS_FLOAT_FIXED void IGFSCFDecoderReset_ivas( IGFSCFDEC_INSTANCE_HANDLE hPublicData /* i : handle to public data or NULL in case there was no instance created */ ); -#endif -#ifndef IVAS_FLOAT_FIXED void IGFSCFDecoderDecode_ivas( IGFSCFDEC_INSTANCE_HANDLE hPublicData, /* i : handle to public data or NULL in case there was no instance created */ Decoder_State *st, /* i/o: pointer to decoder state */ @@ -10452,7 +10178,6 @@ void IGFSCFDecoderDecode_ivas( const int16_t indepFlag /* i : if 1 on input the decoder will be forced to reset, if 0 on input the decoder will be forced to encode without a reset */ ); -#endif /*! r: offset value */ int16_t tbe_celp_exc_offset_flt( @@ -10499,3 +10224,5 @@ void init_tcx_cfg( const int16_t ini_frame, const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ ); + +#endif diff --git a/lib_com/prot_fx2.h b/lib_com/prot_fx.h similarity index 92% rename from lib_com/prot_fx2.h rename to lib_com/prot_fx.h index 5ea27f5d8..19da14d72 100644 --- a/lib_com/prot_fx2.h +++ b/lib_com/prot_fx.h @@ -50,6 +50,16 @@ #define dynamic_calloc( n1, n2 ) calloc( n1, n2 ) #define dynamic_free( n1 ) free( n1 ) +#define mvr2r_Word32( x, y, n ) Copy32( x, y, n ) +#define mvr2r_Word16( x, y, n ) Copy( x, y, n ) + +#include +#include +#include +#include "options.h" +#include "typedef.h" +#include "cnst.h" +#include "stl.h" #include "ivas_cnst.h" #include "stat_enc.h" #include "stat_dec.h" @@ -60,7 +70,9 @@ #define TCX_IMDCT_SCALE 15 #define TCX_IMDCT_HEADROOM 1 +/*================================================================================*/ /* conversion functions: */ +/*================================================================================*/ // Float to Word32 Word32 float_to_fix( float number, Word32 Q ); @@ -123,6 +135,12 @@ Word16 L_get_q_buf( float *ptr_flt, Word16 length ); Word16 L_get_q_buf1( float *ptr_flt, Word16 length ); #endif +/*================================================================================*/ +/* conversion functions: */ +/*================================================================================*/ + +Word16 norm_ul( UWord32 UL_var1 ); + Word32 Mult_32_16( Word32 a, Word16 b ); @@ -8947,6 +8965,14 @@ void delay_signal_fx( const Word16 delay /* i : delay in samples */ ); +void delay_signal_q_adj_fx( + Word32 x[], /* i/o: signal to be delayed */ + const Word16 len, /* i : length of the input signal */ + Word32 mem[], /* i/o: synchronization memory */ + const Word16 delay, /* i : delay in samples */ + const Word16 q_x, + const Word16 q_mem ); + Word32 anint_fixed( Word32 x, /* i: Round to the nearest integer */ Word16 exp /* i: Exponent for round step */ @@ -9229,7 +9255,6 @@ Word16 deindex_lvq_ivas_fx( Word16 no_bits /* i : number of bits for lattice */ ); -#endif void deleteCldfb_ivas_fx( HANDLE_CLDFB_FILTER_BANK *h_cldfb /* i/o: filter bank handle */ @@ -9312,3 +9337,735 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS( Word16 mode, CONTEXT_HM_CONFIG *hm_cfg /* context-based harmonic model configuration */ ); + +Word16 usdequant_fx( /* Qx*/ + const Word16 idx, /* i: quantizer index Q0*/ + const Word16 qlow, /* i: lowest codebook entry (index 0) Qx*/ + const Word16 delta /* i: quantization step Qy*/ +); + +Word16 usquant_fx( /* o: index of the winning codeword */ + const Word16 x, /* i: scalar value to quantize Qx*/ + Word16 *xq, /* o: quantized value Qx*/ + const Word16 qlow, /* i: lowest codebook entry (index 0) Qx*/ + const Word16 delta, /* i: quantization step Qx-1*/ + const Word16 cbsize /* i: codebook size */ +); + +Word32 Dot_product( /* o : Sum */ + const Word16 x[], /* i : 12bits: x vector */ + const Word16 y[], /* i : 12bits: y vector */ + const Word16 lg /* i : vector length */ +); + +Word32 dotp_fx( /* o : dot product of x[] and y[] */ + const Word16 x[], /* i : vector x[] */ + const Word16 y[], /* i : vector y[] */ + const Word16 n, /* i : vector length */ + Word16 *exp /* (o) : exponent of result (0..+30) */ +); + +Word32 sum2_fx_mod( /* o : sum of all squared vector elements Q(2x+1)*/ + const Word16 *vec, /* i : i vector Qx*/ + const Word16 lvec /* i : length of i vector */ +); + +void Copy_Scale_sig( + const Word16 x[], /* i : signal to scale i Qx */ + Word16 y[], /* o : scaled signal output Qx */ + const Word16 lg, /* i : size of x[] Q0 */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ +); + +void Scale_sig32( + Word32 x[], /* i/o: signal to scale Qx */ + const Word16 lg, /* i : size of x[] Q0 */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ +); + +void Copy_Scale_sig_16_32( + const Word16 x[], /* i : signal to scale i Qx */ + Word32 y[], /* o : scaled signal output Qx */ + const Word16 lg, /* i : size of x[] Q0 */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ +); + +void Copy_Scale_sig_16_32_no_sat( + const Word16 x[], /* i : signal to scale input Qx */ + Word32 y[], /* o : scaled signal output Qx */ + const Word16 lg, /* i : size of x[] Q0 */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ +); + +void Copy_Scale_sig_32_16( + const Word32 x[], /* i : signal to scale i Qx */ + Word16 y[], /* o : scaled signal output Qx */ + const Word16 lg, /* i : size of x[] Q0 */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ +); + +void Random_Fill( + Word16 *seed, /* i/o: random seed */ + Word16 n, /* i : number of values */ + Word16 *y, /* o : output values */ + Word16 scaling /* i : scaling of values */ +); + +Word16 mean_fx( /* o : mean of vector */ + const Word16 *vec_fx, /* i : i vector */ + const Word16 lvec_fx /* i : length of i vector */ +); + +void sort_fx( + Word16 *r, /* i/o: Vector to be sorted in place */ + Word16 lo, /* i : Low limit of sorting range */ + Word16 up /* I : High limit of sorting range */ +); + +void sort_32_fx( + Word32 *r, /* i/o: Vector to be sorted in place */ + const Word16 lo, /* i : Low limit of sorting range */ + const Word16 up /* I : High limit of sorting range */ +); + +Word16 minimum_fx( /* o : index of the minimum value in the input vector */ + const Word16 *vec_fx, /* i : input vector */ + const Word16 lvec_fx, /* i : length of input vector */ + Word16 *min_fx /* o : minimum value in the input vector */ +); + +Word16 maximum_fx( /* o : index of the maximum value in the input vector */ + const Word16 *vec_fx, /* i : input vector */ + const Word16 lvec_fx, /* i : length of input vector */ + Word16 *max_fx /* o : maximum value in the input vector */ +); + +Word16 minimum_abs32_fx( /* o : index of the minimum value in the input vector */ + const Word32 *vec_fx, /* i : input vector */ + const Word16 lvec_fx, /* i : length of input vector */ + Word32 *min_fx /* o : minimum value in the input vector */ +); + +Word16 minimum_32_fx( /* o : index of the minimum value in the input vector */ + const Word32 *vec_fx, /* i : input vector */ + const Word16 lvec_fx, /* i : length of input vector */ + Word32 *min_fx /* o : minimum value in the input vector */ +); + +Word16 maximum_32_fx( /* o : index of the maximum value in the input vector */ + const Word32 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word32 *max_val /* o : maximum value in the input vector */ +); + +Word16 maximum_abs_32_fx( /* o : index of the maximum value in the input vector */ + const Word32 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word32 *max_val /* o : maximum value in the input vector */ +); + +/*! r: index of the maximum value in the input vector */ +Word16 maximum_s( + const Word16 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word16 *max /* o : maximum value in the input vector */ +); + +/*! r: index of the minimum value in the input vector */ +Word16 minimum_s( + const Word16 *vec, /* i : Input vector */ + const Word16 lvec, /* i : Vector length */ + Word16 *min_val /* o : minimum value in the input vector */ +); + +Word16 Exp16Array( + const Word16 n, /* (i): Array size */ + const Word16 *sx /* (i): Data array */ +); + +Word16 Exp32Array( + const Word16 n, /* (i): Array size */ + const Word32 *sx /* (i): Data array */ +); + +Word32 sum16_32_fx( /* o : sum of all vector elements Qx*/ + const Word16 *vec, /* i : input vector Qx*/ + const Word16 lvec /* i : length of input vector */ +); + +Word32 sum32_sat( /* o : sum of all vector elements Qx*/ + const Word32 *vec, /* i : input vector Qx*/ + const Word16 lvec /* i : length of input vector */ +); + +Word32 var_fx_32( /* o: variance of vector Qx+16*/ + const Word16 *x, /* i: input vector Qx*/ + const Word16 Qx, + const Word16 len /* i: length of inputvector */ +); + +Word16 var_fx( /* o: variance of vector Qx*/ + const Word16 *x, /* i: input vector Qx*/ + const Word16 Qx, + const Word16 len /* i: length of inputvector */ +); + +Word16 std_fx( /* o: standard deviation */ + const Word16 x[], /* i: input vector */ + const Word16 len /* i: length of the input vector */ +); + +Word32 dot_product_mat_fx( /* o : the dot product x'*A*x */ + const Word16 *x, /* i : vector x Q15 */ + const Word32 *A, /* i : matrix A Q0*/ + const Word16 m /* i : vector & matrix size */ + +); + +void Vr_subt( + const Word16 x1[], /* i : Input vector 1 */ + const Word16 x2[], /* i : Input vector 2 */ + Word16 y[], /* o : Output vector that contains vector 1 - vector 2 */ + Word16 N /* i : Vector lenght */ +); + +Word16 vquant_fx( /* o: index of the winning codevector */ + Word16 x[], /* i: vector to quantize Q13 */ + const Word16 x_mean[], /* i: vector mean to subtract (0 if none)Q13*/ + Word16 xq[], /* o: quantized vector Q13 */ + const Word16 cb[], /* i: codebook Q13 */ + const Word16 dim, /* i: dimension of codebook vectors */ + const Word16 cbsize /* i: codebook size */ +); + +Word16 w_vquant_fx( + Word16 x[], /* i: vector to quantize in Q10 */ + Word16 Qx, + const Word16 weights[], /* i: error weights in Q0 */ + Word16 xq[], /* o: quantized vector in Q15 */ + const Word16 cb[], /* i: codebook in Q15 */ + const Word16 cbsize, /* i: codebook size */ + const Word16 rev_vect /* i: reverse codebook vectors */ +); + +Word16 emaximum_fx( /* o : return index with max energy value in vector Q0 */ + const Word16 Qvec, /* i : Q of input vector Q0 */ + const Word16 *vec, /* i : input vector Qx */ + const Word16 lvec, /* i : length of input vector Q0 */ + Word32 *ener_max /* o : maximum energy value Q0 */ +); + +Word16 emaximum_32fx( /* o : return index with max energy value in vector Q0 */ + const Word16 Qvec, /* i : Q of input vector Q0 */ + const Word32 *vec, /* i : input vector Qx */ + const Word16 lvec, /* i : length of input vector Q0 */ + Word32 *ener_max /* o : maximum energy value Q0 */ +); + +Word32 Mean32( /* o : mean of the elements of the vector */ + const Word32 in[], /* i : input vector */ + const Word16 L /* i : length of input vector */ +); + +Word32 sum32_fx( /* o : sum of all vector elements Qx*/ + const Word32 *vec, /* i : input vector Qx*/ + const Word16 lvec /* i : length of input vector */ +); + +Word16 sum16_fx( /* o : sum of all vector elements Qx*/ + const Word16 *vec, /* i : input vector Qx*/ + const Word16 lvec /* i : length of input vector */ +); + +Word16 own_random2_fx( Word16 seed ); + +void iDiv_and_mod_32( + const Word32 Numer, /* i : 32 bits numerator */ + const Word16 Denom, /* i : 16 bits denominator */ + Word32 *Int_quotient, /* o : integer result of the division (int)(num/den) */ + Word32 *Int_mod, /* o : modulo result of the division num-((int)(num/den)*den)*/ + const Word16 rshift /* i : 0 if no right shift / 1 if the denom is right shifted by 1 */ +); + +void pz_filter_sp_fx( + const Word16 b[], + const Word16 a[], + Word16 x[], + Word16 y[], + Word16 buf[], + Word16 PNR, + Word16 PDR, + Word16 N, + Word16 Qa ); + +Word32 root_a_fx( + Word32 a, + Word16 Q_a, + Word16 *exp_out ); + +Word32 root_a_over_b_fx( + Word32 a, + Word16 Q_a, + Word32 b, + Word16 Q_b, + Word16 *exp_out ); + +void fir_fx( const Word16 x[], /* i : input vector Qx*/ + const Word16 h[], /* i : impulse response of the FIR filter Q12*/ + Word16 y[], /* o : output vector (result of filtering) Qx*/ + Word16 mem[], /* i/o: memory of the input signal (L samples) Qx*/ + const Word16 L, /* i : input vector size */ + const Word16 K, /* i : order of the FIR filter (K+1 coefs.) */ + const Word16 upd /* i : 1 = update the memory, 0 = not */ + , + Word16 shift /* i : difference between Q15 and scaling of h[] */ +); +void v_add_32( + const Word32 x1[], /* i : Input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ + const Word16 N /* i : Vector length */ +); + +void v_shr_32( + Word32 x1[], /* i : Input vector 1 */ + Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ + const Word16 N, /* i : Vector length */ + Word16 shift /*shift value*/ +); + +void v_sub_32( + const Word32 x1[], /* i : Input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 - vector 2 */ + const Word16 N /* i : Vector length */ +); + + +void v_add_16( + const Word16 x1[], /* i : Input vector 1 */ + const Word16 x2[], /* i : Input vector 2 */ + Word16 y[], /* o : Output vector that contains vector 1 + vector 2 */ + const Word16 N /* i : Vector length */ +); + +void v_sub_16( + const Word16 x1[], /* i : Input vector 1 */ + const Word16 x2[], /* i : Input vector 2 */ + Word16 y[], /* o : Output vector that contains vector 1 - vector 2 */ + const Word16 N /* i : Vector length */ +); + + +Word16 squant_fx( /* o: index of the winning codeword */ + const Word16 x, /* i: scalar value to quantize */ + Word16 *xq, /* o: quantized value */ + const Word16 cb[], /* i: codebook */ + const Word16 cbsize /* i: codebook size */ +); + +void pz_filter_dp_fx( + const Word16 b[], + const Word16 a[], + Word16 x[], + Word16 y[], + Word32 buf[], + Word16 PNR, + Word16 PDR, + Word16 N, + Word16 Qa ); + +void Copy_Scale_sig32_16( + const Word32 *src, /* i : signal to scale Qx */ + Word16 *dst, /* o : scaled signal Qx */ + Word16 len, /* i : size of x[] Q0 */ + Word16 exp0 ); /* i : exponent: x = round(x << exp) Qx ?exp */ + +void v_multc_att( + const Word16 x[], /* i : Input vector Qx */ + const Word16 att, /* i : Constant Q15, <= MAX_16 */ + Word16 y[], /* o : Output vector that contains att*x */ + const Word16 N /* i : Vector length */ +); + +void v_multc_att32( + const Word32 x[], /* i : Input vector Qx */ + const Word16 att, /* i : Constant Q15, <= MAX_16 */ + Word32 y[], /* o : Output vector that contains att*x */ + const Word16 N /* i : Vector length */ +); + +void v_multc_att3232( + const Word32 x[], /* i : Input vector Qx */ + const Word32 att, /* i : Constant Q32, <= MAX_32 */ + Word32 y[], /* o : Output vector that contains att*x */ + const Word16 N /* i : Vector length */ +); + +void v_L_mult_1616( + const Word16 x1[], /* i : Input vector 1 */ + const Word16 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 .* vector 2 */ + const Word16 N /* i : Vector length */ +); + +void v_L_mult_3216( + const Word32 x1[], /* i : Input vector 1 */ + const Word16 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 .* vector 2 */ + const Word16 N /* i : Vector length */ +); + +void add_vec_fx( + const Word16 x1[], /* i : Input vector 1 */ + const Word16 Qx1, /* i : SCaling of input 1 */ + const Word16 x2[], /* i : Input vector 2 */ + const Word16 Qx2, /* i : SCaling of input 1 */ + Word16 y[], /* o : Output vector that contains vector 1 + vector 2 */ + const Word16 Qy, /* i : SCaling of output 1 */ + const Word16 N /* i : Vector lenght */ +); + +Word32 Add_flt32_flt32( /* o: Result (Normalized) */ + Word32 a, /* i: 1st Value */ + Word16 exp_a, /* i: Exponent of 1st Value (Q of Value) */ + Word32 b, /* i: 2nd Value */ + Word16 exp_b, /* i: Exponent of 2nd Value (Q of Value) */ + Word16 *exp_out /* o: Exponent of Result */ +); + +Word32 Mul_flt32_Q15( /* o: Result (Normalized) */ + Word32 value, /* i: Pseudo_float Value */ + Word16 *exp_v, /*i/o: Exponent of Value (Q of Value) */ + Word16 frac /* i: Q15 value */ +); + +Word32 Div_flt32_flt32( /* o: Result (Normalized) */ + Word32 a, /* i: 1st Value */ + Word16 exp_a, /* i: Exponent of 1st Value (Q of Value) */ + Word32 b, /* i: 2nd Value */ + Word16 exp_b, /* i: Exponent of 2nd Value (Q of Value) */ + Word16 *exp_out /* o: Exponent of Result */ +); + +Word32 Calc_Energy_Autoscaled( /* o: Result (Energy) */ + const Word16 *signal, /* i: Signal */ + Word16 signal_exp, /* i: Exponent of Signal (Q of Signal) */ + Word16 len, /* i: Frame Length */ + Word16 *energy_exp /* o: Exponent of Energy (Q of Energy) */ +); + +Word16 Find_Max_Norm16( const Word16 *src, Word16 len ); + +Word16 Find_Max_Norm32( const Word32 *src, Word16 len ); + +Word32 Sqrt_Ratio32( /* o: Result in Q31 */ + Word32 L_val1, /* i: Mantisa of Val1 */ + Word16 exp1, /* i: Exp of Val1 (>0: Val was Left Shifted, <0:Right Shifted) */ + Word32 L_val2, /* i: Mantisa of Val2 */ + Word16 exp2, /* i: Exp of Val2 (same as exp1) */ + Word16 *exp /* o: Exp of Result (# of 'L_shl' Req to get to Final Value) */ +); + +Word16 Invert16( /* result in Q'15 + 'exp' */ + Word16 val, + Word16 *exp ); + +Word16 find_rem( Word16 n, Word16 m, Word16 *r ); + +Word32 find_remd( Word32 n, Word32 m, Word32 *r ); + +Word16 rint_new_fx( + Word32 x /*Q16 */ +); + +Word16 erb_diff_search_fx( Word16 *prev_erb, const Word16 *curr_erb, Word16 *dif_erb, Word16 *pow_spec, const Word16 *cb_fx, Word16 cb_size, Word16 cb_dim, Word16 offset ); + +void Acelp_dec_total_exc( + Word16 *exc_fx, /* i/o: adapt. excitation exc */ + Word16 *exc2_fx, /* i/o: adapt. excitation/total exc */ + const Word16 gain_code16, /* i : Gain code Q0 */ + const Word16 gain_pit_fx, /* i ; Pitch gain in Q14 */ + const Word16 i_subfr, /* i ; subfr */ + const Word16 *code_fx, /* i : code in Q9 */ + const Word16 L_subfr /* i : Subframne lenght */ +); + +UWord32 UL_inverse( const UWord32 UL_val, Word16 *exp ); + +UWord32 UL_div( const UWord32 UL_num, const UWord32 UL_den ); + +Word16 ratio( const Word32 numer, const Word32 denom, Word16 *expo ); + +void hp400_12k8_fx( + Word16 signal[], /* i/o: input signal / output is divided by 16 */ + const Word16 lg, /* i : lenght of signal */ + Word16 mem[] /* i/o: filter memory [6] */ +); + +Word16 dot_prod_satcontr( const Word16 *x, const Word16 *y, Word16 qx, Word16 qy, Word16 *qo, Word16 len ); + +void E_UTIL_f_convolve( const Word16 x[], const Word16 h[], Word16 y[], const Word16 size ); + +void floating_point_add( + Word32 *mx, /* io: mantissa of the addend Q31 */ + Word16 *ex, /* io: exponent of the addend Q0 */ + const Word32 my, /* i: mantissa of the adder Q31 */ + const Word16 ey /* i: exponent of the adder Q0 */ +); +/*delay_signal_fx is also present*/ +void delay_signal( + Word16 x[], /* i/o: signal to be delayed */ + const Word16 len, /* i : length of the input signal */ + Word16 mem[], /* i/o: synchronization memory */ + const Word16 delay /* i : delay in samples */ +); + +void delay_signal32( + Word32 x[], /* i/o: signal to be delayed */ + const Word16 len, /* i : length of the input signal */ + Word32 mem[], /* i/o: synchronization memory */ + const Word16 delay /* i : delay in samples */ +); + +Word16 lin_interp_fx( + const Word16 x, /* i : the value to be mapped */ + const Word16 x1, /* i : source range interval: low end */ + const Word16 y1, /* i : source range interval: high end */ + const Word16 x2, /* i : target range interval: low */ + const Word16 y2, /* i : target range interval: high */ + const Word16 flag_sat /* i : flag to indicate whether to apply saturation */ +); + +Word16 ceil_log_2( UWord64 val ); + +Word32 imax_pos_fx( + const Word32 *y /* i : Input vector for peak interpolation */ +); + +void msvq_dec_fx( + const Word16 *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ + const Word16 dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ + const Word16 offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ + const Word16 stages, /* i : Number of stages */ + const Word16 N, /* i : Vector dimension */ + const Word16 maxN, /* i : Codebook dimension */ + const Word16 Idx[], /* i : Indices */ + const Word16 applyIDCT_flag, /* i : applyIDCT flag */ + const Word32 *invTrfMatrix, /* i : synthesis matrix */ + Word32 *uq, /* o : quantized vector */ + Word16 *uq_ind, /* o : quantized vector (fixed point) */ + Word16 exp ); + +void dec_FDCNG_MSVQ_stage1_fx( + Word16 j_full, /* i : index full range */ + Word16 n, /* i : dimension to generate */ + const Word32 *invTrfMatrix, /* i : IDCT matrix for synthesis */ + const DCTTYPE idcttype, /* i : specify which IDCT */ + Word32 *uq, /* o : synthesized stage1 vector */ + Word16 *uq_ind /* o : synthesized stage1 vector in BASOP */ +); + +void dctT2_N_apply_matrix_fx( + const Word32 *input, /* i : input in fdcng or DCT(fdcng) domain */ + Word32 *output, /* o : output in DCT(fdcng) or fdcng ordomain */ + const Word16 dct_dim, /* i : dct processing dim possibly truncated */ + const Word16 fdcngvq_dim, /* i : fdcng domain length */ + const Word32 *matrix, /* i : IDCT matrix */ + const Word16 matrix_row_dim, /* i : */ + const DCTTYPE dcttype /* i : matrix operation type */ +); + +Word32 sum2_f_32_fx( + const Word32 *vec, /* i : input vector */ + const int16_t lvec, /* i : length of input vector */ + Word16 gb ); + +Word32 sum2_32_fx( + const Word32 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word16 *e ); + +void v_mult_fixed( + const Word32 x1[], /* i : Input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 .* vector 2 */ + const Word16 N /* i : Vector length */ +); + +void v_sub_s16_fx( + const Word16 x1[], /* i : Input vector 1 */ + const Word16 x2[], /* i : Input vector 2 */ + Word16 y[], /* o : Output vector that contains vector 1 - vector 2 */ + const Word16 N /* i : Vector length */ +); + +void v_sub32_fx( + const Word32 x1[], /* i : Input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 - vector 2 */ + const Word16 N /* i : Vector length */ +); + +void ivas_swb_tbe_dec_fx( + Decoder_State *st, /* i/o: decoder state structure */ + STEREO_ICBWE_DEC_HANDLE hStereoICBWE, /* i/o: IC-BWE state structure */ + const Word32 *bwe_exc_extended_fx, /* i : bandwidth extended excitation */ + Word16 Q_exc, + const Word16 voice_factors_fx[], /* i : voicing factors */ + const Word32 old_syn_12k8_16k_fx[], /* i : low band synthesis */ + Word16 *White_exc16k_fx, /* o : shaped white excitation for the FB TBE */ + Word32 *synth_fx, /* o : SHB synthesis/final synthesis */ + Word16 *pitch_buf_fx, + Word16 *Q_white_exc ); + +Word16 swb_bwe_dec_fx32( + Decoder_State *st, /* i/o: decoder state structure */ + Word32 output[], /* i : synthesis @internal Fs Q11 */ + Word32 *synth, /* i : ACELP core synthesis/final synthesis Q11 */ + Word32 *hb_synth, /* o : SHB synthesis/final synthesis */ + Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ + Word16 output_frame /* i : frame length */ +); + +ivas_error acelp_core_dec_ivas_fx( + Decoder_State *st, /* i/o: decoder state structure */ + Word16 output[], /* o : synthesis @internal Fs */ + Word16 synth[], /* o : synthesis */ + Word16 save_hb_synth[], /* o : HB synthesis */ + Word32 bwe_exc_extended[], /* i/o: bandwidth extended excitation */ + Word16 *voice_factors, /* o : voicing factors */ + Word16 old_syn_12k8_16k[], /* o : intermediate ACELP synthesis at 12.8kHz or 16kHz to be used by SWB BWE */ + const int16_t sharpFlag, /* i : formant sharpening flag */ + Word16 pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */ + int16_t *unbits, /* o : number of unused bits */ + int16_t *sid_bw, /* o : 0-NB/WB, 1-SWB SID */ + STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ + const Word16 tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */ + const Word16 tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ + const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ + const int16_t last_element_mode, /* i : last element mode */ + const int32_t last_element_brate, /* i : last element bitrate */ + const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ + const int16_t nchan_out, /* i : number of output channels */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ + const int16_t read_sid_info /* i : read SID info flag */ +); + +void destroy_cldfb_decoder_ivas_fx( + Decoder_State *st /* o : Decoder static variables structure */ +); + +void wtda_fx32( + const Word32 *new_audio, /* i : input audio Q11 */ + Word32 *wtda_audio, /* o : windowed audio Q11 */ + Word32 *old_wtda, /* i/o: windowed audio from previous frame Q11 */ + const Word16 left_mode, /* i : window overlap of previous frame (0: full, 2: none, or 3: half) */ + const Word16 right_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */ + const Word16 L /* i : length */ +); + +ivas_error core_switching_pre_dec_ivas_fx( + Decoder_State *st, /* i/o: decoder state structure */ + const Word16 output_frame, /* i : frame length */ + const Word32 last_core_brate_st0, /* i : channel 0 last core bitrate */ + const Word16 nchan_out, /* i : number of output channels */ + const Word16 last_element_mode, /* i : last_element_mode */ + const Word32 last_element_brate, /* i : last element bitrate */ + Word16 Q_old_synthFB, + Word16 *Q_olapBufferSynth, + Word16 *Q_olapBufferSynth2 ); + +void hp20_fix32( + Word32 signal_fx[], + const Word16 lg, + Word32 mem_fx[], + const Word32 Fs ); + +void getTCXMode_ivas_fx( + Decoder_State *st, /* i/o: decoder memory state */ + Decoder_State *st0, /* i : bitstream */ + const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ +); + +void getTCXWindowing_ivas_fx( + const Word16 core, /* i : current frame mode */ + const Word16 last_core, /* i : last frame mode */ + const Word16 element_mode, /* i : element mode */ + TCX_CONFIG_HANDLE hTcxCfg, /* i/o: TCX configuration handle */ + Decoder_State *st0 /* i : bitstream */ +); + +Word16 ari_start_decoding_14bits_prm_ivas_fx( + const Word16 *ptr, + Word16 bp, + Tastat *s ); + +void generate_masking_noise_ivas_fx( + Word32 *timeDomainBuffer, /* i/o: time-domain signal */ + Word16 *exp_out, /* o : time-domain signal exp */ + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + const Word16 length, /* i : frame size */ + const Word16 core, /* i : core */ + const Word16 return_noise, /* i : noise is returned instead of added */ + const Word16 secondary, /* i : flag to indicate secondary noise generation */ + const Word16 element_mode, /* i : element mode */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ + const Word16 nchan_out /* i : number of output channels */ +); + +void SynthesisSTFT_dirac_fx( + Word32 *fftBuffer, /* i : FFT bins */ + Word32 *timeDomainOutput, + Word32 *olapBuffer, + const Word16 *olapWin, + const Word16 samples_out, + HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ +); + +void generate_stereo_masking_noise_fx( + Word16 *syn, /* i/o: time-domain signal */ + Word16 Q_syn, + Decoder_State *st, /* i/o: decoder state structure */ + STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i : TD stereo structure */ + const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ + const int16_t fadeOut, /* i : only fade out of previous state */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ + const int16_t nchan_out /* i : number of output channels */ +); + +void SynthesisSTFT_fx( + Word32 *fftBuffer, /* i : FFT bins */ + Word32 *timeDomainOutput, + Word32 *olapBuffer, + const Word16 *olapWin, + const int16_t tcx_transition, + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + const int16_t element_mode, /* i : element mode */ + const int16_t nchan_out /* i : number of output channels */ +); + +void FdCng_decodeSID_ivas_fx( + Decoder_State *st /* i/o: decoder state structure */ +); + +void cldfb_restore_memory_ivas_fx( + HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ +); + +ivas_error cldfb_save_memory_ivas_fx( + HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ +); + +void ordr_esti( + const Word16 k, /* i : sub-vector index */ + Word16 *Mpos, /* i/o: dominant sub-vector position from ACV */ + Word16 svOrder[], /* i/o: AVQ sub-vector order */ + const Word16 Nsv /* i : total sub-vectors in a sub-frames */ +); + +Word16 sr2fscale( + const Word32 sr_core /* i : internal sampling rate */ +); + +#endif \ No newline at end of file diff --git a/lib_com/prot_fx1.h b/lib_com/prot_fx1.h deleted file mode 100644 index b7867429b..000000000 --- a/lib_com/prot_fx1.h +++ /dev/null @@ -1,636 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -#ifndef PROT_FX1_H -#define PROT_FX1_H - -#include -#include -#include -#include "options.h" -#include "typedef.h" -#include "cnst.h" -#include "stl.h" -#define mvr2r_Word32( x, y, n ) Copy32( x, y, n ) -#define mvr2r_Word16( x, y, n ) Copy( x, y, n ) - -int16_t norm_ul( uint32_t UL_var1 ); -Word16 usdequant_fx( /* Qx*/ - const Word16 idx, /* i: quantizer index Q0*/ - const Word16 qlow, /* i: lowest codebook entry (index 0) Qx*/ - const Word16 delta /* i: quantization step Qy*/ -); - -Word16 usquant_fx( /* o: index of the winning codeword */ - const Word16 x, /* i: scalar value to quantize Qx*/ - Word16 *xq, /* o: quantized value Qx*/ - const Word16 qlow, /* i: lowest codebook entry (index 0) Qx*/ - const Word16 delta, /* i: quantization step Qx-1*/ - const Word16 cbsize /* i: codebook size */ -); - -Word32 Dot_product( /* o : Sum */ - const Word16 x[], /* i : 12bits: x vector */ - const Word16 y[], /* i : 12bits: y vector */ - const Word16 lg /* i : vector length */ -); - -Word32 dotp_fx( /* o : dot product of x[] and y[] */ - const Word16 x[], /* i : vector x[] */ - const Word16 y[], /* i : vector y[] */ - const Word16 n, /* i : vector length */ - Word16 *exp /* (o) : exponent of result (0..+30) */ -); - -Word32 sum2_fx( /* o : sum of all squared vector elements Q(2x+1)*/ - const Word16 *vec, /* i : i vector Qx*/ - const Word16 lvec /* i : length of i vector */ -); - -Word32 sum2_fx_mod( /* o : sum of all squared vector elements Q(2x+1)*/ - const Word16 *vec, /* i : i vector Qx*/ - const Word16 lvec /* i : length of i vector */ -); - -void Copy( - const Word16 x[], /* i : i vector */ - Word16 y[], /* o : output vector */ - const Word16 L /* i : vector length */ -); - -void Copy32( - const Word32 x[], /* i : i vector */ - Word32 y[], /* o : output vector */ - const Word16 L /* i : vector length */ -); - -void set8_fx( - Word8 y[], /* i/o: Vector to set */ - const Word8 a, /* i : Value to set the vector to */ - const Word16 N /* i : Lenght of the vector */ -); - -void set16_fx( - Word16 y[], /* i/o: Vector to set */ - const Word16 a, /* i : Value to set the vector to */ - const Word16 N /* i : Lenght of the vector */ -); - -void set32_fx( - Word32 y[], /* i/o: Vector to set */ - const Word32 a, /* i : Value to set the vector to */ - const Word16 N /* i : Lenght of the vector */ -); - -void Copy_Scale_sig( - const Word16 x[], /* i : signal to scale i Qx */ - Word16 y[], /* o : scaled signal output Qx */ - const Word16 lg, /* i : size of x[] Q0 */ - const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ -); - -void Copy_Scale_sig_16_32( - const Word16 x[], /* i : signal to scale i Qx */ - Word32 y[], /* o : scaled signal output Qx */ - const Word16 lg, /* i : size of x[] Q0 */ - const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ -); - -void Copy_Scale_sig_16_32_no_sat( - const Word16 x[], /* i : signal to scale input Qx */ - Word32 y[], /* o : scaled signal output Qx */ - const Word16 lg, /* i : size of x[] Q0 */ - const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ -); - -void Copy_Scale_sig_32_16( - const Word32 x[], /* i : signal to scale i Qx */ - Word16 y[], /* o : scaled signal output Qx */ - const Word16 lg, /* i : size of x[] Q0 */ - const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ -); - -void Scale_sig32( - Word32 x[], /* i/o: signal to scale Qx */ - const Word16 lg, /* i : size of x[] Q0 */ - const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ -); - -void Random_Fill( - Word16 *seed, /* i/o: random seed */ - Word16 n, /* i : number of values */ - Word16 *y, /* o : output values */ - Word16 scaling /* i : scaling of values */ -); - -void Scale_sig( - Word16 x[], /* i/o: signal to scale Qx */ - const Word16 lg, /* i : size of x[] Q0 */ - const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ -); - -Word16 mean_fx( /* o : mean of vector */ - const Word16 *vec_fx, /* i : i vector */ - const Word16 lvec_fx /* i : length of i vector */ -); - -void Vr_add( - const Word16 *in1, /* i : Input vector 1 */ - const Word16 *in2, /* i : Input vector 2 */ - Word16 *out, /* o : Output vector that contains vector 1 + vector 2 */ - Word16 Len /* i : Vector lenght */ -); -void sort_fx( - Word16 *r, /* i/o: Vector to be sorted in place */ - Word16 lo, /* i : Low limit of sorting range */ - Word16 up /* I : High limit of sorting range */ -); -void sort_32_fx( - Word32 *r, /* i/o: Vector to be sorted in place */ - const Word16 lo, /* i : Low limit of sorting range */ - const Word16 up /* I : High limit of sorting range */ -); -Word16 minimum_fx( /* o : index of the minimum value in the input vector */ - const Word16 *vec_fx, /* i : input vector */ - const Word16 lvec_fx, /* i : length of input vector */ - Word16 *min_fx /* o : minimum value in the input vector */ -); -Word16 maximum_fx( /* o : index of the maximum value in the input vector */ - const Word16 *vec_fx, /* i : input vector */ - const Word16 lvec_fx, /* i : length of input vector */ - Word16 *max_fx /* o : maximum value in the input vector */ -); -Word16 minimum_abs32_fx( /* o : index of the minimum value in the input vector */ - const Word32 *vec_fx, /* i : input vector */ - const Word16 lvec_fx, /* i : length of input vector */ - Word32 *min_fx /* o : minimum value in the input vector */ -); -Word16 minimum_32_fx( /* o : index of the minimum value in the input vector */ - const Word32 *vec_fx, /* i : input vector */ - const Word16 lvec_fx, /* i : length of input vector */ - Word32 *min_fx /* o : minimum value in the input vector */ -); -Word16 maximum_32_fx( /* o : index of the maximum value in the input vector */ - const Word32 *vec, /* i : input vector */ - const Word16 lvec, /* i : length of input vector */ - Word32 *max_val /* o : maximum value in the input vector */ -); -Word16 maximum_abs_32_fx( /* o : index of the maximum value in the input vector */ - const Word32 *vec, /* i : input vector */ - const Word16 lvec, /* i : length of input vector */ - Word32 *max_val /* o : maximum value in the input vector */ -); -#ifdef IVAS_FLOAT_FIXED -/*! r: index of the maximum value in the input vector */ -Word16 maximum_s( - const Word16 *vec, /* i : input vector */ - const Word16 lvec, /* i : length of input vector */ - Word16 *max /* o : maximum value in the input vector */ -); - -/*! r: index of the minimum value in the input vector */ -Word16 minimum_s( - const Word16 *vec, /* i : Input vector */ - const Word16 lvec, /* i : Vector length */ - Word16 *min_val /* o : minimum value in the input vector */ -); -#endif -Word16 Exp16Array( - const Word16 n, /* (i): Array size */ - const Word16 *sx /* (i): Data array */ -); -Word16 Exp32Array( - const Word16 n, /* (i): Array size */ - const Word32 *sx /* (i): Data array */ -); -Word32 sum16_32_fx( /* o : sum of all vector elements Qx*/ - const Word16 *vec, /* i : input vector Qx*/ - const Word16 lvec /* i : length of input vector */ -); -Word32 sum32_sat( /* o : sum of all vector elements Qx*/ - const Word32 *vec, /* i : input vector Qx*/ - const Word16 lvec /* i : length of input vector */ -); -Word32 var_fx_32( /* o: variance of vector Qx+16*/ - const Word16 *x, /* i: input vector Qx*/ - const Word16 Qx, - const Word16 len /* i: length of inputvector */ -); -Word16 var_fx( /* o: variance of vector Qx*/ - const Word16 *x, /* i: input vector Qx*/ - const Word16 Qx, - const Word16 len /* i: length of inputvector */ -); -Word16 std_fx( /* o: standard deviation */ - const Word16 x[], /* i: input vector */ - const Word16 len /* i: length of the input vector */ -); -Word32 dot_product_mat_fx( /* o : the dot product x'*A*x */ - const Word16 *x, /* i : vector x Q15 */ - const Word32 *A, /* i : matrix A Q0*/ - const Word16 m /* i : vector & matrix size */ - -); -void Vr_subt( - const Word16 x1[], /* i : Input vector 1 */ - const Word16 x2[], /* i : Input vector 2 */ - Word16 y[], /* o : Output vector that contains vector 1 - vector 2 */ - Word16 N /* i : Vector lenght */ -); -Word16 vquant_fx( /* o: index of the winning codevector */ - Word16 x[], /* i: vector to quantize Q13 */ - const Word16 x_mean[], /* i: vector mean to subtract (0 if none)Q13*/ - Word16 xq[], /* o: quantized vector Q13 */ - const Word16 cb[], /* i: codebook Q13 */ - const Word16 dim, /* i: dimension of codebook vectors */ - const Word16 cbsize /* i: codebook size */ -); -Word16 w_vquant_fx( - Word16 x[], /* i: vector to quantize in Q10 */ - Word16 Qx, - const Word16 weights[], /* i: error weights in Q0 */ - Word16 xq[], /* o: quantized vector in Q15 */ - const Word16 cb[], /* i: codebook in Q15 */ - const Word16 cbsize, /* i: codebook size */ - const Word16 rev_vect /* i: reverse codebook vectors */ -); -Word16 emaximum_fx( /* o : return index with max energy value in vector Q0 */ - const Word16 Qvec, /* i : Q of input vector Q0 */ - const Word16 *vec, /* i : input vector Qx */ - const Word16 lvec, /* i : length of input vector Q0 */ - Word32 *ener_max /* o : maximum energy value Q0 */ -); -Word16 emaximum_32fx( /* o : return index with max energy value in vector Q0 */ - const Word16 Qvec, /* i : Q of input vector Q0 */ - const Word32 *vec, /* i : input vector Qx */ - const Word16 lvec, /* i : length of input vector Q0 */ - Word32 *ener_max /* o : maximum energy value Q0 */ -); -Word32 Mean32( /* o : mean of the elements of the vector */ - const Word32 in[], /* i : input vector */ - const Word16 L /* i : length of input vector */ -); -Word32 sum32_fx( /* o : sum of all vector elements Qx*/ - const Word32 *vec, /* i : input vector Qx*/ - const Word16 lvec /* i : length of input vector */ -); -Word16 sum16_fx( /* o : sum of all vector elements Qx*/ - const Word16 *vec, /* i : input vector Qx*/ - const Word16 lvec /* i : length of input vector */ -); -Word16 Random( /* o : output random value */ - Word16 *seed /* i/o: random seed */ -); -Word16 own_random2_fx( Word16 seed ); -void iDiv_and_mod_32( - const Word32 Numer, /* i : 32 bits numerator */ - const Word16 Denom, /* i : 16 bits denominator */ - Word32 *Int_quotient, /* o : integer result of the division (int)(num/den) */ - Word32 *Int_mod, /* o : modulo result of the division num-((int)(num/den)*den)*/ - const Word16 rshift /* i : 0 if no right shift / 1 if the denom is right shifted by 1 */ -); -void pz_filter_sp_fx( - const Word16 b[], - const Word16 a[], - Word16 x[], - Word16 y[], - Word16 buf[], - Word16 PNR, - Word16 PDR, - Word16 N, - Word16 Qa ); -Word32 root_a_fx( - Word32 a, - Word16 Q_a, - Word16 *exp_out ); -Word32 root_a_over_b_fx( - Word32 a, - Word16 Q_a, - Word32 b, - Word16 Q_b, - Word16 *exp_out ); -void fir_fx( const Word16 x[], /* i : input vector Qx*/ - const Word16 h[], /* i : impulse response of the FIR filter Q12*/ - Word16 y[], /* o : output vector (result of filtering) Qx*/ - Word16 mem[], /* i/o: memory of the input signal (L samples) Qx*/ - const Word16 L, /* i : input vector size */ - const Word16 K, /* i : order of the FIR filter (K+1 coefs.) */ - const Word16 upd /* i : 1 = update the memory, 0 = not */ - , - Word16 shift /* i : difference between Q15 and scaling of h[] */ -); - -void fir_fx( const Word16 x[], /* i : input vector Qx*/ - const Word16 h[], /* i : impulse response of the FIR filter Q12*/ - Word16 y[], /* o : output vector (result of filtering) Qx*/ - Word16 mem[], /* i/o: memory of the input signal (L samples) Qx*/ - const Word16 L, /* i : input vector size */ - const Word16 K, /* i : order of the FIR filter (K+1 coefs.) */ - const Word16 upd /* i : 1 = update the memory, 0 = not */ - , - Word16 shift /* i : difference between Q15 and scaling of h[] */ -); - -void v_add_32( - const Word32 x1[], /* i : Input vector 1 */ - const Word32 x2[], /* i : Input vector 2 */ - Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ - const Word16 N /* i : Vector length */ -); - -void v_shr_32( - Word32 x1[], /* i : Input vector 1 */ - Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ - const Word16 N, /* i : Vector length */ - Word16 shift /*shift value*/ -); - -void v_sub_32( - const Word32 x1[], /* i : Input vector 1 */ - const Word32 x2[], /* i : Input vector 2 */ - Word32 y[], /* o : Output vector that contains vector 1 - vector 2 */ - const Word16 N /* i : Vector length */ -); - - -void v_add_16( - const Word16 x1[], /* i : Input vector 1 */ - const Word16 x2[], /* i : Input vector 2 */ - Word16 y[], /* o : Output vector that contains vector 1 + vector 2 */ - const Word16 N /* i : Vector length */ -); - -void v_sub_16( - const Word16 x1[], /* i : Input vector 1 */ - const Word16 x2[], /* i : Input vector 2 */ - Word16 y[], /* o : Output vector that contains vector 1 - vector 2 */ - const Word16 N /* i : Vector length */ -); - - -Word16 squant_fx( /* o: index of the winning codeword */ - const Word16 x, /* i: scalar value to quantize */ - Word16 *xq, /* o: quantized value */ - const Word16 cb[], /* i: codebook */ - const Word16 cbsize /* i: codebook size */ -); -void pz_filter_dp_fx( - const Word16 b[], - const Word16 a[], - Word16 x[], - Word16 y[], - Word32 buf[], - Word16 PNR, - Word16 PDR, - Word16 N, - Word16 Qa ); -void Copy_Scale_sig32_16( - const Word32 *src, /* i : signal to scale Qx */ - Word16 *dst, /* o : scaled signal Qx */ - Word16 len, /* i : size of x[] Q0 */ - Word16 exp0 ); /* i : exponent: x = round(x << exp) Qx ?exp */ - -void v_multc_att( - const Word16 x[], /* i : Input vector Qx */ - const Word16 att, /* i : Constant Q15, <= MAX_16 */ - Word16 y[], /* o : Output vector that contains att*x */ - const Word16 N /* i : Vector length */ -); -void v_multc_att32( - const Word32 x[], /* i : Input vector Qx */ - const Word16 att, /* i : Constant Q15, <= MAX_16 */ - Word32 y[], /* o : Output vector that contains att*x */ - const Word16 N /* i : Vector length */ -); -void v_multc_att3232( - const Word32 x[], /* i : Input vector Qx */ - const Word32 att, /* i : Constant Q32, <= MAX_32 */ - Word32 y[], /* o : Output vector that contains att*x */ - const Word16 N /* i : Vector length */ -); -void v_L_mult_1616( - const Word16 x1[], /* i : Input vector 1 */ - const Word16 x2[], /* i : Input vector 2 */ - Word32 y[], /* o : Output vector that contains vector 1 .* vector 2 */ - const Word16 N /* i : Vector length */ -); -void v_L_mult_3216( - const Word32 x1[], /* i : Input vector 1 */ - const Word16 x2[], /* i : Input vector 2 */ - Word32 y[], /* o : Output vector that contains vector 1 .* vector 2 */ - const Word16 N /* i : Vector length */ -); -void add_vec_fx( - const Word16 x1[], /* i : Input vector 1 */ - const Word16 Qx1, /* i : SCaling of input 1 */ - const Word16 x2[], /* i : Input vector 2 */ - const Word16 Qx2, /* i : SCaling of input 1 */ - Word16 y[], /* o : Output vector that contains vector 1 + vector 2 */ - const Word16 Qy, /* i : SCaling of output 1 */ - const Word16 N /* i : Vector lenght */ -); -Word32 Add_flt32_flt32( /* o: Result (Normalized) */ - Word32 a, /* i: 1st Value */ - Word16 exp_a, /* i: Exponent of 1st Value (Q of Value) */ - Word32 b, /* i: 2nd Value */ - Word16 exp_b, /* i: Exponent of 2nd Value (Q of Value) */ - Word16 *exp_out /* o: Exponent of Result */ -); -Word32 Mul_flt32_Q15( /* o: Result (Normalized) */ - Word32 value, /* i: Pseudo_float Value */ - Word16 *exp_v, /*i/o: Exponent of Value (Q of Value) */ - Word16 frac /* i: Q15 value */ -); -Word32 Div_flt32_flt32( /* o: Result (Normalized) */ - Word32 a, /* i: 1st Value */ - Word16 exp_a, /* i: Exponent of 1st Value (Q of Value) */ - Word32 b, /* i: 2nd Value */ - Word16 exp_b, /* i: Exponent of 2nd Value (Q of Value) */ - Word16 *exp_out /* o: Exponent of Result */ -); -Word32 Calc_Energy_Autoscaled( /* o: Result (Energy) */ - const Word16 *signal, /* i: Signal */ - Word16 signal_exp, /* i: Exponent of Signal (Q of Signal) */ - Word16 len, /* i: Frame Length */ - Word16 *energy_exp /* o: Exponent of Energy (Q of Energy) */ -); -Word16 Find_Max_Norm16( const Word16 *src, Word16 len ); - -Word16 Find_Max_Norm32( const Word32 *src, Word16 len ); - -Word32 Sqrt_Ratio32( /* o: Result in Q31 */ - Word32 L_val1, /* i: Mantisa of Val1 */ - Word16 exp1, /* i: Exp of Val1 (>0: Val was Left Shifted, <0:Right Shifted) */ - Word32 L_val2, /* i: Mantisa of Val2 */ - Word16 exp2, /* i: Exp of Val2 (same as exp1) */ - Word16 *exp /* o: Exp of Result (# of 'L_shl' Req to get to Final Value) */ -); - -Word16 Invert16( /* result in Q'15 + 'exp' */ - Word16 val, - Word16 *exp ); - -Word16 find_rem( Word16 n, Word16 m, Word16 *r ); -Word32 find_remd( Word32 n, Word32 m, Word32 *r ); - -Word16 rint_new_fx( - Word32 x /*Q16 */ -); - -Word16 erb_diff_search_fx( Word16 *prev_erb, const Word16 *curr_erb, Word16 *dif_erb, Word16 *pow_spec, const Word16 *cb_fx, Word16 cb_size, Word16 cb_dim, Word16 offset ); - -void Acelp_dec_total_exc( - Word16 *exc_fx, /* i/o: adapt. excitation exc */ - Word16 *exc2_fx, /* i/o: adapt. excitation/total exc */ - const Word16 gain_code16, /* i : Gain code Q0 */ - const Word16 gain_pit_fx, /* i ; Pitch gain in Q14 */ - const Word16 i_subfr, /* i ; subfr */ - const Word16 *code_fx, /* i : code in Q9 */ - const Word16 L_subfr /* i : Subframne lenght */ -); - -UWord32 UL_inverse( const UWord32 UL_val, Word16 *exp ); - -UWord32 UL_div( const UWord32 UL_num, const UWord32 UL_den ); - -Word16 ratio( const Word32 numer, const Word32 denom, Word16 *expo ); - -void hp400_12k8_fx( - Word16 signal[], /* i/o: input signal / output is divided by 16 */ - const Word16 lg, /* i : lenght of signal */ - Word16 mem[] /* i/o: filter memory [6] */ -); - -#if 0 -void hp400_12k8_ivas_fx( - Word16 signal[], /* i/o: input signal / output is divided by 16 */ - const Word16 lg, /* i : lenght of signal */ - Word16 mem[] /* i/o: filter memory [6] */ -); -#endif -Word16 dot_prod_satcontr( const Word16 *x, const Word16 *y, Word16 qx, Word16 qy, Word16 *qo, Word16 len ); - -void E_UTIL_f_convolve( const Word16 x[], const Word16 h[], Word16 y[], const Word16 size ); - -void floating_point_add( - Word32 *mx, /* io: mantissa of the addend Q31 */ - Word16 *ex, /* io: exponent of the addend Q0 */ - const Word32 my, /* i: mantissa of the adder Q31 */ - const Word16 ey /* i: exponent of the adder Q0 */ -); - - -#ifdef IVAS_FLOAT_FIXED -void fft_fx( - Word32 *re, /* i/o: real part */ - Word32 *im, /* i/o: imag part */ - const Word16 length, /* i : length of fft */ - const Word16 s /* i : sign */ -); - -#endif -void delay_signal( - Word16 x[], /* i/o: signal to be delayed */ - const Word16 len, /* i : length of the input signal */ - Word16 mem[], /* i/o: synchronization memory */ - const Word16 delay /* i : delay in samples */ -); - -void delay_signal32( - Word32 x[], /* i/o: signal to be delayed */ - const Word16 len, /* i : length of the input signal */ - Word32 mem[], /* i/o: synchronization memory */ - const Word16 delay /* i : delay in samples */ -); - -Word16 lin_interp_fx( - const Word16 x, /* i : the value to be mapped */ - const Word16 x1, /* i : source range interval: low end */ - const Word16 y1, /* i : source range interval: high end */ - const Word16 x2, /* i : target range interval: low */ - const Word16 y2, /* i : target range interval: high */ - const Word16 flag_sat /* i : flag to indicate whether to apply saturation */ -); - -Word16 ceil_log_2( UWord64 val ); - -Word32 imax_pos_fx( - const Word32 *y /* i : Input vector for peak interpolation */ -); - -#ifdef IVAS_FLOAT_FIXED -void re8_k2y_fx( - const Word16 *k, /* i : Voronoi index k[0..7] */ - const Word16 m, /* i : Voronoi modulo (m = 2^r = 1<=2) */ - Word16 *y /* o : 8-dimensional point y[0..7] in RE8 */ -); - -void re8_PPV_fx( - const Word32 x[], /* i : point in R^8Q15 */ - Word16 y[] /* o : point in RE8 (8-dimensional integer vector) */ -); - -void msvq_dec_fx( - const Word16 *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ - const Word16 dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ - const Word16 offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ - const Word16 stages, /* i : Number of stages */ - const Word16 N, /* i : Vector dimension */ - const Word16 maxN, /* i : Codebook dimension */ - const Word16 Idx[], /* i : Indices */ - const Word16 applyIDCT_flag, /* i : applyIDCT flag */ - const Word32 *invTrfMatrix, /* i : synthesis matrix */ - Word32 *uq, /* o : quantized vector */ - Word16 *uq_ind, /* o : quantized vector (fixed point) */ - Word16 exp ); - -void dec_FDCNG_MSVQ_stage1_fx( - Word16 j_full, /* i : index full range */ - Word16 n, /* i : dimension to generate */ - const Word32 *invTrfMatrix, /* i : IDCT matrix for synthesis */ - const DCTTYPE idcttype, /* i : specify which IDCT */ - Word32 *uq, /* o : synthesized stage1 vector */ - Word16 *uq_ind /* o : synthesized stage1 vector in BASOP */ -); - -void dctT2_N_apply_matrix_fx( - const Word32 *input, /* i : input in fdcng or DCT(fdcng) domain */ - Word32 *output, /* o : output in DCT(fdcng) or fdcng ordomain */ - const Word16 dct_dim, /* i : dct processing dim possibly truncated */ - const Word16 fdcngvq_dim, /* i : fdcng domain length */ - const Word32 *matrix, /* i : IDCT matrix */ - const Word16 matrix_row_dim, /* i : */ - const DCTTYPE dcttype /* i : matrix operation type */ -); - -#endif -#endif diff --git a/lib_com/pvq_com_fx.c b/lib_com/pvq_com_fx.c index 2a7e9a8ec..97690114f 100644 --- a/lib_com/pvq_com_fx.c +++ b/lib_com/pvq_com_fx.c @@ -3,8 +3,7 @@ ====================================================================================*/ #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ diff --git a/lib_com/range_com_fx.c b/lib_com/range_com_fx.c index 0b46d7335..22a7fb8ea 100644 --- a/lib_com/range_com_fx.c +++ b/lib_com/range_com_fx.c @@ -5,8 +5,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_com/re8_ppv_fx.c b/lib_com/re8_ppv_fx.c index a786f9936..32c69f6e5 100644 --- a/lib_com/re8_ppv_fx.c +++ b/lib_com/re8_ppv_fx.c @@ -4,8 +4,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "stl.h" /*-------------------------------------------------------------------* diff --git a/lib_com/re8_util_fx.c b/lib_com/re8_util_fx.c index db58c3fae..aa6075245 100644 --- a/lib_com/re8_util_fx.c +++ b/lib_com/re8_util_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_com/recovernorm_fx.c b/lib_com/recovernorm_fx.c index e5b72fc51..d6659b77a 100644 --- a/lib_com/recovernorm_fx.c +++ b/lib_com/recovernorm_fx.c @@ -3,8 +3,7 @@ ====================================================================================*/ #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ diff --git a/lib_com/reordvct_fx.c b/lib_com/reordvct_fx.c index a26480626..45c2ffbba 100644 --- a/lib_com/reordvct_fx.c +++ b/lib_com/reordvct_fx.c @@ -32,7 +32,7 @@ #include #include "options.h" /* Compilation switches */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*--------------------------------------------------------------------------* diff --git a/lib_com/residu_fx.c b/lib_com/residu_fx.c index 5849fb815..e06ef40ea 100644 --- a/lib_com/residu_fx.c +++ b/lib_com/residu_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*--------------------------------------------------------------------* * Residu3_lc_fx: diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c index 58be1cf3f..3bf612bca 100644 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -41,7 +41,7 @@ #include "prot.h" #include "basop_util.h" #include "wmc_auto.h" -#include "prot_fx2.h" +#include "prot_fx.h" /* clang-format off */ diff --git a/lib_com/scale_mem_fx.c b/lib_com/scale_mem_fx.c index e6ca64931..b3eda3954 100644 --- a/lib_com/scale_mem_fx.c +++ b/lib_com/scale_mem_fx.c @@ -35,7 +35,7 @@ ====================================================================================*/ #include "options.h" /* Common prototypes */ -#include "prot_fx2.h" /* Common prototypes */ +#include "prot_fx.h" /* Common prototypes */ #include "ivas_cnst.h" #include "stl.h" diff --git a/lib_com/stab_est_fx.c b/lib_com/stab_est_fx.c index 52998bbae..2d6a6b141 100644 --- a/lib_com/stab_est_fx.c +++ b/lib_com/stab_est_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------* * Local constants diff --git a/lib_com/stat_noise_uv_mod_fx.c b/lib_com/stat_noise_uv_mod_fx.c index 4d3badffc..957bae8a3 100644 --- a/lib_com/stat_noise_uv_mod_fx.c +++ b/lib_com/stat_noise_uv_mod_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "cnst.h" /* Function prototypes */ /*---------------------------------------------------------------------* @@ -304,7 +303,7 @@ void stat_noise_uv_mod_fx( Exc2_local[i] = extract_h( L_tmp ); /*Q_local */ move16(); } - *Q_stat_noise = Q_local; /* update for next call, routine can only be called once every frame */ + *Q_stat_noise = Q_local; /* update for next call, routine can only be called once every frame */ move16(); Qdiff = sub( Q_exc, Q_local ); /* local excitation and incoming excitation */ Scale_sig( Exc2_local, L_FRAME, Qdiff ); diff --git a/lib_com/swb_bwe_com_fx.c b/lib_com/swb_bwe_com_fx.c index ff4f55f9f..0ecd34e83 100644 --- a/lib_com/swb_bwe_com_fx.c +++ b/lib_com/swb_bwe_com_fx.c @@ -32,8 +32,7 @@ #include #include "options.h" -#include "prot_fx2.h" -#include "prot_fx1.h" +#include "prot_fx.h" #include "basop_util.h" #include "rom_com.h" diff --git a/lib_com/swb_bwe_com_hr_fx.c b/lib_com/swb_bwe_com_hr_fx.c index da8997a26..cac0ed123 100644 --- a/lib_com/swb_bwe_com_hr_fx.c +++ b/lib_com/swb_bwe_com_hr_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-------------------------------------------------------------------* * swb_hr_nonzero_subband_noise_fill() diff --git a/lib_com/swb_bwe_com_lr_fx.c b/lib_com/swb_bwe_com_lr_fx.c index 386db3433..adc98d36a 100644 --- a/lib_com/swb_bwe_com_lr_fx.c +++ b/lib_com/swb_bwe_com_lr_fx.c @@ -33,7 +33,7 @@ #include #include "options.h" #include "cnst.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #include diff --git a/lib_com/swb_tbe_com.c b/lib_com/swb_tbe_com.c index 5229543ab..7f9ce0c18 100644 --- a/lib_com/swb_tbe_com.c +++ b/lib_com/swb_tbe_com.c @@ -39,8 +39,7 @@ #include #include "cnst.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #include "wmc_auto.h" #include "ivas_prot.h" @@ -1218,7 +1217,7 @@ void GenSHBSynth_fx_32( Word32 *shb_syn_speech_32k, /* o : output highband component Qx*/ Word32 Hilbert_Mem[], /* i/o: memory Qx*/ Word32 state_lsyn_filt_shb_local[], /* i/o: memory Qx*/ - const Word16 L_frame, /* i : ACELP frame length */ + const Word16 L_frame, /* i : ACELP frame length */ Word16 *syn_dm_phase ) { Word32 speech_buf_32k[L_FRAME32k]; @@ -1237,7 +1236,7 @@ void GenSHBSynth_fx_32( // shb_syn_speech_32k[i] = ( ( i % 2 ) == 0 ) ? ( -speech_buf_32k[i] ) : ( speech_buf_32k[i] ); IF( i % 2 == 0 ) { - shb_syn_speech_32k[i] = L_negate( speech_buf_32k[i] ); + shb_syn_speech_32k[i] = L_negate(speech_buf_32k[i]); } ELSE { @@ -1365,7 +1364,7 @@ void ScaleShapedSHB( } #ifdef IVAS_FLOAT_FIXED void ScaleShapedSHB_32( - const Word16 length, /* i : SHB overlap length */ + const Word16 length, /* i : SHB overlap length */ Word32 *synSHB_fx, /* i/o: synthesized shb signal Q_inp/Q_new */ Word32 *overlap_fx, /* i/o: buffer for overlap-add Q_inp/Q_new */ const Word16 *subgain_fx, /* i : subframe gain Q15 */ @@ -1407,7 +1406,7 @@ void ScaleShapedSHB_32( FOR( k = 0; k < shr( length, 1 ); k++ ) { sum_gain_fx = mult_r( subwin_fx[2 * k + 2], subgain_fx[0] ); - mod_syn_fx[add( skip[0], k )] = Mpy_32_16_1( synSHB_fx[add( skip[0], k )], sum_gain_fx ); + mod_syn_fx[add(skip[0] , k)] = Mpy_32_16_1( synSHB_fx[add(skip[0] , k)], sum_gain_fx ); move32(); // Qx mod_syn_fx[add( add( skip[0], k ), shr( length, 1 ) )] = Mpy_32_16_1( synSHB_fx[add( add( skip[0], k ), shr( length, 1 ) )], subgain_fx[0] ); // Qx move32(); @@ -1418,14 +1417,14 @@ void ScaleShapedSHB_32( { L_tmp = L_mult0( subwin_fx[k + 1], subgain_fx[i] ); sum_gain_fx = round_fx( L_mac0( L_tmp, subwin_fx[length - k - 1], subgain_fx[i - 1] ) ); - mod_syn_fx[add( skip[i], k )] = L_shl( Mpy_32_16_1( synSHB_fx[add( skip[i], k )], sum_gain_fx ), 1 ); // Qx + mod_syn_fx[add(skip[i] , k)] = L_shl( Mpy_32_16_1( synSHB_fx[add(skip[i] , k)], sum_gain_fx ), 1 ); // Qx move32(); } } FOR( k = 0; k < shr( length, 1 ); k++ ) { sum_gain_fx = mult_r( subwin_fx[sub( sub( length, shl( k, 1 ) ), 2 )], subgain_fx[i - 1] ); - mod_syn_fx[add( skip[i], k )] = Mpy_32_16_1( synSHB_fx[add( skip[i], k )], sum_gain_fx ); // Qx + mod_syn_fx[add(skip[i] , k)] = Mpy_32_16_1( synSHB_fx[add(skip[i] , k)], sum_gain_fx ); // Qx move32(); } } @@ -1440,21 +1439,21 @@ void ScaleShapedSHB_32( { mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[k + 1], subgain_fx[0] ) ); // Qx move32(); - j = add( j, 1 ); + j = add(j,1); } FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ ) { FOR( k = 0; k < join_length - length; k++ ) { - mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[i_mult( i, num_join )] ); // Qx + mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[i_mult(i , num_join)] ); // Qx move32(); j = add( j, 1 ); } FOR( k = 0; k < length; k++ ) { - L_tmp = L_mult0( subwin_fx[length - k - 1], subgain_fx[i_mult( i, num_join )] ); - mod_syn_fx[j] = L_shl( Mpy_32_16_1( synSHB_fx[j], round_fx( L_mac0( L_tmp, subwin_fx[k + 1], subgain_fx[i_mult( ( i + 1 ), num_join )] ) ) ), 1 ); // Qx + L_tmp = L_mult0( subwin_fx[length - k - 1], subgain_fx[i_mult(i , num_join)] ); + mod_syn_fx[j] = L_shl( Mpy_32_16_1( synSHB_fx[j], round_fx( L_mac0( L_tmp, subwin_fx[k + 1], subgain_fx[i_mult(( i + 1 ) , num_join)] ) ) ), 1 ); // Qx move32(); j = add( j, 1 ); } @@ -1467,14 +1466,14 @@ void ScaleShapedSHB_32( } FOR( k = 0; k < length; k++ ) { - mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[sub( sub( length, k ), 1 )], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ) ); // Qx + mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[sub(sub(length , k) , 1)], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ) ); // Qx move32(); j = add( j, 1 ); } } Word16 norm_shift = norm_l( frame_gain_fx ); - if ( frame_gain_fx == 0 ) + if( frame_gain_fx == 0 ) { norm_shift = 31; move16(); @@ -1487,7 +1486,7 @@ void ScaleShapedSHB_32( move16(); FOR( i = 0; i < L_SHB_LAHEAD; i++ ) { - overlap_fx[i] = L_shl( overlap_fx[i], sub( *Q_new, *Q_inp ) ); + overlap_fx[i] = L_shl( overlap_fx[i],sub( *Q_new , *Q_inp) ); move32(); } @@ -1499,6 +1498,7 @@ void ScaleShapedSHB_32( move32(); move32(); move32(); + } FOR( ; i < l_frame; i++ ) @@ -1509,7 +1509,7 @@ void ScaleShapedSHB_32( FOR( ; i < l_frame + l_shb_lahead; i++ ) { - synSHB_fx[i] = L_shl( synSHB_fx[i], sub( *Q_new, *Q_inp ) ); + synSHB_fx[i] = L_shl( synSHB_fx[i],sub( *Q_new , *Q_inp) ); overlap_fx[i - l_frame] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[l_frame + l_shb_lahead - 1 - i] ) ); // Q_new move32(); move32(); diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 42cab91fb..93ffd08a0 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -8,8 +8,7 @@ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" @@ -2998,7 +2997,7 @@ void GenShapedSHBExcitation_ivas_fx( varEnvShape = 32604; move16(); csfilt_num2[0] = 32768 - varEnvShape; - // csfilt_num2[0] = sub( 32767, varEnvShape ); + //csfilt_num2[0] = sub( 32767, varEnvShape ); move16(); neg_csfilt_den2[1] = varEnvShape; move16(); @@ -6373,8 +6372,8 @@ void prep_tbe_exc_ivas_fx( Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12 */ #ifdef BASOP_NOGLOB - Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, 4 ) /*Q_exc+16-13*/, &Overflow ); /*Q_exc+16 */ + Ltemp1 = L_shl_o( Ltemp1,add( Q_exc , 6 )/*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ + Ltemp2 = L_shl_o( Ltemp2,add( Q_exc , 4 )/*Q_exc+16-13*/, &Overflow ); /*Q_exc+16 */ tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc */ #else /* BASOP_NOGLOB */ @@ -6393,8 +6392,8 @@ void prep_tbe_exc_ivas_fx( /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ #ifdef BASOP_NOGLOB - Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */ + Ltemp1 = L_shl_o( Ltemp1, add(Q_exc , 6) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ + tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */ #else Ltemp1 = L_shl( Ltemp1, Q_exc + 6 /*Q_exc+16-19*/ ); /*Q_exc+16 */ tmp_code_preInt_fx[i] = round_fx( Ltemp1 ); /* Q_exc */ @@ -6404,12 +6403,12 @@ void prep_tbe_exc_ivas_fx( } interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */ - FOR( i = 0; i < shl( L_subfr, 1 ); i++ ) + FOR( i = 0; i < shl(L_subfr , 1); i++ ) { - L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + shl( i_subfr_fx, 1 )] ); /*Q14+Q_exc+1 */ + L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + shl(i_subfr_fx , 1)] ); /*Q14+Q_exc+1 */ #ifdef BASOP_NOGLOB tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */ - bwe_exc_fx[i + shl( i_subfr_fx, 1 )] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */ + bwe_exc_fx[i + shl(i_subfr_fx , 1)] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */ move16(); #else /* BASOP_NOGLOB */ tmp = round_fx( L_shl( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/ ) ); /* tmp in Q_exc */ diff --git a/lib_com/syn_12k8_fx.c b/lib_com/syn_12k8_fx.c index f990b0bc9..4907e8676 100644 --- a/lib_com/syn_12k8_fx.c +++ b/lib_com/syn_12k8_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*===========================================================================*/ diff --git a/lib_com/syn_filt_fx.c b/lib_com/syn_filt_fx.c index 5ce65c316..c30ad59ee 100644 --- a/lib_com/syn_filt_fx.c +++ b/lib_com/syn_filt_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "stl.h" static Word32 syn_kern_2( Word32 L_tmp, const Word16 a[], const Word16 y[] ) @@ -460,12 +459,12 @@ void ivas_synth_mem_updt2_fx( } ELSE { - en1_e = sub( 30, shl( Q, 1 ) ); + en1_e = sub(30 ,shl(Q,1)); en2_e = sub( 30, shl( Q, 1 ) ); tmp1 = Sqrt32( en1, &en1_e ); tmp2 = Sqrt32( en2, &en2_e ); tmp = BASOP_Util_Divide3232_Scale( tmp1, tmp2, &tmp_e ); - loc_rat_e = add( sub( en1_e, en2_e ), tmp_e ); + loc_rat_e = add(sub(en1_e , en2_e) , tmp_e); loc_rat = shl_sat( tmp, loc_rat_e ); // Q15 } diff --git a/lib_com/tcq_position_arith_fx.c b/lib_com/tcq_position_arith_fx.c index 2ae9e8505..2c13d89d4 100644 --- a/lib_com/tcq_position_arith_fx.c +++ b/lib_com/tcq_position_arith_fx.c @@ -7,8 +7,7 @@ #include "stl.h" #include "rom_com.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" Word32 ar_div( Word32 num, @@ -107,8 +106,8 @@ static UWord32 bitstream_load_bit( } curPos = &pBS->curPos; - bit = UL_and( UL_lshr( pBS->buf[pBS->numByte], ( *curPos ) ), 0x00000001 ); - *curPos = sub( *curPos, 1 ); + bit = UL_and( UL_lshr( pBS->buf[pBS->numByte] , ( *curPos ) ) , 0x00000001 ); + *curPos = sub(*curPos, 1); IF( *curPos < 0 ) { @@ -406,7 +405,7 @@ static Word16 ar_decode_fx( arInst->value = value; move32(); - return ( sub( symbol, 1 ) ); + return ( sub(symbol , 1) ); } void ar_decoder_done_fx( @@ -668,7 +667,7 @@ static void TCQnew_fx( move16(); if ( v_fx[i - 1] <= 0 ) { - vout_fx[i - 1] = negate( quant_fx[position][i] ); + vout_fx[i - 1] = negate(quant_fx[position][i]); move16(); } position = path_fx[position][i]; @@ -1739,7 +1738,7 @@ Word32 encode_position_ari_fx( btcq_fx = GetBitsFromPulses_fx( pulses, size ); /* Estimate TCQ bits */ bits_fx = L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[add( sub( size, nz ), 1 )] ) ); - bits_fx = L_add( bits_fx, L_sub( btcq_fx, L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[add( sub( size, nz ), 1 )] ) ) ) ); + bits_fx = L_add( bits_fx, L_sub( btcq_fx, L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[add(sub( size, nz ) , 1)] ) ) ) ); bits_fx = L_sub( bits_fx, L_sub( table_logcum_fx[pulses], L_add( table_logcum_fx[nz], table_logcum_fx[add( pulses, sub( nz, 1 ) )] ) ) ); bits_fx = L_sub( bits_fx, nz ); *est_bits_frame_fx = L_add( *est_bits_frame_fx, bits_fx ); @@ -2217,7 +2216,7 @@ void decode_position_ari_fx( test(); test(); - IF( ( mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] == 0 && scp > 0 ) || EQ_16( mode_num_nz[sub( sub( i, storepos ), stpos )], mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] ) ) + IF( ( mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] == 0 && scp > 0 ) || EQ_16( mode_num_nz[sub( sub( i, storepos ), stpos )] , mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] ) ) { mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] = 0; move16(); @@ -2405,7 +2404,7 @@ void decode_magnitude_usq_fx( } magnp = sub( magnp, out[magncout] ); magnzp = sub( magnzp, 1 ); - magncout = add( magncout, 1 ); + magncout = add(magncout, 1 ); IF( magnzp == 0 ) /* last magnitude generation */ { @@ -2528,7 +2527,7 @@ void decode_mangitude_tcq_fx( exp1 = sub( norm_s( num ), 1 ); exp2 = norm_s( denum ); prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */ - exp = add( 15, sub( exp1, exp2 ) ); + exp = add(15 , sub(exp1 , exp2)); prob1_fx = shl( prob1_fx, sub( 15, exp ) ); prob0_fx = sub( MAX_16, prob1_fx ); } @@ -2658,7 +2657,7 @@ Word16 GetScale_fx( Word16 pulses = MAX_PULSES, p_est, exp, exp1, exp2, magicnum; move16(); Word32 t, a, b, ab, estbits_fx = 0; - move32(); + move32(); magicnum = 24773; move16(); /*Q17: 0.188992013101951f; */ diff --git a/lib_com/tcx_ltp_fx.c b/lib_com/tcx_ltp_fx.c index 134e861af..59ab1d55e 100644 --- a/lib_com/tcx_ltp_fx.c +++ b/lib_com/tcx_ltp_fx.c @@ -3,8 +3,7 @@ ====================================================================================*/ #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "cnst.h" #include "basop_util.h" #include "rom_com.h" @@ -665,7 +664,7 @@ static void tcx_ltp_synth_filter32( L_tmp2 = Mpy_32_16_r( L_tmp2, alpha ); #ifdef BASOP_NOGLOB L_tmp2 = L_add_sat( synth[j], L_tmp2 ); - if ( zir != NULL ) + if( zir != NULL ) { L_tmp2 = L_sub_sat( L_tmp2, zir[j] ); } @@ -728,7 +727,7 @@ static void tcx_ltp_synth_filter_10( assert( GE_16( filtIdx, 0 ) ); w0 = &tcxLtpFilters[filtIdx].filt[pitch_fr]; - w1 = &tcxLtpFilters[filtIdx].filt[sub( pitch_res, pitch_fr )]; + w1 = &tcxLtpFilters[filtIdx].filt[sub(pitch_res , pitch_fr)]; v0 = &tcxLtpFilters[filtIdx].filt[0]; v1 = &tcxLtpFilters[filtIdx].filt[pitch_res]; L = tcxLtpFilters[filtIdx].length; @@ -797,7 +796,7 @@ static void tcx_ltp_synth_filter_10_fx( curr_gain = gain; move16(); - gain_step = idiv1616( negate( gain ), length ); // TODO + gain_step = idiv1616(negate( gain ) , length); // TODO for ( j = 0; j < length; j++ ) { @@ -861,8 +860,8 @@ static void tcx_ltp_synth_filter_01( curr_gain = 0; move16(); - // gain_step = gain / length; // TODO - gain_step = idiv1616( gain, length ); // TODO + //gain_step = gain / length; // TODO + gain_step = idiv1616(gain , length); // TODO for ( j = 0; j < length; j++ ) { @@ -927,8 +926,8 @@ static void tcx_ltp_synth_filter_01_fx( curr_gain = 0; move16(); - // gain_step = gain / length; // TODO - gain_step = idiv1616( gain, length ); // TODO + //gain_step = gain / length; // TODO + gain_step = idiv1616(gain , length); // TODO for ( j = 0; j < length; j++ ) { @@ -1027,8 +1026,8 @@ static void tcx_ltp_synth_filter_11_unequal_pitch( /* 1. decreasing gain filter. The first filter unit with the parameters associated to the previous interval and scaling towards 0 */ gain = prev_gain; move16(); - // gain_step = negate( prev_gain ) / length; // TODO - gain_step = idiv1616( negate( prev_gain ), length ); // TODO + //gain_step = negate( prev_gain ) / length; // TODO + gain_step = idiv1616(negate( prev_gain ) , length); // TODO for ( j = 0; j < length; j++ ) { @@ -1156,7 +1155,7 @@ static void tcx_ltp_synth_filter_11_unequal_pitch_fx( /* 1. decreasing gain filter. The first filter unit with the parameters associated to the previous interval and scaling towards 0 */ gain = prev_gain; move16(); - gain_step = idiv1616( negate( prev_gain ), length ); // TODOD + gain_step = idiv1616(negate( prev_gain ) , length); // TODOD for ( j = 0; j < length; j++ ) { @@ -1359,7 +1358,7 @@ void tcx_ltp_post( move16(); } - IF( core == ACELP_CORE ) + IF( core == ACELP_CORE ) { bfi = 0; move16(); @@ -1421,7 +1420,7 @@ void tcx_ltp_post( ELSE IF( bfi == 0 ) { /* LTP and good frame */ - test(); + test(); IF( EQ_16( st->element_mode, EVS_MONO ) ) /* hard tunings for EVS_MONO, HQ_48k is TCX only */ { IF( NE_16( output_frame, L_frame_core ) ) @@ -1580,20 +1579,20 @@ void tcx_ltp_post( test(); // #ifdef IVAS_CODE_TCX_LTP if ( st->element_mode != EVS_MONO ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev == 0 ) + { + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF ( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev == 0 ) { /* The filtering is deactivated, just copy input to the output */ Copy( sig_in + delay, sig_out + delay, L_transition ); } - ELSE IF( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev != 0 ) + ELSE IF ( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev != 0 ) { /* Filtering with the first filter unit */ tcx_ltp_synth_filter_10( sig_out + delay, sig_in + delay, L_transition, hTcxLtpDec->tcxltp_pitch_int_post_prev, hTcxLtpDec->tcxltp_pitch_fr_post_prev, hTcxLtpDec->tcxltp_gain_post_prev, st->pit_res_max_past, hTcxLtpDec->tcxltp_filt_idx_prev ); @@ -1603,7 +1602,7 @@ void tcx_ltp_post( /* Filtering with the second filter unit */ tcx_ltp_synth_filter_01( sig_out + delay, sig_in + delay, L_transition, pitch_int, pitch_fr, gain, st->pit_res_max, filtIdx ); } - ELSE IF( EQ_16( gain, hTcxLtpDec->tcxltp_gain_post_prev ) && EQ_16( pitch_int, hTcxLtpDec->tcxltp_pitch_int_post_prev ) && EQ_16( pitch_fr, hTcxLtpDec->tcxltp_pitch_fr_post_prev ) && EQ_16( st->pit_res_max, st->pit_res_max_past ) && EQ_16( filtIdx, hTcxLtpDec->tcxltp_filt_idx_prev ) ) + ELSE IF( EQ_16(gain ,hTcxLtpDec->tcxltp_gain_post_prev )&& EQ_16(pitch_int , hTcxLtpDec->tcxltp_pitch_int_post_prev) && EQ_16(pitch_fr, hTcxLtpDec->tcxltp_pitch_fr_post_prev )&& EQ_16(st->pit_res_max , st->pit_res_max_past )&& EQ_16(filtIdx , hTcxLtpDec->tcxltp_filt_idx_prev )) { tcx_ltp_synth_filter( sig_out + delay, sig_in + delay, L_transition, pitch_int, pitch_fr, gain, st->pit_res_max, NULL, 0, filtIdx ); } @@ -1617,10 +1616,10 @@ void tcx_ltp_post( ELSE // #endif { - test(); - test(); - test(); - test(); + test(); + test(); + test(); + test(); IF( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev == 0 ) { Copy( sig_in + delay, sig_out + delay, L_transition ); diff --git a/lib_com/tcx_mdct_fx.c b/lib_com/tcx_mdct_fx.c index f66ea0d76..f2f93d9ec 100644 --- a/lib_com/tcx_mdct_fx.c +++ b/lib_com/tcx_mdct_fx.c @@ -5,8 +5,7 @@ #include #include "options.h" #include "cnst.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" static Word16 TCX_MDCT_GetScaleFactor( @@ -126,7 +125,7 @@ void TCX_MDCT( FOR( i = 0; i < l / 2; i++ ) { #ifdef BASOP_NOGLOB - y[add( add( add( shr( m, 1 ), shr( r, 1 ) ), shr( m, 1 ) ), i )] = L_msu_o( L_mult( x[i], factor ), x[sub( sub( l, 1 ), i )], factor, &Overflow ); + y[add( add( add( shr( m, 1 ), shr( r, 1 ) ), shr( m, 1 ) ), i )] = L_msu_o( L_mult( x[i], factor ), x[sub(sub(l , 1) , i)], factor, &Overflow ); #else /* BASOP_NOGLOB */ y[m / 2 + r / 2 + m / 2 + i] = L_msu( L_mult( x[i], factor ), x[l - 1 - i], factor ); #endif /* BASOP_NOGLOB */ @@ -134,13 +133,13 @@ void TCX_MDCT( } FOR( i = 0; i < m / 2; i++ ) { - y[sub( sub( add( shr( m, 1 ), shr( r, 1 ) ), 1 ), i )] = L_mult( x[add( add( l, shr( m, 1 ) ), i )], neg_factor ); + y[sub( sub( add( shr( m, 1 ), shr( r, 1 ) ), 1 ), i )] = L_mult( x[add(add(l , shr(m ,1)) , i)], neg_factor ); move32(); } FOR( i = 0; i < r / 2; i++ ) { #ifdef BASOP_NOGLOB - y[sub( sub( sub( add( shr( m, 1 ), shr( r, 1 ) ), 1 ), shr( m, 1 ) ), i )] = L_mac_o( L_mult( x[add( add( l, m ), i )], neg_factor ), x[sub( sub( add( add( l, m ), r ), 1 ), i )], neg_factor, &Overflow ); + y[sub( sub( sub( add( shr( m, 1 ), shr( r, 1 ) ), 1 ), shr( m, 1 ) ), i )] = L_mac_o( L_mult( x[add( add( l, m ), i )], neg_factor ), x[sub(sub(add(add(l , m) , r) , 1) , i)], neg_factor, &Overflow ); #else /* BASOP_NOGLOB */ y[m / 2 + r / 2 - 1 - m / 2 - i] = L_mac( L_mult( x[l + m + i], neg_factor ), x[l + m + r - 1 - i], neg_factor ); #endif /* BASOP_NOGLOB */ @@ -189,7 +188,7 @@ void TCX_MDST( FOR( i = 0; i < l / 2; i++ ) { #ifdef BASOP_NOGLOB - y[add( add( add( shr( m, 1 ), shr( r, 1 ) ), shr( m, 1 ) ), i )] = L_msu_o( L_mult( x[i], neg_factor ), x[sub( sub( l, 1 ), i )], factor, &Overflow ); + y[add( add( add( shr(m ,1), shr(r ,1) ), shr(m ,1) ), i )] = L_msu_o( L_mult( x[i], neg_factor ), x[sub(sub(l , 1) , i)], factor, &Overflow ); #else /* BASOP_NOGLOB */ y[m / 2 + r / 2 + m / 2 + i] = L_msu( L_mult( x[i], neg_factor ), x[l - 1 - i], factor ); #endif @@ -251,7 +250,7 @@ void TCX_MDCT_Inverse( FOR( i = 0; i < R2; i++ ) { #ifdef BASOP_NOGLOB - y[add( add( add( l, m ), R2 ), i )] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[add( L2, i )], negfac ), s ) ); /* fold out right end of DCT */ + y[add(add(add(l , m) , R2) , i)] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[add(L2 , i)], negfac ), s ) ); /* fold out right end of DCT */ #else y[l + m + R2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); /* fold out right end of DCT */ #endif @@ -262,7 +261,7 @@ void TCX_MDCT_Inverse( FOR( i = 0; i < L2; i++ ) { #ifdef BASOP_NOGLOB - y[i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[add( add( add( L2, m ), R2 ), i )], fac ), s ) ); /* negate, fold out left end of DCT */ + y[i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[add(add(add(L2 , m) , R2) , i)], fac ), s ) ); /* negate, fold out left end of DCT */ #else y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], fac ), s ) ); /* negate, fold out left end of DCT */ #endif @@ -320,7 +319,7 @@ void TCX_MDST_Inverse_fx( FOR( i = 0; i < R2; i++ ) { - y[add( add( add( l, m ), R2 ), i )] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( L2, i )], fac ), s ) ); /* fold out right end of DCT */ + y[add(add(add(l , m) , R2) , i)] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add(L2 , i)], fac ), s ) ); /* fold out right end of DCT */ move16(); } @@ -335,7 +334,7 @@ void TCX_MDST_Inverse_fx( Word16 f; f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( L2, i )], fac ), s ) ); - y[add( L2, i )] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[sub( sub( add( add( l, m ), R2 ), 1 ), i )], negfac ), s ) ); /* time-reverse mid of DCT */ + y[add(L2 , i)] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[sub( sub( add( add( l, m ), R2 ), 1 ), i )], negfac ), s ) ); /* time-reverse mid of DCT */ move16(); y[sub( sub( add( add( l, m ), R2 ), 1 ), i )] = negate( f ); @@ -367,7 +366,7 @@ void TCX_MDXT_Inverse_fx( set32_fx( tmp_buf, 0, N_MAX + L_MDCT_OVLP_MAX / 2 ); - edxt_fx( x, tmp_buf + L2, add( add( L2, m ), R2 ), kernel_type, TRUE ); + edxt_fx( x, tmp_buf + L2, add(add(L2 , m) , R2), kernel_type, TRUE ); fac = TCX_MDCT_Inverse_GetScaleFactor( add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &fac_e ); x_e = add( x_e, fac_e ); @@ -381,8 +380,8 @@ void TCX_MDXT_Inverse_fx( { signLeft = fac; } - // signRight = ( kernel_type & 1 ? fac : negfac ); - IF( L_and( kernel_type, 1 ) ) + //signRight = ( kernel_type & 1 ? fac : negfac ); + IF ( L_and( kernel_type, 1 ) ) { signRight = fac; } @@ -396,24 +395,24 @@ void TCX_MDXT_Inverse_fx( FOR( i = 0; i < L2; i++ ) { - y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( add( add( L2, m ), R2 ), i )], signLeft ), s ) ); /* fold out the left end */ + y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add(add(add(L2 , m) , R2) , i)], signLeft ), s ) ); /* fold out the left end */ } FOR( i = 0; i < R2; i++ ) { - y[add( add( add( l, m ), R2 ), i )] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( L2, i )], signRight ), s ) ); /* ...and right end */ + y[add(add(add(l , m) , R2) , i)] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add(L2 , i)], signRight ), s ) ); /* ...and right end */ move16(); } - FOR( i = 0; i < ( ( add( add( L2, m ), R2 ) ) >> 1 ); i++ ) + FOR( i = 0; i < ( ( add(add(L2 , m) , R2) ) >> 1 ); i++ ) { - f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( L2, i )], negfac ), s ) ); + f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add(L2 , i)], negfac ), s ) ); - y[add( L2, i )] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[sub( sub( add( add( l, m ), R2 ), 1 ), i )], negfac ), s ) ); /* time-reverse mid of DCT */ + y[add(L2 , i)] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[sub(sub(add(add(l , m) , R2) , 1) , i)], negfac ), s ) ); /* time-reverse mid of DCT */ move16(); - y[sub( sub( add( add( l, m ), R2 ), 1 ), i )] = f; + y[sub(sub(add(add(l , m) , R2) , 1) , i)] = f; move16(); } diff --git a/lib_com/tcx_mdct_window.c b/lib_com/tcx_mdct_window.c index 8276f07d4..de929cff7 100644 --- a/lib_com/tcx_mdct_window.c +++ b/lib_com/tcx_mdct_window.c @@ -40,8 +40,7 @@ #include #include "cnst.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #include "wmc_auto.h" @@ -116,11 +115,11 @@ void mdct_window_sine_IVAS_updated( const Word16 window_type, const Word16 element_mode ) { - IF( EQ_16( element_mode, EVS_MONO ) ) + IF (EQ_16( element_mode , EVS_MONO )) { const PWord16 *table; table = getSineWindowTable( n ); - FOR( Word32 i = 0; i < shr( n, 1 ); i++ ) + FOR ( Word32 i = 0; i < shr( n, 1 ); i++ ) { window[i].v.re = table[i].v.re; move16(); @@ -135,8 +134,8 @@ void mdct_window_sine_IVAS_updated( Word16 buf_in_size = 0; move16(); Word16 temp[420]; - set16_fx( temp, 0, 420 ); - SWITCH( window_type ) + set16_fx(temp, 0, 420); + SWITCH ( window_type ) { case FULL_OVERLAP: window_table = tcx_mdct_window_48_fx; @@ -159,7 +158,7 @@ void mdct_window_sine_IVAS_updated( BREAK; } - IF( EQ_32( Fs, 48000 ) ) + IF( EQ_32( Fs , 48000 )) { Copy( window_table, temp, n ); } @@ -168,7 +167,7 @@ void mdct_window_sine_IVAS_updated( lerp( window_table, temp, n, buf_in_size ); } - FOR( Word32 i = 0; i < shr( n, 1 ); i++ ) + FOR ( Word32 i = 0; i < shr(n, 1); i++ ) { window[i].v.re = temp[n - 1 - i]; move16(); @@ -187,7 +186,7 @@ void mdct_window_sine( PWord16 *window, Word16 n ) { const PWord16 *table; table = getSineWindowTable( n ); - FOR( Word32 i = 0; i < shr( n, 1 ); i++ ) + FOR ( Word32 i = 0; i < shr(n, 1); i++ ) { window[i].v.re = table[i].v.re; move16(); diff --git a/lib_com/tcx_utils_fx.c b/lib_com/tcx_utils_fx.c index e5d9f1478..ed8ea7013 100644 --- a/lib_com/tcx_utils_fx.c +++ b/lib_com/tcx_utils_fx.c @@ -5,8 +5,7 @@ #include #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #include "rom_basop_util.h" #include "basop_util.h" @@ -889,7 +888,7 @@ void lpc2mdct_2( BASOP_cfft_ivas( RealData_fx, ImagData_fx, 1, &scale ); /*Get amplitude*/ - j = sub( FDNS_NPTS, 1 ); + j = sub(FDNS_NPTS , 1); move16(); k = 0; move16(); @@ -1973,7 +1972,7 @@ void tcx_noise_filling_with_shift( } Q[i] = L_shl( Q[i], nrm ); move32(); - new_Q_e[i] = sub( 31, nrm ); + new_Q_e[i] = sub(31 , nrm); tmp1 = shr( seed, 4 ); nrg = L_mac0( nrg, tmp1, tmp1 ); /* sum up energy of current noise segment */ diff --git a/lib_com/tec_com.c b/lib_com/tec_com.c index d702c4330..380fc0c09 100644 --- a/lib_com/tec_com.c +++ b/lib_com/tec_com.c @@ -5,8 +5,7 @@ #include #include "options.h" #include "basop_util.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "cnst.h" #include "rom_com.h" @@ -655,7 +654,7 @@ void calcGainTemp_TBE_Fx( startPos, stopPos, bandOffset, - sub( 15, cldfb_exp ) ); + sub(15 , cldfb_exp) ); IF( code > 0 ) { @@ -1031,7 +1030,7 @@ static Word16 procTec_Fx( s = norm_s( hb_synth_Fx[k] ); hb_synth_Fx[k] = mult_r( gain_m[i], shl( hb_synth_Fx[k], s ) ); move16(); - shift[k] = sub( s, gain_e[i] ); + shift[k] = sub(s , gain_e[i]); if ( GT_16( min_shift, shift[k] ) ) { diff --git a/lib_com/tns_base.c b/lib_com/tns_base.c index b0b8bb8e3..9aafaddba 100644 --- a/lib_com/tns_base.c +++ b/lib_com/tns_base.c @@ -10,8 +10,7 @@ #include "stat_com.h" #include "cnst.h" #include "rom_com.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" /*---------------------------------------------------------------------------- diff --git a/lib_com/tools.c b/lib_com/tools.c index 4b1d12be2..a2912019d 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -38,9 +38,8 @@ #include "options.h" #include #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "wmc_auto.h" -#include "prot_fx1.h" /*------------------------------------------------------------------* * own_random() diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index c0f402d61..919da71e3 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -45,8 +45,7 @@ #include "stl.h" #include #include "cnst.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "basop32.h" #include "wmc_auto.h" diff --git a/lib_com/trans_direct_fx.c b/lib_com/trans_direct_fx.c index 32d94aa49..5752de723 100644 --- a/lib_com/trans_direct_fx.c +++ b/lib_com/trans_direct_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common FX constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Function prototypes */ /*------------------------------------------------------------------- diff --git a/lib_com/trans_inv_fx.c b/lib_com/trans_inv_fx.c index 70746dba9..5f712b1b5 100644 --- a/lib_com/trans_inv_fx.c +++ b/lib_com/trans_inv_fx.c @@ -3,8 +3,7 @@ ====================================================================================*/ #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Function prototypes */ #include "rom_dec.h" diff --git a/lib_com/vlpc_2st_com_fx.c b/lib_com/vlpc_2st_com_fx.c index f25e8bbf0..c54e5632f 100644 --- a/lib_com/vlpc_2st_com_fx.c +++ b/lib_com/vlpc_2st_com_fx.c @@ -5,8 +5,7 @@ #include #include "options.h" #include "cnst.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "control.h" #include "basop_util.h" diff --git a/lib_com/weight_a_fx.c b/lib_com/weight_a_fx.c index 61f453a20..99b621fa5 100644 --- a/lib_com/weight_a_fx.c +++ b/lib_com/weight_a_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include /*------------------------------------------------------------------ diff --git a/lib_com/weight_fx.c b/lib_com/weight_fx.c index 5b5005faf..2d9999736 100644 --- a/lib_com/weight_fx.c +++ b/lib_com/weight_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*--------------------------------------------------------------------------* * sfm2mqb_fx() diff --git a/lib_com/wi_fx.c b/lib_com/wi_fx.c index 391f6d9e5..233a2f6ba 100644 --- a/lib_com/wi_fx.c +++ b/lib_com/wi_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #include "log2.h" diff --git a/lib_com/window_fx.c b/lib_com/window_fx.c index 6ef8081fd..97443e3b5 100644 --- a/lib_com/window_fx.c +++ b/lib_com/window_fx.c @@ -7,7 +7,6 @@ #include "options.h" #include #include "basop_util.h" -#include "prot_fx1.h" #define PI_HALF_0Q15 51472 /* ~=round(pi/2*2^15) */ #define PI2_15Q16 0x0006487F /* ~=round(2*PI*2^16) */ @@ -19,7 +18,7 @@ #define P92_0Q15 30147 /* ~=round(0.92*2^15) */ #include "options.h" #include "rom_basop_util.h" -#include "prot_fx2.h" +#include "prot_fx.h" void ham_cos_window( diff --git a/lib_com/window_ola_fx.c b/lib_com/window_ola_fx.c index ac7e63d8a..20051c051 100644 --- a/lib_com/window_ola_fx.c +++ b/lib_com/window_ola_fx.c @@ -3,8 +3,7 @@ ====================================================================================*/ #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Function prototypes */ #include "stl.h" diff --git a/lib_com/wtda.c b/lib_com/wtda.c index 868cd7057..f1b47ee6c 100644 --- a/lib_com/wtda.c +++ b/lib_com/wtda.c @@ -42,7 +42,7 @@ #include #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #endif // IVAS_FLOAT_FIXED /*--------------------------------------------------------------------------* diff --git a/lib_com/wtda_fx.c b/lib_com/wtda_fx.c index 07699e408..f6a2c5acd 100644 --- a/lib_com/wtda_fx.c +++ b/lib_com/wtda_fx.c @@ -5,8 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* required by wmc_tool */ -#include "prot_fx2.h" /* required by wmc_tool */ +#include "prot_fx.h" /* required by wmc_tool */ #include "stat_com.h" /*--------------------------------------------------------------------------* * mvr2r_inv() diff --git a/lib_dec/ACcontextMapping_dec_fx.c b/lib_dec/ACcontextMapping_dec_fx.c index 01298f6dd..92dddd54f 100644 --- a/lib_dec/ACcontextMapping_dec_fx.c +++ b/lib_dec/ACcontextMapping_dec_fx.c @@ -9,8 +9,7 @@ #include "rom_dec.h" #include "basop_util.h" #include "cnst.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_rom_com.h" diff --git a/lib_dec/FEC_HQ_core.c b/lib_dec/FEC_HQ_core.c index f87cc884f..68f7d72de 100644 --- a/lib_dec/FEC_HQ_core.c +++ b/lib_dec/FEC_HQ_core.c @@ -43,8 +43,7 @@ #include "prot.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif #ifndef IVAS_FLOAT_FIXED @@ -1558,7 +1557,7 @@ void save_synthesis_hq_fec_fx( move16(); BREAK; case IVAS_CPE_DFT: - IF( EQ_16( hCPE->nchan_out, 1 ) && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) + IF( EQ_16(hCPE->nchan_out , 1) && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) { post_hq_delay = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); move16(); @@ -1582,10 +1581,10 @@ void save_synthesis_hq_fec_fx( test(); IF( ( EQ_16( st->codec_mode, MODE1 ) && st->hTcxDec != NULL ) && ( ( EQ_16( st->core, ACELP_CORE ) && !( EQ_16( st->bfi, 1 ) && EQ_16( st->con_tcx, 1 ) ) ) || EQ_16( st->core, HQ_CORE ) ) ) { - Copy( st->hTcxDec->synth_history_fx + output_frame, st->hTcxDec->synth_history_fx, add( sub( output_frame, post_hq_delay ), NS2SA( st->output_Fs, PH_ECU_MEM_NS ) ) ); + Copy( st->hTcxDec->synth_history_fx + output_frame, st->hTcxDec->synth_history_fx, add(sub(output_frame , post_hq_delay) , NS2SA( st->output_Fs, PH_ECU_MEM_NS )) ); FOR( Word16 i = 0; i < output_frame; i++ ) { - st->hTcxDec->old_synthFB_fx[sub( add( i, output_frame ), post_hq_delay )] = extract_h( output_fx[i] ); + st->hTcxDec->old_synthFB_fx[sub(add(i , output_frame) , post_hq_delay)] = extract_h( output_fx[i] ); move16(); } @@ -1594,27 +1593,27 @@ void save_synthesis_hq_fec_fx( /* reset the remaining buffer, which is read in TCX concealment the necessary samples to fill this buffer are not available for all cases, the impact on the output is limited */ - set16_fx( st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), post_hq_delay ), 0, post_hq_delay ); + set16_fx( st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , post_hq_delay), 0, post_hq_delay ); IF( GE_16( output_frame, L_FRAME16k ) ) { - Copy( st->prev_synth_buffer_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ) ), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); + Copy( st->prev_synth_buffer_fx, st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS )), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); } ELSE { - Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl( output_frame, 1 ), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl(output_frame, 1), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } IF( st->core != ACELP_CORE ) { IF( GE_16( output_frame, L_FRAME16k ) ) { - Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); - Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl( output_frame, 1 ), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , NS2SA( st->output_Fs, DELAY_CLDFB_NS )), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl(output_frame, 1), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } ELSE { - Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ) ), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); - Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS )), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS )), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } } } @@ -1622,8 +1621,8 @@ void save_synthesis_hq_fec_fx( { IF( st->core != ACELP_CORE ) { - Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), post_hq_delay ), post_hq_delay ); - Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl( output_frame, 1 ), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , post_hq_delay), post_hq_delay ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl(output_frame, 1), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } } } diff --git a/lib_dec/FEC_HQ_core_fx.c b/lib_dec/FEC_HQ_core_fx.c index 2a375498e..9c9991330 100644 --- a/lib_dec/FEC_HQ_core_fx.c +++ b/lib_dec/FEC_HQ_core_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" diff --git a/lib_dec/FEC_HQ_phase_ecu_fx.c b/lib_dec/FEC_HQ_phase_ecu_fx.c index 7d75f0029..921f4e09f 100644 --- a/lib_dec/FEC_HQ_phase_ecu_fx.c +++ b/lib_dec/FEC_HQ_phase_ecu_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "rom_dec.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" @@ -610,9 +609,9 @@ static void trans_ana_fx( #endif att_val = 32767; move16(); - IF( *pGrPowRight > 0 ) + IF ( *pGrPowRight > 0 ) { - IF( LT_32( *pGrPowRight, *pGrPowLeft ) ) /* i.e., (gr_pow_right/gr_pow_left) < 1.0 */ + IF ( LT_32( *pGrPowRight, *pGrPowLeft ) ) /* i.e., (gr_pow_right/gr_pow_left) < 1.0 */ { /* Compute sqrt(grp_pow_chg), where grp_pow_chg = gr_pow_right/gr_pow_left. */ tmp16 = ratio( *pGrPowRight, *pGrPowLeft, &expo ); /* tmp16 in Q14 */ @@ -666,7 +665,7 @@ static void trans_ana_fx( mag_chg[k] = mult_r( mag_chg_1st[k], att_val ); /* Q15 */ move16(); - IF( GT_16( burst_len, BETA_MUTE_THR ) ) + IF ( GT_16( burst_len, BETA_MUTE_THR ) ) { *beta_mute = shr( *beta_mute, 1 ); move16(); @@ -753,7 +752,7 @@ static void ivas_peakfinder_fx( pDx0 = pDx01 + 1; len = 0; move16(); - IF( endpoints ) + IF ( endpoints ) { *pX++ = *pX0++; move16(); @@ -769,7 +768,7 @@ static void ivas_peakfinder_fx( FOR( i = 0; i < len0Minus2; i++ ) { - IF( s_xor( *pDx01++, *pDx0++ ) < 0 ) /* Detect sign change. */ + IF ( s_xor( *pDx01++, *pDx0++ ) < 0 ) /* Detect sign change. */ { *pInd++ = add( i, 1 ); move16(); @@ -779,7 +778,7 @@ static void ivas_peakfinder_fx( } pX0++; } - IF( endpoints ) + IF ( endpoints ) { *pInd = len0Minus1; move16(); @@ -803,7 +802,7 @@ static void ivas_peakfinder_fx( move16(); threshold = add( leftMin, sel ); - IF( len > 0 ) + IF ( len > 0 ) { /* Deal with first point a little differently since tacked it on Calculate the sign of the derivative since we took the first point @@ -821,7 +820,7 @@ static void ivas_peakfinder_fx( { ii = -1; move16(); - IF( GE_16( xAt1, xAt2 ) ) /* x[1] is not extremum -> overwrite with x[0] */ + IF ( GE_16( xAt1, xAt2 ) ) /* x[1] is not extremum -> overwrite with x[0] */ { *pX = xAt0; /* x[1] = x[0] */ move16(); @@ -855,7 +854,7 @@ static void ivas_peakfinder_fx( // PMTE () ii = -1; /* First point is a peak */ move16(); - IF( GE_16( len, 2 ) ) + IF ( GE_16( len, 2 ) ) { if ( GE_16( x[1], x[0] ) ) { @@ -873,14 +872,14 @@ static void ivas_peakfinder_fx( ii = add( ii, 1 ); /* This is a peak */ /* Make sure we don't iterate past the length of our vector */ - IF( GE_16( ii, lenMinus1 ) ) + IF ( GE_16( ii, lenMinus1 ) ) { BREAK; } /*Reset peak finding if we had a peak and the next peak is bigger than the last or the left min was small enough to reset.*/ - IF( foundPeak > 0 ) + IF ( foundPeak > 0 ) { tempMag = minMag; move16(); @@ -890,9 +889,9 @@ static void ivas_peakfinder_fx( /* Found new peak that was larger than temp mag and selectivity larger than the minimum to its left. */ - IF( GT_16( *( ++pX ), tempMag ) ) + IF ( GT_16( *( ++pX ), tempMag ) ) { - IF( GT_16( *pX, threshold ) ) /* threshold = leftMin + sel */ + IF ( GT_16( *pX, threshold ) ) /* threshold = leftMin + sel */ { tempLoc = ii; move16(); @@ -905,9 +904,9 @@ static void ivas_peakfinder_fx( pX++; /* Come down at least sel from peak */ - IF( foundPeak == 0 ) + IF ( foundPeak == 0 ) { - IF( GT_16( tempMag, add( sel, *pX ) ) ) + IF ( GT_16( tempMag, add( sel, *pX ) ) ) { foundPeak = 1; /* We have found a peak */ move16(); @@ -922,9 +921,9 @@ static void ivas_peakfinder_fx( move16(); } } - IF( foundPeak == 0 ) /* The above IF-block has not found the peak yet. */ + IF ( foundPeak == 0 ) /* The above IF-block has not found the peak yet. */ { - IF( LT_16( *pX, leftMin ) ) /* New left minimum */ + IF ( LT_16( *pX, leftMin ) ) /* New left minimum */ { leftMin = *pX; move16(); @@ -934,9 +933,9 @@ static void ivas_peakfinder_fx( } /* Check end point */ - IF( GT_16( x[lenMinus1], tempMag ) ) + IF ( GT_16( x[lenMinus1], tempMag ) ) { - IF( GT_16( x[lenMinus1], threshold ) ) /* threshold = leftMin + sel */ + IF ( GT_16( x[lenMinus1], threshold ) ) /* threshold = leftMin + sel */ { peakLoc[*cInd] = lenMinus1; move16(); @@ -948,9 +947,9 @@ static void ivas_peakfinder_fx( move16(); } } - IF( foundPeak == 0 ) /* Check if we still need to add the last point */ + IF ( foundPeak == 0 ) /* Check if we still need to add the last point */ { - IF( GT_16( tempMag, minMag ) ) + IF ( GT_16( tempMag, minMag ) ) { peakLoc[*cInd] = tempLoc; move16(); @@ -1069,7 +1068,7 @@ static void peakfinder_fx( FOR( i = 0; i < len0Minus2; i++ ) { - IF( s_xor( *pDx01++, *pDx0++ ) < 0 ) /* Detect sign change. */ + IF ( s_xor( *pDx01++, *pDx0++ ) < 0 ) /* Detect sign change. */ { *pInd++ = add( i, 1 ); move16(); @@ -1188,7 +1187,7 @@ static void peakfinder_fx( /*Reset peak finding if we had a peak and the next peak is bigger than the last or the left min was small enough to reset.*/ - IF( foundPeak > 0 ) + IF ( foundPeak > 0 ) { tempMag = minMag; move16(); @@ -1198,9 +1197,9 @@ static void peakfinder_fx( /* Found new peak that was larger than temp mag and selectivity larger than the minimum to its left. */ - IF( GT_16( *( ++pX ), tempMag ) ) + IF ( GT_16( *( ++pX ), tempMag ) ) { - IF( GT_16( *pX, threshold ) ) /* threshold = leftMin + sel */ + IF ( GT_16( *pX, threshold ) ) /* threshold = leftMin + sel */ { tempLoc = ii; move16(); @@ -1213,9 +1212,9 @@ static void peakfinder_fx( pX++; /* Come down at least sel from peak */ - IF( foundPeak == 0 ) + IF ( foundPeak == 0 ) { - IF( GT_16( tempMag, add( sel, *pX ) ) ) + IF ( GT_16( tempMag, add( sel, *pX ) ) ) { foundPeak = 1; /* We have found a peak */ move16(); @@ -1230,9 +1229,9 @@ static void peakfinder_fx( move16(); } } - IF( foundPeak == 0 ) /* The above IF-block has not found the peak yet. */ + IF ( foundPeak == 0 ) /* The above IF-block has not found the peak yet. */ { - IF( LT_16( *pX, leftMin ) ) /* New left minimum */ + IF ( LT_16( *pX, leftMin ) ) /* New left minimum */ { leftMin = *pX; move16(); @@ -1242,9 +1241,9 @@ static void peakfinder_fx( } /* Check end point */ - IF( GT_16( x[lenMinus1], tempMag ) ) + IF ( GT_16( x[lenMinus1], tempMag ) ) { - IF( GT_16( x[lenMinus1], threshold ) ) /* threshold = leftMin + sel */ + IF ( GT_16( x[lenMinus1], threshold ) ) /* threshold = leftMin + sel */ { peakLoc[*cInd] = lenMinus1; move16(); @@ -1255,9 +1254,9 @@ static void peakfinder_fx( move16(); } } - IF( foundPeak == 0 ) /* Check if we still need to add the last point */ + IF ( foundPeak == 0 ) /* Check if we still need to add the last point */ { - IF( GT_16( tempMag, minMag ) ) + IF ( GT_16( tempMag, minMag ) ) { peakLoc[*cInd] = tempLoc; move16(); @@ -1354,11 +1353,11 @@ static Word16 imax_fx( /* o: The location, relative to the sign = L_xor( y3_y1, denom ); /* Preserve the sign since div_s() only takes positive arguments. */ numer = L_abs( y3_y1 ); denom = L_abs( denom ); - IF( numer == 0 ) + IF ( numer == 0 ) { return 0; } - IF( denom == 0 ) + IF ( denom == 0 ) { return 0; } @@ -1377,7 +1376,7 @@ static Word16 imax_fx( /* o: The location, relative to the /* For both edges (left and right), the extremum found above may be minimum. * It needs to reject the minimum. */ - IF( special != 0 ) /* Either edge specical case. */ + IF ( special != 0 ) /* Either edge specical case. */ { edge = 0x7fff; /* 1 in Q15 for the right edge special case */ move16(); @@ -1521,7 +1520,7 @@ static void ivas_spec_ana_fx( // PMTE() window_corr = w_hamm[0]; move16(); - window_corr_step = idiv1616( w_hamm[0], hamm_len2 ); + window_corr_step = idiv1616(w_hamm[0] , hamm_len2); FOR( i = 0; i < hamm_len2; i++ ) { xfp[i] = mult_r( shl( prevsynth[i], *Q ), sub( w_hamm[i], window_corr ) ); @@ -1546,12 +1545,12 @@ static void ivas_spec_ana_fx( // PMTE() window_corr = w_hamm[0]; move16(); - window_corr_step = idiv1616( w_hamm[0], hamm_len2 ); + window_corr_step = idiv1616(w_hamm[0] , hamm_len2); FOR( i = 0; i < hamm_len2; i++ ) { xfp[i] = mult_r( shl( prevsynth[i], *Q ), sub( w_hamm[i], window_corr ) ); move16(); - xfp[sub( sub( Lprot, i ), 1 )] = mult_r( shl( prevsynth[sub( sub( Lprot, i ), 1 )], *Q ), sub( w_hamm[i], window_corr ) ); + xfp[sub(sub(Lprot , i) , 1)] = mult_r( shl( prevsynth[sub(sub(Lprot , i) , 1)], *Q ), sub( w_hamm[i], window_corr ) ); move16(); window_corr = sub( window_corr, window_corr_step ); } @@ -1596,8 +1595,8 @@ static void ivas_spec_ana_fx( expo = norm_l( *pMagSq ); /* exponent */ man = extract_h( L_shl( *pMagSq++, expo ) ); /* mantissa */ man = sqrt2ndOrder( man ); - expoBy2 = shr( expo, 1 ); /* Divided by 2-- square root operation. */ - IF( s_and( expo, 1 ) == 0 ) /* Check even or odd. */ + expoBy2 = shr( expo, 1 ); /* Divided by 2-- square root operation. */ + IF ( s_and( expo, 1 ) == 0 ) /* Check even or odd. */ { man = mult_r( man, FEC_HQ_ECU_ROOT2 ); /* FEC_HQ_ECU_ROOT2 is sqrt(2) in Q14 */ expoBy2 = sub( expoBy2, 1 ); @@ -1636,7 +1635,7 @@ static void ivas_spec_ana_fx( pPlocs = plocs; n = sub( *num_plocs, 1 ); /* -1 so as to exclude the very last peak. */ /* Special case-- The very 1st peak if it is at 0 index position */ - IF( *pPlocs == 0 ) /* Only the very 1st peak is possible the peak at 0 index position. */ + IF ( *pPlocs == 0 ) /* Only the very 1st peak is possible the peak at 0 index position. */ { fraction = imax_fx( xfp, -1 ); /* -1 signifies special left edge case. */ acc = L_deposit_h( *pPlocs++ ); /* N.B., (*pPlocs) must be zero here. */ @@ -1654,7 +1653,7 @@ static void ivas_spec_ana_fx( *pPlocsi++ = L_mac( acc, fraction, 1 ); move32(); /* in Q16. Append the fractional part to the integral part. */ } - IF( n >= 0 ) + IF ( n >= 0 ) { /* Special case-- The very last peak */ pXfp = pXfp1 + *pPlocs; @@ -1718,7 +1717,7 @@ static void ivas_spec_ana_fx( endPlocs = sub( Lprot2_1, DELTA_CORR_F0_INT ); /* last *pPlocs position for Jacobsen */ /* precompute number of turns based on endpoint integer location and make into a proper for loop */ - IF( n > 0 ) + IF ( n > 0 ) { nJacob = n; move16(); @@ -1741,13 +1740,13 @@ static void ivas_spec_ana_fx( /* At this point there should at most two plocs left to process */ /* the position before fs/2 and fs/2 both use the same magnitude points */ - IF( n > 0 ) + IF ( n > 0 ) { /* [ . . . . . . . ] Lprot/2+1 positions */ /* | | | */ /* 0 (Lprot/2-2) (Lprot/2) */ - IF( EQ_16( currPlocs, ( sub( Lprot2_1, DELTA_CORR_F0_INT ) ) ) ) /* Also 2nd last peak position uses fs/2 which makes jacobsen less suitable. */ + IF ( EQ_16( currPlocs, ( sub( Lprot2_1, DELTA_CORR_F0_INT ) ) ) ) /* Also 2nd last peak position uses fs/2 which makes jacobsen less suitable. */ { fraction = imax_fx( &xfp[currPlocs - 1], 0 ); /* in Q15 */ acc = L_deposit_h( sub( currPlocs, 1 ) ); @@ -1761,7 +1760,7 @@ static void ivas_spec_ana_fx( /* Here the only remaining point would be a fs/2 plocs */ /* pXfp = xfp + sub(Lprot2,1); already set just a reminder where it * whould point */ - IF( n > 0 ) /* fs/2 which makes special case . */ + IF ( n > 0 ) /* fs/2 which makes special case . */ { fraction = imax_fx( &xfp[currPlocs - 2], 0 ); /* in Q15 */ acc = L_deposit_h( sub( currPlocs, 2 ) ); @@ -1784,7 +1783,7 @@ static void ivas_spec_ana_fx( { st_point = s_max( 0, sub( plocs[i], DELTA_CORR ) ); end_point = s_min( sub( Lprot2_1, 1 ), add( plocs[i], DELTA_CORR ) ); - set16_fx( &xfp[st_point], 0, extract_l( L_add( L_sub( end_point, st_point ), 1 ) ) ); + set16_fx( &xfp[st_point], 0, extract_l(L_add( L_sub( end_point, st_point ), 1 )) ); } noise = L_add( sum16_32_fx( xfp, Lprot2_1 ), 1 ); @@ -1934,7 +1933,7 @@ static void spec_ana_fx( } /* Apply zeroing of non-coded FFT spectrum */ - IF( GT_16( output_frame, inner_frame_tbl[bwidth_fx] ) ) + IF ( GT_16( output_frame, inner_frame_tbl[bwidth_fx] ) ) { stop_band_start = shl( 128, bwidth_fx ); stop_band_length = sub( Lprot, shl( stop_band_start, 1 ) ); @@ -1967,8 +1966,8 @@ static void spec_ana_fx( expo = norm_l( *pMagSq ); /* exponent */ man = extract_h( L_shl( *pMagSq++, expo ) ); /* mantissa */ man = sqrt2ndOrder( man ); - expoBy2 = shr( expo, 1 ); /* Divided by 2-- square root operation. */ - IF( s_and( expo, 1 ) == 0 ) /* Check even or odd. */ + expoBy2 = shr( expo, 1 ); /* Divided by 2-- square root operation. */ + IF ( s_and( expo, 1 ) == 0 ) /* Check even or odd. */ { man = mult_r( man, FEC_HQ_ECU_ROOT2 ); /* FEC_HQ_ECU_ROOT2 is sqrt(2) in Q14 */ expoBy2 = sub( expoBy2, 1 ); @@ -2021,7 +2020,7 @@ static void spec_ana_fx( pPlocs = plocs; n = sub( *num_plocs, 1 ); /* -1 so as to exclude the very last peak. */ /* Special case-- The very 1st peak if it is at 0 index position */ - IF( *pPlocs == 0 ) /* Only the very 1st peak is possible the peak at 0 index position. */ + IF ( *pPlocs == 0 ) /* Only the very 1st peak is possible the peak at 0 index position. */ { fraction = imax_fx( xfp, -1 ); /* -1 signifies special left edge case. */ acc = L_deposit_h( *pPlocs++ ); /* N.B., (*pPlocs) must be zero here. */ @@ -2039,7 +2038,7 @@ static void spec_ana_fx( *pPlocsi++ = L_mac( acc, fraction, 1 ); move32(); /* in Q16. Append the fractional part to the integral part. */ } - IF( n >= 0 ) + IF ( n >= 0 ) { /* Special case-- The very last peak */ pXfp = pXfp1 + *pPlocs; @@ -2266,7 +2265,7 @@ static void ivas_subst_spec_fx( } one_peak_flag_mask = 32767 /* 1.0f in Q15 */; /* all ones mask -> keep */ move16(); - IF( element_mode != EVS_MONO ) + IF ( element_mode != EVS_MONO ) { test(); if ( ( *num_plocs > 0 ) && ( sub( *num_plocs, 3 ) < 0 ) ) @@ -2274,7 +2273,7 @@ static void ivas_subst_spec_fx( one_peak_flag_mask = noise_fac; /* all zeroes mask -> zero */ move16(); } - IF( *num_plocs == 0 ) + IF ( *num_plocs == 0 ) { X[0] = 0; /* reset DC if there are no peaks */ move16(); @@ -2311,7 +2310,7 @@ static void ivas_subst_spec_fx( move16(); pkLocation1 = *pPlocs++; /* plocs[m + 1] */ move16(); - IF( m > 0 ) + IF ( m > 0 ) { delta_tmp = shr( sub( sub( pkLocation, pkLocation_1 ), 1 ), 1 ); if ( LT_16( delta_tmp, DELTA_CORR ) ) @@ -2321,7 +2320,7 @@ static void ivas_subst_spec_fx( } } - IF( LT_16( m, lastPeak ) ) + IF ( LT_16( m, lastPeak ) ) { delta_tmp = shr( sub( sub( pkLocation1, pkLocation ), 1 ), 1 ); if ( LT_16( delta_tmp, DELTA_CORR ) ) @@ -2420,7 +2419,7 @@ static void ivas_subst_spec_fx( { mag_chg_local = mag_chg[k]; move16(); - IF( ph_dith != 0 ) + IF ( ph_dith != 0 ) { Xph = *pCorrPhase; /* in Q16. 2*PI is not included. */ move32(); @@ -2429,7 +2428,7 @@ static void ivas_subst_spec_fx( acc = L_shr( acc, PHASE_DITH_SCALE_SHIFT ); Xph = L_add( Xph, acc ); /* in Q16. */ - IF( ph_dith > 0 ) /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized ) */ + IF ( ph_dith > 0 ) /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized ) */ { /* mag_chg_local *= 0.5 + (1.0 - ph_dith[i])/2 where 0.5~= sqrt((float)pow(10.0,-6/10.0)) and ph_dith=0..1.0--> scale=1.0 ...5 */ mag_chg_local = mult_r( mag_chg_local, sub( 32767, shr( ph_dith, 1 ) ) ); @@ -2485,7 +2484,7 @@ static void ivas_subst_spec_fx( expo = shr( expo, 1 ); beta_local = mult_r( beta_mute, round_fx( L_shl( acc, sub( 31, expo ) ) ) ); - IF( GE_16( k, LGW32K - 1 ) ) + IF ( GE_16( k, LGW32K - 1 ) ) { beta_local = mult_r( beta_local, 3277 ); /* 0.1 in Q15 */ } @@ -2713,7 +2712,7 @@ static void subst_spec_fx( move16(); pkLocation1 = *pPlocs++; /* plocs[m + 1] */ move16(); - IF( m > 0 ) + IF ( m > 0 ) { delta_tmp = shr( sub( sub( pkLocation, pkLocation_1 ), 1 ), 1 ); if ( LT_16( delta_tmp, DELTA_CORR ) ) @@ -2723,7 +2722,7 @@ static void subst_spec_fx( } } - IF( LT_16( m, lastPeak ) ) + IF ( LT_16( m, lastPeak ) ) { delta_tmp = shr( sub( sub( pkLocation1, pkLocation ), 1 ), 1 ); if ( LT_16( delta_tmp, DELTA_CORR ) ) @@ -2827,7 +2826,7 @@ static void subst_spec_fx( { mag_chg_local = mag_chg[k]; move16(); - IF( ph_dith != 0 ) + IF ( ph_dith != 0 ) { Xph = *pCorrPhase; /* in Q16. 2*PI is not included. */ move32(); @@ -2836,7 +2835,7 @@ static void subst_spec_fx( acc = L_shr( acc, PHASE_DITH_SCALE_SHIFT ); Xph = L_add( Xph, acc ); /* in Q16. */ - IF( ph_dith > 0 ) /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized ) */ + IF ( ph_dith > 0 ) /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized ) */ { /* mag_chg_local *= 0.5 + (1.0 - ph_dith[i])/2 where 0.5~= sqrt((float)pow(10.0,-6/10.0)) and ph_dith=0..1.0--> scale=1.0 ...5 */ mag_chg_local = mult_r( mag_chg_local, sub( 32767, shr( ph_dith, 1 ) ) ); @@ -3019,7 +3018,7 @@ static void ivas_rec_wtda_fx( Word16 copy_len; Word16 ola_len; - copy_len = NS2SA( output_frame * FRAMES_PER_SEC, ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* prototype fill on each side of xsubst to fill MDCT Frame */ + copy_len = NS2SA( output_frame * FRAMES_PER_SEC, ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* prototype fill on each side of xsubst to fill MDCT Frame */ move16(); ola_len = NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS - ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* remaining lengt of LA_ZEROS to overlap add decoded with xsubst */ move16(); @@ -3077,22 +3076,22 @@ static void ivas_rec_wtda_fx( } /* extract reconstructed frame with aldo window */ - timesh = sub( NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ), shr( sub( shl( output_frame, 1 ), Lprot ), 1 ) ); + timesh = sub(NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) , shr(sub( shl(output_frame, 1) , Lprot ) , 1)); - set16_fx( xsubst_, 0, add( sub( shl( output_frame, 1 ), Lprot ), timesh ) ); - Copy( X, xsubst_ + add( sub( shl( output_frame, 1 ), Lprot ), timesh ), sub( Lprot, timesh ) ); + set16_fx( xsubst_, 0, add(sub(shl(output_frame, 1) , Lprot) , timesh) ); + Copy( X, xsubst_ + add(sub(shl(output_frame, 1) , Lprot) , timesh), sub(Lprot , timesh) ); /* Copy and OLA look ahead zero part of MDCT window from decoded signal */ IF( element_mode != EVS_MONO ) { Copy( old_dec, xsubst_ + NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ), copy_len ); /* also need to scale to Q0 ?? */ pOld = old_dec + copy_len; - pNew = xsubst_ + add( copy_len, NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) ); + pNew = xsubst_ + add(copy_len , NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS )); tmp = div_s( 1, shl( ola_len, 1 ) ); // Q15 tmp = round_fx( L_shl( L_mult( tmp, EVS_PI_FX ), 2 ) ); // Q15 sinq_fx( tmp, 0, ola_len, xfwin ); v_mult16_fixed( xfwin, xfwin, xfwin, ola_len ); /* xfwin = sin^2 of 0..pi/4 */ - pOldW = xfwin + sub( ola_len, 1 ); + pOldW = xfwin + sub(ola_len , 1); pNewW = xfwin; FOR( i = 0; i < ola_len; i++ ) { @@ -3107,7 +3106,7 @@ static void ivas_rec_wtda_fx( ELSE { /* Smoothen onset of ECU frame */ - p_ecu = xsubst_ + add( sub( shl( output_frame, 1 ), Lprot ), timesh ); + p_ecu = xsubst_ + add( sub( shl(output_frame, 1), Lprot ), timesh ); FOR( i = 0; i < xf_len; ( i++, p_ecu++ ) ) { idx = extract_l( L_shr( L_mult0( i, tbl_delta ), 12 ) ); @@ -3268,7 +3267,7 @@ static void rec_wtda_fx( set16_fx( xsubst_ + add( output_frame, Lprot2 ), 0, l ); /* Smoothen onset of ECU frame */ - p_ecu = xsubst_ + sub( output_frame, Lprot2 ); + p_ecu = xsubst_ + sub( output_frame , Lprot2 ); FOR( i = 0; i < xf_len; i++ ) { idx = extract_l( L_shr( L_mult0( i, tbl_delta ), 12 ) ); @@ -3418,7 +3417,7 @@ static Word32 mult_32_32_q( const Word32 a, const Word32 b, const Word16 q ) Mpy_32_32_ss( a, b, &hi, &lo ); #ifdef BASOP_NOGLOB - return L_or( L_shl_o( hi, sub( 32 - 1, q ), &Overflow ), L_lshr( lo, add( q, 1 ) ) ); + return L_or( L_shl_o( hi, sub(32 - 1 , q ), &Overflow ), L_lshr( lo, add(q , 1) ) ); #else return L_or( L_shl( hi, 32 - q - 1 ), L_lshr( lo, q + 1 ) ); #endif @@ -3451,7 +3450,7 @@ static void fir_dwn_fx( { s = L_deposit_l( 0 ); ptr_h = h + 1; - ptr_x = x + sub( i, 1 ); + ptr_x = x + sub(i , 1); FOR( j = 1; j <= i; j++ ) { @@ -3473,7 +3472,7 @@ static void fir_dwn_fx( { s = L_deposit_l( 0 ); ptr_h = h + 1; - ptr_x = x + sub( i, 1 ); + ptr_x = x + sub(i , 1); move16(); FOR( j = 1; j <= K; j++ ) @@ -3653,7 +3652,7 @@ static void fec_ecu_pitch_fx( } - IF( EQ_16( HqVoicing, 1 ) ) + IF( EQ_16(HqVoicing , 1) ) { cb_start = 0; move16(); @@ -3677,7 +3676,7 @@ static void fec_ecu_pitch_fx( { accA = 0; move16(); - IF( EQ_16( i, cb_start ) ) + IF( EQ_16(i , cb_start) ) { accB = 0; move16(); @@ -3717,9 +3716,9 @@ static void fec_ecu_pitch_fx( accCisqrt = Isqrt( accC ); /* Q31 - 3 + tmpQLP*/ - Ryytmp = mult_32_32_q( accA, accCisqrt, sub( 16 + 3, tmpQLP ) ); /*Q 6 -2*tmpQLP + Q31 - 3 + tmpQLP -16 -3 +tmpQLP = Q15*/ - Ryytmp = mult_32_32_q( Ryytmp, accBisqrt, add( 15 - 3, tmpQLP ) ); /*Q15 + Q31 - 3 + tmpQLP -15 + 3- tmpQLP = Q31*/ - Ryy = extract_h( Ryytmp ); /* Q15 */ + Ryytmp = mult_32_32_q( accA, accCisqrt, sub(16 + 3 , tmpQLP) ); /*Q 6 -2*tmpQLP + Q31 - 3 + tmpQLP -16 -3 +tmpQLP = Q15*/ + Ryytmp = mult_32_32_q( Ryytmp, accBisqrt, add(15 - 3 , tmpQLP) ); /*Q15 + Q31 - 3 + tmpQLP -15 + 3- tmpQLP = Q31*/ + Ryy = extract_h( Ryytmp ); /* Q15 */ IF( GT_16( Ryy, *min_corr_fx ) ) @@ -4028,7 +4027,7 @@ static void fec_ecu_dft_fx( IF( EQ_16( *Nfft, N ) ) { - Copy( &target[1], &Tfr16[1], sub( *Nfft, 2 ) ); + Copy( &target[1], &Tfr16[1], sub(*Nfft , 2) ); } ELSE { @@ -4550,7 +4549,7 @@ static void ivas_fec_noise_filling_fx( Copy( synthesis_fx, synthesis_fx + kk, sub( 2 * L, kk ) ); Copy( synthesis_fx + L, gapsynth_fx, L ); - Copy( prevsynth_fx + sub( alignment_point, kk ), synthesis_fx, kk ); + Copy( prevsynth_fx + sub(alignment_point , kk), synthesis_fx, kk ); } #endif @@ -4918,7 +4917,7 @@ static void ivas_hq_phase_ecu_fx( lprot = L_PROT32k; /* 1024 */ move16(); } - ELSE IF( EQ_16( output_frame, L_FRAME16k ) ) + ELSE IF( EQ_16(output_frame , L_FRAME16k) ) { lprot = 512; move16(); @@ -4970,16 +4969,16 @@ static void ivas_hq_phase_ecu_fx( /* seed for own_rand2 */ seed = *time_offs; move16(); - IF( *num_p > 0 ) + IF ( *num_p > 0 ) { - seed = add( seed, plocs[sub( *num_p, 1 )] ); + seed = add( seed, plocs[sub(*num_p , 1)] ); } ivas_subst_spec_fx( plocs, plocsi, num_p, *time_offs, X, mag_chg, ph_dith, old_is_transient, output_frame, &seed, alpha, beta, *beta_mute, Xavg, element_mode, ph_ecu_lookahead, noise_fac ); /* reconstructed frame in tda domain */ - old_dec = prevsynth + sub( shl( output_frame, 1 ), NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) ); + old_dec = prevsynth + sub( shl(output_frame, 1), NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) ); ivas_rec_frame_fx( X, ecu_rec, output_frame, *Q_spec, old_dec, element_mode, num_p, plocs ); *last_fec = 0; @@ -5111,9 +5110,9 @@ static void hq_phase_ecu_fx( /* seed for own_rand2 */ seed = *time_offs; move16(); - IF( *num_p > 0 ) + IF ( *num_p > 0 ) { - seed = add( seed, plocs[sub( *num_p, 1 )] ); + seed = add( seed, plocs[sub(*num_p , 1)] ); } subst_spec_fx( plocs, plocsi, num_p, *time_offs, X, mag_chg, ph_dith, old_is_transient, output_frame, &seed, diff --git a/lib_dec/FEC_adapt_codebook_fx.c b/lib_dec/FEC_adapt_codebook_fx.c index 63c5559c0..cf159210b 100644 --- a/lib_dec/FEC_adapt_codebook_fx.c +++ b/lib_dec/FEC_adapt_codebook_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_dec.h" /* Decoder static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*---------------------------------------------------------------------* diff --git a/lib_dec/FEC_clas_estim_fx.c b/lib_dec/FEC_clas_estim_fx.c index 9591807b7..18cf6b5a8 100644 --- a/lib_dec/FEC_clas_estim_fx.c +++ b/lib_dec/FEC_clas_estim_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" /*-------------------------------------------------------------------* diff --git a/lib_dec/FEC_fx.c b/lib_dec/FEC_fx.c index a029f1dfd..09efc3b5a 100644 --- a/lib_dec/FEC_fx.c +++ b/lib_dec/FEC_fx.c @@ -7,8 +7,7 @@ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Common static table prototypes */ #include "rom_dec.h" /* Decoder static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" #ifdef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* diff --git a/lib_dec/FEC_lsf_estim_fx.c b/lib_dec/FEC_lsf_estim_fx.c index 21efc90e7..36c0f0535 100644 --- a/lib_dec/FEC_lsf_estim_fx.c +++ b/lib_dec/FEC_lsf_estim_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_dec/FEC_pitch_estim_fx.c b/lib_dec/FEC_pitch_estim_fx.c index 1305f1373..ff0732f03 100644 --- a/lib_dec/FEC_pitch_estim_fx.c +++ b/lib_dec/FEC_pitch_estim_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "stl.h" @@ -74,7 +73,7 @@ void FEC_pitch_estim_fx( test(); IF( ( ( element_mode == EVS_MONO ) && EQ_16( last_core, HQ_CORE ) ) || ( element_mode != EVS_MONO && ( EQ_16( last_core, HQ_CORE ) || EQ_16( last_core, TCX_20_CORE ) || EQ_16( last_core, TCX_10_CORE ) ) ) ) { - *bfi_pitch = pitch_buf[sub( shr( L_frame, 6 ), 1 )]; + *bfi_pitch = pitch_buf[sub(shr( L_frame, 6 ) , 1)]; move16(); *bfi_pitch_frame = L_frame; move16(); @@ -105,7 +104,7 @@ void FEC_pitch_estim_fx( ( EQ_16( L_frame, L_FRAME16k ) ) ) || ( EQ_16( coder_type, TRANSITION ) ) ) { - *bfi_pitch = pitch_buf[sub( shr( L_frame, 6 ), 1 )]; + *bfi_pitch = pitch_buf[sub(shr( L_frame, 6 ) , 1)]; move16(); *bfi_pitch_frame = L_frame; move16(); diff --git a/lib_dec/FEC_scale_syn_fx.c b/lib_dec/FEC_scale_syn_fx.c index 9a8da8454..c4fe1bfd7 100644 --- a/lib_dec/FEC_scale_syn_fx.c +++ b/lib_dec/FEC_scale_syn_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------* * Local constants @@ -225,7 +224,7 @@ void FEC_scale_syn_fx( h1[0] = 1024; move16(); /*syn_filt( Aq+(3*(M+1)), M, h1, h1, L_FRAME/2, h1+(M+1), 0 );*/ - E_UTIL_synthesis( 1, Aq + ( 3 * ( M + 1 ) ), h1, h1, L_FRAME / 2, h1 + ( M + 1 ), 0, M ); + E_UTIL_synthesis( 1, Aq + (3 * ( M + 1 ) ), h1, h1, L_FRAME / 2, h1 + ( M + 1 ), 0, M ); /*Compute tilt */ /*rr0 = dotp( h1, h1, L_FRAME/2-1 ) + 0.1f;*/ @@ -272,7 +271,7 @@ void FEC_scale_syn_fx( ener_max = *lp_ener_FEC_max; move32(); test(); - if ( EQ_16( clas, VOICED_TRANSITION ) || ( GE_16( clas, INACTIVE_CLAS ) ) ) + if( EQ_16( clas, VOICED_TRANSITION ) || ( GE_16( clas, INACTIVE_CLAS ) ) ) { ener_max = *lp_ener_FEC_av; move32(); diff --git a/lib_dec/LD_music_post_filter_fx.c b/lib_dec/LD_music_post_filter_fx.c index 454e59ddd..d1d4d1807 100644 --- a/lib_dec/LD_music_post_filter_fx.c +++ b/lib_dec/LD_music_post_filter_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_dec/TonalComponentDetection_fx.c b/lib_dec/TonalComponentDetection_fx.c index c3224a099..6ef4f65da 100644 --- a/lib_dec/TonalComponentDetection_fx.c +++ b/lib_dec/TonalComponentDetection_fx.c @@ -7,16 +7,12 @@ #include #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" #include "cnst.h" #include "rom_basop_util.h" #include "rom_com.h" #include "basop_util.h" -#ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" -#endif /*---------------------------------------------------------------------* diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c index c0267b47f..61ff0b8c3 100644 --- a/lib_dec/acelp_core_dec.c +++ b/lib_dec/acelp_core_dec.c @@ -42,8 +42,7 @@ #include "cnst.h" #include "rom_com.h" #include "prot.h" -#include "prot_fx2.h" -#include "prot_fx1.h" +#include "prot_fx.h" #include "ivas_cnst.h" #include "ivas_prot.h" #include "ivas_rom_com.h" diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index c3cf9be3b..0b1bd4142 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -6,8 +6,7 @@ #include #include "options.h" /* Compilation switches */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "ivas_prot_fx.h" #include "ivas_cnst.h" /* Common constants */ #include "cnst.h" /* Common constants */ diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index 8e84bc1ed..d724b48ae 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -40,8 +40,7 @@ #include "cnst.h" #include "rom_com.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_cnst.h" #include "ivas_prot.h" #include "ivas_rom_com.h" diff --git a/lib_dec/acelp_core_switch_dec_fx.c b/lib_dec/acelp_core_switch_dec_fx.c index 76b8b8ed2..8252de5a1 100644 --- a/lib_dec/acelp_core_switch_dec_fx.c +++ b/lib_dec/acelp_core_switch_dec_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* diff --git a/lib_dec/amr_wb_dec.c b/lib_dec/amr_wb_dec.c index 895af0860..29b2e5a26 100644 --- a/lib_dec/amr_wb_dec.c +++ b/lib_dec/amr_wb_dec.c @@ -43,7 +43,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #endif #ifndef IVAS_FLOAT_FIXED diff --git a/lib_dec/amr_wb_dec_fx.c b/lib_dec/amr_wb_dec_fx.c index 2ea166a70..b5d194c6d 100644 --- a/lib_dec/amr_wb_dec_fx.c +++ b/lib_dec/amr_wb_dec_fx.c @@ -6,8 +6,7 @@ #include "options.h" #include "cnst.h" #include "rom_com.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* diff --git a/lib_dec/ari_dec.c b/lib_dec/ari_dec.c index 334e24195..51badb5bc 100644 --- a/lib_dec/ari_dec.c +++ b/lib_dec/ari_dec.c @@ -39,6 +39,7 @@ #include "options.h" #include "cnst.h" #include "prot.h" +#include "prot_fx.h" #include "stat_com.h" #include "basop_util.h" #include "wmc_auto.h" diff --git a/lib_dec/ari_dec_fx.c b/lib_dec/ari_dec_fx.c index 78d7b799c..8a310b8b8 100644 --- a/lib_dec/ari_dec_fx.c +++ b/lib_dec/ari_dec_fx.c @@ -7,8 +7,7 @@ #include "options.h" #include "cnst.h" #include "rom_com.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*--------------------------------------------------------------- * Ari decode 14 bits routines diff --git a/lib_dec/ari_hm_dec.c b/lib_dec/ari_hm_dec.c index fc45166c1..fbd863d6f 100644 --- a/lib_dec/ari_hm_dec.c +++ b/lib_dec/ari_hm_dec.c @@ -43,7 +43,7 @@ #include "prot.h" #include "rom_com.h" #include "wmc_auto.h" -#include "prot_fx2.h" +#include "prot_fx.h" #ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * DecodeIndex() diff --git a/lib_dec/arith_coder_dec.c b/lib_dec/arith_coder_dec.c index 507a8d2e0..1d23d827d 100644 --- a/lib_dec/arith_coder_dec.c +++ b/lib_dec/arith_coder_dec.c @@ -43,8 +43,7 @@ #include "basop_util.h" #include "basop_proto_func.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-------------------------------------------------------* * tcx_arith_decode() diff --git a/lib_dec/arith_coder_dec_fx.c b/lib_dec/arith_coder_dec_fx.c index ddd4ac478..61bb24b66 100644 --- a/lib_dec/arith_coder_dec_fx.c +++ b/lib_dec/arith_coder_dec_fx.c @@ -7,8 +7,7 @@ #include "options.h" #include "cnst.h" #include "rom_com.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /* Returns: number of bits consumed */ #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/avq_dec_fx.c b/lib_dec/avq_dec_fx.c index d4351b1a5..594030258 100644 --- a/lib_dec/avq_dec_fx.c +++ b/lib_dec/avq_dec_fx.c @@ -8,8 +8,7 @@ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ #include "prot.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------* * Local prototypes diff --git a/lib_dec/bass_psfilter.c b/lib_dec/bass_psfilter.c index 13c822522..c33edf96c 100644 --- a/lib_dec/bass_psfilter.c +++ b/lib_dec/bass_psfilter.c @@ -38,8 +38,7 @@ #include "options.h" #include #include "prot.h" -#include "prot_fx2.h" -#include "prot_fx1.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "cnst.h" #include "stat_dec.h" diff --git a/lib_dec/bass_psfilter_fx.c b/lib_dec/bass_psfilter_fx.c index d3984a7e4..0e46a6aed 100644 --- a/lib_dec/bass_psfilter_fx.c +++ b/lib_dec/bass_psfilter_fx.c @@ -5,8 +5,7 @@ #include #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ #include "rom_dec.h" /* Static table prototypes */ diff --git a/lib_dec/cng_dec.c b/lib_dec/cng_dec.c index cb202f38b..83854f3ae 100644 --- a/lib_dec/cng_dec.c +++ b/lib_dec/cng_dec.c @@ -39,7 +39,6 @@ #include #include "ivas_cnst.h" #include "prot.h" -#include "prot_fx1.h" #include "rom_com.h" #include "wmc_auto.h" diff --git a/lib_dec/cng_dec_fx.c b/lib_dec/cng_dec_fx.c index ab41059c5..b612638f9 100644 --- a/lib_dec/cng_dec_fx.c +++ b/lib_dec/cng_dec_fx.c @@ -7,8 +7,7 @@ #include "cnst.h" #include "rom_com.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_cnst.h" /*Temporary location to be move in prot* when merge is done*/ diff --git a/lib_dec/core_dec_init.c b/lib_dec/core_dec_init.c index d8c00803e..2ae22c470 100644 --- a/lib_dec/core_dec_init.c +++ b/lib_dec/core_dec_init.c @@ -41,7 +41,7 @@ #include "prot.h" #include "rom_com.h" #include "wmc_auto.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-----------------------------------------------------------------------* * open_decoder_LPD() * diff --git a/lib_dec/core_dec_init_fx.c b/lib_dec/core_dec_init_fx.c index 684b21fb2..960ef827d 100644 --- a/lib_dec/core_dec_init_fx.c +++ b/lib_dec/core_dec_init_fx.c @@ -7,9 +7,8 @@ #include #include #include "options.h" -#include "prot_fx1.h" #include "prot.h" //Can be removed later -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "rom_com.h" #include "cnst.h" /* for MIN_CNG_LEV */ diff --git a/lib_dec/core_dec_reconf.c b/lib_dec/core_dec_reconf.c index 13aa708dc..2599303f3 100644 --- a/lib_dec/core_dec_reconf.c +++ b/lib_dec/core_dec_reconf.c @@ -40,7 +40,7 @@ #include "rom_com.h" #include "rom_dec.h" #include "wmc_auto.h" -#include "prot_fx2.h" +#include "prot_fx.h" #ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * reconfig_decoder_LPD_ivas() diff --git a/lib_dec/core_dec_reconf_fx.c b/lib_dec/core_dec_reconf_fx.c index c347fbe8d..13ddbe6f2 100644 --- a/lib_dec/core_dec_reconf_fx.c +++ b/lib_dec/core_dec_reconf_fx.c @@ -6,8 +6,7 @@ #include #include "options.h" #include "basop_util.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" diff --git a/lib_dec/core_dec_switch_fx.c b/lib_dec/core_dec_switch_fx.c index 6aaad23ef..835b93097 100644 --- a/lib_dec/core_dec_switch_fx.c +++ b/lib_dec/core_dec_switch_fx.c @@ -6,8 +6,7 @@ #include #include "options.h" #include "basop_util.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" // Temporarily added diff --git a/lib_dec/core_switching_dec.c b/lib_dec/core_switching_dec.c index 7e7bfbd6c..43431ba30 100644 --- a/lib_dec/core_switching_dec.c +++ b/lib_dec/core_switching_dec.c @@ -40,8 +40,7 @@ #include "cnst.h" #include "rom_com.h" #include "prot.h" -#include "prot_fx2.h" -#include "prot_fx1.h" +#include "prot_fx.h" #include "ivas_cnst.h" #include "wmc_auto.h" diff --git a/lib_dec/core_switching_dec_fx.c b/lib_dec/core_switching_dec_fx.c index 4f8854d7c..8fec002bb 100644 --- a/lib_dec/core_switching_dec_fx.c +++ b/lib_dec/core_switching_dec_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" diff --git a/lib_dec/d_gain2p_fx.c b/lib_dec/d_gain2p_fx.c index 1507c284e..63eff5413 100644 --- a/lib_dec/d_gain2p_fx.c +++ b/lib_dec/d_gain2p_fx.c @@ -4,8 +4,7 @@ #include #include -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "stl.h" #include "rom_com.h" diff --git a/lib_dec/dec2t32_fx.c b/lib_dec/dec2t32_fx.c index e62814cc6..c285cf331 100644 --- a/lib_dec/dec2t32_fx.c +++ b/lib_dec/dec2t32_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*==========================================================================*/ diff --git a/lib_dec/dec4t64_fx.c b/lib_dec/dec4t64_fx.c index 10e9b5b13..452775200 100644 --- a/lib_dec/dec4t64_fx.c +++ b/lib_dec/dec4t64_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "assert.h" /* Static table prototypes */ #ifdef IVAS_FLOAT_FIXED @@ -299,7 +298,7 @@ void dec_1p_N1_fx( /* i = ((index >> N) & 1); */ i = L_shr( index, N ) & 1L; - IF( i != 0 ) + IF ( i != 0 ) { pos1 = add( pos1, NB_POS_FCB_4T ); } @@ -697,7 +696,7 @@ static void fcb_decode_position_fx( FOR( ; PI_select_table[L_sub( 16, l )][temp] >= k; l += 2 ); - IF( GT_32( k, PI_select_table[L_sub( 17, l )][temp] ) ) + IF ( GT_32( k, PI_select_table[L_sub( 17, l )][temp] ) ) { l = L_sub( l, 1 ); } @@ -779,7 +778,7 @@ void D_ACELP_decode_43bit_fx( UWord16 idxs[], Word16 code[], Word16 *pulsestrack move32(); joint_index = L_shr( L_add( L_shl( (Word32) idxs[2], 16 ), (Word32) idxs[1] ), 2 ); - IF( GE_32( joint_index, joint_offset ) ) + IF ( GE_32( joint_index, joint_offset ) ) { joint_index = L_sub( joint_index, joint_offset ); } diff --git a/lib_dec/dec_LPD.c b/lib_dec/dec_LPD.c index 746e18e38..e45e44b47 100644 --- a/lib_dec/dec_LPD.c +++ b/lib_dec/dec_LPD.c @@ -44,7 +44,7 @@ #include "basop_proto_func.h" #include "stat_com.h" #include "wmc_auto.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-------------------------------------------------------------------* diff --git a/lib_dec/dec_LPD_fx.c b/lib_dec/dec_LPD_fx.c index 11afd0184..3b840fc5e 100644 --- a/lib_dec/dec_LPD_fx.c +++ b/lib_dec/dec_LPD_fx.c @@ -6,8 +6,7 @@ #include #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "rom_com.h" #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/dec_ace_fx.c b/lib_dec/dec_ace_fx.c index 8764b1d2a..7c3de901a 100644 --- a/lib_dec/dec_ace_fx.c +++ b/lib_dec/dec_ace_fx.c @@ -8,8 +8,7 @@ #include #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "stl.h" #include "rom_com.h" diff --git a/lib_dec/dec_acelp_fx.c b/lib_dec/dec_acelp_fx.c index b560f7bea..b05086d9f 100644 --- a/lib_dec/dec_acelp_fx.c +++ b/lib_dec/dec_acelp_fx.c @@ -7,8 +7,7 @@ #include #include "options.h" #include "basop_util.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #include "rom_basop_util.h" #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/dec_acelp_tcx_main_fx.c b/lib_dec/dec_acelp_tcx_main_fx.c index 93eb4605f..ad7117763 100644 --- a/lib_dec/dec_acelp_tcx_main_fx.c +++ b/lib_dec/dec_acelp_tcx_main_fx.c @@ -8,8 +8,7 @@ #include "options.h" #include "rom_com.h" #include "stat_com.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #ifdef IVAS_FLOAT_FIXED static void decode_frame_type_fx( Decoder_State *st diff --git a/lib_dec/dec_amr_wb_fx.c b/lib_dec/dec_amr_wb_fx.c index 9682b152b..c9c180aad 100644 --- a/lib_dec/dec_amr_wb_fx.c +++ b/lib_dec/dec_amr_wb_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index e48c4aae2..623b7a823 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "stl.h" #include "basop_util.h" #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/dec_higher_acelp.c b/lib_dec/dec_higher_acelp.c index 304884e71..962bbc686 100644 --- a/lib_dec/dec_higher_acelp.c +++ b/lib_dec/dec_higher_acelp.c @@ -42,7 +42,7 @@ #include "rom_com.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #endif // IVAS_FLOAT_FIXED /*-----------------------------------------------------------------* diff --git a/lib_dec/dec_higher_acelp_fx.c b/lib_dec/dec_higher_acelp_fx.c index 0bc9665d8..a01d8287c 100644 --- a/lib_dec/dec_higher_acelp_fx.c +++ b/lib_dec/dec_higher_acelp_fx.c @@ -5,8 +5,7 @@ #include "options.h" /* Compilation switches */ #include #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ #define IVAS_CODE diff --git a/lib_dec/dec_nelp_fx.c b/lib_dec/dec_nelp_fx.c index 9732ce9f1..4ea42d182 100644 --- a/lib_dec/dec_nelp_fx.c +++ b/lib_dec/dec_nelp_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED /*======================================================================*/ /* FUNCTION : decod_nelp_fx() */ diff --git a/lib_dec/dec_pit_exc_fx.c b/lib_dec/dec_pit_exc_fx.c index 0197fe36d..7ecdb9cdb 100644 --- a/lib_dec/dec_pit_exc_fx.c +++ b/lib_dec/dec_pit_exc_fx.c @@ -5,8 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED /*==========================================================================*/ @@ -150,7 +149,7 @@ void dec_pit_exc_fx( test(); test(); test(); - IF( ( ( GE_32( st_fx->core_brate, MIN_RATE_FCB ) || ( EQ_16( st_fx->GSC_noisy_speech, 1 ) && ( ( EQ_16( st_fx->L_frame, L_FRAME ) && GE_32( st_fx->core_brate, ACELP_13k20 ) ) || ( EQ_16( st_fx->L_frame, L_FRAME16k ) && GE_32( st_fx->core_brate, GSC_H_RATE_STG ) ) || st_fx->GSC_IVAS_mode == 0 ) ) ) && EQ_16( L_subfr_fx, L_SUBFR ) ) ) + IF ( ( ( GE_32( st_fx->core_brate, MIN_RATE_FCB ) || ( EQ_16( st_fx->GSC_noisy_speech, 1 ) && ( ( EQ_16( st_fx->L_frame, L_FRAME ) && GE_32( st_fx->core_brate, ACELP_13k20 ) ) || ( EQ_16( st_fx->L_frame, L_FRAME16k ) && GE_32( st_fx->core_brate, GSC_H_RATE_STG ) ) || st_fx->GSC_IVAS_mode == 0 ) ) ) && EQ_16( L_subfr_fx, L_SUBFR ) ) ) { use_fcb = 1; move16(); diff --git a/lib_dec/dec_post_fx.c b/lib_dec/dec_post_fx.c index 2552a15ec..a8580c8ce 100644 --- a/lib_dec/dec_post_fx.c +++ b/lib_dec/dec_post_fx.c @@ -3,8 +3,7 @@ ====================================================================================*/ #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "rom_dec.h" #include "rom_com.h" diff --git a/lib_dec/dec_ppp_fx.c b/lib_dec/dec_ppp_fx.c index cd4d6462f..19642686d 100644 --- a/lib_dec/dec_ppp_fx.c +++ b/lib_dec/dec_ppp_fx.c @@ -5,8 +5,7 @@ #include #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED /*===================================================================*/ /* FUNCTION : void decod_ppp_fx () */ @@ -78,7 +77,7 @@ ivas_error decod_ppp_fx( deemph_lpc_fx( p_Aq_curr_fx, p_Aq_old_fx, LPC_de_curr_fx, LPC_de_old_fx, 0 ); /*LPC in Q12 */ - IF( ( error = ppp_voiced_decoder_fx( st_fx, excQ_ppp_fx, LPC_de_curr_fx, exc_fx, pitch_fx, bfi ) ) != IVAS_ERR_OK ) + IF ( ( error = ppp_voiced_decoder_fx( st_fx, excQ_ppp_fx, LPC_de_curr_fx, exc_fx, pitch_fx, bfi ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/dec_prm.c b/lib_dec/dec_prm.c index c10b3f587..fc3f4c511 100644 --- a/lib_dec/dec_prm.c +++ b/lib_dec/dec_prm.c @@ -41,7 +41,7 @@ #include "rom_com.h" #include "prot.h" #include "wmc_auto.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-------------------------------------------------------------------* * getTCXMode_ivas() @@ -217,7 +217,7 @@ void getTCXMode_ivas_fx( /*Core extended mode mapping for correct PLC classification*/ st->core_ext_mode = st->coder_type; move16(); - if ( EQ_16( st->coder_type, INACTIVE ) ) + if( EQ_16( st->coder_type, INACTIVE ) ) { st->core_ext_mode = UNVOICED; move16(); diff --git a/lib_dec/dec_prm_fx.c b/lib_dec/dec_prm_fx.c index f238f3e3a..795cb07cb 100644 --- a/lib_dec/dec_prm_fx.c +++ b/lib_dec/dec_prm_fx.c @@ -9,8 +9,7 @@ #include #include "rom_com.h" #include "stl.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #ifdef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* @@ -135,7 +134,7 @@ void dec_prm_hm_fx( { tmp = 0; move16(); - if ( GE_16( L_frame, 256 ) ) + if( GE_16( L_frame, 256 ) ) { tmp = 1; move16(); @@ -225,7 +224,7 @@ void getTCXparam_fx( nSubframes = 1; move16(); - if ( EQ_16( core, TCX_10_CORE ) ) + if( EQ_16( core, TCX_10_CORE ) ) { nSubframes = 2; move16(); @@ -353,7 +352,7 @@ void getTCXparam_fx( lg = add( lg, st->hTcxCfg->tcx_offset ); lgFB = add( lgFB, shr( lgFB, sub( 3, nSubframes ) ) ); - if ( st->hTcxCfg->lfacNext < 0 ) + if( st->hTcxCfg->lfacNext < 0 ) { lg = sub( lg, st->hTcxCfg->lfacNext ); } @@ -600,7 +599,7 @@ void dec_prm_fx( Mpy_32_16_ss( st->total_brate, 5243, &L_tmp, &lsb ); /* 5243 is 1/50 in Q18. (0+18-15=3) */ num_bits = extract_l( L_shr( L_tmp, 3 ) ); /* Q0 */ assert( num_bits == st->total_brate / 50 ); - if ( EQ_16( FrameSizeConfig[n].frame_bits, num_bits ) ) + if( EQ_16( FrameSizeConfig[n].frame_bits, num_bits ) ) { st->bits_frame_core = add( st->bits_frame_core, FrameSizeConfig[n].bandwidth_bits ); BREAK; @@ -650,7 +649,7 @@ void dec_prm_fx( ind = get_next_indice( st, 2 ); st->clas_dec = ONSET; move16(); - if ( ind == 0 ) + if( ind == 0 ) { st->clas_dec = UNVOICED_CLAS; move16(); @@ -659,7 +658,7 @@ void dec_prm_fx( { st->clas_dec = UNVOICED_TRANSITION; move16(); - if ( GE_16( st->last_good, VOICED_TRANSITION ) ) + if( GE_16( st->last_good, VOICED_TRANSITION ) ) { st->clas_dec = VOICED_TRANSITION; move16(); @@ -851,7 +850,7 @@ void dec_prm_fx( st->hTcxCfg->tcx_last_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode; move16(); test(); - if ( ( NE_16( st->core, TCX_10_CORE ) ) && ( EQ_16( st->hTcxCfg->tcx_curr_overlap_mode, FULL_OVERLAP ) ) ) + if( ( NE_16( st->core, TCX_10_CORE ) ) && ( EQ_16( st->hTcxCfg->tcx_curr_overlap_mode, FULL_OVERLAP ) ) ) { st->hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW; move16(); @@ -1078,7 +1077,7 @@ void dec_prm_fx( n = ACELP_LTP_BITS_SFR[st->acelp_cfg.ltp_mode][sfr]; move16(); - IF( n != 0 ) + IF ( n != 0 ) { prm[j] = get_next_indice( st, n ); j = add( j, 1 ); @@ -1086,7 +1085,7 @@ void dec_prm_fx( } /* Adaptive codebook filtering (1 bit) */ - IF( EQ_16( st->acelp_cfg.ltf_mode, 2 ) ) + IF ( EQ_16( st->acelp_cfg.ltf_mode, 2 ) ) { prm[j] = get_next_indice( st, 1 ); j = add( j, 1 ); @@ -1188,7 +1187,7 @@ void dec_prm_fx( /* Pitch lag (5, or 8 bits) */ n = ACELP_LTP_BITS_SFR[ltp_mode][sfr]; move16(); - IF( n != 0 ) + IF ( n != 0 ) { prm[j] = get_next_indice( st, n ); j = add( j, 1 ); @@ -1320,7 +1319,7 @@ void dec_prm_fx( IF( st->hTcxCfg->fIsTNSAllowed ) { - SetTnsConfig( st->hTcxCfg, 1, (Word16) EQ_16( st->last_core_from_bs, ACELP_CORE ) ); + SetTnsConfig( st->hTcxCfg, 1, (Word16)EQ_16(st->last_core_from_bs , ACELP_CORE) ); ReadTnsData( st->hTcxCfg->pCurrentTnsConfig, st, &nTnsBits, prm + j, &nTnsParams ); j = add( j, nTnsParams ); diff --git a/lib_dec/dec_tcx.c b/lib_dec/dec_tcx.c index 06c9bc5ba..ab4558791 100644 --- a/lib_dec/dec_tcx.c +++ b/lib_dec/dec_tcx.c @@ -37,7 +37,7 @@ #include #include "prot.h" #include "ivas_prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include #include "options.h" #include @@ -45,8 +45,6 @@ #include "cnst.h" #include "wmc_auto.h" #include "ivas_rom_com.h" -#include "prot_fx1.h" -#include "prot_fx2.h" #include "ivas_prot_fx.h" #ifndef IVAS_FLOAT_FIXED_UNIT_TESTING #include "debug.h" diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 96fcfb25d..064ae2849 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -5,8 +5,7 @@ #include #include #include -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "stl.h" #include "options.h" diff --git a/lib_dec/dec_tran_fx.c b/lib_dec/dec_tran_fx.c index 95c0fb1ce..2ba42b675 100644 --- a/lib_dec/dec_tran_fx.c +++ b/lib_dec/dec_tran_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED /*======================================================================*/ /* FUNCTION : decod_tran_fx() */ diff --git a/lib_dec/dec_uv_fx.c b/lib_dec/dec_uv_fx.c index 1b6c4b424..63be30656 100644 --- a/lib_dec/dec_uv_fx.c +++ b/lib_dec/dec_uv_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED static void gain_dec_gacelp_uv_fx( Word16 index, /* i : Quantization index vector Q0 */ diff --git a/lib_dec/decision_matrix_dec_fx.c b/lib_dec/decision_matrix_dec_fx.c index 8c9a12b69..7362cb20b 100644 --- a/lib_dec/decision_matrix_dec_fx.c +++ b/lib_dec/decision_matrix_dec_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "stat_dec.h" #include "rom_com.h" #include "stl.h" diff --git a/lib_dec/dlpc_avq_fx.c b/lib_dec/dlpc_avq_fx.c index 07f20ce6a..1cb91e22f 100644 --- a/lib_dec/dlpc_avq_fx.c +++ b/lib_dec/dlpc_avq_fx.c @@ -6,8 +6,7 @@ #include #include "options.h" #include -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #ifdef IVAS_FLOAT_FIXED /* Constants */ diff --git a/lib_dec/dlpc_stoch_fx.c b/lib_dec/dlpc_stoch_fx.c index 742f76dd3..f42d7d457 100644 --- a/lib_dec/dlpc_stoch_fx.c +++ b/lib_dec/dlpc_stoch_fx.c @@ -8,8 +8,7 @@ #include #include "options.h" #include "basop_util.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #ifdef IVAS_FLOAT_FIXED /* Constants */ #define M 16 diff --git a/lib_dec/er_dec_acelp_fx.c b/lib_dec/er_dec_acelp_fx.c index ca23584a1..3a8a3de62 100644 --- a/lib_dec/er_dec_acelp_fx.c +++ b/lib_dec/er_dec_acelp_fx.c @@ -8,8 +8,7 @@ #include #include "options.h" #include -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "rom_dec.h" #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index c3cf2f0ab..a4102230e 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -6,8 +6,7 @@ #include #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "rom_dec.h" #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/er_scale_syn_fx.c b/lib_dec/er_scale_syn_fx.c index ed78d8842..652041e67 100644 --- a/lib_dec/er_scale_syn_fx.c +++ b/lib_dec/er_scale_syn_fx.c @@ -6,8 +6,7 @@ #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "cnst.h" #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/er_sync_exc_fx.c b/lib_dec/er_sync_exc_fx.c index f4535152f..48f811e71 100644 --- a/lib_dec/er_sync_exc_fx.c +++ b/lib_dec/er_sync_exc_fx.c @@ -8,8 +8,7 @@ #include #include "options.h" #include "cnst.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop32.h" #include "basop_util.h" #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/er_util_fx.c b/lib_dec/er_util_fx.c index ee0c52b8e..93ccaed26 100644 --- a/lib_dec/er_util_fx.c +++ b/lib_dec/er_util_fx.c @@ -5,8 +5,7 @@ #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/evs_dec.c b/lib_dec/evs_dec.c index 96c3b5792..d5498c622 100644 --- a/lib_dec/evs_dec.c +++ b/lib_dec/evs_dec.c @@ -42,8 +42,7 @@ #include "prot.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif #ifndef IVAS_FLOAT_FIXED diff --git a/lib_dec/evs_dec_fx.c b/lib_dec/evs_dec_fx.c index e258c68e9..690e59b05 100644 --- a/lib_dec/evs_dec_fx.c +++ b/lib_dec/evs_dec_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index e4bab0bf9..e5a7bb666 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -45,8 +45,7 @@ #include "ivas_prot.h" #include "ivas_rom_dec.h" #include "ivas_rom_com_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #include "basop_util.h" #include "rom_basop_util.h" diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index a97ac3809..0984c7698 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -9,8 +9,7 @@ #include "options.h" #include "rom_com.h" #include "stat_dec.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #include "basop_util.h" #include "rom_basop_util.h" diff --git a/lib_dec/gain_dec_fx.c b/lib_dec/gain_dec_fx.c index ae4a95966..d793092e9 100644 --- a/lib_dec/gain_dec_fx.c +++ b/lib_dec/gain_dec_fx.c @@ -5,8 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*===========================================================================*/ diff --git a/lib_dec/gaus_dec_fx.c b/lib_dec/gaus_dec_fx.c index 516dfc498..ea5ab985c 100644 --- a/lib_dec/gaus_dec_fx.c +++ b/lib_dec/gaus_dec_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*---------------------------------------------------------------------* * Local function prototypes diff --git a/lib_dec/gs_dec_amr_wb_fx.c b/lib_dec/gs_dec_amr_wb_fx.c index 4ad733294..1ada34c63 100644 --- a/lib_dec/gs_dec_amr_wb_fx.c +++ b/lib_dec/gs_dec_amr_wb_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------* @@ -441,7 +440,7 @@ void improv_amr_wb_gs_fx( IF( ( locattack == 0 && LE_32( core_brate, ACELP_12k65 ) ) && ( ( LT_32( core_brate, ACELP_8k85 ) && NE_16( clas, AUDIO_CLAS ) && ( clas == UNVOICED_CLAS || EQ_16( clas, VOICED_TRANSITION ) ) ) || - ( coder_type == INACTIVE ) ) ) + ( coder_type == INACTIVE ) ) ) #endif { /*------------------------------------------------------------* @@ -463,18 +462,18 @@ void improv_amr_wb_gs_fx( { Copy( Aq_fx, Aq_orig, NB_SUBFR * ( M + 1 ) ); - exp_a = norm_s( Aq_fx[imult1616( i, ( M + 1 ) )] ); - exp_b = norm_s( old_Aq_fx[imult1616( i, ( M + 1 ) )] ); + exp_a = norm_s( Aq_fx[imult1616(i , ( M + 1 ))] ); + exp_b = norm_s( old_Aq_fx[imult1616(i , ( M + 1 ))] ); exp_diff = sub( exp_a, exp_b ); IF( exp_diff > 0 ) { - Scale_sig( &old_Aq_fx[imult1616( i, ( M + 1 ) )], ( M + 1 ), negate( exp_diff ) ); + Scale_sig( &old_Aq_fx[imult1616(i , ( M + 1 ))], ( M + 1 ), negate( exp_diff ) ); } ELSE { - Scale_sig( &Aq_fx[imult1616( i, ( M + 1 ) )], ( M + 1 ), exp_diff ); + Scale_sig( &Aq_fx[imult1616(i , ( M + 1 ))], ( M + 1 ), exp_diff ); } - FOR( j = imult1616( i, ( M + 1 ) ); j < imult1616( add( i, 1 ), ( M + 1 ) ); j++ ) + FOR( j = imult1616(i , ( M + 1 )); j < imult1616(add( i , 1 ) , ( M + 1 )); j++ ) { Aq_fx[j] = round_fx( L_mac( L_mult( ALP_FX, old_Aq_fx[j] ), MALP_FX, Aq_fx[j] ) ); @@ -490,12 +489,12 @@ void improv_amr_wb_gs_fx( FOR( i = 0; i < NB_SUBFR; i++ ) { #ifdef BASOP_NOGLOB - enr_LP_new = Enr_1_Az_fx_o( Aq_fx + imult1616( i, ( M + 1 ) ), L_SUBFR, &Overflow ); + enr_LP_new = Enr_1_Az_fx_o( Aq_fx + imult1616(i , ( M + 1 )), L_SUBFR, &Overflow ); #else enr_LP_new = Enr_1_Az_fx( Aq_fx + i * ( M + 1 ), L_SUBFR ); #endif test(); - IF( GT_16( shr( enr_LP_new, 7 ), enr_LP_old ) || Overflow ) + IF( GT_16( shr( enr_LP_new, 7 ) , enr_LP_old ) || Overflow ) { /* filter is unstable, do not modify the excitation */ Copy( Aq_orig, Aq_fx, NB_SUBFR * ( M + 1 ) ); diff --git a/lib_dec/gs_dec_fx.c b/lib_dec/gs_dec_fx.c index bd5f9b7f8..9310ee442 100644 --- a/lib_dec/gs_dec_fx.c +++ b/lib_dec/gs_dec_fx.c @@ -7,8 +7,7 @@ #include "cnst.h" #include "rom_com.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_cnst.h" #ifdef IVAS_FLOAT_FIXED /*=========================================================================*/ @@ -484,7 +483,7 @@ void decod_audio_fx( * Update BWE excitation *--------------------------------------------------------------------------------------*/ - IF( st_fx->hBWE_TD != NULL ) + IF ( st_fx->hBWE_TD != NULL ) { set16_fx( voice_factors, 0, NB_SUBFR16k ); IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) @@ -568,7 +567,7 @@ void decod_audio_ivas_fx( GSC_DEC_HANDLE hGSCDec; hGSCDec = st_fx->hGSCDec; - move16(); // Es_pred + move16(); //Es_pred /*---------------------------------------------------------------* * Initialization @@ -632,7 +631,7 @@ void decod_audio_ivas_fx( hGSCDec->noise_lev = NOISE_LEVEL_SP3; move16(); #if 1 // def ADD_LRTD - IF( GE_16( st_fx->GSC_IVAS_mode, 1 ) ) + IF ( GE_16( st_fx->GSC_IVAS_mode, 1 ) ) { test(); if ( LT_32( st_fx->core_brate, GSC_L_RATE_STG ) && LT_32( st_fx->GSC_IVAS_mode, 3 ) ) @@ -690,7 +689,7 @@ void decod_audio_ivas_fx( nb_subfr = SWNB_SUBFR; move16(); - IF( GE_32( st_fx->core_brate, ACELP_9k60 ) ) + IF ( GE_32( st_fx->core_brate, ACELP_9k60 ) ) { nbits = 1; move16(); @@ -721,7 +720,7 @@ void decod_audio_ivas_fx( if ( EQ_16( shr( nb_frame_flg, 1 ), 1 ) ) { - nb_subfr = shl( nb_subfr, 1 ); + nb_subfr = shl(nb_subfr, 1); } #endif } @@ -766,7 +765,7 @@ void decod_audio_ivas_fx( pit_band_idx = (Word16) get_next_indice( st_fx, nbits ); } - IF( pit_band_idx != 0 ) + IF ( pit_band_idx != 0 ) { IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) { @@ -779,7 +778,7 @@ void decod_audio_ivas_fx( } /* detect bit errors in the bitstream */ - IF( GT_16( pit_band_idx, 13 ) ) /* The maximum decodable index is 10 + BAND1k2 (3) = 13 */ + IF ( GT_16( pit_band_idx, 13 ) ) /* The maximum decodable index is 10 + BAND1k2 (3) = 13 */ { pit_band_idx = 13; move16(); @@ -836,7 +835,7 @@ void decod_audio_ivas_fx( #else dec_pit_exc_fx( st_fx, Aq, st_fx->coder_type, Es_pred, pitch_buf, code, exc, bwe_exc, nb_subfr, gain_buf ); #endif - IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) + IF ( LT_32( st_fx->core_brate, ACELP_9k60 ) ) { minimum_fx( pitch_buf, shr( st_fx->L_frame, 6 ), &low_pit ); low_pit = shr( low_pit, 6 ); /*Q6 -> Q0 */ @@ -990,7 +989,7 @@ void decod_audio_ivas_fx( } #if 1 // ydef ADD_LRTD - IF( EQ_16( st_fx->idchan, 1 ) ) + IF ( EQ_16( st_fx->idchan, 1 ) ) { tmp_nb_bits_tot = add( tmp_nb_bits_tot, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ); if ( EQ_16( st_fx->tdm_LRTD_flag, 1 ) ) @@ -1017,7 +1016,7 @@ void decod_audio_ivas_fx( * Update BWE excitation *--------------------------------------------------------------------------------------*/ - IF( st_fx->hBWE_TD != NULL ) + IF ( st_fx->hBWE_TD != NULL ) { set16_fx( voice_factors, 0, NB_SUBFR16k ); IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) @@ -1288,7 +1287,7 @@ void gsc_dec_fx( { FOR( j = 0; j < shl( nb_subbands, 4 ); j++ ) { - IF( concat_out[j] > 0 ) + IF ( concat_out[j] > 0 ) { seed_init = extract_l( L_shl( seed_init, 3 ) ); } @@ -1490,7 +1489,7 @@ void gsc_dec_ivas_fx( move16(); WHILE( LT_16( i, SIZE_BRATE_INTERMED_TBL ) ) { - IF( LE_32( st_fx->core_brate, brate_intermed_tbl[i] ) ) + IF ( LE_32( st_fx->core_brate, brate_intermed_tbl[i] ) ) { break; } @@ -1570,7 +1569,7 @@ void gsc_dec_ivas_fx( st_fx->L_frame, st_fx->element_mode, st_fx->GSC_IVAS_mode ); #if 1 // def ADD_LRTD - IF( bit == 0 ) + IF ( bit == 0 ) { set16_fx( concat_out, 0, L_FRAME16k ); } diff --git a/lib_dec/hdecnrm_fx.c b/lib_dec/hdecnrm_fx.c index 4894ee0e8..c97344274 100644 --- a/lib_dec/hdecnrm_fx.c +++ b/lib_dec/hdecnrm_fx.c @@ -3,8 +3,7 @@ ====================================================================================*/ #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_dec.h" /*--------------------------------------------------------------------------*/ diff --git a/lib_dec/hf_synth.c b/lib_dec/hf_synth.c index 38aaab11f..b2589a9bc 100644 --- a/lib_dec/hf_synth.c +++ b/lib_dec/hf_synth.c @@ -42,8 +42,7 @@ #include "rom_com.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" -#include "prot_fx1.h" +#include "prot_fx.h" #include "basop32.h" #endif diff --git a/lib_dec/hf_synth_fx.c b/lib_dec/hf_synth_fx.c index a40ae1a30..4c1e2f66a 100644 --- a/lib_dec/hf_synth_fx.c +++ b/lib_dec/hf_synth_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "basop32.h" #include "prot.h" @@ -116,7 +115,7 @@ void hf_synth_fx( p_Aq = Aq; FOR( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) { - hf_synthesis_fx( hBWE_zero, core_brate, output_subfr, p_Aq, &exc[i_subfr], Q_exc, &synth[i_subfr], &synth16k[imult3216( (Word32) i_subfr, output_subfr ) / L_SUBFR], + hf_synthesis_fx( hBWE_zero, core_brate, output_subfr, p_Aq, &exc[i_subfr], Q_exc, &synth[i_subfr], &synth16k[imult3216((Word32)i_subfr , output_subfr) / L_SUBFR], Q_syn2, delay_syn_hf, memExp1, mem_hp_interp, extl, CNG_mode ); p_Aq += ( M + 1 ); @@ -347,8 +346,8 @@ static void hf_synthesis_fx( /* delay by 5 samples @16kHz to compensate CLDFB resampling delay (20samples) and HP filtering delay (roughly 15 samples) */ delay = NS2SA( 16000, DELAY_CLDFB_NS ) - 15; - Copy( HF_syn + sub( L_SUBFR16k, delay ), temp_buffer, delay ); - Copy( HF_syn, HF_syn + delay, sub( L_SUBFR16k, delay ) ); + Copy( HF_syn + sub(L_SUBFR16k , delay), temp_buffer, delay ); + Copy( HF_syn, HF_syn + delay, sub(L_SUBFR16k , delay) ); Copy( delay_syn_hf, HF_syn, delay ); Copy( temp_buffer, delay_syn_hf, delay ); @@ -656,7 +655,7 @@ static void filt_6k_7k_scale_fx( Word16 j; L_tmp = 0; move32(); - FOR( j = 0; j < 31; j++ ) + FOR ( j = 0; j < 31; j++ ) { #ifdef BASOP_NOGLOB L_tmp = L_mac_o( L_tmp, x[i + j], fir_6k_7k_fx[j], &Overflow ); @@ -1150,7 +1149,7 @@ void hf_synth_amr_wb_fx( pt4 = signum; FOR( i = 0; i < L_SUBFR16k; i++ ) { - IF( *pt1 > 0 ) + IF ( *pt1 > 0 ) { *pt1 = mult_r( *pt1, g ); /*qdct */ move16(); @@ -1264,7 +1263,7 @@ void hf_synth_amr_wb_fx( FOR( i = 240; i < L_FRAME16k; i++ ) { *pt1 = mult_r( *pt1, scale ); /*qdct */ - IF( GT_16( i, 255 ) ) + IF ( GT_16( i, 255 ) ) { *pt1 = mult_r( 19505, *pt1 ); move16(); @@ -1674,7 +1673,7 @@ static void envelope_fx( } /* LPC envelope level estimate */ - L_tmp = 0; + L_tmp = 0 ; move32(); pt1 = Ap; pt2 = exp_tab_p_fx; diff --git a/lib_dec/hq_classifier_dec_fx.c b/lib_dec/hq_classifier_dec_fx.c index 3a2d3f511..8b49892ee 100644 --- a/lib_dec/hq_classifier_dec_fx.c +++ b/lib_dec/hq_classifier_dec_fx.c @@ -3,8 +3,7 @@ ====================================================================================*/ #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif @@ -39,7 +38,7 @@ Word16 ivas_hq_classifier_dec_fx( /* o : Consumed bits test(); IF( ( EQ_16( length, L_SPEC32k ) || EQ_16( length, L_SPEC48k ) ) && LE_32( core_brate, max_brate ) ) { - *hqswb_clas = (Word16) get_next_indice( st_fx, 2 ); + *hqswb_clas = (Word16)get_next_indice( st_fx, 2 ); move16(); bits = 2; move16(); @@ -70,7 +69,7 @@ Word16 ivas_hq_classifier_dec_fx( /* o : Consumed bits test(); IF( LE_32( st_fx->core_brate, HQ_32k ) && *hqswb_clas == HQ_NORMAL ) { - IF( EQ_16( length, L_SPEC32k ) ) + IF ( EQ_16( length, L_SPEC32k ) ) { *hqswb_clas = HQ_GEN_SWB; move16(); diff --git a/lib_dec/hq_conf_fec_fx.c b/lib_dec/hq_conf_fec_fx.c index dacd23a76..dfc19c542 100644 --- a/lib_dec/hq_conf_fec_fx.c +++ b/lib_dec/hq_conf_fec_fx.c @@ -5,8 +5,7 @@ #include #include "options.h" #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "cnst.h" diff --git a/lib_dec/hq_core_dec_fx.c b/lib_dec/hq_core_dec_fx.c index fb0f5f024..ccdb58986 100644 --- a/lib_dec/hq_core_dec_fx.c +++ b/lib_dec/hq_core_dec_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ #ifdef IVAS_FLOAT_FIXED #include "prot.h" diff --git a/lib_dec/hq_env_dec_fx.c b/lib_dec/hq_env_dec_fx.c index 0226c32f3..20c64df45 100644 --- a/lib_dec/hq_env_dec_fx.c +++ b/lib_dec/hq_env_dec_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/hq_hr_dec_fx.c b/lib_dec/hq_hr_dec_fx.c index d42acd11b..602df7dd3 100644 --- a/lib_dec/hq_hr_dec_fx.c +++ b/lib_dec/hq_hr_dec_fx.c @@ -3,8 +3,7 @@ ====================================================================================*/ #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" diff --git a/lib_dec/hq_lr_dec_fx.c b/lib_dec/hq_lr_dec_fx.c index a454af97a..a954f98aa 100644 --- a/lib_dec/hq_lr_dec_fx.c +++ b/lib_dec/hq_lr_dec_fx.c @@ -7,8 +7,7 @@ #include "options.h" #include "cnst.h" #include "rom_dec.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" /*--------------------------------------------------------------------------* diff --git a/lib_dec/igf_dec.c b/lib_dec/igf_dec.c index c6d72f5d8..451b7e29b 100644 --- a/lib_dec/igf_dec.c +++ b/lib_dec/igf_dec.c @@ -44,7 +44,7 @@ #include "ivas_prot.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #endif diff --git a/lib_dec/igf_dec_fx.c b/lib_dec/igf_dec_fx.c index cdcdfab1f..c2acb5be5 100644 --- a/lib_dec/igf_dec_fx.c +++ b/lib_dec/igf_dec_fx.c @@ -11,8 +11,7 @@ #include "prot.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "cnst.h" #include "stat_dec.h" #include "basop_util.h" diff --git a/lib_dec/igf_scf_dec_fx.c b/lib_dec/igf_scf_dec_fx.c index b9af11db1..221b9b7a4 100644 --- a/lib_dec/igf_scf_dec_fx.c +++ b/lib_dec/igf_scf_dec_fx.c @@ -8,8 +8,7 @@ #include #include "options.h" #include "stl.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "stat_dec.h" #include "basop_util.h" diff --git a/lib_dec/init_dec.c b/lib_dec/init_dec.c index 3a56b99e5..908738df3 100644 --- a/lib_dec/init_dec.c +++ b/lib_dec/init_dec.c @@ -40,12 +40,9 @@ #include "ivas_cnst.h" #include "rom_com.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif diff --git a/lib_dec/init_dec_fx.c b/lib_dec/init_dec_fx.c index ba95b6933..05cda5a46 100644 --- a/lib_dec/init_dec_fx.c +++ b/lib_dec/init_dec_fx.c @@ -3,8 +3,7 @@ ====================================================================================*/ #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ #include "stl.h" /* required for wmc_tool */ diff --git a/lib_dec/inov_dec.c b/lib_dec/inov_dec.c index ad5df5d4a..03831b28c 100644 --- a/lib_dec/inov_dec.c +++ b/lib_dec/inov_dec.c @@ -38,7 +38,7 @@ #include "options.h" #include "cnst.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "rom_com.h" #include "wmc_auto.h" diff --git a/lib_dec/inov_dec_fx.c b/lib_dec/inov_dec_fx.c index 24c82e20a..9377005a0 100644 --- a/lib_dec/inov_dec_fx.c +++ b/lib_dec/inov_dec_fx.c @@ -5,8 +5,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ #ifdef IVAS_FLOAT_FIXED /*======================================================================*/ diff --git a/lib_dec/ivas_agc_dec_fx.c b/lib_dec/ivas_agc_dec_fx.c index 2bf3ad9ca..26aad59c1 100644 --- a/lib_dec/ivas_agc_dec_fx.c +++ b/lib_dec/ivas_agc_dec_fx.c @@ -35,7 +35,7 @@ #ifdef IVAS_FLOAT_FIXED #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" #include diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 0f92acf2d..191bea1c1 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -44,8 +44,7 @@ #include "ivas_rom_binauralRenderer.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_rom_com_fx.h" #include "debug.h" #endif diff --git a/lib_dec/ivas_core_dec.c b/lib_dec/ivas_core_dec.c index 1ef2e9d41..9d2aa6d7e 100644 --- a/lib_dec/ivas_core_dec.c +++ b/lib_dec/ivas_core_dec.c @@ -42,8 +42,7 @@ #include "ivas_rom_com.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c index ccb39cadf..a66795dca 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig.c +++ b/lib_dec/ivas_corecoder_dec_reconfig.c @@ -35,8 +35,7 @@ #include "ivas_prot.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif // IVAS_FLOAT_FIXED #include "prot.h" #include diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index 4faab3eb7..f0e4bfece 100644 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -38,7 +38,7 @@ #include "rom_com.h" #include "prot.h" #include "ivas_prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_rom_com.h" #include "wmc_auto.h" #include diff --git a/lib_dec/ivas_cpe_dec_fx.c b/lib_dec/ivas_cpe_dec_fx.c index 1a97e84b5..a246eb92f 100644 --- a/lib_dec/ivas_cpe_dec_fx.c +++ b/lib_dec/ivas_cpe_dec_fx.c @@ -40,8 +40,7 @@ #include "prot.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_rom_com.h" #include "wmc_auto.h" #include diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index ae75fcf2f..2d84e7604 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -36,8 +36,6 @@ #include #include "cnst.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" #include "ivas_prot.h" #include "ivas_prot_rend.h" #include "ivas_cnst.h" @@ -46,8 +44,7 @@ #include "ivas_rom_rend.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "ivas_rom_com_fx.h" #include "ivas_prot_fx.h" #endif diff --git a/lib_dec/ivas_dirac_output_synthesis_cov.c b/lib_dec/ivas_dirac_output_synthesis_cov.c index c11dda7cc..10660be2d 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov.c @@ -49,8 +49,7 @@ #include "wmc_auto.h" #include "rom_dec.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 6119dde7d..193324414 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -42,8 +42,7 @@ #include #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #define IVAS_FLOAT_FIXED_TO_BE_REMOVED #endif // IVAS_FLOAT_FIXED diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 5a62afa9e..71a9514d8 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -39,7 +39,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif // IVAS_FLOAT_FIXED #define IVAS_FLOAT_FIXED_TO_BE_REMOVED diff --git a/lib_dec/ivas_ism_dtx_dec.c b/lib_dec/ivas_ism_dtx_dec.c index d891ccfca..7a1494764 100644 --- a/lib_dec/ivas_ism_dtx_dec.c +++ b/lib_dec/ivas_ism_dtx_dec.c @@ -39,7 +39,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #endif /*-------------------------------------------------------------------* diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 2c2e61b70..e28a1214a 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -38,8 +38,7 @@ #include "ivas_rom_com.h" #include "ivas_rom_com_fx.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_stat_enc.h" #include #include "wmc_auto.h" diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 5aad96908..3f1cfbd1f 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -41,8 +41,7 @@ #include "ivas_rom_dec.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "debug.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_rom_com_fx.h" diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 11fd356f4..7950e6db5 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -34,8 +34,7 @@ #include "options.h" #include "ivas_cnst.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" #include "ivas_prot_rend.h" diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 85963d371..42605102d 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -46,8 +46,7 @@ #ifdef DUMPS_ENABLED #include "debug.h" #endif // DUMPS_ENABLED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #define float_to_fixed( n, factor ) ( round( n * ( 1 << factor ) ) ) #define fixed_to_float( n, factor ) ( (float) n / ( 1 << factor ) ) diff --git a/lib_dec/ivas_lfe_dec_fx.c b/lib_dec/ivas_lfe_dec_fx.c index f615bbd1e..775535614 100644 --- a/lib_dec/ivas_lfe_dec_fx.c +++ b/lib_dec/ivas_lfe_dec_fx.c @@ -34,8 +34,7 @@ #include "options.h" #ifdef IVAS_FLOAT_FIXED #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" #include "ivas_rom_com.h" diff --git a/lib_dec/ivas_lfe_plc_fx.c b/lib_dec/ivas_lfe_plc_fx.c index f878ecf16..6a65839b8 100644 --- a/lib_dec/ivas_lfe_plc_fx.c +++ b/lib_dec/ivas_lfe_plc_fx.c @@ -33,8 +33,7 @@ #include #include "options.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_rom_com.h" #include diff --git a/lib_dec/ivas_ls_custom_dec.c b/lib_dec/ivas_ls_custom_dec.c index 86414d84a..f87889e27 100644 --- a/lib_dec/ivas_ls_custom_dec.c +++ b/lib_dec/ivas_ls_custom_dec.c @@ -36,7 +36,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx1.h" +#include "prot_fx.h" #endif diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 9dff654ad..78aa9867b 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -39,12 +39,9 @@ #include "ivas_rom_com.h" #include "ivas_stat_dec.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" #include "ivas_prot_fx.h" #include "ivas_rom_com_fx.h" diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 4887ffa12..57210b2cb 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -46,8 +46,7 @@ #include "wmc_auto.h" #include "rom_dec.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #define IVAS_FLOAT_FIXED_TO_BE_REMOVED #endif diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index 9b35fb7c9..246e81643 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -35,10 +35,8 @@ #include #include "cnst.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif #include "ivas_prot.h" diff --git a/lib_dec/ivas_mct_core_dec.c b/lib_dec/ivas_mct_core_dec.c index 7bd948ad6..cc014dd76 100644 --- a/lib_dec/ivas_mct_core_dec.c +++ b/lib_dec/ivas_mct_core_dec.c @@ -43,8 +43,7 @@ #include "ivas_stat_dec.h" #include "ivas_stat_com.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index d83e28576..34ab57de5 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -37,14 +37,13 @@ #include "cnst.h" #include "ivas_cnst.h" #include "rom_com.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "prot.h" #include "ivas_prot.h" #include "ivas_prot_rend.h" #include "ivas_rom_com.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" #include "ivas_prot_fx.h" #endif // IVAS_FLOAT_FIXED diff --git a/lib_dec/ivas_mct_dec_mct_fx.c b/lib_dec/ivas_mct_dec_mct_fx.c index 83c66b62e..29685d898 100644 --- a/lib_dec/ivas_mct_dec_mct_fx.c +++ b/lib_dec/ivas_mct_dec_mct_fx.c @@ -39,8 +39,7 @@ #include #include "stat_enc.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" /*----------------------------------------------------------* diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index 4cb343648..36c68e3cf 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -45,10 +45,8 @@ #include "ivas_stat_com.h" #include #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" #endif // IVAS_FLOAT_FIXED diff --git a/lib_dec/ivas_mono_dmx_renderer.c b/lib_dec/ivas_mono_dmx_renderer.c index 892298f1c..fabd897f5 100644 --- a/lib_dec/ivas_mono_dmx_renderer.c +++ b/lib_dec/ivas_mono_dmx_renderer.c @@ -35,8 +35,7 @@ #include #include "cnst.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" #include "ivas_cnst.h" diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 51cf795b3..d6f965c8f 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -40,8 +40,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "debug.h" #endif diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index f376e8d7e..bc136eb1a 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -40,7 +40,7 @@ #include "ivas_rom_com.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "prot_fx2.h" +#include "prot_fx.h" #ifdef IVAS_FLOAT_FIXED #include "math.h" // temporary (for fabs) #endif diff --git a/lib_dec/ivas_osba_dec.c b/lib_dec/ivas_osba_dec.c index 47d3ee5ec..4b9951065 100644 --- a/lib_dec/ivas_osba_dec.c +++ b/lib_dec/ivas_osba_dec.c @@ -40,8 +40,7 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif // IVAS_FLOAT_FIXED diff --git a/lib_dec/ivas_out_setup_conversion.c b/lib_dec/ivas_out_setup_conversion.c index 60f3f8158..505b6797f 100644 --- a/lib_dec/ivas_out_setup_conversion.c +++ b/lib_dec/ivas_out_setup_conversion.c @@ -41,8 +41,7 @@ #include "ivas_rom_rend.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif diff --git a/lib_dec/ivas_pca_dec_fx.c b/lib_dec/ivas_pca_dec_fx.c index 40052469b..7dd2e334c 100644 --- a/lib_dec/ivas_pca_dec_fx.c +++ b/lib_dec/ivas_pca_dec_fx.c @@ -38,7 +38,7 @@ #include #include "ivas_cnst.h" #include "wmc_auto.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "math.h" /*-----------------------------------------------------------------------* diff --git a/lib_dec/ivas_post_proc.c b/lib_dec/ivas_post_proc.c index 694bc5320..c2decb8c5 100644 --- a/lib_dec/ivas_post_proc.c +++ b/lib_dec/ivas_post_proc.c @@ -36,8 +36,7 @@ #include "cnst.h" #include "rom_com.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" #include "ivas_cnst.h" diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 7332f26f1..c80e1dbfb 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -41,8 +41,7 @@ #include "wmc_auto.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_rom_com_fx.h" diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 336155665..5bc296fbc 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -43,7 +43,7 @@ #include #include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-------------------------------------------------------------------* * ivas_sba_set_cna_cng_flag() * diff --git a/lib_dec/ivas_sba_dirac_stereo_dec_fx.c b/lib_dec/ivas_sba_dirac_stereo_dec_fx.c index 2ad1c081b..16e93aeb6 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec_fx.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec_fx.c @@ -34,8 +34,7 @@ #include "options.h" #include "cnst.h" #include "ivas_cnst.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" #include "ivas_rom_com.h" diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index 19113a09a..5a2ee5c77 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -41,7 +41,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif // IVAS_FLOAT_FIXED #ifdef DUMPS_ENABLED #include "debug.h" diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c index 7c30d3032..8c2ee04ba 100644 --- a/lib_dec/ivas_sce_dec.c +++ b/lib_dec/ivas_sce_dec.c @@ -37,8 +37,7 @@ #include "ivas_cnst.h" #include "rom_com.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_rom_com.h" #include "wmc_auto.h" diff --git a/lib_dec/ivas_sce_dec_fx.c b/lib_dec/ivas_sce_dec_fx.c index 5976c81a3..8e1b5d140 100644 --- a/lib_dec/ivas_sce_dec_fx.c +++ b/lib_dec/ivas_sce_dec_fx.c @@ -38,8 +38,7 @@ #include "ivas_cnst.h" #include "rom_com.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" #include "ivas_rom_com.h" diff --git a/lib_dec/ivas_sns_dec_fx.c b/lib_dec/ivas_sns_dec_fx.c index f240029b3..ff96b6c06 100644 --- a/lib_dec/ivas_sns_dec_fx.c +++ b/lib_dec/ivas_sns_dec_fx.c @@ -40,8 +40,7 @@ #include #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_rom_com_fx.h" #endif diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 416ac4f73..007074796 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -34,7 +34,6 @@ #include "options.h" #include "ivas_stat_dec.h" #include "prot.h" -#include "prot_fx2.h" #include "string.h" #include "ivas_prot.h" #include "ivas_prot_rend.h" @@ -46,8 +45,7 @@ #include #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif // IVAS_FLOAT_FIXED #ifdef DUMPS_ENABLED diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 1a894ce10..bf72059f0 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -34,15 +34,13 @@ #include "options.h" #include "math.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" #include "ivas_prot.h" #include "ivas_rom_com.h" #include #include "wmc_auto.h" #include "ivas_stat_dec.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif // IVAS_FLOAT_FIXED #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index eef15da05..50603a381 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -41,8 +41,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif #ifdef IVAS_FLOAT_FIXED #include "ivas_rom_com_fx.h" diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index c9bf60ddf..09fc9f2fd 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -38,7 +38,7 @@ #include "rom_com.h" #include "rom_dec.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_cnst.h" #include "ivas_rom_com.h" diff --git a/lib_dec/ivas_stereo_dft_dec_dmx.c b/lib_dec/ivas_stereo_dft_dec_dmx.c index 7250baa6b..ee2c781b5 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx.c @@ -44,8 +44,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx2.h" -#include "prot_fx1.h" +#include "prot_fx.h" #endif @@ -295,13 +294,13 @@ void stereo_dft_unify_dmx_fx( Word16 exp_sum_abs = exp_sum_nrg_l; move16(); - if ( GT_16( exp_sum_nrg_R, exp_sum_nrg_l ) ) + if( GT_16( exp_sum_nrg_R, exp_sum_nrg_l ) ) { exp_sum_abs = exp_sum_nrg_R; move16(); } exp_sum_abs = add( exp_sum_abs, 1 ); - sum_abs = L_add( L_shr( tmp_nrg_L, sub( exp_sum_abs, exp_sum_nrg_l ) ), L_shr( tmp_nrg_R, sub( exp_sum_abs, exp_sum_nrg_R ) ) ); + sum_abs = L_add( L_shr( tmp_nrg_L, sub(exp_sum_abs , exp_sum_nrg_l) ), L_shr( tmp_nrg_R, sub( exp_sum_abs, exp_sum_nrg_R ) ) ); dot_prod_abs = Sqrt32( L_add( Mpy_32_32( dot_prod_real_32, dot_prod_real_32 ), Mpy_32_32( dot_prod_img_32, dot_prod_img_32 ) ), &exp_dot_prod_abs ); Word32 num = L_add( L_shr( L_add( sum_nrg_L_32, sum_nrg_R_32 ), 1 ), L_shr( dot_prod_abs, sub( sub( 31, exp_dot_prod_abs ), q_sum_nrg_L ) ) ); Word16 E_num = sub( 31, q_sum_nrg_L ); @@ -309,7 +308,7 @@ void stereo_dft_unify_dmx_fx( Word16 exp_wR = exp_sum_abs; move16(); - if ( LT_16( exp_sum_abs, E_num ) ) + if( LT_16( exp_sum_abs, E_num ) ) { exp_wR = E_num; move16(); @@ -329,14 +328,14 @@ void stereo_dft_unify_dmx_fx( } ELSE { - wR_temp = shr( divide3232( L_shr( num_sqrt, sub( exp_wR, E_num ) ), L_shr( sum_abs, sub( exp_wR, exp_sum_abs ) ) ), 2 ); + wR_temp = shr( divide3232( L_shr( num_sqrt, sub(exp_wR , E_num) ), L_shr( sum_abs, sub(exp_wR , exp_sum_abs) ) ), 2 ); } Word32 sum_nrg_Mid_sqrt = Sqrt32( sum_nrg_Mid, &exp_sum_nrg_Mid ); Word16 exp_wL = exp_sum_abs; move16(); - if ( LT_16( exp_sum_abs, exp_sum_nrg_Mid ) ) + if( LT_16( exp_sum_abs, exp_sum_nrg_Mid ) ) { exp_wL = exp_sum_nrg_Mid; move16(); diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 52fc6e26c..ea5f56998 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -38,7 +38,7 @@ #include "rom_com.h" #include "rom_dec.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" #include "ivas_cnst.h" @@ -49,7 +49,6 @@ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #include "basop_util.h" -#include "prot_fx1.h" /*-------------------------------------------------------------------* * Local constants diff --git a/lib_dec/ivas_stereo_dft_plc_fx.c b/lib_dec/ivas_stereo_dft_plc_fx.c index 5abf182fe..3e41b5991 100644 --- a/lib_dec/ivas_stereo_dft_plc_fx.c +++ b/lib_dec/ivas_stereo_dft_plc_fx.c @@ -34,8 +34,7 @@ #include "options.h" #include "cnst.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_cnst.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" @@ -111,12 +110,12 @@ void stereo_dft_res_ecu_fx( move16(); FOR( i = 0; i < STEREO_DFT32MS_N_8k / 4; i++ ) { - trigo_dec[i] = hStereoDft->dft_trigo_8k_fx[i_mult( i, trigo_step )]; + trigo_dec[i] = hStereoDft->dft_trigo_8k_fx[i_mult(i , trigo_step)]; move16(); - trigo_dec[STEREO_DFT32MS_N_8k / 2 - i] = hStereoDft->dft_trigo_8k_fx[i_mult( i, trigo_step )]; + trigo_dec[STEREO_DFT32MS_N_8k / 2 - i] = hStereoDft->dft_trigo_8k_fx[i_mult(i , trigo_step)]; move16(); } - trigo_dec[STEREO_DFT32MS_N_8k / 4] = hStereoDft->dft_trigo_8k_fx[i_mult( STEREO_DFT32MS_N_8k / 4, trigo_step )]; + trigo_dec[STEREO_DFT32MS_N_8k / 4] = hStereoDft->dft_trigo_8k_fx[i_mult(STEREO_DFT32MS_N_8k / 4 , trigo_step)]; move16(); /* estimation of res_cod_mem (ola part in imdct residual signal) and input_mem (memory for buffer in DFT analysis)*/ @@ -312,7 +311,7 @@ static void ivas_peakfinder_fx( move32(); ind[k] = 0; move16(); - k = add( k, 1 ); + k = add(k, 1); } FOR( i = 1; i < sub( len0, 1 ); i++ ) @@ -435,7 +434,7 @@ static void ivas_peakfinder_fx( move32(); } - ii = add( ii, 1 ); /* Move onto the valley */ + ii = add(ii,1); /* Move onto the valley */ /* Come down at least sel from peak */ test(); @@ -449,8 +448,8 @@ static void ivas_peakfinder_fx( move16(); peakMag[*cInd] = tempMag; move32(); - ( *cInd ) = add( *( cInd ), 1 ); - move16(); + ( *cInd ) = add(*(cInd),1); + move16(); } ELSE IF( LT_32( x[ii], leftMin ) ) /* New left minimum */ { @@ -582,7 +581,7 @@ void stereo_dft_res_subst_spec_fx( FOR( i = 1; i < L_res; i++ ) { Word32 r = L_shl( p_mem[2 * i], q_res ); - Word32 l = L_shl( p_mem[add( shl( i, 1 ), 1 )], q_res ); + Word32 l = L_shl( p_mem[add(shl(i,1), 1)], q_res ); abs_res[i] = Madd_32_32( Mpy_32_32( r, r ), l, l ); move32(); } @@ -694,7 +693,7 @@ void stereo_dft_res_subst_spec_fx( cos_F = shl_o( getCosWord16( extract_l( corr_phase ) ), 1, &flg_ov ); sin_F = getSinWord16( extract_l( corr_phase ) ); - idx = s_max( 0, sub( plocs[i], Np ) ); /* Iterate over plocs[i]-1:plocs[i]+1, considering the edges of the spectrum */ + idx = s_max( 0, sub(plocs[i] , Np) ); /* Iterate over plocs[i]-1:plocs[i]+1, considering the edges of the spectrum */ WHILE( ( idx < add( add( plocs[i], Np ), 1 ) ) && LT_16( idx, L_res ) ) { pDFT_RES[2 * idx] = Msub_32_16( Mpy_32_16_1( p_mem[2 * idx], cos_F ), p_mem[add( shl( idx, 1 ), 1 )], sin_F ); diff --git a/lib_dec/ivas_stereo_ica_dec.c b/lib_dec/ivas_stereo_ica_dec.c index 62bbbcdda..2553f40af 100644 --- a/lib_dec/ivas_stereo_ica_dec.c +++ b/lib_dec/ivas_stereo_ica_dec.c @@ -41,7 +41,7 @@ #include "wmc_auto.h" #include "rom_com.h" #include "ivas_rom_com.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #include "basop32.h" #include "ivas_stat_dec.h" @@ -694,7 +694,7 @@ void stereo_tca_scale_R_channel_fx( Word16 temp_a_q = 2; move16(); tempF1_fx = Inv16( temp_a, &temp_a_q ); - tempF1_fx = L_shl( tempF1_fx, sub( ( 31 - 4 ), sub( 15, temp_a_q ) ) ); + tempF1_fx = L_shl( tempF1_fx, sub(( 31 - 4 ) , sub( 15 , temp_a_q )) ); } @@ -709,7 +709,7 @@ void stereo_tca_scale_R_channel_fx( Word16 temp_b_q = 2; move16(); tempF_fx = Inv16( temp_b, &temp_b_q ); - tempF_fx = L_shl( tempF_fx, sub( ( 31 - 4 ), sub( 15, temp_b_q ) ) ); + tempF_fx = L_shl( tempF_fx, sub(( 31 - 4 ) , sub( 15 , temp_b_q )) ); } } SWITCH( output_Fs ) diff --git a/lib_dec/ivas_stereo_icbwe_dec.c b/lib_dec/ivas_stereo_icbwe_dec.c index ca3159f3e..95d43ad48 100644 --- a/lib_dec/ivas_stereo_icbwe_dec.c +++ b/lib_dec/ivas_stereo_icbwe_dec.c @@ -37,8 +37,7 @@ #include "cnst.h" #include "ivas_cnst.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" #include "wmc_auto.h" diff --git a/lib_dec/ivas_stereo_mdct_core_dec.c b/lib_dec/ivas_stereo_mdct_core_dec.c index de1bb794d..6a3638bfc 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec.c +++ b/lib_dec/ivas_stereo_mdct_core_dec.c @@ -41,7 +41,7 @@ #include "ivas_stat_dec.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif // IVAS_FLOAT_FIXED diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 88b25b872..17e2d3601 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -41,8 +41,7 @@ #include "ivas_prot.h" #include "ivas_stat_dec.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" /*------------------------------------------------------------------------- @@ -82,7 +81,7 @@ static void stereo_mdct_dec_stereo_fx( sts[0]->bits_frame_channel = add( sts[0]->bits_frame_channel, i_mult( sts[0]->core, SMDCT_MINIMUM_ARITH_BITS ) ); sts[1]->bits_frame_channel = add( sts[1]->bits_frame_channel, i_mult( sts[1]->core, SMDCT_MINIMUM_ARITH_BITS ) ); - sts[1]->bit_stream = &sts[0]->bit_stream[add( add( sts[0]->next_bit_pos, sts[0]->bits_frame_channel ), i_mult( sts[0]->core, NF_GAIN_BITS ) )]; + sts[1]->bit_stream = &sts[0]->bit_stream[add(add(sts[0]->next_bit_pos , sts[0]->bits_frame_channel) , i_mult(sts[0]->core , NF_GAIN_BITS))]; return; } @@ -820,7 +819,7 @@ static void apply_dmx_weights_fx( { /* subframe is TCX5, but TCX10 or TCX20 in other channel -> convert channel with TCX5 to TCX10 resolution */ pTmp[ch][k] = sig[ch][k] = convertRes[ch] + i_mult( k, shr( frameSize, 1 ) ); - convert_coeffs_to_higher_res_fx( x[ch][k], x[ch][k] + shr( frameSize, 2 ), pTmp[ch][k], shr( frameSize, 2 ) ); + convert_coeffs_to_higher_res_fx( x[ch][k], x[ch][k] + shr(frameSize ,2), pTmp[ch][k], shr( frameSize, 2 ) ); } } @@ -841,7 +840,7 @@ static void apply_dmx_weights_fx( FOR( l = 0; l < nsub2[k]; l++ ) { // mdst[ch][k][l * numCoeffs[k]] = mdst[ch][k][( l + 1 ) * numCoeffs[k] - 1] = 0.f; - mdst[ch][k][i_mult( l, numCoeffs[k] )] = mdst[ch][k][sub( i_mult( add( l, 1 ), numCoeffs[k] ), 1 )] = 0; + mdst[ch][k][i_mult(l , numCoeffs[k])] = mdst[ch][k][sub(i_mult(add( l , 1 ) , numCoeffs[k]) , 1)] = 0; move32(); move32(); FOR( i = l * numCoeffs[k] + 1; i < ( l + 1 ) * numCoeffs[k] - 1; i++ ) @@ -1164,7 +1163,7 @@ static void run_min_stats_fx( FOR( Word16 i = 1; i < L_FRAME16k - 1; i++ ) { Word32 mdst; - mdst = L_sub( spec_in[i + 1], spec_in[i - 1] ); /* Q31 - x_e */ + mdst = L_sub( spec_in[i + 1], spec_in[i - 1] ); /* Q31 - x_e */ power_spec[i] = L_add( W_extract_h( W_shl( W_mult_32_32( spec_in[i], spec_in[i] ), sub( tmp16, 4 ) ) ), W_extract_h( W_shl( W_mult_32_32( mdst, mdst ), sub( tmp16, 4 ) ) ) ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31*/ move32(); } diff --git a/lib_dec/ivas_stereo_mdct_stereo_dec.c b/lib_dec/ivas_stereo_mdct_stereo_dec.c index d88e31198..9177bf69c 100644 --- a/lib_dec/ivas_stereo_mdct_stereo_dec.c +++ b/lib_dec/ivas_stereo_mdct_stereo_dec.c @@ -39,8 +39,7 @@ #include "prot.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif // IVAS_FLOAT_FIXED diff --git a/lib_dec/ivas_stereo_switching_dec.c b/lib_dec/ivas_stereo_switching_dec.c index c1c049cbd..774c1a8e0 100644 --- a/lib_dec/ivas_stereo_switching_dec.c +++ b/lib_dec/ivas_stereo_switching_dec.c @@ -35,17 +35,15 @@ #include "cnst.h" #include "rom_com.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" #include "ivas_rom_com.h" #include "assert.h" #include "wmc_auto.h" #include -#include "prot_fx2.h" #include "ivas_prot_fx.h" #ifdef IVAS_FLOAT_FIXED +#include "prot_fx.h" #include "ivas_rom_com_fx.h" #endif diff --git a/lib_dec/ivas_stereo_td_dec.c b/lib_dec/ivas_stereo_td_dec.c index 83b6d67a4..79eac072c 100644 --- a/lib_dec/ivas_stereo_td_dec.c +++ b/lib_dec/ivas_stereo_td_dec.c @@ -36,8 +36,7 @@ #include "cnst.h" #include "rom_com.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_rom_com.h" #include "ivas_cnst.h" diff --git a/lib_dec/ivas_svd_dec.c b/lib_dec/ivas_svd_dec.c index 5d5ccedb4..9156aa718 100644 --- a/lib_dec/ivas_svd_dec.c +++ b/lib_dec/ivas_svd_dec.c @@ -38,8 +38,7 @@ #include "ivas_cnst.h" #include #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-----------------------------------------------------------------------* diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index d51543302..626b71a10 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -35,14 +35,13 @@ #include "options.h" #include #include "prot.h" -#include "prot_fx1.h" #include "rom_com.h" #include "stat_dec.h" #include "wmc_auto.h" #include "basop_proto_func.h" #include "stat_com.h" #include "ivas_prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" /*-------------------------------------------------------------* @@ -631,7 +630,7 @@ void stereo_tcx_core_dec_fx( IF( !bfi ) { st->stab_fac_fx = lsf_stab_fx( &lsf_fx[M], &lsf_fx[0], 0, st->L_frame ); - move16(); + move16(); } IF( hTcxDec->enableTcxLpc ) diff --git a/lib_dec/ivas_td_low_rate_dec.c b/lib_dec/ivas_td_low_rate_dec.c index bdaa26ebc..e1eaca3d3 100644 --- a/lib_dec/ivas_td_low_rate_dec.c +++ b/lib_dec/ivas_td_low_rate_dec.c @@ -38,8 +38,7 @@ #include "ivas_rom_com.h" #include "ivas_cnst.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "wmc_auto.h" #ifndef IVAS_FLOAT_FIXED diff --git a/lib_dec/jbm_jb4sb.c b/lib_dec/jbm_jb4sb.c index 095868940..394452fb8 100644 --- a/lib_dec/jbm_jb4sb.c +++ b/lib_dec/jbm_jb4sb.c @@ -49,7 +49,7 @@ #include "jbm_jb4_jmf.h" #include "jbm_jb4sb.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #define WMC_TOOL_SKIP #define INV_500_Q31 4294967 /*1/500 IN Q_31*/ diff --git a/lib_dec/jbm_pcmdsp_apa.c b/lib_dec/jbm_pcmdsp_apa.c index 72e57c5b5..9e11f8085 100644 --- a/lib_dec/jbm_pcmdsp_apa.c +++ b/lib_dec/jbm_pcmdsp_apa.c @@ -54,7 +54,7 @@ #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #define INV_100_Q15 328 #define INV_400_Q15 82 #define INV_80_Q15 410 diff --git a/lib_dec/lead_deindexing_fx.c b/lib_dec/lead_deindexing_fx.c index 2e9ea383f..80508277f 100644 --- a/lib_dec/lead_deindexing_fx.c +++ b/lib_dec/lead_deindexing_fx.c @@ -7,8 +7,7 @@ #include "cnst.h" #include "rom_com.h" #include "rom_dec.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-------------------------------------------------------------------* * Local function prototype diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 2b66b1084..44e0c0770 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -36,8 +36,7 @@ #include "ivas_prot.h" #include "ivas_prot_rend.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "jbm_jb4sb.h" #include "jbm_pcmdsp_apa.h" #include "jbm_pcmdsp_fifo.h" diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 900aa4d54..c2b52ecd1 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -36,8 +36,7 @@ #include "ivas_prot_rend.h" #include "prot.h" #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "jbm_jb4sb.h" #include "jbm_pcmdsp_apa.h" #include "jbm_pcmdsp_fifo.h" diff --git a/lib_dec/lp_exc_d_fx.c b/lib_dec/lp_exc_d_fx.c index 40318b376..acad06090 100644 --- a/lib_dec/lp_exc_d_fx.c +++ b/lib_dec/lp_exc_d_fx.c @@ -5,8 +5,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*======================================================================*/ /* FUNCTION : lp_filt_exc_dec_fx() */ diff --git a/lib_dec/lsf_dec.c b/lib_dec/lsf_dec.c index 2fb00b693..0628ccd33 100644 --- a/lib_dec/lsf_dec.c +++ b/lib_dec/lsf_dec.c @@ -39,7 +39,7 @@ #include "cnst.h" #include "rom_com.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_proto_func.h" #include "ivas_prot.h" #include "ivas_rom_com.h" diff --git a/lib_dec/lsf_dec_fx.c b/lib_dec/lsf_dec_fx.c index 4ac20d1e6..2e99272cb 100644 --- a/lib_dec/lsf_dec_fx.c +++ b/lib_dec/lsf_dec_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #if defined LSF_RE_USE_SECONDARY_CHANNEL || defined FIX_798_LSF_SECONDARY_CH_MISSING_CODE #include "ivas_prot.h" //#include "ivas_rom_com.h" diff --git a/lib_dec/lsf_msvq_ma_dec_fx.c b/lib_dec/lsf_msvq_ma_dec_fx.c index a8fb91fe3..3fc69d588 100644 --- a/lib_dec/lsf_msvq_ma_dec_fx.c +++ b/lib_dec/lsf_msvq_ma_dec_fx.c @@ -6,8 +6,7 @@ #include #include "options.h" #include "cnst.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "rom_com.h" diff --git a/lib_dec/nelp_dec_fx.c b/lib_dec/nelp_dec_fx.c index 418e74bcb..e5df5d6e4 100644 --- a/lib_dec/nelp_dec_fx.c +++ b/lib_dec/nelp_dec_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /*===================================================================*/ diff --git a/lib_dec/peak_vq_dec_fx.c b/lib_dec/peak_vq_dec_fx.c index 356592067..a23ff76b4 100644 --- a/lib_dec/peak_vq_dec_fx.c +++ b/lib_dec/peak_vq_dec_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #include "enh64.h" diff --git a/lib_dec/pit_dec_fx.c b/lib_dec/pit_dec_fx.c index faa3cb2d3..f99c8ac16 100644 --- a/lib_dec/pit_dec_fx.c +++ b/lib_dec/pit_dec_fx.c @@ -6,8 +6,7 @@ #include #include "options.h" #include "cnst.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #define inv_T0_res InvIntTable diff --git a/lib_dec/pitch_extr_fx.c b/lib_dec/pitch_extr_fx.c index 2e327938e..9b42a9b57 100644 --- a/lib_dec/pitch_extr_fx.c +++ b/lib_dec/pitch_extr_fx.c @@ -7,8 +7,7 @@ #include #include "options.h" #include "cnst.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" diff --git a/lib_dec/post_dec_fx.c b/lib_dec/post_dec_fx.c index e6e4fffa4..071bc5188 100644 --- a/lib_dec/post_dec_fx.c +++ b/lib_dec/post_dec_fx.c @@ -5,8 +5,7 @@ #include #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/ppp_dec_fx.c b/lib_dec/ppp_dec_fx.c index 1f0f485df..275229e36 100644 --- a/lib_dec/ppp_dec_fx.c +++ b/lib_dec/ppp_dec_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" /*===================================================================*/ diff --git a/lib_dec/pvq_core_dec_fx.c b/lib_dec/pvq_core_dec_fx.c index 65f94c317..f9e994cc6 100644 --- a/lib_dec/pvq_core_dec_fx.c +++ b/lib_dec/pvq_core_dec_fx.c @@ -5,8 +5,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" diff --git a/lib_dec/pvq_decode_fx.c b/lib_dec/pvq_decode_fx.c index 1ae7b0988..24aa0cfac 100644 --- a/lib_dec/pvq_decode_fx.c +++ b/lib_dec/pvq_decode_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" /*-------------------------------------------------------------------* diff --git a/lib_dec/range_dec_fx.c b/lib_dec/range_dec_fx.c index 440137a95..515bd9cda 100644 --- a/lib_dec/range_dec_fx.c +++ b/lib_dec/range_dec_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_dec/re8_dec_fx.c b/lib_dec/re8_dec_fx.c index e1177d1ec..2108ca24d 100644 --- a/lib_dec/re8_dec_fx.c +++ b/lib_dec/re8_dec_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------------- * re8_dec_fx() diff --git a/lib_dec/rst_dec_fx.c b/lib_dec/rst_dec_fx.c index a4810115b..9e4f056d3 100644 --- a/lib_dec/rst_dec_fx.c +++ b/lib_dec/rst_dec_fx.c @@ -6,8 +6,7 @@ #include "stl.h" #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*----------------------------------------------------------------------------------* * CNG_reset_dec() diff --git a/lib_dec/stat_noise_uv_dec_fx.c b/lib_dec/stat_noise_uv_dec_fx.c index b3c6998b6..0ea10d749 100644 --- a/lib_dec/stat_noise_uv_dec_fx.c +++ b/lib_dec/stat_noise_uv_dec_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*---------------------------------------------------------* diff --git a/lib_dec/swb_bwe_dec.c b/lib_dec/swb_bwe_dec.c index f2b096d72..a1b61cdc6 100644 --- a/lib_dec/swb_bwe_dec.c +++ b/lib_dec/swb_bwe_dec.c @@ -39,14 +39,13 @@ #include #include "cnst.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #include "basop_util.h" #include "basop_proto_func.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" #endif // IVAS_FLOAT_FIXED #ifndef IVAS_FLOAT_FIXED diff --git a/lib_dec/swb_bwe_dec_fx.c b/lib_dec/swb_bwe_dec_fx.c index 742706db3..4b172de7b 100644 --- a/lib_dec/swb_bwe_dec_fx.c +++ b/lib_dec/swb_bwe_dec_fx.c @@ -5,8 +5,7 @@ #include #include "options.h" #include "cnst.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #include "rom_enc.h" #include "ivas_prot_fx.h" diff --git a/lib_dec/swb_bwe_dec_hr.c b/lib_dec/swb_bwe_dec_hr.c index 5d090e708..1332bec60 100644 --- a/lib_dec/swb_bwe_dec_hr.c +++ b/lib_dec/swb_bwe_dec_hr.c @@ -41,7 +41,7 @@ #include "rom_com.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #endif // IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* diff --git a/lib_dec/swb_bwe_dec_hr_fx.c b/lib_dec/swb_bwe_dec_hr_fx.c index ed6ed4ae6..660415302 100644 --- a/lib_dec/swb_bwe_dec_hr_fx.c +++ b/lib_dec/swb_bwe_dec_hr_fx.c @@ -3,8 +3,7 @@ ====================================================================================*/ #include #include "options.h" /* Compilation switches */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "rom_dec.h" /* Static table prototypes */ #include "cnst.h" /* Static table prototypes */ diff --git a/lib_dec/swb_bwe_dec_lr_fx.c b/lib_dec/swb_bwe_dec_lr_fx.c index 52c200bc4..485bbe6e2 100644 --- a/lib_dec/swb_bwe_dec_lr_fx.c +++ b/lib_dec/swb_bwe_dec_lr_fx.c @@ -4,8 +4,7 @@ #include "options.h" #include "cnst.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" /*-------------------------------------------------------------------* diff --git a/lib_dec/swb_tbe_dec.c b/lib_dec/swb_tbe_dec.c index 613e82b3f..0bd0bb8b7 100644 --- a/lib_dec/swb_tbe_dec.c +++ b/lib_dec/swb_tbe_dec.c @@ -39,8 +39,7 @@ #include #include "cnst.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #include "rom_dec.h" #include "wmc_auto.h" diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 333361cc8..330156ce0 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -6,8 +6,7 @@ #include #include "options.h" #include "rom_com.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_dec.h" #include "stl.h" diff --git a/lib_dec/syn_outp_fx.c b/lib_dec/syn_outp_fx.c index 67399e2dd..32eebbfe8 100644 --- a/lib_dec/syn_outp_fx.c +++ b/lib_dec/syn_outp_fx.c @@ -5,8 +5,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Debug prototypes */ -#include "prot_fx2.h" /* Debug prototypes */ +#include "prot_fx.h" /* Debug prototypes */ /*-------------------------------------------------------------------* * syn_output() diff --git a/lib_dec/tcq_core_dec_fx.c b/lib_dec/tcq_core_dec_fx.c index 0e3fa5f90..fcfe057ba 100644 --- a/lib_dec/tcq_core_dec_fx.c +++ b/lib_dec/tcq_core_dec_fx.c @@ -6,8 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*---------------------------------------------------------------------* * tcq_core_LR_dec() * diff --git a/lib_dec/tcx_utils_dec_fx.c b/lib_dec/tcx_utils_dec_fx.c index 7eb2d7576..e6a0dd262 100644 --- a/lib_dec/tcx_utils_dec_fx.c +++ b/lib_dec/tcx_utils_dec_fx.c @@ -8,8 +8,7 @@ #include #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_basop_util.h" #include "basop_util.h" #include "rom_com.h" diff --git a/lib_dec/tns_base_dec_fx.c b/lib_dec/tns_base_dec_fx.c index 5ef1756b7..0631dad11 100644 --- a/lib_dec/tns_base_dec_fx.c +++ b/lib_dec/tns_base_dec_fx.c @@ -5,8 +5,7 @@ #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include #include "rom_com.h" diff --git a/lib_dec/tonalMDCTconcealment.c b/lib_dec/tonalMDCTconcealment.c index 8e2097d74..f3456310a 100644 --- a/lib_dec/tonalMDCTconcealment.c +++ b/lib_dec/tonalMDCTconcealment.c @@ -45,8 +45,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif // IVAS_FLOAT_FIXED diff --git a/lib_dec/tonalMDCTconcealment_fx.c b/lib_dec/tonalMDCTconcealment_fx.c index 9881d47ec..d465a03cd 100644 --- a/lib_dec/tonalMDCTconcealment_fx.c +++ b/lib_dec/tonalMDCTconcealment_fx.c @@ -12,8 +12,7 @@ #include "options.h" #include "typedef.h" #include "cnst.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "stat_com.h" #include "prot.h" #include "ivas_prot_fx.h" @@ -520,7 +519,7 @@ void TonalMDCTConceal_SaveFreqSignal_ivas_fx( FOR( i = 0; i < nNewSamples; i++ ) { Word16 tmp = 0; - if ( mdctSpectrum[i] != 0 ) + if (mdctSpectrum[i] != 0) { tmp = 1; move16(); diff --git a/lib_dec/transition_dec_fx.c b/lib_dec/transition_dec_fx.c index 46bb39bf9..d0ee6d307 100644 --- a/lib_dec/transition_dec_fx.c +++ b/lib_dec/transition_dec_fx.c @@ -5,8 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "stl.h" /*----------------------------------------------------------------------* diff --git a/lib_dec/updt_dec_fx.c b/lib_dec/updt_dec_fx.c index a92130a62..c71e93f35 100644 --- a/lib_dec/updt_dec_fx.c +++ b/lib_dec/updt_dec_fx.c @@ -7,8 +7,7 @@ #include "options.h" #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------* * updt_dec() diff --git a/lib_dec/vlpc_1st_dec_fx.c b/lib_dec/vlpc_1st_dec_fx.c index 5d89a7696..1ba7a64d0 100644 --- a/lib_dec/vlpc_1st_dec_fx.c +++ b/lib_dec/vlpc_1st_dec_fx.c @@ -5,8 +5,7 @@ #include #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" diff --git a/lib_dec/vlpc_2st_dec_fx.c b/lib_dec/vlpc_2st_dec_fx.c index df4d8e53e..3aa39e86a 100644 --- a/lib_dec/vlpc_2st_dec_fx.c +++ b/lib_dec/vlpc_2st_dec_fx.c @@ -5,8 +5,7 @@ #include #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" //#ifdef DEBUGGING to be removed #include //#endif diff --git a/lib_dec/voiced_dec_fx.c b/lib_dec/voiced_dec_fx.c index e31032d4c..a52332fa0 100644 --- a/lib_dec/voiced_dec_fx.c +++ b/lib_dec/voiced_dec_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #include "log2.h" diff --git a/lib_dec/waveadjust_fec_dec_fx.c b/lib_dec/waveadjust_fec_dec_fx.c index e7aadde27..095a56bc9 100644 --- a/lib_dec/waveadjust_fec_dec_fx.c +++ b/lib_dec/waveadjust_fec_dec_fx.c @@ -6,8 +6,7 @@ #include #include #include -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "stat_com.h" #include "rom_com.h" diff --git a/lib_enc/ACcontextMapping_enc_fx.c b/lib_enc/ACcontextMapping_enc_fx.c index 62516fe35..11d60b854 100644 --- a/lib_enc/ACcontextMapping_enc_fx.c +++ b/lib_enc/ACcontextMapping_enc_fx.c @@ -7,8 +7,7 @@ #include "options.h" #include "basop_util.h" #include "cnst.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" //#include "prot_fx.h" #include "prot_fx_enc.h" diff --git a/lib_enc/FEC_enc_fx.c b/lib_enc/FEC_enc_fx.c index 8338409fb..c662d0572 100644 --- a/lib_enc/FEC_enc_fx.c +++ b/lib_enc/FEC_enc_fx.c @@ -7,8 +7,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/SNR_calc_fx.c b/lib_enc/SNR_calc_fx.c index f39bc2b86..e3805a1f1 100644 --- a/lib_enc/SNR_calc_fx.c +++ b/lib_enc/SNR_calc_fx.c @@ -6,8 +6,7 @@ #include "options.h" #include "basop_util.h" #include "vad_basop.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "rom_enc.h" #include "rom_com.h" diff --git a/lib_enc/acelp_core_enc.c b/lib_enc/acelp_core_enc.c index d006fa1ea..6b95f3abf 100644 --- a/lib_enc/acelp_core_enc.c +++ b/lib_enc/acelp_core_enc.c @@ -43,7 +43,7 @@ #include "prot.h" #include "ivas_cnst.h" #include "ivas_prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "prot_fx_enc.h" #include "ivas_rom_com.h" #include "wmc_auto.h" diff --git a/lib_enc/acelp_core_enc_fx.c b/lib_enc/acelp_core_enc_fx.c index c7688e7df..fb993c10a 100644 --- a/lib_enc/acelp_core_enc_fx.c +++ b/lib_enc/acelp_core_enc_fx.c @@ -6,8 +6,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "stat_enc.h" #include "rom_com.h" #include "rom_enc.h" /* Encoder static table prototypes */ diff --git a/lib_enc/acelp_core_switch_enc_fx.c b/lib_enc/acelp_core_switch_enc_fx.c index bda7304c8..574ccb191 100644 --- a/lib_enc/acelp_core_switch_enc_fx.c +++ b/lib_enc/acelp_core_switch_enc_fx.c @@ -8,8 +8,7 @@ #include "rom_com_fx.h" //#include "prot_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/acelp_enc_util_fx.c b/lib_enc/acelp_enc_util_fx.c index 8dde5a319..9ac0accad 100644 --- a/lib_enc/acelp_enc_util_fx.c +++ b/lib_enc/acelp_enc_util_fx.c @@ -9,8 +9,7 @@ //#include "prot_fx.h" #include "basop_util.h" #include "cnst.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "stat_enc.h" #include "rom_com.h" diff --git a/lib_enc/amr_wb_enc_fx.c b/lib_enc/amr_wb_enc_fx.c index 0fd37dd5d..f8ab8e6b5 100644 --- a/lib_enc/amr_wb_enc_fx.c +++ b/lib_enc/amr_wb_enc_fx.c @@ -10,8 +10,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ #include "prot_fx_enc.h" diff --git a/lib_enc/analy_lp_fx.c b/lib_enc/analy_lp_fx.c index 51c40ec5e..959cbecbe 100644 --- a/lib_enc/analy_lp_fx.c +++ b/lib_enc/analy_lp_fx.c @@ -9,8 +9,7 @@ #include "rom_com.h" /* Static table prototypes */ #include "rom_enc.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/analy_sp_fx.c b/lib_enc/analy_sp_fx.c index fd96bfe4e..ffef5bb62 100644 --- a/lib_enc/analy_sp_fx.c +++ b/lib_enc/analy_sp_fx.c @@ -7,8 +7,7 @@ #include "cnst.h" #include "basop_util.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "rom_enc.h" #include "rom_com.h" diff --git a/lib_enc/ari_enc.c b/lib_enc/ari_enc.c index 192479aa6..8481d6c94 100644 --- a/lib_enc/ari_enc.c +++ b/lib_enc/ari_enc.c @@ -39,7 +39,7 @@ #include "options.h" #include "cnst.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "stat_com.h" #include "basop_util.h" #include "wmc_auto.h" diff --git a/lib_enc/ari_enc_fx.c b/lib_enc/ari_enc_fx.c index 5e01f8f35..dd203aee0 100644 --- a/lib_enc/ari_enc_fx.c +++ b/lib_enc/ari_enc_fx.c @@ -9,8 +9,7 @@ #include "cnst.h" #include "rom_com.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------- diff --git a/lib_enc/ari_hm_enc_fx.c b/lib_enc/ari_hm_enc_fx.c index bc4c225df..93670491c 100644 --- a/lib_enc/ari_hm_enc_fx.c +++ b/lib_enc/ari_hm_enc_fx.c @@ -12,8 +12,7 @@ #include "rom_enc.h" #include "prot.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/arith_coder_enc_fx.c b/lib_enc/arith_coder_enc_fx.c index 5c96532be..585bd3ab3 100644 --- a/lib_enc/arith_coder_enc_fx.c +++ b/lib_enc/arith_coder_enc_fx.c @@ -6,8 +6,7 @@ #include #include "options.h" #include "cnst.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" #include "rom_com.h" diff --git a/lib_enc/avq_cod_fx.c b/lib_enc/avq_cod_fx.c index 5b1756bfd..ca75917b7 100644 --- a/lib_enc/avq_cod_fx.c +++ b/lib_enc/avq_cod_fx.c @@ -8,8 +8,7 @@ #include /* Compilation switches */ #include "prot.h" /* Function prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ diff --git a/lib_enc/bass_psfilter_enc_fx.c b/lib_enc/bass_psfilter_enc_fx.c index c8ea49bf3..a468f94e6 100644 --- a/lib_enc/bass_psfilter_enc_fx.c +++ b/lib_enc/bass_psfilter_enc_fx.c @@ -7,8 +7,7 @@ #include "options.h" #include "cnst.h" #include "rom_com.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_enc/bw_detect_fx.c b/lib_enc/bw_detect_fx.c index 2496d54d3..004aa55d6 100644 --- a/lib_enc/bw_detect_fx.c +++ b/lib_enc/bw_detect_fx.c @@ -10,8 +10,7 @@ #include "rom_com.h" #include "basop_util.h" #include "ivas_cnst.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/cng_enc_fx.c b/lib_enc/cng_enc_fx.c index dc5ed20df..9f5ec0ebf 100644 --- a/lib_enc/cng_enc_fx.c +++ b/lib_enc/cng_enc_fx.c @@ -7,8 +7,7 @@ #include "rom_enc.h" /* Encoder static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ //#include "basop_mpy.h" diff --git a/lib_enc/cod2t32_fx.c b/lib_enc/cod2t32_fx.c index afb4d7ff3..a975eeda4 100644 --- a/lib_enc/cod2t32_fx.c +++ b/lib_enc/cod2t32_fx.c @@ -6,8 +6,7 @@ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/cod4t64_fx.c b/lib_enc/cod4t64_fx.c index 43d1e6434..2afb691c1 100644 --- a/lib_enc/cod4t64_fx.c +++ b/lib_enc/cod4t64_fx.c @@ -8,8 +8,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/cod_ace_fx.c b/lib_enc/cod_ace_fx.c index 667843880..222f330c8 100644 --- a/lib_enc/cod_ace_fx.c +++ b/lib_enc/cod_ace_fx.c @@ -11,8 +11,7 @@ #include "options.h" #include "rom_basop_util.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/cod_tcx_fx.c b/lib_enc/cod_tcx_fx.c index 0c3f7d4df..0b74d6de4 100644 --- a/lib_enc/cod_tcx_fx.c +++ b/lib_enc/cod_tcx_fx.c @@ -9,8 +9,7 @@ #include "rom_com.h" #include "stat_com.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_util.h" #include "stl.h" //#include "basop_mpy.h" diff --git a/lib_enc/cod_uv_fx.c b/lib_enc/cod_uv_fx.c index bf20ecfd0..accb947c7 100644 --- a/lib_enc/cod_uv_fx.c +++ b/lib_enc/cod_uv_fx.c @@ -7,8 +7,7 @@ #include //#include "prot_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/comvad_decision_fx.c b/lib_enc/comvad_decision_fx.c index 2fa8069f8..489b7861c 100644 --- a/lib_enc/comvad_decision_fx.c +++ b/lib_enc/comvad_decision_fx.c @@ -11,8 +11,7 @@ //#include "prot_fx.h" #include "rom_enc.h" /* Encoder static table prototypes */ #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ #include "prot_fx_enc.h" diff --git a/lib_enc/cor_shif_fx.c b/lib_enc/cor_shif_fx.c index 6645155ef..e96d59f08 100644 --- a/lib_enc/cor_shif_fx.c +++ b/lib_enc/cor_shif_fx.c @@ -5,8 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/core_enc_2div_fx.c b/lib_enc/core_enc_2div_fx.c index 37df43e37..6318fe62d 100644 --- a/lib_enc/core_enc_2div_fx.c +++ b/lib_enc/core_enc_2div_fx.c @@ -11,8 +11,7 @@ //#include "prot_fx.h" #include "basop_util.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/core_enc_init_fx.c b/lib_enc/core_enc_init_fx.c index 938997bd4..5cbc60c31 100644 --- a/lib_enc/core_enc_init_fx.c +++ b/lib_enc/core_enc_init_fx.c @@ -15,8 +15,7 @@ #include #include "rom_com.h" /* Common constants */ #include "prot.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/core_enc_ol_fx.c b/lib_enc/core_enc_ol_fx.c index 4a7db5f69..a92d1a309 100644 --- a/lib_enc/core_enc_ol_fx.c +++ b/lib_enc/core_enc_ol_fx.c @@ -10,8 +10,7 @@ #include "basop_util.h" #include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/core_enc_reconf_fx.c b/lib_enc/core_enc_reconf_fx.c index 49631b178..e1f50ba23 100644 --- a/lib_enc/core_enc_reconf_fx.c +++ b/lib_enc/core_enc_reconf_fx.c @@ -9,8 +9,7 @@ #include "rom_com_fx.h" #include "rom_enc.h" /* Encoder static table prototypes */ #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/core_enc_switch_fx.c b/lib_enc/core_enc_switch_fx.c index 0eede724a..644de838f 100644 --- a/lib_enc/core_enc_switch_fx.c +++ b/lib_enc/core_enc_switch_fx.c @@ -11,8 +11,7 @@ #include "ivas_cnst.h" #include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/core_enc_updt_fx.c b/lib_enc/core_enc_updt_fx.c index 9fa4f0ff3..fba6cb439 100644 --- a/lib_enc/core_enc_updt_fx.c +++ b/lib_enc/core_enc_updt_fx.c @@ -8,8 +8,7 @@ #include "cnst.h" /* Common constants */ #include "basop_util.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/core_switching_enc_fx.c b/lib_enc/core_switching_enc_fx.c index 457d93bd8..b4b9ea120 100644 --- a/lib_enc/core_switching_enc_fx.c +++ b/lib_enc/core_switching_enc_fx.c @@ -8,8 +8,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/corr_xh_fx.c b/lib_enc/corr_xh_fx.c index 698d14830..c25ee1450 100644 --- a/lib_enc/corr_xh_fx.c +++ b/lib_enc/corr_xh_fx.c @@ -5,8 +5,7 @@ #include "options.h" #include "cnst.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/decision_matrix_enc_fx.c b/lib_enc/decision_matrix_enc_fx.c index 5f0eaf0cd..413dd876e 100644 --- a/lib_enc/decision_matrix_enc_fx.c +++ b/lib_enc/decision_matrix_enc_fx.c @@ -10,8 +10,7 @@ #include "stat_enc.h" #include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/detect_transient_fx.c b/lib_enc/detect_transient_fx.c index 0d86e3aab..b8df7d373 100644 --- a/lib_enc/detect_transient_fx.c +++ b/lib_enc/detect_transient_fx.c @@ -37,8 +37,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------*/ diff --git a/lib_enc/diffcod_fx.c b/lib_enc/diffcod_fx.c index 5fd01046a..708568261 100644 --- a/lib_enc/diffcod_fx.c +++ b/lib_enc/diffcod_fx.c @@ -6,8 +6,7 @@ #include "cnst.h" /* Compilation switches */ #include "rom_com_fx.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function Prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------*/ diff --git a/lib_enc/dtx_fx.c b/lib_enc/dtx_fx.c index aa3bd7fd6..e79b8ace1 100644 --- a/lib_enc/dtx_fx.c +++ b/lib_enc/dtx_fx.c @@ -8,8 +8,7 @@ #include "rom_com.h" // #include "basop_mpy.h" #include -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "prot.h" @@ -68,8 +67,8 @@ void dtx_ivas_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ const Word32 ivas_total_brate, /* i : IVAS total bitrate */ const Word16 vad, /* i : vad flag for DTX */ - const Word16 speech[] /* i : Pointer to the speech frame */ - + const Word16 speech[] /* i : Pointer to the speech frame */ + ) { Word16 alpha; @@ -425,7 +424,7 @@ void dtx_ivas_fx( #endif // hDtxEnc->frame_ener = sum2_f( speech, L_FRAME ); Word16 guard_bits = find_guarded_bits_fx( L_FRAME ); - // Word16 Q_frame_ener = 2 * Q_speech; + // Word16 Q_frame_ener = 2 * Q_speech; hDtxEnc->frame_ener_fx = sum2_f_16_gb_fx( speech, L_FRAME, guard_bits ); // 2*Q_speech-guard_bits /* Active speech (voiced) */ diff --git a/lib_enc/enc_acelp_fx.c b/lib_enc/enc_acelp_fx.c index b8aacc998..5f5943ac1 100644 --- a/lib_enc/enc_acelp_fx.c +++ b/lib_enc/enc_acelp_fx.c @@ -12,8 +12,7 @@ #include "rom_com_fx.h" #include "rom_com.h" #include "rom_enc.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/enc_acelp_tcx_main_fx.c b/lib_enc/enc_acelp_tcx_main_fx.c index 0688f7311..3b003e8f2 100644 --- a/lib_enc/enc_acelp_tcx_main_fx.c +++ b/lib_enc/enc_acelp_tcx_main_fx.c @@ -7,8 +7,7 @@ //#include "prot_fx.h" #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/enc_acelpx_fx.c b/lib_enc/enc_acelpx_fx.c index b24bcd066..550147215 100644 --- a/lib_enc/enc_acelpx_fx.c +++ b/lib_enc/enc_acelpx_fx.c @@ -8,8 +8,7 @@ #include "basop_util.h" #include "options.h" #include "rom_enc.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------------------* diff --git a/lib_enc/enc_amr_wb_fx.c b/lib_enc/enc_amr_wb_fx.c index 492dd620d..9a03bffb0 100644 --- a/lib_enc/enc_amr_wb_fx.c +++ b/lib_enc/enc_amr_wb_fx.c @@ -7,8 +7,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/enc_gain_fx.c b/lib_enc/enc_gain_fx.c index 8cd87ad10..dbc0e4d29 100644 --- a/lib_enc/enc_gain_fx.c +++ b/lib_enc/enc_gain_fx.c @@ -11,8 +11,7 @@ #include "rom_com.h" #include "rom_enc.h" #include "basop_util.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ void E_GAIN_norm_corr( Word16 exc[], Word16 xn[], Word16 h[], Word16 t_min, Word16 t_max, Word16 corr_norm[], Word16 L_subfr ); diff --git a/lib_enc/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index 1b9823e73..a1c09310f 100644 --- a/lib_enc/enc_gen_voic_fx.c +++ b/lib_enc/enc_gen_voic_fx.c @@ -7,8 +7,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/enc_gen_voic_rf.c b/lib_enc/enc_gen_voic_rf.c index ae4458960..7c38a433d 100644 --- a/lib_enc/enc_gen_voic_rf.c +++ b/lib_enc/enc_gen_voic_rf.c @@ -40,7 +40,7 @@ #include "prot.h" #include "rom_com.h" #include "wmc_auto.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-------------------------------------------------------------------* * reset_rf_indices() diff --git a/lib_enc/enc_gen_voic_rf_fx.c b/lib_enc/enc_gen_voic_rf_fx.c index c60767394..665cb8d45 100644 --- a/lib_enc/enc_gen_voic_rf_fx.c +++ b/lib_enc/enc_gen_voic_rf_fx.c @@ -11,8 +11,7 @@ #include "rom_basop_util.h" //#include "basop_mpy.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/enc_higher_acelp_fx.c b/lib_enc/enc_higher_acelp_fx.c index a67071533..59e2a359e 100644 --- a/lib_enc/enc_higher_acelp_fx.c +++ b/lib_enc/enc_higher_acelp_fx.c @@ -7,8 +7,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "prot_fx_enc.h" /*---------------------------------------------------------------------* diff --git a/lib_enc/enc_nelp_fx.c b/lib_enc/enc_nelp_fx.c index bca4d2a77..3fae11009 100644 --- a/lib_enc/enc_nelp_fx.c +++ b/lib_enc/enc_nelp_fx.c @@ -7,8 +7,7 @@ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_enc/enc_pit_exc_fx.c b/lib_enc/enc_pit_exc_fx.c index f8d6eb8a4..5c223a033 100644 --- a/lib_enc/enc_pit_exc_fx.c +++ b/lib_enc/enc_pit_exc_fx.c @@ -7,8 +7,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*======================================================================*/ diff --git a/lib_enc/enc_ppp_fx.c b/lib_enc/enc_ppp_fx.c index 31cdc0a5c..a3ea6dcbb 100644 --- a/lib_enc/enc_ppp_fx.c +++ b/lib_enc/enc_ppp_fx.c @@ -6,8 +6,7 @@ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/enc_prm_fx.c b/lib_enc/enc_prm_fx.c index b32c0f2ae..0580c786d 100644 --- a/lib_enc/enc_prm_fx.c +++ b/lib_enc/enc_prm_fx.c @@ -12,8 +12,7 @@ #include "rom_com.h" #include "stl.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index a0a9ff902..d9cf06004 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -7,8 +7,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*=================================================================================*/ diff --git a/lib_enc/enc_uv_fx.c b/lib_enc/enc_uv_fx.c index c67a5781e..4e11b34d2 100644 --- a/lib_enc/enc_uv_fx.c +++ b/lib_enc/enc_uv_fx.c @@ -7,8 +7,7 @@ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/energy_fx.c b/lib_enc/energy_fx.c index f14e0b407..f3708d604 100644 --- a/lib_enc/energy_fx.c +++ b/lib_enc/energy_fx.c @@ -9,8 +9,7 @@ #include "rom_enc.h" #include "vad_basop.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* * est_energy_fx() diff --git a/lib_enc/eval_pit_contr_fx.c b/lib_enc/eval_pit_contr_fx.c index df7622653..349b34f0f 100644 --- a/lib_enc/eval_pit_contr_fx.c +++ b/lib_enc/eval_pit_contr_fx.c @@ -7,8 +7,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/evs_enc_fx.c b/lib_enc/evs_enc_fx.c index 7cc08c96b..b2262ece7 100644 --- a/lib_enc/evs_enc_fx.c +++ b/lib_enc/evs_enc_fx.c @@ -7,8 +7,7 @@ #include "prot.h" #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ #include "prot_fx_enc.h" diff --git a/lib_enc/ext_sig_ana_fx.c b/lib_enc/ext_sig_ana_fx.c index a24b15f88..ab3dc57bb 100644 --- a/lib_enc/ext_sig_ana_fx.c +++ b/lib_enc/ext_sig_ana_fx.c @@ -9,8 +9,7 @@ //#include "prot_fx.h" #include "rom_com.h" #include "basop_util.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index d54d787f2..38803594f 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -41,7 +41,7 @@ #include "rom_enc.h" #include "rom_com.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" #include "stat_enc.h" diff --git a/lib_enc/fd_cng_enc_fx.c b/lib_enc/fd_cng_enc_fx.c index 410cec202..33f693d4b 100644 --- a/lib_enc/fd_cng_enc_fx.c +++ b/lib_enc/fd_cng_enc_fx.c @@ -12,8 +12,7 @@ #include "rom_com.h" #include "rom_enc.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" +#include "prot_fx.h" #include "prot_fx_enc.h" #include "basop_util.h" #include "rom_basop_util.h" diff --git a/lib_enc/find_tar_fx.c b/lib_enc/find_tar_fx.c index 14de5fe44..6b4fde721 100644 --- a/lib_enc/find_tar_fx.c +++ b/lib_enc/find_tar_fx.c @@ -4,8 +4,7 @@ #include #include "options.h" /* Compilation switches */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "cnst.h" /* Common constants */ #include "basop_util.h" diff --git a/lib_enc/find_tilt_fx.c b/lib_enc/find_tilt_fx.c index 11106323e..f2e57a6c4 100644 --- a/lib_enc/find_tilt_fx.c +++ b/lib_enc/find_tilt_fx.c @@ -5,8 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_enc/find_uv_fx.c b/lib_enc/find_uv_fx.c index dbe7714c9..41ddc0ebf 100644 --- a/lib_enc/find_uv_fx.c +++ b/lib_enc/find_uv_fx.c @@ -6,8 +6,7 @@ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/find_wsp.c b/lib_enc/find_wsp.c index fb9efa29b..9ecbc8a48 100644 --- a/lib_enc/find_wsp.c +++ b/lib_enc/find_wsp.c @@ -39,7 +39,7 @@ #include "cnst.h" #include "prot.h" #include "wmc_auto.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-------------------------------------------------------------------* * find_wsp() * @@ -96,32 +96,32 @@ void ivas_find_wsp( const Word16 L_frame, /* i : length of the frame */ const Word16 L_subfr, /* i : length of subframe */ const Word16 nb_subfr, /* i : number of subframes */ - const Word16 *A_fx, /* i : A(z) filter coefficients */ - Word16 *Aw_fx, /* o : weighted A(z) filter coefficients */ - const Word16 *speech_fx, /* i : pointer to the denoised speech frame */ + const Word16 *A_fx, /* i : A(z) filter coefficients */ + Word16 *Aw_fx, /* o : weighted A(z) filter coefficients */ + const Word16 *speech_fx, /* i : pointer to the denoised speech frame */ const Word16 tilt_fact, /* i : tilt factor */ - Word16 *wsp_fx, /* o : poitnter to the weighted speech frame */ - Word16 *mem_wsp_fx, /* i/o: W(Z) denominator memory */ + Word16 *wsp_fx, /* o : poitnter to the weighted speech frame */ + Word16 *mem_wsp_fx, /* i/o: W(Z) denominator memory */ const Word16 gamma, /* i : weighting factor */ - const Word16 L_look /* i : look-ahead */ + const Word16 L_look /* i : look-ahead */ ) { Word16 *p_Aw_fx, tmp_fx; Word16 i_subfr; - /*-----------------------------------------------------------------* - * Compute weighted A(z) unquantized for subframes - *-----------------------------------------------------------------*/ +/*-----------------------------------------------------------------* + * Compute weighted A(z) unquantized for subframes + *-----------------------------------------------------------------*/ weight_a_subfr_fx( nb_subfr, A_fx, Aw_fx, gamma, M ); - + /*-----------------------------------------------------------------* * Compute weighted speech for all subframes *-----------------------------------------------------------------*/ p_Aw_fx = Aw_fx; for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_subfr ) { - Residu3_fx( p_Aw_fx, &speech_fx[i_subfr], &wsp_fx[i_subfr], L_subfr, 0 ); + Residu3_fx( p_Aw_fx, &speech_fx[i_subfr], &wsp_fx[i_subfr], L_subfr,0 ); p_Aw_fx += ( M + 1 ); } p_Aw_fx -= ( M + 1 ); @@ -131,7 +131,7 @@ void ivas_find_wsp( *-----------------------------------------------------------------*/ deemph_fx( wsp_fx, tilt_fact, L_frame, mem_wsp_fx ); - Residu3_fx( p_Aw_fx, &speech_fx[L_frame], &wsp_fx[L_frame], L_look, 0 ); + Residu3_fx( p_Aw_fx, &speech_fx[L_frame], &wsp_fx[L_frame], L_look,0 ); tmp_fx = *mem_wsp_fx; deemph_fx( &wsp_fx[L_frame], tilt_fact, L_look, &tmp_fx ); return; diff --git a/lib_enc/find_wsp_fx.c b/lib_enc/find_wsp_fx.c index 21be0073b..06b22cc5e 100644 --- a/lib_enc/find_wsp_fx.c +++ b/lib_enc/find_wsp_fx.c @@ -7,8 +7,7 @@ #include "options.h" #include "cnst.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/frame_spec_dif_cor_rate_fx.c b/lib_enc/frame_spec_dif_cor_rate_fx.c index fb0930579..c94ccedeb 100644 --- a/lib_enc/frame_spec_dif_cor_rate_fx.c +++ b/lib_enc/frame_spec_dif_cor_rate_fx.c @@ -10,8 +10,7 @@ #include "vad_basop.h" //#include "prot_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/gain_enc_fx.c b/lib_enc/gain_enc_fx.c index ad366278c..f9576afeb 100644 --- a/lib_enc/gain_enc_fx.c +++ b/lib_enc/gain_enc_fx.c @@ -7,8 +7,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/gaus_enc_fx.c b/lib_enc/gaus_enc_fx.c index 56ac45f26..8f35bc6fb 100644 --- a/lib_enc/gaus_enc_fx.c +++ b/lib_enc/gaus_enc_fx.c @@ -8,8 +8,7 @@ #include "rom_com.h" /* Static table prototypes */ #include "rom_enc.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ //#include "basop_mpy.h" diff --git a/lib_enc/gp_clip_fx.c b/lib_enc/gp_clip_fx.c index 1a1f1debf..3a82ddd64 100644 --- a/lib_enc/gp_clip_fx.c +++ b/lib_enc/gp_clip_fx.c @@ -37,8 +37,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_enc/gs_enc_fx.c b/lib_enc/gs_enc_fx.c index 615b09fd0..29f6fbb3a 100644 --- a/lib_enc/gs_enc_fx.c +++ b/lib_enc/gs_enc_fx.c @@ -7,8 +7,7 @@ #include "rom_com_fx.h" #include "rom_com.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/guided_plc_enc_fx.c b/lib_enc/guided_plc_enc_fx.c index aebdfb748..64694bbdc 100644 --- a/lib_enc/guided_plc_enc_fx.c +++ b/lib_enc/guided_plc_enc_fx.c @@ -7,8 +7,7 @@ #include "options.h" #include "cnst.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "stat_enc.h" #include "basop_util.h" diff --git a/lib_enc/hf_cod_amrwb_fx.c b/lib_enc/hf_cod_amrwb_fx.c index 0fa53be51..170bb9408 100644 --- a/lib_enc/hf_cod_amrwb_fx.c +++ b/lib_enc/hf_cod_amrwb_fx.c @@ -8,8 +8,7 @@ #include "rom_com_fx.h" #include "cnst.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/hq_classifier_enc_fx.c b/lib_enc/hq_classifier_enc_fx.c index ebf3855ee..c72ebb8cc 100644 --- a/lib_enc/hq_classifier_enc_fx.c +++ b/lib_enc/hq_classifier_enc_fx.c @@ -7,8 +7,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-----------------------------------------------------------------* diff --git a/lib_enc/hq_core_enc_fx.c b/lib_enc/hq_core_enc_fx.c index 132df11bb..a0ca2a16d 100644 --- a/lib_enc/hq_core_enc_fx.c +++ b/lib_enc/hq_core_enc_fx.c @@ -7,8 +7,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------------- diff --git a/lib_enc/hq_env_enc_fx.c b/lib_enc/hq_env_enc_fx.c index d64685dda..f995f364a 100644 --- a/lib_enc/hq_env_enc_fx.c +++ b/lib_enc/hq_env_enc_fx.c @@ -8,8 +8,7 @@ #include "rom_enc.h" #include "rom_com.h" #include "stl.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------------------* diff --git a/lib_enc/hq_hr_enc_fx.c b/lib_enc/hq_hr_enc_fx.c index 3049e6c21..706304fe0 100644 --- a/lib_enc/hq_hr_enc_fx.c +++ b/lib_enc/hq_hr_enc_fx.c @@ -7,8 +7,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------* diff --git a/lib_enc/hq_lr_enc_fx.c b/lib_enc/hq_lr_enc_fx.c index d1f352057..414a77c97 100644 --- a/lib_enc/hq_lr_enc_fx.c +++ b/lib_enc/hq_lr_enc_fx.c @@ -9,8 +9,7 @@ #include "rom_enc.h" //#include "basop_mpy.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/hvq_enc_fx.c b/lib_enc/hvq_enc_fx.c index 107905ccb..4d817c104 100644 --- a/lib_enc/hvq_enc_fx.c +++ b/lib_enc/hvq_enc_fx.c @@ -7,8 +7,7 @@ #include "cnst.h" //#include "prot_fx.h" #include "rom_com.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #define HVQ_ENC_NOISE_DELTA ( (Word16) 3277 ) /* 0.1 in Q15 */ diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index 1841bd93a..c9661e16b 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -9,8 +9,7 @@ #include "cnst.h" #include "stl.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "stat_enc.h" #include "basop_util.h" diff --git a/lib_enc/igf_scf_enc_fx.c b/lib_enc/igf_scf_enc_fx.c index b5a74687a..49bfbe9da 100644 --- a/lib_enc/igf_scf_enc_fx.c +++ b/lib_enc/igf_scf_enc_fx.c @@ -9,8 +9,7 @@ #include "stat_enc.h" #include "stat_com.h" #include "basop_util.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 44b398a89..56144429e 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -41,7 +41,7 @@ #include "rom_enc.h" #include "prot.h" #include "ivas_prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_cnst.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index d740915c1..13c3e06ee 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -10,8 +10,7 @@ #include "stl.h" #include "ivas_cnst.h" #include "ivas_error.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/inov_enc_fx.c b/lib_enc/inov_enc_fx.c index 3b21cb7e7..f3e9dbfd3 100644 --- a/lib_enc/inov_enc_fx.c +++ b/lib_enc/inov_enc_fx.c @@ -8,8 +8,7 @@ #include "basop_util.h" #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/isf_enc_amr_wb_fx.c b/lib_enc/isf_enc_amr_wb_fx.c index 8d19855a4..02bdb00ad 100644 --- a/lib_enc/isf_enc_amr_wb_fx.c +++ b/lib_enc/isf_enc_amr_wb_fx.c @@ -34,8 +34,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/ivas_agc_enc.c b/lib_enc/ivas_agc_enc.c index acfd266eb..8e7055410 100644 --- a/lib_enc/ivas_agc_enc.c +++ b/lib_enc/ivas_agc_enc.c @@ -39,8 +39,7 @@ #include #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #include "basop_util.h" #endif diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index 616d5cc15..39530d87e 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -37,8 +37,7 @@ #include "rom_enc.h" #include "rom_com.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "prot_fx_enc.h" #include "ivas_prot.h" #include "wmc_auto.h" @@ -920,7 +919,7 @@ ivas_error pre_proc_front_ivas_fx( float sp_div, PS[128]; /* speech/music clasif. parameters */ int16_t L_look; /* length of look-ahead */ #if 1 - float snr_sum_he; /* HE SAD parameters */ + float snr_sum_he; /* HE SAD parameters */ #endif float mem_decim_dummy[2 * L_FILT_MAX]; /* dummy decimation filter memory */ float temp1F_icatdmResampBuf[L_FILT_MAX]; /* temp buffers for ICA TDM resamplers */ @@ -962,8 +961,8 @@ ivas_error pre_proc_front_ivas_fx( Word16 *temp1F_icatdmResampBuf_fx; Word16 *old_inp_12k8_fx; Word16 *old_inp_16k_fx; - Word16 *mem_decim_dummy_fx; /* dummy decimation filter memory */ - Word32 Etot_fx; /* total energy */ + Word16 *mem_decim_dummy_fx; /* dummy decimation filter memory */ + Word32 Etot_fx; /* total energy */ #if 0 Word32 fr_bands_fx[2 * NB_BANDS]; /* energy in frequency bands */ Word16 Q_new; @@ -1354,7 +1353,7 @@ ivas_error pre_proc_front_ivas_fx( { mvr2r( new_inp_12k8, st->buf_speech_enc_flt + L_FRAME32k, L_FRAME ); } -#ifndef MSAN_FIX /*To be enabled when updations related to new_inp_12k8_fx is enabled */ +#ifndef MSAN_FIX/*To be enabled when updations related to new_inp_12k8_fx is enabled */ #if 1 IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) { @@ -1730,7 +1729,7 @@ ivas_error pre_proc_front_ivas_fx( st->lt_mean_NB_fx = (Word16) st->lt_mean_NB * ( 1 << 11 ); st->lt_mean_WB_fx = (Word16) st->lt_mean_WB * ( 1 << 11 ); st->lt_mean_SWB_fx = (Word16) st->lt_mean_SWB * ( 1 << 11 ); - st->lp_noise_fx = (Word16) st->lp_noise * ( 1 << 8 ); // have taken Q8 as above one functions uses Q8 + st->lp_noise_fx = (Word16) st->lp_noise * ( 1 << 8 ); //have taken Q8 as above one functions uses Q8 #endif bw_detect_fx( st, st->input_fx, NULL, enerBuffer_fx, sf_energySum, ivas_format, 0 ); diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index cfd4348cb..da80d795c 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -43,8 +43,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index bd7b63a4c..61a8092ca 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -36,8 +36,7 @@ #include #include "cnst.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" #include "ivas_cnst.h" diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index d7e2d24b2..821389abc 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -41,8 +41,7 @@ #include "ivas_rom_com.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index 804470189..0265ac6d1 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -37,7 +37,7 @@ #include "ivas_rom_com.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #endif /*------------------------------------------------------------------------------------------* diff --git a/lib_enc/ivas_front_vad.c b/lib_enc/ivas_front_vad.c index be9a837de..87ae69efe 100644 --- a/lib_enc/ivas_front_vad.c +++ b/lib_enc/ivas_front_vad.c @@ -39,13 +39,12 @@ #include "prot.h" #include "ivas_prot.h" #include "prot_fx_enc.h" -#include "prot_fx1.h" #include #include "wmc_auto.h" #include #ifdef IVAS_FLOAT_FIXED #include "prot_fx_enc.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif /*-----------------------------------------------------------------------------------------* diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 5af37336d..10fae0321 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -42,7 +42,7 @@ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #include "prot_fx_enc.h" -#include "prot_fx1.h" +#include "prot_fx.h" #endif diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c index 157b81378..1aa7a85c3 100644 --- a/lib_enc/ivas_ism_dtx_enc.c +++ b/lib_enc/ivas_ism_dtx_enc.c @@ -38,8 +38,7 @@ #include "ivas_prot.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" -#include "prot_fx1.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #include "prot_fx_enc.h" #define IVAS_FLOAT_FIXED_TO_BE_REMOVED @@ -155,7 +154,7 @@ Word16 ivas_ism_dtx_enc_fx( test(); test(); - if ( GT_16( lp_noise_mean_fx, ( 50 << 8 ) ) || ( GT_16( lp_noise_mean_fx, ( 25 << 8 ) ) && GT_16( lp_noise_variation_fx, ( 32 << 8 ) ) ) ) + if( GT_16( lp_noise_mean_fx, ( 50 << 8 ) ) || ( GT_16( lp_noise_mean_fx, ( 25 << 8 ) ) && GT_16( lp_noise_variation_fx, ( 32 << 8 ) ) ) ) { dtx_flag = 0; move16(); @@ -173,11 +172,11 @@ Word16 ivas_ism_dtx_enc_fx( test(); test(); test(); - if ( !( ( EQ_16( nchan_ism, 1 ) && LE_32( ivas_total_brate, IVAS_24k4 ) ) || - ( EQ_16( nchan_ism, 2 ) && LE_32( ivas_total_brate, IVAS_48k ) ) || - ( EQ_16( nchan_ism, 3 ) && LE_32( ivas_total_brate, IVAS_80k ) ) || - ( EQ_16( nchan_ism, 4 ) && LE_32( ivas_total_brate, IVAS_96k ) ) || - LT_16( lp_noise_max_fx, ( 15 << 8 ) ) ) ) + if( !( ( EQ_16( nchan_ism, 1 ) && LE_32( ivas_total_brate, IVAS_24k4 ) ) || + ( EQ_16( nchan_ism, 2 ) && LE_32( ivas_total_brate, IVAS_48k ) ) || + ( EQ_16( nchan_ism, 3 ) && LE_32( ivas_total_brate, IVAS_80k ) ) || + ( EQ_16( nchan_ism, 4 ) && LE_32( ivas_total_brate, IVAS_96k ) ) || + LT_16( lp_noise_max_fx, ( 15 << 8 ) ) ) ) { dtx_flag = 0; move16(); @@ -209,13 +208,13 @@ Word16 ivas_ism_dtx_enc_fx( /* check difference between current and last metadata */ md_diff_flag[ch] = 0; move16(); - if ( GT_32( L_abs( L_sub( hIsmMeta[ch]->azimuth_fx, hIsmMeta[ch]->last_azimuth_fx ) ), MD_MAX_DIFF_AZIMUTH_FX ) ) + if( GT_32( L_abs( L_sub( hIsmMeta[ch]->azimuth_fx, hIsmMeta[ch]->last_azimuth_fx ) ), MD_MAX_DIFF_AZIMUTH_FX ) ) { md_diff_flag[ch] = 1; move16(); } - if ( GT_32( L_abs( L_sub( hIsmMeta[ch]->elevation_fx, hIsmMeta[ch]->last_elevation_fx ) ), MD_MAX_DIFF_ELEVATION_FX ) ) + if( GT_32( L_abs( L_sub( hIsmMeta[ch]->elevation_fx, hIsmMeta[ch]->last_elevation_fx ) ), MD_MAX_DIFF_ELEVATION_FX ) ) { md_diff_flag[ch] = 1; move16(); @@ -236,7 +235,7 @@ Word16 ivas_ism_dtx_enc_fx( move16(); nBits_MD_max = sub( nBits_MD_max, SID_FORMAT_NBITS ); - if ( GT_16( nchan_transport, 1 ) ) + if( GT_16( nchan_transport, 1 ) ) { nBits_MD_max = sub( nBits_MD_max, nBits_sce_id ); } @@ -246,13 +245,13 @@ Word16 ivas_ism_dtx_enc_fx( nBits_MD_max = sub( nBits_MD_max, nBits_coh ); /* coherence */ } - if ( GT_16( nchan_ism, 3 ) ) + if( GT_16( nchan_ism, 3 ) ) { nBits_MD_max = sub( nBits_MD_max, 1 ); /* ism_mode flag */ } /* too many metadata bits -> switch to active coding */ - if ( GT_16( nBits, nBits_MD_max ) ) + if( GT_16( nBits, nBits_MD_max ) ) { dtx_flag = 0; move16(); @@ -718,7 +717,7 @@ void ivas_ism_coh_estim_dtx_enc_fx( { norm_inp = norm_l( st_id0->input32_fx[i] ); scaled_inp = L_shl( st_id0->input32_fx[i], norm_inp ); - tot_exp = shl( sub( 20, norm_inp ), 1 ); + tot_exp = shl( sub( 20, norm_inp), 1 ); acorr_ene_fx[hISMDTX->sce_id_dtx] = BASOP_Util_Add_Mant32Exp( acorr_ene_fx[hISMDTX->sce_id_dtx], acorr_ene_e[hISMDTX->sce_id_dtx], Mult_32_32( scaled_inp, scaled_inp ), tot_exp, &acorr_ene_e[hISMDTX->sce_id_dtx] ); move32(); } @@ -745,7 +744,7 @@ void ivas_ism_coh_estim_dtx_enc_fx( { norm_inp = norm_l( st->input32_fx[i] ); scaled_inp = L_shl( st->input32_fx[i], norm_inp ); - tot_exp = shl( sub( 20, norm_inp ), 1 ); + tot_exp = shl( sub( 20, norm_inp), 1 ); acorr_ene_fx[sce_id] = BASOP_Util_Add_Mant32Exp( acorr_ene_fx[sce_id], acorr_ene_e[sce_id], Mult_32_32( scaled_inp, scaled_inp ), tot_exp, &acorr_ene_e[sce_id] ); move32(); xcorr_ene_fx = BASOP_Util_Add_Mant32Exp( xcorr_ene_fx, xcorr_ene_e, Mult_32_32( scaled_inp, scaled_inp ), tot_exp, &xcorr_ene_e ); diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 45e4f6534..43cc16ecc 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -39,8 +39,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif @@ -204,12 +203,12 @@ ivas_error ivas_ism_enc( /* compute the dominant sce_id using long term energy */ #ifdef IVAS_FLOAT_FIXED #if 1 /************************flt_to_fix****************************/ - for ( int j = 0; j < st_ivas->nchan_transport; j++ ) + for( int j = 0; j < st_ivas->nchan_transport; j++ ) { - floatToFixed_arrL( st_ivas->hSCE[j]->hCoreCoder[0]->input, st_ivas->hSCE[j]->hCoreCoder[0]->input32_fx, Q11, input_frame ); /*Q0*/ + floatToFixed_arrL( st_ivas->hSCE[j]->hCoreCoder[0]->input, st_ivas->hSCE[j]->hCoreCoder[0]->input32_fx, Q11, input_frame ); /*Q0*/ } f2me_buf( &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc[0][0], &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_fx[0][0], &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_e, st_ivas->nchan_transport * PARAM_ISM_HYS_BUF_SIZE ); - for ( int ch = 0; ch < nchan_ism; ch++ ) + for( int ch = 0; ch < nchan_ism; ch++ ) { st_ivas->hIsmMetaData[ch]->azimuth_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->azimuth, Q22 ); st_ivas->hIsmMetaData[ch]->last_azimuth_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->last_azimuth, Q22 ); @@ -224,15 +223,15 @@ ivas_error ivas_ism_enc( #endif /****************************ends here*********************************/ ivas_ism_get_sce_id_dtx_fx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); dtx_flag = ivas_ism_dtx_enc_fx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, st_ivas->nchan_transport, vad_flag, st_ivas->hIsmMetaData, md_diff_flag, &sid_flag ); - IF( sid_flag ) + IF ( sid_flag ) { /* estimate coherence between objects */ ivas_ism_coh_estim_dtx_enc_fx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); } #if 1 /************************fix_to_flt****************************/ - me2f_buf( &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_fx[0][0], st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_e, &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc[0][0], st_ivas->nchan_transport * PARAM_ISM_HYS_BUF_SIZE ); + me2f_buf(&st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_fx[0][0], st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_e, &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc[0][0], st_ivas->nchan_transport * PARAM_ISM_HYS_BUF_SIZE); fixedToFloat_arr( st_ivas->hISMDTX->coh_fx, st_ivas->hISMDTX->coh, Q15, st_ivas->nchan_transport ); -#endif /****************************ends here*********************************/ +#endif/****************************ends here*********************************/ #else ivas_ism_get_sce_id_dtx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index dd90f0711..49ba2e480 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -39,14 +39,11 @@ #include "ivas_prot_fx.h" #include "ivas_rom_com.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" #include #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED +#include "prot_fx.h" #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" #include "ivas_rom_com_fx.h" #define IVAS_FLOAT_FIXED_TO_BE_REMOVED #endif @@ -1649,15 +1646,15 @@ ivas_error ivas_ism_metadata_enc_create( st_ivas->hIsmMetaData[ch]->last_true_radius_fx = ONE_IN_Q9; /*===============fix-to-flt====================*/ - st_ivas->hIsmMetaData[ch]->last_azimuth = fix_to_float( st_ivas->hIsmMetaData[ch]->last_azimuth_fx, Q22 ); - st_ivas->hIsmMetaData[ch]->last_elevation = fix_to_float( st_ivas->hIsmMetaData[ch]->last_elevation_fx, Q22 ); + st_ivas->hIsmMetaData[ch]->last_azimuth = fix_to_float(st_ivas->hIsmMetaData[ch]->last_azimuth_fx, Q22); + st_ivas->hIsmMetaData[ch]->last_elevation = fix_to_float(st_ivas->hIsmMetaData[ch]->last_elevation_fx, Q22); - st_ivas->hIsmMetaData[ch]->last_true_azimuth = fix_to_float( st_ivas->hIsmMetaData[ch]->last_true_azimuth_fx, Q22 ); - st_ivas->hIsmMetaData[ch]->last_true_elevation = fix_to_float( st_ivas->hIsmMetaData[ch]->last_true_elevation_fx, Q22 ); - st_ivas->hIsmMetaData[ch]->last_true_radius = fix16_to_float( st_ivas->hIsmMetaData[ch]->last_true_radius_fx, Q9 ); + st_ivas->hIsmMetaData[ch]->last_true_azimuth = fix_to_float(st_ivas->hIsmMetaData[ch]->last_true_azimuth_fx, Q22); + st_ivas->hIsmMetaData[ch]->last_true_elevation = fix_to_float(st_ivas->hIsmMetaData[ch]->last_true_elevation_fx, Q22); + st_ivas->hIsmMetaData[ch]->last_true_radius = fix16_to_float(st_ivas->hIsmMetaData[ch]->last_true_radius_fx, Q9); /*===============fix-to-flt====================*/ } - + IF( EQ_16( st_ivas->hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) ) { test(); diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index 49507f078..56b4d4f7d 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -37,8 +37,7 @@ #include "ivas_prot.h" #include "ivas_prot_fx.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "cnst.h" #include "ivas_cnst.h" #include "ivas_rom_com.h" @@ -556,14 +555,14 @@ void ivas_param_ism_compute_noisy_speech_flag( Word16 i; /* Move the Noisy speech buffer */ - FOR( i = 0; i < ( PARAM_ISM_HYS_BUF_SIZE - 1 ); i++ ) + FOR ( i = 0; i < ( PARAM_ISM_HYS_BUF_SIZE - 1 ); i++ ) { st_ivas->hParamIsm->noisy_speech_buffer[i] = st_ivas->hParamIsm->noisy_speech_buffer[i + 1]; move16(); } /* Set flag_noisy_speech to 0 for cases where object energies are not roughly equal */ - IF( !st_ivas->hParamIsm->flag_equal_energy ) + IF ( !st_ivas->hParamIsm->flag_equal_energy ) { st_ivas->hParamIsm->noisy_speech_buffer[i] = 0; st_ivas->hParamIsm->flag_noisy_speech = 0; @@ -574,10 +573,10 @@ void ivas_param_ism_compute_noisy_speech_flag( { /* For the current frame, make a decision based on some core-coder flags */ test(); - IF( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr ) + IF ( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr ) { test(); - IF( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) + IF ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) { st_ivas->hParamIsm->noisy_speech_buffer[i] = 0; move16(); @@ -597,7 +596,7 @@ void ivas_param_ism_compute_noisy_speech_flag( /* Do a decision based on hysteresis */ st_ivas->hParamIsm->flag_noisy_speech = 1; move16(); - FOR( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ ) + FOR ( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ ) { test(); st_ivas->hParamIsm->flag_noisy_speech = st_ivas->hParamIsm->flag_noisy_speech && st_ivas->hParamIsm->noisy_speech_buffer[i]; diff --git a/lib_enc/ivas_lfe_enc.c b/lib_enc/ivas_lfe_enc.c index 6a011d23c..6719ae1d7 100644 --- a/lib_enc/ivas_lfe_enc.c +++ b/lib_enc/ivas_lfe_enc.c @@ -40,8 +40,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif // IVAS_FLOAT_FIXED diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 6ccf6af51..1684d34a1 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -39,11 +39,8 @@ #include "ivas_stat_enc.h" #include "wmc_auto.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif #ifdef IVAS_FLOAT_FIXED diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index 9c3d0bfb1..a4ba849d4 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -40,7 +40,7 @@ #include "ivas_prot.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif #include "ivas_cnst.h" #include "ivas_rom_com.h" diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index 3748ef6a4..0588844fb 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -39,8 +39,7 @@ #include "ivas_prot_fx.h" #include "options.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_rom_com.h" #include "ivas_rom_enc.h" #include "wmc_auto.h" @@ -1026,21 +1025,21 @@ void ivas_mcmasa_param_est_enc( Word16 x1_q_fx[MASA_FREQUENCY_BANDS]; Word16 x2_q_fx[MASA_FREQUENCY_BANDS]; Word16 y_q_fx[MASA_FREQUENCY_BANDS]; - FOR( i = 0; i < num_freq_bands; i++ ) + FOR(i = 0; i < num_freq_bands; i++) { - x1_q_fx[i] = Q_factor_L( diffuseness_vector[i] ); - x1_fx[i] = (Word32) ( diffuseness_vector[i] * ( W_shl( 1, x1_q_fx[i] ) ) ); - x2_q_fx[i] = Q_factor_L( vertical_diffuseness_vector[i] ); - x2_fx[i] = (Word32) ( vertical_diffuseness_vector[i] * ( W_shl( 1, x2_q_fx[i] ) ) ); + x1_q_fx[i] = Q_factor_L(diffuseness_vector[i]); + x1_fx[i] = (Word32)(diffuseness_vector[i] * (W_shl(1, x1_q_fx[i]))); + x2_q_fx[i] = Q_factor_L(vertical_diffuseness_vector[i]); + x2_fx[i] = (Word32)(vertical_diffuseness_vector[i] * (W_shl(1, x2_q_fx[i]))); } ///////////////////////////////////////////////////////////////////////// - v_min_fx( (const Word32 *) x1_fx, x1_q_fx, (const Word32 *) x2_fx, x2_q_fx, y_fx, y_q_fx, num_freq_bands ); + v_min_fx((const Word32 *)x1_fx, x1_q_fx, (const Word32 *)x2_fx, x2_q_fx, y_fx, y_q_fx, num_freq_bands ); //////////////////////// to be removed //////////////////////////////// - FOR( i = 0; i < num_freq_bands; i++ ) + FOR(i = 0; i < num_freq_bands; i++) { - diffuseness_vector[i] = (Float32) y_fx[i] / ( W_shl( 1, y_q_fx[i] ) ); + diffuseness_vector[i] = (Float32)y_fx[i] / (W_shl(1, y_q_fx[i])); } /////////////////////////////////////////////////////////////////////// #else diff --git a/lib_enc/ivas_mct_enc_mct.c b/lib_enc/ivas_mct_enc_mct.c index 4e4bdded5..d3628b7e1 100644 --- a/lib_enc/ivas_mct_enc_mct.c +++ b/lib_enc/ivas_mct_enc_mct.c @@ -37,7 +37,7 @@ #include "ivas_prot.h" #include "ivas_prot_fx.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "wmc_auto.h" #include diff --git a/lib_enc/ivas_omasa_enc.c b/lib_enc/ivas_omasa_enc.c index 8f3d726a5..7d815d5d1 100644 --- a/lib_enc/ivas_omasa_enc.c +++ b/lib_enc/ivas_omasa_enc.c @@ -38,8 +38,7 @@ #include "ivas_prot.h" #include "ivas_prot_fx.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_rom_com.h" #include "ivas_rom_enc.h" #include "wmc_auto.h" diff --git a/lib_enc/ivas_osba_enc.c b/lib_enc/ivas_osba_enc.c index 5a8fcfa78..8e65a938f 100644 --- a/lib_enc/ivas_osba_enc.c +++ b/lib_enc/ivas_osba_enc.c @@ -42,8 +42,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 37d72eda5..819a42d3e 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -42,8 +42,7 @@ #include "wmc_auto.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_rom_com_fx.h" diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 2ebcdba1e..5d77849e8 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -43,8 +43,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index c2b53d5f5..cbaf1faa3 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -37,7 +37,7 @@ #include "ivas_cnst.h" #include "rom_com.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "prot_fx_enc.h" #include "ivas_prot.h" #include "ivas_rom_com.h" diff --git a/lib_enc/ivas_sns_enc.c b/lib_enc/ivas_sns_enc.c index 7b1a19313..673df674f 100644 --- a/lib_enc/ivas_sns_enc.c +++ b/lib_enc/ivas_sns_enc.c @@ -38,7 +38,7 @@ #include "prot.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "rom_com.h" #include "ivas_rom_com.h" #include "ivas_cnst.h" diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index b1e9ad53a..29ec47922 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -35,8 +35,7 @@ #include "ivas_prot.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "options.h" #endif #include "ivas_rom_com.h" @@ -596,7 +595,6 @@ ivas_error ivas_spar_enc( /* write the number of objects in ISM_SBA format*/ push_indice( hMetaData, IND_ISM_NUM_OBJECTS, hEncoderConfig->nchan_ism - 1, NO_BITS_MASA_ISM_NO_OBJ ); } - /* front VAD */ if ( ( error = front_vad_spar( st_ivas->hSpar, data_f[0], hEncoderConfig, input_frame ) ) != IVAS_ERR_OK ) { diff --git a/lib_enc/ivas_stereo_classifier.c b/lib_enc/ivas_stereo_classifier.c index 00e6acb31..b28abea78 100644 --- a/lib_enc/ivas_stereo_classifier.c +++ b/lib_enc/ivas_stereo_classifier.c @@ -41,7 +41,7 @@ #include "ivas_rom_enc.h" #include "ivas_cnst.h" #include "wmc_auto.h" -#include "prot_fx1.h" +#include "prot_fx.h" /*-------------------------------------------------------------------* @@ -233,7 +233,7 @@ void stereo_classifier_init( hStereoClassif->nchar_ch2 = 0.0f; hStereoClassif->non_sta_ch1 = 0.0f; hStereoClassif->sp_div_ch1 = 0.0f; - + #ifdef IVAS_FLOAT_FIXED hStereoClassif->ps_diff_ch1_fx = 0; hStereoClassif->ps_diff_ch2_fx = 0; diff --git a/lib_enc/ivas_stereo_cng_enc.c b/lib_enc/ivas_stereo_cng_enc.c index f8fa5aea4..55247933e 100644 --- a/lib_enc/ivas_stereo_cng_enc.c +++ b/lib_enc/ivas_stereo_cng_enc.c @@ -41,7 +41,7 @@ #include "ivas_cnst.h" #include "ivas_rom_com.h" #include "wmc_auto.h" -#include "prot_fx1.h" +#include "prot_fx.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index 27552f50b..46db4d6a5 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -40,7 +40,7 @@ #include "prot.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_cnst.h" #include "ivas_rom_com.h" #include "ivas_rom_com_fx.h" diff --git a/lib_enc/ivas_stereo_ica_enc.c b/lib_enc/ivas_stereo_ica_enc.c index dc9fdc301..aadfd8d58 100644 --- a/lib_enc/ivas_stereo_ica_enc.c +++ b/lib_enc/ivas_stereo_ica_enc.c @@ -41,8 +41,7 @@ #include "wmc_auto.h" #include "rom_com.h" #include "ivas_rom_com.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*--------------------------------------------------------------- * Local function prototypes diff --git a/lib_enc/ivas_stereo_icbwe_enc.c b/lib_enc/ivas_stereo_icbwe_enc.c index d762468aa..f1f837150 100644 --- a/lib_enc/ivas_stereo_icbwe_enc.c +++ b/lib_enc/ivas_stereo_icbwe_enc.c @@ -40,7 +40,7 @@ #include "wmc_auto.h" #include "rom_com.h" #include "ivas_rom_com.h" -#include "prot_fx1.h" +#include "prot_fx.h" /*-------------------------------------------------------------------* * ic_bwe_enc_reset() diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index db45ca3f9..4068c17ef 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -36,7 +36,7 @@ #include #include "cnst.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "rom_com.h" #include "wmc_auto.h" @@ -470,8 +470,8 @@ void stereo_mdct_core_enc( if ( !hStereoMdct->isSBAStereoMode ) { #ifdef IVAS_FLOAT_FIXED - IF( hStereoMdct->hItd ) - hStereoMdct->hItd->itd_fx[1] = float_to_fix( hStereoMdct->hItd->itd[1], Q23 ); + IF(hStereoMdct->hItd) + hStereoMdct->hItd->itd_fx[1] = float_to_fix(hStereoMdct->hItd->itd[1], Q23); #endif stereo_bits = write_stereo_to_bitstream( hStereoMdct, sts, ms_mask, 0, hBstr ); } @@ -488,16 +488,16 @@ void stereo_mdct_core_enc( FindSplitRatio( hCPE, sts ); #else #if 1 - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + FOR( ch = 0; ch < CPE_CHANNELS; ch++) { - L_subframeTCX = sts[ch]->hTcxEnc->L_frameTCX / ( ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); - IF( sts[ch]->last_core == ACELP_CORE ) + L_subframeTCX = sts[ch]->hTcxEnc->L_frameTCX / (( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV); + IF(sts[ch]->last_core == ACELP_CORE) { L_subframeTCX += L_subframeTCX / 4; } - FOR( n = 0; n <= ( ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ) - 1; n++ ) + FOR ( n = 0; n <= (( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV) - 1; n++ ) { - f2me_buf( sts[ch]->hTcxEnc->spectrum[n], sts[ch]->hTcxEnc->spectrum_fx[n], &sts[ch]->hTcxEnc->spectrum_e[n], L_subframeTCX ); + f2me_buf(sts[ch]->hTcxEnc->spectrum[n], sts[ch]->hTcxEnc->spectrum_fx[n], &sts[ch]->hTcxEnc->spectrum_e[n], L_subframeTCX); } } #endif diff --git a/lib_enc/ivas_stereo_mdct_igf_enc.c b/lib_enc/ivas_stereo_mdct_igf_enc.c index 329401343..51862db72 100644 --- a/lib_enc/ivas_stereo_mdct_igf_enc.c +++ b/lib_enc/ivas_stereo_mdct_igf_enc.c @@ -35,7 +35,7 @@ #include "options.h" #include #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "cnst.h" #include "stat_enc.h" #include "ivas_stat_enc.h" diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc.c b/lib_enc/ivas_stereo_mdct_stereo_enc.c index 54618a32a..9528fa9cb 100644 --- a/lib_enc/ivas_stereo_mdct_stereo_enc.c +++ b/lib_enc/ivas_stereo_mdct_stereo_enc.c @@ -37,9 +37,8 @@ #include "ivas_cnst.h" #include "ivas_prot.h" #include "ivas_prot_fx.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "prot.h" -#include "prot_fx1.h" #include "prot_fx_enc.h" #include "ivas_rom_com.h" #include "ivas_rom_com_fx.h" diff --git a/lib_enc/lead_indexing_fx.c b/lib_enc/lead_indexing_fx.c index b3ceeda43..282bdf5fb 100644 --- a/lib_enc/lead_indexing_fx.c +++ b/lib_enc/lead_indexing_fx.c @@ -7,8 +7,7 @@ //#include "prot_fx.h" #include "rom_com_fx.h" #include "rom_com.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index b35609ce1..73ae64a70 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -34,7 +34,7 @@ #include "ivas_prot.h" #include "ivas_prot_fx.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "prot_fx_enc.h" #include #include @@ -481,11 +481,11 @@ ivas_error IVAS_ENC_FeedObjectMetadata( error = ivas_set_ism_metadata_fx( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], azimuth_fx, elevation_fx, radius_fx, yaw_fx, pitch_fx, metadata.non_diegetic_flag ); /*================fix-to-flt====================*/ - hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->azimuth = fix_to_float( azimuth_fx, Q22 ); - hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->elevation = fix_to_float( elevation_fx, Q22 ); - hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->radius = fix_to_float( radius_fx, Q9 ); - hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->yaw = fix_to_float( yaw_fx, Q22 ); - hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->pitch = fix_to_float( pitch_fx, Q22 ); + hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->azimuth = fix_to_float(azimuth_fx, Q22); + hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->elevation = fix_to_float(elevation_fx, Q22); + hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->radius = fix_to_float(radius_fx, Q9); + hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->yaw = fix_to_float(yaw_fx, Q22); + hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->pitch = fix_to_float(pitch_fx, Q22); /*================fix-to-flt====================*/ #else error = ivas_set_ism_metadata( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth, metadata.elevation, metadata.radius, metadata.yaw, metadata.pitch, metadata.non_diegetic_flag ); diff --git a/lib_enc/long_enr_fx.c b/lib_enc/long_enr_fx.c index 05ea4ee26..3f0d5e792 100644 --- a/lib_enc/long_enr_fx.c +++ b/lib_enc/long_enr_fx.c @@ -6,8 +6,7 @@ #include "cnst.h" /* Common constants */ #include "rom_com.h" #include "stl.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -18,14 +17,14 @@ *-------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED void ivas_long_enr_fx( - Encoder_State *st_fx, /* i/o: state structure */ - const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) */ - const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ - Word16 high_lpn_flag, /* i : sp/mus LPN flag */ - FRONT_VAD_ENC_HANDLE hFrontVad[], /* i/o: front-VAD handles */ - const Word16 n_chan, /* i : number of channels */ + Encoder_State *st_fx, /* i/o: state structure */ + const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) */ + const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ + Word16 high_lpn_flag, /* i : sp/mus LPN flag */ + FRONT_VAD_ENC_HANDLE hFrontVad[], /* i/o: front-VAD handles */ + const Word16 n_chan, /* i : number of channels */ const Word16 localVAD_HE_SAD_LR[], /* i : HE-SAD flag without hangover LR channels */ - const Word16 Etot_LR[] /* i : total channel energy LR channels */ + const Word16 Etot_LR[] /* i : total channel energy LR channels */ ) { @@ -38,16 +37,16 @@ void ivas_long_enr_fx( * and total active speech energy *-----------------------------------------------------------------*/ Word16 n; - IF( hFrontVad != NULL ) + IF ( hFrontVad != NULL ) { - IF( LT_16( hFrontVad[0]->ini_frame, 4 ) ) + IF ( LT_16(hFrontVad[0]->ini_frame , 4) ) { - FOR( n = 0; n < n_chan; n++ ) + FOR ( n = 0; n < n_chan; n++ ) { hFrontVad[n]->lp_noise_fx = hFrontVad[n]->hNoiseEst->totalNoise_fx; tmp = add( hFrontVad[n]->lp_noise_fx, 2560 ); - IF( LT_16( hFrontVad[n]->lp_speech_fx, tmp ) ) + IF ( LT_16(hFrontVad[n]->lp_speech_fx , tmp )) { hFrontVad[n]->lp_speech_fx = tmp; move16(); @@ -58,7 +57,7 @@ void ivas_long_enr_fx( { Word16 smooth_prev, smooth_curr; - IF( LT_16( hFrontVad[0]->ini_frame, 150 ) ) + IF ( LT_16(hFrontVad[0]->ini_frame , 150) ) { smooth_prev = 31130; smooth_curr = 1638; @@ -69,24 +68,24 @@ void ivas_long_enr_fx( smooth_curr = 655; } - FOR( n = 0; n < n_chan; n++ ) + FOR ( n = 0; n < n_chan; n++ ) { - hFrontVad[n]->lp_noise_fx = add( mult_r( smooth_prev, hFrontVad[n]->lp_noise_fx ), mult_r( smooth_curr, hFrontVad[n]->hNoiseEst->totalNoise_fx ) ); + hFrontVad[n]->lp_noise_fx = add(mult_r(smooth_prev , hFrontVad[n]->lp_noise_fx) , mult_r(smooth_curr , hFrontVad[n]->hNoiseEst->totalNoise_fx)); - IF( localVAD_HE_SAD_LR[n] && !high_lpn_flag ) + IF ( localVAD_HE_SAD_LR[n] && !high_lpn_flag ) { - IF( LT_16( sub( hFrontVad[n]->lp_speech_fx, Etot_LR[n] ), 2560 ) ) + IF ( LT_16(sub( hFrontVad[n]->lp_speech_fx , Etot_LR[n] ) , 2560) ) { - hFrontVad[n]->lp_speech_fx = add( mult_r( 32113, hFrontVad[n]->lp_speech_fx ), mult_r( 655, Etot_LR[n] ) ); + hFrontVad[n]->lp_speech_fx = add(mult_r(32113 , hFrontVad[n]->lp_speech_fx) , mult_r(655 , Etot_LR[n])); } ELSE { - hFrontVad[n]->lp_speech_fx = sub( hFrontVad[n]->lp_speech_fx, 13 ); + hFrontVad[n]->lp_speech_fx = sub(hFrontVad[n]->lp_speech_fx , 13); } } } } - FOR( n = 0; n < n_chan; n++ ) + FOR ( n = 0; n < n_chan; n++ ) { hFrontVad[n]->hNoiseEst->Etot_last_fx = Etot_LR[n]; move16(); diff --git a/lib_enc/lp_exc_e_fx.c b/lib_enc/lp_exc_e_fx.c index a8a6abc33..206e7435c 100644 --- a/lib_enc/lp_exc_e_fx.c +++ b/lib_enc/lp_exc_e_fx.c @@ -6,8 +6,7 @@ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/lsf_enc.c b/lib_enc/lsf_enc.c index a9671520e..855f78667 100644 --- a/lib_enc/lsf_enc.c +++ b/lib_enc/lsf_enc.c @@ -40,7 +40,7 @@ #include "rom_enc.h" #include "rom_com.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "basop_proto_func.h" #include "ivas_prot.h" #ifdef IVAS_FLOAT_FIXED diff --git a/lib_enc/lsf_enc_fx.c b/lib_enc/lsf_enc_fx.c index 1009c2bcc..97aef1cc7 100644 --- a/lib_enc/lsf_enc_fx.c +++ b/lib_enc/lsf_enc_fx.c @@ -8,8 +8,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "ivas_prot_fx.h" /* Function prototypes */ diff --git a/lib_enc/lsf_msvq_ma_enc_fx.c b/lib_enc/lsf_msvq_ma_enc_fx.c index bf58e5040..4d0cce641 100644 --- a/lib_enc/lsf_msvq_ma_enc_fx.c +++ b/lib_enc/lsf_msvq_ma_enc_fx.c @@ -11,8 +11,7 @@ #include "rom_com.h" #include "rom_enc.h" #include "basop_util.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/ltd_stable_fx.c b/lib_enc/ltd_stable_fx.c index 797b21829..0da80653f 100644 --- a/lib_enc/ltd_stable_fx.c +++ b/lib_enc/ltd_stable_fx.c @@ -9,8 +9,7 @@ #include "vad_basop.h" //#include "prot_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/mdct_classifier_fx.c b/lib_enc/mdct_classifier_fx.c index 63f9c78be..a34ff46b4 100644 --- a/lib_enc/mdct_classifier_fx.c +++ b/lib_enc/mdct_classifier_fx.c @@ -7,8 +7,7 @@ #include "cnst.h" //#include "prot_fx.h" #include "rom_com.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------* diff --git a/lib_enc/mdct_selector_fx.c b/lib_enc/mdct_selector_fx.c index d2e0b980c..88b3d1f04 100644 --- a/lib_enc/mdct_selector_fx.c +++ b/lib_enc/mdct_selector_fx.c @@ -7,8 +7,7 @@ #include "cnst.h" //#include "prot_fx.h" #include "rom_com.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-----------------------------------------------------------------* diff --git a/lib_enc/mslvq_enc_fx.c b/lib_enc/mslvq_enc_fx.c index ea953ebd5..c951eac70 100644 --- a/lib_enc/mslvq_enc_fx.c +++ b/lib_enc/mslvq_enc_fx.c @@ -9,8 +9,7 @@ #include "stl.h" #include "prot.h" /* Function prototypes */ #include "basop32.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/multi_harm_fx.c b/lib_enc/multi_harm_fx.c index cc3aef87c..084f81c8f 100644 --- a/lib_enc/multi_harm_fx.c +++ b/lib_enc/multi_harm_fx.c @@ -5,8 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_enc/nelp_enc_fx.c b/lib_enc/nelp_enc_fx.c index a0b228c1e..6cd309d08 100644 --- a/lib_enc/nelp_enc_fx.c +++ b/lib_enc/nelp_enc_fx.c @@ -34,8 +34,7 @@ #include "control.h" #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx1.h" -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "rom_com.h" diff --git a/lib_enc/nois_est_fx.c b/lib_enc/nois_est_fx.c index b8ce1a186..bc5f2790f 100644 --- a/lib_enc/nois_est_fx.c +++ b/lib_enc/nois_est_fx.c @@ -8,8 +8,7 @@ #include "cnst.h" #include "rom_com.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_enc/noise_adjust_fx.c b/lib_enc/noise_adjust_fx.c index 1e149ad14..adfd407b7 100644 --- a/lib_enc/noise_adjust_fx.c +++ b/lib_enc/noise_adjust_fx.c @@ -6,8 +6,7 @@ #include "cnst.h" /* Common constants */ #include "rom_com_fx.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------* diff --git a/lib_enc/normalizecoefs_fx.c b/lib_enc/normalizecoefs_fx.c index 816f8531d..4fb461c65 100644 --- a/lib_enc/normalizecoefs_fx.c +++ b/lib_enc/normalizecoefs_fx.c @@ -6,8 +6,7 @@ #include "cnst.h" /* Common constants */ //#include "basop_mpy.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/peak_vq_enc_fx.c b/lib_enc/peak_vq_enc_fx.c index 5b3848706..37090b922 100644 --- a/lib_enc/peak_vq_enc_fx.c +++ b/lib_enc/peak_vq_enc_fx.c @@ -10,8 +10,7 @@ #include "rom_enc.h" #include "rom_com_fx.h" #include "rom_com.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------------- diff --git a/lib_enc/pit_enc_fx.c b/lib_enc/pit_enc_fx.c index 86343944b..9c1a80d6f 100644 --- a/lib_enc/pit_enc_fx.c +++ b/lib_enc/pit_enc_fx.c @@ -10,8 +10,7 @@ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_basop_util.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #define inv_T0_res InvIntTable diff --git a/lib_enc/pitch_ol2_fx.c b/lib_enc/pitch_ol2_fx.c index cdbdea791..73fdde952 100644 --- a/lib_enc/pitch_ol2_fx.c +++ b/lib_enc/pitch_ol2_fx.c @@ -9,8 +9,7 @@ #include "rom_com.h" /* Encoder static table prototypes */ #include "rom_dec.h" //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/pitch_ol_fx.c b/lib_enc/pitch_ol_fx.c index 692e06ad9..8a1a7c753 100644 --- a/lib_enc/pitch_ol_fx.c +++ b/lib_enc/pitch_ol_fx.c @@ -10,8 +10,7 @@ #include "rom_com_fx.h" #include "rom_com.h" #include "rom_enc.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-----------------------------------------------------------------* @@ -1048,6 +1047,7 @@ void pitch_ol_fx( find_mult_fx( &fac, pitchX[i][NSECT + 0], pitchX[i][NSECT + 1], pit_max[4], &scaledX[i][NSECT + 0], old_pitch, old_corr, DELTA0, STEP ); /* Multiples in 2nd section */ } } + fac = THRES0; move16(); /* the look-ahead */ find_mult_fx( &fac, pitchX[i][2], pitchX[i][3], pit_max[7], &scaledX[i][2], old_pitch, old_corr, 2, 2 ); /* Multiples in 3rd section */ @@ -1267,6 +1267,7 @@ void pitch_ol_fx( /*--------------------------------------------------------------* * Update old pitch, upsample pitch, *--------------------------------------------------------------*/ + *old_pitch = pitch[1]; move16(); diff --git a/lib_enc/plc_enc_ext_fx.c b/lib_enc/plc_enc_ext_fx.c index 5c6af38f3..0a451f757 100644 --- a/lib_enc/plc_enc_ext_fx.c +++ b/lib_enc/plc_enc_ext_fx.c @@ -9,8 +9,7 @@ #include "stat_enc.h" //#include "prot_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/ppp_enc_fx.c b/lib_enc/ppp_enc_fx.c index 8353659ee..82657654c 100644 --- a/lib_enc/ppp_enc_fx.c +++ b/lib_enc/ppp_enc_fx.c @@ -8,8 +8,7 @@ //#include "prot_fx.h" #include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/pre_proc_fx.c b/lib_enc/pre_proc_fx.c index 76a128110..3cc9a733a 100644 --- a/lib_enc/pre_proc_fx.c +++ b/lib_enc/pre_proc_fx.c @@ -8,8 +8,7 @@ #include "rom_com_fx.h" //#include "prot_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/pvq_core_enc_fx.c b/lib_enc/pvq_core_enc_fx.c index 994a513a9..dce290b45 100644 --- a/lib_enc/pvq_core_enc_fx.c +++ b/lib_enc/pvq_core_enc_fx.c @@ -8,8 +8,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/pvq_encode_fx.c b/lib_enc/pvq_encode_fx.c index d5bd9ee48..9faaf9ed5 100644 --- a/lib_enc/pvq_encode_fx.c +++ b/lib_enc/pvq_encode_fx.c @@ -5,8 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "rom_com_fx.h" #include "rom_com.h" diff --git a/lib_enc/q_gain2p_fx.c b/lib_enc/q_gain2p_fx.c index 6c0110bc7..a2f2c93da 100644 --- a/lib_enc/q_gain2p_fx.c +++ b/lib_enc/q_gain2p_fx.c @@ -10,8 +10,7 @@ #include "basop_util.h" #include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/qlpc_avq_fx.c b/lib_enc/qlpc_avq_fx.c index 892a25eba..1c28210ad 100644 --- a/lib_enc/qlpc_avq_fx.c +++ b/lib_enc/qlpc_avq_fx.c @@ -9,8 +9,7 @@ #include "cnst.h" //#include "prot_fx.h" #include "rom_com.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/qlpc_stoch_fx.c b/lib_enc/qlpc_stoch_fx.c index 257693928..042a7f9f3 100644 --- a/lib_enc/qlpc_stoch_fx.c +++ b/lib_enc/qlpc_stoch_fx.c @@ -11,8 +11,7 @@ #include "rom_com_fx.h" #include "rom_com.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" #include "rom_basop_util.h" diff --git a/lib_enc/range_enc_fx.c b/lib_enc/range_enc_fx.c index 81fb76952..4f8c5c905 100644 --- a/lib_enc/range_enc_fx.c +++ b/lib_enc/range_enc_fx.c @@ -9,8 +9,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/re8_cod_fx.c b/lib_enc/re8_cod_fx.c index 0b14385fe..e3c084c4b 100644 --- a/lib_enc/re8_cod_fx.c +++ b/lib_enc/re8_cod_fx.c @@ -5,8 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*------------------------------------------------------------------------ diff --git a/lib_enc/reordernorm_fx.c b/lib_enc/reordernorm_fx.c index df30c3084..ceb9d8d6f 100644 --- a/lib_enc/reordernorm_fx.c +++ b/lib_enc/reordernorm_fx.c @@ -8,8 +8,7 @@ #include "rom_com_fx.h" #include "rom_com.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------*/ diff --git a/lib_enc/rst_enc_fx.c b/lib_enc/rst_enc_fx.c index 009ba531a..938efc631 100644 --- a/lib_enc/rst_enc_fx.c +++ b/lib_enc/rst_enc_fx.c @@ -7,8 +7,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "stl.h" diff --git a/lib_enc/scale_enc_fx.c b/lib_enc/scale_enc_fx.c index dd4f88b00..22e79e310 100644 --- a/lib_enc/scale_enc_fx.c +++ b/lib_enc/scale_enc_fx.c @@ -6,8 +6,7 @@ #include "cnst.h" /* Common constants */ #include "rom_com_fx.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "stl.h" diff --git a/lib_enc/set_impulse_fx.c b/lib_enc/set_impulse_fx.c index a145e42d6..7243d9a72 100644 --- a/lib_enc/set_impulse_fx.c +++ b/lib_enc/set_impulse_fx.c @@ -7,8 +7,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-----------------------------------------------------------------* diff --git a/lib_enc/setmodeindex_fx.c b/lib_enc/setmodeindex_fx.c index 7920db3e2..2a2fcf7e9 100644 --- a/lib_enc/setmodeindex_fx.c +++ b/lib_enc/setmodeindex_fx.c @@ -8,8 +8,7 @@ #include "cnst.h" #include "rom_com_fx.h" #include "rom_enc.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------- diff --git a/lib_enc/sig_clas_fx.c b/lib_enc/sig_clas_fx.c index 62f732939..a80f2865f 100644 --- a/lib_enc/sig_clas_fx.c +++ b/lib_enc/sig_clas_fx.c @@ -7,8 +7,7 @@ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*---------------------------------------------------------------------* diff --git a/lib_enc/spec_center_fx.c b/lib_enc/spec_center_fx.c index a3fb197cb..5c088ca97 100644 --- a/lib_enc/spec_center_fx.c +++ b/lib_enc/spec_center_fx.c @@ -8,8 +8,7 @@ #include "vad_basop.h" //#include "prot_fx.h" #include "rom_enc.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/spec_flatness_fx.c b/lib_enc/spec_flatness_fx.c index 918faa5e6..33337bb7a 100644 --- a/lib_enc/spec_flatness_fx.c +++ b/lib_enc/spec_flatness_fx.c @@ -9,8 +9,7 @@ #include "basop_util.h" #include "vad_basop.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/speech_music_classif.c b/lib_enc/speech_music_classif.c index e41e50052..38fc00649 100644 --- a/lib_enc/speech_music_classif.c +++ b/lib_enc/speech_music_classif.c @@ -45,7 +45,7 @@ #include "rom_com.h" /* Common static table prototypes */ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #endif @@ -136,8 +136,8 @@ void speech_music_clas_init( { hSpMusClas->prev_FV[i] = 0.5f * hout_intervals[2 * i] + 0.5f * hout_intervals[2 * i + 1]; #ifdef IVAS_FLOAT_FIXED - hSpMusClas->prev_FV_fx[i] = (Word32) ( hSpMusClas->prev_FV[i] * ONE_IN_Q20 ); -#endif + hSpMusClas->prev_FV_fx[i] =( Word32)( hSpMusClas->prev_FV[i] * ONE_IN_Q20 ); + #endif } for ( i = 0; i < NB_BANDS_SPMUS; i++ ) diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index 26170c4d2..cfb9ac57c 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -11,8 +11,7 @@ #include "rom_com_fx.h" #include "rom_com.h" #include "stl.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED #include @@ -3022,7 +3021,7 @@ static void flux_fx( #ifdef BASOP_NOGLOB L_flux = L_add_sat( L_flux, abs_s( sub_sat( Bin_E[i], old_Bin_E[i] ) ) ); /*Q7 */ #else - L_flux = L_add( L_flux, abs_s( sub( Bin_E[i], old_Bin_E[i] ) ) ); /*Q7 */ + L_flux = L_add( L_flux, abs_s( sub( Bin_E[i], old_Bin_E[i] ) ) ); /*Q7 */ #endif } if ( p2v_map[i] != 0 ) diff --git a/lib_enc/stat_noise_uv_enc_fx.c b/lib_enc/stat_noise_uv_enc_fx.c index b72ddf02f..c5d2d15c6 100644 --- a/lib_enc/stat_noise_uv_enc_fx.c +++ b/lib_enc/stat_noise_uv_enc_fx.c @@ -8,8 +8,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*======================================================================*/ diff --git a/lib_enc/subband_fft_fx.c b/lib_enc/subband_fft_fx.c index cee91f7ab..66c55d586 100644 --- a/lib_enc/subband_fft_fx.c +++ b/lib_enc/subband_fft_fx.c @@ -9,8 +9,7 @@ #include "vad_basop.h" //#include "prot_fx.h" #include "rom_enc.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*---------------------------------------------------------------------* diff --git a/lib_enc/swb_bwe_enc_fx.c b/lib_enc/swb_bwe_enc_fx.c index 02e122321..5ee7f2313 100644 --- a/lib_enc/swb_bwe_enc_fx.c +++ b/lib_enc/swb_bwe_enc_fx.c @@ -10,8 +10,7 @@ #include "rom_com_fx.h" #include "rom_com.h" #include "stl.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*---------------------------------------------------------------------* diff --git a/lib_enc/swb_bwe_enc_hr_fx.c b/lib_enc/swb_bwe_enc_hr_fx.c index 006a6195b..60526314e 100644 --- a/lib_enc/swb_bwe_enc_hr_fx.c +++ b/lib_enc/swb_bwe_enc_hr_fx.c @@ -9,8 +9,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/swb_bwe_enc_lr_fx.c b/lib_enc/swb_bwe_enc_lr_fx.c index 10df60015..3a8b23845 100644 --- a/lib_enc/swb_bwe_enc_lr_fx.c +++ b/lib_enc/swb_bwe_enc_lr_fx.c @@ -32,8 +32,7 @@ #include #include "options.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "rom_com.h" #include "enh32.h" diff --git a/lib_enc/swb_pre_proc_fx.c b/lib_enc/swb_pre_proc_fx.c index 1bcef7025..7650141b6 100644 --- a/lib_enc/swb_pre_proc_fx.c +++ b/lib_enc/swb_pre_proc_fx.c @@ -9,8 +9,7 @@ #include "rom_com_fx.h" #include "rom_com.h" #include "stl.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index b4e93c1d3..b34283381 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -9,8 +9,7 @@ //#include "prot_fx.h" #include "rom_com_fx.h" #include "rom_com.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "stl.h" diff --git a/lib_enc/tcq_core_enc_fx.c b/lib_enc/tcq_core_enc_fx.c index 6de4560d5..1855527d1 100644 --- a/lib_enc/tcq_core_enc_fx.c +++ b/lib_enc/tcq_core_enc_fx.c @@ -8,8 +8,7 @@ //#include "prot_fx.h" #include "rom_com.h" #include "ivas_error.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ ivas_error tcq_core_LR_enc_fx( diff --git a/lib_enc/tcx_ltp_enc_fx.c b/lib_enc/tcx_ltp_enc_fx.c index f44fcd203..7a791ef7e 100644 --- a/lib_enc/tcx_ltp_enc_fx.c +++ b/lib_enc/tcx_ltp_enc_fx.c @@ -10,8 +10,7 @@ #include "basop_util.h" #include "rom_com_fx.h" #include "rom_com.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ static Word32 dot( const Word16 *X, const Word16 *Y, Word16 n ) diff --git a/lib_enc/tcx_utils_enc.c b/lib_enc/tcx_utils_enc.c index 609e03bf4..4f14866c8 100644 --- a/lib_enc/tcx_utils_enc.c +++ b/lib_enc/tcx_utils_enc.c @@ -39,7 +39,7 @@ #include "options.h" #include #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "prot_fx_enc.h" #include "rom_com.h" #include "cnst.h" diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index bfcdd8fdf..8307c68d3 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -13,8 +13,7 @@ #include "rom_basop_util.h" #include "basop_util.h" #include "rom_com.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #define inv_int InvIntTable diff --git a/lib_enc/tfa_enc_fx.c b/lib_enc/tfa_enc_fx.c index aa633912c..80b4cea6f 100644 --- a/lib_enc/tfa_enc_fx.c +++ b/lib_enc/tfa_enc_fx.c @@ -7,8 +7,7 @@ #include "basop_util.h" #include "cnst.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/tns_base_enc_fx.c b/lib_enc/tns_base_enc_fx.c index 4cb7cefdd..f1de8f802 100644 --- a/lib_enc/tns_base_enc_fx.c +++ b/lib_enc/tns_base_enc_fx.c @@ -13,8 +13,7 @@ #include "rom_com_fx.h" #include "rom_com.h" #include "prot.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #define HLM_MIN_NRG ( 32768.0f * 2 * NORM_MDCT_FACTOR / ( 640 * 640 ) ) diff --git a/lib_enc/transient_detection_fx.c b/lib_enc/transient_detection_fx.c index 179e11506..5b40d7c1b 100644 --- a/lib_enc/transient_detection_fx.c +++ b/lib_enc/transient_detection_fx.c @@ -12,8 +12,7 @@ #include #include #include -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /* Exponent of attack threshold. Picked according to current threshold values. */ diff --git a/lib_enc/transition_enc.c b/lib_enc/transition_enc.c index 7afc32659..c88826947 100644 --- a/lib_enc/transition_enc.c +++ b/lib_enc/transition_enc.c @@ -41,7 +41,7 @@ #include "rom_com.h" #include "prot.h" #include "wmc_auto.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-----------------------------------------------------------------* * Local function prototypes diff --git a/lib_enc/transition_enc_fx.c b/lib_enc/transition_enc_fx.c index 4e6b1f512..32a510946 100644 --- a/lib_enc/transition_enc_fx.c +++ b/lib_enc/transition_enc_fx.c @@ -8,8 +8,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-----------------------------------------------------------------* diff --git a/lib_enc/update_decision_fx.c b/lib_enc/update_decision_fx.c index 935165d37..91170ece1 100644 --- a/lib_enc/update_decision_fx.c +++ b/lib_enc/update_decision_fx.c @@ -8,8 +8,7 @@ #include "basop_util.h" #include "vad_basop.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* * bg_music_decision_fx() diff --git a/lib_enc/updt_enc_fx.c b/lib_enc/updt_enc_fx.c index daa7d5d01..97e704a5f 100644 --- a/lib_enc/updt_enc_fx.c +++ b/lib_enc/updt_enc_fx.c @@ -7,8 +7,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/updt_tar_fx.c b/lib_enc/updt_tar_fx.c index 19d9cbb70..b6c2a166c 100644 --- a/lib_enc/updt_tar_fx.c +++ b/lib_enc/updt_tar_fx.c @@ -5,8 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*----------------------------------------------------------------------------------* diff --git a/lib_enc/vad_basop_fx.c b/lib_enc/vad_basop_fx.c index 32f46ce16..9114554c7 100644 --- a/lib_enc/vad_basop_fx.c +++ b/lib_enc/vad_basop_fx.c @@ -5,8 +5,7 @@ #include #include "options.h" //#include "prot_fx.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "vad_basop.h" #include "basop_util.h" diff --git a/lib_enc/vad_fx.c b/lib_enc/vad_fx.c index 56756588c..3a04fb947 100644 --- a/lib_enc/vad_fx.c +++ b/lib_enc/vad_fx.c @@ -6,8 +6,7 @@ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_enc.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/vad_param_updt_fx.c b/lib_enc/vad_param_updt_fx.c index 3012600fa..0466916ac 100644 --- a/lib_enc/vad_param_updt_fx.c +++ b/lib_enc/vad_param_updt_fx.c @@ -7,8 +7,7 @@ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ #include "ivas_stat_enc.h" /* Function prototypes */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/vad_proc_fx.c b/lib_enc/vad_proc_fx.c index add224340..3592b12f6 100644 --- a/lib_enc/vad_proc_fx.c +++ b/lib_enc/vad_proc_fx.c @@ -12,8 +12,7 @@ #include "stat_enc.h" #include "rom_enc.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/vbr_average_rate_fx.c b/lib_enc/vbr_average_rate_fx.c index 659eec524..9eb3d12b2 100644 --- a/lib_enc/vbr_average_rate_fx.c +++ b/lib_enc/vbr_average_rate_fx.c @@ -9,8 +9,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "stat_enc.h" /* Static table prototypes */ #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/vlpc_1st_cod_fx.c b/lib_enc/vlpc_1st_cod_fx.c index 561446aa5..120a927f5 100644 --- a/lib_enc/vlpc_1st_cod_fx.c +++ b/lib_enc/vlpc_1st_cod_fx.c @@ -9,8 +9,7 @@ //#include "prot_fx.h" #include "rom_com_fx.h" #include "rom_com.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #define ISF_ONE 3 /*1.0f*1.28f Q1*/ /*=1.0f in 14Q1*1.28*/ diff --git a/lib_enc/vlpc_2st_cod_fx.c b/lib_enc/vlpc_2st_cod_fx.c index e0b2c427a..7553f8d1c 100644 --- a/lib_enc/vlpc_2st_cod_fx.c +++ b/lib_enc/vlpc_2st_cod_fx.c @@ -8,8 +8,7 @@ #include "options.h" //#include "prot_fx.h" #include "control.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_enc/voiced_enc_fx.c b/lib_enc/voiced_enc_fx.c index 2e9035743..5cd8c3ef1 100644 --- a/lib_enc/voiced_enc_fx.c +++ b/lib_enc/voiced_enc_fx.c @@ -8,8 +8,7 @@ //#include "prot_fx.h" #include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/waveadjust_fec_cod_fx.c b/lib_enc/waveadjust_fec_cod_fx.c index a42994223..92056c0c3 100644 --- a/lib_enc/waveadjust_fec_cod_fx.c +++ b/lib_enc/waveadjust_fec_cod_fx.c @@ -9,8 +9,7 @@ #include "rom_com_fx.h" #include "rom_com.h" #include "stat_com.h" -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 2d737022c..f94e5a58a 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -44,8 +44,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "control.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "debug.h" #define float_to_fix( n, factor ) ( round( n * ( 1 << factor ) ) ) #define fix_to_float( n, factor ) ( (float) n / ( 1 << factor ) ) @@ -3143,7 +3142,7 @@ static ivas_error ivas_rend_crendConvolver( } } - offset = imult1616( hCrend->delay_line_rw_index, subframe_length ); /* subframe_length * ( pCrend->hHrtfCrend->max_num_iterations - 1 ); */ + offset = imult1616( hCrend->delay_line_rw_index, subframe_length ); /* subframe_length * ( pCrend->hHrtfCrend->max_num_iterations - 1 ); */ offset_diffuse = imult1616( hCrend->diffuse_delay_line_rw_index, subframe_length ); /* subframe_length *( pCrend->hHrtfCrend->num_iterations_diffuse[0] - 1 ); */ IF( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) diff --git a/lib_rend/ivas_dirac_ana.c b/lib_rend/ivas_dirac_ana.c index 534f59551..f32414199 100644 --- a/lib_rend/ivas_dirac_ana.c +++ b/lib_rend/ivas_dirac_ana.c @@ -39,8 +39,7 @@ #include "ivas_stat_rend.h" #include "ivas_rom_com.h" #include "wmc_auto.h" -#include "prot_fx2.h" -#include "prot_fx1.h" +#include "prot_fx.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 4c52699c9..39640f699 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -35,8 +35,7 @@ #include #include #include "prot.h" -#include "prot_fx2.h" -#include "prot_fx1.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_prot_rend.h" #include "ivas_cnst.h" @@ -1412,7 +1411,7 @@ static void ivas_dirac_dec_binaural_internal_fx( q_cldfb[ch][slot] = q_input; move16(); cldfbAnalysis_ts_fx_fixed_q( - &( st_ivas->hTcBuffer->tc_fx[ch][add( imult1616( nBins, slot ), offsetSamples )] ), + &( st_ivas->hTcBuffer->tc_fx[ch][add(imult1616(nBins , slot) , offsetSamples)] ), Cldfb_RealBuffer_in_fx[ch][slot], Cldfb_ImagBuffer_in_fx[ch][slot], nBins, st_ivas->cldfbAnaDec[ch], &q_cldfb[ch][slot] ); @@ -2891,7 +2890,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric e = 0; move16(); hDiracDecBin->frameMeanDiffuseness_fx[bin] = BASOP_Util_Divide3232_Scale( hDiracDecBin->frameMeanDiffuseness_fx[bin], L_max( EPSILLON_FX, frameMeanDiffusenessEneWeight_fx[bin] ), &e ); - hDiracDecBin->frameMeanDiffuseness_fx[bin] = L_shl( hDiracDecBin->frameMeanDiffuseness_fx[bin], add( 14, e ) ); // Q29 + hDiracDecBin->frameMeanDiffuseness_fx[bin] = L_shl( hDiracDecBin->frameMeanDiffuseness_fx[bin], add(14 , e) ); // Q29 move32(); move32(); } @@ -5284,8 +5283,8 @@ static void eig2x2_fx( } } - IF( q_U_1 != 0 ) - *q_U = q_U_1; + IF ( q_U_1 != 0 ) + *q_U = q_U_1; ELSE *q_U = q_U_2; move16(); diff --git a/lib_rend/ivas_dirac_decorr_dec.c b/lib_rend/ivas_dirac_decorr_dec.c index de0253bb5..d37a961cf 100644 --- a/lib_rend/ivas_dirac_decorr_dec.c +++ b/lib_rend/ivas_dirac_decorr_dec.c @@ -41,8 +41,7 @@ #include "ivas_cnst.h" #include "ivas_rom_rend.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*------------------------------------------------------------------------- * Local constants @@ -954,19 +953,19 @@ void ivas_dirac_dec_decorr_process_fx( /* check handles */ test(); - if ( h_freq_domain_decorr_ap_params == NULL || h_freq_domain_decorr_ap_state == NULL ) + if( h_freq_domain_decorr_ap_params == NULL || h_freq_domain_decorr_ap_state == NULL ) { return; } /* check input data */ - if ( input_frame_fx == NULL ) + if( input_frame_fx == NULL ) { return; } /* check result arrays */ - if ( frame_dec_fx == NULL ) + if( frame_dec_fx == NULL ) { return; } @@ -1046,7 +1045,7 @@ void ivas_dirac_dec_decorr_process_fx( IF( NE_16( q_temp, q_onset_dec ) ) { - FOR( Word16 i = 0; i < imult1616( num_protos_diff, max_band_decorr_temp ); i++ ) + FOR( Word16 i = 0; i < imult1616(num_protos_diff , max_band_decorr_temp); i++ ) { h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2_fx[i] = L_shr( h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2_fx[i], sub( q_onset_dec, q_temp ) ); h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1_fx[i] = L_shr( h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1_fx[i], sub( q_onset_dec, q_temp ) ); @@ -1056,7 +1055,7 @@ void ivas_dirac_dec_decorr_process_fx( } IF( NE_16( q_temp, q_aux_buffer ) ) { - FOR( Word16 i = 0; i < shl( imult1616( num_protos_diff, max_band_decorr_temp ), 1 ); i++ ) + FOR( Word16 i = 0; i < shl( imult1616(num_protos_diff , max_band_decorr_temp),1); i++ ) { aux_buffer_fx[i] = L_shr( aux_buffer_fx[i], sub( q_aux_buffer, q_temp ) ); move32(); @@ -1133,7 +1132,7 @@ void ivas_dirac_dec_decorr_process_fx( q_shift = getScaleFactor32( aux_buffer_fx, imult1616( imult1616( 2, num_protos_dir ), max_band_decorr_temp ) ); - FOR( Word16 j = 0; j < shl( imult1616( num_protos_dir, max_band_decorr_temp ), 1 ); j++ ) + FOR( Word16 j = 0; j < shl( imult1616(num_protos_dir , max_band_decorr_temp),1); j++ ) { aux_buffer_fx[j] = L_shl( aux_buffer_fx[j], q_shift ); move32(); @@ -1293,7 +1292,7 @@ void ivas_dirac_dec_decorr_process_fx( } } - FOR( Word16 i = 0; i < shl( imult1616( num_channels, max_band_decorr ), 1 ); i++ ) + FOR( Word16 i = 0; i < shl(imult1616(num_channels , max_band_decorr),1); i++ ) { aux_buffer_fx[i] = W_extract_h( W_shl( aux_64[i], sub( norm, find_guarded_bits_fx( 2 ) ) ) ); move32(); @@ -1492,13 +1491,13 @@ void ivas_dirac_dec_decorr_close_fx( *-----------------------------------------------------------------*/ test(); - if ( ph_freq_domain_decorr_ap_params == NULL || ph_freq_domain_decorr_ap_state == NULL ) + if( ph_freq_domain_decorr_ap_params == NULL || ph_freq_domain_decorr_ap_state == NULL ) { return; } test(); - if ( *ph_freq_domain_decorr_ap_params == NULL || *ph_freq_domain_decorr_ap_state == NULL ) + if( *ph_freq_domain_decorr_ap_params == NULL || *ph_freq_domain_decorr_ap_state == NULL ) { return; } diff --git a/lib_rend/ivas_dirac_onsets_dec.c b/lib_rend/ivas_dirac_onsets_dec.c index 7e2a59591..c7e4a6ff6 100644 --- a/lib_rend/ivas_dirac_onsets_dec.c +++ b/lib_rend/ivas_dirac_onsets_dec.c @@ -41,8 +41,7 @@ #include "ivas_rom_com.h" #include "ivas_rom_dec.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #ifdef IVAS_FLOAT_FIXED static Word16 BASOP_Util_Cmp_Mant32Exp_sat( Word32 a_m, Word16 a_e, Word32 b_m, Word16 b_e ); diff --git a/lib_rend/ivas_dirac_output_synthesis_dec.c b/lib_rend/ivas_dirac_output_synthesis_dec.c index 78ebf3009..36b13ed58 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec.c @@ -44,8 +44,7 @@ #include "ivas_rom_dec.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" /* Function prototypes */ -#include "prot_fx2.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #endif #ifdef IVAS_FLOAT_FIXED #include "ivas_rom_com_fx.h" diff --git a/lib_rend/ivas_dirac_rend.c b/lib_rend/ivas_dirac_rend.c index e96aec922..cc3f78a2d 100644 --- a/lib_rend/ivas_dirac_rend.c +++ b/lib_rend/ivas_dirac_rend.c @@ -41,8 +41,7 @@ #include "ivas_cnst.h" #include "ivas_rom_rend.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #include "ivas_rom_binaural_crend_head.h" diff --git a/lib_rend/ivas_efap.c b/lib_rend/ivas_efap.c index fb6abd941..5229164dd 100644 --- a/lib_rend/ivas_efap.c +++ b/lib_rend/ivas_efap.c @@ -36,7 +36,7 @@ #include #include "options.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_prot_rend.h" #include "ivas_stat_dec.h" diff --git a/lib_rend/ivas_masa_merge.c b/lib_rend/ivas_masa_merge.c index f1e93e224..8652e2c71 100644 --- a/lib_rend/ivas_masa_merge.c +++ b/lib_rend/ivas_masa_merge.c @@ -39,7 +39,7 @@ #include "prot.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif // IVAS_FLOAT_FIXED diff --git a/lib_rend/ivas_mcmasa_ana.c b/lib_rend/ivas_mcmasa_ana.c index 531ab686e..8149ee639 100644 --- a/lib_rend/ivas_mcmasa_ana.c +++ b/lib_rend/ivas_mcmasa_ana.c @@ -43,8 +43,7 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_rom_com_fx.h" #endif // IVAS_FLOAT_FIXED diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index b2ebebb87..0a12e65b3 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -41,8 +41,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "debug.h" #include "ivas_rom_com_fx.h" #define float_to_fixed( n, factor ) ( round( n * ( 1 << factor ) ) ) diff --git a/lib_rend/ivas_objectRenderer_hrFilt.c b/lib_rend/ivas_objectRenderer_hrFilt.c index c2fe6a262..8568da9eb 100644 --- a/lib_rend/ivas_objectRenderer_hrFilt.c +++ b/lib_rend/ivas_objectRenderer_hrFilt.c @@ -39,8 +39,7 @@ #include "ivas_rom_rend.h" #include "ivas_cnst.h" #include "wmc_auto.h" -#include "prot_fx2.h" -#include "prot_fx1.h" +#include "prot_fx.h" /*---------------------------------------------------------------------* * Local function prototypes diff --git a/lib_rend/ivas_objectRenderer_mix.c b/lib_rend/ivas_objectRenderer_mix.c index 06a645622..997477c5d 100644 --- a/lib_rend/ivas_objectRenderer_mix.c +++ b/lib_rend/ivas_objectRenderer_mix.c @@ -41,7 +41,7 @@ #include "ivas_prot_fx.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #endif // IVAS_FLOAT_FIXED #define IVAS_FLOAT_FIXED_TO_BE_REMOVED diff --git a/lib_rend/ivas_objectRenderer_sfx.c b/lib_rend/ivas_objectRenderer_sfx.c index 6bb4b0c44..382632999 100644 --- a/lib_rend/ivas_objectRenderer_sfx.c +++ b/lib_rend/ivas_objectRenderer_sfx.c @@ -38,7 +38,7 @@ #include "prot.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #endif diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 15159cacf..6fa37e77f 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -38,8 +38,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" -#include "prot_fx2.h" -#include "prot_fx1.h" +#include "prot_fx.h" #endif // IVAS_FLOAT_FIXED diff --git a/lib_rend/ivas_objectRenderer_vec.c b/lib_rend/ivas_objectRenderer_vec.c index 714fdb299..f24edf8bd 100644 --- a/lib_rend/ivas_objectRenderer_vec.c +++ b/lib_rend/ivas_objectRenderer_vec.c @@ -36,8 +36,7 @@ #include "prot.h" #include "ivas_prot_rend.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" diff --git a/lib_rend/ivas_omasa_ana.c b/lib_rend/ivas_omasa_ana.c index cbf60f70f..476cbbe3e 100644 --- a/lib_rend/ivas_omasa_ana.c +++ b/lib_rend/ivas_omasa_ana.c @@ -41,7 +41,7 @@ #include "ivas_stat_rend.h" #include "ivas_rom_com.h" #include "wmc_auto.h" -#include "prot_fx2.h" +#include "prot_fx.h" #define IVAS_FLOAT_FIXED_TO_BE_REMOVED diff --git a/lib_rend/ivas_orient_trk.c b/lib_rend/ivas_orient_trk.c index edea2f049..6f308742c 100644 --- a/lib_rend/ivas_orient_trk.c +++ b/lib_rend/ivas_orient_trk.c @@ -40,8 +40,7 @@ #include #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif /*------------------------------------------------------------------------------------------* diff --git a/lib_rend/ivas_reflections.c b/lib_rend/ivas_reflections.c index ea4b11418..c684c29c4 100644 --- a/lib_rend/ivas_reflections.c +++ b/lib_rend/ivas_reflections.c @@ -43,8 +43,7 @@ #include "ivas_rom_com.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "debug.h" #define float_to_fix( n, factor ) ( round( n * ( 1 << factor ) ) ) #define fix_to_float( n, factor ) ( (float) n / ( 1 << factor ) ) diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index 65525868c..c7161061b 100644 --- a/lib_rend/ivas_render_config.c +++ b/lib_rend/ivas_render_config.c @@ -37,7 +37,7 @@ #include "ivas_rom_rend.h" #include "ivas_rom_TdBinauralRenderer.h" #include "wmc_auto.h" -#include "prot_fx1.h" +#include "prot_fx.h" /*-----------------------------------------------------------------------* * Local constants diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 127dd8326..4d8b2e9bc 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -40,8 +40,7 @@ #include #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "debug.h" #define float_to_fix( n, factor ) ( round( n * ( 1 << factor ) ) ) #define float_to_fixQ31( n ) ( round( n * 0x7fffffff ) ) @@ -2452,7 +2451,7 @@ ivas_error ivas_reverb_open_fx( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Reverberator " ); } - IF( NE_32( ( error = set_base_config_fx( ¶ms, output_Fs ) ), IVAS_ERR_OK ) ) + IF( NE_32(( error = set_base_config_fx( ¶ms, output_Fs ) ) , IVAS_ERR_OK) ) { return error; } @@ -2543,7 +2542,7 @@ ivas_error ivas_reverb_open_fx( /* set up jot reverb 60 filters - must be set up after set_reverb_acoustic_data() */ - IF( NE_32( ( error = compute_t60_coeffs_fx( ¶ms, nr_fc_fft_filter, output_Fs ) ), IVAS_ERR_OK ) ) + IF( NE_32(( error = compute_t60_coeffs_fx( ¶ms, nr_fc_fft_filter, output_Fs ) ) , IVAS_ERR_OK) ) { return error; } @@ -2591,7 +2590,7 @@ ivas_error ivas_reverb_open_fx( move16(); /* clear & init jot reverb fft filters */ - IF( NE_32( ( error = initialize_reverb_filters_fx( pState ) ), IVAS_ERR_OK ) ) + IF( NE_32(( error = initialize_reverb_filters_fx( pState ) ) , IVAS_ERR_OK) ) { return error; } diff --git a/lib_rend/ivas_reverb_delay_line.c b/lib_rend/ivas_reverb_delay_line.c index d24bbe1ec..0de9e386c 100644 --- a/lib_rend/ivas_reverb_delay_line.c +++ b/lib_rend/ivas_reverb_delay_line.c @@ -37,8 +37,7 @@ #include "prot.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "debug.h" #define float_to_fix( n, factor ) ( round( n * ( 1 << factor ) ) ) #define fix_to_float( n, factor ) ( (float) n / ( 1 << factor ) ) diff --git a/lib_rend/ivas_reverb_fft_filter.c b/lib_rend/ivas_reverb_fft_filter.c index 62ab464da..1889974cd 100644 --- a/lib_rend/ivas_reverb_fft_filter.c +++ b/lib_rend/ivas_reverb_fft_filter.c @@ -37,8 +37,7 @@ #include #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "debug.h" #define float_to_fix( n, factor ) ( round( n * ( 1 << factor ) ) ) #define fix_to_float( n, factor ) ( (float) n / ( 1 << factor ) ) diff --git a/lib_rend/ivas_reverb_filter_design.c b/lib_rend/ivas_reverb_filter_design.c index b293d6e22..ba6c43a09 100644 --- a/lib_rend/ivas_reverb_filter_design.c +++ b/lib_rend/ivas_reverb_filter_design.c @@ -33,7 +33,7 @@ #include #include "options.h" #include "prot.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_rend.h" #include #include diff --git a/lib_rend/ivas_reverb_iir_filter.c b/lib_rend/ivas_reverb_iir_filter.c index 1f1508b5e..51404ad5a 100644 --- a/lib_rend/ivas_reverb_iir_filter.c +++ b/lib_rend/ivas_reverb_iir_filter.c @@ -36,8 +36,7 @@ #include "ivas_prot_rend.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "debug.h" #define float_to_fix( n, factor ) ( round( n * ( 1 << factor ) ) ) #define fix_to_float( n, factor ) ( (float) n / ( 1 << factor ) ) diff --git a/lib_rend/ivas_reverb_utils.c b/lib_rend/ivas_reverb_utils.c index 7f4af7703..c382c034a 100644 --- a/lib_rend/ivas_reverb_utils.c +++ b/lib_rend/ivas_reverb_utils.c @@ -37,7 +37,7 @@ #include "ivas_rom_rend.h" #include #include "wmc_auto.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-----------------------------------------------------------------------------------------* * Local constants diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 5290f0abb..3e9261af1 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -42,8 +42,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #include "debug.h" #include "ivas_rom_binaural_crend_head.h" diff --git a/lib_rend/ivas_sba_rendering.c b/lib_rend/ivas_sba_rendering.c index c2aeaef5d..9c95a2d8c 100644 --- a/lib_rend/ivas_sba_rendering.c +++ b/lib_rend/ivas_sba_rendering.c @@ -33,8 +33,7 @@ #include #include "options.h" #include "prot.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" #include "ivas_prot_rend.h" #include "ivas_stat_dec.h" diff --git a/lib_rend/ivas_td_decorr.c b/lib_rend/ivas_td_decorr.c index 2e14388f8..e3e224c9a 100644 --- a/lib_rend/ivas_td_decorr.c +++ b/lib_rend/ivas_td_decorr.c @@ -34,8 +34,7 @@ #include "options.h" #include "prot.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #endif #include "ivas_prot.h" #ifdef IVAS_FLOAT_FIXED diff --git a/lib_rend/ivas_vbap.c b/lib_rend/ivas_vbap.c index bc8090c7a..c6524aeed 100644 --- a/lib_rend/ivas_vbap.c +++ b/lib_rend/ivas_vbap.c @@ -35,13 +35,11 @@ #include #include #include "prot.h" -#include "prot_fx2.h" #include "ivas_prot.h" #include "ivas_prot_rend.h" #include "ivas_stat_dec.h" #include "wmc_auto.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" /*-----------------------------------------------------------------------* * Local constants diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index bd7ebe21d..3db18bcf1 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -47,8 +47,7 @@ #ifdef IVAS_FLOAT_FIXED #include "ivas_rom_com_fx.h" #include "ivas_prot_fx.h" -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "debug.h" #define float_to_fix( n, factor ) ( round( n * ( 1 << factor ) ) ) #define fix_to_float( n, factor ) ( (float) n / ( 1 << factor ) ) diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index a4994e544..e8bbe3653 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -34,7 +34,7 @@ #include #include "prot.h" #include "ivas_prot_rend.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot.h" /*---------------------------------------------------------------------* diff --git a/lib_util/ism_file_reader.c b/lib_util/ism_file_reader.c index 9127fe847..ae35e6d46 100644 --- a/lib_util/ism_file_reader.c +++ b/lib_util/ism_file_reader.c @@ -35,7 +35,7 @@ #include #include #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #endif // IVAS_FLOAT_FIXED #define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ diff --git a/lib_util/rotation_file_reader.c b/lib_util/rotation_file_reader.c index f5a815377..47ba31fb8 100644 --- a/lib_util/rotation_file_reader.c +++ b/lib_util/rotation_file_reader.c @@ -36,7 +36,7 @@ #include #include "prot.h" #ifdef IVAS_FLOAT_FIXED -#include "prot_fx2.h" +#include "prot_fx.h" #endif diff --git a/lib_util/vector3_pair_file_reader.c b/lib_util/vector3_pair_file_reader.c index 00c23a497..aa828b0ee 100644 --- a/lib_util/vector3_pair_file_reader.c +++ b/lib_util/vector3_pair_file_reader.c @@ -38,8 +38,7 @@ #include "prot.h" #include "options.h" /* only included to get access to the feature-defines */ #ifdef IVAS_FLOAT_FIXED -#include "prot_fx1.h" -#include "prot_fx2.h" +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif -- GitLab From c184a7b350cfbf69c7e0a540f40f620fbdd78c45 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 18 Jul 2024 12:35:44 +0530 Subject: [PATCH 081/110] Clang formatting changes --- lib_com/bitalloc_fx.c | 6 +- lib_com/bitallocsum_fx.c | 4 +- lib_com/bitstream_fx.c | 2 +- lib_com/cb_shape_fx.c | 6 +- lib_com/cldfb_evs.c | 2 +- lib_com/cng_exc_fx.c | 4 +- lib_com/edct_fx.c | 6 +- lib_com/enhancer_fx.c | 22 +-- lib_com/est_tilt_fx.c | 4 +- lib_com/fft_fx_evs.c | 6 +- lib_com/fft_rel_fx.c | 4 +- lib_com/fine_gain_bits_fx.c | 4 +- lib_com/gs_bitallocation_fx.c | 8 +- lib_com/gs_bitallocation_ivas_fx.c | 2 +- lib_com/gs_inact_switching_fx.c | 6 +- lib_com/hq_bit_allocation_fx.c | 6 +- lib_com/hq_conf_fx.c | 4 +- lib_com/hvq_pvq_bitalloc_fx.c | 2 +- lib_com/isf_dec_amr_wb_fx.c | 6 +- lib_com/limit_t0_fx.c | 4 +- lib_com/logqnorm_fx.c | 6 +- lib_com/lpc_tools_fx.c | 2 +- lib_com/pred_lt4_fx.c | 6 +- lib_com/prot_fx.h | 2 +- lib_com/pvq_com_fx.c | 4 +- lib_com/re8_ppv_fx.c | 4 +- lib_com/re8_util_fx.c | 6 +- lib_com/recovernorm_fx.c | 6 +- lib_com/reordvct_fx.c | 2 +- lib_com/scale_mem_fx.c | 2 +- lib_com/stab_est_fx.c | 4 +- lib_com/stat_noise_uv_mod_fx.c | 6 +- lib_com/swb_tbe_com.c | 29 ++- lib_com/swb_tbe_com_fx.c | 16 +- lib_com/syn_12k8_fx.c | 4 +- lib_com/syn_filt_fx.c | 4 +- lib_com/tcq_position_arith_fx.c | 18 +- lib_com/tcx_ltp_fx.c | 54 +++--- lib_com/tcx_mdct_fx.c | 34 ++-- lib_com/tcx_mdct_window.c | 14 +- lib_com/tcx_utils_fx.c | 4 +- lib_com/tec_com.c | 4 +- lib_com/trans_direct_fx.c | 6 +- lib_com/trans_inv_fx.c | 4 +- lib_com/weight_fx.c | 6 +- lib_com/window_ola_fx.c | 4 +- lib_com/wtda_fx.c | 6 +- lib_dec/FEC_HQ_core.c | 24 +-- lib_dec/FEC_HQ_core_fx.c | 4 +- lib_dec/FEC_HQ_phase_ecu_fx.c | 176 +++++++++---------- lib_dec/FEC_adapt_codebook_fx.c | 6 +- lib_dec/FEC_clas_estim_fx.c | 6 +- lib_dec/FEC_fx.c | 8 +- lib_dec/FEC_lsf_estim_fx.c | 6 +- lib_dec/FEC_pitch_estim_fx.c | 8 +- lib_dec/FEC_scale_syn_fx.c | 8 +- lib_dec/LD_music_post_filter_fx.c | 6 +- lib_dec/acelp_core_dec_fx.c | 4 +- lib_dec/acelp_core_switch_dec_fx.c | 8 +- lib_dec/avq_dec_fx.c | 8 +- lib_dec/bass_psfilter_fx.c | 8 +- lib_dec/core_switching_dec_fx.c | 2 +- lib_dec/dec2t32_fx.c | 4 +- lib_dec/dec4t64_fx.c | 14 +- lib_dec/dec_amr_wb_fx.c | 6 +- lib_dec/dec_gen_voic_fx.c | 6 +- lib_dec/dec_higher_acelp_fx.c | 4 +- lib_dec/dec_nelp_fx.c | 4 +- lib_dec/dec_pit_exc_fx.c | 8 +- lib_dec/dec_ppp_fx.c | 4 +- lib_dec/dec_prm.c | 2 +- lib_dec/dec_prm_fx.c | 22 +-- lib_dec/dec_tran_fx.c | 4 +- lib_dec/dec_uv_fx.c | 4 +- lib_dec/evs_dec_fx.c | 2 +- lib_dec/gain_dec_fx.c | 6 +- lib_dec/gaus_dec_fx.c | 6 +- lib_dec/gs_dec_amr_wb_fx.c | 22 +-- lib_dec/gs_dec_fx.c | 26 +-- lib_dec/hf_synth_fx.c | 20 +-- lib_dec/hq_classifier_dec_fx.c | 6 +- lib_dec/hq_core_dec_fx.c | 6 +- lib_dec/hq_env_dec_fx.c | 4 +- lib_dec/hq_hr_dec_fx.c | 4 +- lib_dec/inov_dec_fx.c | 6 +- lib_dec/ivas_stereo_dft_dec_dmx.c | 10 +- lib_dec/ivas_stereo_dft_plc_fx.c | 18 +- lib_dec/ivas_stereo_ica_dec.c | 4 +- lib_dec/ivas_stereo_mdct_core_dec_fx.c | 8 +- lib_dec/ivas_tcx_core_dec.c | 2 +- lib_dec/lp_exc_d_fx.c | 4 +- lib_dec/lsf_dec_fx.c | 6 +- lib_dec/nelp_dec_fx.c | 2 +- lib_dec/pvq_core_dec_fx.c | 6 +- lib_dec/range_dec_fx.c | 6 +- lib_dec/re8_dec_fx.c | 2 +- lib_dec/rst_dec_fx.c | 4 +- lib_dec/stat_noise_uv_dec_fx.c | 2 +- lib_dec/swb_bwe_dec_hr_fx.c | 8 +- lib_dec/syn_outp_fx.c | 4 +- lib_dec/tonalMDCTconcealment_fx.c | 2 +- lib_dec/transition_dec_fx.c | 6 +- lib_dec/updt_dec_fx.c | 4 +- lib_enc/FEC_enc_fx.c | 2 +- lib_enc/SNR_calc_fx.c | 2 +- lib_enc/acelp_core_switch_enc_fx.c | 2 +- lib_enc/acelp_enc_util_fx.c | 2 +- lib_enc/amr_wb_enc_fx.c | 2 +- lib_enc/analy_lp_fx.c | 2 +- lib_enc/analy_sp_fx.c | 2 +- lib_enc/ari_enc_fx.c | 2 +- lib_enc/ari_hm_enc_fx.c | 2 +- lib_enc/arith_coder_enc_fx.c | 2 +- lib_enc/avq_cod_fx.c | 2 +- lib_enc/bass_psfilter_enc_fx.c | 2 +- lib_enc/bw_detect_fx.c | 2 +- lib_enc/cng_enc_fx.c | 2 +- lib_enc/cod2t32_fx.c | 2 +- lib_enc/cod4t64_fx.c | 2 +- lib_enc/cod_ace_fx.c | 2 +- lib_enc/cod_uv_fx.c | 2 +- lib_enc/comvad_decision_fx.c | 2 +- lib_enc/cor_shif_fx.c | 2 +- lib_enc/core_enc_2div_fx.c | 2 +- lib_enc/core_enc_init_fx.c | 2 +- lib_enc/core_enc_ol_fx.c | 2 +- lib_enc/core_enc_reconf_fx.c | 2 +- lib_enc/core_enc_switch_fx.c | 2 +- lib_enc/core_enc_updt_fx.c | 2 +- lib_enc/core_switching_enc_fx.c | 2 +- lib_enc/corr_xh_fx.c | 2 +- lib_enc/decision_matrix_enc_fx.c | 2 +- lib_enc/detect_transient_fx.c | 2 +- lib_enc/diffcod_fx.c | 2 +- lib_enc/dtx_fx.c | 8 +- lib_enc/enc_acelp_fx.c | 2 +- lib_enc/enc_acelp_tcx_main_fx.c | 2 +- lib_enc/enc_acelpx_fx.c | 2 +- lib_enc/enc_amr_wb_fx.c | 2 +- lib_enc/enc_gain_fx.c | 2 +- lib_enc/enc_gen_voic_fx.c | 2 +- lib_enc/enc_gen_voic_rf_fx.c | 2 +- lib_enc/enc_nelp_fx.c | 2 +- lib_enc/enc_pit_exc_fx.c | 2 +- lib_enc/enc_ppp_fx.c | 2 +- lib_enc/enc_prm_fx.c | 2 +- lib_enc/enc_tran_fx.c | 2 +- lib_enc/enc_uv_fx.c | 2 +- lib_enc/energy_fx.c | 2 +- lib_enc/eval_pit_contr_fx.c | 2 +- lib_enc/evs_enc_fx.c | 2 +- lib_enc/ext_sig_ana_fx.c | 2 +- lib_enc/find_tar_fx.c | 2 +- lib_enc/find_tilt_fx.c | 2 +- lib_enc/find_uv_fx.c | 2 +- lib_enc/find_wsp.c | 24 +-- lib_enc/find_wsp_fx.c | 2 +- lib_enc/frame_spec_dif_cor_rate_fx.c | 2 +- lib_enc/gain_enc_fx.c | 2 +- lib_enc/gaus_enc_fx.c | 2 +- lib_enc/gp_clip_fx.c | 2 +- lib_enc/gs_enc_fx.c | 2 +- lib_enc/guided_plc_enc_fx.c | 2 +- lib_enc/hf_cod_amrwb_fx.c | 2 +- lib_enc/hq_classifier_enc_fx.c | 2 +- lib_enc/hq_core_enc_fx.c | 2 +- lib_enc/hq_env_enc_fx.c | 2 +- lib_enc/hq_hr_enc_fx.c | 2 +- lib_enc/hq_lr_enc_fx.c | 2 +- lib_enc/hvq_enc_fx.c | 2 +- lib_enc/igf_enc_fx.c | 2 +- lib_enc/igf_scf_enc_fx.c | 2 +- lib_enc/init_enc_fx.c | 2 +- lib_enc/inov_enc_fx.c | 2 +- lib_enc/isf_enc_amr_wb_fx.c | 2 +- lib_enc/ivas_core_pre_proc_front.c | 10 +- lib_enc/ivas_ism_dtx_enc.c | 26 +-- lib_enc/ivas_ism_enc.c | 12 +- lib_enc/ivas_ism_metadata_enc.c | 12 +- lib_enc/ivas_ism_param_enc.c | 10 +- lib_enc/ivas_mcmasa_enc.c | 16 +- lib_enc/ivas_stereo_classifier.c | 2 +- lib_enc/ivas_stereo_mdct_core_enc.c | 14 +- lib_enc/lead_indexing_fx.c | 2 +- lib_enc/lib_enc.c | 10 +- lib_enc/long_enr_fx.c | 40 ++--- lib_enc/lp_exc_e_fx.c | 2 +- lib_enc/lsf_enc_fx.c | 2 +- lib_enc/lsf_msvq_ma_enc_fx.c | 2 +- lib_enc/ltd_stable_fx.c | 2 +- lib_enc/mdct_classifier_fx.c | 2 +- lib_enc/mdct_selector_fx.c | 2 +- lib_enc/mslvq_enc_fx.c | 2 +- lib_enc/multi_harm_fx.c | 2 +- lib_enc/nelp_enc_fx.c | 6 +- lib_enc/nois_est_fx.c | 2 +- lib_enc/noise_adjust_fx.c | 2 +- lib_enc/normalizecoefs_fx.c | 2 +- lib_enc/peak_vq_enc_fx.c | 2 +- lib_enc/pit_enc_fx.c | 2 +- lib_enc/pitch_ol2_fx.c | 2 +- lib_enc/pitch_ol_fx.c | 2 +- lib_enc/plc_enc_ext_fx.c | 2 +- lib_enc/ppp_enc_fx.c | 2 +- lib_enc/pre_proc_fx.c | 2 +- lib_enc/pvq_core_enc_fx.c | 2 +- lib_enc/pvq_encode_fx.c | 2 +- lib_enc/q_gain2p_fx.c | 2 +- lib_enc/qlpc_avq_fx.c | 2 +- lib_enc/qlpc_stoch_fx.c | 2 +- lib_enc/range_enc_fx.c | 2 +- lib_enc/re8_cod_fx.c | 2 +- lib_enc/reordernorm_fx.c | 2 +- lib_enc/rst_enc_fx.c | 2 +- lib_enc/scale_enc_fx.c | 2 +- lib_enc/set_impulse_fx.c | 2 +- lib_enc/setmodeindex_fx.c | 2 +- lib_enc/sig_clas_fx.c | 2 +- lib_enc/spec_center_fx.c | 2 +- lib_enc/spec_flatness_fx.c | 2 +- lib_enc/speech_music_classif.c | 4 +- lib_enc/speech_music_classif_fx.c | 4 +- lib_enc/stat_noise_uv_enc_fx.c | 2 +- lib_enc/subband_fft_fx.c | 2 +- lib_enc/swb_bwe_enc_fx.c | 2 +- lib_enc/swb_bwe_enc_hr_fx.c | 2 +- lib_enc/swb_bwe_enc_lr_fx.c | 2 +- lib_enc/swb_pre_proc_fx.c | 2 +- lib_enc/swb_tbe_enc_fx.c | 2 +- lib_enc/tcq_core_enc_fx.c | 2 +- lib_enc/tcx_ltp_enc_fx.c | 2 +- lib_enc/tcx_utils_enc_fx.c | 2 +- lib_enc/tfa_enc_fx.c | 2 +- lib_enc/tns_base_enc_fx.c | 2 +- lib_enc/transient_detection_fx.c | 2 +- lib_enc/transition_enc_fx.c | 2 +- lib_enc/update_decision_fx.c | 2 +- lib_enc/updt_enc_fx.c | 2 +- lib_enc/updt_tar_fx.c | 2 +- lib_enc/vad_basop_fx.c | 2 +- lib_enc/vad_fx.c | 2 +- lib_enc/vad_param_updt_fx.c | 2 +- lib_enc/vad_proc_fx.c | 2 +- lib_enc/vbr_average_rate_fx.c | 2 +- lib_enc/vlpc_1st_cod_fx.c | 2 +- lib_enc/vlpc_2st_cod_fx.c | 2 +- lib_enc/voiced_enc_fx.c | 2 +- lib_enc/waveadjust_fec_cod_fx.c | 2 +- lib_rend/ivas_crend.c | 2 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 8 +- lib_rend/ivas_dirac_decorr_dec.c | 18 +- lib_rend/ivas_reverb.c | 6 +- 252 files changed, 713 insertions(+), 714 deletions(-) diff --git a/lib_com/bitalloc_fx.c b/lib_com/bitalloc_fx.c index 491c9bb95..c20235e39 100644 --- a/lib_com/bitalloc_fx.c +++ b/lib_com/bitalloc_fx.c @@ -3,9 +3,9 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ void bitalloc_fx( diff --git a/lib_com/bitallocsum_fx.c b/lib_com/bitallocsum_fx.c index 2a077b1de..c3803eb94 100644 --- a/lib_com/bitallocsum_fx.c +++ b/lib_com/bitallocsum_fx.c @@ -2,8 +2,8 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------------- diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index d910b657a..f10493eea 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -39,7 +39,7 @@ #include #include "options.h" #include "ivas_cnst.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "ivas_prot_fx.h" #include "basop_util.h" #include "rom_com.h" diff --git a/lib_com/cb_shape_fx.c b/lib_com/cb_shape_fx.c index 6a27fd395..880b60205 100644 --- a/lib_com/cb_shape_fx.c +++ b/lib_com/cb_shape_fx.c @@ -2,10 +2,10 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* */ +#include "rom_com.h" /* */ /* * E_GAIN_f_pitch_sharpening diff --git a/lib_com/cldfb_evs.c b/lib_com/cldfb_evs.c index 317ff899f..2a27fbb24 100644 --- a/lib_com/cldfb_evs.c +++ b/lib_com/cldfb_evs.c @@ -1285,7 +1285,7 @@ void GetEnergyCldfb( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) } } - IF( GE_16( numberBands, freqTable[1] ) && hTecEnc != NULL) + IF( GE_16( numberBands, freqTable[1] ) && hTecEnc != NULL ) { Word32 *tempEnergyValuesArry[CLDFB_NO_COL_MAX]; Word16 ScaleX2; diff --git a/lib_com/cng_exc_fx.c b/lib_com/cng_exc_fx.c index c25ed489a..e2475bbad 100644 --- a/lib_com/cng_exc_fx.c +++ b/lib_com/cng_exc_fx.c @@ -2,8 +2,8 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" #include "ivas_rom_com_fx.h" diff --git a/lib_com/edct_fx.c b/lib_com/edct_fx.c index e3cf39fcd..bd27d2137 100644 --- a/lib_com/edct_fx.c +++ b/lib_com/edct_fx.c @@ -4,9 +4,9 @@ #include #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "stl.h" diff --git a/lib_com/enhancer_fx.c b/lib_com/enhancer_fx.c index a3d569edc..7f529ec12 100644 --- a/lib_com/enhancer_fx.c +++ b/lib_com/enhancer_fx.c @@ -2,10 +2,10 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* Static table prototypes */ +#include "rom_com.h" /* Static table prototypes */ #include "basop_util.h" /*---------------------------------------------------------------------* @@ -100,7 +100,7 @@ void enhancer_fx( i = 0; move16(); /* high dispersion */ } - ELSE if( LE_32( core_brate, ACELP_8k85 ) ) + ELSE if ( LE_32( core_brate, ACELP_8k85 ) ) { i = 1; move16(); /* low dispersion */ @@ -118,7 +118,7 @@ void enhancer_fx( i = 0; move16(); /* high dispersion */ } - ELSE if( ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) || EQ_16( coder_type, AUDIO ) || coder_type == INACTIVE ) && LE_32( core_brate, ACELP_9k60 ) ) + ELSE if ( ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) || EQ_16( coder_type, AUDIO ) || coder_type == INACTIVE ) && LE_32( core_brate, ACELP_9k60 ) ) { i = 1; move16(); /* low dispersion */ @@ -379,7 +379,7 @@ void enhancer_ivas_fx( i = 0; move16(); /* high dispersion */ } - ELSE if( LE_32( core_brate, ACELP_8k85 ) ) + ELSE if ( LE_32( core_brate, ACELP_8k85 ) ) { i = 1; move16(); /* low dispersion */ @@ -717,7 +717,7 @@ Word16 E_UTIL_enhancer( gain = add( sub( code_exp, exc2_exp ), 1 ); tmp = mac_r( 268435456l /*0.125f Q31*/, 4096 /*0.125f Q15*/, voice_fac ); /* 0.25=voiced, 0=unvoiced */ - IF ( EQ_16( L_frame, L_FRAME16k ) ) + IF( EQ_16( L_frame, L_FRAME16k ) ) { tmp = mac_r( 322122560l /*0.150f Q31*/, 4915 /*0.150f Q15*/, voice_fac ); /* 0.30=voiced, 0=unvoiced */ } @@ -725,7 +725,7 @@ Word16 E_UTIL_enhancer( /* exc2[0] = exc2[0] + code[0] - tmp*code[1]; */ L_tmp = L_mult( code[0], 16384 ); L_tmp = L_msu0( L_tmp, tmp, code[1] ); - IF ( gain ) + IF( gain ) { #ifdef BASOP_NOGLOB L_tmp = L_shl_sat( L_tmp, gain ); @@ -740,14 +740,14 @@ Word16 E_UTIL_enhancer( #endif move16(); - FOR( i = 1; i < sub(L_subfr , 1); i++ ) + FOR( i = 1; i < sub( L_subfr, 1 ); i++ ) { /* exc2[i] = exc2[i] + code[i] - tmp*(code[i+1]+code[i-1]); */ L_tmp = L_mult( code[i], 16384 ); #ifdef BASOP_NOGLOB L_tmp = L_msu0_sat( L_tmp, tmp, code[i - 1] ); L_tmp = L_msu0_sat( L_tmp, tmp, code[i + 1] ); - IF ( gain ) + IF( gain ) { L_tmp = L_shl_sat( L_tmp, gain ); } @@ -767,7 +767,7 @@ Word16 E_UTIL_enhancer( L_tmp = L_mult( code[i], 16384 ); #ifdef BASOP_NOGLOB L_tmp = L_msu0_sat( L_tmp, tmp, code[i - 1] ); - IF ( gain ) + IF( gain ) { L_tmp = L_shl_sat( L_tmp, gain ); } diff --git a/lib_com/est_tilt_fx.c b/lib_com/est_tilt_fx.c index 0b9c39b38..6f541c11f 100644 --- a/lib_com/est_tilt_fx.c +++ b/lib_com/est_tilt_fx.c @@ -2,8 +2,8 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "stl.h" #include "basop_util.h" diff --git a/lib_com/fft_fx_evs.c b/lib_com/fft_fx_evs.c index ddcbae49a..c17de3643 100644 --- a/lib_com/fft_fx_evs.c +++ b/lib_com/fft_fx_evs.c @@ -2,10 +2,10 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* Static table prototypes */ +#include "rom_com.h" /* Static table prototypes */ #include "stl.h" #include diff --git a/lib_com/fft_rel_fx.c b/lib_com/fft_rel_fx.c index 42cf4deff..b07cb3acb 100644 --- a/lib_com/fft_rel_fx.c +++ b/lib_com/fft_rel_fx.c @@ -2,9 +2,9 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ -#include "options.h" /* Compilation switches */ +#include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* Static table prototypes */ +#include "rom_com.h" /* Static table prototypes */ #include "stl.h" #include "stdint.h" diff --git a/lib_com/fine_gain_bits_fx.c b/lib_com/fine_gain_bits_fx.c index 339e11096..627eda6e0 100644 --- a/lib_com/fine_gain_bits_fx.c +++ b/lib_com/fine_gain_bits_fx.c @@ -3,8 +3,8 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" diff --git a/lib_com/gs_bitallocation_fx.c b/lib_com/gs_bitallocation_fx.c index 004cdb3d3..943291cec 100644 --- a/lib_com/gs_bitallocation_fx.c +++ b/lib_com/gs_bitallocation_fx.c @@ -2,11 +2,11 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ -#include "assert.h" /* Debug prototypes */ +#include "assert.h" /* Debug prototypes */ #include "stl.h" /*==================================================================================*/ diff --git a/lib_com/gs_bitallocation_ivas_fx.c b/lib_com/gs_bitallocation_ivas_fx.c index 510506147..6bc6eac23 100644 --- a/lib_com/gs_bitallocation_ivas_fx.c +++ b/lib_com/gs_bitallocation_ivas_fx.c @@ -6,7 +6,7 @@ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ #include "prot.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "ivas_prot.h" /* Function prototypes */ #include "assert.h" /* Debug prototypes */ #include "stl.h" diff --git a/lib_com/gs_inact_switching_fx.c b/lib_com/gs_inact_switching_fx.c index 27b1efb08..01a055620 100644 --- a/lib_com/gs_inact_switching_fx.c +++ b/lib_com/gs_inact_switching_fx.c @@ -2,9 +2,9 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "stl.h" diff --git a/lib_com/hq_bit_allocation_fx.c b/lib_com/hq_bit_allocation_fx.c index 79d6bb1a4..4ac2252f8 100644 --- a/lib_com/hq_bit_allocation_fx.c +++ b/lib_com/hq_bit_allocation_fx.c @@ -2,10 +2,10 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ -#include "options.h" /* Compilation switches */ -#include "stl.h" /* required for wmc_tool */ +#include "options.h" /* Compilation switches */ +#include "stl.h" /* required for wmc_tool */ #include "prot_fx.h" /* Function prototypes */ -#include "cnst.h" /* Common constants */ +#include "cnst.h" /* Common constants */ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif diff --git a/lib_com/hq_conf_fx.c b/lib_com/hq_conf_fx.c index 21f70e1a0..eb675986b 100644 --- a/lib_com/hq_conf_fx.c +++ b/lib_com/hq_conf_fx.c @@ -4,8 +4,8 @@ #include #include "options.h" -#include "cnst.h" /* Audio core constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "cnst.h" /* Audio core constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" diff --git a/lib_com/hvq_pvq_bitalloc_fx.c b/lib_com/hvq_pvq_bitalloc_fx.c index 2066ea993..4775f1b78 100644 --- a/lib_com/hvq_pvq_bitalloc_fx.c +++ b/lib_com/hvq_pvq_bitalloc_fx.c @@ -6,7 +6,7 @@ #include "rom_com.h" #include "prot_fx.h" /* Function prototypes */ -#include "cnst.h" /* Common constants */ +#include "cnst.h" /* Common constants */ /*--------------------------------------------------------------------------*/ /* Function hvq_pvq_bitalloc */ diff --git a/lib_com/isf_dec_amr_wb_fx.c b/lib_com/isf_dec_amr_wb_fx.c index e0b891273..586dea535 100644 --- a/lib_com/isf_dec_amr_wb_fx.c +++ b/lib_com/isf_dec_amr_wb_fx.c @@ -31,9 +31,9 @@ *******************************************************************************************************/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #ifdef _MSC_VER diff --git a/lib_com/limit_t0_fx.c b/lib_com/limit_t0_fx.c index 07557fe72..6573a7925 100644 --- a/lib_com/limit_t0_fx.c +++ b/lib_com/limit_t0_fx.c @@ -3,8 +3,8 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" diff --git a/lib_com/logqnorm_fx.c b/lib_com/logqnorm_fx.c index a4196a1b3..fbbf2a464 100644 --- a/lib_com/logqnorm_fx.c +++ b/lib_com/logqnorm_fx.c @@ -31,10 +31,10 @@ *******************************************************************************************************/ #include -#include "options.h" /* Compilation switches */ +#include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* Static table prototypes */ -#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ +#include "cnst.h" /* Common constants */ /*--------------------------------------------------------------------------* * Local constants diff --git a/lib_com/lpc_tools_fx.c b/lib_com/lpc_tools_fx.c index f723a2725..d4c01f46c 100644 --- a/lib_com/lpc_tools_fx.c +++ b/lib_com/lpc_tools_fx.c @@ -38,7 +38,7 @@ #include #include "options.h" /* Compilation switches */ #include "ivas_cnst.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" #include "basop_util.h" diff --git a/lib_com/pred_lt4_fx.c b/lib_com/pred_lt4_fx.c index 6cc06f28e..21bd9f541 100644 --- a/lib_com/pred_lt4_fx.c +++ b/lib_com/pred_lt4_fx.c @@ -3,9 +3,9 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 19da14d72..524cf7b73 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -10068,4 +10068,4 @@ Word16 sr2fscale( const Word32 sr_core /* i : internal sampling rate */ ); -#endif \ No newline at end of file +#endif diff --git a/lib_com/pvq_com_fx.c b/lib_com/pvq_com_fx.c index 97690114f..23c42119b 100644 --- a/lib_com/pvq_com_fx.c +++ b/lib_com/pvq_com_fx.c @@ -4,8 +4,8 @@ #include #include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ /*! r: Approximate integer division for positive input using lookup table */ UWord32 intLimCDivPos_fx( diff --git a/lib_com/re8_ppv_fx.c b/lib_com/re8_ppv_fx.c index 32c69f6e5..f330f22c2 100644 --- a/lib_com/re8_ppv_fx.c +++ b/lib_com/re8_ppv_fx.c @@ -2,8 +2,8 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "stl.h" diff --git a/lib_com/re8_util_fx.c b/lib_com/re8_util_fx.c index aa6075245..00909e2f5 100644 --- a/lib_com/re8_util_fx.c +++ b/lib_com/re8_util_fx.c @@ -3,9 +3,9 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ diff --git a/lib_com/recovernorm_fx.c b/lib_com/recovernorm_fx.c index d6659b77a..a61e1f183 100644 --- a/lib_com/recovernorm_fx.c +++ b/lib_com/recovernorm_fx.c @@ -2,10 +2,10 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ +#include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ /*--------------------------------------------------------------------------* * recovernorm_fx() diff --git a/lib_com/reordvct_fx.c b/lib_com/reordvct_fx.c index 45c2ffbba..07bc21bc8 100644 --- a/lib_com/reordvct_fx.c +++ b/lib_com/reordvct_fx.c @@ -31,7 +31,7 @@ *******************************************************************************************************/ #include -#include "options.h" /* Compilation switches */ +#include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ diff --git a/lib_com/scale_mem_fx.c b/lib_com/scale_mem_fx.c index b3eda3954..2e61cb938 100644 --- a/lib_com/scale_mem_fx.c +++ b/lib_com/scale_mem_fx.c @@ -34,7 +34,7 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ -#include "options.h" /* Common prototypes */ +#include "options.h" /* Common prototypes */ #include "prot_fx.h" /* Common prototypes */ #include "ivas_cnst.h" #include "stl.h" diff --git a/lib_com/stab_est_fx.c b/lib_com/stab_est_fx.c index 2d6a6b141..e0c75e563 100644 --- a/lib_com/stab_est_fx.c +++ b/lib_com/stab_est_fx.c @@ -2,8 +2,8 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_com/stat_noise_uv_mod_fx.c b/lib_com/stat_noise_uv_mod_fx.c index 957bae8a3..9869019fa 100644 --- a/lib_com/stat_noise_uv_mod_fx.c +++ b/lib_com/stat_noise_uv_mod_fx.c @@ -3,9 +3,9 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ +#include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ -#include "cnst.h" /* Function prototypes */ +#include "cnst.h" /* Function prototypes */ /*---------------------------------------------------------------------* * Local function prototypes @@ -303,7 +303,7 @@ void stat_noise_uv_mod_fx( Exc2_local[i] = extract_h( L_tmp ); /*Q_local */ move16(); } - *Q_stat_noise = Q_local; /* update for next call, routine can only be called once every frame */ + *Q_stat_noise = Q_local; /* update for next call, routine can only be called once every frame */ move16(); Qdiff = sub( Q_exc, Q_local ); /* local excitation and incoming excitation */ Scale_sig( Exc2_local, L_FRAME, Qdiff ); diff --git a/lib_com/swb_tbe_com.c b/lib_com/swb_tbe_com.c index 7f9ce0c18..aec2805a0 100644 --- a/lib_com/swb_tbe_com.c +++ b/lib_com/swb_tbe_com.c @@ -1217,7 +1217,7 @@ void GenSHBSynth_fx_32( Word32 *shb_syn_speech_32k, /* o : output highband component Qx*/ Word32 Hilbert_Mem[], /* i/o: memory Qx*/ Word32 state_lsyn_filt_shb_local[], /* i/o: memory Qx*/ - const Word16 L_frame, /* i : ACELP frame length */ + const Word16 L_frame, /* i : ACELP frame length */ Word16 *syn_dm_phase ) { Word32 speech_buf_32k[L_FRAME32k]; @@ -1236,7 +1236,7 @@ void GenSHBSynth_fx_32( // shb_syn_speech_32k[i] = ( ( i % 2 ) == 0 ) ? ( -speech_buf_32k[i] ) : ( speech_buf_32k[i] ); IF( i % 2 == 0 ) { - shb_syn_speech_32k[i] = L_negate(speech_buf_32k[i]); + shb_syn_speech_32k[i] = L_negate( speech_buf_32k[i] ); } ELSE { @@ -1364,7 +1364,7 @@ void ScaleShapedSHB( } #ifdef IVAS_FLOAT_FIXED void ScaleShapedSHB_32( - const Word16 length, /* i : SHB overlap length */ + const Word16 length, /* i : SHB overlap length */ Word32 *synSHB_fx, /* i/o: synthesized shb signal Q_inp/Q_new */ Word32 *overlap_fx, /* i/o: buffer for overlap-add Q_inp/Q_new */ const Word16 *subgain_fx, /* i : subframe gain Q15 */ @@ -1406,7 +1406,7 @@ void ScaleShapedSHB_32( FOR( k = 0; k < shr( length, 1 ); k++ ) { sum_gain_fx = mult_r( subwin_fx[2 * k + 2], subgain_fx[0] ); - mod_syn_fx[add(skip[0] , k)] = Mpy_32_16_1( synSHB_fx[add(skip[0] , k)], sum_gain_fx ); + mod_syn_fx[add( skip[0], k )] = Mpy_32_16_1( synSHB_fx[add( skip[0], k )], sum_gain_fx ); move32(); // Qx mod_syn_fx[add( add( skip[0], k ), shr( length, 1 ) )] = Mpy_32_16_1( synSHB_fx[add( add( skip[0], k ), shr( length, 1 ) )], subgain_fx[0] ); // Qx move32(); @@ -1417,14 +1417,14 @@ void ScaleShapedSHB_32( { L_tmp = L_mult0( subwin_fx[k + 1], subgain_fx[i] ); sum_gain_fx = round_fx( L_mac0( L_tmp, subwin_fx[length - k - 1], subgain_fx[i - 1] ) ); - mod_syn_fx[add(skip[i] , k)] = L_shl( Mpy_32_16_1( synSHB_fx[add(skip[i] , k)], sum_gain_fx ), 1 ); // Qx + mod_syn_fx[add( skip[i], k )] = L_shl( Mpy_32_16_1( synSHB_fx[add( skip[i], k )], sum_gain_fx ), 1 ); // Qx move32(); } } FOR( k = 0; k < shr( length, 1 ); k++ ) { sum_gain_fx = mult_r( subwin_fx[sub( sub( length, shl( k, 1 ) ), 2 )], subgain_fx[i - 1] ); - mod_syn_fx[add(skip[i] , k)] = Mpy_32_16_1( synSHB_fx[add(skip[i] , k)], sum_gain_fx ); // Qx + mod_syn_fx[add( skip[i], k )] = Mpy_32_16_1( synSHB_fx[add( skip[i], k )], sum_gain_fx ); // Qx move32(); } } @@ -1439,21 +1439,21 @@ void ScaleShapedSHB_32( { mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[k + 1], subgain_fx[0] ) ); // Qx move32(); - j = add(j,1); + j = add( j, 1 ); } FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ ) { FOR( k = 0; k < join_length - length; k++ ) { - mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[i_mult(i , num_join)] ); // Qx + mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[i_mult( i, num_join )] ); // Qx move32(); j = add( j, 1 ); } FOR( k = 0; k < length; k++ ) { - L_tmp = L_mult0( subwin_fx[length - k - 1], subgain_fx[i_mult(i , num_join)] ); - mod_syn_fx[j] = L_shl( Mpy_32_16_1( synSHB_fx[j], round_fx( L_mac0( L_tmp, subwin_fx[k + 1], subgain_fx[i_mult(( i + 1 ) , num_join)] ) ) ), 1 ); // Qx + L_tmp = L_mult0( subwin_fx[length - k - 1], subgain_fx[i_mult( i, num_join )] ); + mod_syn_fx[j] = L_shl( Mpy_32_16_1( synSHB_fx[j], round_fx( L_mac0( L_tmp, subwin_fx[k + 1], subgain_fx[i_mult( ( i + 1 ), num_join )] ) ) ), 1 ); // Qx move32(); j = add( j, 1 ); } @@ -1466,14 +1466,14 @@ void ScaleShapedSHB_32( } FOR( k = 0; k < length; k++ ) { - mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[sub(sub(length , k) , 1)], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ) ); // Qx + mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[sub( sub( length, k ), 1 )], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ) ); // Qx move32(); j = add( j, 1 ); } } Word16 norm_shift = norm_l( frame_gain_fx ); - if( frame_gain_fx == 0 ) + if ( frame_gain_fx == 0 ) { norm_shift = 31; move16(); @@ -1486,7 +1486,7 @@ void ScaleShapedSHB_32( move16(); FOR( i = 0; i < L_SHB_LAHEAD; i++ ) { - overlap_fx[i] = L_shl( overlap_fx[i],sub( *Q_new , *Q_inp) ); + overlap_fx[i] = L_shl( overlap_fx[i], sub( *Q_new, *Q_inp ) ); move32(); } @@ -1498,7 +1498,6 @@ void ScaleShapedSHB_32( move32(); move32(); move32(); - } FOR( ; i < l_frame; i++ ) @@ -1509,7 +1508,7 @@ void ScaleShapedSHB_32( FOR( ; i < l_frame + l_shb_lahead; i++ ) { - synSHB_fx[i] = L_shl( synSHB_fx[i],sub( *Q_new , *Q_inp) ); + synSHB_fx[i] = L_shl( synSHB_fx[i], sub( *Q_new, *Q_inp ) ); overlap_fx[i - l_frame] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[l_frame + l_shb_lahead - 1 - i] ) ); // Q_new move32(); move32(); diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 93ffd08a0..55ca77c35 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -2997,7 +2997,7 @@ void GenShapedSHBExcitation_ivas_fx( varEnvShape = 32604; move16(); csfilt_num2[0] = 32768 - varEnvShape; - //csfilt_num2[0] = sub( 32767, varEnvShape ); + // csfilt_num2[0] = sub( 32767, varEnvShape ); move16(); neg_csfilt_den2[1] = varEnvShape; move16(); @@ -6372,8 +6372,8 @@ void prep_tbe_exc_ivas_fx( Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12 */ #ifdef BASOP_NOGLOB - Ltemp1 = L_shl_o( Ltemp1,add( Q_exc , 6 )/*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - Ltemp2 = L_shl_o( Ltemp2,add( Q_exc , 4 )/*Q_exc+16-13*/, &Overflow ); /*Q_exc+16 */ + Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ + Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, 4 ) /*Q_exc+16-13*/, &Overflow ); /*Q_exc+16 */ tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc */ #else /* BASOP_NOGLOB */ @@ -6392,8 +6392,8 @@ void prep_tbe_exc_ivas_fx( /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ #ifdef BASOP_NOGLOB - Ltemp1 = L_shl_o( Ltemp1, add(Q_exc , 6) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */ + Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ + tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */ #else Ltemp1 = L_shl( Ltemp1, Q_exc + 6 /*Q_exc+16-19*/ ); /*Q_exc+16 */ tmp_code_preInt_fx[i] = round_fx( Ltemp1 ); /* Q_exc */ @@ -6403,12 +6403,12 @@ void prep_tbe_exc_ivas_fx( } interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */ - FOR( i = 0; i < shl(L_subfr , 1); i++ ) + FOR( i = 0; i < shl( L_subfr, 1 ); i++ ) { - L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + shl(i_subfr_fx , 1)] ); /*Q14+Q_exc+1 */ + L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + shl( i_subfr_fx, 1 )] ); /*Q14+Q_exc+1 */ #ifdef BASOP_NOGLOB tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */ - bwe_exc_fx[i + shl(i_subfr_fx , 1)] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */ + bwe_exc_fx[i + shl( i_subfr_fx, 1 )] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */ move16(); #else /* BASOP_NOGLOB */ tmp = round_fx( L_shl( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/ ) ); /* tmp in Q_exc */ diff --git a/lib_com/syn_12k8_fx.c b/lib_com/syn_12k8_fx.c index 4907e8676..86d4c6ef7 100644 --- a/lib_com/syn_12k8_fx.c +++ b/lib_com/syn_12k8_fx.c @@ -2,8 +2,8 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ diff --git a/lib_com/syn_filt_fx.c b/lib_com/syn_filt_fx.c index c30ad59ee..e3a3024ba 100644 --- a/lib_com/syn_filt_fx.c +++ b/lib_com/syn_filt_fx.c @@ -459,12 +459,12 @@ void ivas_synth_mem_updt2_fx( } ELSE { - en1_e = sub(30 ,shl(Q,1)); + en1_e = sub( 30, shl( Q, 1 ) ); en2_e = sub( 30, shl( Q, 1 ) ); tmp1 = Sqrt32( en1, &en1_e ); tmp2 = Sqrt32( en2, &en2_e ); tmp = BASOP_Util_Divide3232_Scale( tmp1, tmp2, &tmp_e ); - loc_rat_e = add(sub(en1_e , en2_e) , tmp_e); + loc_rat_e = add( sub( en1_e, en2_e ), tmp_e ); loc_rat = shl_sat( tmp, loc_rat_e ); // Q15 } diff --git a/lib_com/tcq_position_arith_fx.c b/lib_com/tcq_position_arith_fx.c index 2c13d89d4..8c4b9a582 100644 --- a/lib_com/tcq_position_arith_fx.c +++ b/lib_com/tcq_position_arith_fx.c @@ -106,8 +106,8 @@ static UWord32 bitstream_load_bit( } curPos = &pBS->curPos; - bit = UL_and( UL_lshr( pBS->buf[pBS->numByte] , ( *curPos ) ) , 0x00000001 ); - *curPos = sub(*curPos, 1); + bit = UL_and( UL_lshr( pBS->buf[pBS->numByte], ( *curPos ) ), 0x00000001 ); + *curPos = sub( *curPos, 1 ); IF( *curPos < 0 ) { @@ -405,7 +405,7 @@ static Word16 ar_decode_fx( arInst->value = value; move32(); - return ( sub(symbol , 1) ); + return ( sub( symbol, 1 ) ); } void ar_decoder_done_fx( @@ -667,7 +667,7 @@ static void TCQnew_fx( move16(); if ( v_fx[i - 1] <= 0 ) { - vout_fx[i - 1] = negate(quant_fx[position][i]); + vout_fx[i - 1] = negate( quant_fx[position][i] ); move16(); } position = path_fx[position][i]; @@ -1738,7 +1738,7 @@ Word32 encode_position_ari_fx( btcq_fx = GetBitsFromPulses_fx( pulses, size ); /* Estimate TCQ bits */ bits_fx = L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[add( sub( size, nz ), 1 )] ) ); - bits_fx = L_add( bits_fx, L_sub( btcq_fx, L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[add(sub( size, nz ) , 1)] ) ) ) ); + bits_fx = L_add( bits_fx, L_sub( btcq_fx, L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[add( sub( size, nz ), 1 )] ) ) ) ); bits_fx = L_sub( bits_fx, L_sub( table_logcum_fx[pulses], L_add( table_logcum_fx[nz], table_logcum_fx[add( pulses, sub( nz, 1 ) )] ) ) ); bits_fx = L_sub( bits_fx, nz ); *est_bits_frame_fx = L_add( *est_bits_frame_fx, bits_fx ); @@ -2216,7 +2216,7 @@ void decode_position_ari_fx( test(); test(); - IF( ( mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] == 0 && scp > 0 ) || EQ_16( mode_num_nz[sub( sub( i, storepos ), stpos )] , mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] ) ) + IF( ( mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] == 0 && scp > 0 ) || EQ_16( mode_num_nz[sub( sub( i, storepos ), stpos )], mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] ) ) { mode_num_nz[sub( sub( add( i, 1 ), storepos ), stpos )] = 0; move16(); @@ -2404,7 +2404,7 @@ void decode_magnitude_usq_fx( } magnp = sub( magnp, out[magncout] ); magnzp = sub( magnzp, 1 ); - magncout = add(magncout, 1 ); + magncout = add( magncout, 1 ); IF( magnzp == 0 ) /* last magnitude generation */ { @@ -2527,7 +2527,7 @@ void decode_mangitude_tcq_fx( exp1 = sub( norm_s( num ), 1 ); exp2 = norm_s( denum ); prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */ - exp = add(15 , sub(exp1 , exp2)); + exp = add( 15, sub( exp1, exp2 ) ); prob1_fx = shl( prob1_fx, sub( 15, exp ) ); prob0_fx = sub( MAX_16, prob1_fx ); } @@ -2657,7 +2657,7 @@ Word16 GetScale_fx( Word16 pulses = MAX_PULSES, p_est, exp, exp1, exp2, magicnum; move16(); Word32 t, a, b, ab, estbits_fx = 0; - move32(); + move32(); magicnum = 24773; move16(); /*Q17: 0.188992013101951f; */ diff --git a/lib_com/tcx_ltp_fx.c b/lib_com/tcx_ltp_fx.c index 59ab1d55e..9d18d4841 100644 --- a/lib_com/tcx_ltp_fx.c +++ b/lib_com/tcx_ltp_fx.c @@ -664,7 +664,7 @@ static void tcx_ltp_synth_filter32( L_tmp2 = Mpy_32_16_r( L_tmp2, alpha ); #ifdef BASOP_NOGLOB L_tmp2 = L_add_sat( synth[j], L_tmp2 ); - if( zir != NULL ) + if ( zir != NULL ) { L_tmp2 = L_sub_sat( L_tmp2, zir[j] ); } @@ -727,7 +727,7 @@ static void tcx_ltp_synth_filter_10( assert( GE_16( filtIdx, 0 ) ); w0 = &tcxLtpFilters[filtIdx].filt[pitch_fr]; - w1 = &tcxLtpFilters[filtIdx].filt[sub(pitch_res , pitch_fr)]; + w1 = &tcxLtpFilters[filtIdx].filt[sub( pitch_res, pitch_fr )]; v0 = &tcxLtpFilters[filtIdx].filt[0]; v1 = &tcxLtpFilters[filtIdx].filt[pitch_res]; L = tcxLtpFilters[filtIdx].length; @@ -796,7 +796,7 @@ static void tcx_ltp_synth_filter_10_fx( curr_gain = gain; move16(); - gain_step = idiv1616(negate( gain ) , length); // TODO + gain_step = idiv1616( negate( gain ), length ); // TODO for ( j = 0; j < length; j++ ) { @@ -860,8 +860,8 @@ static void tcx_ltp_synth_filter_01( curr_gain = 0; move16(); - //gain_step = gain / length; // TODO - gain_step = idiv1616(gain , length); // TODO + // gain_step = gain / length; // TODO + gain_step = idiv1616( gain, length ); // TODO for ( j = 0; j < length; j++ ) { @@ -926,8 +926,8 @@ static void tcx_ltp_synth_filter_01_fx( curr_gain = 0; move16(); - //gain_step = gain / length; // TODO - gain_step = idiv1616(gain , length); // TODO + // gain_step = gain / length; // TODO + gain_step = idiv1616( gain, length ); // TODO for ( j = 0; j < length; j++ ) { @@ -1026,8 +1026,8 @@ static void tcx_ltp_synth_filter_11_unequal_pitch( /* 1. decreasing gain filter. The first filter unit with the parameters associated to the previous interval and scaling towards 0 */ gain = prev_gain; move16(); - //gain_step = negate( prev_gain ) / length; // TODO - gain_step = idiv1616(negate( prev_gain ) , length); // TODO + // gain_step = negate( prev_gain ) / length; // TODO + gain_step = idiv1616( negate( prev_gain ), length ); // TODO for ( j = 0; j < length; j++ ) { @@ -1155,7 +1155,7 @@ static void tcx_ltp_synth_filter_11_unequal_pitch_fx( /* 1. decreasing gain filter. The first filter unit with the parameters associated to the previous interval and scaling towards 0 */ gain = prev_gain; move16(); - gain_step = idiv1616(negate( prev_gain ) , length); // TODOD + gain_step = idiv1616( negate( prev_gain ), length ); // TODOD for ( j = 0; j < length; j++ ) { @@ -1358,7 +1358,7 @@ void tcx_ltp_post( move16(); } - IF( core == ACELP_CORE ) + IF( core == ACELP_CORE ) { bfi = 0; move16(); @@ -1420,7 +1420,7 @@ void tcx_ltp_post( ELSE IF( bfi == 0 ) { /* LTP and good frame */ - test(); + test(); IF( EQ_16( st->element_mode, EVS_MONO ) ) /* hard tunings for EVS_MONO, HQ_48k is TCX only */ { IF( NE_16( output_frame, L_frame_core ) ) @@ -1579,20 +1579,20 @@ void tcx_ltp_post( test(); // #ifdef IVAS_CODE_TCX_LTP if ( st->element_mode != EVS_MONO ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF ( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev == 0 ) + { + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev == 0 ) { /* The filtering is deactivated, just copy input to the output */ Copy( sig_in + delay, sig_out + delay, L_transition ); } - ELSE IF ( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev != 0 ) + ELSE IF( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev != 0 ) { /* Filtering with the first filter unit */ tcx_ltp_synth_filter_10( sig_out + delay, sig_in + delay, L_transition, hTcxLtpDec->tcxltp_pitch_int_post_prev, hTcxLtpDec->tcxltp_pitch_fr_post_prev, hTcxLtpDec->tcxltp_gain_post_prev, st->pit_res_max_past, hTcxLtpDec->tcxltp_filt_idx_prev ); @@ -1602,7 +1602,7 @@ void tcx_ltp_post( /* Filtering with the second filter unit */ tcx_ltp_synth_filter_01( sig_out + delay, sig_in + delay, L_transition, pitch_int, pitch_fr, gain, st->pit_res_max, filtIdx ); } - ELSE IF( EQ_16(gain ,hTcxLtpDec->tcxltp_gain_post_prev )&& EQ_16(pitch_int , hTcxLtpDec->tcxltp_pitch_int_post_prev) && EQ_16(pitch_fr, hTcxLtpDec->tcxltp_pitch_fr_post_prev )&& EQ_16(st->pit_res_max , st->pit_res_max_past )&& EQ_16(filtIdx , hTcxLtpDec->tcxltp_filt_idx_prev )) + ELSE IF( EQ_16( gain, hTcxLtpDec->tcxltp_gain_post_prev ) && EQ_16( pitch_int, hTcxLtpDec->tcxltp_pitch_int_post_prev ) && EQ_16( pitch_fr, hTcxLtpDec->tcxltp_pitch_fr_post_prev ) && EQ_16( st->pit_res_max, st->pit_res_max_past ) && EQ_16( filtIdx, hTcxLtpDec->tcxltp_filt_idx_prev ) ) { tcx_ltp_synth_filter( sig_out + delay, sig_in + delay, L_transition, pitch_int, pitch_fr, gain, st->pit_res_max, NULL, 0, filtIdx ); } @@ -1616,10 +1616,10 @@ void tcx_ltp_post( ELSE // #endif { - test(); - test(); - test(); - test(); + test(); + test(); + test(); + test(); IF( gain == 0 && hTcxLtpDec->tcxltp_gain_post_prev == 0 ) { Copy( sig_in + delay, sig_out + delay, L_transition ); diff --git a/lib_com/tcx_mdct_fx.c b/lib_com/tcx_mdct_fx.c index f2f93d9ec..474f8779b 100644 --- a/lib_com/tcx_mdct_fx.c +++ b/lib_com/tcx_mdct_fx.c @@ -125,7 +125,7 @@ void TCX_MDCT( FOR( i = 0; i < l / 2; i++ ) { #ifdef BASOP_NOGLOB - y[add( add( add( shr( m, 1 ), shr( r, 1 ) ), shr( m, 1 ) ), i )] = L_msu_o( L_mult( x[i], factor ), x[sub(sub(l , 1) , i)], factor, &Overflow ); + y[add( add( add( shr( m, 1 ), shr( r, 1 ) ), shr( m, 1 ) ), i )] = L_msu_o( L_mult( x[i], factor ), x[sub( sub( l, 1 ), i )], factor, &Overflow ); #else /* BASOP_NOGLOB */ y[m / 2 + r / 2 + m / 2 + i] = L_msu( L_mult( x[i], factor ), x[l - 1 - i], factor ); #endif /* BASOP_NOGLOB */ @@ -133,13 +133,13 @@ void TCX_MDCT( } FOR( i = 0; i < m / 2; i++ ) { - y[sub( sub( add( shr( m, 1 ), shr( r, 1 ) ), 1 ), i )] = L_mult( x[add(add(l , shr(m ,1)) , i)], neg_factor ); + y[sub( sub( add( shr( m, 1 ), shr( r, 1 ) ), 1 ), i )] = L_mult( x[add( add( l, shr( m, 1 ) ), i )], neg_factor ); move32(); } FOR( i = 0; i < r / 2; i++ ) { #ifdef BASOP_NOGLOB - y[sub( sub( sub( add( shr( m, 1 ), shr( r, 1 ) ), 1 ), shr( m, 1 ) ), i )] = L_mac_o( L_mult( x[add( add( l, m ), i )], neg_factor ), x[sub(sub(add(add(l , m) , r) , 1) , i)], neg_factor, &Overflow ); + y[sub( sub( sub( add( shr( m, 1 ), shr( r, 1 ) ), 1 ), shr( m, 1 ) ), i )] = L_mac_o( L_mult( x[add( add( l, m ), i )], neg_factor ), x[sub( sub( add( add( l, m ), r ), 1 ), i )], neg_factor, &Overflow ); #else /* BASOP_NOGLOB */ y[m / 2 + r / 2 - 1 - m / 2 - i] = L_mac( L_mult( x[l + m + i], neg_factor ), x[l + m + r - 1 - i], neg_factor ); #endif /* BASOP_NOGLOB */ @@ -188,7 +188,7 @@ void TCX_MDST( FOR( i = 0; i < l / 2; i++ ) { #ifdef BASOP_NOGLOB - y[add( add( add( shr(m ,1), shr(r ,1) ), shr(m ,1) ), i )] = L_msu_o( L_mult( x[i], neg_factor ), x[sub(sub(l , 1) , i)], factor, &Overflow ); + y[add( add( add( shr( m, 1 ), shr( r, 1 ) ), shr( m, 1 ) ), i )] = L_msu_o( L_mult( x[i], neg_factor ), x[sub( sub( l, 1 ), i )], factor, &Overflow ); #else /* BASOP_NOGLOB */ y[m / 2 + r / 2 + m / 2 + i] = L_msu( L_mult( x[i], neg_factor ), x[l - 1 - i], factor ); #endif @@ -250,7 +250,7 @@ void TCX_MDCT_Inverse( FOR( i = 0; i < R2; i++ ) { #ifdef BASOP_NOGLOB - y[add(add(add(l , m) , R2) , i)] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[add(L2 , i)], negfac ), s ) ); /* fold out right end of DCT */ + y[add( add( add( l, m ), R2 ), i )] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[add( L2, i )], negfac ), s ) ); /* fold out right end of DCT */ #else y[l + m + R2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); /* fold out right end of DCT */ #endif @@ -261,7 +261,7 @@ void TCX_MDCT_Inverse( FOR( i = 0; i < L2; i++ ) { #ifdef BASOP_NOGLOB - y[i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[add(add(add(L2 , m) , R2) , i)], fac ), s ) ); /* negate, fold out left end of DCT */ + y[i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[add( add( add( L2, m ), R2 ), i )], fac ), s ) ); /* negate, fold out left end of DCT */ #else y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], fac ), s ) ); /* negate, fold out left end of DCT */ #endif @@ -319,7 +319,7 @@ void TCX_MDST_Inverse_fx( FOR( i = 0; i < R2; i++ ) { - y[add(add(add(l , m) , R2) , i)] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add(L2 , i)], fac ), s ) ); /* fold out right end of DCT */ + y[add( add( add( l, m ), R2 ), i )] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( L2, i )], fac ), s ) ); /* fold out right end of DCT */ move16(); } @@ -334,7 +334,7 @@ void TCX_MDST_Inverse_fx( Word16 f; f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( L2, i )], fac ), s ) ); - y[add(L2 , i)] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[sub( sub( add( add( l, m ), R2 ), 1 ), i )], negfac ), s ) ); /* time-reverse mid of DCT */ + y[add( L2, i )] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[sub( sub( add( add( l, m ), R2 ), 1 ), i )], negfac ), s ) ); /* time-reverse mid of DCT */ move16(); y[sub( sub( add( add( l, m ), R2 ), 1 ), i )] = negate( f ); @@ -366,7 +366,7 @@ void TCX_MDXT_Inverse_fx( set32_fx( tmp_buf, 0, N_MAX + L_MDCT_OVLP_MAX / 2 ); - edxt_fx( x, tmp_buf + L2, add(add(L2 , m) , R2), kernel_type, TRUE ); + edxt_fx( x, tmp_buf + L2, add( add( L2, m ), R2 ), kernel_type, TRUE ); fac = TCX_MDCT_Inverse_GetScaleFactor( add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &fac_e ); x_e = add( x_e, fac_e ); @@ -380,8 +380,8 @@ void TCX_MDXT_Inverse_fx( { signLeft = fac; } - //signRight = ( kernel_type & 1 ? fac : negfac ); - IF ( L_and( kernel_type, 1 ) ) + // signRight = ( kernel_type & 1 ? fac : negfac ); + IF( L_and( kernel_type, 1 ) ) { signRight = fac; } @@ -395,24 +395,24 @@ void TCX_MDXT_Inverse_fx( FOR( i = 0; i < L2; i++ ) { - y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add(add(add(L2 , m) , R2) , i)], signLeft ), s ) ); /* fold out the left end */ + y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( add( add( L2, m ), R2 ), i )], signLeft ), s ) ); /* fold out the left end */ } FOR( i = 0; i < R2; i++ ) { - y[add(add(add(l , m) , R2) , i)] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add(L2 , i)], signRight ), s ) ); /* ...and right end */ + y[add( add( add( l, m ), R2 ), i )] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( L2, i )], signRight ), s ) ); /* ...and right end */ move16(); } - FOR( i = 0; i < ( ( add(add(L2 , m) , R2) ) >> 1 ); i++ ) + FOR( i = 0; i < ( ( add( add( L2, m ), R2 ) ) >> 1 ); i++ ) { - f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add(L2 , i)], negfac ), s ) ); + f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[add( L2, i )], negfac ), s ) ); - y[add(L2 , i)] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[sub(sub(add(add(l , m) , R2) , 1) , i)], negfac ), s ) ); /* time-reverse mid of DCT */ + y[add( L2, i )] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[sub( sub( add( add( l, m ), R2 ), 1 ), i )], negfac ), s ) ); /* time-reverse mid of DCT */ move16(); - y[sub(sub(add(add(l , m) , R2) , 1) , i)] = f; + y[sub( sub( add( add( l, m ), R2 ), 1 ), i )] = f; move16(); } diff --git a/lib_com/tcx_mdct_window.c b/lib_com/tcx_mdct_window.c index de929cff7..65fb6a1a0 100644 --- a/lib_com/tcx_mdct_window.c +++ b/lib_com/tcx_mdct_window.c @@ -115,11 +115,11 @@ void mdct_window_sine_IVAS_updated( const Word16 window_type, const Word16 element_mode ) { - IF (EQ_16( element_mode , EVS_MONO )) + IF( EQ_16( element_mode, EVS_MONO ) ) { const PWord16 *table; table = getSineWindowTable( n ); - FOR ( Word32 i = 0; i < shr( n, 1 ); i++ ) + FOR( Word32 i = 0; i < shr( n, 1 ); i++ ) { window[i].v.re = table[i].v.re; move16(); @@ -134,8 +134,8 @@ void mdct_window_sine_IVAS_updated( Word16 buf_in_size = 0; move16(); Word16 temp[420]; - set16_fx(temp, 0, 420); - SWITCH ( window_type ) + set16_fx( temp, 0, 420 ); + SWITCH( window_type ) { case FULL_OVERLAP: window_table = tcx_mdct_window_48_fx; @@ -158,7 +158,7 @@ void mdct_window_sine_IVAS_updated( BREAK; } - IF( EQ_32( Fs , 48000 )) + IF( EQ_32( Fs, 48000 ) ) { Copy( window_table, temp, n ); } @@ -167,7 +167,7 @@ void mdct_window_sine_IVAS_updated( lerp( window_table, temp, n, buf_in_size ); } - FOR ( Word32 i = 0; i < shr(n, 1); i++ ) + FOR( Word32 i = 0; i < shr( n, 1 ); i++ ) { window[i].v.re = temp[n - 1 - i]; move16(); @@ -186,7 +186,7 @@ void mdct_window_sine( PWord16 *window, Word16 n ) { const PWord16 *table; table = getSineWindowTable( n ); - FOR ( Word32 i = 0; i < shr(n, 1); i++ ) + FOR( Word32 i = 0; i < shr( n, 1 ); i++ ) { window[i].v.re = table[i].v.re; move16(); diff --git a/lib_com/tcx_utils_fx.c b/lib_com/tcx_utils_fx.c index ed8ea7013..e7987d0ce 100644 --- a/lib_com/tcx_utils_fx.c +++ b/lib_com/tcx_utils_fx.c @@ -888,7 +888,7 @@ void lpc2mdct_2( BASOP_cfft_ivas( RealData_fx, ImagData_fx, 1, &scale ); /*Get amplitude*/ - j = sub(FDNS_NPTS , 1); + j = sub( FDNS_NPTS, 1 ); move16(); k = 0; move16(); @@ -1972,7 +1972,7 @@ void tcx_noise_filling_with_shift( } Q[i] = L_shl( Q[i], nrm ); move32(); - new_Q_e[i] = sub(31 , nrm); + new_Q_e[i] = sub( 31, nrm ); tmp1 = shr( seed, 4 ); nrg = L_mac0( nrg, tmp1, tmp1 ); /* sum up energy of current noise segment */ diff --git a/lib_com/tec_com.c b/lib_com/tec_com.c index 380fc0c09..32c6e9fef 100644 --- a/lib_com/tec_com.c +++ b/lib_com/tec_com.c @@ -654,7 +654,7 @@ void calcGainTemp_TBE_Fx( startPos, stopPos, bandOffset, - sub(15 , cldfb_exp) ); + sub( 15, cldfb_exp ) ); IF( code > 0 ) { @@ -1030,7 +1030,7 @@ static Word16 procTec_Fx( s = norm_s( hb_synth_Fx[k] ); hb_synth_Fx[k] = mult_r( gain_m[i], shl( hb_synth_Fx[k], s ) ); move16(); - shift[k] = sub(s , gain_e[i]); + shift[k] = sub( s, gain_e[i] ); if ( GT_16( min_shift, shift[k] ) ) { diff --git a/lib_com/trans_direct_fx.c b/lib_com/trans_direct_fx.c index 5752de723..82e2c981c 100644 --- a/lib_com/trans_direct_fx.c +++ b/lib_com/trans_direct_fx.c @@ -2,10 +2,10 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common FX constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common FX constants */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* Function prototypes */ +#include "rom_com.h" /* Function prototypes */ /*------------------------------------------------------------------- * direct_transform() diff --git a/lib_com/trans_inv_fx.c b/lib_com/trans_inv_fx.c index 5f712b1b5..f79443862 100644 --- a/lib_com/trans_inv_fx.c +++ b/lib_com/trans_inv_fx.c @@ -2,9 +2,9 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ +#include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* Function prototypes */ +#include "rom_com.h" /* Function prototypes */ #include "rom_dec.h" diff --git a/lib_com/weight_fx.c b/lib_com/weight_fx.c index 2d9999736..6c123cbf2 100644 --- a/lib_com/weight_fx.c +++ b/lib_com/weight_fx.c @@ -3,9 +3,9 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ /*--------------------------------------------------------------------------* diff --git a/lib_com/window_ola_fx.c b/lib_com/window_ola_fx.c index 20051c051..40c31f8fd 100644 --- a/lib_com/window_ola_fx.c +++ b/lib_com/window_ola_fx.c @@ -2,9 +2,9 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ -#include "options.h" /* Compilation switches */ +#include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* Function prototypes */ +#include "rom_com.h" /* Function prototypes */ #include "stl.h" void sinq_fx( diff --git a/lib_com/wtda_fx.c b/lib_com/wtda_fx.c index f6a2c5acd..b20771f8c 100644 --- a/lib_com/wtda_fx.c +++ b/lib_com/wtda_fx.c @@ -2,9 +2,9 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* required by wmc_tool */ #include "stat_com.h" /*--------------------------------------------------------------------------* diff --git a/lib_dec/FEC_HQ_core.c b/lib_dec/FEC_HQ_core.c index 68f7d72de..5dd3351aa 100644 --- a/lib_dec/FEC_HQ_core.c +++ b/lib_dec/FEC_HQ_core.c @@ -1557,7 +1557,7 @@ void save_synthesis_hq_fec_fx( move16(); BREAK; case IVAS_CPE_DFT: - IF( EQ_16(hCPE->nchan_out , 1) && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) + IF( EQ_16( hCPE->nchan_out, 1 ) && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) { post_hq_delay = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); move16(); @@ -1581,10 +1581,10 @@ void save_synthesis_hq_fec_fx( test(); IF( ( EQ_16( st->codec_mode, MODE1 ) && st->hTcxDec != NULL ) && ( ( EQ_16( st->core, ACELP_CORE ) && !( EQ_16( st->bfi, 1 ) && EQ_16( st->con_tcx, 1 ) ) ) || EQ_16( st->core, HQ_CORE ) ) ) { - Copy( st->hTcxDec->synth_history_fx + output_frame, st->hTcxDec->synth_history_fx, add(sub(output_frame , post_hq_delay) , NS2SA( st->output_Fs, PH_ECU_MEM_NS )) ); + Copy( st->hTcxDec->synth_history_fx + output_frame, st->hTcxDec->synth_history_fx, add( sub( output_frame, post_hq_delay ), NS2SA( st->output_Fs, PH_ECU_MEM_NS ) ) ); FOR( Word16 i = 0; i < output_frame; i++ ) { - st->hTcxDec->old_synthFB_fx[sub(add(i , output_frame) , post_hq_delay)] = extract_h( output_fx[i] ); + st->hTcxDec->old_synthFB_fx[sub( add( i, output_frame ), post_hq_delay )] = extract_h( output_fx[i] ); move16(); } @@ -1593,27 +1593,27 @@ void save_synthesis_hq_fec_fx( /* reset the remaining buffer, which is read in TCX concealment the necessary samples to fill this buffer are not available for all cases, the impact on the output is limited */ - set16_fx( st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , post_hq_delay), 0, post_hq_delay ); + set16_fx( st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), post_hq_delay ), 0, post_hq_delay ); IF( GE_16( output_frame, L_FRAME16k ) ) { - Copy( st->prev_synth_buffer_fx, st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS )), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); + Copy( st->prev_synth_buffer_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ) ), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ); } ELSE { - Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl(output_frame, 1), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl( output_frame, 1 ), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } IF( st->core != ACELP_CORE ) { IF( GE_16( output_frame, L_FRAME16k ) ) { - Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , NS2SA( st->output_Fs, DELAY_CLDFB_NS )), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); - Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl(output_frame, 1), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl( output_frame, 1 ), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } ELSE { - Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS )), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); - Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS )), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS ) ), NS2SA( st->output_Fs, DELAY_CLDFB_NS ) ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), NS2SA( st->output_Fs, DELAY_BWE_TOTAL_NS - DELAY_CLDFB_NS ) ), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } } } @@ -1621,8 +1621,8 @@ void save_synthesis_hq_fec_fx( { IF( st->core != ACELP_CORE ) { - Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub(shl(output_frame, 1) , post_hq_delay), post_hq_delay ); - Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl(output_frame, 1), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy( st->delay_buf_out_fx, st->hTcxDec->old_synthFB_fx + sub( shl( output_frame, 1 ), post_hq_delay ), post_hq_delay ); + Copy( st->hHQ_core->old_out_fx + NS2SA( st->output_Fs, N_ZERO_MDCT_NS ), st->hTcxDec->old_synthFB_fx + shl( output_frame, 1 ), NS2SA( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); } } } diff --git a/lib_dec/FEC_HQ_core_fx.c b/lib_dec/FEC_HQ_core_fx.c index 9c9991330..3a5b71cff 100644 --- a/lib_dec/FEC_HQ_core_fx.c +++ b/lib_dec/FEC_HQ_core_fx.c @@ -2,8 +2,8 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/FEC_HQ_phase_ecu_fx.c b/lib_dec/FEC_HQ_phase_ecu_fx.c index 921f4e09f..972e7f4f8 100644 --- a/lib_dec/FEC_HQ_phase_ecu_fx.c +++ b/lib_dec/FEC_HQ_phase_ecu_fx.c @@ -609,9 +609,9 @@ static void trans_ana_fx( #endif att_val = 32767; move16(); - IF ( *pGrPowRight > 0 ) + IF( *pGrPowRight > 0 ) { - IF ( LT_32( *pGrPowRight, *pGrPowLeft ) ) /* i.e., (gr_pow_right/gr_pow_left) < 1.0 */ + IF( LT_32( *pGrPowRight, *pGrPowLeft ) ) /* i.e., (gr_pow_right/gr_pow_left) < 1.0 */ { /* Compute sqrt(grp_pow_chg), where grp_pow_chg = gr_pow_right/gr_pow_left. */ tmp16 = ratio( *pGrPowRight, *pGrPowLeft, &expo ); /* tmp16 in Q14 */ @@ -665,7 +665,7 @@ static void trans_ana_fx( mag_chg[k] = mult_r( mag_chg_1st[k], att_val ); /* Q15 */ move16(); - IF ( GT_16( burst_len, BETA_MUTE_THR ) ) + IF( GT_16( burst_len, BETA_MUTE_THR ) ) { *beta_mute = shr( *beta_mute, 1 ); move16(); @@ -752,7 +752,7 @@ static void ivas_peakfinder_fx( pDx0 = pDx01 + 1; len = 0; move16(); - IF ( endpoints ) + IF( endpoints ) { *pX++ = *pX0++; move16(); @@ -768,7 +768,7 @@ static void ivas_peakfinder_fx( FOR( i = 0; i < len0Minus2; i++ ) { - IF ( s_xor( *pDx01++, *pDx0++ ) < 0 ) /* Detect sign change. */ + IF( s_xor( *pDx01++, *pDx0++ ) < 0 ) /* Detect sign change. */ { *pInd++ = add( i, 1 ); move16(); @@ -778,7 +778,7 @@ static void ivas_peakfinder_fx( } pX0++; } - IF ( endpoints ) + IF( endpoints ) { *pInd = len0Minus1; move16(); @@ -802,7 +802,7 @@ static void ivas_peakfinder_fx( move16(); threshold = add( leftMin, sel ); - IF ( len > 0 ) + IF( len > 0 ) { /* Deal with first point a little differently since tacked it on Calculate the sign of the derivative since we took the first point @@ -820,7 +820,7 @@ static void ivas_peakfinder_fx( { ii = -1; move16(); - IF ( GE_16( xAt1, xAt2 ) ) /* x[1] is not extremum -> overwrite with x[0] */ + IF( GE_16( xAt1, xAt2 ) ) /* x[1] is not extremum -> overwrite with x[0] */ { *pX = xAt0; /* x[1] = x[0] */ move16(); @@ -854,7 +854,7 @@ static void ivas_peakfinder_fx( // PMTE () ii = -1; /* First point is a peak */ move16(); - IF ( GE_16( len, 2 ) ) + IF( GE_16( len, 2 ) ) { if ( GE_16( x[1], x[0] ) ) { @@ -872,14 +872,14 @@ static void ivas_peakfinder_fx( ii = add( ii, 1 ); /* This is a peak */ /* Make sure we don't iterate past the length of our vector */ - IF ( GE_16( ii, lenMinus1 ) ) + IF( GE_16( ii, lenMinus1 ) ) { BREAK; } /*Reset peak finding if we had a peak and the next peak is bigger than the last or the left min was small enough to reset.*/ - IF ( foundPeak > 0 ) + IF( foundPeak > 0 ) { tempMag = minMag; move16(); @@ -889,9 +889,9 @@ static void ivas_peakfinder_fx( /* Found new peak that was larger than temp mag and selectivity larger than the minimum to its left. */ - IF ( GT_16( *( ++pX ), tempMag ) ) + IF( GT_16( *( ++pX ), tempMag ) ) { - IF ( GT_16( *pX, threshold ) ) /* threshold = leftMin + sel */ + IF( GT_16( *pX, threshold ) ) /* threshold = leftMin + sel */ { tempLoc = ii; move16(); @@ -904,9 +904,9 @@ static void ivas_peakfinder_fx( pX++; /* Come down at least sel from peak */ - IF ( foundPeak == 0 ) + IF( foundPeak == 0 ) { - IF ( GT_16( tempMag, add( sel, *pX ) ) ) + IF( GT_16( tempMag, add( sel, *pX ) ) ) { foundPeak = 1; /* We have found a peak */ move16(); @@ -921,9 +921,9 @@ static void ivas_peakfinder_fx( move16(); } } - IF ( foundPeak == 0 ) /* The above IF-block has not found the peak yet. */ + IF( foundPeak == 0 ) /* The above IF-block has not found the peak yet. */ { - IF ( LT_16( *pX, leftMin ) ) /* New left minimum */ + IF( LT_16( *pX, leftMin ) ) /* New left minimum */ { leftMin = *pX; move16(); @@ -933,9 +933,9 @@ static void ivas_peakfinder_fx( } /* Check end point */ - IF ( GT_16( x[lenMinus1], tempMag ) ) + IF( GT_16( x[lenMinus1], tempMag ) ) { - IF ( GT_16( x[lenMinus1], threshold ) ) /* threshold = leftMin + sel */ + IF( GT_16( x[lenMinus1], threshold ) ) /* threshold = leftMin + sel */ { peakLoc[*cInd] = lenMinus1; move16(); @@ -947,9 +947,9 @@ static void ivas_peakfinder_fx( move16(); } } - IF ( foundPeak == 0 ) /* Check if we still need to add the last point */ + IF( foundPeak == 0 ) /* Check if we still need to add the last point */ { - IF ( GT_16( tempMag, minMag ) ) + IF( GT_16( tempMag, minMag ) ) { peakLoc[*cInd] = tempLoc; move16(); @@ -1068,7 +1068,7 @@ static void peakfinder_fx( FOR( i = 0; i < len0Minus2; i++ ) { - IF ( s_xor( *pDx01++, *pDx0++ ) < 0 ) /* Detect sign change. */ + IF( s_xor( *pDx01++, *pDx0++ ) < 0 ) /* Detect sign change. */ { *pInd++ = add( i, 1 ); move16(); @@ -1187,7 +1187,7 @@ static void peakfinder_fx( /*Reset peak finding if we had a peak and the next peak is bigger than the last or the left min was small enough to reset.*/ - IF ( foundPeak > 0 ) + IF( foundPeak > 0 ) { tempMag = minMag; move16(); @@ -1197,9 +1197,9 @@ static void peakfinder_fx( /* Found new peak that was larger than temp mag and selectivity larger than the minimum to its left. */ - IF ( GT_16( *( ++pX ), tempMag ) ) + IF( GT_16( *( ++pX ), tempMag ) ) { - IF ( GT_16( *pX, threshold ) ) /* threshold = leftMin + sel */ + IF( GT_16( *pX, threshold ) ) /* threshold = leftMin + sel */ { tempLoc = ii; move16(); @@ -1212,9 +1212,9 @@ static void peakfinder_fx( pX++; /* Come down at least sel from peak */ - IF ( foundPeak == 0 ) + IF( foundPeak == 0 ) { - IF ( GT_16( tempMag, add( sel, *pX ) ) ) + IF( GT_16( tempMag, add( sel, *pX ) ) ) { foundPeak = 1; /* We have found a peak */ move16(); @@ -1229,9 +1229,9 @@ static void peakfinder_fx( move16(); } } - IF ( foundPeak == 0 ) /* The above IF-block has not found the peak yet. */ + IF( foundPeak == 0 ) /* The above IF-block has not found the peak yet. */ { - IF ( LT_16( *pX, leftMin ) ) /* New left minimum */ + IF( LT_16( *pX, leftMin ) ) /* New left minimum */ { leftMin = *pX; move16(); @@ -1241,9 +1241,9 @@ static void peakfinder_fx( } /* Check end point */ - IF ( GT_16( x[lenMinus1], tempMag ) ) + IF( GT_16( x[lenMinus1], tempMag ) ) { - IF ( GT_16( x[lenMinus1], threshold ) ) /* threshold = leftMin + sel */ + IF( GT_16( x[lenMinus1], threshold ) ) /* threshold = leftMin + sel */ { peakLoc[*cInd] = lenMinus1; move16(); @@ -1254,9 +1254,9 @@ static void peakfinder_fx( move16(); } } - IF ( foundPeak == 0 ) /* Check if we still need to add the last point */ + IF( foundPeak == 0 ) /* Check if we still need to add the last point */ { - IF ( GT_16( tempMag, minMag ) ) + IF( GT_16( tempMag, minMag ) ) { peakLoc[*cInd] = tempLoc; move16(); @@ -1353,11 +1353,11 @@ static Word16 imax_fx( /* o: The location, relative to the sign = L_xor( y3_y1, denom ); /* Preserve the sign since div_s() only takes positive arguments. */ numer = L_abs( y3_y1 ); denom = L_abs( denom ); - IF ( numer == 0 ) + IF( numer == 0 ) { return 0; } - IF ( denom == 0 ) + IF( denom == 0 ) { return 0; } @@ -1376,7 +1376,7 @@ static Word16 imax_fx( /* o: The location, relative to the /* For both edges (left and right), the extremum found above may be minimum. * It needs to reject the minimum. */ - IF ( special != 0 ) /* Either edge specical case. */ + IF( special != 0 ) /* Either edge specical case. */ { edge = 0x7fff; /* 1 in Q15 for the right edge special case */ move16(); @@ -1520,7 +1520,7 @@ static void ivas_spec_ana_fx( // PMTE() window_corr = w_hamm[0]; move16(); - window_corr_step = idiv1616(w_hamm[0] , hamm_len2); + window_corr_step = idiv1616( w_hamm[0], hamm_len2 ); FOR( i = 0; i < hamm_len2; i++ ) { xfp[i] = mult_r( shl( prevsynth[i], *Q ), sub( w_hamm[i], window_corr ) ); @@ -1545,12 +1545,12 @@ static void ivas_spec_ana_fx( // PMTE() window_corr = w_hamm[0]; move16(); - window_corr_step = idiv1616(w_hamm[0] , hamm_len2); + window_corr_step = idiv1616( w_hamm[0], hamm_len2 ); FOR( i = 0; i < hamm_len2; i++ ) { xfp[i] = mult_r( shl( prevsynth[i], *Q ), sub( w_hamm[i], window_corr ) ); move16(); - xfp[sub(sub(Lprot , i) , 1)] = mult_r( shl( prevsynth[sub(sub(Lprot , i) , 1)], *Q ), sub( w_hamm[i], window_corr ) ); + xfp[sub( sub( Lprot, i ), 1 )] = mult_r( shl( prevsynth[sub( sub( Lprot, i ), 1 )], *Q ), sub( w_hamm[i], window_corr ) ); move16(); window_corr = sub( window_corr, window_corr_step ); } @@ -1595,8 +1595,8 @@ static void ivas_spec_ana_fx( expo = norm_l( *pMagSq ); /* exponent */ man = extract_h( L_shl( *pMagSq++, expo ) ); /* mantissa */ man = sqrt2ndOrder( man ); - expoBy2 = shr( expo, 1 ); /* Divided by 2-- square root operation. */ - IF ( s_and( expo, 1 ) == 0 ) /* Check even or odd. */ + expoBy2 = shr( expo, 1 ); /* Divided by 2-- square root operation. */ + IF( s_and( expo, 1 ) == 0 ) /* Check even or odd. */ { man = mult_r( man, FEC_HQ_ECU_ROOT2 ); /* FEC_HQ_ECU_ROOT2 is sqrt(2) in Q14 */ expoBy2 = sub( expoBy2, 1 ); @@ -1635,7 +1635,7 @@ static void ivas_spec_ana_fx( pPlocs = plocs; n = sub( *num_plocs, 1 ); /* -1 so as to exclude the very last peak. */ /* Special case-- The very 1st peak if it is at 0 index position */ - IF ( *pPlocs == 0 ) /* Only the very 1st peak is possible the peak at 0 index position. */ + IF( *pPlocs == 0 ) /* Only the very 1st peak is possible the peak at 0 index position. */ { fraction = imax_fx( xfp, -1 ); /* -1 signifies special left edge case. */ acc = L_deposit_h( *pPlocs++ ); /* N.B., (*pPlocs) must be zero here. */ @@ -1653,7 +1653,7 @@ static void ivas_spec_ana_fx( *pPlocsi++ = L_mac( acc, fraction, 1 ); move32(); /* in Q16. Append the fractional part to the integral part. */ } - IF ( n >= 0 ) + IF( n >= 0 ) { /* Special case-- The very last peak */ pXfp = pXfp1 + *pPlocs; @@ -1717,7 +1717,7 @@ static void ivas_spec_ana_fx( endPlocs = sub( Lprot2_1, DELTA_CORR_F0_INT ); /* last *pPlocs position for Jacobsen */ /* precompute number of turns based on endpoint integer location and make into a proper for loop */ - IF ( n > 0 ) + IF( n > 0 ) { nJacob = n; move16(); @@ -1740,13 +1740,13 @@ static void ivas_spec_ana_fx( /* At this point there should at most two plocs left to process */ /* the position before fs/2 and fs/2 both use the same magnitude points */ - IF ( n > 0 ) + IF( n > 0 ) { /* [ . . . . . . . ] Lprot/2+1 positions */ /* | | | */ /* 0 (Lprot/2-2) (Lprot/2) */ - IF ( EQ_16( currPlocs, ( sub( Lprot2_1, DELTA_CORR_F0_INT ) ) ) ) /* Also 2nd last peak position uses fs/2 which makes jacobsen less suitable. */ + IF( EQ_16( currPlocs, ( sub( Lprot2_1, DELTA_CORR_F0_INT ) ) ) ) /* Also 2nd last peak position uses fs/2 which makes jacobsen less suitable. */ { fraction = imax_fx( &xfp[currPlocs - 1], 0 ); /* in Q15 */ acc = L_deposit_h( sub( currPlocs, 1 ) ); @@ -1760,7 +1760,7 @@ static void ivas_spec_ana_fx( /* Here the only remaining point would be a fs/2 plocs */ /* pXfp = xfp + sub(Lprot2,1); already set just a reminder where it * whould point */ - IF ( n > 0 ) /* fs/2 which makes special case . */ + IF( n > 0 ) /* fs/2 which makes special case . */ { fraction = imax_fx( &xfp[currPlocs - 2], 0 ); /* in Q15 */ acc = L_deposit_h( sub( currPlocs, 2 ) ); @@ -1783,7 +1783,7 @@ static void ivas_spec_ana_fx( { st_point = s_max( 0, sub( plocs[i], DELTA_CORR ) ); end_point = s_min( sub( Lprot2_1, 1 ), add( plocs[i], DELTA_CORR ) ); - set16_fx( &xfp[st_point], 0, extract_l(L_add( L_sub( end_point, st_point ), 1 )) ); + set16_fx( &xfp[st_point], 0, extract_l( L_add( L_sub( end_point, st_point ), 1 ) ) ); } noise = L_add( sum16_32_fx( xfp, Lprot2_1 ), 1 ); @@ -1933,7 +1933,7 @@ static void spec_ana_fx( } /* Apply zeroing of non-coded FFT spectrum */ - IF ( GT_16( output_frame, inner_frame_tbl[bwidth_fx] ) ) + IF( GT_16( output_frame, inner_frame_tbl[bwidth_fx] ) ) { stop_band_start = shl( 128, bwidth_fx ); stop_band_length = sub( Lprot, shl( stop_band_start, 1 ) ); @@ -1966,8 +1966,8 @@ static void spec_ana_fx( expo = norm_l( *pMagSq ); /* exponent */ man = extract_h( L_shl( *pMagSq++, expo ) ); /* mantissa */ man = sqrt2ndOrder( man ); - expoBy2 = shr( expo, 1 ); /* Divided by 2-- square root operation. */ - IF ( s_and( expo, 1 ) == 0 ) /* Check even or odd. */ + expoBy2 = shr( expo, 1 ); /* Divided by 2-- square root operation. */ + IF( s_and( expo, 1 ) == 0 ) /* Check even or odd. */ { man = mult_r( man, FEC_HQ_ECU_ROOT2 ); /* FEC_HQ_ECU_ROOT2 is sqrt(2) in Q14 */ expoBy2 = sub( expoBy2, 1 ); @@ -2020,7 +2020,7 @@ static void spec_ana_fx( pPlocs = plocs; n = sub( *num_plocs, 1 ); /* -1 so as to exclude the very last peak. */ /* Special case-- The very 1st peak if it is at 0 index position */ - IF ( *pPlocs == 0 ) /* Only the very 1st peak is possible the peak at 0 index position. */ + IF( *pPlocs == 0 ) /* Only the very 1st peak is possible the peak at 0 index position. */ { fraction = imax_fx( xfp, -1 ); /* -1 signifies special left edge case. */ acc = L_deposit_h( *pPlocs++ ); /* N.B., (*pPlocs) must be zero here. */ @@ -2038,7 +2038,7 @@ static void spec_ana_fx( *pPlocsi++ = L_mac( acc, fraction, 1 ); move32(); /* in Q16. Append the fractional part to the integral part. */ } - IF ( n >= 0 ) + IF( n >= 0 ) { /* Special case-- The very last peak */ pXfp = pXfp1 + *pPlocs; @@ -2265,7 +2265,7 @@ static void ivas_subst_spec_fx( } one_peak_flag_mask = 32767 /* 1.0f in Q15 */; /* all ones mask -> keep */ move16(); - IF ( element_mode != EVS_MONO ) + IF( element_mode != EVS_MONO ) { test(); if ( ( *num_plocs > 0 ) && ( sub( *num_plocs, 3 ) < 0 ) ) @@ -2273,7 +2273,7 @@ static void ivas_subst_spec_fx( one_peak_flag_mask = noise_fac; /* all zeroes mask -> zero */ move16(); } - IF ( *num_plocs == 0 ) + IF( *num_plocs == 0 ) { X[0] = 0; /* reset DC if there are no peaks */ move16(); @@ -2310,7 +2310,7 @@ static void ivas_subst_spec_fx( move16(); pkLocation1 = *pPlocs++; /* plocs[m + 1] */ move16(); - IF ( m > 0 ) + IF( m > 0 ) { delta_tmp = shr( sub( sub( pkLocation, pkLocation_1 ), 1 ), 1 ); if ( LT_16( delta_tmp, DELTA_CORR ) ) @@ -2320,7 +2320,7 @@ static void ivas_subst_spec_fx( } } - IF ( LT_16( m, lastPeak ) ) + IF( LT_16( m, lastPeak ) ) { delta_tmp = shr( sub( sub( pkLocation1, pkLocation ), 1 ), 1 ); if ( LT_16( delta_tmp, DELTA_CORR ) ) @@ -2419,7 +2419,7 @@ static void ivas_subst_spec_fx( { mag_chg_local = mag_chg[k]; move16(); - IF ( ph_dith != 0 ) + IF( ph_dith != 0 ) { Xph = *pCorrPhase; /* in Q16. 2*PI is not included. */ move32(); @@ -2428,7 +2428,7 @@ static void ivas_subst_spec_fx( acc = L_shr( acc, PHASE_DITH_SCALE_SHIFT ); Xph = L_add( Xph, acc ); /* in Q16. */ - IF ( ph_dith > 0 ) /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized ) */ + IF( ph_dith > 0 ) /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized ) */ { /* mag_chg_local *= 0.5 + (1.0 - ph_dith[i])/2 where 0.5~= sqrt((float)pow(10.0,-6/10.0)) and ph_dith=0..1.0--> scale=1.0 ...5 */ mag_chg_local = mult_r( mag_chg_local, sub( 32767, shr( ph_dith, 1 ) ) ); @@ -2484,7 +2484,7 @@ static void ivas_subst_spec_fx( expo = shr( expo, 1 ); beta_local = mult_r( beta_mute, round_fx( L_shl( acc, sub( 31, expo ) ) ) ); - IF ( GE_16( k, LGW32K - 1 ) ) + IF( GE_16( k, LGW32K - 1 ) ) { beta_local = mult_r( beta_local, 3277 ); /* 0.1 in Q15 */ } @@ -2712,7 +2712,7 @@ static void subst_spec_fx( move16(); pkLocation1 = *pPlocs++; /* plocs[m + 1] */ move16(); - IF ( m > 0 ) + IF( m > 0 ) { delta_tmp = shr( sub( sub( pkLocation, pkLocation_1 ), 1 ), 1 ); if ( LT_16( delta_tmp, DELTA_CORR ) ) @@ -2722,7 +2722,7 @@ static void subst_spec_fx( } } - IF ( LT_16( m, lastPeak ) ) + IF( LT_16( m, lastPeak ) ) { delta_tmp = shr( sub( sub( pkLocation1, pkLocation ), 1 ), 1 ); if ( LT_16( delta_tmp, DELTA_CORR ) ) @@ -2826,7 +2826,7 @@ static void subst_spec_fx( { mag_chg_local = mag_chg[k]; move16(); - IF ( ph_dith != 0 ) + IF( ph_dith != 0 ) { Xph = *pCorrPhase; /* in Q16. 2*PI is not included. */ move32(); @@ -2835,7 +2835,7 @@ static void subst_spec_fx( acc = L_shr( acc, PHASE_DITH_SCALE_SHIFT ); Xph = L_add( Xph, acc ); /* in Q16. */ - IF ( ph_dith > 0 ) /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized ) */ + IF( ph_dith > 0 ) /* up to 6 dB additional att of peaks in non_transient longer bursts, (when peak phase is randomized ) */ { /* mag_chg_local *= 0.5 + (1.0 - ph_dith[i])/2 where 0.5~= sqrt((float)pow(10.0,-6/10.0)) and ph_dith=0..1.0--> scale=1.0 ...5 */ mag_chg_local = mult_r( mag_chg_local, sub( 32767, shr( ph_dith, 1 ) ) ); @@ -3018,7 +3018,7 @@ static void ivas_rec_wtda_fx( Word16 copy_len; Word16 ola_len; - copy_len = NS2SA( output_frame * FRAMES_PER_SEC, ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* prototype fill on each side of xsubst to fill MDCT Frame */ + copy_len = NS2SA( output_frame * FRAMES_PER_SEC, ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* prototype fill on each side of xsubst to fill MDCT Frame */ move16(); ola_len = NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS - ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* remaining lengt of LA_ZEROS to overlap add decoded with xsubst */ move16(); @@ -3076,22 +3076,22 @@ static void ivas_rec_wtda_fx( } /* extract reconstructed frame with aldo window */ - timesh = sub(NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) , shr(sub( shl(output_frame, 1) , Lprot ) , 1)); + timesh = sub( NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ), shr( sub( shl( output_frame, 1 ), Lprot ), 1 ) ); - set16_fx( xsubst_, 0, add(sub(shl(output_frame, 1) , Lprot) , timesh) ); - Copy( X, xsubst_ + add(sub(shl(output_frame, 1) , Lprot) , timesh), sub(Lprot , timesh) ); + set16_fx( xsubst_, 0, add( sub( shl( output_frame, 1 ), Lprot ), timesh ) ); + Copy( X, xsubst_ + add( sub( shl( output_frame, 1 ), Lprot ), timesh ), sub( Lprot, timesh ) ); /* Copy and OLA look ahead zero part of MDCT window from decoded signal */ IF( element_mode != EVS_MONO ) { Copy( old_dec, xsubst_ + NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ), copy_len ); /* also need to scale to Q0 ?? */ pOld = old_dec + copy_len; - pNew = xsubst_ + add(copy_len , NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS )); + pNew = xsubst_ + add( copy_len, NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) ); tmp = div_s( 1, shl( ola_len, 1 ) ); // Q15 tmp = round_fx( L_shl( L_mult( tmp, EVS_PI_FX ), 2 ) ); // Q15 sinq_fx( tmp, 0, ola_len, xfwin ); v_mult16_fixed( xfwin, xfwin, xfwin, ola_len ); /* xfwin = sin^2 of 0..pi/4 */ - pOldW = xfwin + sub(ola_len , 1); + pOldW = xfwin + sub( ola_len, 1 ); pNewW = xfwin; FOR( i = 0; i < ola_len; i++ ) { @@ -3106,7 +3106,7 @@ static void ivas_rec_wtda_fx( ELSE { /* Smoothen onset of ECU frame */ - p_ecu = xsubst_ + add( sub( shl(output_frame, 1), Lprot ), timesh ); + p_ecu = xsubst_ + add( sub( shl( output_frame, 1 ), Lprot ), timesh ); FOR( i = 0; i < xf_len; ( i++, p_ecu++ ) ) { idx = extract_l( L_shr( L_mult0( i, tbl_delta ), 12 ) ); @@ -3267,7 +3267,7 @@ static void rec_wtda_fx( set16_fx( xsubst_ + add( output_frame, Lprot2 ), 0, l ); /* Smoothen onset of ECU frame */ - p_ecu = xsubst_ + sub( output_frame , Lprot2 ); + p_ecu = xsubst_ + sub( output_frame, Lprot2 ); FOR( i = 0; i < xf_len; i++ ) { idx = extract_l( L_shr( L_mult0( i, tbl_delta ), 12 ) ); @@ -3417,7 +3417,7 @@ static Word32 mult_32_32_q( const Word32 a, const Word32 b, const Word16 q ) Mpy_32_32_ss( a, b, &hi, &lo ); #ifdef BASOP_NOGLOB - return L_or( L_shl_o( hi, sub(32 - 1 , q ), &Overflow ), L_lshr( lo, add(q , 1) ) ); + return L_or( L_shl_o( hi, sub( 32 - 1, q ), &Overflow ), L_lshr( lo, add( q, 1 ) ) ); #else return L_or( L_shl( hi, 32 - q - 1 ), L_lshr( lo, q + 1 ) ); #endif @@ -3450,7 +3450,7 @@ static void fir_dwn_fx( { s = L_deposit_l( 0 ); ptr_h = h + 1; - ptr_x = x + sub(i , 1); + ptr_x = x + sub( i, 1 ); FOR( j = 1; j <= i; j++ ) { @@ -3472,7 +3472,7 @@ static void fir_dwn_fx( { s = L_deposit_l( 0 ); ptr_h = h + 1; - ptr_x = x + sub(i , 1); + ptr_x = x + sub( i, 1 ); move16(); FOR( j = 1; j <= K; j++ ) @@ -3652,7 +3652,7 @@ static void fec_ecu_pitch_fx( } - IF( EQ_16(HqVoicing , 1) ) + IF( EQ_16( HqVoicing, 1 ) ) { cb_start = 0; move16(); @@ -3676,7 +3676,7 @@ static void fec_ecu_pitch_fx( { accA = 0; move16(); - IF( EQ_16(i , cb_start) ) + IF( EQ_16( i, cb_start ) ) { accB = 0; move16(); @@ -3716,9 +3716,9 @@ static void fec_ecu_pitch_fx( accCisqrt = Isqrt( accC ); /* Q31 - 3 + tmpQLP*/ - Ryytmp = mult_32_32_q( accA, accCisqrt, sub(16 + 3 , tmpQLP) ); /*Q 6 -2*tmpQLP + Q31 - 3 + tmpQLP -16 -3 +tmpQLP = Q15*/ - Ryytmp = mult_32_32_q( Ryytmp, accBisqrt, add(15 - 3 , tmpQLP) ); /*Q15 + Q31 - 3 + tmpQLP -15 + 3- tmpQLP = Q31*/ - Ryy = extract_h( Ryytmp ); /* Q15 */ + Ryytmp = mult_32_32_q( accA, accCisqrt, sub( 16 + 3, tmpQLP ) ); /*Q 6 -2*tmpQLP + Q31 - 3 + tmpQLP -16 -3 +tmpQLP = Q15*/ + Ryytmp = mult_32_32_q( Ryytmp, accBisqrt, add( 15 - 3, tmpQLP ) ); /*Q15 + Q31 - 3 + tmpQLP -15 + 3- tmpQLP = Q31*/ + Ryy = extract_h( Ryytmp ); /* Q15 */ IF( GT_16( Ryy, *min_corr_fx ) ) @@ -4027,7 +4027,7 @@ static void fec_ecu_dft_fx( IF( EQ_16( *Nfft, N ) ) { - Copy( &target[1], &Tfr16[1], sub(*Nfft , 2) ); + Copy( &target[1], &Tfr16[1], sub( *Nfft, 2 ) ); } ELSE { @@ -4549,7 +4549,7 @@ static void ivas_fec_noise_filling_fx( Copy( synthesis_fx, synthesis_fx + kk, sub( 2 * L, kk ) ); Copy( synthesis_fx + L, gapsynth_fx, L ); - Copy( prevsynth_fx + sub(alignment_point , kk), synthesis_fx, kk ); + Copy( prevsynth_fx + sub( alignment_point, kk ), synthesis_fx, kk ); } #endif @@ -4917,7 +4917,7 @@ static void ivas_hq_phase_ecu_fx( lprot = L_PROT32k; /* 1024 */ move16(); } - ELSE IF( EQ_16(output_frame , L_FRAME16k) ) + ELSE IF( EQ_16( output_frame, L_FRAME16k ) ) { lprot = 512; move16(); @@ -4969,16 +4969,16 @@ static void ivas_hq_phase_ecu_fx( /* seed for own_rand2 */ seed = *time_offs; move16(); - IF ( *num_p > 0 ) + IF( *num_p > 0 ) { - seed = add( seed, plocs[sub(*num_p , 1)] ); + seed = add( seed, plocs[sub( *num_p, 1 )] ); } ivas_subst_spec_fx( plocs, plocsi, num_p, *time_offs, X, mag_chg, ph_dith, old_is_transient, output_frame, &seed, alpha, beta, *beta_mute, Xavg, element_mode, ph_ecu_lookahead, noise_fac ); /* reconstructed frame in tda domain */ - old_dec = prevsynth + sub( shl(output_frame, 1), NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) ); + old_dec = prevsynth + sub( shl( output_frame, 1 ), NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) ); ivas_rec_frame_fx( X, ecu_rec, output_frame, *Q_spec, old_dec, element_mode, num_p, plocs ); *last_fec = 0; @@ -5110,9 +5110,9 @@ static void hq_phase_ecu_fx( /* seed for own_rand2 */ seed = *time_offs; move16(); - IF ( *num_p > 0 ) + IF( *num_p > 0 ) { - seed = add( seed, plocs[sub(*num_p , 1)] ); + seed = add( seed, plocs[sub( *num_p, 1 )] ); } subst_spec_fx( plocs, plocsi, num_p, *time_offs, X, mag_chg, ph_dith, old_is_transient, output_frame, &seed, diff --git a/lib_dec/FEC_adapt_codebook_fx.c b/lib_dec/FEC_adapt_codebook_fx.c index cf159210b..71717bd41 100644 --- a/lib_dec/FEC_adapt_codebook_fx.c +++ b/lib_dec/FEC_adapt_codebook_fx.c @@ -3,9 +3,9 @@ ====================================================================================*/ #include #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_dec.h" /* Decoder static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_dec.h" /* Decoder static table prototypes */ #include "prot_fx.h" /* Function prototypes */ diff --git a/lib_dec/FEC_clas_estim_fx.c b/lib_dec/FEC_clas_estim_fx.c index 18cf6b5a8..0c668df55 100644 --- a/lib_dec/FEC_clas_estim_fx.c +++ b/lib_dec/FEC_clas_estim_fx.c @@ -3,9 +3,9 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_dec/FEC_fx.c b/lib_dec/FEC_fx.c index 09efc3b5a..7353f8f83 100644 --- a/lib_dec/FEC_fx.c +++ b/lib_dec/FEC_fx.c @@ -3,10 +3,10 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Common static table prototypes */ -#include "rom_dec.h" /* Decoder static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Common static table prototypes */ +#include "rom_dec.h" /* Decoder static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/FEC_lsf_estim_fx.c b/lib_dec/FEC_lsf_estim_fx.c index 36c0f0535..d79d90c85 100644 --- a/lib_dec/FEC_lsf_estim_fx.c +++ b/lib_dec/FEC_lsf_estim_fx.c @@ -3,9 +3,9 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ diff --git a/lib_dec/FEC_pitch_estim_fx.c b/lib_dec/FEC_pitch_estim_fx.c index ff0732f03..d12c4b30a 100644 --- a/lib_dec/FEC_pitch_estim_fx.c +++ b/lib_dec/FEC_pitch_estim_fx.c @@ -2,8 +2,8 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "stl.h" @@ -73,7 +73,7 @@ void FEC_pitch_estim_fx( test(); IF( ( ( element_mode == EVS_MONO ) && EQ_16( last_core, HQ_CORE ) ) || ( element_mode != EVS_MONO && ( EQ_16( last_core, HQ_CORE ) || EQ_16( last_core, TCX_20_CORE ) || EQ_16( last_core, TCX_10_CORE ) ) ) ) { - *bfi_pitch = pitch_buf[sub(shr( L_frame, 6 ) , 1)]; + *bfi_pitch = pitch_buf[sub( shr( L_frame, 6 ), 1 )]; move16(); *bfi_pitch_frame = L_frame; move16(); @@ -104,7 +104,7 @@ void FEC_pitch_estim_fx( ( EQ_16( L_frame, L_FRAME16k ) ) ) || ( EQ_16( coder_type, TRANSITION ) ) ) { - *bfi_pitch = pitch_buf[sub(shr( L_frame, 6 ) , 1)]; + *bfi_pitch = pitch_buf[sub( shr( L_frame, 6 ), 1 )]; move16(); *bfi_pitch_frame = L_frame; move16(); diff --git a/lib_dec/FEC_scale_syn_fx.c b/lib_dec/FEC_scale_syn_fx.c index c4fe1bfd7..8448695c1 100644 --- a/lib_dec/FEC_scale_syn_fx.c +++ b/lib_dec/FEC_scale_syn_fx.c @@ -2,8 +2,8 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------* @@ -224,7 +224,7 @@ void FEC_scale_syn_fx( h1[0] = 1024; move16(); /*syn_filt( Aq+(3*(M+1)), M, h1, h1, L_FRAME/2, h1+(M+1), 0 );*/ - E_UTIL_synthesis( 1, Aq + (3 * ( M + 1 ) ), h1, h1, L_FRAME / 2, h1 + ( M + 1 ), 0, M ); + E_UTIL_synthesis( 1, Aq + ( 3 * ( M + 1 ) ), h1, h1, L_FRAME / 2, h1 + ( M + 1 ), 0, M ); /*Compute tilt */ /*rr0 = dotp( h1, h1, L_FRAME/2-1 ) + 0.1f;*/ @@ -271,7 +271,7 @@ void FEC_scale_syn_fx( ener_max = *lp_ener_FEC_max; move32(); test(); - if( EQ_16( clas, VOICED_TRANSITION ) || ( GE_16( clas, INACTIVE_CLAS ) ) ) + if ( EQ_16( clas, VOICED_TRANSITION ) || ( GE_16( clas, INACTIVE_CLAS ) ) ) { ener_max = *lp_ener_FEC_av; move32(); diff --git a/lib_dec/LD_music_post_filter_fx.c b/lib_dec/LD_music_post_filter_fx.c index d1d4d1807..02f629317 100644 --- a/lib_dec/LD_music_post_filter_fx.c +++ b/lib_dec/LD_music_post_filter_fx.c @@ -3,9 +3,9 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index 0b1bd4142..4f21a81a8 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -4,8 +4,8 @@ #include #include -#include "options.h" /* Compilation switches */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "ivas_prot_fx.h" #include "ivas_cnst.h" /* Common constants */ diff --git a/lib_dec/acelp_core_switch_dec_fx.c b/lib_dec/acelp_core_switch_dec_fx.c index 8252de5a1..d2a81d11b 100644 --- a/lib_dec/acelp_core_switch_dec_fx.c +++ b/lib_dec/acelp_core_switch_dec_fx.c @@ -3,11 +3,11 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ -#include "prot.h" /* Function prototypes */ +#include "prot.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * Local function prototypes diff --git a/lib_dec/avq_dec_fx.c b/lib_dec/avq_dec_fx.c index 594030258..e739484b6 100644 --- a/lib_dec/avq_dec_fx.c +++ b/lib_dec/avq_dec_fx.c @@ -4,10 +4,10 @@ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ -#include "prot.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ +#include "prot.h" /* Function prototypes */ #include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_dec/bass_psfilter_fx.c b/lib_dec/bass_psfilter_fx.c index 0e46a6aed..3620495a8 100644 --- a/lib_dec/bass_psfilter_fx.c +++ b/lib_dec/bass_psfilter_fx.c @@ -4,11 +4,11 @@ #include #include -#include "options.h" /* Compilation switches */ +#include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ -#include "rom_dec.h" /* Static table prototypes */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ +#include "rom_dec.h" /* Static table prototypes */ #include "basop_util.h" /*---------------------------------------------------------------------* diff --git a/lib_dec/core_switching_dec_fx.c b/lib_dec/core_switching_dec_fx.c index 8fec002bb..b6f6f7276 100644 --- a/lib_dec/core_switching_dec_fx.c +++ b/lib_dec/core_switching_dec_fx.c @@ -6,7 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" diff --git a/lib_dec/dec2t32_fx.c b/lib_dec/dec2t32_fx.c index c285cf331..b6e1c2053 100644 --- a/lib_dec/dec2t32_fx.c +++ b/lib_dec/dec2t32_fx.c @@ -2,8 +2,8 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ diff --git a/lib_dec/dec4t64_fx.c b/lib_dec/dec4t64_fx.c index 452775200..47c481dc4 100644 --- a/lib_dec/dec4t64_fx.c +++ b/lib_dec/dec4t64_fx.c @@ -2,11 +2,11 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* Static table prototypes */ -#include "assert.h" /* Static table prototypes */ +#include "rom_com.h" /* Static table prototypes */ +#include "assert.h" /* Static table prototypes */ #ifdef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * Local functions @@ -298,7 +298,7 @@ void dec_1p_N1_fx( /* i = ((index >> N) & 1); */ i = L_shr( index, N ) & 1L; - IF ( i != 0 ) + IF( i != 0 ) { pos1 = add( pos1, NB_POS_FCB_4T ); } @@ -696,7 +696,7 @@ static void fcb_decode_position_fx( FOR( ; PI_select_table[L_sub( 16, l )][temp] >= k; l += 2 ); - IF ( GT_32( k, PI_select_table[L_sub( 17, l )][temp] ) ) + IF( GT_32( k, PI_select_table[L_sub( 17, l )][temp] ) ) { l = L_sub( l, 1 ); } @@ -778,7 +778,7 @@ void D_ACELP_decode_43bit_fx( UWord16 idxs[], Word16 code[], Word16 *pulsestrack move32(); joint_index = L_shr( L_add( L_shl( (Word32) idxs[2], 16 ), (Word32) idxs[1] ), 2 ); - IF ( GE_32( joint_index, joint_offset ) ) + IF( GE_32( joint_index, joint_offset ) ) { joint_index = L_sub( joint_index, joint_offset ); } diff --git a/lib_dec/dec_amr_wb_fx.c b/lib_dec/dec_amr_wb_fx.c index c9c180aad..03ae965aa 100644 --- a/lib_dec/dec_amr_wb_fx.c +++ b/lib_dec/dec_amr_wb_fx.c @@ -3,9 +3,9 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 623b7a823..597cfea19 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -3,9 +3,9 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "stl.h" #include "basop_util.h" diff --git a/lib_dec/dec_higher_acelp_fx.c b/lib_dec/dec_higher_acelp_fx.c index a01d8287c..eea2c8a62 100644 --- a/lib_dec/dec_higher_acelp_fx.c +++ b/lib_dec/dec_higher_acelp_fx.c @@ -4,9 +4,9 @@ #include #include "options.h" /* Compilation switches */ #include -#include "cnst.h" /* Common constants */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* Static table prototypes */ +#include "rom_com.h" /* Static table prototypes */ #define IVAS_CODE #define IVAS_CODE_AVQ diff --git a/lib_dec/dec_nelp_fx.c b/lib_dec/dec_nelp_fx.c index 4ea42d182..7083919c4 100644 --- a/lib_dec/dec_nelp_fx.c +++ b/lib_dec/dec_nelp_fx.c @@ -2,8 +2,8 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED /*======================================================================*/ diff --git a/lib_dec/dec_pit_exc_fx.c b/lib_dec/dec_pit_exc_fx.c index 7ecdb9cdb..27abc3ddf 100644 --- a/lib_dec/dec_pit_exc_fx.c +++ b/lib_dec/dec_pit_exc_fx.c @@ -2,9 +2,9 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED @@ -149,7 +149,7 @@ void dec_pit_exc_fx( test(); test(); test(); - IF ( ( ( GE_32( st_fx->core_brate, MIN_RATE_FCB ) || ( EQ_16( st_fx->GSC_noisy_speech, 1 ) && ( ( EQ_16( st_fx->L_frame, L_FRAME ) && GE_32( st_fx->core_brate, ACELP_13k20 ) ) || ( EQ_16( st_fx->L_frame, L_FRAME16k ) && GE_32( st_fx->core_brate, GSC_H_RATE_STG ) ) || st_fx->GSC_IVAS_mode == 0 ) ) ) && EQ_16( L_subfr_fx, L_SUBFR ) ) ) + IF( ( ( GE_32( st_fx->core_brate, MIN_RATE_FCB ) || ( EQ_16( st_fx->GSC_noisy_speech, 1 ) && ( ( EQ_16( st_fx->L_frame, L_FRAME ) && GE_32( st_fx->core_brate, ACELP_13k20 ) ) || ( EQ_16( st_fx->L_frame, L_FRAME16k ) && GE_32( st_fx->core_brate, GSC_H_RATE_STG ) ) || st_fx->GSC_IVAS_mode == 0 ) ) ) && EQ_16( L_subfr_fx, L_SUBFR ) ) ) { use_fcb = 1; move16(); diff --git a/lib_dec/dec_ppp_fx.c b/lib_dec/dec_ppp_fx.c index 19642686d..d37efa4c7 100644 --- a/lib_dec/dec_ppp_fx.c +++ b/lib_dec/dec_ppp_fx.c @@ -4,7 +4,7 @@ #include #include -#include "options.h" /* Compilation switches */ +#include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED /*===================================================================*/ @@ -77,7 +77,7 @@ ivas_error decod_ppp_fx( deemph_lpc_fx( p_Aq_curr_fx, p_Aq_old_fx, LPC_de_curr_fx, LPC_de_old_fx, 0 ); /*LPC in Q12 */ - IF ( ( error = ppp_voiced_decoder_fx( st_fx, excQ_ppp_fx, LPC_de_curr_fx, exc_fx, pitch_fx, bfi ) ) != IVAS_ERR_OK ) + IF( ( error = ppp_voiced_decoder_fx( st_fx, excQ_ppp_fx, LPC_de_curr_fx, exc_fx, pitch_fx, bfi ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/dec_prm.c b/lib_dec/dec_prm.c index fc3f4c511..b6a2b7d82 100644 --- a/lib_dec/dec_prm.c +++ b/lib_dec/dec_prm.c @@ -217,7 +217,7 @@ void getTCXMode_ivas_fx( /*Core extended mode mapping for correct PLC classification*/ st->core_ext_mode = st->coder_type; move16(); - if( EQ_16( st->coder_type, INACTIVE ) ) + if ( EQ_16( st->coder_type, INACTIVE ) ) { st->core_ext_mode = UNVOICED; move16(); diff --git a/lib_dec/dec_prm_fx.c b/lib_dec/dec_prm_fx.c index 795cb07cb..22b0c7047 100644 --- a/lib_dec/dec_prm_fx.c +++ b/lib_dec/dec_prm_fx.c @@ -134,7 +134,7 @@ void dec_prm_hm_fx( { tmp = 0; move16(); - if( GE_16( L_frame, 256 ) ) + if ( GE_16( L_frame, 256 ) ) { tmp = 1; move16(); @@ -224,7 +224,7 @@ void getTCXparam_fx( nSubframes = 1; move16(); - if( EQ_16( core, TCX_10_CORE ) ) + if ( EQ_16( core, TCX_10_CORE ) ) { nSubframes = 2; move16(); @@ -352,7 +352,7 @@ void getTCXparam_fx( lg = add( lg, st->hTcxCfg->tcx_offset ); lgFB = add( lgFB, shr( lgFB, sub( 3, nSubframes ) ) ); - if( st->hTcxCfg->lfacNext < 0 ) + if ( st->hTcxCfg->lfacNext < 0 ) { lg = sub( lg, st->hTcxCfg->lfacNext ); } @@ -599,7 +599,7 @@ void dec_prm_fx( Mpy_32_16_ss( st->total_brate, 5243, &L_tmp, &lsb ); /* 5243 is 1/50 in Q18. (0+18-15=3) */ num_bits = extract_l( L_shr( L_tmp, 3 ) ); /* Q0 */ assert( num_bits == st->total_brate / 50 ); - if( EQ_16( FrameSizeConfig[n].frame_bits, num_bits ) ) + if ( EQ_16( FrameSizeConfig[n].frame_bits, num_bits ) ) { st->bits_frame_core = add( st->bits_frame_core, FrameSizeConfig[n].bandwidth_bits ); BREAK; @@ -649,7 +649,7 @@ void dec_prm_fx( ind = get_next_indice( st, 2 ); st->clas_dec = ONSET; move16(); - if( ind == 0 ) + if ( ind == 0 ) { st->clas_dec = UNVOICED_CLAS; move16(); @@ -658,7 +658,7 @@ void dec_prm_fx( { st->clas_dec = UNVOICED_TRANSITION; move16(); - if( GE_16( st->last_good, VOICED_TRANSITION ) ) + if ( GE_16( st->last_good, VOICED_TRANSITION ) ) { st->clas_dec = VOICED_TRANSITION; move16(); @@ -850,7 +850,7 @@ void dec_prm_fx( st->hTcxCfg->tcx_last_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode; move16(); test(); - if( ( NE_16( st->core, TCX_10_CORE ) ) && ( EQ_16( st->hTcxCfg->tcx_curr_overlap_mode, FULL_OVERLAP ) ) ) + if ( ( NE_16( st->core, TCX_10_CORE ) ) && ( EQ_16( st->hTcxCfg->tcx_curr_overlap_mode, FULL_OVERLAP ) ) ) { st->hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW; move16(); @@ -1077,7 +1077,7 @@ void dec_prm_fx( n = ACELP_LTP_BITS_SFR[st->acelp_cfg.ltp_mode][sfr]; move16(); - IF ( n != 0 ) + IF( n != 0 ) { prm[j] = get_next_indice( st, n ); j = add( j, 1 ); @@ -1085,7 +1085,7 @@ void dec_prm_fx( } /* Adaptive codebook filtering (1 bit) */ - IF ( EQ_16( st->acelp_cfg.ltf_mode, 2 ) ) + IF( EQ_16( st->acelp_cfg.ltf_mode, 2 ) ) { prm[j] = get_next_indice( st, 1 ); j = add( j, 1 ); @@ -1187,7 +1187,7 @@ void dec_prm_fx( /* Pitch lag (5, or 8 bits) */ n = ACELP_LTP_BITS_SFR[ltp_mode][sfr]; move16(); - IF ( n != 0 ) + IF( n != 0 ) { prm[j] = get_next_indice( st, n ); j = add( j, 1 ); @@ -1319,7 +1319,7 @@ void dec_prm_fx( IF( st->hTcxCfg->fIsTNSAllowed ) { - SetTnsConfig( st->hTcxCfg, 1, (Word16)EQ_16(st->last_core_from_bs , ACELP_CORE) ); + SetTnsConfig( st->hTcxCfg, 1, (Word16) EQ_16( st->last_core_from_bs, ACELP_CORE ) ); ReadTnsData( st->hTcxCfg->pCurrentTnsConfig, st, &nTnsBits, prm + j, &nTnsParams ); j = add( j, nTnsParams ); diff --git a/lib_dec/dec_tran_fx.c b/lib_dec/dec_tran_fx.c index 2ba42b675..9d2e808a7 100644 --- a/lib_dec/dec_tran_fx.c +++ b/lib_dec/dec_tran_fx.c @@ -2,8 +2,8 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED /*======================================================================*/ diff --git a/lib_dec/dec_uv_fx.c b/lib_dec/dec_uv_fx.c index 63be30656..182c89ef7 100644 --- a/lib_dec/dec_uv_fx.c +++ b/lib_dec/dec_uv_fx.c @@ -2,8 +2,8 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED static void gain_dec_gacelp_uv_fx( diff --git a/lib_dec/evs_dec_fx.c b/lib_dec/evs_dec_fx.c index 690e59b05..ee9bc103c 100644 --- a/lib_dec/evs_dec_fx.c +++ b/lib_dec/evs_dec_fx.c @@ -6,7 +6,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED diff --git a/lib_dec/gain_dec_fx.c b/lib_dec/gain_dec_fx.c index d793092e9..ab561a354 100644 --- a/lib_dec/gain_dec_fx.c +++ b/lib_dec/gain_dec_fx.c @@ -2,9 +2,9 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ diff --git a/lib_dec/gaus_dec_fx.c b/lib_dec/gaus_dec_fx.c index ea5ab985c..9cd2214bc 100644 --- a/lib_dec/gaus_dec_fx.c +++ b/lib_dec/gaus_dec_fx.c @@ -3,9 +3,9 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ /*---------------------------------------------------------------------* diff --git a/lib_dec/gs_dec_amr_wb_fx.c b/lib_dec/gs_dec_amr_wb_fx.c index 1ada34c63..5864c697c 100644 --- a/lib_dec/gs_dec_amr_wb_fx.c +++ b/lib_dec/gs_dec_amr_wb_fx.c @@ -3,9 +3,9 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ @@ -440,7 +440,7 @@ void improv_amr_wb_gs_fx( IF( ( locattack == 0 && LE_32( core_brate, ACELP_12k65 ) ) && ( ( LT_32( core_brate, ACELP_8k85 ) && NE_16( clas, AUDIO_CLAS ) && ( clas == UNVOICED_CLAS || EQ_16( clas, VOICED_TRANSITION ) ) ) || - ( coder_type == INACTIVE ) ) ) + ( coder_type == INACTIVE ) ) ) #endif { /*------------------------------------------------------------* @@ -462,18 +462,18 @@ void improv_amr_wb_gs_fx( { Copy( Aq_fx, Aq_orig, NB_SUBFR * ( M + 1 ) ); - exp_a = norm_s( Aq_fx[imult1616(i , ( M + 1 ))] ); - exp_b = norm_s( old_Aq_fx[imult1616(i , ( M + 1 ))] ); + exp_a = norm_s( Aq_fx[imult1616( i, ( M + 1 ) )] ); + exp_b = norm_s( old_Aq_fx[imult1616( i, ( M + 1 ) )] ); exp_diff = sub( exp_a, exp_b ); IF( exp_diff > 0 ) { - Scale_sig( &old_Aq_fx[imult1616(i , ( M + 1 ))], ( M + 1 ), negate( exp_diff ) ); + Scale_sig( &old_Aq_fx[imult1616( i, ( M + 1 ) )], ( M + 1 ), negate( exp_diff ) ); } ELSE { - Scale_sig( &Aq_fx[imult1616(i , ( M + 1 ))], ( M + 1 ), exp_diff ); + Scale_sig( &Aq_fx[imult1616( i, ( M + 1 ) )], ( M + 1 ), exp_diff ); } - FOR( j = imult1616(i , ( M + 1 )); j < imult1616(add( i , 1 ) , ( M + 1 )); j++ ) + FOR( j = imult1616( i, ( M + 1 ) ); j < imult1616( add( i, 1 ), ( M + 1 ) ); j++ ) { Aq_fx[j] = round_fx( L_mac( L_mult( ALP_FX, old_Aq_fx[j] ), MALP_FX, Aq_fx[j] ) ); @@ -489,12 +489,12 @@ void improv_amr_wb_gs_fx( FOR( i = 0; i < NB_SUBFR; i++ ) { #ifdef BASOP_NOGLOB - enr_LP_new = Enr_1_Az_fx_o( Aq_fx + imult1616(i , ( M + 1 )), L_SUBFR, &Overflow ); + enr_LP_new = Enr_1_Az_fx_o( Aq_fx + imult1616( i, ( M + 1 ) ), L_SUBFR, &Overflow ); #else enr_LP_new = Enr_1_Az_fx( Aq_fx + i * ( M + 1 ), L_SUBFR ); #endif test(); - IF( GT_16( shr( enr_LP_new, 7 ) , enr_LP_old ) || Overflow ) + IF( GT_16( shr( enr_LP_new, 7 ), enr_LP_old ) || Overflow ) { /* filter is unstable, do not modify the excitation */ Copy( Aq_orig, Aq_fx, NB_SUBFR * ( M + 1 ) ); diff --git a/lib_dec/gs_dec_fx.c b/lib_dec/gs_dec_fx.c index 9310ee442..9bd541bc9 100644 --- a/lib_dec/gs_dec_fx.c +++ b/lib_dec/gs_dec_fx.c @@ -483,7 +483,7 @@ void decod_audio_fx( * Update BWE excitation *--------------------------------------------------------------------------------------*/ - IF ( st_fx->hBWE_TD != NULL ) + IF( st_fx->hBWE_TD != NULL ) { set16_fx( voice_factors, 0, NB_SUBFR16k ); IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) @@ -567,7 +567,7 @@ void decod_audio_ivas_fx( GSC_DEC_HANDLE hGSCDec; hGSCDec = st_fx->hGSCDec; - move16(); //Es_pred + move16(); // Es_pred /*---------------------------------------------------------------* * Initialization @@ -631,7 +631,7 @@ void decod_audio_ivas_fx( hGSCDec->noise_lev = NOISE_LEVEL_SP3; move16(); #if 1 // def ADD_LRTD - IF ( GE_16( st_fx->GSC_IVAS_mode, 1 ) ) + IF( GE_16( st_fx->GSC_IVAS_mode, 1 ) ) { test(); if ( LT_32( st_fx->core_brate, GSC_L_RATE_STG ) && LT_32( st_fx->GSC_IVAS_mode, 3 ) ) @@ -689,7 +689,7 @@ void decod_audio_ivas_fx( nb_subfr = SWNB_SUBFR; move16(); - IF ( GE_32( st_fx->core_brate, ACELP_9k60 ) ) + IF( GE_32( st_fx->core_brate, ACELP_9k60 ) ) { nbits = 1; move16(); @@ -720,7 +720,7 @@ void decod_audio_ivas_fx( if ( EQ_16( shr( nb_frame_flg, 1 ), 1 ) ) { - nb_subfr = shl(nb_subfr, 1); + nb_subfr = shl( nb_subfr, 1 ); } #endif } @@ -765,7 +765,7 @@ void decod_audio_ivas_fx( pit_band_idx = (Word16) get_next_indice( st_fx, nbits ); } - IF ( pit_band_idx != 0 ) + IF( pit_band_idx != 0 ) { IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) { @@ -778,7 +778,7 @@ void decod_audio_ivas_fx( } /* detect bit errors in the bitstream */ - IF ( GT_16( pit_band_idx, 13 ) ) /* The maximum decodable index is 10 + BAND1k2 (3) = 13 */ + IF( GT_16( pit_band_idx, 13 ) ) /* The maximum decodable index is 10 + BAND1k2 (3) = 13 */ { pit_band_idx = 13; move16(); @@ -835,7 +835,7 @@ void decod_audio_ivas_fx( #else dec_pit_exc_fx( st_fx, Aq, st_fx->coder_type, Es_pred, pitch_buf, code, exc, bwe_exc, nb_subfr, gain_buf ); #endif - IF ( LT_32( st_fx->core_brate, ACELP_9k60 ) ) + IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) { minimum_fx( pitch_buf, shr( st_fx->L_frame, 6 ), &low_pit ); low_pit = shr( low_pit, 6 ); /*Q6 -> Q0 */ @@ -989,7 +989,7 @@ void decod_audio_ivas_fx( } #if 1 // ydef ADD_LRTD - IF ( EQ_16( st_fx->idchan, 1 ) ) + IF( EQ_16( st_fx->idchan, 1 ) ) { tmp_nb_bits_tot = add( tmp_nb_bits_tot, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ); if ( EQ_16( st_fx->tdm_LRTD_flag, 1 ) ) @@ -1016,7 +1016,7 @@ void decod_audio_ivas_fx( * Update BWE excitation *--------------------------------------------------------------------------------------*/ - IF ( st_fx->hBWE_TD != NULL ) + IF( st_fx->hBWE_TD != NULL ) { set16_fx( voice_factors, 0, NB_SUBFR16k ); IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) @@ -1287,7 +1287,7 @@ void gsc_dec_fx( { FOR( j = 0; j < shl( nb_subbands, 4 ); j++ ) { - IF ( concat_out[j] > 0 ) + IF( concat_out[j] > 0 ) { seed_init = extract_l( L_shl( seed_init, 3 ) ); } @@ -1489,7 +1489,7 @@ void gsc_dec_ivas_fx( move16(); WHILE( LT_16( i, SIZE_BRATE_INTERMED_TBL ) ) { - IF ( LE_32( st_fx->core_brate, brate_intermed_tbl[i] ) ) + IF( LE_32( st_fx->core_brate, brate_intermed_tbl[i] ) ) { break; } @@ -1569,7 +1569,7 @@ void gsc_dec_ivas_fx( st_fx->L_frame, st_fx->element_mode, st_fx->GSC_IVAS_mode ); #if 1 // def ADD_LRTD - IF ( bit == 0 ) + IF( bit == 0 ) { set16_fx( concat_out, 0, L_FRAME16k ); } diff --git a/lib_dec/hf_synth_fx.c b/lib_dec/hf_synth_fx.c index 4c1e2f66a..cee42b0ca 100644 --- a/lib_dec/hf_synth_fx.c +++ b/lib_dec/hf_synth_fx.c @@ -2,10 +2,10 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* Static table prototypes */ +#include "rom_com.h" /* Static table prototypes */ #include "basop32.h" #include "prot.h" @@ -115,7 +115,7 @@ void hf_synth_fx( p_Aq = Aq; FOR( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) { - hf_synthesis_fx( hBWE_zero, core_brate, output_subfr, p_Aq, &exc[i_subfr], Q_exc, &synth[i_subfr], &synth16k[imult3216((Word32)i_subfr , output_subfr) / L_SUBFR], + hf_synthesis_fx( hBWE_zero, core_brate, output_subfr, p_Aq, &exc[i_subfr], Q_exc, &synth[i_subfr], &synth16k[imult3216( (Word32) i_subfr, output_subfr ) / L_SUBFR], Q_syn2, delay_syn_hf, memExp1, mem_hp_interp, extl, CNG_mode ); p_Aq += ( M + 1 ); @@ -346,8 +346,8 @@ static void hf_synthesis_fx( /* delay by 5 samples @16kHz to compensate CLDFB resampling delay (20samples) and HP filtering delay (roughly 15 samples) */ delay = NS2SA( 16000, DELAY_CLDFB_NS ) - 15; - Copy( HF_syn + sub(L_SUBFR16k , delay), temp_buffer, delay ); - Copy( HF_syn, HF_syn + delay, sub(L_SUBFR16k , delay) ); + Copy( HF_syn + sub( L_SUBFR16k, delay ), temp_buffer, delay ); + Copy( HF_syn, HF_syn + delay, sub( L_SUBFR16k, delay ) ); Copy( delay_syn_hf, HF_syn, delay ); Copy( temp_buffer, delay_syn_hf, delay ); @@ -655,7 +655,7 @@ static void filt_6k_7k_scale_fx( Word16 j; L_tmp = 0; move32(); - FOR ( j = 0; j < 31; j++ ) + FOR( j = 0; j < 31; j++ ) { #ifdef BASOP_NOGLOB L_tmp = L_mac_o( L_tmp, x[i + j], fir_6k_7k_fx[j], &Overflow ); @@ -1149,7 +1149,7 @@ void hf_synth_amr_wb_fx( pt4 = signum; FOR( i = 0; i < L_SUBFR16k; i++ ) { - IF ( *pt1 > 0 ) + IF( *pt1 > 0 ) { *pt1 = mult_r( *pt1, g ); /*qdct */ move16(); @@ -1263,7 +1263,7 @@ void hf_synth_amr_wb_fx( FOR( i = 240; i < L_FRAME16k; i++ ) { *pt1 = mult_r( *pt1, scale ); /*qdct */ - IF ( GT_16( i, 255 ) ) + IF( GT_16( i, 255 ) ) { *pt1 = mult_r( 19505, *pt1 ); move16(); @@ -1673,7 +1673,7 @@ static void envelope_fx( } /* LPC envelope level estimate */ - L_tmp = 0 ; + L_tmp = 0; move32(); pt1 = Ap; pt2 = exp_tab_p_fx; diff --git a/lib_dec/hq_classifier_dec_fx.c b/lib_dec/hq_classifier_dec_fx.c index 8b49892ee..430c27cd7 100644 --- a/lib_dec/hq_classifier_dec_fx.c +++ b/lib_dec/hq_classifier_dec_fx.c @@ -2,7 +2,7 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ +#include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" @@ -38,7 +38,7 @@ Word16 ivas_hq_classifier_dec_fx( /* o : Consumed bits test(); IF( ( EQ_16( length, L_SPEC32k ) || EQ_16( length, L_SPEC48k ) ) && LE_32( core_brate, max_brate ) ) { - *hqswb_clas = (Word16)get_next_indice( st_fx, 2 ); + *hqswb_clas = (Word16) get_next_indice( st_fx, 2 ); move16(); bits = 2; move16(); @@ -69,7 +69,7 @@ Word16 ivas_hq_classifier_dec_fx( /* o : Consumed bits test(); IF( LE_32( st_fx->core_brate, HQ_32k ) && *hqswb_clas == HQ_NORMAL ) { - IF ( EQ_16( length, L_SPEC32k ) ) + IF( EQ_16( length, L_SPEC32k ) ) { *hqswb_clas = HQ_GEN_SWB; move16(); diff --git a/lib_dec/hq_core_dec_fx.c b/lib_dec/hq_core_dec_fx.c index ccdb58986..d629365f3 100644 --- a/lib_dec/hq_core_dec_fx.c +++ b/lib_dec/hq_core_dec_fx.c @@ -2,10 +2,10 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* Static table prototypes */ +#include "rom_com.h" /* Static table prototypes */ #ifdef IVAS_FLOAT_FIXED #include "prot.h" #include "ivas_prot_fx.h" diff --git a/lib_dec/hq_env_dec_fx.c b/lib_dec/hq_env_dec_fx.c index 20c64df45..df1635e37 100644 --- a/lib_dec/hq_env_dec_fx.c +++ b/lib_dec/hq_env_dec_fx.c @@ -3,9 +3,9 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ +#include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* Static table prototypes */ +#include "rom_com.h" /* Static table prototypes */ #ifdef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------* diff --git a/lib_dec/hq_hr_dec_fx.c b/lib_dec/hq_hr_dec_fx.c index 602df7dd3..4814b86e5 100644 --- a/lib_dec/hq_hr_dec_fx.c +++ b/lib_dec/hq_hr_dec_fx.c @@ -2,9 +2,9 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ +#include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* Static table prototypes */ +#include "rom_com.h" /* Static table prototypes */ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif diff --git a/lib_dec/inov_dec_fx.c b/lib_dec/inov_dec_fx.c index 9377005a0..b91724125 100644 --- a/lib_dec/inov_dec_fx.c +++ b/lib_dec/inov_dec_fx.c @@ -3,10 +3,10 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* Static table prototypes */ +#include "rom_com.h" /* Static table prototypes */ #ifdef IVAS_FLOAT_FIXED /*======================================================================*/ /* FUNCTION : inov_decode_fx() */ diff --git a/lib_dec/ivas_stereo_dft_dec_dmx.c b/lib_dec/ivas_stereo_dft_dec_dmx.c index ee2c781b5..bacc5a0ab 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx.c @@ -294,13 +294,13 @@ void stereo_dft_unify_dmx_fx( Word16 exp_sum_abs = exp_sum_nrg_l; move16(); - if( GT_16( exp_sum_nrg_R, exp_sum_nrg_l ) ) + if ( GT_16( exp_sum_nrg_R, exp_sum_nrg_l ) ) { exp_sum_abs = exp_sum_nrg_R; move16(); } exp_sum_abs = add( exp_sum_abs, 1 ); - sum_abs = L_add( L_shr( tmp_nrg_L, sub(exp_sum_abs , exp_sum_nrg_l) ), L_shr( tmp_nrg_R, sub( exp_sum_abs, exp_sum_nrg_R ) ) ); + sum_abs = L_add( L_shr( tmp_nrg_L, sub( exp_sum_abs, exp_sum_nrg_l ) ), L_shr( tmp_nrg_R, sub( exp_sum_abs, exp_sum_nrg_R ) ) ); dot_prod_abs = Sqrt32( L_add( Mpy_32_32( dot_prod_real_32, dot_prod_real_32 ), Mpy_32_32( dot_prod_img_32, dot_prod_img_32 ) ), &exp_dot_prod_abs ); Word32 num = L_add( L_shr( L_add( sum_nrg_L_32, sum_nrg_R_32 ), 1 ), L_shr( dot_prod_abs, sub( sub( 31, exp_dot_prod_abs ), q_sum_nrg_L ) ) ); Word16 E_num = sub( 31, q_sum_nrg_L ); @@ -308,7 +308,7 @@ void stereo_dft_unify_dmx_fx( Word16 exp_wR = exp_sum_abs; move16(); - if( LT_16( exp_sum_abs, E_num ) ) + if ( LT_16( exp_sum_abs, E_num ) ) { exp_wR = E_num; move16(); @@ -328,14 +328,14 @@ void stereo_dft_unify_dmx_fx( } ELSE { - wR_temp = shr( divide3232( L_shr( num_sqrt, sub(exp_wR , E_num) ), L_shr( sum_abs, sub(exp_wR , exp_sum_abs) ) ), 2 ); + wR_temp = shr( divide3232( L_shr( num_sqrt, sub( exp_wR, E_num ) ), L_shr( sum_abs, sub( exp_wR, exp_sum_abs ) ) ), 2 ); } Word32 sum_nrg_Mid_sqrt = Sqrt32( sum_nrg_Mid, &exp_sum_nrg_Mid ); Word16 exp_wL = exp_sum_abs; move16(); - if( LT_16( exp_sum_abs, exp_sum_nrg_Mid ) ) + if ( LT_16( exp_sum_abs, exp_sum_nrg_Mid ) ) { exp_wL = exp_sum_nrg_Mid; move16(); diff --git a/lib_dec/ivas_stereo_dft_plc_fx.c b/lib_dec/ivas_stereo_dft_plc_fx.c index 3e41b5991..e0cd69ef6 100644 --- a/lib_dec/ivas_stereo_dft_plc_fx.c +++ b/lib_dec/ivas_stereo_dft_plc_fx.c @@ -110,12 +110,12 @@ void stereo_dft_res_ecu_fx( move16(); FOR( i = 0; i < STEREO_DFT32MS_N_8k / 4; i++ ) { - trigo_dec[i] = hStereoDft->dft_trigo_8k_fx[i_mult(i , trigo_step)]; + trigo_dec[i] = hStereoDft->dft_trigo_8k_fx[i_mult( i, trigo_step )]; move16(); - trigo_dec[STEREO_DFT32MS_N_8k / 2 - i] = hStereoDft->dft_trigo_8k_fx[i_mult(i , trigo_step)]; + trigo_dec[STEREO_DFT32MS_N_8k / 2 - i] = hStereoDft->dft_trigo_8k_fx[i_mult( i, trigo_step )]; move16(); } - trigo_dec[STEREO_DFT32MS_N_8k / 4] = hStereoDft->dft_trigo_8k_fx[i_mult(STEREO_DFT32MS_N_8k / 4 , trigo_step)]; + trigo_dec[STEREO_DFT32MS_N_8k / 4] = hStereoDft->dft_trigo_8k_fx[i_mult( STEREO_DFT32MS_N_8k / 4, trigo_step )]; move16(); /* estimation of res_cod_mem (ola part in imdct residual signal) and input_mem (memory for buffer in DFT analysis)*/ @@ -311,7 +311,7 @@ static void ivas_peakfinder_fx( move32(); ind[k] = 0; move16(); - k = add(k, 1); + k = add( k, 1 ); } FOR( i = 1; i < sub( len0, 1 ); i++ ) @@ -434,7 +434,7 @@ static void ivas_peakfinder_fx( move32(); } - ii = add(ii,1); /* Move onto the valley */ + ii = add( ii, 1 ); /* Move onto the valley */ /* Come down at least sel from peak */ test(); @@ -448,8 +448,8 @@ static void ivas_peakfinder_fx( move16(); peakMag[*cInd] = tempMag; move32(); - ( *cInd ) = add(*(cInd),1); - move16(); + ( *cInd ) = add( *( cInd ), 1 ); + move16(); } ELSE IF( LT_32( x[ii], leftMin ) ) /* New left minimum */ { @@ -581,7 +581,7 @@ void stereo_dft_res_subst_spec_fx( FOR( i = 1; i < L_res; i++ ) { Word32 r = L_shl( p_mem[2 * i], q_res ); - Word32 l = L_shl( p_mem[add(shl(i,1), 1)], q_res ); + Word32 l = L_shl( p_mem[add( shl( i, 1 ), 1 )], q_res ); abs_res[i] = Madd_32_32( Mpy_32_32( r, r ), l, l ); move32(); } @@ -693,7 +693,7 @@ void stereo_dft_res_subst_spec_fx( cos_F = shl_o( getCosWord16( extract_l( corr_phase ) ), 1, &flg_ov ); sin_F = getSinWord16( extract_l( corr_phase ) ); - idx = s_max( 0, sub(plocs[i] , Np) ); /* Iterate over plocs[i]-1:plocs[i]+1, considering the edges of the spectrum */ + idx = s_max( 0, sub( plocs[i], Np ) ); /* Iterate over plocs[i]-1:plocs[i]+1, considering the edges of the spectrum */ WHILE( ( idx < add( add( plocs[i], Np ), 1 ) ) && LT_16( idx, L_res ) ) { pDFT_RES[2 * idx] = Msub_32_16( Mpy_32_16_1( p_mem[2 * idx], cos_F ), p_mem[add( shl( idx, 1 ), 1 )], sin_F ); diff --git a/lib_dec/ivas_stereo_ica_dec.c b/lib_dec/ivas_stereo_ica_dec.c index 2553f40af..e96f22c03 100644 --- a/lib_dec/ivas_stereo_ica_dec.c +++ b/lib_dec/ivas_stereo_ica_dec.c @@ -694,7 +694,7 @@ void stereo_tca_scale_R_channel_fx( Word16 temp_a_q = 2; move16(); tempF1_fx = Inv16( temp_a, &temp_a_q ); - tempF1_fx = L_shl( tempF1_fx, sub(( 31 - 4 ) , sub( 15 , temp_a_q )) ); + tempF1_fx = L_shl( tempF1_fx, sub( ( 31 - 4 ), sub( 15, temp_a_q ) ) ); } @@ -709,7 +709,7 @@ void stereo_tca_scale_R_channel_fx( Word16 temp_b_q = 2; move16(); tempF_fx = Inv16( temp_b, &temp_b_q ); - tempF_fx = L_shl( tempF_fx, sub(( 31 - 4 ) , sub( 15 , temp_b_q )) ); + tempF_fx = L_shl( tempF_fx, sub( ( 31 - 4 ), sub( 15, temp_b_q ) ) ); } } SWITCH( output_Fs ) diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 17e2d3601..078c8957d 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -81,7 +81,7 @@ static void stereo_mdct_dec_stereo_fx( sts[0]->bits_frame_channel = add( sts[0]->bits_frame_channel, i_mult( sts[0]->core, SMDCT_MINIMUM_ARITH_BITS ) ); sts[1]->bits_frame_channel = add( sts[1]->bits_frame_channel, i_mult( sts[1]->core, SMDCT_MINIMUM_ARITH_BITS ) ); - sts[1]->bit_stream = &sts[0]->bit_stream[add(add(sts[0]->next_bit_pos , sts[0]->bits_frame_channel) , i_mult(sts[0]->core , NF_GAIN_BITS))]; + sts[1]->bit_stream = &sts[0]->bit_stream[add( add( sts[0]->next_bit_pos, sts[0]->bits_frame_channel ), i_mult( sts[0]->core, NF_GAIN_BITS ) )]; return; } @@ -819,7 +819,7 @@ static void apply_dmx_weights_fx( { /* subframe is TCX5, but TCX10 or TCX20 in other channel -> convert channel with TCX5 to TCX10 resolution */ pTmp[ch][k] = sig[ch][k] = convertRes[ch] + i_mult( k, shr( frameSize, 1 ) ); - convert_coeffs_to_higher_res_fx( x[ch][k], x[ch][k] + shr(frameSize ,2), pTmp[ch][k], shr( frameSize, 2 ) ); + convert_coeffs_to_higher_res_fx( x[ch][k], x[ch][k] + shr( frameSize, 2 ), pTmp[ch][k], shr( frameSize, 2 ) ); } } @@ -840,7 +840,7 @@ static void apply_dmx_weights_fx( FOR( l = 0; l < nsub2[k]; l++ ) { // mdst[ch][k][l * numCoeffs[k]] = mdst[ch][k][( l + 1 ) * numCoeffs[k] - 1] = 0.f; - mdst[ch][k][i_mult(l , numCoeffs[k])] = mdst[ch][k][sub(i_mult(add( l , 1 ) , numCoeffs[k]) , 1)] = 0; + mdst[ch][k][i_mult( l, numCoeffs[k] )] = mdst[ch][k][sub( i_mult( add( l, 1 ), numCoeffs[k] ), 1 )] = 0; move32(); move32(); FOR( i = l * numCoeffs[k] + 1; i < ( l + 1 ) * numCoeffs[k] - 1; i++ ) @@ -1163,7 +1163,7 @@ static void run_min_stats_fx( FOR( Word16 i = 1; i < L_FRAME16k - 1; i++ ) { Word32 mdst; - mdst = L_sub( spec_in[i + 1], spec_in[i - 1] ); /* Q31 - x_e */ + mdst = L_sub( spec_in[i + 1], spec_in[i - 1] ); /* Q31 - x_e */ power_spec[i] = L_add( W_extract_h( W_shl( W_mult_32_32( spec_in[i], spec_in[i] ), sub( tmp16, 4 ) ) ), W_extract_h( W_shl( W_mult_32_32( mdst, mdst ), sub( tmp16, 4 ) ) ) ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31*/ move32(); } diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index 626b71a10..922f6e369 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -630,7 +630,7 @@ void stereo_tcx_core_dec_fx( IF( !bfi ) { st->stab_fac_fx = lsf_stab_fx( &lsf_fx[M], &lsf_fx[0], 0, st->L_frame ); - move16(); + move16(); } IF( hTcxDec->enableTcxLpc ) diff --git a/lib_dec/lp_exc_d_fx.c b/lib_dec/lp_exc_d_fx.c index acad06090..76d4b4676 100644 --- a/lib_dec/lp_exc_d_fx.c +++ b/lib_dec/lp_exc_d_fx.c @@ -3,8 +3,8 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ /*======================================================================*/ diff --git a/lib_dec/lsf_dec_fx.c b/lib_dec/lsf_dec_fx.c index 2e99272cb..5db486999 100644 --- a/lib_dec/lsf_dec_fx.c +++ b/lib_dec/lsf_dec_fx.c @@ -3,9 +3,9 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #if defined LSF_RE_USE_SECONDARY_CHANNEL || defined FIX_798_LSF_SECONDARY_CH_MISSING_CODE #include "ivas_prot.h" diff --git a/lib_dec/nelp_dec_fx.c b/lib_dec/nelp_dec_fx.c index e5df5d6e4..6943e0b82 100644 --- a/lib_dec/nelp_dec_fx.c +++ b/lib_dec/nelp_dec_fx.c @@ -3,7 +3,7 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ +#include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" diff --git a/lib_dec/pvq_core_dec_fx.c b/lib_dec/pvq_core_dec_fx.c index f9e994cc6..cf904fac6 100644 --- a/lib_dec/pvq_core_dec_fx.c +++ b/lib_dec/pvq_core_dec_fx.c @@ -3,10 +3,10 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* Static table prototypes */ +#include "rom_com.h" /* Static table prototypes */ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #endif diff --git a/lib_dec/range_dec_fx.c b/lib_dec/range_dec_fx.c index 515bd9cda..a51625892 100644 --- a/lib_dec/range_dec_fx.c +++ b/lib_dec/range_dec_fx.c @@ -3,9 +3,9 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ diff --git a/lib_dec/re8_dec_fx.c b/lib_dec/re8_dec_fx.c index 2108ca24d..e6c35e293 100644 --- a/lib_dec/re8_dec_fx.c +++ b/lib_dec/re8_dec_fx.c @@ -3,7 +3,7 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ +#include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------------- diff --git a/lib_dec/rst_dec_fx.c b/lib_dec/rst_dec_fx.c index 9e4f056d3..50aa1b906 100644 --- a/lib_dec/rst_dec_fx.c +++ b/lib_dec/rst_dec_fx.c @@ -4,8 +4,8 @@ #include "options.h" /* Compilation switches */ #include "stl.h" -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ /*----------------------------------------------------------------------------------* diff --git a/lib_dec/stat_noise_uv_dec_fx.c b/lib_dec/stat_noise_uv_dec_fx.c index 0ea10d749..651fb179e 100644 --- a/lib_dec/stat_noise_uv_dec_fx.c +++ b/lib_dec/stat_noise_uv_dec_fx.c @@ -3,7 +3,7 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ +#include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ diff --git a/lib_dec/swb_bwe_dec_hr_fx.c b/lib_dec/swb_bwe_dec_hr_fx.c index 660415302..2ff899705 100644 --- a/lib_dec/swb_bwe_dec_hr_fx.c +++ b/lib_dec/swb_bwe_dec_hr_fx.c @@ -2,11 +2,11 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ +#include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ -#include "rom_com.h" /* Static table prototypes */ -#include "rom_dec.h" /* Static table prototypes */ -#include "cnst.h" /* Static table prototypes */ +#include "rom_com.h" /* Static table prototypes */ +#include "rom_dec.h" /* Static table prototypes */ +#include "cnst.h" /* Static table prototypes */ #define Q_GUARD 1 #define Q_32_BITS 14 /* scaling of 't_audio32' */ diff --git a/lib_dec/syn_outp_fx.c b/lib_dec/syn_outp_fx.c index 32eebbfe8..0cdf21973 100644 --- a/lib_dec/syn_outp_fx.c +++ b/lib_dec/syn_outp_fx.c @@ -3,8 +3,8 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Debug prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_dec/tonalMDCTconcealment_fx.c b/lib_dec/tonalMDCTconcealment_fx.c index d465a03cd..bccb9ea3f 100644 --- a/lib_dec/tonalMDCTconcealment_fx.c +++ b/lib_dec/tonalMDCTconcealment_fx.c @@ -519,7 +519,7 @@ void TonalMDCTConceal_SaveFreqSignal_ivas_fx( FOR( i = 0; i < nNewSamples; i++ ) { Word16 tmp = 0; - if (mdctSpectrum[i] != 0) + if ( mdctSpectrum[i] != 0 ) { tmp = 1; move16(); diff --git a/lib_dec/transition_dec_fx.c b/lib_dec/transition_dec_fx.c index d0ee6d307..edb86ffd4 100644 --- a/lib_dec/transition_dec_fx.c +++ b/lib_dec/transition_dec_fx.c @@ -2,9 +2,9 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "stl.h" diff --git a/lib_dec/updt_dec_fx.c b/lib_dec/updt_dec_fx.c index c71e93f35..28de7cca5 100644 --- a/lib_dec/updt_dec_fx.c +++ b/lib_dec/updt_dec_fx.c @@ -5,8 +5,8 @@ #include #include #include "options.h" -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/FEC_enc_fx.c b/lib_enc/FEC_enc_fx.c index c662d0572..d35f18b61 100644 --- a/lib_enc/FEC_enc_fx.c +++ b/lib_enc/FEC_enc_fx.c @@ -7,7 +7,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/SNR_calc_fx.c b/lib_enc/SNR_calc_fx.c index e3805a1f1..674467cf4 100644 --- a/lib_enc/SNR_calc_fx.c +++ b/lib_enc/SNR_calc_fx.c @@ -6,7 +6,7 @@ #include "options.h" #include "basop_util.h" #include "vad_basop.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "rom_enc.h" #include "rom_com.h" diff --git a/lib_enc/acelp_core_switch_enc_fx.c b/lib_enc/acelp_core_switch_enc_fx.c index 574ccb191..994fe70a9 100644 --- a/lib_enc/acelp_core_switch_enc_fx.c +++ b/lib_enc/acelp_core_switch_enc_fx.c @@ -8,7 +8,7 @@ #include "rom_com_fx.h" //#include "prot_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/acelp_enc_util_fx.c b/lib_enc/acelp_enc_util_fx.c index 9ac0accad..ffdf837c4 100644 --- a/lib_enc/acelp_enc_util_fx.c +++ b/lib_enc/acelp_enc_util_fx.c @@ -9,7 +9,7 @@ //#include "prot_fx.h" #include "basop_util.h" #include "cnst.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "stat_enc.h" #include "rom_com.h" diff --git a/lib_enc/amr_wb_enc_fx.c b/lib_enc/amr_wb_enc_fx.c index f8ab8e6b5..b4b011b35 100644 --- a/lib_enc/amr_wb_enc_fx.c +++ b/lib_enc/amr_wb_enc_fx.c @@ -10,7 +10,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ #include "prot_fx_enc.h" diff --git a/lib_enc/analy_lp_fx.c b/lib_enc/analy_lp_fx.c index 959cbecbe..b8582d271 100644 --- a/lib_enc/analy_lp_fx.c +++ b/lib_enc/analy_lp_fx.c @@ -9,7 +9,7 @@ #include "rom_com.h" /* Static table prototypes */ #include "rom_enc.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/analy_sp_fx.c b/lib_enc/analy_sp_fx.c index ffef5bb62..e23c9b9a5 100644 --- a/lib_enc/analy_sp_fx.c +++ b/lib_enc/analy_sp_fx.c @@ -7,7 +7,7 @@ #include "cnst.h" #include "basop_util.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "rom_enc.h" #include "rom_com.h" diff --git a/lib_enc/ari_enc_fx.c b/lib_enc/ari_enc_fx.c index dd203aee0..54c21c9d1 100644 --- a/lib_enc/ari_enc_fx.c +++ b/lib_enc/ari_enc_fx.c @@ -9,7 +9,7 @@ #include "cnst.h" #include "rom_com.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------- diff --git a/lib_enc/ari_hm_enc_fx.c b/lib_enc/ari_hm_enc_fx.c index 93670491c..8414c56da 100644 --- a/lib_enc/ari_hm_enc_fx.c +++ b/lib_enc/ari_hm_enc_fx.c @@ -12,7 +12,7 @@ #include "rom_enc.h" #include "prot.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/arith_coder_enc_fx.c b/lib_enc/arith_coder_enc_fx.c index 585bd3ab3..ce9f146d8 100644 --- a/lib_enc/arith_coder_enc_fx.c +++ b/lib_enc/arith_coder_enc_fx.c @@ -6,7 +6,7 @@ #include #include "options.h" #include "cnst.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" #include "rom_com.h" diff --git a/lib_enc/avq_cod_fx.c b/lib_enc/avq_cod_fx.c index ca75917b7..ece84e4e9 100644 --- a/lib_enc/avq_cod_fx.c +++ b/lib_enc/avq_cod_fx.c @@ -8,7 +8,7 @@ #include /* Compilation switches */ #include "prot.h" /* Function prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ diff --git a/lib_enc/bass_psfilter_enc_fx.c b/lib_enc/bass_psfilter_enc_fx.c index a468f94e6..df52213c2 100644 --- a/lib_enc/bass_psfilter_enc_fx.c +++ b/lib_enc/bass_psfilter_enc_fx.c @@ -7,7 +7,7 @@ #include "options.h" #include "cnst.h" #include "rom_com.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_enc/bw_detect_fx.c b/lib_enc/bw_detect_fx.c index 004aa55d6..9660075e6 100644 --- a/lib_enc/bw_detect_fx.c +++ b/lib_enc/bw_detect_fx.c @@ -10,7 +10,7 @@ #include "rom_com.h" #include "basop_util.h" #include "ivas_cnst.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/cng_enc_fx.c b/lib_enc/cng_enc_fx.c index 9f5ec0ebf..e94da2f7c 100644 --- a/lib_enc/cng_enc_fx.c +++ b/lib_enc/cng_enc_fx.c @@ -7,7 +7,7 @@ #include "rom_enc.h" /* Encoder static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ //#include "basop_mpy.h" diff --git a/lib_enc/cod2t32_fx.c b/lib_enc/cod2t32_fx.c index a975eeda4..06c4d31f0 100644 --- a/lib_enc/cod2t32_fx.c +++ b/lib_enc/cod2t32_fx.c @@ -6,7 +6,7 @@ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/cod4t64_fx.c b/lib_enc/cod4t64_fx.c index 2afb691c1..b20c94daf 100644 --- a/lib_enc/cod4t64_fx.c +++ b/lib_enc/cod4t64_fx.c @@ -8,7 +8,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/cod_ace_fx.c b/lib_enc/cod_ace_fx.c index 222f330c8..f816a7cd8 100644 --- a/lib_enc/cod_ace_fx.c +++ b/lib_enc/cod_ace_fx.c @@ -11,7 +11,7 @@ #include "options.h" #include "rom_basop_util.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/cod_uv_fx.c b/lib_enc/cod_uv_fx.c index accb947c7..1af9e3463 100644 --- a/lib_enc/cod_uv_fx.c +++ b/lib_enc/cod_uv_fx.c @@ -7,7 +7,7 @@ #include //#include "prot_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/comvad_decision_fx.c b/lib_enc/comvad_decision_fx.c index 489b7861c..98816e768 100644 --- a/lib_enc/comvad_decision_fx.c +++ b/lib_enc/comvad_decision_fx.c @@ -11,7 +11,7 @@ //#include "prot_fx.h" #include "rom_enc.h" /* Encoder static table prototypes */ #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ #include "prot_fx_enc.h" diff --git a/lib_enc/cor_shif_fx.c b/lib_enc/cor_shif_fx.c index e96d59f08..112023505 100644 --- a/lib_enc/cor_shif_fx.c +++ b/lib_enc/cor_shif_fx.c @@ -5,7 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/core_enc_2div_fx.c b/lib_enc/core_enc_2div_fx.c index 6318fe62d..42236eaf8 100644 --- a/lib_enc/core_enc_2div_fx.c +++ b/lib_enc/core_enc_2div_fx.c @@ -11,7 +11,7 @@ //#include "prot_fx.h" #include "basop_util.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/core_enc_init_fx.c b/lib_enc/core_enc_init_fx.c index 5cbc60c31..b3b305673 100644 --- a/lib_enc/core_enc_init_fx.c +++ b/lib_enc/core_enc_init_fx.c @@ -15,7 +15,7 @@ #include #include "rom_com.h" /* Common constants */ #include "prot.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/core_enc_ol_fx.c b/lib_enc/core_enc_ol_fx.c index a92d1a309..781cfe1a5 100644 --- a/lib_enc/core_enc_ol_fx.c +++ b/lib_enc/core_enc_ol_fx.c @@ -10,7 +10,7 @@ #include "basop_util.h" #include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/core_enc_reconf_fx.c b/lib_enc/core_enc_reconf_fx.c index e1f50ba23..b66703f88 100644 --- a/lib_enc/core_enc_reconf_fx.c +++ b/lib_enc/core_enc_reconf_fx.c @@ -9,7 +9,7 @@ #include "rom_com_fx.h" #include "rom_enc.h" /* Encoder static table prototypes */ #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/core_enc_switch_fx.c b/lib_enc/core_enc_switch_fx.c index 644de838f..268bd58ac 100644 --- a/lib_enc/core_enc_switch_fx.c +++ b/lib_enc/core_enc_switch_fx.c @@ -11,7 +11,7 @@ #include "ivas_cnst.h" #include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/core_enc_updt_fx.c b/lib_enc/core_enc_updt_fx.c index fba6cb439..bd6f5b548 100644 --- a/lib_enc/core_enc_updt_fx.c +++ b/lib_enc/core_enc_updt_fx.c @@ -8,7 +8,7 @@ #include "cnst.h" /* Common constants */ #include "basop_util.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/core_switching_enc_fx.c b/lib_enc/core_switching_enc_fx.c index b4b9ea120..4494f0104 100644 --- a/lib_enc/core_switching_enc_fx.c +++ b/lib_enc/core_switching_enc_fx.c @@ -8,7 +8,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/corr_xh_fx.c b/lib_enc/corr_xh_fx.c index c25ee1450..86ba92c7a 100644 --- a/lib_enc/corr_xh_fx.c +++ b/lib_enc/corr_xh_fx.c @@ -5,7 +5,7 @@ #include "options.h" #include "cnst.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/decision_matrix_enc_fx.c b/lib_enc/decision_matrix_enc_fx.c index 413dd876e..922883ffc 100644 --- a/lib_enc/decision_matrix_enc_fx.c +++ b/lib_enc/decision_matrix_enc_fx.c @@ -10,7 +10,7 @@ #include "stat_enc.h" #include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/detect_transient_fx.c b/lib_enc/detect_transient_fx.c index b8df7d373..e21579cd0 100644 --- a/lib_enc/detect_transient_fx.c +++ b/lib_enc/detect_transient_fx.c @@ -37,7 +37,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------*/ diff --git a/lib_enc/diffcod_fx.c b/lib_enc/diffcod_fx.c index 708568261..7ff48d816 100644 --- a/lib_enc/diffcod_fx.c +++ b/lib_enc/diffcod_fx.c @@ -6,7 +6,7 @@ #include "cnst.h" /* Compilation switches */ #include "rom_com_fx.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function Prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------*/ diff --git a/lib_enc/dtx_fx.c b/lib_enc/dtx_fx.c index e79b8ace1..afc6fbe38 100644 --- a/lib_enc/dtx_fx.c +++ b/lib_enc/dtx_fx.c @@ -8,7 +8,7 @@ #include "rom_com.h" // #include "basop_mpy.h" #include -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "prot.h" @@ -67,8 +67,8 @@ void dtx_ivas_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ const Word32 ivas_total_brate, /* i : IVAS total bitrate */ const Word16 vad, /* i : vad flag for DTX */ - const Word16 speech[] /* i : Pointer to the speech frame */ - + const Word16 speech[] /* i : Pointer to the speech frame */ + ) { Word16 alpha; @@ -424,7 +424,7 @@ void dtx_ivas_fx( #endif // hDtxEnc->frame_ener = sum2_f( speech, L_FRAME ); Word16 guard_bits = find_guarded_bits_fx( L_FRAME ); - // Word16 Q_frame_ener = 2 * Q_speech; + // Word16 Q_frame_ener = 2 * Q_speech; hDtxEnc->frame_ener_fx = sum2_f_16_gb_fx( speech, L_FRAME, guard_bits ); // 2*Q_speech-guard_bits /* Active speech (voiced) */ diff --git a/lib_enc/enc_acelp_fx.c b/lib_enc/enc_acelp_fx.c index 5f5943ac1..a60172827 100644 --- a/lib_enc/enc_acelp_fx.c +++ b/lib_enc/enc_acelp_fx.c @@ -12,7 +12,7 @@ #include "rom_com_fx.h" #include "rom_com.h" #include "rom_enc.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/enc_acelp_tcx_main_fx.c b/lib_enc/enc_acelp_tcx_main_fx.c index 3b003e8f2..0ee3c5185 100644 --- a/lib_enc/enc_acelp_tcx_main_fx.c +++ b/lib_enc/enc_acelp_tcx_main_fx.c @@ -7,7 +7,7 @@ //#include "prot_fx.h" #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/enc_acelpx_fx.c b/lib_enc/enc_acelpx_fx.c index 550147215..cac1c81ed 100644 --- a/lib_enc/enc_acelpx_fx.c +++ b/lib_enc/enc_acelpx_fx.c @@ -8,7 +8,7 @@ #include "basop_util.h" #include "options.h" #include "rom_enc.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------------------* diff --git a/lib_enc/enc_amr_wb_fx.c b/lib_enc/enc_amr_wb_fx.c index 9a03bffb0..9e9bbfcc1 100644 --- a/lib_enc/enc_amr_wb_fx.c +++ b/lib_enc/enc_amr_wb_fx.c @@ -7,7 +7,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/enc_gain_fx.c b/lib_enc/enc_gain_fx.c index dbc0e4d29..3bf3db1aa 100644 --- a/lib_enc/enc_gain_fx.c +++ b/lib_enc/enc_gain_fx.c @@ -11,7 +11,7 @@ #include "rom_com.h" #include "rom_enc.h" #include "basop_util.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ void E_GAIN_norm_corr( Word16 exc[], Word16 xn[], Word16 h[], Word16 t_min, Word16 t_max, Word16 corr_norm[], Word16 L_subfr ); diff --git a/lib_enc/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index a1c09310f..a9699855e 100644 --- a/lib_enc/enc_gen_voic_fx.c +++ b/lib_enc/enc_gen_voic_fx.c @@ -7,7 +7,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/enc_gen_voic_rf_fx.c b/lib_enc/enc_gen_voic_rf_fx.c index 665cb8d45..a4d506291 100644 --- a/lib_enc/enc_gen_voic_rf_fx.c +++ b/lib_enc/enc_gen_voic_rf_fx.c @@ -11,7 +11,7 @@ #include "rom_basop_util.h" //#include "basop_mpy.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/enc_nelp_fx.c b/lib_enc/enc_nelp_fx.c index 3fae11009..4be45c7e9 100644 --- a/lib_enc/enc_nelp_fx.c +++ b/lib_enc/enc_nelp_fx.c @@ -7,7 +7,7 @@ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_enc/enc_pit_exc_fx.c b/lib_enc/enc_pit_exc_fx.c index 5c223a033..ff8fe3c32 100644 --- a/lib_enc/enc_pit_exc_fx.c +++ b/lib_enc/enc_pit_exc_fx.c @@ -7,7 +7,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*======================================================================*/ diff --git a/lib_enc/enc_ppp_fx.c b/lib_enc/enc_ppp_fx.c index a3ea6dcbb..d76ed191f 100644 --- a/lib_enc/enc_ppp_fx.c +++ b/lib_enc/enc_ppp_fx.c @@ -6,7 +6,7 @@ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/enc_prm_fx.c b/lib_enc/enc_prm_fx.c index 0580c786d..f59fdf08f 100644 --- a/lib_enc/enc_prm_fx.c +++ b/lib_enc/enc_prm_fx.c @@ -12,7 +12,7 @@ #include "rom_com.h" #include "stl.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index d9cf06004..d3127ccda 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -7,7 +7,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*=================================================================================*/ diff --git a/lib_enc/enc_uv_fx.c b/lib_enc/enc_uv_fx.c index 4e11b34d2..981d02a86 100644 --- a/lib_enc/enc_uv_fx.c +++ b/lib_enc/enc_uv_fx.c @@ -7,7 +7,7 @@ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/energy_fx.c b/lib_enc/energy_fx.c index f3708d604..4bd16df2e 100644 --- a/lib_enc/energy_fx.c +++ b/lib_enc/energy_fx.c @@ -9,7 +9,7 @@ #include "rom_enc.h" #include "vad_basop.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* * est_energy_fx() diff --git a/lib_enc/eval_pit_contr_fx.c b/lib_enc/eval_pit_contr_fx.c index 349b34f0f..f1cc54606 100644 --- a/lib_enc/eval_pit_contr_fx.c +++ b/lib_enc/eval_pit_contr_fx.c @@ -7,7 +7,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/evs_enc_fx.c b/lib_enc/evs_enc_fx.c index b2262ece7..f75547599 100644 --- a/lib_enc/evs_enc_fx.c +++ b/lib_enc/evs_enc_fx.c @@ -7,7 +7,7 @@ #include "prot.h" #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ #include "prot_fx_enc.h" diff --git a/lib_enc/ext_sig_ana_fx.c b/lib_enc/ext_sig_ana_fx.c index ab3dc57bb..bb8307850 100644 --- a/lib_enc/ext_sig_ana_fx.c +++ b/lib_enc/ext_sig_ana_fx.c @@ -9,7 +9,7 @@ //#include "prot_fx.h" #include "rom_com.h" #include "basop_util.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/find_tar_fx.c b/lib_enc/find_tar_fx.c index 6b4fde721..1fb28ca97 100644 --- a/lib_enc/find_tar_fx.c +++ b/lib_enc/find_tar_fx.c @@ -4,7 +4,7 @@ #include #include "options.h" /* Compilation switches */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "cnst.h" /* Common constants */ #include "basop_util.h" diff --git a/lib_enc/find_tilt_fx.c b/lib_enc/find_tilt_fx.c index f2e57a6c4..f0c39eee2 100644 --- a/lib_enc/find_tilt_fx.c +++ b/lib_enc/find_tilt_fx.c @@ -5,7 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_enc/find_uv_fx.c b/lib_enc/find_uv_fx.c index 41ddc0ebf..ec934ad9c 100644 --- a/lib_enc/find_uv_fx.c +++ b/lib_enc/find_uv_fx.c @@ -6,7 +6,7 @@ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/find_wsp.c b/lib_enc/find_wsp.c index 9ecbc8a48..97df5db89 100644 --- a/lib_enc/find_wsp.c +++ b/lib_enc/find_wsp.c @@ -96,32 +96,32 @@ void ivas_find_wsp( const Word16 L_frame, /* i : length of the frame */ const Word16 L_subfr, /* i : length of subframe */ const Word16 nb_subfr, /* i : number of subframes */ - const Word16 *A_fx, /* i : A(z) filter coefficients */ - Word16 *Aw_fx, /* o : weighted A(z) filter coefficients */ - const Word16 *speech_fx, /* i : pointer to the denoised speech frame */ + const Word16 *A_fx, /* i : A(z) filter coefficients */ + Word16 *Aw_fx, /* o : weighted A(z) filter coefficients */ + const Word16 *speech_fx, /* i : pointer to the denoised speech frame */ const Word16 tilt_fact, /* i : tilt factor */ - Word16 *wsp_fx, /* o : poitnter to the weighted speech frame */ - Word16 *mem_wsp_fx, /* i/o: W(Z) denominator memory */ + Word16 *wsp_fx, /* o : poitnter to the weighted speech frame */ + Word16 *mem_wsp_fx, /* i/o: W(Z) denominator memory */ const Word16 gamma, /* i : weighting factor */ - const Word16 L_look /* i : look-ahead */ + const Word16 L_look /* i : look-ahead */ ) { Word16 *p_Aw_fx, tmp_fx; Word16 i_subfr; -/*-----------------------------------------------------------------* - * Compute weighted A(z) unquantized for subframes - *-----------------------------------------------------------------*/ + /*-----------------------------------------------------------------* + * Compute weighted A(z) unquantized for subframes + *-----------------------------------------------------------------*/ weight_a_subfr_fx( nb_subfr, A_fx, Aw_fx, gamma, M ); - + /*-----------------------------------------------------------------* * Compute weighted speech for all subframes *-----------------------------------------------------------------*/ p_Aw_fx = Aw_fx; for ( i_subfr = 0; i_subfr < L_frame; i_subfr += L_subfr ) { - Residu3_fx( p_Aw_fx, &speech_fx[i_subfr], &wsp_fx[i_subfr], L_subfr,0 ); + Residu3_fx( p_Aw_fx, &speech_fx[i_subfr], &wsp_fx[i_subfr], L_subfr, 0 ); p_Aw_fx += ( M + 1 ); } p_Aw_fx -= ( M + 1 ); @@ -131,7 +131,7 @@ void ivas_find_wsp( *-----------------------------------------------------------------*/ deemph_fx( wsp_fx, tilt_fact, L_frame, mem_wsp_fx ); - Residu3_fx( p_Aw_fx, &speech_fx[L_frame], &wsp_fx[L_frame], L_look,0 ); + Residu3_fx( p_Aw_fx, &speech_fx[L_frame], &wsp_fx[L_frame], L_look, 0 ); tmp_fx = *mem_wsp_fx; deemph_fx( &wsp_fx[L_frame], tilt_fact, L_look, &tmp_fx ); return; diff --git a/lib_enc/find_wsp_fx.c b/lib_enc/find_wsp_fx.c index 06b22cc5e..de81f1921 100644 --- a/lib_enc/find_wsp_fx.c +++ b/lib_enc/find_wsp_fx.c @@ -7,7 +7,7 @@ #include "options.h" #include "cnst.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/frame_spec_dif_cor_rate_fx.c b/lib_enc/frame_spec_dif_cor_rate_fx.c index c94ccedeb..c7fa5eb1c 100644 --- a/lib_enc/frame_spec_dif_cor_rate_fx.c +++ b/lib_enc/frame_spec_dif_cor_rate_fx.c @@ -10,7 +10,7 @@ #include "vad_basop.h" //#include "prot_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/gain_enc_fx.c b/lib_enc/gain_enc_fx.c index f9576afeb..abb66a8b8 100644 --- a/lib_enc/gain_enc_fx.c +++ b/lib_enc/gain_enc_fx.c @@ -7,7 +7,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/gaus_enc_fx.c b/lib_enc/gaus_enc_fx.c index 8f35bc6fb..57a336ec2 100644 --- a/lib_enc/gaus_enc_fx.c +++ b/lib_enc/gaus_enc_fx.c @@ -8,7 +8,7 @@ #include "rom_com.h" /* Static table prototypes */ #include "rom_enc.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ //#include "basop_mpy.h" diff --git a/lib_enc/gp_clip_fx.c b/lib_enc/gp_clip_fx.c index 3a82ddd64..73a5c35ea 100644 --- a/lib_enc/gp_clip_fx.c +++ b/lib_enc/gp_clip_fx.c @@ -37,7 +37,7 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_enc/gs_enc_fx.c b/lib_enc/gs_enc_fx.c index 29f6fbb3a..e2d1f4aa9 100644 --- a/lib_enc/gs_enc_fx.c +++ b/lib_enc/gs_enc_fx.c @@ -7,7 +7,7 @@ #include "rom_com_fx.h" #include "rom_com.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/guided_plc_enc_fx.c b/lib_enc/guided_plc_enc_fx.c index 64694bbdc..6470e0a3c 100644 --- a/lib_enc/guided_plc_enc_fx.c +++ b/lib_enc/guided_plc_enc_fx.c @@ -7,7 +7,7 @@ #include "options.h" #include "cnst.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "stat_enc.h" #include "basop_util.h" diff --git a/lib_enc/hf_cod_amrwb_fx.c b/lib_enc/hf_cod_amrwb_fx.c index 170bb9408..7c2060fa8 100644 --- a/lib_enc/hf_cod_amrwb_fx.c +++ b/lib_enc/hf_cod_amrwb_fx.c @@ -8,7 +8,7 @@ #include "rom_com_fx.h" #include "cnst.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/hq_classifier_enc_fx.c b/lib_enc/hq_classifier_enc_fx.c index c72ebb8cc..842f2029e 100644 --- a/lib_enc/hq_classifier_enc_fx.c +++ b/lib_enc/hq_classifier_enc_fx.c @@ -7,7 +7,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-----------------------------------------------------------------* diff --git a/lib_enc/hq_core_enc_fx.c b/lib_enc/hq_core_enc_fx.c index a0ca2a16d..55e37a3b5 100644 --- a/lib_enc/hq_core_enc_fx.c +++ b/lib_enc/hq_core_enc_fx.c @@ -7,7 +7,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------------- diff --git a/lib_enc/hq_env_enc_fx.c b/lib_enc/hq_env_enc_fx.c index f995f364a..bfb983641 100644 --- a/lib_enc/hq_env_enc_fx.c +++ b/lib_enc/hq_env_enc_fx.c @@ -8,7 +8,7 @@ #include "rom_enc.h" #include "rom_com.h" #include "stl.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------------------* diff --git a/lib_enc/hq_hr_enc_fx.c b/lib_enc/hq_hr_enc_fx.c index 706304fe0..ca7d941ee 100644 --- a/lib_enc/hq_hr_enc_fx.c +++ b/lib_enc/hq_hr_enc_fx.c @@ -7,7 +7,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------* diff --git a/lib_enc/hq_lr_enc_fx.c b/lib_enc/hq_lr_enc_fx.c index 414a77c97..85827b9a1 100644 --- a/lib_enc/hq_lr_enc_fx.c +++ b/lib_enc/hq_lr_enc_fx.c @@ -9,7 +9,7 @@ #include "rom_enc.h" //#include "basop_mpy.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/hvq_enc_fx.c b/lib_enc/hvq_enc_fx.c index 4d817c104..b2adfef24 100644 --- a/lib_enc/hvq_enc_fx.c +++ b/lib_enc/hvq_enc_fx.c @@ -7,7 +7,7 @@ #include "cnst.h" //#include "prot_fx.h" #include "rom_com.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #define HVQ_ENC_NOISE_DELTA ( (Word16) 3277 ) /* 0.1 in Q15 */ diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index c9661e16b..1bcb7698f 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -9,7 +9,7 @@ #include "cnst.h" #include "stl.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "stat_enc.h" #include "basop_util.h" diff --git a/lib_enc/igf_scf_enc_fx.c b/lib_enc/igf_scf_enc_fx.c index 49bfbe9da..58b835803 100644 --- a/lib_enc/igf_scf_enc_fx.c +++ b/lib_enc/igf_scf_enc_fx.c @@ -9,7 +9,7 @@ #include "stat_enc.h" #include "stat_com.h" #include "basop_util.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index 13c3e06ee..a38e19b71 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -10,7 +10,7 @@ #include "stl.h" #include "ivas_cnst.h" #include "ivas_error.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/inov_enc_fx.c b/lib_enc/inov_enc_fx.c index f3e9dbfd3..bb573b1c4 100644 --- a/lib_enc/inov_enc_fx.c +++ b/lib_enc/inov_enc_fx.c @@ -8,7 +8,7 @@ #include "basop_util.h" #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/isf_enc_amr_wb_fx.c b/lib_enc/isf_enc_amr_wb_fx.c index 02bdb00ad..505d3f290 100644 --- a/lib_enc/isf_enc_amr_wb_fx.c +++ b/lib_enc/isf_enc_amr_wb_fx.c @@ -34,7 +34,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index 39530d87e..239e57cfc 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -919,7 +919,7 @@ ivas_error pre_proc_front_ivas_fx( float sp_div, PS[128]; /* speech/music clasif. parameters */ int16_t L_look; /* length of look-ahead */ #if 1 - float snr_sum_he; /* HE SAD parameters */ + float snr_sum_he; /* HE SAD parameters */ #endif float mem_decim_dummy[2 * L_FILT_MAX]; /* dummy decimation filter memory */ float temp1F_icatdmResampBuf[L_FILT_MAX]; /* temp buffers for ICA TDM resamplers */ @@ -961,8 +961,8 @@ ivas_error pre_proc_front_ivas_fx( Word16 *temp1F_icatdmResampBuf_fx; Word16 *old_inp_12k8_fx; Word16 *old_inp_16k_fx; - Word16 *mem_decim_dummy_fx; /* dummy decimation filter memory */ - Word32 Etot_fx; /* total energy */ + Word16 *mem_decim_dummy_fx; /* dummy decimation filter memory */ + Word32 Etot_fx; /* total energy */ #if 0 Word32 fr_bands_fx[2 * NB_BANDS]; /* energy in frequency bands */ Word16 Q_new; @@ -1353,7 +1353,7 @@ ivas_error pre_proc_front_ivas_fx( { mvr2r( new_inp_12k8, st->buf_speech_enc_flt + L_FRAME32k, L_FRAME ); } -#ifndef MSAN_FIX/*To be enabled when updations related to new_inp_12k8_fx is enabled */ +#ifndef MSAN_FIX /*To be enabled when updations related to new_inp_12k8_fx is enabled */ #if 1 IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) { @@ -1729,7 +1729,7 @@ ivas_error pre_proc_front_ivas_fx( st->lt_mean_NB_fx = (Word16) st->lt_mean_NB * ( 1 << 11 ); st->lt_mean_WB_fx = (Word16) st->lt_mean_WB * ( 1 << 11 ); st->lt_mean_SWB_fx = (Word16) st->lt_mean_SWB * ( 1 << 11 ); - st->lp_noise_fx = (Word16) st->lp_noise * ( 1 << 8 ); //have taken Q8 as above one functions uses Q8 + st->lp_noise_fx = (Word16) st->lp_noise * ( 1 << 8 ); // have taken Q8 as above one functions uses Q8 #endif bw_detect_fx( st, st->input_fx, NULL, enerBuffer_fx, sf_energySum, ivas_format, 0 ); diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c index 1aa7a85c3..eea3314d8 100644 --- a/lib_enc/ivas_ism_dtx_enc.c +++ b/lib_enc/ivas_ism_dtx_enc.c @@ -154,7 +154,7 @@ Word16 ivas_ism_dtx_enc_fx( test(); test(); - if( GT_16( lp_noise_mean_fx, ( 50 << 8 ) ) || ( GT_16( lp_noise_mean_fx, ( 25 << 8 ) ) && GT_16( lp_noise_variation_fx, ( 32 << 8 ) ) ) ) + if ( GT_16( lp_noise_mean_fx, ( 50 << 8 ) ) || ( GT_16( lp_noise_mean_fx, ( 25 << 8 ) ) && GT_16( lp_noise_variation_fx, ( 32 << 8 ) ) ) ) { dtx_flag = 0; move16(); @@ -172,11 +172,11 @@ Word16 ivas_ism_dtx_enc_fx( test(); test(); test(); - if( !( ( EQ_16( nchan_ism, 1 ) && LE_32( ivas_total_brate, IVAS_24k4 ) ) || - ( EQ_16( nchan_ism, 2 ) && LE_32( ivas_total_brate, IVAS_48k ) ) || - ( EQ_16( nchan_ism, 3 ) && LE_32( ivas_total_brate, IVAS_80k ) ) || - ( EQ_16( nchan_ism, 4 ) && LE_32( ivas_total_brate, IVAS_96k ) ) || - LT_16( lp_noise_max_fx, ( 15 << 8 ) ) ) ) + if ( !( ( EQ_16( nchan_ism, 1 ) && LE_32( ivas_total_brate, IVAS_24k4 ) ) || + ( EQ_16( nchan_ism, 2 ) && LE_32( ivas_total_brate, IVAS_48k ) ) || + ( EQ_16( nchan_ism, 3 ) && LE_32( ivas_total_brate, IVAS_80k ) ) || + ( EQ_16( nchan_ism, 4 ) && LE_32( ivas_total_brate, IVAS_96k ) ) || + LT_16( lp_noise_max_fx, ( 15 << 8 ) ) ) ) { dtx_flag = 0; move16(); @@ -208,13 +208,13 @@ Word16 ivas_ism_dtx_enc_fx( /* check difference between current and last metadata */ md_diff_flag[ch] = 0; move16(); - if( GT_32( L_abs( L_sub( hIsmMeta[ch]->azimuth_fx, hIsmMeta[ch]->last_azimuth_fx ) ), MD_MAX_DIFF_AZIMUTH_FX ) ) + if ( GT_32( L_abs( L_sub( hIsmMeta[ch]->azimuth_fx, hIsmMeta[ch]->last_azimuth_fx ) ), MD_MAX_DIFF_AZIMUTH_FX ) ) { md_diff_flag[ch] = 1; move16(); } - if( GT_32( L_abs( L_sub( hIsmMeta[ch]->elevation_fx, hIsmMeta[ch]->last_elevation_fx ) ), MD_MAX_DIFF_ELEVATION_FX ) ) + if ( GT_32( L_abs( L_sub( hIsmMeta[ch]->elevation_fx, hIsmMeta[ch]->last_elevation_fx ) ), MD_MAX_DIFF_ELEVATION_FX ) ) { md_diff_flag[ch] = 1; move16(); @@ -235,7 +235,7 @@ Word16 ivas_ism_dtx_enc_fx( move16(); nBits_MD_max = sub( nBits_MD_max, SID_FORMAT_NBITS ); - if( GT_16( nchan_transport, 1 ) ) + if ( GT_16( nchan_transport, 1 ) ) { nBits_MD_max = sub( nBits_MD_max, nBits_sce_id ); } @@ -245,13 +245,13 @@ Word16 ivas_ism_dtx_enc_fx( nBits_MD_max = sub( nBits_MD_max, nBits_coh ); /* coherence */ } - if( GT_16( nchan_ism, 3 ) ) + if ( GT_16( nchan_ism, 3 ) ) { nBits_MD_max = sub( nBits_MD_max, 1 ); /* ism_mode flag */ } /* too many metadata bits -> switch to active coding */ - if( GT_16( nBits, nBits_MD_max ) ) + if ( GT_16( nBits, nBits_MD_max ) ) { dtx_flag = 0; move16(); @@ -717,7 +717,7 @@ void ivas_ism_coh_estim_dtx_enc_fx( { norm_inp = norm_l( st_id0->input32_fx[i] ); scaled_inp = L_shl( st_id0->input32_fx[i], norm_inp ); - tot_exp = shl( sub( 20, norm_inp), 1 ); + tot_exp = shl( sub( 20, norm_inp ), 1 ); acorr_ene_fx[hISMDTX->sce_id_dtx] = BASOP_Util_Add_Mant32Exp( acorr_ene_fx[hISMDTX->sce_id_dtx], acorr_ene_e[hISMDTX->sce_id_dtx], Mult_32_32( scaled_inp, scaled_inp ), tot_exp, &acorr_ene_e[hISMDTX->sce_id_dtx] ); move32(); } @@ -744,7 +744,7 @@ void ivas_ism_coh_estim_dtx_enc_fx( { norm_inp = norm_l( st->input32_fx[i] ); scaled_inp = L_shl( st->input32_fx[i], norm_inp ); - tot_exp = shl( sub( 20, norm_inp), 1 ); + tot_exp = shl( sub( 20, norm_inp ), 1 ); acorr_ene_fx[sce_id] = BASOP_Util_Add_Mant32Exp( acorr_ene_fx[sce_id], acorr_ene_e[sce_id], Mult_32_32( scaled_inp, scaled_inp ), tot_exp, &acorr_ene_e[sce_id] ); move32(); xcorr_ene_fx = BASOP_Util_Add_Mant32Exp( xcorr_ene_fx, xcorr_ene_e, Mult_32_32( scaled_inp, scaled_inp ), tot_exp, &xcorr_ene_e ); diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 43cc16ecc..7e51c82bf 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -203,12 +203,12 @@ ivas_error ivas_ism_enc( /* compute the dominant sce_id using long term energy */ #ifdef IVAS_FLOAT_FIXED #if 1 /************************flt_to_fix****************************/ - for( int j = 0; j < st_ivas->nchan_transport; j++ ) + for ( int j = 0; j < st_ivas->nchan_transport; j++ ) { - floatToFixed_arrL( st_ivas->hSCE[j]->hCoreCoder[0]->input, st_ivas->hSCE[j]->hCoreCoder[0]->input32_fx, Q11, input_frame ); /*Q0*/ + floatToFixed_arrL( st_ivas->hSCE[j]->hCoreCoder[0]->input, st_ivas->hSCE[j]->hCoreCoder[0]->input32_fx, Q11, input_frame ); /*Q0*/ } f2me_buf( &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc[0][0], &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_fx[0][0], &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_e, st_ivas->nchan_transport * PARAM_ISM_HYS_BUF_SIZE ); - for( int ch = 0; ch < nchan_ism; ch++ ) + for ( int ch = 0; ch < nchan_ism; ch++ ) { st_ivas->hIsmMetaData[ch]->azimuth_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->azimuth, Q22 ); st_ivas->hIsmMetaData[ch]->last_azimuth_fx = float_to_fix( st_ivas->hIsmMetaData[ch]->last_azimuth, Q22 ); @@ -223,15 +223,15 @@ ivas_error ivas_ism_enc( #endif /****************************ends here*********************************/ ivas_ism_get_sce_id_dtx_fx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); dtx_flag = ivas_ism_dtx_enc_fx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, st_ivas->nchan_transport, vad_flag, st_ivas->hIsmMetaData, md_diff_flag, &sid_flag ); - IF ( sid_flag ) + IF( sid_flag ) { /* estimate coherence between objects */ ivas_ism_coh_estim_dtx_enc_fx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); } #if 1 /************************fix_to_flt****************************/ - me2f_buf(&st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_fx[0][0], st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_e, &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc[0][0], st_ivas->nchan_transport * PARAM_ISM_HYS_BUF_SIZE); + me2f_buf( &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_fx[0][0], st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc_e, &st_ivas->hISMDTX->long_term_energy_stereo_dmx_enc[0][0], st_ivas->nchan_transport * PARAM_ISM_HYS_BUF_SIZE ); fixedToFloat_arr( st_ivas->hISMDTX->coh_fx, st_ivas->hISMDTX->coh, Q15, st_ivas->nchan_transport ); -#endif/****************************ends here*********************************/ +#endif /****************************ends here*********************************/ #else ivas_ism_get_sce_id_dtx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 49ba2e480..3bf1bb5c8 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -1646,15 +1646,15 @@ ivas_error ivas_ism_metadata_enc_create( st_ivas->hIsmMetaData[ch]->last_true_radius_fx = ONE_IN_Q9; /*===============fix-to-flt====================*/ - st_ivas->hIsmMetaData[ch]->last_azimuth = fix_to_float(st_ivas->hIsmMetaData[ch]->last_azimuth_fx, Q22); - st_ivas->hIsmMetaData[ch]->last_elevation = fix_to_float(st_ivas->hIsmMetaData[ch]->last_elevation_fx, Q22); + st_ivas->hIsmMetaData[ch]->last_azimuth = fix_to_float( st_ivas->hIsmMetaData[ch]->last_azimuth_fx, Q22 ); + st_ivas->hIsmMetaData[ch]->last_elevation = fix_to_float( st_ivas->hIsmMetaData[ch]->last_elevation_fx, Q22 ); - st_ivas->hIsmMetaData[ch]->last_true_azimuth = fix_to_float(st_ivas->hIsmMetaData[ch]->last_true_azimuth_fx, Q22); - st_ivas->hIsmMetaData[ch]->last_true_elevation = fix_to_float(st_ivas->hIsmMetaData[ch]->last_true_elevation_fx, Q22); - st_ivas->hIsmMetaData[ch]->last_true_radius = fix16_to_float(st_ivas->hIsmMetaData[ch]->last_true_radius_fx, Q9); + st_ivas->hIsmMetaData[ch]->last_true_azimuth = fix_to_float( st_ivas->hIsmMetaData[ch]->last_true_azimuth_fx, Q22 ); + st_ivas->hIsmMetaData[ch]->last_true_elevation = fix_to_float( st_ivas->hIsmMetaData[ch]->last_true_elevation_fx, Q22 ); + st_ivas->hIsmMetaData[ch]->last_true_radius = fix16_to_float( st_ivas->hIsmMetaData[ch]->last_true_radius_fx, Q9 ); /*===============fix-to-flt====================*/ } - + IF( EQ_16( st_ivas->hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) ) { test(); diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index 56b4d4f7d..eed03579e 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -555,14 +555,14 @@ void ivas_param_ism_compute_noisy_speech_flag( Word16 i; /* Move the Noisy speech buffer */ - FOR ( i = 0; i < ( PARAM_ISM_HYS_BUF_SIZE - 1 ); i++ ) + FOR( i = 0; i < ( PARAM_ISM_HYS_BUF_SIZE - 1 ); i++ ) { st_ivas->hParamIsm->noisy_speech_buffer[i] = st_ivas->hParamIsm->noisy_speech_buffer[i + 1]; move16(); } /* Set flag_noisy_speech to 0 for cases where object energies are not roughly equal */ - IF ( !st_ivas->hParamIsm->flag_equal_energy ) + IF( !st_ivas->hParamIsm->flag_equal_energy ) { st_ivas->hParamIsm->noisy_speech_buffer[i] = 0; st_ivas->hParamIsm->flag_noisy_speech = 0; @@ -573,10 +573,10 @@ void ivas_param_ism_compute_noisy_speech_flag( { /* For the current frame, make a decision based on some core-coder flags */ test(); - IF ( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr ) + IF( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr ) { test(); - IF ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) + IF( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) { st_ivas->hParamIsm->noisy_speech_buffer[i] = 0; move16(); @@ -596,7 +596,7 @@ void ivas_param_ism_compute_noisy_speech_flag( /* Do a decision based on hysteresis */ st_ivas->hParamIsm->flag_noisy_speech = 1; move16(); - FOR ( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ ) + FOR( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ ) { test(); st_ivas->hParamIsm->flag_noisy_speech = st_ivas->hParamIsm->flag_noisy_speech && st_ivas->hParamIsm->noisy_speech_buffer[i]; diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index 0588844fb..3a49e4aae 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -1025,21 +1025,21 @@ void ivas_mcmasa_param_est_enc( Word16 x1_q_fx[MASA_FREQUENCY_BANDS]; Word16 x2_q_fx[MASA_FREQUENCY_BANDS]; Word16 y_q_fx[MASA_FREQUENCY_BANDS]; - FOR(i = 0; i < num_freq_bands; i++) + FOR( i = 0; i < num_freq_bands; i++ ) { - x1_q_fx[i] = Q_factor_L(diffuseness_vector[i]); - x1_fx[i] = (Word32)(diffuseness_vector[i] * (W_shl(1, x1_q_fx[i]))); - x2_q_fx[i] = Q_factor_L(vertical_diffuseness_vector[i]); - x2_fx[i] = (Word32)(vertical_diffuseness_vector[i] * (W_shl(1, x2_q_fx[i]))); + x1_q_fx[i] = Q_factor_L( diffuseness_vector[i] ); + x1_fx[i] = (Word32) ( diffuseness_vector[i] * ( W_shl( 1, x1_q_fx[i] ) ) ); + x2_q_fx[i] = Q_factor_L( vertical_diffuseness_vector[i] ); + x2_fx[i] = (Word32) ( vertical_diffuseness_vector[i] * ( W_shl( 1, x2_q_fx[i] ) ) ); } ///////////////////////////////////////////////////////////////////////// - v_min_fx((const Word32 *)x1_fx, x1_q_fx, (const Word32 *)x2_fx, x2_q_fx, y_fx, y_q_fx, num_freq_bands ); + v_min_fx( (const Word32 *) x1_fx, x1_q_fx, (const Word32 *) x2_fx, x2_q_fx, y_fx, y_q_fx, num_freq_bands ); //////////////////////// to be removed //////////////////////////////// - FOR(i = 0; i < num_freq_bands; i++) + FOR( i = 0; i < num_freq_bands; i++ ) { - diffuseness_vector[i] = (Float32)y_fx[i] / (W_shl(1, y_q_fx[i])); + diffuseness_vector[i] = (Float32) y_fx[i] / ( W_shl( 1, y_q_fx[i] ) ); } /////////////////////////////////////////////////////////////////////// #else diff --git a/lib_enc/ivas_stereo_classifier.c b/lib_enc/ivas_stereo_classifier.c index b28abea78..22d07cf28 100644 --- a/lib_enc/ivas_stereo_classifier.c +++ b/lib_enc/ivas_stereo_classifier.c @@ -233,7 +233,7 @@ void stereo_classifier_init( hStereoClassif->nchar_ch2 = 0.0f; hStereoClassif->non_sta_ch1 = 0.0f; hStereoClassif->sp_div_ch1 = 0.0f; - + #ifdef IVAS_FLOAT_FIXED hStereoClassif->ps_diff_ch1_fx = 0; hStereoClassif->ps_diff_ch2_fx = 0; diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index 4068c17ef..86715a6ce 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -470,8 +470,8 @@ void stereo_mdct_core_enc( if ( !hStereoMdct->isSBAStereoMode ) { #ifdef IVAS_FLOAT_FIXED - IF(hStereoMdct->hItd) - hStereoMdct->hItd->itd_fx[1] = float_to_fix(hStereoMdct->hItd->itd[1], Q23); + IF( hStereoMdct->hItd ) + hStereoMdct->hItd->itd_fx[1] = float_to_fix( hStereoMdct->hItd->itd[1], Q23 ); #endif stereo_bits = write_stereo_to_bitstream( hStereoMdct, sts, ms_mask, 0, hBstr ); } @@ -488,16 +488,16 @@ void stereo_mdct_core_enc( FindSplitRatio( hCPE, sts ); #else #if 1 - FOR( ch = 0; ch < CPE_CHANNELS; ch++) + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - L_subframeTCX = sts[ch]->hTcxEnc->L_frameTCX / (( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV); - IF(sts[ch]->last_core == ACELP_CORE) + L_subframeTCX = sts[ch]->hTcxEnc->L_frameTCX / ( ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); + IF( sts[ch]->last_core == ACELP_CORE ) { L_subframeTCX += L_subframeTCX / 4; } - FOR ( n = 0; n <= (( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV) - 1; n++ ) + FOR( n = 0; n <= ( ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ) - 1; n++ ) { - f2me_buf(sts[ch]->hTcxEnc->spectrum[n], sts[ch]->hTcxEnc->spectrum_fx[n], &sts[ch]->hTcxEnc->spectrum_e[n], L_subframeTCX); + f2me_buf( sts[ch]->hTcxEnc->spectrum[n], sts[ch]->hTcxEnc->spectrum_fx[n], &sts[ch]->hTcxEnc->spectrum_e[n], L_subframeTCX ); } } #endif diff --git a/lib_enc/lead_indexing_fx.c b/lib_enc/lead_indexing_fx.c index 282bdf5fb..ff2933014 100644 --- a/lib_enc/lead_indexing_fx.c +++ b/lib_enc/lead_indexing_fx.c @@ -7,7 +7,7 @@ //#include "prot_fx.h" #include "rom_com_fx.h" #include "rom_com.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 73ae64a70..230c58c44 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -481,11 +481,11 @@ ivas_error IVAS_ENC_FeedObjectMetadata( error = ivas_set_ism_metadata_fx( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], azimuth_fx, elevation_fx, radius_fx, yaw_fx, pitch_fx, metadata.non_diegetic_flag ); /*================fix-to-flt====================*/ - hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->azimuth = fix_to_float(azimuth_fx, Q22); - hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->elevation = fix_to_float(elevation_fx, Q22); - hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->radius = fix_to_float(radius_fx, Q9); - hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->yaw = fix_to_float(yaw_fx, Q22); - hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->pitch = fix_to_float(pitch_fx, Q22); + hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->azimuth = fix_to_float( azimuth_fx, Q22 ); + hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->elevation = fix_to_float( elevation_fx, Q22 ); + hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->radius = fix_to_float( radius_fx, Q9 ); + hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->yaw = fix_to_float( yaw_fx, Q22 ); + hIvasEnc->st_ivas->hIsmMetaData[ismIndex]->pitch = fix_to_float( pitch_fx, Q22 ); /*================fix-to-flt====================*/ #else error = ivas_set_ism_metadata( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth, metadata.elevation, metadata.radius, metadata.yaw, metadata.pitch, metadata.non_diegetic_flag ); diff --git a/lib_enc/long_enr_fx.c b/lib_enc/long_enr_fx.c index 3f0d5e792..cc6291cee 100644 --- a/lib_enc/long_enr_fx.c +++ b/lib_enc/long_enr_fx.c @@ -6,7 +6,7 @@ #include "cnst.h" /* Common constants */ #include "rom_com.h" #include "stl.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -17,14 +17,14 @@ *-------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED void ivas_long_enr_fx( - Encoder_State *st_fx, /* i/o: state structure */ - const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) */ - const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ - Word16 high_lpn_flag, /* i : sp/mus LPN flag */ - FRONT_VAD_ENC_HANDLE hFrontVad[], /* i/o: front-VAD handles */ - const Word16 n_chan, /* i : number of channels */ + Encoder_State *st_fx, /* i/o: state structure */ + const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) */ + const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ + Word16 high_lpn_flag, /* i : sp/mus LPN flag */ + FRONT_VAD_ENC_HANDLE hFrontVad[], /* i/o: front-VAD handles */ + const Word16 n_chan, /* i : number of channels */ const Word16 localVAD_HE_SAD_LR[], /* i : HE-SAD flag without hangover LR channels */ - const Word16 Etot_LR[] /* i : total channel energy LR channels */ + const Word16 Etot_LR[] /* i : total channel energy LR channels */ ) { @@ -37,16 +37,16 @@ void ivas_long_enr_fx( * and total active speech energy *-----------------------------------------------------------------*/ Word16 n; - IF ( hFrontVad != NULL ) + IF( hFrontVad != NULL ) { - IF ( LT_16(hFrontVad[0]->ini_frame , 4) ) + IF( LT_16( hFrontVad[0]->ini_frame, 4 ) ) { - FOR ( n = 0; n < n_chan; n++ ) + FOR( n = 0; n < n_chan; n++ ) { hFrontVad[n]->lp_noise_fx = hFrontVad[n]->hNoiseEst->totalNoise_fx; tmp = add( hFrontVad[n]->lp_noise_fx, 2560 ); - IF ( LT_16(hFrontVad[n]->lp_speech_fx , tmp )) + IF( LT_16( hFrontVad[n]->lp_speech_fx, tmp ) ) { hFrontVad[n]->lp_speech_fx = tmp; move16(); @@ -57,7 +57,7 @@ void ivas_long_enr_fx( { Word16 smooth_prev, smooth_curr; - IF ( LT_16(hFrontVad[0]->ini_frame , 150) ) + IF( LT_16( hFrontVad[0]->ini_frame, 150 ) ) { smooth_prev = 31130; smooth_curr = 1638; @@ -68,24 +68,24 @@ void ivas_long_enr_fx( smooth_curr = 655; } - FOR ( n = 0; n < n_chan; n++ ) + FOR( n = 0; n < n_chan; n++ ) { - hFrontVad[n]->lp_noise_fx = add(mult_r(smooth_prev , hFrontVad[n]->lp_noise_fx) , mult_r(smooth_curr , hFrontVad[n]->hNoiseEst->totalNoise_fx)); + hFrontVad[n]->lp_noise_fx = add( mult_r( smooth_prev, hFrontVad[n]->lp_noise_fx ), mult_r( smooth_curr, hFrontVad[n]->hNoiseEst->totalNoise_fx ) ); - IF ( localVAD_HE_SAD_LR[n] && !high_lpn_flag ) + IF( localVAD_HE_SAD_LR[n] && !high_lpn_flag ) { - IF ( LT_16(sub( hFrontVad[n]->lp_speech_fx , Etot_LR[n] ) , 2560) ) + IF( LT_16( sub( hFrontVad[n]->lp_speech_fx, Etot_LR[n] ), 2560 ) ) { - hFrontVad[n]->lp_speech_fx = add(mult_r(32113 , hFrontVad[n]->lp_speech_fx) , mult_r(655 , Etot_LR[n])); + hFrontVad[n]->lp_speech_fx = add( mult_r( 32113, hFrontVad[n]->lp_speech_fx ), mult_r( 655, Etot_LR[n] ) ); } ELSE { - hFrontVad[n]->lp_speech_fx = sub(hFrontVad[n]->lp_speech_fx , 13); + hFrontVad[n]->lp_speech_fx = sub( hFrontVad[n]->lp_speech_fx, 13 ); } } } } - FOR ( n = 0; n < n_chan; n++ ) + FOR( n = 0; n < n_chan; n++ ) { hFrontVad[n]->hNoiseEst->Etot_last_fx = Etot_LR[n]; move16(); diff --git a/lib_enc/lp_exc_e_fx.c b/lib_enc/lp_exc_e_fx.c index 206e7435c..9562eabf8 100644 --- a/lib_enc/lp_exc_e_fx.c +++ b/lib_enc/lp_exc_e_fx.c @@ -6,7 +6,7 @@ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ #include "basop_util.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/lsf_enc_fx.c b/lib_enc/lsf_enc_fx.c index 97aef1cc7..3a4632797 100644 --- a/lib_enc/lsf_enc_fx.c +++ b/lib_enc/lsf_enc_fx.c @@ -8,7 +8,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "ivas_prot_fx.h" /* Function prototypes */ diff --git a/lib_enc/lsf_msvq_ma_enc_fx.c b/lib_enc/lsf_msvq_ma_enc_fx.c index 4d0cce641..fdb1ab0fc 100644 --- a/lib_enc/lsf_msvq_ma_enc_fx.c +++ b/lib_enc/lsf_msvq_ma_enc_fx.c @@ -11,7 +11,7 @@ #include "rom_com.h" #include "rom_enc.h" #include "basop_util.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/ltd_stable_fx.c b/lib_enc/ltd_stable_fx.c index 0da80653f..500620273 100644 --- a/lib_enc/ltd_stable_fx.c +++ b/lib_enc/ltd_stable_fx.c @@ -9,7 +9,7 @@ #include "vad_basop.h" //#include "prot_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/mdct_classifier_fx.c b/lib_enc/mdct_classifier_fx.c index a34ff46b4..dc938766b 100644 --- a/lib_enc/mdct_classifier_fx.c +++ b/lib_enc/mdct_classifier_fx.c @@ -7,7 +7,7 @@ #include "cnst.h" //#include "prot_fx.h" #include "rom_com.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------* diff --git a/lib_enc/mdct_selector_fx.c b/lib_enc/mdct_selector_fx.c index 88b3d1f04..bb9de2fb9 100644 --- a/lib_enc/mdct_selector_fx.c +++ b/lib_enc/mdct_selector_fx.c @@ -7,7 +7,7 @@ #include "cnst.h" //#include "prot_fx.h" #include "rom_com.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-----------------------------------------------------------------* diff --git a/lib_enc/mslvq_enc_fx.c b/lib_enc/mslvq_enc_fx.c index c951eac70..c5a3e6bb7 100644 --- a/lib_enc/mslvq_enc_fx.c +++ b/lib_enc/mslvq_enc_fx.c @@ -9,7 +9,7 @@ #include "stl.h" #include "prot.h" /* Function prototypes */ #include "basop32.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/multi_harm_fx.c b/lib_enc/multi_harm_fx.c index 084f81c8f..2611fec4b 100644 --- a/lib_enc/multi_harm_fx.c +++ b/lib_enc/multi_harm_fx.c @@ -5,7 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_enc/nelp_enc_fx.c b/lib_enc/nelp_enc_fx.c index 6cd309d08..576a9ea20 100644 --- a/lib_enc/nelp_enc_fx.c +++ b/lib_enc/nelp_enc_fx.c @@ -32,9 +32,9 @@ #include #include "control.h" -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "rom_com.h" diff --git a/lib_enc/nois_est_fx.c b/lib_enc/nois_est_fx.c index bc5f2790f..bf4637666 100644 --- a/lib_enc/nois_est_fx.c +++ b/lib_enc/nois_est_fx.c @@ -8,7 +8,7 @@ #include "cnst.h" #include "rom_com.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_enc/noise_adjust_fx.c b/lib_enc/noise_adjust_fx.c index adfd407b7..1a2e204ae 100644 --- a/lib_enc/noise_adjust_fx.c +++ b/lib_enc/noise_adjust_fx.c @@ -6,7 +6,7 @@ #include "cnst.h" /* Common constants */ #include "rom_com_fx.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------* diff --git a/lib_enc/normalizecoefs_fx.c b/lib_enc/normalizecoefs_fx.c index 4fb461c65..f6f5eedee 100644 --- a/lib_enc/normalizecoefs_fx.c +++ b/lib_enc/normalizecoefs_fx.c @@ -6,7 +6,7 @@ #include "cnst.h" /* Common constants */ //#include "basop_mpy.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/peak_vq_enc_fx.c b/lib_enc/peak_vq_enc_fx.c index 37090b922..5a1fe61d1 100644 --- a/lib_enc/peak_vq_enc_fx.c +++ b/lib_enc/peak_vq_enc_fx.c @@ -10,7 +10,7 @@ #include "rom_enc.h" #include "rom_com_fx.h" #include "rom_com.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------------- diff --git a/lib_enc/pit_enc_fx.c b/lib_enc/pit_enc_fx.c index 9c1a80d6f..6bcf678a1 100644 --- a/lib_enc/pit_enc_fx.c +++ b/lib_enc/pit_enc_fx.c @@ -10,7 +10,7 @@ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_basop_util.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #define inv_T0_res InvIntTable diff --git a/lib_enc/pitch_ol2_fx.c b/lib_enc/pitch_ol2_fx.c index 73fdde952..f5352b75b 100644 --- a/lib_enc/pitch_ol2_fx.c +++ b/lib_enc/pitch_ol2_fx.c @@ -9,7 +9,7 @@ #include "rom_com.h" /* Encoder static table prototypes */ #include "rom_dec.h" //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/pitch_ol_fx.c b/lib_enc/pitch_ol_fx.c index 8a1a7c753..a43bdd82f 100644 --- a/lib_enc/pitch_ol_fx.c +++ b/lib_enc/pitch_ol_fx.c @@ -10,7 +10,7 @@ #include "rom_com_fx.h" #include "rom_com.h" #include "rom_enc.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-----------------------------------------------------------------* diff --git a/lib_enc/plc_enc_ext_fx.c b/lib_enc/plc_enc_ext_fx.c index 0a451f757..56598be2f 100644 --- a/lib_enc/plc_enc_ext_fx.c +++ b/lib_enc/plc_enc_ext_fx.c @@ -9,7 +9,7 @@ #include "stat_enc.h" //#include "prot_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/ppp_enc_fx.c b/lib_enc/ppp_enc_fx.c index 82657654c..bfe64e343 100644 --- a/lib_enc/ppp_enc_fx.c +++ b/lib_enc/ppp_enc_fx.c @@ -8,7 +8,7 @@ //#include "prot_fx.h" #include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/pre_proc_fx.c b/lib_enc/pre_proc_fx.c index 3cc9a733a..cfaea3113 100644 --- a/lib_enc/pre_proc_fx.c +++ b/lib_enc/pre_proc_fx.c @@ -8,7 +8,7 @@ #include "rom_com_fx.h" //#include "prot_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/pvq_core_enc_fx.c b/lib_enc/pvq_core_enc_fx.c index dce290b45..e87ae006f 100644 --- a/lib_enc/pvq_core_enc_fx.c +++ b/lib_enc/pvq_core_enc_fx.c @@ -8,7 +8,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/pvq_encode_fx.c b/lib_enc/pvq_encode_fx.c index 9faaf9ed5..1cee445e0 100644 --- a/lib_enc/pvq_encode_fx.c +++ b/lib_enc/pvq_encode_fx.c @@ -5,7 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "rom_com_fx.h" #include "rom_com.h" diff --git a/lib_enc/q_gain2p_fx.c b/lib_enc/q_gain2p_fx.c index a2f2c93da..8bfdcb588 100644 --- a/lib_enc/q_gain2p_fx.c +++ b/lib_enc/q_gain2p_fx.c @@ -10,7 +10,7 @@ #include "basop_util.h" #include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/qlpc_avq_fx.c b/lib_enc/qlpc_avq_fx.c index 1c28210ad..2740eac14 100644 --- a/lib_enc/qlpc_avq_fx.c +++ b/lib_enc/qlpc_avq_fx.c @@ -9,7 +9,7 @@ #include "cnst.h" //#include "prot_fx.h" #include "rom_com.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/qlpc_stoch_fx.c b/lib_enc/qlpc_stoch_fx.c index 042a7f9f3..dab87e3b3 100644 --- a/lib_enc/qlpc_stoch_fx.c +++ b/lib_enc/qlpc_stoch_fx.c @@ -11,7 +11,7 @@ #include "rom_com_fx.h" #include "rom_com.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" #include "rom_basop_util.h" diff --git a/lib_enc/range_enc_fx.c b/lib_enc/range_enc_fx.c index 4f8c5c905..b05b2cf99 100644 --- a/lib_enc/range_enc_fx.c +++ b/lib_enc/range_enc_fx.c @@ -9,7 +9,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/re8_cod_fx.c b/lib_enc/re8_cod_fx.c index e3c084c4b..e035baf57 100644 --- a/lib_enc/re8_cod_fx.c +++ b/lib_enc/re8_cod_fx.c @@ -5,7 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*------------------------------------------------------------------------ diff --git a/lib_enc/reordernorm_fx.c b/lib_enc/reordernorm_fx.c index ceb9d8d6f..40f12ffb8 100644 --- a/lib_enc/reordernorm_fx.c +++ b/lib_enc/reordernorm_fx.c @@ -8,7 +8,7 @@ #include "rom_com_fx.h" #include "rom_com.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------*/ diff --git a/lib_enc/rst_enc_fx.c b/lib_enc/rst_enc_fx.c index 938efc631..85821ef0b 100644 --- a/lib_enc/rst_enc_fx.c +++ b/lib_enc/rst_enc_fx.c @@ -7,7 +7,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "stl.h" diff --git a/lib_enc/scale_enc_fx.c b/lib_enc/scale_enc_fx.c index 22e79e310..cfb3568bb 100644 --- a/lib_enc/scale_enc_fx.c +++ b/lib_enc/scale_enc_fx.c @@ -6,7 +6,7 @@ #include "cnst.h" /* Common constants */ #include "rom_com_fx.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "stl.h" diff --git a/lib_enc/set_impulse_fx.c b/lib_enc/set_impulse_fx.c index 7243d9a72..f9efcacca 100644 --- a/lib_enc/set_impulse_fx.c +++ b/lib_enc/set_impulse_fx.c @@ -7,7 +7,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-----------------------------------------------------------------* diff --git a/lib_enc/setmodeindex_fx.c b/lib_enc/setmodeindex_fx.c index 2a2fcf7e9..dff13ec89 100644 --- a/lib_enc/setmodeindex_fx.c +++ b/lib_enc/setmodeindex_fx.c @@ -8,7 +8,7 @@ #include "cnst.h" #include "rom_com_fx.h" #include "rom_enc.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*--------------------------------------------------------------------------- diff --git a/lib_enc/sig_clas_fx.c b/lib_enc/sig_clas_fx.c index a80f2865f..a0ef0caf4 100644 --- a/lib_enc/sig_clas_fx.c +++ b/lib_enc/sig_clas_fx.c @@ -7,7 +7,7 @@ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*---------------------------------------------------------------------* diff --git a/lib_enc/spec_center_fx.c b/lib_enc/spec_center_fx.c index 5c088ca97..920da568d 100644 --- a/lib_enc/spec_center_fx.c +++ b/lib_enc/spec_center_fx.c @@ -8,7 +8,7 @@ #include "vad_basop.h" //#include "prot_fx.h" #include "rom_enc.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/spec_flatness_fx.c b/lib_enc/spec_flatness_fx.c index 33337bb7a..271f7ba1b 100644 --- a/lib_enc/spec_flatness_fx.c +++ b/lib_enc/spec_flatness_fx.c @@ -9,7 +9,7 @@ #include "basop_util.h" #include "vad_basop.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/speech_music_classif.c b/lib_enc/speech_music_classif.c index 38fc00649..8df503bd1 100644 --- a/lib_enc/speech_music_classif.c +++ b/lib_enc/speech_music_classif.c @@ -136,8 +136,8 @@ void speech_music_clas_init( { hSpMusClas->prev_FV[i] = 0.5f * hout_intervals[2 * i] + 0.5f * hout_intervals[2 * i + 1]; #ifdef IVAS_FLOAT_FIXED - hSpMusClas->prev_FV_fx[i] =( Word32)( hSpMusClas->prev_FV[i] * ONE_IN_Q20 ); - #endif + hSpMusClas->prev_FV_fx[i] = (Word32) ( hSpMusClas->prev_FV[i] * ONE_IN_Q20 ); +#endif } for ( i = 0; i < NB_BANDS_SPMUS; i++ ) diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index cfb9ac57c..1606ba3d7 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -11,7 +11,7 @@ #include "rom_com_fx.h" #include "rom_com.h" #include "stl.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED #include @@ -3021,7 +3021,7 @@ static void flux_fx( #ifdef BASOP_NOGLOB L_flux = L_add_sat( L_flux, abs_s( sub_sat( Bin_E[i], old_Bin_E[i] ) ) ); /*Q7 */ #else - L_flux = L_add( L_flux, abs_s( sub( Bin_E[i], old_Bin_E[i] ) ) ); /*Q7 */ + L_flux = L_add( L_flux, abs_s( sub( Bin_E[i], old_Bin_E[i] ) ) ); /*Q7 */ #endif } if ( p2v_map[i] != 0 ) diff --git a/lib_enc/stat_noise_uv_enc_fx.c b/lib_enc/stat_noise_uv_enc_fx.c index c5d2d15c6..809f4e5b3 100644 --- a/lib_enc/stat_noise_uv_enc_fx.c +++ b/lib_enc/stat_noise_uv_enc_fx.c @@ -8,7 +8,7 @@ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*======================================================================*/ diff --git a/lib_enc/subband_fft_fx.c b/lib_enc/subband_fft_fx.c index 66c55d586..e5ffd49a6 100644 --- a/lib_enc/subband_fft_fx.c +++ b/lib_enc/subband_fft_fx.c @@ -9,7 +9,7 @@ #include "vad_basop.h" //#include "prot_fx.h" #include "rom_enc.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*---------------------------------------------------------------------* diff --git a/lib_enc/swb_bwe_enc_fx.c b/lib_enc/swb_bwe_enc_fx.c index 5ee7f2313..9cd165b8d 100644 --- a/lib_enc/swb_bwe_enc_fx.c +++ b/lib_enc/swb_bwe_enc_fx.c @@ -10,7 +10,7 @@ #include "rom_com_fx.h" #include "rom_com.h" #include "stl.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*---------------------------------------------------------------------* diff --git a/lib_enc/swb_bwe_enc_hr_fx.c b/lib_enc/swb_bwe_enc_hr_fx.c index 60526314e..094ad37fa 100644 --- a/lib_enc/swb_bwe_enc_hr_fx.c +++ b/lib_enc/swb_bwe_enc_hr_fx.c @@ -9,7 +9,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/swb_bwe_enc_lr_fx.c b/lib_enc/swb_bwe_enc_lr_fx.c index 3a8b23845..8cca1104c 100644 --- a/lib_enc/swb_bwe_enc_lr_fx.c +++ b/lib_enc/swb_bwe_enc_lr_fx.c @@ -32,7 +32,7 @@ #include #include "options.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "rom_com.h" #include "enh32.h" diff --git a/lib_enc/swb_pre_proc_fx.c b/lib_enc/swb_pre_proc_fx.c index 7650141b6..463f0a96a 100644 --- a/lib_enc/swb_pre_proc_fx.c +++ b/lib_enc/swb_pre_proc_fx.c @@ -9,7 +9,7 @@ #include "rom_com_fx.h" #include "rom_com.h" #include "stl.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index b34283381..c86d5c97c 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -9,7 +9,7 @@ //#include "prot_fx.h" #include "rom_com_fx.h" #include "rom_com.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "stl.h" diff --git a/lib_enc/tcq_core_enc_fx.c b/lib_enc/tcq_core_enc_fx.c index 1855527d1..29ea322b6 100644 --- a/lib_enc/tcq_core_enc_fx.c +++ b/lib_enc/tcq_core_enc_fx.c @@ -8,7 +8,7 @@ //#include "prot_fx.h" #include "rom_com.h" #include "ivas_error.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ ivas_error tcq_core_LR_enc_fx( diff --git a/lib_enc/tcx_ltp_enc_fx.c b/lib_enc/tcx_ltp_enc_fx.c index 7a791ef7e..32e44d84a 100644 --- a/lib_enc/tcx_ltp_enc_fx.c +++ b/lib_enc/tcx_ltp_enc_fx.c @@ -10,7 +10,7 @@ #include "basop_util.h" #include "rom_com_fx.h" #include "rom_com.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ static Word32 dot( const Word16 *X, const Word16 *Y, Word16 n ) diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index 8307c68d3..1ef5f0463 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -13,7 +13,7 @@ #include "rom_basop_util.h" #include "basop_util.h" #include "rom_com.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #define inv_int InvIntTable diff --git a/lib_enc/tfa_enc_fx.c b/lib_enc/tfa_enc_fx.c index 80b4cea6f..cfb48aaec 100644 --- a/lib_enc/tfa_enc_fx.c +++ b/lib_enc/tfa_enc_fx.c @@ -7,7 +7,7 @@ #include "basop_util.h" #include "cnst.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/tns_base_enc_fx.c b/lib_enc/tns_base_enc_fx.c index f1de8f802..b371381d5 100644 --- a/lib_enc/tns_base_enc_fx.c +++ b/lib_enc/tns_base_enc_fx.c @@ -13,7 +13,7 @@ #include "rom_com_fx.h" #include "rom_com.h" #include "prot.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #define HLM_MIN_NRG ( 32768.0f * 2 * NORM_MDCT_FACTOR / ( 640 * 640 ) ) diff --git a/lib_enc/transient_detection_fx.c b/lib_enc/transient_detection_fx.c index 5b40d7c1b..c57facc67 100644 --- a/lib_enc/transient_detection_fx.c +++ b/lib_enc/transient_detection_fx.c @@ -12,7 +12,7 @@ #include #include #include -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /* Exponent of attack threshold. Picked according to current threshold values. */ diff --git a/lib_enc/transition_enc_fx.c b/lib_enc/transition_enc_fx.c index 32a510946..96b672985 100644 --- a/lib_enc/transition_enc_fx.c +++ b/lib_enc/transition_enc_fx.c @@ -8,7 +8,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "rom_com.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-----------------------------------------------------------------* diff --git a/lib_enc/update_decision_fx.c b/lib_enc/update_decision_fx.c index 91170ece1..c161ac256 100644 --- a/lib_enc/update_decision_fx.c +++ b/lib_enc/update_decision_fx.c @@ -8,7 +8,7 @@ #include "basop_util.h" #include "vad_basop.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* * bg_music_decision_fx() diff --git a/lib_enc/updt_enc_fx.c b/lib_enc/updt_enc_fx.c index 97e704a5f..1b153f387 100644 --- a/lib_enc/updt_enc_fx.c +++ b/lib_enc/updt_enc_fx.c @@ -7,7 +7,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/updt_tar_fx.c b/lib_enc/updt_tar_fx.c index b6c2a166c..d62daff20 100644 --- a/lib_enc/updt_tar_fx.c +++ b/lib_enc/updt_tar_fx.c @@ -5,7 +5,7 @@ #include "options.h" /* Compilation switches */ #include "cnst.h" //#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*----------------------------------------------------------------------------------* diff --git a/lib_enc/vad_basop_fx.c b/lib_enc/vad_basop_fx.c index 9114554c7..f8f528c0e 100644 --- a/lib_enc/vad_basop_fx.c +++ b/lib_enc/vad_basop_fx.c @@ -5,7 +5,7 @@ #include #include "options.h" //#include "prot_fx.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "vad_basop.h" #include "basop_util.h" diff --git a/lib_enc/vad_fx.c b/lib_enc/vad_fx.c index 3a04fb947..d0356f518 100644 --- a/lib_enc/vad_fx.c +++ b/lib_enc/vad_fx.c @@ -6,7 +6,7 @@ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ #include "rom_enc.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ diff --git a/lib_enc/vad_param_updt_fx.c b/lib_enc/vad_param_updt_fx.c index 0466916ac..f1eb9b031 100644 --- a/lib_enc/vad_param_updt_fx.c +++ b/lib_enc/vad_param_updt_fx.c @@ -7,7 +7,7 @@ #include "cnst.h" /* Common constants */ //#include "prot_fx.h" /* Function prototypes */ #include "ivas_stat_enc.h" /* Function prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/vad_proc_fx.c b/lib_enc/vad_proc_fx.c index 3592b12f6..cf235d96d 100644 --- a/lib_enc/vad_proc_fx.c +++ b/lib_enc/vad_proc_fx.c @@ -12,7 +12,7 @@ #include "stat_enc.h" #include "rom_enc.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_enc/vbr_average_rate_fx.c b/lib_enc/vbr_average_rate_fx.c index 9eb3d12b2..fe5766eea 100644 --- a/lib_enc/vbr_average_rate_fx.c +++ b/lib_enc/vbr_average_rate_fx.c @@ -9,7 +9,7 @@ #include "rom_com_fx.h" /* Static table prototypes */ #include "stat_enc.h" /* Static table prototypes */ #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/vlpc_1st_cod_fx.c b/lib_enc/vlpc_1st_cod_fx.c index 120a927f5..cc9592739 100644 --- a/lib_enc/vlpc_1st_cod_fx.c +++ b/lib_enc/vlpc_1st_cod_fx.c @@ -9,7 +9,7 @@ //#include "prot_fx.h" #include "rom_com_fx.h" #include "rom_com.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #define ISF_ONE 3 /*1.0f*1.28f Q1*/ /*=1.0f in 14Q1*1.28*/ diff --git a/lib_enc/vlpc_2st_cod_fx.c b/lib_enc/vlpc_2st_cod_fx.c index 7553f8d1c..0785e9e6e 100644 --- a/lib_enc/vlpc_2st_cod_fx.c +++ b/lib_enc/vlpc_2st_cod_fx.c @@ -8,7 +8,7 @@ #include "options.h" //#include "prot_fx.h" #include "control.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" diff --git a/lib_enc/voiced_enc_fx.c b/lib_enc/voiced_enc_fx.c index 5cd8c3ef1..0e3d7b20b 100644 --- a/lib_enc/voiced_enc_fx.c +++ b/lib_enc/voiced_enc_fx.c @@ -8,7 +8,7 @@ //#include "prot_fx.h" #include "rom_com_fx.h" #include "rom_com.h" /* Common constants */ -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ diff --git a/lib_enc/waveadjust_fec_cod_fx.c b/lib_enc/waveadjust_fec_cod_fx.c index 92056c0c3..378898522 100644 --- a/lib_enc/waveadjust_fec_cod_fx.c +++ b/lib_enc/waveadjust_fec_cod_fx.c @@ -9,7 +9,7 @@ #include "rom_com_fx.h" #include "rom_com.h" #include "stat_com.h" -#include "prot_fx.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index f94e5a58a..e9c76787d 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -3142,7 +3142,7 @@ static ivas_error ivas_rend_crendConvolver( } } - offset = imult1616( hCrend->delay_line_rw_index, subframe_length ); /* subframe_length * ( pCrend->hHrtfCrend->max_num_iterations - 1 ); */ + offset = imult1616( hCrend->delay_line_rw_index, subframe_length ); /* subframe_length * ( pCrend->hHrtfCrend->max_num_iterations - 1 ); */ offset_diffuse = imult1616( hCrend->diffuse_delay_line_rw_index, subframe_length ); /* subframe_length *( pCrend->hHrtfCrend->num_iterations_diffuse[0] - 1 ); */ IF( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 39640f699..590704a99 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -1411,7 +1411,7 @@ static void ivas_dirac_dec_binaural_internal_fx( q_cldfb[ch][slot] = q_input; move16(); cldfbAnalysis_ts_fx_fixed_q( - &( st_ivas->hTcBuffer->tc_fx[ch][add(imult1616(nBins , slot) , offsetSamples)] ), + &( st_ivas->hTcBuffer->tc_fx[ch][add( imult1616( nBins, slot ), offsetSamples )] ), Cldfb_RealBuffer_in_fx[ch][slot], Cldfb_ImagBuffer_in_fx[ch][slot], nBins, st_ivas->cldfbAnaDec[ch], &q_cldfb[ch][slot] ); @@ -2890,7 +2890,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric e = 0; move16(); hDiracDecBin->frameMeanDiffuseness_fx[bin] = BASOP_Util_Divide3232_Scale( hDiracDecBin->frameMeanDiffuseness_fx[bin], L_max( EPSILLON_FX, frameMeanDiffusenessEneWeight_fx[bin] ), &e ); - hDiracDecBin->frameMeanDiffuseness_fx[bin] = L_shl( hDiracDecBin->frameMeanDiffuseness_fx[bin], add(14 , e) ); // Q29 + hDiracDecBin->frameMeanDiffuseness_fx[bin] = L_shl( hDiracDecBin->frameMeanDiffuseness_fx[bin], add( 14, e ) ); // Q29 move32(); move32(); } @@ -5283,8 +5283,8 @@ static void eig2x2_fx( } } - IF ( q_U_1 != 0 ) - *q_U = q_U_1; + IF( q_U_1 != 0 ) + *q_U = q_U_1; ELSE *q_U = q_U_2; move16(); diff --git a/lib_rend/ivas_dirac_decorr_dec.c b/lib_rend/ivas_dirac_decorr_dec.c index d37a961cf..d1f758fe8 100644 --- a/lib_rend/ivas_dirac_decorr_dec.c +++ b/lib_rend/ivas_dirac_decorr_dec.c @@ -953,19 +953,19 @@ void ivas_dirac_dec_decorr_process_fx( /* check handles */ test(); - if( h_freq_domain_decorr_ap_params == NULL || h_freq_domain_decorr_ap_state == NULL ) + if ( h_freq_domain_decorr_ap_params == NULL || h_freq_domain_decorr_ap_state == NULL ) { return; } /* check input data */ - if( input_frame_fx == NULL ) + if ( input_frame_fx == NULL ) { return; } /* check result arrays */ - if( frame_dec_fx == NULL ) + if ( frame_dec_fx == NULL ) { return; } @@ -1045,7 +1045,7 @@ void ivas_dirac_dec_decorr_process_fx( IF( NE_16( q_temp, q_onset_dec ) ) { - FOR( Word16 i = 0; i < imult1616(num_protos_diff , max_band_decorr_temp); i++ ) + FOR( Word16 i = 0; i < imult1616( num_protos_diff, max_band_decorr_temp ); i++ ) { h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2_fx[i] = L_shr( h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_2_fx[i], sub( q_onset_dec, q_temp ) ); h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1_fx[i] = L_shr( h_freq_domain_decorr_ap_state->h_onset_detection_power_state.onset_detector_1_fx[i], sub( q_onset_dec, q_temp ) ); @@ -1055,7 +1055,7 @@ void ivas_dirac_dec_decorr_process_fx( } IF( NE_16( q_temp, q_aux_buffer ) ) { - FOR( Word16 i = 0; i < shl( imult1616(num_protos_diff , max_band_decorr_temp),1); i++ ) + FOR( Word16 i = 0; i < shl( imult1616( num_protos_diff, max_band_decorr_temp ), 1 ); i++ ) { aux_buffer_fx[i] = L_shr( aux_buffer_fx[i], sub( q_aux_buffer, q_temp ) ); move32(); @@ -1132,7 +1132,7 @@ void ivas_dirac_dec_decorr_process_fx( q_shift = getScaleFactor32( aux_buffer_fx, imult1616( imult1616( 2, num_protos_dir ), max_band_decorr_temp ) ); - FOR( Word16 j = 0; j < shl( imult1616(num_protos_dir , max_band_decorr_temp),1); j++ ) + FOR( Word16 j = 0; j < shl( imult1616( num_protos_dir, max_band_decorr_temp ), 1 ); j++ ) { aux_buffer_fx[j] = L_shl( aux_buffer_fx[j], q_shift ); move32(); @@ -1292,7 +1292,7 @@ void ivas_dirac_dec_decorr_process_fx( } } - FOR( Word16 i = 0; i < shl(imult1616(num_channels , max_band_decorr),1); i++ ) + FOR( Word16 i = 0; i < shl( imult1616( num_channels, max_band_decorr ), 1 ); i++ ) { aux_buffer_fx[i] = W_extract_h( W_shl( aux_64[i], sub( norm, find_guarded_bits_fx( 2 ) ) ) ); move32(); @@ -1491,13 +1491,13 @@ void ivas_dirac_dec_decorr_close_fx( *-----------------------------------------------------------------*/ test(); - if( ph_freq_domain_decorr_ap_params == NULL || ph_freq_domain_decorr_ap_state == NULL ) + if ( ph_freq_domain_decorr_ap_params == NULL || ph_freq_domain_decorr_ap_state == NULL ) { return; } test(); - if( *ph_freq_domain_decorr_ap_params == NULL || *ph_freq_domain_decorr_ap_state == NULL ) + if ( *ph_freq_domain_decorr_ap_params == NULL || *ph_freq_domain_decorr_ap_state == NULL ) { return; } diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 4d8b2e9bc..557105d43 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -2451,7 +2451,7 @@ ivas_error ivas_reverb_open_fx( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Reverberator " ); } - IF( NE_32(( error = set_base_config_fx( ¶ms, output_Fs ) ) , IVAS_ERR_OK) ) + IF( NE_32( ( error = set_base_config_fx( ¶ms, output_Fs ) ), IVAS_ERR_OK ) ) { return error; } @@ -2542,7 +2542,7 @@ ivas_error ivas_reverb_open_fx( /* set up jot reverb 60 filters - must be set up after set_reverb_acoustic_data() */ - IF( NE_32(( error = compute_t60_coeffs_fx( ¶ms, nr_fc_fft_filter, output_Fs ) ) , IVAS_ERR_OK) ) + IF( NE_32( ( error = compute_t60_coeffs_fx( ¶ms, nr_fc_fft_filter, output_Fs ) ), IVAS_ERR_OK ) ) { return error; } @@ -2590,7 +2590,7 @@ ivas_error ivas_reverb_open_fx( move16(); /* clear & init jot reverb fft filters */ - IF( NE_32(( error = initialize_reverb_filters_fx( pState ) ) , IVAS_ERR_OK) ) + IF( NE_32( ( error = initialize_reverb_filters_fx( pState ) ), IVAS_ERR_OK ) ) { return error; } -- GitLab From ad02ddd1f77db8044cec30937b541c441bba758b Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 18 Jul 2024 15:26:42 +0530 Subject: [PATCH 082/110] Remove redundant members pitch_fx and pstreaklen_fx from encoder state structure --- lib_com/lsf_tools_fx.c | 4 +-- lib_enc/acelp_core_enc_fx.c | 2 +- lib_enc/acelp_core_switch_enc_fx.c | 4 +-- lib_enc/amr_wb_enc_fx.c | 6 ++--- lib_enc/cod_ace_fx.c | 2 +- lib_enc/core_enc_2div_fx.c | 2 +- lib_enc/core_enc_ol_fx.c | 12 ++++----- lib_enc/enc_amr_wb_fx.c | 2 +- lib_enc/enc_gen_voic_fx.c | 2 +- lib_enc/enc_pit_exc_fx.c | 2 +- lib_enc/enc_ppp_fx.c | 2 +- lib_enc/evs_enc_fx.c | 4 +-- lib_enc/ext_sig_ana_fx.c | 4 +-- lib_enc/init_enc_fx.c | 4 +-- lib_enc/ivas_front_vad.c | 2 +- lib_enc/lsf_enc_fx.c | 40 +++++++++++++++--------------- lib_enc/nois_est_fx.c | 4 +-- lib_enc/ppp_enc_fx.c | 2 +- lib_enc/pre_proc_fx.c | 32 ++++++++++++------------ lib_enc/sig_clas_fx.c | 2 +- lib_enc/speech_music_classif_fx.c | 20 +++++++-------- lib_enc/stat_enc.h | 26 +++++++++---------- lib_enc/transition_enc_fx.c | 6 ++--- lib_enc/vad_param_updt_fx.c | 6 ++--- 24 files changed, 96 insertions(+), 96 deletions(-) diff --git a/lib_com/lsf_tools_fx.c b/lib_com/lsf_tools_fx.c index c3a5fc40e..5b6b612ca 100644 --- a/lib_com/lsf_tools_fx.c +++ b/lib_com/lsf_tools_fx.c @@ -2865,7 +2865,7 @@ void lsf_syn_mem_backup_fx( move16(); *streaklimit = st_fx->streaklimit_fx; move16(); - *pstreaklen = st_fx->pstreaklen_fx; + *pstreaklen = st_fx->pstreaklen; move16(); FOR( i = 0; i < L_FFT; i++ ) @@ -3005,7 +3005,7 @@ void lsf_syn_mem_restore_fx( move16(); st_fx->streaklimit_fx = streaklimit; move16(); - st_fx->pstreaklen_fx = pstreaklen; + st_fx->pstreaklen = pstreaklen; move16(); FOR( i = 0; i < L_FFT; i++ ) diff --git a/lib_enc/acelp_core_enc_fx.c b/lib_enc/acelp_core_enc_fx.c index fb993c10a..def676aa0 100644 --- a/lib_enc/acelp_core_enc_fx.c +++ b/lib_enc/acelp_core_enc_fx.c @@ -527,7 +527,7 @@ ivas_error acelp_core_enc_fx( IF( EQ_16( st_fx->coder_type, TRANSITION ) ) { - tc_classif_enc_fx( Q_new, st_fx->L_frame, &tc_subfr_fx, &position, attack_flag, st_fx->pitch_fx[0], res_fx ); + tc_classif_enc_fx( Q_new, st_fx->L_frame, &tc_subfr_fx, &position, attack_flag, st_fx->pitch[0], res_fx ); config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, tc_subfr_fx, 1, NULL, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, diff --git a/lib_enc/acelp_core_switch_enc_fx.c b/lib_enc/acelp_core_switch_enc_fx.c index 994fe70a9..f2558851b 100644 --- a/lib_enc/acelp_core_switch_enc_fx.c +++ b/lib_enc/acelp_core_switch_enc_fx.c @@ -62,9 +62,9 @@ void acelp_core_switch_enc_fx( Copy( st_fx->old_Aq_12_8_fx, Aq, M + 1 ); Copy( st_fx->old_Aq_12_8_fx, Aq + ( M + 1 ), M + 1 ); - T_op[0] = st_fx->pitch_fx[0]; + T_op[0] = st_fx->pitch[0]; move16(); - T_op[1] = st_fx->pitch_fx[1]; + T_op[1] = st_fx->pitch[1]; move16(); /*----------------------------------------------------------------* diff --git a/lib_enc/amr_wb_enc_fx.c b/lib_enc/amr_wb_enc_fx.c index b4b011b35..8edf03a4c 100644 --- a/lib_enc/amr_wb_enc_fx.c +++ b/lib_enc/amr_wb_enc_fx.c @@ -399,7 +399,7 @@ void amr_wb_enc_fx( /* reset the OL pitch tracker memories during inactive frames */ pitch_ol_init_fx( &st->old_thres_fx, &st->old_pitch, &st->delta_pit, &st->old_corr_fx ); } - old_pitch1 = st->pitch_fx[1]; + old_pitch1 = st->pitch[1]; move16(); analy_lp_AMR_WB_fx( inp, &ener, A, epsP_h, epsP_l, isp_new, st->lsp_old1_fx, isf_new, st->old_pitch_la, st->old_voicing_la, Q_new, Q_r ); @@ -421,8 +421,8 @@ void amr_wb_enc_fx( shift = -1; move16(); } - pitch_ol_fx( st->pitch_fx, st->voicing_fx, &st->old_pitch, &st->old_corr_fx, corr_shift, &st->old_thres_fx, &st->delta_pit, st->old_wsp2_fx, wsp, st->mem_decim2_fx, relE, 0, st->bwidth, st->Opt_SC_VBR ); - st->old_pitch_la = st->pitch_fx[2]; + pitch_ol_fx( st->pitch, st->voicing_fx, &st->old_pitch, &st->old_corr_fx, corr_shift, &st->old_thres_fx, &st->delta_pit, st->old_wsp2_fx, wsp, st->mem_decim2_fx, relE, 0, st->bwidth, st->Opt_SC_VBR ); + st->old_pitch_la = st->pitch[2]; move16(); st->old_voicing_la = st->voicing_fx[2]; move16(); diff --git a/lib_enc/cod_ace_fx.c b/lib_enc/cod_ace_fx.c index f816a7cd8..efa0e0d4c 100644 --- a/lib_enc/cod_ace_fx.c +++ b/lib_enc/cod_ace_fx.c @@ -239,7 +239,7 @@ Word16 coder_acelp_fx( /* o : SEGSNR for CL decision * { /* Adaptive Codebook (GC and VC) */ - Mode2_pit_encode_fx( acelp_cfg->ltp_mode, i_subfr, &prm, &exc[i_subfr], st->pitch_fx, &T0_min, &T0_min_frac, &T0_max, &T0_max_frac, + Mode2_pit_encode_fx( acelp_cfg->ltp_mode, i_subfr, &prm, &exc[i_subfr], st->pitch, &T0_min, &T0_min_frac, &T0_max, &T0_max_frac, &T0, &T0_frac, &T0_res, h1, xn, st->pit_min, st->pit_fr1, st->pit_fr1b, st->pit_fr2, st->pit_max, st->pit_res_max ); E_ACELP_adaptive_codebook( exc, T0, T0_frac, T0_res, st->pit_res_max, acelp_cfg->ltf_mode, i_subfr, L_SUBFR, L_frame, h1, clip_gain, xn, diff --git a/lib_enc/core_enc_2div_fx.c b/lib_enc/core_enc_2div_fx.c index 42236eaf8..f0527f0eb 100644 --- a/lib_enc/core_enc_2div_fx.c +++ b/lib_enc/core_enc_2div_fx.c @@ -78,7 +78,7 @@ void core_encode_twodiv_fx( FOR( i = 0; i < 3; i++ ) { move16(); - T_op[i] = st->pitch_fx[i]; + T_op[i] = st->pitch[i]; /* check minimum pitch for quantization */ IF( LT_16( T_op[i], PIT_MIN_SHORTER ) ) diff --git a/lib_enc/core_enc_ol_fx.c b/lib_enc/core_enc_ol_fx.c index 781cfe1a5..4fe990ccb 100644 --- a/lib_enc/core_enc_ol_fx.c +++ b/lib_enc/core_enc_ol_fx.c @@ -429,7 +429,7 @@ void core_encode_openloop_fx( /* Update ACELP quantizer state */ lsf_update_memory( st->narrowBand, st->lsf_old_fx, st->mem_MA_fx, st->mem_MA_fx, M ); - st->pstreaklen_fx = 0; + st->pstreaklen = 0; st->streaklimit_fx = 32767; /* check resonance for pitch clipping algorithm */ gp_clip_test_lsf_fx( st->element_mode, st->lsf_old_fx, st->clip_var_fx, 0 ); @@ -612,7 +612,7 @@ void core_encode_openloop_fx( IF( NE_16( hRF->rf_frame_type, RF_NO_DATA ) ) { /* coder_acelp_rf_fx does the partial copy encoding based on the rf frame type chosen for the RF encoding */ - coder_acelp_rf_fx( &( hRF->acelp_cfg_rf ), coder_type, Aw, Aq_rf, st->speech_enc_pe, st->voicing_fx, st->pitch_fx, + coder_acelp_rf_fx( &( hRF->acelp_cfg_rf ), coder_type, Aw, Aq_rf, st->speech_enc_pe, st->voicing_fx, st->pitch, stab_fac_rf, st, hRF->rf_target_bits, hRF->rf_frame_type, exc_rf, syn_rf, Q_new, shift ); } } @@ -823,7 +823,7 @@ void core_acelp_tcx20_switching_fx( /* Check minimum pitch for quantization */ FOR( i = 0; i < 3; i++ ) { - tmp16 = st->pitch_fx[i]; + tmp16 = st->pitch[i]; move16(); /* check minimum pitch for quantization */ if ( LT_16( tmp16, PIT_MIN_SHORTER ) ) @@ -838,12 +838,12 @@ void core_acelp_tcx20_switching_fx( /*pitch[i] = (short)(pitch[i] * 1.25f + 0.5f);*/ tmp16 = add( tmp16, s ); } - st->pitch_fx[i] = tmp16; + st->pitch[i] = tmp16; move16(); } IF( st->narrowBand != 0 ) { - pitchDoubling_det_fx( st->wspeech_enc, st->pitch_fx, pitch_fr, voicing_fr ); + pitchDoubling_det_fx( st->wspeech_enc, st->pitch, pitch_fr, voicing_fr ); } E_LPC_f_lsp_a_conversion( lsp_mid, A_q_tcx, M ); @@ -859,7 +859,7 @@ void core_acelp_tcx20_switching_fx( st->speech_enc + st->encoderLookahead_enc, hTcxEnc->speech_ltp + st->encoderLookahead_enc, st->wspeech_enc + st->encoderLookahead_enc, - st->pitch_fx[1], + st->pitch[1], hTcxEnc->tcxltp_param, &hTcxEnc->tcxltp_bits, &hTcxEnc->tcxltp_pitch_int, diff --git a/lib_enc/enc_amr_wb_fx.c b/lib_enc/enc_amr_wb_fx.c index 9e9bbfcc1..5d5ee6c48 100644 --- a/lib_enc/enc_amr_wb_fx.c +++ b/lib_enc/enc_amr_wb_fx.c @@ -89,7 +89,7 @@ void encod_amr_wb_fx( pt_pitch = pitch_buf; shift_wsp = add( Q_new, shift ); - Copy( st->pitch_fx, T_op, 2 ); + Copy( st->pitch, T_op, 2 ); if ( LE_16( T_op[0], PIT_MIN ) ) { T_op[0] = shl( T_op[0], 1 ); diff --git a/lib_enc/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index a9699855e..8b7d12fba 100644 --- a/lib_enc/enc_gen_voic_fx.c +++ b/lib_enc/enc_gen_voic_fx.c @@ -199,7 +199,7 @@ void encod_gen_voic_fx( Scale_sig( xn_fx, L_SUBFR, shift ); *pt_pitch_fx = pit_encode_fx( hBstr, st_fx->acelp_cfg.pitch_bits, st_fx->core_brate, 0, L_frame, st_fx->coder_type, &pitch_limit_flag, i_subfr_fx, exc_fx, - L_SUBFR, st_fx->pitch_fx, &T0_min_fx, &T0_max_fx, &T0_fx, &T0_frac_fx, h1_fx, xn_fx, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + L_SUBFR, st_fx->pitch, &T0_min_fx, &T0_max_fx, &T0_fx, &T0_frac_fx, h1_fx, xn_fx, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); tbe_celp_exc( L_frame, i_subfr_fx, T0_fx, T0_frac_fx, &error_fx, bwe_exc_fx ); diff --git a/lib_enc/enc_pit_exc_fx.c b/lib_enc/enc_pit_exc_fx.c index ff8fe3c32..6385420fe 100644 --- a/lib_enc/enc_pit_exc_fx.c +++ b/lib_enc/enc_pit_exc_fx.c @@ -265,7 +265,7 @@ void enc_pit_exc_fx( * Adaptive exc. construction *----------------------------------------------------------------*/ *pt_pitch = pit_encode_fx( hBstr, st_fx->acelp_cfg.pitch_bits, Pitch_BR, 0, st_fx->L_frame, Pitch_CT, &pitch_limit_flag, i_subfr, exc, - L_subfr, st_fx->pitch_fx, &T0_min, &T0_max, T0, T0_frac, h1, xn, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + L_subfr, st_fx->pitch, &T0_min, &T0_max, T0, T0_frac, h1, xn, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); /*-----------------------------------------------------------------* * Find adaptive exitation *-----------------------------------------------------------------*/ diff --git a/lib_enc/enc_ppp_fx.c b/lib_enc/enc_ppp_fx.c index d76ed191f..1070bcc49 100644 --- a/lib_enc/enc_ppp_fx.c +++ b/lib_enc/enc_ppp_fx.c @@ -125,7 +125,7 @@ ivas_error encod_ppp_fx( /* last frame-end lpc and curr frame-end lpc */ IF( ( error = ppp_voiced_encoder_fx( hBstr, hSC_VBR, st_fx->bwidth, st_fx->last_coder_type_raw, st_fx->old_pitch_buf_fx, res_fx, - excQ_ppp_fx, st_fx->pitch_fx[1], LPC_de_old_fx, LPC_de_curr_fx, exc_fx, pitch_fx, Q_new ) ) != IVAS_ERR_OK ) + excQ_ppp_fx, st_fx->pitch[1], LPC_de_old_fx, LPC_de_curr_fx, exc_fx, pitch_fx, Q_new ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/evs_enc_fx.c b/lib_enc/evs_enc_fx.c index f75547599..92cb87000 100644 --- a/lib_enc/evs_enc_fx.c +++ b/lib_enc/evs_enc_fx.c @@ -300,7 +300,7 @@ ivas_error evs_enc_fx( #ifndef FIX_I4_OL_PITCH IF( EQ_16( st->core, HQ_CORE ) ) { - Copy( pitch_orig, st->pitch_fx, 3 ); /* original open-loop pitch values might be altered in core_acelp_tcx20_switching_fx() */ + Copy( pitch_orig, st->pitch, 3 ); /* original open-loop pitch values might be altered in core_acelp_tcx20_switching_fx() */ } #endif } @@ -327,7 +327,7 @@ ivas_error evs_enc_fx( bwe_exc_extended, voice_factors, pitch_buf, vad_hover_flag, &Q_new, &shift ); #ifndef FIX_I4_OL_PITCH - Copy( pitch_orig, st->pitch_fx, 3 ); /* populate the original OL pitch values back */ + Copy( pitch_orig, st->pitch, 3 ); /* populate the original OL pitch values back */ #endif /*---------------------------------------------------------------------* diff --git a/lib_enc/ext_sig_ana_fx.c b/lib_enc/ext_sig_ana_fx.c index bb8307850..f4c60b16f 100644 --- a/lib_enc/ext_sig_ana_fx.c +++ b/lib_enc/ext_sig_ana_fx.c @@ -174,9 +174,9 @@ void core_signal_analysis_high_bitrate_fx( { lsp[0] = lsp_new; lsp[1] = lsp_mid; - alw_pitch_lag_12k8[0] = st->pitch_fx[0]; + alw_pitch_lag_12k8[0] = st->pitch[0]; move16(); - alw_pitch_lag_12k8[1] = st->pitch_fx[1]; + alw_pitch_lag_12k8[1] = st->pitch[1]; move16(); alw_voicing[0] = st->voicing_fx[0]; move16(); diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index a38e19b71..7d1f55302 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -159,7 +159,7 @@ ivas_error init_encoder_fx( init_lvq_fx( st_fx->offset_scale1_fx, st_fx->offset_scale2_fx, st_fx->offset_scale1_p_fx, st_fx->offset_scale2_p_fx, st_fx->no_scales_fx, st_fx->no_scales_p_fx ); st_fx->next_force_safety_net_fx = 0; - st_fx->pstreaklen_fx = 0; + st_fx->pstreaklen = 0; move16(); st_fx->streaklimit_fx = 32767; move16(); /*1;//Q15 */ @@ -939,7 +939,7 @@ ivas_error init_encoder_fx( st_fx->low_rate_mode = 0; /* low-rate mode flag */ // st_fx->coder_type = GENERIC; /* low-rate mode flag */ - set16_fx( st_fx->pitch_fx, L_SUBFR, 3 ); + set16_fx( st_fx->pitch, L_SUBFR, 3 ); set16_fx( st_fx->voicing_fx, 0, 3 ); diff --git a/lib_enc/ivas_front_vad.c b/lib_enc/ivas_front_vad.c index 87ae69efe..6182cd730 100644 --- a/lib_enc/ivas_front_vad.c +++ b/lib_enc/ivas_front_vad.c @@ -769,7 +769,7 @@ ivas_error front_vad_spar( #if 0 vad_param_updt( st, corr_shift, corr_shift, A, st->pitch[1], &hFrontVad, 1 ); #else - mvr2r_Word16( st->pitch, st->pitch_fx, 3 ); + mvr2r_Word16( st->pitch, st->pitch, 3 ); corr_shift_fx = (Word16) floatToFixed( corr_shift, Q15 ); hFrontVad->hVAD->running_avg_fx = (Word16) floatToFixed( hFrontVad->hVAD->running_avg, Q15 ); hFrontVad->hVAD->ra_deltasum_fx = (Word16) floatToFixed( hFrontVad->hVAD->ra_deltasum, Q15 ); diff --git a/lib_enc/lsf_enc_fx.c b/lib_enc/lsf_enc_fx.c index 3a4632797..121de20db 100644 --- a/lib_enc/lsf_enc_fx.c +++ b/lib_enc/lsf_enc_fx.c @@ -1061,7 +1061,7 @@ void lsf_end_enc_fx( st->offset_scale1_fx, st->offset_scale2_fx, st->no_scales_fx, resq, lsfq ); safety_net = 1; move16(); - st->pstreaklen_fx = 0; + st->pstreaklen = 0; move16(); /* predictive LSF quantizer streak is ended with safety-net */ } ELSE IF( EQ_16( predmode, 1 ) ) /* only MA prediction */ @@ -1085,14 +1085,14 @@ void lsf_end_enc_fx( test(); test(); test(); - IF( ( ( GT_16( st->pstreaklen_fx, ( STREAKLEN + 3 ) ) ) && ( EQ_16( coder_type, VOICED ) ) ) || ( ( GT_16( st->pstreaklen_fx, ( STREAKLEN ) ) ) && ( NE_16( coder_type, VOICED ) ) ) ) + IF( ( ( GT_16( st->pstreaklen, ( STREAKLEN + 3 ) ) ) && ( EQ_16( coder_type, VOICED ) ) ) || ( ( GT_16( st->pstreaklen, ( STREAKLEN ) ) ) && ( NE_16( coder_type, VOICED ) ) ) ) { /* update the adaptive scaling factor to become smaller with increasing number of concecutive predictive frames. */ st->streaklimit_fx = mult( st->streaklimit_fx, STREAKMULT_FX ); move16(); } - IF( st->pstreaklen_fx == 0 ) + IF( st->pstreaklen == 0 ) { /* reset the consecutive AR-predictor multiplier */ st->streaklimit_fx = 32767; /*1.0 in Q15 */ @@ -1128,14 +1128,14 @@ void lsf_end_enc_fx( { /* Safety-net - BC-TCQ quantization : SN */ Err[0] = qlsf_ARSN_tcvq_Enc_16k_fx( Tmp, lsfq, TCQIdx0, wghts, sub( nBits, 1 ), safety_net ); - st->pstreaklen_fx = 0; + st->pstreaklen = 0; move16(); } ELSE { /* predictive - BC-TCQ quantization : AR */ Err[1] = qlsf_ARSN_tcvq_Enc_16k_fx( Tmp2, lsfq, TCQIdx0, wghts, sub( nBits, 1 ), safety_net ); - st->pstreaklen_fx = add( st->pstreaklen_fx, 1 ); + st->pstreaklen = add( st->pstreaklen, 1 ); } } /* all other frames (not VOICED@16kHz) */ @@ -1172,14 +1172,14 @@ void lsf_end_enc_fx( { safety_net = 1; move16(); - st->pstreaklen_fx = 0; + st->pstreaklen = 0; move16(); /* Reset the consecutive predictive frame counter */ } ELSE { safety_net = 0; move16(); /* Increase the consecutive predictive frame counter by one */ - st->pstreaklen_fx = add( st->pstreaklen_fx, 1 ); + st->pstreaklen = add( st->pstreaklen, 1 ); } } } @@ -1672,7 +1672,7 @@ void lsf_end_enc_ivas_fx( Err[0] = vq_lvq_lsf_enc_ivas_fx( 0, mode_lvq, Tmp, levels0, stages0, wghts, Idx0, lsf, pred0, resq, lsfq ); safety_net = 1; move16(); - st->pstreaklen_fx = 0; + st->pstreaklen = 0; move16(); /* predictive LSF quantizer streak is ended with safety-net */ } ELSE IF( EQ_16( predmode, 1 ) ) /* only MA prediction */ @@ -1704,14 +1704,14 @@ void lsf_end_enc_ivas_fx( test(); test(); test(); - IF( ( ( GT_16( st->pstreaklen_fx, ( STREAKLEN + 3 ) ) ) && ( EQ_16( coder_type, VOICED ) ) ) || ( ( GT_16( st->pstreaklen_fx, ( STREAKLEN ) ) ) && ( NE_16( coder_type, VOICED ) ) ) ) + IF( ( ( GT_16( st->pstreaklen, ( STREAKLEN + 3 ) ) ) && ( EQ_16( coder_type, VOICED ) ) ) || ( ( GT_16( st->pstreaklen, ( STREAKLEN ) ) ) && ( NE_16( coder_type, VOICED ) ) ) ) { /* update the adaptive scaling factor to become smaller with increasing number of concecutive predictive frames. */ st->streaklimit_fx = mult( st->streaklimit_fx, STREAKMULT_FX ); move16(); } - IF( st->pstreaklen_fx == 0 ) + IF( st->pstreaklen == 0 ) { /* reset the consecutive AR-predictor multiplier */ st->streaklimit_fx = 32767; /*1.0 in Q15 */ @@ -1734,14 +1734,14 @@ void lsf_end_enc_ivas_fx( { /* Safety-net - BC-TCQ quantization : SN */ Err[0] = qlsf_ARSN_tcvq_Enc_16k_fx( Tmp, lsfq, TCQIdx0, wghts, sub( nBits, 1 ), safety_net ); - st->pstreaklen_fx = 0; + st->pstreaklen = 0; move16(); } ELSE { /* predictive - BC-TCQ quantization : AR */ Err[1] = qlsf_ARSN_tcvq_Enc_16k_fx( Tmp2, lsfq, TCQIdx0, wghts, sub( nBits, 1 ), safety_net ); - st->pstreaklen_fx = add( st->pstreaklen_fx, 1 ); + st->pstreaklen = add( st->pstreaklen, 1 ); } } /* all other frames (not VOICED@16kHz) */ @@ -1766,14 +1766,14 @@ void lsf_end_enc_ivas_fx( { safety_net = 1; move16(); - st->pstreaklen_fx = 0; + st->pstreaklen = 0; move16(); /* Reset the consecutive predictive frame counter */ } ELSE { safety_net = 0; move16(); /* Increase the consecutive predictive frame counter by one */ - st->pstreaklen_fx = add( st->pstreaklen_fx, 1 ); + st->pstreaklen = add( st->pstreaklen, 1 ); } } } @@ -1796,14 +1796,14 @@ void lsf_end_enc_ivas_fx( /* Adaptive scaling factor (multiplier) is updated in order to reduce the amount of consecutive predictive frames in case of possible frame erasure. AR-predictive usage for VOICED mode is allowed to be higher than other modes. */ - IF( GT_16( st->pstreaklen_fx, ( STREAKLEN ) ) ) + IF( GT_16( st->pstreaklen, ( STREAKLEN ) ) ) { /* update the adaptive scaling factor to become smaller with increasing number of concecutive predictive frames. */ st->streaklimit_fx = mult( st->streaklimit_fx, STREAKMULT_FX ); move16(); } - IF( EQ_16( st->pstreaklen_fx, 0 ) ) + IF( EQ_16( st->pstreaklen, 0 ) ) { /* reset the adaptive scaling factor */ st->streaklimit_fx = 32767; @@ -1816,8 +1816,8 @@ void lsf_end_enc_ivas_fx( Err[0] = vq_lvq_lsf_enc_ivas_fx( 2, 9, Tmp2, levels0, stages0, wghts, Idx0, lsf, pred3, &resq[M], &lsfq[M] ); IF( force_sf ) { - safety_net = 1; /* intra-frame prediction */ - st->pstreaklen_fx = 0; /* Reset the consecutive predictive frame counter */ + safety_net = 1; /* intra-frame prediction */ + st->pstreaklen = 0; /* Reset the consecutive predictive frame counter */ } ELSE { /* try also the inter frame prediction */ @@ -1828,12 +1828,12 @@ void lsf_end_enc_ivas_fx( IF( LT_32( Mult_32_16( Err[0], ( st->streaklimit_fx ) ), L_add( Err[1], Mult_32_16( Err[1], PREFERSFNET_FX ) ) ) ) { safety_net = 1; - st->pstreaklen_fx = 0; /* Reset the consecutive predictive frame counter */ + st->pstreaklen = 0; /* Reset the consecutive predictive frame counter */ } ELSE { safety_net = 0; - ( st->pstreaklen_fx )++; /* Increase the consecutive predictive frame counter by one */ + ( st->pstreaklen )++; /* Increase the consecutive predictive frame counter by one */ } } } diff --git a/lib_enc/nois_est_fx.c b/lib_enc/nois_est_fx.c index bf4637666..dbb29cc6c 100644 --- a/lib_enc/nois_est_fx.c +++ b/lib_enc/nois_est_fx.c @@ -800,8 +800,8 @@ void noise_est_fx( *-----------------------------------------------------------------*/ /* pc = abs(pit[0] - pitO) + abs(pit[1] - pit[0]) */ /* needed in signal_clas() */ - wtmp = abs_s( sub( st_fx->pitch_fx[0], old_pitch1 ) ); - wtmp1 = abs_s( sub( st_fx->pitch_fx[1], st_fx->pitch_fx[0] ) ); + wtmp = abs_s( sub( st_fx->pitch[0], old_pitch1 ) ); + wtmp1 = abs_s( sub( st_fx->pitch[1], st_fx->pitch[0] ) ); pc = add( wtmp, wtmp1 ); diff --git a/lib_enc/ppp_enc_fx.c b/lib_enc/ppp_enc_fx.c index bfe64e343..29c0fefe7 100644 --- a/lib_enc/ppp_enc_fx.c +++ b/lib_enc/ppp_enc_fx.c @@ -353,7 +353,7 @@ void set_ppp_mode_fx( test(); test(); if ( ( GT_16( st_fx->old_pitch_buf_fx[( 2 * NB_SUBFR ) - 1], PPP_LAG_THRLD_Q6 ) || - GT_16( st_fx->pitch_fx[1], PPP_LAG_THRLD ) || !st_fx->last_Opt_SC_VBR ) && + GT_16( st_fx->pitch[1], PPP_LAG_THRLD ) || !st_fx->last_Opt_SC_VBR ) && EQ_16( hSC_VBR->ppp_mode, 1 ) ) { hSC_VBR->ppp_mode = 0; diff --git a/lib_enc/pre_proc_fx.c b/lib_enc/pre_proc_fx.c index cfaea3113..421694532 100644 --- a/lib_enc/pre_proc_fx.c +++ b/lib_enc/pre_proc_fx.c @@ -441,39 +441,39 @@ void pre_proc_fx( /* reset the OL pitch tracker memories during inactive frames */ pitch_ol_init_fx( &st->old_thres_fx, &st->old_pitch, &st->delta_pit, &st->old_corr_fx ); } - old_pitch1 = st->pitch_fx[1]; + old_pitch1 = st->pitch[1]; - pitch_ol_fx( st->pitch_fx, st->voicing_fx, &st->old_pitch, &st->old_corr_fx, corr_shift, &st->old_thres_fx, + pitch_ol_fx( st->pitch, st->voicing_fx, &st->old_pitch, &st->old_corr_fx, corr_shift, &st->old_thres_fx, &st->delta_pit, st->old_wsp2_fx, wsp, st->mem_decim2_fx, relE, st->clas, st->bwidth, st->Opt_SC_VBR ); /* Updates for adaptive lag window memory */ - st->old_pitch_la = st->pitch_fx[2]; + st->old_pitch_la = st->pitch[2]; move16(); st->old_voicing_la = st->voicing_fx[2]; move16(); - /* Detection of very short stable st->pitch_fx period (MODE1 bit-rates) */ - StableHighPitchDetect_fx( &flag_spitch, st->pitch_fx, st->voicing_fx, wsp, st->localVAD, &st->voicing_sm_fx, &st->voicing0_sm_fx, + /* Detection of very short stable st->pitch period (MODE1 bit-rates) */ + StableHighPitchDetect_fx( &flag_spitch, st->pitch, st->voicing_fx, wsp, st->localVAD, &st->voicing_sm_fx, &st->voicing0_sm_fx, &st->LF_EnergyRatio_sm_fx, &st->predecision_flag, &st->diff_sm_fx, &st->energy_sm_fx, *Q_new, st->lgBin_E_fx ); /* 1/4 pitch precision improvement */ IF( LE_32( st->total_brate, ACELP_24k40 ) ) { /* 1/4 pitch precision improvement */ - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch_fx[0], &pitch_fr[0], &voicing_fr[0], 0, wsp, 7 ); - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch_fx[0], &pitch_fr[1], &voicing_fr[1], L_SUBFR, wsp, 7 ); - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch_fx[1], &pitch_fr[2], &voicing_fr[2], 2 * L_SUBFR, wsp, 7 ); - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch_fx[1], &pitch_fr[3], &voicing_fr[3], 3 * L_SUBFR, wsp, 7 ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr[0], &voicing_fr[0], 0, wsp, 7 ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr[1], &voicing_fr[1], L_SUBFR, wsp, 7 ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr[2], &voicing_fr[2], 2 * L_SUBFR, wsp, 7 ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr[3], &voicing_fr[3], 3 * L_SUBFR, wsp, 7 ); } ELSE { - pitch_fr[0] = st->pitch_fx[0]; + pitch_fr[0] = st->pitch[0]; move16(); - pitch_fr[1] = st->pitch_fx[0]; + pitch_fr[1] = st->pitch[0]; move16(); - pitch_fr[2] = st->pitch_fx[1]; + pitch_fr[2] = st->pitch[1]; move16(); - pitch_fr[3] = st->pitch_fx[1]; + pitch_fr[3] = st->pitch[1]; move16(); voicing_fr[0] = st->voicing_fx[0]; @@ -510,7 +510,7 @@ void pre_proc_fx( * UC and VC frame selection *-----------------------------------------------------------------*/ - find_tilt_fx( fr_bands, hNoiseEst->bckr_fx, ee, st->pitch_fx, st->voicing_fx, lf_E, corr_shift, st->input_bwidth, + find_tilt_fx( fr_bands, hNoiseEst->bckr_fx, ee, st->pitch, st->voicing_fx, lf_E, corr_shift, st->input_bwidth, st->max_band, hp_E, st->codec_mode, *Q_new, &( st->bckr_tilt_lt ), st->Opt_SC_VBR ); st->coder_type = find_uv_fx( st, pitch_fr, voicing_fr, inp_12k8, ee, @@ -1136,7 +1136,7 @@ void pre_proc_fx( Copy( st->lsp_old1_fx, st->lspold_enc_fx, M ); } - analy_lp_fx( inp_16k, L_FRAME16k, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lspold_enc_fx, st->pitch_fx, st->voicing_fx, 16000, -1 /*IVAS_CODE !! LowRateFlag*/, *Q_new, Q_r ); + analy_lp_fx( inp_16k, L_FRAME16k, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lspold_enc_fx, st->pitch, st->voicing_fx, 16000, -1 /*IVAS_CODE !! LowRateFlag*/, *Q_new, Q_r ); /*--------------------------------------------------------------* * Compute Weighted Input @@ -1215,7 +1215,7 @@ void pre_proc_fx( *-----------------------------------------------------------------*/ #ifndef FIX_I4_OL_PITCH - Copy( st->pitch_fx, pitch_orig, 3 ); + Copy( st->pitch, pitch_orig, 3 ); #endif IF( EQ_16( st->codec_mode, MODE2 ) ) { diff --git a/lib_enc/sig_clas_fx.c b/lib_enc/sig_clas_fx.c index a0ef0caf4..27f021465 100644 --- a/lib_enc/sig_clas_fx.c +++ b/lib_enc/sig_clas_fx.c @@ -114,7 +114,7 @@ Word16 signal_clas_fx( /* o : classification for current zc = extract_l( Ltmp ); /* compute pitch stability */ - pc = add( abs_s( sub( st->pitch_fx[1], st->pitch_fx[0] ) ), abs_s( sub( st->pitch_fx[2], st->pitch_fx[1] ) ) ); + pc = add( abs_s( sub( st->pitch[1], st->pitch[0] ) ), abs_s( sub( st->pitch[2], st->pitch[1] ) ) ); st->tdm_pc = pc; /*-----------------------------------------------------------------* diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index 1606ba3d7..5418a6714 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -336,7 +336,7 @@ void speech_music_classif_fx( { sp_mus_classif_2nd_fx( st, Etot, attack_flag, inp, Q_inp - 1 ); - /* avoid switch to AUDIO/MUSIC class for very short stable high st->pitch_fx + /* avoid switch to AUDIO/MUSIC class for very short stable high st->pitch and/or stable pitch with high correlation at low bitrates*/ test(); test(); @@ -484,14 +484,14 @@ static Word16 sp_mus_classif_gmm_fx( /* o : decis /* [0] OL pitch Q0 */ /*(float)(pitch[0] + pitch[1] + pitch[2]) / 3.0f;*/ - L_tmp = L_mult( st_fx->pitch_fx[0], 10923 ); - L_tmp = L_mac( L_tmp, st_fx->pitch_fx[1], 10923 ); - L_tmp = L_mac( L_tmp, st_fx->pitch_fx[2], 10923 ); + L_tmp = L_mult( st_fx->pitch[0], 10923 ); + L_tmp = L_mac( L_tmp, st_fx->pitch[1], 10923 ); + L_tmp = L_mac( L_tmp, st_fx->pitch[2], 10923 ); test(); IF( EQ_16( st_fx->tc_cnt, 1 ) || EQ_16( st_fx->tc_cnt, 2 ) ) { - *pFV++ = st_fx->pitch_fx[2]; + *pFV++ = st_fx->pitch[2]; move16(); } ELSE @@ -1184,7 +1184,7 @@ static void sp_mus_classif_2nd_fx( st->sp_aud_decision2 = 0; move16(); } - ELSE IF( EQ_16( hSpMusClas->high_stable_cor, 1 ) && GE_16( st->pitch_fx[0], 130 ) ) + ELSE IF( EQ_16( hSpMusClas->high_stable_cor, 1 ) && GE_16( st->pitch[0], 130 ) ) { /* prevent GSC in highly correlated signal with low energy variation */ /* this is basically a patch against bassoon-type of music */ @@ -3740,15 +3740,15 @@ static void tonal_context_improv_fx( } /* Pitch difference w.r.t to past 3 frames */ - lt_pitch_diff = abs_s( sub( hSpMusClas->lt_corr_pitch[0], st_fx->pitch_fx[0] ) ); - lt_pitch_diff = add( lt_pitch_diff, abs_s( sub( hSpMusClas->lt_corr_pitch[1], st_fx->pitch_fx[0] ) ) ); - lt_pitch_diff = add( lt_pitch_diff, abs_s( sub( hSpMusClas->lt_corr_pitch[2], st_fx->pitch_fx[0] ) ) ); + lt_pitch_diff = abs_s( sub( hSpMusClas->lt_corr_pitch[0], st_fx->pitch[0] ) ); + lt_pitch_diff = add( lt_pitch_diff, abs_s( sub( hSpMusClas->lt_corr_pitch[1], st_fx->pitch[0] ) ) ); + lt_pitch_diff = add( lt_pitch_diff, abs_s( sub( hSpMusClas->lt_corr_pitch[2], st_fx->pitch[0] ) ) ); hSpMusClas->lt_corr_pitch[0] = hSpMusClas->lt_corr_pitch[1]; move16(); hSpMusClas->lt_corr_pitch[1] = hSpMusClas->lt_corr_pitch[2]; move16(); - hSpMusClas->lt_corr_pitch[2] = st_fx->pitch_fx[0]; + hSpMusClas->lt_corr_pitch[2] = st_fx->pitch[0]; move16(); hSpMusClas->lt_old_mode[0] = hSpMusClas->lt_old_mode[1]; diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index a7ff97e14..5c029a808 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -92,7 +92,7 @@ typedef struct bitstream_enc_data_structure void *st_ivas; /* IVAS encoder structure */ // Word16 nb_bits_tot_fx; /* total number of bits already written */ - // Indice *ind_list_fx; /* list of indices */ + // Indice *ind_list_fx; /* list of indices */ Word16 next_ind_fx; /* pointer to the next empty slot in the list of indices */ Word16 last_ind_fx; /* last written indice */ @@ -1787,7 +1787,7 @@ typedef struct enc_core_structure int16_t pitch[3]; /* open-loop pitch values @12.8 kHz for three half-frames */ float voicing[3]; /* open-loop normalized correlation values for three half-frames */ - Word16 pitch_fx[3]; + // Word16 pitch_fx[3]; Word16 voicing_fx[3]; LPD_state_HANDLE hLPDmem; /* ACELP LPDmem memories */ @@ -1809,17 +1809,17 @@ typedef struct enc_core_structure int16_t pstreaklen; /* LSF quantizer */ - float streaklimit; /* LSF quantizer */ - float stab_fac; /* LSF stability factor */ - float mem_preemph; /* preemphasis filter memory */ - float old_wsp[L_WSP_MEM]; /* old weighted signal vector */ - float old_wsp2[( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM]; /* old decimated weighted signal vector */ - float mem_wsp; /* weighted signal vector memory */ - float mem_decim2[3]; /* weighted signal decimation filter memory */ - float clip_var[6]; /* pitch gain clipping memory */ - float mem_AR[M]; /* AR memory of LSF quantizer (past quantized LSFs without mean) */ - float mem_MA[M]; /* MA memory of LSF quantizer (past quantized residual) (used also in AMR-WB IO mode) */ - Word16 pstreaklen_fx; /* LSF quantizer */ + float streaklimit; /* LSF quantizer */ + float stab_fac; /* LSF stability factor */ + float mem_preemph; /* preemphasis filter memory */ + float old_wsp[L_WSP_MEM]; /* old weighted signal vector */ + float old_wsp2[( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM]; /* old decimated weighted signal vector */ + float mem_wsp; /* weighted signal vector memory */ + float mem_decim2[3]; /* weighted signal decimation filter memory */ + float clip_var[6]; /* pitch gain clipping memory */ + float mem_AR[M]; /* AR memory of LSF quantizer (past quantized LSFs without mean) */ + float mem_MA[M]; /* MA memory of LSF quantizer (past quantized residual) (used also in AMR-WB IO mode) */ + // Word16 pstreaklen_fx; /* LSF quantizer */ Word16 streaklimit_fx; /* LSF quantizer */ Word32 offset_scale1_fx[MAX_NO_MODES + 1][MAX_NO_SCALES + 1]; /* offsets for LSF LVQ structure 1st 8-dim subvector*/ Word32 offset_scale2_fx[MAX_NO_MODES + 1][MAX_NO_SCALES + 1]; /* offsets for LSF LVQ structure 2nd 8-dim subvector*/ diff --git a/lib_enc/transition_enc_fx.c b/lib_enc/transition_enc_fx.c index 96b672985..3a9fabba0 100644 --- a/lib_enc/transition_enc_fx.c +++ b/lib_enc/transition_enc_fx.c @@ -105,14 +105,14 @@ void transition_enc_fx( IF( EQ_16( st_fx->L_frame, L_FRAME ) /*|| (tdm_Pri_pitch_buf != NULL && tdm_Pri_pitch_buf[0] < 0)*/ ) { - Copy( st_fx->pitch_fx, T_op, 2 ); + Copy( st_fx->pitch, T_op, 2 ); } ELSE /* L_frame == L_FRAME16k */ { /*T_op[0] = (int16_t)(pitch[0] * 1.25f + 0.5f); T_op[1] = (int16_t)(pitch[1] * 1.25f + 0.5f);*/ - T_op[0] = add( st_fx->pitch_fx[0], mult_r( st_fx->pitch_fx[0], 8192 /*0.25f Q15*/ ) ); - T_op[1] = add( st_fx->pitch_fx[1], mult_r( st_fx->pitch_fx[1], 8192 /*0.25f Q15*/ ) ); + T_op[0] = add( st_fx->pitch[0], mult_r( st_fx->pitch[0], 8192 /*0.25f Q15*/ ) ); + T_op[1] = add( st_fx->pitch[1], mult_r( st_fx->pitch[1], 8192 /*0.25f Q15*/ ) ); } shift_wsp = add( Q_new, shift ); diff --git a/lib_enc/vad_param_updt_fx.c b/lib_enc/vad_param_updt_fx.c index f1eb9b031..e0b607c5a 100644 --- a/lib_enc/vad_param_updt_fx.c +++ b/lib_enc/vad_param_updt_fx.c @@ -175,9 +175,9 @@ void vad_param_updt_fx( #endif /* abs(pitch[0] - *pitO) + abs(pitch[1] - pitch[0]) + abs(pitch[2] - pitch[1]) */ - pitch_tmp = abs_s( sub( st_fx->pitch_fx[0], old_pitch1 ) ); /*Q0 */ - pitch_tmp = add( pitch_tmp, abs_s( sub( st_fx->pitch_fx[1], st_fx->pitch_fx[0] ) ) ); /*Q0 */ - pitch_tmp = add( pitch_tmp, abs_s( sub( st_fx->pitch_fx[2], st_fx->pitch_fx[1] ) ) ); /*Q0 */ + pitch_tmp = abs_s( sub( st_fx->pitch[0], old_pitch1 ) ); /*Q0 */ + pitch_tmp = add( pitch_tmp, abs_s( sub( st_fx->pitch[1], st_fx->pitch[0] ) ) ); /*Q0 */ + pitch_tmp = add( pitch_tmp, abs_s( sub( st_fx->pitch[2], st_fx->pitch[1] ) ) ); /*Q0 */ /* if( (voicing[0] + voicing[1] + voicing[2]) / 3 + corr_shift > 0.65 && -- GitLab From 768f1e1bdfd206652ee0c77678b27a6f78fb17ca Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 19 Jul 2024 13:56:10 +0530 Subject: [PATCH 083/110] acelp core dec basop updates, generate_comfort_noise_dec_ivas_fx integration [x] Integration of generate_comfort_noise_dec_ivas_fx [x] Corrected incorrect basop usage in acelp_core_dec_ivas_fx [x] Basop and Instrumentation changes for acelp_core_dec_ivas_fx [x] Restoring some float functions --- lib_com/gs_bitallocation.c | 334 ++++ lib_com/options.h | 1 + lib_dec/acelp_core_dec_fx.c | 4 +- lib_dec/acelp_core_dec_ivas_fx.c | 2114 ++++++++++++------------ lib_dec/fd_cng_dec_fx.c | 2 +- lib_dec/ivas_cpe_dec_fx.c | 6 - lib_dec/ivas_mc_param_dec.c | 86 - lib_dec/ivas_out_setup_conversion.c | 46 +- lib_dec/ivas_stereo_cng_dec.c | 2 - lib_dec/ivas_stereo_mdct_core_dec.c | 153 +- lib_dec/ivas_stereo_mdct_core_dec_fx.c | 271 +-- 11 files changed, 1501 insertions(+), 1518 deletions(-) diff --git a/lib_com/gs_bitallocation.c b/lib_com/gs_bitallocation.c index 6d24ab7bb..3898daf95 100644 --- a/lib_com/gs_bitallocation.c +++ b/lib_com/gs_bitallocation.c @@ -43,6 +43,7 @@ #include "ivas_prot.h" #include "wmc_auto.h" + /*-------------------------------------------------------------------* * Local function prototypes *-------------------------------------------------------------------*/ @@ -51,6 +52,29 @@ static float Find_bit_frac( const int16_t nb_band, const int16_t remaining_bits static void reajust_bits( float *bits_per_bands, const int16_t st_band, const int16_t end_band, const int16_t sum_bit_in, const int16_t bit_bdgt_in ); +#ifdef NON_BE_FIX_1137_GSC_IVAS_FXFLT_DECODING +#define Q15_0_33 10922 /* 0.33 */ +#define Q18_0_1 26214 /* 0.1 */ +#define Q18_0_50 131072 /* 0.50 */ +#define Q18_0_75 196608 /* 0.75 */ +#define Q18_0_76 199229 /* 76/100 */ +#define Q18_1_0 262144 /* 1.0 */ +#define Q18_1_2 314573 /* 1.2 */ +#define Q18_112 29360128 /* 112 */ +#define Q18_DSR_NB_PULSE 1179648 /* 4.5 */ +#define Q18_1_5xDSR_NB_PULSE 1769472 /* 1.5x4.5 */ +#define Q18_2_0xDSR_NB_PULSE ( Q18_DSR_NB_PULSE << 1 ) /* 2.0x4.5 */ + +#define Q31_0_00125 2684355 /* 0.125/100 */ +#define Q31_0_0125 26843546 /* 0.0125 */ +#define Q31_0_015 32212255 /* 0.0125 */ +#define Q31_0_02 42949673 /* 0.02 */ +#define Q31_0_17 365072220 /* 0.17 */ +#define Q31_0_23 493921239 /* 0.23 */ +static Word16 Find_norm_inv( const Word32 ToDivide, Word16 *e_div ); +static Word16 Find_bit_alloc_IVAS_int( const Word32 core_brate, const Word16 GSC_IVAS_mode, const Word16 Diff_len, const Word16 nb_tot_bands, const Word16 L_frame, Word16 *bit, Word16 *max_ener_band, float *ener_vec, float *bits_per_bands ); +static Word16 maximum_fx( const Word16 *vec_fx, const Word16 lvec_fx, Word16 *max_fx ); +#endif /*-------------------------------------------------------------------* * bands_and_bit_alloc() @@ -89,8 +113,12 @@ void bands_and_bit_alloc( int16_t pos, band; float SWB_bit_budget; float bits_per_bands[MBANDS_GN_BITALLOC16k]; +#ifndef NON_BE_FIX_1137_GSC_IVAS_FXFLT_DECODING float fzero_val, mp, mb, nb_bands_adj, bit_adj; int16_t nb_pulse_per_band[MBANDS_GN_BITALLOC16k]; +#else + float fzero_val; +#endif /* initializations */ nb_tot_bands = 16; @@ -190,6 +218,7 @@ void bands_and_bit_alloc( { if ( GSC_IVAS_mode > 0 ) { +#ifndef NON_BE_FIX_1137_GSC_IVAS_FXFLT_DECODING SWB_bit_budget = *bit; st_band = 5; @@ -368,6 +397,10 @@ void bands_and_bit_alloc( bits_per_bands[i] += sum_bit; } } +#else + nb_tot_bands = Find_bit_alloc_IVAS_int( core_brate, GSC_IVAS_mode, Diff_len, nb_tot_bands, L_frame, bit, max_ener_band, ener_vec, bits_per_bands ); + nb_bands = nb_tot_bands; +#endif } else if ( GSC_noisy_speech ) { @@ -927,3 +960,304 @@ static float Find_bit_frac( return ( var_out ); } + +#ifdef NON_BE_FIX_1137_GSC_IVAS_FXFLT_DECODING +static Word16 Find_bit_alloc_IVAS_int( /* o : Number of band to encode */ + const Word32 core_brate, /* i : core bit rate */ + const Word16 GSC_IVAS_mode, /* i : GSC IVAS mode */ + const Word16 Diff_len, /* i : Length of the difference signal (before pure spectral)*/ + const Word16 nb_tot_bands_in, /* i : total number of band */ + const Word16 L_frame, /* i : frame length */ + Word16 *bit, /* i/o: Number of bit allowed for frequency quantization */ + Word16 *max_ener_band, /* i/o: Energy based sorted order */ + float *ener_vec_io, /* i/o: Energy per band order */ + float *bits_per_bands_o /* o : Number of bit allowed per allowed sub-band Q3 */ +) +{ + Word32 mp, mb, nb_bands_adj, bit_adj; + Word16 nb_pulse_per_band[MBANDS_GN_BITALLOC16k]; + Word32 SWB_bit_budget; // Q0 -> Q18 + Word16 i, j, nb_bands_max, st_band, nb_tot_bands_loc, etmp; + Word32 sum_bit /*Q18*/, bit_fracf /*Q18*/; + Word16 d_tmp, e_div, tmp16, ener_vec[MBANDS_GN_BITALLOC16k]; + Word32 Ltmp, etmp_32fx, bits_per_bands[MBANDS_GN_BITALLOC16k]; + + SWB_bit_budget = *bit; // Q0 + st_band = 5; + nb_bands_max = nb_tot_bands_in; + + for ( i = 0; i < MBANDS_GN; i++ ) + { + ener_vec[i] = (short) ( ener_vec_io[i] ); /* Q12 -> Q12 */ + } + + if ( L_frame == L_FRAME16k ) + { + for ( i = MBANDS_GN; i < MBANDS_GN_BITALLOC16k; i++ ) + { + ener_vec[i] = (short) ( ener_vec_io[i] * 4096.0 + 0.5f ); /* Q0 -> Q12 */ + } + } + + set_l( bits_per_bands, 0, MBANDS_GN_BITALLOC16k ); + + /* Decide the pourcentage of bits allocated to LF (between 50-75%) depending of the temporal contribution in GSC */ + /* bit_fracf = ( -0.125f * Diff_len + 76.0f ) / 100; */ + bit_fracf = L_add( Mpy_32_32( -Q31_0_00125, L_shl( Diff_len, 18 ) ), Q18_0_76 ); /* Q18 */ + + /* bit_fracf = check_bounds(bit_fracf, 0.50f, 0.75f); */ + bit_fracf = min( max( bit_fracf, Q18_0_50 ), Q18_0_75 ); + + /* Adjusment of the bitrate between LF and HF base on the content type */ + /* 1 = new GSC bit alloc + 2 = GSC bit alloc for tc frame + 3 = more music like (should not happen often given music is coded with dft) */ + + if ( GSC_IVAS_mode <= 3 ) + { + nb_bands_max -= 6; + } + + if ( GSC_IVAS_mode == 2 ) + { + /* bit_fracf += 0.1f; */ + bit_fracf += Q18_0_1; /* Q18*/ + nb_bands_max -= 1; + } + + if ( GSC_IVAS_mode == 3 ) + { + /* bit_fracf -= 0.1f; */ + bit_fracf -= Q18_0_1; /* Q18*/ + nb_bands_max += 3; + } + + /* First find how much we want to share between LF and HF, at low bitrate, a miminum of bits is needed in LF by limitating the number of bands*/ + /* Adjust the number of band based on the content type and bitrate */ + + /* nb_bands_adj = 1.0f; */ + nb_bands_adj = Q18_1_0; + if ( GSC_IVAS_mode == 1 && core_brate < GSC_L_RATE_STG ) + { + /* nb_bands_adj = 0.0125f * SWB_bit_budget - 0.75f;*/ + nb_bands_adj = L_sub( Mpy_32_32( Q31_0_0125, L_shl( SWB_bit_budget, 18 ) ), Q18_0_75 ); // Q18 + } + else if ( GSC_IVAS_mode != 2 && core_brate > GSC_H_RATE_STG ) + { + /*nb_bands_adj = 0.02f * SWB_bit_budget - 1.2f;*/ + nb_bands_adj = L_sub( Mpy_32_32( Q31_0_02, L_shl( SWB_bit_budget, 18 ) ), Q18_1_2 ); // Q18 + } + /*nb_bands_max = (int16_t)(nb_bands_max * nb_bands_adj + 0.5f);*/ + + nb_bands_max = round_fx( Mpy_32_16_1( L_shl( nb_bands_adj, 5 ), shl( nb_bands_max, 10 - 2 ) ) ); /* Q0 */ + nb_bands_max = check_bounds_s( nb_bands_max, 5, nb_tot_bands_in ); + + /* bit_fracf *= SWB_bit_budget;*/ + /* At this point bit_fracf has a value below 1.0 */ + bit_fracf = Mpy_32_16_1( L_shl( bit_fracf, 10 ), extract_l( L_shl( SWB_bit_budget, 5 ) ) ); /* (Q(18+10)*Q(0+5) + 1 - 16 = Q18 */ + + /* Estimation of the number of bit used in HF */ + /* with only the first weighting The number of bits in max_ener_band[st_band-1] = 17% of bit_fracf */ + /* mb = .17f * bit_fracf;*/ + mb = Mpy_32_32( Q31_0_17, bit_fracf ); /* Q18 */ + + /* mp = 2 * DSR_NB_PULSE;*/ + mp = Q18_2_0xDSR_NB_PULSE; + if ( core_brate < GSC_L_RATE_STG && GSC_IVAS_mode == 3 ) + { + /* mp = 1.5f * DSR_NB_PULSE;*/ + mp = Q18_1_5xDSR_NB_PULSE; + } + else if ( core_brate < GSC_L_RATE_STG ) + { + /* mp = DSR_NB_PULSE;*/ + mp = Q18_DSR_NB_PULSE; + } + + /* We want max_ener_band[st_band] <= max_ener_band[st_band-1] and max_ener_band[nb_bands_max-1] <= max_ener_band[st_band]*/ + /* We will estimate the number of bits to allocate of HF and put the remaining bits, if any, back on LF */ + /* compute the total possible number of band to be coded */ + + /* nb_tot_bands = (int16_t)((SWB_bit_budget - bit_fracf) / (mp + (mb - mp) / 2.0f)); */ + d_tmp = Find_norm_inv( L_add( mp, mb ), &e_div ); + Ltmp = Mpy_32_16_1( L_sub( L_shl( SWB_bit_budget, 18 ), bit_fracf ), d_tmp ); /* Perform mult by 1/den */ + nb_tot_bands_loc = extract_h( L_shl( Ltmp, sub( 1, e_div ) ) ); /* adjust exponent: 1 is to take into account the / 2.0f, and e_div for the num and den of the division*/ + + mp = min( mp, mb ); + tmp16 = sub( add( nb_tot_bands_loc, st_band ), nb_bands_max ); + if ( tmp16 > 0 ) + { + /* bit_adj = ( ( mb + mp ) / 2 ) * ( nb_tot_bands_loc + st_band - nb_bands_max ); */ + bit_adj = Mpy_32_16_1( L_shl( L_add( mb, mp ), 5 ), shl( tmp16, 10 - 1 ) ); /* Q18+5 * Q0+10 + 1 -1 - 16 = Q18 (-1 is to cover for the /2 in the equation) */ + bit_adj = L_max( 0, bit_adj ); + nb_tot_bands_loc = nb_bands_max - st_band; + bit_fracf += bit_adj; /* Q18 */ + } + nb_tot_bands_loc += st_band; + + /* Allocate bits to LF */ + /* etmp = 0.23f; */ + etmp_32fx = Q31_0_23; + for ( j = 0; j < st_band; j++ ) + { + i = j; + max_ener_band[j] = i; + ener_vec[i] = MIN16B; + /* bits_per_bands[j] = etmp * bit_fracf; */ + bits_per_bands[j] = Mpy_32_32( bit_fracf, etmp_32fx ); /* 18 + 31 + 1 - 32 = Q18 */ + /* etmp -= 0.015f; */ + etmp_32fx -= Q31_0_015; /* Q18 */ + } + + /* SWB_bit_budget -= bit_fracf; */ + SWB_bit_budget = L_sub( L_shl( SWB_bit_budget, 18 ), bit_fracf ); /* Q0->Q18 */ + + /* Find low energy band in HF */ + set_s( nb_pulse_per_band, 2, MBANDS_GN_BITALLOC16k ); + for ( i = st_band + 2; i < nb_tot_bands_loc - 1; i++ ) + { + if ( ener_vec[i] < ener_vec[i - 1] && ener_vec[i] < ener_vec[i + 1] ) /* i +1 and i -1 can be considered as 2 ptrs */ + { + nb_pulse_per_band[i] = 1; + } + } + + for ( j = st_band; j < nb_tot_bands_loc; j++ ) + { + if ( j > 6 ) + { + i = maximum_fx( ener_vec, nb_tot_bands_loc, &etmp ); + } + else + { + i = j; + } + max_ener_band[j] = i; + ener_vec[i] = MIN16B; + } + + /* Recompute the final bit distribution for HF */ + if ( nb_tot_bands_loc > st_band ) + { + /* This is not bit exact because of the precision lost */ + /* mb = ( SWB_bit_budget * 2 / ( nb_tot_bands_loc - st_band ) ) - mp; */ + d_tmp = Find_norm_inv( L_deposit_h( sub( nb_tot_bands_loc, st_band ) ), &e_div ); + mb = L_sub( L_shr( Mpy_32_16_1( L_shl( SWB_bit_budget, 1 ), d_tmp ), e_div ), mp ); /* Q18 */ + /* bit_fracf = ( mb - mp ) / ( nb_tot_bands_loc - st_band ); */ + bit_fracf = L_shr( Mpy_32_16_1( L_sub( mb, mp ), d_tmp ), e_div ); /* Q18 */ + + mb -= bit_fracf; + /* Do the distribution */ + for ( j = st_band; j < nb_tot_bands_loc; j++ ) + { + bits_per_bands[max_ener_band[j]] = Q18_DSR_NB_PULSE; + if ( nb_pulse_per_band[max_ener_band[j]] > 1 ) + { + bits_per_bands[max_ener_band[j]] = mb; + } + mb -= bit_fracf; + SWB_bit_budget -= bits_per_bands[max_ener_band[j]]; // Q18 + } + } + + /* Series of verification in case bit allocated != the budget */ + if ( SWB_bit_budget > 0 ) + { + i = st_band - 1; + while ( SWB_bit_budget > 0 ) + { + /* bits_per_bands[i]++; */ + bits_per_bands[i] += Q18_1_0; + /* SWB_bit_budget--; */ + SWB_bit_budget -= Q18_1_0; + i--; + if ( i == -1 ) + { + i = st_band - 1; + } + } + } + + /*nb_bands = nb_tot_bands_loc;*/ + + sum_bit = 0; + j = 0; + for ( i = 0; i < nb_tot_bands_loc; i++ ) + { + /* if (bits_per_bands[i] > 112) */ + if ( bits_per_bands[i] > Q18_112 ) + { + /* sum_bit += bits_per_bands[i] - 112; */ + sum_bit = L_add( sum_bit, L_sub( bits_per_bands[i], Q18_112 ) ); + /* bits_per_bands[i] = 112; */ + bits_per_bands[i] = Q18_112; + j = add( j, add( i, 1 ) ); + } + + /* safety check for overage bit reallocation */ + /* else if (bits_per_bands[i] + sum_bit / 3 > 112) */ + else if ( L_add( bits_per_bands[i], Mpy_32_16_1( sum_bit, Q15_0_33 ) ) > Q18_112 ) + { + j = add( j, add( i, 1 ) ); + } + } + + if ( sum_bit != 0 ) + { + /* sum_bit /= (nb_bands - j); */ + d_tmp = Find_norm_inv( L_deposit_h( sub( nb_tot_bands_loc, j ) ), &e_div ); + sum_bit = L_shr( Mpy_32_16_1( sum_bit, d_tmp ), e_div ); /* Q18 */ + for ( i = j; i < nb_tot_bands_loc; i++ ) + { + bits_per_bands[i] = L_add( bits_per_bands[i], sum_bit ); + } + } + + for ( i = 0; i < MBANDS_GN_BITALLOC16k; i++ ) + { + bits_per_bands_o[i] = (float) bits_per_bands[i] / 262144.0f; /* Q18 -> float */ + } + + return nb_tot_bands_loc; +} + +/* Find normalized 1 / ToDivide */ +static Word16 Find_norm_inv( + const Word32 ToDivide, + Word16 *e_div ) +{ + Word16 d_tmp, e_tmp; + + e_tmp = norm_l( ToDivide ); + d_tmp = round_fx( L_shl( ToDivide, e_tmp ) ); + d_tmp = div_s( 16384, d_tmp ); /* 1.0 in Q14, dividend is normalize so >= 16384 as required for the division */ + *e_div = sub( 14, e_tmp ); + + return d_tmp; +} + +static Word16 maximum_fx( /* o : index of the maximum value in the input vector */ + const Word16 *vec_fx, /* i : input vector */ + const Word16 lvec_fx, /* i : length of input vector */ + Word16 *max_fx /* o : maximum value in the input vector */ +) +{ + Word16 j, ind; + Word16 tmp; + + ind = 0; + tmp = vec_fx[0]; + + for ( j = 1; j < lvec_fx; j++ ) + { + if ( vec_fx[j] > tmp ) + { + ind = j; + } + tmp = s_max( tmp, vec_fx[j] ); + } + *max_fx = tmp; + + return ind; +} +#endif diff --git a/lib_com/options.h b/lib_com/options.h index 32b4203c0..34e869556 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -77,6 +77,7 @@ #define FIX_1027_GSC_INT_OVERFLOW /* VA: issue 2207: overflow in GSC */ #define NONBE_FIX_1096_NAN_VALUES_IN_DIRAC_TO_STEREO /* FhG: avoid sidegain DFT-Stereo param to be larger than 1 when converting from Dirac parameters */ #define NON_BE_1055_RESET_LP_MEMORIES /* VA: issue 1055: Correctly reset LP filter MA and AR memories in bitrate switching */ +#define NON_BE_FIX_1137_GSC_IVAS_FXFLT_DECODING /* VA: Add fix point bit allocation for special GSC mode such that float and fixed point have the same final bit allocation */ /* #################### End FIXES switches ############################ */ diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index 4f21a81a8..7fb5ff3bc 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -984,7 +984,7 @@ ivas_error acelp_core_dec_fx( Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, -st_fx->Q_exc ); st_fx->Q_exc = 0; /* SC-VBR - PPP frames */ - IF( ( error = decod_ppp_fx( st_fx, Aq_fx, pitch_buf_fx, exc_fx, exc2_fx, st_fx->bfi, gain_buf, voice_factors, bwe_exc_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = decod_ppp_fx( st_fx, Aq_fx, pitch_buf_fx, exc_fx, exc2_fx, st_fx->bfi, gain_buf, voice_factors, bwe_exc_fx ) ), IVAS_ERR_OK ) ) { return error; } @@ -1007,7 +1007,7 @@ ivas_error acelp_core_dec_fx( } ELSE { - IF( ( error = decod_gen_voic_fx( st_fx, st_fx->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf /*, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf*/ ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = decod_gen_voic_fx( st_fx, st_fx->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf /*, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf*/ ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index d724b48ae..62d6dc171 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -140,7 +140,7 @@ ivas_error acelp_core_dec_ivas_fx( #endif Word16 bpf_error_signal_16fx[L_FRAME16k]; #ifdef MSAN_FIX - set_s( bpf_error_signal_16fx, 0, L_FRAME16k ); + set16_fx( bpf_error_signal_16fx, 0, L_FRAME16k ); #endif Word16 tmp; @@ -185,7 +185,7 @@ ivas_error acelp_core_dec_ivas_fx( ApplyFdCng_ivas_fx( NULL, 0, NULL, 0, NULL, NULL, NULL, st, 0, 0 ); - IF( LT_16( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 0 ) ) + IF( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp < 0 ) { Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ); st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 0; @@ -209,8 +209,8 @@ ivas_error acelp_core_dec_ivas_fx( Copy( lsp_new_fx, st->lsp_old_fx, M ); } - set_s( output_fx, 0, output_frame ); /* output and synth are not used in DFT domain CNG generation and the decoder output is unaffected if they are left uninitalized */ - set_s( synth_fx16, 0, output_frame ); /* They are however read in a few places which causes errors in the valgrind tests. Simplest solution from a code perspective was to set them to zero. */ + set16_fx( output_fx, 0, output_frame ); /* output and synth are not used in DFT domain CNG generation and the decoder output is unaffected if they are left uninitalized */ + set16_fx( synth_fx16, 0, output_frame ); /* They are however read in a few places which causes errors in the valgrind tests. Simplest solution from a code perspective was to set them to zero. */ /* CN generation done in DFT domain */ pop_wmops(); @@ -238,7 +238,7 @@ ivas_error acelp_core_dec_ivas_fx( LSF_Q_prediction = -1; move16(); - set_s( syn_tmp_fx, 0, L_SUBFR ); + set16_fx( syn_tmp_fx, 0, L_SUBFR ); psyn_fx = syn_tmp_fx + L_SUBFR; syn1_tmp_fx[0] = 0; move16(); @@ -252,7 +252,9 @@ ivas_error acelp_core_dec_ivas_fx( test(); test(); test(); - IF( EQ_16( st->last_core, HQ_CORE ) || EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) || ( EQ_16( st->element_mode, IVAS_CPE_DFT ) && st->last_core_brate <= SID_2k40 ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && LE_32( st->last_core_brate, SID_2k40 ) ) ) + test(); + test(); + IF( EQ_16( st->last_core, HQ_CORE ) || EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) || ( EQ_16( st->element_mode, IVAS_CPE_DFT ) && LE_32( st->last_core_brate, SID_2k40 ) ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && LE_32( st->last_core_brate, SID_2k40 ) ) ) { /* in case of HQ->ACELP switching, do not apply BPF */ st->bpf_off = 1; @@ -272,6 +274,7 @@ ivas_error acelp_core_dec_ivas_fx( } } + test(); IF( st->hGSCDec != NULL && ( st->prev_bfi > 0 ) ) { /* reset the GSC pre echo energy threshold in case of FEC */ @@ -281,10 +284,10 @@ ivas_error acelp_core_dec_ivas_fx( test(); test(); test(); - IF( ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) && ( EQ_32( st->last_core_brate, SID_2k40 ) || EQ_32( st->last_core_brate, FRAME_NO_DATA ) ) ) + IF( ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) && ( EQ_32( st->last_core_brate, SID_2k40 ) || st->last_core_brate == FRAME_NO_DATA ) ) { - set_s( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, FFTLEN ); - set_s( hStereoCng->olapBufferSynth22_fx, 0, FFTLEN ); + set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, FFTLEN ); + set16_fx( hStereoCng->olapBufferSynth22_fx, 0, FFTLEN ); } st->clas_dec = st->last_good; @@ -304,7 +307,7 @@ ivas_error acelp_core_dec_ivas_fx( } ELSE { - set_s( old_exc2_fx, 0, L_EXC_MEM ); + set16_fx( old_exc2_fx, 0, L_EXC_MEM ); } exc2_fx = old_exc2_fx + L_EXC_MEM; @@ -326,7 +329,7 @@ ivas_error acelp_core_dec_ivas_fx( move16(); st->relax_prev_lsf_interp = 0; move16(); - set_s( gain_buf_fx, 0, NB_SUBFR16k ); + set16_fx( gain_buf_fx, 0, NB_SUBFR16k ); IF( EQ_16( st->L_frame, L_FRAME ) ) { @@ -352,7 +355,7 @@ ivas_error acelp_core_dec_ivas_fx( } test(); /* reset post-filter in case of switching */ - IF( st->hPFstat != NULL && ( st->hPFstat->on == 0 ) ) + if ( st->hPFstat != NULL && ( st->hPFstat->on == 0 ) ) { st->hPFstat->reset = 1; move16(); @@ -362,7 +365,7 @@ ivas_error acelp_core_dec_ivas_fx( move16(); test(); test(); - IF( st->last_con_tcx && NE_16( st->L_frameTCX_past, st->L_frame ) && ( st->last_core != 0 ) ) + if ( st->last_con_tcx && NE_16( st->L_frameTCX_past, st->L_frame ) && ( st->last_core != 0 ) ) { avoid_lpc_burst_on_recovery = 1; move16(); @@ -386,7 +389,7 @@ ivas_error acelp_core_dec_ivas_fx( tdm_low_rate_mode = 0; move16(); test(); - IF( EQ_16( st->element_mode, IVAS_SCE ) && st->low_rate_mode ) + if ( EQ_16( st->element_mode, IVAS_SCE ) && st->low_rate_mode ) { tdm_low_rate_mode = 1; move16(); @@ -401,7 +404,7 @@ ivas_error acelp_core_dec_ivas_fx( *----------------------------------------------------------------*/ test(); test(); - IF( NE_16( st->last_L_frame, st->L_frame ) && ( EQ_16( st->last_core, ACELP_CORE ) || EQ_16( st->last_core, AMR_WB_CORE ) ) ) + IF( NE_16( st->last_L_frame, st->L_frame ) && ( st->last_core == ACELP_CORE || EQ_16( st->last_core, AMR_WB_CORE ) ) ) { Word16 dec; @@ -434,12 +437,12 @@ ivas_error acelp_core_dec_ivas_fx( { Copy( GEWB_Ave_fx, st->mem_AR_fx, M ); } - set_s( st->mem_MA_fx, 0, M ); + set16_fx( st->mem_MA_fx, 0, M ); /* update synthesis filter memories */ dec = DEC; move16(); - IF( NE_16( st->element_mode, EVS_MONO ) ) + if ( st->element_mode != EVS_MONO ) { dec = DEC_IVAS; move16(); @@ -485,23 +488,25 @@ ivas_error acelp_core_dec_ivas_fx( } ELSE { - move16(); Word16 exp = 0; + move16(); IF( EQ_16( st->last_L_frame, L_FRAME32k ) ) { tmpF_fx = 16384; + move16(); } ELSE IF( EQ_16( st->last_L_frame, 512 ) ) { tmpF_fx = 20480; + move16(); } ELSE /* st->last_L_frame == L_FRAME12k8 */ { tmpF_fx = 20480; // Q14 + move16(); exp = 1; move16(); } - move16(); FOR( i = 2 * NB_SUBFR - 1; i >= NB_SUBFR; i-- ) { st->old_pitch_buf_fx[i + 2] = Mpy_32_16_1( L_shl( st->old_pitch_buf_fx[i], exp ), tmpF_fx ); @@ -524,50 +529,56 @@ ivas_error acelp_core_dec_ivas_fx( { IF( EQ_16( st->L_frame, L_FRAME ) ) { - move16(); IF( EQ_16( st->bfi_pitch_frame, L_FRAME32k ) ) { tmpF_fx = 13107; + move16(); } ELSE IF( EQ_16( st->bfi_pitch_frame, 512 ) ) { tmpF_fx = 16384; + move16(); } ELSE /* st->bfi_pitch_frame == L_FRAME16k */ { tmpF_fx = 26214; + move16(); } st->bfi_pitch_fx = mult_r( st->bfi_pitch_fx, tmpF_fx ); + move16(); st->bfi_pitch_frame = L_FRAME; move16(); } ELSE { - move16(); Word16 exp = 0; + move16(); IF( EQ_16( st->bfi_pitch_frame, L_FRAME32k ) ) { tmpF_fx = 16384; + move16(); } ELSE IF( EQ_16( st->bfi_pitch_frame, 512 ) ) { tmpF_fx = 20480; + move16(); } ELSE /* st->bfi_pitch_frame == L_FRAME12k8 */ { tmpF_fx = 20480; // Q14 + move16(); exp = 1; move16(); } - move16(); st->bfi_pitch_fx = mult_r( shl_sat( st->bfi_pitch_fx, exp ), tmpF_fx ); + move16(); st->bfi_pitch_frame = L_FRAME16k; move16(); } } test(); test(); - IF( EQ_16( st->last_bwidth, NB ) && NE_16( st->bwidth, NB ) && ( st->ini_frame != 0 ) ) + if ( EQ_16( st->last_bwidth, NB ) && NE_16( st->bwidth, NB ) && ( st->ini_frame != 0 ) ) { st->rate_switching_reset = 1; move16(); @@ -598,13 +609,14 @@ ivas_error acelp_core_dec_ivas_fx( test(); test(); test(); - IF( GT_16( st->element_mode, EVS_MONO ) && EQ_16( st->idchan, 0 ) && !( EQ_32( st->core_brate, FRAME_NO_DATA ) || EQ_32( st->core_brate, SID_2k40 ) ) && !tdm_low_rate_mode ) + IF( GT_16( st->element_mode, EVS_MONO ) && st->idchan == 0 && !( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) && !tdm_low_rate_mode ) { test(); test(); - IF( EQ_16( st->coder_type, AUDIO ) || ( EQ_16( st->coder_type, INACTIVE ) && LE_32( st->total_brate, MAX_GSC_INACTIVE_BRATE ) ) ) + if ( EQ_16( st->coder_type, AUDIO ) || ( st->coder_type == INACTIVE && LE_32( st->total_brate, MAX_GSC_INACTIVE_BRATE ) ) ) { st->GSC_IVAS_mode = get_next_indice( st, 2 ); + move16(); } } @@ -612,10 +624,10 @@ ivas_error acelp_core_dec_ivas_fx( * Decoding of inactive CNG frames *----------------------------------------------------------------*/ test(); - IF( EQ_32( st->core_brate, FRAME_NO_DATA ) || EQ_32( st->core_brate, SID_2k40 ) ) + IF( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) { /* decode CNG parameters */ - IF( EQ_16( st->cng_type, LP_CNG ) ) + IF( st->cng_type == LP_CNG ) { CNG_dec_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); FOR( Word32 nsf = 0; nsf < NB_SUBFR16k; nsf++ ) @@ -631,7 +643,7 @@ ivas_error acelp_core_dec_ivas_fx( move16(); test(); test(); - IF( ( EQ_16( nchan_out, 1 ) && EQ_16( st->element_mode, IVAS_CPE_DFT ) ) || EQ_16( st->masa_sid_format, 1 ) ) + if ( ( EQ_16( nchan_out, 1 ) && EQ_16( st->element_mode, IVAS_CPE_DFT ) ) || EQ_16( st->masa_sid_format, 1 ) ) { local_element_mode = IVAS_SCE; /* For DFT Stereo mono decoding, run CNG_exc as in SCE */ move16(); @@ -640,10 +652,11 @@ ivas_error acelp_core_dec_ivas_fx( } ELSE { - + test(); IF( EQ_32( st->core_brate, SID_2k40 ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { Word16 old_NoiseEstExp = st->hFdCngDec->hFdCngCom->sidNoiseEstExp; + move16(); FdCng_decodeSID_ivas_fx( st ); rescale_fdCngDec( st->hFdCngDec, sub( old_NoiseEstExp, st->hFdCngDec->hFdCngCom->sidNoiseEstExp ) ); Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, M + 1, sub( norm_s( st->hFdCngDec->hFdCngCom->A_cng[0] ), Q2 ) ); @@ -662,16 +675,20 @@ ivas_error acelp_core_dec_ivas_fx( move32(); } Word16 new_sidNoiseEstExp = 31 - Q4; - Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, st->hFdCngDec->hFdCngCom->sidNoiseEstExp - new_sidNoiseEstExp ); - Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEst, NPART, st->hFdCngDec->hFdCngCom->sidNoiseEstExp - new_sidNoiseEstExp ); + move16(); + Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, new_sidNoiseEstExp ) ); + Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEst, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, new_sidNoiseEstExp ) ); st->hFdCngDec->hFdCngCom->sidNoiseEstExp = new_sidNoiseEstExp; + move16(); Word16 new_cngNoiseLevelExp = 31 - Q4; + move16(); Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp - new_cngNoiseLevelExp ); st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = new_cngNoiseLevelExp; + move16(); ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); - IF( LT_16( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 0 ) ) + IF( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp < 0 ) { Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ); st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 0; @@ -683,7 +700,8 @@ ivas_error acelp_core_dec_ivas_fx( { Word32 noise_lvl_highest_fx; - noise_lvl_highest_fx = st->hFdCngDec->hFdCngCom->cngNoiseLevel[st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand - 1]; + noise_lvl_highest_fx = st->hFdCngDec->hFdCngCom->cngNoiseLevel[sub( sub( st->hFdCngDec->hFdCngCom->stopFFTbin, st->hFdCngDec->hFdCngCom->startBand ), 1 )]; + move32(); FOR( Word16 b = st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand; b < st->hFdCngDec->hFdCngCom->stopBand; b++ ) { st->hFdCngDec->hFdCngCom->cngNoiseLevel[b] = noise_lvl_highest_fx; @@ -819,7 +837,7 @@ ivas_error acelp_core_dec_ivas_fx( test(); test(); test(); - IF( st->hTdCngDec != NULL && ( EQ_32( st->last_core_brate, FRAME_NO_DATA ) || EQ_32( st->last_core_brate, SID_2k40 ) ) ) + IF( st->hTdCngDec != NULL && ( st->last_core_brate == FRAME_NO_DATA || EQ_32( st->last_core_brate, SID_2k40 ) ) ) { Copy( st->lspCNG_fx, st->lsp_old_fx, M ); lsp2lsf_fx( st->lspCNG_fx, st->lsf_old_fx, M, int_fs ); @@ -832,10 +850,10 @@ ivas_error acelp_core_dec_ivas_fx( IF( !st->use_acelp_preq ) { st->mem_preemp_preQ_fx = 0; - st->last_nq_preQ = 0; - st->last_code_preq = 0; move16(); + st->last_nq_preQ = 0; move16(); + st->last_code_preq = 0; move16(); } st->use_acelp_preq = 0; @@ -877,12 +895,10 @@ ivas_error acelp_core_dec_ivas_fx( } pt_interp_2_fx = interpol_frac_fx; - move16(); test(); - IF( EQ_16( tdm_low_rate_mode, 1 ) && GT_16( st->coder_type, UNVOICED ) ) + if ( EQ_16( tdm_low_rate_mode, 1 ) && GT_16( st->coder_type, UNVOICED ) ) { pt_interp_2_fx = interpol_frac2_fx; - move16(); } IF( EQ_16( st->active_cnt, 1 ) ) @@ -895,1096 +911,1039 @@ ivas_error acelp_core_dec_ivas_fx( int_lsp_fx( st->L_frame, st->lsp_old_fx, lsp_new_fx, Aq_fx, M, pt_interp_2_fx, 0 ); /* Check LSF stability (distance between old LSFs and current LSFs) */ st->stab_fac_fx = lsf_stab_ivas_fx( lsf_new_fx, st->lsf_old_fx, 0, st->L_frame ); + move16(); } #ifndef MSAN_FIX for ( int nsf = 0; nsf < NB_SUBFR16k; nsf++ ) - { #else FOR( Word32 nsf = 0; nsf < st->nb_subfr; nsf++ ) #endif - { - Scale_sig( Aq_fx + ( nsf * ( M + 1 ) ), M + 1, sub( norm_s( Aq_fx[imult3216( nsf, add( M, 1 ) )] ), Q2 ) ); - Aq_fx[imult3216( nsf, add( M, 1 ) )] = ONE_IN_Q12; - move16(); - } - test(); - IF( EQ_16( st->last_core, HQ_CORE ) && GT_16( st->element_mode, EVS_MONO ) ) - { - /* Prepare ACB memory from last HQ frame */ - old_exc_s_fx = st->old_exc_fx + L_EXC_MEM_DEC - st->L_frame; - tmpF_fx = *old_exc_s_fx; - st->mem_deemph_fx = old_exc_s_fx[st->L_frame - 1]; - preemph_fx( old_exc_s_fx, st->preemph_fac, L_FRAME16k, &tmpF_fx ); - Copy( old_exc_s_fx + st->L_frame - M, st->mem_syn2_fx, M ); - Residu3_fx( Aq_fx, old_exc_s_fx, old_exc_fx + L_EXC_MEM_DEC - st->L_frame, st->L_frame, 0 ); + { + Scale_sig( Aq_fx + ( nsf * ( M + 1 ) ), M + 1, sub( norm_s( Aq_fx[imult3216( nsf, M + 1 )] ), Q2 ) ); + Aq_fx[imult3216( nsf, M + 1 )] = ONE_IN_Q12; + move16(); + } + test(); + IF( EQ_16( st->last_core, HQ_CORE ) && st->element_mode > EVS_MONO ) + { + /* Prepare ACB memory from last HQ frame */ + old_exc_s_fx = st->old_exc_fx + L_EXC_MEM_DEC - st->L_frame; + tmpF_fx = *old_exc_s_fx; + st->mem_deemph_fx = old_exc_s_fx[sub( st->L_frame, 1 )]; + move16(); + preemph_fx( old_exc_s_fx, st->preemph_fac, L_FRAME16k, &tmpF_fx ); + Copy( old_exc_s_fx + st->L_frame - M, st->mem_syn2_fx, M ); + Residu3_fx( Aq_fx, old_exc_s_fx, old_exc_fx + L_EXC_MEM_DEC - st->L_frame, st->L_frame, 0 ); #ifdef FIX_737_HQ_ACELP_SWITCH_SCALING_ERROR - Scale_sig( old_exc_fx + L_EXC_MEM_DEC - st->L_frame, st->L_frame, st->Q_exc ); + Scale_sig( old_exc_fx + L_EXC_MEM_DEC - st->L_frame, st->L_frame, st->Q_exc ); #endif + } + test(); + IF( st->last_core != ACELP_CORE && st->element_mode > EVS_MONO ) + { + /* Prepare ACB memory of old_bwe_exc */ + IF( EQ_16( st->L_frame, L_FRAME ) ) + { + lerp( old_exc_fx, old_bwe_exc_fx, L_EXC_MEM_DEC * HIBND_ACB_L_FAC, L_EXC_MEM_DEC ); } - test(); - IF( NE_16( st->last_core, ACELP_CORE ) && GT_16( st->element_mode, EVS_MONO ) ) + ELSE { - /* Prepare ACB memory of old_bwe_exc */ - IF( EQ_16( st->L_frame, L_FRAME ) ) - { - lerp( old_exc_fx, old_bwe_exc_fx, L_EXC_MEM_DEC * HIBND_ACB_L_FAC, L_EXC_MEM_DEC ); - } - ELSE - { - lerp( old_exc_fx, old_bwe_exc_fx, shl( L_EXC_MEM_DEC, 1 ), L_EXC_MEM_DEC ); - } + lerp( old_exc_fx, old_bwe_exc_fx, shl( L_EXC_MEM_DEC, 1 ), L_EXC_MEM_DEC ); } + } - /*-----------------------------------------------------------------* - * FEC - first good frame after lost frame(s) (possibility to correct the ACB) - *-----------------------------------------------------------------*/ + /*-----------------------------------------------------------------* + * FEC - first good frame after lost frame(s) (possibility to correct the ACB) + *-----------------------------------------------------------------*/ - IF( st->acelp_cfg.FEC_mode > 0 ) + IF( st->acelp_cfg.FEC_mode > 0 ) + { + last_pulse_pos = 0; + move16(); + /* decode the last glottal pulse position */ + T0_tmp = FEC_pos_dec_fx( st, &last_pulse_pos, &enr_q_fx, nb_bits ); + test(); + test(); + IF( NE_16( st->last_core, HQ_CORE ) || ( EQ_16( st->last_core, HQ_CORE ) && st->last_con_tcx ) ) { - last_pulse_pos = 0; - move16(); - /* decode the last glottal pulse position */ - T0_tmp = FEC_pos_dec_fx( st, &last_pulse_pos, &enr_q_fx, nb_bits ); test(); test(); - IF( NE_16( st->last_core, HQ_CORE ) || ( EQ_16( st->last_core, HQ_CORE ) && st->last_con_tcx ) ) + test(); + test(); + test(); + test(); + IF( EQ_16( st->clas_dec, SIN_ONSET ) && last_pulse_pos != 0 && EQ_16( st->prev_bfi, 1 ) ) { - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( st->clas_dec, SIN_ONSET ) && NE_16( last_pulse_pos, 0 ) && EQ_16( st->prev_bfi, 1 ) ) - { - FEC_SinOnset_fx( old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, last_pulse_pos, T0_tmp, enr_q_fx, Aq_fx, st->L_frame, st->Q_exc ); - } - ELSE IF( ( EQ_16( st->coder_type, GENERIC ) || EQ_16( st->coder_type, VOICED ) ) && NE_16( last_pulse_pos, 0 ) && EQ_16( st->old_bfi_cnt, 1 ) && st->hWIDec != NULL ) - { - do_WI = FEC_enhACB_fx( st->L_frame, st->last_L_frame, old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, T0_tmp, last_pulse_pos, st->bfi_pitch_fx ); - } + FEC_SinOnset_fx( old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, last_pulse_pos, T0_tmp, enr_q_fx, Aq_fx, st->L_frame, st->Q_exc ); + } + ELSE IF( ( EQ_16( st->coder_type, GENERIC ) || EQ_16( st->coder_type, VOICED ) ) && last_pulse_pos != 0 && EQ_16( st->old_bfi_cnt, 1 ) && st->hWIDec != NULL ) + { + do_WI = FEC_enhACB_fx( st->L_frame, st->last_L_frame, old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, T0_tmp, last_pulse_pos, st->bfi_pitch_fx ); } } + } - /*------------------------------------------------------------* - * In case of first frame after an erasure and transition from voiced to unvoiced or inactive - * redo the LPC interpolation - *------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( st->stab_fac_fx == 0 ) && ( st->old_bfi_cnt > 0 ) && NE_16( st->clas_dec, VOICED_CLAS ) && NE_16( st->clas_dec, ONSET ) && ( st->relax_prev_lsf_interp == 0 ) && !( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( st->idchan, 1 ) ) ) - { - int_lsp4_fx( st->L_frame, st->lsp_old_fx, lsp_mid_fx, lsp_new_fx, Aq_fx, M, 2 ); - } + /*------------------------------------------------------------* + * In case of first frame after an erasure and transition from voiced to unvoiced or inactive + * redo the LPC interpolation + *------------------------------------------------------------*/ + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( st->stab_fac_fx == 0 ) && ( st->old_bfi_cnt > 0 ) && NE_16( st->clas_dec, VOICED_CLAS ) && NE_16( st->clas_dec, ONSET ) && ( st->relax_prev_lsf_interp == 0 ) && !( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( st->idchan, 1 ) ) ) + { + int_lsp4_fx( st->L_frame, st->lsp_old_fx, lsp_mid_fx, lsp_new_fx, Aq_fx, M, 2 ); + } - /*---------------------------------------------------------------* - * Decoding of the scaled predicted innovation energy - *---------------------------------------------------------------*/ + /*---------------------------------------------------------------* + * Decoding of the scaled predicted innovation energy + *---------------------------------------------------------------*/ - IF( GT_16( nb_bits, 0 ) ) + IF( nb_bits > 0 ) + { + indice = get_next_indice( st, nb_bits ); + Es_pred_dec_fx( &Es_pred_fx, indice, nb_bits, uc_two_stage_flag ); + } + + /*------------------------------------------------------------* + * Decode excitation according to coding type + *------------------------------------------------------------*/ + test(); + test(); + IF( tdm_low_rate_mode ) /* tdm stereo low rate mode */ + { + IF( LE_16( st->coder_type, UNVOICED ) ) { - indice = get_next_indice( st, nb_bits ); - Es_pred_dec_fx( &Es_pred_fx, indice, nb_bits, uc_two_stage_flag ); + tdm_low_rate_dec_fx( st, dct_exc_tmp_fx /*, &tmp_noise*/, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx ); + tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ } - - /*------------------------------------------------------------* - * Decode excitation according to coding type - *------------------------------------------------------------*/ - test(); - test(); - IF( tdm_low_rate_mode ) /* tdm stereo low rate mode */ + ELSE /* GENERIC */ { - IF( LE_16( st->coder_type, UNVOICED ) ) + decod_gen_2sbfr_ivas_fx( st, sharpFlag, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); + + if ( EQ_16( st->element_mode, IVAS_CPE_TD ) ) { - tdm_low_rate_dec_fx( st, dct_exc_tmp_fx /*, &tmp_noise*/, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx ); tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ } - ELSE /* GENERIC */ - { - decod_gen_2sbfr_ivas_fx( st, sharpFlag, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); - - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ - } - } - } - ELSE IF( st->nelp_mode_dec ) - { - /* SC-VBR - NELP frames */ - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, -st->Q_exc ); - st->Q_exc = 0; - move16(); - /* SC-VBR - NELP frames */ - decod_nelp_fx( st, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors_fx, bwe_exc_fx, &st->Q_exc, st->bfi, gain_buf_fx ); - Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); } - ELSE IF( EQ_16( st->coder_type, UNVOICED ) ) + } + ELSE IF( st->nelp_mode_dec ) + { + /* SC-VBR - NELP frames */ + Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st->Q_exc ) ); + st->Q_exc = 0; + move16(); + /* SC-VBR - NELP frames */ + decod_nelp_fx( st, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors_fx, bwe_exc_fx, &st->Q_exc, st->bfi, gain_buf_fx ); + Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); + } + ELSE IF( EQ_16( st->coder_type, UNVOICED ) ) + { + /* UNVOICED frames */ + decod_unvoiced_ivas_fx( st, Aq_fx, Es_pred_fx, uc_two_stage_flag, st->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx ); + tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ + } + ELSE IF( st->ppp_mode_dec ) + { + Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st->Q_exc ) ); + st->Q_exc = 0; + move16(); + /* SC-VBR - PPP frames */ + IF( ( error = decod_ppp_fx( st, Aq_fx, pitch_buf_fx, exc_fx, exc2_fx, st->bfi, gain_buf_fx, voice_factors_fx, bwe_exc_fx ) ) != IVAS_ERR_OK ) { - /* UNVOICED frames */ - decod_unvoiced_ivas_fx( st, Aq_fx, Es_pred_fx, uc_two_stage_flag, st->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx ); - tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ + return error; } - ELSE IF( st->ppp_mode_dec ) - { - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, -st->Q_exc ); - st->Q_exc = 0; - move16(); - /* SC-VBR - PPP frames */ - IF( ( error = decod_ppp_fx( st, Aq_fx, pitch_buf_fx, exc_fx, exc2_fx, st->bfi, gain_buf_fx, voice_factors_fx, bwe_exc_fx ) ) != IVAS_ERR_OK ) - { - return error; - } - Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); - } - ELSE IF( EQ_16( st->coder_type, TRANSITION ) ) + Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); + } + ELSE IF( EQ_16( st->coder_type, TRANSITION ) ) + { + decod_tran_fx( st, st->L_frame, tc_subfr, Aq_fx, Es_pred_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, unbits, sharpFlag, gain_buf_fx ); + } + ELSE IF( EQ_16( st->coder_type, AUDIO ) || ( EQ_16( st->coder_type, INACTIVE ) && st->inactive_coder_type_flag ) ) + { + /* AUDIO and INACTIVE frames (coded by GSC technology) */ + decod_audio_ivas_fx( st, dct_exc_tmp_fx, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf_fx +#if 1 // def ADD_LRTD + , + tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx +#endif + ); + tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ + } + ELSE + { + /* GENERIC, VOICED and INACTIVE frames (coded by AVQ technology) */ + IF( ( error = decod_gen_voic_ivas_fx( st, st->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ) ) != IVAS_ERR_OK ) { - decod_tran_fx( st, st->L_frame, tc_subfr, Aq_fx, Es_pred_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, unbits, sharpFlag, gain_buf_fx ); + return error; } - ELSE IF( EQ_16( st->coder_type, AUDIO ) || ( EQ_16( st->coder_type, INACTIVE ) && st->inactive_coder_type_flag ) ) + + if ( EQ_16( st->element_mode, IVAS_CPE_TD ) ) { - /* AUDIO and INACTIVE frames (coded by GSC technology) */ - decod_audio_ivas_fx( st, dct_exc_tmp_fx, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf_fx -#if 1 // def ADD_LRTD - , - tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx -#endif - ); tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ } - ELSE - { - /* GENERIC, VOICED and INACTIVE frames (coded by AVQ technology) */ - IF( ( error = decod_gen_voic_ivas_fx( st, st->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ) ) != IVAS_ERR_OK ) - { - return error; - } + } - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ - } - } + /* synthesis for ACELP core switching and SWB BWE */ + syn_12k8_fx( st->L_frame, Aq_fx, exc_fx, temp_buf_fx, st->mem_syn1_fx, 1, st->Q_exc, -1 ); + + /* save and delay synthesis to be used by SWB BWE */ + IF( st->hBWE_FD != NULL ) + { + save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); + } - /* synthesis for ACELP core switching and SWB BWE */ - syn_12k8_fx( st->L_frame, Aq_fx, exc_fx, temp_buf_fx, st->mem_syn1_fx, 1, st->Q_exc, -1 ); + /*-----------------------------------------------------------------* + * Apply energy matching when switching to inactive frames + *-----------------------------------------------------------------*/ - /* save and delay synthesis to be used by SWB BWE */ - IF( st->hBWE_FD != NULL ) - { - save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); - } + Inac_switch_ematch_ivas_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->L_frame, st->total_brate, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); - /*-----------------------------------------------------------------* - * Apply energy matching when switching to inactive frames - *-----------------------------------------------------------------*/ + /*------------------------------------------------------------* + * Decode information and modify the excitation signal of stationary unvoiced frames + *------------------------------------------------------------*/ + test(); + test(); + test(); + test(); + IF( !( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) ) && NE_16( st->nelp_mode_dec, 1 ) && !( EQ_16( st->element_mode, IVAS_SCE ) && tdm_low_rate_mode ) ) + { + stat_noise_uv_dec_fx( st, lsp_new_fx, lsp_mid_fx, Aq_fx, exc2_fx, uc_two_stage_flag ); + } - Inac_switch_ematch_ivas_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->L_frame, st->total_brate, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); + /*------------------------------------------------------------* + * Save filter memory in case the synthesis is redone after scaling + * Synthesis at 12k8 Hz sampling rate + *------------------------------------------------------------*/ - /*------------------------------------------------------------* - * Decode information and modify the excitation signal of stationary unvoiced frames - *------------------------------------------------------------*/ - test(); + /* update past excitation signals for LD music post-filter */ + IF( st->hMusicPF != NULL ) + { + Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); + Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + Copy( st->hMusicPF->dct_post_old_exc_fx, exc_buffer_fx, DCT_L_POST - OFFSET2 ); + } + + test(); + test(); + test(); + IF( ( EQ_16( st->coder_type, AUDIO ) && !st->GSC_noisy_speech ) || ( GE_16( st->GSC_IVAS_mode, 1 ) && EQ_16( st->L_frame, L_FRAME ) ) ) + { + Word16 last_coder_type = st->last_coder_type; + move16(); test(); test(); test(); - IF( !( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) ) && NE_16( st->nelp_mode_dec, 1 ) && !( EQ_16( st->element_mode, IVAS_SCE ) && tdm_low_rate_mode ) ) + if ( ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) ) || ( GE_16( st->GSC_IVAS_mode, 1 ) && ( st->GSC_noisy_speech == 0 ) ) ) { - stat_noise_uv_dec_fx( st, lsp_new_fx, lsp_mid_fx, Aq_fx, exc2_fx, uc_two_stage_flag ); + last_coder_type = AUDIO; + move16(); } - /*------------------------------------------------------------* - * Save filter memory in case the synthesis is redone after scaling - * Synthesis at 12k8 Hz sampling rate - *------------------------------------------------------------*/ + Word16 qdct = 0; + move16(); + /* Extrapolation of the last future part, windowing and high resolution DCT transform */ + Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, st->hMusicPF->filt_lfE_fx, st->last_core, st->element_mode, pitch_buf_fx, st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); - /* update past excitation signals for LD music post-filter */ - IF( st->hMusicPF != NULL ) + /* LD music post-filter */ + LD_music_post_filter_fx( st->hMusicPF, dct_buffer_fx, dct_buffer_fx, st->core_brate, &st->hMusicPF->Old_ener_Q, AUDIO, last_coder_type, qdct ); + + /* Inverse DCT transform, retrieval of the aligned excitation, re-synthesis */ + Copy( st->mem_syn2_fx, mem_tmp_fx, M ); + Post_music_postP_fx( dct_buffer_fx, exc2_fx, st->mem_syn2_fx, st->mem_syn2_fx, Aq_fx, psyn_fx, &st->Q_exc, &st->prev_Q_syn, + &st->Q_syn, st->mem_syn_clas_estim_fx, 0, &st->mem_deemph_fx, st->hBPF->pst_old_syn_fx, + &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, temp_buf_fx, mem_tmp_fx ); + } + ELSE + { + /* Core synthesis at 12.8kHz or 16kHz */ + i = 1; + move16(); + if ( st->coder_type == INACTIVE ) { - Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, sub( sub( DCT_L_POST, L_FRAME ), OFFSET2 ) ); - Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); - Copy( st->hMusicPF->dct_post_old_exc_fx, exc_buffer_fx, sub( DCT_L_POST, OFFSET2 ) ); + i = 0; + move16(); } + /* add extra headroom in case a CNA addition is likely (i.e. st_fx->psf_lp_noise_fx is close to the threshold) */ + Word16 k = 0; + move16(); test(); test(); - test(); - - IF( ( EQ_16( st->coder_type, AUDIO ) && !st->GSC_noisy_speech ) || ( GE_16( st->GSC_IVAS_mode, 1 ) && EQ_16( st->L_frame, L_FRAME ) ) ) + if ( st->coder_type == INACTIVE && st->flag_cna && GE_16( round_fx( L_shl( st->lp_noise, 1 ) ), 15 << 7 ) ) { - Word16 last_coder_type = st->last_coder_type; + k = 1; move16(); - test(); - test(); - test(); - IF( ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) ) || ( GE_16( st->GSC_IVAS_mode, 1 ) && ( st->GSC_noisy_speech == 0 ) ) ) - { - last_coder_type = AUDIO; - move16(); - } + } - Word16 qdct = 0; - move16(); - /* Extrapolation of the last future part, windowing and high resolution DCT transform */ - Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, st->hMusicPF->filt_lfE_fx, st->last_core, st->element_mode, pitch_buf_fx, st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); + Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, 4, &st->mem_deemph_fx, + st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, i, k, temp_buf_fx ); - /* LD music post-filter */ - LD_music_post_filter_fx( st->hMusicPF, dct_buffer_fx, dct_buffer_fx, st->core_brate, &st->hMusicPF->Old_ener_Q, AUDIO, last_coder_type, qdct ); + Copy( st->mem_syn2_fx, mem_tmp_fx, M ); + syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); - /* Inverse DCT transform, retrieval of the aligned excitation, re-synthesis */ - Copy( st->mem_syn2_fx, mem_tmp_fx, M ); - Post_music_postP_fx( dct_buffer_fx, exc2_fx, st->mem_syn2_fx, st->mem_syn2_fx, Aq_fx, psyn_fx, &st->Q_exc, &st->prev_Q_syn, - &st->Q_syn, st->mem_syn_clas_estim_fx, 0, &st->mem_deemph_fx, st->hBPF->pst_old_syn_fx, - &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, temp_buf_fx, mem_tmp_fx ); - } - ELSE + IF( st->hMusicPF != NULL ) { - /* Core synthesis at 12.8kHz or 16kHz */ - i = 1; - move16(); - if ( EQ_16( st->coder_type, INACTIVE ) ) - { - i = 0; - move16(); - } - /* add extra headroom in case a CNA addition is likely (i.e. st_fx->psf_lp_noise_fx is close to the threshold) */ - Word16 k = 0; - move16(); - test(); - test(); - IF( EQ_16( st->coder_type, INACTIVE ) && st->flag_cna && GE_16( round_fx( L_shl( st->lp_noise, 1 ) ), 15 << 7 ) ) + FOR( i = 0; i < DCT_L_POST; i++ ) { - k = 1; + st->hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, st->hMusicPF->filt_lfE_fx[i] ) ); move16(); } + } + } - Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, 4, &st->mem_deemph_fx, - st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, i, k, temp_buf_fx ); - - Copy( st->mem_syn2_fx, mem_tmp_fx, M ); - syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); + /*------------------------------------------------------------* + * FEC - Estimate the classification information + *------------------------------------------------------------*/ - IF( st->hMusicPF != NULL ) - { - FOR( i = 0; i < DCT_L_POST; i++ ) - { - st->hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, st->hMusicPF->filt_lfE_fx[i] ) ); - } - } - } + FEC_clas_estim_fx( st, st->Opt_AMR_WB, st->L_frame, &st->clas_dec, st->coder_type, pitch_buf_fx, + psyn_fx, &st->lp_ener_FER_fx, &st->decision_hyst, + NULL, NULL, NULL, NULL, 0, NULL, st->core_brate, st->Q_syn, temp_buf_fx, + st->mem_syn_clas_estim_fx, &st->classifier_Q_mem_syn, + 0, 0, 0, st->last_core_brate, st->acelp_cfg.FEC_mode ); + /*------------------------------------------------------------* + * FEC - Estimate pitch + *------------------------------------------------------------*/ - /*------------------------------------------------------------* - * FEC - Estimate the classification information - *------------------------------------------------------------*/ + FEC_pitch_estim_fx( st->Opt_AMR_WB, st->last_core, st->L_frame, st->clas_dec, st->last_good, pitch_buf_fx, st->old_pitch_buf_fx, + &st->bfi_pitch_fx, &st->bfi_pitch_frame, &st->upd_cnt, st->coder_type, st->element_mode ); - FEC_clas_estim_fx( st, st->Opt_AMR_WB, st->L_frame, &st->clas_dec, st->coder_type, pitch_buf_fx, - psyn_fx, &st->lp_ener_FER_fx, &st->decision_hyst, - NULL, NULL, NULL, NULL, 0, NULL, st->core_brate, st->Q_syn, temp_buf_fx, - st->mem_syn_clas_estim_fx, &st->classifier_Q_mem_syn, - 0, 0, 0, st->last_core_brate, st->acelp_cfg.FEC_mode ); - /*------------------------------------------------------------* - * FEC - Estimate pitch - *------------------------------------------------------------*/ + /*------------------------------------------------------------* + * FEC - Smooth the speech energy evolution when recovering after a BAD frame + * (smoothing is performed in the excitation domain and signal is resynthesized after) + *------------------------------------------------------------*/ - FEC_pitch_estim_fx( st->Opt_AMR_WB, st->last_core, st->L_frame, st->clas_dec, st->last_good, pitch_buf_fx, st->old_pitch_buf_fx, - &st->bfi_pitch_fx, &st->bfi_pitch_frame, &st->upd_cnt, st->coder_type, st->element_mode ); + move16(); + Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, NB_SUBFR16k, -Q6 ); + FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, + &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, + exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, avoid_lpc_burst_on_recovery, 0 ); + test(); + test(); + test(); + test(); + /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ + IF( ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && LE_32( st->total_brate, ACELP_7k20 ) ) || EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) + { + frame_ener_fx( st->L_frame, st->clas_dec, psyn_fx, pitch_buf_tmp[sub( shr( st->L_frame, 6 ), 1 )], &st->enr_old_fx, st->L_frame, st->Q_syn, 3, 0 ); + } + } - /*------------------------------------------------------------* - * FEC - Smooth the speech energy evolution when recovering after a BAD frame - * (smoothing is performed in the excitation domain and signal is resynthesized after) - *------------------------------------------------------------*/ + } /* End of GOOD FRAME */ - move16(); - Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, NB_SUBFR16k, -Q6 ); - FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, - &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, avoid_lpc_burst_on_recovery, 0 ); - test(); - test(); - test(); - /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ - IF( ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && LE_32( st->total_brate, ACELP_7k20 ) ) || EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) - { - frame_ener_fx( st->L_frame, st->clas_dec, psyn_fx, pitch_buf_tmp[sub( shr( st->L_frame, 6 ), 1 )], &st->enr_old_fx, st->L_frame, st->Q_syn, 3, 0 ); - } - } - - } /* End of GOOD FRAME */ - - /*----------------------------------------------------------------* - * BAD frame - *----------------------------------------------------------------*/ + /*----------------------------------------------------------------* + * BAD frame + *----------------------------------------------------------------*/ - ELSE + ELSE + { + /* SC-VBR */ + if ( EQ_16( st->last_nelp_mode_dec, 1 ) ) { - /* SC-VBR */ - if ( EQ_16( st->last_nelp_mode_dec, 1 ) ) - { - st->nelp_mode_dec = 1; - move16(); - } - test(); - test(); - test(); - /* long burst frame erasures */ - IF( GT_16( st->nbLostCmpt, 5 ) && GE_16( st->clas_dec, VOICED_CLAS ) && LT_16( st->clas_dec, INACTIVE_CLAS ) ) - { - st->last_good = VOICED_TRANSITION; - move16(); - } + st->nelp_mode_dec = 1; + move16(); + } + test(); + test(); + /* long burst frame erasures */ + if ( GT_16( st->nbLostCmpt, 5 ) && GE_16( st->clas_dec, VOICED_CLAS ) && LT_16( st->clas_dec, INACTIVE_CLAS ) ) + { + st->last_good = VOICED_TRANSITION; + move16(); + } - /* LSF estimation and A(z) calculation */ - lsf_dec_bfi( MODE1, lsf_new_fx, st->lsf_old_fx, st->lsf_adaptive_mean_fx, NULL, st->mem_MA_fx, st->mem_AR_fx, st->stab_fac_fx, st->last_coder_type, st->L_frame, st->last_good, st->nbLostCmpt, 0, NULL, NULL, NULL, st->hGSCDec->Last_GSC_pit_band_idx, st->Opt_AMR_WB, 0, st->bwidth ); + /* LSF estimation and A(z) calculation */ + lsf_dec_bfi( MODE1, lsf_new_fx, st->lsf_old_fx, st->lsf_adaptive_mean_fx, NULL, st->mem_MA_fx, st->mem_AR_fx, st->stab_fac_fx, st->last_coder_type, st->L_frame, st->last_good, st->nbLostCmpt, 0, NULL, NULL, NULL, st->hGSCDec->Last_GSC_pit_band_idx, st->Opt_AMR_WB, 0, st->bwidth ); - FEC_lsf2lsp_interp( st, st->L_frame, Aq_fx, lsf_new_fx, lsp_new_fx ); + FEC_lsf2lsp_interp( st, st->L_frame, Aq_fx, lsf_new_fx, lsp_new_fx ); #ifndef MSAN_FIX - for ( int nsf = 0; nsf < NB_SUBFR16k; nsf++ ) - { + for ( int nsf = 0; nsf < NB_SUBFR16k; nsf++ ) + { #else FOR( Word32 nsf = 0; nsf < st->nb_subfr; nsf++ ) { #endif - Scale_sig( Aq_fx + ( nsf * ( M + 1 ) ), M + 1, sub( norm_s( Aq_fx[imult3216( nsf, add( M, 1 ) )] ), Q2 ) ); - Aq_fx[imult3216( nsf, add( M, 1 ) )] = ONE_IN_Q12; - move16(); - } - IF( EQ_16( st->nelp_mode_dec, 1 ) ) - { - /* SC-VBR */ - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, -st->Q_exc ); - st->Q_exc = 0; - move16(); - - decod_nelp_fx( st, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors_fx, bwe_exc_fx, &st->Q_exc, st->bfi, gain_buf_fx ); - FEC_pitch_fx = pitch_buf_fx[3]; - move16(); - Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); - } - ELSE - { - /* calculation of excitation signal */ - FEC_exc_estim_fx( st, st->L_frame, exc_fx, exc2_fx, dct_exc_tmp_fx, pitch_buf_fx, voice_factors_fx, &FEC_pitch_fx, bwe_exc_fx, lsf_new_fx, &st->Q_exc, &tmp_noise_fx ); + Scale_sig( Aq_fx + ( nsf * ( M + 1 ) ), M + 1, sub( norm_s( Aq_fx[imult3216( nsf, M + 1 )] ), Q2 ) ); + Aq_fx[imult3216( nsf, M + 1 )] = ONE_IN_Q12; + move16(); + } + IF( EQ_16( st->nelp_mode_dec, 1 ) ) + { + /* SC-VBR */ + Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st->Q_exc ) ); + st->Q_exc = 0; + move16(); - Rescale_exc( NULL, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, L_FRAME32k, (Word32) 0, - &( st->Q_exc ), st->Q_subfr, exc2_fx, st->L_frame, st->last_coder_type ); + decod_nelp_fx( st, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors_fx, bwe_exc_fx, &st->Q_exc, st->bfi, gain_buf_fx ); + FEC_pitch_fx = pitch_buf_fx[3]; + move16(); + Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); + } + ELSE + { + /* calculation of excitation signal */ + FEC_exc_estim_fx( st, st->L_frame, exc_fx, exc2_fx, dct_exc_tmp_fx, pitch_buf_fx, voice_factors_fx, &FEC_pitch_fx, bwe_exc_fx, lsf_new_fx, &st->Q_exc, &tmp_noise_fx ); - tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ + Rescale_exc( NULL, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, L_FRAME32k, (Word32) 0, + &( st->Q_exc ), st->Q_subfr, exc2_fx, st->L_frame, st->last_coder_type ); - /* SC-VBR */ - st->prev_gain_pit_dec_fx = st->lp_gainp_fx; - move16(); - } + tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ - /* synthesis for ACELP core switching and SWB BWE */ - syn_12k8_fx( st->L_frame, Aq_fx, exc_fx, temp_buf_fx, st->mem_syn1_fx, 1, st->Q_exc, -1 ); + /* SC-VBR */ + st->prev_gain_pit_dec_fx = st->lp_gainp_fx; + move16(); + } - /* save and delay synthesis to be used by SWB BWE */ - IF( st->hBWE_FD != NULL ) - { - save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); - } + /* synthesis for ACELP core switching and SWB BWE */ + syn_12k8_fx( st->L_frame, Aq_fx, exc_fx, temp_buf_fx, st->mem_syn1_fx, 1, st->Q_exc, -1 ); - /* Apply energy matching when switching to inactive frames */ - Inac_switch_ematch_ivas_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->L_frame, st->total_brate, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); + /* save and delay synthesis to be used by SWB BWE */ + IF( st->hBWE_FD != NULL ) + { + save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); + } - /* update past excitation signals for LD music post-filter */ - IF( st->hMusicPF != NULL ) - { - Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + /* Apply energy matching when switching to inactive frames */ + Inac_switch_ematch_ivas_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->L_frame, st->total_brate, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); - /* Update music post processing values */ - /* Filter energies update */ - FOR( i = 0; i < DCT_L_POST; i++ ) - { - st->hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( L_shl( 1228, ( 16 ) ), 22938, st->hMusicPF->filt_lfE_fx[i] ) ); - move16(); - } - /* Update circular buffer, keep last energy difference unchanged */ - FOR( i = 1; i < MAX_LT; i++ ) - { - st->hMusicPF->LDm_lt_diff_etot_fx[i - 1] = st->hMusicPF->LDm_lt_diff_etot_fx[i]; - move16(); - } - } + /* update past excitation signals for LD music post-filter */ + IF( st->hMusicPF != NULL ) + { + Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); + Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); - /* synthesis at 12k8 Hz sampling rate */ - /* add extra headroom in case a CNA addition is likely (i.e. st_fx->psf_lp_noise_fx is close to the threshold) */ - Word16 k = 0; - move16(); - test(); - test(); - IF( EQ_16( st->coder_type, INACTIVE ) && st->flag_cna && GE_16( round_fx( L_shl( st->lp_noise, 1 ) ), 15 << 7 ) ) + /* Update music post processing values */ + /* Filter energies update */ + FOR( i = 0; i < DCT_L_POST; i++ ) { - k = 1; + st->hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( L_shl( 1228, ( 16 ) ), 22938, st->hMusicPF->filt_lfE_fx[i] ) ); move16(); } - - Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, 4, &st->mem_deemph_fx, - st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, 1, k, temp_buf_fx ); - test(); - IF( ( st->total_brate == ACELP_7k20 ) || ( st->total_brate == ACELP_8k00 ) ) + /* Update circular buffer, keep last energy difference unchanged */ + FOR( i = 1; i < MAX_LT; i++ ) { - Copy( st->mem_syn2_fx, mem_tmp_fx, M ); + st->hMusicPF->LDm_lt_diff_etot_fx[i - 1] = st->hMusicPF->LDm_lt_diff_etot_fx[i]; + move16(); } - syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); + } - /* update buffer for classifier */ - IF( st->hWIDec != NULL ) - { - Copy( exc2_fx + st->L_frame - L_EXC_MEM, st->hWIDec->old_exc2_fx, L_EXC_MEM ); - Copy( psyn_fx + st->L_frame - L_EXC_MEM, st->hWIDec->old_syn2_fx, L_EXC_MEM ); - } - st->prev_Q_exc_fr = st->Q_exc; - st->prev_Q_syn_fr = st->Q_syn; - move16(); + /* synthesis at 12k8 Hz sampling rate */ + /* add extra headroom in case a CNA addition is likely (i.e. st_fx->psf_lp_noise_fx is close to the threshold) */ + Word16 k = 0; + move16(); + test(); + test(); + if ( st->coder_type == INACTIVE && st->flag_cna && GE_16( round_fx( L_shl( st->lp_noise, 1 ) ), 15 << 7 ) ) + { + k = 1; move16(); - Copy( psyn_fx + st->L_frame - L_SYN_MEM_CLAS_ESTIM, st->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); + } - /*------------------------------------------------------------* - * FEC - Smooth the speech energy evolution when recovering after a BAD frame - * (smoothing is performed in the excitation domain and signal is resynthesized after) - *------------------------------------------------------------*/ - test(); - IF( EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) - { - Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, NB_SUBFR16k, -Q6 ); + Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, 4, &st->mem_deemph_fx, + st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, 1, k, temp_buf_fx ); + test(); + IF( EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) + { + Copy( st->mem_syn2_fx, mem_tmp_fx, M ); + } + syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); - FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, - &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, avoid_lpc_burst_on_recovery, 0 ); - } + /* update buffer for classifier */ + IF( st->hWIDec != NULL ) + { + Copy( exc2_fx + st->L_frame - L_EXC_MEM, st->hWIDec->old_exc2_fx, L_EXC_MEM ); + Copy( psyn_fx + st->L_frame - L_EXC_MEM, st->hWIDec->old_syn2_fx, L_EXC_MEM ); + } + st->prev_Q_exc_fr = st->Q_exc; + move16(); + st->prev_Q_syn_fr = st->Q_syn; + move16(); + Copy( psyn_fx + st->L_frame - L_SYN_MEM_CLAS_ESTIM, st->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); - /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ - frame_ener_fx( st->L_frame, st->last_good, psyn_fx, shr( add( FEC_pitch_fx, 32 ), 6 ), &st->enr_old_fx, st->L_frame, st->Q_syn, 3, 0 ); + /*------------------------------------------------------------* + * FEC - Smooth the speech energy evolution when recovering after a BAD frame + * (smoothing is performed in the excitation domain and signal is resynthesized after) + *------------------------------------------------------------*/ + test(); + IF( EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) + { + Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, NB_SUBFR16k, -Q6 ); - IF( NE_16( st->nelp_mode_dec, 1 ) ) - { - /* modify the excitation signal of stationary unvoiced frames */ - stat_noise_uv_mod_fx( st->coder_type, 0, st->lsp_old_fx, lsp_new_fx, lsp_new_fx, Aq_fx, exc2_fx, st->Q_exc, 1, &st->ge_sm_fx, - &st->uv_count, &st->act_count, st->lspold_s_fx, &st->noimix_seed, &st->min_alpha_fx, - &st->exc_pe_fx, st->core_brate, st->bwidth, &st->Q_stat_noise, &st->Q_stat_noise_ge ); - } + FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, + &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, + exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, avoid_lpc_burst_on_recovery, 0 ); } - IF( st->hBWE_TD != NULL ) + /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ + frame_ener_fx( st->L_frame, st->last_good, psyn_fx, shr( add( FEC_pitch_fx, 32 ), 6 ), &st->enr_old_fx, st->L_frame, st->Q_syn, 3, 0 ); + + IF( NE_16( st->nelp_mode_dec, 1 ) ) { - IF( EQ_16( st->L_frame, L_FRAME ) ) - { - Copy( Aq_fx + 2 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); - } - ELSE - { - Copy( Aq_fx + 3 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); - } + /* modify the excitation signal of stationary unvoiced frames */ + stat_noise_uv_mod_fx( st->coder_type, 0, st->lsp_old_fx, lsp_new_fx, lsp_new_fx, Aq_fx, exc2_fx, st->Q_exc, 1, &st->ge_sm_fx, + &st->uv_count, &st->act_count, st->lspold_s_fx, &st->noimix_seed, &st->min_alpha_fx, + &st->exc_pe_fx, st->core_brate, st->bwidth, &st->Q_stat_noise, &st->Q_stat_noise_ge ); } + } - /*--------------------------------------------------------* - * Apply NB postfilter in case of 8kHz output - *--------------------------------------------------------*/ - test(); - IF( EQ_16( st->last_bwidth, NB ) && st->hPFstat != NULL ) + IF( st->hBWE_TD != NULL ) + { + IF( EQ_16( st->L_frame, L_FRAME ) ) { - Copy( pitch_buf_fx, pitch_buf_tmp, NB_SUBFR16k ); - IF( EQ_16( st->bwidth, NB ) ) - { - st->hPFstat->on = 1; - move16(); - nb_post_filt_fx( st->L_frame, st->hPFstat, &st->psf_lp_noise_fx, tmp_noise_fx, psyn_fx, Aq_fx, pitch_buf_tmp, st->coder_type, st->BER_detect, 0 ); - } - ELSE - { - st->hPFstat->on = 0; - move16(); - nb_post_filt_fx( st->L_frame, st->hPFstat, &st->psf_lp_noise_fx, tmp_noise_fx, psyn_fx, Aq_fx, pitch_buf_tmp, AUDIO, st->BER_detect, 0 ); - } + Copy( Aq_fx + 2 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); } ELSE { - st->psf_lp_noise_fx = round_fx( L_shl( st->lp_noise, 1 ) ); + Copy( Aq_fx + 3 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); } + } - /*------------------------------------------------------------------* - * Perform fixed deemphasis through 1/(1 - g*z^-1) - *-----------------------------------------------------------------*/ - - /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ - Copy( psyn_fx + st->L_frame - L_SYN_MEM, st->mem_syn_r, L_SYN_MEM ); - deemph_fx( psyn_fx, st->preemph_fac, st->L_frame, &( st->mem_deemph_fx ) ); - unscale_AGC( psyn_fx, st->Q_syn, syn_fx_tmp2, st->agc_mem_fx, st->L_frame ); - Copy( syn_fx_tmp2, psyn_fx, st->L_frame ); - IF( st->hTcxDec != NULL ) + /*--------------------------------------------------------* + * Apply NB postfilter in case of 8kHz output + *--------------------------------------------------------*/ + test(); + IF( EQ_16( st->last_bwidth, NB ) && st->hPFstat != NULL ) + { + Copy( pitch_buf_fx, pitch_buf_tmp, NB_SUBFR16k ); + IF( EQ_16( st->bwidth, NB ) ) { - Copy_Scale_sig( psyn_fx + st->L_frame / 2, st->hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, st->Q_syn ) ); /*Q-1*/ + st->hPFstat->on = 1; + move16(); + nb_post_filt_fx( st->L_frame, st->hPFstat, &st->psf_lp_noise_fx, tmp_noise_fx, psyn_fx, Aq_fx, pitch_buf_tmp, st->coder_type, st->BER_detect, 0 ); } - Copy_Scale_sig( psyn_fx + st->L_frame - M - 1, st->syn, M + 1, sub( 0, st->Q_syn ) ); /*Q0*/ - - /*------------------------------------------------------------------* - * Formant post-filter - *-----------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - IF( st->hPFstat != NULL && GE_16( st->last_bwidth, WB ) && ( GT_32( st->core_brate, ACELP_24k40 ) || GT_16( st->element_mode, EVS_MONO ) ) && LE_32( st->core_brate, ACELP_32k ) ) + ELSE { - st->hPFstat->on = 1; + st->hPFstat->on = 0; move16(); - /*----ftf conversions---*/ - Copy( psyn_fx, temp_buf_fx + L_SYN_MEM, L_FRAME16k ); + nb_post_filt_fx( st->L_frame, st->hPFstat, &st->psf_lp_noise_fx, tmp_noise_fx, psyn_fx, Aq_fx, pitch_buf_tmp, AUDIO, st->BER_detect, 0 ); + } + } + ELSE + { + st->psf_lp_noise_fx = round_fx( L_shl( st->lp_noise, 1 ) ); + move16(); + } - set16_fx( st->hPFstat->mem_zero, 0, M ); + /*------------------------------------------------------------------* + * Perform fixed deemphasis through 1/(1 - g*z^-1) + *-----------------------------------------------------------------*/ - formant_post_filt_ivas_fx( st->hPFstat, temp_buf_fx + L_SYN_MEM, Aq_fx, psyn_fx, st->L_frame, st->lp_noise, st->total_brate, 0 ); - } - ELSE IF( st->hPFstat != NULL && GE_16( st->last_bwidth, WB ) ) - { - IF( st->hPFstat->on ) - { + /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ + Copy( psyn_fx + st->L_frame - L_SYN_MEM, st->mem_syn_r, L_SYN_MEM ); + deemph_fx( psyn_fx, st->preemph_fac, st->L_frame, &( st->mem_deemph_fx ) ); + unscale_AGC( psyn_fx, st->Q_syn, syn_fx_tmp2, st->agc_mem_fx, st->L_frame ); + Copy( syn_fx_tmp2, psyn_fx, st->L_frame ); + IF( st->hTcxDec != NULL ) + { + Copy_Scale_sig( psyn_fx + st->L_frame / 2, st->hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, st->Q_syn ) ); /*Q-1*/ + } + Copy_Scale_sig( psyn_fx + st->L_frame - M - 1, st->syn, M + 1, sub( 0, st->Q_syn ) ); /*Q0*/ - Copy( st->hPFstat->mem_pf_in + L_SYN_MEM - M, temp_buf_fx, M ); - Copy( psyn_fx, temp_buf_fx + M, L_SUBFR ); + /*------------------------------------------------------------------* + * Formant post-filter + *-----------------------------------------------------------------*/ - Residu3_fx( Aq_fx, temp_buf_fx + M, temp_buf_fx + M + L_SUBFR, L_SUBFR, 1 ); - E_UTIL_synthesis( 1, Aq_fx, temp_buf_fx + M + L_SUBFR, temp_buf_fx, L_SUBFR, st->hPFstat->mem_stp + L_SYN_MEM - M, 0, M ); - scale_st_fx( psyn_fx, temp_buf_fx, &st->hPFstat->gain_prec, L_SUBFR ); - Copy( temp_buf_fx, psyn_fx, ( L_SUBFR >> 1 ) ); - blend_subfr2_fx( temp_buf_fx + L_SUBFR / 2, psyn_fx + L_SUBFR / 2, psyn_fx + L_SUBFR / 2 ); - } - st->hPFstat->on = 0; - move16(); + test(); + test(); + test(); + test(); + IF( st->hPFstat != NULL && GE_16( st->last_bwidth, WB ) && ( GT_32( st->core_brate, ACELP_24k40 ) || st->element_mode > EVS_MONO ) && LE_32( st->core_brate, ACELP_32k ) ) + { + st->hPFstat->on = 1; + move16(); + /*----ftf conversions---*/ + Copy( psyn_fx, temp_buf_fx + L_SYN_MEM, L_FRAME16k ); + + set16_fx( st->hPFstat->mem_zero, 0, M ); + + formant_post_filt_ivas_fx( st->hPFstat, temp_buf_fx + L_SYN_MEM, Aq_fx, psyn_fx, st->L_frame, st->lp_noise, st->total_brate, 0 ); + } + ELSE IF( st->hPFstat != NULL && GE_16( st->last_bwidth, WB ) ) + { + IF( st->hPFstat->on ) + { + Copy( st->hPFstat->mem_pf_in + L_SYN_MEM - M, temp_buf_fx, M ); + Copy( psyn_fx, temp_buf_fx + M, L_SUBFR ); + + Residu3_fx( Aq_fx, temp_buf_fx + M, temp_buf_fx + M + L_SUBFR, L_SUBFR, 1 ); + E_UTIL_synthesis( 1, Aq_fx, temp_buf_fx + M + L_SUBFR, temp_buf_fx, L_SUBFR, st->hPFstat->mem_stp + L_SYN_MEM - M, 0, M ); + scale_st_fx( psyn_fx, temp_buf_fx, &st->hPFstat->gain_prec, L_SUBFR ); + Copy( temp_buf_fx, psyn_fx, ( L_SUBFR >> 1 ) ); + blend_subfr2_fx( temp_buf_fx + L_SUBFR / 2, psyn_fx + L_SUBFR / 2, psyn_fx + L_SUBFR / 2 ); } + st->hPFstat->on = 0; + move16(); + } - /*----------------------------------------------------------------* - * Comfort noise addition - *----------------------------------------------------------------*/ + /*----------------------------------------------------------------* + * Comfort noise addition + *----------------------------------------------------------------*/ + test(); + test(); + IF( ( st->hFdCngDec != NULL || EQ_16( st->idchan, 1 ) ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) + { test(); test(); - IF( ( st->hFdCngDec != NULL || EQ_16( st->idchan, 1 ) ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) + test(); + test(); + test(); + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) || st->flag_cna || ( EQ_16( st->cng_type, FD_CNG ) && LE_32( st->total_brate, ACELP_32k ) ) || ( st->cng_type == LP_CNG && LE_32( st->core_brate, SID_2k40 ) ) ) { + /*VAD only for non inactive frame*/ + st->VAD = st->VAD && st->coder_type != INACTIVE; + test(); test(); test(); test(); test(); - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) || st->flag_cna || ( EQ_16( st->cng_type, FD_CNG ) && LE_32( st->total_brate, ACELP_32k ) ) || ( EQ_16( st->cng_type, LP_CNG ) && LE_32( st->core_brate, SID_2k40 ) ) ) + IF( st->idchan == 0 && ( st->flag_cna || ( EQ_16( st->cng_type, FD_CNG ) && LE_32( st->total_brate, ACELP_32k ) ) || ( st->cng_type == LP_CNG && LE_32( st->core_brate, SID_2k40 ) ) ) ) { - /*VAD only for non inactive frame*/ - st->VAD = st->VAD && NE_16( st->coder_type, INACTIVE ); - test(); - test(); - test(); - test(); - IF( EQ_16( st->idchan, 0 ) && ( st->flag_cna || ( EQ_16( st->cng_type, FD_CNG ) && LE_32( st->total_brate, ACELP_32k ) ) || ( EQ_16( st->cng_type, LP_CNG ) && LE_32( st->core_brate, SID_2k40 ) ) ) ) - { - /*Noisy speech detector*/ - noisy_speech_detection_fx( st->hFdCngDec, st->VAD, psyn_fx, st->Q_syn ); + /*Noisy speech detector*/ + noisy_speech_detection_fx( st->hFdCngDec, st->VAD, psyn_fx, st->Q_syn ); - st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = mult_r( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 32440 /*0.99 Q15*/ ); - IF( NE_16( st->hFdCngDec->hFdCngCom->flag_noisy_speech, 0 ) ) - { - st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = add( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 328 /*0.01 Q15*/ ); - move16(); - } - st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx = L_deposit_h( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech ); + st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = mult_r( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 32440 /*0.99 Q15*/ ); + move16(); + IF( st->hFdCngDec->hFdCngCom->flag_noisy_speech != 0 ) + { + st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = add( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 328 /*0.01 Q15*/ ); + move16(); } + st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx = L_deposit_h( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech ); + move32(); + } + + if ( st->idchan == 0 ) + { + st->lp_noise = st->hFdCngDec->lp_noise; + move32(); + } + test(); + IF( NE_16( st->element_mode, IVAS_CPE_TD ) && !st->cng_ism_flag ) + { + /*Noise estimate*/ + + Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, sub( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, Q27 ) ); + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 31 - Q4; // Q4 + move16(); - if ( st->idchan == 0 ) + Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEst, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, Q27 ) ); + Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, Q27 ) ); + st->hFdCngDec->hFdCngCom->sidNoiseEstExp = 31 - Q4; // Q4 + move16(); + /*==========================================================*/ + ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + /*==========================================================*/ + IF( st->hFdCngDec->partNoiseShape_exp < 0 ) { - st->lp_noise = st->hFdCngDec->lp_noise; - move32(); + Scale_sig32( st->hFdCngDec->partNoiseShape, NPART, st->hFdCngDec->partNoiseShape_exp ); + st->hFdCngDec->partNoiseShape_exp = 0; + move16(); } - test(); - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && !st->cng_ism_flag ) + IF( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp < 0 ) { - /*Noise estimate*/ - - Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp - Q27 ); - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 31 - Q4; // Q4 - - Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEst, NPART, st->hFdCngDec->hFdCngCom->sidNoiseEstExp - Q27 ); - Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, st->hFdCngDec->hFdCngCom->sidNoiseEstExp - Q27 ); - st->hFdCngDec->hFdCngCom->sidNoiseEstExp = 31 - Q4; // Q4 - /*==========================================================*/ - ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); - /*==========================================================*/ - IF( st->hFdCngDec->partNoiseShape_exp < 0 ) - { - Scale_sig32( st->hFdCngDec->partNoiseShape, NPART, st->hFdCngDec->partNoiseShape_exp ); - st->hFdCngDec->partNoiseShape_exp = 0; - } - IF( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp < 0 ) - { - Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ); - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 0; - } + Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ); + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 0; + move16(); } + } - IF( !st->cna_dirac_flag ) + IF( !st->cna_dirac_flag ) + { + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + /* CNA: Generate additional comfort noise to mask potential coding artefacts */ + IF( st->flag_cna && !( EQ_16( st->coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->GSC_noisy_speech ) ) ) { test(); - test(); - /* CNA: Generate additional comfort noise to mask potential coding artefacts */ - IF( st->flag_cna && !( EQ_16( st->coder_type, AUDIO ) && !( GT_16( st->element_mode, EVS_MONO ) && st->GSC_noisy_speech ) ) ) + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( nchan_out, 2 ) ) { - test(); - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( nchan_out, 2 ) ) + IF( hStereoCng->flag_cna_fade ) { - IF( hStereoCng->flag_cna_fade ) - { - generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out ); - hStereoCng->flag_cna_fade = 0; - } - ELSE - { - IF( NE_16( st->element_mode, last_element_mode ) && ( st->idchan == 0 ) ) - { - /* Clear memory for secondary channel CNA */ - set_s( hStereoCng->olapBufferSynth22_fx, 0, shr( st->hFdCngDec->hFdCngCom->frameSize, 1 ) ); - } - - generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 0, hStereoCng, nchan_out ); - } + generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out ); + hStereoCng->flag_cna_fade = 0; + move16(); } - ELSE IF( NE_16( st->element_mode, IVAS_CPE_DFT ) ) + ELSE { - IF( st->idchan == 0 ) + IF( NE_16( st->element_mode, last_element_mode ) && ( st->idchan == 0 ) ) { - IF( NE_16( st->element_mode, last_element_mode ) ) - { - set_s( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); - } - generate_masking_noise_fx( psyn_fx, st->Q_syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0 /*, 0, 0, st->element_mode, hStereoCng, nchan_out*/ ); + /* Clear memory for secondary channel CNA */ + set16_fx( hStereoCng->olapBufferSynth22_fx, 0, shr( st->hFdCngDec->hFdCngCom->frameSize, 1 ) ); } + + generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 0, hStereoCng, nchan_out ); } } - ELSE IF( st->flag_cna && EQ_16( st->coder_type, AUDIO ) && ( ( EQ_16( st->last_core, ACELP_CORE ) && !( EQ_16( st->last_coder_type, AUDIO ) && !( GT_16( st->element_mode, EVS_MONO ) && st->Last_GSC_noisy_speech_flag ) ) ) || EQ_16( st->last_core, TCX_20_CORE ) ) ) + ELSE IF( NE_16( st->element_mode, IVAS_CPE_DFT ) ) { - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( nchan_out, 2 ) ) + IF( st->idchan == 0 ) { - generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out ); - hStereoCng->flag_cna_fade = 1; - move16(); - } - ELSE - { - FOR( i = 0; i < shr( st->hFdCngDec->hFdCngCom->frameSize, 1 ); i++ ) + IF( NE_16( st->element_mode, last_element_mode ) ) { - psyn_fx[i] = add( psyn_fx[i], shr_r( mult_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + imult1616( 5, shr( st->hFdCngDec->hFdCngCom->frameSize, 2 ) )], st->hFdCngDec->hFdCngCom->fftlenFac ), -st->Q_syn ) ); - move16(); + set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); } + generate_masking_noise_fx( psyn_fx, st->Q_syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0 /*, 0, 0, st->element_mode, hStereoCng, nchan_out*/ ); } } - ELSE + } + ELSE IF( st->flag_cna && EQ_16( st->coder_type, AUDIO ) && ( ( st->last_core == ACELP_CORE && !( EQ_16( st->last_coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag ) ) ) || EQ_16( st->last_core, TCX_20_CORE ) ) ) + { + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( nchan_out, 2 ) ) { - if ( hStereoCng != NULL ) - { - hStereoCng->flag_cna_fade = 1; - hStereoCng->enableSecCNA = 0; - move16(); - move16(); - } + generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out ); + hStereoCng->flag_cna_fade = 1; + move16(); } - - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) + ELSE { - /*Noise estimate*/ - IF( ( st->idchan == 0 ) && ( EQ_16( nchan_out, 2 ) || ( NE_32( st->core_brate, FRAME_NO_DATA ) && NE_32( st->core_brate, SID_2k40 ) ) ) ) + FOR( i = 0; i < shr( st->hFdCngDec->hFdCngCom->frameSize, 1 ); i++ ) { - ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); - IF( st->hFdCngDec->partNoiseShape_exp < 0 ) - { - Scale_sig32( st->hFdCngDec->partNoiseShape, NPART, -st->hFdCngDec->partNoiseShape_exp ); - st->hFdCngDec->partNoiseShape_exp = 0; - } - IF( st->hFdCngDec->partNoiseShape_exp < 0 ) - { - Scale_sig32( st->hFdCngDec->partNoiseShape, NPART, st->hFdCngDec->partNoiseShape_exp ); - st->hFdCngDec->partNoiseShape_exp = 0; - } - IF( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp < 0 ) - { - Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ); - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 0; - } + psyn_fx[i] = add( psyn_fx[i], shr_r( mult_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + imult1616( 5, shr( st->hFdCngDec->hFdCngCom->frameSize, 2 ) )], st->hFdCngDec->hFdCngCom->fftlenFac ), -st->Q_syn ) ); move16(); } } } - } - - IF( !st->cna_dirac_flag ) - { - IF( ( st->flag_cna == 0 ) && EQ_16( st->L_frame, L_FRAME16k ) && EQ_16( st->last_flag_cna, 1 ) && ( ( EQ_16( st->last_core, ACELP_CORE ) && !( EQ_16( st->last_coder_type, AUDIO ) && !( GT_16( st->element_mode, EVS_MONO ) && st->Last_GSC_noisy_speech_flag ) ) ) || EQ_16( st->last_core, AMR_WB_CORE ) ) ) + ELSE { - FOR( i = 0; i < shr( st->hFdCngDec->hFdCngCom->frameSize, 1 ); i++ ) + if ( hStereoCng != NULL ) { - psyn_fx[i] = add( psyn_fx[i], shr_r( mult_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + imult1616( 5, shr( st->hFdCngDec->hFdCngCom->frameSize, 2 ) )], st->hFdCngDec->hFdCngCom->fftlenFac ), -st->Q_syn ) ); + hStereoCng->flag_cna_fade = 1; + move16(); + hStereoCng->enableSecCNA = 0; move16(); } } - IF( ( st->flag_cna == 0 ) || ( EQ_16( st->coder_type, AUDIO ) && !( GT_16( st->element_mode, EVS_MONO ) && st->GSC_noisy_speech ) ) ) + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) { - IF( st->idchan == 0 ) - { - set_s( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); - } - IF( hStereoCng != NULL && ( st->idchan == 0 ) ) + test(); + test(); + test(); + /*Noise estimate*/ + IF( ( st->idchan == 0 ) && ( EQ_16( nchan_out, 2 ) || ( st->core_brate != FRAME_NO_DATA && NE_32( st->core_brate, SID_2k40 ) ) ) ) { - set_s( hStereoCng->olapBufferSynth22_fx, 0, st->hFdCngDec->hFdCngCom->fftlen ); + ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + IF( st->hFdCngDec->partNoiseShape_exp < 0 ) + { + Scale_sig32( st->hFdCngDec->partNoiseShape, NPART, -st->hFdCngDec->partNoiseShape_exp ); + st->hFdCngDec->partNoiseShape_exp = 0; + move16(); + } + IF( st->hFdCngDec->partNoiseShape_exp < 0 ) + { + Scale_sig32( st->hFdCngDec->partNoiseShape, NPART, st->hFdCngDec->partNoiseShape_exp ); + st->hFdCngDec->partNoiseShape_exp = 0; + move16(); + } + IF( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp < 0 ) + { + Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ); + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 0; + move16(); + } } } } } - /*----------------------------------------------------------------* - * Resample to the output sampling rate (8/16/32/48 kHz) - * Bass post-filter - *----------------------------------------------------------------*/ - - /* check if the CLDFB works on the right sample rate */ - IF( NE_16( imult1616( st->cldfbAna->no_channels, st->cldfbAna->no_col ), st->L_frame ) ) + IF( !st->cna_dirac_flag ) { - resampleCldfb_ivas_fx( st->cldfbAna, L_mult0( st->L_frame, FRAMES_PER_SEC ) ); - resampleCldfb_ivas_fx( st->cldfbBPF, L_mult0( st->L_frame, FRAMES_PER_SEC ) ); - - IF( st->ini_frame > 0 ) + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( st->flag_cna == 0 ) && EQ_16( st->L_frame, L_FRAME16k ) && EQ_16( st->last_flag_cna, 1 ) && ( ( st->last_core == ACELP_CORE && !( EQ_16( st->last_coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag ) ) ) || EQ_16( st->last_core, AMR_WB_CORE ) ) ) { - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); + FOR( i = 0; i < shr( st->hFdCngDec->hFdCngCom->frameSize, 1 ); i++ ) + { + psyn_fx[i] = add( psyn_fx[i], shr_r( mult_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + imult1616( 5, shr( st->hFdCngDec->hFdCngCom->frameSize, 2 ) )], st->hFdCngDec->hFdCngCom->fftlenFac ), -st->Q_syn ) ); + move16(); + } } - } - - /* analyze pitch coherence for bass post-filter */ - Word32 pitch_buf_fx_q20[12]; - - Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, Q4 ); - Word16 lim = shr( st->L_frame, 6 ); - FOR( Word16 lp = 0; lp < lim; lp++ ) - { - pitch_buf_fx_q20[lp] = L_shl( pitch_buf_fx[lp], Q14 ); - move32(); - } - bpf_pitch_coherence_ivas_fx( st, pitch_buf_fx_q20 ); - Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, -Q4 ); - - - IF( !( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->bpf_off ) ) - { test(); - IF( NE_16( st->L_frame, st->last_L_frame ) && NE_16( st->last_codec_mode, MODE2 ) ) + test(); + test(); + IF( ( st->flag_cna == 0 ) || ( EQ_16( st->coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->GSC_noisy_speech ) ) ) { - IF( EQ_16( st->L_frame, L_FRAME ) ) + IF( st->idchan == 0 ) { - retro_interp5_4_fx( st->hBPF->pst_old_syn_fx ); + set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); } - ELSE IF( EQ_16( st->L_frame, L_FRAME16k ) ) + IF( hStereoCng != NULL && ( st->idchan == 0 ) ) { - retro_interp4_5_fx( psyn_fx, st->hBPF->pst_old_syn_fx ); + set16_fx( hStereoCng->olapBufferSynth22_fx, 0, st->hFdCngDec->hFdCngCom->fftlen ); } } + } + } + + /*----------------------------------------------------------------* + * Resample to the output sampling rate (8/16/32/48 kHz) + * Bass post-filter + *----------------------------------------------------------------*/ + + /* check if the CLDFB works on the right sample rate */ + IF( NE_16( imult1616( st->cldfbAna->no_channels, st->cldfbAna->no_col ), st->L_frame ) ) + { + resampleCldfb_ivas_fx( st->cldfbAna, L_mult0( st->L_frame, FRAMES_PER_SEC ) ); + resampleCldfb_ivas_fx( st->cldfbBPF, L_mult0( st->L_frame, FRAMES_PER_SEC ) ); - bass_psfilter_fx( st->hBPF, st->Opt_AMR_WB, psyn_fx, st->L_frame, pitch_buf_fx, st->bpf_off, - st->stab_fac_fx, &st->stab_fac_smooth_fx, st->coder_type, st->Q_syn, bpf_error_signal_16fx ); + IF( st->ini_frame > 0 ) + { + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); + move16(); } + } + + /* analyze pitch coherence for bass post-filter */ - Word32 syn_tmp_32_fx[L_FRAME16k + L_SUBFR], *syn_32_fx; - set32_fx( syn_tmp_32_fx, 0, L_FRAME16k + L_SUBFR ); - syn_32_fx = syn_tmp_32_fx + L_SUBFR; + Word32 pitch_buf_fx_q20[12]; + + Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, Q4 ); + Word16 lim = shr( st->L_frame, 6 ); + FOR( Word16 lp = 0; lp < lim; lp++ ) + { + pitch_buf_fx_q20[lp] = L_shl( pitch_buf_fx[lp], Q14 ); + move32(); + } + bpf_pitch_coherence_ivas_fx( st, pitch_buf_fx_q20 ); + Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, -Q4 ); + + test(); + IF( !( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->bpf_off ) ) + { test(); - IF( NE_16( st->element_mode, IVAS_CPE_DFT ) || use_cldfb_for_dft ) + IF( NE_16( st->L_frame, st->last_L_frame ) && NE_16( st->last_codec_mode, MODE2 ) ) { - /* analysis of the synthesis at internal sampling rate */ - Word32 realBufferSave_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word32 imagBufferSave_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word32 *pRealSave_fx[CLDFB_NO_COL_MAX], *pImagSave_fx[CLDFB_NO_COL_MAX]; - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + IF( EQ_16( st->L_frame, L_FRAME ) ) + { + retro_interp5_4_fx( st->hBPF->pst_old_syn_fx ); + } + ELSE IF( EQ_16( st->L_frame, L_FRAME16k ) ) { - pRealSave_fx[i] = realBufferSave_fx[i]; - pImagSave_fx[i] = imagBufferSave_fx[i]; + retro_interp4_5_fx( psyn_fx, st->hBPF->pst_old_syn_fx ); } + } + + bass_psfilter_fx( st->hBPF, st->Opt_AMR_WB, psyn_fx, st->L_frame, pitch_buf_fx, st->bpf_off, + st->stab_fac_fx, &st->stab_fac_smooth_fx, st->coder_type, st->Q_syn, bpf_error_signal_16fx ); + } + + Word32 syn_tmp_32_fx[L_FRAME16k + L_SUBFR], *syn_32_fx; + set32_fx( syn_tmp_32_fx, 0, L_FRAME16k + L_SUBFR ); + syn_32_fx = syn_tmp_32_fx + L_SUBFR; + test(); + IF( NE_16( st->element_mode, IVAS_CPE_DFT ) || use_cldfb_for_dft ) + { + /* analysis of the synthesis at internal sampling rate */ + Word32 realBufferSave_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 imagBufferSave_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 *pRealSave_fx[CLDFB_NO_COL_MAX], *pImagSave_fx[CLDFB_NO_COL_MAX]; + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + pRealSave_fx[i] = realBufferSave_fx[i]; + pImagSave_fx[i] = imagBufferSave_fx[i]; + } #ifndef MSAN_FIX - Copy_Scale_sig_16_32( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 + Copy_Scale_sig_16_32( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 #endif - IF( st->p_bpf_noise_buf_32 ) - { + IF( st->p_bpf_noise_buf_32 ) + { #ifdef MSAN_FIX - Copy_Scale_sig_16_32( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 + Copy_Scale_sig_16_32( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 #endif - Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame ); - Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); - } + Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame ); + Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); + } #ifdef MSAN_FIX - FOR( i = 0; i < st->L_frame; i++ ) + FOR( i = 0; i < st->L_frame; i++ ) #else for ( i = 0; i < L_FRAME16k; i++ ) #endif - { - syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); // Q12 - move32(); - } + { + syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); // Q12 + move32(); + } - Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); - Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 - st->cldfbAna->Q_cldfb_state = Q12; - move16(); - cldfbAnalysis_ivas_fx( syn_32_fx, realBuffer_fx, imagBuffer_fx, -1, st->cldfbAna ); - Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 - st->cldfbAna->Q_cldfb_state = Q11; - move16(); - /* analysis and add the BPF error signal */ - Word32 tmp_bpf_error_signal_fx[L_FRAME16k]; - Word16 q_bpf_error_signal; - Word16 cldfb_state_offset = sub( st->cldfbBPF->p_filter_length, st->cldfbBPF->no_channels ); + Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 + st->cldfbAna->Q_cldfb_state = Q12; + move16(); + cldfbAnalysis_ivas_fx( syn_32_fx, realBuffer_fx, imagBuffer_fx, -1, st->cldfbAna ); + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 + st->cldfbAna->Q_cldfb_state = Q11; + move16(); + /* analysis and add the BPF error signal */ + Word32 tmp_bpf_error_signal_fx[L_FRAME16k]; + Word16 q_bpf_error_signal; + Word16 cldfb_state_offset = sub( st->cldfbBPF->p_filter_length, st->cldfbBPF->no_channels ); - q_bpf_error_signal = Q6; - move16(); + q_bpf_error_signal = Q6; + move16(); #ifdef MSAN_FIX - Copy_Scale_sig_16_32( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, st->L_frame, q_bpf_error_signal - st->Q_syn ); // Q6 + Copy_Scale_sig_16_32( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, st->L_frame, q_bpf_error_signal - st->Q_syn ); // Q6 #else Copy_Scale_sig_16_32( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, q_bpf_error_signal - st->Q_syn ); // Q6 #endif - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 - Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 - } - Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, q_bpf_error_signal - Q10 ); // q_bpf_error_signal (Q6) - st->cldfbBPF->Q_cldfb_state = q_bpf_error_signal; - move16(); - tmp = -1; + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 + Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 + } + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, q_bpf_error_signal - Q10 ); // q_bpf_error_signal (Q6) + st->cldfbBPF->Q_cldfb_state = q_bpf_error_signal; + move16(); + tmp = -1; + move16(); + if ( st->bpf_off ) + { + tmp = 0; move16(); - IF( st->bpf_off ) - { - tmp = 0; - move16(); - } + } - addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx, tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); - Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, -( sub( q_bpf_error_signal, Q10 ) ) ); // Q10 - st->cldfbBPF->Q_cldfb_state = Q10; + addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx, tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, -( sub( q_bpf_error_signal, Q10 ) ) ); // Q10 + st->cldfbBPF->Q_cldfb_state = Q10; + move16(); + /* set output mask for upsampling */ + IF( EQ_16( st->bwidth, NB ) ) + { + /* set NB mask for upsampling */ + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, 10 ); move16(); - /* set output mask for upsampling */ - IF( EQ_16( st->bwidth, NB ) ) - { - /* set NB mask for upsampling */ - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, 10 ); - } - ELSE IF( NE_16( st->cldfbSyn->bandsToZero, sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ) ) ) - { - /* in case of BW switching, re-init to default */ - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); - } - test(); - IF( !st->cng_sba_flag || EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) - { - test(); - test(); - test(); - /*WB/SWB-FD_CNG*/ - IF( ( EQ_32( st->core_brate, FRAME_NO_DATA ) || EQ_32( st->core_brate, SID_2k40 ) ) && ( EQ_16( st->cng_type, FD_CNG ) ) && ( LE_16( st->hFdCngDec->hFdCngCom->numCoreBands, st->cldfbSyn->no_channels ) ) ) - { - Word16 tmpBufferScale = 0; - move16(); - generate_comfort_noise_dec_hf_ivas_fx( realBuffer_fx, imagBuffer_fx, /*realBuffer, imagBuffer,*/ &tmpBufferScale, st->hFdCngDec->hFdCngCom, st->cng_ism_flag ); - - /* Fixed to float */ - FOR( i = 0; i < st->hFdCngDec->hFdCngCom->numSlots; i++ ) - { - Scale_sig32( realBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, sub( st->hFdCngDec->hFdCngCom->regularStopBand, st->hFdCngDec->hFdCngCom->numCoreBands ), sub( add( tmpBufferScale, 15 ), Q31 ) ); // Q0 - Scale_sig32( imagBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, sub( st->hFdCngDec->hFdCngCom->regularStopBand, st->hFdCngDec->hFdCngCom->numCoreBands ), sub( add( tmpBufferScale, 15 ), Q31 ) ); // Q0 - } - - IF( LT_16( st->hFdCngDec->hFdCngCom->regularStopBand, st->cldfbSyn->no_channels ) ) - { - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->hFdCngDec->hFdCngCom->regularStopBand ); - } - ELSE - { - st->cldfbSyn->bandsToZero = 0; - move16(); - } - } - } - - IF( save_hb_synth_fx16 != NULL ) - { - /* save and then zero-out lowband */ - Word16 Q_real = 0, Q_imag = 0; - Word32 max_real = 0, max_imag = 0; - move16(); - move16(); - move32(); - move32(); - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - max_real = max( max_real, L_abs( realBuffer_fx[i][j] ) ); - max_imag = max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); - } - } - Word32 max_val = max( max_real, max_imag ); - Q_imag = sub( norm_l( max_val ), 3 ) /* Guard bits */; - Q_real = Q_imag; - move16(); - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); - scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_imag ); - } - scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // (Q_real-1) - st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); - Scale_sig32( save_hb_synth_fx, L_FRAME48k, sub( Q_real, 1 ) ); - - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - realBufferSave_fx[i][j] = realBuffer_fx[i][j]; - imagBufferSave_fx[i][j] = imagBuffer_fx[i][j]; - move32(); - move32(); - IF( j < st->hFdCngDec->hFdCngCom->numCoreBands && i < st->hFdCngDec->hFdCngCom->numSlots ) - { - realBuffer_fx[i][j] = 0; - imagBuffer_fx[i][j] = 0; - move32(); - move32(); - } - } - } - - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, save_hb_synth_fx, -1, st->cldfbSynHB ); - - Scale_sig32( save_hb_synth_fx, L_FRAME48k, -( sub( Q_real, 1 ) ) ); // Q0 - Scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSynHB->Q_cldfb_state = Q10; - move16(); - /* restore lowband */ - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - realBuffer_fx[i][j] = realBufferSave_fx[i][j]; - imagBuffer_fx[i][j] = imagBufferSave_fx[i][j]; - move32(); - move32(); - } - } - Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // Q_real-1 - st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); - cldfbSynthesis_ivas_fx( pRealSave_fx, pImagSave_fx, synth_fx, -1, st->cldfbSyn ); - Scale_sig32( synth_fx, L_FRAME48k, -sub( Q_real, 1 ) ); - Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSynHB->Q_cldfb_state = Q10; - move16(); - } - ELSE + } + ELSE IF( NE_16( st->cldfbSyn->bandsToZero, sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ) ) ) + { + /* in case of BW switching, re-init to default */ + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); + move16(); + } + test(); + IF( !st->cng_sba_flag || EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) + { + test(); + test(); + test(); + /*WB/SWB-FD_CNG*/ + IF( ( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) && ( EQ_16( st->cng_type, FD_CNG ) ) && ( LT_16( st->hFdCngDec->hFdCngCom->numCoreBands, st->cldfbSyn->no_channels ) ) ) { - /* synthesis of the combined signal */ - Word16 Q_real = 0, Q_imag = 0; - Word32 max_real = 0, max_imag = 0; + Word16 tmpBufferScale = 0; move16(); - move16(); - move32(); - move32(); - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + generate_comfort_noise_dec_hf_ivas_fx( realBuffer_fx, imagBuffer_fx, /*realBuffer, imagBuffer,*/ &tmpBufferScale, st->hFdCngDec->hFdCngCom, st->cng_ism_flag ); + + /* Fixed to float */ + FOR( i = 0; i < st->hFdCngDec->hFdCngCom->numSlots; i++ ) { - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - max_real = max( max_real, L_abs( realBuffer_fx[i][j] ) ); - max_imag = max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); - } + Scale_sig32( realBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, sub( st->hFdCngDec->hFdCngCom->regularStopBand, st->hFdCngDec->hFdCngCom->numCoreBands ), sub( add( tmpBufferScale, 15 ), Q31 ) ); // Q0 + Scale_sig32( imagBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, sub( st->hFdCngDec->hFdCngCom->regularStopBand, st->hFdCngDec->hFdCngCom->numCoreBands ), sub( add( tmpBufferScale, 15 ), Q31 ) ); // Q0 } - Word32 max_val = max( max_real, max_imag ); - Q_imag = sub( norm_l( max_val ), 3 ) /* Guard bits */; - Q_real = Q_imag; - move16(); - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + + IF( LT_16( st->hFdCngDec->hFdCngCom->regularStopBand, st->cldfbSyn->no_channels ) ) { - scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); - scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->hFdCngDec->hFdCngCom->regularStopBand ); + move16(); + } + ELSE + { + st->cldfbSyn->bandsToZero = 0; + move16(); } - scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1) - st->cldfbSyn->Q_cldfb_state = sub( Q_real, 1 ); -#ifndef MSAN_FIX - Scale_sig32( synth_fx, L_FRAME48k, Q_real - 1 ); -#endif - - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx, -1, st->cldfbSyn ); -#ifdef MSAN_FIX - scale_sig32( synth_fx, output_frame, -sub( Q_real, 1 ) ); -#else - Scale_sig32( synth_fx, L_FRAME48k, -( Q_real - 1 ) ); -#endif - scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSyn->Q_cldfb_state = Q10; - move16(); } - - /* save synthesis - needed in case of core switching */ - Copy32( synth_fx, st->previoussynth_fx_32, output_frame ); // Q0 } - ELSE - { - Word16 nSamples = NS2SA( st->L_frame * FRAMES_PER_SEC, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ); /* IVAS-64: optimization is likely possible here (don't resample the whole frame) */ - - /* analysis of the synthesis at internal sampling rate - needed for DFT stereo -> TD stereo switching */ -#ifndef MSAN_FIX - for ( i = 0; i < L_FRAME16k; i++ ) -#else - FOR( i = 0; i < st->L_frame; i++ ) -#endif - { - syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); - move32(); - } - Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); - Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 - st->cldfbAna->Q_cldfb_state = Q12; + IF( save_hb_synth_fx16 != NULL ) + { + /* save and then zero-out lowband */ + Word16 Q_real = 0, Q_imag = 0; + Word32 max_real = 0, max_imag = 0; move16(); - cldfbAnalysis_ivas_fx( syn_32_fx + st->L_frame - nSamples, realBuffer_fx, imagBuffer_fx, nSamples, st->cldfbAna ); - - Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 - st->cldfbAna->Q_cldfb_state = Q11; - move16(); /* analysis and add the BPF error signal - needed for DFT stereo -> TD stereo switching */ - Word32 tmp_bpf_error_signal_fx[L_FRAME16k]; - Word16 q_bpf_error_signal; - Word16 cldfb_state_offset = sub( st->cldfbBPF->p_filter_length, st->cldfbBPF->no_channels ); - - // Get Q-factor - q_bpf_error_signal = Q6; move16(); - Copy_Scale_sig_16_32( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 + move32(); + move32(); FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) { - Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 - Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); + max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); + } } - Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, sub( q_bpf_error_signal, Q10 ) ); // q_bpf_error_signal (Q6) - st->cldfbBPF->Q_cldfb_state = q_bpf_error_signal; + Word32 max_val = L_max( max_real, max_imag ); + Q_imag = sub( norm_l( max_val ), 3 ) /* Guard bits */; + Q_real = Q_imag; move16(); - tmp = 0; + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); + scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_imag ); + } + scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // (Q_real-1) + st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); move16(); - if ( !st->bpf_off ) + Scale_sig32( save_hb_synth_fx, L_FRAME48k, sub( Q_real, 1 ) ); + + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) { - tmp = nSamples; - move16(); + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + realBufferSave_fx[i][j] = realBuffer_fx[i][j]; + imagBufferSave_fx[i][j] = imagBuffer_fx[i][j]; + move32(); + move32(); + IF( LT_16( j, st->hFdCngDec->hFdCngCom->numCoreBands ) && LT_16( i, st->hFdCngDec->hFdCngCom->numSlots ) ) + { + realBuffer_fx[i][j] = 0; + imagBuffer_fx[i][j] = 0; + move32(); + move32(); + } + } } - addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx + st->L_frame - nSamples, tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, save_hb_synth_fx, -1, st->cldfbSynHB ); - Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, -sub( q_bpf_error_signal, Q10 ) ); // Q10 - st->cldfbBPF->Q_cldfb_state = Q10; - /* synthesis of the combined signal - needed for DFT stereo -> TD stereo switching */ + Scale_sig32( save_hb_synth_fx, L_FRAME48k, -( sub( Q_real, 1 ) ) ); // Q0 + Scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 + st->cldfbSynHB->Q_cldfb_state = Q10; + move16(); + /* restore lowband */ + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + realBuffer_fx[i][j] = realBufferSave_fx[i][j]; + imagBuffer_fx[i][j] = imagBufferSave_fx[i][j]; + move32(); + move32(); + } + } + Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // Q_real-1 + st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); + move16(); + cldfbSynthesis_ivas_fx( pRealSave_fx, pImagSave_fx, synth_fx, -1, st->cldfbSyn ); + Scale_sig32( synth_fx, L_FRAME48k, -sub( Q_real, 1 ) ); + Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 + st->cldfbSynHB->Q_cldfb_state = Q10; + move16(); + } + ELSE + { + /* synthesis of the combined signal */ Word16 Q_real = 0, Q_imag = 0; Word32 max_real = 0, max_imag = 0; move16(); @@ -1995,11 +1954,11 @@ ivas_error acelp_core_dec_ivas_fx( { FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) { - max_real = max( max_real, L_abs( realBuffer_fx[i][j] ) ); - max_imag = max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); + max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); + max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); } } - Word32 max_val = max( max_real, max_imag ); + Word32 max_val = L_max( max_real, max_imag ); Q_imag = sub( norm_l( max_val ), 3 ) /* Guard bits */; Q_real = Q_imag; move16(); @@ -2009,192 +1968,293 @@ ivas_error acelp_core_dec_ivas_fx( scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); } scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1) + st->cldfbSyn->Q_cldfb_state = sub( Q_real, 1 ); + move16(); #ifndef MSAN_FIX Scale_sig32( synth_fx, L_FRAME48k, Q_real - 1 ); #endif - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx /*dummy*/, NS2SA( st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ), st->cldfbSyn ); - + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx, -1, st->cldfbSyn ); #ifdef MSAN_FIX - Scale_sig32( synth_fx, output_frame, -sub( Q_real, 1 ) ); + scale_sig32( synth_fx, output_frame, -sub( Q_real, 1 ) ); #else - Scale_sig32( synth_fx, L_FRAME48k, -( Q_real - 1 ) ); + Scale_sig32( synth_fx, L_FRAME48k, -( Q_real - 1 ) ); #endif - Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); + scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 st->cldfbSyn->Q_cldfb_state = Q10; move16(); - IF( st->p_bpf_noise_buf_32 ) - { - Copy_Scale_sig_16_32( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 - Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame ); - - Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); - } - - set_l( synth_fx, 0, output_frame ); } - /* Copy output signal */ + /* save synthesis - needed in case of core switching */ + Copy32( synth_fx, st->previoussynth_fx_32, output_frame ); // Q0 + } + ELSE + { + Word16 nSamples = NS2SA( st->L_frame * FRAMES_PER_SEC, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ); /* IVAS-64: optimization is likely possible here (don't resample the whole frame) */ + + /* analysis of the synthesis at internal sampling rate - needed for DFT stereo -> TD stereo switching */ #ifndef MSAN_FIX - Scale_sig( syn_tmp_fx, L_FRAME16k + L_SUBFR, -st->Q_syn ); + for ( i = 0; i < L_FRAME16k; i++ ) #else - Scale_sig( syn_tmp_fx, add( st->L_frame, L_SUBFR ), -st->Q_syn ); + FOR( i = 0; i < st->L_frame; i++ ) #endif - IF( GT_16( st->element_mode, EVS_MONO ) ) { - Copy( psyn_fx, output_fx, st->L_frame ); + syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); + move32(); + } + + Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 + st->cldfbAna->Q_cldfb_state = Q12; + move16(); + cldfbAnalysis_ivas_fx( syn_32_fx + st->L_frame - nSamples, realBuffer_fx, imagBuffer_fx, nSamples, st->cldfbAna ); + + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 + st->cldfbAna->Q_cldfb_state = Q11; + move16(); /* analysis and add the BPF error signal - needed for DFT stereo -> TD stereo switching */ + Word32 tmp_bpf_error_signal_fx[L_FRAME16k]; + Word16 q_bpf_error_signal; + Word16 cldfb_state_offset = sub( st->cldfbBPF->p_filter_length, st->cldfbBPF->no_channels ); + + // Get Q-factor + q_bpf_error_signal = Q6; + move16(); + Copy_Scale_sig_16_32( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 + Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 + } + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, sub( q_bpf_error_signal, Q10 ) ); // q_bpf_error_signal (Q6) + st->cldfbBPF->Q_cldfb_state = q_bpf_error_signal; + move16(); + tmp = 0; + move16(); + if ( !st->bpf_off ) + { + tmp = nSamples; + move16(); } + addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx + st->L_frame - nSamples, tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); + - st->Q_syn2 = 0; + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, -sub( q_bpf_error_signal, Q10 ) ); // Q10 + st->cldfbBPF->Q_cldfb_state = Q10; move16(); - /*-----------------------------------------------------------------* - * Bandwidth extension 6kHz-7kHz - *-----------------------------------------------------------------*/ - IF( st->hBWE_zero != NULL ) + /* synthesis of the combined signal - needed for DFT stereo -> TD stereo switching */ + Word16 Q_real = 0, Q_imag = 0; + Word32 max_real = 0, max_imag = 0; + move16(); + move16(); + move32(); + move32(); + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( EQ_16( st->L_frame, L_FRAME ) && NE_16( st->bwidth, NB ) && GE_16( output_frame, L_FRAME16k ) && - ( EQ_16( st->extl, -1 ) || EQ_16( st->extl, SWB_CNG ) || ( EQ_16( st->extl, WB_BWE ) && st->extl_brate == 0 && NE_16( st->coder_type, AUDIO ) ) ) ) ) + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) { + max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); + max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); + } + } + Word32 max_val = L_max( max_real, max_imag ); + Q_imag = sub( norm_l( max_val ), 3 ) /* Guard bits */; + Q_real = Q_imag; + move16(); + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); + scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); + } + scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1) +#ifndef MSAN_FIX + Scale_sig32( synth_fx, L_FRAME48k, Q_real - 1 ); +#endif + + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx /*dummy*/, NS2SA( st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ), st->cldfbSyn ); + +#ifdef MSAN_FIX + Scale_sig32( synth_fx, output_frame, -sub( Q_real, 1 ) ); +#else + Scale_sig32( synth_fx, L_FRAME48k, -( Q_real - 1 ) ); +#endif + Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); + st->cldfbSyn->Q_cldfb_state = Q10; + move16(); + IF( st->p_bpf_noise_buf_32 ) + { + Copy_Scale_sig_16_32( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 + Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame ); + + Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); + } + + set32_fx( synth_fx, 0, output_frame ); + } + + /* Copy output signal */ +#ifndef MSAN_FIX + Scale_sig( syn_tmp_fx, L_FRAME16k + L_SUBFR, -st->Q_syn ); +#else + Scale_sig( syn_tmp_fx, add( st->L_frame, L_SUBFR ), -st->Q_syn ); +#endif + IF( st->element_mode > EVS_MONO ) + { + Copy( psyn_fx, output_fx, st->L_frame ); + } + + st->Q_syn2 = 0; + move16(); + /*-----------------------------------------------------------------* + * Bandwidth extension 6kHz-7kHz + *-----------------------------------------------------------------*/ + IF( st->hBWE_zero != NULL ) + { + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( EQ_16( st->L_frame, L_FRAME ) && NE_16( st->bwidth, NB ) && GE_16( output_frame, L_FRAME16k ) && + ( EQ_16( st->extl, -1 ) || EQ_16( st->extl, SWB_CNG ) || ( EQ_16( st->extl, WB_BWE ) && st->extl_brate == 0 && NE_16( st->coder_type, AUDIO ) ) ) ) ) + { #ifndef FIX_774_ENERGY_BURST - Word16 tmp_exp = 0; - move16(); + Word16 tmp_exp = 0; + move16(); #endif #ifdef MSAN_FIX - Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); + Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); #else Copy_Scale_sig_32_16( synth_fx, synth_fx16, L_FRAME48k, 0 ); #endif #ifdef FIX_774_ENERGY_BURST - hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc_fx, - psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2, st->hBWE_zero->delay_syn_hf_fx, &st->hBWE_zero->memExp1, - st->hBWE_zero->mem_hp_interp_fx, st->extl, st->CNG_mode ); + hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc_fx, + psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2, st->hBWE_zero->delay_syn_hf_fx, &st->hBWE_zero->memExp1, + st->hBWE_zero->mem_hp_interp_fx, st->extl, st->CNG_mode ); #else hf_synth_ivas_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2, st->hBWE_zero->delay_syn_hf_fx, &tmp_exp, st->hBWE_zero->mem_hp_interp_fx, st->extl, st->CNG_mode, st->element_mode ); #endif #ifdef MSAN_FIX - Copy_Scale_sig_16_32( synth_fx16, synth_fx, output_frame, 0 ); + Copy_Scale_sig_16_32( synth_fx16, synth_fx, output_frame, 0 ); #else Copy_Scale_sig_16_32( synth_fx16, synth_fx, L_FRAME48k, 0 ); #endif #ifndef FIX_774_ENERGY_BURST - IF( st->hBWE_FD != NULL ) - { - st->hBWE_FD->memExp1 = tmp_exp; - move16(); - } - ELSE - { - Scale_sig( st->hBWE_zero->mem_hf_fx, sub( L_FIR, 1 ), -tmp_exp ); - } -#endif + IF( st->hBWE_FD != NULL ) + { + st->hBWE_FD->memExp1 = tmp_exp; + move16(); } ELSE { - hf_synth_reset_fx( st->hBWE_zero ); + Scale_sig( st->hBWE_zero->mem_hf_fx, sub( L_FIR, 1 ), -tmp_exp ); + } +#endif + } + ELSE + { + hf_synth_reset_fx( st->hBWE_zero ); #ifdef MSAN_FIX - set16_fx( st->hBWE_zero->mem_hp400_fx, 0, 6 ); + set16_fx( st->hBWE_zero->mem_hp400_fx, 0, 6 ); #endif - } } + } - /*-----------------------------------------------------------------* - * Populate parameters for SWB TBE - *-----------------------------------------------------------------*/ + /*-----------------------------------------------------------------* + * Populate parameters for SWB TBE + *-----------------------------------------------------------------*/ - IF( st->hBWE_TD != NULL ) + IF( st->hBWE_TD != NULL ) + { + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( !st->bfi && st->prev_bfi ) || ( EQ_16( st->last_vbr_hw_BWE_disable_dec, 1 ) && ( st->vbr_hw_BWE_disable_dec == 0 ) ) || ( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, WB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && NE_16( st->last_extl, SWB_TBE ) && NE_16( st->last_extl, WB_TBE ) && NE_16( st->last_extl, FB_TBE ) ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && !st->tdm_LRTD_flag ) ) { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( !st->bfi && st->prev_bfi ) || ( EQ_16( st->last_vbr_hw_BWE_disable_dec, 1 ) && ( st->vbr_hw_BWE_disable_dec == 0 ) ) || ( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, WB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && NE_16( st->last_extl, SWB_TBE ) && NE_16( st->last_extl, WB_TBE ) && NE_16( st->last_extl, FB_TBE ) ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && !st->tdm_LRTD_flag ) ) - { - st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; - move32(); - set_s( st->hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); - } - test(); - test(); - test(); - test(); - test(); - IF( !st->ppp_mode_dec && ( EQ_16( st->idchan, 0 ) || NE_16( st->element_mode, IVAS_CPE_TD ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && st->tdm_LRTD_flag ) ) ) - { - Copy_Scale_sig_16_32( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( 2 * st->Q_exc - ( st->prev_Q_bwe_exc - 16 ) ) ); - non_linearity_ivas_fx( bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); - Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, -( 2 * st->Q_exc - ( st->prev_Q_bwe_exc - 16 ) ) ); - } - test(); - IF( EQ_32( st->core_brate, FRAME_NO_DATA ) || EQ_32( st->core_brate, SID_2k40 ) ) - { - st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; - move32(); - } + st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; + move32(); + set16_fx( st->hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); + } + test(); + test(); + test(); + test(); + test(); + IF( !st->ppp_mode_dec && ( st->idchan == 0 || NE_16( st->element_mode, IVAS_CPE_TD ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && st->tdm_LRTD_flag ) ) ) + { + Copy_Scale_sig_16_32( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( 2 * st->Q_exc - ( st->prev_Q_bwe_exc - 16 ) ) ); + non_linearity_ivas_fx( bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); + Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, -( 2 * st->Q_exc - ( st->prev_Q_bwe_exc - 16 ) ) ); } - /*----------------------------------------------------------------------* - * Updates - *----------------------------------------------------------------------*/ - - updt_dec_fx( st, old_exc_fx, pitch_buf_fx, Es_pred_fx, Aq_fx, lsf_new_fx, lsp_new_fx, voice_factors_fx, old_bwe_exc_fx, gain_buf_fx ); test(); - IF( GT_32( st->core_brate, SID_2k40 ) && st->hTdCngDec != NULL && st->hFdCngDec != NULL ) + if ( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) { - /* update CNG parameters in active frames */ - cng_params_upd_ivas_fx( lsp_new_fx, exc_fx, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, - st->hTdCngDec->ho_lsp_circ_fx, st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate, st->element_mode, - st->hFdCngDec->hFdCngCom->CngBandwidth ); + st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; + move32(); + } + } + /*----------------------------------------------------------------------* + * Updates + *----------------------------------------------------------------------*/ + + updt_dec_fx( st, old_exc_fx, pitch_buf_fx, Es_pred_fx, Aq_fx, lsf_new_fx, lsp_new_fx, voice_factors_fx, old_bwe_exc_fx, gain_buf_fx ); + test(); + test(); + IF( GT_32( st->core_brate, SID_2k40 ) && st->hTdCngDec != NULL && st->hFdCngDec != NULL ) + { + /* update CNG parameters in active frames */ + cng_params_upd_ivas_fx( lsp_new_fx, exc_fx, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, + st->hTdCngDec->ho_lsp_circ_fx, st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate, st->element_mode, + st->hFdCngDec->hFdCngCom->CngBandwidth ); - /* Set 16k LSP flag for CNG buffer */ - st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 0; + /* Set 16k LSP flag for CNG buffer */ + st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 0; + move16(); + if ( NE_16( st->L_frame, L_FRAME ) ) + { + st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 1; move16(); - if ( NE_16( st->L_frame, L_FRAME ) ) - { - st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 1; - move16(); - } } + } + { + IF( save_hb_synth_fx16 ) { - IF( save_hb_synth_fx16 ) - { - Copy_Scale_sig_32_16( save_hb_synth_fx, save_hb_synth_fx16, L_FRAME48k, 0 ); - } + Copy_Scale_sig_32_16( save_hb_synth_fx, save_hb_synth_fx16, L_FRAME48k, 0 ); + } #ifdef MSAN_FIX - Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); + Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); #else Copy_Scale_sig_32_16( synth_fx, synth_fx16, L_FRAME48k, 0 ); #endif - if ( st->hFdCngDec ) - { - st->hFdCngDec->hFdCngCom->A_cng[0] = ONE_IN_Q12; - move16(); - } + if ( st->hFdCngDec ) + { + st->hFdCngDec->hFdCngCom->A_cng[0] = ONE_IN_Q12; + move16(); } - - pop_wmops(); - return error; } + pop_wmops(); + return error; +} - static void rescale_fdCngDec( HANDLE_FD_CNG_DEC hFdCngDec, Word16 Exp_diff ) - { - Scale_sig32( hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, Exp_diff ); - } + +static void rescale_fdCngDec( HANDLE_FD_CNG_DEC hFdCngDec, Word16 Exp_diff ) +{ + Scale_sig32( hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, Exp_diff ); +} #endif diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 0984c7698..4a13837b1 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1904,7 +1904,7 @@ Word16 ApplyFdCng_ivas_fx( IF( EQ_16( st->codec_mode, MODE2 ) ) { /* Generate comfort noise during SID or zero frames */ - generate_comfort_noise_dec_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); + generate_comfort_noise_dec_ivas_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); } BREAK; diff --git a/lib_dec/ivas_cpe_dec_fx.c b/lib_dec/ivas_cpe_dec_fx.c index a246eb92f..59969dba2 100644 --- a/lib_dec/ivas_cpe_dec_fx.c +++ b/lib_dec/ivas_cpe_dec_fx.c @@ -45,8 +45,6 @@ #include "wmc_auto.h" #include -/* NOTE: Temporary macro for computation happening in floating point. This macro and code active under this is to be removed once the intermediate conversions to float are not required */ -#define IVAS_FLOAT_FIXED_TO_BE_REMOVED /*--------------------------------------------------------------------------* * Local function prototypes @@ -1321,14 +1319,12 @@ void destroy_cpe_dec( { FOR( n = 0; n < CPE_CHANNELS; n++ ) { -#ifdef IVAS_FLOAT_FIXED free( hCPE->input_mem_LB_fx[n] ); hCPE->input_mem_LB_fx[n] = NULL; free( hCPE->input_mem_fx[n] ); hCPE->input_mem_fx[n] = NULL; free( hCPE->output_mem_fx[n] ); hCPE->output_mem_fx[n] = NULL; -#endif IF( hCPE->prev_synth_chs_fx[n] != NULL ) { @@ -1336,10 +1332,8 @@ void destroy_cpe_dec( hCPE->prev_synth_chs_fx[n] = NULL; } } -#ifdef IVAS_FLOAT_FIXED free( hCPE->input_mem_BPF_fx[0] ); hCPE->input_mem_BPF_fx[0] = NULL; -#endif } IF( hCPE->hStereoCng != NULL ) diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 57210b2cb..c57261bbf 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -3304,93 +3304,7 @@ void ivas_param_mc_dec_digest_tc( } if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) { -#ifdef IVAS_FLOAT_FIXED - Word32( *cx_fx )[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; - Word16 cx_e; - Word32( *cx_imag_fx )[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; - Word16 cx_imag_e; - Word16 cldfb_slots; - - cx_fx = malloc( sizeof( Word32[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS] ) ); - cx_imag_fx = malloc( sizeof( Word32[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS] ) ); - - for ( int lp = 0; lp < PARAM_MC_MAX_PARAMETER_BANDS; lp++ ) - { - set32_fx( cx_fx[lp], 0, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); - set32_fx( cx_imag_fx[lp], 0, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); - } - - cldfb_slots = DEFAULT_JBM_CLDFB_TIMESLOTS; - if ( st_ivas->hDecoderConfig->Opt_tsm ) - { - cldfb_slots = MAX_JBM_CLDFB_TIMESLOTS; - } - - f2me_buf( hParamMC->Cldfb_RealBuffer_tc, hParamMC->Cldfb_RealBuffer_tc_fx, &hParamMC->Cldfb_RealBuffer_tc_e, cldfb_slots * st_ivas->nchan_transport * hParamMC->num_freq_bands ); - f2me_buf( hParamMC->Cldfb_ImagBuffer_tc, hParamMC->Cldfb_ImagBuffer_tc_fx, &hParamMC->Cldfb_ImagBuffer_tc_e, cldfb_slots * st_ivas->nchan_transport * hParamMC->num_freq_bands ); - - Word16 max_e = 0; - cx_e; - for ( int lp = 0; lp < PARAM_MC_MAX_PARAMETER_BANDS; lp++ ) - { - for ( int lp2 = 0; lp2 < PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS; lp2++ ) - { - f2me( cx[lp][lp2], &cx_fx[lp][lp2], &cx_e ); - max_e = s_max( cx_e, max_e ); - } - } - - for ( int lp = 0; lp < PARAM_MC_MAX_PARAMETER_BANDS; lp++ ) - { - for ( int lp2 = 0; lp2 < PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS; lp2++ ) - { - f2me( cx[lp][lp2], &cx_fx[lp][lp2], &cx_e ); - cx_fx[lp][lp2] = L_shr( cx_fx[lp][lp2], max_e - cx_e ); - } - } - cx_e = max_e; - - max_e = 0; - for ( int lp = 0; lp < PARAM_MC_MAX_PARAMETER_BANDS; lp++ ) - { - for ( int lp2 = 0; lp2 < PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS; lp2++ ) - { - f2me( cx_imag[lp][lp2], &cx_imag_fx[lp][lp2], &cx_imag_e ); - max_e = s_max( cx_imag_e, max_e ); - } - } - - for ( int lp = 0; lp < PARAM_MC_MAX_PARAMETER_BANDS; lp++ ) - { - for ( int lp2 = 0; lp2 < PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS; lp2++ ) - { - f2me( cx_imag[lp][lp2], &cx_imag_fx[lp][lp2], &cx_imag_e ); - cx_imag_fx[lp][lp2] = L_shr( cx_imag_fx[lp][lp2], max_e - cx_imag_e ); - } - } - cx_imag_e = max_e; - - ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot_fx( &hParamMC->Cldfb_RealBuffer_tc_fx[slot_idx * hParamMC->num_freq_bands * nchan_transport], - hParamMC->Cldfb_RealBuffer_tc_e, - &hParamMC->Cldfb_ImagBuffer_tc_fx[slot_idx * hParamMC->num_freq_bands * nchan_transport], - hParamMC->Cldfb_ImagBuffer_tc_e, - cx_fx, - &cx_e, - cx_imag_fx, - &cx_imag_e, - hParamMC, - nchan_transport ); - - for ( int lp = 0; lp < PARAM_MC_MAX_PARAMETER_BANDS; lp++ ) - { - me2f_buf( cx_fx[lp], cx_e, cx[lp], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); - me2f_buf( cx_imag_fx[lp], cx_imag_e, cx_imag[lp], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); - } - free( cx_fx ); - free( cx_imag_fx ); -#else ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], cx, cx_imag, hParamMC, nchan_transport ); -#endif } } diff --git a/lib_dec/ivas_out_setup_conversion.c b/lib_dec/ivas_out_setup_conversion.c index 505b6797f..2764b640b 100644 --- a/lib_dec/ivas_out_setup_conversion.c +++ b/lib_dec/ivas_out_setup_conversion.c @@ -1690,11 +1690,13 @@ void ivas_ls_setup_conversion_process_mdct( } #endif + /*------------------------------------------------------------------------- * ivas_ls_setup_conversion_process_mdct_param_mc() * * Equalization in MDCT Domain *-------------------------------------------------------------------------*/ + #ifdef IVAS_FLOAT_FIXED void ivas_ls_setup_conversion_process_mdct_param_mc_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ @@ -2075,7 +2077,6 @@ void ivas_ls_setup_conversion_process_mdct_param_mc_fx( return; } #else - void ivas_ls_setup_conversion_process_mdct_param_mc( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *x[][NB_DIV] /* i/o: output synthesis signal */ @@ -2237,49 +2238,7 @@ void ivas_ls_setup_conversion_process_mdct_param_mc( } } -#ifdef IVAS_FLOAT_FIXED - Word32 real_in_buffer_fx[PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND * PARAM_MC_BAND_TO_MDCT_BAND_RATIO * MAX_TRANSPORT_CHANNELS]; - Word32 imag_in_buffer_fx[PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND * PARAM_MC_BAND_TO_MDCT_BAND_RATIO * MAX_TRANSPORT_CHANNELS]; - Word32 real_buffer_fx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; - Word32 imag_buffer_fx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; - Word16 real_exp, imag_exp, input_exp, output_exp; - Word16 shift = find_guarded_bits_fx( num_bands + 1 ); - - f2me_buf( real_in_buffer, real_in_buffer_fx, &real_exp, num_bands * nchan_transport ); - f2me_buf( imag_in_buffer, imag_in_buffer_fx, &imag_exp, num_bands * nchan_transport ); - - IF( real_exp > imag_exp ) - { - FOR( i = 0; i < num_bands * nchan_transport; ++i ) - { - imag_in_buffer_fx[i] = L_shr( imag_in_buffer_fx[i], real_exp - imag_exp ); - } - input_exp = real_exp; - } - ELSE - { - FOR( i = 0; i < num_bands * nchan_transport; ++i ) - { - real_in_buffer_fx[i] = L_shr( real_in_buffer_fx[i], imag_exp - real_exp ); - } - input_exp = imag_exp; - } - - FOR( i = 0; i < num_bands * nchan_transport; ++i ) - { - real_in_buffer_fx[i] = L_shr( real_in_buffer_fx[i], shift ); - imag_in_buffer_fx[i] = L_shr( imag_in_buffer_fx[i], shift ); - } - - input_exp += shift; - - cmplx_matrix_square_fx( real_in_buffer_fx, imag_in_buffer_fx, num_bands, nchan_transport, real_buffer_fx, imag_buffer_fx, input_exp, &output_exp ); - - me2f_buf( real_buffer_fx, output_exp, real_buffer, nchan_transport * nchan_transport ); - me2f_buf( imag_buffer_fx, output_exp, imag_buffer, nchan_transport * nchan_transport ); -#else cmplx_matrix_square( real_in_buffer, imag_in_buffer, num_bands, nchan_transport, real_buffer, imag_buffer ); -#endif v_add( cx[bandIdx], real_buffer, cx[bandIdx], nchan_transport * nchan_transport ); @@ -2445,6 +2404,7 @@ void ivas_ls_setup_conversion_process_mdct_param_mc( } #endif + /*------------------------------------------------------------------------- * ivas_ls_setup_conversion_process_param_mc() * diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index 50603a381..f4464f79c 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -42,8 +42,6 @@ #ifdef IVAS_FLOAT_FIXED #include "ivas_prot_fx.h" #include "prot_fx.h" -#endif -#ifdef IVAS_FLOAT_FIXED #include "ivas_rom_com_fx.h" #endif diff --git a/lib_dec/ivas_stereo_mdct_core_dec.c b/lib_dec/ivas_stereo_mdct_core_dec.c index 6a3638bfc..273a4c097 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec.c +++ b/lib_dec/ivas_stereo_mdct_core_dec.c @@ -40,23 +40,17 @@ #include "ivas_prot.h" #include "ivas_stat_dec.h" #include "wmc_auto.h" -#ifdef IVAS_FLOAT_FIXED -#include "prot_fx.h" -#include "ivas_prot_fx.h" -#endif // IVAS_FLOAT_FIXED +#ifndef IVAS_FLOAT_FIXED /*------------------------------------------------------------------------- * Local function prototypes *-------------------------------------------------------------------------*/ -#ifndef IVAS_FLOAT_FIXED static void apply_dmx_weights( CPE_DEC_HANDLE hCPE, float *x[CPE_CHANNELS][NB_DIV], int16_t transform_type_left[NB_DIV], int16_t transform_type_right[NB_DIV] ); -#endif -#ifndef IVAS_FLOAT_FIXED static void run_min_stats( Decoder_State **sts, float *x[CPE_CHANNELS][NB_DIV] ); -#endif + /*-------------------------------------------------------------------* * convert_coeffs_to_higher_res() @@ -65,55 +59,6 @@ static void run_min_stats( Decoder_State **sts, float *x[CPE_CHANNELS][NB_DIV] ) * by applying high- and lowpass filters to subdivide bins *-------------------------------------------------------------------*/ -#ifdef IVAS_FLOAT_FIXED -#define POINT_5_Q31 ONE_IN_Q30 - -void convert_coeffs_to_higher_res_fx( - const Word32 *in1, /* i : first subframe input */ - const Word32 *in2, /* i : second subframe input */ - Word32 *out, /* o : converted output */ - const Word16 len /* i : length of subframes */ -) -{ - Word16 i; - Word32 tmp1, tmp2; - - IF( in1 == out ) - { - FOR( i = 0; i < len; i += 2 ) - { - tmp1 = Mpy_32_32( POINT_5_Q31, ( L_add( in2[i], in1[i] ) ) ); - tmp2 = Mpy_32_32( POINT_5_Q31, ( L_sub( in2[i], in1[i] ) ) ); - out[2 * i] = tmp1; - move32(); - out[2 * i + 1] = tmp2; - move32(); - tmp1 = Mpy_32_32( POINT_5_Q31, ( L_sub( in2[i], in1[i] ) ) ); - tmp2 = Mpy_32_32( POINT_5_Q31, ( L_add( in2[i], in1[i] ) ) ); - out[2 * i + 2] = tmp1; - move32(); - out[2 * i + 3] = tmp2; - move32(); - } - } - ELSE - { - FOR( i = 0; i < len; i += 2 ) - { - out[2 * i] = Mpy_32_32( POINT_5_Q31, ( L_add( in2[i], in1[i] ) ) ); - move32(); - out[2 * i + 1] = Mpy_32_32( POINT_5_Q31, ( L_sub( in2[i], in1[i] ) ) ); - move32(); - out[2 * i + 2] = Mpy_32_32( POINT_5_Q31, ( L_sub( in2[i + 1], in1[i + 1] ) ) ); - move32(); - out[2 * i + 3] = Mpy_32_32( POINT_5_Q31, ( L_add( in2[i + 1], in1[i + 1] ) ) ); - move32(); - } - } - - return; -} -#endif void convert_coeffs_to_higher_res( const float *in1, /* i : first subframe input */ const float *in2, /* i : second subframe input */ @@ -159,7 +104,6 @@ void convert_coeffs_to_higher_res( * decode core and MDCT stereo information *-------------------------------------------------------------------*/ -#ifndef IVAS_FLOAT_FIXED static void stereo_mdct_dec_stereo( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ int16_t ms_mask[2][MAX_SFB] /* o : bandwise MS mask */ @@ -184,9 +128,8 @@ static void stereo_mdct_dec_stereo( return; } -#endif -#ifndef IVAS_FLOAT_FIXED + /*-------------------------------------------------------------------* * stereo_mdct_core_dec() * @@ -208,11 +151,6 @@ void stereo_mdct_core_dec( int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW]; float Aq[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )]; -#ifdef IVAS_FLOAT_FIXED - /* NOTE: temporary fix to avoid garbage values while calculating its - q-factor when not initialised. */ - set_zero( (float *) Aq, CPE_CHANNELS * ( NB_SUBFR16k + 1 ) * ( M + 1 ) ); -#endif float *x[CPE_CHANNELS][NB_DIV]; /*needed to allocate N_MAX to prevent stereo switching crash */ @@ -240,11 +178,6 @@ void stereo_mdct_core_dec( int16_t nTnsBitsTCX10[CPE_CHANNELS][NB_DIV]; float signal_outFB_tmp[CPE_CHANNELS][L_FRAME_PLUS]; float signal_out_tmp[CPE_CHANNELS][L_FRAME_PLUS]; -#ifdef IVAS_FLOAT_FIXED - Word32 signal_out_tmp_fx[CPE_CHANNELS][L_FRAME_PLUS]; - Word32 *x_fx[CPE_CHANNELS][NB_DIV]; -#endif - push_wmops( "stereo_mdct_core_dec" ); /*--------------------------------------------------------------------------------* @@ -260,26 +193,12 @@ void stereo_mdct_core_dec( for ( ch = 0; ch < nChannels; ch++ ) { /* Initialization or re-configuration of Stereo TCX */ -#ifdef IVAS_FLOAT_FIXED - /* stereo_tcx_dec_mode_switch_reconf_To_fixed is for intermediatery conversions which is needed to be removed */ - stereo_tcx_dec_mode_switch_reconf_To_fixed( sts[ch], 1, hCPE->last_element_mode ); - /*============*/ - stereo_tcx_init_dec_fx( sts[ch], 0, hCPE->last_element_mode ); - /*============*/ - stereo_tcx_dec_mode_switch_reconf_To_fixed( sts[ch], 0, hCPE->last_element_mode ); -#else stereo_tcx_init_dec( sts[ch], 0, hCPE->last_element_mode ); -#endif // IVAS_FLOAT_FIXED sts[ch]->hTcxDec->tnsActive[0] = sts[ch]->hTcxDec->tnsActive[1] = 0; sts[ch]->enablePlcWaveadjust = 0; set_zero( signal_out_tmp[ch], L_FRAME_PLUS ); x[ch][0] = &signal_out_tmp[ch][0]; x[ch][1] = &signal_out_tmp[ch][0] + L_FRAME_PLUS / 2; -#ifdef IVAS_FLOAT_FIXED - set32_fx( signal_out_tmp_fx[ch], 0, L_FRAME_PLUS ); - x_fx[ch][0] = &signal_out_tmp_fx[ch][0]; - x_fx[ch][1] = &signal_out_tmp_fx[ch][0] + L_FRAME_PLUS / 2; -#endif set_zero( x_0_buf[ch], N_MAX ); x_0[ch][0] = &x_0_buf[ch][0]; @@ -397,38 +316,11 @@ void stereo_mdct_core_dec( { float sns_int_scf[FDNS_NPTS]; -#ifdef IVAS_FLOAT_FIXED - Word32 sns_int_scf_fx[FDNS_NPTS], Aq_fx[SNS_NPTS]; - FOR( int c = 0; c < SNS_NPTS; c++ ) - { - Aq_fx[c] = (Word32) ( Aq[ch][k * M + c] * ONE_IN_Q16 ); - } - - sns_interpolate_scalefactors_fx( sns_int_scf_fx, Aq_fx, DEC ); - - FOR( int c = 0; c < FDNS_NPTS; c++ ) - { - sns_int_scf[c] = ( (float) sns_int_scf_fx[c] / ONE_IN_Q16 ); - } -#else sns_interpolate_scalefactors( &sns_int_scf[0], &Aq[ch][k * M], DEC ); -#endif // IVAS_FLOAT_FIXED if ( st->hTonalMDCTConc != NULL && ( ( k + 1 ) == nSubframes[ch] ) ) { -#ifdef IVAS_FLOAT_FIXED - Word32 x_fx_[N_MAX]; - Word16 x_e, scf_fx[FDNS_NPTS], scf_e[FDNS_NPTS]; - f2me_buf( x[ch][k], x_fx_, &x_e, L_frameTCX[ch] ); - for ( int j = 0; j < st->hTonalMDCTConc->nScaleFactors; j++ ) - { - f2me_16( sns_int_scf[j], &scf_fx[j], &scf_e[j] ); - } - TonalMDCTConceal_SaveFreqSignal_ivas_fx( st->hTonalMDCTConc, x_fx_, x_e, L_frameTCX[ch], L_frame[ch], &scf_fx[0], scf_e, 0, get_igf_startline( st, L_frame[ch], L_frameTCX[ch] ) ); - // st->hTonalMDCTConc->last_block_nrg_flt = me2f( st->hTonalMDCTConc->last_block_nrg, st->hTonalMDCTConc->last_block_nrg_exp ); -#else TonalMDCTConceal_SaveFreqSignal_ivas( st->hTonalMDCTConc, x[ch][k], L_frameTCX[ch], L_frame[ch], &sns_int_scf[0], get_igf_startline_flt( st, L_frame[ch], L_frameTCX[ch] ) ); -#endif } } @@ -444,41 +336,7 @@ void stereo_mdct_core_dec( stereo_decoder_tcx( hCPE->hStereoMdct, ms_mask, x_0[1], x[0], x[1], &hCPE->hStereoMdct->mdct_stereo_mode[0], sts[0]->core, sts[1]->core, sts[0]->igf, L_frameTCX[0], L_frameTCX[1], 0, sts[0]->last_core, sts[1]->last_core, 0 ); } -#ifdef IVAS_FLOAT_FIXED1 - Word32 Aq_fx[2][102]; - Word16 x_e[2][2]; - FOR( Word16 ind = 0; ind < 2; ind++ ) - { - FOR( Word16 ind2 = 0; ind2 < 102; ind2++ ) - { - Aq_fx[ind][ind2] = (Word32) ( Aq[ind][ind2] * ( ONE_IN_Q16 ) ); - } - FOR( Word16 ind2 = 0; ind2 < 2; ind2++ ) - { - f2me_buf( x[ind][ind2], x_fx[ind][ind2], &x_e[ind][ind2], L_frameTCX[ind] ); - } - } - st->hTcxDec->cummulative_damping_tcx = (Word16) ( st->hTcxDec->cummulative_damping_tcx * ( ONE_IN_Q15 ) ); - FOR( Word16 ind = 0; ind < st->hTonalMDCTConc->nScaleFactors; ind++ ) - { - f2me_16( st->hTonalMDCTConc->lastBlockData.scaleFactors_float[ind], &st->hTonalMDCTConc->lastBlockData.scaleFactors[ind], &st->hTonalMDCTConc->lastBlockData.scaleFactors_exp[ind] ); - } - FOR( Word16 ind = 0; ind < st->hTonalMDCTConc->nScaleFactors; ind++ ) - { - f2me_16( st->hTonalMDCTConc->lastBlockData.scaleFactors_float[ind], &st->hTonalMDCTConc->lastBlockData.scaleFactors[ind], &st->hTonalMDCTConc->lastBlockData.scaleFactors_exp[ind] ); - } - FOR( Word16 i = 0; i < st->hTonalMDCTConc->nScaleFactors; i++ ) - { - st->hTonalMDCTConc->scaleFactorsBackground[i] = float_to_fix16( st->hTonalMDCTConc->scaleFactorsBackground_flt[i], 15 ); - } - st->hTonalMDCTConc->scf_fadeout = float_to_fix16( st->hTonalMDCTConc->scf_fadeout_flt, 15 ); - st->old_fpitch = float_to_fix( st->old_fpitch_float, 16 ); - st->hTcxDec->tcxltp_last_gain_unmodified = float_to_fix16( st->hTcxDec->tcxltp_last_gain_unmodified_float, 15 ); - - ivas_mdct_core_tns_ns_fx( hCPE, fUseTns, tnsData, x_fx, Aq_fx, 0, x_e ); -#else ivas_mdct_core_tns_ns( hCPE, fUseTns, tnsData, x, Aq, 0 ); -#endif if ( st_ivas->renderer_type == RENDERER_MC_PARAMMC && ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO ) ) { @@ -771,10 +629,7 @@ static void run_min_stats( noisy_speech_detection( st->hFdCngDec, st->VAD && st->m_frame_type == ACTIVE_FRAME, power_spec ); st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_flt = 0.99f * st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_flt + 0.01f * (float) st->hFdCngDec->hFdCngCom->flag_noisy_speech; -#ifdef IVAS_FLOAT_FIXED - st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx = L_add( Mpy_32_32( Q31_0_99, st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx ), - st->hFdCngDec->hFdCngCom->flag_noisy_speech * Q31_0_01 ); -#endif + st->lp_noise_float = st->hFdCngDec->lp_noise_float; } diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 078c8957d..48850cf1b 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -44,19 +44,79 @@ #include "prot_fx.h" #include "ivas_prot_fx.h" + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define POINT_5_Q31 ONE_IN_Q30 + + /*------------------------------------------------------------------------- * Local function prototypes *-------------------------------------------------------------------------*/ static void apply_dmx_weights_fx( CPE_DEC_HANDLE hCPE, Word32 *x[CPE_CHANNELS][NB_DIV], int16_t transform_type_left[NB_DIV], int16_t transform_type_right[NB_DIV] ); -#ifndef IVAS_FLOAT_FIXED -static void apply_dmx_weights( CPE_DEC_HANDLE hCPE, float *x[CPE_CHANNELS][NB_DIV], int16_t transform_type_left[NB_DIV], int16_t transform_type_right[NB_DIV] ); -#endif static void run_min_stats_fx( Decoder_State **sts, Word32 *x[CPE_CHANNELS][NB_DIV], Word16 x_e[CPE_CHANNELS][NB_DIV] ); + /*-------------------------------------------------------------------* - * stereo_mdct_dec_stereo() + * convert_coeffs_to_higher_res_fx() + * + * convert MDCT coefficients to higher frequency resolution + * by applying high- and lowpass filters to subdivide bins + *-------------------------------------------------------------------*/ + +void convert_coeffs_to_higher_res_fx( + const Word32 *in1, /* i : first subframe input */ + const Word32 *in2, /* i : second subframe input */ + Word32 *out, /* o : converted output */ + const Word16 len /* i : length of subframes */ +) +{ + Word16 i; + Word32 tmp1, tmp2; + + IF( in1 == out ) + { + FOR( i = 0; i < len; i += 2 ) + { + tmp1 = Mpy_32_32( POINT_5_Q31, ( L_add( in2[i], in1[i] ) ) ); + tmp2 = Mpy_32_32( POINT_5_Q31, ( L_sub( in2[i], in1[i] ) ) ); + out[2 * i] = tmp1; + move32(); + out[2 * i + 1] = tmp2; + move32(); + tmp1 = Mpy_32_32( POINT_5_Q31, ( L_sub( in2[i], in1[i] ) ) ); + tmp2 = Mpy_32_32( POINT_5_Q31, ( L_add( in2[i], in1[i] ) ) ); + out[2 * i + 2] = tmp1; + move32(); + out[2 * i + 3] = tmp2; + move32(); + } + } + ELSE + { + FOR( i = 0; i < len; i += 2 ) + { + out[2 * i] = Mpy_32_32( POINT_5_Q31, ( L_add( in2[i], in1[i] ) ) ); + move32(); + out[2 * i + 1] = Mpy_32_32( POINT_5_Q31, ( L_sub( in2[i], in1[i] ) ) ); + move32(); + out[2 * i + 2] = Mpy_32_32( POINT_5_Q31, ( L_sub( in2[i + 1], in1[i + 1] ) ) ); + move32(); + out[2 * i + 3] = Mpy_32_32( POINT_5_Q31, ( L_add( in2[i + 1], in1[i + 1] ) ) ); + move32(); + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * stereo_mdct_dec_stereo_fx() * * decode core and MDCT stereo information *-------------------------------------------------------------------*/ @@ -79,7 +139,9 @@ static void stereo_mdct_dec_stereo_fx( splitAvailableBits_fx( availableBits, hCPE->hStereoMdct->split_ratio, hCPE->hStereoMdct->isSBAStereoMode, &sts[0]->bits_frame_channel, &sts[1]->bits_frame_channel ); sts[0]->bits_frame_channel = add( sts[0]->bits_frame_channel, i_mult( sts[0]->core, SMDCT_MINIMUM_ARITH_BITS ) ); + move16(); sts[1]->bits_frame_channel = add( sts[1]->bits_frame_channel, i_mult( sts[1]->core, SMDCT_MINIMUM_ARITH_BITS ) ); + move16(); sts[1]->bit_stream = &sts[0]->bit_stream[add( add( sts[0]->next_bit_pos, sts[0]->bits_frame_channel ), i_mult( sts[0]->core, NF_GAIN_BITS ) )]; @@ -88,7 +150,7 @@ static void stereo_mdct_dec_stereo_fx( /*-------------------------------------------------------------------* - * stereo_mdct_core_dec() + * stereo_mdct_core_dec_fx() * * MDCT stereo core/stereo decoder *--------------------------------------------------------------------*/ @@ -501,204 +563,9 @@ void stereo_mdct_core_dec_fx( return; } -#ifndef IVAS_FLOAT_FIXED -static void apply_dmx_weights( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float *x[CPE_CHANNELS][NB_DIV], /* i/o: MDCT Spectrum */ - int16_t transform_type_left[NB_DIV], /* i : indicate TCX5 for left ch */ - int16_t transform_type_right[NB_DIV] /* i : indicate TCX5 for right ch */ -) -{ - int16_t b, k, l, i, ch; - int16_t nsub, nsub2[2], nChannels; - int16_t transform_type[2][2]; - int16_t numCoeffs[2], frameSize; - int16_t tcx_10_only, w_idx; - int16_t start, stop, start_tcx5, stop_tcx5; - STEREO_MDCT_BAND_PARAMETERS *sfbConf = NULL; - float mdst[CPE_CHANNELS][NB_DIV][L_FRAME48k]; - float convertRes[CPE_CHANNELS][L_FRAME48k]; - float *sig[CPE_CHANNELS][NB_DIV], *pTmp[CPE_CHANNELS][NB_DIV]; - - nChannels = CPE_CHANNELS; - frameSize = hCPE->hStereoMdct->stbParamsTCX20.sfbOffset[hCPE->hStereoMdct->stbParamsTCX20.sfbCnt]; - - transform_type[0][0] = transform_type_left[0]; - transform_type[0][1] = transform_type_left[1]; - transform_type[1][0] = transform_type_right[0]; - transform_type[1][1] = transform_type_right[1]; - - /* set overall frequency resolution of (sub)frame to maximum of (sub)frame, requires conversion if both channels are not the same */ - if ( transform_type[0][0] == TCX_20 || transform_type[1][0] == TCX_20 ) - { - /* use TCX20 band config for TCX20 in both channels and mixed frames */ - sfbConf = &hCPE->hStereoMdct->stbParamsTCX20; - nsub = nsub2[0] = nsub2[1] = 1; /* overall TCX 20 */ - tcx_10_only = 0; - } - else - { - /* use TCX10 band config only if none of the channels is TCX20 */ - sfbConf = &hCPE->hStereoMdct->stbParamsTCX10; - nsub = 2; - /* set resolution per subframe, subdivide again if subframe is TCX5 in both channels */ - nsub2[0] = ( transform_type[0][0] == TCX_5 && transform_type[1][0] == TCX_5 ) ? 2 : 1; - nsub2[1] = ( transform_type[0][1] == TCX_5 && transform_type[1][1] == TCX_5 ) ? 2 : 1; - tcx_10_only = 1; - } - - /* for subframes with only TCX5 in both channels number of coefficients is only half (in 2 quarterframes) */ - numCoeffs[0] = ( nsub2[0] == 1 ) ? sfbConf->sfbOffset[sfbConf->sfbCnt] : sfbConf->sfbOffset[sfbConf->sfbCnt] / 2; - numCoeffs[1] = ( nsub2[1] == 1 ) ? sfbConf->sfbOffset[sfbConf->sfbCnt] : sfbConf->sfbOffset[sfbConf->sfbCnt] / 2; - - /* initially, set pointers to input; if conversion occurs in (sub)frame, set to convertRes */ - sig[0][0] = pTmp[0][0] = x[0][0]; - sig[0][1] = pTmp[0][1] = x[0][1]; - sig[1][0] = pTmp[1][0] = x[1][0]; - sig[1][1] = pTmp[1][1] = x[1][1]; - - /* convert (sub)frames to higher frequency resolution */ - for ( ch = 0; ch < nChannels; ch++ ) - { - for ( k = 0; k < NB_DIV; k++ ) - { - if ( transform_type[ch][k] == TCX_5 && nsub2[k] == 1 ) - { - /* subframe is TCX5, but TCX10 or TCX20 in other channel -> convert channel with TCX5 to TCX10 resolution */ - pTmp[ch][k] = sig[ch][k] = convertRes[ch] + k * frameSize / 2; - convert_coeffs_to_higher_res( x[ch][k], x[ch][k] + frameSize / 4, pTmp[ch][k], frameSize / 4 ); - } - } - - if ( transform_type[ch][0] != TCX_20 && nsub == 1 ) - { - /* TCX20 and TCX10 in same frame -> convert channel with TCX10 to TCX20 resolution */ - sig[ch][0] = convertRes[ch]; - convert_coeffs_to_higher_res( pTmp[ch][0], pTmp[ch][1], sig[ch][0], frameSize / 2 ); - } - } - - /* MDST estimate */ - for ( ch = 0; ch < nChannels; ch++ ) - { - for ( k = 0; k < nsub; k++ ) - { - for ( l = 0; l < nsub2[k]; l++ ) - { - mdst[ch][k][l * numCoeffs[k]] = mdst[ch][k][( l + 1 ) * numCoeffs[k] - 1] = 0.f; - for ( i = l * numCoeffs[k] + 1; i < ( l + 1 ) * numCoeffs[k] - 1; i++ ) - { - mdst[ch][k][i] = sig[ch][k][i + 1] - sig[ch][k][i - 1]; - } - } - } - } - - /* compute and apply bandwise weigths for active downmix (similar to DFT Stereo) */ - stop_tcx5 = 0; - for ( b = 0; b < sfbConf->sfbCnt; b++ ) - { - float w[CPE_CHANNELS][4]; - - for ( k = 0; k < nsub; k++ ) - { - for ( l = 0; l < nsub2[k]; l++ ) - { - float sum_nrg_L = EPSILON, sum_nrg_R = EPSILON; - float dot_prod_real = EPSILON, dot_prod_imag = EPSILON; - float sum_nrg_Mid, sum_abs, dot_prod_abs; - - start = l * numCoeffs[k] + sfbConf->sfbOffset[b] / nsub2[k]; - stop = l * numCoeffs[k] + sfbConf->sfbOffset[b + 1] / nsub2[k]; - - /* compute band energies and cross correlation */ - for ( i = start; i < stop; i++ ) - { - sum_nrg_L += sig[0][k][i] * sig[0][k][i] + mdst[0][k][i] * mdst[0][k][i]; - sum_nrg_R += sig[1][k][i] * sig[1][k][i] + mdst[1][k][i] * mdst[1][k][i]; - dot_prod_real += sig[0][k][i] * sig[1][k][i] + mdst[0][k][i] * mdst[1][k][i]; - dot_prod_imag += mdst[0][k][i] * sig[1][k][i] - sig[0][k][i] * mdst[1][k][i]; - } - sum_nrg_Mid = max( 0.f, sum_nrg_L + sum_nrg_R + 2.f * dot_prod_real ); - sum_abs = sqrtf( sum_nrg_L ) + sqrtf( sum_nrg_R ) + EPSILON; - dot_prod_abs = sqrtf( dot_prod_real * dot_prod_real + dot_prod_imag * dot_prod_imag ); - - /* calculate weights */ - if ( hCPE->hStereoMdct->reverse_dmx == 0 ) - { - w[1][2 * k + l] = sqrtf( 0.5f * ( sum_nrg_L + sum_nrg_R ) + dot_prod_abs ) / sum_abs; - w[0][2 * k + l] = w[1][2 * k + l] + sqrtf( 2.f ) * ( 1.f - sqrtf( sum_nrg_Mid ) / sum_abs ); - } - else - { - w[0][2 * k + l] = sqrtf( 0.5f * ( sum_nrg_L + sum_nrg_R ) + dot_prod_abs ) / sum_abs; - w[1][2 * k + l] = w[0][2 * k + l] + sqrtf( 2.f ) * ( 1.f - sqrtf( sum_nrg_Mid ) / sum_abs ); - } - } - } - - /* apply weights to channels with their original frequency resolutions */ - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - if ( transform_type[ch][0] == TCX_20 ) - { - for ( i = sfbConf->sfbOffset[b]; i < sfbConf->sfbOffset[b + 1]; i++ ) - { - x[ch][0][i] *= w[ch][0]; - } - } - else - { - start = sfbConf->sfbOffset[b]; - stop = sfbConf->sfbOffset[b + 1]; - if ( !tcx_10_only ) /* TCX20 band config is used */ - { - start /= 2; - stop /= 2; - } - - for ( k = 0; k < NB_DIV; k++ ) - { - w_idx = ( nsub == 1 ) ? 0 : 2 * k; - if ( transform_type[ch][k] == TCX_10 ) - { - for ( i = start; i < stop; i++ ) - { - x[ch][k][i] *= w[ch][w_idx]; - } - } - else /* TCX_5 */ - { - start_tcx5 = stop_tcx5; - stop_tcx5 = ( stop + 1 ) / 2; - - for ( i = start_tcx5; i < stop_tcx5; i++ ) - { - x[ch][k][i] *= w[ch][w_idx]; - } - - if ( nsub2[k] == 2 ) - { - w_idx++; - } - - for ( i = start_tcx5; i < stop_tcx5; i++ ) - { - x[ch][k][i + ( frameSize >> 2 )] *= w[ch][w_idx]; - } - } - } - } - } - } - - return; -} -#endif - /*-------------------------------------------------------------------* - * apply_dmx_weights() + * apply_dmx_weights_fx() * * apply bandwise weighting for later dmx in case of mono output *--------------------------------------------------------------------*/ @@ -1090,7 +957,7 @@ static void apply_dmx_weights_fx( /*-------------------------------------------------------------------* - * run_min_stats() + * run_min_stats_fx() * * run the minimum statistics noise estimation algorithm * directly on the MDCT spectrum -- GitLab From eac7a44d8527041aa08839fc59ccc98b84bce7d3 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 19 Jul 2024 14:15:47 +0530 Subject: [PATCH 084/110] Bug fix for changes introduced through MR455 for SynthesisSTFT [x] Replaced extract_l with saturation functions to prevent wrap-around behavior --- lib_com/fd_cng_com_fx.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lib_com/fd_cng_com_fx.c b/lib_com/fd_cng_com_fx.c index dd84969a9..f439bbe28 100644 --- a/lib_com/fd_cng_com_fx.c +++ b/lib_com/fd_cng_com_fx.c @@ -2510,7 +2510,7 @@ void SynthesisSTFT( { FOR( i = 0; i < len; i++ ) { - olapBuffer[i] = extract_l( L_shr_r( fftBuffer[i], 31 - fftBufferExp ) ); + olapBuffer[i] = round_fx_sat( L_shl_sat( fftBuffer[i], fftBufferExp - 15 ) ); move16(); } } @@ -2518,11 +2518,9 @@ void SynthesisSTFT( { FOR( i = 0; i < len4; i++ ) { - // olapBuffer[i + 1 * len4] = add_sat( olapBuffer[i + 1 * len4], mult_r( round_fx( L_shl( fftBuffer[i + 1 * len4], fftBufferExp - 15 ) ), olapWin[i].v.im ) ); - olapBuffer[i + 1 * len4] = add_sat( olapBuffer[i + 1 * len4], mult_r( extract_l( L_shr_r( fftBuffer[i + 1 * len4], 31 - fftBufferExp ) ), olapWin[i].v.im ) ); + olapBuffer[i + 1 * len4] = add_sat( olapBuffer[i + 1 * len4], mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 1 * len4], fftBufferExp - 15 ) ), olapWin[i].v.im ) ); move16(); - // olapBuffer[i + 2 * len4] = add_sat( olapBuffer[i + 2 * len4], mult_r( round_fx( L_shl( fftBuffer[i + 2 * len4], fftBufferExp - 15 ) ), olapWin[len4 - 1 - i].v.re ) ); - olapBuffer[i + 2 * len4] = add_sat( olapBuffer[i + 2 * len4], mult_r( extract_l( L_shr_r( fftBuffer[i + 2 * len4], 31 - fftBufferExp ) ), olapWin[len4 - 1 - i].v.re ) ); + olapBuffer[i + 2 * len4] = add_sat( olapBuffer[i + 2 * len4], mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 2 * len4], fftBufferExp - 15 ) ), olapWin[len4 - 1 - i].v.re ) ); move16(); } FOR( i = len3; i < len; i++ ) @@ -2533,9 +2531,9 @@ void SynthesisSTFT( FOR( i = 0; i < len4; i++ ) { - olapBuffer[i + 5 * len4] = mult_r( extract_l( L_shr_r( fftBuffer[i + 5 * len4], 31 - fftBufferExp ) ), olapWin[i].v.re ); + olapBuffer[i + 5 * len4] = mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 5 * len4], fftBufferExp - 15 ) ), olapWin[i].v.re ); move16(); - olapBuffer[i + 6 * len4] = mult_r( extract_l( L_shr_r( fftBuffer[i + 6 * len4], 31 - fftBufferExp ) ), olapWin[len4 - 1 - i].v.im ); + olapBuffer[i + 6 * len4] = mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 6 * len4], fftBufferExp - 15 ) ), olapWin[len4 - 1 - i].v.im ); move16(); } -- GitLab From ff64feadad387e41950254f37781ae124538ef50 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 19 Jul 2024 14:42:27 +0530 Subject: [PATCH 085/110] stereo_dft_enc_synthesize_fx implementation --- lib_com/fft_fx.c | 18 + lib_com/ivas_prot_fx.h | 14 + lib_com/prot_fx.h | 12 + lib_enc/ivas_core_enc.c | 410 ++++++++++++++++++- lib_enc/ivas_cpe_enc.c | 748 +++++++++++++++++++++++++++++++++- lib_enc/ivas_stat_enc.h | 21 +- lib_enc/ivas_stereo_dft_enc.c | 478 +++++++++++++++++++++- lib_enc/swb_pre_proc.c | 548 +++++++++++++++++++++++++ 8 files changed, 2230 insertions(+), 19 deletions(-) diff --git a/lib_com/fft_fx.c b/lib_com/fft_fx.c index d7a1aa12f..024221ca6 100644 --- a/lib_com/fft_fx.c +++ b/lib_com/fft_fx.c @@ -7111,6 +7111,12 @@ void rfft_fx( s2 = -204; move16(); BREAK; + case 256: + s1 = 128; + move16(); + s2 = -128; + move16(); + BREAK; case 320: s1 = 102; move16(); @@ -7123,6 +7129,18 @@ void rfft_fx( s2 = -68; move16(); BREAK; + case 640: + s1 = 51; + move16(); + s2 = -51; + move16(); + BREAK; + case 960: + s1 = 34; + move16(); + s2 = -34; + move16(); + BREAK; default: s1 = -1; move16(); diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 39e8de6a0..c24ad3237 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -1123,6 +1123,20 @@ void stereo_dft_dec_fx( const Word16 num_md_sub_frames /* i : number of MD subframes */ ); +// ivas_stereo_dft_enc.c +#ifdef IVAS_FLOAT_FIXED +Word32 stereo_dft_enc_synthesize_fx( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ + // float *output, /* o : output synthesis */ + Word32 *output_fx, /* o : output synthesis Q16 */ + Word16 *output_start_index, + Word16 *output_end_index, + const Word16 chan, /* i : channel number */ + const Word32 input_Fs, /* i : input sampling rate */ + const Word32 output_sampling_rate, /* i : output sampling rate */ + const Word16 L_frame, /* i : frame length at internal Fs */ + Word16 *nrg_out_fx_e ); +#endif void ivas_ls_setup_conversion_fx( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 524cf7b73..b3e016846 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -63,6 +63,7 @@ #include "ivas_cnst.h" #include "stat_enc.h" #include "stat_dec.h" +#include "ivas_stat_enc.h" #include "ivas_stat_dec.h" #include "ivas_error.h" #include "ivas_error_utils.h" @@ -10068,4 +10069,15 @@ Word16 sr2fscale( const Word32 sr_core /* i : internal sampling rate */ ); +// pre_proc functions +/*full implementation pending*/ +void swb_pre_proc_ivas_fx( + Encoder_State *st, /* i/o: encoder state structure */ + float *new_swb_speech, /* o : original input signal at 32kHz */ + Word32 *new_swb_speech_fx, /* o : original input signal at 32kHz */ + float *shb_speech, /* o : SHB target signal (6-14kHz) at 16kHz */ + float realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : real buffer */ + float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : imag buffer */ + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ +); #endif diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index ebc6bd649..0d39208e7 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -40,6 +40,7 @@ #include "wmc_auto.h" #include #ifdef IVAS_FLOAT_FIXED +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif @@ -49,7 +50,7 @@ * * Principal IVAS core coder routine, where number of core channels is 1 or 2 *-------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED ivas_error ivas_core_enc( SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ @@ -90,6 +91,10 @@ ivas_error ivas_core_enc( float hb_speech[L_FRAME16k / 4]; float *new_swb_speech; float new_swb_speech_buffer[L_FRAME48k + STEREO_DFT_OVL_MAX]; +#ifdef IVAS_FLOAT_FIXED + Word32 *new_swb_speech_fx; + Word32 new_swb_speech_buffer_fx[L_FRAME48k + STEREO_DFT_OVL_MAX]; +#endif float bwe_exc_extended[CPE_CHANNELS][L_FRAME32k + NL_BUFF_OFFSET]; float voice_factors[CPE_CHANNELS][NB_SUBFR16k]; int16_t Voicing_flag[CPE_CHANNELS]; @@ -321,6 +326,408 @@ ivas_error ivas_core_enc( } + /*---------------------------------------------------------------------* + * Postprocessing, BWEs and Updates + *---------------------------------------------------------------------*/ + + for ( n = 0; n < n_CoreChannels; n++ ) + { + st = sts[n]; + + /*---------------------------------------------------------------------* + * Postprocessing for ACELP/HQ core switching + *---------------------------------------------------------------------*/ + + core_switching_post_enc( st, old_inp_12k8[n], old_inp_16k[n], A[n] ); + + /*---------------------------------------------------------------------* + * WB TBE encoding + * WB BWE encoding + *---------------------------------------------------------------------*/ + + if ( input_Fs >= 16000 && st->bwidth < SWB && st->hBWE_TD != NULL ) + { + /* Common pre-processing for WB TBE and WB BWE */ + wb_pre_proc( st, last_element_mode, new_inp_resamp16k[n], hb_speech ); + } + + if ( st->extl == WB_TBE ) + { + /* WB TBE encoder */ + wb_tbe_enc( st, hb_speech, bwe_exc_extended[n], voice_factors[n], pitch_buf[n] ); + } + else if ( st->extl == WB_BWE && n == 0 && st->element_mode != IVAS_CPE_MDCT ) + { + /* WB BWE encoder */ + wb_bwe_enc( st, new_inp_resamp16k[n] ); + } + + /*---------------------------------------------------------------------* + * SWB(FB) TBE encoding + * SWB(FB) BWE encoding + *---------------------------------------------------------------------*/ + + new_swb_speech = new_swb_speech_buffer + STEREO_DFT_OVL_MAX; +#ifdef IVAS_FLOAT_FIXED + new_swb_speech_fx = new_swb_speech_buffer_fx + STEREO_DFT_OVL_MAX; +#endif + + if ( !st->Opt_SC_VBR && input_Fs >= 32000 && st->hBWE_TD != NULL ) + { + /* Common pre-processing for SWB(FB) TBE and SWB(FB) BWE */ +#ifdef IVAS_FLOAT_FIXED + swb_pre_proc_ivas_fx( st, new_swb_speech, new_swb_speech_fx, shb_speech, realBuffer[n], imagBuffer[n], hCPE ); +#else + swb_pre_proc( st, new_swb_speech, shb_speech, realBuffer[n], imagBuffer[n], hCPE ); +#endif + } + else if ( input_Fs >= 32000 ) + { + if ( st->hBWE_TD != NULL ) + { + InitSWBencBufferStates( st->hBWE_TD, shb_speech ); + } + } + + /* SWB TBE encoder */ + if ( st->extl == SWB_TBE || st->extl == FB_TBE ) + { + if ( st->core_brate != FRAME_NO_DATA && st->core_brate != SID_2k40 ) + { + float fb_exc[L_FRAME16k]; + + swb_tbe_enc( st, hStereoICBWE, shb_speech, bwe_exc_extended[n], voice_factors[n], fb_exc, pitch_buf[n] ); + + if ( st->extl == FB_TBE ) + { + /* FB TBE encoder */ + fb_tbe_enc( st, st->input, fb_exc ); + } + } + } + else if ( st->extl == SWB_BWE || st->extl == FB_BWE ) + { + /* SWB(FB) BWE encoder */ + swb_bwe_enc( st, last_element_mode, old_inp_12k8[n], old_inp_16k[n], old_syn_12k8_16k[n], new_swb_speech, shb_speech ); + } + + /*---------------------------------------------------------------------* + * SWB DTX/CNG encoding + *---------------------------------------------------------------------*/ + + if ( st->hTdCngEnc != NULL && st->Opt_DTX_ON && ( input_frame >= L_FRAME32k || st->element_mode == IVAS_CPE_DFT ) ) + { + /* SHB DTX/CNG encoder */ + swb_CNG_enc( st, shb_speech, old_syn_12k8_16k[n] ); + } + + /*-------------------------------------------------------------------* + * Inter-channel BWE encoding + *-------------------------------------------------------------------*/ + + if ( n == 0 && input_Fs >= 32000 && hStereoICBWE != NULL ) + { + stereo_icBWE_preproc( hCPE, input_frame, new_swb_speech_buffer /*tmp buffer*/ ); + + stereo_icBWE_enc( hCPE, shb_speech, new_swb_speech_buffer, voice_factors[0] ); + } + + /*---------------------------------------------------------------------* + * Channel-aware mode - write signaling information into the bitstream + *---------------------------------------------------------------------*/ + + signaling_enc_rf( st ); + + /*---------------------------------------------------------------------* + * Common updates + *---------------------------------------------------------------------*/ + + if ( !MCT_flag ) /* for MCT do this later, otherwise there can be a problem because TCX quant happens later and might get the wrong last_core on a bit rate switch */ + { + updt_enc_common( st ); + } + } + + /*------------------------------------------------------------------* + * Write potentially unused bits in combined format coding + *-----------------------------------------------------------------*/ + + if ( hCPE != NULL && hCPE->element_mode == IVAS_CPE_DFT && hCPE->brate_surplus > 0 ) + { + while ( diff_nBits > 0 ) + { + n = min( diff_nBits, 16 ); + push_indice( sts[0]->hBstr, IND_UNUSED, 0, n ); + diff_nBits -= n; + } + } + + + pop_wmops(); + + return error; +} +#else +ivas_error ivas_core_enc( + SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + const int16_t n_CoreChannels, /* i : number of core channels to be coded */ + float old_inp_12k8[][L_INP_12k8], /* i : buffer of old input signal */ + float old_inp_16k[][L_INP], /* i : buffer of old input signal */ + float ener[], /* i : residual energy from Levinson-Durbin */ + float A[][NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes */ + float Aw[][NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquantized for subframes */ + float epsP[][M + 1], /* i : LP prediction errors */ + float lsp_new[][M], /* i : LSPs at the end of the frame */ + float lsp_mid[][M], /* i : LSPs in the middle of the frame */ + const int16_t vad_hover_flag[], /* i : VAD hanglover flag */ + int16_t attack_flag[], /* i : attack flag (GSC or TC) */ + float realBuffer[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer */ + float imagBuffer[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer */ + float old_wsp[][L_WSP], /* i : weighted input signal buffer */ + const int16_t loc_harm[], /* i : harmonicity flag */ + const float cor_map_sum[], /* i : speech/music clasif. parameter */ + const int16_t vad_flag_dtx[], /* i : HE-SAD flag with additional DTX HO */ + float enerBuffer[][CLDFB_NO_CHANNELS_MAX], /* i : energy buffer */ + float fft_buff[][2 * L_FFT], /* i : FFT buffer */ + const int16_t tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag */ + const int16_t ivas_format, /* i : IVAS format */ + const int16_t flag_16k_smc /* i : flag to indicate if the OL SMC is run at 16 kHz */ +) +{ + int16_t n, input_frame; + int16_t cpe_id, MCT_flag; + Encoder_State **sts, *st; + STEREO_ICBWE_ENC_HANDLE hStereoICBWE; + STEREO_TD_ENC_DATA_HANDLE hStereoTD; + float *inp[CPE_CHANNELS]; + float new_inp_resamp16k[CPE_CHANNELS][L_FRAME16k]; /* new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */ + float old_syn_12k8_16k[CPE_CHANNELS][L_FRAME16k]; /* ACELP core synthesis at 12.8kHz or 16kHz to be used by the SWB BWE */ + float shb_speech[L_FRAME16k]; + float hb_speech[L_FRAME16k / 4]; + float *new_swb_speech; + float new_swb_speech_buffer[L_FRAME48k + STEREO_DFT_OVL_MAX]; + float bwe_exc_extended[CPE_CHANNELS][L_FRAME32k + NL_BUFF_OFFSET]; + float voice_factors[CPE_CHANNELS][NB_SUBFR16k]; + int16_t Voicing_flag[CPE_CHANNELS]; + float pitch_buf[CPE_CHANNELS][NB_SUBFR16k]; + int16_t unbits[CPE_CHANNELS]; + float tdm_lspQ_PCh[M], tdm_lsfQ_PCh[M]; + int16_t last_element_mode, tdm_Pitch_reuse_flag; + int32_t element_brate, last_element_brate, input_Fs; + int16_t diff_nBits; + ivas_error error; + int16_t max_num_indices_BWE; + + push_wmops( "ivas_core_enc" ); + + error = IVAS_ERR_OK; + + /*------------------------------------------------------------------* + * General initialization + *-----------------------------------------------------------------*/ + + if ( hSCE != NULL ) + { + cpe_id = -1; + MCT_flag = 0; + sts = hSCE->hCoreCoder; + hStereoTD = NULL; + hStereoICBWE = NULL; + element_brate = hSCE->element_brate; + last_element_brate = hSCE->last_element_brate; + last_element_mode = IVAS_SCE; + tdm_Pitch_reuse_flag = -1; + } + else + { + cpe_id = hCPE->cpe_id; + MCT_flag = 0; + if ( hMCT != NULL ) + { + MCT_flag = 1; + } + sts = hCPE->hCoreCoder; + hStereoICBWE = hCPE->hStereoICBWE; + element_brate = hCPE->element_brate; + last_element_brate = hCPE->last_element_brate; + last_element_mode = hCPE->last_element_mode; + + if ( hCPE->hStereoTD != NULL ) + { + hStereoTD = hCPE->hStereoTD; + tdm_Pitch_reuse_flag = hCPE->hStereoTD->tdm_Pitch_reuse_flag; + } + else + { + hStereoTD = NULL; + tdm_Pitch_reuse_flag = -1; + } + } + + input_Fs = sts[0]->input_Fs; + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + + set_f( new_swb_speech_buffer, 0, L_FRAME48k + STEREO_DFT_OVL_MAX ); + + for ( n = 0; n < n_CoreChannels; n++ ) + { + st = sts[n]; + + /*------------------------------------------------------------------* + * Initializiation per core-coder channel + *-----------------------------------------------------------------*/ + + + st->extl = -1; + unbits[n] = 0; + + st->element_brate = element_brate; + + /*---------------------------------------------------------------------* + * Pre-processing, incl. Decision matrix + *---------------------------------------------------------------------*/ + + if ( ( error = pre_proc_ivas( st, last_element_mode, element_brate, ivas_format == SBA_FORMAT ? last_element_brate : element_brate, input_frame, old_inp_12k8[n], old_inp_16k[n], &inp[n], &ener[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], new_inp_resamp16k[n], &Voicing_flag[n], old_wsp[n], loc_harm[n], cor_map_sum[n], vad_flag_dtx[n], enerBuffer[n], fft_buff[n], MCT_flag, vad_hover_flag[n], flag_16k_smc ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st->element_mode == IVAS_CPE_MDCT || st->element_mode == IVAS_SCE ) + { + st->enablePlcWaveadjust = 0; + } + } + + /*------------------------------------------------------------------* + * Sanity check in combined format coding + *-----------------------------------------------------------------*/ + + diff_nBits = 0; + if ( hCPE != NULL && hCPE->element_mode == IVAS_CPE_DFT && hCPE->brate_surplus > 0 ) + { + ivas_combined_format_brate_sanity( hCPE->element_brate, sts[0]->core, sts[0]->total_brate, &( sts[0]->core_brate ), &( sts[0]->inactive_coder_type_flag ), &diff_nBits ); + } + + /*---------------------------------------------------------------------* + * Core Encoding + *---------------------------------------------------------------------*/ + + for ( n = 0; n < n_CoreChannels; n++ ) + { + st = sts[n]; + + /* update pointer to the buffer of indices of the second channel */ + if ( n == 1 && st->element_mode == IVAS_CPE_TD ) + { + /* adjust the pointer to the buffer of indices of the secondary channel (make space for BWE indices) */ + max_num_indices_BWE = get_BWE_max_num_indices( sts[0]->extl_brate ); + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot + max_num_indices_BWE; + + /* write TD stereo spatial parameters */ + move_indices( hStereoTD->tdm_hBstr_tmp.ind_list, st->hBstr->ind_list, hStereoTD->tdm_hBstr_tmp.nb_ind_tot ); + st->hBstr->nb_ind_tot += hStereoTD->tdm_hBstr_tmp.nb_ind_tot; + st->hBstr->nb_bits_tot += hStereoTD->tdm_hBstr_tmp.nb_bits_tot; + + reset_indices_enc( &hStereoTD->tdm_hBstr_tmp, MAX_IND_TDM_TMP ); + } + + /*---------------------------------------------------------------------* + * Write signaling info into the bitstream + *---------------------------------------------------------------------*/ + + if ( !MCT_flag || ( MCT_flag && cpe_id == 0 ) ) + { + ivas_signaling_enc( st, MCT_flag, element_brate, tdm_SM_or_LRTD_Pri, tdm_Pitch_reuse_flag ); + } + + /*---------------------------------------------------------------------* + * Preprocessing (preparing) for ACELP/HQ core switching + *---------------------------------------------------------------------*/ + + core_switching_pre_enc( st, old_inp_12k8[n], old_inp_16k[n], sts[0]->active_cnt, last_element_mode ); + + /*---------------------------------------------------------------------* + * ACELP core encoding + * TCX core encoding + * HQ core encoding + *---------------------------------------------------------------------*/ + + if ( st->core == ACELP_CORE ) + { + /* ACELP core encoder */ + if ( ( error = acelp_core_enc( st, inp[n], ener[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], vad_hover_flag[0], attack_flag[n], bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], pitch_buf[n], &unbits[n], hStereoTD, tdm_lsfQ_PCh ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( st->core == TCX_20_CORE || st->core == TCX_10_CORE ) && st->element_mode != IVAS_CPE_MDCT ) + { + /* TCX core encoder */ + stereo_tcx_core_enc( st, old_inp_12k8[n] + L_INP_MEM, old_inp_16k[n] + L_INP_MEM, Aw[n], lsp_new[n], lsp_mid[n], pitch_buf[n], last_element_mode, vad_hover_flag[0] ); + } + + if ( st->core == HQ_CORE ) + { + /* HQ core encoder */ + hq_core_enc( st, st->input, input_frame, NORMAL_HQ_CORE, Voicing_flag[n], vad_hover_flag[0] ); + } + + /*---------------------------------------------------------------------* + * TD stereo updates + *---------------------------------------------------------------------*/ + + if ( st->element_mode == IVAS_CPE_TD && n == 0 ) + { + td_stereo_param_updt( st->lsp_old, st->lsf_old, pitch_buf[0], tdm_lspQ_PCh, tdm_lsfQ_PCh, hStereoTD->tdm_Pri_pitch_buf, st->flag_ACELP16k, hStereoTD->tdm_use_IAWB_Ave_lpc ); + } + } + + + /*---------------------------------------------------------------------* + * MDCT stereo: joint TCX Core Encoding + *---------------------------------------------------------------------*/ + + if ( sts[0]->element_mode == IVAS_CPE_MDCT ) + { + if ( sts[0]->core_brate > SID_2k40 && sts[1]->core_brate > SID_2k40 ) + { + if ( MCT_flag ) + { + ivas_mdct_core_whitening_enc( hCPE, old_inp_16k, old_wsp, pitch_buf, hMCT->p_mdst_spectrum_long[cpe_id], hMCT->tnsBits[cpe_id], hMCT->p_orig_spectrum_long[cpe_id], + hMCT->tnsSize[cpe_id], hMCT->p_param[cpe_id], hMCT->hBstr, 1, hMCT->nchan_out_woLFE ); + } + else + { + stereo_mdct_core_enc( hCPE, old_inp_16k, old_wsp, pitch_buf ); + } + } + else if ( sts[0]->core_brate == SID_2k40 && sts[1]->core_brate == SID_2k40 ) + { + /* synch CNG configs between channels */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + st = sts[n]; + if ( ( st->hFdCngEnc->hFdCngCom->frameSize != st->L_frame ) || ( st->hFdCngEnc->hFdCngCom->CngBandwidth != st->bwidth ) ) + { + configureFdCngEnc( st->hFdCngEnc, max( st->bwidth, WB ), st->L_frame == L_FRAME16k ? ACELP_16k40 : ACELP_9k60 ); + } + } + + if ( sts[0]->cng_sba_flag ) + { + FdCngEncodeDiracMDCTStereoSID( hCPE ); + } + else + { + FdCngEncodeMDCTStereoSID( hCPE ); + } + } + } + + /*---------------------------------------------------------------------* * Postprocessing, BWEs and Updates *---------------------------------------------------------------------*/ @@ -455,3 +862,4 @@ ivas_error ivas_core_enc( return error; } +#endif \ No newline at end of file diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index da80d795c..9b8b4bfc5 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -59,7 +59,7 @@ static void stereo_mode_combined_format_enc( const Encoder_Struct *st_ivas, CPE_ * * Channel Pair Element (CPE) encoding routine *-------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED ivas_error ivas_cpe_enc( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ const int16_t cpe_id, /* i : CPE # identifier */ @@ -72,8 +72,14 @@ ivas_error ivas_cpe_enc( CPE_ENC_HANDLE hCPE; Encoder_State **sts; int16_t n, n_CoreChannels; - float old_inp_12k8[CPE_CHANNELS][L_INP_12k8]; /* buffer of input signal @ 12k8 */ - float old_inp_16k[CPE_CHANNELS][L_INP]; /* buffer of input signal @ 16kHz */ + float old_inp_12k8[CPE_CHANNELS][L_INP_12k8]; /* buffer of input signal @ 12k8 */ +#ifdef IVAS_FLOAT_FIXED + Word32 old_inp_12k8_fx[CPE_CHANNELS][L_INP_12k8]; /* buffer of input signal @ 12k8 */ +#endif + float old_inp_16k[CPE_CHANNELS][L_INP]; /* buffer of input signal @ 16kHz */ +#ifdef IVAS_FLOAT_FIXED + Word32 old_inp_16k_fx[CPE_CHANNELS][L_INP]; /* buffer of input signal @ 16kHz */ +#endif float ener[CPE_CHANNELS]; /* residual energy from Levinson-Durbin */ float relE[CPE_CHANNELS]; /* frame relative energy */ float A[CPE_CHANNELS][NB_SUBFR16k * ( M + 1 )]; /* A(z) unquantized for subframes */ @@ -455,6 +461,83 @@ ivas_error ivas_cpe_enc( internal_Fs = getTcxonly_ivas( IVAS_CPE_MDCT, sts[0]->bits_frame_nominal * FRAMES_PER_SEC, 0, sts[0]->is_ism_format ) == 0 ? INT_FS_16k : max( INT_FS_16k, sts[0]->sr_core ); /* iDFT at input sampling rate */ +#ifdef IVAS_FLOAT_FIXED + /*flt2fix*/ + f2me_buf( hCPE->hStereoDft->DFT[0], hCPE->hStereoDft->DFT_fx[0], &hCPE->hStereoDft->DFT_fx_e[0], STEREO_DFT_N_MAX_ENC ); + f2me_buf( hCPE->hStereoDft->DFT[1], hCPE->hStereoDft->DFT_fx[1], &hCPE->hStereoDft->DFT_fx_e[1], STEREO_DFT_N_MAX_ENC ); + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] ) + { + floatToFixed_arr( sts[1]->old_inp_12k8, sts[1]->old_inp_12k8_fx, 0, L_INP_MEM ); + } + f2me( hCPE->hStereoDft->icbweRefEner, &hCPE->hStereoDft->icbweRefEner_fx, &hCPE->hStereoDft->icbweRefEner_fx_e ); + f2me( hCPE->hStereoDft->lbEner, &hCPE->hStereoDft->lbEner_fx, &hCPE->hStereoDft->lbEner_fx_e ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_res_8k, hCPE->hStereoDft->output_mem_res_8k_fx, 16, STEREO_DFT_OVL_8k ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx, hCPE->hStereoDft->output_mem_dmx_fx, 16, STEREO_DFT_OVL_MAX ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_12k8, hCPE->hStereoDft->output_mem_dmx_12k8_fx, 16, STEREO_DFT_OVL_12k8 ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_16k, hCPE->hStereoDft->output_mem_dmx_16k_fx, 16, STEREO_DFT_OVL_16k ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_16k_shb, hCPE->hStereoDft->output_mem_dmx_16k_shb_fx, 16, STEREO_DFT_OVL_16k ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_32k, hCPE->hStereoDft->output_mem_dmx_32k_fx, 16, STEREO_DFT_OVL_32k ); + /*flt2fix end*/ + + // stereo_dft_enc_synthesize( hCPE->hStereoDft, sts[0]->input, 0, input_Fs, input_Fs, 0 ); + Word16 out_start_ind, out_end_ind; + Word16 out_12k8_start_ind[CPE_CHANNELS], out_12k8_end_ind[CPE_CHANNELS]; + Word16 out_16k_start_ind = 0, out_16k_end_ind = 0; + move16(); + move16(); + stereo_dft_enc_synthesize_fx( hCPE->hStereoDft, sts[0]->input32_fx, &out_start_ind, &out_end_ind, 0, input_Fs, input_Fs, 0, NULL ); + + /* iDFT & resampling to 12.8kHz internal sampling rate */ + // stereo_dft_enc_synthesize( hCPE->hStereoDft, old_inp_12k8[0] + L_INP_MEM, 0, input_Fs, INT_FS_12k8, 0 ); + stereo_dft_enc_synthesize_fx( hCPE->hStereoDft, old_inp_12k8_fx[0] + L_INP_MEM, &out_12k8_start_ind[0], &out_12k8_end_ind[0], 0, input_Fs, INT_FS_12k8, 0, NULL ); + + /* iDFT & resampling to 16kHz internal sampling rate for M channel */ + IF( EQ_32( input_Fs, internal_Fs ) ) + { + // mvr2r( sts[0]->input - STEREO_DFT_OVL_16k, old_inp_16k[0] + L_INP_MEM - STEREO_DFT_OVL_16k, input_frame + STEREO_DFT_OVL_16k ); + Copy32( sts[0]->input32_fx - STEREO_DFT_OVL_16k, old_inp_16k_fx[0] + L_INP_MEM - STEREO_DFT_OVL_16k, input_frame + STEREO_DFT_OVL_16k ); + out_16k_start_ind = -STEREO_DFT_OVL_16k; + out_16k_end_ind = out_16k_start_ind + input_frame + STEREO_DFT_OVL_16k; + } + ELSE + { + // stereo_dft_enc_synthesize( hCPE->hStereoDft, old_inp_16k[0] + L_INP_MEM, 0, input_Fs, internal_Fs, 0 ); + stereo_dft_enc_synthesize_fx( hCPE->hStereoDft, old_inp_16k_fx[0] + L_INP_MEM, &out_16k_start_ind, &out_16k_end_ind, 0, input_Fs, internal_Fs, 0, NULL ); + } + + /* DFT Stereo: iDFT of residual signal at 8kHz sampling rate */ + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] ) + { + // mvr2r( sts[1]->old_inp_12k8, old_inp_12k8[1], L_INP_MEM ); + Copy_Scale_sig_16_32_no_sat( sts[1]->old_inp_12k8_fx, old_inp_12k8_fx[1], L_INP_MEM, 16 - 0 ); + // stereo_dft_enc_synthesize( hCPE->hStereoDft, old_inp_12k8[1] + L_INP_MEM, 1, input_Fs, 8000, 0 ); + stereo_dft_enc_synthesize_fx( hCPE->hStereoDft, old_inp_12k8_fx[1] + L_INP_MEM, &out_12k8_start_ind[1], &out_12k8_end_ind[1], 1, input_Fs, 8000, 0, NULL ); + + /* update old input signal buffer */ + // mvr2r( old_inp_12k8[1] + L_FRAME8k, sts[1]->old_inp_12k8, L_INP_MEM ); + Copy_Scale_sig_32_16( old_inp_12k8_fx[1] + L_FRAME8k, sts[1]->old_inp_12k8_fx, L_INP_MEM, 0 - 16 ); + } + + /*fix2flt*/ + hCPE->hStereoDft->icbweRefEner = me2f( hCPE->hStereoDft->icbweRefEner_fx, hCPE->hStereoDft->icbweRefEner_fx_e ); + hCPE->hStereoDft->lbEner = me2f( hCPE->hStereoDft->lbEner_fx, hCPE->hStereoDft->lbEner_fx_e ); + fixedToFloat_arrL( sts[0]->input32_fx + out_start_ind, sts[0]->input + out_start_ind, 16, out_end_ind - out_start_ind ); + fixedToFloat_arrL( old_inp_12k8_fx[0] + L_INP_MEM + out_12k8_start_ind[0], old_inp_12k8[0] + L_INP_MEM + out_12k8_start_ind[0], 16, out_12k8_end_ind[0] - out_12k8_start_ind[0] ); + fixedToFloat_arrL( old_inp_16k_fx[0] + L_INP_MEM + out_16k_start_ind, old_inp_16k[0] + L_INP_MEM + out_16k_start_ind, 16, out_16k_end_ind - out_16k_start_ind ); + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] ) + { + fixedToFloat_arr( sts[1]->old_inp_12k8_fx, sts[1]->old_inp_12k8, 0, L_INP_MEM ); + fixedToFloat_arrL( old_inp_12k8_fx[1] + L_INP_MEM + out_12k8_start_ind[1], old_inp_12k8[1] + L_INP_MEM + out_12k8_start_ind[1], 16, out_12k8_end_ind[1] - out_12k8_start_ind[1] ); + } + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_res_8k_fx, hCPE->hStereoDft->output_mem_res_8k, 16, STEREO_DFT_OVL_8k ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_fx, hCPE->hStereoDft->output_mem_dmx, 16, STEREO_DFT_OVL_MAX ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_12k8_fx, hCPE->hStereoDft->output_mem_dmx_12k8, 16, STEREO_DFT_OVL_12k8 ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_16k_fx, hCPE->hStereoDft->output_mem_dmx_16k, 16, STEREO_DFT_OVL_16k ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_16k_shb_fx, hCPE->hStereoDft->output_mem_dmx_16k_shb, 16, STEREO_DFT_OVL_16k ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_32k_fx, hCPE->hStereoDft->output_mem_dmx_32k, 16, STEREO_DFT_OVL_32k ); + /*fix2flt end*/ +#else stereo_dft_enc_synthesize( hCPE->hStereoDft, sts[0]->input, 0, input_Fs, input_Fs, 0 ); /* iDFT & resampling to 12.8kHz internal sampling rate */ @@ -479,7 +562,7 @@ ivas_error ivas_cpe_enc( /* update old input signal buffer */ mvr2r( old_inp_12k8[1] + L_FRAME8k, sts[1]->old_inp_12k8, L_INP_MEM ); } - +#endif /* no iDFT at input sampling rate for Side channel -> reset the buffer */ set_zero( sts[1]->input, input_frame ); } @@ -783,7 +866,664 @@ ivas_error ivas_cpe_enc( pop_wmops(); return error; } +#else +ivas_error ivas_cpe_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + const int16_t cpe_id, /* i : CPE # identifier */ + float data_f_ch0[], /* i : input signal for channel 0 */ + float data_f_ch1[], /* i : input signal for channel 1 */ + const int16_t input_frame, /* i : input frame length per channel */ + const int16_t nb_bits_metadata /* i : number of metadata bits */ +) +{ + CPE_ENC_HANDLE hCPE; + Encoder_State **sts; + int16_t n, n_CoreChannels; + float old_inp_12k8[CPE_CHANNELS][L_INP_12k8]; /* buffer of input signal @ 12k8 */ + float old_inp_16k[CPE_CHANNELS][L_INP]; /* buffer of input signal @ 16kHz */ + float ener[CPE_CHANNELS]; /* residual energy from Levinson-Durbin */ + float relE[CPE_CHANNELS]; /* frame relative energy */ + float A[CPE_CHANNELS][NB_SUBFR16k * ( M + 1 )]; /* A(z) unquantized for subframes */ + float Aw[CPE_CHANNELS][NB_SUBFR16k * ( M + 1 )]; /* weighted A(z) unquantized for subframes */ + float epsP[CPE_CHANNELS][M + 1]; /* LP prediction errors */ + float lsp_new[CPE_CHANNELS][M]; /* LSPs at the end of the frame */ + float lsp_mid[CPE_CHANNELS][M]; /* ISPs in the middle of the frame */ + int16_t vad_hover_flag[CPE_CHANNELS]; /* VAD hangover flag */ + int16_t attack_flag[CPE_CHANNELS]; /* attack flag (GSC or TC) */ + float realBuffer[CPE_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; /* real buffer */ + float imagBuffer[CPE_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; /* imag buffer */ + float old_wsp[CPE_CHANNELS][L_WSP]; /* old weighted input signal */ + float pitch_fr[CPE_CHANNELS][NB_SUBFR]; /* fractional pitch values */ + float voicing_fr[CPE_CHANNELS][NB_SUBFR]; /* fractional pitch gains */ + int16_t loc_harm[CPE_CHANNELS]; /* harmonicity flag */ + float cor_map_sum[CPE_CHANNELS]; /* speech/music clasif. parameter */ + int16_t vad_flag_dtx[CPE_CHANNELS]; /* HE-SAD flag with additional DTX HO */ + float enerBuffer[CPE_CHANNELS][CLDFB_NO_CHANNELS_MAX]; /* energy buffer */ + float currFlatness[CPE_CHANNELS]; /* flatness parameter */ + float fft_buff[CPE_CHANNELS][2 * L_FFT]; /* FFT buffer */ + int16_t tdm_ratio_idx, tdm_ratio_idx_SM; /* temp. TD stereo parameters */ + int16_t tdm_SM_or_LRTD_Pri; /* temp. TD stereo parameters */ + float tdm_last_ratio; /* temp. TD stereo parameters */ + int16_t nb_bits; /* number of DFT stereo side bits */ + float fr_bands[CPE_CHANNELS][2 * NB_BANDS]; /* energy in frequency bands */ + float Etot_LR[CPE_CHANNELS]; /* total energy */ + float lf_E[CPE_CHANNELS][2 * VOIC_BINS]; /* per bin spectrum energy in lf */ + int16_t localVAD_HE_SAD[CPE_CHANNELS]; /* HE-SAD flag without hangover, LR channels */ + float band_energies_LR[2 * NB_BANDS]; /* energy in critical bands without minimum noise floor E_MIN */ + float orig_input[CPE_CHANNELS][L_FRAME48k]; + float Etot_last[CPE_CHANNELS]; + int32_t tmp, input_Fs; + int16_t max_bwidth, ivas_format; + ENCODER_CONFIG_HANDLE hEncoderConfig; + int32_t ivas_total_brate; + ivas_error error; + int32_t cpe_brate; + int32_t element_brate_ref; + int16_t last_bits_frame_nominal; /* last_bits_frame_nominal for M or PCh channel */ + + error = IVAS_ERR_OK; + push_wmops( "ivas_cpe_enc" ); + + hCPE = st_ivas->hCPE[cpe_id]; + sts = hCPE->hCoreCoder; + hEncoderConfig = st_ivas->hEncoderConfig; + max_bwidth = hEncoderConfig->max_bwidth; + ivas_format = hEncoderConfig->ivas_format; + input_Fs = hEncoderConfig->input_Fs; + ivas_total_brate = hEncoderConfig->ivas_total_brate; + element_brate_ref = hCPE->element_brate; + last_bits_frame_nominal = sts[0]->bits_frame_nominal; + + /*------------------------------------------------------------------* + * Initialization - general + *-----------------------------------------------------------------*/ + + tdm_SM_or_LRTD_Pri = 0; + tdm_ratio_idx = -1; + tdm_ratio_idx_SM = -1; + tdm_last_ratio = 0; + + + /*------------------------------------------------------------------* + * CPE initialization - core coder + *-----------------------------------------------------------------*/ + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + sts[n]->idchan = n; + sts[n]->core = -1; + sts[n]->core_brate = -1; /* updated in dtx() */ + sts[n]->max_bwidth = max_bwidth; + if ( st_ivas->hMCT == NULL ) /*already updated before CPE call*/ + { + sts[n]->input_bwidth = sts[n]->last_input_bwidth; /* updated in BWD */ + sts[n]->bwidth = sts[n]->last_bwidth; /* updated in BWD */ + } + sts[n]->rate_switching_reset = 0; + } + mvr2r( data_f_ch0, sts[0]->input, input_frame ); + if ( data_f_ch1 != NULL ) /*this may happen for cases with odd number of channels*/ + { + mvr2r( data_f_ch1, sts[1]->input, input_frame ); + } + + /*----------------------------------------------------------------* + * Stereo technology selection + * Front-VAD on input L and R channels + *----------------------------------------------------------------*/ + + if ( sts[0]->ini_frame > 0 && st_ivas->hMCT == NULL ) + { + hCPE->element_mode = select_stereo_mode( hCPE, ivas_format ); + } + + stereo_mode_combined_format_enc( st_ivas, hCPE ); + + if ( ( error = front_vad( hCPE, NULL, hEncoderConfig, &hCPE->hFrontVad[0], st_ivas->hMCT != NULL, input_frame, vad_flag_dtx, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, vad_hover_flag, band_energies_LR, NULL, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + + sts[0]->element_mode = hCPE->element_mode; + sts[1]->element_mode = hCPE->element_mode; + + n_CoreChannels = 2; + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + n_CoreChannels = 1; /* in DFT stereo, only M channel is coded */ + + sts[1]->vad_flag = 0; + } + + /*----------------------------------------------------------------* + * dynamically allocate data structures depending on the actual stereo mode + *----------------------------------------------------------------*/ + + if ( ( error = stereo_memory_enc( hCPE, input_Fs, max_bwidth, &tdm_last_ratio, ivas_format, st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) + { + return error; + } + + + /*----------------------------------------------------------------* + * Set TD stereo parameters + *----------------------------------------------------------------*/ + + if ( ( error = stereo_set_tdm( hCPE, input_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*----------------------------------------------------------------* + * Resets/updates in case of stereo switching + *----------------------------------------------------------------*/ + + stereo_switching_enc( hCPE, sts[0]->old_input_signal, input_frame ); + + /*----------------------------------------------------------------* + * Temporal inter-channel alignment, stereo adjustment + *----------------------------------------------------------------*/ + + stereo_tca_enc( hCPE, input_frame ); + + /*----------------------------------------------------------------* + * Input signal buffering - needed in IC-BWE and TD ITD in MDCT stereo + *----------------------------------------------------------------*/ + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + mvr2r( sts[n]->input, orig_input[n], input_frame ); + + if ( hCPE->hStereoICBWE != NULL ) + { + hCPE->hStereoICBWE->dataChan[n] = &orig_input[n][0]; + } + } + + /*---------------------------------------------------------------* + * Time Domain Transient Detector + *---------------------------------------------------------------*/ + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if ( sts[n]->hTranDet == NULL ) + { + currFlatness[n] = 0; + continue; + } + + if ( !( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) ) + { + RunTransientDetection( sts[n]->input, input_frame, sts[n]->hTranDet ); + } + currFlatness[n] = GetTCXAvgTemporalFlatnessMeasure( sts[n]->hTranDet, NSUBBLOCKS, 0 ); + } + + /* Synchonize detection for downmix-based stereo */ + if ( hCPE->element_mode == IVAS_CPE_DFT || hCPE->element_mode == IVAS_CPE_TD ) + { + set_transient_stereo( hCPE, currFlatness ); + } + + /*----------------------------------------------------------------* + * Configuration of stereo encoder + *----------------------------------------------------------------*/ + + for ( n = 0; n < n_CoreChannels; n++ ) + { + /* Force to MODE1 in IVAS */ + sts[n]->codec_mode = MODE1; + + sts[n]->element_mode = hCPE->element_mode; + } + + + if ( hCPE->element_mode != IVAS_CPE_MDCT && ( hCPE->element_brate != hCPE->last_element_brate || hCPE->last_element_mode != hCPE->element_mode || sts[0]->ini_frame == 0 || + ( ivas_total_brate != st_ivas->hEncoderConfig->last_ivas_total_brate ) || sts[0]->last_core_brate <= SID_2k40 ) ) /* If the last frame was SID or NO_DATA, we need to run stereo_dft_config here since VAD decision is not known yet */ + { + if ( st_ivas->hQMetaData != NULL ) + { + if ( ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode != ISM_MODE_NONE ) + { + stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, (int32_t) ( 0.70f * st_ivas->hQMetaData->bits_frame_nominal * FRAMES_PER_SEC ), &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + else + { + stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, st_ivas->hQMetaData->bits_frame_nominal * FRAMES_PER_SEC, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + } + else + { + /* note; "bits_frame_nominal" needed in TD stereo as well */ + stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + } + + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + if ( hCPE->hStereoTD->tdm_LRTD_flag ) + { + sts[0]->bits_frame_nominal = (int16_t) ( ( hCPE->element_brate >> 1 ) / FRAMES_PER_SEC ); + sts[1]->bits_frame_nominal = (int16_t) ( ( hCPE->element_brate >> 1 ) / FRAMES_PER_SEC ); + } + else + { + stereo_dft_config( NULL, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + } + + if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + /* compute bit-rate surplus per channel in combined format coding */ + int32_t brate_surplus[CPE_CHANNELS]; + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + brate_surplus[0] = ( ( hCPE->brate_surplus / FRAMES_PER_SEC ) >> 1 ) * FRAMES_PER_SEC; + brate_surplus[1] = hCPE->brate_surplus - brate_surplus[0]; + } + + /* this is just for initialization, the true values of "total_brate" and "bits_frame_channel" are set later */ + for ( n = 0; n < n_CoreChannels; n++ ) + { + if ( st_ivas->hMCT ) + { + int16_t lfe_bits; + lfe_bits = ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ? st_ivas->hLFE->lfe_bits : 0 ); + sts[n]->total_brate = hCPE->element_brate; + sts[n]->bits_frame_nominal = (int16_t) ( hCPE->element_brate / FRAMES_PER_SEC ); + sts[n]->bits_frame_channel = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC - lfe_bits - nb_bits_metadata ) / st_ivas->hMCT->nchan_out_woLFE ); + } + else + { + sts[n]->bits_frame_nominal = (int16_t) ( hCPE->element_brate / FRAMES_PER_SEC ); + sts[n]->bits_frame_channel = (int16_t) ( ( hCPE->element_brate / FRAMES_PER_SEC ) / n_CoreChannels ); + sts[n]->total_brate = hCPE->element_brate / n_CoreChannels; + + /* subtract bit-rate for combined format coding */ + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + sts[n]->bits_frame_channel += (int16_t) ( brate_surplus[n] / FRAMES_PER_SEC ); + sts[n]->total_brate += brate_surplus[n]; + } + } + } + + /* reconfiguration in case of bitrate switching */ + if ( hCPE->element_brate != hCPE->last_element_brate && st_ivas->hMCT == NULL ) + { + initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, max_bwidth, 0, NULL, 0 ); + hCPE->hStereoMdct->isSBAStereoMode = ( ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) && ( st_ivas->nchan_transport == 2 ) ); + } + } + + /*----------------------------------------------------------------* + * Stereo processing + * Stereo down-mix + *----------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + stereo_dft_hybrid_ITD_flag( hCPE->hStereoDft->hConfig, input_Fs, hCPE->hStereoDft->hItd->hybrid_itd_max ); + + /* Time Domain ITD compensation using extrapolation */ + stereo_td_itd( hCPE->hStereoDft->hItd, hCPE->hStereoDft->input_mem_itd, hCPE->hStereoDft->hConfig->hybrid_itd_flag, hCPE->hStereoDft->dft_ovl, sts, input_frame, hCPE->input_mem ); + + /* DFT on right and left input channels */ + stereo_dft_enc_analyze( sts, CPE_CHANNELS, input_frame, hCPE->hStereoDft, NULL, hCPE->hStereoDft->DFT, hCPE->input_mem ); + + sts[0]->total_brate = ( sts[0]->bits_frame_nominal + 10 ) * FRAMES_PER_SEC; /* add small overhead; st[0]->total_brate used in coder_type_modif() */ + /* Update DFT Stereo memories */ + stereo_dft_enc_update( hCPE->hStereoDft, sts[0]->max_bwidth ); + + /* DFT stereo processing */ + stereo_dft_enc_process( hCPE, vad_flag_dtx, vad_hover_flag, input_frame ); + } + else if ( hCPE->element_mode == IVAS_CPE_TD ) + { + /* Determine the energy ratio between the 2 channels */ + tdm_ratio_idx = stereo_tdm_ener_analysis( + ivas_format, + hCPE, input_frame, &tdm_SM_or_LRTD_Pri, &tdm_ratio_idx_SM ); + + /* Compute the downmix signal based on the ratio index */ + stereo_tdm_downmix( hCPE->hStereoTD, sts[0]->input, sts[1]->input, input_frame, tdm_ratio_idx, ( ( hCPE->hStereoTD->tdm_LRTD_flag == 0 ) ? tdm_SM_or_LRTD_Pri : 0 ), tdm_ratio_idx_SM ); + + /* signal the bitrate for BW selection in the SCh */ + sts[0]->bits_frame_channel = 0; + sts[1]->bits_frame_channel = (int16_t) ( hCPE->element_brate / FRAMES_PER_SEC ); + sts[1]->bits_frame_channel += (int16_t) ( hCPE->brate_surplus / FRAMES_PER_SEC ); + if ( st_ivas->hQMetaData != NULL ) + { + sts[1]->bits_frame_channel -= st_ivas->hQMetaData->metadata_max_bits; + } + + Etot_last[0] = sts[0]->hNoiseEst->Etot_last; + Etot_last[1] = sts[1]->hNoiseEst->Etot_last; + } + else if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + stereo_td_itd_mdct_stereo( hCPE, vad_flag_dtx, vad_hover_flag, input_frame ); + } + + /*----------------------------------------------------------------* + * DFT stereo: iDFT and resampling on both channels + *----------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + int32_t internal_Fs; + + internal_Fs = getTcxonly_ivas( IVAS_CPE_MDCT, sts[0]->bits_frame_nominal * FRAMES_PER_SEC, 0, sts[0]->is_ism_format ) == 0 ? INT_FS_16k : max( INT_FS_16k, sts[0]->sr_core ); + + /* iDFT at input sampling rate */ + stereo_dft_enc_synthesize( hCPE->hStereoDft, sts[0]->input, 0, input_Fs, input_Fs, 0 ); + + /* iDFT & resampling to 12.8kHz internal sampling rate */ + stereo_dft_enc_synthesize( hCPE->hStereoDft, old_inp_12k8[0] + L_INP_MEM, 0, input_Fs, INT_FS_12k8, 0 ); + + /* iDFT & resampling to 16kHz internal sampling rate for M channel */ + if ( input_Fs == internal_Fs ) + { + mvr2r( sts[0]->input - STEREO_DFT_OVL_16k, old_inp_16k[0] + L_INP_MEM - STEREO_DFT_OVL_16k, input_frame + STEREO_DFT_OVL_16k ); + } + else + { + stereo_dft_enc_synthesize( hCPE->hStereoDft, old_inp_16k[0] + L_INP_MEM, 0, input_Fs, internal_Fs, 0 ); + } + + /* DFT Stereo: iDFT of residual signal at 8kHz sampling rate */ + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] ) + { + mvr2r( sts[1]->old_inp_12k8, old_inp_12k8[1], L_INP_MEM ); + stereo_dft_enc_synthesize( hCPE->hStereoDft, old_inp_12k8[1] + L_INP_MEM, 1, input_Fs, 8000, 0 ); + + /* update old input signal buffer */ + mvr2r( old_inp_12k8[1] + L_FRAME8k, sts[1]->old_inp_12k8, L_INP_MEM ); + } + + /* no iDFT at input sampling rate for Side channel -> reset the buffer */ + set_zero( sts[1]->input, input_frame ); + } + + + /*----------------------------------------------------------------* + * Front Pre-processing + *----------------------------------------------------------------*/ + + for ( n = 0; n < n_CoreChannels; n++ ) + { + error = pre_proc_front_ivas( NULL, hCPE, hCPE->element_brate, nb_bits_metadata, input_frame, n, old_inp_12k8[n], old_inp_16k[n], + &ener[n], &relE[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], &vad_hover_flag[n], &attack_flag[n], + realBuffer[n], imagBuffer[n], old_wsp[n], pitch_fr[n], voicing_fr[n], &loc_harm[n], &cor_map_sum[n], &vad_flag_dtx[n], enerBuffer[n], + fft_buff[n], A[0], lsp_new[0], currFlatness[n], tdm_ratio_idx, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, band_energies_LR, 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, 0, 0, ivas_format, st_ivas->hMCT != NULL, ivas_total_brate ); + if ( error != IVAS_ERR_OK ) + { + return error; + } + } + + /* sanity check -> DTX not supported for more than one SCEs/CPEs */ + if ( st_ivas->nSCE + st_ivas->nCPE > 1 ) + { + if ( sts[0]->core_brate == SID_2k40 || sts[0]->core_brate == FRAME_NO_DATA ) + { + sts[0]->core_brate = -1; + sts[0]->total_brate = hCPE->element_brate; + } + } + + /*----------------------------------------------------------------* + * Stereo DTX updates + *----------------------------------------------------------------*/ + + if ( ivas_format == MASA_FORMAT && nb_bits_metadata > 0 && hCPE->hCoreCoder[0]->Opt_DTX_ON ) + { + if ( hCPE->element_mode == IVAS_CPE_DFT || hCPE->element_mode == IVAS_CPE_TD ) + { + reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata ); + } + } + + /* MDCT stereo DTX: active/inactive frame decision; compute FD CNG coherence */ + if ( hCPE->element_mode == IVAS_CPE_MDCT && hEncoderConfig->Opt_DTX_ON ) + { + stereoFdCngCoherence( sts, hCPE->last_element_mode, fft_buff ); + + /* Reset metadata */ + if ( sts[0]->cng_sba_flag || ( ivas_format == SBA_FORMAT ) ) + { + reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata ); + } + } + + /*----------------------------------------------------------------* + * Core codec configuration + *----------------------------------------------------------------*/ + + /* IGF reconfiguration */ + for ( n = 0; n < n_CoreChannels; n++ ) + { + if ( ( hCPE->last_element_brate != hCPE->element_brate || hCPE->element_mode != hCPE->last_element_mode || ( hCPE->element_mode == IVAS_CPE_TD && sts[0]->bits_frame_nominal != last_bits_frame_nominal ) || sts[n]->last_bwidth != sts[n]->bwidth ) && ( n == 0 || hCPE->element_mode == IVAS_CPE_MDCT ) ) + { + int16_t igf; + igf = getIgfPresent( sts[n]->element_mode, sts[n]->bits_frame_nominal * FRAMES_PER_SEC, sts[n]->max_bwidth, sts[n]->rf_mode ); + if ( ( error = IGF_Reconfig( &sts[n]->hIGFEnc, igf, 0, sts[n]->bits_frame_nominal * FRAMES_PER_SEC, sts[n]->max_bwidth, sts[n]->element_mode, sts[n]->rf_mode ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( hCPE->element_mode == IVAS_CPE_MDCT && st_ivas->hMCT == NULL ) + { + /* set coded BW for MDCT stereo */ + set_bw_stereo( hCPE ); + + /* reconfiguration of MDCT stereo */ + if ( sts[0]->bwidth != sts[0]->last_bwidth || ( ( hCPE->last_element_brate != hCPE->element_brate || hCPE->last_element_mode != hCPE->element_mode ) && sts[0]->bwidth != sts[0]->max_bwidth ) ) + { + initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, sts[0]->bwidth, 0, NULL, 0 ); + hCPE->hStereoMdct->isSBAStereoMode = ( ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) && ( st_ivas->nchan_transport == 2 ) ); + + if ( hCPE->element_brate <= MAX_MDCT_ITD_BRATE && ivas_format == STEREO_FORMAT ) + { + if ( ( error = initMdctItdHandling( hCPE->hStereoMdct, input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + } + + /* set ACELP@12k8 / ACELP@16k flag for flexible ACELP core */ + for ( n = 0; n < n_CoreChannels; n++ ) + { + if ( ( sts[0]->core_brate == SID_2k40 || sts[0]->core_brate == FRAME_NO_DATA ) && hCPE->element_mode == IVAS_CPE_DFT ) + { + sts[n]->flag_ACELP16k = set_ACELP_flag_IVAS( hCPE->element_mode, hCPE->element_brate, sts[n]->core_brate, n, sts[0]->tdm_LRTD_flag, sts[n]->bwidth, sts[n]->cng_type ); + } + else + { + sts[n]->flag_ACELP16k = set_ACELP_flag_IVAS( hCPE->element_mode, hCPE->element_brate, sts[n]->total_brate, n, sts[0]->tdm_LRTD_flag, sts[n]->bwidth, sts[n]->cng_type ); + } + } + + /* configure TD stereo encoder */ + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + tdm_ol_pitch_comparison( hCPE, pitch_fr, voicing_fr ); + + tdm_configure_enc( ivas_format, st_ivas->ism_mode, hCPE, Etot_last, tdm_SM_or_LRTD_Pri, tdm_ratio_idx, tdm_ratio_idx_SM, attack_flag[0], nb_bits_metadata ); + + if ( hEncoderConfig->Opt_DTX_ON ) + { + stereo_cng_upd_counters( hCPE->hStereoCng, hCPE->element_mode, -1, NULL, sts[0]->hTdCngEnc->burst_ho_cnt, NULL ); + } + } + + /* modify the coder_type depending on the total_brate per channel */ + for ( n = 0; n < n_CoreChannels; n++ ) + { + if ( ( hCPE->element_mode != IVAS_CPE_DFT && hCPE->element_mode != IVAS_CPE_TD ) || n == 0 ) /* modify coder_type of primary channel */ + { + /* limit coder_type depending on the bitrate */ + coder_type_modif( sts[n], relE[n] ); + } + } + + /*----------------------------------------------------------------* + * Write IVAS format signaling in SID frames + *----------------------------------------------------------------*/ + + if ( sts[0]->core_brate == SID_2k40 ) + { + ivas_write_format_sid( ivas_format, hCPE->element_mode, sts[0]->hBstr ); + } + + /*----------------------------------------------------------------* + * DFT Stereo residual coding + * DFT Stereo parameters writing into the bitstream + *----------------------------------------------------------------*/ + + cpe_brate = 0; + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + if ( hEncoderConfig->Opt_DTX_ON ) + { + if ( sts[0]->core_brate == SID_2k40 || sts[0]->core_brate == FRAME_NO_DATA ) + { + /* Reconfigure DFT Stereo for inactive frames */ + if ( sts[0]->core_brate == SID_2k40 ) + { + stereo_dft_config( hCPE->hStereoDft->hConfig, IVAS_SID_5k2, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + else + { + stereo_dft_config( hCPE->hStereoDft->hConfig, FRAME_NO_DATA, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); + } + + stereo_dft_cng_side_gain( hCPE->hStereoDft, hCPE->hStereoCng, sts[0]->core_brate, sts[0]->last_core_brate, sts[0]->bwidth ); + } + else + { + stereo_cng_upd_counters( hCPE->hStereoCng, hCPE->element_mode, hCPE->hStereoDft->nbands, hCPE->hStereoDft->sidSideGain, sts[0]->hTdCngEnc->burst_ho_cnt, &hCPE->hStereoDft->coh_fade_counter ); + } + } + + /* Write stereo bitstream */ + cpe_brate = st_ivas->hCPE[0]->element_brate; + + /* DFT stereo side bits */ + if ( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) && cpe_brate < MASA_STEREO_MIN_BITRATE && sts[0]->core_brate != SID_2k40 && sts[0]->core_brate != FRAME_NO_DATA ) + { + nb_bits = 0; /* Only mono downmix is transmitted in this case */ + } + else if ( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) && ( sts[0]->core_brate == SID_2k40 || sts[0]->core_brate == FRAME_NO_DATA ) ) + { + nb_bits = hCPE->hMetaData->nb_bits_tot; + } + else + { + stereo_dft_enc_write_BS( hCPE, &nb_bits ); + } + + /* Residual coding in MDCT domain */ + if ( !( ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) && ( sts[0]->core_brate == SID_2k40 || sts[0]->core_brate == FRAME_NO_DATA ) ) ) + { + int16_t max_bits = (int16_t) ( hCPE->element_brate / FRAMES_PER_SEC - 0.8f * sts[0]->bits_frame_nominal ); + if ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) + { + max_bits -= nb_bits_metadata; + if ( hCPE->brate_surplus < 0 ) + { + max_bits += (int16_t) ( hCPE->brate_surplus / FRAMES_PER_SEC ); + } + } + + stereo_dft_enc_res( hCPE->hStereoDft, old_inp_12k8[1] + L_INP_MEM - STEREO_DFT_OVL_8k, hCPE->hMetaData, &nb_bits, max_bits ); + } + + if ( sts[0]->core_brate == FRAME_NO_DATA || sts[0]->core_brate == SID_2k40 ) + { + assert( ( nb_bits <= ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS ) ) && "Stereo DFT CNG: bit budget is violated" ); + } + else + { + /* Flexible total bitrate in M channel */ + sts[0]->total_brate = hCPE->element_brate - ( nb_bits * FRAMES_PER_SEC ); + } + + /* subtract metadata bitbudget */ + sts[0]->total_brate -= ( nb_bits_metadata * FRAMES_PER_SEC ); + + /* subtract bit-rate for combined format coding */ + if ( ivas_format == MASA_ISM_FORMAT && ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) ) + { + sts[0]->total_brate += hCPE->brate_surplus; + } + } + + + /*----------------------------------------------------------------* + * Core Encoder + *----------------------------------------------------------------*/ + + if ( ( error = ivas_core_enc( NULL, hCPE, st_ivas->hMCT, n_CoreChannels, old_inp_12k8, old_inp_16k, ener, A, Aw, epsP, lsp_new, lsp_mid, vad_hover_flag, attack_flag, realBuffer, imagBuffer, old_wsp, loc_harm, cor_map_sum, vad_flag_dtx, enerBuffer, fft_buff, tdm_SM_or_LRTD_Pri, ivas_format, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*----------------------------------------------------------------* + * Common updates + *----------------------------------------------------------------*/ + + hCPE->last_element_brate = hCPE->element_brate; + hCPE->last_element_mode = hCPE->element_mode; + + if ( ivas_format == MASA_ISM_FORMAT ) + { + hCPE->element_brate = element_brate_ref; + } + + if ( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->hStereoMdct != NULL && hCPE->hStereoMdct->hItd != NULL ) + { + /* update input samples buffer */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + mvr2r( orig_input[n], sts[n]->old_input_signal, input_frame ); + } + } + else if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + mvr2r( sts[0]->input, sts[0]->old_input_signal, input_frame ); + } + else if ( st_ivas->hMCT == NULL ) /* note: in MCT, input buffers are updated later in ivas_mct_enc() */ + { + /* update input samples buffer */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + mvr2r( sts[n]->input, sts[n]->old_input_signal, input_frame ); + } + } + + if ( hCPE->hFrontVad[0] != NULL ) + { + hCPE->hFrontVad[0]->ini_frame++; + hCPE->hFrontVad[0]->ini_frame = min( hCPE->hFrontVad[0]->ini_frame, MAX_FRAME_COUNTER ); + } + + /* Store previous attack detection flag */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + sts[n]->hTranDet->transientDetector.prev_bIsAttackPresent = sts[n]->hTranDet->transientDetector.bIsAttackPresent; + } + + + pop_wmops(); + return error; +} +#endif /*------------------------------------------------------------------------- * create_cpe_enc() diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index fa8970e00..36fa5a0c7 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -152,7 +152,8 @@ typedef struct stereo_dft_enc_data_struct /*FFT*/ #ifdef IVAS_FLOAT_FIXED Word32 DFT_fx[CPE_CHANNELS][STEREO_DFT_N_MAX_ENC]; - Word16 DFT_q_fx[CLDFB_NO_CHANNELS_MAX]; + Word16 DFT_fx_e[CPE_CHANNELS]; + // Word16 DFT_q_fx[CLDFB_NO_CHANNELS_MAX]; #endif float DFT[CPE_CHANNELS][STEREO_DFT_N_MAX_ENC]; int16_t dft_ovl; /* Overlap size */ @@ -307,6 +308,12 @@ typedef struct stereo_dft_enc_data_struct /*misc*/ float icbweRefEner; float lbEner; +#ifdef IVAS_FLOAT_FIXED + Word32 icbweRefEner_fx; + Word16 icbweRefEner_fx_e; + Word32 lbEner_fx; + Word16 lbEner_fx_e; +#endif int16_t flip_sign; Word32 dmx_res_all_prev_fx; /* energy of the previous frame Q31*/ Word16 switch_fade_factor_fx; /* Adaptive fade factor for switch frame Q15*/ @@ -352,7 +359,7 @@ typedef struct stereo_dft_enc_data_struct const Word16 *dft_trigo_16k_fx; const Word16 *dft_trigo_32k_fx; - Word32 output_mem_res_8k_fx[STEREO_DFT_OVL_8k]; + Word32 output_mem_res_8k_fx[STEREO_DFT_OVL_8k]; // Q16 Word32 res_cod_NRG_M_fx[STEREO_DFT_BAND_MAX]; Word32 res_cod_NRG_S_fx[STEREO_DFT_BAND_MAX]; @@ -362,11 +369,11 @@ typedef struct stereo_dft_enc_data_struct Word32 past_nrgR_fx[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX]; Word32 past_dot_prod_real_fx[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX]; Word32 past_dot_prod_imag_fx[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX]; - Word32 output_mem_dmx_fx[STEREO_DFT_OVL_MAX]; - Word32 output_mem_dmx_12k8_fx[STEREO_DFT_OVL_12k8]; - Word32 output_mem_dmx_16k_fx[STEREO_DFT_OVL_16k]; /*can hold 16, 12.8 or 32kHz signals*/ - Word32 output_mem_dmx_32k_fx[STEREO_DFT_OVL_32k]; /*can hold 16, 12.8 or 32kHz signals*/ - Word32 output_mem_dmx_16k_shb_fx[STEREO_DFT_OVL_16k]; + Word32 output_mem_dmx_fx[STEREO_DFT_OVL_MAX]; // Q16 + Word32 output_mem_dmx_12k8_fx[STEREO_DFT_OVL_12k8]; // Q16 + Word32 output_mem_dmx_16k_fx[STEREO_DFT_OVL_16k]; /*can hold 16, 12.8 or 32kHz signals*/ // Q16 + Word32 output_mem_dmx_32k_fx[STEREO_DFT_OVL_32k]; /*can hold 16, 12.8 or 32kHz signals*/ // Q16 + Word32 output_mem_dmx_16k_shb_fx[STEREO_DFT_OVL_16k]; // Q16 Word32 input_mem_itd_fx[CPE_CHANNELS][STEREO_DFT_OVL_MAX]; Word32 gipd_fx[STEREO_DFT_ENC_DFT_NB]; diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index 46db4d6a5..8fb7d28c8 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -421,6 +421,55 @@ static void stereo_dft_enc_open( set_zero( hStereoDft->output_mem_dmx_16k_shb, STEREO_DFT_OVL_16k ); set_zero( hStereoDft->output_mem_res_8k, STEREO_DFT_OVL_8k ); +#ifdef IVAS_FLOAT_FIXED + hStereoDft->dft_trigo_8k_fx = dft_trigo_32k_fx; + hStereoDft->dft_trigo_12k8_fx = dft_trigo_12k8_fx; + hStereoDft->dft_trigo_16k_fx = dft_trigo_32k_fx; + hStereoDft->dft_trigo_32k_fx = dft_trigo_32k_fx; + + hStereoDft->win_ana_8k_fx = win_ana_8k_fx; + hStereoDft->win_ana_12k8_fx = win_ana_12k8_fx; + hStereoDft->win_ana_16k_fx = win_ana_16k_fx; + hStereoDft->win_ana_32k_fx = win_ana_32k_fx; + + hStereoDft->win_8k_fx = win_syn_8k_fx; + hStereoDft->win_12k8_fx = win_syn_12k8_fx; + hStereoDft->win_16k_fx = win_syn_16k_fx; + hStereoDft->win_32k_fx = win_syn_32k_fx; + + IF( EQ_32( input_Fs, 16000 ) ) + { + hStereoDft->dft_trigo_fx = dft_trigo_32k_fx; + hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP; + hStereoDft->win_ana_fx = win_ana_16k_fx; + hStereoDft->win_fx = win_syn_16k_fx; + } + ELSE IF( EQ_32( input_Fs, 32000 ) ) + { + hStereoDft->dft_trigo_fx = dft_trigo_32k_fx; + hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP; + hStereoDft->win_ana_fx = win_ana_32k_fx; + hStereoDft->win_fx = win_syn_32k_fx; + } + ELSE + { + assert( EQ_32( input_Fs, 48000 ) ); + hStereoDft->dft_trigo_fx = dft_trigo_48k_fx; + hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP; + hStereoDft->win_ana_fx = win_ana_48k_fx; + hStereoDft->win_fx = win_syn_48k_fx; + } + + hStereoDft->win_mdct_8k_fx = win_mdct_8k_fx; + + /*I/O Buffers*/ + set_zero_fx( hStereoDft->output_mem_dmx_fx, STEREO_DFT_OVL_MAX ); + set_zero_fx( hStereoDft->output_mem_dmx_12k8_fx, STEREO_DFT_OVL_12k8 ); + set_zero_fx( hStereoDft->output_mem_dmx_16k_fx, STEREO_DFT_OVL_16k ); + set_zero_fx( hStereoDft->output_mem_dmx_16k_shb_fx, STEREO_DFT_OVL_16k ); + set_zero_fx( hStereoDft->output_mem_res_8k_fx, STEREO_DFT_OVL_8k ); +#endif + /*Bands: find the number of bands, Nyquist freq. is not taken into account*/ NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[max_bwidth] / L_FRAME48k; #ifndef IVAS_FLOAT_FIXED @@ -461,17 +510,15 @@ static void stereo_dft_enc_open_fx( Word16 win[STEREO_DFT_OVL_MAX]; /*Sizes*/ - /* input_Fs / 48000 */ - Word16 input_Fs_48k = extract_l( Mpy_32_32( input_Fs, 44739 /* 1 / 48000 in Q31 */ ) ); - // input_Fs_48k = shr(input_Fs_48k, sub(15, div_e)); - - hStereoDft->N = i_mult( STEREO_DFT_HOP_MAX_ENC, input_Fs_48k ); // e = div_e + hStereoDft->N = extract_l( Mpy_32_32( input_Fs, 42949673 /* STEREO_DFT_HOP_MAX_ENC / 48000 in Q31 */ ) ); // e = div_e assert( ( ( input_Fs / FRAMES_PER_SEC ) / hStereoDft->N ) == 1 ); /*Init. DFT sizes*/ - hStereoDft->NFFT = i_mult( STEREO_DFT_N_MAX_ENC, input_Fs_48k ); // e = div_e - hStereoDft->dft_ovl = i_mult( STEREO_DFT_OVL_MAX, input_Fs_48k ); // e = div_e + // hStereoDft->NFFT = i_mult( STEREO_DFT_N_MAX_ENC, input_Fs_48k ); // e = div_e + hStereoDft->NFFT = extract_l( Mpy_32_32( input_Fs, 85899346 ) ); // e = div_e + // hStereoDft->dft_ovl = i_mult( STEREO_DFT_OVL_MAX, input_Fs ); // e = div_e + hStereoDft->dft_ovl = extract_l( Mpy_32_32( input_Fs, 18790482 ) ); // e = div_e mdct_window_sine_IVAS_updated( win_p, input_Fs, hStereoDft->dft_ovl, FULL_OVERLAP, IVAS_CPE_DFT ); // win_e = 15 FOR( Word16 i = 0; i < shr( STEREO_DFT_OVL_MAX, 1 ); i++ ) { @@ -1115,6 +1162,423 @@ void stereo_dft_enc_analyze( * Inverse DFT on a 20ms frame *-------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +Word32 stereo_dft_enc_synthesize_fx( + STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ + // float *output, /* o : output synthesis */ + Word32 *output_fx, /* o : output synthesis Q16 */ + Word16 *output_start_index, + Word16 *output_end_index, + const Word16 chan, /* i : channel number */ + const Word32 input_Fs, /* i : input sampling rate */ + const Word32 output_sampling_rate, /* i : output sampling rate */ + const Word16 L_frame, /* i : frame length at internal Fs */ + Word16 *nrg_out_fx_e ) +{ + Word16 i, j, sign; + // float *pDFT_in; + Word32 *pDFT_in_fx; + Word16 DFT_in_fx_e; + Word16 offset, NFFT, N, ovl, zp; + Word16 temp_exp; + // float fac; + Word32 fac_fx; + // float *mem; + Word32 *mem_fx; + // const float *trigo, *win, *win_ana; + const Word16 *trigo_fx; + const Word32 *win_fx, *win_ana_fx; + // float tmp[STEREO_DFT_N_MAX_ENC]; + Word32 tmp_fx[STEREO_DFT_N_MAX_ENC]; + // float nrg; + Word32 nrg_fx; + Word16 nrg_fx_e; + // float trigo_enc[STEREO_DFT_N_MAX_ENC / 2 + 1]; + Word16 trigo_enc_fx[STEREO_DFT_N_MAX_ENC / 2 + 1]; + Word16 trigo_step; + Word16 scal_fac; + + + /*-----------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + IF( L_frame > 0 ) + { + assert( ( output_sampling_rate == 16000 ) && "High-band generation only possible at 16kHz!" ); + } + nrg_fx = 0; + move32(); + nrg_fx_e = 0; + move16(); + + hStereoDft->icbweRefEner_fx = 0; + move32(); + hStereoDft->icbweRefEner_fx_e = 0; + move16(); + hStereoDft->lbEner_fx = 0; + move32(); + hStereoDft->lbEner_fx_e = 0; + move16(); + + IF( chan == 0 ) + { + pDFT_in_fx = hStereoDft->DFT_fx[0]; + DFT_in_fx_e = hStereoDft->DFT_fx_e[0]; + move16(); + } + ELSE + { + pDFT_in_fx = hStereoDft->DFT_fx[1]; + DFT_in_fx_e = hStereoDft->DFT_fx_e[1]; + move16(); + } + + IF( EQ_32( output_sampling_rate, input_Fs ) ) + { + assert( chan == 0 ); + + NFFT = hStereoDft->NFFT; + move16(); + fac_fx = MAX_32; + move32(); + N = hStereoDft->N; + move16(); + ovl = hStereoDft->dft_ovl; + move16(); + zp = hStereoDft->dft_zp; + move16(); + trigo_fx = hStereoDft->dft_trigo_fx; + trigo_step = hStereoDft->dft_trigo_step; + move16(); + IF( L_frame > 0 ) + { + mem_fx = hStereoDft->output_mem_dmx_16k_shb_fx; + } + ELSE + { + mem_fx = hStereoDft->output_mem_dmx_fx; + } + win_fx = hStereoDft->win_fx; + win_ana_fx = hStereoDft->win_ana_fx; + + push_wmops( "DFT_synth_fs" ); + } + ELSE IF( EQ_32( output_sampling_rate, INT_FS_12k8 ) ) + { + assert( chan == 0 ); + + NFFT = STEREO_DFT_N_12k8_ENC; + move16(); + N = STEREO_DFT_HOP_12k8_ENC; + move16(); + zp = STEREO_DFT_ZP_12k8_ENC; + move16(); + // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT ); + fac_fx = BASOP_Util_Divide3232_Scale_cadence( NFFT, hStereoDft->NFFT, &temp_exp ); + fac_fx = L_shl( fac_fx, temp_exp ); + ovl = STEREO_DFT_OVL_12k8; + move16(); + trigo_fx = hStereoDft->dft_trigo_12k8_fx; + trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP; + move16(); + mem_fx = hStereoDft->output_mem_dmx_12k8_fx; + win_fx = hStereoDft->win_12k8_fx; + win_ana_fx = hStereoDft->win_ana_12k8_fx; + + push_wmops( "DFT_synth_12k8" ); + } + ELSE IF( EQ_32( output_sampling_rate, 16000 ) ) + { + assert( chan == 0 ); + + NFFT = STEREO_DFT_N_16k_ENC; + move16(); + N = STEREO_DFT_HOP_16k_ENC; + move16(); + zp = STEREO_DFT_ZP_16k_ENC; + move16(); + // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT ); + fac_fx = BASOP_Util_Divide3232_Scale_cadence( NFFT, hStereoDft->NFFT, &temp_exp ); + fac_fx = L_shl( fac_fx, temp_exp ); + ovl = STEREO_DFT_OVL_16k; + move16(); + trigo_fx = hStereoDft->dft_trigo_16k_fx; + trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP; + move16(); + IF( L_frame > 0 ) + { + mem_fx = hStereoDft->output_mem_dmx_16k_shb_fx; + + push_wmops( "DFT_synth_16k_shb" ); + } + ELSE + { + mem_fx = hStereoDft->output_mem_dmx_16k_fx; + + push_wmops( "DFT_synth_16k" ); + } + win_fx = hStereoDft->win_16k_fx; + win_ana_fx = hStereoDft->win_ana_16k_fx; + } + ELSE IF( EQ_32( output_sampling_rate, 32000 ) ) + { + assert( chan == 0 ); + + NFFT = STEREO_DFT_N_32k_ENC; + move16(); + N = STEREO_DFT_HOP_32k_ENC; + move16(); + zp = STEREO_DFT_ZP_32k_ENC; + move16(); + // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT ); + fac_fx = BASOP_Util_Divide3232_Scale_cadence( NFFT, hStereoDft->NFFT, &temp_exp ); + fac_fx = L_shl( fac_fx, temp_exp ); + ovl = STEREO_DFT_OVL_32k; + move16(); + trigo_fx = hStereoDft->dft_trigo_32k_fx; + trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP; + move16(); + mem_fx = hStereoDft->output_mem_dmx_32k_fx; + win_fx = hStereoDft->win_32k_fx; + win_ana_fx = hStereoDft->win_ana_32k_fx; + + push_wmops( "DFT_synth_32k" ); + } + ELSE IF( EQ_32( output_sampling_rate, 8000 ) ) + { + assert( chan == 1 ); + + NFFT = STEREO_DFT_N_8k_ENC; + move16(); + N = STEREO_DFT_HOP_8k_ENC; + move16(); + zp = STEREO_DFT_ZP_8k_ENC; + move16(); + // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT ); + fac_fx = BASOP_Util_Divide3232_Scale_cadence( NFFT, hStereoDft->NFFT, &temp_exp ); + fac_fx = L_shl( fac_fx, temp_exp ); + ovl = STEREO_DFT_OVL_8k; + move16(); + trigo_fx = hStereoDft->dft_trigo_8k_fx; + trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP; + move16(); + mem_fx = hStereoDft->output_mem_res_8k_fx; + win_fx = hStereoDft->win_8k_fx; + win_ana_fx = hStereoDft->win_ana_8k_fx; + + push_wmops( "DFT_synth_8k" ); + } + ELSE + { + assert( 0 && "DFT stereo: sampling rate not supported!" ); + NFFT = -1; /* to avoid compilation warning */ + move16(); + fac_fx = -1; /* to avoid compilation warning */ + move32(); + N = -1; /* to avoid compilation warning */ + move16(); + zp = -1; /* to avoid compilation warning */ + move16(); + win_fx = NULL; /* to avoid compilation warning */ + trigo_fx = NULL; /* to avoid compilation warning */ + trigo_step = -1; /* to avoid compilation warning */ + move16(); + ovl = -1; /* to avoid compilation warning */ + move16(); + mem_fx = NULL; /* to avoid compilation warning */ + win_ana_fx = NULL; /* to avoid compilation warning */ + } + + offset = 0; + move16(); + + FOR( i = 0; i < shr( NFFT, 2 ); i++ ) + { + trigo_enc_fx[i] = trigo_fx[imult1616( i, trigo_step )]; + move16(); + trigo_enc_fx[sub( shr( NFFT, 1 ), i )] = trigo_fx[imult1616( i, trigo_step )]; + move16(); + } + trigo_enc_fx[shr( NFFT, 2 )] = trigo_fx[imult1616( shr( NFFT, 2 ), trigo_step )]; + move16(); + + /*-----------------------------------------------------------------* + * Synthesizing & resampling + *-----------------------------------------------------------------*/ + + offset = negate( ovl ); + + test(); + IF( EQ_16( L_frame, L_FRAME ) || EQ_16( L_frame, L_FRAME16k ) ) + { + // for ( i = (int16_t) ( 200 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i < (int16_t) ( 400 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i++ ) + FOR( i = 320; i < 640; i++ ) + { + // hStereoDft->icbweRefEner += pDFT_in[2 * i] * pDFT_in[2 * i] + pDFT_in[2 * i + 1] * pDFT_in[2 * i + 1]; + hStereoDft->icbweRefEner_fx = BASOP_Util_Add_Mant32Exp( hStereoDft->icbweRefEner_fx, hStereoDft->icbweRefEner_fx_e, L_add( L_shr( Mpy_32_32( pDFT_in_fx[2 * i], pDFT_in_fx[2 * i] ), 1 ), L_shr( Mpy_32_32( pDFT_in_fx[2 * i + 1], pDFT_in_fx[2 * i + 1] ), 1 ) ), add( shl( DFT_in_fx_e, 1 ), 1 ), &hStereoDft->icbweRefEner_fx_e ); + move32(); + } + // for ( i = 0; i < (int16_t) ( 200 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i++ ) + FOR( i = 0; i < 320; i++ ) + { + // hStereoDft->lbEner += pDFT_in[2 * i] * pDFT_in[2 * i] + pDFT_in[2 * i + 1] * pDFT_in[2 * i + 1]; + hStereoDft->lbEner_fx = BASOP_Util_Add_Mant32Exp( hStereoDft->lbEner_fx, hStereoDft->lbEner_fx_e, L_add( L_shr( Mpy_32_32( pDFT_in_fx[2 * i], pDFT_in_fx[2 * i] ), 1 ), L_shr( Mpy_32_32( pDFT_in_fx[2 * i + 1], pDFT_in_fx[2 * i + 1] ), 1 ) ), add( shl( DFT_in_fx_e, 1 ), 1 ), &hStereoDft->lbEner_fx_e ); + move32(); + } + hStereoDft->icbweRefEner_fx = Mpy_32_32( hStereoDft->icbweRefEner_fx, fac_fx ); + move32(); + hStereoDft->lbEner_fx = Mpy_32_32( hStereoDft->lbEner_fx, fac_fx ); + move32(); + } + + /*Flip?*/ + set32_fx( tmp_fx, 0, STEREO_DFT_N_MAX_ENC ); + IF( EQ_16( L_frame, L_FRAME ) ) + { + /* 6 to 14 kHz SHB target signal*/ + j = 2; + move16(); + sign = hStereoDft->flip_sign; + move16(); + + // for ( i = (int16_t) ( 350 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i >= (int16_t) 150 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i-- ) + FOR( i = 560; i >= 240; i-- ) + { + /* alternate sign between frames for even starting index */ + tmp_fx[j++] = W_extract_l( W_mult0_32_32( sign, Mpy_32_32( pDFT_in_fx[2 * i], fac_fx ) ) ); + tmp_fx[j++] = W_extract_l( W_mult0_32_32( negate( sign ), Mpy_32_32( pDFT_in_fx[2 * i + 1], fac_fx ) ) ); + move32(); + move32(); + } + scal_fac = sub( L_norm_arr( tmp_fx, STEREO_DFT_N_MAX_ENC ), 1 ); + scale_sig32( tmp_fx, STEREO_DFT_N_MAX_ENC, scal_fac ); // Q16 + DFT_in_fx_e = sub( DFT_in_fx_e, scal_fac ); + + hStereoDft->flip_sign = negate( sign ); + move16(); + + // for ( i = 0; i <= (int16_t) 100 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i++ ) + FOR( i = 0; i <= 160; i++ ) + { + nrg_fx = BASOP_Util_Add_Mant32Exp( nrg_fx, nrg_fx_e, Mpy_32_32( tmp_fx[2 * i], tmp_fx[2 * i] ), shl( DFT_in_fx_e, 1 ), &nrg_fx_e ); + nrg_fx = BASOP_Util_Add_Mant32Exp( nrg_fx, nrg_fx_e, Mpy_32_32( tmp_fx[2 * i + 1], tmp_fx[2 * i + 1] ), shl( DFT_in_fx_e, 1 ), &nrg_fx_e ); + } + } + ELSE IF( EQ_16( L_frame, L_FRAME16k ) ) + { + /* 7.5 - 15.5 kHz SHB target signal*/ + j = 2; + move16(); + // for ( i = (int16_t) ( 400 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ) - 1; i >= (int16_t) 200 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i-- ) + FOR( i = 640 - 1; i >= 320; i-- ) + { + tmp_fx[j++] = Mpy_32_32( pDFT_in_fx[2 * i], fac_fx ); + tmp_fx[j++] = L_negate( Mpy_32_32( pDFT_in_fx[2 * i + 1], fac_fx ) ); + move32(); + move32(); + } + scal_fac = sub( L_norm_arr( tmp_fx, STEREO_DFT_N_MAX_ENC ), 1 ); + scale_sig32( tmp_fx, STEREO_DFT_N_MAX_ENC, scal_fac ); // Q16 + DFT_in_fx_e = sub( DFT_in_fx_e, scal_fac ); + + // for ( i = 0; i <= (int16_t) 100 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i++ ) + FOR( i = 0; i <= 160; i++ ) + { + nrg_fx = BASOP_Util_Add_Mant32Exp( nrg_fx, nrg_fx_e, Mpy_32_32( tmp_fx[2 * i], tmp_fx[2 * i] ), shl( DFT_in_fx_e, 1 ), &nrg_fx_e ); + nrg_fx = BASOP_Util_Add_Mant32Exp( nrg_fx, nrg_fx_e, Mpy_32_32( tmp_fx[2 * i + 1], tmp_fx[2 * i + 1] ), shl( DFT_in_fx_e, 1 ), &nrg_fx_e ); + } + } + ELSE IF( NE_32( fac_fx, MAX_32 ) ) + { + /*Copy and scale*/ + tmp_fx[0] = Mpy_32_32( pDFT_in_fx[0], fac_fx ); + move32(); + tmp_fx[1] = 0; + move32(); + FOR( i = 2; i < NFFT; i++ ) + { + tmp_fx[i] = Mpy_32_32( pDFT_in_fx[i], fac_fx ); + move32(); + } + + IF( LT_32( fac_fx, MAX_32 ) ) + { + tmp_fx[1] = 0; /*Nyquist is set to 0*/ + tmp_fx[0] = 0; /*DC is set to 0*/ + move32(); + move32(); + } + scal_fac = sub( L_norm_arr( tmp_fx, STEREO_DFT_N_MAX_ENC ), 1 ); + scale_sig32( tmp_fx, STEREO_DFT_N_MAX_ENC, scal_fac ); // Q16 + DFT_in_fx_e = sub( DFT_in_fx_e, scal_fac ); + } + ELSE + { + FOR( i = 0; i < NFFT; i++ ) + { + tmp_fx[i] = pDFT_in_fx[i]; + move32(); + } + scal_fac = sub( L_norm_arr( tmp_fx, STEREO_DFT_N_MAX_ENC ), 1 ); + scale_sig32( tmp_fx, STEREO_DFT_N_MAX_ENC, scal_fac ); // Q16 + DFT_in_fx_e = sub( DFT_in_fx_e, scal_fac ); + } + + /*Reconstruct */ + /*IFFT*/ + scal_fac = sub( 1, find_guarded_bits_fx( NFFT ) ); + scale_sig32( tmp_fx, NFFT, scal_fac ); // Q16 + rfft_fx( tmp_fx, trigo_enc_fx, NFFT, +1 ); + Scale_sig32( tmp_fx, NFFT, sub( sub( DFT_in_fx_e, scal_fac ), 15 ) ); // Q16 + + FOR( i = 0; i < ovl; i++ ) + { + // output[offset + i] = mem[i] + tmp[zp + i] * win[i]; + output_fx[offset + i] = L_add_sat( mem_fx[i], Mpy_32_32( tmp_fx[zp + i], win_fx[i] ) ); + move32(); + // mem[i] = tmp[zp + N + i] * win[ovl - 1 - i]; + mem_fx[i] = Mpy_32_32( tmp_fx[zp + N + i], win_fx[ovl - 1 - i] ); + move32(); + } + + /*Middle->Copy*/ + FOR( i = 0; i < N - ovl; i++ ) + { + // output_fx[offset + ovl + i] = tmp[zp + ovl + i]; + output_fx[offset + ovl + i] = tmp_fx[zp + ovl + i]; + move32(); + } + + /*-----------------------------------------------------------------* + * Lookahead: redress signal + *-----------------------------------------------------------------*/ + + FOR( i = 0; i < ovl; i++ ) + { + Word32 ifft_deviation = tmp_fx[zp + N + ovl]; + move32(); + // output[offset + N + i] = ( tmp[zp + N + i] - ifft_deviation ) / win_ana[ovl - 1 - i] + ifft_deviation; + Word16 L_temp_e; + Word32 L_temp = BASOP_Util_Divide3232_Scale_cadence( L_sub_sat( tmp_fx[zp + N + i], ifft_deviation ), win_ana_fx[ovl - 1 - i], &L_temp_e ); + L_temp = L_shl_sat( L_temp, L_temp_e ); + output_fx[offset + N + i] = L_add_sat( L_temp, ifft_deviation ); // Q16 + move32(); + } + + *output_start_index = offset; + move16(); + *output_end_index = add( add( offset, ovl ), N ); + move16(); + IF( nrg_out_fx_e ) + { + *nrg_out_fx_e = nrg_fx_e; + move16(); + } + pop_wmops(); + return ( nrg_fx ); +} +#endif float stereo_dft_enc_synthesize( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ float *output, /* o : output synthesis */ diff --git a/lib_enc/swb_pre_proc.c b/lib_enc/swb_pre_proc.c index 91dc8beea..3336ee336 100644 --- a/lib_enc/swb_pre_proc.c +++ b/lib_enc/swb_pre_proc.c @@ -44,6 +44,10 @@ #include "wmc_auto.h" #include "ivas_prot.h" #include "ivas_rom_enc.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_prot_fx.h" +#include "prot_fx.h" +#endif /*-------------------------------------------------------------------* * Local constants @@ -270,6 +274,550 @@ void wb_pre_proc( * - Common SWB TBE and SWB BWE pre-processing *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +/*full implementation pending*/ +void swb_pre_proc_ivas_fx( + Encoder_State *st, /* i/o: encoder state structure */ + float *new_swb_speech, /* o : original input signal at 32kHz */ + Word32 *new_swb_speech_fx, /* o : original input signal at 32kHz */ + float *shb_speech, /* o : SHB target signal (6-14kHz) at 16kHz */ + float realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : real buffer */ + float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : imag buffer */ + CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ +) +{ + int16_t Sample_Delay_SWB_BWE, inner_frame, delay; + TD_BWE_ENC_HANDLE hBWE_TD; + FD_BWE_ENC_HANDLE hBWE_FD; + int32_t inner_Fs, input_Fs; + float old_input[NS2SA( 48000, DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS ) + L_FRAME48k]; + Word32 old_input_fx[NS2SA( 48000, DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS ) + L_FRAME48k]; // fixed counterpart + float spchTmp[L_FRAME32k], spchTmp2[L_FRAME32k]; + int16_t i, j, L_resamp; + int16_t startB, endB; + float *realBufferFlipped[CLDFB_NO_COL_MAX]; + float *imagBufferFlipped[CLDFB_NO_COL_MAX]; + float realBufferTmp[CLDFB_NO_COL_MAX][20]; + float imagBufferTmp[CLDFB_NO_COL_MAX][20]; + int16_t ts, nB, uB; + float sign, lbEner, v, t, regression; + const float *thr, *regV; + int16_t Sample_Delay_SWB_BWE32k, lMemRecalc32k, dft_ovl32k; + + lMemRecalc32k = NS2SA( 32000, L_MEM_RECALC_NS ); + + /* initialization */ + hBWE_TD = st->hBWE_TD; + hBWE_FD = st->hBWE_FD; + input_Fs = st->input_Fs; + + for ( j = 0; j < CLDFB_NO_COL_MAX; j++ ) + { + set_f( realBufferTmp[j], 0, 20 ); + set_f( imagBufferTmp[j], 0, 20 ); + realBufferFlipped[j] = realBufferTmp[j]; + imagBufferFlipped[j] = imagBufferTmp[j]; + } + + set_f( old_input, 0.0f, NS2SA( 48000, DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) + L_FRAME48k ); + + if ( input_Fs == 32000 ) + { + if ( st->element_mode > EVS_MONO ) + { + Sample_Delay_SWB_BWE = NS2SA( 32000, DELAY_FD_BWE_ENC_12k8_NS ); + if ( st->L_frame == L_FRAME16k ) + { + Sample_Delay_SWB_BWE = NS2SA( 32000, DELAY_FD_BWE_ENC_16k_NS ); + } + + mvr2r( st->input - Sample_Delay_SWB_BWE, hBWE_FD->old_input, Sample_Delay_SWB_BWE ); + mvr2r( st->input - L_FRAME32k, hBWE_FD->old_fdbwe_speech, L_FRAME32k ); + + if ( st->element_mode == IVAS_CPE_TD && st->bwidth >= SWB ) + { + mvr2r( st->input - hCPE->hStereoTCA->lMemRecalc, hBWE_FD->old_wtda_swb + L_FRAME32k - ( hCPE->hStereoTCA->lMemRecalc - Sample_Delay_SWB_BWE ), hCPE->hStereoTCA->lMemRecalc - Sample_Delay_SWB_BWE ); + } + else if ( st->element_mode == IVAS_CPE_DFT && st->bwidth >= SWB ) + { + mvr2r( st->input - hCPE->hStereoDft->dft_ovl, hBWE_FD->old_wtda_swb + L_FRAME32k - ( hCPE->hStereoDft->dft_ovl - Sample_Delay_SWB_BWE ), hCPE->hStereoDft->dft_ovl - Sample_Delay_SWB_BWE ); + } + } + + mvr2r( st->input, new_swb_speech, L_FRAME32k ); + + if ( st->last_extl != SWB_BWE && st->last_extl != FB_BWE && st->extl != SWB_BWE_HIGHRATE ) + { + Sample_Delay_SWB_BWE = NS2SA( 32000, DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ); + if ( st->element_mode > EVS_MONO && st->L_frame == L_FRAME16k ) + { + Sample_Delay_SWB_BWE = NS2SA( 32000, DELAY_FD_BWE_ENC_16k_NS + DELAY_FIR_RESAMPL_NS ); + } + if ( st->element_mode > EVS_MONO ) + { + Sample_Delay_SWB_BWE -= NS2SA( 32000, DELAY_FIR_RESAMPL_NS ); + } + + mvr2r( hBWE_FD->old_fdbwe_speech, &old_input[Sample_Delay_SWB_BWE], L_FRAME32k ); + + set_f( old_input, 0, Sample_Delay_SWB_BWE ); + mvr2r( hBWE_FD->old_fdbwe_speech + L_FRAME32k - Sample_Delay_SWB_BWE, hBWE_FD->old_input, Sample_Delay_SWB_BWE ); + if ( st->extl != WB_BWE ) + { + mvr2r( old_input, hBWE_FD->old_wtda_swb, L_FRAME32k ); + } + } + + if ( st->extl != SWB_BWE && st->extl != FB_BWE ) + { + mvr2r( st->input, hBWE_FD->old_fdbwe_speech, L_FRAME32k ); + } + } + else /* 48 kHz */ + { + + Sample_Delay_SWB_BWE32k = NS2SA( 32000, DELAY_FD_BWE_ENC_12k8_NS ); + Sample_Delay_SWB_BWE = NS2SA( 48000, DELAY_FD_BWE_ENC_12k8_NS ); + if ( st->L_frame == L_FRAME16k ) + { + Sample_Delay_SWB_BWE32k = NS2SA( 32000, DELAY_FD_BWE_ENC_16k_NS ); + Sample_Delay_SWB_BWE = NS2SA( 48000, DELAY_FD_BWE_ENC_16k_NS ); + } + + dft_ovl32k = 0; + if ( st->element_mode == IVAS_CPE_DFT ) + { + dft_ovl32k = (int16_t) ( STEREO_DFT_OVL_MAX * 32000 / 48000 ); + } + + if ( st->codec_mode == MODE1 ) + { + if ( st->element_mode > EVS_MONO ) + { + + if ( st->element_mode == IVAS_CPE_TD ) + { + } + else if ( st->bwidth == FB ) + { + mvr2r( st->input - Sample_Delay_SWB_BWE, hBWE_FD->old_input, Sample_Delay_SWB_BWE ); + } + + mvr2r( st->input - L_FRAME48k, hBWE_FD->old_fdbwe_speech, L_FRAME48k ); + + if ( st->element_mode == IVAS_CPE_TD && st->bwidth >= SWB ) + { + if ( st->bwidth == SWB ) + { + /* buffers hBWE_FD->old_input[] and hBWE_FD->old_wtda_swb[] need to be at 32 kHz (inner) sampling rate */ + + decimate_2_over_3_allpass( st->input - hCPE->hStereoTCA->lMemRecalc, hCPE->hStereoTCA->lMemRecalc, spchTmp, hBWE_TD->dec_2_over_3_mem, hBWE_TD->dec_2_over_3_mem_lp ); + + mvr2r( spchTmp, hBWE_FD->old_wtda_swb + L_FRAME32k - ( lMemRecalc32k - Sample_Delay_SWB_BWE32k ), lMemRecalc32k - Sample_Delay_SWB_BWE32k ); + mvr2r( spchTmp + lMemRecalc32k - Sample_Delay_SWB_BWE32k, hBWE_FD->old_input, Sample_Delay_SWB_BWE32k ); + } + else /* FB_BWE */ + { + mvr2r( st->input - hCPE->hStereoTCA->lMemRecalc, hBWE_FD->old_wtda_swb + L_FRAME48k - ( hCPE->hStereoTCA->lMemRecalc - Sample_Delay_SWB_BWE ), hCPE->hStereoTCA->lMemRecalc - Sample_Delay_SWB_BWE ); + mvr2r( st->input - Sample_Delay_SWB_BWE, hBWE_FD->old_input, Sample_Delay_SWB_BWE ); + } + } + else if ( st->element_mode == IVAS_CPE_DFT && st->bwidth >= SWB ) + { + if ( st->bwidth == SWB ) + { + lerp_flt( st->input - hCPE->hStereoDft->dft_ovl, spchTmp, dft_ovl32k - Sample_Delay_SWB_BWE32k, hCPE->hStereoDft->dft_ovl - Sample_Delay_SWB_BWE ); + + mvr2r( spchTmp, hBWE_FD->old_wtda_swb + L_FRAME32k - ( dft_ovl32k - Sample_Delay_SWB_BWE32k ), dft_ovl32k - Sample_Delay_SWB_BWE32k ); + } + else + { + mvr2r( st->input - hCPE->hStereoDft->dft_ovl, hBWE_FD->old_wtda_swb + L_FRAME48k - ( hCPE->hStereoDft->dft_ovl - Sample_Delay_SWB_BWE ), hCPE->hStereoDft->dft_ovl - Sample_Delay_SWB_BWE ); + } + } + } + + if ( ( st->extl != SWB_BWE && st->extl != FB_BWE && st->core == ACELP_CORE ) || ( st->element_mode == IVAS_CPE_DFT && st->core != ACELP_CORE ) /*resampling not needed for MDCT cores*/ ) + { + /* move the resampling out of the TDBWE path as new_swb_speech is not needed for TDBWE. */ + mvr2r( st->input, hBWE_FD->old_fdbwe_speech, L_FRAME48k ); + } + else + { + if ( st->last_extl != SWB_BWE && st->last_extl != FB_BWE ) + { + /* resample 48 kHz to 32kHz */ + if ( st->last_bwidth == FB ) + { + inner_frame = L_FRAME48k; + inner_Fs = 48000; + mvr2r( hBWE_FD->old_fdbwe_speech, new_swb_speech, L_FRAME48k ); + } + else + { + inner_frame = L_FRAME32k; + inner_Fs = 32000; + + if ( st->element_mode != IVAS_CPE_DFT ) + { + decimate_2_over_3_allpass( hBWE_FD->old_fdbwe_speech, L_FRAME48k, new_swb_speech, hBWE_TD->dec_2_over_3_mem, hBWE_TD->dec_2_over_3_mem_lp ); + } + else + { + lerp_flt( hBWE_FD->old_fdbwe_speech, new_swb_speech, inner_frame, L_FRAME48k ); + } + + if ( st->element_mode == IVAS_CPE_DFT && st->idchan == 0 ) + { + for ( i = 0; i < STEREO_DFT_OVL_32k; i++ ) + { + hCPE->hStereoDft->output_mem_dmx_32k[i] = new_swb_speech[inner_frame - STEREO_DFT_OVL_32k + i] * hCPE->hStereoDft->win_32k[STEREO_DFT_OVL_32k - 1 - i]; + } + } + } + + Sample_Delay_SWB_BWE = NS2SA( inner_Fs, DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ); + if ( st->element_mode > EVS_MONO && st->L_frame == L_FRAME16k ) + { + Sample_Delay_SWB_BWE = NS2SA( inner_Fs, DELAY_FD_BWE_ENC_16k_NS + DELAY_FIR_RESAMPL_NS ); + } + if ( st->element_mode > EVS_MONO ) + { + Sample_Delay_SWB_BWE -= NS2SA( inner_Fs, DELAY_FIR_RESAMPL_NS ); + } + + mvr2r( new_swb_speech, &old_input[Sample_Delay_SWB_BWE], inner_frame ); + set_f( old_input, 0, Sample_Delay_SWB_BWE ); + mvr2r( new_swb_speech + inner_frame - Sample_Delay_SWB_BWE, hBWE_FD->old_input, Sample_Delay_SWB_BWE ); + mvr2r( old_input, hBWE_FD->old_wtda_swb, inner_frame ); + } + + /* resample 48 kHz to 32kHz */ + if ( st->bwidth == FB ) + { + mvr2r( st->input, new_swb_speech, L_FRAME48k ); + } + else + { + if ( st->element_mode == IVAS_CPE_TD ) + { + float dec_2_over_3_mem_tmp[L_FILT_2OVER3], dec_2_over_3_mem_lp_tmp[L_FILT_2OVER3_LP]; + + decimate_2_over_3_allpass( st->input, L_FRAME48k - hCPE->hStereoTCA->lMemRecalc, new_swb_speech, hBWE_TD->dec_2_over_3_mem, hBWE_TD->dec_2_over_3_mem_lp ); + + mvr2r( hBWE_TD->dec_2_over_3_mem, dec_2_over_3_mem_tmp, L_FILT_2OVER3 ); + mvr2r( hBWE_TD->dec_2_over_3_mem_lp, dec_2_over_3_mem_lp_tmp, L_FILT_2OVER3_LP ); + + decimate_2_over_3_allpass( st->input + L_FRAME48k - hCPE->hStereoTCA->lMemRecalc, hCPE->hStereoTCA->lMemRecalc, new_swb_speech + L_FRAME32k - lMemRecalc32k, dec_2_over_3_mem_tmp, dec_2_over_3_mem_lp_tmp ); + } + else if ( st->element_mode != IVAS_CPE_DFT ) + { + decimate_2_over_3_allpass( st->input, L_FRAME48k, new_swb_speech, hBWE_TD->dec_2_over_3_mem, hBWE_TD->dec_2_over_3_mem_lp ); + } + else /* IVAS_CPE_DFT */ + { + /*flt2fix*/ + f2me_buf( hCPE->hStereoDft->DFT[0], hCPE->hStereoDft->DFT_fx[0], &hCPE->hStereoDft->DFT_fx_e[0], STEREO_DFT_N_MAX_ENC ); + f2me_buf( hCPE->hStereoDft->DFT[1], hCPE->hStereoDft->DFT_fx[1], &hCPE->hStereoDft->DFT_fx_e[1], STEREO_DFT_N_MAX_ENC ); + f2me( hCPE->hStereoDft->icbweRefEner, &hCPE->hStereoDft->icbweRefEner_fx, &hCPE->hStereoDft->icbweRefEner_fx_e ); + f2me( hCPE->hStereoDft->lbEner, &hCPE->hStereoDft->lbEner_fx, &hCPE->hStereoDft->lbEner_fx_e ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_res_8k, hCPE->hStereoDft->output_mem_res_8k_fx, 16, STEREO_DFT_OVL_8k ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx, hCPE->hStereoDft->output_mem_dmx_fx, 16, STEREO_DFT_OVL_MAX ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_12k8, hCPE->hStereoDft->output_mem_dmx_12k8_fx, 16, STEREO_DFT_OVL_12k8 ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_16k, hCPE->hStereoDft->output_mem_dmx_16k_fx, 16, STEREO_DFT_OVL_16k ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_16k_shb, hCPE->hStereoDft->output_mem_dmx_16k_shb_fx, 16, STEREO_DFT_OVL_16k ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_32k, hCPE->hStereoDft->output_mem_dmx_32k_fx, 16, STEREO_DFT_OVL_32k ); + /*flt2fix end*/ + + Word16 out_start_ind, out_end_ind; + stereo_dft_enc_synthesize_fx( hCPE->hStereoDft, new_swb_speech_fx, &out_start_ind, &out_end_ind, st->idchan, input_Fs, 32000, 0, NULL ); + + /*fix2flt*/ + hCPE->hStereoDft->icbweRefEner = me2f( hCPE->hStereoDft->icbweRefEner_fx, hCPE->hStereoDft->icbweRefEner_fx_e ); + hCPE->hStereoDft->lbEner = me2f( hCPE->hStereoDft->lbEner_fx, hCPE->hStereoDft->lbEner_fx_e ); + fixedToFloat_arrL( new_swb_speech_fx + out_start_ind, new_swb_speech + out_start_ind, 16, out_end_ind - out_start_ind ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_res_8k_fx, hCPE->hStereoDft->output_mem_res_8k, 16, STEREO_DFT_OVL_8k ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_fx, hCPE->hStereoDft->output_mem_dmx, 16, STEREO_DFT_OVL_MAX ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_12k8_fx, hCPE->hStereoDft->output_mem_dmx_12k8, 16, STEREO_DFT_OVL_12k8 ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_16k_fx, hCPE->hStereoDft->output_mem_dmx_16k, 16, STEREO_DFT_OVL_16k ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_16k_shb_fx, hCPE->hStereoDft->output_mem_dmx_16k_shb, 16, STEREO_DFT_OVL_16k ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_32k_fx, hCPE->hStereoDft->output_mem_dmx_32k, 16, STEREO_DFT_OVL_32k ); + /*fix2flt end*/ + + mvr2r( new_swb_speech - Sample_Delay_SWB_BWE32k, hBWE_FD->old_input, Sample_Delay_SWB_BWE32k ); + } + } + } + } + else + { + /* resample 48 kHz to 32kHz */ + if ( st->bwidth == FB ) + { + mvr2r( st->input, new_swb_speech, L_FRAME48k ); + } + else + { + decimate_2_over_3_allpass( st->input, L_FRAME48k, new_swb_speech, hBWE_TD->dec_2_over_3_mem, hBWE_TD->dec_2_over_3_mem_lp ); + } + } + } + + if ( ( st->core == ACELP_CORE && st->extl != SWB_BWE_HIGHRATE && st->extl != FB_BWE_HIGHRATE ) || + ( ( st->total_brate == ACELP_9k60 || st->rf_mode ) && st->bwidth == SWB && st->element_mode == EVS_MONO ) ) + { + float CldfbHB = 0; + Word32 CldfbHB_fx = 0; // fixed counterpart + Word16 CldfbHB_fx_e = 0; // fixed counterpart + + if ( st->element_mode == IVAS_CPE_DFT ) + { + + /*flt2fix*/ + f2me_buf( hCPE->hStereoDft->DFT[0], hCPE->hStereoDft->DFT_fx[0], &hCPE->hStereoDft->DFT_fx_e[0], STEREO_DFT_N_MAX_ENC ); + f2me_buf( hCPE->hStereoDft->DFT[1], hCPE->hStereoDft->DFT_fx[1], &hCPE->hStereoDft->DFT_fx_e[1], STEREO_DFT_N_MAX_ENC ); + f2me( hCPE->hStereoDft->icbweRefEner, &hCPE->hStereoDft->icbweRefEner_fx, &hCPE->hStereoDft->icbweRefEner_fx_e ); + f2me( hCPE->hStereoDft->lbEner, &hCPE->hStereoDft->lbEner_fx, &hCPE->hStereoDft->lbEner_fx_e ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_res_8k, hCPE->hStereoDft->output_mem_res_8k_fx, 16, STEREO_DFT_OVL_8k ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx, hCPE->hStereoDft->output_mem_dmx_fx, 16, STEREO_DFT_OVL_MAX ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_12k8, hCPE->hStereoDft->output_mem_dmx_12k8_fx, 16, STEREO_DFT_OVL_12k8 ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_16k, hCPE->hStereoDft->output_mem_dmx_16k_fx, 16, STEREO_DFT_OVL_16k ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_16k_shb, hCPE->hStereoDft->output_mem_dmx_16k_shb_fx, 16, STEREO_DFT_OVL_16k ); + floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_32k, hCPE->hStereoDft->output_mem_dmx_32k_fx, 16, STEREO_DFT_OVL_32k ); + /*flt2fix end*/ + + Word16 out_start_ind, out_end_ind; + CldfbHB_fx = stereo_dft_enc_synthesize_fx( hCPE->hStereoDft, old_input_fx + STEREO_DFT_OVL_16k, &out_start_ind, &out_end_ind, st->idchan, input_Fs, 16000, st->L_frame, &CldfbHB_fx_e ); + + /*fix2flt*/ + CldfbHB = me2f( CldfbHB_fx, CldfbHB_fx_e ); + hCPE->hStereoDft->icbweRefEner = me2f( hCPE->hStereoDft->icbweRefEner_fx, hCPE->hStereoDft->icbweRefEner_fx_e ); + hCPE->hStereoDft->lbEner = me2f( hCPE->hStereoDft->lbEner_fx, hCPE->hStereoDft->lbEner_fx_e ); + fixedToFloat_arrL( old_input_fx + STEREO_DFT_OVL_16k + out_start_ind, old_input + STEREO_DFT_OVL_16k + out_start_ind, 16, out_end_ind - out_start_ind ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_res_8k_fx, hCPE->hStereoDft->output_mem_res_8k, 16, STEREO_DFT_OVL_8k ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_fx, hCPE->hStereoDft->output_mem_dmx, 16, STEREO_DFT_OVL_MAX ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_12k8_fx, hCPE->hStereoDft->output_mem_dmx_12k8, 16, STEREO_DFT_OVL_12k8 ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_16k_fx, hCPE->hStereoDft->output_mem_dmx_16k, 16, STEREO_DFT_OVL_16k ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_16k_shb_fx, hCPE->hStereoDft->output_mem_dmx_16k_shb, 16, STEREO_DFT_OVL_16k ); + fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_32k_fx, hCPE->hStereoDft->output_mem_dmx_32k, 16, STEREO_DFT_OVL_32k ); + /*fix2flt end*/ + + /* delay corresponding to CLDFB delay */ + mvr2r( old_input + STEREO_DFT_OVL_16k - 20, shb_speech, L_FRAME16k ); + mvr2r( old_input, hBWE_TD->old_speech_shb + L_LOOK_16k + L_SUBFR16k - ( STEREO_DFT_OVL_16k - 20 ), STEREO_DFT_OVL_16k - 20 ); + mvr2r( old_input, hCPE->hStereoICBWE->mem_shb_speech_ref, STEREO_DFT_OVL_16k - 20 ); + + if ( CldfbHB <= 0 ) + { + CldfbHB = 1.0f; + } + hBWE_TD->cldfbHBLT_flt = 0.9f * hBWE_TD->cldfbHBLT_flt + 0.1f * ( 0.221462f /*=1/log10(32768)*/ * ( log10f( CldfbHB ) - 1.0f ) ); + + lbEner = 0.05f * (float) sqrt( hCPE->hStereoDft->lbEner ); + hCPE->hStereoICBWE->icbweRefEner = 0.05f * (float) sqrt( hCPE->hStereoDft->icbweRefEner ); + lbEner = 0.05f * (float) sqrt( hCPE->hStereoDft->lbEner ); + thr = icbwe_thr_DFT; + regV = icbwe_regressionValuesDFT; + } + else + { + if ( st->L_frame == L_FRAME ) + { + startB = 34; + endB = 14; + for ( ts = 0; ts < CLDFB_NO_COL_MAX; ts++ ) + { + for ( nB = startB, uB = 0; nB > endB; nB--, uB++ ) + { + sign = ( ts % 2 ) ? 1.0f : -1.0f; + realBufferFlipped[ts][uB] = -sign * realBuffer[ts][nB]; + imagBufferFlipped[ts][uB] = sign * imagBuffer[ts][nB]; + } + } + } + else + { + startB = 39; + endB = 19; + for ( ts = 0; ts < CLDFB_NO_COL_MAX; ts++ ) + { + for ( nB = startB, uB = 0; nB > endB; nB--, uB++ ) + { + realBufferFlipped[ts][uB] = -realBuffer[ts][nB]; + imagBufferFlipped[ts][uB] = imagBuffer[ts][nB]; + } + } + } + + for ( nB = 0; nB < 10; nB++ ) + { + for ( ts = 0; ts < CLDFB_NO_COL_MAX; ts++ ) + { + CldfbHB += ( realBufferFlipped[ts][nB] * realBufferFlipped[ts][nB] + imagBufferFlipped[ts][nB] * imagBufferFlipped[ts][nB] ); + } + } + if ( CldfbHB <= 0 ) + { + CldfbHB = 1.0f; + } + hBWE_TD->cldfbHBLT_flt = 0.9f * hBWE_TD->cldfbHBLT_flt + 0.1f * ( 0.221462f /*=1/log10(32768)*/ * ( log10f( CldfbHB ) - 1.0f ) ); + + if ( st->element_mode >= IVAS_CPE_DFT && hCPE->hStereoICBWE != NULL ) + { + hCPE->hStereoICBWE->icbweRefEner = EPSILON; + for ( nB = 20; nB < 40; nB++ ) + { + for ( ts = 0; ts < CLDFB_NO_COL_MAX; ts++ ) + { + hCPE->hStereoICBWE->icbweRefEner += ( realBuffer[ts][nB] * realBuffer[ts][nB] + imagBuffer[ts][nB] * imagBuffer[ts][nB] ); + } + } + hCPE->hStereoICBWE->icbweRefEner = 0.05f * sqrtf( hCPE->hStereoICBWE->icbweRefEner ); + } + + lbEner = EPSILON; + for ( nB = 0; nB < 20; nB++ ) + { + for ( ts = 0; ts < CLDFB_NO_COL_MAX; ts++ ) + { + lbEner += ( realBuffer[ts][nB] * realBuffer[ts][nB] + imagBuffer[ts][nB] * imagBuffer[ts][nB] ); + } + } + lbEner = 0.05f * sqrtf( lbEner ); + thr = icbwe_thr_TDM; + regV = icbwe_regressionValuesTDM; + + cldfbSynthesis_ivas( realBufferFlipped, imagBufferFlipped, shb_speech, -1, st->cldfbSynTd ); + } + + if ( st->element_mode >= IVAS_CPE_DFT && hCPE->hStereoICBWE != NULL ) + { + hCPE->hStereoICBWE->MSFlag = 0; /* Init the multi-source flag */ + v = 0.3333f * sum_f( st->voicing, 3 ); + t = log10f( ( hCPE->hStereoICBWE->icbweRefEner + 1e-6f ) / ( lbEner + 1e-6f ) ); + + /* Three Level Decision Tree to calculate a regression value first */ + if ( t < thr[0] ) /* level 1 */ + { + if ( t < thr[1] ) /* level 2 */ + { + regression = ( v < thr[3] ) ? regV[0] : regV[1]; /* level 3 */ + } + else + { + regression = ( v < thr[4] ) ? regV[2] : regV[3]; /* level 3 */ + } + } + else + { + if ( t < thr[2] ) /* level 2 */ + { + regression = ( v < thr[5] ) ? regV[4] : regV[5]; /* level 3 */ + } + else + { + regression = ( v < thr[6] ) ? regV[6] : regV[7]; /* level 3 */ + } + } + + /* Convert the regression to a hard decision (classification) */ + if ( regression > 0.79f && !( st->bwidth < SWB || hCPE->hCoreCoder[0]->vad_flag == 0 ) ) + { + hCPE->hStereoICBWE->MSFlag = 1; + } + } + + if ( st->extl != WB_TBE && st->extl != SWB_TBE && st->extl != FB_TBE ) + { + /* Update the previous superwideband speech buffer in case of a SWB_BWE frame - this code is in swb_tbe_enc */ + delay = L_LOOK_16k + L_SUBFR16k; + mvr2r( shb_speech + L_FRAME16k - delay, hBWE_TD->old_speech_shb, delay ); + } + } + else + { + if ( ( st->bwidth == FB || st->core == ACELP_CORE ) && ( st->element_mode == EVS_MONO ) ) + { + InitSWBencBufferStates( st->hBWE_TD, shb_speech ); + } + else + { + if ( st->element_mode == IVAS_CPE_DFT ) + { + if ( st->L_frame == L_FRAME ) + { + L_resamp = 560; /* 6.4 kHz core -> 6 - 14 kHz SHB target. 20 ms is 560 samples in 28 kHz sample rate */ + } + else + { + L_resamp = 620; /* 8 kHz core -> 7.5 - 15.5 kHz SHB target. 20 ms is 620 samples in 31 kHz sample rate */ + } + + /* Dirty downsampling to match Nyquist to upper frequency limit of target */ + lerp_flt( st->input, new_swb_speech, L_resamp, (int16_t) ( input_Fs / 50 ) ); + + /* flip the spectrum */ + mvr2r( new_swb_speech, spchTmp, L_resamp ); + for ( i = 0; i < L_resamp; i = i + 2 ) + { + spchTmp[i] = -spchTmp[i]; + } + + /* Dirty upsampling to match Nyquist/2 to lower frequency limit of target (reversed spectrum)*/ + lerp_flt( spchTmp, spchTmp2, L_FRAME32k, L_resamp ); + mvr2r( spchTmp2, spchTmp, L_FRAME32k ); + } + else + { + /* flip the spectrum */ + mvr2r( new_swb_speech, spchTmp, L_FRAME32k ); + + for ( i = 0; i < L_FRAME32k; i = i + 2 ) + { + spchTmp[i] = -spchTmp[i]; + } + } + + Decimate_allpass_steep( spchTmp, hBWE_TD->state_ana_filt_shb, L_FRAME32k, shb_speech ); + + mvr2r( shb_speech + L_FRAME16k - ( L_LOOK_16k + L_SUBFR16k ), hBWE_TD->old_speech_shb, L_LOOK_16k + L_SUBFR16k ); + + /*Compute the past overlap for potential next iDFTs SHB*/ + if ( st->element_mode == IVAS_CPE_DFT ) + { + for ( i = 0; i < STEREO_DFT_OVL_16k; i++ ) + { + hCPE->hStereoDft->output_mem_dmx_16k_shb[i] = shb_speech[20 + i] * hCPE->hStereoDft->win_ana_16k[STEREO_DFT_OVL_16k - 1 - i] * hCPE->hStereoDft->win_ana_16k[STEREO_DFT_OVL_16k - 1 - i]; + } + } + } + + if ( st->element_mode != IVAS_CPE_DFT ) + { + /* Reset CLDFB synthesis buffer */ + set_f( st->cldfbSynTd->cldfb_state, 0.0f, st->cldfbSynTd->p_filter_length ); + } + else + { + hCPE->hStereoDft->flip_sign = -hCPE->hStereoDft->flip_sign; /* Make sure sign is updated even if DFT SHB target is not generated */ + } + } + + /* Memory reset to compensate for 0.9375 ms offset when transitioning from IO to SWB */ + /* When switching from n >1 to n = 1, we keep the enc/dec delay as 8.75/3.25 and below code not needed; + only when n = 1 start, it will be 9.6875/2.3125 in that case this reset is needed for IO->BWE.*/ + if ( st->last_extl == -1 && st->element_mode == EVS_MONO ) + { + delay = NS2SA( input_Fs, DELAY_FIR_RESAMPL_NS ); + for ( i = 0; i < delay; i++ ) + { + shb_speech[i] = (float) i * ( 0.03f * shb_speech[2 * delay - 1 - i] ); + } + } + + return; +} +#endif void swb_pre_proc( Encoder_State *st, /* i/o: encoder state structure */ float *new_swb_speech, /* o : original input signal at 32kHz */ -- GitLab From 1c69d8b9b63d798c4af87d88aa437727fe106200 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 19 Jul 2024 14:45:39 +0530 Subject: [PATCH 086/110] Clang formatting changes --- lib_enc/ivas_core_enc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index 0d39208e7..37b321bb5 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -862,4 +862,4 @@ ivas_error ivas_core_enc( return error; } -#endif \ No newline at end of file +#endif -- GitLab From e8e88453f47c057b74f1bf847f3037641cf334cb Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 19 Jul 2024 15:07:34 +0530 Subject: [PATCH 087/110] Fix for crashes observed with scaled inputs in LTV test [x] Fixes issue for: +10dB 1 ISM with metadata bitrate switching from 13.2 kbps to 128 kbps, 32 kHz in, 32 kHz out, EXT out, DTX on -10dB 4 ISM with and without extended metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, EXT out 4 ISM with and without metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, HOA3 out [x] Changes done in Q for generate_comfort_noise_dec_hf_ivas_fx and vas_ism_param_dec_tc_gain_ajust_fx updated with additional checks. --- lib_dec/fd_cng_dec_fx.c | 14 +++++++------- lib_dec/ivas_ism_param_dec.c | 19 ++++++++++++++----- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 4a13837b1..df0da5137 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -4479,7 +4479,7 @@ void generate_comfort_noise_dec_hf_ivas_fx( move16(); } - randGaussExp = CNG_RAND_GAUSS_SHIFT; + randGaussExp = add( CNG_RAND_GAUSS_SHIFT, 1 ); move16(); /* @@ -4503,16 +4503,16 @@ void generate_comfort_noise_dec_hf_ivas_fx( IF( cng_coh_flag ) { - tmp1 = rand_gauss( seed ); - tmp2 = rand_gauss( seed2 ); + rand_gauss_fx( &tmp1, seed, Q28 ); + rand_gauss_fx( &tmp2, seed2, Q28 ); bufferReal[i][j] = L_add( Mpy_32_16_1( tmp1, c1 ), Mpy_32_16_1( tmp2, c2 ) ); move32(); bufferReal[i][j] = L_shl( Mpy_32_32( bufferReal[i][j], sqrtNoiseLevel ), s ); move32(); - tmp1 = rand_gauss( seed ); - tmp2 = rand_gauss( seed2 ); + rand_gauss_fx( &tmp1, seed, Q28 ); + rand_gauss_fx( &tmp2, seed2, Q28 ); bufferImag[i][j] = L_add( Mpy_32_16_1( tmp1, c1 ), Mpy_32_16_1( tmp2, c2 ) ); move32(); @@ -4522,11 +4522,11 @@ void generate_comfort_noise_dec_hf_ivas_fx( ELSE { /* Real part in CLDFB band */ - bufferReal[i][j] = L_shl( Mpy_32_32( rand_gauss( seed ), sqrtNoiseLevel ), s ); + bufferReal[i][j] = L_shl( Mpy_32_32( L_shr( rand_gauss( seed ), 1 ), sqrtNoiseLevel ), s ); move32(); /* Imaginary part in CLDFB band */ - bufferImag[i][j] = L_shl( Mpy_32_32( rand_gauss( seed ), sqrtNoiseLevel ), s ); + bufferImag[i][j] = L_shl( Mpy_32_32( L_shr( rand_gauss( seed ), 1 ), sqrtNoiseLevel ), s ); move32(); } } diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 3f1cfbd1f..e6d2085b3 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -2591,11 +2591,20 @@ void ivas_ism_param_dec_tc_gain_ajust_fx( } ELSE { - /*handling denominator equals to zero*/ - gain_fx = 1; - move16(); - tmp_e1 = -32767; - move16(); + IF( ene_tc_fx == 0 ) /*handling numerator equals to zero*/ + { + gain_fx = 0; + move16(); + tmp_e1 = 31; + move16(); + } + ELSE + { /*handling denominator equals to zero*/ + gain_fx = 1; + move16(); + tmp_e1 = -32767; + move16(); + } } tmp_e1 = add( tmp_e1, sub( ene_tc_e, ene_sum_e ) ); /* tmp_e1 + (ene_tc_e - ene_sum_e)*/ gain_fx = Sqrt16( gain_fx, &tmp_e1 ); -- GitLab From 86cd1d0559112753f4a9a21c507dd44abbfe286f Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 19 Jul 2024 21:28:53 +0530 Subject: [PATCH 088/110] Matrix product update to fix LTV crash issue [x] Fixes Test case - 10dB neg ltv-OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out and 10dB neg ltv-OMASA 2Dir2TC 4ISM at br sw techs 13.2 to 512 kbps start 384 kbps, 48kHz in, 16kHz out, BINAURAL out (Model from file) --- lib_com/ivas_tools.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index 0fd41f02f..6fecaa54f 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -1775,7 +1775,7 @@ Word16 matrix_product_q30_fx( W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); // Q56 } W_tmp = W_shl( W_tmp, 6 ); - ( *Zp_fx ) = L_sub( W_round64_L( W_tmp ), 64 ); // adjusting for precision + ( *Zp_fx ) = W_round64_L( W_tmp ); move32(); Zp_fx++; } @@ -1802,7 +1802,7 @@ Word16 matrix_product_q30_fx( W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); // Q56 } W_tmp = W_shl( W_tmp, 6 ); - ( *Zp_fx ) = L_sub( W_round64_L( W_tmp ), 64 ); // adjusting for precision + ( *Zp_fx ) = W_round64_L( W_tmp ); move32(); Zp_fx++; } @@ -1830,7 +1830,7 @@ Word16 matrix_product_q30_fx( } W_tmp = W_shl( W_tmp, 6 ); - ( *Zp_fx ) = L_sub( W_round64_L( W_tmp ), 64 ); // adjusting for precision + ( *Zp_fx ) = W_round64_L( W_tmp ); move32(); Zp_fx++; } @@ -1858,7 +1858,7 @@ Word16 matrix_product_q30_fx( W_tmp = W_add( W_tmp, W_mult0_32_32( X_fx[x_idx], Y_fx[y_idx] ) ); // Q56 } W_tmp = W_shl( W_tmp, 6 ); - ( *Zp_fx ) = L_sub( W_round64_L( W_tmp ), 64 ); // adjusting for precision + ( *Zp_fx ) = W_round64_L( W_tmp ); move32(); Zp_fx++; } -- GitLab From 02f044cc0a7eb13ac31e7490420f70a21be48e08 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 22 Jul 2024 20:04:08 +0530 Subject: [PATCH 089/110] BASOP changes for lib_com files --- lib_com/ivas_fb_mixer.c | 4 + lib_com/ivas_prot.h | 14 +- lib_com/ivas_prot_fx.h | 22 + lib_com/ivas_spar_com.c | 1281 ++++++++++++++++--------- lib_com/ivas_stereo_dft_com.c | 12 +- lib_com/ivas_stereo_eclvq_com_fx.c | 5 + lib_com/ivas_stereo_ica_com_fx.c | 124 ++- lib_com/ivas_stereo_mdct_bands_com.c | 113 ++- lib_com/ivas_stereo_mdct_stereo_com.c | 4 +- lib_com/ivas_stereo_psychlpc_com.c | 14 +- lib_com/ivas_stereo_td_bit_alloc.c | 620 +++++++----- lib_com/ivas_transient_det.c | 115 ++- lib_com/lag_wind.c | 5 +- lib_dec/ivas_sba_dec.c | 4 + lib_dec/ivas_spar_decoder.c | 4 + lib_enc/ivas_mct_core_enc.c | 4 + lib_enc/ivas_osba_enc.c | 4 + lib_enc/ivas_sba_enc.c | 4 + lib_enc/ivas_spar_encoder.c | 8 + lib_enc/ivas_spar_md_enc.c | 4 + 20 files changed, 1549 insertions(+), 816 deletions(-) diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index 59b62491c..d448ed8de 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -116,7 +116,11 @@ int16_t ivas_get_num_bands_from_bw_idx( static Word16 ivas_get_num_bands( const Word32 sampling_rate ) { +#ifdef IVAS_FLOAT_FIXED + Word16 bwidth = ivas_get_bw_idx_from_sample_rate_fx( sampling_rate ); +#else Word16 bwidth = ivas_get_bw_idx_from_sample_rate( sampling_rate ); +#endif Word16 num_active_bands = ivas_get_num_bands_from_bw_idx( bwidth ); return num_active_bands; diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index e476e3a49..3cfacb4b1 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5492,13 +5492,13 @@ ivas_error ivas_spar_dec( ); void ivas_spar_config( - int32_t ivas_total_brate, /* i : codec total bitrate */ - const int16_t sba_order, /* i : Ambisonic (SBA) order */ - int16_t *nchan_transport, /* o : number of transport channels */ - int16_t *nSCE, /* o : number of SCEs */ - int16_t *nCPE, /* o : number of CPEs */ - int32_t *core_nominal_brate, /* o : core-coding nominal bitrate */ - const int16_t sid_format /* i : IVAS format indicator from SID frame */ + int32_t ivas_total_brate, /* i : codec total bitrate */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + int16_t *nchan_transport, /* o : number of transport channels */ + int16_t *nSCE, /* o : number of SCEs */ + int16_t *nCPE, /* o : number of CPEs */ + int32_t *core_nominal_brate, /* o : core-coding nominal bitrate */ + const int16_t sid_format /* i : IVAS format indicator from SID frame */ ); #ifdef IVAS_FLOAT_FIXED ivas_error ivas_sba_linear_renderer_fx( diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index c24ad3237..9ea7a8264 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -2517,3 +2517,25 @@ void stereo_coder_tcx_fx( const Word16 mct_on, /* i : flag mct block (1) or stereo (0) */ Word16 q_spec ); #endif + +void ivas_spar_config_fx( + Word32 ivas_total_brate, /* i : codec total bitrate */ + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + Word16 *nchan_transport, /* o : number of transport channels */ + Word16 *nSCE, /* o : number of SCEs */ + Word16 *nCPE, /* o : number of CPEs */ + Word32 *core_nominal_brate, /* o : core-coding nominal bitrate */ + const Word16 sid_format /* i : IVAS format indicator from SID frame */ +); + +Word16 ivas_get_bw_idx_from_sample_rate_fx( + const Word32 sampling_rate /* i : sampling rate */ +); + +void ivas_spar_bitrate_dist_fx( + Word32 core_brates_act[], /* o : bitrates per core-coder */ + const Word16 nAvailBits, /* i : number of available bits */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + const Word16 bwidth /* i : audio bandwidth */ +); diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 485424125..2a29c6074 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -128,6 +128,7 @@ static void ivas_calc_mat_inv( float in_re[MAX_MAT_DIM][MAX_MAT_DIM], const int1 *-----------------------------------------------------------------------------------------*/ /*! r: audio BW index */ +#ifndef IVAS_FLOAT_FIXED int16_t ivas_get_bw_idx_from_sample_rate( const int32_t sampling_rate /* i : sampling rate */ ) @@ -152,6 +153,35 @@ int16_t ivas_get_bw_idx_from_sample_rate( return bwidth; } +#else +Word16 ivas_get_bw_idx_from_sample_rate_fx( + const Word32 sampling_rate /* i : sampling rate */ +) +{ + Word16 bwidth = 0; + move16(); + + SWITCH( sampling_rate ) + { + case 16000: + bwidth = WB; + move16(); + BREAK; + case 32000: + bwidth = SWB; + move16(); + BREAK; + case 48000: + bwidth = FB; + move16(); + BREAK; + default: + assert( !"Unsupported sample rate!" ); + } + + return bwidth; +} +#endif /*------------------------------------------------------------------------- * ivas_spar_config() @@ -159,6 +189,7 @@ int16_t ivas_get_bw_idx_from_sample_rate( * SPAR configuration function *------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ivas_spar_config( int32_t ivas_total_brate, /* i : codec total bitrate */ const int16_t sba_order, /* i : Ambisonic (SBA) order */ @@ -217,6 +248,84 @@ void ivas_spar_config( return; } +#else +void ivas_spar_config_fx( + Word32 ivas_total_brate, /* i : codec total bitrate */ + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + Word16 *nchan_transport, /* o : number of transport channels */ + Word16 *nSCE, /* o : number of SCEs */ + Word16 *nCPE, /* o : number of CPEs */ + Word32 *core_nominal_brate, /* o : core-coding nominal bitrate */ + const Word16 sid_format /* i : IVAS format indicator from SID frame */ +) +{ + IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) + { + IF( EQ_16( sid_format, SID_SBA_1TC ) ) + { + *nchan_transport = 1; + move16(); + } + ELSE + { + *nchan_transport = 2; + move16(); + } + } + ELSE + { + *nchan_transport = ivas_get_sba_num_TCs( ivas_total_brate, sba_order ); + move16(); + } + + IF( GT_16( *nchan_transport, 1 ) ) + { + *nCPE = shr( add( *nchan_transport, 1 ), 1 ); + move16(); + } + ELSE + { + *nCPE = 0; + move16(); + } + + *nSCE = max( 0, sub( *nchan_transport, shl( *nCPE, 1 ) ) ); + move16(); + + IF( EQ_16( *nchan_transport, 1 ) ) + { + /* map SPAR SID bitrate to SPAR active bitrate */ + IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) + { + ivas_total_brate = IVAS_32k; + move32(); + } + assert( ivas_total_brate == IVAS_32k || ivas_total_brate == IVAS_24k4 || ivas_total_brate == IVAS_16k4 || ivas_total_brate == IVAS_13k2 ); + IF( EQ_32( ivas_total_brate, IVAS_32k ) ) + { + *core_nominal_brate = ACELP_24k40; + move32(); + } + ELSE IF( EQ_32( ivas_total_brate, IVAS_24k4 ) ) + { + *core_nominal_brate = ACELP_16k40; + move32(); + } + ELSE IF( EQ_32( ivas_total_brate, IVAS_16k4 ) ) + { + *core_nominal_brate = ACELP_13k20; + move32(); + } + ELSE IF( EQ_32( ivas_total_brate, IVAS_13k2 ) ) + { + *core_nominal_brate = ACELP_9k60; + move32(); + } + } + + return; +} +#endif /*-----------------------------------------------------------------------------------------* * Function ivas_get_spar_table_idx() @@ -283,14 +392,21 @@ Word16 ivas_get_spar_table_idx_fx( { Word16 table_idx = 0, ind1[IVAS_SPAR_BR_TABLE_LEN]; Word16 i, j = 0, ind2 = -1; + move16(); + move16(); + move16(); FOR( i = 0; i < IVAS_SPAR_BR_TABLE_LEN; i++ ) { ind1[j] = 0; + move16(); + test(); IF( ( EQ_32( ivas_spar_br_table_consts[i].ivas_total_brate, ivas_total_brate ) ) && ( EQ_16( ivas_spar_br_table_consts[i].sba_order, sba_order ) ) ) { - ind1[j++] = i; + ind1[j] = i; + j = add( j, 1 ); + move16(); } } @@ -299,6 +415,7 @@ Word16 ivas_get_spar_table_idx_fx( IF( EQ_16( ivas_spar_br_table_consts[ind1[i]].bwidth, bwidth ) ) { ind2 = i; + move16(); BREAK; } } @@ -306,15 +423,18 @@ Word16 ivas_get_spar_table_idx_fx( assert( ind2 >= 0 ); /* to check if bw entry is present */ table_idx = ind1[ind2]; + move16(); IF( ind != NULL ) { *ind = ind2; + move16(); } IF( bitlen != NULL ) { - *bitlen = ivas_get_bits_to_encode( j - 1 ); + *bitlen = ivas_get_bits_to_encode( sub( j, 1 ) ); + move16(); } return table_idx; @@ -352,6 +472,7 @@ Word16 ivas_get_sba_num_TCs_fx( table_idx = ivas_get_spar_table_idx_fx( ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport; + move16(); return nchan_transport; } @@ -600,46 +721,67 @@ static void ivas_get_pred_coeffs_fx( Word16 pred_dim = sub( in_chans, 1 ); Word16 tmp_shift, prev_tmp_shift, s_div, div_shift; - w_norm_fac = EQ_16( from_dirac, 1 ) ? ONE_IN_Q29 : 3 * ONE_IN_Q29; // Q29 + IF( EQ_16( from_dirac, 1 ) ) + { + w_norm_fac = ONE_IN_Q29; + move32(); + } + ELSE + { + w_norm_fac = 3 * ONE_IN_Q29; + move32(); + } tmp_shift = Q30; - IF( EQ_16( active_w, 0 ) ) + move16(); + IF( active_w == 0 ) { Word32 pPred_temp[IVAS_MAX_NUM_BANDS]; Word16 q_pred_temp; prev_tmp_shift = 31; + move16(); set32_fx( pPred_temp, 0, IVAS_MAX_NUM_BANDS ); FOR( k = start_band; k < end_band; k++ ) { div_factor[k] = L_max( 1, cov_real[0][0][k] ); + move32(); tmp_shift = Q30; + move16(); IF( NE_32( cov_real[0][0][k], ONE_IN_Q30 ) ) { div_factor[k] = L_deposit_l( BASOP_Util_Divide3232_Scale( ONE_IN_Q31, div_factor[k], &s_div ) ); - if ( LT_16( s_div, 0 ) ) + move32(); + IF( s_div < 0 ) { - div_shift = 15 + ( s_div ); + div_shift = add( 15, s_div ); tmp_shift = Q30; + move16(); } - else + ELSE { div_shift = 15; - tmp_shift = Q30 - s_div; + move16(); + tmp_shift = sub( Q30, s_div ); } div_factor[k] = L_shl( div_factor[k], div_shift ); // Q = tmp_shift + move16(); IF( LT_16( tmp_shift, prev_tmp_shift ) ) { FOR( p = start_band; p < k; p++ ) { - div_factor[p] = L_shr( div_factor[p], prev_tmp_shift - tmp_shift ); + div_factor[p] = L_shr( div_factor[p], sub( prev_tmp_shift, tmp_shift ) ); + move32(); } prev_tmp_shift = tmp_shift; + move16(); } ELSE IF( GT_16( tmp_shift, prev_tmp_shift ) ) { - div_factor[k] = L_shr( div_factor[k], tmp_shift - prev_tmp_shift ); + div_factor[k] = L_shr( div_factor[k], sub( tmp_shift, prev_tmp_shift ) ); + move32(); tmp_shift = prev_tmp_shift; + move16(); } } } @@ -648,68 +790,87 @@ static void ivas_get_pred_coeffs_fx( { FOR( k = start_band; k < end_band; k++ ) { - ppPred_coeffs_re[i][k] = Mpy_32_32( cov_real[i + 1][0][k], div_factor[k] ); // Q30 + temp_shift - 31 => tmp_shift - 1 + ppPred_coeffs_re[i][k] = Mpy_32_32( cov_real[add( i, 1 )][0][k], div_factor[k] ); // Q30 + temp_shift - 31 => tmp_shift - 1 + move32(); // IVAS_CALCULATE_SQ_ABS_N( ppPred_coeffs_re[i][k], abs_value ); abs_value = Mpy_32_32( ppPred_coeffs_re[i][k], ppPred_coeffs_re[i][k] ); // Q = 2*tmp_shift - 2 - 31 pPred_temp[k] = L_add( pPred_temp[k], abs_value ); // Q= 2*tmp_shift - 2 - 31 + move32(); } } - *q_pred_coeffs = tmp_shift - 1; + *q_pred_coeffs = sub( tmp_shift, 1 ); + move16(); + FOR( k = start_band; k < end_band; k++ ) { - q_pred_temp = 31 - ( 2 * ( *q_pred_coeffs ) - 31 ); + q_pred_temp = sub( 31, sub( shl( *q_pred_coeffs, 1 ), 31 ) ); pPred_temp[k] = Sqrt32( pPred_temp[k], &q_pred_temp ); + move32(); IF( LT_16( q_pred_temp, 1 ) ) { - pPred_temp[k] = L_shr( pPred_temp[k], abs_s( q_pred_temp ) + 1 ); // Q30 + pPred_temp[k] = L_shr( pPred_temp[k], add( abs_s( q_pred_temp ), 1 ) ); // Q30 + move32(); q_pred_temp = 1; + move16(); } ELSE IF( GT_16( q_pred_temp, 1 ) ) { - pPred_temp[k] = L_shl( pPred_temp[k], abs_s( q_pred_temp ) - 1 ); // Q30 + pPred_temp[k] = L_shl( pPred_temp[k], sub( abs_s( q_pred_temp ), 1 ) ); // Q30 + move32(); q_pred_temp = 1; + move16(); } - one_in_q = L_shl( 1, ( 31 - q_pred_temp ) ); + one_in_q = L_shl( 1, sub( 31, q_pred_temp ) ); IF( LT_32( one_in_q, pPred_temp[k] ) ) { div_factor[k] = pPred_temp[k]; + move32(); div_factor[k] = L_deposit_l( BASOP_Util_Divide3232_Scale( one_in_q, div_factor[k], &s_div ) ); - if ( LT_16( s_div, 0 ) ) + move32(); + IF( s_div < 0 ) { - div_shift = 15 + ( s_div ); + div_shift = add( 15, s_div ); tmp_shift = Q30; + move16(); } - else + ELSE { div_shift = 15; - tmp_shift = Q30 - s_div; + move16(); + tmp_shift = sub( Q30, s_div ); } div_factor[k] = L_shl( div_factor[k], div_shift ); // Q = tmp_shift + move32(); } ELSE { div_factor[k] = one_in_q; - tmp_shift = ( 31 - q_pred_temp ); + move32(); + tmp_shift = sub( 31, q_pred_temp ); } IF( LT_16( tmp_shift, prev_tmp_shift ) ) { FOR( p = start_band; p < k; p++ ) { - div_factor[p] = L_shr( div_factor[p], prev_tmp_shift - tmp_shift ); + div_factor[p] = L_shr( div_factor[p], sub( prev_tmp_shift, tmp_shift ) ); + move32(); } prev_tmp_shift = tmp_shift; + move16(); } ELSE IF( GT_16( tmp_shift, prev_tmp_shift ) ) { - div_factor[k] = L_shr( div_factor[k], tmp_shift - prev_tmp_shift ); + div_factor[k] = L_shr( div_factor[k], sub( tmp_shift, prev_tmp_shift ) ); + move32(); tmp_shift = prev_tmp_shift; + move16(); } } @@ -718,11 +879,14 @@ static void ivas_get_pred_coeffs_fx( FOR( k = start_band; k < end_band; k++ ) { ppPred_coeffs_re[i][k] = Mpy_32_32( ppPred_coeffs_re[i][k], div_factor[k] ); // Q = q_pred_coeffs + tmp_shift -31 + move32(); ppDM_Fv_re[i][k] = 0; + move32(); } } - *q_pred_coeffs = *q_pred_coeffs + tmp_shift - 31; + *q_pred_coeffs = sub( add( *q_pred_coeffs, tmp_shift ), 31 ); *q_dm_fv_re = 0; + move16(); } ELSE { @@ -737,14 +901,21 @@ static void ivas_get_pred_coeffs_fx( prev_tmp_shift = 31; dm_alpha_e = 0; Word16 dm_beta_re_e = 0; + move32(); + move16(); + move16(); + move16(); + IF( EQ_16( dyn_active_w_flag, 1 ) ) { activew_quad_thresh = ONE_IN_Q29; + move32(); } ELSE { activew_quad_thresh = IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH_Q29; + move32(); } g_th_sq = Mpy_32_32( activew_quad_thresh, activew_quad_thresh ); // Q27 @@ -757,50 +928,65 @@ static void ivas_get_pred_coeffs_fx( // IVAS_CALCULATE_SQ_ABS_N( cov_real[i][0][k], abs_value ); abs_value = Mpy_32_32( cov_real[i][0][k], cov_real[i][0][k] ); // Q29 dm_alpha[k] = L_add( dm_alpha[k], abs_value ); // Q29 + move32(); } } FOR( k = start_band; k < end_band; k++ ) { - dm_alpha_e = 31 - Q29; + dm_alpha_e = sub( 31, Q29 ); dm_alpha[k] = Sqrt32( dm_alpha[k], &dm_alpha_e ); - IF( LT_16( dm_alpha_e, 0 ) ) + move32(); + IF( dm_alpha_e < 0 ) { dm_alpha[k] = L_shr( dm_alpha[k], abs_s( dm_alpha_e ) ); + move32(); dm_alpha_e = 0; + move16(); } - ELSE IF( GT_16( dm_alpha_e, 0 ) ) + ELSE IF( dm_alpha_e > 0 ) { dm_alpha[k] = L_shl( dm_alpha[k], abs_s( dm_alpha_e ) ); + move32(); dm_alpha_e = 0; + move16(); } div_factor[k] = L_max( dm_alpha[k], 1 ); + move32(); div_factor[k] = L_deposit_l( BASOP_Util_Divide3232_Scale( ONE_IN_Q31, div_factor[k], &s_div ) ); - if ( LT_16( s_div, 0 ) ) + move32(); + IF( s_div < 0 ) { - div_shift = 15 + ( s_div ); + div_shift = add( 15, s_div ); tmp_shift = Q30; + move16(); } - else + ELSE { div_shift = 15; - tmp_shift = Q30 - s_div; + move16(); + tmp_shift = sub( Q30, s_div ); } div_factor[k] = L_shl( div_factor[k], div_shift ); // Q = tmp_shift + move32(); IF( LT_16( tmp_shift, prev_tmp_shift ) ) { FOR( p = start_band; p < k; p++ ) { - div_factor[p] = L_shr( div_factor[p], prev_tmp_shift - tmp_shift ); + div_factor[p] = L_shr( div_factor[p], sub( prev_tmp_shift, tmp_shift ) ); + move32(); } prev_tmp_shift = tmp_shift; + move16(); } ELSE IF( GT_16( tmp_shift, prev_tmp_shift ) ) { - div_factor[k] = L_shr( div_factor[k], tmp_shift - prev_tmp_shift ); + div_factor[k] = L_shr( div_factor[k], sub( tmp_shift, prev_tmp_shift ) ); + move32(); tmp_shift = prev_tmp_shift; + move16(); } } @@ -809,16 +995,27 @@ static void ivas_get_pred_coeffs_fx( FOR( k = start_band; k < end_band; k++ ) { dm_v_re[i][k] = Mpy_32_32( cov_real[i + 1][0][k], div_factor[k] ); // Q30 + Qb - 31 = tmp_shift - 1 + move32(); } } - IF( EQ_16( dtx_vad, 0 ) ) + IF( dtx_vad == 0 ) { dm_f_local = IVAS_ACTIVEW_DM_F_DTX_Q30; + move32(); } ELSE { - dm_f_local = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_VLBR_Q30 : IVAS_ACTIVEW_DM_F_Q30; + IF( active_w_vlbr ) + { + dm_f_local = IVAS_ACTIVEW_DM_F_VLBR_Q30; + move32(); + } + ELSE + { + dm_f_local = IVAS_ACTIVEW_DM_F_Q30; + move32(); + } } FOR( b = start_band; b < end_band; b++ ) @@ -832,11 +1029,13 @@ static void ivas_get_pred_coeffs_fx( Word32 re; // IVAS_RMULT_FLOAT( cov_real[j + 1][k][b], dm_v_re[k - 1][b], re ); - re = Mpy_32_32( cov_real[j + 1][k][b], dm_v_re[k - 1][b] ); // Q30 + Q_div_factor - 1 - 31 - real[j] = L_add( real[j], re ); // tmp_shift - 2 + re = Mpy_32_32( cov_real[add( j, 1 )][k][b], dm_v_re[sub( k, 1 )][b] ); // Q30 + Q_div_factor - 1 - 31 + real[j] = L_add( real[j], re ); // tmp_shift - 2 + move32(); } } dm_beta_re = 0; + move32(); FOR( k = 0; k < pred_dim; k++ ) { Word32 re; @@ -845,37 +1044,45 @@ static void ivas_get_pred_coeffs_fx( dm_beta_re = L_add( dm_beta_re, re ); // Q = 2*tmp_shift - 3 - 31 } - dm_beta_re_e = 31 - ( 2 * tmp_shift - 3 - 31 ); + dm_beta_re_e = sub( 31, ( sub( sub( shl( tmp_shift, 1 ), 3 ), 31 ) ) ); dm_w = cov_real[0][0][b]; // Q30 + move32(); den_f = L_max( dm_w, 1 ); passive_g = L_deposit_l( BASOP_Util_Divide3232_Scale( dm_alpha[b], den_f, &s_div ) ); - div_shift = 15 - ( 31 - dm_alpha_e - Q30 ) + s_div - 1; + div_shift = add( ( sub( 15, ( sub( ( sub( 31, dm_alpha_e ) ), Q30 ) ) ) ), sub( s_div, 1 ) ); passive_g = L_shl( passive_g, div_shift ); // Q = 29 IF( EQ_16( dyn_active_w_flag, 1 ) ) { dm_alpha[b] = 0; + move32(); dm_w = 0; + move32(); FOR( i = 0; i < pred_dim; i++ ) { dm_v_re[i][b] = 0; + move32(); } IF( NE_16( sub( tmp_shift, 1 ), 31 ) ) { - dm_v_re[res_ind - 1][b] = L_shl( 1, sub( tmp_shift, 1 ) ); + dm_v_re[sub( res_ind, 1 )][b] = L_shl( 1, sub( tmp_shift, 1 ) ); + move32(); } ELSE { - dm_v_re[res_ind - 1][b] = MAX_32; + dm_v_re[sub( res_ind, 1 )][b] = MAX_32; + move32(); } passive_g = activew_quad_thresh; + move32(); } IF( LT_32( passive_g, activew_quad_thresh ) ) { /*linear activeW*/ dm_y = 0; + move32(); FOR( k = 1; k < in_chans; k++ ) { @@ -885,31 +1092,37 @@ static void ivas_get_pred_coeffs_fx( den_f = L_max( den_f, Mpy_32_32( w_norm_fac, dm_w ) ); // Q28 DM_F[b] = L_deposit_l( BASOP_Util_Divide3232_Scale( Mpy_32_32( dm_f_local, dm_alpha[b] ), den_f, &s_div ) ); // Q30 + 31 - dm_alpha_e - 31 + den_f_e - 31 => den_f_e - dm_alpha_e - 1 + move32(); - div_shift = 15 - ( 30 - (dm_alpha_e) -28 ) + s_div; + div_shift = add( ( sub( 15, ( sub( ( sub( 30, dm_alpha_e ) ), 28 ) ) ) ), s_div ); DM_F[b] = L_shl( DM_F[b], div_shift ); // Q30 + move32(); DM_F[b] = L_min( ONE_IN_Q30, DM_F[b] ); + move32(); L_tmp1 = L_add( L_shr( dm_w, 1 ), Mpy_32_32( dm_alpha[b], DM_F[b] ) ); /* Q 29*/ L_tmp2 = Mpy_32_32( Mpy_32_32( DM_F[b], DM_F[b] ), dm_beta_re ); - L_tmp2_q = 29 + 2 * tmp_shift - 65; // simplified equation for calculating Q of L_tmp2 - L_tmp2 = L_shl( L_tmp2, ( 29 - L_tmp2_q ) ); + L_tmp2_q = add( 29, sub( shl( tmp_shift, 1 ), 65 ) ); // simplified equation for calculating Q of L_tmp2 + L_tmp2 = L_shl( L_tmp2, sub( 29, L_tmp2_q ) ); den_f = L_add( L_tmp1, L_tmp2 ); // Q29 den_f = L_max( den_f, 1 ); den_f_e = 29; + move16(); L_tmp2 = Mpy_32_32( DM_F[b], dm_beta_re ); - L_tmp2_q = 30 + 2 * tmp_shift - 34 - 31; - L_tmp2 = L_shl( L_tmp2, ( 30 - dm_alpha_e - L_tmp2_q ) ); - L_tmp1 = L_shr( dm_alpha[b], ( 31 - dm_alpha_e - 30 ) ); + L_tmp2_q = add( 30, sub( ( sub( shl( tmp_shift, 1 ), 34 ) ), 31 ) ); + L_tmp2 = L_shl( L_tmp2, ( sub( ( sub( 30, dm_alpha_e ) ), L_tmp2_q ) ) ); + L_tmp1 = L_shr( dm_alpha[b], ( sub( ( sub( 31, dm_alpha_e ) ), 30 ) ) ); L_tmp1 = L_add( L_tmp1, L_tmp2 ); // Q30 dm_g[b] = L_deposit_l( BASOP_Util_Divide3232_Scale( L_tmp1, den_f, &s_div ) ); // Q30 + den_f_e - 31 - div_shift = 15 - ( 30 - ( den_f_e ) ) + s_div; + move32(); + div_shift = add( sub( 15, ( sub( 30, den_f_e ) ) ), s_div ); dm_g[b] = L_shl( dm_g[b], div_shift ); // Q30 + move32(); } ELSE { @@ -923,18 +1136,21 @@ static void ivas_get_pred_coeffs_fx( sqrt_val = L_shl( Mpy_32_32( Mpy_32_32( dm_alpha[b], dm_alpha[b] ), g_th_sq ), 2 ); /*Q27*/ val_e = 4; + move16(); + sqrt_val = BASOP_Util_Add_Mant32Exp( sqrt_val, 4, Mpy_32_32( dm_beta_re, dm_beta_re ), 2 * dm_beta_re_e, &val_e ); sqrt_val = BASOP_Util_Add_Mant32Exp( sqrt_val, val_e, L_negate( L_shl( Mpy_32_32( Mpy_32_32( dm_beta_re, g_th_sq ), dm_w ), 2 ) ), add( dm_beta_re_e, 4 + 1 ), &val_e ); // val_e = norm_l( sqrt_val ); sqrt_val = Sqrt32( sqrt_val, &val_e ); - IF( LT_16( val_e, 0 ) ) + IF( val_e < 0 ) { sqrt_val = L_shr( sqrt_val, abs_s( val_e ) ); } - ELSE IF( GT_16( val_e, 0 ) ) + ELSE IF( val_e > 0 ) { sqrt_val = L_shl( sqrt_val, abs_s( val_e ) ); val_e = 0; + move16(); } num_f = BASOP_Util_Add_Mant32Exp( num_f, num_f_e, sqrt_val, 0, &num_f_e ); @@ -942,10 +1158,13 @@ static void ivas_get_pred_coeffs_fx( den_f_e = add( dm_beta_re_e, 4 ); den_f = L_max( den_f, 1 ); dm_g[b] = activew_quad_thresh; // Q29 + move32(); DM_F[b] = BASOP_Util_Divide3232_Scale_cadence( Mpy_32_32( dm_g[b], num_f ), den_f, &s_dm_f ); + move32(); s_dm_f = add( s_dm_f, sub( add( 2, num_f_e ), den_f_e ) ); /*Resultant exp for DM_F s_dm_f +( 2 + num_f_e ) - den_f_e*/ div_shift = sub( s_dm_f, 1 ); DM_F[b] = L_shl( DM_F[b], div_shift ); // Q30 + move32(); } } @@ -954,11 +1173,15 @@ static void ivas_get_pred_coeffs_fx( FOR( b = start_band; b < end_band; b++ ) { ppPred_coeffs_re[i][b] = Mpy_32_32( dm_v_re[i][b], dm_g[b] ); // Q = tmp_shift - 1 + 30 - 31 + move32(); ppDM_Fv_re[i][b] = Mpy_32_32( dm_v_re[i][b], DM_F[b] ); + move32(); } } - *q_pred_coeffs = tmp_shift - 2; - *q_dm_fv_re = tmp_shift - 2; + *q_pred_coeffs = sub( tmp_shift, 2 ); + move16(); + *q_dm_fv_re = sub( tmp_shift, 2 ); + move16(); } return; @@ -1070,12 +1293,12 @@ static void ivas_get_Wscaling_factor_fx( set32_fx( postpred_cov_re[ch], 0, IVAS_SPAR_MAX_CH ); } - IF( EQ_16( dtx_vad, 0 ) ) + IF( dtx_vad == 0 ) { dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_DTX_FX; // Q31 move32(); } - ELSE IF( NE_16( active_w_vlbr, 0 ) ) + ELSE IF( active_w_vlbr != 0 ) { dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_VLBR_FX; // Q31 move32(); @@ -1092,7 +1315,7 @@ static void ivas_get_Wscaling_factor_fx( move32(); test(); - IF( EQ_16( active_w, 1 ) && EQ_16( dyn_active_w_flag, 0 ) ) + IF( EQ_16( active_w, 1 ) && ( dyn_active_w_flag == 0 ) ) { Word16 guard_bits, q_Gw_sq, q_g_sq, q_min, tmp_exp; Word32 Gw_sq, g_sq, tmp; @@ -1110,7 +1333,7 @@ static void ivas_get_Wscaling_factor_fx( guard_bits = find_guarded_bits_fx( num_ch ); - FOR( ch = 0; ch < num_ch - 1; ch++ ) + FOR( ch = 0; ch < sub( num_ch, 1 ); ch++ ) { abs_val = L_shr( Mpy_32_32( pred_coeffs_re[ch][b], pred_coeffs_re[ch][b] ), guard_bits ); g_sq = L_add( g_sq, abs_val ); @@ -1143,6 +1366,7 @@ static void ivas_get_Wscaling_factor_fx( tmp = L_shr( tmp, sub( q_tmp, q_min ) ); pWscale[b] = Mpy_32_32( L_add( Gw_sq, tmp ), ONE_IN_Q30 /* 0.5 in Q31*/ ); + move32(); q_pWscale[b] = q_Gw_sq; move16(); } @@ -1323,7 +1547,7 @@ void ivas_create_fullr_dmx_mat_fx( { FOR( b = start_band; b < end_band; b++ ) { - tmp_p2_re[j][0][b] = -pred_coeffs_re[j - 1][b]; + tmp_p2_re[j][0][b] = L_negate( pred_coeffs_re[sub( j, 1 )][b] ); move32(); max_val_tmp_p2 = L_max( max_val_tmp_p2, L_abs( tmp_p2_re[j][0][b] ) ); } @@ -1351,7 +1575,7 @@ void ivas_create_fullr_dmx_mat_fx( { FOR( b = start_band; b < end_band; b++ ) { - tmp_p1_re[0][j][b] = dm_fv_re[j - 1][b]; + tmp_p1_re[0][j][b] = dm_fv_re[sub( j, 1 )][b]; move32(); max_val = L_max( max_val, L_abs( tmp_p1_re[0][j][b] ) ); } @@ -1376,6 +1600,7 @@ void ivas_create_fullr_dmx_mat_fx( } } *q_mixer_mat = sub( add( q_dm_fv_re, q_pred_coeffs_re ), add( 31, guard_bits ) ); + move16(); } ELSE { @@ -1391,6 +1616,7 @@ void ivas_create_fullr_dmx_mat_fx( } } *q_mixer_mat = q_pred_coeffs_re; + move16(); } IF( NE_16( remix_unmix_order, 3 ) ) @@ -1593,13 +1819,15 @@ static void ivas_calc_post_pred_per_band_fx( FOR( j = 0; j < num_ch; j++ ) { tmp_re = 0; + move64(); FOR( k = 0; k < num_ch; k++ ) { tmp_re = W_add( tmp_re, W_shr( W_mult0_32_32( cov_real[i][k][band_idx], dmx_mat_conj[k][j] ), guard_bits ) ); } - IF( LT_64( W_abs( tmp_re ), L_shl( IVAS_FIX_EPS, guard_bits ) ) ) + if ( LT_64( W_abs( tmp_re ), L_shl( IVAS_FIX_EPS, guard_bits ) ) ) { tmp_re = 0; + move64(); } temp_mat[i][j] = W_extract_l( W_shr( tmp_re, q_mixer_mat ) ); // Q = (q_cov_real - guard_bits) move32(); @@ -1633,7 +1861,7 @@ static void ivas_calc_post_pred_per_band_fx( tmp_re = W_add( tmp_re, W_shr( W_mult0_32_32( mixer_mat[i][k][band_idx], temp_mat[k][j] ), guard_bits ) ); } - IF( LT_64( W_abs( tmp_re ), L_shl( IVAS_FIX_EPS, guard_bits ) ) ) + if ( LT_64( W_abs( tmp_re ), L_shl( IVAS_FIX_EPS, guard_bits ) ) ) { tmp_re = 0; move64(); @@ -1645,6 +1873,7 @@ static void ivas_calc_post_pred_per_band_fx( } *q_postpred_cov_re = sub( q_temp_mat, guard_bits ); + move16(); FOR( i = 0; i < num_ch; i++ ) { @@ -1888,29 +2117,29 @@ static void ivas_calc_p_coeffs_per_band_fx( set32_fx( pSparMd->band_coeffs[b_ts_idx].P_re_fx, 0, IVAS_SPAR_MAX_CH - 1 ); pSparMd->band_coeffs[b_ts_idx].q_P_re_fx = 0; move16(); - FOR( i = 0; i < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; i++ ) + FOR( i = 0; i < sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ); i++ ) { - set32_fx( recon_uu_re[i], 0, IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ); + set32_fx( recon_uu_re[i], 0, sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ) ); } FOR( i = num_dmx; i < num_ch; i++ ) { FOR( j = num_dmx; j < num_ch; j++ ) { - cov_uu_re[i - num_dmx][j - num_dmx] = postpred_cov_re[i][j]; + cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )] = postpred_cov_re[i][j]; move32(); } } q_cov_uu_re = q_postpred_cov_re; move16(); - IF( dtx_vad == 1 ) + IF( EQ_16( dtx_vad, 1 ) ) { FOR( i = 1; i < num_dmx; i++ ) { FOR( j = 1; j < num_dmx; j++ ) { - cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; + cov_dd_re[sub( i, 1 )][sub( j, 1 )] = postpred_cov_re[i][j]; move32(); } } @@ -1929,6 +2158,10 @@ static void ivas_calc_p_coeffs_per_band_fx( recon_uu_re[0][1] = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], re1 ), q_C_re ) ); recon_uu_re[1][0] = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re2 ), q_C_re ) ); recon_uu_re[1][1] = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], re2 ), q_C_re ) ); + move32(); + move32(); + move32(); + move32(); FOR( i = 0; i < 2; i++ ) { @@ -1960,8 +2193,10 @@ static void ivas_calc_p_coeffs_per_band_fx( move32(); re2 = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][1], re1[1] ), q_C_re ) ); recon_uu_re[0][0] = L_add( recon_uu_re[0][0], re2 ); + move32(); cov_uu_re[0][0] = L_sub( cov_uu_re[0][0], recon_uu_re[0][0] ); + move32(); } ELSE IF( EQ_16( num_dmx, 4 ) ) { @@ -1992,7 +2227,7 @@ static void ivas_calc_p_coeffs_per_band_fx( } /* Step 2: cov_uu - recon_uu */ - FOR( i = 0; i < num_ch - num_dmx; i++ ) + FOR( i = 0; i < sub( num_ch, num_dmx ); i++ ) { FOR( j = 0; j < num_ch - num_dmx; j++ ) { @@ -2007,7 +2242,7 @@ static void ivas_calc_p_coeffs_per_band_fx( move32(); test(); - IF( EQ_16( dtx_vad, 0 ) && EQ_16( num_dmx, 1 ) ) + if ( ( dtx_vad == 0 ) && EQ_16( num_dmx, 1 ) ) { p_norm_scaling = IVAS_P_NORM_SCALING_DTX_FX; move32(); @@ -2018,7 +2253,7 @@ static void ivas_calc_p_coeffs_per_band_fx( FOR( i = num_dmx; i < num_ch; i++ ) { - trace = L_add( trace, L_abs( cov_uu_re[i - num_dmx][i - num_dmx] ) ); + trace = L_add( trace, L_abs( cov_uu_re[sub( i, num_dmx )][sub( i, num_dmx )] ) ); } factor = L_max( IVAS_FIX_EPS, postpred_cov_re[0][0] ); @@ -2037,7 +2272,7 @@ static void ivas_calc_p_coeffs_per_band_fx( IF( EQ_16( i, j ) ) { /* force diagonal to be real */ - cov_uu_re[i - num_dmx][j - num_dmx] = W_extract_l( W_shr( W_mult0_32_32( cov_uu_re[i - num_dmx][j - num_dmx], factor ), 15 ) ); + cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )] = W_extract_l( W_shr( W_mult0_32_32( cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )], factor ), 15 ) ); move32(); } ELSE @@ -2054,8 +2289,8 @@ static void ivas_calc_p_coeffs_per_band_fx( FOR( i = num_dmx; i < num_ch; i++ ) { cov_uu_re_exp = sub( 31, q_cov_uu_re ); - cov_uu_re[i - num_dmx][i - num_dmx] = Sqrt32( L_max( 0, cov_uu_re[i - num_dmx][i - num_dmx] ), &cov_uu_re_exp ); - cov_uu_re[i - num_dmx][i - num_dmx] = L_shl( cov_uu_re[i - num_dmx][i - num_dmx], sub( q_cov_uu_re, sub( 31, cov_uu_re_exp ) ) ); + cov_uu_re[sub( i, num_dmx )][sub( i, num_dmx )] = Sqrt32( L_max( 0, cov_uu_re[sub( i, num_dmx )][sub( i, num_dmx )] ), &cov_uu_re_exp ); + cov_uu_re[sub( i, num_dmx )][sub( i, num_dmx )] = L_shl( cov_uu_re[sub( i, num_dmx )][sub( i, num_dmx )], sub( q_cov_uu_re, sub( 31, cov_uu_re_exp ) ) ); move32(); move32(); } @@ -2067,7 +2302,7 @@ static void ivas_calc_p_coeffs_per_band_fx( { IF( EQ_16( i, j ) ) { - pSparMd->band_coeffs[b_ts_idx].P_re_fx[j - num_dmx] = cov_uu_re[i - num_dmx][j - num_dmx]; + pSparMd->band_coeffs[b_ts_idx].P_re_fx[sub( j, num_dmx )] = cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )]; move32(); } } @@ -2201,9 +2436,9 @@ static void ivas_calc_c_coeffs_per_band_fx( b_ts_idx = add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) ); - IF( EQ_16( dtx_vad, 0 ) ) + IF( dtx_vad == 0 ) { - set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); + set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, imult1616( sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ), sub( IVAS_SPAR_MAX_DMX_CHS, 1 ) ) ); pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0; move16(); return; @@ -2213,7 +2448,7 @@ static void ivas_calc_c_coeffs_per_band_fx( { FOR( j = 1; j < num_dmx; j++ ) { - cov_ud_re[i - num_dmx][j - 1] = postpred_cov_re[i][j]; + cov_ud_re[sub( i, num_dmx )][sub( j, 1 )] = postpred_cov_re[i][j]; move32(); } } @@ -2222,7 +2457,8 @@ static void ivas_calc_c_coeffs_per_band_fx( { FOR( j = 1; j < num_dmx; j++ ) { - cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; + cov_dd_re[sub( i, 1 )][sub( j, 1 )] = postpred_cov_re[i][j]; + move32(); } } @@ -2240,40 +2476,40 @@ static void ivas_calc_c_coeffs_per_band_fx( IF( LE_32( abs_trace, IVAS_FIX_EPS ) ) { /* protection from cases when variance of residual channels is very small */ - set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); + set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, imult1616( sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ), sub( IVAS_SPAR_MAX_DMX_CHS, 1 ) ) ); pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0; move16(); } ELSE { - FOR( i = 0; i < num_dmx - 1; i++ ) + FOR( i = 0; i < sub( num_dmx, 1 ); i++ ) { cov_dd_re[i][i] = L_add( trace_cov_dd_re, cov_dd_re[i][i] ); move32(); } test(); - IF( EQ_16( ivas_is_mat_inv_fx( cov_dd_re, q_post_pred_cov_re, num_dmx - 1 ), 1 ) && LT_16( num_dmx, FOA_CHANNELS ) ) + IF( EQ_16( ivas_is_mat_inv_fx( cov_dd_re, q_post_pred_cov_re, sub( num_dmx, 1 ) ), 1 ) && LT_16( num_dmx, FOA_CHANNELS ) ) { - set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); + set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, imult1616( sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ), sub( IVAS_SPAR_MAX_DMX_CHS, 1 ) ) ); pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0; move16(); } ELSE { - ivas_calc_mat_inv_fx( cov_dd_re, q_post_pred_cov_re, num_dmx - 1, cov_dd_re_inv, &q_cov_dd_re_inv ); + ivas_calc_mat_inv_fx( cov_dd_re, q_post_pred_cov_re, sub( num_dmx, 1 ), cov_dd_re_inv, &q_cov_dd_re_inv ); Word16 tmp; Word64 max_val = 1; move64(); Word64 C_re_fx[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1]; - FOR( i = 0; i < num_ch - num_dmx; i++ ) + FOR( i = 0; i < sub( num_ch, num_dmx ); i++ ) { - FOR( j = 0; j < num_dmx - 1; j++ ) + FOR( j = 0; j < sub( num_dmx, 1 ); j++ ) { C_re_fx[i][j] = 0; move64(); - FOR( k = 0; k < num_dmx - 1; k++ ) + FOR( k = 0; k < sub( num_dmx, 1 ); k++ ) { C_re_fx[i][j] = W_add_nosat( C_re_fx[i][j], W_mult0_32_32( cov_ud_re[i][k], cov_dd_re_inv[k][j] ) ); move64(); @@ -2287,15 +2523,16 @@ static void ivas_calc_c_coeffs_per_band_fx( tmp = s_max( sub( 32, W_norm( max_val ) ), 0 ); - FOR( i = 0; i < num_ch - num_dmx; i++ ) + FOR( i = 0; i < sub( num_ch, num_dmx ); i++ ) { - FOR( j = 0; j < num_dmx - 1; j++ ) + FOR( j = 0; j < sub( num_dmx, 1 ); j++ ) { pSparMd->band_coeffs[b_ts_idx].C_re_fx[i][j] = W_extract_l( W_shr( C_re_fx[i][j], tmp ) ); move32(); } } pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = sub( add( q_cov_dd_re_inv, q_post_pred_cov_re ), tmp ); + move16(); } } @@ -2398,15 +2635,15 @@ void ivas_calc_c_p_coeffs_fx( IF( dyn_active_w_flag ) { - FOR( i = 0; i < num_ch - num_dmx; i++ ) + FOR( i = 0; i < sub( num_ch, num_dmx ); i++ ) { - FOR( j = 0; j < num_dmx - 1; j++ ) + FOR( j = 0; j < sub( num_dmx, 1 ); j++ ) { - pSparMd->band_coeffs[band_idx + i_ts * IVAS_MAX_NUM_BANDS].C_re_fx[i][j] = 0; + pSparMd->band_coeffs[add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].C_re_fx[i][j] = 0; move32(); } } - pSparMd->band_coeffs[band_idx + i_ts * IVAS_MAX_NUM_BANDS].q_C_re_fx = 0; + pSparMd->band_coeffs[add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_C_re_fx = 0; move16(); } IF( EQ_16( compute_p_flag, 1 ) ) @@ -2418,10 +2655,10 @@ void ivas_calc_c_p_coeffs_fx( { FOR( i = num_dmx; i < num_ch; i++ ) { - pSparMd->band_coeffs[band_idx + i_ts * IVAS_MAX_NUM_BANDS].P_re_fx[i - num_dmx] = 0; + pSparMd->band_coeffs[add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].P_re_fx[sub( i, num_dmx )] = 0; move32(); } - pSparMd->band_coeffs[band_idx + i_ts * IVAS_MAX_NUM_BANDS].q_P_re_fx = 0; + pSparMd->band_coeffs[add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_P_re_fx = 0; move16(); } } @@ -2511,6 +2748,7 @@ static void ivas_calc_mat_det_fx( re1 = W_mult0_32_32( in_re[0][1], W_extract_h( re ) ); *det_re = W_sub_nosat( *det_re, re1 ); + move64(); re1 = W_mult0_32_32( in_re[1][0], in_re[2][1] ); re2 = W_mult0_32_32( in_re[1][1], in_re[2][0] ); @@ -2519,8 +2757,10 @@ static void ivas_calc_mat_det_fx( re1 = W_mult0_32_32( in_re[0][2], W_extract_h( re ) ); *det_re = W_add_nosat( *det_re, re1 ); + move64(); *q_det_re = add( q_in_re, sub( add( q_in_re, q_in_re ), 32 ) ); + move16(); } ELSE IF( EQ_16( dim, IVAS_MAT_DIM_2 ) ) { @@ -2528,7 +2768,9 @@ static void ivas_calc_mat_det_fx( re1 = W_mult0_32_32( in_re[0][0], in_re[1][1] ); re2 = W_mult0_32_32( in_re[0][1], in_re[1][0] ); *det_re = W_sub_nosat( re1, re2 ); + move64(); *q_det_re = add( q_in_re, q_in_re ); + move16(); } ELSE IF( EQ_16( dim, IVAS_MAT_DIM_1 ) ) { @@ -2774,13 +3016,18 @@ static void ivas_calc_mat_inv_fx( out_re[0][0] = Mpy_32_16_1( in_re[1][1], one_by_det ); - out_re[0][1] = -Mpy_32_16_1( in_re[0][1], one_by_det ); + out_re[0][1] = L_negate( Mpy_32_16_1( in_re[0][1], one_by_det ) ); - out_re[1][0] = -Mpy_32_16_1( in_re[1][0], one_by_det ); + out_re[1][0] = L_negate( Mpy_32_16_1( in_re[1][0], one_by_det ) ); out_re[1][1] = Mpy_32_16_1( in_re[0][0], one_by_det ); + move32(); + move32(); + move32(); + move32(); *q_out_re = sub( q_in_re, add( q_tmp, q_det_re ) ); // Q = (15-(q_tmp + q_det_re)) + q_in_re - 15 + move16(); } ELSE IF( EQ_16( dim, IVAS_MAT_DIM_3 ) ) { @@ -2798,7 +3045,7 @@ static void ivas_calc_mat_inv_fx( det_re = W_shr( det_re, q_tmp ); q_det_re = sub( q_det_re, q_tmp ); - IF( EQ_64( det_re, 0 ) ) + if ( det_re == 0 ) { det_re = 1; move64(); @@ -2832,6 +3079,7 @@ static void ivas_calc_mat_inv_fx( } } *q_out_re = sub( add( sub( q_W_tmp, 32 ), q_one_by_det ), 15 ); + move16(); } ELSE { @@ -2901,7 +3149,7 @@ static Word16 ivas_is_mat_inv_fx( det = W_mult0_32_32( W_extract_l( det_re ), W_extract_l( det_re ) ); - IF( LE_64( det, IVAS_FIX_EPS ) ) + if ( LE_64( det, IVAS_FIX_EPS ) ) { is_det_zero = 1; move16(); @@ -3013,25 +3261,24 @@ void ivas_compute_spar_params_fx( q_tmp = sub( 15, tmp_exp ); tmp = sub( add( q_pred_coeffs, q_tmp ), 15 ); - FOR( i = 0; i < num_ch - 1; i++ ) + FOR( i = 0; i < sub( num_ch, 1 ); i++ ) { - hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re_fx[i] = Mpy_32_16_1( pred_coeffs_re[i][b], onebyscale_fx ); + hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].pred_re_fx[i] = Mpy_32_16_1( pred_coeffs_re[i][b], onebyscale_fx ); move32(); - IF( LT_16( tmp, 0 ) ) + IF( tmp < 0 ) { - tmp = -tmp; - move16(); - hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re_fx[i] = L_shl( hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re_fx[i], add( tmp, 22 ) ); + tmp = negate( tmp ); + hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].pred_re_fx[i] = L_shl( hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].pred_re_fx[i], add( tmp, 22 ) ); move32(); } ELSE { - hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re_fx[i] = L_shr( hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re_fx[i], sub( tmp, 22 ) ); + hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].pred_re_fx[i] = L_shr( hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].pred_re_fx[i], sub( tmp, 22 ) ); move32(); } } // hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].q_pred_re_fx = sub(add(q_pred_coeffs, q_tmp), 15); - hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].q_pred_re_fx = Q22; + hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_pred_re_fx = Q22; move16(); FOR( i = 0; i < num_ch; i++ ) @@ -3043,22 +3290,22 @@ void ivas_compute_spar_params_fx( FOR( b = start_band; b < end_band; b++ ) { - ndm = hSparCfg->num_dmx_chans_per_band[b * bands_bw]; + ndm = hSparCfg->num_dmx_chans_per_band[imult1616( b, bands_bw )]; move16(); IF( NE_16( ndm, num_ch ) ) { ivas_calc_c_p_coeffs_fx( hSparMd, cov_real, q_cov_real, i_ts, mixer_mat_fx, *q_mixer_mat, num_ch, ndm, b, dtx_vad, 1, dyn_active_w_flag ); - Word16 q_tmp = hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].q_C_re_fx; + Word16 q_tmp = hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_C_re_fx; IF( NE_16( ndm, 1 ) ) { #ifdef MSAN_FIX - FOR( i = 0; i < num_ch - ndm; i++ ) + FOR( i = 0; i < sub( num_ch, ndm ); i++ ) { - FOR( int j = 0; j < ndm - 1; j++ ) + FOR( Word16 j = 0; j < sub( ndm, 1 ); j++ ) { - hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].C_re_fx[i][j] = L_shr( hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].C_re_fx[i][j], sub( q_tmp, 22 ) ); + hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].C_re_fx[i][j] = L_shr( hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].C_re_fx[i][j], sub( q_tmp, 22 ) ); move32(); } } @@ -3071,16 +3318,20 @@ void ivas_compute_spar_params_fx( } } #endif - hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].q_C_re_fx = Q22; + hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_C_re_fx = Q22; + move16(); } - q_tmp = hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].q_P_re_fx; + q_tmp = hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_P_re_fx; + move16(); - for ( int j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + FOR( Word16 j = 0; j < sub( IVAS_SPAR_MAX_CH, 1 ); j++ ) { - hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].P_re_fx[j] = L_shr( hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].P_re_fx[j], sub( q_tmp, 22 ) ); + hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].P_re_fx[j] = L_shr( hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].P_re_fx[j], sub( q_tmp, 22 ) ); + move32(); } - hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].q_P_re_fx = Q22; + hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_P_re_fx = Q22; + move16(); } } @@ -3120,515 +3371,490 @@ void ivas_get_spar_md_from_dirac_fx( const int16_t dyn_active_w_flag ) { - int16_t num_ch, band, i, j; - int16_t block, ch; + Word16 num_ch, band, i, j; + Word16 block, ch; - // float response_avg[MAX_OUTPUT_CHANNELS]; Word32 response_avg_fx[MAX_OUTPUT_CHANNELS]; - // float response[MAX_PARAM_SPATIAL_SUBFRAMES][MAX_OUTPUT_CHANNELS]; Word32 response_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MAX_OUTPUT_CHANNELS]; - // float cov_real_dirac[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; Word32 cov_real_dirac_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; - // float *pCov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; Word32 *pCov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; - // float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; Word32 dm_fv_re_fx[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; Word16 q_dm_fv_re_fx = 0; - // float Wscale[IVAS_MAX_NUM_BANDS]; - Word16 q_Wscale[IVAS_MAX_NUM_BANDS] = { 0 }; - Word32 Wscale_fx[IVAS_MAX_NUM_BANDS] = { 0 }; - // float mixer_mat_local[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH][IVAS_MAX_NUM_BANDS]; + Word16 q_Wscale[IVAS_MAX_NUM_BANDS]; + Word32 Wscale_fx[IVAS_MAX_NUM_BANDS]; Word32 mixer_mat_local_fx[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH][IVAS_MAX_NUM_BANDS]; - // float **ppMixer_mat[IVAS_MAX_FB_MIXER_OUT_CH]; Word32 **ppMixer_mat_fx[IVAS_MAX_FB_MIXER_OUT_CH]; - // float *pMixer_mat[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH]; Word32 *pMixer_mat_fx[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH]; Word16 q_ppMixer_mat = 0; - // float en_ratio_fac, diff_norm_order1, diff_norm_order2, diff_norm_order3; Word32 en_ratio_fac_fx, diff_norm_order1_fx, diff_norm_order2_fx, diff_norm_order3_fx; - int16_t active_w; + Word16 active_w; + move16(); + move16(); - int16_t ndm, foa_ch, hoa2_ch; - // float P_dir_fact[IVAS_SPAR_MAX_CH - 1]; + Word16 ndm, foa_ch, hoa2_ch; Word32 P_dir_fact_fx[IVAS_SPAR_MAX_CH - 1]; - const int16_t *remix_order; + const Word16 *remix_order; + set16_fx( q_Wscale, 0, IVAS_MAX_NUM_BANDS ); + set32_fx( Wscale_fx, 0, IVAS_MAX_NUM_BANDS ); remix_order = remix_order_set[hSpar_md_cfg->remix_unmix_order]; num_ch = ivas_sba_get_nchan_metadata_fx( order, IVAS_256k /*dummy value as order is always 1 in this function*/ ); hoa2_ch = ivas_sba_get_nchan_metadata_fx( SBA_HOA2_ORDER, IVAS_256k /*dummy value as order is always 1 in this function*/ ); - // hoa2_ch max 6 foa_ch = FOA_CHANNELS; - // foa_ch 4; - // diff_norm_order1 = 3.0f; + move16(); diff_norm_order1_fx = 3; - // diff_norm_order2 = 5.0f; + move32(); diff_norm_order2_fx = 5; - // diff_norm_order3 = 7.0f; + move32(); diff_norm_order3_fx = 7; + move32(); - for ( i = 0; i < IVAS_MAX_FB_MIXER_OUT_CH; i++ ) + FOR( i = 0; i < IVAS_MAX_FB_MIXER_OUT_CH; i++ ) { - for ( j = 0; j < IVAS_MAX_SPAR_FB_MIXER_IN_CH; j++ ) + FOR( j = 0; j < IVAS_MAX_SPAR_FB_MIXER_IN_CH; j++ ) { - // pMixer_mat[i][j] = mixer_mat_local[i][j]; pMixer_mat_fx[i][j] = mixer_mat_local_fx[i][j]; + move32(); } - // ppMixer_mat[i] = pMixer_mat[i]; ppMixer_mat_fx[i] = pMixer_mat_fx[i]; + move32(); } - if ( ( start_band >= 6 && hSpar_md_cfg->nchan_transport <= 2 && ( dtx_vad == 1 ) ) || ( useLowerRes && start_band >= 3 && hSpar_md_cfg->nchan_transport <= 2 && ( dtx_vad == 1 ) ) ) + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( GE_16( start_band, 6 ) && LE_16( hSpar_md_cfg->nchan_transport, 2 ) && ( EQ_16( dtx_vad, 1 ) ) ) || ( useLowerRes && GE_16( start_band, 3 ) && LE_16( hSpar_md_cfg->nchan_transport, 2 ) && ( EQ_16( dtx_vad, 1 ) ) ) ) { - // float P_norm[3]; Word32 P_norm_fx[3]; - int16_t idx; + Word16 idx; - ndm = hSpar_md_cfg->num_dmx_chans_per_band[start_band - 1]; - // ndm max value of 4 - // P_norm[0] = 0.0f; + ndm = hSpar_md_cfg->num_dmx_chans_per_band[sub( start_band, 1 )]; + move16(); P_norm_fx[0] = 0; - for ( i = 0; i < max( 0, foa_ch - ndm ); i++ ) + move32(); + FOR( i = 0; i < max( 0, sub( foa_ch, ndm ) ); i++ ) { - // use 64bit if low precission - // P_norm[0] += hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; - P_norm_fx[0] = P_norm_fx[0] + Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); + P_norm_fx[0] = L_add( P_norm_fx[0], Mpy_32_32( hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i], hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i] ) ); + move32(); } - // P_norm[0] *= diff_norm_order1 / min( diff_norm_order1, max( 0, foa_ch - ndm ) ); - // P_norm_fx[0] *= diff_norm_order1 / min( diff_norm_order1, max( 0, foa_ch - ndm ) ); - P_norm_fx[0] = Mpy_32_32( L_shl( P_norm_fx[0], 3 ), diff_norm_order1_table[min( diff_norm_order1_fx, max( 0, foa_ch - ndm ) )] ); + P_norm_fx[0] = Mpy_32_32( L_shl( P_norm_fx[0], 3 ), diff_norm_order1_table[min( diff_norm_order1_fx, max( 0, sub( foa_ch, ndm ) ) )] ); + move32(); - // P_norm[1] = 0.0f; P_norm_fx[1] = 0; - for ( ; i < max( 0, min( num_ch, hoa2_ch ) - ndm ); i++ ) + move32(); + FOR( ; i < max( 0, sub( min( num_ch, hoa2_ch ), ndm ) ); i++ ) { - // P_norm[1] += hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; - P_norm_fx[1] = P_norm_fx[1] + Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); + P_norm_fx[1] = L_add( P_norm_fx[1], Mpy_32_32( hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i], hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i] ) ); + move32(); } - // P_norm[1] *= diff_norm_order2 / min( diff_norm_order2, max( 0, min( num_ch, hoa2_ch ) - ndm ) ); - // P_norm_fx[1] *= diff_norm_order2 / min( diff_norm_order2, max( 0, min( num_ch, hoa2_ch ) - ndm ) ); - P_norm_fx[1] = Mpy_32_32( L_shl( P_norm_fx[1], 3 ), diff_norm_order2_table[min( diff_norm_order2_fx, max( 0, min( num_ch, hoa2_ch ) - ndm ) )] ); - + P_norm_fx[1] = Mpy_32_32( L_shl( P_norm_fx[1], 3 ), diff_norm_order2_table[min( diff_norm_order2_fx, max( 0, sub( min( num_ch, hoa2_ch ), ndm ) ) )] ); + move32(); - // P_norm[2] = 0.0f; P_norm_fx[2] = 0; - for ( ; i < num_ch - ndm; i++ ) + move32(); + FOR( ; i < sub( num_ch, ndm ); i++ ) { - // P_norm[2] += hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; - P_norm_fx[2] = P_norm_fx[2] + Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); + P_norm_fx[2] = L_add( P_norm_fx[2], Mpy_32_32( hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i], hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i] ) ); + move32(); } - // P_norm[2] *= diff_norm_order3 / min( diff_norm_order3, max( 0, num_ch - ndm ) ); - // P_norm_fx[2] *= diff_norm_order3 / min( diff_norm_order3, max( 0, num_ch - ndm ) ); - P_norm_fx[2] = Mpy_32_32( L_shl( P_norm_fx[2], 3 ), diff_norm_order3_table[min( diff_norm_order3_fx, max( 0, num_ch - ndm ) )] ); + P_norm_fx[2] = Mpy_32_32( L_shl( P_norm_fx[2], 3 ), diff_norm_order3_table[min( diff_norm_order3_fx, max( 0, sub( num_ch, ndm ) ) )] ); + move32(); - for ( i = 0; i < max( 0, foa_ch - ndm ); i++ ) + FOR( i = 0; i < max( 0, sub( foa_ch, ndm ) ); i++ ) { - idx = remix_order[i + ndm] - ndm; - // P_dir_fact[idx] = hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; - P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); - // P_dir_fact[idx] = P_dir_fact[idx] / max( IVAS_FLT_EPS, P_norm[0] ); - if ( P_dir_fact_fx[idx] == 0 ) + idx = sub( remix_order[add( i, ndm )], ndm ); + P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i], hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i] ); + move32(); + IF( P_dir_fact_fx[idx] == 0 ) { P_dir_fact_fx[idx] = 0; + move32(); } - else + ELSE { P_dir_fact_fx[idx] = divide3232( P_dir_fact_fx[idx], max( P_norm_fx[0], IVAS_FIX_EPS ) ); + move32(); P_dir_fact_fx[idx] = L_shl( P_dir_fact_fx[idx], 15 ); + move32(); } } - for ( ; i < max( 0, min( num_ch, hoa2_ch ) - ndm ); i++ ) + FOR( ; i < max( 0, sub( min( num_ch, hoa2_ch ), ndm ) ); i++ ) { - idx = remix_order[i + ndm] - ndm; - // P_dir_fact[idx] = hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; - P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); - // P_dir_fact[idx] = P_dir_fact[idx] / max( IVAS_FLT_EPS, P_norm[1] ); - if ( P_dir_fact_fx[idx] == 0 ) + idx = sub( remix_order[add( i, ndm )], ndm ); + P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i], hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i] ); + IF( P_dir_fact_fx[idx] == 0 ) { P_dir_fact_fx[idx] = 0; + move32(); } - else + ELSE { P_dir_fact_fx[idx] = divide3232( P_dir_fact_fx[idx], max( P_norm_fx[1], IVAS_FIX_EPS ) ); + move32(); P_dir_fact_fx[idx] = L_shl( P_dir_fact_fx[idx], 15 ); + move32(); } } - for ( ; i < num_ch - ndm; i++ ) + FOR( ; i < sub( num_ch, ndm ); i++ ) { - idx = remix_order[i + ndm] - ndm; - // P_dir_fact[idx] = hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; - P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); - // P_dir_fact[idx] = P_dir_fact[idx] / max( IVAS_FLT_EPS, P_norm[2] ); - if ( P_dir_fact_fx[idx] == 0 ) + idx = sub( remix_order[add( i, ndm )], ndm ); + P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i], hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i] ); + move32(); + IF( P_dir_fact_fx[idx] == 0 ) { P_dir_fact_fx[idx] = 0; + move32(); } - else + ELSE { P_dir_fact_fx[idx] = divide3232( P_dir_fact_fx[idx], max( P_norm_fx[2], IVAS_FIX_EPS ) ); + move32(); P_dir_fact_fx[idx] = L_shl( P_dir_fact_fx[idx], 15 ); + move32(); } } } - for ( int16_t i_ts = 0; i_ts < n_ts; i_ts++ ) + FOR( Word16 i_ts = 0; i_ts < n_ts; i_ts++ ) { - for ( band = start_band; band < end_band; band++ ) + FOR( band = start_band; band < end_band; band++ ) { ndm = hSpar_md_cfg->num_dmx_chans_per_band[band]; + move16(); /*SPAR from DirAC*/ - // set_f( response_avg, 0.0f, MAX_OUTPUT_CHANNELS ); set32_fx( response_avg_fx, 0, MAX_OUTPUT_CHANNELS ); - if ( n_ts > 1 ) + IF( GE_16( n_ts, 1 ) ) { - // ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][i_ts], (int16_t) ele_dirac[band][i_ts], response_avg, order ); - ivas_dirac_dec_get_response_fx( (int16_t) L_shr( azi_dirac_fx[band][i_ts], Q22 ), (int16_t) L_shr( ele_dirac_fx[band][i_ts], Q22 ), response_avg_fx, order, Q30 ); - /*for ( int l = 0; l < MAX_OUTPUT_CHANNELS; l++ ) - { - response_avg[l] = (float) response_avg_fx[l] / ( 1 << 30 ); - }*/ + ivas_dirac_dec_get_response_fx( extract_l( L_shr( azi_dirac_fx[band][i_ts], Q22 ) ), extract_l( L_shr( ele_dirac_fx[band][i_ts], Q22 ) ), response_avg_fx, order, Q30 ); } - else if ( useLowerRes ) + ELSE IF( useLowerRes ) { - // ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][0], (int16_t) ele_dirac[band][0], response_avg, order ); - ivas_dirac_dec_get_response_fx( (int16_t) L_shr( azi_dirac_fx[band][0], Q22 ), (int16_t) L_shr( ele_dirac_fx[band][0], Q22 ), response_avg_fx, order, Q30 ); - /*for ( int l = 0; l < MAX_OUTPUT_CHANNELS; l++ ) - { - response_avg[l] = (float) response_avg_fx[l] / ( 1 << 30 ); - }*/ + ivas_dirac_dec_get_response_fx( extract_l( L_shr( azi_dirac_fx[band][0], Q22 ) ), extract_l( L_shr( ele_dirac_fx[band][0], Q22 ) ), response_avg_fx, order, Q30 ); } - else + ELSE { - for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + FOR( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) { - // ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][block], (int16_t) ele_dirac[band][block], &( response[block][0] ), order ); - ivas_dirac_dec_get_response_fx( (int16_t) L_shr( azi_dirac_fx[band][block], Q22 ), (int16_t) L_shr( ele_dirac_fx[band][block], Q22 ), &( response_fx[block][0] ), order, Q30 ); - /*for ( int l = 0; l < MAX_OUTPUT_CHANNELS; l++ ) - { - response[block][l] = (float) response_fx[block][l] / ( 1 << 30 ); - }*/ + ivas_dirac_dec_get_response_fx( extract_l( L_shr( azi_dirac_fx[band][block], Q22 ) ), extract_l( L_shr( ele_dirac_fx[band][block], Q22 ) ), &( response_fx[block][0] ), order, Q30 ); } /* average responses in all subframes*/ { - // float norm; Word32 norm_fx; Word16 norm_q; - int16_t num_ch_order, hoa2_ch_order; + Word16 num_ch_order, hoa2_ch_order; num_ch_order = ivas_sba_get_nchan_fx( order, 0 ); hoa2_ch_order = ivas_sba_get_nchan_fx( SBA_HOA2_ORDER, 0 ); - for ( ch = 0; ch < num_ch_order; ch++ ) + FOR( ch = 0; ch < num_ch_order; ch++ ) { Word64 temp = 0; - for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + move64(); + FOR( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) { - // response_avg[ch] += response[block][ch]; - temp = temp + response_fx[block][ch]; + temp = W_add( temp, W_deposit32_l( response_fx[block][ch] ) ); } - // response_avg[ch] /= MAX_PARAM_SPATIAL_SUBFRAMES; response_avg_fx[ch] = W_extract_l( W_shr( temp, 2 ) ); + move32(); } /*normalize 1st order*/ - // norm = 0.0f; norm_fx = 0; + move32(); norm_q = 0; - for ( ch = 1; ch < foa_ch; ch++ ) + move16(); + FOR( ch = 1; ch < foa_ch; ch++ ) { - // norm += response_avg[ch] * response_avg[ch]; - norm_fx = norm_fx + Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ); + norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); } - norm_q = 31 - ( 30 + 30 - 31 ); - // norm = max( EPSILON, sqrtf( norm ) ); - if ( norm_fx ) + norm_q = sub( 31, ( sub( add( 30, 30 ), 31 ) ) ); + IF( norm_fx ) { norm_fx = Sqrt32( norm_fx, &norm_q ); } - else + ELSE { norm_fx = EPSILON_FX; + move32(); } - if ( norm_q < 0 ) + IF( norm_q <= 0 ) { - norm_fx = L_shr( norm_fx, ( -1 * norm_q ) ); + norm_fx = L_shr( norm_fx, ( negate( norm_q ) ) ); norm_q = 0; + move16(); } - norm_fx = L_shr( norm_fx, 1 - norm_q ); - for ( ch = 1; ch < foa_ch; ch++ ) + norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); + FOR( ch = 1; ch < foa_ch; ch++ ) { - // response_avg[ch] /= norm; - if ( norm_fx < EPSILON_FX_THR ) + IF( LT_32( norm_fx, EPSILON_FX_THR ) ) { - if ( response_avg_fx[ch] != 0 ) + IF( response_avg_fx[ch] != 0 ) { response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); + move32(); } response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); + move32(); } - else if ( response_avg_fx[ch] > norm_fx ) + ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) ) { response_avg_fx[ch] = ONE_IN_Q30; + move32(); } - else + ELSE { response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); + move32(); response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); + move32(); } - // response_avg[ch] = (float) response_avg_fx[ch] / ( 1 << 30 ); } /*normalize 2nd order*/ - // norm = 0.0f; norm_fx = 0; - for ( ch = foa_ch; ch < min( hoa2_ch_order, num_ch_order ); ch++ ) + move32(); + FOR( ch = foa_ch; ch < min( hoa2_ch_order, num_ch_order ); ch++ ) { - // norm += response_avg[ch] * response_avg[ch]; - norm_fx = norm_fx + Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ); + norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); } - norm_q = 31 - ( 29 + 29 - 31 ); - // norm = max( EPSILON, sqrtf( norm ) ); - if ( norm_fx ) + norm_q = sub( 31, ( sub( add( 29, 29 ), 31 ) ) ); + IF( norm_fx ) { norm_fx = Sqrt32( norm_fx, &norm_q ); } - else + ELSE { norm_fx = EPSILON_FX; + move32(); } - if ( norm_q < 0 ) + IF( norm_q < 0 ) { - norm_fx = L_shr( norm_fx, -1 * norm_q ); + norm_fx = L_shr( norm_fx, negate( norm_q ) ); norm_q = 0; + move16(); } - norm_fx = L_shr( norm_fx, 1 - norm_q ); - for ( ch = foa_ch; ch < min( hoa2_ch_order, num_ch_order ); ch++ ) + norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); + FOR( ch = foa_ch; ch < min( hoa2_ch_order, num_ch_order ); ch++ ) { - if ( norm_fx < EPSILON_FX_THR ) + IF( LT_32( norm_fx, EPSILON_FX_THR ) ) { response_avg_fx[ch] = response_avg_fx[ch]; response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); + move32(); + move32(); + move32(); } - else if ( response_avg_fx[ch] > norm_fx ) + ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) ) { response_avg_fx[ch] = ONE_IN_Q30; + move32(); } - else + ELSE { response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); + move32(); + move32(); } - // response_avg[ch] = (float)response_avg_fx[ch] / (1 << 30); } /*normalize 3rd order*/ - // norm = 0.0f; - for ( ch = hoa2_ch_order; ch < num_ch_order; ch++ ) + FOR( ch = hoa2_ch_order; ch < num_ch_order; ch++ ) { - // norm += response_avg[ch] * response_avg[ch]; - norm_fx = norm_fx + Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ); + norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); } - norm_q = 31 - ( 29 + 29 - 31 ); - // norm = max( EPSILON, sqrtf( norm ) ); - if ( norm_fx ) + norm_q = sub( 31, ( sub( add( 29, 29 ), 31 ) ) ); + IF( norm_fx ) { norm_fx = Sqrt32( norm_fx, &norm_q ); } - else + ELSE { norm_fx = EPSILON_FX; + move32(); } - if ( norm_q < 0 ) + IF( norm_q < 0 ) { - norm_fx = L_shr( norm_fx, -1 * norm_q ); + norm_fx = L_shr( norm_fx, negate( norm_q ) ); norm_q = 0; + move16(); } - norm_fx = L_shr( norm_fx, 1 - norm_q ); - for ( ch = hoa2_ch_order; ch < num_ch_order; ch++ ) + norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); + FOR( ch = hoa2_ch_order; ch < num_ch_order; ch++ ) { - // response_avg[ch] /= norm; - if ( norm_fx < EPSILON_FX_THR ) + IF( LT_32( norm_fx, EPSILON_FX_THR ) ) { response_avg_fx[ch] = response_avg_fx[ch]; response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); + move32(); + move32(); + move32(); } - else if ( response_avg_fx[ch] > norm_fx ) + ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) ) { response_avg_fx[ch] = ONE_IN_Q30; + move32(); } - else + ELSE { response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); + move32(); response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); + move32(); } - // response_avg[ch] = (float) response_avg_fx[ch] / ( 1 << 30 ); } } } - for ( i = FOA_CHANNELS + 1; i < num_ch; i++ ) + FOR( i = add( FOA_CHANNELS, 1 ); i < num_ch; i++ ) { - // response_avg[i] = response_avg[HOA_keep_ind[i]]; response_avg_fx[i] = response_avg_fx[HOA_keep_ind[i]]; + move32(); } - // en_ratio_fac = ( 1.0f - diffuseness[band] ); - en_ratio_fac_fx = ( ONE_IN_Q31 - L_shl_sat( diffuseness_fx[band], 1 ) ); // assuming q of dissusion 30 - for ( i = 0; i < num_ch; i++ ) + en_ratio_fac_fx = L_sub( ONE_IN_Q31, L_shl_sat( diffuseness_fx[band], 1 ) ); // assuming q of dissusion 30 + + FOR( i = 0; i < num_ch; i++ ) { - for ( j = 0; j < num_ch; j++ ) + FOR( j = 0; j < num_ch; j++ ) { - if ( i == j ) + IF( EQ_16( i, j ) ) { - if ( i == 0 ) + IF( i == 0 ) { - // cov_real_dirac[i][i][band] = 1.0f; cov_real_dirac_fx[i][i][band] = ONE_IN_Q30; + move32(); } - else + ELSE { Word32 en_ratio_fac_sq = 0; - // cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j]; + move32(); cov_real_dirac_fx[i][j][band] = Mpy_32_32( L_shl_sat( Mpy_32_32( en_ratio_fac_fx, response_avg_fx[i] ), 1 ), response_avg_fx[j] ); + move32(); - if ( hSpar_md_cfg->nchan_transport <= 2 ) + IF( LE_16( hSpar_md_cfg->nchan_transport, 2 ) ) { - - // cov_real_dirac[i][j][band] *= en_ratio_fac; cov_real_dirac_fx[i][j][band] = Mpy_32_32( cov_real_dirac_fx[i][j][band], en_ratio_fac_fx ); - if ( ( i >= ndm ) && ( dtx_vad == 1 ) ) + move32(); + test(); + IF( ( GE_16( i, ndm ) ) && ( EQ_16( dtx_vad, 1 ) ) ) { en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx ); - cov_real_dirac_fx[i][j][band] = cov_real_dirac_fx[i][j][band] + Mpy_32_32( ( ONE_IN_Q31 - en_ratio_fac_sq ), P_dir_fact_fx[i - ndm] ); - // cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) * P_dir_fact[i - ndm]; + cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_sq ), P_dir_fact_fx[sub( i, ndm )] ) ); + move32(); } - else + ELSE { - if ( i < foa_ch ) + IF( LT_16( i, foa_ch ) ) { en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx ); - Word32 temp = Mpy_32_32( ( ONE_IN_Q31 - en_ratio_fac_sq ), ONE_BY_THREE_Q31 ); - cov_real_dirac_fx[i][j][band] = cov_real_dirac_fx[i][j][band] + L_shr( temp, 1 ); - // cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order1; + Word32 temp = Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_sq ), ONE_BY_THREE_Q31 ); + cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( temp, 1 ) ); + move32(); } - else if ( i < hoa2_ch ) + ELSE IF( LT_16( i, hoa2_ch ) ) { en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx ); - Word32 temp = Mpy_32_32( ( ONE_IN_Q31 - en_ratio_fac_sq ), ONE_BY_FIVE_Q31 ); - cov_real_dirac_fx[i][j][band] = cov_real_dirac_fx[i][j][band] + L_shr( temp, 1 ); - // cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order2; + Word32 temp = Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_sq ), ONE_BY_FIVE_Q31 ); + cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( temp, 1 ) ); + move32(); } - else + ELSE { en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx ); - Word32 temp = Mpy_32_32( ( ONE_IN_Q31 - en_ratio_fac_sq ), ONE_BY_SEVEN_Q31 ); - cov_real_dirac_fx[i][j][band] = cov_real_dirac_fx[i][j][band] + L_shr( temp, 1 ); - // cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order3; + Word32 temp = Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_sq ), ONE_BY_SEVEN_Q31 ); + cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( temp, 1 ) ); + move32(); } } } - else + ELSE { - if ( i < foa_ch ) + IF( LT_16( i, foa_ch ) ) { - // cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order1; - cov_real_dirac_fx[i][j][band] = cov_real_dirac_fx[i][j][band] + L_shr( Mpy_32_32( ( ONE_IN_Q31 - en_ratio_fac_fx ), ONE_BY_THREE_Q31 ), 1 ); + cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_fx ), ONE_BY_THREE_Q31 ), 1 ) ); + move32(); } - else if ( i < hoa2_ch ) + ELSE IF( LT_16( i, hoa2_ch ) ) { - // cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order2; - cov_real_dirac_fx[i][j][band] = cov_real_dirac_fx[i][j][band] + L_shr( Mpy_32_32( ( ONE_IN_Q31 - en_ratio_fac_fx ), ONE_BY_FIVE_Q31 ), 1 ); + cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_fx ), ONE_BY_FIVE_Q31 ), 1 ) ); + move32(); } - else + ELSE { - // cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order3; - cov_real_dirac_fx[i][j][band] = cov_real_dirac_fx[i][j][band] + L_shr( Mpy_32_32( ( ONE_IN_Q31 - en_ratio_fac_fx ), ONE_BY_SEVEN_Q31 ), 1 ); + cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_fx ), ONE_BY_SEVEN_Q31 ), 1 ) ); + move32(); } } } } - else + ELSE { - // cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j]; cov_real_dirac_fx[i][j][band] = L_shl_sat( Mpy_32_32( Mpy_32_32( en_ratio_fac_fx, response_avg_fx[i] ), response_avg_fx[j] ), 1 ); + move32(); } } } } - for ( i = 0; i < num_ch; i++ ) + FOR( i = 0; i < num_ch; i++ ) { - for ( j = 0; j < num_ch; j++ ) + FOR( j = 0; j < num_ch; j++ ) { - // pCov_real[i][j] = cov_real_dirac[i][j]; pCov_real_fx[i][j] = cov_real_dirac_fx[i][j]; + move32(); } } - /*static int frame_counter; - frame_counter++; - if (frame_counter > 500) - { - frame_counter = frame_counter; - }*/ - - active_w = ( dyn_active_w_flag == 1 ) || ( hSpar_md_cfg->active_w == 1 ); - - // #ifdef IVAS_FLOAT_FIXED + test(); + active_w = ( EQ_16( dyn_active_w_flag, 1 ) ) || ( EQ_16( hSpar_md_cfg->active_w, 1 ) ); ivas_compute_spar_params_fx( pCov_real_fx, Q30, dm_fv_re_fx, &q_dm_fv_re_fx, i_ts, ppMixer_mat_fx, &q_ppMixer_mat, start_band, end_band, dtx_vad, num_ch, 1, active_w, active_w_vlbr, hSpar_md_cfg, hSpar_md, Wscale_fx, q_Wscale, 1, dyn_active_w_flag ); - // #else - // for (int i = 0; i < num_ch; i++) - // { - // for (int j = 0; j < num_ch; j++) - // { - // for (int k = start_band; k < end_band; k++) - // { - // cov_real_dirac[i][j][k] = (float)cov_real_dirac_fx[i][j][k] / (1 << 30); - // } - // } - // } - - // ivas_compute_spar_params( pCov_real, dm_fv_re, i_ts, ppMixer_mat, start_band, end_band, dtx_vad, num_ch, 1, active_w, active_w_vlbr, hSpar_md_cfg, hSpar_md, Wscale, 1, dyn_active_w_flag ); - // - //#endif // IVAS_FLOAT_FIXED - - if ( mixer_mat_fx != NULL ) + IF( mixer_mat_fx != NULL ) { - for ( band = start_band; band < end_band; band++ ) + FOR( band = start_band; band < end_band; band++ ) { ndm = hSpar_md_cfg->num_dmx_chans_per_band[band]; + move16(); - for ( i = 0; i < ndm; i++ ) + FOR( i = 0; i < ndm; i++ ) { - for ( j = 0; j < num_ch; j++ ) + FOR( j = 0; j < num_ch; j++ ) { - mixer_mat_fx[i][j][band + i_ts * IVAS_MAX_NUM_BANDS] = ppMixer_mat_fx[i][j][band]; + mixer_mat_fx[i][j][add( band, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )] = ppMixer_mat_fx[i][j][band]; + move32(); } } - for ( i = ndm; i < num_ch; i++ ) + FOR( i = ndm; i < num_ch; i++ ) { - for ( j = 0; j < num_ch; j++ ) + FOR( j = 0; j < num_ch; j++ ) { - mixer_mat_fx[i][j][band + i_ts * IVAS_MAX_NUM_BANDS] = 0; + mixer_mat_fx[i][j][add( band, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )] = 0; + move32(); } } - if ( ( ndm == 1 ) && ( Wscale_d != NULL ) ) + test(); + IF( ( EQ_16( ndm, 1 ) ) && ( Wscale_d != NULL ) ) { - for ( j = 0; j < num_ch; j++ ) + FOR( j = 0; j < num_ch; j++ ) { - mixer_mat_fx[0][j][band + i_ts * IVAS_MAX_NUM_BANDS] = Mpy_32_32( mixer_mat_fx[0][j][band + i_ts * IVAS_MAX_NUM_BANDS], Wscale_d[band] ); + mixer_mat_fx[0][j][add( band, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )] = Mpy_32_32( mixer_mat_fx[0][j][add( band, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )], Wscale_d[band] ); + move32(); } } } @@ -6083,147 +6309,140 @@ void ivas_dirac_dec_get_response_fx( const Word16 ambisonics_order, Word16 Q_out ) { - // float response[MAX_OUTPUT_CHANNELS]; - int16_t index_azimuth, index_elevation; - int16_t el, e, az; - // float cos_1, cos_2, sin_1, cos_az[3]; + Word16 index_azimuth, index_elevation; + Word16 el, e, az; Word32 cos_1_fx, cos_2_fx, sin_1_fx, cos_az_fx[3]; - // float sin_az[3]; Word32 sin_az_fx[3]; - // float f, c; Word32 f_fx; Word32 c_fx_better; - int16_t l, m; - int16_t b, b1, b_2, b1_2, a; + Word16 l, m; + Word16 b, b1, b_2, b1_2, a; - index_azimuth = ( azimuth + 180 ) % 360; - index_elevation = elevation + 90; - e = index_elevation > 90 ? -1 : 1; - el = index_elevation > 90 ? 180 - index_elevation : index_elevation; - az = index_azimuth > 180 ? 360 - index_azimuth : index_azimuth; - // f = index_azimuth > 180 ? -1.0f : 1.0f; - f_fx = index_azimuth > 180 ? -1 : 1; - // cos_1 = dirac_gains_trg_term[az][0]; + index_azimuth = add( azimuth, 180 ) % 360; + move16(); + index_elevation = add( elevation, 90 ); + IF( GT_16( index_elevation, 90 ) ) + { + e = -1; + move16(); + } + ELSE + { + e = 1; + move16(); + } + + IF( GT_16( index_elevation, 90 ) ) + { + el = sub( 180, index_elevation ); + move16(); + } + ELSE + { + el = index_elevation; + move16(); + } + + IF( GT_16( index_azimuth, 180 ) ) + { + az = sub( 360, index_azimuth ); + move16(); + } + ELSE + { + az = index_azimuth; + move16(); + } + + IF( GT_16( index_azimuth, 180 ) ) + { + f_fx = -1; + move16(); + } + ELSE + { + f_fx = 1; + move16(); + } cos_1_fx = dirac_gains_trg_term_fx[az][0]; - // cos_2 = cos_1 * cos_1; + move32(); cos_2_fx = Mpy_32_32( cos_1_fx, cos_1_fx ); - // sin_1 = f * dirac_gains_trg_term[az][1]; sin_1_fx = dirac_gains_trg_term_fx[az][1]; - if ( f_fx == -1 ) + move32(); + + if ( EQ_32( f_fx, -1 ) ) { sin_1_fx = L_negate( sin_1_fx ); + move32(); } - // cos_az[0] = cos_1; cos_az_fx[0] = cos_1_fx; - // cos_az[1] = 2.0f * cos_2 - 1.0f; - cos_az_fx[1] = L_shl_sat( ( cos_2_fx - ONE_IN_Q30 ), 1 ); - // cos_az[2] = 2.0f * cos_1 * cos_az[1] - cos_az[0]; - cos_az_fx[2] = L_shl_sat( ( Mpy_32_32( cos_1_fx, cos_az_fx[1] ) - L_shr( cos_az_fx[0], 1 ) ), 1 ); - // sin_az[0] = sin_1; + move32(); + cos_az_fx[1] = L_shl_sat( L_sub( cos_2_fx, ONE_IN_Q30 ), 1 ); + move32(); + cos_az_fx[2] = L_shl_sat( L_sub( Mpy_32_32( cos_1_fx, cos_az_fx[1] ), L_shr( cos_az_fx[0], 1 ) ), 1 ); + move32(); sin_az_fx[0] = sin_1_fx; - // sin_az[1] = sin_1 * 2.0f * cos_1; + move32(); sin_az_fx[1] = L_shl_sat( Mpy_32_32( sin_1_fx, cos_1_fx ), 1 ); - // sin_az[2] = sin_1 * ( 4.0f * cos_2 - 1.0f ); - sin_az_fx[2] = L_shl_sat( Mpy_32_32( sin_1_fx, ( cos_2_fx - ONE_IN_Q29 ) ), 2 ); + move32(); + sin_az_fx[2] = L_shl_sat( Mpy_32_32( sin_1_fx, L_sub( cos_2_fx, ONE_IN_Q29 ) ), 2 ); + move32(); - // response[0] = 1.0f; response_fx[0] = L_shl_sat( 1, Q_out ); - /* Un-optimized code - for reference */ - /* for( l = 1; l<= ambisonics_order; l++ ) */ - /* { */ - /* int16_t b, b1, a; */ - /* float c; */ - /* for( m = 0; m < l; m++ ) */ - /* { */ - /* b = l*l+m; */ - /* a = dirac_gains_P_idx[b]; */ - /* c = SQRT2 * dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; */ - - /* if( m%2 == 1 ) */ - /* { */ - /* c = c*e; */ - /* } */ - - /* response[b] = c * sin_az[l-m-1]; */ - - /* b1 = l*l+2*l-m; */ - /* response[b1] = c * cos_az[l-m-1]; */ - - /* } */ - - /* b = l*l+l; */ - /* a = dirac_gains_P_idx[b]; */ - /* c = dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; */ - /* if( l%2 == 1) */ - /* { */ - /* c = c*e; */ - /* } */ - - /* response[b] = c; */ - /* } */ + move32(); - for ( l = 1; l <= ambisonics_order; l++ ) + FOR( l = 1; l <= ambisonics_order; l++ ) { - b_2 = l * l; - b1_2 = l * l + 2 * l; - for ( m = 0; m < l; m += 2 ) + b_2 = imult1616( l, l ); + b1_2 = add( imult1616( l, l ), shl( l, 1 ) ); + FOR( m = 0; m < l; m += 2 ) { - b = b_2 + m; + b = add( b_2, m ); a = dirac_gains_P_idx[b]; - // c = SQRT2 * dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; - // c_fx = Mpy_32_32( SQRT2_FIXED, Mpy_32_32( dirac_gains_norm_term_fx[a], dirac_gains_Pnm_int[el][a] ) ); + move16(); c_fx_better = local_result_table[el][a]; - // response[b] = c * sin_az[l - m - 1]; - // response_fx[b] = Mpy_32_32( L_shl( c_fx, 3 ), sin_az_fx[l - m - 1] ); - response_fx[b] = L_shl_sat( Mpy_32_32( c_fx_better, sin_az_fx[l - m - 1] ), sub( Q_out, 30 ) ); // Q_out + move32(); + response_fx[b] = L_shl_sat( Mpy_32_32( c_fx_better, sin_az_fx[sub( sub( l, m ), 1 )] ), sub( Q_out, 30 ) ); // Q_out + move32(); - b1 = b1_2 - m; - // response[b1] = c * cos_az[l - m - 1]; - // response_fx[b1] = Mpy_32_32( L_shl( c_fx, 3 ), cos_az_fx[l - m - 1] ); - response_fx[b1] = L_shl_sat( Mpy_32_32( c_fx_better, cos_az_fx[l - m - 1] ), sub( Q_out, 30 ) ); // Q_out + b1 = sub( b1_2, m ); + response_fx[b1] = L_shl_sat( Mpy_32_32( c_fx_better, cos_az_fx[sub( sub( l, m ), 1 )] ), sub( Q_out, 30 ) ); // Q_out + move32(); } - for ( m = 1; m < l; m += 2 ) + FOR( m = 1; m < l; m += 2 ) { - b = b_2 + m; + b = add( b_2, m ); a = dirac_gains_P_idx[b]; - // c = SQRT2 * dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; - // c_fx = Mpy_32_32( SQRT2_FIXED, Mpy_32_32( dirac_gains_norm_term_fx[a], dirac_gains_Pnm_int[el][a] ) ); + move16(); c_fx_better = local_result_table[el][a]; - if ( e == -1 ) + move32(); + if ( EQ_16( e, -1 ) ) { - // c_fx = L_negate( c_fx ); c_fx_better = L_negate( c_fx_better ); } - // c = c * e; - - // response[b] = c * sin_az[l - m - 1]; - // response_fx[b] = Mpy_32_32( L_shl( c_fx, 3 ), sin_az_fx[l - m - 1] ); - response_fx[b] = L_shl_sat( Mpy_32_32( c_fx_better, sin_az_fx[l - m - 1] ), sub( Q_out, 30 ) ); // Q_out - b1 = b1_2 - m; - // response[b1] = c * cos_az[l - m - 1]; - // response_fx[b1] = Mpy_32_32( L_shl( c_fx, 3 ), cos_az_fx[l - m - 1] ); - response_fx[b1] = L_shl_sat( Mpy_32_32( c_fx_better, cos_az_fx[l - m - 1] ), sub( Q_out, 30 ) ); // Q_out + response_fx[b] = L_shl_sat( Mpy_32_32( c_fx_better, sin_az_fx[sub( sub( l, m ), 1 )] ), sub( Q_out, 30 ) ); // Q_out + move32(); + b1 = sub( b1_2, m ); + response_fx[b1] = L_shl_sat( Mpy_32_32( c_fx_better, cos_az_fx[sub( sub( l, m ), 1 )] ), sub( Q_out, 30 ) ); // Q_out + move32(); } - b = b_2 + l; + b = add( b_2, l ); a = dirac_gains_P_idx[b]; - // c = dirac_gains_norm_term[a] * dirac_gains_Pnm[el][a]; - // c_fx = Mpy_32_32( dirac_gains_norm_term_fx[a], dirac_gains_Pnm_int[el][a] ); + move16(); c_fx_better = local_result_table_2[el][a]; - if ( l % 2 == 1 ) + move32(); + IF( EQ_16( ( l % 2 ), 1 ) ) { - // c = c * e; - if ( e == -1 ) + if ( EQ_16( e, -1 ) ) { - // c_fx = L_negate( c_fx ); c_fx_better = L_negate( c_fx_better ); + move32(); } } - - // response[b] = c; - // response_fx[b] = L_shl( c_fx, 2 ); response_fx[b] = L_shl_sat( c_fx_better, sub( Q_out, 30 ) ); // Q_out + move32(); } return; @@ -6247,7 +6466,7 @@ Word16 ivas_get_bits_to_encode( WHILE( val ) { - bits_req++; + bits_req = add( bits_req, 1 ); val = L_shr( val, 1 ); } @@ -6445,39 +6664,45 @@ void ivas_spar_set_bitrate_config_fx( Word16 bands_bw; pSpar_md_cfg->nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport; + move16(); FOR( i = 0; i < pSpar_md_cfg->nchan_transport; i++ ) { pSpar_md_cfg->max_freq_per_chan[i] = ivas_spar_br_table_consts[table_idx].fpcs; + move16(); } pSpar_md_cfg->active_w = ivas_spar_br_table_consts[table_idx].active_w; + move16(); pSpar_md_cfg->agc_bits_ch_idx = ivas_spar_br_table_consts[table_idx].agc_bits_ch_idx; -#ifdef IVAS_FLOAT_FIXED + move16(); + ivas_spar_get_uniform_quant_strat_fx( pSpar_md_cfg, table_idx ); -#else - ivas_spar_get_uniform_quant_strat( pSpar_md_cfg, table_idx ); -#endif + pSpar_md_cfg->quant_strat_bits = ivas_get_bits_to_encode( MAX_QUANT_STRATS ); + move16(); /* BLOCK: getEntropyCoderModels */ pSpar_md_cfg->remix_unmix_order = ivas_spar_br_table_consts[table_idx].dmx_str; + move16(); /* bits per block*/ total_bits = 0; + move16(); max_bits = 0; + move16(); ivas_total_brate = ivas_spar_br_table_consts[table_idx].ivas_total_brate; + move32(); sba_order = ivas_spar_br_table_consts[table_idx].sba_order; + move16(); ivas_get_spar_table_idx_fx( ivas_total_brate, sba_order, ivas_spar_br_table_consts[table_idx].bwidth, &length, &code ); Word16 temp; Word16 div1; FOR( i = 0; i < pSpar_md_cfg->nchan_transport; i++ ) { - /* total_bits += (int16_t) ( ivas_spar_br_table_consts[table_idx].core_brs[i][0] / FRAMES_PER_SEC ); */ total_bits = add( total_bits, extract_l( Mpy_32_32( ivas_spar_br_table_consts[table_idx].core_brs[i][0], ONE_BY_FRAMES_PER_SEC_Q31 ) ) ); - /* max_bits += (int16_t) ( ivas_spar_br_table_consts[table_idx].core_brs[i][1] / FRAMES_PER_SEC ); */ max_bits = add( max_bits, extract_l( Mpy_32_32( ivas_spar_br_table_consts[table_idx].core_brs[i][1], ONE_BY_FRAMES_PER_SEC_Q31 ) ) ); } @@ -6485,28 +6710,36 @@ void ivas_spar_set_bitrate_config_fx( div1 = extract_l( Mpy_32_32( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); pSpar_md_cfg->tgt_bits_per_blk = sub( div1, add( add( add( add( add( IVAS_FORMAT_SIGNALING_NBITS_EXTENDED, SBA_PLANAR_BITS ), 0 ), SBA_ORDER_BITS ), length ), total_bits ) ); pSpar_md_cfg->max_bits_per_blk = sub( div1, add( add( add( add( add( IVAS_FORMAT_SIGNALING_NBITS_EXTENDED, SBA_PLANAR_BITS ), 0 ), SBA_ORDER_BITS ), length ), max_bits ) ); + move16(); + move16(); md_coding_bits_header = add( SPAR_NUM_CODING_STRAT_BITS, pSpar_md_cfg->quant_strat_bits ); pSpar_md_cfg->tgt_bits_per_blk = sub( pSpar_md_cfg->tgt_bits_per_blk, md_coding_bits_header ); pSpar_md_cfg->max_bits_per_blk = sub( pSpar_md_cfg->max_bits_per_blk, md_coding_bits_header ); + move16(); + move16(); IF( LT_32( ivas_total_brate, IVAS_24k4 ) ) { bands_bw = 2; + move16(); } ELSE { bands_bw = 1; + move16(); } - /* pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->tgt_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); */ pSpar_md_cfg->tgt_bits_per_blk = extract_l( Mpy_32_32( i_mult( pSpar_md_cfg->tgt_bits_per_blk, num_bands ), 178956971 /* 1 / IVAS_MAX_NUM_BANDS in Q31 */ ) ); - /* pSpar_md_cfg->max_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->max_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); */ pSpar_md_cfg->max_bits_per_blk = extract_l( Mpy_32_32( i_mult( pSpar_md_cfg->max_bits_per_blk, num_bands ), 178956971 /* 1 / IVAS_MAX_NUM_BANDS in Q31 */ ) ); pSpar_md_cfg->tgt_bits_per_blk = add( pSpar_md_cfg->tgt_bits_per_blk, md_coding_bits_header ); pSpar_md_cfg->max_bits_per_blk = add( pSpar_md_cfg->max_bits_per_blk, md_coding_bits_header ); + move16(); + move16(); + move16(); + move16(); IF( enc_flag ) { @@ -6514,13 +6747,24 @@ void ivas_spar_set_bitrate_config_fx( IF( GE_32( ivas_total_brate, BRATE_SPAR_Q_STRAT ) ) { quant_strat = QUANT_STRAT_0; + move16(); } ELSE { quant_strat = QUANT_STRAT_2; + move16(); } - num_PR_bits_dirac_bands = ( EQ_16( dirac2spar_md_flag, 1 ) ) ? sub( num_bands, SPAR_DIRAC_SPLIT_START_BAND ) : 0; + IF( EQ_16( dirac2spar_md_flag, 1 ) ) + { + num_PR_bits_dirac_bands = sub( num_bands, SPAR_DIRAC_SPLIT_START_BAND ); + move16(); + } + ELSE + { + num_PR_bits_dirac_bands = 0; + move16(); + } div1 = BASOP_Util_Divide3232_Scale( num_PR_bits_dirac_bands, bands_bw, &temp ); num_PR_bits_dirac_bands = shr( div1, sub( 15, temp ) ); num_PR_bits_dirac_bands = s_max( 0, num_PR_bits_dirac_bands ); @@ -6528,8 +6772,10 @@ void ivas_spar_set_bitrate_config_fx( n_input = ivas_sba_get_nchan_metadata_fx( sba_order, ivas_total_brate ); n_dmx = ivas_spar_br_table_consts[table_idx].nchan_transport; + move16(); n_dec = sub( n_input, n_dmx ); bits_PR = ivas_spar_br_table_consts_fx[table_idx].q_lvls[quant_strat][0]; + move16(); num_PR_bits_dirac_bands = i_mult( num_PR_bits_dirac_bands, bits_PR ); bits_PR = i_mult( bits_PR, sub( n_input, 1 ) ); bits_C = i_mult( ivas_spar_br_table_consts_fx[table_idx].q_lvls[quant_strat][1], i_mult( sub( n_dmx, 1 ), n_dec ) ); @@ -6552,6 +6798,7 @@ void ivas_spar_set_bitrate_config_fx( IF( EQ_16( pSpar_md_cfg->nchan_transport, 1 ) ) { agc_bits = AGC_BITS_PER_CH; + move16(); } ELSE { @@ -6561,11 +6808,14 @@ void ivas_spar_set_bitrate_config_fx( ELSE { agc_bits = AGC_SIGNALLING_BITS; + move16(); } + test(); IF( EQ_32( ivas_total_brate, PCA_BRATE ) && EQ_32( sba_order, SBA_FOA_ORDER ) ) { pca_bits = 1; + move16(); IF( pca_flag ) { pca_bits = add( pca_bits, sub( add( IVAS_PCA_QBITS, IVAS_PCA_QBITS ), 1 ) ); @@ -6574,9 +6824,11 @@ void ivas_spar_set_bitrate_config_fx( ELSE { pca_bits = 0; + move16(); } pSpar_md_cfg->max_md_bits_spar = add( add( pSpar_md_cfg->max_bits_per_blk, agc_bits ), pca_bits ); + move16(); } return; @@ -6588,6 +6840,7 @@ void ivas_spar_set_bitrate_config_fx( * Set SPAR bitrate distribution *-----------------------------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void ivas_spar_bitrate_dist( int32_t core_brates_act[], /* o : bitrates per core-coder */ const int16_t nAvailBits, /* i : number of available bits */ @@ -6671,3 +6924,99 @@ void ivas_spar_bitrate_dist( return; } + +#else +void ivas_spar_bitrate_dist_fx( + Word32 core_brates_act[], /* o : bitrates per core-coder */ + const Word16 nAvailBits, /* i : number of available bits */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + const Word16 bwidth /* i : audio bandwidth */ +) +{ + Word16 i, nchan_transport, table_idx, bitlen; + Word16 core_bits_act[FOA_CHANNELS], core_range_bits[FOA_CHANNELS]; + Word16 sum_core_act_bits, residual_bits, overflow_bits; + + table_idx = ivas_get_spar_table_idx( ivas_total_brate, sba_order, bwidth, &bitlen, NULL ); + + nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport; + move16(); + + sum_core_act_bits = 0; + move16(); + FOR( i = 0; i < nchan_transport; i++ ) + { + core_bits_act[i] = extract_l( Mpy_32_16_1( ivas_spar_br_table_consts[table_idx].core_brs[i][0], INV_FRAME_PER_SEC_Q15 ) ); + move16(); + + sum_core_act_bits = add( sum_core_act_bits, core_bits_act[i] ); + } + + residual_bits = sub( nAvailBits, sum_core_act_bits ); + + /* First compute core-coder bits as per bitrate distribution table and MD bitrate*/ + IF( residual_bits > 0 ) + { + FOR( i = 0; i < nchan_transport; i++ ) + { + core_range_bits[i] = extract_l( Mpy_32_16_1( L_sub( ivas_spar_br_table_consts[table_idx].core_brs[i][2], ivas_spar_br_table_consts[table_idx].core_brs[i][0] ), INV_FRAME_PER_SEC_Q15 ) ); + move16(); + core_bits_act[i] = add( core_bits_act[i], min( residual_bits, core_range_bits[i] ) ); + move16(); + residual_bits = sub( residual_bits, core_range_bits[i] ); + + IF( residual_bits <= 0 ) + { + BREAK; + } + } + } + ELSE + { + FOR( i = 0; i < nchan_transport; i++ ) + { + core_range_bits[i] = extract_l( Mpy_32_16_1( L_sub( ivas_spar_br_table_consts[table_idx].core_brs[i][0], ivas_spar_br_table_consts[table_idx].core_brs[i][1] ), INV_FRAME_PER_SEC_Q15 ) ); + move16(); + } + + overflow_bits = negate( residual_bits ); + + FOR( i = 0; i < nchan_transport; i++ ) + { + core_bits_act[sub( sub( nchan_transport, 1 ), i )] = sub( core_bits_act[sub( sub( nchan_transport, 1 ), i )], min( overflow_bits, core_range_bits[sub( sub( nchan_transport, 1 ), i )] ) ); + move16(); + overflow_bits = sub( overflow_bits, core_range_bits[sub( sub( nchan_transport, 1 ), i )] ); + + IF( overflow_bits <= 0 ) + { + BREAK; + } + } + + IF( overflow_bits > 0 ) + { + Word16 overflow_bits_ch; + overflow_bits_ch = idiv1616( overflow_bits, nchan_transport ); + + FOR( i = 0; i < nchan_transport; i++ ) + { + core_bits_act[i] = sub( core_bits_act[i], overflow_bits_ch ); + move16(); + overflow_bits = sub( overflow_bits, overflow_bits_ch ); + } + + core_bits_act[sub( nchan_transport, 1 )] = sub( core_bits_act[sub( nchan_transport, 1 )], max( 0, overflow_bits ) ); + move16(); + } + } + + FOR( i = 0; i < nchan_transport; i++ ) + { + core_brates_act[i] = L_mult0( core_bits_act[i], FRAMES_PER_SEC ); + move32(); + } + + return; +} +#endif diff --git a/lib_com/ivas_stereo_dft_com.c b/lib_com/ivas_stereo_dft_com.c index 595d8f1db..b315083d8 100644 --- a/lib_com/ivas_stereo_dft_com.c +++ b/lib_com/ivas_stereo_dft_com.c @@ -43,6 +43,7 @@ #include "ivas_prot_fx.h" #endif +#define INV_FPS 655 // Q15 /*------------------------------------------------------------------------- * stereo_dft_config() * @@ -73,7 +74,7 @@ void stereo_dft_config_fx( move16(); /* ITD, IPD and residual coding is not used in SID/No data */ - IF( EQ_32( brate, FRAME_NO_DATA ) ) + IF( brate == FRAME_NO_DATA ) { *bits_frame_nominal = FRAME_NO_DATA; move16(); @@ -324,15 +325,16 @@ Word16 stereo_dft_band_config_fx( Word16 nbands; /*sanity check*/ - assert( ( EQ_16( band_res, 1 ) || EQ_16( band_res, 0 ) || EQ_16( band_res, 2 ) ) && "stereo DFT: Parameter band resolution not supported!\n" ); + assert( ( EQ_16( band_res, 1 ) || ( band_res == 0 ) || EQ_16( band_res, 2 ) ) && "stereo DFT: Parameter band resolution not supported!\n" ); band_limits[0] = 1; move16(); nbands = 0; move16(); - WHILE( LT_16( band_limits[nbands++], shr( NFFT, 1 ) ) ) + WHILE( LT_16( band_limits[nbands], shr( NFFT, 1 ) ) ) { - IF( EQ_16( band_res, 0 ) ) + nbands = add( nbands, 1 ); + IF( band_res == 0 ) { assert( 0 && "stereo DFT: band config failed!\n" ); } @@ -367,7 +369,7 @@ Word16 stereo_dft_band_config_fx( assert( ( LT_16( nbands, STEREO_DFT_ERB8_BANDS ) ) && "stereo DFT: band config failed!\n" ); } } - nbands = sub( nbands, 1 ); + band_limits[nbands] = shr( NFFT, 1 ); /*Nyquist Freq*/ move16(); diff --git a/lib_com/ivas_stereo_eclvq_com_fx.c b/lib_com/ivas_stereo_eclvq_com_fx.c index 1fd3ce5a4..c72cc5510 100644 --- a/lib_com/ivas_stereo_eclvq_com_fx.c +++ b/lib_com/ivas_stereo_eclvq_com_fx.c @@ -54,8 +54,11 @@ void ECSQ_init_instance_fx( void *ac_handle ) { ecsq_inst->config_index = config_index; + move16(); ecsq_inst->encoding_active = 1; + move16(); ecsq_inst->bit_count_estimate = 0; + move32(); ecsq_inst->ac_handle = ac_handle; return; @@ -73,6 +76,7 @@ Word32 ECSQ_dequantize_gain_fx( Word32 global_gain; Word32 L_tmp, L_prod; Word16 gg_e, tmp_e = 16; + move16(); /* pow(10.0, index * ECLVQ_INV_GLOBAL_GAIN_FACTOR) = pow(2.0,(index * ECLVQ_INV_GLOBAL_GAIN_FACTOR)*3.321928 */ L_prod = Mpy_32_16_1( ECLVQ_INV_GLOBAL_GAIN_FACTOR_Q24, shl( index, 8 ) ); /* Q17 */ @@ -103,6 +107,7 @@ void ECSQ_dequantize_vector_fx( FOR( i = 0; i < N; ++i ) { output[i] = Mpy_32_16_1( global_gain, input[i] ); + move32(); } return; diff --git a/lib_com/ivas_stereo_ica_com_fx.c b/lib_com/ivas_stereo_ica_com_fx.c index a4881b800..f5f4c423d 100644 --- a/lib_com/ivas_stereo_ica_com_fx.c +++ b/lib_com/ivas_stereo_ica_com_fx.c @@ -133,11 +133,19 @@ static void interpTargetChannel_fx( Word32 spread_factor2_fx; Word64 tempD1_fx, tempD2_fx; - d = sub( prevShift, currShift ); - signShift = GE_16( d, 0 ) ? ( 1 ) : ( -1 ); - move16(); + d = negate( sub( currShift, prevShift ) ); + IF( d >= 0 ) + { + signShift = 1; + move16(); + } + ELSE + { + signShift = -1; + move16(); + } - IF( EQ_16( d, 0 ) ) + IF( d == 0 ) { /* this can happen in DFT->TD switching */ return; @@ -187,21 +195,21 @@ static void interpTargetChannel_fx( ptr1_fx = target_fx; ptr2_fx = tempBuff1_fx + ( N_MAX_SHIFT_CHANGE + 1 ) * INTERP_FACTOR1; - FOR( i = -( N_MAX_SHIFT_CHANGE + 1 ) * INTERP_FACTOR1; i < ( N + N_MAX_SHIFT_CHANGE + 1 ) * INTERP_FACTOR1; i++ ) + FOR( i = -( N_MAX_SHIFT_CHANGE + 1 ) * INTERP_FACTOR1; i < imult1616( ( add( add( N, N_MAX_SHIFT_CHANGE ), 1 ) ), INTERP_FACTOR1 ); i++ ) { - IF( i & 0x1 ) + IF( s_and( i, 0x1 ) ) { ptr2_fx[i] = 0; move32(); /* lim1 = ceil((i - SINC_ORDER1)*SPREAD_FACTOR1); */ /* lim2 = floor((i + SINC_ORDER1)*SPREAD_FACTOR1); */ - lim1 = add( shr( ( i - SINC_ORDER1 ), 1 ), 1 ); + lim1 = add( shr( sub( i, SINC_ORDER1 ), 1 ), 1 ); - lim2 = shr( ( i + SINC_ORDER1 ), 1 ); + lim2 = shr( add( i, SINC_ORDER1 ), 1 ); FOR( j = lim1; j <= lim2; j++ ) { - ptr2_fx[i] = L_add( Mpy_32_32( win_fx[j * INTERP_FACTOR1 - i], ptr1_fx[j] ), ptr2_fx[i] ); + ptr2_fx[i] = L_add( Mpy_32_32( win_fx[sub( imult1616( j, INTERP_FACTOR1 ), i )], ptr1_fx[j] ), ptr2_fx[i] ); move32(); } } @@ -216,17 +224,35 @@ static void interpTargetChannel_fx( ptr1_fx = ptr2_fx; ptr2_fx = tempBuff2_fx; - tempD1_fx = table_D1_pointer[L_abs( d )]; - move64(); - tempD2_fx = 3 * table_D1_pointer[L_abs( d )]; - move64(); + tempD1_fx = W_deposit32_l( table_D1_pointer[L_abs( d )] ); + tempD2_fx = W_mult0_32_32( 3, table_D1_pointer[L_abs( d )] ); - tempF1_fx = L_sub( d * factor_fx, ( EQ_16( signShift, 1 ) ? ONE_IN_Q12 : -( ONE_IN_Q12 ) ) ); - FOR( k = 0; k < N - 1; k++ ) + IF( EQ_16( signShift, 1 ) ) { - Word32 local = ( ( (Word64) tempF1_fx * spread_factor2_fx ) >> 31 ) - ONE_IN_Q12; - Word32 sign_local = GT_32( local, 0 ) ? 1 : -1; - Word32 local_int = (Word32) W_shr( W_abs( local ), 12 ); + tempF1_fx = ONE_IN_Q12; + move32(); + } + ELSE + { + tempF1_fx = -ONE_IN_Q12; + move32(); + } + tempF1_fx = L_sub( imult3216( factor_fx, d ), tempF1_fx ); + FOR( k = 0; k < sub( N, 1 ); k++ ) + { + Word32 local = L_sub( W_extract_l( W_shr( W_mult0_32_32( tempF1_fx, spread_factor2_fx ), 31 ) ), ONE_IN_Q12 ); + Word32 sign_local; + IF( local > 0 ) + { + sign_local = 1; + move32(); + } + ELSE + { + sign_local = -1; + move32(); + } + Word32 local_int = W_extract_l( W_shr( W_abs( local ), 12 ) ); Word32 res_a1, res_a2, res_a3; Word32 res_b1, res_b2, res_b3; Word32 res_c1, res_c2, res_c3; @@ -235,24 +261,24 @@ static void interpTargetChannel_fx( Word64 res_a, res_b, res_c, res_d; Word64 tempa, tempb; Word64 mult_a_D1, mult_b_D2; - local_int = sign_local * local_int; - local_int_scaled = local_int << 12; - lim1 = (Word16) local_int; - IF( local_int_scaled > local ) + local_int = W_extract_l( W_mult0_32_32( sign_local, local_int ) ); + local_int_scaled = W_deposit32_l( L_shl( local_int, 12 ) ); + lim1 = extract_l( local_int ); + if ( W_sub( local_int_scaled, local ) > 0 ) { - lim1--; + lim1 = sub( lim1, 1 ); } y_fx[0] = ptr1_fx[lim1]; move32(); - y_fx[1] = ptr1_fx[lim1 + 1]; + y_fx[1] = ptr1_fx[add( lim1, 1 )]; move32(); - y_fx[2] = ptr1_fx[lim1 + 2]; + y_fx[2] = ptr1_fx[add( lim1, 2 )]; move32(); - y_fx[3] = ptr1_fx[lim1 + 3]; + y_fx[3] = ptr1_fx[add( lim1, 3 )]; move32(); - x_fx[0] = lim1 * interp_factor2_fx; + x_fx[0] = imult3216( interp_factor2_fx, lim1 ); move32(); x_fx[1] = L_add( x_fx[0], interp_factor2_fx ); move32(); @@ -265,38 +291,49 @@ static void interpTargetChannel_fx( res_a1 = L_sub( tempF1_fx, x_fx[0] ); res_a2 = L_sub( tempF1_fx, x_fx[1] ); res_a3 = L_sub( tempF1_fx, x_fx[2] ); - res_a = ( ( (Word64) res_a1 * res_a2 ) >> 12 ) * res_a3; - res_a = ( y_fx[3] * ( res_a >> 16 ) ); + res_a = W_shr( W_mult0_32_32( res_a1, res_a2 ), 12 ) * res_a3; + res_a = ( y_fx[3] * W_shr( res_a, 16 ) ); res_b1 = L_sub( tempF1_fx, x_fx[1] ); res_b2 = L_sub( tempF1_fx, x_fx[2] ); res_b3 = L_sub( tempF1_fx, x_fx[3] ); - res_b = ( ( (Word64) res_b1 * res_b2 ) >> 12 ) * res_b3; - res_b = ( y_fx[0] * ( res_b >> 16 ) ); + res_b = W_shr( W_mult0_32_32( res_b1, res_b2 ), 12 ) * res_b3; + res_b = ( y_fx[0] * W_shr( res_b, 16 ) ); res_c1 = L_sub( tempF1_fx, x_fx[0] ); res_c2 = L_sub( tempF1_fx, x_fx[2] ); res_c3 = L_sub( tempF1_fx, x_fx[3] ); - res_c = ( ( (Word64) res_c1 * res_c2 ) >> 12 ) * res_c3; - res_c = ( y_fx[1] * ( res_c >> 16 ) ); + res_c = W_shr( W_mult0_32_32( res_c1, res_c2 ), 12 ) * res_c3; + res_c = ( y_fx[1] * W_shr( res_c, 16 ) ); res_d1 = L_sub( tempF1_fx, x_fx[0] ); res_d2 = L_sub( tempF1_fx, x_fx[1] ); res_d3 = L_sub( tempF1_fx, x_fx[3] ); - res_d = ( ( (Word64) res_d1 * res_d2 ) >> 12 ) * res_d3; - res_d = ( y_fx[2] * ( res_d >> 16 ) ); + res_d = W_shr( W_mult0_32_32( res_d1, res_d2 ), 12 ) * res_d3; + res_d = ( y_fx[2] * W_shr( res_d, 16 ) ); tempa = W_sub( res_a, res_b ); tempb = W_sub( res_c, res_d ); - mult_a_D1 = ( tempD1_fx * ( tempa >> 14 ) ) >> 15; - mult_b_D2 = ( tempD2_fx * ( tempb >> 14 ) ) >> 15; - ptr2_fx[k] = (Word32) ( ( mult_a_D1 + mult_b_D2 ) >> 14 ); // 38-14 - tempF1_fx = (Word32) W_add( tempF1_fx, L_sub( factor_fx, ( EQ_16( signShift, 1 ) ? ONE_IN_Q12 : -( ONE_IN_Q12 ) ) ) ); + mult_a_D1 = W_shr( ( tempD1_fx * W_shr( tempa, 14 ) ), 15 ); + mult_b_D2 = W_shr( ( tempD2_fx * W_shr( tempb, 14 ) ), 15 ); + ptr2_fx[k] = W_extract_l( ( W_shr( W_add( mult_a_D1, mult_b_D2 ), 14 ) ) ); // 38-14 + move32(); + + IF( EQ_16( signShift, 1 ) ) + { + tempF1_fx = W_extract_l( W_add( tempF1_fx, L_sub( factor_fx, ONE_IN_Q12 ) ) ); + move32(); + } + ELSE + { + tempF1_fx = W_extract_l( W_add( tempF1_fx, L_sub( factor_fx, -ONE_IN_Q12 ) ) ); + move32(); + } } ptr1_fx = target_fx; - Copy32( ptr2_fx, ptr1_fx, N - 1 ); + Copy32( ptr2_fx, ptr1_fx, sub( N, 1 ) ); return; } @@ -321,15 +358,14 @@ static void targetCh_AlignStereoDFT_fx( Word32 fadeOutBuff_fx[L_SHIFT_ADAPT_MAX]; Word32 fadeInBuff_fx[L_SHIFT_ADAPT_MAX]; - d = sub( prevShift, currShift ); + d = negate( sub( currShift, prevShift ) ); Copy32( target_fx + d, fadeOutBuff_fx, L_shift_adapt ); Copy32( target_fx, fadeInBuff_fx, L_shift_adapt ); - IF( GT_16( L_shift_adapt, 0 ) ) + IF( L_shift_adapt > 0 ) { alpha_fx = 0; - move32(); SWITCH( L_shift_adapt ) { case 596: @@ -385,7 +421,7 @@ void adjustTargetSignal_fx( { /* inter-frame shift variation and target shifting */ - IF( EQ_16( method, 0 ) ) + IF( method == 0 ) { interpTargetChannel_fx( target_fx, prevShift, currShift, L_shift_adapt ); } diff --git a/lib_com/ivas_stereo_mdct_bands_com.c b/lib_com/ivas_stereo_mdct_bands_com.c index 7fa5c100d..1cc569461 100644 --- a/lib_com/ivas_stereo_mdct_bands_com.c +++ b/lib_com/ivas_stereo_mdct_bands_com.c @@ -84,13 +84,22 @@ void stereo_mdct_init_bands_fx( { tcx_mode = tmp_tcx_mode; move16(); - L_frameTCX = EQ_16( tcx_mode, TCX_20_CORE ) ? L_frame : ( L_frame / 2 ); - move16(); + + IF( EQ_16( tcx_mode, TCX_20_CORE ) ) + { + L_frameTCX = L_frame; + move16(); + } + ELSE + { + L_frameTCX = shr( L_frame, 1 ); + move16(); + } } ELSE { /*transition frame*/ - L_frameTCX = add( L_frame, L_frame / 4 ); + L_frameTCX = add( L_frame, shr( L_frame, 2 ) ); tcx_mode = TCX_20_CORE; move16(); } @@ -100,10 +109,27 @@ void stereo_mdct_init_bands_fx( { sfbParam.steBands = mdctStereoBands_32000_640; - cnt = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bdnCnt_TCX20[0] : sfbParam.steBands->bndCnt_TCX10[0]; - move16(); + IF( EQ_16( tcx_mode, TCX_20_CORE ) ) + { + cnt = sfbParam.steBands->bdnCnt_TCX20[0]; + move16(); + } + ELSE + { + cnt = sfbParam.steBands->bndCnt_TCX10[0]; + move16(); + } - sfbWidths = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bandLengthsTCX20 : sfbParam.steBands->bandLengthsTCX10; + IF( EQ_16( tcx_mode, TCX_20_CORE ) ) + { + sfbWidths = sfbParam.steBands->bandLengthsTCX20; + move16(); + } + ELSE + { + sfbWidths = sfbParam.steBands->bandLengthsTCX10; + move16(); + } } ELSE { @@ -114,15 +140,40 @@ void stereo_mdct_init_bands_fx( SWITCH( L_frame ) { case L_FRAME32k: - cnt = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bdnCnt_TCX20[1] : sfbParam.steBands->bndCnt_TCX10[1]; - move16(); + IF( EQ_16( tcx_mode, TCX_20_CORE ) ) + { + cnt = sfbParam.steBands->bdnCnt_TCX20[1]; + move16(); + } + ELSE + { + cnt = sfbParam.steBands->bndCnt_TCX10[1]; + move16(); + } BREAK; case L_FRAME25_6k: - cnt = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bdnCnt_TCX20[2] : sfbParam.steBands->bndCnt_TCX10[2]; - move16(); + IF( EQ_16( tcx_mode, TCX_20_CORE ) ) + { + cnt = sfbParam.steBands->bdnCnt_TCX20[2]; + move16(); + } + ELSE + { + cnt = sfbParam.steBands->bndCnt_TCX10[2]; + move16(); + } BREAK; case L_FRAME16k: - cnt = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bdnCnt_TCX20[3] : sfbParam.steBands->bndCnt_TCX10[3]; + IF( EQ_16( tcx_mode, TCX_20_CORE ) ) + { + cnt = sfbParam.steBands->bdnCnt_TCX20[3]; + move16(); + } + ELSE + { + cnt = sfbParam.steBands->bndCnt_TCX10[3]; + move16(); + } move16(); BREAK; default: @@ -130,7 +181,16 @@ void stereo_mdct_init_bands_fx( return; } - sfbWidths = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.steBands->bandLengthsTCX20 : sfbParam.steBands->bandLengthsTCX10; + IF( EQ_16( tcx_mode, TCX_20_CORE ) ) + { + sfbWidths = sfbParam.steBands->bandLengthsTCX20; + move16(); + } + ELSE + { + sfbWidths = sfbParam.steBands->bandLengthsTCX10; + move16(); + } } ELSE { @@ -151,7 +211,16 @@ void stereo_mdct_init_bands_fx( return; } - sfbWidths = EQ_16( tcx_mode, TCX_20_CORE ) ? sfbParam.lpcBndsParam->bandLengthsTCX20 : sfbParam.lpcBndsParam->bandLengthsTCX10; + IF( EQ_16( tcx_mode, TCX_20_CORE ) ) + { + sfbWidths = sfbParam.lpcBndsParam->bandLengthsTCX20; + move16(); + } + ELSE + { + sfbWidths = sfbParam.lpcBndsParam->bandLengthsTCX10; + move16(); + } cnt = 64; move16(); } @@ -181,7 +250,17 @@ void stereo_mdct_init_bands_fx( IF( igf ) { Word16 sfbOldCnt = *sfbCnt; - Word16 igfSfbStep = hIgfGrid->infoIsRefined ? 2 : 1; + Word16 igfSfbStep; + IF( hIgfGrid->infoIsRefined ) + { + igfSfbStep = 2; + move16(); + } + ELSE + { + igfSfbStep = 1; + move16(); + } Word16 k; move16(); move16(); @@ -213,7 +292,7 @@ void stereo_mdct_init_bands_fx( move16(); /* better save than sorry, overwrite anything that is left above */ - FOR( i = *sfbCnt + 1; i < sfbOldCnt + 1; i++ ) + FOR( i = add( *sfbCnt, 1 ); i < add( sfbOldCnt, 1 ); i++ ) { sfbOffset[i] = 0; move16(); @@ -224,9 +303,9 @@ void stereo_mdct_init_bands_fx( IF( LT_16( sfbOffset[*sfbCnt], L_frameTCX ) ) { Word16 nMissingBins = sub( L_frameTCX, sfbOffset[*sfbCnt] ); - if ( LT_16( sfbWidths[i] / 2, nMissingBins ) ) + if ( LT_16( shr( sfbWidths[i], 1 ), nMissingBins ) ) { - ( *sfbCnt )++; + *sfbCnt = add( *sfbCnt, 1 ); } sfbOffset[*sfbCnt] = L_frameTCX; move16(); diff --git a/lib_com/ivas_stereo_mdct_stereo_com.c b/lib_com/ivas_stereo_mdct_stereo_com.c index a17ba876f..f28c69b22 100644 --- a/lib_com/ivas_stereo_mdct_stereo_com.c +++ b/lib_com/ivas_stereo_mdct_stereo_com.c @@ -56,10 +56,10 @@ void splitAvailableBits_fx( Word16 *bits_ch1 /* o : bits for channel 1 */ ) { - assert( split_ratio >= 1 && split_ratio < SMDCT_BITRATE_RATIO_RANGE ); + assert( split_ratio >= 1 && LT_16( split_ratio, SMDCT_BITRATE_RATIO_RANGE ) ); /* *bits_ch0 = split_ratio * total_bits / SMDCT_BITRATE_RATIO_RANGE; */ - *bits_ch0 = extract_l( L_mult0( split_ratio, total_bits ) / SMDCT_BITRATE_RATIO_RANGE ); + *bits_ch0 = extract_l( L_shr( L_mult0( split_ratio, total_bits ), 3 ) ); move16(); /* for SBA mode bias the distribution towards the W channel */ test(); diff --git a/lib_com/ivas_stereo_psychlpc_com.c b/lib_com/ivas_stereo_psychlpc_com.c index fce1f62ab..33b6c20db 100644 --- a/lib_com/ivas_stereo_psychlpc_com.c +++ b/lib_com/ivas_stereo_psychlpc_com.c @@ -84,6 +84,8 @@ ivas_error PsychoacousticParameters_Init( pPsychParams->nBins = nBins; pPsychParams->nBands = nBands; + move16(); + move16(); IF( !isWarped ) { @@ -164,14 +166,22 @@ void SetCurrentPsychParams( const Word16 last_frame_was_concealed_cng, TCX_CONFIG_HANDLE hTcxCfg ) { - IF( EQ_16( hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) && EQ_16( last_frame_was_concealed_cng, 0 ) ) + test(); + IF( EQ_16( hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) && ( last_frame_was_concealed_cng == 0 ) ) { assert( core == TCX_20_CORE ); hTcxCfg->psychParamsCurrent = &hTcxCfg->psychParamsTCX20AfterACELP; } ELSE { - hTcxCfg->psychParamsCurrent = ( EQ_16( core, TCX_10_CORE ) ) ? &hTcxCfg->psychParamsTCX10 : &hTcxCfg->psychParamsTCX20; + IF( EQ_16( core, TCX_10_CORE ) ) + { + hTcxCfg->psychParamsCurrent = &hTcxCfg->psychParamsTCX10; + } + ELSE + { + hTcxCfg->psychParamsCurrent = &hTcxCfg->psychParamsTCX20; + } } return; diff --git a/lib_com/ivas_stereo_td_bit_alloc.c b/lib_com/ivas_stereo_td_bit_alloc.c index a03100b25..36f2cfc81 100644 --- a/lib_com/ivas_stereo_td_bit_alloc.c +++ b/lib_com/ivas_stereo_td_bit_alloc.c @@ -438,373 +438,477 @@ void tdm_bit_alloc( #else void tdm_bit_alloc( - const Word16 ivas_format, /* i : IVAS format */ - const Word16 ism_mode, /* i : ISM mode in combined format */ - const int32_t element_brate_wo_meta, /* i : element bitrate without metadata */ - const Word16 tdm_lp_reuse_flag, /* i : LPC reusage flag */ - Word32 *total_brate_pri, /* o : Allocated primary channel bitrate */ - Word32 *total_brate_sec, /* o : Allocated secondary channel bitrate */ - Word16 *tdm_low_rate_mode, /* o : secondary channel low rate mode flag*/ - const Word16 coder_type, /* i : secondary channel coder type */ - const Word16 ener_ratio_idx, /* i : correlation ratio indexe */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ - const Word16 bwidth_pri, /* i : bandwidth of the primary channel */ - const Word16 bwidth_sec, /* i : bandwidth of the secondary channel */ - const Word16 flag_ACELP16k_pri, /* i : ACELP@16kHz core flag, primary chan.*/ - const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ - const Word16 coder_type0, /* i : coder type (temporary in the encoder, from bitstream in decoder) */ - const Word16 tdm_inst_ratio_idx_ref /* i : instantaneous correlation ratio idx */ + const Word16 ivas_format, /* i : IVAS format */ + const Word16 ism_mode, /* i : ISM mode in combined format */ + const Word32 element_brate_wo_meta, /* i : element bitrate without metadata */ + const Word16 tdm_lp_reuse_flag, /* i : LPC reusage flag */ + Word32 *total_brate_pri, /* o : Allocated primary channel bitrate */ + Word32 *total_brate_sec, /* o : Allocated secondary channel bitrate */ + Word16 *tdm_low_rate_mode, /* o : secondary channel low rate mode flag*/ + const Word16 coder_type, /* i : secondary channel coder type */ + const Word16 ener_ratio_idx, /* i : correlation ratio indexe */ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const Word16 bwidth_pri, /* i : bandwidth of the primary channel */ + const Word16 bwidth_sec, /* i : bandwidth of the secondary channel */ + const Word16 flag_ACELP16k_pri, /* i : ACELP@16kHz core flag, primary chan.*/ + const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ + const Word16 coder_type0, /* i : coder type (temporary in the encoder, from bitstream in decoder) */ + const Word16 tdm_inst_ratio_idx_ref /* i : instantaneous correlation ratio idx */ ) { Word16 idx, four_subfr_fcb, two_subfr_fcb; Word32 bit_rate_diff_fx; - Word16 BWE_brate, tmp_bits; + Word32 BWE_brate; + Word16 tmp_bits; Word16 tdm_inst_ratio_idx = tdm_inst_ratio_idx_ref; - IF( tdm_inst_ratio_idx == TDM_NQ ) + move16(); + if ( EQ_16( tdm_inst_ratio_idx, TDM_NQ ) ) { tdm_inst_ratio_idx = LRTD_STEREO_MID_IS_PRIM; /* Bit rate almost split half and half*/ + move16(); } /* Decision on using the low rate mode or the normal mode */ /* default is using the low rate mode for the secondary channel coding*/ /* UC and IC are automatically coded with low rate mode */ *tdm_low_rate_mode = 1; + move16(); /* Allocating different bitrate to channels */ idx = 0; - IF( element_brate_wo_meta <= IVAS_13k2 ) + move16(); + IF( LE_32( element_brate_wo_meta, IVAS_13k2 ) ) { idx = 0; + move16(); } - ELSE IF( element_brate_wo_meta <= IVAS_16k4 ) + ELSE IF( LE_32( element_brate_wo_meta, IVAS_16k4 ) ) { idx = 1; + move16(); } - ELSE IF( element_brate_wo_meta <= IVAS_24k4 ) + ELSE IF( LE_32( element_brate_wo_meta, IVAS_24k4 ) ) { idx = 2; + move16(); } - ELSE IF( element_brate_wo_meta <= IVAS_32k ) + ELSE IF( LE_32( element_brate_wo_meta, IVAS_32k ) ) { idx = 3; + move16(); } - ELSE IF( element_brate_wo_meta <= IVAS_48k ) + ELSE IF( LE_32( element_brate_wo_meta, IVAS_48k ) ) { idx = 4; + move16(); } - IF( coder_type == UNVOICED && tdm_bit_allc_tbl[idx][coder_type] >= 4200 ) + test(); + if ( EQ_16( coder_type, UNVOICED ) && GE_16( tdm_bit_allc_tbl[idx][coder_type], 4200 ) ) { *tdm_low_rate_mode = 0; + move16(); } /* Secondary channel based bitrate allocation */ *total_brate_sec = tdm_bit_allc_tbl[idx][coder_type]; - + move16(); + + test(); + test(); + test(); + test(); + test(); + test(); /* secondary channel bitrate allocation based on the energy scaling ratio */ - IF( ( ( ivas_format != MASA_ISM_FORMAT || ism_mode == ISM_MODE_NONE ) && ( ( coder_type != UNVOICED ) || tdm_LRTD_flag == 1 ) ) || ( ivas_format == MASA_ISM_FORMAT && ism_mode != ISM_MODE_NONE && coder_type > UNVOICED ) ) + IF( ( ( NE_16( ivas_format, MASA_ISM_FORMAT ) || ism_mode == ISM_MODE_NONE ) && ( ( NE_16( coder_type, UNVOICED ) ) || EQ_16( tdm_LRTD_flag, 1 ) ) ) || ( EQ_16( ivas_format, MASA_ISM_FORMAT ) && ism_mode != ISM_MODE_NONE && GT_16( coder_type, UNVOICED ) ) ) { - bit_rate_diff_fx = ( element_brate_wo_meta - 2 * *total_brate_sec ); + bit_rate_diff_fx = L_sub( element_brate_wo_meta, L_shl( *total_brate_sec, 1 ) ); - IF( tdm_LRTD_flag == 1 ) /* > element_brate > STEREO_22k or CT0 not used */ + IF( EQ_16( tdm_LRTD_flag, 1 ) ) /* > element_brate > STEREO_22k or CT0 not used */ { /* further adjustment in function of the energy/correlation ratio */ IF( coder_type == INACTIVE ) { Word32 res_fix = 0; - res_fix = Mpy_32_32( 644245095, ( element_brate_wo_meta - 500 ) ); - res_fix = ( ( res_fix / 100 ) * 100 ); + move32(); + res_fix = Mpy_32_32( 644245095, L_sub( element_brate_wo_meta, 500 ) ); + res_fix = imult3216( Mpy_32_16_1( L_abs( res_fix ), 328 ), 100 ); + if ( res_fix < 0 ) + { + res_fix = L_negate( res_fix ); + } *total_brate_sec = max( *total_brate_sec, res_fix ); + move32(); - //*total_brate_sec = max(*total_brate_sec, (int16_t)(0.3f * (element_brate_wo_meta - 500) / 100) * 100); - tmp_bits = (Word16) ( -abs( tdm_inst_ratio_idx - 16 ) * 200 * idx ); + tmp_bits = imult1616( negate( abs_s( sub( tdm_inst_ratio_idx, 16 ) ) ), imult1616( idx, 200 ) ); } ELSE { Word32 res_fix = 0; - res_fix = Mpy_32_32( 1073741824, ( element_brate_wo_meta - 500 ) ); - res_fix = ( ( res_fix / 100 ) * 100 ); + move32(); + res_fix = Mpy_32_32( 1073741824, L_sub( element_brate_wo_meta, 500 ) ); + res_fix = imult3216( Mpy_32_16_1( L_abs( res_fix ), 328 ), 100 ); + if ( res_fix < 0 ) + { + res_fix = L_negate( res_fix ); + } *total_brate_sec = max( *total_brate_sec, res_fix ); + move32(); - //*total_brate_sec = max(*total_brate_sec, (int16_t)(0.5f * (element_brate_wo_meta - 500) / 100) * 100); - /* tmp_bits = -abs(tdm_inst_ratio_idx-16)*200*idx; */ - tmp_bits = (Word16) ( -abs( tdm_inst_ratio_idx - 16 ) * 100 * idx ); + tmp_bits = imult1616( negate( abs_s( sub( tdm_inst_ratio_idx, 16 ) ) ), imult1616( 100, idx ) ); } /* tmp_bits should be subtract from the secondary channel bitrate */ /* IF the primary channel doesn't correspond to the channel having the highest correlation to the mono- inverse the bitrate compensation */ - IF( ( ener_ratio_idx >= LRTD_STEREO_MID_IS_PRIM && tdm_inst_ratio_idx < LRTD_STEREO_MID_IS_PRIM ) || ( ener_ratio_idx < LRTD_STEREO_MID_IS_PRIM && tdm_inst_ratio_idx >= LRTD_STEREO_MID_IS_PRIM ) ) + test(); + test(); + test(); + if ( ( GE_16( ener_ratio_idx, LRTD_STEREO_MID_IS_PRIM ) && LT_16( tdm_inst_ratio_idx, LRTD_STEREO_MID_IS_PRIM ) ) || ( LT_16( ener_ratio_idx, LRTD_STEREO_MID_IS_PRIM ) && GE_16( tdm_inst_ratio_idx, LRTD_STEREO_MID_IS_PRIM ) ) ) { - tmp_bits *= -1; + tmp_bits = negate( tmp_bits ); } bit_rate_diff_fx = tmp_bits; + move16(); } - ELSE{ - IF( ener_ratio_idx < LRTD_STEREO_MID_IS_PRIM ){ - - bit_rate_diff_fx = ( LRTD_STEREO_MID_IS_PRIM - ener_ratio_idx ) * bit_rate_diff_fx; - bit_rate_diff_fx = L_shr( bit_rate_diff_fx, 1 ); - bit_rate_diff_fx = bit_rate_diff_fx / 10; // basop gives very minor deviation - } - ELSE - { - bit_rate_diff_fx = ( ener_ratio_idx - LRTD_STEREO_MID_IS_PRIM ) * bit_rate_diff_fx; - bit_rate_diff_fx = L_shr( bit_rate_diff_fx, 1 ); - bit_rate_diff_fx = bit_rate_diff_fx / 10; // basop gives very minor deviation - } -} -/*bit_rate_diff2 = ((Word16)(10.f*(-0.5f*ener_ratio_LR+0.5f)*bit_rate_diff)/100)*100;*/ -*total_brate_sec += ( (Word16) ( bit_rate_diff_fx / 100 ) * 100 ); -*total_brate_sec = max( *total_brate_sec, tdm_bit_allc_tbl[idx][coder_type] ); + ELSE + { + IF( LT_16( ener_ratio_idx, LRTD_STEREO_MID_IS_PRIM ) ) + { -IF( coder_type == INACTIVE && tdm_LRTD_flag == 0 ) -{ - *total_brate_sec = min( *total_brate_sec, MIN_BRATE_SWB_BWE ); -} + bit_rate_diff_fx = imult3216( bit_rate_diff_fx, sub( LRTD_STEREO_MID_IS_PRIM, ener_ratio_idx ) ); + bit_rate_diff_fx = L_shr( bit_rate_diff_fx, 1 ); + bit_rate_diff_fx = Mpy_32_16_1( L_abs( bit_rate_diff_fx ), 3277 ); + if ( bit_rate_diff_fx < 0 ) + { + bit_rate_diff_fx = L_negate( bit_rate_diff_fx ); + } + } + ELSE + { + bit_rate_diff_fx = imult3216( bit_rate_diff_fx, sub( ener_ratio_idx, LRTD_STEREO_MID_IS_PRIM ) ); + bit_rate_diff_fx = L_shr( bit_rate_diff_fx, 1 ); + bit_rate_diff_fx = Mpy_32_16_1( L_abs( bit_rate_diff_fx ), 3277 ); + if ( bit_rate_diff_fx < 0 ) + { + bit_rate_diff_fx = L_negate( bit_rate_diff_fx ); + } + } + } + /*bit_rate_diff2 = ((Word16)(10.f*(-0.5f*ener_ratio_LR+0.5f)*bit_rate_diff)/100)*100;*/ + Word32 temp = imult3216( Mpy_32_16_1( L_abs( bit_rate_diff_fx ), 328 ), 100 ); + if ( bit_rate_diff_fx < 0 ) + { + temp = L_negate( temp ); + } + *total_brate_sec = L_add( *total_brate_sec, temp ); + move32(); -IF( ( ener_ratio_idx <= 1 || ener_ratio_idx >= 29 ) && coder_type >= UNVOICED ) -{ - Word16 delta_brate = 0; + *total_brate_sec = max( *total_brate_sec, tdm_bit_allc_tbl[idx][coder_type] ); + move32(); - IF( bwidth_pri > WB ) - { - delta_brate = 600; /* To slightly compensate for SWB BWE instead of WB BWE */ - IF( element_brate_wo_meta <= IVAS_16k4 ) + test(); + IF( ( coder_type == INACTIVE ) && tdm_LRTD_flag == 0 ) { - delta_brate = 1250; /* To compensate for SWB BWE instead of WB BWE */ + *total_brate_sec = min( *total_brate_sec, MIN_BRATE_SWB_BWE ); + move32(); } - } - IF( element_brate_wo_meta <= IVAS_13k2 ) - { - *total_brate_sec = max( *total_brate_sec, 5600 + delta_brate ); /* ~42-47 % of the total bitrate */ - } - ELSE IF( element_brate_wo_meta <= IVAS_16k4 ) - { - *total_brate_sec = max( *total_brate_sec, 6500 + delta_brate ); /* ~40-43 % of the total bitrate */ - } - ELSE IF( element_brate_wo_meta <= IVAS_24k4 ) - { - *total_brate_sec = max( *total_brate_sec, 9000 + delta_brate ); /* ~37-39 % of the total bitrate */ - } - ELSE - { - *total_brate_sec = max( *total_brate_sec, 9600 + delta_brate ); /* ~30-32% of the total bitrate */ - } -} -ELSE -{ - *total_brate_sec = min( *total_brate_sec, Mpy_32_32( 9663677, element_brate_wo_meta ) * 100 ); -} + test(); + test(); + IF( ( LE_16( ener_ratio_idx, 1 ) || GE_16( ener_ratio_idx, 29 ) ) && GE_16( coder_type, UNVOICED ) ) + { + Word16 delta_brate = 0; + move16(); -*total_brate_sec = min( *total_brate_sec, 18000 ); -} -ELSE IF( coder_type == UNVOICED ) -{ - IF( tdm_lp_reuse_flag == 0 ) - { - *total_brate_sec += ( 31 + 5 ) * FRAMES_PER_SEC; - } -} + IF( GT_16( bwidth_pri, WB ) ) + { + delta_brate = 600; /* To slightly compensate for SWB BWE instead of WB BWE */ + move16(); + if ( LE_32( element_brate_wo_meta, IVAS_16k4 ) ) + { + delta_brate = 1250; /* To compensate for SWB BWE instead of WB BWE */ + move16(); + } + } -IF( coder_type <= UNVOICED ) -{ - *total_brate_sec = min( *total_brate_sec, MAX_TDM_UC_BRATE ); + IF( LE_32( element_brate_wo_meta, IVAS_13k2 ) ) + { + *total_brate_sec = max( *total_brate_sec, add( 5600, delta_brate ) ); /* ~42-47 % of the total bitrate */ + move32(); + } + ELSE IF( LE_32( element_brate_wo_meta, IVAS_16k4 ) ) + { + *total_brate_sec = max( *total_brate_sec, add( 6500, delta_brate ) ); /* ~40-43 % of the total bitrate */ + move32(); + } + ELSE IF( LE_32( element_brate_wo_meta, IVAS_24k4 ) ) + { + *total_brate_sec = max( *total_brate_sec, add( 9000, delta_brate ) ); /* ~37-39 % of the total bitrate */ + move32(); + } + ELSE + { + *total_brate_sec = max( *total_brate_sec, add( 9600, delta_brate ) ); /* ~30-32% of the total bitrate */ + move32(); + } + } + ELSE + { + *total_brate_sec = min( *total_brate_sec, Mpy_32_32( 9663677, element_brate_wo_meta ) * 100 ); + move32(); + } - IF( *total_brate_sec >= TDM_UC_NORMAL_MODE_MBRATE && tdm_lp_reuse_flag == 0 ) - { - *tdm_low_rate_mode = 0; - } - ELSE IF( *total_brate_sec >= TDM_UC_NORMAL_MODE_MBRATE_LP_R ) - { - *tdm_low_rate_mode = 0; + *total_brate_sec = min( *total_brate_sec, 18000 ); + move32(); } - ELSE IF( ( tdm_lp_reuse_flag == 0 && *total_brate_sec < TDM_UC_NORMAL_MODE_MINBR_LP_R && coder_type == UNVOICED ) || ( tdm_lp_reuse_flag == 0 && *total_brate_sec < ( tdm_bit_allc_tbl[idx][0] + MID_LP_BRATE ) ) ) + ELSE IF( coder_type == UNVOICED ) { - *total_brate_sec += MID_LP_BRATE; + IF( tdm_lp_reuse_flag == 0 ) + { + *total_brate_sec = L_add( *total_brate_sec, imult3216( FRAMES_PER_SEC, 36 ) ); + move32(); + } } -} -/* verify that primary channel bitrate is higher than the minimum supported bitrate */ -IF( flag_ACELP16k_pri ) -{ - BWE_brate = SWB_TBE_1k75; - IF( element_brate_wo_meta < IVAS_24k4 ) + IF( coder_type <= UNVOICED ) { - BWE_brate = SWB_TBE_1k10; + *total_brate_sec = min( *total_brate_sec, MAX_TDM_UC_BRATE ); + move32(); + + test(); + test(); + test(); + test(); + test(); + IF( GE_32( *total_brate_sec, TDM_UC_NORMAL_MODE_MBRATE ) && tdm_lp_reuse_flag == 0 ) + { + *tdm_low_rate_mode = 0; + move16(); + } + ELSE IF( GE_32( *total_brate_sec, TDM_UC_NORMAL_MODE_MBRATE_LP_R ) ) + { + *tdm_low_rate_mode = 0; + move16(); + } + ELSE IF( ( tdm_lp_reuse_flag == 0 && LT_32( *total_brate_sec, TDM_UC_NORMAL_MODE_MINBR_LP_R ) && EQ_16( coder_type, UNVOICED ) ) || ( tdm_lp_reuse_flag == 0 && LE_32( *total_brate_sec, L_deposit_l( add( tdm_bit_allc_tbl[idx][0], MID_LP_BRATE ) ) ) ) ) + { + *total_brate_sec = L_add( *total_brate_sec, MID_LP_BRATE ); + move32(); + } } - IF( bwidth_pri > WB && tdm_LRTD_flag == 0 ) - { - BWE_brate += ( STEREO_BITS_ICBWE + STEREO_ICBWE_MSFLAG_BITS ) * FRAMES_PER_SEC; - } - IF( bwidth_pri > SWB && tdm_LRTD_flag == 1 ) + /* verify that primary channel bitrate is higher than the minimum supported bitrate */ + IF( flag_ACELP16k_pri ) { - BWE_brate += 300; - } + BWE_brate = SWB_TBE_1k75; + move32(); - IF( bwidth_pri == FB ) - { - BWE_brate += ( FB_TBE_1k8 - SWB_TBE_1k75 ); - } + test(); + test(); + if ( LT_32( element_brate_wo_meta, IVAS_24k4 ) ) + { + BWE_brate = SWB_TBE_1k10; + move32(); + } - IF( element_brate_wo_meta - *total_brate_sec - BWE_brate < 14000 ) - { - *total_brate_sec = element_brate_wo_meta - 14000 - BWE_brate; - } -} -ELSE -{ - BWE_brate = SWB_TBE_1k75; - IF( bwidth_pri == WB ) - { - BWE_brate = WB_BWE_0k35; - IF( tdm_LRTD_flag == 0 ) + test(); + if ( GT_16( bwidth_pri, WB ) && tdm_LRTD_flag == 0 ) { - BWE_brate += 250; /* ICA Brate */ + BWE_brate = L_add( BWE_brate, ( STEREO_BITS_ICBWE + STEREO_ICBWE_MSFLAG_BITS ) * FRAMES_PER_SEC ); + } + test(); + if ( GT_16( bwidth_pri, SWB ) && EQ_16( tdm_LRTD_flag, 1 ) ) + { + BWE_brate = L_add( BWE_brate, 300 ); } - } - ELSE IF( tdm_LRTD_flag == 0 ) - { - BWE_brate += 350; /* ICA Brate */ - } -} -IF( coder_type0 == TRANSITION ) -{ - IF( element_brate_wo_meta > IVAS_13k2 ) - { - *total_brate_sec = min( *total_brate_sec, element_brate_wo_meta - ( ACELP_8k00 + BWE_brate ) ); + if ( EQ_16( bwidth_pri, FB ) ) + { + BWE_brate = L_add( BWE_brate, ( FB_TBE_1k8 - SWB_TBE_1k75 ) ); + } + + IF( LT_32( ( L_sub( ( L_sub( element_brate_wo_meta, *total_brate_sec ) ), BWE_brate ) ), 14000 ) ) + { + *total_brate_sec = L_sub( element_brate_wo_meta, L_add( 14000, BWE_brate ) ); + move32(); + } } ELSE { - *total_brate_sec = min( *total_brate_sec, element_brate_wo_meta - ( ACELP_7k20 + BWE_brate ) ); - } -} -ELSE -{ - *total_brate_sec = min( *total_brate_sec, element_brate_wo_meta - ( 5900 + BWE_brate ) ); -} - -IF( coder_type == INACTIVE ) -{ - *total_brate_sec = max( *total_brate_sec, tdm_bit_allc_tbl[0][0] ); /* sanity check to ensure the secondary channel always gets the minimal bitrate it needs */ -} -ELSE -{ - *total_brate_sec = max( *total_brate_sec, 3500 ); /* sanity check to ensure the secondary channel always gets the minimal bitrate it needs */ -} - -/* Secondary channel bitrate adjusment */ -/* First, adjust the bitrate depending of what is transmitted */ -/* Second, choose the number of subframe for ACELP core depending of the targetted bitratre */ -/* Finally, verify that the concordance between the number of subframe, the parameters sent and the bitrate available */ -IF( coder_type == GENERIC /* || coder_type == AUDIO*/ ) -{ - /* Adjust the bitrate depending of what is transmitted */ - /* IF LPC are transmitted, ensure enough bits are used */ - IF( tdm_lp_reuse_flag == 0 ) - { - /* Pitch is transmitted as well, further increase the bitrate */ - IF( tdm_Pitch_reuse_flag == 0 ) + BWE_brate = SWB_TBE_1k75; + move32(); + IF( EQ_16( bwidth_pri, WB ) ) { - *total_brate_sec = max( *total_brate_sec, MIN_FCB_SECRATE2 + MIN_SEC_ACB_RATE + MIN_SEC_LPC_RATE + MIN_SIGN_RATE ); - - IF( tdm_LRTD_flag == 1 && bwidth_sec == SWB ) + BWE_brate = WB_BWE_0k35; + move32(); + if ( tdm_LRTD_flag == 0 ) { - /* ensure that there are enough bits to code SWB TBE_1k10 as well */ - *total_brate_sec = max( *total_brate_sec, MIN_FCB_SECRATE2 + MIN_SEC_ACB_RATE + MIN_SEC_LPC_RATE + MIN_SIGN_RATE + SWB_TBE_1k10 ); + BWE_brate = L_add( BWE_brate, 250 ); /* ICA Brate */ } } - ELSE /* only LPC is tranmitted -> IF ( *total_brate_sec < MIN_SEC_BRATE+MIN_SEC_LPC_RATE ) */ + ELSE IF( tdm_LRTD_flag == 0 ) { - *total_brate_sec = max( *total_brate_sec, MIN_FCB_SECRATE2 + MIN_SEC_LPC_RATE + MIN_SIGN_RATE ); + BWE_brate = L_add( BWE_brate, 350 ); /* ICA Brate */ } } - ELSE IF( /*tdm_lp_reuse_flag == 1*/ tdm_Pitch_reuse_flag == 0 ) - { - *total_brate_sec = max( *total_brate_sec, MIN_FCB_SECRATE2 + MIN_SEC_ACB_RATE + MIN_SIGN_RATE ); - } - /* Choose between 2 and 4 subfr, depending of the bitrate available and prevent the gap between the 2 atlernative */ - IF( tdm_LRTD_flag == 1 ) + IF( EQ_16( coder_type0, TRANSITION ) ) { - four_subfr_fcb = (Word16) ( *total_brate_sec - ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS - STEREO_BITS_TCA + 1 + 4 * MIN_GAIN_BITS ) * FRAMES_PER_SEC ); - two_subfr_fcb = (Word16) ( *total_brate_sec - ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS - STEREO_BITS_TCA + 1 + 2 * MIN_GAIN_BITS ) * FRAMES_PER_SEC ); + IF( GT_32( element_brate_wo_meta, IVAS_13k2 ) ) + { + *total_brate_sec = min( *total_brate_sec, L_sub( element_brate_wo_meta, L_add( ACELP_8k00, BWE_brate ) ) ); + move32(); + } + ELSE + { + *total_brate_sec = min( *total_brate_sec, L_sub( element_brate_wo_meta, L_add( ACELP_7k20, BWE_brate ) ) ); + move32(); + } } ELSE { - four_subfr_fcb = (Word16) ( *total_brate_sec - ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS + 1 + 4 * MIN_GAIN_BITS ) * FRAMES_PER_SEC ); - two_subfr_fcb = (Word16) ( *total_brate_sec - ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS + 1 + 2 * MIN_GAIN_BITS ) * FRAMES_PER_SEC ); + *total_brate_sec = min( *total_brate_sec, L_sub( element_brate_wo_meta, L_add( 5900, BWE_brate ) ) ); + move32(); } - IF( tdm_lp_reuse_flag == 0 ) + IF( coder_type == INACTIVE ) { - four_subfr_fcb -= MIN_SEC_LPC_RATE; - two_subfr_fcb -= MIN_SEC_LPC_RATE; + *total_brate_sec = max( *total_brate_sec, tdm_bit_allc_tbl[0][0] ); /* sanity check to ensure the secondary channel always gets the minimal bitrate it needs */ + move32(); } - - IF( tdm_Pitch_reuse_flag == 0 ) + ELSE { - four_subfr_fcb -= ( MIN_SEC_ACB_RATE + 10 * FRAMES_PER_SEC ); - two_subfr_fcb -= MIN_SEC_ACB_RATE; + *total_brate_sec = max( *total_brate_sec, 3500 ); /* sanity check to ensure the secondary channel always gets the minimal bitrate it needs */ + move32(); } - /* Too much bits for the 2 subfr model but not enough for the the 4 subfr model -> slightly reduce the 2nd channel bitrate */ - IF( two_subfr_fcb > 2 * MAX_SC_FCB_RATE * FRAMES_PER_SEC && four_subfr_fcb < MIN_4SUBFR_FCB_RATE * FRAMES_PER_SEC ) + /* Secondary channel bitrate adjusment */ + /* First, adjust the bitrate depending of what is transmitted */ + /* Second, choose the number of subframe for ACELP core depending of the targetted bitratre */ + /* Finally, verify that the concordance between the number of subframe, the parameters sent and the bitrate available */ + IF( EQ_16( coder_type, GENERIC ) /* || coder_type == AUDIO*/ ) { - IF( tdm_LRTD_flag == 1 ) + /* Adjust the bitrate depending of what is transmitted */ + /* IF LPC are transmitted, ensure enough bits are used */ + IF( tdm_lp_reuse_flag == 0 ) { - *total_brate_sec = 2 * MAX_SC_FCB_RATE * FRAMES_PER_SEC + ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS - STEREO_BITS_TCA + 1 + 2 * MIN_GAIN_BITS ) * FRAMES_PER_SEC; + /* Pitch is transmitted as well, further increase the bitrate */ + IF( tdm_Pitch_reuse_flag == 0 ) + { + *total_brate_sec = max( *total_brate_sec, MIN_FCB_SECRATE2 + MIN_SEC_ACB_RATE + MIN_SEC_LPC_RATE + MIN_SIGN_RATE ); + move32(); + + test(); + IF( EQ_16( tdm_LRTD_flag, 1 ) && EQ_16( bwidth_sec, SWB ) ) + { + /* ensure that there are enough bits to code SWB TBE_1k10 as well */ + *total_brate_sec = max( *total_brate_sec, MIN_FCB_SECRATE2 + MIN_SEC_ACB_RATE + MIN_SEC_LPC_RATE + MIN_SIGN_RATE + SWB_TBE_1k10 ); + move32(); + } + } + ELSE /* only LPC is tranmitted -> IF ( *total_brate_sec < MIN_SEC_BRATE+MIN_SEC_LPC_RATE ) */ + { + *total_brate_sec = max( *total_brate_sec, MIN_FCB_SECRATE2 + MIN_SEC_LPC_RATE + MIN_SIGN_RATE ); + move32(); + } + } + ELSE IF( /*tdm_lp_reuse_flag == 1*/ tdm_Pitch_reuse_flag == 0 ) + { + *total_brate_sec = max( *total_brate_sec, MIN_FCB_SECRATE2 + MIN_SEC_ACB_RATE + MIN_SIGN_RATE ); + move32(); + } + + /* Choose between 2 and 4 subfr, depending of the bitrate available and prevent the gap between the 2 atlernative */ + IF( EQ_16( tdm_LRTD_flag, 1 ) ) + { + four_subfr_fcb = extract_l( L_sub( *total_brate_sec, ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS - STEREO_BITS_TCA + 1 + 4 * MIN_GAIN_BITS ) * FRAMES_PER_SEC ) ); + two_subfr_fcb = extract_l( L_sub( *total_brate_sec, ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS - STEREO_BITS_TCA + 1 + 2 * MIN_GAIN_BITS ) * FRAMES_PER_SEC ) ); } ELSE { - *total_brate_sec = 2 * MAX_SC_FCB_RATE * FRAMES_PER_SEC + ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS + 1 + 2 * MIN_GAIN_BITS ) * FRAMES_PER_SEC; + four_subfr_fcb = extract_l( L_sub( *total_brate_sec, ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS + 1 + 4 * MIN_GAIN_BITS ) * FRAMES_PER_SEC ) ); + two_subfr_fcb = extract_l( L_sub( *total_brate_sec, ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS + 1 + 2 * MIN_GAIN_BITS ) * FRAMES_PER_SEC ) ); } IF( tdm_lp_reuse_flag == 0 ) { - *total_brate_sec += MIN_SEC_LPC_RATE; + four_subfr_fcb = sub( four_subfr_fcb, MIN_SEC_LPC_RATE ); + two_subfr_fcb = sub( two_subfr_fcb, MIN_SEC_LPC_RATE ); } IF( tdm_Pitch_reuse_flag == 0 ) { - *total_brate_sec += MIN_SEC_ACB_RATE; + four_subfr_fcb = sub( four_subfr_fcb, ( MIN_SEC_ACB_RATE + 10 * FRAMES_PER_SEC ) ); + two_subfr_fcb = sub( two_subfr_fcb, MIN_SEC_ACB_RATE ); } - } - ELSE IF( four_subfr_fcb >= ( 40 ) * FRAMES_PER_SEC ) /* Enough bits to have minimally 2 x 12 + 2*7 bits FCB */ - { - *tdm_low_rate_mode = 0; /* Use normal rate mode */ - } - ELSE /* Possible slight increase of secondary channel bit budget to compensate for FCB limited flexibility */ - { - Word16 tmp_rate, i; - tmp_rate = two_subfr_fcb; - idx = NB_RATE_POSS - 2; - for ( i = 0; i < NB_RATE_POSS; i++ ) + /* Too much bits for the 2 subfr model but not enough for the the 4 subfr model -> slightly reduce the 2nd channel bitrate */ + test(); + IF( GT_16( two_subfr_fcb, 2 * MAX_SC_FCB_RATE * FRAMES_PER_SEC ) && LT_16( four_subfr_fcb, MIN_4SUBFR_FCB_RATE * FRAMES_PER_SEC ) ) { - IF( tmp_rate <= fast_FCB_rates_2sfr[i] ) + IF( EQ_16( tdm_LRTD_flag, 1 ) ) { - idx = i; - break; + *total_brate_sec = 2 * MAX_SC_FCB_RATE * FRAMES_PER_SEC + ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS - STEREO_BITS_TCA + 1 + 2 * MIN_GAIN_BITS ) * FRAMES_PER_SEC; + move32(); + } + ELSE + { + *total_brate_sec = 2 * MAX_SC_FCB_RATE * FRAMES_PER_SEC + ( TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS + 1 + 2 * MIN_GAIN_BITS ) * FRAMES_PER_SEC; + move32(); + } + + IF( tdm_lp_reuse_flag == 0 ) + { + *total_brate_sec = L_add( *total_brate_sec, MIN_SEC_LPC_RATE ); + move32(); + } + + IF( tdm_Pitch_reuse_flag == 0 ) + { + *total_brate_sec = L_add( *total_brate_sec, MIN_SEC_ACB_RATE ); + move32(); } } - *total_brate_sec += ( fast_FCB_rates_2sfr[idx] - tmp_rate ); - } - /* To prevent 13.2 kb/s for primary channel as some bitstream issues arrise with it */ - IF( element_brate_wo_meta - *total_brate_sec == ACELP_13k20 ) - { - *total_brate_sec += 100; + ELSE IF( GE_16( four_subfr_fcb, 40 * FRAMES_PER_SEC ) ) /* Enough bits to have minimally 2 x 12 + 2*7 bits FCB */ + { + *tdm_low_rate_mode = 0; /* Use normal rate mode */ + move16(); + } + ELSE /* Possible slight increase of secondary channel bit budget to compensate for FCB limited flexibility */ + { + Word16 tmp_rate, i; + tmp_rate = two_subfr_fcb; + move16(); + idx = sub( NB_RATE_POSS, 2 ); + + FOR( i = 0; i < NB_RATE_POSS; i++ ){ + IF( LE_16( tmp_rate, fast_FCB_rates_2sfr[i] ) ){ + idx = i; + move16(); + BREAK; + } } + *total_brate_sec = L_add( *total_brate_sec, sub( fast_FCB_rates_2sfr[idx], tmp_rate ) ); + move32(); +} +/* To prevent 13.2 kb/s for primary channel as some bitstream issues arrise with it */ +IF( EQ_32( L_sub( element_brate_wo_meta, *total_brate_sec ), ACELP_13k20 ) ) +{ + *total_brate_sec = L_add( *total_brate_sec, 100 ); + move32(); +} } /* prevent 2.4 kb/s and 2.8 kb/s as they are reserved bitrates for DTX and VBR */ -IF( *total_brate_sec == PPP_NELP_2k80 || *total_brate_sec == SID_2k40 ) +test(); +IF( EQ_32( *total_brate_sec, PPP_NELP_2k80 ) || EQ_32( *total_brate_sec, SID_2k40 ) ) { - *total_brate_sec -= 100; + *total_brate_sec = L_sub( *total_brate_sec, 100 ); + move32(); } -*total_brate_pri = element_brate_wo_meta - *total_brate_sec; +*total_brate_pri = L_sub( element_brate_wo_meta, *total_brate_sec ); +move32(); return; } @@ -882,13 +986,13 @@ void td_stereo_param_updt_fx( { Word16 i; /* Copy some primary channel information into the secondary channel structure for later usage */ - IF( tdm_use_IAWB_Ave_lpc == 1 ) + IF( EQ_16( tdm_use_IAWB_Ave_lpc, 1 ) ) { /*not being assert*/ Copy( IAWB_Ave_fx, tdm_lsfQ_PCh_fx, M ); lsf2lsp_fx( tdm_lsfQ_PCh_fx, tdm_lspQ_PCh_fx, M, INT_FS_12k8 ); } - ELSE IF( flag_ACELP16k == 1 ) + ELSE IF( EQ_16( flag_ACELP16k, 1 ) ) { Copy( lsp_old_PCh_fx, tdm_lspQ_PCh_fx, M ); lsp_convert_poly_fx( tdm_lspQ_PCh_fx, L_FRAME, 0 ); @@ -904,6 +1008,7 @@ void td_stereo_param_updt_fx( { Word16 tmp16; Word16 mult_factor = 26214 /*0.8f in Q15*/; + move16(); FOR( i = 0; i < NB_SUBFR; i++ ) { tmp16 = mult_r( pitch_buf_PCh_fx[i], mult_factor ); /* Convert 16kHz to 12.8 kHz pitch values */ @@ -966,6 +1071,7 @@ static void tdm_SCh_LSF_intra_pred_zero_bits_fx( FOR( i = 0; i < M; i++ ) { pred_lsf_SCh_fx[i] = add( mult_r( beta_fx, tdm_lsfQ_PCh_fx[i] ), mult_r( sub( 32767, beta_fx ), lsf_mean_fx[i] ) ); + move16(); } return; @@ -1021,29 +1127,38 @@ static void tdm_SCh_LSF_intra_pred_tri_diag_mat_fx( v_sub_16( lsf_SCh_fx, lsf_mean_in_fx, lsf_tmp_fx, M ); lsf_tmp_ptr1_fx = lsf_tmp_fx; + lsf_SCh_ptr_fx = lsf_SCh_fx; + lsf_tmp_ptr2_fx = lsf_tmp_ptr1_fx; - *lsf_SCh_ptr_fx = mult_r( *lsf_tmp_ptr1_fx++, *prd_ptr_fx++ ); // Q2.56 + 15 -15 + *lsf_SCh_ptr_fx = mult_r( *lsf_tmp_ptr1_fx++, *prd_ptr_fx++ ); // Q2.56 + 15 -15 + move16(); *lsf_SCh_ptr_fx = add( *lsf_SCh_ptr_fx, mult_r( *lsf_tmp_ptr1_fx, *prd_ptr_fx++ ) ); // Q2.56 + 15 -15 + move16(); lsf_SCh_ptr_fx++; - FOR( i = 1; i < M - 1; i++ ) + FOR( i = 1; i < sub( M, 1 ); i++ ) { lsf_tmp_ptr1_fx = lsf_tmp_ptr2_fx; // Q2.56 *lsf_SCh_ptr_fx = mult_r( *lsf_tmp_ptr1_fx++, *prd_ptr_fx++ ); // Q2.56 + 15 -15 + move16(); lsf_tmp_ptr2_fx = lsf_tmp_ptr1_fx; *lsf_SCh_ptr_fx = add( *lsf_SCh_ptr_fx, mult_r( ( *lsf_tmp_ptr1_fx++ ), ( *prd_ptr_fx++ ) ) ); + move16(); ( *lsf_SCh_ptr_fx ) = add( *lsf_SCh_ptr_fx, mult_r( ( *lsf_tmp_ptr1_fx ), ( *prd_ptr_fx++ ) ) ); + move16(); lsf_SCh_ptr_fx++; } lsf_tmp_ptr1_fx = lsf_tmp_ptr2_fx; *lsf_SCh_ptr_fx = mult_r( ( *lsf_tmp_ptr1_fx ), ( *prd_ptr_fx ) ); + move16(); lsf_tmp_ptr1_fx++; prd_ptr_fx++; *lsf_SCh_ptr_fx = add( mult_r( ( *lsf_tmp_ptr1_fx ), ( *prd_ptr_fx ) ), *lsf_SCh_ptr_fx ); + move16(); v_add_16( lsf_SCh_fx, lsf_mean_out_fx, lsf_SCh_fx, M ); @@ -1114,25 +1229,30 @@ void tdm_SCh_LSF_intra_pred_fx( { Word16 fixed_beta; - IF( element_brate <= IVAS_13k2 ) + IF( LE_32( element_brate, IVAS_13k2 ) ) { fixed_beta = 28508; // 0.87f in Q15 + move16(); } - ELSE IF( element_brate <= IVAS_16k4 ) + ELSE IF( LE_32( element_brate, IVAS_16k4 ) ) { fixed_beta = 30801; // 0.94f in Q15 + move16(); } ELSE IF( element_brate <= IVAS_24k4 ) { fixed_beta = 29818; // 0.91f in Q15 + move16(); } - ELSE IF( element_brate <= IVAS_32k ) + ELSE IF( LE_32( element_brate, IVAS_32k ) ) { fixed_beta = 30146; // 0.92f in Q15 + move16(); } ELSE { fixed_beta = 29818; // 0.91f in Q15 + move16(); } tdm_SCh_LSF_intra_pred_zero_bits_fx( tdm_lsfQ_PCh_fx, pred_lsf_SCh_fx, tdm_LSF_MEAN_PRED_QNT_fx, fixed_beta ); @@ -1204,11 +1324,13 @@ static void tdm_SCh_LSF_intra_pred_one_bit_dec_fx( Word16 beta_fx; beta_fx = Beta_Q_x_fx[beta_index_fx]; // Q15 + move16(); /* pulling the LSFs closer to the avergae */ FOR( i = 0; i < M; i++ ) { pred_lsf_SCh_fx[i] = add( mult_r( beta_fx, tdm_lsfQ_PCh_fx[i] ), mult_r( sub( 32767, beta_fx ), lsf_mean_fx[i] ) ); + move16(); } return; @@ -1264,11 +1386,15 @@ static void tdm_SCh_LSF_intra_pred_one_bit_enc_fx( Word16 A_temp_fx[M]; Word16 B_temp_fx[M]; Word32 WD_fx[2] = { 0 }; + move32(); + move32(); FOR( i = 0; i < M; i++ ) { A_temp_fx[i] = sub( lsf_SCh_fx[i], lsf_mean_fx[i] ); + move16(); B_temp_fx[i] = sub( lsf_mean_fx[i], tdm_lsfQ_PCh_fx[i] ); + move16(); } FOR( i = 0; i < M; i++ ) @@ -1280,16 +1406,20 @@ static void tdm_SCh_LSF_intra_pred_one_bit_enc_fx( Word32 Beta_Q_x1 = L_mult( Beta_Q_x_fx[1], Beta_Q_x_fx[1] ); // Q31 WD_fx[0] = L_add( WD_fx[0], L_add( L_add( wgt_A_temp, Mpy_32_16_1( L_shl( wgt_AB_temp, 1 ), Beta_Q_x_fx[0] ) ), Mpy_32_32( wgt_B_temp, Beta_Q_x0 ) ) ); + move32(); WD_fx[1] = L_add( WD_fx[1], L_add( L_add( wgt_A_temp, Mpy_32_16_1( L_shl( wgt_AB_temp, 1 ), Beta_Q_x_fx[1] ) ), Mpy_32_32( wgt_B_temp, Beta_Q_x1 ) ) ); + move32(); } - IF( WD_fx[0] < WD_fx[1] ) + IF( LT_32( WD_fx[0], WD_fx[1] ) ) { *beta_index = 0; + move16(); } ELSE { *beta_index = 1; + move16(); } tdm_SCh_LSF_intra_pred_one_bit_dec_fx( tdm_lsfQ_PCh_fx, pred_lsf_SCh_fx, tdm_LSF_MEAN_RE_USE_fx, Beta_Q_x_fx, *beta_index ); @@ -1382,7 +1512,7 @@ void tdm_SCh_lsf_reuse_fx( Beta_Q1bit_re_use_fx = tdm_Beta_Q1bit_re_use_48k_fx; } - IF( EQ_16( enc_dec, ENC ) ) + IF( enc_dec == ENC ) { tdm_SCh_LSF_intra_pred_one_bit_enc_fx( lsf_new_fx, tdm_lsfQ_PCh_fx, lsf_new_fx, tdm_LSF_MEAN_RE_USE_fx, lsf_wgts_fx, Beta_Q1bit_re_use_fx, beta_index ); } diff --git a/lib_com/ivas_transient_det.c b/lib_com/ivas_transient_det.c index de238aa5b..86093edcd 100644 --- a/lib_com/ivas_transient_det.c +++ b/lib_com/ivas_transient_det.c @@ -138,8 +138,10 @@ static void ivas_transient_det_init( #endif #ifdef IVAS_FLOAT_FIXED - hTranDet->in_duck_gain = 1073741824; // Q30 + hTranDet->in_duck_gain = 1073741824; // Q30 + move32(); hTranDet->out_duck_gain = 1073741824; // Q30 + move32(); #else hTranDet->in_duck_gain = 1.0f; hTranDet->out_duck_gain = 1.0f; @@ -212,68 +214,104 @@ static void ivas_transient_det_init( case 48000: /*env_hpf*/ filt_coeff_arr_fx[0][0] = IVAS_C_HPF_48k_fx; - filt_coeff_arr_fx[0][1] = -IVAS_C_HPF_48k_fx; + move32(); + filt_coeff_arr_fx[0][1] = L_negate( IVAS_C_HPF_48k_fx ); + move32(); filt_coeff_arr_fx[0][3] = ONE_IN_Q30; - filt_coeff_arr_fx[0][4] = -IVAS_C_HPF_48k_fx; + move32(); + filt_coeff_arr_fx[0][4] = L_negate( IVAS_C_HPF_48k_fx ); + move32(); /*env_fast*/ - filt_coeff_arr_fx[1][0] = ONE_IN_Q30 - IVAS_C_FAST_48k_fx; + filt_coeff_arr_fx[1][0] = L_sub( ONE_IN_Q30, IVAS_C_FAST_48k_fx ); + move32(); filt_coeff_arr_fx[1][3] = ONE_IN_Q30; - filt_coeff_arr_fx[1][4] = -IVAS_C_FAST_48k_fx; + move32(); + filt_coeff_arr_fx[1][4] = L_negate( IVAS_C_FAST_48k_fx ); + move32(); /*env_slow*/ - filt_coeff_arr_fx[2][0] = ONE_IN_Q30 - IVAS_C_SLOW_48k_fx; + filt_coeff_arr_fx[2][0] = L_sub( ONE_IN_Q30, IVAS_C_SLOW_48k_fx ); + move32(); filt_coeff_arr_fx[2][3] = ONE_IN_Q30; - filt_coeff_arr_fx[2][4] = -IVAS_C_SLOW_48k_fx; + move32(); + filt_coeff_arr_fx[2][4] = L_negate( IVAS_C_SLOW_48k_fx ); + move32(); hTranDet->in_duck_coeff = IVAS_C_IN_DUCK_48k_fx; + move32(); hTranDet->out_duck_coeff = IVAS_C_OUT_DUCK_48k_fx; + move32(); BREAK; case 32000: /*env_hpf*/ filt_coeff_arr_fx[0][0] = IVAS_C_HPF_32k_fx; - filt_coeff_arr_fx[0][1] = -IVAS_C_HPF_32k_fx; + move32(); + filt_coeff_arr_fx[0][1] = L_negate( IVAS_C_HPF_32k_fx ); + move32(); filt_coeff_arr_fx[0][3] = ONE_IN_Q30; - filt_coeff_arr_fx[0][4] = -IVAS_C_HPF_32k_fx; + move32(); + filt_coeff_arr_fx[0][4] = L_negate( IVAS_C_HPF_32k_fx ); + move32(); /*env_fast*/ - filt_coeff_arr_fx[1][0] = ONE_IN_Q30 - IVAS_C_FAST_32k_fx; + filt_coeff_arr_fx[1][0] = L_sub( ONE_IN_Q30, IVAS_C_FAST_32k_fx ); + move32(); filt_coeff_arr_fx[1][3] = ONE_IN_Q30; - filt_coeff_arr_fx[1][4] = -IVAS_C_FAST_32k_fx; + move32(); + filt_coeff_arr_fx[1][4] = L_negate( IVAS_C_FAST_32k_fx ); + move32(); /*env_slow*/ - filt_coeff_arr_fx[2][0] = ONE_IN_Q30 - IVAS_C_SLOW_32k_fx; + filt_coeff_arr_fx[2][0] = L_sub( ONE_IN_Q30, IVAS_C_SLOW_32k_fx ); + move32(); filt_coeff_arr_fx[2][3] = ONE_IN_Q30; - filt_coeff_arr_fx[2][4] = -IVAS_C_SLOW_32k_fx; + move32(); + filt_coeff_arr_fx[2][4] = L_negate( IVAS_C_SLOW_32k_fx ); + move32(); hTranDet->in_duck_coeff = IVAS_C_IN_DUCK_32k_fx; + move32(); hTranDet->out_duck_coeff = IVAS_C_OUT_DUCK_32k_fx; + move32(); BREAK; case 16000: /*env_hpf*/ filt_coeff_arr_fx[0][0] = IVAS_C_HPF_16k_fx; - filt_coeff_arr_fx[0][1] = -IVAS_C_HPF_16k_fx; + move32(); + filt_coeff_arr_fx[0][1] = L_negate( IVAS_C_HPF_16k_fx ); + move32(); filt_coeff_arr_fx[0][3] = ONE_IN_Q30; - filt_coeff_arr_fx[0][4] = -IVAS_C_HPF_16k_fx; + move32(); + filt_coeff_arr_fx[0][4] = L_negate( IVAS_C_HPF_16k_fx ); + move32(); /*env_fast*/ - filt_coeff_arr_fx[1][0] = ONE_IN_Q30 - IVAS_C_FAST_16k_fx; + filt_coeff_arr_fx[1][0] = L_sub( ONE_IN_Q30, IVAS_C_FAST_16k_fx ); + move32(); filt_coeff_arr_fx[1][3] = ONE_IN_Q30; - filt_coeff_arr_fx[1][4] = -IVAS_C_FAST_16k_fx; + move32(); + filt_coeff_arr_fx[1][4] = L_negate( IVAS_C_FAST_16k_fx ); + move32(); /*env_slow*/ - filt_coeff_arr_fx[2][0] = ONE_IN_Q30 - IVAS_C_SLOW_16k_fx; + filt_coeff_arr_fx[2][0] = L_sub( ONE_IN_Q30, IVAS_C_SLOW_16k_fx ); + move32(); filt_coeff_arr_fx[2][3] = ONE_IN_Q30; - filt_coeff_arr_fx[2][4] = -IVAS_C_SLOW_16k_fx; + move32(); + filt_coeff_arr_fx[2][4] = L_negate( IVAS_C_SLOW_16k_fx ); + move32(); hTranDet->in_duck_coeff = IVAS_C_IN_DUCK_16k_fx; + move32(); hTranDet->out_duck_coeff = IVAS_C_OUT_DUCK_16k_fx; + move32(); BREAK; @@ -292,6 +330,7 @@ static void ivas_transient_det_init( hTranDet->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC; + move32(); return; } @@ -333,6 +372,7 @@ void ivas_transient_det_close( ivas_trans_det_state_t **hTranDet /* i/o: Transient detector handle */ ) { + test(); IF( hTranDet == NULL || *hTranDet == NULL ) { return; @@ -361,25 +401,32 @@ void ivas_transient_det_process_fx( Word32 in_duck_gain[L_FRAME48k]; Word16 num_sf, sf, sf_samp, idx; Word32 mem = hTranDet->in_duck_gain; + move32(); ivas_td_decorr_get_ducking_gains_fx( hTranDet, pIn_pcm, in_duck_gain, NULL, frame_len, IVAS_TDET_ONLY ); transient_det[0] = 0; + move16(); transient_det[1] = 0; - IF( GT_32( L_sub( mem, hTranDet->in_duck_gain ), IVAS_TDET_PARM_TRANS_THR ) ) + move16(); + if ( GT_32( L_sub( mem, hTranDet->in_duck_gain ), IVAS_TDET_PARM_TRANS_THR ) ) { transient_det[0] = 1; + move16(); } num_sf = 16; - sf_samp = frame_len / num_sf; + move16(); + sf_samp = idiv1616( frame_len, num_sf ); FOR( sf = 1; sf <= num_sf; sf++ ) { - idx = ( sf_samp * sf ) - 1; - IF( GT_32( L_sub( mem, in_duck_gain[idx] ), IVAS_POINT_ONE_ONE_IN_Q30 ) ) + idx = sub( imult1616( sf_samp, sf ), 1 ); + if ( GT_32( L_sub( mem, in_duck_gain[idx] ), IVAS_POINT_ONE_ONE_IN_Q30 ) ) { transient_det[1] = 1; + move16(); } mem = in_duck_gain[idx]; + move32(); } return; @@ -471,11 +518,13 @@ static Word32 ivas_calc_duck_gain_fx( IF( LT_32( Mpy_32_32( duck_mult_fac, env_1 ), Mpy_32_32( L_shr( duck_gain_out, 1 ), env_2 ) ) ) { - IF( EQ_32( env_1, 0 ) || EQ_32( env_2, 0 ) ) + test(); + IF( ( env_1 == 0 ) || ( env_2 == 0 ) ) { duck_gain_out = 0; + move32(); } - else + ELSE { duck_gain_out = Mpy_32_32( duck_mult_fac, L_shl( (Word32) ( divide3232( env_1, env_2 ) ), Q16 ) ); duck_gain_out = L_shl( duck_gain_out, Q1 ); @@ -566,14 +615,20 @@ void ivas_td_decorr_get_ducking_gains_fx( const Word16 tdet_flag ) { Word16 i, q = Q14; + move16(); Word32 e_fast_fx[L_FRAME48k], e_slow_fx[L_FRAME48k]; Word32 in_duck_gain = hTranDet->in_duck_gain; + move32(); Word32 out_duck_gain = hTranDet->out_duck_gain; + move32(); Word32 in_duck_coeff = hTranDet->in_duck_coeff; + move32(); Word32 out_duck_coeff = hTranDet->out_duck_coeff; + move32(); Word32 duck_mult_fac = hTranDet->duck_mult_fac; + move32(); - mvl2l( pIn_pcm, e_fast_fx, frame_len ); + Copy32( pIn_pcm, e_fast_fx, frame_len ); /* env hpf */ ivas_filter_process_fx( &hTranDet->env_hpf, e_fast_fx, frame_len, q ); @@ -583,7 +638,9 @@ void ivas_td_decorr_get_ducking_gains_fx( FOR( i = 0; i < frame_len; i++ ) { e_fast_fx[i] = L_add( L_abs( e_fast_fx[i] ), L_shr( IVAS_TDET_PARM_ENV_EPS_fx, q_factor_diff ) ); + move32(); e_slow_fx[i] = e_fast_fx[i]; + move32(); } /* env fast*/ @@ -598,8 +655,10 @@ void ivas_td_decorr_get_ducking_gains_fx( { in_duck_gain = ivas_calc_duck_gain_fx( in_duck_gain, in_duck_coeff, e_slow_fx[i], e_fast_fx[i], duck_mult_fac ); pIn_duck_gains[i] = in_duck_gain; + move32(); } hTranDet->in_duck_gain = in_duck_gain; + move32(); } ELSE { @@ -607,11 +666,15 @@ void ivas_td_decorr_get_ducking_gains_fx( { in_duck_gain = ivas_calc_duck_gain_fx( in_duck_gain, in_duck_coeff, e_slow_fx[i], e_fast_fx[i], duck_mult_fac ); pIn_duck_gains[i] = in_duck_gain; + move32(); out_duck_gain = ivas_calc_duck_gain_fx( out_duck_gain, out_duck_coeff, e_fast_fx[i], e_slow_fx[i], duck_mult_fac ); pOut_duck_gains[i] = out_duck_gain; + move32(); } hTranDet->in_duck_gain = in_duck_gain; + move32(); hTranDet->out_duck_gain = out_duck_gain; + move32(); } return; diff --git a/lib_com/lag_wind.c b/lib_com/lag_wind.c index 5e289b34f..9cd51345a 100644 --- a/lib_com/lag_wind.c +++ b/lib_com/lag_wind.c @@ -230,7 +230,7 @@ void lag_wind( FOR( i = 1; i <= m; i++ ) { - tmp = Mpy_32( r_h[i], r_l[i], wnd_h[i - 1], wnd_l[i - 1] ); + tmp = Mpy_32( r_h[i], r_l[i], wnd_h[sub( i, 1 )], wnd_l[sub( i, 1 )] ); L_Extract( tmp, &r_h[i], &r_l[i] ); } } @@ -283,7 +283,8 @@ void lag_wind_32( FOR( i = 1; i <= m; i++ ) { - r[i] = Mpy_32_32( r[i], wnd[i - 1] ); + r[i] = Mpy_32_32( r[i], wnd[sub( i, 1 )] ); + move32(); } } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 5bc296fbc..42ff82c70 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -959,7 +959,11 @@ ivas_error ivas_sba_dec_reconfigure_fx( ivas_pca_dec_init_fx( hSpar->hPCA ); } +#ifdef IVAS_FLOAT_FIXED + ivas_spar_config_fx( ivas_total_brate, sba_order_internal, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, st_ivas->sid_format ); +#else ivas_spar_config( ivas_total_brate, sba_order_internal, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, st_ivas->sid_format ); +#endif } ELSE { diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 007074796..37bcdbea0 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -414,7 +414,11 @@ ivas_error ivas_spar_dec_open_fx( * Configuration - set SPAR high-level parameters *-----------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED + ivas_spar_config_fx( st_ivas->hDecoderConfig->ivas_total_brate, sba_order_internal, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, st_ivas->sid_format ); +#else ivas_spar_config( st_ivas->hDecoderConfig->ivas_total_brate, sba_order_internal, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, st_ivas->sid_format ); +#endif SWITCH( sba_order_internal ) { diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c index cc18b15cf..6482d11de 100644 --- a/lib_enc/ivas_mct_core_enc.c +++ b/lib_enc/ivas_mct_core_enc.c @@ -112,7 +112,11 @@ static void AdjustChannelRatios( float cur_ratio, tar_ratio, sum_ratio, sum_tar_ratio; int16_t ratio_diff, i; +#ifdef IVAS_FLOAT_FIXED + ivas_spar_bitrate_dist_fx( temp_brs, nAvailBits, ivas_total_brate, sba_order, (Word16) FB ); +#else ivas_spar_bitrate_dist( temp_brs, nAvailBits, ivas_total_brate, sba_order, (int16_t) FB ); +#endif sum_ratio = 0.0f; for ( i = 0; i < nChannels; i++ ) diff --git a/lib_enc/ivas_osba_enc.c b/lib_enc/ivas_osba_enc.c index 8e65a938f..b170b0066 100644 --- a/lib_enc/ivas_osba_enc.c +++ b/lib_enc/ivas_osba_enc.c @@ -354,7 +354,11 @@ ivas_error ivas_osba_enc_reconfig( } } +#ifdef IVAS_FLOAT_FIXED + ivas_spar_config_fx( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 ); +#else ivas_spar_config( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 ); +#endif hSpar = st_ivas->hSpar; diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 5d77849e8..21953637e 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -258,7 +258,11 @@ ivas_error ivas_sba_enc_reconfigure( } } +#ifdef IVAS_FLOAT_FIXED + ivas_spar_config_fx( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 ); +#else ivas_spar_config( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 ); +#endif hSpar = st_ivas->hSpar; diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 29ec47922..1b5b215f7 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -214,7 +214,11 @@ ivas_error ivas_spar_enc_open( * Configuration - set SPAR high-level parameters *-----------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED + ivas_spar_config_fx( hEncoderConfig->ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, -1 ); +#else ivas_spar_config( hEncoderConfig->ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, -1 ); +#endif if ( st_ivas->nchan_transport == 1 ) { @@ -404,7 +408,11 @@ ivas_error ivas_spar_enc_open_fx( * Configuration - set SPAR high-level parameters *-----------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED + ivas_spar_config_fx( hEncoderConfig->ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, -1 ); +#else ivas_spar_config( hEncoderConfig->ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, -1 ); +#endif IF( EQ_16( st_ivas->nchan_transport, 1 ) ) { diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 88dc5ffc8..8b896e397 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -688,7 +688,11 @@ ivas_error ivas_spar_md_enc_process( active_w = ( hMdEnc->spar_md_cfg.active_w == 1 ) || ( dyn_active_w_flag == 1 ); nchan_transport = hMdEnc->spar_md_cfg.nchan_transport; +#ifdef IVAS_FLOAT_FIXED + bwidth = ivas_get_bw_idx_from_sample_rate_fx( hEncoderConfig->input_Fs ); +#else bwidth = ivas_get_bw_idx_from_sample_rate( hEncoderConfig->input_Fs ); +#endif bwidth = min( bwidth, hEncoderConfig->max_bwidth ); int16_t active_w_vlbr; active_w_vlbr = ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; -- GitLab From 83c65d0bfdfea192c2af7ec66125fa0f772e0ed1 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 22 Jul 2024 20:52:12 +0530 Subject: [PATCH 090/110] Fix for 3GPP issue 811 [x] Updated handling of guard bits in ivas_dirac_dec_decorr_process_fx --- lib_rend/ivas_dirac_decorr_dec.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_dirac_decorr_dec.c b/lib_rend/ivas_dirac_decorr_dec.c index d1f758fe8..99c17d529 100644 --- a/lib_rend/ivas_dirac_decorr_dec.c +++ b/lib_rend/ivas_dirac_decorr_dec.c @@ -1124,8 +1124,14 @@ void ivas_dirac_dec_decorr_process_fx( set32_fx( &h_freq_domain_decorr_ap_state->decorr_buffer_fx[imult1616( imult1616( imult1616( 2, sub( decorr_buffer_len, 1 ) ), max_band_decorr ), num_channels )], 0, imult1616( imult1616( 2, max_band_decorr ), num_channels ) ); Word16 decorr_buff_tot_len = imult1616( imult1616( shl( decorr_buffer_len, 1 ), max_band_decorr ), num_channels ); - - guarded_bits = s_max( find_guarded_bits_fx( 2 ), 3 ); + guarded_bits = 0; + FOR( Word16 i = 0; i < decorr_buff_tot_len; i++ ) + { + IF( h_freq_domain_decorr_ap_state->decorr_buffer_fx[i] != 0 ) + { + guarded_bits = s_max( find_guarded_bits_fx( 2 ), 3 ); + } + } q_shift = sub( getScaleFactor32( h_freq_domain_decorr_ap_state->decorr_buffer_fx, decorr_buff_tot_len ), guarded_bits ); Scale_sig32( h_freq_domain_decorr_ap_state->decorr_buffer_fx, decorr_buff_tot_len, q_shift ); q_decorr_buf = add( q_decorr_buf, q_shift ); -- GitLab From 761d4baef61eaf5f171b1d8dd42c8558be8e0a3a Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 22 Jul 2024 21:24:15 +0530 Subject: [PATCH 091/110] Stereo path encoder functions converted to fixed [x] Stereo TCX Core Encoder & sub-functions: stereo_tcx_init_enc, InitTnsConfigs, getCoreSamplerateMode2, SetAllowTnsOnWhite, getIgfPresent, sr2fscale, tcxlpc_get_cdk, writeTCXMode, writeTCXWindowing. stereo_tcx_core_enc conversion - partial done. [x] Functions in ivas_sns_enc.c converted to fixed: sns_1st_cod, sns_2st_cod, sns_avq_cod, sns_avq_cod_stereo [x] Functions in ivas_stereo_td_analysis.c converted to fixed: Comp_diff_lt_corr, Get_LR_rms, Get_corr_n, Get_dt_lt_ener, limit_idx_Dwnmix, stereo_smooth_LR_transition, stereo_tdm_ener_analysis_SM --- lib_com/ivas_prot.h | 27 +- lib_com/ivas_rom_com_fx.c | 9 + lib_com/ivas_rom_com_fx.h | 1 + lib_enc/enc_prm.c | 178 +++++ lib_enc/ivas_mdct_core_enc.c | 53 +- lib_enc/ivas_sns_enc.c | 447 ++++++++++++- lib_enc/ivas_stat_enc.h | 22 +- lib_enc/ivas_stereo_td_analysis.c | 1004 +++++++++++++++++++++++++++++ lib_enc/ivas_stereo_td_enc.c | 2 + lib_enc/ivas_tcx_core_enc.c | 231 +++++++ lib_enc/prot_fx_enc.h | 5 + 11 files changed, 1957 insertions(+), 22 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 3cfacb4b1..5c0c6a91f 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3329,7 +3329,32 @@ void dequantize_sns( float snsQ_out[CPE_CHANNELS][NB_DIV][M], Decoder_State **sts ); +#ifdef IVAS_FLOAT_FIXED +void sns_avq_cod_fx( + const Word32 *sns_fx, /* i : Input sns vectors */ + Word16 exp_sns, + const Word32 *snsmid_fx, /* i : Input mid-sns vectors */ + Word16 exp_snsmid, + Word32 *sns_q_fx, /* o : Quantized LFS vectors Q16 */ + Word32 *snsmid_q_fx, /* o : Quantized mid-LFS vectors Q16 */ + Word16 *index, /* o : Quantization indices */ + const Word16 core, /* i : core */ + const Word16 L_frame, + const Word16 low_brate_mode /* i : flag low bit operating mode */ +); +void sns_avq_cod_stereo_fx( + const Word32 *snsl_fx, /* i : Input sns vector (left channel) */ + Word16 exp_snl, + const Word32 *snsr_fx, /* i : Input sns vector (right channel) */ + Word16 exp_snr, + const Word16 L_frame, + Word32 *snsl_q_fx, /* o : Quantized sns vector (left channel) Q16 */ + Word32 *snsr_q_fx, /* o : Quantized sns vector (right channel) Q16 */ + Word16 *indexl, /* o : Quantization indices (left channel) */ + Word16 *indexr /* o : Quantization indices (right channel) */ +); +#else void sns_avq_cod( const float *sns, /* i : Input sns vectors */ const float *snsmid, /* i : Input mid-sns vectors */ @@ -3340,7 +3365,6 @@ void sns_avq_cod( const int16_t L_frame, const int16_t low_brate_mode /* i : flag low bit operating mode */ ); - void sns_avq_cod_stereo( const float *snsl, /* i : Input sns vector (left channel) */ const float *snsr, /* i : Input sns vector (right channel) */ @@ -3350,6 +3374,7 @@ void sns_avq_cod_stereo( int16_t *indexl, /* o : Quantization indices (left channel) */ int16_t *indexr /* o : Quantization indices (right channel) */ ); +#endif void sns_avq_dec( int16_t *index, /* i : Quantization indices */ diff --git a/lib_com/ivas_rom_com_fx.c b/lib_com/ivas_rom_com_fx.c index 42176bf82..affd420b9 100644 --- a/lib_com/ivas_rom_com_fx.c +++ b/lib_com/ivas_rom_com_fx.c @@ -1288,6 +1288,7 @@ const Word16 pow_10_icbwe_gsMappingDFT_tbl_fx[128] = { * TD Stereo ROM tables *----------------------------------------------------------------------------------*/ +// Q31 const UWord32 tdm_ratio_tabl_fx[TDM_NQ + 1] = { 0, 0, 23407572, 52613348, 92771296, 143881408, 205084688, 275736896, 355193792, 442596384, 536870912, @@ -1297,6 +1298,14 @@ const UWord32 tdm_ratio_tabl_fx[TDM_NQ + 1] = { 2147483647, 2147483647, 2147483647 }; +// Q24 +const Word32 tdm_ratio_tabl_fx_Q24[TDM_NQ + 1] = { + 0, 0, 182871, 411041, 724775, 1124073, 1602224, 2154194, + 2774951, 3457784, 4194304, 4976122, 5796528, 6643777, 7511159, 8388608, + 9266056, 10133438, 10980688, 11801094, 12582912, 13319432, 14002264, 14623021, + 15174992, 15653143, 16052440, 16366174, 16594344, 16777216, 16777216, 16777216 +}; + const UWord32 tdm_den_ratio_tabl_fx[TDM_NQ + 1] = { 1073741824, 1073741824, 1097471488, 1127536256, 1170593280, 1227179520, 1297939072, 1383409024, 1483374336, 1596009856, 1717986944, diff --git a/lib_com/ivas_rom_com_fx.h b/lib_com/ivas_rom_com_fx.h index 29a5b21cf..6692f0afd 100644 --- a/lib_com/ivas_rom_com_fx.h +++ b/lib_com/ivas_rom_com_fx.h @@ -106,6 +106,7 @@ extern const Word16 pow_10_icbwe_gsMappingDFT_tbl_fx[]; *----------------------------------------------------------------------------------*/ extern const UWord32 tdm_ratio_tabl_fx[TDM_NQ + 1]; +extern const Word32 tdm_ratio_tabl_fx_Q24[TDM_NQ + 1]; extern const UWord32 tdm_den_ratio_tabl_fx[]; /* LSFs Intra-frame prediction tables */ diff --git a/lib_enc/enc_prm.c b/lib_enc/enc_prm.c index d3c52faec..7c58087d9 100644 --- a/lib_enc/enc_prm.c +++ b/lib_enc/enc_prm.c @@ -49,6 +49,159 @@ * write TCX mode *--------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void writeTCXMode( + Encoder_State *st, /* i/o: encoder state structure */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ + Word16 *nbits_start /* o : nbits start */ +) +{ + UWord16 index; + Word16 idx, start_idx; + Word16 nBits; + + IF( st->tcxonly ) + { + push_next_indice( hBstr, (UWord16) EQ_16( st->core, TCX_10_CORE ), 1 ); + + test(); + IF( EQ_16( st->clas, UNVOICED_CLAS ) ) + { + index = 0; + move16(); + } + ELSE IF( EQ_16( st->clas, VOICED_TRANSITION ) || EQ_16( st->clas, UNVOICED_TRANSITION ) ) + { + index = 1; + move16(); + } + ELSE IF( EQ_16( st->clas, VOICED_CLAS ) ) + { + index = 2; + move16(); + } + ELSE + { + index = 3; + move16(); + } + + push_next_indice( hBstr, index, 2 ); + + test(); + IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && !MCT_flag ) + { + push_next_indice( hBstr, st->vad_flag, 1 ); + } + } + ELSE + { + IF( EQ_16( st->core, ACELP_CORE ) ) + { + /* write the RF signaling information */ + IF( EQ_16( st->rf_mode, 1 ) ) + { + /* find the section in the ACELP signaling table corresponding to bitrate */ + idx = 0; + move16(); + WHILE( NE_32( acelp_sig_tbl[idx], st->total_brate ) ) /* total bitrate is kept at 13.2kbps */ + { + idx = add( idx, 1 ); + } + + /* retrieve the number of bits for signaling */ + idx = add( idx, 1 ); + nBits = extract_l( acelp_sig_tbl[idx] ); + + /* retrieve the signaling index */ + idx = add( idx, 1 ); + start_idx = idx; + move16(); + WHILE( NE_32( acelp_sig_tbl[idx], SIG2IND( st->coder_type, st->bwidth, st->sharpFlag, st->rf_mode ) ) ) + { + idx = add( idx, 1 ); + } + push_next_indice( hBstr, sub( idx, start_idx ), nBits ); + push_next_indice( hBstr, 0, 1 ); /* Indicate to the decoder that the core is ACELP*/ + *nbits_start = 3; + move16(); + } + ELSE + { + push_next_indice( hBstr, st->coder_type, 3 ); + } + } + ELSE + { + IF( EQ_16( st->mdct_sw, MODE1 ) ) + { + /* 2 bits instead of 3 as TCX is already signaled */ + push_next_indice( hBstr, st->hTcxCfg->coder_type, 2 ); + } + ELSE + { + IF( EQ_16( st->mdct_sw_enable, MODE2 ) ) + { + push_next_indice( hBstr, 1, 1 ); /* TCX */ + push_next_indice( hBstr, 0, 1 ); /* not HQ_CORE */ + push_next_indice( hBstr, st->hTcxCfg->coder_type, 2 ); + } + ELSE + { + /*write the RF signaling information*/ + IF( EQ_16( st->rf_mode, 1 ) ) + { + /* find the section in the ACELP signaling table corresponding to bitrate */ + idx = 0; + move16(); + WHILE( NE_32( acelp_sig_tbl[idx], st->total_brate ) ) + { + idx = add( idx, 1 ); + } + + /* retrieve the number of bits for signaling */ + idx = add( idx, 1 ); + nBits = extract_l( acelp_sig_tbl[idx] ); + + test(); + test(); + IF( EQ_16( st->hTcxCfg->coder_type, VOICED ) || EQ_16( st->hTcxCfg->coder_type, GENERIC ) || EQ_16( st->hTcxCfg->coder_type, TRANSITION ) ) + { + st->sharpFlag = 1; + move16(); + } + ELSE + { + st->sharpFlag = 0; + move16(); + } + + /* retrieve the signaling index */ + idx = add( idx, 1 ); + start_idx = idx; + move16(); + WHILE( NE_32( acelp_sig_tbl[idx], SIG2IND( st->hTcxCfg->coder_type, st->bwidth, st->sharpFlag, st->rf_mode ) ) ) + { + idx = add( idx, 1 ); + } + push_next_indice( hBstr, sub( idx, start_idx ), nBits ); + push_next_indice( hBstr, 1, 1 ); /* Indicate to the decoder that the core is TCX*/ + *nbits_start = 3; + move16(); + } + ELSE + { + push_next_indice( hBstr, add( ACELP_MODE_MAX, st->hTcxCfg->coder_type ), 3 ); + } + } + } + } + } + + return; +} +#else void writeTCXMode( Encoder_State *st, /* i/o: encoder state structure */ BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ @@ -180,6 +333,7 @@ void writeTCXMode( return; } +#endif /*-------------------------------------------------------------------* @@ -188,6 +342,29 @@ void writeTCXMode( * write TCX transform type *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void writeTCXWindowing( + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const Word16 overlap_mode /* i : overlap mode */ +) +{ + + IF( EQ_16( overlap_mode, MIN_OVERLAP ) ) + { + push_next_indice( hBstr, 2, 2 ); + } + ELSE IF( EQ_16( overlap_mode, HALF_OVERLAP ) ) + { + push_next_indice( hBstr, 3, 2 ); + } + ELSE + { + push_next_indice( hBstr, 0, 1 ); + } + + return; +} +#else void writeTCXWindowing( BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ const int16_t overlap_mode /* i : overlap mode */ @@ -209,6 +386,7 @@ void writeTCXWindowing( return; } +#endif /*-------------------------------------------------------------------* diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index f2e712596..180594fa9 100644 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -41,6 +41,11 @@ #include "rom_com.h" #include "ivas_rom_com.h" #include "wmc_auto.h" +#ifdef IVAS_FLOAT_FIXED +#include "prot_fx_enc.h" +#include "prot_fx.h" +#endif + /*--------------------------------------------------------------* * Local constants @@ -582,6 +587,10 @@ void ivas_mdct_core_whitening_enc( Encoder_State *st, **sts; float scf[CPE_CHANNELS][NB_DIV][M]; float scf_q[CPE_CHANNELS][NB_DIV][M]; +#ifdef IVAS_FLOAT_FIXED + Word32 scf_fx[CPE_CHANNELS][NB_DIV][M]; + Word32 scf_q_fx[CPE_CHANNELS][NB_DIV][M]; +#endif float chE[2], chE_tot; int8_t sns_low_br_mode; int16_t nbits_start_sns; @@ -599,7 +608,11 @@ void ivas_mdct_core_whitening_enc( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { +#ifdef IVAS_FLOAT_FIXED + stereo_tcx_init_enc_fx( sts[ch] ); +#else stereo_tcx_init_enc( sts[ch] ); +#endif set_s( tnsSize[ch], 0, 2 ); set_s( tnsBits[ch], 0, 2 ); @@ -898,7 +911,20 @@ void ivas_mdct_core_whitening_enc( if ( sts[0]->hTcxEnc->tcxMode == TCX_20 && sts[1]->hTcxEnc->tcxMode == TCX_20 && sts[0]->mct_chan_mode == MCT_CHAN_MODE_REGULAR && sts[1]->mct_chan_mode == MCT_CHAN_MODE_REGULAR ) { +#ifdef IVAS_FLOAT_FIXED + /*=================flt-2-fix==============*/ + Word16 exp_snl = 0, exp_snr = 0; + f2me_buf( scf[0][0], scf_fx[0][0], &exp_snl, M ); + f2me_buf( scf[1][0], scf_fx[1][0], &exp_snr, M ); + /*=================flt-2-fix==============*/ + sns_avq_cod_stereo_fx( scf_fx[0][0], exp_snl, scf_fx[1][0], exp_snr, sts[0]->L_frame, scf_q_fx[0][0], scf_q_fx[1][0], param_lpc[0], param_lpc[1] ); + /*===============fix-2-flt==========================*/ + fixedToFloat_arrL( scf_q_fx[0][0], scf_q[0][0], Q16, M ); + fixedToFloat_arrL( scf_q_fx[1][0], scf_q[1][0], Q16, M ); + /*===============fix-2-flt==========================*/ +#else sns_avq_cod_stereo( scf[0][0], scf[1][0], sts[0]->L_frame, scf_q[0][0], scf_q[1][0], param_lpc[0], param_lpc[1] ); +#endif } else { @@ -910,7 +936,31 @@ void ivas_mdct_core_whitening_enc( continue; } st = sts[ch]; - +#ifdef IVAS_FLOAT_FIXED + Word16 exp_scf_1 = 0, exp_scf_0 = 0; + IF( st->hTcxEnc->tcxMode == TCX_20 ) + { + /*===============flt-2-fix==========================*/ + f2me_buf( scf[ch][0], scf_fx[ch][0], &exp_scf_0, M ); + /*===============flt-2-fix==========================*/ + sns_avq_cod_fx( scf_fx[ch][0], exp_scf_0, NULL, 0, scf_q_fx[ch][0], NULL, ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, st->L_frame, sns_low_br_mode ); + /*===============fix-2-flt==========================*/ + fixedToFloat_arrL( scf_q_fx[ch][0], scf_q[ch][0], Q16, M ); + /*===============fix-2-flt==========================*/ + } + ELSE + { + /*===============flt-2-fix==========================*/ + f2me_buf( scf[ch][1], scf_fx[ch][1], &exp_scf_1, M ); + f2me_buf( scf[ch][0], scf_fx[ch][0], &exp_scf_0, M ); + /*===============flt-2-fix==========================*/ + sns_avq_cod_fx( scf_fx[ch][1], exp_scf_1, scf_fx[ch][0], exp_scf_0, scf_q_fx[ch][1], scf_q_fx[ch][0], ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, st->L_frame, sns_low_br_mode ); + /*===============fix-2-flt==========================*/ + fixedToFloat_arrL( scf_q_fx[ch][0], scf_q[ch][0], Q16, M ); + fixedToFloat_arrL( scf_q_fx[ch][1], scf_q[ch][1], Q16, M ); + /*===============fix-2-flt==========================*/ + } +#else if ( st->hTcxEnc->tcxMode == TCX_20 ) { sns_avq_cod( scf[ch][0], NULL, scf_q[ch][0], NULL, ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, st->L_frame, sns_low_br_mode ); @@ -919,6 +969,7 @@ void ivas_mdct_core_whitening_enc( { sns_avq_cod( scf[ch][1], scf[ch][0], scf_q[ch][1], scf_q[ch][0], ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, st->L_frame, sns_low_br_mode ); } +#endif } } } diff --git a/lib_enc/ivas_sns_enc.c b/lib_enc/ivas_sns_enc.c index 673df674f..1373e8a62 100644 --- a/lib_enc/ivas_sns_enc.c +++ b/lib_enc/ivas_sns_enc.c @@ -43,8 +43,7 @@ #include "ivas_rom_com.h" #include "ivas_cnst.h" #include "wmc_auto.h" - - +#include "prot_fx_enc.h" /*------------------------------------------------------------------- * sns_1st_cod() * @@ -52,6 +51,126 @@ *-------------------------------------------------------------------*/ /* r : codebook index */ +#ifdef IVAS_FLOAT_FIXED +static Word16 sns_1st_cod_fx( + const Word32 *sns_fx, /* i : vector to quantize */ + Word16 exp_sns, + const Word16 L_frame, + const Word16 core, + Word32 *snsq_fx /* o : quantized sns Q16 */ +) +{ + Word16 index; + const Word16 split_len = M / 2; + move16(); + const Word16 *means; + const Word16 means_fix = 2; // Q15 + move16(); + /* remove means */ + means = NULL; + SWITCH( L_frame ) + { + case L_FRAME16k: + means = &sns_1st_means_16k[core - 1][0]; + break; + case L_FRAME25_6k: + means = &sns_1st_means_25k6[core - 1][0]; + break; + case L_FRAME32k: + means = &sns_1st_means_32k[core - 1][0]; + break; + default: + assert( !"illegal frame length in sns_1st_cod" ); + } + Word16 exp_snsq_buffer[M] = { 0 }, exp_snsq = 0; + move16(); + move16(); + FOR( Word16 i = 0; i < M; ++i ) + { + Word32 tmp = L_mult( means[i], means_fix ); // Q16 + exp_snsq_buffer[i] = 0; + move16(); + snsq_fx[i] = BASOP_Util_Add_Mant32Exp( sns_fx[i], exp_sns, L_negate( tmp ), 15, &exp_snsq_buffer[i] ); + move32(); + } + FOR( int i = 0; i < M; i++ ) + { + exp_snsq = s_max( exp_snsq_buffer[i], exp_snsq ); + } + FOR( int i = 0; i < M; i++ ) + { + snsq_fx[i] = L_shr( snsq_fx[i], exp_snsq - exp_snsq_buffer[i] ); + move32(); + } + + index = 0; + move16(); + FOR( Word16 split = 0; split < 2; ++split ) + { + const Word16 *cdbk_ptr; + Word16 j0, j1, index_split; + Word32 dist_min_fx; + const Word16 cdbk_fix = 8; // 1.f / powf( 2, SNS_CDBKS_BITS_4_FRAC ) in Q15 + move16(); + const Word16 *const cdbk = &sns_1st_cdbk[split][core - 1][0]; + + j0 = imult1616( split, split_len ); + j1 = add( j0, split_len ); + + cdbk_ptr = cdbk; + dist_min_fx = MAXVAL_WORD32; + Word16 exp_dist_min = 31; + index_split = 0; + FOR( Word16 i = 0; i < 32; ++i ) + { + Word32 dist_fx = 0; + move32(); + Word16 exp_dist = 0; + move16(); + FOR( Word16 j = j0; j < j1; ++j ) + { + Word32 tmp_fx; + Word16 exp_tmp = 0; + move16(); + Word32 tmp_1 = L_mult( ( *cdbk_ptr++ ), cdbk_fix ); // Q16 + tmp_fx = BASOP_Util_Add_Mant32Exp( snsq_fx[j], exp_snsq, L_negate( tmp_1 ), 15, &exp_tmp ); + Word32 tmp_2 = Mpy_32_32( tmp_fx, tmp_fx ); // exp_tmp*2 + dist_fx = BASOP_Util_Add_Mant32Exp( dist_fx, exp_dist, tmp_2, exp_tmp * 2, &exp_dist ); // exp_tmp*2 + } + + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( dist_fx, exp_dist, dist_min_fx, exp_dist_min ), -1 ) ) + { + dist_min_fx = dist_fx; + move32(); + exp_dist_min = exp_dist; + move16(); + index_split = i; + move16(); + } + } + + /* set quantized vector */ + cdbk_ptr = &cdbk[imult1616( index_split, split_len )]; + FOR( Word16 j = j0; j < j1; ++j ) + { + Word32 tmp_3 = L_mult( means[j], means_fix ); // Q16 + Word32 tmp_4 = L_mult( ( *cdbk_ptr++ ), cdbk_fix ); // Q16 + snsq_fx[j] = L_add( tmp_4, tmp_3 ); // Q16 + move32(); + } + + /* for second split shift by five bits to store both indices as one 10 bit value */ + IF( EQ_16( split, 1 ) ) + { + index_split = shl( index_split, 5 ); + } + + index = add( index, index_split ); + } + + return index; +} +#else static int16_t sns_1st_cod( const float *sns, /* i : vector to quantize */ const int16_t L_frame, @@ -63,7 +182,6 @@ static int16_t sns_1st_cod( const int16_t split_len = M / 2; const int16_t *means; const float means_fix2float = 1.f / powf( 2, SNS_MEANS_BITS_4_FRAC ); - /* remove means */ means = NULL; switch ( L_frame ) @@ -80,12 +198,10 @@ static int16_t sns_1st_cod( default: assert( !"illegal frame length in sns_1st_cod" ); } - for ( int16_t i = 0; i < M; ++i ) { snsq[i] = sns[i] - means[i] * means_fix2float; } - index = 0; for ( int16_t split = 0; split < 2; ++split ) { @@ -104,12 +220,10 @@ static int16_t sns_1st_cod( for ( int16_t i = 0; i < 32; ++i ) { float dist; - dist = 0.f; for ( int16_t j = j0; j < j1; ++j ) { float tmp; - tmp = snsq[j] - ( *cdbk_ptr++ ) * cdbk_fix2float; dist += tmp * tmp; } @@ -139,7 +253,7 @@ static int16_t sns_1st_cod( return index; } - +#endif /*------------------------------------------------------------------- * sns_2st_cod() @@ -148,6 +262,82 @@ static int16_t sns_1st_cod( *-------------------------------------------------------------------*/ /* r : number of allocated bits */ +#ifdef IVAS_FLOAT_FIXED +static Word16 sns_2st_cod_fx( + const Word32 *sns_fx, /* i : normalized vector to quantize */ + Word16 exp_sns, + Word32 *snsq_fx, /* i/o: i:1st stage o:1st+2nd stage Q16 */ + Word16 exp_snsq, + Word16 *indx /* o : index[] (4 bits per words) */ +) +{ + Word16 i, nbits; + + Word16 x_fx[M] = { 0 }; + move16(); + Word16 xq_fx[M]; + Word16 exp_x_buff[M] = { 0 }, exp_x = 0; + move16(); + move16(); + Word32 scale_fx = 858993472; // Q31 + move32(); + Word16 nq; + + FOR( i = 0; i < M; i++ ) + { + Word16 exp_tmp = 0; + move16(); + Word32 tmp = BASOP_Util_Add_Mant32Exp( sns_fx[i], exp_sns, L_negate( snsq_fx[i] ), exp_snsq, &exp_tmp ); + x_fx[i] = BASOP_Util_Divide3232_Scale( tmp, scale_fx, &exp_x_buff[i] ); + move16(); + exp_x_buff[i] = add( exp_x_buff[i], exp_tmp ); + move16(); + } + FOR( i = 0; i < M; i++ ) + { + exp_x = s_max( exp_x, exp_x_buff[i] ); + } + FOR( i = 0; i < M; i++ ) + { + x_fx[i] = shr( x_fx[i], sub( ( 15 - Q10 ), exp_x_buff[i] ) ); + move16(); + } + + /* quantize */ + AVQ_cod_lpc_fx( x_fx, xq_fx, indx, 2 ); + FOR( i = 0; i < M; i++ ) + { + Word32 tmp_1 = Mpy_32_16_1( scale_fx, xq_fx[i] ); // Q31 + Q10 - 15 + tmp_1 = L_shr( tmp_1, 10 ); // Q16 + snsq_fx[i] = L_add( snsq_fx[i], tmp_1 ); // Q16 + move32(); + } + + /* total number of bits using entropic code to index the quantizer number */ + nbits = 0; + move16(); + FOR( i = 0; i < 2; i++ ) + { + nq = indx[i]; + nbits = add( nbits, ( add( 2, ( shl( nq, 2 ) ) ) ) ); /* 2 bits to specify Q2,Q3,Q4,ext */ + + IF( GT_16( nq, 6 ) ) + { + nbits = add( nbits, sub( nq, 3 ) ); /* unary code (Q7=1110, ...) */ + } + ELSE IF( GT_16( nq, 4 ) ) + { + nbits = add( nbits, sub( nq, 4 ) ); /* Q5=0, Q6=10 */ + } + ELSE IF( nq == 0 ) + { + nbits = add( nbits, 3 ); /* Q0=110 */ + } + } + + return ( nbits ); +} +#else static int16_t sns_2st_cod( const float *sns, /* i : normalized vector to quantize */ float *snsq, /* i/o: i:1st stage o:1st+2nd stage */ @@ -196,14 +386,115 @@ static int16_t sns_2st_cod( return ( nbits ); } - +#endif /*------------------------------------------------------------------- * sns_avq_cod() * * Stereo noise-shaping AVQ encoder for 1 channel *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void sns_avq_cod_fx( + const Word32 *sns_fx, /* i : Input sns vectors */ + Word16 exp_sns, + const Word32 *snsmid_fx, /* i : Input mid-sns vectors */ + Word16 exp_snsmid, + Word32 *sns_q_fx, /* o : Quantized LFS vectors Q16 */ + Word32 *snsmid_q_fx, /* o : Quantized mid-LFS vectors Q16 */ + Word16 *index, /* o : Quantization indices */ + const Word16 core, /* i : core */ + const Word16 L_frame, + const Word16 low_brate_mode /* i : flag low bit operating mode */ +) +{ + Word16 i; + Word16 indxt[256], nbits, nbt, nit; + Word32 snsmid_q0_fx[M]; + + index[0] = sns_1st_cod_fx( sns_fx, exp_sns, L_frame, core, sns_q_fx ); + move16(); + nit = 1 + 2; + move16(); + IF( !low_brate_mode ) + { + nbt = sns_2st_cod_fx( sns_fx, exp_sns, sns_q_fx, 31 - Q16, &index[1] ); + nit = add( nit, add( index[1], index[2] ) ); + } + ELSE + { + index[1] = SNS_LOW_BR_MODE; + move16(); + index[2] = 0; + move16(); + } + index += nit; + nit = 0; + move16(); + *index = 0; + move16(); + + IF( EQ_16( core, TCX_10_CORE ) ) + { + index++; + + index[0] = sns_1st_cod_fx( snsmid_fx, exp_snsmid, L_frame, core, snsmid_q_fx ); + move16(); + nit = 1 + 2; + move16(); + IF( !low_brate_mode ) + { + nbits = sns_2st_cod_fx( snsmid_fx, exp_snsmid, snsmid_q_fx, 31 - Q16, &index[1] ); + nit = add( nit, add( index[1], index[2] ) ); + } + ELSE + { + index[1] = SNS_LOW_BR_MODE; + move16(); + index[2] = 0; + move16(); + nbits = 0; + move16(); + } + + + nbt = add( 10, nbits ); + + IF( !low_brate_mode ) + { + FOR( i = 0; i < M; i++ ) + { + snsmid_q0_fx[i] = sns_q_fx[i]; + move32(); + } + nbits = sns_2st_cod_fx( snsmid_fx, exp_snsmid, snsmid_q0_fx, 31 - Q16, indxt ); + + IF( LT_16( nbits, nbt ) ) + { + nbt = nbits; + move16(); + nit = add( 2, add( indxt[0], indxt[1] ) ); + index[-1] = 1; + move16(); + + FOR( i = 0; i < M; i++ ) + { + snsmid_q_fx[i] = snsmid_q0_fx[i]; + move32(); + } + + FOR( i = 0; i < nit; i++ ) + { + index[i] = indxt[i]; + move16(); + } + } + } + index += nit; + } + return; +} +#else void sns_avq_cod( const float *sns, /* i : Input sns vectors */ const float *snsmid, /* i : Input mid-sns vectors */ @@ -286,7 +577,7 @@ void sns_avq_cod( return; } - +#endif /*------------------------------------------------------------------- * sns_avq_cod_stereo() @@ -294,6 +585,141 @@ void sns_avq_cod( * Stereo noise-shaping AVQ encoder for 2 channels *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void sns_avq_cod_stereo_fx( + const Word32 *snsl_fx, /* i : Input sns vector (left channel) */ + Word16 exp_snl, + const Word32 *snsr_fx, /* i : Input sns vector (right channel) */ + Word16 exp_snr, + const Word16 L_frame, + Word32 *snsl_q_fx, /* o : Quantized sns vector (left channel) Q16 */ + Word32 *snsr_q_fx, /* o : Quantized sns vector (right channel) Q16 */ + Word16 *indexl, /* o : Quantization indices (left channel) */ + Word16 *indexr /* o : Quantization indices (right channel) */ +) +{ + Word16 i, flag_zero; + Word32 mid_fx[M], side_fx[M], mid_q_fx[M], side_q_fx[M], ener_side_fx; + Word16 exp_ener_side = 0, exp_side_buffer[M] = { 0 }, exp_side = MIN16B; + move16(); + move16(); + move16(); + + /* Compute side */ + ener_side_fx = 0; + move16(); + FOR( i = 0; i < M; i++ ) + { + side_fx[i] = BASOP_Util_Add_Mant32Exp( snsl_fx[i], exp_snl, L_negate( snsr_fx[i] ), exp_snr, &exp_side_buffer[i] ); + move32(); + Word32 tmp = Mpy_32_32( side_fx[i], side_fx[i] ); // exp_side[i] * 2 + ener_side_fx = BASOP_Util_Add_Mant32Exp( ener_side_fx, exp_ener_side, tmp, exp_side_buffer[i] * 2, &exp_ener_side ); + } + FOR( i = 0; i < M; i++ ) + { + exp_side = s_max( exp_side, exp_side_buffer[i] ); + } + FOR( i = 0; i < M; i++ ) + { + side_fx[i] = L_shr( side_fx[i], exp_side - exp_side_buffer[i] ); + move32(); + } + + Word16 flag = BASOP_Util_Cmp_Mant32Exp( ener_side_fx, exp_ener_side, 24576, 31 - Q11 ); + IF( EQ_16( flag, -1 ) ) + { + /* MS coding */ + *indexl++ = 2; + move16(); + *indexr++ = 3; + move16(); + + /* Compute mid */ + Word16 exp_mid_buffer[M] = { 0 }; + move16(); + FOR( i = 0; i < M; i++ ) + { + mid_fx[i] = BASOP_Util_Add_Mant32Exp( snsl_fx[i], exp_snl, snsr_fx[i], exp_snr, &exp_mid_buffer[i] ); + move32(); + mid_fx[i] = L_shr( mid_fx[i], 1 ); + move32(); + } + + /* Quantize mid */ + Word16 exp_mid = 0; + move16(); + FOR( i = 0; i < M; i++ ) + { + exp_mid = s_max( exp_mid, exp_mid_buffer[i] ); + } + FOR( i = 0; i < M; i++ ) + { + mid_fx[i] = L_shr( mid_fx[i], exp_mid - exp_mid_buffer[i] ); + move32(); + } + indexl[0] = sns_1st_cod_fx( mid_fx, exp_mid, L_frame, TCX_20_CORE, mid_q_fx ); + move16(); + sns_2st_cod_fx( mid_fx, exp_mid, mid_q_fx, ( 31 - Q16 ), &indexl[1] ); + + /* Quantize side */ + indexr[0] = -1; + move16(); + FOR( i = 0; i < M; i++ ) + { + side_q_fx[i] = 0; + move32(); + } + sns_2st_cod_fx( side_fx, exp_side, side_q_fx, 31 - Q16, &indexr[1] ); + + /* Detect zero side */ + flag_zero = 1; + move16(); + FOR( i = 0; i < M; i++ ) + { + if ( side_q_fx[i] != 0 ) + { + flag_zero = 0; + move16(); + break; + } + } + if ( flag_zero ) + { + indexr[0] = -2; + move16(); + } + + /* Go back to LR */ + FOR( i = 0; i < M; i++ ) + { + Word32 a = L_shr( side_q_fx[i], 1 ); + snsl_q_fx[i] = L_add( mid_q_fx[i], a ); + move32(); + snsr_q_fx[i] = L_sub( mid_q_fx[i], a ); + move32(); + } + } + ELSE + { + /* LR coding */ + *indexl++ = 0; + move16(); + *indexr++ = 1; + move16(); + + /* Quantize left */ + indexl[0] = sns_1st_cod_fx( snsl_fx, exp_snl, L_frame, TCX_20_CORE, snsl_q_fx ); + move16(); + sns_2st_cod_fx( snsl_fx, exp_snl, snsl_q_fx, ( 31 - Q16 ), &indexl[1] ); + + /* Quantize right */ + indexr[0] = sns_1st_cod_fx( snsr_fx, exp_snr, L_frame, TCX_20_CORE, snsr_q_fx ); + move16(); + sns_2st_cod_fx( snsr_fx, exp_snr, snsr_q_fx, ( 31 - Q16 ), &indexr[1] ); + } + return; +} +#else void sns_avq_cod_stereo( const float *snsl, /* i : Input sns vector (left channel) */ const float *snsr, /* i : Input sns vector (right channel) */ @@ -378,6 +804,7 @@ void sns_avq_cod_stereo( return; } +#endif int16_t quantize_sns( float sns_in[CPE_CHANNELS][NB_DIV][M], diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 36fa5a0c7..c778a3071 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -436,11 +436,12 @@ typedef struct stereo_td_enc_data_structure Word32 tdm_lt_corr_RM_fx; /* Long term right-mono correlation */ Word32 tdm_lt_corr_LM_fx; /* Long term left-mono correlation */ Word32 tdm_last_diff_lt_corr_fx; /* long term correlation difference mem */ - Word32 tdm_last_ratio_fx; /* Last TDM ratio */ - Word32 tdm_lt_rms_L_fx; /* Left channel long term rms */ - Word32 tdm_lt_rms_R_fx; /* Right channel long term rms */ - Word32 tdm_last_ener_lt_R_fx; /* Right channel long term energy */ - Word32 tdm_last_ener_lt_L_fx; /* Left channel long term energy */ + Word16 q_tdm_last_diff_lt_corr; + Word32 tdm_last_ratio_fx; /* Last TDM ratio */ + Word32 tdm_lt_rms_L_fx; /* Left channel long term rms */ + Word32 tdm_lt_rms_R_fx; /* Right channel long term rms */ + Word32 tdm_last_ener_lt_R_fx; /* Right channel long term energy */ + Word32 tdm_last_ener_lt_L_fx; /* Left channel long term energy */ Word16 tdm_last_ratio_idx; /* last TDM ratio index */ Word16 tdm_last_SM_flag; /* Flag to signal a SM encoding scheme -> better for some music item */ @@ -467,11 +468,12 @@ typedef struct stereo_td_enc_data_structure Word32 tdm_lt_corr_RM_SM_fx; /* Long term right-mono correlation in SM mode*/ Word32 tdm_lt_corr_LM_SM_fx; /* Long term left-mono correlation in SM mode*/ Word32 tdm_last_diff_lt_corr_SM_fx; /* long term correlation difference mem in SM mode*/ - Word32 tdm_last_ratio_SM_fx; /* Last TDM ratio in SM mode*/ - Word32 tdm_lt_rms_L_SM_fx; /* Left channel long term rms in SM mode*/ - Word32 tdm_lt_rms_R_SM_fx; /* Right channel long term rms in SM mode*/ - Word32 tdm_last_ener_lt_R_SM_fx; /* Right channel long term energy in SM mode*/ - Word32 tdm_last_ener_lt_L_SM_fx; /* Left channel long term energy in SM mode*/ + Word16 q_tdm_last_diff_lt_corr_SM; + Word32 tdm_last_ratio_SM_fx; /* Last TDM ratio in SM mode*/ + Word32 tdm_lt_rms_L_SM_fx; /* Left channel long term rms in SM mode*/ + Word32 tdm_lt_rms_R_SM_fx; /* Right channel long term rms in SM mode*/ + Word32 tdm_last_ener_lt_R_SM_fx; /* Right channel long term energy in SM mode*/ + Word32 tdm_last_ener_lt_L_SM_fx; /* Left channel long term energy in SM mode*/ Word16 tdm_last_ratio_idx_SM; /* last TDM ratio index in SM mode*/ Word16 tdm_last_SM_flag_noop; /* Flag to signal a SM encoding scheme -> better for some music item in SM mode*/ diff --git a/lib_enc/ivas_stereo_td_analysis.c b/lib_enc/ivas_stereo_td_analysis.c index fc2ace3e5..03288fd13 100644 --- a/lib_enc/ivas_stereo_td_analysis.c +++ b/lib_enc/ivas_stereo_td_analysis.c @@ -41,17 +41,40 @@ #include "ivas_cnst.h" #include "rom_enc.h" #include "wmc_auto.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_prot_fx.h" +#include "prot_fx.h" +#include "ivas_rom_com_fx.h" +#endif /*-------------------------------------------------------------------* * Local constants *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +#define RMS_MIN_FX_Q20 ( 1572864000 ) /* 1500 in Q20 */ /* Minimum energy for ratio index*/ +#define RMS_MIN2_FX_Q21 ( 2097152000 ) /* 1000 in Q21 */ /* Minimum energy for LR encoding*/ +#define CORR_THRES_FX_Q15 ( 31130 ) /* 0.95f in Q15 */ /* Maximal open loop correlation */ +#define DT_ENER_THR_FX_Q23 ( 1677721600 ) /* 200 in Q24 */ /* Energy variation threshold */ +#endif + #define RMS_MIN 1500 /* Minimum energy for ratio index*/ #define RMS_MIN2 1000 /* Minimum energy for LR encoding*/ #define CORR_THRES 0.95f /* Maximal open loop correlation */ #define DT_ENER_THR 200 /* Energy variation threshold */ +#ifdef IVAS_FLOAT_FIXED +#define ALP_REF_FX_Q31 ( 1717986918 ) /* 0.8f in Q31 */ /* smoothing factor */ +#define BET_REF_FX_Q31 ( ONE_IN_Q31 - ALP_REF_FX_Q31 ) + +#define ALP1_FX_Q31 ( 1073741824 ) /* 0.5f in Q31 */ /* smoothing factor in case of correlation are going in different directions */ +#define BET1_FX_Q31 ( ONE_IN_Q31 - ALP1_FX_Q31 ) /* increase the update rate */ + +#define ALP2_FX_Q31 ( 429496729 ) /* 0.2f in Q31 */ /* smoothing factor in case of correlation are going in different directions in SM mode*/ +#define BET2_FX_Q31 ( ONE_IN_Q31 - ALP2_FX_Q31 ) /* increase the update rate in SM mode*/ +#endif + #define ALP_REF 0.8f /* smoothing factor */ #define BET_REF ( 1.0f - ALP_REF ) @@ -62,11 +85,25 @@ #define BET2 ( 1.0f - ALP2 ) /* increase the update rate in SM mode*/ #define RATIO_MAX 1.5f /* Maximum correlation ratio */ +#ifdef IVAS_FLOAT_FIXED +#define RATIO_MAX_FX_Q30 ( 1610612736 ) /* 0.15f in Q30 */ /* Maximum correlation ratio */ +#define RATIO_MAX_FX_Q24 ( 2516582 ) /* 0.15f in Q24 */ /* Maximum correlation ratio */ +#define RATIO_MAX_FX_Q23 ( 1258291 ) /* 0.15f in Q23 */ /* Maximum correlation ratio */ +#endif + #define LIMIT_ADAP_FAC 0.15f #define MIN_ADAP_FAC 0.1f #define M_ADAP 0.0009f #define B_ADAP 0.16f +#ifdef IVAS_FLOAT_FIXED +#define LIMIT_ADAP_FAC_FX_Q24 ( 2516582 ) /* 0.15f in Q24 */ +#define MIN_ADAP_FAC_FX_Q24 ( 1677722 ) /*0.1f in Q24*/ +#define M_ADAP_FX_Q31 ( 1932735 ) /* 0.0009f in Q31 */ +#define B_ADAP_FX_Q24 ( 2684355 ) /* 0.16f in Q24 */ +// #define B_ADAP_FX_Q31 ( 343597384 ) /* 0.16f in Q31 */ +#endif + #define PC_LIMIT 64 #define RATIO_PG_HR 0.94f #define RATIO_PG 0.92f @@ -81,29 +118,61 @@ #define IVAS_BRATE_OMASA_STEREO_SW_THR 15000 +#ifdef IVAS_FLOAT_FIXED +// #define ONE_BY_100_Q15 ( 328 ) +#define ONE_BY_100_Q31 ( 21474896 ) +#define TEN_IN_Q27 ( 1342177280 ) /* 10.0f in Q27 */ +#define TEN_IN_Q24 ( 167772160 ) /* 10.0f in Q24 */ +#endif /*-------------------------------------------------------------------* * Local function prototypes *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static Word16 stereo_tdm_ener_analysis_SM_fx( CPE_ENC_HANDLE hCPE, Encoder_State **sts, const Word16 input_frame, Word16 *tdm_SM_flag ); + +static void Get_corr_n_fx( const Word16 L[], const Word16 R[], Word32 *ic_Lm, Word16 *q_ic_Lm, Word32 *ic_Rm, Word16 *q_ic_Rm, const Word16 len, Word32 *es_em, const Word16 tdm_SM_calc_flag ); +#else static int16_t stereo_tdm_ener_analysis_SM( CPE_ENC_HANDLE hCPE, Encoder_State **sts, const int16_t input_frame, int16_t *tdm_SM_flag ); +#endif static void Get_corr_n( const float L[], const float R[], float *ic_Lm, float *ic_Rm, const int16_t len, float *es_em, const int16_t tdm_SM_calc_flag ); + +#ifdef IVAS_FLOAT_FIXED +static Word16 stereo_smooth_LR_transition_fx( Word16 *tdm_prev_stable_idx, Word16 *tdm_ratio_transition_mov_flag, Word16 tdm_last_ratio_idx, Word16 *tdm_prev_desired_idx, Word16 *tdm_ratio_transition_cnt, const Word16 tdm_SM_flag, Word16 desired_idx ); + +static Word16 limit_idx_Dwnmix_fx( const Word16 idx_in, const Word16 unclr_decision, const Word16 inst_idx, const Word16 previous_idx, const Word16 tdm_last_LRTD_PriCh_cnt, const Word16 tdm_last_LRTD_frame_cnt ); +#else static int16_t stereo_smooth_LR_transition( int16_t *tdm_prev_stable_idx, int16_t *tdm_ratio_transition_mov_flag, int16_t tdm_last_ratio_idx, int16_t *tdm_prev_desired_idx, int16_t *tdm_ratio_transition_cnt, const int16_t tdm_SM_flag, int16_t desired_idx ); static int16_t limit_idx_Dwnmix( const int16_t idx_in, const int16_t unclr_decision, const int16_t inst_idx, const int16_t previous_idx, const int16_t tdm_last_LRTD_PriCh_cnt, const int16_t tdm_last_LRTD_frame_cnt ); +#endif static int16_t limit_idx_NoDwnmix( const int16_t idx_in, const int16_t side_can_change, const float d_lt_corr_raw ); +#ifdef IVAS_FLOAT_FIXED +static void Get_LR_rms_fx( const Word16 *Left_in, const Word16 *Right_in, const Word16 input_frame, Word32 *rms_L, Word16 *q_rms_L, Word32 *rms_R, Word16 *q_rms_R ); +#else +#endif static void Get_LR_rms( const float *Left_in, const float *Right_in, const int16_t input_frame, float *rms_L, float *rms_R ); +#ifdef IVAS_FLOAT_FIXED +static Word16 Get_dt_lt_ener_fx( CPE_ENC_HANDLE hCPE, const Word16 IsSideMono, const Word16 input_frame, const Word16 tdm_last_SM_flag, const Word32 rms_L, const Word16 q_rms_L, const Word32 rms_R, const Word16 q_rms_R, Word32 *tdm_lt_rms_L, Word32 *tdm_lt_rms_R, Word32 *tdm_last_ener_lt_L, Word32 *tdm_last_ener_lt_R, Word32 *tdm_LT_es_em, Word16 *tdm_hyst_cnt, Word16 *tdm_NOOP_SM_flag_loc, Word32 *ener_R_dt, Word32 *ener_L_dt, Word32 *corr_LM, Word16 *q_corr_LM, Word32 *corr_RM, Word16 *q_corr_RM ); +#else +#endif static int16_t Get_dt_lt_ener( CPE_ENC_HANDLE hCPE, const int16_t IsSideMono, const int16_t input_frame, const int16_t tdm_last_SM_flag, const float rms_L, const float rms_R, float *tdm_lt_rms_L, float *tdm_lt_rms_R, float *tdm_last_ener_lt_L, float *tdm_last_ener_lt_R, float *tdm_LT_es_em, int16_t *tdm_hyst_cnt, int16_t *tdm_NOOP_SM_flag_loc, float *ener_R_dt, float *ener_L_dt, float *corr_LM, float *corr_RM ); static void NOOP_decision( CPE_ENC_HANDLE hCPE, const int16_t tdm_NOOP_flag_loc, const int16_t tmp_SM_flag, const float rms_L, const float rms_R, int16_t *tdm_SM_flag_loc ); +#ifdef IVAS_FLOAT_FIXED +static Word32 Comp_diff_lt_corr_fx( CPE_ENC_HANDLE hCPE, const Word16 IsSideMono, const Word32 rms_L, const Word16 q_rms_L, const Word32 rms_R, const Word16 q_rms_R, const Word32 ener_L_dt, const Word32 ener_R_dt, Word32 corr_LM, Word16 q_corr_LM, Word32 corr_RM, Word16 q_corr_RM, const Word32 tdm_lt_rms_L, const Word32 tdm_lt_rms_R, Word32 *tdm_lt_corr_LM, Word32 *tdm_lt_corr_RM, Word32 *tdm_last_diff_lt_corr, Word16 *q_tdm_last_diff_lt_corr, Word32 *inst_ratio_L_out, Word32 *diff_lt_corr, Word16 *q_d_lt_corr_raw ); +#else +#endif static float Comp_diff_lt_corr( CPE_ENC_HANDLE hCPE, const int16_t IsSideMono, const float rms_L, const float rms_R, const float ener_L_dt, const float ener_R_dt, float corr_LM, float corr_RM, const float tdm_lt_rms_L, const float tdm_lt_rms_R, float *tdm_lt_corr_LM, float *tdm_lt_corr_RM, float *tdm_last_diff_lt_corr, float *inst_ratio_L_out, float *diff_lt_corr ); + /*-------------------------------------------------------------------* * Function stereo_tdm_ener_analysis() * @@ -371,7 +440,11 @@ int16_t stereo_tdm_ener_analysis( } } +#ifdef IVAS_FLOAT_FIXED + idx = stereo_smooth_LR_transition_fx( &hStereoTD->tdm_prev_stable_idx, &hStereoTD->tdm_ratio_transition_mov_flag, hStereoTD->tdm_last_ratio_idx, &hStereoTD->tdm_prev_desired_idx, &hStereoTD->tdm_ratio_transition_cnt, tdm_SM_flag_loc, desired_idx ); +#else idx = stereo_smooth_LR_transition( &hStereoTD->tdm_prev_stable_idx, &hStereoTD->tdm_ratio_transition_mov_flag, hStereoTD->tdm_last_ratio_idx, &hStereoTD->tdm_prev_desired_idx, &hStereoTD->tdm_ratio_transition_cnt, tdm_SM_flag_loc, desired_idx ); +#endif /* Change the switching level in case of dual mono (in case the scenario still accept left right switching */ /* This logic is needed in case the content is exactly the same in the 2 channel and it is expected to get back to LRTD, to prevent the secondary channel to be completely empty */ @@ -458,7 +531,11 @@ int16_t stereo_tdm_ener_analysis( } else { +#ifdef IVAS_FLOAT_FIXED + idx = limit_idx_Dwnmix_fx( idx, ( hCPE->hStereoClassif->unclr_decision || ( sts[0]->flag_noisy_speech_snr == 1 && hCPE->hStereoClassif->xtalk_wscore > 0.1f ) ), desired_idx, hStereoTD->tdm_last_ratio_idx, hStereoTD->tdm_last_LRTD_PriCh_cnt, hStereoTD->tdm_last_LRTD_frame_cnt ); +#else idx = limit_idx_Dwnmix( idx, ( hCPE->hStereoClassif->unclr_decision || ( sts[0]->flag_noisy_speech_snr == 1 && hCPE->hStereoClassif->xtalk_wscore > 0.1f ) ), desired_idx, hStereoTD->tdm_last_ratio_idx, hStereoTD->tdm_last_LRTD_PriCh_cnt, hStereoTD->tdm_last_LRTD_frame_cnt ); +#endif } if ( abs( hStereoTD->tdm_last_ratio_idx - idx ) > LRTD_STEREO_MID_IS_PRIM ) @@ -512,7 +589,38 @@ int16_t stereo_tdm_ener_analysis( hStereoTD->tdm_hyst_cnt_SM = 0; } +#ifdef IVAS_FLOAT_FIXED + hStereoTD->tdm_lt_rms_L_SM_fx = floatToFixed_32( hStereoTD->tdm_lt_rms_L_SM, Q24 ); + hStereoTD->tdm_lt_rms_R_SM_fx = floatToFixed_32( hStereoTD->tdm_lt_rms_R_SM, Q24 ); + hStereoTD->tdm_LT_es_em_SM_fx = floatToFixed_32( hStereoTD->tdm_LT_es_em_SM, Q21 ); + sts[0]->hNoiseEst->Etot_last_fx = float_to_fix16( sts[0]->hNoiseEst->Etot_last, Q8 ); + sts[1]->hNoiseEst->Etot_last_fx = float_to_fix16( sts[1]->hNoiseEst->Etot_last, Q8 ); + + hStereoTD->q_tdm_last_diff_lt_corr_SM = Q31; + hStereoTD->tdm_last_diff_lt_corr_SM_fx = floatToFixed_32( hStereoTD->tdm_last_diff_lt_corr_SM, hStereoTD->q_tdm_last_diff_lt_corr_SM ); +#endif + +#ifdef IVAS_FLOAT_FIXED + *tdm_ratio_idx_SM = stereo_tdm_ener_analysis_SM_fx( hCPE, sts, input_frame, &tdm_NOOP_flag ); +#else *tdm_ratio_idx_SM = stereo_tdm_ener_analysis_SM( hCPE, sts, input_frame, &tdm_NOOP_flag ); +#endif + +#ifdef IVAS_FLOAT_FIXED + hStereoTD->tdm_lt_rms_L_SM = fixedToFloat_32( hStereoTD->tdm_lt_rms_L_SM_fx, Q24 ); + hStereoTD->tdm_lt_rms_R_SM = fixedToFloat_32( hStereoTD->tdm_lt_rms_R_SM_fx, Q24 ); + hStereoTD->tdm_last_ener_lt_L_SM = fixedToFloat_32( hStereoTD->tdm_last_ener_lt_L_SM_fx, Q24 ); + hStereoTD->tdm_last_ener_lt_R_SM = fixedToFloat_32( hStereoTD->tdm_last_ener_lt_R_SM_fx, Q24 ); + hStereoTD->tdm_LT_es_em_SM = fixedToFloat_32( hStereoTD->tdm_LT_es_em_SM_fx, Q21 ); + sts[0]->hNoiseEst->Etot_last = fix16_to_float( sts[0]->hNoiseEst->Etot_last_fx, Q8 ); + sts[1]->hNoiseEst->Etot_last = fix16_to_float( sts[1]->hNoiseEst->Etot_last_fx, Q8 ); + hCPE->hStereoClassif->xtalk_fv[E_diff_corrLM_corrRM] = fixedToFloat( hCPE->hStereoClassif->xtalk_fv_fx[E_diff_corrLM_corrRM], Q21 ); + hCPE->hStereoClassif->xtalk_fv[E_tdm_LT_es_em] = fixedToFloat( hCPE->hStereoClassif->xtalk_fv_fx[E_tdm_LT_es_em], Q21 ); + + hStereoTD->tdm_lt_corr_LM_SM = fixedToFloat_32( hStereoTD->tdm_lt_corr_LM_SM_fx, Q24 ); + hStereoTD->tdm_lt_corr_RM_SM = fixedToFloat_32( hStereoTD->tdm_lt_corr_RM_SM_fx, Q24 ); + hStereoTD->tdm_last_diff_lt_corr_SM = fixedToFloat_32( hStereoTD->tdm_last_diff_lt_corr_SM_fx, hStereoTD->q_tdm_last_diff_lt_corr_SM ); +#endif } else { @@ -536,6 +644,88 @@ int16_t stereo_tdm_ener_analysis( return ( idx ); } +#ifdef IVAS_FLOAT_FIXED +/*-------------------------------------------------------------------* + * Function Get_LR_rms_fx() + * + * Get current frame left and right rms values + *-------------------------------------------------------------------*/ + +static void Get_LR_rms_fx( + const Word16 *Left_in, + const Word16 *Right_in, + const Word16 input_frame, + Word32 *rms_L, + Word16 *q_rms_L, + Word32 *rms_R, + Word16 *q_rms_R ) +{ + Word32 ener_l, ener_r; + Word32 ener_l_tmp, ener_r_tmp; + Word64 ener_l_tmp_64bit, ener_r_tmp_64bit; + Word16 q_shift; + Word16 i; + Word16 exp_out_l, exp_out_r, exp_diff; + + ener_l_tmp_64bit = 0; + move64(); + ener_r_tmp_64bit = 0; + move64(); + ener_l = ONE_BY_100_Q31; + move32(); + ener_r = ONE_BY_100_Q31; + move32(); + + FOR( i = 0; i < input_frame; i++ ) + { + ener_l_tmp_64bit = W_add( ener_l_tmp_64bit, W_deposit32_l( L_mult0( Left_in[i], Left_in[i] ) ) ); // Q0 + ener_r_tmp_64bit = W_add( ener_r_tmp_64bit, W_deposit32_l( L_mult0( Right_in[i], Right_in[i] ) ) ); // Q0 + } + + q_shift = 31; + move16(); + IF( ener_l_tmp_64bit != 0 ) + { + q_shift = s_min( q_shift, W_norm( ener_l_tmp_64bit ) ); + } + IF( ener_r_tmp_64bit != 0 ) + { + q_shift = s_min( q_shift, W_norm( ener_r_tmp_64bit ) ); + } + ener_l_tmp = W_extract_l( W_shl_nosat( ener_l_tmp_64bit, sub( q_shift, 32 ) ) ); // (q_shift - 32) + ener_r_tmp = W_extract_l( W_shl_nosat( ener_r_tmp_64bit, sub( q_shift, 32 ) ) ); // (q_shift - 32) + /* perform rounding towards lower value for negative results */ + IF( ener_l_tmp < 0 ) + { + ener_l_tmp = L_add( ener_l_tmp, 1 ); + } + IF( ener_r_tmp < 0 ) + { + ener_r_tmp = L_add( ener_r_tmp, 1 ); + } + + ener_l = BASOP_Util_Add_Mant32Exp( ener_l, 0, ener_l_tmp, sub( Q31, sub( q_shift, 32 ) ), &exp_out_l ); + ener_r = BASOP_Util_Add_Mant32Exp( ener_r, 0, ener_r_tmp, sub( Q31, sub( q_shift, 32 ) ), &exp_out_r ); + + ener_l_tmp = BASOP_Util_Divide3232_Scale( ener_l, input_frame, &exp_diff ); + exp_out_l = sub( add( exp_diff, exp_out_l ), Q15 ); + ener_r_tmp = BASOP_Util_Divide3232_Scale( ener_r, input_frame, &exp_diff ); + exp_out_r = sub( add( exp_diff, exp_out_r ), Q15 ); + + *rms_L = Sqrt32( ener_l_tmp, &exp_out_l ); // Q31 - exp_out_l + move32(); + *q_rms_L = sub( Q31, exp_out_l ); + move16(); + *rms_R = Sqrt32( ener_r_tmp, &exp_out_r ); // Q31 - exp_out_r + move32(); + *q_rms_R = sub( Q31, exp_out_r ); + move16(); + + return; +} +#endif + + /*-------------------------------------------------------------------* * Function Get_LR_rms() * @@ -567,6 +757,181 @@ static void Get_LR_rms( } +#ifdef IVAS_FLOAT_FIXED +/*-------------------------------------------------------------------* + * Function Get_dt_lt_ener_fx() + * + * Compute the gain of L&R channel compared to mono + * - estimate the long term evolution of the L to Mono gain + * - estimate the long term evolution of the R to Mono gain + * - estimate the long term difference between the long term + * - evolution of the L and R to Mono gain + *-------------------------------------------------------------------*/ + +static Word16 Get_dt_lt_ener_fx( + CPE_ENC_HANDLE hCPE, + const Word16 IsSideMono, + const Word16 input_frame, + const Word16 tdm_last_SM_flag, + const Word32 rms_L, + const Word16 q_rms_L, + const Word32 rms_R, + const Word16 q_rms_R, + Word32 *tdm_lt_rms_L, + Word32 *tdm_lt_rms_R, + Word32 *tdm_last_ener_lt_L, + Word32 *tdm_last_ener_lt_R, + Word32 *tdm_LT_es_em, + Word16 *tdm_hyst_cnt, + Word16 *tdm_NOOP_SM_flag_loc, + Word32 *ener_R_dt, + Word32 *ener_L_dt, + Word32 *corr_LM, + Word16 *q_corr_LM, + Word32 *corr_RM, + Word16 *q_corr_RM ) +{ + Encoder_State **sts; + Word16 Left_in_fx[L_FRAME48k], Right_in_fx[L_FRAME48k]; + Word16 q_Left_in, q_Right_in; + Word32 es_em_fx; + Word16 tmp_SM_flag, tdm_SM_flag_loc; + Word32 L_tmp, L_tmp1; + Word16 exp_diff; + + sts = hCPE->hCoreCoder; +#if 0 + Left_in_fx = sts[0]->input_fx; /* Left channel */ + Right_in_fx = sts[1]->input_fx; /* Right channel */ +#else + /* This part has f2f conversions as sts[0]->input_fx and sts[1]->input_fx are in Q0. Precision loss is observed in later functions.*/ + q_Left_in = Q_factor_arr( sts[0]->input, input_frame ); + q_Right_in = Q_factor_arr( sts[1]->input, input_frame ); + q_Left_in = s_min( q_Left_in, q_Right_in ); + q_Left_in = sub( q_Left_in, Q1 ); + floatToFixed_arr16( sts[0]->input, Left_in_fx, q_Left_in, input_frame ); + floatToFixed_arr16( sts[1]->input, Right_in_fx, q_Left_in, input_frame ); +#endif + + tdm_SM_flag_loc = tdm_last_SM_flag; + move16(); + + test(); + IF( NE_16( hCPE->last_element_mode, IVAS_CPE_TD ) && IsSideMono == 0 ) /* last coding mode not TD and normal mono/side case, quick update of lt energy */ + { + *tdm_lt_rms_L = L_shl( Mpy_32_32( 1932735282 /* 0.9f in Q31 */, rms_L ), sub( Q24, q_rms_L ) ); // (Q31, q_rms_L) -> q_rms_L -> Q24 + move32(); + *tdm_lt_rms_R = L_shl( Mpy_32_32( 1932735282 /* 0.9f in Q31 */, rms_R ), sub( Q24, q_rms_R ) ); // (Q31, q_rms_R) -> q_rms_R -> Q24 + move32(); + L_tmp = Mpy_32_16_1( 1932735282 /* 0.9f in Q31 */, sts[0]->hNoiseEst->Etot_last_fx ); //(Q31, Q8) -> Q24 + sts[1]->hNoiseEst->Etot_last_fx = extract_h( L_tmp ); // (Q24 >> Q16) -> Q8 + sts[1]->hVAD->hangover_cnt = 0; + move16(); + } + ELSE + { + L_tmp = Mpy_32_32( 1288490188 /* 0.6f in Q31 */, *tdm_lt_rms_L ); // Q24 + L_tmp1 = Mpy_32_32( 858993459 /* 0.4f in Q31 */, rms_L ); // q_rms_L + *tdm_lt_rms_L = BASOP_Util_Add_Mant32Exp( L_tmp, Q31 - Q24, L_tmp1, sub( Q31, q_rms_L ), &exp_diff ); //(Q31 - exp_diff) + move32(); + *tdm_lt_rms_L = L_shl( *tdm_lt_rms_L, sub( Q24, sub( Q31, exp_diff ) ) ); // Q24 + move32(); + L_tmp = Mpy_32_32( 1288490188 /* 0.6f in Q31 */, *tdm_lt_rms_R ); // Q24 + L_tmp1 = Mpy_32_32( 858993459 /* 0.4f in Q31 */, rms_R ); // q_rms_L + *tdm_lt_rms_R = BASOP_Util_Add_Mant32Exp( L_tmp, Q31 - Q24, L_tmp1, sub( Q31, q_rms_R ), &exp_diff ); //(Q31 - exp_diff) + move32(); + *tdm_lt_rms_R = L_shl( *tdm_lt_rms_R, sub( Q24, sub( Q31, exp_diff ) ) ); // Q24 + move32(); + } + + /*----------------------------------------------------------------* + * Compute the 1st order energy difference difference + *----------------------------------------------------------------*/ + + *ener_R_dt = L_sub( *tdm_lt_rms_R, *tdm_last_ener_lt_R ); // Q24 + move32(); + *tdm_last_ener_lt_R = *tdm_lt_rms_R; // Q24 + move32(); + + *ener_L_dt = L_sub( *tdm_lt_rms_L, *tdm_last_ener_lt_L ); // Q24 + move32(); + *tdm_last_ener_lt_L = *tdm_lt_rms_L; // Q24 + move32(); + + /*----------------------------------------------------------------* + * Compute the gain of L&R channel compared to mono + * - estimate the long term evolution of the L to Mono gain + * - estimate the long term evolution of the R to Mono gain + * - estimate the long term difference between the long term + * - evolution of the L and R to Mono gain + *----------------------------------------------------------------*/ + + Get_corr_n_fx( Left_in_fx, Right_in_fx, corr_LM, q_corr_LM, corr_RM, q_corr_RM, input_frame, &es_em_fx, IsSideMono ); + + hCPE->hStereoClassif->xtalk_fv_fx[E_diff_corrLM_corrRM] = BASOP_Util_Add_Mant32Exp( *corr_LM, sub( Q31, *q_corr_LM ), L_negate( *corr_RM ), sub( Q31, *q_corr_RM ), &exp_diff ); + move32(); + hCPE->hStereoClassif->xtalk_fv_fx[E_diff_corrLM_corrRM] = L_shl( hCPE->hStereoClassif->xtalk_fv_fx[E_diff_corrLM_corrRM], sub( Q21, sub( Q31, exp_diff ) ) ); + move32(); + + IF( sts[0]->hVAD->hangover_cnt != 0 ) + { + *tdm_LT_es_em = Mpy_32_32( 1932735282 /* 0.9f in Q31 */, *tdm_LT_es_em ); // Q21 + move32(); + } + ELSE + { + *tdm_LT_es_em = L_add( Mpy_32_32( 1932735282 /* 0.9f in Q31 */, *tdm_LT_es_em ), Mpy_32_32( 214748365 /* 0.1f in Q31 */, es_em_fx ) ); // Q21 + move32(); + } + + hCPE->hStereoClassif->xtalk_fv_fx[E_tdm_LT_es_em] = *tdm_LT_es_em; // Q21 + move32(); + + tmp_SM_flag = 0; + move16(); + if ( LT_16( s_min( sts[0]->old_corr_fx, sts[1]->old_corr_fx ), 27853 /* 0.85f in Q15 */ ) && LT_16( s_max( sts[0]->old_corr_fx, sts[1]->old_corr_fx ), 30147 /* 0.92f in Q15 */ ) && + ( GT_32( *tdm_LT_es_em, ONE_IN_Q22 /* 2.0f in Q21 */ ) || GT_32( es_em_fx, 5242880 /* 2.5f in Q21 */ ) ) && ( LE_16( sts[0]->hVAD->hangover_cnt, 1 ) && LE_16( sts[1]->hVAD->hangover_cnt, 3 ) && sts[0]->tdm_LRTD_flag == 0 ) ) + { + tmp_SM_flag = 1; + move16(); + } + if ( IsSideMono == 0 ) + { + *tdm_NOOP_SM_flag_loc = tdm_SM_flag_loc; + move16(); + } + + IF( NE_16( tmp_SM_flag, tdm_SM_flag_loc ) ) + { + IF( GE_16( *tdm_hyst_cnt, 2 ) && EQ_16( tmp_SM_flag, 1 ) && ( GT_16( sts[0]->tdm_pc, PC_LIMIT ) || GT_16( sts[1]->tdm_pc, PC_LIMIT ) ) ) + { + tdm_hyst_cnt++; + *tdm_NOOP_SM_flag_loc = tmp_SM_flag; + move16(); + *tdm_hyst_cnt = 0; + move16(); + } + ELSE IF( GE_16( *tdm_hyst_cnt, 20 ) && tmp_SM_flag == 0 && + ( GT_16( sts[0]->tdm_pc, PC_LIMIT ) || GT_16( sts[1]->tdm_pc, PC_LIMIT ) ) && ( LE_32( *tdm_LT_es_em, ONE_IN_Q20 /* 0.5f in Q21 */ ) || LT_32( es_em_fx, -20971520 /* -10.0f in Q21 */ ) ) ) + { + tdm_hyst_cnt++; + *tdm_NOOP_SM_flag_loc = tmp_SM_flag; + move16(); + *tdm_hyst_cnt = 0; + move16(); + } + } + ELSE + { + *tdm_hyst_cnt = 0; + move16(); + } + + return tmp_SM_flag; +} +#endif + + /*-------------------------------------------------------------------* * Function Get_dt_lt_ener() * @@ -802,6 +1167,220 @@ static void NOOP_decision( } +#ifdef IVAS_FLOAT_FIXED +/*-------------------------------------------------------------------* + * Function Comp_diff_lt_corr_fx() + * + * Adjust stereo downmixing adaptation rate factor + * in function of the signal energy. + *-------------------------------------------------------------------*/ + +static Word32 Comp_diff_lt_corr_fx( + CPE_ENC_HANDLE hCPE, + const Word16 IsSideMono, + const Word32 rms_L, + const Word16 q_rms_L, + const Word32 rms_R, + const Word16 q_rms_R, + const Word32 ener_L_dt, + const Word32 ener_R_dt, + Word32 corr_LM, + Word16 q_corr_LM, + Word32 corr_RM, + Word16 q_corr_RM, + const Word32 tdm_lt_rms_L, + const Word32 tdm_lt_rms_R, + Word32 *tdm_lt_corr_LM, + Word32 *tdm_lt_corr_RM, + Word32 *tdm_last_diff_lt_corr, + Word16 *q_tdm_last_diff_lt_corr, + Word32 *inst_ratio_L_out, + Word32 *diff_lt_corr, + Word16 *q_d_lt_corr_raw ) +{ + Encoder_State **sts; + Word32 adaprate_fx; + Word32 adaprate_tmp_fx; + Word32 madaprate_fx; + Word32 d_lt_corr_raw_fx; + Word32 L_tmp, L_tmp1; + Word16 q_tmp, q_tmp1; + Word16 exp_diff; + Word32 inst_ratio_L_fx; + Word16 angle; + Word32 diff_lt_corr_LM_tmp_fx, diff_lt_corr_RM_tmp_fx; + Word16 q_diff_lt_corr_LM_tmp, q_diff_lt_corr_RM_tmp; + Word32 diff_lt_corr_tmp_fx; + Word16 q_diff_lt_corr_tmp; + Word32 d_lt_corr_fx; + Word16 q_d_lt_corr; + Word16 d_lt_corr_shift, shift, q_com; + + sts = hCPE->hCoreCoder; + + /*----------------------------------------------------------------* + * Adjust stereo downmixing adaptation rate factor + * in function of the signal energy. If signal energy is low, + * adaptation rate factor is lower. This prevent stereo image + * move on speech offset + *----------------------------------------------------------------*/ + + IF( IsSideMono == 0 && EQ_16( hCPE->hStereoClassif->lrtd_mode, 1 ) && ( GT_32( tdm_lt_rms_R, L_shl( tdm_lt_rms_L, Q1 ) ) || GT_32( tdm_lt_rms_L, L_shl( tdm_lt_rms_R, Q1 ) ) ) ) + { + adaprate_fx = L_add( Mpy_32_32( M_ADAP_FX_Q31, L_max( tdm_lt_rms_R, tdm_lt_rms_L ) ), B_ADAP_FX_Q24 ); // Q24 + } + ELSE + { + adaprate_fx = L_add( Mpy_32_32( M_ADAP_FX_Q31, L_min( tdm_lt_rms_R, tdm_lt_rms_L ) ), B_ADAP_FX_Q24 ); // Q24 + } + + adaprate_fx = check_bounds_l( adaprate_fx, MIN_ADAP_FAC_FX_Q24, ONE_IN_Q24 ); // Q24 + + /*----------------------------------------------------------------* + * In case of unvoiced content (expect when it is part of an onset), + * the adaptation rate is minimal. + *----------------------------------------------------------------*/ + + IF( GT_16( sts[0]->ini_frame, 2 ) && + ( ( LE_16( sts[0]->last_clas, VOICED_TRANSITION ) && sts[0]->hVAD->hangover_cnt == 0 ) || + ( LE_16( sts[1]->last_clas, VOICED_TRANSITION ) && sts[1]->hVAD->hangover_cnt == 0 ) ) ) + { + adaprate_fx = L_min( adaprate_fx, LIMIT_ADAP_FAC_FX_Q24 ); + } + + d_lt_corr_raw_fx = 0; + move32(); + IF( IsSideMono == 0 ) + { + if ( NE_16( hCPE->last_element_mode, IVAS_CPE_TD ) || ( ( LT_32( tdm_lt_rms_R, ONE_IN_Q24 ) || LT_32( tdm_lt_rms_L, ONE_IN_Q24 ) ) && EQ_16( hCPE->hStereoClassif->lrtd_mode, 1 ) && LT_32( L_max( tdm_lt_rms_R, tdm_lt_rms_L ), TEN_IN_Q24 ) ) ) + { + adaprate_fx = 16441672; /* 0.98f in Q24 */ /* speed up the adaptation of the long term values to the current values after coming from DFT */ + move32(); + } + adaprate_tmp_fx = L_max( adaprate_fx, 13421773 /* 0.8f in Q24 */ ); // Q24 + madaprate_fx = L_sub( ONE_IN_Q24, adaprate_tmp_fx ); /* madaprate has temporary value, will updated few lines below */ // Q24 + + L_tmp = Mpy_32_32( adaprate_tmp_fx, corr_LM ); // (Q24, q_corr_LM) -> q_corr_LM - Q7 + L_tmp1 = Mpy_32_32( madaprate_fx, *tdm_lt_corr_LM ); // (Q24, Q24) -> Q17 + L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, sub( Q31, sub( q_corr_LM, Q7 ) ), L_tmp1, Q31 - Q17, &exp_diff ); // Q31 - exp_diff + q_tmp = sub( Q31, exp_diff ); + + L_tmp = Mpy_32_32( adaprate_tmp_fx, corr_RM ); // (Q24, q_corr_RM) -> q_corr_RM - Q7 + L_tmp1 = Mpy_32_32( madaprate_fx, *tdm_lt_corr_RM ); // (Q24, Q24) -> Q17 + L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp, sub( Q31, sub( q_corr_RM, Q7 ) ), L_tmp1, Q31 - Q17, &exp_diff ); // Q31 - exp_diff + q_tmp1 = sub( Q31, exp_diff ); + + d_lt_corr_raw_fx = BASOP_Util_Add_Mant32Exp( L_tmp, sub( Q31, q_tmp ), L_tmp1, sub( Q31, q_tmp1 ), &exp_diff ); // Q31 - exp_diff + *q_d_lt_corr_raw = sub( Q31, exp_diff ); + move16(); + q_com = s_min( *q_d_lt_corr_raw, Q30 ); + + inst_ratio_L_fx = 0; + move32(); + inst_ratio_L_fx = L_max( L_shl( d_lt_corr_raw_fx, sub( q_com, *q_d_lt_corr_raw ) ), L_negate( L_shl( RATIO_MAX_FX_Q30, sub( q_com, Q30 ) ) ) ); // q_com + inst_ratio_L_fx = L_min( inst_ratio_L_fx, L_shl( RATIO_MAX_FX_Q30, sub( q_com, Q30 ) ) ); // q_com + inst_ratio_L_fx = L_add( Mpy_32_32( 1432371593 /* 0.667f in Q31 */, inst_ratio_L_fx ), L_shl( 1, q_com ) ); // q_com + angle = extract_l( L_shl( Mpy_32_16_1( inst_ratio_L_fx, EVS_PI_FX ), sub( Q13, sub( q_com, Q2 ) ) ) ); // (q_com, Q13) -> q_com - Q2 >> Q1 -> q_com - Q3 -> Q13 + *inst_ratio_L_out = L_shl( L_shr( L_sub( ONE_IN_Q14, L_deposit_l( getCosWord16( angle ) ) ), Q1 ), Q24 - Q14 ); // Q14 << Q10 -> Q24 + } + madaprate_fx = L_sub( ONE_IN_Q24, adaprate_fx ); // Q24 + corr_RM = BASOP_Util_Add_Mant32Exp( Mpy_32_32( adaprate_fx, corr_RM ), sub( Q31, sub( q_corr_RM, Q7 ) ), Mpy_32_32( madaprate_fx, *tdm_lt_corr_RM ), Q31 - Q17, &exp_diff ); // Q31 - exp_diff + q_corr_RM = sub( Q31, exp_diff ); + corr_LM = BASOP_Util_Add_Mant32Exp( Mpy_32_32( adaprate_fx, corr_LM ), sub( Q31, sub( q_corr_LM, Q7 ) ), Mpy_32_32( madaprate_fx, *tdm_lt_corr_LM ), Q31 - Q17, &exp_diff ); // Q31 - exp_diff + q_corr_LM = sub( Q31, exp_diff ); + + L_tmp = Mpy_32_32( ALP_REF_FX_Q31, *tdm_lt_corr_LM ); // Q24 + L_tmp1 = Mpy_32_32( BET_REF_FX_Q31, corr_LM ); // q_corr_LM + diff_lt_corr_LM_tmp_fx = BASOP_Util_Add_Mant32Exp( L_tmp, sub( Q31, q_corr_LM ), L_tmp1, Q31 - Q24, &exp_diff ); + q_diff_lt_corr_LM_tmp = sub( Q31, exp_diff ); + L_tmp = Mpy_32_32( ALP_REF_FX_Q31, *tdm_lt_corr_RM ); // Q24 + L_tmp1 = Mpy_32_32( BET_REF_FX_Q31, corr_RM ); // q_corr_RM + diff_lt_corr_RM_tmp_fx = BASOP_Util_Add_Mant32Exp( L_tmp, sub( Q31, q_corr_RM ), L_tmp1, Q31 - Q24, &exp_diff ); + q_diff_lt_corr_RM_tmp = sub( Q31, exp_diff ); + diff_lt_corr_tmp_fx = BASOP_Util_Add_Mant32Exp( diff_lt_corr_LM_tmp_fx, sub( Q31, q_diff_lt_corr_LM_tmp ), L_negate( diff_lt_corr_RM_tmp_fx ), sub( Q31, q_diff_lt_corr_RM_tmp ), &exp_diff ); // (Q31 - exp_diff) + q_diff_lt_corr_tmp = sub( Q31, exp_diff ); + + d_lt_corr_fx = BASOP_Util_Add_Mant32Exp( diff_lt_corr_tmp_fx, sub( Q31, q_diff_lt_corr_tmp ), L_negate( *tdm_last_diff_lt_corr ), sub( Q31, *q_tdm_last_diff_lt_corr ), &exp_diff ); // (Q31 - exp_diff) + q_d_lt_corr = sub( Q31, exp_diff ); + IF( GT_16( q_d_lt_corr, Q31 ) ) + { + d_lt_corr_shift = sub( Q31, q_d_lt_corr ); + shift = 0; + move16(); + } + ELSE + { + d_lt_corr_shift = 0; + move16(); + shift = sub( q_d_lt_corr, Q31 ); + } + *tdm_last_diff_lt_corr = diff_lt_corr_tmp_fx; + move32(); + *q_tdm_last_diff_lt_corr = q_diff_lt_corr_tmp; + move16(); + + /*----------------------------------------------------------------* + * Correct the estimation depending of channels energies evolution + *----------------------------------------------------------------*/ + + IF( EQ_16( IsSideMono, 1 ) && + ( ( LT_32( L_shl( rms_L, sub( Q21, q_rms_L ) ), RMS_MIN2_FX_Q21 ) && + LT_32( L_shl( rms_R, sub( Q21, q_rms_R ) ), RMS_MIN2_FX_Q21 ) ) && + ( LT_32( tdm_lt_rms_L, L_shl( Mpy_32_32( 1717986918 /* 0.8f in Q31 */, rms_L ), sub( Q24, q_rms_L ) ) ) && + LT_32( tdm_lt_rms_R, L_shl( Mpy_32_32( 1717986918 /* 0.8f in Q31 */, rms_R ), sub( Q24, q_rms_R ) ) ) ) && + ( GT_32( tdm_lt_rms_L, L_shl( tdm_lt_rms_R, Q1 ) ) || + LT_32( tdm_lt_rms_L, L_shr( tdm_lt_rms_R, Q1 ) ) ) ) ) + { + L_tmp = Mpy_32_32( ALP2_FX_Q31, *tdm_lt_corr_LM ); // Q24 + L_tmp1 = Mpy_32_32( BET2_FX_Q31, corr_LM ); // q_corr_LM + L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, Q31 - Q24, L_tmp1, sub( Q31, q_corr_LM ), &exp_diff ); // (Q31 - exp_diff) + *tdm_lt_corr_LM = L_shl( L_tmp, sub( Q24, sub( Q31, exp_diff ) ) ); // Q24 + move32(); + L_tmp = Mpy_32_32( ALP2_FX_Q31, *tdm_lt_corr_RM ); // Q24 + L_tmp1 = Mpy_32_32( BET2_FX_Q31, corr_RM ); // q_corr_RM + L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, Q31 - Q24, L_tmp1, sub( Q31, q_corr_RM ), &exp_diff ); // (Q31 - exp_diff) + *tdm_lt_corr_RM = L_shl( L_tmp, sub( Q24, sub( Q31, exp_diff ) ) ); // Q24 + move32(); + + *tdm_lt_corr_LM = L_shl( Mpy_32_32( *tdm_lt_corr_LM, 1342177280 /* 2.5f in Q29 */ ), Q24 - Q22 ); // ((Q24, Q29) -> Q22 << 2) -> Q24 + move32(); + *tdm_lt_corr_RM = L_shl( Mpy_32_32( *tdm_lt_corr_RM, 1342177280 /* 2.5f in Q29 */ ), Q24 - Q22 ); // ((Q24, Q29) -> Q22 << 2) -> Q24 + move32(); + } + ELSE IF( ( !( ( GT_32( L_shr( ener_R_dt, Q1 ), DT_ENER_THR_FX_Q23 ) && LT_32( L_shr( ener_L_dt, Q1 ), DT_ENER_THR_FX_Q23 ) ) || + ( LT_32( L_shr( ener_R_dt, Q1 ), DT_ENER_THR_FX_Q23 ) && GT_32( L_shr( ener_L_dt, Q1 ), DT_ENER_THR_FX_Q23 ) ) ) /* Energy are going in the same direction */ + && ( LT_32( L_abs( L_shl( d_lt_corr_fx, d_lt_corr_shift ) ), L_shl( 665719931 /* 0.31f in Q31 */, shift ) ) /* small difference regarding the difference gain evolution */ + || GT_32( L_shr( tdm_lt_rms_L, Q24 - Q20 ), RMS_MIN2_FX_Q21 ) || GT_32( L_shr( tdm_lt_rms_R, Q24 - Q20 ), RMS_MIN2_FX_Q21 ) ) ) /* Energy of at least one of the channel is not low */ + ) + { + /* Use estimated results */ + *tdm_lt_corr_LM = L_shl( diff_lt_corr_LM_tmp_fx, sub( Q24, q_diff_lt_corr_LM_tmp ) ); + move32(); + *tdm_lt_corr_RM = L_shl( diff_lt_corr_RM_tmp_fx, sub( Q24, q_diff_lt_corr_RM_tmp ) ); + move32(); + } + ELSE + { + L_tmp = Mpy_32_32( ALP1_FX_Q31, *tdm_lt_corr_LM ); // Q24 + L_tmp1 = Mpy_32_32( BET1_FX_Q31, corr_LM ); // q_corr_LM + L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, Q31 - Q24, L_tmp1, sub( Q31, q_corr_LM ), &exp_diff ); // (Q31 - exp_diff) + *tdm_lt_corr_LM = L_shl( L_tmp, sub( Q24, sub( Q31, exp_diff ) ) ); // Q24 + move32(); + L_tmp = Mpy_32_32( ALP1_FX_Q31, *tdm_lt_corr_RM ); // Q24 + L_tmp1 = Mpy_32_32( BET1_FX_Q31, corr_RM ); // q_corr_RM + L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, Q31 - Q24, L_tmp1, sub( Q31, q_corr_RM ), &exp_diff ); // (Q31 - exp_diff) + *tdm_lt_corr_RM = L_shl( L_tmp, sub( Q24, sub( Q31, exp_diff ) ) ); // Q24 + move32(); + } + + *diff_lt_corr = L_sub( *tdm_lt_corr_LM, *tdm_lt_corr_RM ); /* update the difference */ // Q24 + move32(); + + return d_lt_corr_raw_fx; +} +#endif + + /*-------------------------------------------------------------------* * Function Comp_diff_lt_corr() * @@ -925,6 +1504,63 @@ static float Comp_diff_lt_corr( } +#ifdef IVAS_FLOAT_FIXED +/*-------------------------------------------------------------------* + * Function limit_idx_Dnwmix_fx() + * + * + *-------------------------------------------------------------------*/ + +static Word16 limit_idx_Dwnmix_fx( + const Word16 idx_in, + const Word16 unclr_decision, + const Word16 inst_idx, + const Word16 previous_idx, + const Word16 tdm_last_LRTD_PriCh_cnt, + const Word16 tdm_last_LRTD_frame_cnt ) +{ + Word16 idx; + + idx = idx_in; + move16(); + idx = check_bounds_s_fx( idx, 1, 29 ); + + IF( EQ_16( unclr_decision, 1 ) && GT_16( tdm_last_LRTD_frame_cnt, 1 ) ) + { + IF( tdm_last_LRTD_PriCh_cnt > 0 ) + { + IF( LE_16( idx, LRTD_STEREO_MID_IS_PRIM ) && LT_16( inst_idx, LRTD_STEREO_MID_IS_PRIM + 2 ) ) + { + idx = s_min( 1, idx ); + } + ELSE IF( GE_16( idx, LRTD_STEREO_MID_IS_PRIM ) && GT_16( inst_idx, LRTD_STEREO_MID_IS_PRIM - 2 ) ) + { + idx = s_max( 29, idx ); + } + ELSE IF( LT_16( inst_idx, LRTD_STEREO_MID_IS_PRIM - 4 ) ) + { + idx = s_min( 1, idx ); + } + ELSE IF( GT_16( inst_idx, LRTD_STEREO_MID_IS_PRIM + 4 ) ) + { + idx = s_max( 29, idx ); + } + ELSE + { + idx = previous_idx; + move16(); + } + } + ELSE + { + idx = previous_idx; + move16(); + } + } + + return idx; +} +#else /*-------------------------------------------------------------------* * Function limit_idx_Dnwmix() * @@ -977,6 +1613,7 @@ static int16_t limit_idx_Dwnmix( return idx; } +#endif /*-------------------------------------------------------------------* @@ -1017,6 +1654,194 @@ static int16_t limit_idx_NoDwnmix( } +#ifdef IVAS_FLOAT_FIXED +/*-------------------------------------------------------------------* + * Function stereo_tdm_ener_analysis_SM_fx() + * + * + *-------------------------------------------------------------------*/ + +static Word16 stereo_tdm_ener_analysis_SM_fx( + CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ + Encoder_State **sts, /* i/o: Encoder static variables structure */ + const Word16 input_frame, /* i : Number of samples */ + Word16 *tdm_SM_flag /* i/o: channel combination scheme flag */ +) +{ + Word32 rms_R_fx, rms_L_fx; + Word16 q_rms_R, q_rms_L; + Word32 corr_RM_fx, corr_LM_fx; + Word16 q_corr_LM, q_corr_RM; + Word32 diff_lt_corr_fx; + Word32 ratio_L_fx; + Word32 dist_fx; + Word16 i, side_can_change; + Word16 idx, tdm_SM_flag_loc; + Word32 es_em_fx; + Word32 ener_R_dt_fx, ener_L_dt_fx; + Word16 desired_idx; + STEREO_TD_ENC_DATA_HANDLE hStereoTD; + Word16 angle; + + hStereoTD = hCPE->hStereoTD; + desired_idx = 0; + move16(); + es_em_fx = 20972; /* 0.01f in Q21 */ + move32(); + + /*----------------------------------------------------------------* + * set SM flag + *----------------------------------------------------------------*/ + + /* Simple logic to set SM flag, should be done in the frequency domain for low SM correlation signal, especially for music item such as Music_1_org_s */ + tdm_SM_flag_loc = hStereoTD->tdm_last_SM_flag_noop; + move16(); + + /*----------------------------------------------------------------* + * Compute L and R energy and Long term RMS of each channel + *----------------------------------------------------------------*/ + + Get_LR_rms_fx( sts[0]->input_fx, sts[1]->input_fx, input_frame, &rms_L_fx, &q_rms_L, &rms_R_fx, &q_rms_R ); + + /*----------------------------------------------------------------* + * Compute the 1st order energy difference difference + * Compute the gain of L&R channel compared to mono + * - estimate the long term evolution of the L to Mono gain + * - estimate the long term evolution of the R to Mono gain + * - estimate the long term difference between the long term + * - evolution of the L and R to Mono gain + *----------------------------------------------------------------*/ + + Get_dt_lt_ener_fx( hCPE, 1, input_frame, hStereoTD->tdm_last_SM_flag_noop, rms_L_fx, q_rms_L, rms_R_fx, q_rms_R, + &hStereoTD->tdm_lt_rms_L_SM_fx, &hStereoTD->tdm_lt_rms_R_SM_fx, &hStereoTD->tdm_last_ener_lt_L_SM_fx, &hStereoTD->tdm_last_ener_lt_R_SM_fx, &hStereoTD->tdm_LT_es_em_SM_fx, &hStereoTD->tdm_hyst_cnt_SM, &tdm_SM_flag_loc, + &ener_R_dt_fx, &ener_L_dt_fx, &corr_LM_fx, &q_corr_LM, &corr_RM_fx, &q_corr_RM ); + + hStereoTD->tdm_SM_reset_flag = 0; + move16(); + + /*----------------------------------------------------------------* + * Adjust stereo downmixing adaptation rate factor + * in function of the signal energy. If signal energy is low, + * adaptation rate factor is lower. This prevent stereo image + * move on speech offset + *----------------------------------------------------------------*/ + + Comp_diff_lt_corr_fx( hCPE, 1, rms_L_fx, q_rms_L, rms_R_fx, q_rms_R, ener_L_dt_fx, ener_R_dt_fx, corr_LM_fx, q_corr_LM, corr_RM_fx, q_corr_RM, hStereoTD->tdm_lt_rms_L_SM_fx, hStereoTD->tdm_lt_rms_R_SM_fx, &hStereoTD->tdm_lt_corr_LM_SM_fx, + &hStereoTD->tdm_lt_corr_RM_SM_fx, &hStereoTD->tdm_last_diff_lt_corr_SM_fx, &hStereoTD->q_tdm_last_diff_lt_corr_SM, NULL, &diff_lt_corr_fx, NULL ); + + side_can_change = 0; + move16(); + + /*----------------------------------------------------------------* + * When the energies of channels are low enough, compute the ratio + * of L and R needed to create new mono/side signals + *----------------------------------------------------------------*/ + + IF( ( LE_32( L_shl( hStereoTD->tdm_lt_rms_L_SM_fx, Q20 - Q24 ), RMS_MIN_FX_Q20 ) && LE_32( L_shl( hStereoTD->tdm_lt_rms_R_SM_fx, Q19 /* adjusted for 2 in RHS */ - Q24 ), RMS_MIN_FX_Q20 ) ) || + ( LE_32( L_shl( hStereoTD->tdm_lt_rms_R_SM_fx, Q20 - Q24 ), RMS_MIN_FX_Q20 ) && LE_32( L_shl( hStereoTD->tdm_lt_rms_L_SM_fx, Q19 /* adjusted for 2 in RHS */ - Q24 ), RMS_MIN_FX_Q20 ) ) ) + { + if ( ( LT_16( sts[0]->old_corr_fx, CORR_THRES_FX_Q15 ) && LT_16( sts[1]->old_corr_fx, CORR_THRES_FX_Q15 ) ) || + ( LE_32( L_shl( hStereoTD->tdm_lt_rms_L_SM_fx, Q21 - Q24 ), RMS_MIN2_FX_Q21 ) && LE_32( L_shl( hStereoTD->tdm_lt_rms_R_SM_fx, Q21 - Q24 ), RMS_MIN2_FX_Q21 ) ) ) + { + side_can_change = 1; + move16(); + } + } + + IF( ( LE_32( L_shl( hStereoTD->tdm_lt_rms_L_SM_fx, Q21 - Q24 ), RMS_MIN2_FX_Q21 ) && LE_32( L_shl( hStereoTD->tdm_lt_rms_R_SM_fx, Q20 /* adjusted for 2 in RHS */ - Q24 ), RMS_MIN2_FX_Q21 ) ) || + ( LE_32( L_shl( hStereoTD->tdm_lt_rms_R_SM_fx, Q21 - Q24 ), RMS_MIN2_FX_Q21 ) && LE_32( L_shl( hStereoTD->tdm_lt_rms_L_SM_fx, Q20 /* adjusted for 2 in RHS */ - Q24 ), RMS_MIN2_FX_Q21 ) ) ) + { + IF( ( ( NE_16( hStereoTD->tdm_last_SM_flag_noop, tdm_SM_flag_loc ) ) && hStereoTD->tdm_noop_cnt == 0 ) || + EQ_16( hStereoTD->tdm_noop_mov_flag, 1 ) || NE_16( hStereoTD->tdm_prev_desired_idx_SM, hStereoTD->tdm_prev_stable_idx_SM ) ) + { + hStereoTD->tdm_noop_mov_flag = 1; + move16(); + if ( hStereoTD->tdm_last_ratio_idx_SM != 0 && NE_16( hStereoTD->tdm_last_ratio_idx_SM, ( TDM_NQ - 1 ) ) ) + { + side_can_change = 1; + move16(); + } + } + } + + if ( side_can_change == 0 && EQ_16( tdm_SM_flag_loc, 1 ) && GT_32( es_em_fx, 31457280 /* 15.0f in Q21 */ ) ) + { + side_can_change = 1; + move16(); + } + + IF( side_can_change ) + { + ratio_L_fx = L_max( diff_lt_corr_fx, -RATIO_MAX_FX_Q24 ); // Q24 + ratio_L_fx = L_min( ratio_L_fx, RATIO_MAX_FX_Q24 ); // Q24 + + IF( GT_32( ratio_L_fx, RATIO_MAX_FX_Q23 ) ) + { + ratio_L_fx = L_add( Mpy_32_32( 1159641170 /* 1.08f in Q30 */, ratio_L_fx ), 3187671 /* 0.38f in Q23 */ ); // (Q30, Q24) -> Q23 + } + ELSE IF( LT_32( ratio_L_fx, -RATIO_MAX_FX_Q23 ) ) + { + ratio_L_fx = L_add( Mpy_32_32( 687194767 /* 0.64f in Q30 */, ratio_L_fx ), 10737418 /* 1.28f in Q23 */ ); // (Q30, Q24) -> Q23 + } + ELSE + { + ratio_L_fx = L_add( Mpy_32_32( 279172874 /* 0.26f in Q30 */, ratio_L_fx ), 8346665 /* 0.995f in Q23 */ ); // (Q30, Q24) -> Q23 + } + + angle = extract_l( L_shl( Mpy_32_16_1( ratio_L_fx, EVS_PI_FX ), Q13 - Q21 - Q1 ) ); // (Q23, Q13) -> Q21 >> Q1 -> Q22 -> Q13 + ratio_L_fx = L_shl( L_shr( L_sub( ONE_IN_Q14, L_deposit_l( getCosWord16( angle ) ) ), Q1 ), Q24 - Q14 ); // Q14 << Q10 -> Q24 + + dist_fx = L_abs( L_sub( ratio_L_fx, tdm_ratio_tabl_fx_Q24[0] ) ); // Q24 + + desired_idx = 0; + move16(); + FOR( i = 1; i < TDM_NQ; i++ ) + { + IF( LE_32( L_abs( L_sub( ratio_L_fx, tdm_ratio_tabl_fx_Q24[i] ) ), dist_fx ) ) + { + dist_fx = L_abs( L_sub( ratio_L_fx, tdm_ratio_tabl_fx_Q24[i] ) ); // Q24 + desired_idx = i; + move16(); + } + } + + idx = stereo_smooth_LR_transition_fx( &hStereoTD->tdm_prev_stable_idx_SM, &hStereoTD->tdm_noop_mov_flag, hStereoTD->tdm_last_ratio_idx_SM, &hStereoTD->tdm_prev_desired_idx_SM, &hStereoTD->tdm_noop_cnt, tdm_SM_flag_loc, desired_idx ); + + idx = extract_l( L_add( Mpy_32_32( 1717986918 /* 0.8f in Q31 */, idx ), Mpy_32_32( 429496729 /* 0.2f in Q31 */, hStereoTD->tdm_last_ratio_idx_SM ) ) ); // (Q31, Q0) -> Q0 + + ratio_L_fx = tdm_ratio_tabl_fx_Q24[idx]; + move32(); + } + else + { + ratio_L_fx = hStereoTD->tdm_last_ratio_SM_fx; + move32(); + idx = hStereoTD->tdm_last_ratio_idx_SM; + move16(); + } + + IF( ( EQ_16( hStereoTD->tdm_noop_mov_flag, 1 ) && GE_16( hStereoTD->tdm_noop_cnt, 31 ) ) || ( ( EQ_16( hStereoTD->tdm_last_SM_flag_noop, tdm_SM_flag_loc ) ) && ( EQ_16( idx, hStereoTD->tdm_prev_stable_idx_SM ) ) ) ) + { + hStereoTD->tdm_noop_cnt = 0; + move16(); + hStereoTD->tdm_noop_mov_flag = 0; + move16(); + } + + if ( hStereoTD->tdm_noop_mov_flag == 0 || tdm_SM_flag_loc == 0 ) + { + hStereoTD->tdm_prev_stable_idx_SM = idx; + move16(); + } + + hStereoTD->tdm_last_SM_flag_noop = tdm_SM_flag_loc; + move16(); + *tdm_SM_flag = tdm_SM_flag_loc; + move16(); + + return ( idx ); +} +#else /*-------------------------------------------------------------------* * Function stereo_tdm_ener_analysis_SM() * @@ -1172,6 +1997,7 @@ static int16_t stereo_tdm_ener_analysis_SM( return ( idx ); } +#endif /*-------------------------------------------------------------------* @@ -1328,6 +2154,112 @@ void tdm_ol_pitch_comparison( } +#ifdef IVAS_FLOAT_FIXED +/*-------------------------------------------------------------------* + * Function Get_corr_n_fx() + * + * + *-------------------------------------------------------------------*/ + +static void Get_corr_n_fx( + const Word16 L[], /* i : Left signal */ + const Word16 R[], /* i : Right signal */ + Word32 *ic_Lm, /* o : Left signal */ + Word16 *q_ic_Lm, /* o : Q factor of Left signal */ + Word32 *ic_Rm, /* o : Right signal */ + Word16 *q_ic_Rm, /* o : Q factor of Right signal */ + const Word16 len, /* i : segment length */ + Word32 *es_em, /* o : return the difference between the side and mono energy */ + const Word16 tdm_SM_calc_flag /* i : Flag that indicates that it is for SM mode */ +) +{ + Word32 corrL, corrR, ener; + Word16 mono_i; + Word16 i; + Word32 ener_side; + Word16 side_i; + Word16 exp_diff; + Word32 L_tmp; + Word16 guard_bits; + + corrL = 0; + move32(); + corrR = 0; + move32(); + ener = EPSILON_FX; + move32(); + ener_side = EPSILON_FX; + move32(); + guard_bits = find_guarded_bits_fx( len ); + + /*----------------------------------------------------------------* + * Find the normalized correlation between: left/mono and right/mono based + *----------------------------------------------------------------*/ + + IF( tdm_SM_calc_flag ) + { + FOR( i = 0; i < len; i++ ) + { + mono_i = sub( shr( L[i], Q1 ), shr( R[i], Q1 ) ); // q_in + corrL = L_add( corrL, L_shr( L_mult0( abs_s( L[i] ), abs_s( mono_i ) ), guard_bits ) ); // (q_in + q_in - guard_bits) + corrR = L_add( corrR, L_shr( L_mult0( abs_s( R[i] ), abs_s( mono_i ) ), guard_bits ) ); // (q_in + q_in - guard_bits) + ener = L_add( ener, L_shr( L_mult0( mono_i, mono_i ), guard_bits ) ); // (q_in + q_in - guard_bits) + side_i = add( shr( L[i], Q1 ), shr( R[i], Q1 ) ); // q_in + ener_side = L_add( ener_side, L_shr( L_mult0( side_i, side_i ), guard_bits ) ); // (q_in + q_in - guard_bits) + } + } + ELSE + { + FOR( i = 0; i < len; i++ ) + { + mono_i = add( shr( L[i], Q1 ), shr( R[i], Q1 ) ); // q_in + corrL = L_add( corrL, L_shr( L_mult0( L[i], mono_i ), guard_bits ) ); // (q_in + q_in - guard_bits) + corrR = L_add( corrR, L_shr( L_mult0( R[i], mono_i ), guard_bits ) ); // (q_in + q_in - guard_bits) + ener = L_add( ener, L_shr( L_mult0( mono_i, mono_i ), guard_bits ) ); // (q_in + q_in - guard_bits) + side_i = sub( shr( L[i], Q1 ), shr( R[i], Q1 ) ); // q_in + ener_side = L_add( ener_side, L_shr( L_mult0( side_i, side_i ), guard_bits ) ); // (q_in + q_in - guard_bits) + } + } + + *ic_Lm = BASOP_Util_Divide3232_Scale_cadence( corrL, ener, &exp_diff ); // (Q31 - exp_diff) + move32(); + IF( *ic_Lm == 0 ) + { + *q_ic_Lm = Q31; + move16(); + } + ELSE + { + *q_ic_Lm = sub( Q31, exp_diff ); + move16(); + } + *ic_Rm = BASOP_Util_Divide3232_Scale_cadence( corrR, ener, &exp_diff ); // (Q31 - exp_diff) + move16(); + IF( *ic_Rm == 0 ) + { + *q_ic_Rm = Q31; + move16(); + } + ELSE + { + *q_ic_Rm = sub( Q31, exp_diff ); + move16(); + } + + /* *es_em = 10 * ( log10f( sqrtf( ener_side / len ) ) - log10f( sqrtf( ener / len ) ) ); + is simplified to + *es_em = 10 * ( log10f( sqrtf( ener_side / ener ) ) ); */ + L_tmp = BASOP_Util_Divide3232_Scale_cadence( ener_side, ener, &exp_diff ); // (Q31 - exp_diff) + L_tmp = Sqrt32( L_tmp, &exp_diff ); + L_tmp = BASOP_Util_Log2( L_tmp ); + *es_em = Mpy_32_32( Mpy_32_32( L_add( L_tmp, L_shl( exp_diff, Q25 ) ), LOG10_2_Q31 ), TEN_IN_Q27 ); // (Q25, Q27) -> Q21 + move32(); + + return; +} +#endif + + /*-------------------------------------------------------------------* * Function Get_corr_n() * @@ -1391,6 +2323,77 @@ static void Get_corr_n( } +#ifdef IVAS_FLOAT_FIXED +/*-------------------------------------------------------------------* + * Function stereo_smooth_LR_transition_fx() + * + *-------------------------------------------------------------------*/ + +/*! r: smoothed position */ +static Word16 stereo_smooth_LR_transition_fx( + Word16 *tdm_prev_stable_idx, /* i/o: Previous Transmitted ratio index */ + Word16 *tdm_ratio_transition_mov_flag, /* i/o: Flag that indicates that L-R energy is changing */ + Word16 tdm_last_ratio_idx, /* i : last TDM ratio index */ + Word16 *tdm_prev_desired_idx, /* i/o: Previous Transmitted ratio index */ + Word16 *tdm_ratio_transition_cnt, /* i/o: Counter */ + const Word16 tdm_SM_flag, /* i : channel combination scheme flag for current frame */ + Word16 desired_idx /* i : desired final position */ +) +{ + Word16 idx; + + if ( EQ_16( tdm_SM_flag, 1 ) ) + { + desired_idx = 15; + move16(); + } + + if ( NE_16( desired_idx, *tdm_prev_stable_idx ) ) + { + *tdm_ratio_transition_mov_flag = 1; + move16(); + } + + IF( EQ_16( *tdm_ratio_transition_mov_flag, 1 ) ) + { + IF( NE_16( desired_idx, *tdm_prev_desired_idx ) ) + { + *tdm_prev_stable_idx = tdm_last_ratio_idx; + move16(); + *tdm_ratio_transition_cnt = 0; + move16(); + } + + *tdm_ratio_transition_cnt = add( *tdm_ratio_transition_cnt, 4 ); + move16(); + IF( LT_16( desired_idx, sub( *tdm_prev_stable_idx, 2 ) ) ) + { + idx = sub( *tdm_prev_stable_idx, *tdm_ratio_transition_cnt ); + idx = s_max( desired_idx, idx ); + } + ELSE IF( GT_16( desired_idx, add( *tdm_prev_stable_idx, 2 ) ) ) + { + idx = add( *tdm_prev_stable_idx, *tdm_ratio_transition_cnt ); + idx = s_min( desired_idx, idx ); + } + ELSE + { + idx = desired_idx; + move16(); + } + } + ELSE + { + idx = desired_idx; + move16(); + } + + *tdm_prev_desired_idx = desired_idx; + move16(); + + return idx; +} +#else /*-------------------------------------------------------------------* * Function stereo_smooth_LR_transition() * @@ -1452,3 +2455,4 @@ static int16_t stereo_smooth_LR_transition( return idx; } +#endif diff --git a/lib_enc/ivas_stereo_td_enc.c b/lib_enc/ivas_stereo_td_enc.c index 2dc3884cc..ce1a4ff8f 100644 --- a/lib_enc/ivas_stereo_td_enc.c +++ b/lib_enc/ivas_stereo_td_enc.c @@ -142,6 +142,7 @@ void stereo_td_init_enc_fx( hStereoTD->tdm_lt_rms_L_fx = 671088640; // Q24 hStereoTD->tdm_lt_rms_R_fx = 671088640; // Q24 hStereoTD->tdm_last_diff_lt_corr_fx = 0; + hStereoTD->q_tdm_last_diff_lt_corr = Q31; hStereoTD->tdm_last_ener_lt_R_fx = 0; hStereoTD->tdm_last_ener_lt_L_fx = 0; @@ -165,6 +166,7 @@ void stereo_td_init_enc_fx( hStereoTD->tdm_lt_rms_L_SM_fx = 671088640; // Q24 hStereoTD->tdm_lt_rms_R_SM_fx = 671088640; // Q24 hStereoTD->tdm_last_diff_lt_corr_SM_fx = 0; + hStereoTD->q_tdm_last_diff_lt_corr_SM = Q31; hStereoTD->tdm_last_ener_lt_R_SM_fx = 0; hStereoTD->tdm_last_ener_lt_L_SM_fx = 0; hStereoTD->tdm_noop_mov_flag = 0; diff --git a/lib_enc/ivas_tcx_core_enc.c b/lib_enc/ivas_tcx_core_enc.c index 836abd67d..76ca27256 100644 --- a/lib_enc/ivas_tcx_core_enc.c +++ b/lib_enc/ivas_tcx_core_enc.c @@ -40,6 +40,10 @@ #include "basop_proto_func.h" #include "wmc_auto.h" #include "ivas_prot.h" +#ifdef IVAS_FLOAT_FIXED +#include "prot_fx.h" +#include "prot_fx_enc.h" +#endif /*-------------------------------------------------------------------* * stereo_tcx_init_enc() @@ -47,6 +51,104 @@ * Initialize stereo TCX encoder *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void stereo_tcx_init_enc_fx( + Encoder_State *st /* i/o: encoder state structure */ +) +{ + Word16 prev_IsTNSAllowed; + Word32 total_brate; + assert( st->core_brate != SID_2k40 && st->core_brate != FRAME_NO_DATA ); + + /* Get the raw coder type from signal analysis*/ + st->coder_type = st->coder_type_raw; + move16(); + IF( !st->localVAD ) + { + st->coder_type = INACTIVE; + move16(); + } + ELSE IF( GT_16( st->coder_type, GENERIC ) ) + { + st->coder_type = GENERIC; + move16(); + } + + if ( st->tcxonly ) + { + st->coder_type = GENERIC; + move16(); + } + + st->hTcxCfg->coder_type = st->coder_type; + move16(); + test(); + test(); + IF( !st->tcxonly && !st->localVAD && EQ_16( st->hTcxCfg->coder_type, GENERIC ) ) + { + st->hTcxCfg->coder_type = UNVOICED; + move16(); + } + + /*sampling rate*/ + total_brate = L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ); + st->sr_core = getCoreSamplerateMode2( st->element_mode, total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, st->is_ism_format ); + move32(); + st->fscale = sr2fscale_fx( st->sr_core ); + move16(); + + /*frame size*/ + st->L_frame = extract_l( Mpy_32_32( st->sr_core, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + move16(); + st->hTcxEnc->L_frameTCX = extract_l( Mpy_32_32( st->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + move16(); + + test(); + test(); + test(); + test(); + IF( ( EQ_16( st->L_frame, L_FRAME16k ) && LE_32( total_brate, MAX_ACELP_BRATE ) ) || ( st->tcxonly && ( EQ_32( st->sr_core, INT_FS_16k ) || EQ_32( st->sr_core, INT_FS_16k ) ) ) ) + { + st->nb_subfr = NB_SUBFR16k; + move16(); + } + ELSE + { + st->nb_subfr = NB_SUBFR; + move16(); + } + + /*TCX tools*/ + st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, total_brate, st->rf_mode ); + move16(); + st->hTcxCfg->resq = getResq( total_brate ); + move16(); + st->hTcxEnc->tcx_lpc_shaped_ari = getTcxLpcShapedAri( total_brate, st->rf_mode, st->element_mode ); + move16(); + st->igf = getIgfPresent_fx( st->element_mode, total_brate, st->bwidth, st->rf_mode ); + move16(); + prev_IsTNSAllowed = st->hTcxCfg->fIsTNSAllowed; + move16(); + IF( NE_16( st->element_mode, EVS_MONO ) ) + { + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( total_brate, st->igf, st->element_mode ); + move16(); + } + test(); + test(); + IF( !prev_IsTNSAllowed && st->hTcxCfg->fIsTNSAllowed && EQ_16( st->element_mode, IVAS_CPE_DFT ) ) /* may happen in unified stereo when switching stereo technologies */ + { + InitTnsConfigs( st->bwidth, st->hTcxCfg->tcx_coded_lines, st->hTcxCfg->tnsConfig, st->hIGFEnc->infoStopFrequency, total_brate, st->element_mode, 0 ); + + SetAllowTnsOnWhite( st->hTcxCfg->tnsConfig, 0 ); + } + st->core_brate = st->total_brate; + move32(); + + return; +} +#endif + void stereo_tcx_init_enc( Encoder_State *st /* i/o: encoder state structure */ ) @@ -133,6 +235,129 @@ void stereo_tcx_core_enc( const int16_t vad_hover_flag /* i : VAD hangover flag */ ) { +#ifdef IVAS_FLOAT_FIXED + TCX_ENC_HANDLE hTcxEnc; + Word16 i, n; + + /*size and windowing*/ + const float *p_new_samples; + Word16 n_subframes; + Word16 last_core_orig; + + /*Bits*/ + Word16 nbits_start, total_nbbits, nbits_header; + Word16 target_bits[2], bitsAvailable; + Word16 nbits_lpc[2]; + Word16 tnsSize[2]; /* number of tns parameters put into prm */ + Word16 tnsBits[2]; /* number of tns bits in the frame */ + Word16 ltpBits; + + /*Parameters*/ + Word16 param_lpc[NPRM_LPC_NEW]; + Word16 param_core[2 * NPRM_DIV]; + Word16 bits_param_lpc[10], no_param_lpc; + + /*LPC*/ + float lsf_q[M], lsp_q[M], lsp[M], lsf[M]; + float lspmid_q[M]; + float A_q[M + 1]; + float gainlpc[2][FDNS_NPTS]; + float lsp_tcx_q[M], lsf_tcx_q[M]; + int16_t tcx_lpc_cdk; + Word16 A_q_ind[M + 1]; /*for LPC-based AC*/ + Word16 lspq_ind[M]; /*for LPC-based AC*/ + + /*TCX-LTP*/ + Word16 T_op[3]; + + /*HM*/ + Word16 indexBuffer[2 * ( ( N_MAX / 2 ) + 1 )]; + + CONTEXT_HM_CONFIG hm_cfg[2]; + + /* bitstream */ + BSTR_ENC_HANDLE hBstr = st->hBstr; + + + push_wmops( "stereo_tcx_core_enc" ); + + /*Sanity check*/ + assert( st->mdct_sw == MODE1 && "MDCT switching should be in TCX MODE 1\n" ); + assert( st->rf_mode == 0 && "Channel aware not supported! " ); + + no_param_lpc = 0; + move16(); + n_subframes = 1; + move16(); + + hTcxEnc = st->hTcxEnc; + + /*--------------------------------------------------------------* + * Configuration of TCX + *---------------------------------------------------------------*/ + + stereo_tcx_init_enc_fx( st ); + + /*--------------------------------------------------------------* + * Initialization + *---------------------------------------------------------------*/ + + /* Subtract the bits of common header */ + st->bits_frame_core = extract_l( L_sub( Mpy_32_32( st->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ), hBstr->nb_bits_tot ) ); + + /*Get Bits of TCX header*/ + nbits_header = 3; /* Coder types (2) + last_core for bfi (1) */ + move16(); + + IF( st->tcxonly ) + { + /* TCX20/10 flag */ + nbits_header = add( nbits_header, 1 ); + } + + /* bits for TCX overlap mode (1 bit: full, 2 bits: half or no overlap) */ + IF( EQ_16( st->hTcxCfg->tcx_curr_overlap_mode, HALF_OVERLAP ) || EQ_16( st->hTcxCfg->tcx_curr_overlap_mode, MIN_OVERLAP ) ) + { + nbits_header = add( nbits_header, 2 ); + } + ELSE + { + nbits_header = add( nbits_header, 1 ); + } + + hm_cfg[0].indexBuffer = &indexBuffer[0]; + hm_cfg[1].indexBuffer = &indexBuffer[N_MAX / 2 + 1]; + + set16_fx( tnsSize, 0, 2 ); + set16_fx( tnsBits, 0, 2 ); + set16_fx( nbits_lpc, 0, 2 ); + ltpBits = 0; + move16(); + + FOR( i = 0; i < 3; i++ ) + { + T_op[i] = st->pitch[i]; + move16(); + + /* check minimum pitch for quantization */ + IF( LT_16( T_op[i], PIT_MIN_SHORTER ) ) + { + T_op[i] = shl( T_op[i], 1 ); + } + + /* convert pitch values to core sampling-rate */ + IF( NE_16( st->L_frame, L_FRAME ) ) + { + Word16 s; + Word16 fac = BASOP_Util_Divide1616_Scale( st->L_frame, L_FRAME, &s ); // exp: s + Word32 mul = L_mult0( T_op[i], fac ); // exp: 15 + s + 1 = 16 + s + Word32 half = L_shr( ONE_IN_Q14 /*0.5 in Q15*/, s ); // exp: 16 + s + Word32 sum = L_add( mul, half ); // exp: 16 + s + T_op[i] = extract_l( L_shr( sum, sub( 15, s ) ) ); // exp: 31 (Q0) + // T_op[i] = (int16_t)(T_op[i] * (float)st->L_frame / (float)L_FRAME + 0.5f); + } + } +#else TCX_ENC_HANDLE hTcxEnc; int16_t i, n; @@ -169,6 +394,7 @@ void stereo_tcx_core_enc( /*HM*/ int16_t indexBuffer[2 * ( ( N_MAX / 2 ) + 1 )]; + CONTEXT_HM_CONFIG hm_cfg[2]; /* bitstream */ @@ -235,6 +461,7 @@ void stereo_tcx_core_enc( T_op[i] = (int16_t) ( T_op[i] * (float) st->L_frame / (float) L_FRAME + 0.5f ); } } +#endif if ( st->L_frame == L_FRAME ) { @@ -327,7 +554,11 @@ void stereo_tcx_core_enc( /* Get the envelope */ if ( st->enableTcxLpc ) { +#ifdef IVAS_FLOAT_FIXED + tcx_lpc_cdk = tcxlpc_get_cdk( st->hTcxCfg->coder_type ); +#else tcx_lpc_cdk = tcxlpc_get_cdk_float( st->hTcxCfg->coder_type ); +#endif /* Get the envelope corresponding to the current frame */ E_LPC_int_lpc_tcx_float( st->lspold_enc, lsp_new, A_q ); diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 37b8eb340..1e9121daa 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -2116,6 +2116,11 @@ void qlpc_avq_fx( const Word32 sr_core /* i : internal sampling rate */ ); +/* ivas_tcx_core_enc.c */ +void stereo_tcx_init_enc_fx( + Encoder_State *st /* i/o: encoder state structure */ +); + /* IGFEnc.c */ void IGFEncApplyMono_fx( const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ const Word16 igfGridIdx, /**< in: Q0 | IGF grid index */ -- GitLab From c940b16812a64fcae3c7d609f7e9783604495c59 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 22 Jul 2024 21:53:23 +0530 Subject: [PATCH 092/110] Fix for LTV crash occuring in ivas_swb_tbe_dec_fx --- lib_dec/swb_tbe_dec.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib_dec/swb_tbe_dec.c b/lib_dec/swb_tbe_dec.c index 0bd0bb8b7..870b656fa 100644 --- a/lib_dec/swb_tbe_dec.c +++ b/lib_dec/swb_tbe_dec.c @@ -1972,8 +1972,11 @@ void ivas_swb_tbe_dec_fx( #endif } } - ener_fx = s_max( 1, round_fx( L_shl( L_ener, sub( 18, shl( Q_bwe_exc, 1 ) ) ) ) ); /* Q2: 2*Q_bwe_exc+18-2*Q_bwe_exc-16 */ - +#ifdef BASOP_NOGLOB /* Saturation fix taken from EVS*/ + ener_fx = s_max( 1, round_fx_sat( L_shl_sat( L_ener, sub( 18, shl( Q_bwe_exc, 1 ) ) ) ) ); /* Q2: 2*Q_bwe_exc+18-2*Q_bwe_exc-16 */ +#else + ener_fx = s_max( 1, round_fx( L_shl( L_ener, sub( 18, shl( Q_bwe_exc, 1 ) ) ) ) ); /* Q2: 2*Q_bwe_exc+18-2*Q_bwe_exc-16 */ +#endif /* WB/SWB bandwidth switching */ IF( st->bws_cnt > 0 ) { @@ -2653,7 +2656,11 @@ void ivas_swb_tbe_dec_fx( tmp = div_s( 16384, tmp ); L_tmp = L_deposit_h( tmp ); L_tmp = Isqrt_lc( L_tmp, &exp ); +#ifdef BASOP_NOGLOB /* Saturation fix taken from EVS*/ + st->prev_ener_shb_fx = round_fx_sat( L_shl_sat( L_tmp, sub( exp, 14 ) ) ); /* Q1 */ +#else st->prev_ener_shb_fx = round_fx( L_shl( L_tmp, sub( exp, 14 ) ) ); /* Q1 */ +#endif move16(); } @@ -2671,7 +2678,11 @@ void ivas_swb_tbe_dec_fx( tmp = div_s( 16384, tmp ); L_tmp = L_deposit_h( tmp ); L_tmp = Isqrt_lc( L_tmp, &exp ); - tmp = round_fx( L_shl( L_tmp, sub( exp, 14 ) ) ); /* Q1 */ +#ifdef BASOP_NOGLOB /* Saturation fix taken from EVS*/ + tmp = round_fx_sat( L_shl_sat( L_tmp, sub( exp, 14 ) ) ); /* Q1 */ +#else + tmp = round_fx( L_shl( L_tmp, sub( exp, 14 ) ) ); /* Q1 */ +#endif } set16_fx( st->prev_SWB_fenv_fx, tmp, SWB_FENV ); /* Q1 */ } -- GitLab From 347aa8d8cf6ed364cb211482ff3f9e3822a064ea Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 23 Jul 2024 17:08:29 +0530 Subject: [PATCH 093/110] Warning flags as suggested in 3GPP issue 781 added in MAkefile. --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 0467146ba..28ed2ea91 100644 --- a/Makefile +++ b/Makefile @@ -60,6 +60,8 @@ CFLAGS += -std=c99 -pedantic -Wcast-qual -Wall -W -Wextra -Wno-long-long \ -Wno-implicit-fallthrough -ffp-contract=off # to be uncommented in CI # CFLAGS += -Werror +CFLAGS += -Winit-self +CFLAGS += -Wunused-but-set-variable # libs to link LDLIBS += -lm -- GitLab From 0720795c88f3b6781397dac31451ba38e891f00e Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 23 Jul 2024 17:28:29 +0530 Subject: [PATCH 094/110] BASOP and instrumentation changes, optimizations [x] Added W_mac_32_32 basop. [x] Replaced some of the basops where MAC operation were performed with W_mac_32_32 operation. [x] lib_com BASOP and instrumentation changes --- lib_com/basop_util.c | 16 + lib_com/basop_util.h | 2 + lib_com/bitallocsum_fx.c | 2 + lib_com/bits_alloc_fx.c | 864 +++++++++++++++++--------- lib_com/bitstream.c | 56 +- lib_com/bitstream_fx.c | 678 +++++++++++++------- lib_com/cb_shape_fx.c | 6 +- lib_com/cldfb.c | 650 ++++++++++--------- lib_com/cldfb_evs.c | 208 ++++--- lib_com/cng_exc_fx.c | 72 ++- lib_com/cnst.h | 2 - lib_com/codec_tcx_common.c | 36 +- lib_com/enh64.c | 49 ++ lib_com/enh64.h | 1 + lib_com/ivas_stereo_td_bit_alloc.c | 4 +- lib_dec/dec_tcx_fx.c | 4 +- lib_dec/ivas_corecoder_dec_reconfig.c | 6 +- lib_dec/ivas_init_dec.c | 4 +- lib_dec/ivas_stereo_switching_dec.c | 12 +- lib_dec/jbm_jb4sb.c | 2 +- lib_dec/lib_dec_fx.c | 2 +- lib_enc/lib_enc.c | 4 +- lib_rend/ivas_masa_merge.c | 2 +- lib_rend/ivas_mcmasa_ana.c | 2 +- lib_rend/ivas_objectRenderer_sfx.c | 27 +- lib_rend/ivas_omasa_ana.c | 2 +- lib_rend/ivas_prot_rend.h | 3 +- lib_rend/lib_rend.c | 4 +- 28 files changed, 1745 insertions(+), 975 deletions(-) diff --git a/lib_com/basop_util.c b/lib_com/basop_util.c index 4044484d3..e22f0f6e7 100644 --- a/lib_com/basop_util.c +++ b/lib_com/basop_util.c @@ -1583,6 +1583,22 @@ Word16 idiv1616( Word16 x, Word16 y ) return y; } +Word16 idiv1616_1( Word16 x, Word16 y ) +{ + IF( L_mult0( x, y ) < 0 ) + { + return negate( idiv1616( abs_s( x ), abs_s( y ) ) ); + } + ELSE IF( L_mult0( x, y ) > 0 ) + { + return idiv1616( x, y ); + } + ELSE + { + return 0; + } +} + Word32 norm_llQ31( /* o : normalized result Q31 */ Word32 L_c, /* i : upper bits of accu Q-1 */ Word32 L_sum, /* i : lower bits of accu, unsigned Q31 */ diff --git a/lib_com/basop_util.h b/lib_com/basop_util.h index 380c8316b..d633a33f9 100644 --- a/lib_com/basop_util.h +++ b/lib_com/basop_util.h @@ -582,6 +582,8 @@ Word16 idiv1616U( Word16 x, Word16 y ); Word16 idiv1616( Word16 x, Word16 y ); +Word16 idiv1616_1( Word16 x, Word16 y ); + /*------------------------------------------------------------------* * Dot_product16HQ: * diff --git a/lib_com/bitallocsum_fx.c b/lib_com/bitallocsum_fx.c index c3803eb94..c8ad205e1 100644 --- a/lib_com/bitallocsum_fx.c +++ b/lib_com/bitallocsum_fx.c @@ -35,6 +35,7 @@ void bitallocsum_fx( total = add( total, tmp ); } *sum = total; + move16(); IF( LE_16( length, L_FRAME32k ) ) { @@ -49,6 +50,7 @@ void bitallocsum_fx( move16(); diff = sub( diff, 1 ); *sum = add( *sum, 1 ); + move16(); } i = add( i, 1 ); if ( GE_16( i, nb_sfm ) ) diff --git a/lib_com/bits_alloc_fx.c b/lib_com/bits_alloc_fx.c index da120dc82..cbcf41090 100644 --- a/lib_com/bits_alloc_fx.c +++ b/lib_com/bits_alloc_fx.c @@ -66,7 +66,7 @@ void BITS_ALLOC_init_config_acelp( /*ACELP ICB config*/ test(); - IF( EQ_16( rate_mode_index, 0 ) || NE_16( narrowBand, 0 ) ) + IF( ( rate_mode_index == 0 ) || ( narrowBand != 0 ) ) { move16(); move16(); @@ -148,16 +148,16 @@ Word16 BITS_ALLOC_config_acelp( { move16(); pConfigAcelp->formant_enh = 1; - if ( EQ_16( coder_type, INACTIVE ) ) + if ( coder_type == INACTIVE ) { move16(); pConfigAcelp->formant_enh = 0; } } - IF( s_and( (Word16) EQ_16( band_index, 1 ), (Word16) EQ_16( nb_subfr, 4 ) ) ) + IF( L_and( EQ_16( band_index, 1 ), EQ_16( nb_subfr, 4 ) ) ) { - IF( EQ_16( coder_type, INACTIVE ) ) + IF( coder_type == INACTIVE ) { pConfigAcelp->pre_emphasis = 0; move16(); @@ -212,7 +212,9 @@ Word16 BITS_ALLOC_config_acelp( IF( GT_16( coder_type, ACELP_MODE_MAX ) ) /* keep pitch sharpening for RF_ALLPRED mode */ { pConfigAcelp->pitch_sharpening = 0; + move16(); pConfigAcelp->phase_scrambling = 0; + move16(); } /*Allocate bits and different modes*/ @@ -237,9 +239,10 @@ Word16 BITS_ALLOC_config_acelp( move16(); pConfigAcelp->ltf_bits = ACELP_LTF_BITS[pConfigAcelp->ltf_mode]; - if ( s_and( (Word16) EQ_16( nb_subfr, 5 ), (Word16) EQ_16( pConfigAcelp->ltf_bits, 4 ) ) ) + IF( L_and( EQ_16( nb_subfr, 5 ), EQ_16( pConfigAcelp->ltf_bits, 4 ) ) ) { pConfigAcelp->ltf_bits = add( pConfigAcelp->ltf_bits, 1 ); + move16(); } bits = add( bits, pConfigAcelp->ltf_bits ); @@ -252,9 +255,10 @@ Word16 BITS_ALLOC_config_acelp( /* skip subframe 1, 3 gain encoding, and use from subframe 0, and 3, respectively */ test(); test(); - IF( GE_16( coder_type, ACELP_MODE_MAX ) && ( EQ_16( i, 1 ) || EQ_16( i, 3 ) ) ) + if ( GE_16( coder_type, ACELP_MODE_MAX ) && ( EQ_16( i, 1 ) || EQ_16( i, 3 ) ) ) { pConfigAcelp->gains_mode[i] = 0; + move16(); } bits = add( bits, ACELP_GAINS_BITS[pConfigAcelp->gains_mode[i]] ); @@ -266,7 +270,7 @@ Word16 BITS_ALLOC_config_acelp( /*Innovation*/ - if ( LT_16( bits_frame, bits ) ) + IF( LT_16( bits_frame, bits ) ) { printf( "Warning: bits per frame too low\n" ); return -1; @@ -279,10 +283,15 @@ Word16 BITS_ALLOC_config_acelp( ELSE IF( EQ_16( coder_type, RF_GENPRED ) ) { pConfigAcelp->fixed_cdk_index[0] = 0; /* 7 bits */ + move16(); pConfigAcelp->fixed_cdk_index[1] = -1; + move16(); pConfigAcelp->fixed_cdk_index[2] = 0; /* 7 bits */ + move16(); pConfigAcelp->fixed_cdk_index[3] = -1; + move16(); pConfigAcelp->fixed_cdk_index[4] = -1; + move16(); bits = add( bits, 14 ); } ELSE IF( EQ_16( coder_type, RF_NOPRED ) ) @@ -338,14 +347,14 @@ static Word16 BITS_ALLOC_adjust_generic( FOR( k = 0; k < pulseconfig_size - 1; k++ ) { - IF( i_mult2( pulseconfigbits[k], nb_subfr ) > bits_subframe2 ) + IF( GT_16( i_mult2( pulseconfigbits[k], nb_subfr ), bits_subframe2 ) ) { k = sub( k, 1 ); /* previous mode did not exceed bit-budget */ BREAK; } } - if ( i_mult2( pulseconfigbits[k], nb_subfr ) > bits_subframe2 ) + if ( GT_16( i_mult2( pulseconfigbits[k], nb_subfr ), bits_subframe2 ) ) { k = sub( k, 1 ); /* previous mode did not exceed bit-budget */ } @@ -360,14 +369,14 @@ static Word16 BITS_ALLOC_adjust_generic( bits_currsubframe = sub( add( i_mult2( sfr, bits_subframe2 ), bits_subframe2 ), bitsused ); /* try increasing mode while below threshold */ - WHILE( ( LT_16( k, pulseconfig_size - 1 ) ) && ( LE_16( i_mult2( pulseconfigbits[add( k, 1 )], nb_subfr ), bits_currsubframe ) ) ) + WHILE( ( LT_16( k, sub( pulseconfig_size, 1 ) ) ) && ( LE_16( i_mult2( pulseconfigbits[k + 1], nb_subfr ), bits_currsubframe ) ) ) { test(); k = add( k, 1 ); } /* try decreasing mode until below threshold */ - WHILE( i_mult2( pulseconfigbits[k], nb_subfr ) > bits_currsubframe ) + WHILE( GT_16( i_mult2( pulseconfigbits[k], nb_subfr ), bits_currsubframe ) ) { k = sub( k, 1 ); @@ -415,9 +424,11 @@ static Word16 fcb_table( // PMT("Not floating point computation, but fixed point operator are still missing ") out = PulseConfTable[n].bits; - if ( L_subfr > L_SUBFR ) + move16(); + if ( GT_16( L_subfr, L_SUBFR ) ) { out = fast_FCB_bits_2sfr[n]; + move16(); } return ( out ); @@ -447,50 +458,61 @@ static ivas_error acelp_FCB_allocator( // PMT("Not floating point computation, but fixed point operator are still missing ") error = IVAS_ERR_OK; + move32(); cdbk = coder_type; /* just to avoid warning when DEBUGGING is deactivated */ + move16(); p_fixed_cdk_index = fixed_cdk_index; + move16(); /* TRANSITION coding: first subframe bit-budget was already fixed, glottal pulse not in the first subframe */ - if ( tc_subfr >= L_SUBFR && fix_first ) + test(); + IF( GE_16( tc_subfr, L_SUBFR ) && fix_first ) { Word16 i; - for ( i = 0; i < nb_subfr; i++ ) + FOR( i = 0; i < nb_subfr; i++ ) { - *nBits -= ACELP_FIXED_CDK_BITS( fixed_cdk_index[i] ); + *nBits = sub( *nBits, ACELP_FIXED_CDK_BITS( fixed_cdk_index[i] ) ); + move16(); } return error; } /* TRANSITION coding: first subframe bit-budget was already fixed, glottal pulse in the first subframe */ sfr = 0; - if ( fix_first ) + move16(); + IF( fix_first ) { - *nBits -= ACELP_FIXED_CDK_BITS( fixed_cdk_index[0] ); + *nBits = sub( *nBits, ACELP_FIXED_CDK_BITS( fixed_cdk_index[0] ) ); + move16(); sfr = 1; + move16(); p_fixed_cdk_index++; nb_subfr = 3; + move16(); } /* distribute the bit-budget equally between subframes */ - if ( L_subfr > L_SUBFR ) /* access fast_FCB_bits_2sfr */ + IF( GT_16( L_subfr, L_SUBFR ) ) /* access fast_FCB_bits_2sfr */ { max_n = 6; + move16(); } - else + ELSE { max_n = ACELP_FIXED_CDK_NB; + move16(); } - for ( cdbk = 0; cdbk < max_n; cdbk++ ) + FOR( cdbk = 0; cdbk < max_n; cdbk++ ) { - if ( fcb_table( cdbk, L_subfr ) * nb_subfr > *nBits ) + IF( GT_32( L_mult0( fcb_table( cdbk, L_subfr ), nb_subfr ), L_deposit_l( *nBits ) ) ) { - break; + BREAK; } } - cdbk--; + cdbk = sub( cdbk, 1 ); #if defined DEBUGGING if ( cdbk < 0 && coder_type != TRANSITION ) @@ -505,64 +527,74 @@ static ivas_error acelp_FCB_allocator( set16_fx( p_fixed_cdk_index, cdbk, nb_subfr ); nBits_tmp = 0; - if ( cdbk >= 0 ) + move16(); + IF( cdbk >= 0 ) { nBits_tmp = fcb_table( cdbk, L_subfr ); + move16(); } - else + ELSE { nBits_tmp = 0; + move16(); } - *nBits -= nBits_tmp * nb_subfr; + *nBits = sub( *nBits, i_mult( nBits_tmp, nb_subfr ) ); + move16(); /* try to increase the FCB bit-budget of the first subframe(s) */ - if ( cdbk < ACELP_FIXED_CDK_NB - 1 ) + IF( LT_16( cdbk, ACELP_FIXED_CDK_NB - 1 ) ) { - step = fcb_table( cdbk + 1, L_subfr ) - nBits_tmp; - while ( *nBits >= step ) + step = sub( fcb_table( add( cdbk, 1 ), L_subfr ), nBits_tmp ); + WHILE( GE_16( *nBits, step ) ) { ( *p_fixed_cdk_index )++; - *nBits -= step; + *nBits = sub( *nBits, step ); + move16(); p_fixed_cdk_index++; } /* try to increase the FCB of the first subframe in cases when the next step is lower than the current step */ - step = fcb_table( fixed_cdk_index[sfr] + 1, L_subfr ) - fcb_table( fixed_cdk_index[sfr], L_subfr ); - if ( *nBits >= step && cdbk >= 0 ) + step = sub( fcb_table( add( fixed_cdk_index[sfr], 1 ), L_subfr ), fcb_table( fixed_cdk_index[sfr], L_subfr ) ); + test(); + IF( GE_16( *nBits, step ) && cdbk >= 0 ) { fixed_cdk_index[sfr]++; - *nBits -= step; - - if ( *nBits >= step && fixed_cdk_index[sfr + 1] == fixed_cdk_index[sfr] - 1 ) + *nBits = sub( *nBits, step ); + move16(); + test(); + IF( GE_16( *nBits, step ) && EQ_16( fixed_cdk_index[sfr + 1], sub( fixed_cdk_index[sfr], 1 ) ) ) { sfr++; fixed_cdk_index[sfr]++; - *nBits -= step; + *nBits = sub( *nBits, step ); + move16(); } } } /* TRANSITION coding: allocate highest FCBQ bit-budget to the subframe with the glottal-shape codebook */ - if ( tc_subfr >= L_SUBFR ) + IF( GE_16( tc_subfr, L_SUBFR ) ) { Word16 tempr; SWAP( fixed_cdk_index[0], fixed_cdk_index[tc_subfr / L_SUBFR] ); /* TRANSITION coding: allocate second highest FCBQ bit-budget to the last subframe */ - if ( tc_subfr / L_SUBFR < nb_subfr - 1 ) + IF( idiv1616( tc_subfr, L_SUBFR ) < sub( nb_subfr, 1 ) ) { - SWAP( fixed_cdk_index[( tc_subfr - L_SUBFR ) / L_SUBFR], fixed_cdk_index[nb_subfr - 1] ); + SWAP( fixed_cdk_index[sub( tc_subfr, L_SUBFR ) / L_SUBFR], fixed_cdk_index[nb_subfr - 1] ); } } /* when subframe length > L_SUBFR, number of bits instead of codebook index is signalled */ - if ( L_subfr > L_SUBFR ) + IF( GT_16( L_subfr, L_SUBFR ) ) { Word16 i, j; - for ( i = 0; i < nb_subfr; i++ ) + FOR( i = 0; i < nb_subfr; i++ ) { j = fixed_cdk_index[i]; + move16(); fixed_cdk_index[i] = fast_FCB_bits_2sfr[j]; + move16(); } } @@ -620,17 +652,25 @@ ivas_error config_acelp1( ivas_error error; error = IVAS_ERR_OK; + move32(); // PMT("Not floating point computation, but fixed point operator are still missing ") /*-----------------------------------------------------------------* * Set the flag indicating two-stage Unvoiced (UC) frame *-----------------------------------------------------------------*/ *uc_two_stage_flag = 0; - if ( coder_type == UNVOICED ) + move16(); + IF( EQ_16( coder_type, UNVOICED ) ) { - if ( total_brate >= MIN_UNVOICED_TWO_STAGE_BRATE && element_mode > EVS_MONO && ( idchan == 0 || ( ( total_brate >= 8500 || extl_brate == 0 ) && tdm_LRTD_flag == 1 ) ) ) + test(); + test(); + test(); + test(); + test(); + if ( GE_32( total_brate, MIN_UNVOICED_TWO_STAGE_BRATE ) && element_mode > EVS_MONO && ( idchan == 0 || ( ( GE_32( total_brate, 8500 ) || extl_brate == 0 ) && EQ_16( tdm_LRTD_flag, 1 ) ) ) ) { *uc_two_stage_flag = 1; + move16(); } } @@ -638,9 +678,10 @@ ivas_error config_acelp1( * Set the number of subframes *-----------------------------------------------------------------*/ - if ( L_frame == L_FRAME ) + IF( EQ_16( L_frame, L_FRAME ) ) { nb_subfr = NB_SUBFR; + move16(); #if defined DEBUGGING if ( ( ( core_brate_inp < 5900 && coder_type > UNVOICED ) && !( core_brate_inp < MIN_TC_BRATE && coder_type == TRANSITION ) ) && !( idchan > 0 && element_mode == IVAS_CPE_TD ) && !( element_mode == IVAS_SCE && tdm_low_rate_mode ) ) @@ -654,9 +695,10 @@ ivas_error config_acelp1( } #endif } - else /* L_frame == L_FRAME16k */ + ELSE /* L_frame == L_FRAME16k */ { nb_subfr = NB_SUBFR16k; + move16(); #if defined DEBUGGING if ( core_brate_inp < ACELP_16k_LOW_LIMIT && core == ACELP_CORE ) @@ -667,13 +709,16 @@ ivas_error config_acelp1( } coder_type_sw = coder_type; - if ( core != ACELP_CORE ) + move16(); + IF( core != ACELP_CORE ) { /* used in acelp_core_switch_enc() */ nb_subfr = 1; - if ( L_frame == L_FRAME ) + move16(); + if ( EQ_16( L_frame, L_FRAME ) ) { coder_type_sw = TRANSITION; + move16(); } } @@ -682,171 +727,230 @@ ivas_error config_acelp1( *-----------------------------------------------------------------*/ flag_hardcoded = 0; + move16(); i = 0; + move16(); - while ( i < SIZE_BRATE_INTERMED_TBL ) + WHILE( LT_16( i, SIZE_BRATE_INTERMED_TBL ) ) { - if ( core_brate_inp == brate_intermed_tbl[i] ) + IF( EQ_32( core_brate_inp, brate_intermed_tbl[i] ) ) { flag_hardcoded = 1; - break; + move16(); + BREAK; } - if ( core_brate_inp < brate_intermed_tbl[i] ) + IF( LT_32( core_brate_inp, brate_intermed_tbl[i] ) ) { flag_hardcoded = 0; - break; + move16(); + BREAK; } i++; } - if ( element_mode == IVAS_CPE_TD && coder_type == AUDIO && - core_brate_inp <= STEREO_GSC_BIT_RATE_ALLOC && brate_intermed_tbl[i] == ACELP_9k60 ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */ + test(); + test(); + test(); + if ( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( coder_type, AUDIO ) && + LE_32( core_brate_inp, STEREO_GSC_BIT_RATE_ALLOC ) && EQ_32( brate_intermed_tbl[i], ACELP_9k60 ) ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */ { - i--; + i = sub( i, 1 ); } core_brate = brate_intermed_tbl[i]; + move32(); if ( element_mode > EVS_MONO ) { flag_hardcoded = 0; /* use automatic and flexible ACELP bit-budget allocation */ + move16(); } + test(); if ( core != ACELP_CORE && element_mode == EVS_MONO ) /* needed for mode1 core switching in EVS mono */ { flag_hardcoded = 1; + move16(); } /*-----------------------------------------------------------------* * ACELP bit allocation *-----------------------------------------------------------------*/ - - if ( !( coder_type == TRANSITION && tc_subfr != -1 ) || enc_dec == DEC ) + test(); + test(); + IF( !( EQ_16( coder_type, TRANSITION ) && NE_16( tc_subfr, -1 ) ) || EQ_16( enc_dec, DEC ) ) { /* Set the bit-budget */ - bits = (Word16) ( core_brate_inp / FRAMES_PER_SEC ); + bits = extract_l( Mpy_32_32( core_brate_inp, ONE_BY_FRAMES_PER_SEC_Q31 ) ); - if ( coder_type == TRANSITION && enc_dec == DEC && tc_call == 1 ) + test(); + test(); + if ( EQ_16( coder_type, TRANSITION ) && EQ_16( enc_dec, DEC ) && EQ_16( tc_call, 1 ) ) { - bits += *nBits_es_Pred; /* equalize for 4th signaling bit estimated at the encoder in TC_0_192 */ + bits = add( bits, *nBits_es_Pred ); /* equalize for 4th signaling bit estimated at the encoder in TC_0_192 */ } /* Subtract signalling bits */ - if ( enc_dec == DEC && idchan == 1 && element_mode > EVS_MONO ) + test(); + test(); + IF( EQ_16( enc_dec, DEC ) && EQ_16( idchan, 1 ) && element_mode > EVS_MONO ) { - bits -= TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS; + bits = sub( bits, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ); - if ( tdm_LRTD_flag == 1 ) + if ( EQ_16( tdm_LRTD_flag, 1 ) ) { - bits += STEREO_BITS_TCA; + bits = add( bits, STEREO_BITS_TCA ); } /* subtract TBE/BWE flag */ - if ( extl_brate > 0 && ( extl == WB_TBE || extl == SWB_TBE || extl == FB_TBE || extl == WB_BWE || extl == SWB_BWE || extl == FB_BWE ) ) + test(); + test(); + test(); + test(); + test(); + test(); + if ( extl_brate > 0 && ( EQ_16( extl, WB_TBE ) || EQ_16( extl, SWB_TBE ) || EQ_16( extl, FB_TBE ) || EQ_16( extl, WB_BWE ) || EQ_16( extl, SWB_BWE ) || EQ_16( extl, FB_BWE ) ) ) { - bits--; + bits = sub( bits, 1 ); } } - else + ELSE { /* Subtract signalling bits */ - bits -= signalling_bits; + bits = sub( bits, signalling_bits ); } - if ( extl_brate > 0 && ( extl == WB_TBE || extl == SWB_TBE || extl == FB_TBE || extl == WB_BWE || extl == SWB_BWE || extl == FB_BWE ) ) + test(); + test(); + test(); + test(); + test(); + test(); + if ( extl_brate > 0 && ( EQ_16( extl, WB_TBE ) || EQ_16( extl, SWB_TBE ) || EQ_16( extl, FB_TBE ) || EQ_16( extl, WB_BWE ) || EQ_16( extl, SWB_BWE ) || EQ_16( extl, FB_BWE ) ) ) { /* extension layer signalling bit is counted in the extension layer bitbudget */ - bits++; + bits = add( bits, 1 ); } /*-----------------------------------------------------------------* * LSF Q bit-budget *-----------------------------------------------------------------*/ - - if ( !tdm_lp_reuse_flag || idchan == 0 ) + test(); + test(); + test(); + IF( !tdm_lp_reuse_flag || idchan == 0 ) { /* LSF Q bit-budget */ acelp_cfg->lsf_bits = LSF_bits_tbl[LSF_BIT_ALLOC_IDX_fx( core_brate, coder_type )]; + move16(); - if ( !flag_hardcoded ) + IF( !flag_hardcoded ) { - if ( L_frame == L_FRAME ) + IF( EQ_16( L_frame, L_FRAME ) ) { - if ( element_mode == IVAS_SCE && tdm_low_rate_mode ) + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( EQ_16( element_mode, IVAS_SCE ) && tdm_low_rate_mode ) { acelp_cfg->lsf_bits = LSF_bits_tbl[LSF_BIT_ALLOC_IDX_fx( core_brate, coder_type )]; + move16(); } - else if ( ( total_brate < 7200 || coder_type == INACTIVE || coder_type == AUDIO ) && idchan == 1 ) + ELSE IF( ( LT_32( total_brate, 7200 ) || coder_type == INACTIVE || EQ_16( coder_type, AUDIO ) ) && EQ_16( idchan, 1 ) ) { /* TD stereo, secondary channel: do nothing */ acelp_cfg->lsf_bits = LSF_bits_tbl[LSF_BIT_ALLOC_IDX_fx( core_brate, coder_type )]; + move16(); } - else if ( element_mode > EVS_MONO && coder_type == AUDIO && brate_intermed_tbl[i] < ACELP_9k60 ) + ELSE IF( element_mode > EVS_MONO && EQ_16( coder_type, AUDIO ) && LT_32( brate_intermed_tbl[i], ACELP_9k60 ) ) { /* primary channel: do nothing */ } - else if ( element_mode > EVS_MONO && coder_type == AUDIO /*&& brate_intermed_tbl[i] >= ACELP_9k60*/ ) + ELSE IF( element_mode > EVS_MONO && EQ_16( coder_type, AUDIO ) /*&& brate_intermed_tbl[i] >= ACELP_9k60*/ ) { acelp_cfg->lsf_bits = 42; + move16(); } - else if ( total_brate <= 9600 || coder_type == UNVOICED ) + ELSE IF( LE_32( total_brate, 9600 ) || EQ_16( coder_type, UNVOICED ) ) { acelp_cfg->lsf_bits = 31; + move16(); } - else if ( total_brate <= 20000 ) + ELSE IF( LE_32( total_brate, 20000 ) ) { acelp_cfg->lsf_bits = 36; + move16(); } - else + ELSE { acelp_cfg->lsf_bits = 41; + move16(); } } - else /* L_frame == L_FRAME16k */ + ELSE /* L_frame == L_FRAME16k */ { acelp_cfg->lsf_bits = 41; + move16(); } } - bits -= acelp_cfg->lsf_bits; + bits = sub( bits, acelp_cfg->lsf_bits ); /* mid-LSF Q bit-budget */ acelp_cfg->mid_lsf_bits = mid_LSF_bits_tbl[LSF_BIT_ALLOC_IDX_fx( core_brate, coder_type )]; + move16(); - if ( element_mode > EVS_MONO && coder_type == AUDIO /*&& brate_intermed_tbl[i] < ACELP_9k60*/ ) + test(); + if ( element_mode > EVS_MONO && EQ_16( coder_type, AUDIO ) /*&& brate_intermed_tbl[i] < ACELP_9k60*/ ) { acelp_cfg->mid_lsf_bits = 5; + move16(); /* primary channel: do nothing */ } - bits -= acelp_cfg->mid_lsf_bits; + bits = sub( bits, acelp_cfg->mid_lsf_bits ); } #if defined LSF_RE_USE_SECONDARY_CHANNEL || defined FIX_798_LSF_SECONDARY_CH_MISSING_CODE - else if ( tdm_lp_reuse_flag == 1 && idchan == 1 && active_cnt != 1 ) + ELSE IF( EQ_16( tdm_lp_reuse_flag, 1 ) && EQ_16( idchan, 1 ) && NE_16( active_cnt, 1 ) ) { - bits -= TDM_IC_LSF_PRED_BITS; + bits = sub( bits, TDM_IC_LSF_PRED_BITS ); } #endif /* gain Q bit-budget - part 1 */ - if ( ( coder_type != UNVOICED && coder_type != AUDIO && coder_type != INACTIVE && !( core_brate <= ACELP_8k00 && coder_type != TRANSITION ) ) || ( coder_type == INACTIVE && total_brate > MAX_GSC_INACTIVE_BRATE ) ) + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( NE_16( coder_type, UNVOICED ) && NE_16( coder_type, AUDIO ) && coder_type != INACTIVE && !( LE_32( core_brate, ACELP_8k00 ) && NE_16( coder_type, TRANSITION ) ) ) || ( coder_type == INACTIVE && GT_32( total_brate, MAX_GSC_INACTIVE_BRATE ) ) ) { *nBits_es_Pred = Es_pred_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, -1, -1 )]; - bits -= *nBits_es_Pred; + move16(); + bits = sub( bits, *nBits_es_Pred ); } - else if ( *uc_two_stage_flag ) + ELSE IF( *uc_two_stage_flag ) { *nBits_es_Pred = 4; - bits -= *nBits_es_Pred; + move16(); + bits = sub( bits, *nBits_es_Pred ); } } - else + ELSE { bits = *unbits; + move16(); } - if ( coder_type == TRANSITION && tc_call == 0 ) + test(); + IF( EQ_16( coder_type, TRANSITION ) && tc_call == 0 ) { *unbits = bits; return error; @@ -855,14 +959,19 @@ ivas_error config_acelp1( /*-----------------------------------------------------------------* * Low-rate mode - bits are allocated in tdm_low_rate_enc() *-----------------------------------------------------------------*/ - - if ( element_mode == IVAS_SCE && tdm_low_rate_mode ) + test(); + IF( EQ_16( element_mode, IVAS_SCE ) && tdm_low_rate_mode ) { acelp_cfg->FEC_mode = 0; acelp_cfg->ltf_mode = FULL_BAND; *nBits_es_Pred = 0; *unbits = 0; acelp_cfg->ubits = 0; + move16(); + move16(); + move16(); + move16(); + move16(); return error; } @@ -872,34 +981,43 @@ ivas_error config_acelp1( *-----------------------------------------------------------------*/ acelp_cfg->FEC_mode = 0; - if ( core_brate >= ACELP_11k60 && ( idchan == 0 || element_mode == EVS_MONO ) ) + move16(); + test(); + test(); + IF( GE_32( core_brate, ACELP_11k60 ) && ( idchan == 0 || element_mode == EVS_MONO ) ) { acelp_cfg->FEC_mode = 1; + move16(); - if ( coder_type > UNVOICED && coder_type < AUDIO && coder_type != VOICED ) + test(); + test(); + if ( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) && NE_16( coder_type, VOICED ) ) { - bits -= FEC_BITS_CLS; + bits = sub( bits, FEC_BITS_CLS ); } - if ( coder_type != TRANSITION ) + IF( NE_16( coder_type, TRANSITION ) ) { - if ( total_brate >= ACELP_16k40 ) + IF( GE_32( total_brate, ACELP_16k40 ) ) { acelp_cfg->FEC_mode = 2; - - if ( coder_type > UNVOICED && coder_type < AUDIO ) + move16(); + test(); + if ( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) ) { - bits -= FEC_BITS_ENR; + bits = sub( bits, FEC_BITS_ENR ); } } - if ( total_brate >= ACELP_32k ) + IF( GE_32( total_brate, ACELP_32k ) ) { acelp_cfg->FEC_mode = 3; + move16(); - if ( coder_type > UNVOICED && coder_type < AUDIO ) + test(); + if ( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) ) { - bits -= FEC_BITS_POS; + bits = sub( bits, FEC_BITS_POS ); } } } @@ -908,50 +1026,68 @@ ivas_error config_acelp1( /*-----------------------------------------------------------------* * LP filtering of the adaptive excitation *-----------------------------------------------------------------*/ - - if ( idchan > 0 && element_mode > EVS_MONO ) + test(); + test(); + test(); + test(); + test(); + test(); + IF( idchan > 0 && element_mode > EVS_MONO ) { acelp_cfg->ltf_mode = FULL_BAND; + move16(); } - else if ( coder_type == UNVOICED ) + ELSE IF( EQ_16( coder_type, UNVOICED ) ) { acelp_cfg->ltf_mode = FULL_BAND; + move16(); } - else if ( ( coder_type == GENERIC || coder_type == TRANSITION ) && core_brate < ACELP_11k60 ) + ELSE IF( ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) ) && core_brate < ACELP_11k60 ) { acelp_cfg->ltf_mode = LOW_PASS; + move16(); } - else if ( core_brate >= ACELP_11k60 && ( coder_type != AUDIO && !( coder_type == INACTIVE && L_frame == L_FRAME ) ) ) + ELSE IF( GE_32( core_brate, ACELP_11k60 ) && ( NE_16( coder_type, AUDIO ) && !( coder_type == INACTIVE && EQ_16( L_frame, L_FRAME ) ) ) ) { - if ( coder_type == INACTIVE && L_frame == L_FRAME16k && total_brate <= MAX_GSC_INACTIVE_BRATE ) /* GSC Inactive @16kHz */ + test(); + test(); + IF( coder_type == INACTIVE && EQ_16( L_frame, L_FRAME16k ) && LE_32( total_brate, MAX_GSC_INACTIVE_BRATE ) ) /* GSC Inactive @16kHz */ { acelp_cfg->ltf_mode = FULL_BAND; + move16(); } - else + ELSE { acelp_cfg->ltf_mode = NORMAL_OPERATION; + move16(); if ( coder_type != TRANSITION ) { - bits -= nb_subfr; + bits = sub( bits, nb_subfr ); } } } - else + ELSE { acelp_cfg->ltf_mode = FULL_BAND; + move16(); } /*-----------------------------------------------------------------* * UC bit-budget *-----------------------------------------------------------------*/ - - if ( ( ( coder_type == UNVOICED && !( *uc_two_stage_flag ) ) || ( coder_type == INACTIVE && core_brate <= ACELP_9k60 ) ) && ( idchan == 0 || element_mode == EVS_MONO ) ) + test(); + test(); + test(); + test(); + test(); + test(); + if ( ( ( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) || ( coder_type == INACTIVE && LE_32( core_brate, ACELP_9k60 ) ) ) && ( idchan == 0 || element_mode == EVS_MONO ) ) { - bits -= NBITS_NOISENESS; /* noiseness */ + bits = sub( bits, NBITS_NOISENESS ); /* noiseness */ } - if ( coder_type == UNVOICED && !( *uc_two_stage_flag ) ) + if ( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) { - bits -= ( 3 * NB_SUBFR ); /* tilt factor */ + bits = sub( bits, 3 * NB_SUBFR ); /* tilt factor */ } /*-----------------------------------------------------------------* @@ -959,108 +1095,110 @@ ivas_error config_acelp1( *-----------------------------------------------------------------*/ fix_first = 0; - if ( coder_type == TRANSITION ) + move16(); + IF( EQ_16( coder_type, TRANSITION ) ) { - if ( tc_call == 2 ) + if ( EQ_16( tc_call, 2 ) ) { fix_first = 1; + move16(); } /* TC signalling */ - if ( L_frame == L_FRAME ) + IF( EQ_16( L_frame, L_FRAME ) ) { - if ( tc_subfr == TC_0_0 ) + IF( EQ_16( tc_subfr, TC_0_0 ) ) { if ( enc_dec == ENC ) { - bits -= 1; /* TC signalling */ + bits = sub( bits, 1 ); /* TC signalling */ } - if ( acelp_cfg->ltf_mode == NORMAL_OPERATION ) + if ( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) { - bits -= 3; /* LP filtering flag */ + bits = sub( bits, 3 ); /* LP filtering flag */ } } - else if ( tc_subfr == TC_0_64 ) + ELSE IF( EQ_16( tc_subfr, TC_0_64 ) ) { if ( enc_dec == ENC ) { - bits -= 4; /* TC signalling */ + bits = sub( bits, 4 ); /* TC signalling */ } - if ( acelp_cfg->ltf_mode == NORMAL_OPERATION ) + if ( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) { - bits -= 3; /* LP filtering flag */ + bits = sub( bits, 3 ); /* LP filtering flag */ } } - else if ( tc_subfr == TC_0_128 ) + ELSE IF( EQ_16( tc_subfr, TC_0_128 ) ) { if ( enc_dec == ENC ) { - bits -= 4; /* TC signalling */ + bits = sub( bits, 4 ); /* TC signalling */ } - if ( acelp_cfg->ltf_mode == NORMAL_OPERATION ) + if ( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) { - bits -= 2; /* LP filtering flag */ + bits = sub( bits, 2 ); /* LP filtering flag */ } } - else if ( tc_subfr == TC_0_192 ) + ELSE IF( EQ_16( tc_subfr, TC_0_192 ) ) { if ( enc_dec == ENC ) { - bits -= 3; /* TC signalling */ + bits = sub( bits, 3 ); /* TC signalling */ } - if ( acelp_cfg->ltf_mode == NORMAL_OPERATION ) + if ( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) { - bits -= 1; /* LP filtering flag */ + bits = sub( bits, 1 ); /* LP filtering flag */ } } - else if ( tc_subfr == L_SUBFR ) + ELSE IF( EQ_16( tc_subfr, L_SUBFR ) ) { if ( enc_dec == ENC ) { - bits -= 3; /* TC signalling */ + bits = sub( bits, 3 ); /* TC signalling */ } - if ( acelp_cfg->ltf_mode == NORMAL_OPERATION ) + IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) { - bits -= ( L_FRAME - tc_subfr - L_SUBFR ) / L_SUBFR; /* LP filtering flag */ + bits = sub( bits, idiv1616( sub( L_FRAME - L_SUBFR, tc_subfr ), L_SUBFR ) ); /* LP filtering flag */ } } - else + ELSE { if ( enc_dec == ENC ) { - bits -= 4; /* TC signalling */ + bits = sub( bits, 4 ); /* TC signalling */ } - if ( acelp_cfg->ltf_mode == NORMAL_OPERATION ) + IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) { - bits -= ( L_FRAME - tc_subfr - L_SUBFR ) / L_SUBFR; /* LP filtering flag */ + bits = sub( bits, idiv1616_1( sub( L_FRAME - L_SUBFR, tc_subfr ), L_SUBFR ) ); /* LP filtering flag */ } } } - else /* L_frame == L_FRAME16k */ + ELSE /* L_frame == L_FRAME16k */ { - if ( enc_dec == ENC ) + IF( enc_dec == ENC ) { - if ( tc_subfr <= 2 * L_SUBFR ) + IF( LE_16( tc_subfr, 2 * L_SUBFR ) ) { - bits -= 2; /* TC signalling */ + bits = sub( bits, 2 ); /* TC signalling */ } - else + ELSE { - bits -= 3; /* TC signalling */ + bits = sub( bits, 3 ); /* TC signalling */ } } - bits -= ( L_FRAME16k - tc_subfr - L_SUBFR ) / L_SUBFR; /* LP filtering flag */ + bits = sub( bits, idiv1616( sub( L_FRAME16k - L_SUBFR, tc_subfr ), L_SUBFR ) ); /* LP filtering flag */ } /* glottal-shape codebook bits */ - bits -= ( 3 + 6 + 1 + 3 ); + bits = sub( bits, 3 + 6 + 1 + 3 ); } /*-----------------------------------------------------------------* @@ -1068,24 +1206,43 @@ ivas_error config_acelp1( *-----------------------------------------------------------------*/ acelp_cfg->fcb_mode = 0; - - if ( element_mode == IVAS_CPE_TD && tdm_low_rate_mode == 1 && coder_type != INACTIVE && coder_type != UNVOICED ) /* GENERIC low rate mode for secondary channel */ + move16(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( tdm_low_rate_mode, 1 ) && coder_type != INACTIVE && NE_16( coder_type, UNVOICED ) ) /* GENERIC low rate mode for secondary channel */ { set16_fx( acelp_cfg->pitch_bits, 0, NB_SUBFR16k ); set16_fx( acelp_cfg->gains_mode, 0, NB_SUBFR16k ); - for ( i = 0; i < 2; i++ ) + FOR( i = 0; i < 2; i++ ) { acelp_cfg->pitch_bits[i] = 0; - if ( tdm_Pitch_reuse_flag == 0 ) + move16(); + IF( tdm_Pitch_reuse_flag == 0 ) { - acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX_fx( ACELP_7k20, GENERIC, 2 * i * L_SUBFR, TC_SUBFR2IDX_fx( tc_subfr ) )]; - bits -= acelp_cfg->pitch_bits[i]; + acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX_fx( ACELP_7k20, GENERIC, i_mult( 2 * L_SUBFR, i ), TC_SUBFR2IDX_fx( tc_subfr ) )]; + move16(); + bits = sub( bits, acelp_cfg->pitch_bits[i] ); } - acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX_fx( ACELP_7k20, GENERIC, i * L_SUBFR, TC_SUBFR2IDX_fx( tc_subfr ) )]; - bits -= acelp_cfg->gains_mode[i]; + acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX_fx( ACELP_7k20, GENERIC, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; + bits = sub( bits, acelp_cfg->gains_mode[i] ); } acelp_cfg->fcb_mode = 1; + move16(); #ifdef DEBUGGING if ( bits >= 55 ) @@ -1095,89 +1252,111 @@ ivas_error config_acelp1( } else #endif - if ( bits >= 16 ) - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); - } - else + IF( GE_16( bits, 16 ) ) + { + acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); + } + ELSE { acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); acelp_cfg->fixed_cdk_index[1] = -1; + move16(); } acelp_cfg->fixed_cdk_index[2] = -1; + move16(); acelp_cfg->fixed_cdk_index[3] = -1; + move16(); } - else if ( ( coder_type != INACTIVE && nb_subfr == NB_SUBFR && coder_type != AUDIO ) || ( nb_subfr == NB_SUBFR16k && ( total_brate > MAX_GSC_INACTIVE_BRATE || coder_type != INACTIVE ) ) || core == HQ_CORE ) + ELSE IF( ( coder_type != INACTIVE && EQ_16( nb_subfr, NB_SUBFR ) && NE_16( coder_type, AUDIO ) ) || ( EQ_16( nb_subfr, NB_SUBFR16k ) && ( GT_32( total_brate, MAX_GSC_INACTIVE_BRATE ) || coder_type != INACTIVE ) ) || EQ_16( core, HQ_CORE ) ) { /* pitch Q & gain Q bit-budget - part 2*/ - for ( i = 0; i < nb_subfr; i++ ) + FOR( i = 0; i < nb_subfr; i++ ) { - if ( L_frame == L_FRAME ) + IF( EQ_16( L_frame, L_FRAME ) ) { - if ( tdm_Pitch_reuse_flag == 1 && idchan == 1 ) + IF( EQ_16( tdm_Pitch_reuse_flag, 1 ) && EQ_16( idchan, 1 ) ) { acelp_cfg->pitch_bits[i] = 0; + move16(); } - else + ELSE { - acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, i * L_SUBFR, TC_SUBFR2IDX_fx( tc_subfr ) )]; + acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; + move16(); } - acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type_sw, i * L_SUBFR, TC_SUBFR2IDX_fx( tc_subfr ) )]; + acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type_sw, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; + move16(); } - else /* L_frame == L_FRAME16k */ + ELSE /* L_frame == L_FRAME16k */ { - if ( tdm_Pitch_reuse_flag == 1 && idchan == 1 ) + test(); + IF( EQ_16( tdm_Pitch_reuse_flag, 1 ) && EQ_16( idchan, 1 ) ) { acelp_cfg->pitch_bits[i] = 0; + move16(); } - else + ELSE { - acelp_cfg->pitch_bits[i] = ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type, i * L_SUBFR, TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; + acelp_cfg->pitch_bits[i] = ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; + move16(); } - acelp_cfg->gains_mode[i] = gain_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type_sw, i * L_SUBFR, TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; + acelp_cfg->gains_mode[i] = gain_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type_sw, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; + move16(); } - bits -= acelp_cfg->pitch_bits[i]; + bits = sub( bits, acelp_cfg->pitch_bits[i] ); - if ( coder_type == INACTIVE && acelp_cfg->gains_mode[i] == 6 /* VQ vs. SQ threshold @32 kbps */ ) + test(); + IF( coder_type == INACTIVE && EQ_16( acelp_cfg->gains_mode[i], 6 ) /* VQ vs. SQ threshold @32 kbps */ ) { - bits -= 5; + bits = sub( bits, 5 ); } - else + ELSE { - if ( *uc_two_stage_flag == 1 ) + if ( EQ_16( *uc_two_stage_flag, 1 ) ) { acelp_cfg->gains_mode[i] = 7; + move16(); } - bits -= acelp_cfg->gains_mode[i]; + bits = sub( bits, acelp_cfg->gains_mode[i] ); } } /* algebraic codebook bit-budget */ - if ( flag_hardcoded || ( core_brate_inp >= MIN_BRATE_AVQ_EXC && coder_type != INACTIVE ) || ( total_brate > MAX_GSC_INACTIVE_BRATE && coder_type == INACTIVE ) ) + test(); + test(); + test(); + test(); + test(); + test(); + IF( flag_hardcoded || ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && coder_type != INACTIVE ) || ( GT_32( total_brate, MAX_GSC_INACTIVE_BRATE ) && coder_type == INACTIVE ) ) { - for ( i = 0; i < nb_subfr; i++ ) + FOR( i = 0; i < nb_subfr; i++ ) { - if ( L_frame == L_FRAME ) + IF( EQ_16( L_frame, L_FRAME ) ) { - acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, i * L_SUBFR, TC_SUBFR2IDX_fx( tc_subfr ) )]; + acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; + move16(); } - else /* L_frame == L_FRAME16k */ + ELSE /* L_frame == L_FRAME16k */ { - acelp_cfg->fixed_cdk_index[i] = FCB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type, i * L_SUBFR, TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; + acelp_cfg->fixed_cdk_index[i] = FCB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; + move16(); } - bits -= acelp_cfg->fixed_cdk_index[i]; + bits = sub( bits, acelp_cfg->fixed_cdk_index[i] ); } } - else if ( !( coder_type == UNVOICED && tdm_low_rate_mode == 1 && element_mode == IVAS_CPE_TD ) ) + ELSE IF( !( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) ) { - if ( coder_type == UNVOICED && !( *uc_two_stage_flag ) ) + test(); + IF( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) { - i = bits / NB_SUBFR; + i = idiv1616( bits, NB_SUBFR ); + move16(); if ( i % 2 == 0 ) { - i--; /* must be odd */ + i = sub( i, 1 ); /* must be odd */ } i = s_min( i, 13 ); #ifdef DEBUG_MODE_TD @@ -1186,55 +1365,71 @@ ivas_error config_acelp1( #endif i = s_max( i, 0 ); /* If i == 0-> random noise generator will be used as FCB */ set16_fx( acelp_cfg->fixed_cdk_index, i, NB_SUBFR ); - bits -= ( i * NB_SUBFR ); + bits = sub( bits, i_mult( i, NB_SUBFR ) ); } - else + ELSE { acelp_cfg->fcb_mode = 1; - if ( element_mode == IVAS_CPE_TD ) + move16(); + test(); + test(); + IF( EQ_16( element_mode, IVAS_CPE_TD ) ) { - if ( bits >= ACELP_FIXED_CDK_BITS( 0 ) * ( nb_subfr ) ) /* enough bits for all fcb */ + IF( GE_16( bits, i_mult( ACELP_FIXED_CDK_BITS( 0 ), ( nb_subfr ) ) ) ) /* enough bits for all fcb */ { acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); } - else if ( bits >= ACELP_FIXED_CDK_BITS( 0 ) * ( nb_subfr - 1 ) ) + ELSE IF( GE_16( bits, i_mult( ACELP_FIXED_CDK_BITS( 0 ), sub( nb_subfr, 1 ) ) ) ) { acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr - 1, L_SUBFR, coder_type, tc_subfr, fix_first ); acelp_cfg->fixed_cdk_index[3] = -1; + move16(); } - else if ( bits >= ACELP_FIXED_CDK_BITS( 0 ) * ( nb_subfr - 2 ) ) + ELSE IF( GE_16( bits, i_mult( ACELP_FIXED_CDK_BITS( 0 ), sub( nb_subfr, 2 ) ) ) ) { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr - 2, L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, sub( nb_subfr, 2 ), L_SUBFR, coder_type, tc_subfr, fix_first ); acelp_cfg->fixed_cdk_index[2] = acelp_cfg->fixed_cdk_index[1]; + move16(); acelp_cfg->fixed_cdk_index[1] = -1; + move16(); acelp_cfg->fixed_cdk_index[3] = -1; + move16(); } - else if ( bits >= ACELP_FIXED_CDK_BITS( 0 ) ) + ELSE IF( GE_16( bits, ACELP_FIXED_CDK_BITS( 0 ) ) ) { acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 1, L_SUBFR, coder_type, tc_subfr, fix_first ); acelp_cfg->fixed_cdk_index[1] = acelp_cfg->fixed_cdk_index[0]; + move16(); acelp_cfg->fixed_cdk_index[0] = -1; + move16(); acelp_cfg->fixed_cdk_index[2] = -1; + move16(); acelp_cfg->fixed_cdk_index[3] = -1; + move16(); } - else /* No FCB */ + ELSE /* No FCB */ { #if defined DEBUGGING IVAS_ERROR( IVAS_ERR_INTERNAL, "WARNING!!!, No bit allocated to FCB, check frame %d\n" ); #endif acelp_cfg->fixed_cdk_index[0] = -1; + move16(); acelp_cfg->fixed_cdk_index[1] = -1; + move16(); acelp_cfg->fixed_cdk_index[2] = -1; + move16(); acelp_cfg->fixed_cdk_index[3] = -1; + move16(); } } - else if ( element_mode != IVAS_CPE_TD && GSC_IVAS_mode > 0 && L_frame == L_FRAME16k ) + ELSE IF( element_mode != IVAS_CPE_TD && GSC_IVAS_mode > 0 && EQ_16( L_frame, L_FRAME16k ) ) { bits = 100; /* 9 kbps for fcb */ + move16(); acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); } - else + ELSE { acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); } @@ -1242,102 +1437,136 @@ ivas_error config_acelp1( } /* AVQ codebook */ - if ( ( core_brate_inp >= MIN_BRATE_AVQ_EXC && coder_type != INACTIVE ) || ( total_brate > MAX_GSC_INACTIVE_BRATE && coder_type == INACTIVE ) ) + test(); + test(); + test(); + IF( ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && coder_type != INACTIVE ) || ( GT_32( total_brate, MAX_GSC_INACTIVE_BRATE ) && coder_type == INACTIVE ) ) { - for ( i = 0; i < nb_subfr; i++ ) + FOR( i = 0; i < nb_subfr; i++ ) { - if ( flag_hardcoded ) + IF( flag_hardcoded ) { - acelp_cfg->AVQ_cdk_bits[i] = AVQ_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type, i * L_SUBFR, TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; + acelp_cfg->AVQ_cdk_bits[i] = AVQ_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; + move16(); { - bits -= acelp_cfg->AVQ_cdk_bits[i]; + bits = sub( bits, acelp_cfg->AVQ_cdk_bits[i] ); } } - bits -= G_AVQ_BITS; + bits = sub( bits, G_AVQ_BITS ); } - if ( core_brate_inp >= MIN_BRATE_AVQ_EXC && core_brate_inp <= MAX_BRATE_AVQ_EXC_TD && coder_type == GENERIC ) + test(); + test(); + if ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && LE_32( core_brate_inp, MAX_BRATE_AVQ_EXC_TD ) && EQ_16( coder_type, GENERIC ) ) { /* harm. flag ACELP AVQ */ - bits--; + bits = sub( bits, 1 ); } - if ( !flag_hardcoded ) + IF( !flag_hardcoded ) { Word16 bit_tmp; - bit_tmp = bits / nb_subfr; + bit_tmp = idiv1616( bits, nb_subfr ); set16_fx( acelp_cfg->AVQ_cdk_bits, bit_tmp, nb_subfr ); - bits -= bit_tmp * nb_subfr; + bits = sub( bits, i_mult( bit_tmp, nb_subfr ) ); bit_tmp = bits % nb_subfr; - acelp_cfg->AVQ_cdk_bits[0] += bit_tmp; - bits -= bit_tmp; + move16(); + acelp_cfg->AVQ_cdk_bits[0] = add( acelp_cfg->AVQ_cdk_bits[0], bit_tmp ); + move16(); + bits = sub( bits, bit_tmp ); } } } - else if ( ( coder_type == UNVOICED && tdm_low_rate_mode == 1 && element_mode == IVAS_CPE_TD ) || ( ( coder_type == INACTIVE || coder_type == AUDIO ) && nb_subfr == NB_SUBFR ) || ( coder_type == INACTIVE && total_brate <= MAX_GSC_INACTIVE_BRATE ) ) + ELSE IF( ( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) || ( ( coder_type == INACTIVE || EQ_16( coder_type, AUDIO ) ) && EQ_16( nb_subfr, NB_SUBFR ) ) || ( coder_type == INACTIVE && LE_32( total_brate, MAX_GSC_INACTIVE_BRATE ) ) ) { Word32 Local_BR, Pitch_BR; Word16 Pitch_CT; /* as defined at the beginning of [enc,dec]_pit_exc() */ - if ( GSC_IVAS_mode > 0 && ( GSC_noisy_speech || core_brate > GSC_H_RATE_STG ) ) + test(); + test(); + IF( GSC_IVAS_mode > 0 && ( GSC_noisy_speech || GT_32( core_brate, GSC_H_RATE_STG ) ) ) { Local_BR = ACELP_8k00; + move32(); Pitch_CT = GENERIC; + move16(); Pitch_BR = ACELP_8k00; - if ( L_frame == L_FRAME16k ) + move32(); + IF( EQ_16( L_frame, L_FRAME16k ) ) { Local_BR = ACELP_14k80; - if ( GSC_IVAS_mode > 0 && core_brate < IVAS_24k4 ) + move32(); + test(); + if ( GSC_IVAS_mode > 0 && LT_32( core_brate, IVAS_24k4 ) ) { Local_BR = ACELP_9k60; + move32(); } Pitch_BR = core_brate; + move32(); } } - else if ( GSC_noisy_speech ) + ELSE IF( GSC_noisy_speech ) { Local_BR = ACELP_7k20; + move32(); Pitch_CT = GENERIC; + move16(); Pitch_BR = ACELP_7k20; - if ( L_frame == L_FRAME16k ) + move32(); + if ( EQ_16( L_frame, L_FRAME16k ) ) { Pitch_BR = core_brate; + move32(); } } - else + ELSE { Local_BR = ACELP_7k20; + move32(); Pitch_CT = AUDIO; + move16(); Pitch_BR = core_brate; + move32(); - if ( L_frame == L_FRAME16k ) + IF( EQ_16( L_frame, L_FRAME16k ) ) { Local_BR = ACELP_13k20; + move32(); Pitch_CT = GENERIC; + move16(); } } - for ( i = 0; i < nb_subfr; i++ ) + FOR( i = 0; i < nb_subfr; i++ ) { - if ( L_frame == L_FRAME16k ) + IF( EQ_16( L_frame, L_FRAME16k ) ) { - acelp_cfg->pitch_bits[i] = ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( Pitch_BR, Pitch_CT, i * L_SUBFR, 0 )]; - acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX_fx( Local_BR, LOCAL_CT, i * L_SUBFR, 0 )]; + acelp_cfg->pitch_bits[i] = ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( Pitch_BR, Pitch_CT, i_mult( i, L_SUBFR ), 0 )]; + move16(); + acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX_fx( Local_BR, LOCAL_CT, i_mult( i, L_SUBFR ), 0 )]; + move16(); } - else + ELSE { - acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX_fx( Pitch_BR, Pitch_CT, i * L_SUBFR, 0 )]; - acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX_fx( Local_BR, LOCAL_CT, i * L_SUBFR, 0 )]; - acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX_fx( ACELP_7k20, LOCAL_CT, i * L_SUBFR, 0 )]; + acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX_fx( Pitch_BR, Pitch_CT, i_mult( i, L_SUBFR ), 0 )]; + move16(); + acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX_fx( Local_BR, LOCAL_CT, i_mult( i, L_SUBFR ), 0 )]; + move16(); + acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX_fx( ACELP_7k20, LOCAL_CT, i_mult( i, L_SUBFR ), 0 )]; + move16(); } } } - if ( coder_type == TRANSITION && ( tc_call == 1 && tc_subfr == 0 && L_frame == L_FRAME ) ) + test(); + test(); + test(); + IF( EQ_16( coder_type, TRANSITION ) && ( EQ_16( tc_call, 1 ) && tc_subfr == 0 && EQ_16( L_frame, L_FRAME ) ) ) { return error; } @@ -1347,70 +1576,101 @@ ivas_error config_acelp1( *-----------------------------------------------------------------*/ acelp_cfg->ubits = 0; /* these bits could be reused for something else */ + move16(); - if ( flag_hardcoded && core_brate != PPP_NELP_2k80 ) + test(); + IF( flag_hardcoded && NE_32( core_brate, PPP_NELP_2k80 ) ) { /* unused bits */ - if ( coder_type == AUDIO || ( coder_type == INACTIVE && core_brate <= ACELP_24k40 ) ) + IF( EQ_16( coder_type, AUDIO ) || ( coder_type == INACTIVE && LE_32( core_brate, ACELP_24k40 ) ) ) { acelp_cfg->ubits = 0; + move16(); } - else if ( L_frame == L_FRAME ) + ELSE IF( EQ_16( L_frame, L_FRAME ) ) { acelp_cfg->ubits = reserved_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, -1, TC_SUBFR2IDX_fx( tc_subfr ) )]; + move16(); } - else + ELSE { acelp_cfg->ubits = 0; + move16(); } - bits -= acelp_cfg->ubits; + bits = sub( bits, acelp_cfg->ubits ); } /* sanity check */ - if ( ( coder_type != INACTIVE && nb_subfr == NB_SUBFR && coder_type != AUDIO ) || nb_subfr == NB_SUBFR16k ) + test(); + test(); + test(); + IF( ( coder_type != INACTIVE && EQ_16( nb_subfr, NB_SUBFR ) && NE_16( coder_type, AUDIO ) ) || EQ_16( nb_subfr, NB_SUBFR16k ) ) { - if ( ( L_frame == L_FRAME16k && coder_type == INACTIVE && total_brate <= MAX_GSC_INACTIVE_BRATE ) || ( GSC_IVAS_mode > 0 && L_frame == L_FRAME16k ) ) /* GSC Inactive @16kHz */ + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( EQ_16( L_frame, L_FRAME16k ) && coder_type == INACTIVE && LE_32( total_brate, MAX_GSC_INACTIVE_BRATE ) ) || ( GSC_IVAS_mode > 0 && EQ_16( L_frame, L_FRAME16k ) ) ) /* GSC Inactive @16kHz */ { acelp_cfg->ubits = 0; + move16(); } - else if ( flag_hardcoded && core == ACELP_CORE && bits != 0 ) + ELSE IF( flag_hardcoded && core == ACELP_CORE && bits != 0 ) { #if defined DEBUGGING IVAS_ERROR( IVAS_ERR_INTERNAL, "ERROR: bit-budget incorrect (%d bits) in frame %d.\n", (Word32) bits ); #endif } - else if ( bits > 0 && !( coder_type == UNVOICED && tdm_low_rate_mode == 1 && element_mode == IVAS_CPE_TD ) ) + ELSE IF( bits > 0 && !( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) ) { - if ( idchan > 0 && element_mode == IVAS_CPE_TD ) + test(); + test(); + test(); + test(); + IF( idchan > 0 && EQ_16( element_mode, IVAS_CPE_TD ) ) { #if defined LSF_RE_USE_SECONDARY_CHANNEL || defined FIX_798_LSF_SECONDARY_CH_MISSING_CODE - if ( !tdm_lp_reuse_flag ) + IF( !tdm_lp_reuse_flag ) { - acelp_cfg->lsf_bits += bits; /* increase LSF Q bits */ + acelp_cfg->lsf_bits = add( acelp_cfg->lsf_bits, bits ); /* increase LSF Q bits */ + move16(); bits = 0; + move16(); } - else + ELSE { Word16 nb_prm = 4; - if ( tdm_low_rate_mode == 1 ) + move16(); + if ( EQ_16( tdm_low_rate_mode, 1 ) ) { nb_prm = 2; + move16(); } /* First add remaining bits on gains */ - bits -= allocate_unused( core_brate, coder_type, bits, nb_prm, 0, GAINSPRM, acelp_cfg->gains_mode ); + bits = sub( bits, allocate_unused( core_brate, coder_type, bits, nb_prm, 0, GAINSPRM, acelp_cfg->gains_mode ) ); /* Then, Increase pitch bit budget */ - if ( tdm_Pitch_reuse_flag == 0 && bits > 0 ) + test(); + IF( tdm_Pitch_reuse_flag == 0 && bits > 0 ) { - bits -= allocate_unused( core_brate, coder_type, bits, nb_prm, 0, PITCHPRM, acelp_cfg->pitch_bits ); + bits = sub( bits, allocate_unused( core_brate, coder_type, bits, nb_prm, 0, PITCHPRM, acelp_cfg->pitch_bits ) ); } /* Increase mid-lsf bit budget */ - if ( tdm_lp_reuse_flag == 0 && bits > 0 ) + test(); + IF( tdm_lp_reuse_flag == 0 && bits > 0 ) { - bits -= allocate_unused( core_brate, coder_type, bits, 1, 0, MID_LSFSPRM, &acelp_cfg->mid_lsf_bits ); - bits -= allocate_unused( core_brate, coder_type, bits, 1, 0, LSFPRM, &acelp_cfg->lsf_bits ); + bits = sub( bits, allocate_unused( core_brate, coder_type, bits, 1, 0, MID_LSFSPRM, &acelp_cfg->mid_lsf_bits ) ); + bits = sub( bits, allocate_unused( core_brate, coder_type, bits, 1, 0, LSFPRM, &acelp_cfg->lsf_bits ) ); } } #else @@ -1448,27 +1708,34 @@ ivas_error config_acelp1( #endif } - else if ( core == ACELP_CORE && coder_type >= UNVOICED && coder_type <= GENERIC && L_frame == L_FRAME ) + ELSE IF( core == ACELP_CORE && GE_16( coder_type, UNVOICED ) && LE_16( coder_type, GENERIC ) && EQ_16( L_frame, L_FRAME ) ) { - acelp_cfg->lsf_bits += bits; /* increase LSF Q bits */ + acelp_cfg->lsf_bits = add( acelp_cfg->lsf_bits, bits ); /* increase LSF Q bits */ + move16(); - if ( acelp_cfg->lsf_bits > 46 ) + test(); + IF( GT_16( acelp_cfg->lsf_bits, 46 ) ) { - acelp_cfg->ubits = acelp_cfg->lsf_bits - 46; + acelp_cfg->ubits = sub( acelp_cfg->lsf_bits, 46 ); + move16(); acelp_cfg->lsf_bits = 46; + move16(); } - else if ( acelp_cfg->lsf_bits > 42 && L_frame == L_FRAME ) + ELSE IF( GT_16( acelp_cfg->lsf_bits, 42 ) && EQ_16( L_frame, L_FRAME ) ) { - acelp_cfg->ubits = acelp_cfg->lsf_bits - 42; + acelp_cfg->ubits = sub( acelp_cfg->lsf_bits, 42 ); + move16(); acelp_cfg->lsf_bits = 42; + move16(); } } - else + ELSE { acelp_cfg->ubits = bits; + move16(); } } - else if ( bits < 0 && !( coder_type == UNVOICED && tdm_low_rate_mode == 1 && element_mode == IVAS_CPE_TD ) ) + ELSE IF( bits < 0 && !( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) ) { #if defined DEBUGGING IVAS_ERROR( IVAS_ERR_INTERNAL, "ERROR: bit-budget incorrect (%d bits) in frame %d.\n", (Word32) bits ); @@ -1495,75 +1762,92 @@ static Word16 allocate_unused( Word16 *prm_bit_mode ) { Word16 max_bit_per_pos = 0, bit_added = 0; + move16(); + move16(); // PMT("Not floating point computation, but fixed point operator are still missing ") - if ( prm_type == GAINSPRM ) + IF( prm_type == GAINSPRM ) { max_bit_per_pos = 6; - if ( core_brate > ACELP_8k00 ) + move16(); + IF( GT_32( core_brate, ACELP_8k00 ) ) { max_bit_per_pos = 7; + move16(); } - else if ( coder_type != UNVOICED ) + ELSE IF( NE_16( coder_type, UNVOICED ) ) { - if ( subfr >= 1 ) + IF( GE_16( subfr, 1 ) ) { max_bit_per_pos = 7; + move16(); } - else if ( subfr == 0 ) + ELSE IF( subfr == 0 ) { max_bit_per_pos = 8; + move16(); } } - else if ( coder_type == UNVOICED ) + ELSE IF( EQ_16( coder_type, UNVOICED ) ) { max_bit_per_pos = 9; /* No real limit on UC gain bit budget of the secondary channel */ + move16(); } } - else if ( prm_type == PITCHPRM ) + ELSE IF( EQ_16( prm_type, PITCHPRM ) ) { max_bit_per_pos = 6; - if ( subfr == 0 || subfr == 2 || nb_prm == 2 ) + move16(); + test(); + test(); + if ( subfr == 0 || EQ_16( subfr, 2 ) || EQ_16( nb_prm, 2 ) ) { max_bit_per_pos = 10; + move16(); } - if ( coder_type == UNVOICED ) + if ( EQ_16( coder_type, UNVOICED ) ) { max_bit_per_pos = 0; /* Should not allocate bits in case of unvoiced coder type */ + move16(); } } - else if ( prm_type == MID_LSFSPRM ) + ELSE IF( EQ_16( prm_type, MID_LSFSPRM ) ) { max_bit_per_pos = 5; + move16(); } - else if ( prm_type == LSFPRM ) + ELSE IF( EQ_16( prm_type, LSFPRM ) ) { max_bit_per_pos = 42; + move16(); } - else + ELSE { #ifdef DEBUG_MODE_TD IVAS_ERROR( IVAS_ERR_WRONG_MODE, "unknown mode in bit_alloc.c" ); #endif } - max_bit_per_pos = s_min( unused_bits, max_bit_per_pos - prm_bit_mode[subfr] ); - if ( max_bit_per_pos < 0 ) + max_bit_per_pos = s_min( unused_bits, sub( max_bit_per_pos, prm_bit_mode[subfr] ) ); + test(); + IF( max_bit_per_pos < 0 ) { return 0; } - else if ( max_bit_per_pos >= 0 && subfr == ( nb_prm - 1 ) ) + ELSE IF( max_bit_per_pos >= 0 && EQ_16( subfr, sub( nb_prm, 1 ) ) ) { - prm_bit_mode[subfr] += max_bit_per_pos; + prm_bit_mode[subfr] = add( prm_bit_mode[subfr], max_bit_per_pos ); + move16(); } - else + ELSE { - prm_bit_mode[subfr] += max_bit_per_pos; - bit_added += allocate_unused( core_brate, coder_type, unused_bits - max_bit_per_pos, nb_prm, subfr + 1, prm_type, &prm_bit_mode[0] ); + prm_bit_mode[subfr] = add( prm_bit_mode[subfr], max_bit_per_pos ); + move16(); + bit_added = add( bit_added, allocate_unused( core_brate, coder_type, sub( unused_bits, max_bit_per_pos ), nb_prm, add( subfr, 1 ), prm_type, &prm_bit_mode[0] ) ); } - return bit_added + max_bit_per_pos; + return add( bit_added, max_bit_per_pos ); } @@ -1590,7 +1874,7 @@ Word16 set_ACELP_flag( test(); test(); test(); - IF( EQ_16( element_mode, IVAS_CPE_DFT ) && EQ_16( idchan, 0 ) && LE_32( total_brate, SID_2k40 ) && EQ_16( bwidth, WB ) && EQ_16( cng_type, LP_CNG ) ) + IF( EQ_16( element_mode, IVAS_CPE_DFT ) && ( idchan == 0 ) && LE_32( total_brate, SID_2k40 ) && EQ_16( bwidth, WB ) && EQ_16( cng_type, LP_CNG ) ) { return 1; } @@ -1599,7 +1883,7 @@ Word16 set_ACELP_flag( test(); test(); test(); - IF( GE_32( element_brate, IVAS_24k4 ) && EQ_16( idchan, 0 ) && ( EQ_16( tdm_LRTD_flag, 0 ) || GT_32( element_brate, IVAS_24k4 ) ) ) + IF( GE_32( element_brate, IVAS_24k4 ) && ( idchan == 0 ) && ( ( tdm_LRTD_flag == 0 ) || GT_32( element_brate, IVAS_24k4 ) ) ) { return 1; } @@ -1722,7 +2006,7 @@ Word16 set_ACELP_flag_IVAS( test(); test(); test(); - IF( EQ_16( element_mode, IVAS_CPE_DFT ) && EQ_16( idchan, 0 ) && LE_32( total_brate, SID_2k40 ) && EQ_16( bwidth, WB ) && EQ_16( cng_type, LP_CNG ) ) + IF( EQ_16( element_mode, IVAS_CPE_DFT ) && ( idchan == 0 ) && LE_32( total_brate, SID_2k40 ) && EQ_16( bwidth, WB ) && EQ_16( cng_type, LP_CNG ) ) { return 1; } @@ -1731,7 +2015,7 @@ Word16 set_ACELP_flag_IVAS( test(); test(); test(); - IF( GE_32( element_brate, IVAS_24k4 ) && EQ_16( idchan, 0 ) && ( EQ_16( tdm_LRTD_flag, 0 ) || GT_32( element_brate, IVAS_24k4 ) ) ) + IF( GE_32( element_brate, IVAS_24k4 ) && ( idchan == 0 ) && ( ( tdm_LRTD_flag == 0 ) || GT_32( element_brate, IVAS_24k4 ) ) ) { return 1; } diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 988d51489..9f9159a34 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -1947,6 +1947,38 @@ uint16_t get_indice( *-------------------------------------------------------------------*/ /*! r: value of the indice */ +#ifdef IVAS_FLOAT_FIXED +UWord16 get_indice_st( + Decoder_State *st, /* i/o: decoder state structure */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 pos, /* i : absolute position in the bitstream */ + const Word16 nb_bits /* i : number of bits to quantize the indice */ +) +{ + UWord16 value; + Word16 i; + + assert( nb_bits <= 16 ); + + /* detect corrupted bitstream */ + IF( GT_32( L_deposit_l( add( pos, nb_bits ) ), Mpy_32_32( element_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ) ) + { + st->BER_detect = 1; + move16(); + return ( 0 ); + } + + value = 0; + move16(); + FOR( i = 0; i < nb_bits; i++ ) + { + value = shl( value, 1 ); + value = add( value, st->bit_stream[add( pos, i )] ); + } + + return value; +} +#else uint16_t get_indice_st( Decoder_State *st, /* i/o: decoder state structure */ const int32_t element_brate, /* i : element bitrate */ @@ -1975,7 +2007,8 @@ uint16_t get_indice_st( return value; } - +#endif +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * get_indice_1() * @@ -1999,7 +2032,7 @@ uint16_t get_indice_1( return st->bit_stream[pos]; } - +#endif #define WMC_TOOL_SKIP /*-------------------------------------------------------------------* @@ -2031,15 +2064,24 @@ void reset_indices_enc( * * Reset the buffer of decoder indices *-------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED void reset_indices_dec( Decoder_State *st ) { st->next_bit_pos = 0; + move16(); return; } +#else +void reset_indices_dec( + Decoder_State *st ) +{ + st->next_bit_pos = 0; + return; +} +#endif /*-------------------------------------------------------------------* * write_indices_to_stream() * @@ -2269,7 +2311,7 @@ ivas_error write_indices_ivas( return error; } - +#ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * convertSerialToBytestream( ) * @@ -2318,7 +2360,7 @@ void convertBytestreamToSerial( serial[i] = ( bytestream[( i >> 3 )] >> ( 7 - ( i & 7 ) ) ) & 0x1; } } - +#endif /*-------------------------------------------------------------------* * decoder_selectCodec() * @@ -3053,7 +3095,7 @@ ivas_error read_indices( return error; } - +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * get_rfFrameType() * @@ -3471,5 +3513,5 @@ void dtx_read_padding_bits( return; } - +#endif #undef WMC_TOOL_SKIP diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index f10493eea..f7dd3942b 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -121,18 +121,22 @@ static void pack_bit( UWord8 *omask /* i/o: output mask to indicate where in the octet the bit is to be written */ ) { - if ( *omask == 0x80 ) + if ( EQ_16( *omask, 0x80 ) ) { **pt = 0; + move16(); } - if ( bit != 0 ) + IF( bit != 0 ) { - **pt = **pt | *omask; + **pt = (UWord8) s_or( **pt, *omask ); + move16(); } - *omask >>= 1; - if ( *omask == 0 ) + *omask = (UWord8) shr( *omask, 1 ); + move16(); + IF( *omask == 0 ) { *omask = 0x80; + move16(); ( *pt )++; } @@ -151,11 +155,13 @@ static Word16 unpack_bit( { Word16 bit; - bit = ( **pt & *mask ) != 0; - *mask >>= 1; - if ( *mask == 0 ) + bit = s_and( **pt, *mask ) != 0; + *mask = (UWord8) shr( *mask, 1 ); + move16(); + IF( *mask == 0 ) { *mask = 0x80; + move16(); ( *pt )++; } return bit; @@ -212,6 +218,7 @@ Word16 rate2EVSmode( if ( is_amr_wb != NULL ) { *is_amr_wb = 0; + move16(); } switch ( brate ) { @@ -250,6 +257,7 @@ Word16 rate2EVSmode( if ( is_amr_wb != NULL ) { *is_amr_wb = 1; + move16(); } return rate2AMRWB_IOmode( brate ); } @@ -274,6 +282,7 @@ void push_indice_fx( { /* indice with the same name as the previous one */ i = hBstr->next_ind_fx; + move16(); } ELSE { @@ -294,9 +303,11 @@ void push_indice_fx( /* updates */ hBstr->next_ind_fx = add( i, 1 ); + move16(); hBstr->last_ind_fx = id; move16(); hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); + move16(); return; } @@ -319,10 +330,11 @@ void push_next_indice_fx( hBstr->ind_list[hBstr->next_ind_fx].nb_bits = nb_bits; move16(); hBstr->next_ind_fx = add( hBstr->next_ind_fx, 1 ); - + move16(); /* update the total number of bits already written */ hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); + move16(); return; } @@ -375,7 +387,9 @@ void push_next_bits_fx( } } hBstr->next_ind_fx = (Word16) ( ptr - hBstr->ind_list ); + move16(); hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); + move16(); } /*-------------------------------------------------------------------* @@ -397,7 +411,7 @@ UWord16 get_next_indice_fx( /* o : value of the indice */ value = 0; move16(); - nbits_total = (Word16) ( st_fx->total_brate / FRAMES_PER_SEC ); + nbits_total = extract_l( Mpy_32_32( st_fx->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); /* detect corrupted bitstream */ IF( GT_16( add( st_fx->next_bit_pos, nb_bits ), nbits_total ) ) { @@ -409,11 +423,12 @@ UWord16 get_next_indice_fx( /* o : value of the indice */ FOR( i = 0; i < nb_bits; i++ ) { value = lshl( value, 1 ); - value = add( value, st_fx->bit_stream[st_fx->next_bit_pos + i] ); + value = add( value, st_fx->bit_stream[add( st_fx->next_bit_pos, i )] ); } /* update the position in the bitstream */ st_fx->next_bit_pos = add( st_fx->next_bit_pos, nb_bits ); + move16(); return value; } @@ -428,7 +443,7 @@ UWord16 get_next_indice_1_fx( /* o : value of the indice * ) { Word16 nbits_total; - nbits_total = (Word16) ( st_fx->total_brate / FRAMES_PER_SEC ); + nbits_total = extract_l( Mpy_32_32( st_fx->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); /* detect corrupted bitstream */ test(); test(); @@ -458,6 +473,7 @@ void get_next_indice_tmp_fx( { /* update the position in the bitstream */ st_fx->next_bit_pos = add( st_fx->next_bit_pos, nb_bits ); + move16(); } /*-------------------------------------------------------------------* @@ -490,7 +506,7 @@ UWord16 get_indice_fx( /* o : value of the indice */ FOR( i = 0; i < nb_bits; i++ ) { value = lshl( value, 1 ); - value = add( value, st_fx->bit_stream[pos + i] ); + value = add( value, st_fx->bit_stream[add( pos, i )] ); } return value; @@ -508,7 +524,7 @@ UWord16 get_indice_1_fx( /* o : value of the indice */ ) { Word16 nbits_total; - nbits_total = (Word16) ( st_fx->total_brate / FRAMES_PER_SEC ); + nbits_total = extract_l( Mpy_32_32( st_fx->total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) ); /* detect corrupted bitstream */ IF( GT_16( add( pos, 1 ), nbits_total ) ) { @@ -584,57 +600,64 @@ void write_indices_fx( Word32 mask; UWord8 header; Word16 isAmrWb = 0; + move16(); - if ( st_fx->bitstreamformat == G192 ) + IF( st_fx->bitstreamformat == G192 ) { /*-----------------------------------------------------------------* * Encode Sync Header and Frame Length *-----------------------------------------------------------------*/ pt_stream = stream; - for ( i = 0; i < ( 2 + MAX_BITS_PER_FRAME ); ++i ) + FOR( i = 0; i < ( 2 + MAX_BITS_PER_FRAME ); ++i ) { stream[i] = 0; + move16(); } - *pt_stream++ = (Word16) SYNC_GOOD_FRAME; + *pt_stream++ = SYNC_GOOD_FRAME; + move16(); *pt_stream++ = hBstr->nb_bits_tot; + move16(); /*----------------------------------------------------------------* * Bitstream packing (conversion of individual indices into a serial stream) * Writing the serial stream into file *----------------------------------------------------------------*/ - for ( i = 0; i < MAX_NUM_INDICES; i++ ) + FOR( i = 0; i < MAX_NUM_INDICES; i++ ) { - if ( hBstr->ind_list[i].nb_bits != -1 ) + IF( NE_16( hBstr->ind_list[i].nb_bits, -1 ) ) { /* mask from MSB to LSB */ - mask = 1 << ( hBstr->ind_list[i].nb_bits - 1 ); + mask = L_shl( 1, sub( hBstr->ind_list[i].nb_bits, 1 ) ); /* write bit by bit */ - for ( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) + FOR( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) { - if ( hBstr->ind_list[i].value & mask ) + IF( L_and( hBstr->ind_list[i].value, mask ) ) { *pt_stream++ = G192_BIN1; + move16(); } - else + ELSE { *pt_stream++ = G192_BIN0; + move16(); } - mask >>= 1; + mask = L_shr( mask, 1 ); } } } } - else + ELSE { /* Create and write ToC header */ /* qbit always set to 1 on encoder side for AMRWBIO , no qbit in use for EVS, but set to 0(bad) */ - header = (UWord8) ( st_fx->Opt_AMR_WB << 5 | st_fx->Opt_AMR_WB << 4 | rate2EVSmode( hBstr->nb_bits_tot * 50, &isAmrWb ) ); + header = (UWord8) ( s_or( s_or( shl( st_fx->Opt_AMR_WB, 5 ), shl( st_fx->Opt_AMR_WB, 4 ) ), rate2EVSmode( L_mult0( hBstr->nb_bits_tot, 50 ), &isAmrWb ) ) ); + move16(); fwrite( &header, sizeof( UWord8 ), 1, file ); /* Write speech bits */ - fwrite( pFrame, sizeof( UWord8 ), ( pFrame_size + 7 ) >> 3, file ); + fwrite( pFrame, sizeof( UWord8 ), shr( add( pFrame_size, 7 ), 3 ), file ); } /* Clearing of indices */ @@ -645,19 +668,22 @@ void write_indices_fx( } - if ( st_fx->bitstreamformat == G192 ) + IF( st_fx->bitstreamformat == G192 ) { /* write the serial stream into file */ fwrite( stream, sizeof( unsigned short ), 2 + stream[1], file ); } /* reset index pointers */ hBstr->nb_bits_tot = 0; + move16(); hBstr->next_ind_fx = 0; + move16(); hBstr->last_ind_fx = -1; + move16(); return; } - +#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * write_indices_buf_fx() * @@ -689,7 +715,7 @@ void write_indices_buf_fx( stream[i] = 0; } //*pt_stream++ = (Word16) SYNC_GOOD_FRAME; - //*pt_stream++ = hBstr->nb_bits_tot_fx; + //*pt_stream++ = hBstr->nb_bits_tot; *num_bits = hBstr->nb_bits_tot; /*----------------------------------------------------------------* @@ -761,7 +787,7 @@ void write_indices_buf_fx( return; } - +#endif /*-------------------------------------------------------------------* * indices_to_serial() * @@ -782,65 +808,74 @@ void indices_to_serial( UWord8 omask = 0x80; UWord8 *pt_pFrame = pFrame; Word16 isAmrWb = 0; + move16(); + move16(); + move16(); + move16(); - if ( st_fx->Opt_AMR_WB ) + IF( st_fx->Opt_AMR_WB ) { cmi = rate2EVSmode( st_fx->total_brate, &isAmrWb ); - core_mode = rate2EVSmode( hBstr->nb_bits_tot * 50, &isAmrWb ); + core_mode = rate2EVSmode( L_mult0( hBstr->nb_bits_tot, 50 ), &isAmrWb ); j = 0; - for ( i = 0; i < MAX_NUM_INDICES; i++ ) + move16(); + FOR( i = 0; i < MAX_NUM_INDICES; i++ ) { - if ( hBstr->ind_list[i].nb_bits != -1 ) + IF( NE_16( hBstr->ind_list[i].nb_bits, -1 ) ) { /* mask from MSB to LSB */ - mask = 1 << ( hBstr->ind_list[i].nb_bits - 1 ); + mask = L_shl( 1, sub( hBstr->ind_list[i].nb_bits, 1 ) ); /* temporarily save bit */ - for ( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) + FOR( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) { - amrwb_bits[j++] = ( hBstr->ind_list[i].value & mask ) > 0; - mask >>= 1; + amrwb_bits[j++] = L_and( hBstr->ind_list[i].value, mask ) > 0; + move16(); + mask = L_shr( mask, 1 ); } } } } *pFrame_size = hBstr->nb_bits_tot; + move16(); /*----------------------------------------------------------------* * Bitstream packing (conversion of individual indices into a serial stream) *----------------------------------------------------------------*/ j = 0; - for ( i = 0; i < MAX_NUM_INDICES; i++ ) + move16(); + FOR( i = 0; i < MAX_NUM_INDICES; i++ ) { - if ( hBstr->ind_list[i].nb_bits != -1 ) + IF( NE_16( hBstr->ind_list[i].nb_bits, -1 ) ) { /* mask from MSB to LSB */ - mask = 1 << ( hBstr->ind_list[i].nb_bits - 1 ); + mask = L_shl( 1, sub( hBstr->ind_list[i].nb_bits, 1 ) ); /* write bit by bit */ - for ( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) + FOR( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) { - if ( st_fx->Opt_AMR_WB ) + IF( st_fx->Opt_AMR_WB ) { pack_bit( amrwb_bits[sort_ptr[core_mode][j++]], &pt_pFrame, &omask ); } - else + ELSE { pack_bit( hBstr->ind_list[i].value & mask, &pt_pFrame, &omask ); - j++; + j = add( j, 1 ); } - mask >>= 1; + mask = L_shr( mask, 1 ); } } } - if ( st_fx->Opt_AMR_WB && core_mode == AMRWB_IO_SID ) /* SID UPD frame always written now .... */ + test(); + IF( st_fx->Opt_AMR_WB && EQ_16( core_mode, AMRWB_IO_SID ) ) /* SID UPD frame always written now .... */ { /* insert STI bit and CMI */ pack_bit( 1, &pt_pFrame, &omask ); - for ( mask = 0x08; mask > 0; mask >>= 1 ) + FOR( mask = 0x08; mask > 0; mask >>= 1 ) { pack_bit( cmi & mask, &pt_pFrame, &omask ); } @@ -869,7 +904,8 @@ void indices_to_serial_generic( nb_bits_tot = 0; move16(); - omask = ( 0x80 >> ( *pFrame_size & 0x7 ) ); + omask = (UWord8) shr( 0x80, s_and( *pFrame_size, 0x7 ) ); + move16(); pt_pFrame += shr( *pFrame_size, 3 ); /*----------------------------------------------------------------* @@ -877,27 +913,26 @@ void indices_to_serial_generic( *----------------------------------------------------------------*/ j = 0; move16(); - for ( i = 0; i < num_indices; i++ ) - { - if ( ind_list[i].nb_bits != -1 ) - { + FOR( i = 0; i < num_indices; i++ ){ + IF( NE_16( ind_list[i].nb_bits, -1 ) ){ /* mask from MSB to LSB */ - mask = 1 << ( ind_list[i].nb_bits - 1 ); + mask = L_shl( 1, sub( ind_list[i].nb_bits, 1 ) ); - /* write bit by bit */ - for ( k = 0; k < ind_list[i].nb_bits; k++ ) - { - pack_bit( ind_list[i].value & mask, &pt_pFrame, &omask ); - j++; - mask >>= 1; - } - nb_bits_tot = add( nb_bits_tot, ind_list[i].nb_bits ); - } + /* write bit by bit */ + FOR( k = 0; k < ind_list[i].nb_bits; k++ ) + { + pack_bit( ind_list[i].value & mask, &pt_pFrame, &omask ); + j++; + mask = L_shr( mask, 1 ); } + nb_bits_tot = add( nb_bits_tot, ind_list[i].nb_bits ); +} +} - *pFrame_size = add( *pFrame_size, nb_bits_tot ); +*pFrame_size = add( *pFrame_size, nb_bits_tot ); +move16(); - return; +return; } @@ -924,7 +959,7 @@ static void decoder_selectCodec( st->Opt_AMR_WB = 1; move16(); } - ELSE IF( NE_32( total_brate, FRAME_NO_DATA ) ) + ELSE IF( total_brate != FRAME_NO_DATA ) { st->Opt_AMR_WB = 0; move16(); @@ -1008,7 +1043,7 @@ static void decoder_selectCodec( IF( st->ini_frame == 0 ) { - IF( EQ_16( st->codec_mode, -1 ) ) + if ( EQ_16( st->codec_mode, -1 ) ) { st->codec_mode = MODE1; move16(); @@ -1020,7 +1055,7 @@ static void decoder_selectCodec( /* set SID/CNG type */ IF( EQ_32( total_brate, SID_2k40 ) ) { - IF( bit0 == G192_BIN0 ) + IF( EQ_16( bit0, G192_BIN0 ) ) { st->cng_type = LP_CNG; move16(); @@ -1032,6 +1067,7 @@ static void decoder_selectCodec( ELSE { st->cng_type = FD_CNG; + move16(); test(); if ( EQ_16( st->last_codec_mode, MODE2 ) && EQ_32( st->last_total_brate, 13200 ) ) { @@ -1040,6 +1076,7 @@ static void decoder_selectCodec( } } st->hTdCngDec->last_cng_type_fx = st->cng_type; /* CNG type switching at the first correctly received SID frame */ + move16(); } @@ -1058,7 +1095,7 @@ void dec_prm_core( Decoder_State *st ) st->core = -1; move16(); - IF( EQ_32( st->total_brate, FRAME_NO_DATA ) ) + IF( st->total_brate == FRAME_NO_DATA ) { st->m_frame_type = ZERO_FRAME; move16(); @@ -1087,10 +1124,12 @@ void dec_prm_core( Decoder_State *st ) /* Get bandwidth mode */ st->bwidth = get_next_indice( st, FrameSizeConfig[frame_size_index].bandwidth_bits ); + move16(); st->bwidth = add( st->bwidth, FrameSizeConfig[frame_size_index].bandwidth_min ); + move16(); - if ( GT_16( st->bwidth, FB ) ) + IF( GT_16( st->bwidth, FB ) ) { st->bwidth = FB; move16(); @@ -1098,7 +1137,8 @@ void dec_prm_core( Decoder_State *st ) move16(); } - if ( GT_16( st->bwidth, SWB ) && LT_32( st->total_brate, ACELP_16k40 ) ) + test(); + IF( GT_16( st->bwidth, SWB ) && LT_32( st->total_brate, ACELP_16k40 ) ) { st->bwidth = SWB; move16(); @@ -1150,7 +1190,7 @@ void decision_matrix_core_dec( move16(); test(); - IF( EQ_32( st->total_brate, FRAME_NO_DATA ) || EQ_32( st->total_brate, SID_2k40 ) ) + IF( ( st->total_brate == FRAME_NO_DATA ) || EQ_32( st->total_brate, SID_2k40 ) ) { st->core = ACELP_CORE; move16(); @@ -1177,6 +1217,7 @@ void decision_matrix_core_dec( { /* read the ACELP/HQ core selection bit */ st->core = imult1616( get_next_indice( st, 1 ), HQ_CORE ); + move16(); } ELSE { @@ -1188,7 +1229,7 @@ void decision_matrix_core_dec( * Read ACELP signalling bits from the bitstream *-----------------------------------------------------------------*/ - IF( EQ_16( st->core, ACELP_CORE ) ) + IF( st->core == ACELP_CORE ) { /* find the section in the ACELP signalling table corresponding to bitrate */ start_idx = 0; @@ -1208,6 +1249,7 @@ void decision_matrix_core_dec( /* retrieve the signalling indice */ ind = acelp_sig_tbl[add( start_idx, get_next_indice( st, nBits ) )]; st->bwidth = extract_l( L_and( L_shr( ind, 3 ), 0x7 ) ); + move16(); /* convert signalling indice into signalling information */ if ( EQ_32( L_and( ind, 0x7 ), LR_MDCT ) ) @@ -1360,7 +1402,7 @@ static void mdct_switching_dec( /* Rewind bitstream */ st->next_bit_pos = next_bit_pos_save; move16(); - IF( st->bfi != 0 ) + if ( st->bfi != 0 ) { st->core = core_save; move16(); @@ -1418,6 +1460,7 @@ Word16 BRATE2IDX16k_fx( Word32 brate ) if ( EQ_32( brate, ACELP_16k40 ) ) { brate = ACELP_14k80; + move16(); } /* This is a Fast Bit Rate Value to Index Value Binary Search */ @@ -1449,8 +1492,8 @@ Word32 BIT_ALLOC_IDX_fx( Word32 brate, Word16 ctype, Word16 sfrm, Word16 tc ) temp = BRATE2IDX_fx( brate ); L_temp = L_mac0( L_temp, 4 * 256, temp ); - if ( tc >= 0 ) - L_temp = L_mac0( L_temp, ( 10 - 4 ) * 256, temp ); + IF( tc >= 0 ) + L_temp = L_mac0( L_temp, ( 10 - 4 ) * 256, temp ); /* So either 'temp' x 4 when 'tc < 0', 'temp' x 10 otherwise */ L_temp = L_mac0( L_temp, 1 * 256, s_max( 0, tc ) ); @@ -1480,8 +1523,8 @@ Word32 BIT_ALLOC_IDX_16KHZ_fx( Word32 brate, Word16 ctype, Word16 sfrm, Word16 t temp = BRATE2IDX16k_fx( brate ); L_temp = L_mac0( L_temp, 3, temp ); - if ( tc >= 0 ) - L_temp = L_mac0( L_temp, ( 7 - 3 ), temp ); + IF( tc >= 0 ) + L_temp = L_mac0( L_temp, ( 7 - 3 ), temp ); /* So either 'temp' x 3 when 'tc < 0', 'temp' x 7 otherwise */ L_temp = L_mac0( L_temp, 1, s_max( 0, tc ) ); @@ -1521,25 +1564,29 @@ Word16 read_indices_fx( /* o : 1 = reading OK, 0 = problem Word16 num_bits_read; st->bfi = 0; + move16(); st->BER_detect = 0; + move16(); st->mdct_sw_enable = 0; + move16(); st->mdct_sw = 0; + move16(); reset_indices_dec_fx( st ); /* read the Sync Header field from the bitstream */ /* in case rew_flag is set, read until first good frame is encountered */ - do + DO { /* read the Sync header */ - if ( fread( &utmp, sizeof( unsigned short ), 1, file ) != 1 ) + IF( NE_32( fread( &utmp, sizeof( unsigned short ), 1, file ), 1 ) ) { - if ( ferror( file ) ) + IF( ferror( file ) ) { /* error during reading */ fprintf( stderr, "\nError reading the bitstream !" ); exit( -1 ); } - else + ELSE { /* end of file reached */ return 0; @@ -1547,39 +1594,39 @@ Word16 read_indices_fx( /* o : 1 = reading OK, 0 = problem } /* set the BFI indicator according the value of Sync Header */ - if ( EQ_16( utmp, SYNC_BAD_FRAME ) ) + IF( EQ_16( utmp, SYNC_BAD_FRAME ) ) { st->bfi = 1; + move16(); } - - - else + ELSE { st->bfi = 0; + move16(); } /* read the Frame Length field from the bitstream */ - if ( fread( &num_bits, sizeof( unsigned short ), 1, file ) != 1 ) + IF( NE_32( fread( &num_bits, sizeof( unsigned short ), 1, file ), 1 ) ) { - if ( ferror( file ) ) + IF( ferror( file ) ) { /* error during reading */ fprintf( stderr, "\nError reading the bitstream !" ); exit( -1 ); } - else + ELSE { /* end of file reached */ return 0; } } /* convert the frame length to total bitrate */ - total_brate = (long) ( num_bits * 50 ); + total_brate = L_mult0( num_bits, 50 ); /* read ITU-T G.192 serial stream of indices from file to the local buffer */ /* Validate that the G.192 length is within the defined bit rate range to not allow writing past the end of the "stream" buffer */ - if ( num_bits > MAX_BITS_PER_FRAME ) + IF( GT_16( num_bits, MAX_BITS_PER_FRAME ) ) { fprintf( stderr, "\nError, too large G.192 frame (size(%d))! Exiting ! \n", num_bits ); exit( -1 ); @@ -1587,7 +1634,7 @@ Word16 read_indices_fx( /* o : 1 = reading OK, 0 = problem /* verify that a valid num bits value is present in the G.192 file */ /* only AMRWB or EVS bit rates or 0(NO DATA) are allowed in G.192 file frame reading */ - if ( rate2EVSmode( total_brate, NULL ) < 0 ) /* negative value means that a valid rate was not found */ + IF( rate2EVSmode( total_brate, NULL ) < 0 ) /* negative value means that a valid rate was not found */ { fprintf( stderr, "\nError, illegal bit rate (%d) in the G.192 frame ! Exiting ! \n", total_brate ); exit( -1 ); @@ -1595,63 +1642,77 @@ Word16 read_indices_fx( /* o : 1 = reading OK, 0 = problem pt_stream = stream; num_bits_read = (Word16) fread( pt_stream, sizeof( unsigned short ), num_bits, file ); + move16(); - if ( num_bits_read != num_bits ) + IF( NE_16( num_bits_read, num_bits ) ) { fprintf( stderr, "\nError, invalid number of bits read ! Exiting ! \n" ); exit( -1 ); } - - } while ( rew_flag && ( st->bfi || LT_32( total_brate, 2800 ) ) ); + test(); + } + WHILE( rew_flag && ( st->bfi || LT_32( total_brate, 2800 ) ) ); /* G.192 RX DTX handler*/ - if ( !rew_flag ) + IF( !rew_flag ) { /* handle SID_FIRST, SID_BAD, SPEECH_LOST, NO_DATA as properly as possible for the ITU-T G.192 format */ /* (total_brate, bfi , st_CNG) = rx_handler(received frame type, [previous frame type], past CNG state, past core) */ curr_ft_good_sp = 0; + move16(); curr_ft_bad_sp = 0; + move16(); - if ( total_brate > SID_2k40 ) + IF( GT_32( total_brate, SID_2k40 ) ) { - if ( st->bfi == 0 ) + IF( st->bfi == 0 ) { curr_ft_good_sp = 1; + move16(); } - else + ELSE { curr_ft_bad_sp = 1; + move16(); } } sid_update = 0; + move16(); sid_upd_bad = 0; + move16(); - if ( total_brate == SID_1k75 || total_brate == SID_2k40 ) + test(); + IF( total_brate == SID_1k75 || total_brate == SID_2k40 ) { - if ( st->bfi == 0 ) + IF( st->bfi == 0 ) { sid_update = 1; + move16(); } - else + ELSE { sid_upd_bad = 1; /* may happen in CS , corrupt but detected sid frame */ + move16(); } } /* all zero indeces/bits iSP AMRWB SID_update results in a valid LP filter with extremely high LP-filter-gain */ /* all zero indeces/bits may be a result of CS bit errors and/or erroneously injected by gateways or by a bad dejitter handlers */ - if ( total_brate == SID_1k75 && sid_update == 1 ) + test(); + IF( EQ_32( total_brate, SID_1k75 ) && EQ_16( sid_update, 1 ) ) { /* valid sid_update received, check for very risky but formally valid content */ Word16 sum = 0; - for ( k = 0; k < num_bits; ++k ) + move16(); + FOR( k = 0; k < num_bits; ++k ) { - sum += ( pt_stream[k] == G192_BIN1 ); /* check of 35 zeroes, 35 ones */ + sum = add( sum, extract_l( EQ_16( pt_stream[k], G192_BIN1 ) ) ); /* check of 35 zeroes, 35 ones */ } if ( sum == 0 ) { /* all zeros */ sid_upd_bad = 1; /* initial signal as corrupt (BER likley) */ + move16(); } } @@ -1662,14 +1723,21 @@ Word16 read_indices_fx( /* o : 1 = reading OK, 0 = problem Here we inhibit use of the SID-length info, even though it is available in the G.192 file format after STL/EID-XOR . */ - if ( sid_upd_bad ) + IF( sid_upd_bad ) { sid_upd_bad = 0; + move16(); total_brate = FRAME_NO_DATA; /* treat SID_BAD as a stolen signaling frame --> SPEECH LOST */ + move32(); } g192_sid_first = 0; - if ( st->core == AMR_WB_CORE && st->prev_ft_speech_fx && total_brate == FRAME_NO_DATA && st->bfi == 0 ) + move16(); + + test(); + test(); + test(); + if ( EQ_16( st->core, AMR_WB_CORE ) && st->prev_ft_speech_fx && total_brate == FRAME_NO_DATA && st->bfi == 0 ) { g192_sid_first = 1; /* SID_FIRST detected for previous AMRWB/AMRWBIO active frames only */ /* @@ -1678,43 +1746,58 @@ Word16 read_indices_fx( /* o : 1 = reading OK, 0 = problem and a good length 0 "SID_FIRST"(NO_DATA) frame is sent in AMRWBIO, , due to the one frame state memory in the AMRWB legacy G.192 SID_FIRST encoding */ + move16(); } speech_bad = 0; - if ( total_brate > SID_2k40 && st->bfi != 0 ) /* CS-type of CRC failure frame */ + move16(); + + test(); + if ( GT_32( total_brate, SID_2k40 ) && st->bfi != 0 ) /* CS-type of CRC failure frame */ { speech_bad = 1; /* initial assumption, CNG_state decides what to do */ + move16(); } speech_lost = 0; + move16(); + + test(); if ( total_brate == 0 && st->bfi != 0 ) /* unsent NO_DATA or stolen NO_DATA/signaling frame */ { speech_lost = 1; /* initial assumption, CNG_state decides what to do */ + move16(); } /* Do not allow decoder to enter CNG-synthesis for any instantly received GOOD+LENGTH==0 frame as this frame was never transmitted, one can not know it is good and has a a length of zero ) */ - if ( st->CNG_fx != 0 ) + IF( st->CNG_fx != 0 ) { /* We were in CNG synthesis */ if ( curr_ft_good_sp != 0 ) { /* only a good speech frame makes you leave CNG synthesis */ st->CNG_fx = 0; + move16(); } } - else + ELSE { /* We were in SPEECH synthesis */ /* only a received SID frame can make the decoder enter into CNG synthsis */ + test(); + test(); if ( g192_sid_first || sid_update || sid_upd_bad ) { st->CNG_fx = 1; + move16(); } } /* handle the g.192 _simulated_ untransmitted frame, setting for decoder SPEECH synthesis */ + test(); + test(); if ( ( st->CNG_fx == 0 ) && ( total_brate == 0 && st->bfi == 0 ) ) { st->bfi = 1; @@ -1723,14 +1806,21 @@ Word16 read_indices_fx( /* o : 1 = reading OK, 0 = problem } /* handle bad speech frame(and bad sid frame) in the decoders CNG synthesis settings pair (total_brate, bfi) */ + test(); + test(); + test(); if ( ( ( st->CNG_fx != 0 ) && ( ( speech_bad != 0 ) || ( speech_lost != 0 ) ) ) || /* SP_BAD or SPEECH_LOST) --> stay in CNG */ ( sid_upd_bad != 0 ) ) /* SID_UPD_BAD --> start CNG */ { st->bfi = 0; + move16(); total_brate = 0; + move32(); } /* update for next frame's G.192 file format's SID_FIRST detection (primarily for AMRWBIO) */ + test(); st->prev_ft_speech_fx = ( ( curr_ft_good_sp != 0 ) || ( curr_ft_bad_sp != 0 ) ); + move16(); /* st->total brate= total_brate ; updated in a good frame below */ } /* rew_flag */ @@ -1739,7 +1829,8 @@ Word16 read_indices_fx( /* o : 1 = reading OK, 0 = problem #ifdef DEBUGGING st->bfi |= file_read_FECpattern(); #endif - if ( st->bfi == 0 && !rew_flag ) + test(); + IF( st->bfi == 0 && !rew_flag ) { /* select MODE1 or MODE2 */ decoder_selectCodec( st, total_brate, *pt_stream ); @@ -1747,10 +1838,11 @@ Word16 read_indices_fx( /* o : 1 = reading OK, 0 = problem Mpy_32_16_ss( total_brate, 5243, &L_tmp, &utmp ); /* 5243 is 1/50 in Q18. (0+18-15=3) */ st->total_num_bits = extract_l( L_shr( L_tmp, 3 ) ); /* Q0 */ + move16(); /* in case rew_flag is set, rewind the file and return */ /* (used in io_enc() to print out info about technologies and to initialize the codec) */ - if ( rew_flag ) + IF( rew_flag ) { rewind( file ); st->total_brate = total_brate; @@ -1759,24 +1851,27 @@ Word16 read_indices_fx( /* o : 1 = reading OK, 0 = problem } /* GOOD frame */ - if ( st->bfi == 0 ) + IF( st->bfi == 0 ) { /* GOOD frame - convert ITU-T G.192 words to short values */ bit_stream_ptr = st->bit_stream; - for ( k = 0; k < num_bits; ++k ) + FOR( k = 0; k < num_bits; ++k ) { - *bit_stream_ptr++ = ( *pt_stream++ == G192_BIN1 ); + *bit_stream_ptr++ = (UWord16) EQ_32( *pt_stream++, G192_BIN1 ); + move16(); } /*add two zero bytes for arithmetic coder flush*/ - for ( k = 0; k < 2 * 8; ++k ) + FOR( k = 0; k < 2 * 8; ++k ) { *bit_stream_ptr++ = 0; + move16(); } /*a change of the total bitrate should not be known to the decoder, if the received frame was lost*/ st->total_brate = total_brate; + move32(); mdct_switching_dec( st ); } @@ -1815,87 +1910,115 @@ static Word32 read_indices_mime_handle_dtx( Word16 speech_bad = 0; Word16 sid_upd_bad = 0, sid_update = 0; Word16 amrwb_sid_first = 0; /* derived from sti SID_FIRST indicator in AMRWB payload */ + move16(); + move16(); + move16(); + move16(); + move16(); /* keep st->CNG , st_bfi and total_brate updated for proper synthesis in DTX and FER */ - if ( GT_32( total_brate, SID_2k40 ) ) + IF( GT_32( total_brate, SID_2k40 ) ) { - if ( st->bfi != 1 ) /* so far derived from q bit in AMRWB/AMRWBIO cases */ + if ( NE_16( st->bfi, 1 ) ) /* so far derived from q bit in AMRWB/AMRWBIO cases */ { curr_ft_good_sp = 1; + move16(); } } /* handle q_bit and lost_sp clash , assume worst case */ - if ( speech_lost != 0 ) /* overrides a good q_bit */ + IF( speech_lost != 0 ) /* overrides a good q_bit */ { curr_ft_good_sp = 0; + move16(); st->bfi = 1; /* override qbit */ + move16(); } /* now_bfi_fx has been set based on q_bit and ToC fields */ /* SID_UPDATE check */ - if ( total_brate == SID_1k75 || total_brate == SID_2k40 ) + test(); + IF( total_brate == SID_1k75 || total_brate == SID_2k40 ) { - if ( st->bfi == 0 ) + IF( st->bfi == 0 ) { /* typically from q bit */ sid_update = 1; + move16(); } - else + ELSE { sid_upd_bad = 1; /* may happen in saving from e.g. a CS-connection */ + move16(); } } - if ( isAMRWB_IOmode && total_brate == 0 && sti == 0 ) + test(); + test(); + IF( isAMRWB_IOmode && total_brate == 0 && sti == 0 ) { - if ( st->bfi ) + IF( st->bfi ) { sid_upd_bad = 1; /* corrupt sid_first, signaled as bad sid */ + move16(); } - else + ELSE { amrwb_sid_first = 1; /* 1-sti */ + move16(); } } - if ( sid_upd_bad != 0 && ( ( isAMRWB_IOmode != 0 && st->Opt_AMR_WB == 0 ) || /* switch to AMRWBIO */ - ( isAMRWB_IOmode != 1 && st->Opt_AMR_WB == 1 ) /* switch from AMRWBIO */ - ) ) + test(); + test(); + test(); + test(); + IF( sid_upd_bad != 0 && ( ( isAMRWB_IOmode != 0 && st->Opt_AMR_WB == 0 ) || /* switch to AMRWBIO */ + ( NE_16( isAMRWB_IOmode, 1 ) && EQ_16( st->Opt_AMR_WB, 1 ) ) /* switch from AMRWBIO */ + ) ) { /* do not allow a normal start of CNG synthesis if this SID(with BER or FER) is a switch to/from AMRWBIO */ sid_upd_bad = 0; /* revert this detection due to AMRWBIO/EVS mode switch */ + move16(); total_brate = 0; + move32(); no_data = 1; + move16(); assert( st->bfi == 1 ); /* bfi stays 1 */ } - if ( GT_32( total_brate, SID_2k40 ) && st->bfi == 1 ) /* typically from q bit */ + test(); + if ( GT_32( total_brate, SID_2k40 ) && EQ_16( st->bfi, 1 ) ) /* typically from q bit */ { speech_bad = 1; /* initial assumption, CNG synt state decides what to actually do */ + move16(); } /* all frame types decoded */ /* update CNG synthesis state */ /* Decoder can only enter CNG-synthesis for CNG frame types (sid_upd, sid_bad, sid_first) */ - if ( st->CNG_fx != 0 ) + IF( st->CNG_fx != 0 ) { /* We were in CNG synthesis */ if ( curr_ft_good_sp != 0 ) { /* only a good speech frame makes decoder leave CNG synthesis */ st->CNG_fx = 0; + move16(); } } - else + ELSE { /* We were in SPEECH synthesis */ /* only a received SID frame can make the decoder enter into CNG synthesis */ + test(); + test(); if ( amrwb_sid_first || sid_update || sid_upd_bad ) { st->CNG_fx = 1; + move16(); } } @@ -1903,20 +2026,28 @@ static Word32 read_indices_mime_handle_dtx( /* in SPEECH synthesis, make sure to activate speech plc for a received no_data frame, no_data frames may be injected by the network or by the dejitter buffer */ /* modify bfi_flag to stay/move into the correct decoder PLC section */ + test(); if ( ( st->CNG_fx == 0 ) && ( no_data != 0 ) ) { /* treat no_data received in speech synthesis as SP_LOST frames, SPEECH PLC code will now become active */ st->bfi = 1; + move16(); /* total_brate= 0; always zero for no_data */ } /* in CNG */ /* handle bad speech frame(and bad sid frame) in the decoders CNG synthesis settings pair (total_brate, bfi) */ - if ( ( st->CNG_fx != 0 && ( speech_bad || speech_lost || no_data ) ) || /* SP_BAD or SPEECH_LOST) --> stay in CNG */ - sid_upd_bad ) /* SID_UPD_BAD --> start/stay CNG */ + test(); + test(); + test(); + test(); + IF( ( st->CNG_fx != 0 && ( speech_bad || speech_lost || no_data ) ) || /* SP_BAD or SPEECH_LOST) --> stay in CNG */ + sid_upd_bad ) /* SID_UPD_BAD --> start/stay CNG */ { - st->bfi = 0; /* mark as good to not start speech PLC */ + st->bfi = 0; /* mark as good to not start speech PLC */ + move16(); total_brate = 0; /* this zeroing needed for speech_bad, sid_bad frames */ + move32(); } @@ -1929,22 +2060,33 @@ static Word32 read_indices_mime_handle_dtx( /* handle available AMRWB/AMRWBIO MIME header ToC rate-info at startup */ - if ( ( st->bfi == 1 && st->ini_frame == 0 ) && - ( ( st->amrwb_rfc4867_flag != 0 ) || ( st->amrwb_rfc4867_flag == 0 && isAMRWB_IOmode != 0 ) ) ) /*AMRWB ToC */ + test(); + test(); + test(); + test(); + IF( ( EQ_16( st->bfi, 1 ) && st->ini_frame == 0 ) && + ( ( st->amrwb_rfc4867_flag != 0 ) || ( st->amrwb_rfc4867_flag == 0 && isAMRWB_IOmode != 0 ) ) ) /*AMRWB ToC */ { Word32 init_rate; init_rate = total_brate; /* default , may have been modified from original ToC value */ - if ( speech_lost != 0 || no_data != 0 ) + move32(); + + test(); + IF( speech_lost != 0 || no_data != 0 ) { init_rate = ACELP_12k65; /* make sure the decoder starts up in a selected AMRWB mode */ + move32(); } - else if ( speech_bad != 0 ) + ELSE IF( speech_bad != 0 ) { init_rate = AMRWB_IOmode2rate[core_mode]; /* read from from ToC */ + move32(); } st->total_brate = init_rate; /* not updated on bfi as decoderSelectCodec is not called below */ + move32(); st->core_brate = init_rate; + move32(); } return total_brate; @@ -1964,27 +2106,31 @@ static void read_indices_mime_handle_sti_and_all_zero_bits( { Word16 k; - if ( sti == 0 ) + IF( sti == 0 ) { *total_brate = 0; /* signal received SID_FIRST as a good frame with no bits */ - for ( k = 0; k < 35; k++ ) + move32(); + FOR( k = 0; k < 35; k++ ) { - st->bfi |= st->bit_stream[k]; /* partity check of 35 zeroes, any single 1 gives BFI */ + st->bfi = s_or( st->bfi, st->bit_stream[k] ); /* partity check of 35 zeroes, any single 1 gives BFI */ + move16(); } } /* all zero bit SID_update results in a valid LP filter with extremely high LP-filter-gain */ /* all zero bits signal may be a result of CS bit errors or erronesouly injected by gateways or bad dejitter handlers */ - if ( sti == 1 ) + IF( EQ_16( sti, 1 ) ) { /*sid_update received */ Word16 sum = 0; - for ( k = 0; k < 35; k++ ) + move16(); + FOR( k = 0; k < 35; k++ ) { - sum += st->bit_stream[k]; /* check of 35 zeroes */ + sum = add( sum, st->bit_stream[k] ); /* check of 35 zeroes */ } if ( sum == 0 ) { st->bfi = 1; /* eventually becomes SID_UPD_BAD */ + move16(); } } } @@ -2015,22 +2161,31 @@ Word16 read_indices_mime( /* o : 1 = reading OK, 0 = problem Word16 speech_lost = 0, no_data = 0; Word16 num_bytes_read; + move16(); + move16(); + move16(); + move16(); + st->BER_detect = 0; + move16(); st->bfi = 0; + move16(); st->mdct_sw_enable = 0; + move16(); st->mdct_sw = 0; + move16(); reset_indices_dec_fx( st ); /* read the FT Header field from the bitstream */ - if ( fread( &header, sizeof( UWord8 ), 1, file ) != 1 ) + IF( NE_32( fread( &header, sizeof( UWord8 ), 1, file ), 1 ) ) { - if ( ferror( file ) ) + IF( ferror( file ) ) { /* error during reading */ fprintf( stderr, "\nError reading the bitstream !" ); exit( -1 ); } - else + ELSE { /* end of file reached */ return 0; @@ -2039,8 +2194,9 @@ Word16 read_indices_mime( /* o : 1 = reading OK, 0 = problem /* init local RXDTX flags */ sti = -1; + move16(); - if ( st->amrwb_rfc4867_flag != 0 ) + IF( st->amrwb_rfc4867_flag != 0 ) { /* RFC 4867 5.3 .... @@ -2054,12 +2210,16 @@ Word16 read_indices_mime( /* o : 1 = reading OK, 0 = problem Section 4.3.2. The P bits are padding and MUST be set to 0, and MUST be ignored. */ isAMRWB_IOmode = 1; - qbit = ( header >> 2 ) & 0x01; /* b2 bit (b7 is the F bit ) */ + move16(); + qbit = s_and( shr( header, 2 ), 0x01 ); /* b2 bit (b7 is the F bit ) */ + move16(); st->bfi = !qbit; - core_mode = ( ( header >> 3 ) & 0x0F ); /* b6..b3 */ - total_brate = AMRWB_IOmode2rate[core_mode]; /* get the frame length from the header */ + move16(); + core_mode = s_and( shr( header, 3 ), 0x0F ); /* b6..b3 */ + total_brate = AMRWB_IOmode2rate[core_mode]; /* get the frame length from the header */ + move32(); } - else + ELSE { /*0 1 2 3 4 5 6 7 MS-bit ---> LS-bit +-+-+-+-+-+-+-+-+ @@ -2071,40 +2231,47 @@ Word16 read_indices_mime( /* o : 1 = reading OK, 0 = problem x is the q-bit if E=1, q==1(good), Q==0(bad, maybe bit errors in payload ) H,F always 0 in RTP format. */ - isAMRWB_IOmode = ( header & 0x20 ) > 0; /* get EVS mode-from header */ /* b2 */ - core_mode = ( header & 0x0F ); /* b4,b5,b6,b7 */ + isAMRWB_IOmode = extract_l( GT_16( s_and( header, 0x20 ), 0 ) ); /* get EVS mode-from header */ /* b2 */ + core_mode = s_and( header, 0x0F ); /* b4,b5,b6,b7 */ - if ( isAMRWB_IOmode ) + IF( isAMRWB_IOmode ) { - qbit = ( header & 0x10 ) > 0; /* get Q bit, valid for IO rates */ /* b3 */ + qbit = extract_l( GT_16( s_and( header, 0x10 ), 0 ) ); /* get Q bit, valid for IO rates */ /* b3 */ total_brate = AMRWB_IOmode2rate[core_mode]; + move32(); } - else + ELSE { qbit = 1; /* assume good q_bit for the unused EVS-mode bit, complete ToC validity checked later */ + move16(); total_brate = PRIMARYmode2rate[core_mode]; + move32(); } st->bfi = !qbit; + move16(); } /* set up RX-DTX-handler input */ - if ( core_mode == 14 ) + if ( EQ_16( core_mode, 14 ) ) { /* SP_LOST */ speech_lost = 1; + move16(); } - if ( core_mode == 15 ) + if ( EQ_16( core_mode, 15 ) ) { /* NO_DATA unsent CNG frame OR any frame marked or injected as no_data by e.g a signaling layer or dejitter buffer */ no_data = 1; + move16(); } Mpy_32_16_ss( total_brate, 5243, &L_tmp, &utmp ); /* 5243 is 1/50 in Q18. (0+18-15=3) */ num_bits = extract_l( L_shr( L_tmp, 3 ) ); /* Q0 */ st->total_num_bits = num_bits; + move16(); - if ( total_brate < 0 ) + IF( total_brate < 0 ) { /* validate that total_brate (derived from RTP packet or a file header) is one of the defined bit rates */ fprintf( stderr, "\n Error. Illegal total bit rate (= %d) in MIME ToC header \n", total_brate ); @@ -2112,26 +2279,33 @@ Word16 read_indices_mime( /* o : 1 = reading OK, 0 = problem } /* Check correctness of ToC headers */ - if ( st->amrwb_rfc4867_flag == 0 ) + IF( st->amrwb_rfc4867_flag == 0 ) { /* EVS ToC header (FT field(b2-b7), H bit (b0), F bit (b1) , (EVS-modebit(b2)=0 unused(Qbit)(b3)==0) */ - if ( ( isAMRWB_IOmode == 0 ) && ( ( num_bits < 0 ) || ( ( header & 0x80 ) > 0 ) || ( ( header & 0x40 ) > 0 ) || ( header & 0x30 ) != 0x00 ) ) + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( isAMRWB_IOmode == 0 ) && ( ( num_bits < 0 ) || ( s_and( header, 0x80 ) > 0 ) || ( s_and( header, 0x40 ) > 0 ) || s_and( header, 0x30 ) != 0x00 ) ) { /* incorrect FT header */ fprintf( stderr, "\nError in EVS FT ToC header(%02x) ! ", header ); exit( -1 ); } - else if ( ( isAMRWB_IOmode != 0 ) && ( ( num_bits < 0 ) || ( ( header & 0x80 ) > 0 ) || ( ( header & 0x40 ) > 0 ) ) ) /* AMRWBIO */ + ELSE IF( ( isAMRWB_IOmode != 0 ) && ( ( num_bits < 0 ) || ( s_and( header, 0x80 ) > 0 ) || ( s_and( header, 0x40 ) > 0 ) ) ) /* AMRWBIO */ { /* incorrect IO FT header */ fprintf( stderr, "\nError in EVS(AMRWBIO) FT ToC header(%02x) ! ", header ); exit( -1 ); } } - else + ELSE { /* legacy AMRWB ToC, is only using Padding bits which MUST be ignored */ - if ( num_bits < 0 ) + IF( num_bits < 0 ) { /* incorrect FT header */ fprintf( stderr, "\nError in AMRWB RFC4867 Toc(FT) header(%02x) !", header ); @@ -2140,8 +2314,8 @@ Word16 read_indices_mime( /* o : 1 = reading OK, 0 = problem } /* read serial stream of indices from file to the local buffer */ - num_bytes_read = (Word16) fread( pFrame, sizeof( UWord8 ), ( num_bits + 7 ) >> 3, file ); - if ( num_bytes_read != ( num_bits + 7 ) >> 3 ) + num_bytes_read = extract_l( fread( pFrame, sizeof( UWord8 ), shr( add( num_bits, 7 ), 3 ), file ) ); + IF( NE_16( num_bytes_read, shr( add( num_bits, 7 ), 3 ) ) ) { fprintf( stderr, "\nError, invalid number of bytes read ! Exiting ! \n" ); exit( -1 ); @@ -2149,10 +2323,13 @@ Word16 read_indices_mime( /* o : 1 = reading OK, 0 = problem /* in case rew_flag is set, rewind the file and return */ /* (used in io_dec() to attempt print out info about technologies and to initialize the codec ) */ - if ( rew_flag ) + IF( rew_flag ) { st->total_brate = total_brate; /* used for the codec banner output */ - if ( st->bfi == 0 && speech_lost == 0 && no_data == 0 ) + move32(); + test(); + test(); + IF( st->bfi == 0 && speech_lost == 0 && no_data == 0 ) { decoder_selectCodec( st, total_brate, unpack_bit( &pt_pFrame, &mask ) ? G192_BIN1 : G192_BIN0 ); } @@ -2162,51 +2339,56 @@ Word16 read_indices_mime( /* o : 1 = reading OK, 0 = problem /* unpack speech data */ bit_stream_ptr = st->bit_stream; - for ( k = 0; k < num_bits; k++ ) + FOR( k = 0; k < num_bits; k++ ) { - if ( isAMRWB_IOmode ) + IF( isAMRWB_IOmode ) { st->bit_stream[sort_ptr[core_mode][k]] = unpack_bit( &pt_pFrame, &mask ); + move16(); bit_stream_ptr++; } - else + ELSE { *bit_stream_ptr++ = unpack_bit( &pt_pFrame, &mask ); + move16(); } } /* unpack auxiliary bits */ /* Note: the cmi bits are unpacked for demo purposes; */ - if ( isAMRWB_IOmode && total_brate == SID_1k75 ) + test(); + IF( isAMRWB_IOmode && EQ_32( total_brate, SID_1k75 ) ) { sti = unpack_bit( &pt_pFrame, &mask ); - cmi = unpack_bit( &pt_pFrame, &mask ) << 3; - cmi |= unpack_bit( &pt_pFrame, &mask ) << 2; - cmi |= unpack_bit( &pt_pFrame, &mask ) << 1; - cmi |= unpack_bit( &pt_pFrame, &mask ); + cmi = shl( unpack_bit( &pt_pFrame, &mask ), 3 ); + cmi = s_or( cmi, shl( unpack_bit( &pt_pFrame, &mask ), 2 ) ); + cmi = s_or( cmi, shl( unpack_bit( &pt_pFrame, &mask ), 1 ) ); + cmi = s_or( cmi, unpack_bit( &pt_pFrame, &mask ) ); read_indices_mime_handle_sti_and_all_zero_bits( st, &total_brate, sti ); } /*add two zero bytes for arithmetic coder flush*/ - for ( k = 0; k < 2 * 8; ++k ) + FOR( k = 0; k < 2 * 8; ++k ) { *bit_stream_ptr++ = 0; + move16(); } /* MIME RX_DTX handler */ - if ( !rew_flag ) + IF( !rew_flag ) { total_brate = read_indices_mime_handle_dtx( st, isAMRWB_IOmode, core_mode, total_brate, sti, speech_lost, no_data ); } - if ( st->bfi == 0 ) + IF( st->bfi == 0 ) { /* select MODE1 or MODE2 in MIME */ decoder_selectCodec( st, total_brate, *st->bit_stream ? G192_BIN1 : G192_BIN0 ); /* a change of the total bitrate should not be known to the decoder, if the received frame was truly lost */ st->total_brate = total_brate; + move32(); mdct_switching_dec( st ); } /* else{ bfi stay in past synthesis mode(SP,CNG) } */ @@ -2226,7 +2408,9 @@ static void berCheck( ) { /* In case of RF flag = 1, and valid RF packet with primary and partial copy */ - if ( ( EQ_16( st->bwidth, NB ) || EQ_16( st->bwidth, FB ) ) || ( GE_16( *coder_type, TRANSITION ) ) ) + test(); + test(); + IF( ( EQ_16( st->bwidth, NB ) || EQ_16( st->bwidth, FB ) ) || ( GE_16( *coder_type, TRANSITION ) ) ) { if ( EQ_16( st->use_partial_copy, 1 ) ) { @@ -2271,13 +2455,17 @@ void getPartialCopyInfo( /* reset number of target bits in case of rate switching */ st->rf_target_bits = 0; + move16(); /* Get the number of bits used for RF*/ IF( EQ_16( st->rf_flag, 1 ) ) { *coder_type = s_and( ind, 0x7 ); + move16(); st->bwidth = s_and( shr( ind, 3 ), 0x7 ); + move16(); *sharpFlag = s_and( shr( ind, 6 ), 0x1 ); + move16(); st->codec_mode = MODE2; move16(); get_rfTargetBits( st->rf_frame_type, &( st->rf_target_bits ) ); @@ -2285,17 +2473,22 @@ void getPartialCopyInfo( IF( EQ_16( st->bfi, FRAMEMODE_FUTURE ) ) { st->use_partial_copy = 1; + move16(); /* now set the frame mode to normal mode */ test(); IF( GE_16( st->rf_frame_type, RF_TCXFD ) && LE_16( st->rf_frame_type, RF_TCXTD2 ) ) { st->bfi = 1; + move16(); st->core = 1; + move16(); } ELSE { st->bfi = FRAMEMODE_NORMAL; + move16(); st->core = 0; + move16(); } } /* check for bit errors */ @@ -2322,14 +2515,16 @@ void get_rfFlag( /* Init */ *rf_flag = 0; + move16(); /* check for rf_flag in the packet and extract the rf_frame_type and rf_fec_offset */ test(); test(); - IF( EQ_32( st->total_brate, ACELP_13k20 ) && ( EQ_16( st->bfi, FRAMEMODE_NORMAL ) || EQ_16( st->bfi, FRAMEMODE_FUTURE ) ) ) + IF( EQ_32( st->total_brate, ACELP_13k20 ) && ( ( st->bfi == FRAMEMODE_NORMAL ) || EQ_16( st->bfi, FRAMEMODE_FUTURE ) ) ) { /* find the section in the ACELP signalling table corresponding to bitrate */ start_idx = 0; + move16(); WHILE( NE_32( acelp_sig_tbl[start_idx], st->total_brate ) ) { start_idx++; @@ -2341,21 +2536,26 @@ void get_rfFlag( /* retrieve the number of bits */ nBits_tmp = (Word16) acelp_sig_tbl[start_idx++]; + move16(); /* retrieve the signalling indice */ - ind_tmp = (Word16) acelp_sig_tbl[start_idx + get_indice( st, 0, nBits_tmp )]; + ind_tmp = (Word16) acelp_sig_tbl[add( start_idx, get_indice( st, 0, nBits_tmp ) )]; + move16(); /* convert signalling indice into RF flag. */ *rf_flag = s_and( shr( ind_tmp, 7 ), 0x1 ); + move16(); if ( ind ) { *ind = ind_tmp; + move16(); } if ( nBits ) { *nBits = nBits_tmp; + move16(); } } } @@ -2372,16 +2572,17 @@ void get_rfFrameType( ) { Word16 num_bits = 0; + move16(); IF( EQ_16( st->rf_flag, 1 ) ) { /*num_bits = st->total_brate/50;*/ - if ( EQ_32( st->total_brate, ACELP_13k20 ) ) + IF( EQ_32( st->total_brate, ACELP_13k20 ) ) { num_bits = 264; move16(); /* @13.2kbps */ } - else + ELSE { UWord16 lsb; Word32 L_tmp; @@ -2390,11 +2591,13 @@ void get_rfFrameType( } /* the last three bits in a packet is the RF frame type */ - *rf_frame_type = get_indice( st, num_bits - 3, 3 ); + *rf_frame_type = get_indice( st, sub( num_bits, 3 ), 3 ); + move16(); } ELSE { *rf_frame_type = 0; + move16(); } } @@ -2414,12 +2617,12 @@ void get_rf_fec_offset( IF( EQ_16( st->rf_flag, 1 ) ) { /*num_bits = st->total_brate/50;*/ - if ( EQ_32( st->total_brate, ACELP_13k20 ) ) + IF( EQ_32( st->total_brate, ACELP_13k20 ) ) { num_bits = 264; move16(); /* @13.2kbps */ } - else + ELSE { UWord16 lsb; Word32 L_tmp; @@ -2428,16 +2631,17 @@ void get_rf_fec_offset( } /* the two bits before the rf frame type contain the fec offset */ - tmp = get_indice( st, num_bits - 5, 2 ); + tmp = get_indice( st, sub( num_bits, 5 ), 2 ); - if ( tmp == 0 ) + IF( tmp == 0 ) { *rf_fec_offset = 2; move16(); } - else + ELSE { *rf_fec_offset = add( shl( tmp, 1 ), 1 ); + move16(); } } ELSE @@ -2465,31 +2669,39 @@ void get_rfTargetBits( { case RF_NO_DATA: *rf_target_bits = 5; + move16(); BREAK; case RF_TCXFD: *rf_target_bits = 27; + move16(); BREAK; case RF_TCXTD1: *rf_target_bits = 16; + move16(); BREAK; case RF_TCXTD2: *rf_target_bits = 16; + move16(); BREAK; case RF_ALLPRED: /* Es_pred bits 3 bits, LTF: 1, pitch: 8,5,5,5, FCB: 0, gain: 7,0,7,0, Diff GFr: 4*/ *rf_target_bits = 63; + move16(); BREAK; case RF_NOPRED: /* Es_pred bits 3 bits, LTF: 0, pitch: 0, FCB: 7,7,7,7, gain: 6,0,6,0, Diff GFr: 2*/ *rf_target_bits = 66; + move16(); BREAK; case RF_GENPRED: /* Es_pred bits 3 bits, LTF: 1, pitch: 8,0,8,0, FCB: 6,7,5,5, gain: 5,0,5,0, Diff GFr: 0*/ *rf_target_bits = 70; + move16(); BREAK; case RF_NELP: /* gain: 19, Diff GFr: 5 */ *rf_target_bits = 45; + move16(); BREAK; } } @@ -2515,9 +2727,11 @@ void get_NextCoderType_fx( FOR( k = 0; k < ACELP_13k20 / 50; k++ ) { - bit_stream[k] = ( bitsteam[k / 8] >> ( 7 - ( k % 8 ) ) ) & 0x1; + bit_stream[k] = (UWord8) s_and( shr( bitsteam[k / 8], sub( 7, ( k % 8 ) ) ), 0x1 ); + move16(); } start_idx = 0; + move16(); WHILE( NE_32( acelp_sig_tbl[start_idx], ACELP_13k20 ) ) { start_idx = add( start_idx, 1 ); @@ -2530,13 +2744,15 @@ void get_NextCoderType_fx( tmp = 0; move16(); nBits_tmp = (Word16) acelp_sig_tbl[start_idx++]; + move16(); FOR( k = 0; k < nBits_tmp; k++ ) { tmp = lshl( tmp, 1 ); tmp = add( tmp, bit_stream[k] ); } /* retrieve the signalling indice */ - *next_coder_type = s_and( (Word16) acelp_sig_tbl[start_idx + tmp], 0x7 ); + *next_coder_type = s_and( (Word16) acelp_sig_tbl[add( start_idx, tmp )], 0x7 ); + move16(); } /*-------------------------------------------------------------------* @@ -2564,84 +2780,110 @@ void read_indices_from_djb_fx( Word32 total_brate; Word16 speech_lost = 0; + move16(); + move16(); + move16(); + move16(); + st->bfi = 0; + move16(); st->BER_detect = 0; + move16(); st->mdct_sw_enable = 0; + move16(); st->mdct_sw = 0; + move16(); reset_indices_dec_fx( st ); st->bfi = !qbit; - total_brate = (Word32) (num_bits) *50; + move16(); + total_brate = L_mult0( num_bits, 50 ); st->total_num_bits = num_bits; + move16(); - if ( num_bits == 0 ) /* guess type of missing frame for SP_LOST and NO_DATA */ + IF( num_bits == 0 ) /* guess type of missing frame for SP_LOST and NO_DATA */ { speech_lost = st->CNG_fx == 0; + move16(); + move16(); no_data = st->CNG_fx != 0; + move16(); + move16(); } - if ( partialframe || st->prev_use_partial_copy ) + test(); + IF( partialframe || st->prev_use_partial_copy ) { st->next_coder_type = next_coder_type; + move16(); } - else + ELSE { st->next_coder_type = INACTIVE; + move16(); } - if ( partialframe == 1 ) + if ( EQ_16( partialframe, 1 ) ) { st->bfi = 2; + move16(); } /* unpack speech data */ bit_stream_ptr = st->bit_stream; /* convert bitstream from compact bytes to short values and store it in decoder state */ - for ( k = 0; k < num_bits; k++ ) + FOR( k = 0; k < num_bits; k++ ) { - if ( st->bitstreamformat == VOIP_RTPDUMP && isAMRWB_IOmode ) + test(); + IF( st->bitstreamformat == VOIP_RTPDUMP && isAMRWB_IOmode ) { st->bit_stream[sort_ptr[core_mode][k]] = unpack_bit( &pt_stream, &mask ); + move16(); bit_stream_ptr++; } - else + ELSE { *bit_stream_ptr++ = unpack_bit( &pt_stream, &mask ); + move16(); } } /* unpack auxiliary bits */ - if ( isAMRWB_IOmode && total_brate == SID_1k75 ) + test(); + IF( isAMRWB_IOmode && EQ_32( total_brate, SID_1k75 ) ) { - if ( st->bitstreamformat == VOIP_RTPDUMP ) + IF( EQ_16( st->bitstreamformat, VOIP_RTPDUMP ) ) { /* A.2.2.1.3: AMR-WB SID_1k75 frame is followed by STI bit and CMI bits */ sti = unpack_bit( &pt_stream, &mask ); } - else + ELSE { /* VOIP_G192_RTP does not contain STI and CMI */ sti = 1; + move16(); } read_indices_mime_handle_sti_and_all_zero_bits( st, &total_brate, sti ); } /* add two zero bytes for arithmetic coder flush */ - for ( k = 0; k < 8 * 2; ++k ) + FOR( k = 0; k < 8 * 2; ++k ) { *bit_stream_ptr++ = 0; + move16(); } total_brate = read_indices_mime_handle_dtx( st, isAMRWB_IOmode, core_mode, total_brate, sti, speech_lost, no_data ); /* st->CNG_fx set inside */ - if ( st->bfi != 1 ) + IF( NE_16( st->bfi, 1 ) ) { /* select Mode 1 or Mode 2 */ decoder_selectCodec( st, total_brate, *st->bit_stream ? G192_BIN1 : G192_BIN0 ); /* a change of the total bitrate should not be known to the decoder, if the received frame was truly lost */ st->total_brate = total_brate; + move32(); mdct_switching_dec( st ); } @@ -2668,15 +2910,17 @@ static UWord16 get_indice_preview( bitstreamShortPtr = bitstreamShort; FOR( i = 0; i < bitstreamSize; i++ ) { - *bitstreamShortPtr++ = ( bitstream[i / 8] >> ( 7 - ( i % 8 ) ) ) & 0x1; + *bitstreamShortPtr++ = s_and( shr( bitstream[i / 8], sub( 7, ( i % 8 ) ) ), 0x1 ); + move16(); } assert( nb_bits <= 16 ); value = 0; + move16(); FOR( i = 0; i < nb_bits; i++ ) { value = shl( value, 1 ); - value = add( value, bitstreamShort[pos + i] ); + value = add( value, bitstreamShort[add( pos, i )] ); } return value; } @@ -2698,14 +2942,18 @@ void evs_dec_previewFrame( Word16 rf_flag; rf_flag = 0; + move16(); *partialCopyFrameType = 0; + move16(); *partialCopyOffset = 0; - total_brate = bitstreamSize * 50; + move16(); + total_brate = L_mult0( bitstreamSize, 50 ); IF( EQ_32( total_brate, ACELP_13k20 ) ) { /* find the section in the ACELP signalling table corresponding to bitrate */ start_idx = 0; + move16(); WHILE( NE_32( acelp_sig_tbl[start_idx], total_brate ) ) { start_idx = add( start_idx, 1 ); @@ -2716,9 +2964,11 @@ void evs_dec_previewFrame( start_idx = add( start_idx, 1 ); /* retrieve the number of bits */ nBits = (Word16) acelp_sig_tbl[start_idx++]; + move16(); /* retrieve the signalling indice */ - ind = acelp_sig_tbl[start_idx + get_indice_preview( bitstream, bitstreamSize, 0, nBits )]; + ind = acelp_sig_tbl[add( start_idx, get_indice_preview( bitstream, bitstreamSize, 0, nBits ) )]; + move32(); /* convert signalling indice into RF flag. */ rf_flag = s_and( extract_l( L_shr( ind, 7 ) ), 0x1 ); @@ -2726,14 +2976,15 @@ void evs_dec_previewFrame( IF( rf_flag != 0 ) { /* read the fec offset at which the partial copy is received */ - ind = get_indice_preview( bitstream, bitstreamSize, ( bitstreamSize - 5 ), 2 ); + ind = get_indice_preview( bitstream, bitstreamSize, sub( bitstreamSize, 5 ), 2 ); IF( ind == 0 ) *partialCopyOffset = 2; ELSE IF( EQ_32( ind, 1 ) ) *partialCopyOffset = 3; ELSE IF( EQ_32( ind, 2 ) ) *partialCopyOffset = 5; ELSE IF( EQ_32( ind, 3 ) ) *partialCopyOffset = 7; - + move16(); /* the last three bits in a packet is the RF frame type */ *partialCopyFrameType = get_indice_preview( bitstream, bitstreamSize, bitstreamSize - 3, 3 ); + move16(); } } } @@ -2748,6 +2999,7 @@ void dtx_read_padding_bits_fx( tmp = st->total_brate; move32(); st->total_brate = L_add( st->total_brate, L_mult0( num_bits, FRAMES_PER_SEC ) ); + move32(); get_next_indice_fx( st, num_bits ); st->total_brate = tmp; move32(); diff --git a/lib_com/cb_shape_fx.c b/lib_com/cb_shape_fx.c index 880b60205..fcd9e06e4 100644 --- a/lib_com/cb_shape_fx.c +++ b/lib_com/cb_shape_fx.c @@ -28,7 +28,7 @@ static void E_GAIN_f_pitch_sharpening( Word16 *x, Word16 pit_lag, Word16 L_subfr FOR( i = pit_lag; i < L_subfr; i++ ) { /*x[i] += x[i - pit_lag] * F_PIT_SHARP;*/ - tmp = mult_r( x[i - pit_lag], 27853 /*F_PIT_SHARP Q15*/ ); + tmp = mult_r( x[sub( i, pit_lag )], 27853 /*F_PIT_SHARP Q15*/ ); x[i] = add( x[i], tmp ); move16(); } @@ -100,7 +100,7 @@ void cb_shape_fx( { weight_a_fx( p_Aq, A_num, g1, M ); weight_a_fx( p_Aq, A_den, g2, M ); - set16_fx( buff, 0, M + L_subfr ); + set16_fx( buff, 0, add( M, L_subfr ) ); IF( formantTiltFlag ) { Copy( A_num, buff + M, M + 1 ); @@ -108,7 +108,7 @@ void cb_shape_fx( E_UTIL_synthesis( 1, A_den, buff + M, buff + M, L_subfr, buff, 0, M ); /*Compute tilt of formant enhancement*/ - tilt = extract_l( L_shr( get_gain( buff + M + 1, buff + M, L_subfr - 1 ), 1 ) ); + tilt = extract_l( L_shr( get_gain( buff + M + 1, buff + M, sub( L_subfr, 1 ) ), 1 ) ); /*Combine tilt of code and fe*/ tmp = 0; diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index 4b618f556..e81ab78ec 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -271,6 +271,7 @@ void cldfbAnalysis_ivas_fx( Word16 i, k; Word16 L2, M1, M2, M4; Word16 no_col = h_cldfb->no_col; + move16(); Word32 r1_fx, r2_fx, rr12_fx, ir12_fx; Word32 i1_fx, i2_fx, ri12_fx, ii12_fx; @@ -294,7 +295,7 @@ void cldfbAnalysis_ivas_fx( IF( GT_16( samplesToProcess, -1 ) ) { Copy32( timeIn_fx, timeBuffer_fx + offset, samplesToProcess ); - set32_fx( timeBuffer_fx + offset + samplesToProcess, 0, sub( frameSize, samplesToProcess ) ); + set32_fx( timeBuffer_fx + add( offset, samplesToProcess ), 0, sub( frameSize, samplesToProcess ) ); } ELSE { @@ -308,11 +309,12 @@ void cldfbAnalysis_ivas_fx( } M1 = h_cldfb->no_channels; + move16(); M2 = shr( M1, 1 ); M4 = shr( M1, 2 ); L2 = shl( M1, 1 ); - IF( M2 & 1 ) + if ( s_and( M2, 1 ) ) { M4 = add( M4, 1 ); } @@ -329,29 +331,29 @@ void cldfbAnalysis_ivas_fx( FOR( k = 0; k < M4; k++ ) { /* prototype filter */ - r1_fx = Msub_32_16( 0, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx - - r2_fx = Msub_32_16( 0, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // Qx - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // Qx - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // Qx - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // Qx - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // Qx - - i1_fx = Msub_32_16( 0, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx - - i2_fx = Msub_32_16( 0, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx + r1_fx = Msub_32_16( 0, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // Qx + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // Qx + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // Qx + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // Qx + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // Qx + + r2_fx = Msub_32_16( 0, timeBuffer_fx[add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // Qx + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // Qx + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // Qx + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // Qx + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // Qx + + i1_fx = Msub_32_16( 0, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // Qx + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // Qx + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // Qx + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // Qx + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // Qx + + i2_fx = Msub_32_16( 0, timeBuffer_fx[add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // Qx + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // Qx + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // Qx + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // Qx + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // Qx r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // Qx - 1 r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // Qx - 1 @@ -364,7 +366,7 @@ void cldfbAnalysis_ivas_fx( // cplxMult( &rBuffer_fx[2 * k], &rBuffer_fx[2 * k + 1], rr12_fx, ri12_fx, rot_vctr_re_fx[k], rot_vctr_im_fx[k] ); rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // Qx - 3 move32(); - rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // Qx - 3 + rBuffer_fx[add( 2 * k, 1 )] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // Qx - 3 move32(); /* folding + pre modulation of DCT IV */ @@ -373,36 +375,36 @@ void cldfbAnalysis_ivas_fx( // cplxMult( &iBuffer_fx[2 * k], &iBuffer_fx[2 * k + 1], ir12_fx, ii12_fx, rot_vctr_re_fx[k], rot_vctr_im_fx[k] ); iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // Qx - 3 move32(); - iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // Qx - 3 + iBuffer_fx[add( 2 * k, 1 )] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // Qx - 3 move32(); } FOR( k = M4; k < M2; k++ ) { /* prototype filter */ - r1_fx = Msub_32_16( 0, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx - - r2_fx = Msub_32_16( 0, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx - - i1_fx = Msub_32_16( 0, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx - - i2_fx = Msub_32_16( 0, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx + r1_fx = Msub_32_16( 0, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // Qx + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // Qx + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // Qx + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // Qx + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // Qx + + r2_fx = Msub_32_16( 0, timeBuffer_fx[add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // Qx + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // Qx + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // Qx + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // Qx + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // Qx + + i1_fx = Msub_32_16( 0, timeBuffer_fx[add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // Qx + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // Qx + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // Qx + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // Qx + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // Qx + + i2_fx = Msub_32_16( 0, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // Qx + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // Qx + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // Qx + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // Qx + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // Qx r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // Qx - 1 r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // Qx - 1 @@ -415,7 +417,7 @@ void cldfbAnalysis_ivas_fx( // cplxMult( &rBuffer_fx[2 * k], &rBuffer[2 * k + 1], rr12, ri12, rot_vctr_re[k], rot_vctr_im[k] ); rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // Qx - 3 move32(); - rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // Qx - 3 + rBuffer_fx[add( 2 * k, 1 )] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // Qx - 3 move32(); /* folding + pre modulation of DCT IV */ @@ -424,7 +426,7 @@ void cldfbAnalysis_ivas_fx( // cplxMult( &iBuffer[2 * k], &iBuffer[2 * k + 1], ir12, ii12, rot_vctr_re[k], rot_vctr_im[k] ); iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // Qx - 3 move32(); - iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // Qx - 3 + iBuffer_fx[add( 2 * k, 1 )] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // Qx - 3 move32(); } @@ -436,9 +438,9 @@ void cldfbAnalysis_ivas_fx( FOR( k = 0; k < M2; k++ ) { // cplxMult( &realBuffer[i][M1 - 1 - ( 2 * k )], &realBuffer[i][2 * k], rBuffer[2 * k], rBuffer[2 * k + 1], rot_vctr_re[k], rot_vctr_im[k] ); - realBuffer_fx[i][M1 - 1 - ( 2 * k )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // Qx - 5 + realBuffer_fx[i][sub( sub( M1, 1 ), shl( k, 1 ) )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[add( 2 * k, 1 )], rot_vctr_im_fx[k] ); // Qx - 5 move32(); - realBuffer_fx[i][2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // Qx - 5 + realBuffer_fx[i][2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[add( 2 * k, 1 )], rot_vctr_re_fx[k] ); // Qx - 5 move32(); } @@ -451,14 +453,14 @@ void cldfbAnalysis_ivas_fx( { /* do it inplace */ // cplxMult( &imagBuffer[i][2 * k], &imagBuffer[i][M1 - 1 - ( 2 * k )], iBuffer[2 * k], iBuffer[2 * k + 1], rot_vctr_re[k], rot_vctr_im[k] ); - imagBuffer_fx[i][2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // QX - 5 + imagBuffer_fx[i][2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[add( 2 * k, 1 )], rot_vctr_im_fx[k] ); // QX - 5 move32(); - imagBuffer_fx[i][M1 - 1 - ( 2 * k )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // Qx - 5 + imagBuffer_fx[i][sub( sub( M1, 1 ), shl( k, 1 ) )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[add( 2 * k, 1 )], rot_vctr_re_fx[k] ); // Qx - 5 move32(); } - timeBuffer_fx += L2 * 5; - timeBuffer_fx += h_cldfb->no_channels - h_cldfb->p_filter_length; + timeBuffer_fx += i_mult( L2, 5 ); + timeBuffer_fx += sub( h_cldfb->no_channels, h_cldfb->p_filter_length ); } /* update memory */ @@ -703,6 +705,7 @@ void cldfbAnalysis_ts_fx( Word16 i, k; Word16 L2, M1, M2, M4; Word16 no_col = h_cldfb->no_col; + move16(); Word32 r1_fx, r2_fx, rr12_fx, ir12_fx; Word32 i1_fx, i2_fx, ri12_fx, ii12_fx; @@ -717,40 +720,45 @@ void cldfbAnalysis_ts_fx( Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )]; Word16 offset, frameSize; - offset = h_cldfb->p_filter_length - h_cldfb->no_channels; - frameSize = h_cldfb->no_channels * h_cldfb->no_col; + offset = sub( h_cldfb->p_filter_length, h_cldfb->no_channels ); + frameSize = i_mult( h_cldfb->no_channels, h_cldfb->no_col ); /* prepare input buffer */ timeBuffer_fx = buffer_fx; Copy32( h_cldfb->cldfb_state_fx, timeBuffer_fx, offset ); - if ( samplesToProcess > -1 ) + IF( GT_16( samplesToProcess, -1 ) ) { Copy32( timeIn_fx, timeBuffer_fx + offset, samplesToProcess ); - set32_fx( timeBuffer_fx + offset + samplesToProcess, 0, ( frameSize - samplesToProcess ) ); + set32_fx( timeBuffer_fx + add( offset, samplesToProcess ), 0, sub( frameSize, samplesToProcess ) ); } - else + ELSE { Copy32( timeIn_fx, timeBuffer_fx + offset, frameSize ); } h_cldfb->Q_cldfb_state = *q_cldfb; + move16(); /* only process needed cols */ - if ( samplesToProcess > -1 ) + IF( samplesToProcess > -1 ) { - no_col = min( no_col, ( samplesToProcess + h_cldfb->no_channels - 1 ) / h_cldfb->no_channels ); + no_col = min( no_col, idiv1616( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), h_cldfb->no_channels ) ); assert( no_col == 1 ); } M1 = h_cldfb->no_channels; - M2 = M1 >> 1; - M4 = M1 >> 2; - L2 = M1 << 1; + move16(); + M2 = shr( M1, 1 ); + move16(); + M4 = shr( M1, 2 ); + move16(); + L2 = shl( M1, 1 ); + move16(); - if ( M2 & 1 ) + if ( s_and( M2, 1 ) ) { - M4 += 1; + M4 = add( M4, 1 ); } rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx; // q = 29 @@ -760,35 +768,36 @@ void cldfbAnalysis_ts_fx( ptr_pf_fx = h_cldfb->p_filter; ptr_pf_sf = h_cldfb->p_filter_sf; + move16(); - for ( i = 0; i < no_col; i++ ) + FOR( i = 0; i < no_col; i++ ) { - for ( k = 0; k < M4; k++ ) + FOR( k = 0; k < M4; k++ ) { /* prototype filter */ - r1_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ) ); // q - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ) ); // q - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ) ); // q - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ) ); // q - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ) ); // q - - r2_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ) ); // q - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ) ); // q - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ) ); // q - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ) ); // q - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ) ); // q - - i1_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ) ); // q - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ) ); // q - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ) ); // q - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ) ); // q - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ) ); // q - - i2_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ) ); // q - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ) ); // q - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ) ); // q - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ) ); // q - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ) ); // q + r1_fx = Msub_32_16( 0, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // q + + r2_fx = Msub_32_16( 0, timeBuffer_fx[add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // q + + i1_fx = Msub_32_16( 0, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // q + + i2_fx = Msub_32_16( 0, timeBuffer_fx[add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // q r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 @@ -799,43 +808,47 @@ void cldfbAnalysis_ts_fx( rr12_fx = L_sub( r1_fx, r2_fx ); // q -1 ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // q - 1 /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ - rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 + rBuffer_fx[add( 2 * k, 1 )] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + move32(); + move32(); ///* folding + pre modulation of DCT IV */ ir12_fx = L_add( r1_fx, r2_fx ); // q - 1 ii12_fx = L_sub( i1_fx, i2_fx ); // q - 1 /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ - iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 + iBuffer_fx[add( 2 * k, 1 )] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + move32(); + move32(); } - for ( k = M4; k < M2; k++ ) + FOR( k = M4; k < M2; k++ ) { /* prototype filter */ - r1_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ) ); // q - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ) ); // q - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ) ); // q - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ) ); // q - r1_fx = L_sub( r1_fx, Mpy_32_16_1( timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ) ); // q - - r2_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ) ); // q - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ) ); // q - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ) ); // q - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ) ); // q - r2_fx = L_sub( r2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ) ); // q - - i1_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ) ); // q - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ) ); // q - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ) ); // q - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ) ); // q - i1_fx = L_sub( i1_fx, Mpy_32_16_1( timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ) ); // q - - i2_fx = L_sub( 0, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ) ); // q - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ) ); // q - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ) ); // q - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ) ); // q - i2_fx = L_sub( i2_fx, Mpy_32_16_1( timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ) ); // q + r1_fx = Msub_32_16( 0, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // q + + r2_fx = Msub_32_16( 0, timeBuffer_fx[add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // q + + i1_fx = Msub_32_16( 0, timeBuffer_fx[add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // q + + i2_fx = Msub_32_16( 0, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // q r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 @@ -846,72 +859,88 @@ void cldfbAnalysis_ts_fx( rr12_fx = L_add( r1_fx, r2_fx ); // q - 1 ri12_fx = L_sub( i1_fx, i2_fx ); // q - 1 /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ - rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 + rBuffer_fx[add( 2 * k, 1 )] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + move32(); + move32(); /* folding + pre modulation of DCT IV */ ir12_fx = L_sub( r1_fx, r2_fx ); // q - 1 ii12_fx = L_add( i1_fx, i2_fx ); // q - 1 /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ - iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 + iBuffer_fx[add( 2 * k, 1 )] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + move32(); + move32(); } *q_cldfb = sub( *q_cldfb, 3 ); + move16(); /* FFT of DST IV */ Word16 q_shift; - q_shift = sub( s_min( getScaleFactor32( rBuffer_fx, 2 * M2 ), getScaleFactor32( iBuffer_fx, 2 * M2 ) ), find_guarded_bits_fx( M2 ) ); + q_shift = sub( s_min( getScaleFactor32( rBuffer_fx, shl( M2, 1 ) ), getScaleFactor32( iBuffer_fx, shl( M2, 1 ) ) ), find_guarded_bits_fx( M2 ) ); *q_cldfb = add( *q_cldfb, q_shift ); - for ( Word16 ind = 0; ind < 2 * M2; ind++ ) + move16(); + FOR( Word16 ind = 0; ind < shl( M2, 1 ); ind++ ) { rBuffer_fx[ind] = L_shl( rBuffer_fx[ind], q_shift ); + move32(); } - for ( Word16 ind = 0; ind < 2 * M2; ind++ ) + FOR( Word16 ind = 0; ind < shl( M2, 1 ); ind++ ) { iBuffer_fx[ind] = L_shl( iBuffer_fx[ind], q_shift ); + move32(); } fft_cldfb_fx( rBuffer_fx, M2 ); /* post modulation of DST IV */ - for ( k = 0; k < M2; k++ ) + FOR( k = 0; k < M2; k++ ) { /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ - realBuffer_fx[M1 - 1 - ( 2 * k )] = L_sub( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ) ); // q - 5 - realBuffer_fx[2 * k] = L_add( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ) ); // q - 5 + realBuffer_fx[sub( sub( M1, 1 ), shl( k, 1 ) )] = L_sub( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( rBuffer_fx[add( 2 * k, 1 )], rot_vctr_im_fx[k] ) ); // q - 5 + realBuffer_fx[2 * k] = L_add( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( rBuffer_fx[add( 2 * k, 1 )], rot_vctr_re_fx[k] ) ); // q - 5 + move32(); + move32(); } *q_cldfb = sub( *q_cldfb, 2 ); + move16(); /* FFT of DCT IV */ fft_cldfb_fx( iBuffer_fx, M2 ); - q_shift = s_min( getScaleFactor32( rBuffer_fx, 2 * M2 ), getScaleFactor32( iBuffer_fx, 2 * M2 ) ); + q_shift = s_min( getScaleFactor32( rBuffer_fx, shl( M2, 1 ) ), getScaleFactor32( iBuffer_fx, shl( M2, 1 ) ) ); *q_cldfb = add( *q_cldfb, q_shift ); - for ( Word16 ind = 0; ind < 2 * M2; ind++ ) + move16(); + FOR( Word16 ind = 0; ind < shl( M2, 1 ); ind++ ) { rBuffer_fx[ind] = L_shl( rBuffer_fx[ind], q_shift ); + move32(); } - for ( Word16 ind = 0; ind < 2 * M2; ind++ ) + FOR( Word16 ind = 0; ind < shl( M2, 1 ); ind++ ) { iBuffer_fx[ind] = L_shl( iBuffer_fx[ind], q_shift ); + move32(); } /* post modulation of DCT IV */ - for ( k = 0; k < M2; k++ ) + FOR( k = 0; k < M2; k++ ) { /* do it inplace */ /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ - imagBuffer_fx[2 * k] = L_sub( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ) ); // q - 5 - imagBuffer_fx[M1 - 1 - ( 2 * k )] = L_add( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ) ); // q - 5 + imagBuffer_fx[2 * k] = L_sub( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( iBuffer_fx[add( 2 * k, 1 )], rot_vctr_im_fx[k] ) ); // q - 5 + imagBuffer_fx[sub( sub( M1, 1 ), shl( k, 1 ) )] = L_add( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( iBuffer_fx[add( 2 * k, 1 )], rot_vctr_re_fx[k] ) ); // q - 5 + move32(); + move32(); } - if ( h_cldfb->prototype == CLDFB_PROTOTYPE_5_00MS ) + IF( EQ_32( h_cldfb->prototype, CLDFB_PROTOTYPE_5_00MS ) ) { /* rotation due to delay*/ /*if(h_cldfb->da != M1)*/ - if ( rot_vctr_delay_re_fx != NULL ) + IF( rot_vctr_delay_re_fx != NULL ) { - for ( k = 0; k < M1; k++ ) + FOR( k = 0; k < M1; k++ ) { Word32 cplx_aux_fx; /* delay */ @@ -924,20 +953,22 @@ void cldfbAnalysis_ts_fx( cplx_aux_fx = L_sub( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), Mpy_32_32( imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ) ); // q - 5 imagBuffer_fx[k] = L_add( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), Mpy_32_32( imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ) ); // q - 5 realBuffer_fx[k] = cplx_aux_fx; + move32(); + move32(); } } } - timeBuffer_fx += L2 * 5; - timeBuffer_fx += h_cldfb->no_channels - h_cldfb->p_filter_length; + timeBuffer_fx += i_mult( L2, 5 ); + timeBuffer_fx += sub( h_cldfb->no_channels, h_cldfb->p_filter_length ); } /* update memory */ - if ( samplesToProcess > -1 ) + IF( GT_16( samplesToProcess, -1 ) ) { Copy32( buffer_fx + samplesToProcess, h_cldfb->cldfb_state_fx, offset ); } - else + ELSE { Copy32( buffer_fx + frameSize, h_cldfb->cldfb_state_fx, offset ); } @@ -959,7 +990,7 @@ void cldfbAnalysis_ts_fx_fixed_q( Word16 i, k; Word16 L2, M1, M2, M4; Word16 no_col = h_cldfb->no_col; - + move16(); Word32 r1_fx, r2_fx, rr12_fx, ir12_fx; Word32 i1_fx, i2_fx, ri12_fx, ii12_fx; Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX]; @@ -973,39 +1004,44 @@ void cldfbAnalysis_ts_fx_fixed_q( Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )]; Word16 offset, frameSize; - offset = h_cldfb->p_filter_length - h_cldfb->no_channels; - frameSize = h_cldfb->no_channels * h_cldfb->no_col; + offset = sub( h_cldfb->p_filter_length, h_cldfb->no_channels ); + frameSize = i_mult( h_cldfb->no_channels, h_cldfb->no_col ); /* prepare input buffer */ timeBuffer_fx = buffer_fx; Copy32( h_cldfb->cldfb_state_fx, timeBuffer_fx, offset ); h_cldfb->Q_cldfb_state = *q_cldfb; + move16(); - if ( samplesToProcess > -1 ) + IF( GT_16( samplesToProcess, -1 ) ) { Copy32( timeIn_fx, timeBuffer_fx + offset, samplesToProcess ); - set32_fx( timeBuffer_fx + offset + samplesToProcess, 0, ( frameSize - samplesToProcess ) ); + set32_fx( timeBuffer_fx + add( offset, samplesToProcess ), 0, sub( frameSize, samplesToProcess ) ); } - else + ELSE { Copy32( timeIn_fx, timeBuffer_fx + offset, frameSize ); } /* only process needed cols */ - if ( samplesToProcess > -1 ) + IF( GT_16( samplesToProcess, -1 ) ) { - no_col = min( no_col, ( samplesToProcess + h_cldfb->no_channels - 1 ) / h_cldfb->no_channels ); + no_col = min( no_col, idiv1616( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), h_cldfb->no_channels ) ); assert( no_col == 1 ); } M1 = h_cldfb->no_channels; - M2 = M1 >> 1; - M4 = M1 >> 2; - L2 = M1 << 1; + M2 = shr( M1, 1 ); + M4 = shr( M1, 2 ); + L2 = shl( M1, 1 ); + move16(); + move16(); + move16(); + move16(); - if ( M2 & 1 ) + if ( s_and( M2, 1 ) ) { - M4 += 1; + M4 = add( M4, 1 ); } rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx; // q = 29 @@ -1015,35 +1051,36 @@ void cldfbAnalysis_ts_fx_fixed_q( ptr_pf_fx = h_cldfb->p_filter; ptr_pf_sf = h_cldfb->p_filter_sf; + move16(); - for ( i = 0; i < no_col; i++ ) + FOR( i = 0; i < no_col; i++ ) { - for ( k = 0; k < M4; k++ ) + FOR( k = 0; k < M4; k++ ) { /* prototype filter */ - r1_fx = Msub_32_16( 0, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - - r2_fx = Msub_32_16( 0, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q - - i1_fx = Msub_32_16( 0, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q - - i2_fx = Msub_32_16( 0, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + r1_fx = Msub_32_16( 0, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // q + + r2_fx = Msub_32_16( 0, timeBuffer_fx[add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( add( sub( L2, M2 ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // q + + i1_fx = Msub_32_16( 0, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // q + + i2_fx = Msub_32_16( 0, timeBuffer_fx[add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, i_mult( 3, M2 ) ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // q r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 @@ -1054,43 +1091,47 @@ void cldfbAnalysis_ts_fx_fixed_q( rr12_fx = L_sub( r1_fx, r2_fx ); // q -1 ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // q - 1 /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ - rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 - rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 + rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 + rBuffer_fx[add( 2 * k, 1 )] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 + move32(); + move32(); ///* folding + pre modulation of DCT IV */ ir12_fx = L_add( r1_fx, r2_fx ); // q - 1 ii12_fx = L_sub( i1_fx, i2_fx ); // q - 1 /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ - iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 - iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 + iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 + iBuffer_fx[add( 2 * k, 1 )] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 + move32(); + move32(); } - for ( k = M4; k < M2; k++ ) + FOR( k = M4; k < M2; k++ ) { /* prototype filter */ - r1_fx = Msub_32_16( 0, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q - r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - - r2_fx = Msub_32_16( 0, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q - r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q - - i1_fx = Msub_32_16( 0, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q - i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - - i2_fx = Msub_32_16( 0, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q - i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + r1_fx = Msub_32_16( 0, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // q + r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( sub( sub( sub( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // q + + r2_fx = Msub_32_16( 0, timeBuffer_fx[add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // q + r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 5, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // q + + i1_fx = Msub_32_16( 0, timeBuffer_fx[add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // q + i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( sub( sub( add( L2, M2 ), 1 ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // q + + i2_fx = Msub_32_16( 0, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 0, L2 ) ) )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 1, L2 ) ) )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 2, L2 ) ) )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 3, L2 ) ) )] ); // q + i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) )], ptr_pf_fx[( add( add( sub( L2, i_mult( 3, M2 ) ), shl( k, 1 ) ), i_mult( 4, L2 ) ) )] ); // q r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 @@ -1101,50 +1142,60 @@ void cldfbAnalysis_ts_fx_fixed_q( rr12_fx = L_add( r1_fx, r2_fx ); // q - 1 ri12_fx = L_sub( i1_fx, i2_fx ); // q - 1 /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ - rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 - rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 + rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 + rBuffer_fx[add( 2 * k, 1 )] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 + move32(); + move32(); /* folding + pre modulation of DCT IV */ ir12_fx = L_sub( r1_fx, r2_fx ); // q - 1 ii12_fx = L_add( i1_fx, i2_fx ); // q - 1 /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ - iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 - iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 + iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 + iBuffer_fx[add( 2 * k, 1 )] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 + move32(); + move32(); } *q_cldfb = sub( *q_cldfb, 3 ); + move16(); /* FFT of DST IV */ fft_cldfb_fx( rBuffer_fx, M2 ); /* post modulation of DST IV */ - for ( k = 0; k < M2; k++ ) + FOR( k = 0; k < M2; k++ ) { /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ - realBuffer_fx[M1 - 1 - ( 2 * k )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5 - realBuffer_fx[2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5 + realBuffer_fx[sub( sub( M1, 1 ), shl( k, 1 ) )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[add( 2 * k, 1 )], rot_vctr_im_fx[k] ); // q - 5 + realBuffer_fx[2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[add( 2 * k, 1 )], rot_vctr_re_fx[k] ); // q - 5 + move32(); + move32(); } *q_cldfb = sub( *q_cldfb, 2 ); + move16(); /* FFT of DCT IV */ fft_cldfb_fx( iBuffer_fx, M2 ); /* post modulation of DCT IV */ - for ( k = 0; k < M2; k++ ) + FOR( k = 0; k < M2; k++ ) { /* do it inplace */ /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ - imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5 - imagBuffer_fx[M1 - 1 - ( 2 * k )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5 + imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[add( 2 * k, 1 )], rot_vctr_im_fx[k] ); // q - 5 + imagBuffer_fx[sub( sub( M1, 1 ), shl( k, 1 ) )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[add( 2 * k, 1 )], rot_vctr_re_fx[k] ); // q - 5 + move32(); + move32(); } - if ( h_cldfb->prototype == CLDFB_PROTOTYPE_5_00MS ) + IF( EQ_32( h_cldfb->prototype, CLDFB_PROTOTYPE_5_00MS ) ) { /* rotation due to delay*/ /*if(h_cldfb->da != M1)*/ - if ( rot_vctr_delay_re_fx != NULL ) + IF( rot_vctr_delay_re_fx != NULL ) { - for ( k = 0; k < M1; k++ ) + FOR( k = 0; k < M1; k++ ) { Word32 cplx_aux_fx; /* delay */ @@ -1157,20 +1208,22 @@ void cldfbAnalysis_ts_fx_fixed_q( cplx_aux_fx = Msub_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ); // q - 5 imagBuffer_fx[k] = Madd_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ); // q - 5 realBuffer_fx[k] = cplx_aux_fx; + move32(); + move32(); } } } - timeBuffer_fx += L2 * 5; - timeBuffer_fx += h_cldfb->no_channels - h_cldfb->p_filter_length; + timeBuffer_fx += i_mult( L2, 5 ); + timeBuffer_fx += sub( h_cldfb->no_channels, h_cldfb->p_filter_length ); } /* update memory */ - if ( samplesToProcess > -1 ) + IF( GT_16( samplesToProcess, -1 ) ) { Copy32( buffer_fx + samplesToProcess, h_cldfb->cldfb_state_fx, offset ); } - else + ELSE { Copy32( buffer_fx + frameSize, h_cldfb->cldfb_state_fx, offset ); } @@ -1412,7 +1465,7 @@ void cldfbSynthesis_ivas_fx( /* only process needed cols */ IF( GT_16( samplesToProcess, -1 ) ) { - no_col = min( no_col, ( samplesToProcess + h_cldfb->no_channels - 1 ) / h_cldfb->no_channels ); + no_col = min( no_col, idiv1616( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), h_cldfb->no_channels ) ); move16(); } @@ -1423,7 +1476,7 @@ void cldfbSynthesis_ivas_fx( rot_vctr_delay_im_fx = h_cldfb->rot_vec_syn_delay_im_fx; synthesisBuffer_fx = buffer_fx; - Copy32( h_cldfb->cldfb_state_fx, synthesisBuffer_fx + ( M1 * no_col ), h_cldfb->p_filter_length ); + Copy32( h_cldfb->cldfb_state_fx, synthesisBuffer_fx + i_mult( M1, no_col ), h_cldfb->p_filter_length ); p_filter = h_cldfb->p_filter; p_filter_sf = h_cldfb->p_filter_sf; @@ -1431,7 +1484,7 @@ void cldfbSynthesis_ivas_fx( ptr_time_out_fx = timeOut_fx; /*synthesisBuffer += M1 * h_cldfb->no_col;*/ - synthesisBuffer_fx += M1 * no_col; + synthesisBuffer_fx += i_mult( M1, no_col ); FOR( k = 0; k < no_col; k++ ) { @@ -1461,9 +1514,9 @@ void cldfbSynthesis_ivas_fx( } FOR( i = Mz; i < M1; i++ ) { - realBuffer_fx[k][i] = L_deposit_l( 0 ); + realBuffer_fx[k][i] = 0; move32(); - imagBuffer_fx[k][i] = L_deposit_l( 0 ); + imagBuffer_fx[k][i] = 0; move32(); } @@ -1471,16 +1524,16 @@ void cldfbSynthesis_ivas_fx( { /* pre modulation of DST IV */ /*cplxMult(&rBuffer[2*i], &rBuffer[2*i+1], realBuffer[k][2*i], realBuffer[k][M1-1-2*i], rot_vctr_re[i], rot_vctr_im[i]);*/ - rBuffer_fx[2 * i] = Msub_32_32( Mpy_32_32( realBuffer_fx[k][2 * i], rot_vctr_re_fx[i] ), realBuffer_fx[k][M1 - 1 - 2 * i], rot_vctr_im_fx[i] ); // Qx + rBuffer_fx[2 * i] = Msub_32_32( Mpy_32_32( realBuffer_fx[k][2 * i], rot_vctr_re_fx[i] ), realBuffer_fx[k][sub( sub( M1, 1 ), shl( i, 1 ) )], rot_vctr_im_fx[i] ); // Qx move32(); - rBuffer_fx[2 * i + 1] = Madd_32_32( Mpy_32_32( realBuffer_fx[k][2 * i], rot_vctr_im_fx[i] ), realBuffer_fx[k][M1 - 1 - 2 * i], rot_vctr_re_fx[i] ); // Qx + rBuffer_fx[add( 2 * i, 1 )] = Madd_32_32( Mpy_32_32( realBuffer_fx[k][2 * i], rot_vctr_im_fx[i] ), realBuffer_fx[k][sub( sub( M1, 1 ), shl( i, 1 ) )], rot_vctr_re_fx[i] ); // Qx move32(); /* pre modulation of DCT IV */ /*cplxMult(&iBuffer[2*i], &iBuffer[2*i+1],-imagBuffer[k][2*i], imagBuffer[k][M1-1-2*i], rot_vctr_re[i], rot_vctr_im[i]);*/ - iBuffer_fx[2 * i] = Msub_32_32( Mpy_32_32( ( L_negate( imagBuffer_fx[k][2 * i] ) ), rot_vctr_re_fx[i] ), imagBuffer_fx[k][M1 - 1 - 2 * i], rot_vctr_im_fx[i] ); // Qx + iBuffer_fx[2 * i] = Msub_32_32( Mpy_32_32( ( L_negate( imagBuffer_fx[k][2 * i] ) ), rot_vctr_re_fx[i] ), imagBuffer_fx[k][sub( sub( M1, 1 ), shl( i, 1 ) )], rot_vctr_im_fx[i] ); // Qx move32(); - iBuffer_fx[2 * i + 1] = Madd_32_32( Mpy_32_32( ( L_negate( imagBuffer_fx[k][2 * i] ) ), rot_vctr_im_fx[i] ), imagBuffer_fx[k][M1 - 1 - 2 * i], rot_vctr_re_fx[i] ); // Qx + iBuffer_fx[add( 2 * i, 1 )] = Madd_32_32( Mpy_32_32( ( L_negate( imagBuffer_fx[k][2 * i] ) ), rot_vctr_im_fx[i] ), imagBuffer_fx[k][sub( sub( M1, 1 ), shl( i, 1 ) )], rot_vctr_re_fx[i] ); // Qx move32(); } @@ -1494,69 +1547,69 @@ void cldfbSynthesis_ivas_fx( FOR( i = 0; i < M41; i++ ) { /* post modulation of DST IV */ - rr12_fx = Msub_32_32( Mpy_32_32( rBuffer_fx[M1 - 2 - 2 * i], rot_vctr_re_fx[M2 - 1 - i] ), rBuffer_fx[M1 - 1 - 2 * i], rot_vctr_im_fx[M2 - 1 - i] ); // Qx - ri12_fx = Madd_32_32( Mpy_32_32( rBuffer_fx[M1 - 2 - 2 * i], rot_vctr_im_fx[M2 - 1 - i] ), rBuffer_fx[M1 - 1 - 2 * i], rot_vctr_re_fx[M2 - 1 - i] ); // Qx + rr12_fx = Msub_32_32( Mpy_32_32( rBuffer_fx[sub( sub( M1, 2 ), shl( i, 1 ) )], rot_vctr_re_fx[sub( sub( M2, 1 ), i )] ), rBuffer_fx[sub( sub( M1, 1 ), shl( i, 1 ) )], rot_vctr_im_fx[sub( sub( M2, 1 ), i )] ); // Qx + ri12_fx = Madd_32_32( Mpy_32_32( rBuffer_fx[sub( sub( M1, 2 ), shl( i, 1 ) )], rot_vctr_im_fx[sub( sub( M2, 1 ), i )] ), rBuffer_fx[sub( sub( M1, 1 ), shl( i, 1 ) )], rot_vctr_re_fx[sub( sub( M2, 1 ), i )] ); // Qx /* post modulation of DCT IV */ - ir12_fx = Msub_32_32( Mpy_32_32( iBuffer_fx[M1 - 2 - 2 * i], rot_vctr_re_fx[M2 - 1 - i] ), iBuffer_fx[M1 - 1 - 2 * i], rot_vctr_im_fx[M2 - 1 - i] ); // Qx - ii12_fx = Madd_32_32( Mpy_32_32( iBuffer_fx[M1 - 2 - 2 * i], rot_vctr_im_fx[M2 - 1 - i] ), iBuffer_fx[M1 - 1 - 2 * i], rot_vctr_re_fx[M2 - 1 - i] ); // Qx + ir12_fx = Msub_32_32( Mpy_32_32( iBuffer_fx[sub( sub( M1, 2 ), shl( i, 1 ) )], rot_vctr_re_fx[sub( sub( M2, 1 ), i )] ), iBuffer_fx[sub( sub( M1, 1 ), shl( i, 1 ) )], rot_vctr_im_fx[sub( sub( M2, 1 ), i )] ); // Qx + ii12_fx = Madd_32_32( Mpy_32_32( iBuffer_fx[sub( sub( M1, 2 ), shl( i, 1 ) )], rot_vctr_im_fx[sub( sub( M2, 1 ), i )] ), iBuffer_fx[sub( sub( M1, 1 ), shl( i, 1 ) )], rot_vctr_re_fx[sub( sub( M2, 1 ), i )] ); // Qx - new_samples_fx[M1 + M2 + 1 + 2 * i] = L_negate( L_add( rr12_fx, ii12_fx ) ); // Qx + new_samples_fx[add( add( add( M1, M2 ), 1 ), shl( i, 1 ) )] = L_negate( L_add( rr12_fx, ii12_fx ) ); // Qx move32(); - new_samples_fx[M2 - 2 - 2 * i] = L_negate( L_add( ri12_fx, ir12_fx ) ); // Qx + new_samples_fx[sub( sub( M2, 2 ), shl( i, 1 ) )] = L_negate( L_add( ri12_fx, ir12_fx ) ); // Qx move32(); - new_samples_fx[M1 + M2 - 2 - 2 * i] = L_sub( rr12_fx, ii12_fx ); // Qx + new_samples_fx[sub( sub( add( M1, M2 ), 2 ), shl( i, 1 ) )] = L_sub( rr12_fx, ii12_fx ); // Qx move32(); - new_samples_fx[M2 + 1 + 2 * i] = L_sub( ir12_fx, ri12_fx ); // Qx + new_samples_fx[add( add( M2, 1 ), shl( i, 1 ) )] = L_sub( ir12_fx, ri12_fx ); // Qx move32(); } FOR( i = 0; i < M42; i++ ) { /* post modulation of DST IV */ - rr12_fx = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * i], rot_vctr_re_fx[i] ), rBuffer_fx[2 * i + 1], rot_vctr_im_fx[i] ); // Qx - ri12_fx = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * i], rot_vctr_im_fx[i] ), rBuffer_fx[2 * i + 1], rot_vctr_re_fx[i] ); // Qx + rr12_fx = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * i], rot_vctr_re_fx[i] ), rBuffer_fx[add( 2 * i, 1 )], rot_vctr_im_fx[i] ); // Qx + ri12_fx = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * i], rot_vctr_im_fx[i] ), rBuffer_fx[add( 2 * i, 1 )], rot_vctr_re_fx[i] ); // Qx /* post modulation of DCT IV */ - ir12_fx = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * i], rot_vctr_re_fx[i] ), iBuffer_fx[2 * i + 1], rot_vctr_im_fx[i] ); // Qx - ii12_fx = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * i], rot_vctr_im_fx[i] ), iBuffer_fx[2 * i + 1], rot_vctr_re_fx[i] ); // Qx + ir12_fx = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * i], rot_vctr_re_fx[i] ), iBuffer_fx[add( 2 * i, 1 )], rot_vctr_im_fx[i] ); // Qx + ii12_fx = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * i], rot_vctr_im_fx[i] ), iBuffer_fx[add( 2 * i, 1 )], rot_vctr_re_fx[i] ); // Qx - new_samples_fx[M1 + M2 + 2 * i] = L_add( ri12_fx, ir12_fx ); // Qx + new_samples_fx[add( add( M1, M2 ), shl( i, 1 ) )] = L_add( ri12_fx, ir12_fx ); // Qx move32(); - new_samples_fx[M2 - 1 - 2 * i] = L_add( rr12_fx, ii12_fx ); // Qx + new_samples_fx[sub( sub( M2, 1 ), shl( i, 1 ) )] = L_add( rr12_fx, ii12_fx ); // Qx move32(); - new_samples_fx[M1 + M2 - 1 - 2 * i] = L_sub( ir12_fx, ri12_fx ); // Qx + new_samples_fx[sub( sub( add( M1, M2 ), 1 ), shl( i, 1 ) )] = L_sub( ir12_fx, ri12_fx ); // Qx move32(); - new_samples_fx[M2 + 2 * i] = L_sub( rr12_fx, ii12_fx ); // Qx + new_samples_fx[add( M2, shl( i, 1 ) )] = L_sub( rr12_fx, ii12_fx ); // Qx move32(); } /* synthesis prototype filter */ FOR( i = 0; i < L2; i++ ) { - accu0 = Madd_32_16( synthesisBuffer_fx[0 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 0 * L2 + i )] ), p_filter_sf ); // Qx - 1 - accu1 = Madd_32_16( synthesisBuffer_fx[1 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 1 * L2 + i )] ), p_filter_sf ); // Qx - 1 - accu2 = Madd_32_16( synthesisBuffer_fx[2 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 2 * L2 + i )] ), p_filter_sf ); // Qx - 1 - accu3 = Madd_32_16( synthesisBuffer_fx[3 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 3 * L2 + i )] ), p_filter_sf ); // Qx - 1 - accu4 = Madd_32_16( synthesisBuffer_fx[4 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 4 * L2 + i )] ), p_filter_sf ); // Qx - 1 + accu0 = Madd_32_16( synthesisBuffer_fx[i], Mpy_32_16_1( new_samples_fx[sub( sub( L2, 1 ), i )], p_filter[i] ), p_filter_sf ); // Qx - 1 + accu1 = Madd_32_16( synthesisBuffer_fx[add( L2, i )], Mpy_32_16_1( new_samples_fx[sub( sub( L2, 1 ), i )], p_filter[add( L2, i )] ), p_filter_sf ); // Qx - 1 + accu2 = Madd_32_16( synthesisBuffer_fx[add( i_mult( 2, L2 ), i )], Mpy_32_16_1( new_samples_fx[sub( sub( L2, 1 ), i )], p_filter[add( i_mult( 2, L2 ), i )] ), p_filter_sf ); // Qx - 1 + accu3 = Madd_32_16( synthesisBuffer_fx[add( i_mult( 3, L2 ), i )], Mpy_32_16_1( new_samples_fx[sub( sub( L2, 1 ), i )], p_filter[add( i_mult( 3, L2 ), i )] ), p_filter_sf ); // Qx - 1 + accu4 = Madd_32_16( synthesisBuffer_fx[add( i_mult( 4, L2 ), i )], Mpy_32_16_1( new_samples_fx[sub( sub( L2, 1 ), i )], p_filter[add( i_mult( 4, L2 ), i )] ), p_filter_sf ); // Qx - 1 - synthesisBuffer_fx[0 * L2 + i] = accu0; + synthesisBuffer_fx[i] = accu0; move32(); - synthesisBuffer_fx[1 * L2 + i] = accu1; + synthesisBuffer_fx[add( L2, i )] = accu1; move32(); - synthesisBuffer_fx[2 * L2 + i] = accu2; + synthesisBuffer_fx[add( i_mult( 2, L2 ), i )] = accu2; move32(); - synthesisBuffer_fx[3 * L2 + i] = accu3; + synthesisBuffer_fx[add( i_mult( 3, L2 ), i )] = accu3; move32(); - synthesisBuffer_fx[4 * L2 + i] = accu4; + synthesisBuffer_fx[add( i_mult( 4, L2 ), i )] = accu4; move32(); } FOR( i = 0; i < M1; i++ ) { - ptr_time_out_fx[M1 - 1 - i] = synthesisBuffer_fx[4 * L2 + M1 + i]; + ptr_time_out_fx[sub( sub( M1, 1 ), i )] = synthesisBuffer_fx[add( i_mult( 4, L2 ), add( M1, i ) )]; move32(); } @@ -1627,18 +1680,23 @@ void configureCldfb_ivas_fx( { h_cldfb->no_col = CLDFB_NO_COL_MAX; + move16(); h_cldfb->bandsToZero = 0; + move16(); h_cldfb->nab = 0; + move16(); // h_cldfb->no_channels = (int16_t) ( sampling_rate * INV_CLDFB_BANDWIDTH + 0.5f ); - Word32 n_sampling_rate = sampling_rate * 2; - Word32 val = L_add( Mpy_32_16_1( n_sampling_rate, 41 /* INV_CLDFB_BANDWIDTH in Q15 */ ), 1 ); - val = L_shr( val, 1 ); - h_cldfb->no_channels = extract_l( val ); + h_cldfb->no_channels = extract_l( Mpy_32_32_r( sampling_rate, INV_CLDFB_BANDWIDTH_Q31 ) ); + move16(); h_cldfb->zeros = 0; + move16(); h_cldfb->anaScalefactor = 0; + move16(); h_cldfb->synScalefactor = 0; - h_cldfb->p_filter_length = 10 * h_cldfb->no_channels; + move16(); + h_cldfb->p_filter_length = i_mult( 10, h_cldfb->no_channels ); + move16(); cldfb_init_proto_and_twiddles( h_cldfb ); @@ -1699,12 +1757,12 @@ ivas_error openCldfb_ivas_fx( hs->Q_cldfb_state = Q11; /* TODO: remove the floating point dependency */ - IF( ( hs->cldfb_state = (float *) malloc( buf_len * sizeof( float ) ) ) == NULL ) + /*IF( ( hs->cldfb_state = (float *) malloc( buf_len * sizeof( float ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); - } + }*/ - set_f( hs->cldfb_state, 0.0f, buf_len ); + // set_f( hs->cldfb_state, 0.0f, buf_len ); *h_cldfb = hs; move16(); @@ -1731,6 +1789,7 @@ ivas_error openCldfb_ivas( hs->prototype = prototype; configureCldfb_ivas( hs, sampling_rate ); + hs->memory_flt = NULL; hs->memory_length = 0; @@ -1754,9 +1813,12 @@ ivas_error openCldfb_ivas( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); } hs->cldfb_state_length = buf_len; // Temporarily added to store the length of buffer - hs->cldfb_size = buf_len; /*for having original size at intermediatery conversion, will be removed on removing conversion*/ + move16(); + hs->cldfb_size = buf_len; /*for having original size at intermediatery conversion, will be removed on removing conversion*/ + move16(); set32_fx( hs->cldfb_state_fx, 0, buf_len ); hs->Q_cldfb_state = Q11; + move16(); #endif // IVAS_FLOAT_FIXED @@ -1858,7 +1920,9 @@ ivas_error openCldfb_ivas_enc( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); } hs->cldfb_state_length = buf_len; // Temporarily added to store the length of buffer - hs->cldfb_size = buf_len; /*for having original size at intermediatery conversion, will be removed on removing conversion*/ + move16(); + hs->cldfb_size = buf_len; /*for having original size at intermediatery conversion, will be removed on removing conversion*/ + move16(); set32_fx( hs->cldfb_state_fx, 0, buf_len ); set16_fx( hs->FilterStates, 0, i_mult( 9 + 16, hs->no_channels ) ); set16_fx( hs->FilterStates_e, 0, sizeof( hs->FilterStates_e ) / sizeof( hs->FilterStates_e[0] ) ); @@ -1875,7 +1939,7 @@ ivas_error openCldfb_ivas_enc( * * Change sample rate of filter bank *--------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void resampleCldfb_ivas( HANDLE_CLDFB_FILTER_BANK hs, /* i/o: filter bank handle */ const int32_t newSamplerate ) @@ -1895,7 +1959,7 @@ void resampleCldfb_ivas( return; } -#ifdef IVAS_FLOAT_FIXED +#else void resampleCldfb_ivas_fx( HANDLE_CLDFB_FILTER_BANK hs, /* i/o: filter bank handle */ const Word32 newSamplerate ) @@ -2073,6 +2137,7 @@ void deleteCldfb_ivas( { HANDLE_CLDFB_FILTER_BANK hs = *h_cldfb; + test(); IF( h_cldfb == NULL || *h_cldfb == NULL ) { return; @@ -2083,7 +2148,7 @@ void deleteCldfb_ivas( free( hs->cldfb_state ); } #ifdef IVAS_FLOAT_FIXED - if ( hs->cldfb_state_fx ) + IF( hs->cldfb_state_fx ) { free( hs->cldfb_state_fx ); } @@ -2117,10 +2182,10 @@ void deleteCldfb_ivas_fx( free( hs->cldfb_state_fx ); } #ifdef IVAS_FLOAT_FIXED // TODO : Will be removed later - IF( hs->cldfb_state ) - { - free( hs->cldfb_state ); - } + // IF( hs->cldfb_state ) + //{ + // free( hs->cldfb_state ); + // } #endif free( hs ); @@ -2941,7 +3006,7 @@ ivas_error cldfb_save_memory_ivas_fx( { UWord16 offset = sub( hs->p_filter_length, hs->no_channels ); - IF( hs->memory_flt != NULL || NE_16( hs->memory_length, 0 ) ) + IF( hs->memory_flt != NULL || ( hs->memory_length != 0 ) ) { /* memory already stored; Free memory first */ return IVAS_ERR_OK; @@ -2972,8 +3037,7 @@ ivas_error cldfb_save_memory_ivas_fx( return IVAS_ERR_OK; } -#endif // IVAS_FLOAT_FIXED - +#else ivas_error cldfb_save_memory_ivas( HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ ) @@ -3005,7 +3069,7 @@ ivas_error cldfb_save_memory_ivas( return IVAS_ERR_OK; } - +#endif /*-------------------------------------------------------------------* * cldfb_restore_memory_ivas() @@ -3019,13 +3083,14 @@ void cldfb_restore_memory_ivas_fx( { UWord16 offset = sub( hs->p_filter_length, hs->no_channels ); UWord16 size; + test(); IF( hs->memory_flt == NULL || EQ_16( hs->memory_length, 0 ) ) { /* memory not allocated */ return; } - IF( EQ_16( hs->type, CLDFB_ANALYSIS ) ) + IF( hs->type == CLDFB_ANALYSIS ) { size = offset; move16(); @@ -3045,7 +3110,9 @@ void cldfb_restore_memory_ivas_fx( L_lerp_fx_q11( hs->cldfb_state_fx, hs->cldfb_state_fx, size, hs->memory_length ); } hs->cldfb_state_length = size; + move16(); hs->memory_length = 0; + move16(); #if 1 // Remove later free( hs->memory_flt ); hs->memory_flt = NULL; @@ -3055,8 +3122,7 @@ void cldfb_restore_memory_ivas_fx( return; } -#endif // IVAS_FLOAT_FIXED - +#else void cldfb_restore_memory_ivas( HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ ) @@ -3094,7 +3160,7 @@ void cldfb_restore_memory_ivas( return; } - +#endif /*-------------------------------------------------------------------* * cldfb_reset_memory_ivas() @@ -3134,16 +3200,20 @@ void cldfb_reset_memory_fx( IF( hs->type == CLDFB_ANALYSIS ) { memory_length = offset; + move16(); } ELSE { memory_length = hs->p_filter_length; + move16(); } hs->cldfb_state_length = memory_length; + move16(); /* save the memory */ set32_fx( hs->cldfb_state_fx, 0, memory_length ); hs->Q_cldfb_state = Q11; + move16(); return; } diff --git a/lib_com/cldfb_evs.c b/lib_com/cldfb_evs.c index 2a27fbb24..bad77d7f1 100644 --- a/lib_com/cldfb_evs.c +++ b/lib_com/cldfb_evs.c @@ -229,19 +229,21 @@ static void calcModulation( Word32 *rYR, { cmplx CL_x, CL_z; cmplx_s C_c; - int i; - int lc = m >> 1; + Word32 i; + Word32 lc = L_shr( m, 1 ); const Word16 *cr = rRotVctr; const Word16 *ci = iRotVctr; - for ( i = 0; i < lc; i++ ) + FOR( i = 0; i < lc; i++ ) { CL_x = CL_form( *rXR, *rXI ); C_c = C_form( *cr, *ci ); CL_z = CL_mult_32x16( CL_x, C_c ); *rYR = CL_Extract_real( CL_z ); + move64(); *rYI = CL_Extract_imag( CL_z ); + move64(); rYR += srYR; rYI += srYI; rXR += srXR; @@ -250,7 +252,9 @@ static void calcModulation( Word32 *rYR, CL_x = CL_form( *iXR, *iXI ); CL_z = CL_mult_32x16( CL_x, C_c ); *iYR = CL_Extract_real( CL_z ); + move64(); *iYI = CL_Extract_imag( CL_z ); + move64(); iYR += siYR; iYI += siYI; iXR += siXR; @@ -297,14 +301,14 @@ static void calcModulationAndFolding( Word16 *rY, const Word16 *r11, *r12, *r21, *r22; - y11 = &rY[m + m2 + 1]; - y12 = &rY[m2 - 2]; - y13 = &rY[m + m2 - 2]; + y11 = &rY[add( add( m, m2 ), 1 )]; + y12 = &rY[sub( m2, 2 )]; + y13 = &rY[sub( add( m, m2 ), 2 )]; y14 = &rY[m2 + 1]; - y21 = &rY[m + m2]; + y21 = &rY[add( m, m2 )]; y22 = &rY[m2 - 1]; - y23 = &rY[m + m2 - 1]; + y23 = &rY[sub( add( m, m2 ), 1 )]; y24 = &rY[m2]; x11 = &rX[m - 2]; @@ -415,6 +419,7 @@ void cldfbAnalysisFiltering( HANDLE_CLDFB_FILTER_BANK cldfbBank, stride = 1; /* constant */ + move16(); m = cldfbBank->no_channels; move16(); L2 = shl( m, 1 ); @@ -446,12 +451,12 @@ void cldfbAnalysisFiltering( HANDLE_CLDFB_FILTER_BANK cldfbBank, p_stride = CLDFB_NO_POLY; pFilter = &cldfbBank->p_filter[p_stride - CLDFB_NO_POLY]; - pFilter1 = &pFilter[p_stride * L3M1]; - pFilter2 = &pFilter[p_stride * L3]; - pFilter3 = &pFilter[p_stride * m2]; - pFilter4 = &pFilter[p_stride * M2M1]; - pFilter5 = &pFilter[p_stride * L4M1]; - pFilter6 = &pFilter[p_stride * M0M2]; + pFilter1 = &pFilter[i_mult( p_stride, L3M1 )]; + pFilter2 = &pFilter[i_mult( p_stride, L3 )]; + pFilter3 = &pFilter[i_mult( p_stride, m2 )]; + pFilter4 = &pFilter[i_mult( p_stride, M2M1 )]; + pFilter5 = &pFilter[i_mult( p_stride, L4M1 )]; + pFilter6 = &pFilter[i_mult( p_stride, M0M2 )]; nSamples = i_mult( nTimeSlots, cldfbBank->no_channels ); nSamplesUpd = i_mult( cldfbBank->no_col, cldfbBank->no_channels ); @@ -464,7 +469,7 @@ void cldfbAnalysisFiltering( HANDLE_CLDFB_FILTER_BANK cldfbBank, move16(); FOR( i = 0; i < offset; i += cldfbBank->no_channels ) { - cldfbBank->FilterStates_e[k] = cldfbBank->FilterStates_e[k + cldfbBank->no_col]; + cldfbBank->FilterStates_e[k] = cldfbBank->FilterStates_e[add( k, cldfbBank->no_col )]; move16(); assert( (size_t) k < sizeof( cldfbBank->FilterStates_e ) / sizeof( cldfbBank->FilterStates_e[0] ) ); scale = s_max( scale, cldfbBank->FilterStates_e[k] ); @@ -516,80 +521,80 @@ void cldfbAnalysisFiltering( HANDLE_CLDFB_FILTER_BANK cldfbBank, FOR( i = 0; i < M4; i++ ) { /* prototype filter */ - r1 = L_msu0( 0, pFilter1[0 - p_stride * 2 * i], pStates1[0 * L2 - 2 * i] ); - r1 = L_msu0( r1, pFilter1[1 - p_stride * 2 * i], pStates1[1 * L2 - 2 * i] ); - r1 = L_msu0( r1, pFilter1[2 - p_stride * 2 * i], pStates1[2 * L2 - 2 * i] ); - r1 = L_msu0( r1, pFilter1[3 - p_stride * 2 * i], pStates1[3 * L2 - 2 * i] ); - r1 = L_msu0( r1, pFilter1[4 - p_stride * 2 * i], pStates1[4 * L2 - 2 * i] ); - - r2 = L_msu0( 0, pFilter2[0 + p_stride * 2 * i], pStates2[0 * L2 + 2 * i] ); - r2 = L_msu0( r2, pFilter2[1 + p_stride * 2 * i], pStates2[1 * L2 + 2 * i] ); - r2 = L_msu0( r2, pFilter2[2 + p_stride * 2 * i], pStates2[2 * L2 + 2 * i] ); - r2 = L_msu0( r2, pFilter2[3 + p_stride * 2 * i], pStates2[3 * L2 + 2 * i] ); - r2 = L_msu0( r2, pFilter2[4 + p_stride * 2 * i], pStates2[4 * L2 + 2 * i] ); - - i1 = L_msu0( 0, pFilter3[0 + p_stride * 2 * i], pStates3[0 * L2 + 2 * i] ); - i1 = L_msu0( i1, pFilter3[1 + p_stride * 2 * i], pStates3[1 * L2 + 2 * i] ); - i1 = L_msu0( i1, pFilter3[2 + p_stride * 2 * i], pStates3[2 * L2 + 2 * i] ); - i1 = L_msu0( i1, pFilter3[3 + p_stride * 2 * i], pStates3[3 * L2 + 2 * i] ); - i1 = L_msu0( i1, pFilter3[4 + p_stride * 2 * i], pStates3[4 * L2 + 2 * i] ); - - i2 = L_msu0( 0, pFilter4[0 - p_stride * 2 * i], pStates4[0 * L2 - 2 * i] ); - i2 = L_msu0( i2, pFilter4[1 - p_stride * 2 * i], pStates4[1 * L2 - 2 * i] ); - i2 = L_msu0( i2, pFilter4[2 - p_stride * 2 * i], pStates4[2 * L2 - 2 * i] ); - i2 = L_msu0( i2, pFilter4[3 - p_stride * 2 * i], pStates4[3 * L2 - 2 * i] ); - i2 = L_msu0( i2, pFilter4[4 - p_stride * 2 * i], pStates4[4 * L2 - 2 * i] ); + r1 = L_msu0( 0, pFilter1[sub( 0, i_mult( p_stride, shl( i, 1 ) ) )], pStates1[sub( i_mult( 0, L2 ), shl( i, 1 ) )] ); + r1 = L_msu0( r1, pFilter1[sub( 1, i_mult( p_stride, shl( i, 1 ) ) )], pStates1[sub( i_mult( 1, L2 ), shl( i, 1 ) )] ); + r1 = L_msu0( r1, pFilter1[sub( 2, i_mult( p_stride, shl( i, 1 ) ) )], pStates1[sub( i_mult( 2, L2 ), shl( i, 1 ) )] ); + r1 = L_msu0( r1, pFilter1[sub( 3, i_mult( p_stride, shl( i, 1 ) ) )], pStates1[sub( i_mult( 3, L2 ), shl( i, 1 ) )] ); + r1 = L_msu0( r1, pFilter1[sub( 4, i_mult( p_stride, shl( i, 1 ) ) )], pStates1[sub( i_mult( 4, L2 ), shl( i, 1 ) )] ); + + r2 = L_msu0( 0, pFilter2[add( 0, i_mult( p_stride, shl( i, 1 ) ) )], pStates2[add( i_mult( 0, L2 ), shl( i, 1 ) )] ); + r2 = L_msu0( r2, pFilter2[add( 1, i_mult( p_stride, shl( i, 1 ) ) )], pStates2[add( i_mult( 1, L2 ), shl( i, 1 ) )] ); + r2 = L_msu0( r2, pFilter2[add( 2, i_mult( p_stride, shl( i, 1 ) ) )], pStates2[add( i_mult( 2, L2 ), shl( i, 1 ) )] ); + r2 = L_msu0( r2, pFilter2[add( 3, i_mult( p_stride, shl( i, 1 ) ) )], pStates2[add( i_mult( 3, L2 ), shl( i, 1 ) )] ); + r2 = L_msu0( r2, pFilter2[add( 4, i_mult( p_stride, shl( i, 1 ) ) )], pStates2[add( i_mult( 4, L2 ), shl( i, 1 ) )] ); + + i1 = L_msu0( 0, pFilter3[add( 0, i_mult( p_stride, shl( i, 1 ) ) )], pStates3[add( i_mult( 0, L2 ), shl( i, 1 ) )] ); + i1 = L_msu0( i1, pFilter3[add( 1, i_mult( p_stride, shl( i, 1 ) ) )], pStates3[add( i_mult( 1, L2 ), shl( i, 1 ) )] ); + i1 = L_msu0( i1, pFilter3[add( 2, i_mult( p_stride, shl( i, 1 ) ) )], pStates3[add( i_mult( 2, L2 ), shl( i, 1 ) )] ); + i1 = L_msu0( i1, pFilter3[add( 3, i_mult( p_stride, shl( i, 1 ) ) )], pStates3[add( i_mult( 3, L2 ), shl( i, 1 ) )] ); + i1 = L_msu0( i1, pFilter3[add( 4, i_mult( p_stride, shl( i, 1 ) ) )], pStates3[add( i_mult( 4, L2 ), shl( i, 1 ) )] ); + + i2 = L_msu0( 0, pFilter4[sub( 0, i_mult( p_stride, shl( i, 1 ) ) )], pStates4[sub( i_mult( 0, L2 ), shl( i, 1 ) )] ); + i2 = L_msu0( i2, pFilter4[sub( 1, i_mult( p_stride, shl( i, 1 ) ) )], pStates4[sub( i_mult( 1, L2 ), shl( i, 1 ) )] ); + i2 = L_msu0( i2, pFilter4[sub( 2, i_mult( p_stride, shl( i, 1 ) ) )], pStates4[sub( i_mult( 2, L2 ), shl( i, 1 ) )] ); + i2 = L_msu0( i2, pFilter4[sub( 3, i_mult( p_stride, shl( i, 1 ) ) )], pStates4[sub( i_mult( 3, L2 ), shl( i, 1 ) )] ); + i2 = L_msu0( i2, pFilter4[sub( 4, i_mult( p_stride, shl( i, 1 ) ) )], pStates4[sub( i_mult( 4, L2 ), shl( i, 1 ) )] ); /* folding */ rBuffer[2 * i] = L_sub( r1, r2 ); move32(); - rBuffer[2 * i + 1] = L_negate( L_add( i1, i2 ) ); + rBuffer[add( shl( i, 1 ), 1 )] = L_negate( L_add( i1, i2 ) ); move32(); /* folding */ iBuffer[2 * i] = L_add( r1, r2 ); move32(); - iBuffer[2 * i + 1] = L_sub( i1, i2 ); + iBuffer[add( shl( i, 1 ), 1 )] = L_sub( i1, i2 ); move32(); } FOR( i = M4; i < m2; i++ ) { /* prototype filter */ - r1 = L_msu0( 0, pFilter1[0 - p_stride * 2 * i], pStates1[0 * L2 - 2 * i] ); - r1 = L_msu0( r1, pFilter1[1 - p_stride * 2 * i], pStates1[1 * L2 - 2 * i] ); - r1 = L_msu0( r1, pFilter1[2 - p_stride * 2 * i], pStates1[2 * L2 - 2 * i] ); - r1 = L_msu0( r1, pFilter1[3 - p_stride * 2 * i], pStates1[3 * L2 - 2 * i] ); - r1 = L_msu0( r1, pFilter1[4 - p_stride * 2 * i], pStates1[4 * L2 - 2 * i] ); - - r2 = L_msu0( 0, pFilter6[0 + p_stride * 2 * i], pStates6[0 * L2 + 2 * i] ); - r2 = L_msu0( r2, pFilter6[1 + p_stride * 2 * i], pStates6[1 * L2 + 2 * i] ); - r2 = L_msu0( r2, pFilter6[2 + p_stride * 2 * i], pStates6[2 * L2 + 2 * i] ); - r2 = L_msu0( r2, pFilter6[3 + p_stride * 2 * i], pStates6[3 * L2 + 2 * i] ); - r2 = L_msu0( r2, pFilter6[4 + p_stride * 2 * i], pStates6[4 * L2 + 2 * i] ); - - i1 = L_msu0( 0, pFilter5[0 - p_stride * 2 * i], pStates5[0 * L2 - 2 * i] ); - i1 = L_msu0( i1, pFilter5[1 - p_stride * 2 * i], pStates5[1 * L2 - 2 * i] ); - i1 = L_msu0( i1, pFilter5[2 - p_stride * 2 * i], pStates5[2 * L2 - 2 * i] ); - i1 = L_msu0( i1, pFilter5[3 - p_stride * 2 * i], pStates5[3 * L2 - 2 * i] ); - i1 = L_msu0( i1, pFilter5[4 - p_stride * 2 * i], pStates5[4 * L2 - 2 * i] ); - - i2 = L_msu0( 0, pFilter3[0 + p_stride * 2 * i], pStates3[0 * L2 + 2 * i] ); - i2 = L_msu0( i2, pFilter3[1 + p_stride * 2 * i], pStates3[1 * L2 + 2 * i] ); - i2 = L_msu0( i2, pFilter3[2 + p_stride * 2 * i], pStates3[2 * L2 + 2 * i] ); - i2 = L_msu0( i2, pFilter3[3 + p_stride * 2 * i], pStates3[3 * L2 + 2 * i] ); - i2 = L_msu0( i2, pFilter3[4 + p_stride * 2 * i], pStates3[4 * L2 + 2 * i] ); + r1 = L_msu0( 0, pFilter1[sub( 0, i_mult( p_stride, shl( i, 1 ) ) )], pStates1[sub( i_mult( 0, L2 ), shl( i, 1 ) )] ); + r1 = L_msu0( r1, pFilter1[sub( 1, i_mult( p_stride, shl( i, 1 ) ) )], pStates1[sub( i_mult( 1, L2 ), shl( i, 1 ) )] ); + r1 = L_msu0( r1, pFilter1[sub( 2, i_mult( p_stride, shl( i, 1 ) ) )], pStates1[sub( i_mult( 2, L2 ), shl( i, 1 ) )] ); + r1 = L_msu0( r1, pFilter1[sub( 3, i_mult( p_stride, shl( i, 1 ) ) )], pStates1[sub( i_mult( 3, L2 ), shl( i, 1 ) )] ); + r1 = L_msu0( r1, pFilter1[sub( 4, i_mult( p_stride, shl( i, 1 ) ) )], pStates1[sub( i_mult( 4, L2 ), shl( i, 1 ) )] ); + + r2 = L_msu0( 0, pFilter6[add( 0, i_mult( p_stride, shl( i, 1 ) ) )], pStates6[add( i_mult( 0, L2 ), shl( i, 1 ) )] ); + r2 = L_msu0( r2, pFilter6[add( 1, i_mult( p_stride, shl( i, 1 ) ) )], pStates6[add( i_mult( 1, L2 ), shl( i, 1 ) )] ); + r2 = L_msu0( r2, pFilter6[add( 2, i_mult( p_stride, shl( i, 1 ) ) )], pStates6[add( i_mult( 2, L2 ), shl( i, 1 ) )] ); + r2 = L_msu0( r2, pFilter6[add( 3, i_mult( p_stride, shl( i, 1 ) ) )], pStates6[add( i_mult( 3, L2 ), shl( i, 1 ) )] ); + r2 = L_msu0( r2, pFilter6[add( 4, i_mult( p_stride, shl( i, 1 ) ) )], pStates6[add( i_mult( 4, L2 ), shl( i, 1 ) )] ); + + i1 = L_msu0( 0, pFilter5[sub( 0, i_mult( p_stride, shl( i, 1 ) ) )], pStates5[sub( i_mult( 0, L2 ), shl( i, 1 ) )] ); + i1 = L_msu0( i1, pFilter5[sub( 1, i_mult( p_stride, shl( i, 1 ) ) )], pStates5[sub( i_mult( 1, L2 ), shl( i, 1 ) )] ); + i1 = L_msu0( i1, pFilter5[sub( 2, i_mult( p_stride, shl( i, 1 ) ) )], pStates5[sub( i_mult( 2, L2 ), shl( i, 1 ) )] ); + i1 = L_msu0( i1, pFilter5[sub( 3, i_mult( p_stride, shl( i, 1 ) ) )], pStates5[sub( i_mult( 3, L2 ), shl( i, 1 ) )] ); + i1 = L_msu0( i1, pFilter5[sub( 4, i_mult( p_stride, shl( i, 1 ) ) )], pStates5[sub( i_mult( 4, L2 ), shl( i, 1 ) )] ); + + i2 = L_msu0( 0, pFilter3[add( 0, i_mult( p_stride, shl( i, 1 ) ) )], pStates3[add( i_mult( 0, L2 ), shl( i, 1 ) )] ); + i2 = L_msu0( i2, pFilter3[add( 1, i_mult( p_stride, shl( i, 1 ) ) )], pStates3[add( i_mult( 1, L2 ), shl( i, 1 ) )] ); + i2 = L_msu0( i2, pFilter3[add( 2, i_mult( p_stride, shl( i, 1 ) ) )], pStates3[add( i_mult( 2, L2 ), shl( i, 1 ) )] ); + i2 = L_msu0( i2, pFilter3[add( 3, i_mult( p_stride, shl( i, 1 ) ) )], pStates3[add( i_mult( 3, L2 ), shl( i, 1 ) )] ); + i2 = L_msu0( i2, pFilter3[add( 4, i_mult( p_stride, shl( i, 1 ) ) )], pStates3[add( i_mult( 4, L2 ), shl( i, 1 ) )] ); /* folding */ rBuffer[2 * i] = L_add( r1, r2 ); move32(); - rBuffer[2 * i + 1] = L_sub( i1, i2 ); + rBuffer[add( shl( i, 1 ), 1 )] = L_sub( i1, i2 ); move32(); /* folding */ iBuffer[2 * i] = L_sub( r1, r2 ); move32(); - iBuffer[2 * i + 1] = L_add( i1, i2 ); + iBuffer[add( shl( i, 1 ), 1 )] = L_add( i1, i2 ); move32(); } @@ -721,7 +726,7 @@ void cldfbSynthesisFiltering( HANDLE_CLDFB_FILTER_BANK cldfbBank, iBuffer = &pWorkBuffer[m]; nBuffer = (Word16 *) ( &pWorkBuffer[L2] ); - rAnalysisS = &pWorkBuffer[3 * m]; + rAnalysisS = &pWorkBuffer[i_mult( 3, m )]; iAnalysisS = &pWorkBuffer[4 * m]; rRotVctr = cldfbBank->rRotVctr; @@ -783,7 +788,9 @@ void cldfbSynthesisFiltering( HANDLE_CLDFB_FILTER_BANK cldfbBank, FOR( ; i < m; i += 2 ) { rAnalysisS[i] = L_deposit_l( 0 ); + move32(); iAnalysisS[i] = L_deposit_l( 0 ); + move32(); } } @@ -811,7 +818,9 @@ void cldfbSynthesisFiltering( HANDLE_CLDFB_FILTER_BANK cldfbBank, FOR( ; i < m; i += 2 ) { rAnalysisS[i] = L_deposit_l( 0 ); + move32(); iAnalysisS[i] = L_deposit_l( 0 ); + move32(); } } } @@ -836,14 +845,14 @@ void cldfbSynthesisFiltering( HANDLE_CLDFB_FILTER_BANK cldfbBank, calcModulationAndFolding( nBuffer, rBuffer, iBuffer, rRotVctr, iRotVctr, cldfbBank->synGain, scale, m, m2 ); /* prototype filter */ - pStates = &cldfbBank->FilterStates[k * L2]; + pStates = &cldfbBank->FilterStates[i_mult( k, L2 )]; pFilterS = &cldfbBank->p_filter[0]; pFilterM = &cldfbBank->p_filter[shr( cldfbBank->p_filter_length, 1 )]; FOR( i = 0; i < channels0; i++ ) { pStatesI = &pStates[i]; - pStatesR = &pStates[i + channels3]; + pStatesR = &pStates[add( i, channels3 )]; acc = L_mult( *pStatesI, *pFilterS++ ); acc = L_mac( acc, *pStatesR, *pFilterM++ ); @@ -865,21 +874,22 @@ void cldfbSynthesisFiltering( HANDLE_CLDFB_FILTER_BANK cldfbBank, pStatesI += channels4; acc = L_mac( acc, *pStatesI, *pFilterS++ ); - acc = L_mac( acc, nBuffer[channels1 - i], *pFilterM++ ); + acc = L_mac( acc, nBuffer[sub( channels1, i )], *pFilterM++ ); BASOP_SATURATE_WARNING_OFF_EVS #ifdef BASOP_NOGLOB - timeOut[( offset1 - i ) * stride] = round_fx_sat( L_shl_sat( acc, outScale ) ); + timeOut[i_mult( sub( offset1, i ), stride )] = round_fx_sat( L_shl_sat( acc, outScale ) ); #else timeOut[( offset1 - i ) * stride] = round_fx( L_shl( acc, outScale ) ); #endif BASOP_SATURATE_WARNING_ON_EVS + move16(); } FOR( ; i < cldfbBank->no_channels; i++ ) { - pStatesI = &pStates[i + channels2]; - pStatesR = &pStates[i + channels2 + channels3]; + pStatesI = &pStates[add( i, channels2 )]; + pStatesR = &pStates[add( add( i, channels2 ), channels3 )]; acc = L_mult( *pStatesI, *pFilterS++ ); acc = L_mac( acc, *pStatesR, *pFilterM++ ); @@ -904,22 +914,23 @@ void cldfbSynthesisFiltering( HANDLE_CLDFB_FILTER_BANK cldfbBank, BASOP_SATURATE_WARNING_OFF_EVS #ifdef BASOP_NOGLOB - timeOut[( offset2 - i ) * stride] = round_fx_sat( L_shl_sat( acc, outScale ) ); + timeOut[i_mult( sub( offset2, i ), stride )] = round_fx_sat( L_shl_sat( acc, outScale ) ); #else timeOut[( offset2 - i ) * stride] = round_fx( L_shl( acc, outScale ) ); #endif BASOP_SATURATE_WARNING_ON_EVS + move16(); } FOR( i = 0; i < cldfbBank->no_channels; i++ ) { - pStates[statesSizeM1 + i] = nBuffer[channels1 - i]; + pStates[add( statesSizeM1, i )] = nBuffer[sub( channels1, i )]; move16(); - pStates[statesSizeM2 + i] = nBuffer[channels1 + m - i]; + pStates[add( statesSizeM2, i )] = nBuffer[sub( add( channels1, m ), i )]; move16(); } - timeOut = &timeOut[m * stride]; + timeOut = &timeOut[i_mult( m, stride )]; } /* move filter states */ @@ -944,6 +955,7 @@ void configureCldfb( HANDLE_CLDFB_FILTER_BANK h_cldfb, /*!< Returns handle */ move16(); assert( h_cldfb->no_channels >= 10 ); h_cldfb->no_col = div_l( frameSize, shr( h_cldfb->no_channels, 1 ) ); + move16(); /* was cldfbInitFilterBank()*/ h_cldfb->anaScalefactor = 0; @@ -963,6 +975,7 @@ void configureCldfb( HANDLE_CLDFB_FILTER_BANK h_cldfb, /*!< Returns handle */ move16(); h_cldfb->flags = s_or( h_cldfb->flags, CLDFB_FLAG_2_5MS_SETUP ); + move16(); h_cldfb->filterScale = CLDFB_CLDFB80_PFT_SCALE; move16(); @@ -1004,7 +1017,7 @@ ivas_error openCldfb( HANDLE_CLDFB_FILTER_BANK hs; hs = (HANDLE_CLDFB_FILTER_BANK) count_malloc( sizeof( CLDFB_FILTER_BANK ) ); - if ( hs == NULL ) + IF( hs == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); } @@ -1047,7 +1060,7 @@ ivas_error openCldfb( move16(); } } - ELSE IF( hs->type == CLDFB_SYNTHESIS ) + ELSE IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) ) { IF( hs->FilterStates != 0 ) { @@ -1101,8 +1114,8 @@ void resampleCldfb( HANDLE_CLDFB_FILTER_BANK hs, IF( firstFrame == 0 ) { /*low complexity-resampling only stored previous samples that are needed for next frame modulation */ - lerp( hs->FilterStates + ( noChannelsOld * hs->no_col ), hs->FilterStates + ( noChannelsOld * hs->no_col ), timeOffset, timeOffsetOld ); - Copy( hs->FilterStates + ( noChannelsOld * hs->no_col ), hs->FilterStates + frameSize, timeOffset ); + lerp( hs->FilterStates + i_mult( noChannelsOld, hs->no_col ), hs->FilterStates + i_mult( noChannelsOld, hs->no_col ), timeOffset, timeOffsetOld ); + Copy( hs->FilterStates + i_mult( noChannelsOld, hs->no_col ), hs->FilterStates + frameSize, timeOffset ); } return; @@ -1158,6 +1171,8 @@ AnalysisPostSpectrumScaling_Fx( HANDLE_CLDFB_FILTER_BANK cldfbBank, /*!< Handle rSubband16[i][j] = round_fx( L_shl( rSubband32[i][j], headRoom ) ); iSubband16[i][j] = round_fx( L_shl( iSubband32[i][j], headRoom ) ); #endif + move32(); + move32(); } } @@ -1194,6 +1209,7 @@ void analysisCldfbEncoder_fx( Word16 *ppBuf_Imag16[CLDFB_NO_COL_MAX]; Word32 workBuffer[256]; Word16 num_slots = 1; + move16(); FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) { @@ -1271,6 +1287,7 @@ void GetEnergyCldfb( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) // Word16 freqTable[2] = {20, 40}; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif FOR( k = 0; k < numberCols; k++ ) @@ -1309,12 +1326,13 @@ void GetEnergyCldfb( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) FOR( j = 0; j < numberBands; j++ ) { energyValuesSum[j] = L_deposit_l( 0 ); + move32(); energyValuesSumE[j] = 31; move16(); FOR( k = 0; k < CLDFB_NO_COL_MAX; k++ ) { nrg = L_shr_r( energyValues[k][j], sub( energyValuesSumE[j], 31 ) ); - IF( L_sub( maxWord32, nrg ) < energyValuesSum[j] ) + IF( LT_32( L_sub( maxWord32, nrg ), energyValuesSum[j] ) ) { energyValuesSumE[j] = add( energyValuesSumE[j], 1 ); move16(); @@ -1326,9 +1344,10 @@ void GetEnergyCldfb( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) move32(); } test(); - IF( j == 0 || GT_16( energyValuesSumE[j], *energyValuesSum_Exp ) ) + if ( j == 0 || GT_16( energyValuesSumE[j], *energyValuesSum_Exp ) ) { *energyValuesSum_Exp = energyValuesSumE[j]; + move16(); } } FOR( j = 0; j < numberBands; j++ ) @@ -1418,6 +1437,7 @@ CLDFB_getNumChannels( Word32 sampleRate ) { Word16 nChannels = 0; + move16(); SWITCH( sampleRate ) @@ -1509,7 +1529,7 @@ cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle hs->p_filter = cldfb_protoFilter_2_5ms[0]; hs->scale = cldfb_scale_2_5ms[0]; move16(); - IF( hs->type == CLDFB_SYNTHESIS ) + IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) ) { hs->synScalefactor = add( cldfb_synScale[0], hs->filterScale ); move16(); @@ -1519,7 +1539,7 @@ cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle hs->anaScalefactor = add( cldfb_anaScale[0], hs->filterScale ); move16(); } - break; + BREAK; case 16: hs->rRotVctr = rRotVectr_16; @@ -1533,7 +1553,7 @@ cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle hs->anaScalefactor = add( cldfb_anaScale[1], hs->filterScale ); move16(); } - break; + BREAK; case 20: hs->rRotVctr = rRotVectr_20; @@ -1543,7 +1563,7 @@ cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle hs->p_filter = cldfb_protoFilter_2_5ms[2]; hs->scale = cldfb_scale_2_5ms[2]; move16(); - IF( hs->type == CLDFB_SYNTHESIS ) + IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) ) { hs->synScalefactor = add( cldfb_synScale[2], hs->filterScale ); move16(); @@ -1553,7 +1573,7 @@ cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle hs->anaScalefactor = add( cldfb_anaScale[2], hs->filterScale ); move16(); } - break; + BREAK; case 32: hs->rRotVctr = rRotVectr_32; @@ -1567,7 +1587,7 @@ cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle hs->anaScalefactor = add( cldfb_anaScale[3], hs->filterScale ); move16(); } - break; + BREAK; case 40: hs->rRotVctr = rRotVectr_40; @@ -1577,7 +1597,7 @@ cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle hs->p_filter = cldfb_protoFilter_2_5ms[4]; hs->scale = cldfb_scale_2_5ms[4]; move16(); - IF( hs->type == CLDFB_SYNTHESIS ) + IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) ) { hs->synScalefactor = add( cldfb_synScale[4], hs->filterScale ); move16(); @@ -1587,7 +1607,7 @@ cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle hs->anaScalefactor = add( cldfb_anaScale[4], hs->filterScale ); move16(); } - break; + BREAK; case 60: hs->rRotVctr = rRotVectr_60; @@ -1597,7 +1617,7 @@ cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle hs->p_filter = cldfb_protoFilter_2_5ms[5]; hs->scale = cldfb_scale_2_5ms[5]; move16(); - IF( hs->type == CLDFB_SYNTHESIS ) + IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) ) { hs->synScalefactor = add( cldfb_synScale[5], hs->filterScale ); move16(); @@ -1607,7 +1627,7 @@ cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle hs->anaScalefactor = add( cldfb_anaScale[5], hs->filterScale ); move16(); } - break; + BREAK; } } @@ -1623,7 +1643,7 @@ ivas_error cldfb_save_memory( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle */ { - if ( hs->memory != NULL || hs->memory_length != 0 ) + IF( hs->memory != NULL || hs->memory_length != 0 ) { /* memory already stored; Free memory first */ return IVAS_ERR_OK; @@ -1636,7 +1656,7 @@ cldfb_save_memory( HANDLE_CLDFB_FILTER_BANK hs ) /* i: cldfb handle */ Copy( hs->FilterStates_e, hs->memory + hs->memory_length, CLDFB_MEM_EXPONENTS ); hs->memory[hs->memory_length + CLDFB_MEM_EXPONENTS] = hs->FilterStates_eg; move16(); - if ( hs->memory == NULL ) + IF( hs->memory == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CLDFB\n" ); } diff --git a/lib_com/cng_exc_fx.c b/lib_com/cng_exc_fx.c index e2475bbad..b43b17448 100644 --- a/lib_com/cng_exc_fx.c +++ b/lib_com/cng_exc_fx.c @@ -85,7 +85,7 @@ void CNG_exc_fx( IF( *first_CNG == 0 ) { - IF( EQ_32( core_brate, FRAME_NO_DATA ) ) + IF( core_brate == FRAME_NO_DATA ) { /* needed only in decoder when the very first SID frame was erased and this frame is FRAME_NO_DATA frame */ /*fenew = dotp( fexc, fexc, pit_max )/pit_max;*/ @@ -101,7 +101,7 @@ void CNG_exc_fx( move32(); } - if ( EQ_16( element_mode, EVS_MONO ) ) + if ( element_mode == EVS_MONO ) { *lp_ener = *Enew; move32(); @@ -113,7 +113,7 @@ void CNG_exc_fx( *---------------------------------------------------------------------*/ test(); test(); - IF( NE_32( last_core_brate, SID_1k75 ) && NE_32( last_core_brate, FRAME_NO_DATA ) && NE_32( last_core_brate, SID_2k40 ) ) + IF( NE_32( last_core_brate, SID_1k75 ) && ( last_core_brate != FRAME_NO_DATA ) && NE_32( last_core_brate, SID_2k40 ) ) { /* Partially reset CNG energy after active speech period */ test(); @@ -170,7 +170,7 @@ if ( EQ_16( allow_cn_step, 1 ) ) move16(); } /* If not mono, skip CNG here */ -if ( GT_16( element_mode, IVAS_SCE ) ) +IF( GT_16( element_mode, IVAS_SCE ) ) { return; } @@ -233,9 +233,9 @@ FOR( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) FOR( i = 0; i < L_SUBFR; i++ ) { /* exc2[i] *= enr */ - L_tmp = L_mult( exc2[i_subfr + i], tmp ); /* Q-4 * Q_exc+19 -> Q_exc +16 */ + L_tmp = L_mult( exc2[add( i_subfr, i )], tmp ); /* Q-4 * Q_exc+19 -> Q_exc +16 */ #ifdef BASOP_NOGLOB - exc2[i_subfr + i] = round_fx_sat( L_shl_sat( L_tmp, exp ) ); + exc2[add( i_subfr, i )] = round_fx_sat( L_shl_sat( L_tmp, exp ) ); #else exc2[i_subfr + i] = round_fx( L_shl( L_tmp, exp ) ); #endif @@ -315,7 +315,7 @@ IF( NE_16( Opt_AMR_WB, 1 ) ) /* fft_rel(fft_io, L_FFT, LOG2_L_FFT); */ fft_rel_fx( fft_io, L_FFT, LOG2_L_FFT ); /* ??????? */ ptR = &fft_io[1]; - ptI = &fft_io[sub( L_FFT, 1 )]; + ptI = &fft_io[L_FFT - 1]; FOR( i = 0; i < NUM_ENV_CNG; i++ ) { /* env[i] = 2.0f*(*ptR * *ptR + *ptI * *ptI)/L_FFT; */ @@ -351,20 +351,23 @@ IF( NE_16( Opt_AMR_WB, 1 ) ) if ( denv[i] < 0 ) { - denv[i] = L_deposit_l( 0 ); + denv[i] = 0; + move32(); } } set32_fx( itmp, 0, NUM_ENV_CNG ); set16_fx( fft_io, 0, L_FFT ); ptR = &fft_io[1]; - ptI = &fft_io[sub( L_FFT, 1 )]; + ptI = &fft_io[L_FFT - 1]; FOR( i = 0; i < NUM_ENV_CNG; i++ ) { /* *ptR = own_random( cng_ener_seed1 ); */ /* *ptI = own_random( cng_ener_seed1 ); */ *ptR = Random( cng_ener_seed1 ); + move16(); *ptI = Random( cng_ener_seed1 ); + move16(); /* env[i] = 2.0f*(*ptR * *ptR + *ptI * *ptI)/L_FFT; */ L_tmp = L_mult0( *ptR, *ptR ); /* Q0 */ @@ -395,7 +398,7 @@ IF( NE_16( Opt_AMR_WB, 1 ) ) } } ptR = &fft_io[1]; - ptI = &fft_io[sub( L_FFT, 1 )]; + ptI = &fft_io[L_FFT - 1]; FOR( i = 0; i < NUM_ENV_CNG; i++ ) { /* *ptR *= sqrt(itmp[i]/env[i]); */ @@ -428,13 +431,14 @@ IF( NE_16( Opt_AMR_WB, 1 ) ) #else *ptR = extract_h( L_shl( L_tmp2, add( exp, Q_exc ) ) ); /*Q_exc*/ #endif + move16(); L_tmp2 = Mult_32_16( L_tmp, *ptI ); /*Q(16-exp)*/ #ifdef BASOP_NOGLOB *ptI = extract_h( L_shl_sat( L_tmp2, add( exp, Q_exc ) ) ); /*Q_exc*/ #else *ptI = extract_h( L_shl( L_tmp2, add( exp, Q_exc ) ) ); /*Q_exc*/ #endif - + move16(); ptR++; ptI--; } @@ -509,7 +513,7 @@ IF( NE_16( Opt_AMR_WB, 1 ) ) test(); test(); test(); - IF( NE_32( last_core_brate, SID_2k40 ) && NE_32( last_core_brate, SID_1k75 ) && NE_32( last_core_brate, FRAME_NO_DATA ) && EQ_32( core_brate, SID_2k40 ) ) + IF( NE_32( last_core_brate, SID_2k40 ) && NE_32( last_core_brate, SID_1k75 ) && ( last_core_brate != FRAME_NO_DATA ) && EQ_32( core_brate, SID_2k40 ) ) { #ifdef BASOP_NOGLOB IF( GT_32( L_tmp, L_shl_sat( 1, sub( 31, exp ) ) ) ) @@ -525,8 +529,9 @@ IF( NE_16( Opt_AMR_WB, 1 ) ) FOR( i = 0; i < L_SUBFR; i++ ) { /* fft_io[i] *= enr */ - L_tmp = L_mult( fft_io[i_subfr + i], tmp ); /* Q_exc + 16 - exp */ - fft_io[i_subfr + i] = round_fx( L_shl( L_tmp, exp ) ); /*Q_exc*/ + L_tmp = L_mult( fft_io[add( i_subfr, i )], tmp ); /* Q_exc + 16 - exp */ + fft_io[add( i_subfr, i )] = round_fx( L_shl( L_tmp, exp ) ); /*Q_exc*/ + move16(); } } @@ -674,6 +679,7 @@ void cng_params_postupd_fx( Word32 last_active_brate; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif ptr = add( sub( ho_circ_ptr, *cng_buf_cnt ), 1 ); @@ -686,7 +692,9 @@ void cng_params_postupd_fx( { exc2 = &cng_exc2_buf[ptr * L_FFT]; Q_exc = cng_Qexc_buf[ptr]; + move16(); last_active_brate = cng_brate_buf[ptr]; + move32(); /* calculate the spectrum of residual signal */ Copy( exc2, fft_io, L_FFT ); @@ -758,10 +766,12 @@ void cng_params_postupd_fx( if ( EQ_16( ptr, HO_HIST_SIZE ) ) { ptr = 0; + move16(); } } *cng_buf_cnt = 0; + move16(); return; } @@ -810,11 +820,13 @@ void cng_params_upd_fx( Word16 exp_pow; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif /* update the pointer to circular buffer of old LSP vectors */ *ho_circ_ptr = add( *ho_circ_ptr, 1 ); + move16(); if ( EQ_16( *ho_circ_ptr, HO_HIST_SIZE ) ) { @@ -837,7 +849,6 @@ void cng_params_upd_fx( scale = norm_s( maxv ); pt_exc2 = exc2; - move16(); L_ener = L_deposit_l( 0 ); IF( EQ_16( L_frame, L_FRAME ) ) { @@ -891,10 +902,11 @@ void cng_params_upd_fx( ho_ener_circ[*ho_circ_ptr] = L_ener; move32(); - IF( EQ_16( enc_dec_flag, ENC ) ) + IF( enc_dec_flag == ENC ) { /* Store residual signal for postponed FFT-processing*/ *cng_buf_cnt = add( *cng_buf_cnt, 1 ); + move16(); if ( GT_16( *cng_buf_cnt, HO_HIST_SIZE ) ) { *cng_buf_cnt = HO_HIST_SIZE; @@ -974,6 +986,7 @@ void cng_params_upd_fx( Copy32( env, &( ho_env_circ[( *ho_circ_ptr ) * NUM_ENV_CNG] ), NUM_ENV_CNG ); } *ho_circ_size = add( *ho_circ_size, 1 ); + move16(); if ( GT_16( *ho_circ_size, HO_HIST_SIZE ) ) { *ho_circ_size = HO_HIST_SIZE; @@ -1016,15 +1029,17 @@ void cng_params_upd_ivas_fx( Word16 exp1; Word16 CNG_mode; Word16 tmp = 0; + move16(); Word16 temp_lo_fx, temp_hi_fx; Word16 exp_pow; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif - /* update the pointer to circular buffer of old LSP vectors */ *ho_circ_ptr = add( *ho_circ_ptr, 1 ); + move16(); if ( EQ_16( *ho_circ_ptr, HO_HIST_SIZE ) ) { @@ -1047,7 +1062,6 @@ void cng_params_upd_ivas_fx( scale = norm_s( maxv ); pt_exc2 = exc2; - move16(); L_ener = L_deposit_l( 0 ); IF( EQ_16( L_frame, L_FRAME ) ) { @@ -1101,10 +1115,11 @@ void cng_params_upd_ivas_fx( ho_ener_circ[*ho_circ_ptr] = L_ener; move32(); - IF( EQ_16( enc_dec_flag, ENC ) ) + IF( enc_dec_flag == ENC ) { /* Store residual signal for postponed FFT-processing*/ *cng_buf_cnt = add( *cng_buf_cnt, 1 ); + move16(); if ( GT_16( *cng_buf_cnt, HO_HIST_SIZE ) ) { *cng_buf_cnt = HO_HIST_SIZE; @@ -1148,16 +1163,23 @@ void cng_params_upd_ivas_fx( Copy32( sp, env, NUM_ENV_CNG ); Word16 shift = 0; - if ( element_mode == IVAS_SCE || element_mode == IVAS_CPE_DFT ) + move16(); + test(); + IF( EQ_16( element_mode, IVAS_SCE ) || EQ_16( element_mode, IVAS_CPE_DFT ) ) { Word32 att_fx = 0; Word16 index = 0; + move32(); + move16(); apply_scale_ivas_fx( &att_fx, bwidth, last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO, &index ); att_fx = pow_10_q23[index]; // Q23 - tmp = extract_h( att_fx ); // Q7 + move32(); + tmp = extract_h( att_fx ); // Q7 + move16(); shift = 8; + move16(); } - else + ELSE { CNG_mode = get_cng_mode( last_active_brate ); /* att = 1/pow(2,ENR_ATT_fx[CNG_mode]); */ @@ -1187,6 +1209,7 @@ void cng_params_upd_ivas_fx( scale_sig32( &( ho_env_circ[( *ho_circ_ptr ) * NUM_ENV_CNG] ), NUM_ENV_CNG, shift ); } *ho_circ_size = add( *ho_circ_size, 1 ); + move16(); if ( GT_16( *ho_circ_size, HO_HIST_SIZE ) ) { *ho_circ_size = HO_HIST_SIZE; @@ -1212,22 +1235,27 @@ Word16 get_cng_mode( IF( GT_32( last_active_brate, ACELP_13k20 ) ) { CNG_mode = 4; + move16(); } ELSE IF( GT_32( last_active_brate, ACELP_9k60 ) ) { CNG_mode = 3; + move16(); } ELSE IF( GT_32( last_active_brate, ACELP_8k00 ) ) { CNG_mode = 2; + move16(); } ELSE IF( GT_32( last_active_brate, ACELP_7k20 ) ) { CNG_mode = 1; + move16(); } ELSE { CNG_mode = 0; + move16(); } return ( CNG_mode ); diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 4bcab73ec..f1ce84dde 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -573,11 +573,9 @@ enum *----------------------------------------------------------------------------------*/ #define FRAMES_PER_SEC 50 -#ifdef IVAS_FLOAT_FIXED #define MAX_PARAM_SPATIAL_SUB_FRAMES_PER_SEC 200 //(FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES) #define ONE_BY_FRAMES_PER_SEC_Q31 ( 42949673 ) #define FRAMES_PER_SEC_BY_2 (FRAMES_PER_SEC >> 1) -#endif #define INV_FRAME_PER_SEC_Q15 656 #define INV_FR_P_S_MX_PRM_SPL_SBFR_Q15 164 #define FRAME_SIZE_NS 20000000L diff --git a/lib_com/codec_tcx_common.c b/lib_com/codec_tcx_common.c index f956cba9b..e2fbbb9f3 100644 --- a/lib_com/codec_tcx_common.c +++ b/lib_com/codec_tcx_common.c @@ -36,7 +36,7 @@ Word16 tcxGetNoiseFillingTilt( { firstLine = shr( L_frame, 3 ); - Copy_Scale_sig( A, As, lpcorder + 1, sub( norm_s( A[0] ), 2 ) ); + Copy_Scale_sig( A, As, add( lpcorder, 1 ), sub( norm_s( A[0] ), 2 ) ); tmp = get_gain( As + 1, As, lpcorder ); BASOP_SATURATE_WARNING_OFF_EVS; #ifdef BASOP_NOGLOB @@ -67,6 +67,7 @@ void tcxFormantEnhancement( Word16 xn_buf_e, xn_one, m, e; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif k = shr( L_frame, 6 ); /* FDNS_NPTS = 64 */ @@ -143,7 +144,7 @@ void tcxFormantEnhancement( fac = add( fac0, mult( d, extract_l( L_mult0( j, inv_int[n] ) ) ) ); BASOP_SATURATE_WARNING_OFF_EVS; #ifdef BASOP_NOGLOB - xn_buf[l + j] = s_min( xn_one, shl_o( mult( xn_buf[l + j], fac ), fac_e, &Overflow ) ); + xn_buf[add( l, j )] = s_min( xn_one, shl_o( mult( xn_buf[add( l, j )], fac ), fac_e, &Overflow ) ); #else xn_buf[l + j] = s_min( xn_one, shl( mult( xn_buf[l + j], fac ), fac_e ) ); #endif @@ -192,7 +193,7 @@ void tcxFormantEnhancement( fac = add( fac0, mult( d, extract_l( L_mult0( j, inv_int[n] ) ) ) ); BASOP_SATURATE_WARNING_OFF_EVS; #ifdef BASOP_NOGLOB - xn_buf[l + j] = s_min( xn_one, shl_sat( mult( xn_buf[l + j], fac ), fac_e ) ); + xn_buf[add( l, j )] = s_min( xn_one, shl_sat( mult( xn_buf[add( l, j )], fac ), fac_e ) ); #else xn_buf[l + j] = s_min( xn_one, shl( mult( xn_buf[l + j], fac ), fac_e ) ); #endif @@ -240,6 +241,7 @@ void tcxFormantEnhancement_with_shift( Word16 xn_buf_e, xn_one, m, e; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; + move32(); #endif k = shr( L_frame, 6 ); /* FDNS_NPTS = 64 */ @@ -294,16 +296,16 @@ void tcxFormantEnhancement_with_shift( move16(); tmp = sub( e, fac_e ); - IF( GT_16( tmp, 0 ) ) + IF( tmp > 0 ) { fac0 = shr( fac0, tmp ); } - IF( LT_16( tmp, 0 ) ) + IF( tmp < 0 ) { fac1 = shl( fac1, tmp ); } - IF( GT_16( tmp, 0 ) ) + IF( tmp > 0 ) { fac_e = e; move16(); @@ -320,7 +322,7 @@ void tcxFormantEnhancement_with_shift( fac = add( fac0, mult( d, extract_l( L_mult0( j, inv_int[n] ) ) ) ); BASOP_SATURATE_WARNING_OFF_EVS; #ifdef BASOP_NOGLOB - xn_buf[l + j] = s_min( xn_one, shl_o( mult( xn_buf[l + j], fac ), fac_e, &Overflow ) ); + xn_buf[add( l, j )] = s_min( xn_one, shl_o( mult( xn_buf[add( l, j )], fac ), fac_e, &Overflow ) ); #else xn_buf[l + j] = s_min( xn_one, shl( mult( xn_buf[l + j], fac ), fac_e ) ); #endif @@ -369,7 +371,7 @@ void tcxFormantEnhancement_with_shift( fac = add( fac0, mult( d, extract_l( L_mult0( j, inv_int[n] ) ) ) ); BASOP_SATURATE_WARNING_OFF_EVS; #ifdef BASOP_NOGLOB - xn_buf[l + j] = s_min( xn_one, shl_o( mult( xn_buf[l + j], fac ), fac_e, &Overflow ) ); + xn_buf[add( l, j )] = s_min( xn_one, shl_o( mult( xn_buf[add( l, j )], fac ), fac_e, &Overflow ) ); #else xn_buf[l + j] = s_min( xn_one, shl( mult( xn_buf[l + j], fac ), fac_e ) ); #endif @@ -426,7 +428,7 @@ void tcxInvertWindowGrouping( test(); test(); - if ( ( frame_cnt != 0 ) && ( bfi == 0 ) && NE_16( last_core, ACELP_CORE ) ) /* fix sub-window overlap */ + if ( ( frame_cnt != 0 ) && ( bfi == 0 ) && ( last_core != ACELP_CORE ) ) /* fix sub-window overlap */ { hTcxCfg->tcx_last_overlap_mode = hTcxCfg->tcx_curr_overlap_mode; move16(); @@ -458,7 +460,7 @@ void tcxInvertWindowGrouping( move32(); } - p = spectrum + L_frame - 1; + p = spectrum + sub( L_frame, 1 ); FOR( i = sub( L_frame, 1 ); i > L_win; i -= 2 ) { *p-- = spectrum[i]; @@ -474,8 +476,8 @@ void tcxInvertWindowGrouping( IF( LT_16( L_spec, L_frame ) ) { Copy32( spectrum + 8, spectrum + 16, sub( shr( L_spec, 1 ), 8 ) ); - Copy32( spectrum + L_frame / 2, spectrum + 8, 8 ); - Copy32( spectrum + L_frame / 2 + 8, spectrum + L_spec / 2 + 8, sub( shr( L_spec, 1 ), 8 ) ); + Copy32( spectrum + shr( L_frame, 1 ), spectrum + 8, 8 ); + Copy32( spectrum + add( shr( L_frame, 1 ), 8 ), spectrum + add( shr( L_spec, 1 ), 8 ), sub( shr( L_spec, 1 ), 8 ) ); } ELSE { @@ -641,7 +643,7 @@ void tcx5SpectrumInterleaving_fx( FOR( i = 0; i < tcx5Size; i++ ) { interleaveBuf[2 * i] = spectrum[i]; - interleaveBuf[2 * i + 1] = spectrum[tcx5Size + i]; + interleaveBuf[add( 2 * i, 1 )] = spectrum[add( tcx5Size, i )]; } Copy32( interleaveBuf, spectrum, shl( tcx5Size, 1 ) ); @@ -668,7 +670,7 @@ void tcx5SpectrumDeinterleaving_fx( FOR( i = 0; i < tcx5Size; i++ ) { interleaveBuf[i] = spectrum[2 * i]; - interleaveBuf[tcx5Size + i] = spectrum[2 * i + 1]; + interleaveBuf[add( tcx5Size, i )] = spectrum[add( 2 * i, 1 )]; } Copy32( interleaveBuf, spectrum, shl( tcx5Size, 1 ) ); @@ -692,7 +694,7 @@ void tcx5TnsGrouping_fx( { Copy32( spectrum + 8, spectrum + 16, sub( L_spec, 8 ) ); Copy32( spectrum + L_frame, spectrum + 8, 8 ); - Copy32( spectrum + L_frame + 8, spectrum + L_spec + 8, sub( L_spec, 8 ) ); + Copy32( spectrum + add( L_frame, 8 ), spectrum + add( L_spec, 8 ), sub( L_spec, 8 ) ); } ELSE { @@ -721,11 +723,11 @@ void tcx5TnsUngrouping_fx( /* undo rearrangement of LF sub-window lines prior to TNS analysis */ IF( LT_16( L_spec, L_frame ) ) { - Copy32( spectrum + L_spec + 8, spectrum + L_frame + 8, sub( L_spec, 8 ) ); + Copy32( spectrum + L_spec + 8, spectrum + add( L_frame, 8 ), sub( L_spec, 8 ) ); Copy32( spectrum + 8, spectrum + L_frame, 8 ); Copy32( spectrum + 16, spectrum + 8, sub( L_spec, 8 ) ); set32_fx( spectrum + L_spec, 0, sub( L_frame, L_spec ) ); - set32_fx( spectrum + L_frame + L_spec, 0, sub( L_frame, L_spec ) ); + set32_fx( spectrum + add( L_frame, L_spec ), 0, sub( L_frame, L_spec ) ); } ELSE { diff --git a/lib_com/enh64.c b/lib_com/enh64.c index f0b804076..b59a9ef6c 100644 --- a/lib_com/enh64.c +++ b/lib_com/enh64.c @@ -1062,6 +1062,55 @@ Word64 W_msu_16_16( Word64 L64_var1, Word16 var2, Word16 var3 ) return L64_var_out; } +/*________________________________________________________________________________________________ +| | +| Function Name : W_mac_32_32 | +| | +| Purpose : | +| | +| Multiply var1 by var2 and shift the result left by 1 and add the 64 bit result to L64_acc, | +| return a 64 bit result. | +| | +| Complexity weight : 1 | +| | +| Inputs : | +| | +| L64_acc | +| 64 bit long long signed integer (Word64) whose value falls in the | +| range : 0x80000000 00000000LL <= L64_acc <= 0x7fffffff ffffffffLL. | +| | +| var1 | +| 32 bit signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= var1 <= 0x7fff 0000. | +| | +| var2 | +| 32 bit signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= var2 <= 0x7fff 0000. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| L64_var_out | +| 64 bit long long signed integer (Word64) whose value falls in the | +| range : 0x80000000 00000000LL <= L64_var_out <= 0x7fffffff ffffffffLL. | +|_________________________________________________________________________________________________| +*/ +Word64 W_mac_32_32( Word64 L64_var1, Word32 L_var2, Word32 L_var3 ) +{ + Word64 L64_var_out = W_mult_32_32( L_var2, L_var3 ); + L64_var_out = W_add( L64_var1, L64_var_out ); + +#if ( WMOPS ) + multiCounter[currCounter].W_mult_32_32--; + /* multiCounter[currCounter].W_add--; */ +#endif + + return L64_var_out; +} + /*___________________________________________________________________________ | | diff --git a/lib_com/enh64.h b/lib_com/enh64.h index 9016a27ae..efc58e83e 100644 --- a/lib_com/enh64.h +++ b/lib_com/enh64.h @@ -36,6 +36,7 @@ Word64 W_msu0_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ); Word64 W_mult_16_16( Word16 var1, Word16 var2 ); Word64 W_mac_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ); Word64 W_msu_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ); +Word64 W_mac_32_32( Word64 L64_acc, Word32 var1, Word32 var2 ); Word64 W_deposit32_l( Word32 L_var1 ); Word64 W_deposit32_h( Word32 L_var1 ); diff --git a/lib_com/ivas_stereo_td_bit_alloc.c b/lib_com/ivas_stereo_td_bit_alloc.c index 36f2cfc81..ed136930d 100644 --- a/lib_com/ivas_stereo_td_bit_alloc.c +++ b/lib_com/ivas_stereo_td_bit_alloc.c @@ -533,7 +533,7 @@ void tdm_bit_alloc( Word32 res_fix = 0; move32(); res_fix = Mpy_32_32( 644245095, L_sub( element_brate_wo_meta, 500 ) ); - res_fix = imult3216( Mpy_32_16_1( L_abs( res_fix ), 328 ), 100 ); + res_fix = imult3216( Mpy_32_32( L_abs( res_fix ), 21474837 ), 100 ); if ( res_fix < 0 ) { res_fix = L_negate( res_fix ); @@ -548,7 +548,7 @@ void tdm_bit_alloc( Word32 res_fix = 0; move32(); res_fix = Mpy_32_32( 1073741824, L_sub( element_brate_wo_meta, 500 ) ); - res_fix = imult3216( Mpy_32_16_1( L_abs( res_fix ), 328 ), 100 ); + res_fix = imult3216( Mpy_32_32( L_abs( res_fix ), 21474837 ), 100 ); if ( res_fix < 0 ) { res_fix = L_negate( res_fix ); diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 064ae2849..485308d6c 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3224,7 +3224,7 @@ void IMDCT_ivas_fx( { FOR( i = 0; i < overlap; i++ ) { - xn_buf_fx[i] = add( xn_buf_fx[i], old_syn_overl_fx[i] ); + xn_buf_fx[i] = add_sat( xn_buf_fx[i], old_syn_overl_fx[i] ); move16(); } } @@ -3292,7 +3292,7 @@ void IMDCT_ivas_fx( FOR( i = 0; i < shr( tcx_mdct_window_half_length, 1 ); i++ ) { xn_buf_fx[sub( add( i, shr( overlap, 1 ) ), tcx_offset )] = mult_r( xn_buf_fx[sub( add( i, shr( overlap, 1 ) ), tcx_offset )], tcx_mdct_window_half_fx[i].v.im ); - xn_buf_fx[sub( add( i, shr( overlap, 1 ) ), tcx_offset )] = add( xn_buf_fx[sub( add( i, shr( overlap, 1 ) ), tcx_offset )], mult_r( mult_r( hTcxDec->syn_OverlFB[i], tcx_mdct_window_half_fx[i].v.re ), tcx_mdct_window_half_fx[i].v.re ) ); + xn_buf_fx[sub( add( i, shr( overlap, 1 ) ), tcx_offset )] = add_sat( xn_buf_fx[sub( add( i, shr( overlap, 1 ) ), tcx_offset )], mult_r( mult_r( hTcxDec->syn_OverlFB[i], tcx_mdct_window_half_fx[i].v.re ), tcx_mdct_window_half_fx[i].v.re ) ); move16(); move16(); } diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c index a66795dca..1ab53f387 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig.c +++ b/lib_dec/ivas_corecoder_dec_reconfig.c @@ -977,7 +977,7 @@ ivas_error ivas_cldfb_dec_reconfig_fx( test(); IF( EQ_16( st_ivas->ivas_format, SBA_FORMAT ) && EQ_16( nchan_transport_old, 1 ) && EQ_16( numCldfbAnalyses_old, 2 ) && GT_16( st_ivas->nchan_transport, 1 ) ) { - deleteCldfb_ivas( &( st_ivas->cldfbAnaDec[1] ) ); + deleteCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[1] ) ); numCldfbAnalyses_old = sub( numCldfbAnalyses_old, 1 ); } /* resample CLDFB analysis instances */ @@ -995,7 +995,7 @@ ivas_error ivas_cldfb_dec_reconfig_fx( /* delete superfluous CLDFB synthesis instances */ FOR( i = numCldfbAnalyses; i < numCldfbAnalyses_old; i++ ) { - deleteCldfb_ivas( &( st_ivas->cldfbAnaDec[i] ) ); + deleteCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ) ); } } ELSE IF( LT_16( numCldfbAnalyses_old, numCldfbAnalyses ) ) @@ -1015,7 +1015,7 @@ ivas_error ivas_cldfb_dec_reconfig_fx( /* delete superfluous CLDFB synthesis instances */ FOR( i = numCldfbSyntheses; i < numCldfbSyntheses_old; i++ ) { - deleteCldfb_ivas( &( st_ivas->cldfbSynDec[i] ) ); + deleteCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ) ); } } ELSE IF( LT_16( numCldfbSyntheses_old, numCldfbSyntheses ) ) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 193324414..0640c495f 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -4791,7 +4791,7 @@ void ivas_destroy_dec_fx( { IF( st_ivas->cldfbAnaDec[i] != NULL ) { - deleteCldfb_ivas( &( st_ivas->cldfbAnaDec[i] ) ); + deleteCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ) ); } } @@ -4799,7 +4799,7 @@ void ivas_destroy_dec_fx( { IF( st_ivas->cldfbSynDec[i] != NULL ) { - deleteCldfb_ivas( &( st_ivas->cldfbSynDec[i] ) ); + deleteCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ) ); } } diff --git a/lib_dec/ivas_stereo_switching_dec.c b/lib_dec/ivas_stereo_switching_dec.c index 774c1a8e0..6ec395ccc 100644 --- a/lib_dec/ivas_stereo_switching_dec.c +++ b/lib_dec/ivas_stereo_switching_dec.c @@ -3228,9 +3228,9 @@ void stereo_switching_dec( { /* reset CLDFB memories */ #ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED - cldfb_reset_memory_ivas( sts[0]->cldfbAna ); - cldfb_reset_memory_ivas( sts[0]->cldfbBPF ); - cldfb_reset_memory_ivas( sts[0]->cldfbSyn ); + // cldfb_reset_memory_ivas( sts[0]->cldfbAna ); + // cldfb_reset_memory_ivas( sts[0]->cldfbBPF ); + // cldfb_reset_memory_ivas( sts[0]->cldfbSyn ); #endif cldfb_reset_memory_fx( sts[0]->cldfbAna ); @@ -3295,9 +3295,9 @@ void stereo_switching_dec( /* reset CLDFB memories */ #ifndef IVAS_FLOAT_CONV_TO_BE_REMOVED - cldfb_reset_memory_ivas( sts[1]->cldfbAna ); - cldfb_reset_memory_ivas( sts[1]->cldfbBPF ); - cldfb_reset_memory_ivas( sts[1]->cldfbSyn ); + // cldfb_reset_memory_ivas( sts[1]->cldfbAna ); + // cldfb_reset_memory_ivas( sts[1]->cldfbBPF ); + // cldfb_reset_memory_ivas( sts[1]->cldfbSyn ); #endif cldfb_reset_memory_fx( sts[1]->cldfbAna ); diff --git a/lib_dec/jbm_jb4sb.c b/lib_dec/jbm_jb4sb.c index 394452fb8..3ba8a4331 100644 --- a/lib_dec/jbm_jb4sb.c +++ b/lib_dec/jbm_jb4sb.c @@ -1490,7 +1490,7 @@ static void JB4_popFromBuffer( partialCopyDu = (JB4_DATAUNIT_HANDLE) JB4_INPUTBUFFER_Element( h->inputBuffer, searchpos ); IF( EQ_64( partialCopyDu->timeStamp, W_add( nextDataUnit->timeStamp, partialCopyDu->duration ) ) ) { - get_NextCoderType( partialCopyDu->data, &nextDataUnit->nextCoderType ); + get_NextCoderType_fx( partialCopyDu->data, &nextDataUnit->nextCoderType ); BREAK; } } diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index c2b52ecd1..18a062f60 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2870,7 +2870,7 @@ ivas_error IVAS_DEC_VoIP_FeedFrame( } /* check if frame contains a partial copy and get its offset */ - evs_dec_previewFrame_float( au, auSize, &partialCopyFrameType, &partialCopyOffset ); + evs_dec_previewFrame( au, auSize, &partialCopyFrameType, &partialCopyOffset ); /* create data unit for primary copy in the frame */ dataUnit = JB4_AllocDataUnit( hIvasDec->hVoIP->hJBM ); diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 230c58c44..6ca4545f2 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1760,7 +1760,7 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( return error; } - +#ifndef IVAS_FLOAT_FIXED /*---------------------------------------------------------------------* * IVAS_ENC_EncodeFrameToCompact() * @@ -1787,7 +1787,7 @@ ivas_error IVAS_ENC_EncodeFrameToCompact( return IVAS_ERR_OK; } - +#endif /*---------------------------------------------------------------------* * IVAS_ENC_SetBandwidth() diff --git a/lib_rend/ivas_masa_merge.c b/lib_rend/ivas_masa_merge.c index 8652e2c71..9f7d8f7f1 100644 --- a/lib_rend/ivas_masa_merge.c +++ b/lib_rend/ivas_masa_merge.c @@ -822,7 +822,7 @@ void masaPrerendClose_fx( FOR( i = 0; i < ( *hMasaPrerendPtr )->num_Cldfb_instances; i++ ) { - deleteCldfb_ivas( &( ( *hMasaPrerendPtr )->cldfbAnaEnc[i] ) ); + deleteCldfb_ivas_fx( &( ( *hMasaPrerendPtr )->cldfbAnaEnc[i] ) ); } free( ( *hMasaPrerendPtr )->hMasaOut ); diff --git a/lib_rend/ivas_mcmasa_ana.c b/lib_rend/ivas_mcmasa_ana.c index 8149ee639..5666cba22 100644 --- a/lib_rend/ivas_mcmasa_ana.c +++ b/lib_rend/ivas_mcmasa_ana.c @@ -663,7 +663,7 @@ void ivas_mcmasa_ana_close( FOR( i = 0; i < ( *hMcMasa )->num_Cldfb_instances; i++ ) { - deleteCldfb_ivas( &( ( *hMcMasa )->cldfbAnaEnc[i] ) ); + deleteCldfb_ivas_fx( &( ( *hMcMasa )->cldfbAnaEnc[i] ) ); } /* intensity 3-dim */ diff --git a/lib_rend/ivas_objectRenderer_sfx.c b/lib_rend/ivas_objectRenderer_sfx.c index 382632999..cbd860f49 100644 --- a/lib_rend/ivas_objectRenderer_sfx.c +++ b/lib_rend/ivas_objectRenderer_sfx.c @@ -286,6 +286,7 @@ void TDREND_Apply_ITD_fx( * The sinc resampling reads SFX_SPAT_BIN_SINC_M (5) samples outside of * the target frame. *---------------------------------------------------------------------*/ + #ifndef IVAS_FLOAT_FIXED static void sincResample( const float *input, /*i : Input signal */ @@ -350,7 +351,6 @@ static void sincResample( return; } - #else static void sincResample_fx( const Word32 *input_fx, /*i : Input signal Qx */ @@ -366,7 +366,7 @@ static void sincResample_fx( Word16 t_step_e; Word32 t_frac_fx; Word16 t_frac_e; - Word32 tmp_fx; + Word64 tmp64_fx; const Word32 *p_mid_fx; const Word32 *p_forward_fx; const Word32 *p_backward_fx; @@ -413,20 +413,20 @@ static void sincResample_fx( p_sinc_forward_fx = SincTable_fx + sub( SFX_SPAT_BIN_NUM_SUBSAMPLES, snc0 ); p_sinc_backward_fx = SincTable_fx + add( SFX_SPAT_BIN_NUM_SUBSAMPLES, snc0 ); - tmp_fx = Mpy_32_32( *p_mid_fx, SincTable_fx[snc0] ); /* Middle point */ + tmp64_fx = W_mult_32_32( *p_mid_fx, SincTable_fx[snc0] ); /* Middle point */ FOR( j = 0; j < SFX_SPAT_BIN_SINC_M - 1; j++ ) { - tmp_fx = L_add( tmp_fx, L_add( Mpy_32_32( *p_forward_fx, *p_sinc_forward_fx ), Mpy_32_32( *p_backward_fx, *p_sinc_backward_fx ) ) ); + tmp64_fx = W_add( tmp64_fx, W_mac_32_32( W_mult_32_32( *p_forward_fx, *p_sinc_forward_fx ), *p_backward_fx, *p_sinc_backward_fx ) ); p_sinc_forward_fx += SFX_SPAT_BIN_NUM_SUBSAMPLES; p_sinc_backward_fx += SFX_SPAT_BIN_NUM_SUBSAMPLES; p_forward_fx++; p_backward_fx--; } - tmp_fx = L_add( tmp_fx, Mpy_32_32( *p_forward_fx, *p_sinc_forward_fx ) ); /* Integer index always rounded down --> 4 steps backward, 5 steps forward */ + tmp64_fx = W_mac_32_32( tmp64_fx, *p_forward_fx, *p_sinc_forward_fx ); /* Integer index always rounded down --> 4 steps backward, 5 steps forward */ - output_fx[i] = tmp_fx; + output_fx[i] = W_extract_h( tmp64_fx ); move32(); /* Advance fractional time */ @@ -445,6 +445,7 @@ static void sincResample_fx( * --------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED void TDREND_firfilt( float *signal, /* i/o: Input signal / Filtered signal */ float *filter, /* i/o: FIR filter */ @@ -497,8 +498,7 @@ void TDREND_firfilt( return; } - -#ifdef IVAS_FLOAT_FIXED +#else void TDREND_firfilt_fx( Word32 *signal_fx, /* i/o: Input signal / Filtered signal Qx */ Word32 *filter_fx, /* i/o: FIR filter Qy */ @@ -521,6 +521,7 @@ void TDREND_firfilt_fx( Word32 tmp_fx; Word16 step_fx, gain_tmp_fx, gain_delta_fx; Word16 tmp_e; + Word64 tmp64_fx; gain_delta_fx = sub( Gain_fx, prevGain_fx ); // Q14 step_fx = BASOP_Util_Divide1616_Scale( gain_delta_fx, subframe_length, &tmp_e ); @@ -537,8 +538,8 @@ void TDREND_firfilt_fx( /* Convolution */ FOR( i = 0; i < subframe_length; i++ ) { - tmp_fx = 0; - move32(); + tmp64_fx = 0; + move64(); tmp_e = 0; move16(); p_tmp_fx = p_signal_fx + i; @@ -547,12 +548,14 @@ void TDREND_firfilt_fx( FOR( j = 0; j < filterlength; j++ ) { - tmp_fx = L_add( tmp_fx, Mpy_32_32( *p_filter_fx, *p_tmp_fx ) ); + tmp64_fx = W_mac_32_32( tmp64_fx, *p_filter_fx, *p_tmp_fx ); p_filter_fx++; p_tmp_fx--; } - tmp_fx = L_shl( tmp_fx, filter_e ); // This is done to keep the output Q same as input Q for signal + // This is done to keep the output Q same as input Q for signal + tmp64_fx = W_shl( tmp64_fx, filter_e ); + tmp_fx = W_extract_h( tmp64_fx ); /* Apply linear gain interpolation in case of abrupt gain changes */ gain_tmp_fx = add( gain_tmp_fx, step_fx ); diff --git a/lib_rend/ivas_omasa_ana.c b/lib_rend/ivas_omasa_ana.c index 476cbbe3e..630865169 100644 --- a/lib_rend/ivas_omasa_ana.c +++ b/lib_rend/ivas_omasa_ana.c @@ -379,7 +379,7 @@ void ivas_omasa_ana_close( FOR( i = 0; i < ( *hOMasa )->num_Cldfb_instances; i++ ) { - deleteCldfb_ivas( &( ( *hOMasa )->cldfbAnaEnc[i] ) ); + deleteCldfb_ivas_fx( &( ( *hOMasa )->cldfbAnaEnc[i] ) ); } FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 4868919f8..dc331271f 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -1640,6 +1640,7 @@ void TDREND_Apply_ITD_fx( ); #endif +#ifndef IVAS_FLOAT_FIXED void TDREND_firfilt( float *signal, /* i/o: Input signal / Filtered signal */ float *filter, /* i/o: FIR filter */ @@ -1651,7 +1652,7 @@ void TDREND_firfilt( const float Gain, /* i : Gain */ const float prevGain /* i : Previous gain */ ); -#ifdef IVAS_FLOAT_FIXED +#else void TDREND_firfilt_fx( Word32 *signal_fx, /* i/o: Input signal / Filtered signal Qx */ Word32 *filter_fx, /* i/o: FIR filter Qy */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 3db18bcf1..45d03afd3 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -15051,7 +15051,7 @@ static void freeMasaExtRenderer( { IF( hMasaExtRend->cldfbAnaRend[i] != NULL ) { - deleteCldfb_ivas( &hMasaExtRend->cldfbAnaRend[i] ); + deleteCldfb_ivas_fx( &hMasaExtRend->cldfbAnaRend[i] ); } } @@ -15059,7 +15059,7 @@ static void freeMasaExtRenderer( { IF( hMasaExtRend->cldfbSynRend[i] != NULL ) { - deleteCldfb_ivas( &hMasaExtRend->cldfbSynRend[i] ); + deleteCldfb_ivas_fx( &hMasaExtRend->cldfbSynRend[i] ); } } -- GitLab From a58dd2e5238e15ac0af4124fa9987478c340ac31 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 23 Jul 2024 17:51:35 +0530 Subject: [PATCH 095/110] EVS encoder build fix --- lib_com/bitstream_fx.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index f7dd3942b..1dc907e43 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -683,7 +683,6 @@ void write_indices_fx( return; } -#ifndef IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* * write_indices_buf_fx() * @@ -787,7 +786,6 @@ void write_indices_buf_fx( return; } -#endif /*-------------------------------------------------------------------* * indices_to_serial() * -- GitLab From 3a9afe2eb58b190e199175526392c876f31c0bd2 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 23 Jul 2024 19:48:48 +0530 Subject: [PATCH 096/110] EVS bit exactness fix --- lib_com/bits_alloc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/bits_alloc_fx.c b/lib_com/bits_alloc_fx.c index cbcf41090..1e1fd7552 100644 --- a/lib_com/bits_alloc_fx.c +++ b/lib_com/bits_alloc_fx.c @@ -1194,7 +1194,7 @@ ivas_error config_acelp1( } } - bits = sub( bits, idiv1616( sub( L_FRAME16k - L_SUBFR, tc_subfr ), L_SUBFR ) ); /* LP filtering flag */ + bits -= ( L_FRAME16k - tc_subfr - L_SUBFR ) / L_SUBFR; /* LP filtering flag */ } /* glottal-shape codebook bits */ -- GitLab From 74002a2c8a0cd3ab8e5732b6c28e8705c7f0d2ce Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 23 Jul 2024 21:24:11 +0530 Subject: [PATCH 097/110] Added switch for new BASOP introduced --- lib_com/enh64.c | 3 ++- lib_com/enh64.h | 3 ++- lib_com/options.h | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib_com/enh64.c b/lib_com/enh64.c index b59a9ef6c..f5b11d525 100644 --- a/lib_com/enh64.c +++ b/lib_com/enh64.c @@ -1062,6 +1062,7 @@ Word64 W_msu_16_16( Word64 L64_var1, Word16 var2, Word16 var3 ) return L64_var_out; } +#ifdef STL_BASOP_UPDATES /*________________________________________________________________________________________________ | | | Function Name : W_mac_32_32 | @@ -1110,7 +1111,7 @@ Word64 W_mac_32_32( Word64 L64_var1, Word32 L_var2, Word32 L_var3 ) return L64_var_out; } - +#endif /*___________________________________________________________________________ | | diff --git a/lib_com/enh64.h b/lib_com/enh64.h index efc58e83e..b9798401d 100644 --- a/lib_com/enh64.h +++ b/lib_com/enh64.h @@ -36,8 +36,9 @@ Word64 W_msu0_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ); Word64 W_mult_16_16( Word16 var1, Word16 var2 ); Word64 W_mac_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ); Word64 W_msu_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ); +#ifdef STL_BASOP_UPDATES Word64 W_mac_32_32( Word64 L64_acc, Word32 var1, Word32 var2 ); - +#endif // STL_BASOP_UPDATES Word64 W_deposit32_l( Word32 L_var1 ); Word64 W_deposit32_h( Word32 L_var1 ); diff --git a/lib_com/options.h b/lib_com/options.h index 34e869556..daaeaf4ff 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,7 @@ #define FIX_802__NON_BE_DECODING /* Fix possible difference float and fixed point when computing the GSC bit allocation */ #define FIX_802_1137_1137_GSC_IVAS_FXFLT_DECODING /* VA: ISSUES 802 and 1137 Made sure that float and fixed point GCS bit allocation is the same during IVAS modes */ - +#define STL_BASOP_UPDATES /* BASOPS which are not part of STL 2023 library, might be proposed in next update */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -- GitLab From 995ba50833190dda0447acf2581c0a75bc513612 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 23 Jul 2024 21:32:11 +0530 Subject: [PATCH 098/110] Added comments for W_mac_32_32 BASOP which is not part of STL library. --- lib_com/enh64.c | 3 +-- lib_com/enh64.h | 5 +++-- lib_com/options.h | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib_com/enh64.c b/lib_com/enh64.c index f5b11d525..66068baba 100644 --- a/lib_com/enh64.c +++ b/lib_com/enh64.c @@ -1062,7 +1062,7 @@ Word64 W_msu_16_16( Word64 L64_var1, Word16 var2, Word16 var3 ) return L64_var_out; } -#ifdef STL_BASOP_UPDATES +/* Below BASOP is not part of STL 2023 library, might be proposed in next update */ /*________________________________________________________________________________________________ | | | Function Name : W_mac_32_32 | @@ -1111,7 +1111,6 @@ Word64 W_mac_32_32( Word64 L64_var1, Word32 L_var2, Word32 L_var3 ) return L64_var_out; } -#endif /*___________________________________________________________________________ | | diff --git a/lib_com/enh64.h b/lib_com/enh64.h index b9798401d..8abfd0e80 100644 --- a/lib_com/enh64.h +++ b/lib_com/enh64.h @@ -36,9 +36,10 @@ Word64 W_msu0_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ); Word64 W_mult_16_16( Word16 var1, Word16 var2 ); Word64 W_mac_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ); Word64 W_msu_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ); -#ifdef STL_BASOP_UPDATES + +/* BASOP W_mac_32_32 is not part of STL 2023 library, might be proposed in next update */ Word64 W_mac_32_32( Word64 L64_acc, Word32 var1, Word32 var2 ); -#endif // STL_BASOP_UPDATES + Word64 W_deposit32_l( Word32 L_var1 ); Word64 W_deposit32_h( Word32 L_var1 ); diff --git a/lib_com/options.h b/lib_com/options.h index daaeaf4ff..d4311a564 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ #define FIX_802__NON_BE_DECODING /* Fix possible difference float and fixed point when computing the GSC bit allocation */ #define FIX_802_1137_1137_GSC_IVAS_FXFLT_DECODING /* VA: ISSUES 802 and 1137 Made sure that float and fixed point GCS bit allocation is the same during IVAS modes */ -#define STL_BASOP_UPDATES /* BASOPS which are not part of STL 2023 library, might be proposed in next update */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -- GitLab From 7c9904843169b660684ef9b2ef5dbf1d1ce8c4ee Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Thu, 18 Jul 2024 11:15:41 -0400 Subject: [PATCH 099/110] Proposed fix for 810 --- lib_com/options.h | 1 + lib_dec/dec_tran_fx.c | 31 +++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index d4311a564..0c7d4b051 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,6 +156,7 @@ #define FIX_802__NON_BE_DECODING /* Fix possible difference float and fixed point when computing the GSC bit allocation */ #define FIX_802_1137_1137_GSC_IVAS_FXFLT_DECODING /* VA: ISSUES 802 and 1137 Made sure that float and fixed point GCS bit allocation is the same during IVAS modes */ +#define FIX_810_PREVENT_UNECESSARY_SAT_IN_TC /* VA : Prevent an unnecessary saturation that can happen in TC, have a minimal impact on most cases. Significant improvement for the last segment of LTV when TC is triggered */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/dec_tran_fx.c b/lib_dec/dec_tran_fx.c index 9d2e808a7..1c79bb0fe 100644 --- a/lib_dec/dec_tran_fx.c +++ b/lib_dec/dec_tran_fx.c @@ -6,6 +6,14 @@ #include "cnst.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #ifdef IVAS_FLOAT_FIXED + +#ifdef FIX_810_PREVENT_UNECESSARY_SAT_IN_TC +#define Q3_4 ( 4 << Q3 ) +#define Q3_17 ( 17 << Q3 ) +#define Q16_8 ( 8 << Q16 ) +#define Q16_30 ( 30 << Q16 ) +#endif + /*======================================================================*/ /* FUNCTION : decod_tran_fx() */ /*----------------------------------------------------------------------*/ @@ -177,10 +185,29 @@ void decod_tran_fx( /*----------------------------------------------------------------------* * Find the total excitation *----------------------------------------------------------------------*/ - +#ifdef FIX_810_PREVENT_UNECESSARY_SAT_IN_TC + test(); + test(); + test(); + IF ( GT_16( st_fx->element_mode, EVS_MONO ) && ( GE_16( add( i_subfr, L_SUBFR ), tc_subfr_fx ) && LT_16( i_subfr, tc_subfr_fx ) && GT_16( st_fx->Q_subfr[0], 4 ) ) ) + { + test(); + test(); + test(); + IF( GE_16( st_fx->Q_subfr[0], 7 ) && LE_32( st_fx->lp_gainc_fx, Q3_4 ) && LE_32( norm_gain_code_fx, Q16_8 ) ) + { + st_fx->Q_subfr[0] = s_min( st_fx->Q_subfr[0], 4 ); + move16(); + } + ELSE IF( LE_32( st_fx->lp_gainc_fx, Q3_17 ) && LE_32( L_sub( gain_code_fx, norm_gain_code_fx ), Q16_30 ) ) + { + st_fx->Q_subfr[0] = s_min( 4, sub( st_fx->Q_subfr[0], 2 ) ); + move16(); + } + } +#endif IF( EQ_16( L_frame_fx, L_FRAME ) ) /* Rescaling for 12.8k core */ { - Rescale_exc( hMusicPF->dct_post_old_exc_fx, &exc_fx[i_subfr], &bwe_exc_fx[shr( imult1616( i_subfr, 2 * HIBND_ACB_L_FAC ), 1 )], hGSCDec->last_exc_dct_in_fx, L_SUBFR, L_SUBFR * HIBND_ACB_L_FAC, gain_code_fx, &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, i_subfr, st_fx->coder_type ); } -- GitLab From 43223550e361131711e84def1641a32861cf01bc Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Thu, 18 Jul 2024 11:35:39 -0400 Subject: [PATCH 100/110] fix formating --- lib_dec/dec_tran_fx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_dec/dec_tran_fx.c b/lib_dec/dec_tran_fx.c index 1c79bb0fe..4d8767e47 100644 --- a/lib_dec/dec_tran_fx.c +++ b/lib_dec/dec_tran_fx.c @@ -8,10 +8,10 @@ #ifdef IVAS_FLOAT_FIXED #ifdef FIX_810_PREVENT_UNECESSARY_SAT_IN_TC -#define Q3_4 ( 4 << Q3 ) +#define Q3_4 ( 4 << Q3 ) #define Q3_17 ( 17 << Q3 ) -#define Q16_8 ( 8 << Q16 ) -#define Q16_30 ( 30 << Q16 ) +#define Q16_8 ( 8 << Q16 ) +#define Q16_30 ( 30 << Q16 ) #endif /*======================================================================*/ @@ -189,7 +189,7 @@ void decod_tran_fx( test(); test(); test(); - IF ( GT_16( st_fx->element_mode, EVS_MONO ) && ( GE_16( add( i_subfr, L_SUBFR ), tc_subfr_fx ) && LT_16( i_subfr, tc_subfr_fx ) && GT_16( st_fx->Q_subfr[0], 4 ) ) ) + IF( GT_16( st_fx->element_mode, EVS_MONO ) && ( GE_16( add( i_subfr, L_SUBFR ), tc_subfr_fx ) && LT_16( i_subfr, tc_subfr_fx ) && GT_16( st_fx->Q_subfr[0], 4 ) ) ) { test(); test(); -- GitLab From ae3d6e22e65e60c71646c7c438f2d1ca9f128544 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 25 Jul 2024 09:01:52 +0530 Subject: [PATCH 101/110] Fix for 3GPP issue 817: Fixes LTV crash issue for 10dB Multi Channel stream [x] Test case - 10dB ltv-Multi-channel 5_1 at 13.2 kbps, 48kHz in, 48kHz out --- lib_dec/dec_uv_fx.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_dec/dec_uv_fx.c b/lib_dec/dec_uv_fx.c index 182c89ef7..8a4f4c05e 100644 --- a/lib_dec/dec_uv_fx.c +++ b/lib_dec/dec_uv_fx.c @@ -363,7 +363,11 @@ static void gain_dec_gacelp_uv_fx( *past_gcode = L_shl( L_tmp1, sub( exp_L_tmp1, 15 ) ); /* Q16 */ move32(); +#ifdef BASOP_NOGLOB + *gain_code = L_shl_sat( Mpy_32_16_1( *past_gcode, *gain_inov ), 3 ); +#else *gain_code = L_shl( Mpy_32_16_1( *past_gcode, *gain_inov ), 3 ); +#endif move32(); -- GitLab From 45af4f71541a4d44d9a710b19c82a3eda5321809 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 25 Jul 2024 09:08:28 +0530 Subject: [PATCH 102/110] Fix for 3GPP issue 818: example of under performing code from complexity and precision point of view [x] Made the suggested changes in https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/issues/818. --- lib_com/options.h | 1 + lib_enc/ivas_stereo_td_analysis.c | 78 +++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 0c7d4b051..c40293951 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -110,6 +110,7 @@ #define IVAS_FLOAT_FIXED #ifdef IVAS_FLOAT_FIXED #define MSAN_FIX +#define FIX_818_COMPLEXITY_IMPROV /* Fix for issue 818 */ #endif #define ISM_DISABLE #define FIX_TMP_714 diff --git a/lib_enc/ivas_stereo_td_analysis.c b/lib_enc/ivas_stereo_td_analysis.c index 03288fd13..be64a0175 100644 --- a/lib_enc/ivas_stereo_td_analysis.c +++ b/lib_enc/ivas_stereo_td_analysis.c @@ -662,20 +662,43 @@ static void Get_LR_rms_fx( { Word32 ener_l, ener_r; Word32 ener_l_tmp, ener_r_tmp; +#ifdef FIX_818_COMPLEXITY_IMPROV + Word16 guard_bits; + Word64 W_ener_l_tmp, W_ener_r_tmp; +#else Word64 ener_l_tmp_64bit, ener_r_tmp_64bit; Word16 q_shift; +#endif Word16 i; Word16 exp_out_l, exp_out_r, exp_diff; +#ifdef FIX_818_COMPLEXITY_IMPROV + W_ener_l_tmp = 0; + move64(); + W_ener_r_tmp = 0; + move64(); +#else ener_l_tmp_64bit = 0; move64(); ener_r_tmp_64bit = 0; move64(); +#endif ener_l = ONE_BY_100_Q31; move32(); ener_r = ONE_BY_100_Q31; move32(); +#ifdef FIX_818_COMPLEXITY_IMPROV + guard_bits = sub( 32, find_guarded_bits_fx( input_frame ) ); + FOR( i = 0; i < input_frame; i++ ) + { + W_ener_l_tmp = W_mac0_16_16( W_ener_l_tmp, Left_in[i], Left_in[i] ); // Q0 + W_ener_r_tmp = W_mac0_16_16( W_ener_r_tmp, Right_in[i], Right_in[i] ); // Q0 + } + /* Scaling back to the original proposal */ + ener_l_tmp = W_extract_h( W_shl( W_ener_l_tmp, guard_bits ) ); // guard_bits - 32 + ener_r_tmp = W_extract_h( W_shl( W_ener_r_tmp, guard_bits ) ); // guard_bits - 32 +#else FOR( i = 0; i < input_frame; i++ ) { ener_l_tmp_64bit = W_add( ener_l_tmp_64bit, W_deposit32_l( L_mult0( Left_in[i], Left_in[i] ) ) ); // Q0 @@ -703,9 +726,15 @@ static void Get_LR_rms_fx( { ener_r_tmp = L_add( ener_r_tmp, 1 ); } +#endif +#ifdef FIX_818_COMPLEXITY_IMPROV + ener_l = BASOP_Util_Add_Mant32Exp( ener_l, 0, ener_l_tmp, sub( Q31, sub( guard_bits, 32 ) ), &exp_out_l ); + ener_r = BASOP_Util_Add_Mant32Exp( ener_r, 0, ener_r_tmp, sub( Q31, sub( guard_bits, 32 ) ), &exp_out_r ); +#else ener_l = BASOP_Util_Add_Mant32Exp( ener_l, 0, ener_l_tmp, sub( Q31, sub( q_shift, 32 ) ), &exp_out_l ); ener_r = BASOP_Util_Add_Mant32Exp( ener_r, 0, ener_r_tmp, sub( Q31, sub( q_shift, 32 ) ), &exp_out_r ); +#endif ener_l_tmp = BASOP_Util_Divide3232_Scale( ener_l, input_frame, &exp_diff ); exp_out_l = sub( add( exp_diff, exp_out_l ), Q15 ); @@ -2181,7 +2210,21 @@ static void Get_corr_n_fx( Word16 exp_diff; Word32 L_tmp; Word16 guard_bits; +#ifdef FIX_818_COMPLEXITY_IMPROV + Word64 W_corrL, W_corrR, W_ener, W_ener_side; +#endif +#ifdef FIX_818_COMPLEXITY_IMPROV + W_corrL = 0; + move64(); + W_corrR = 0; + move64(); + W_ener = EPSILON_FX; + move64(); + W_ener_side = EPSILON_FX; + move64(); + guard_bits = sub( 32, find_guarded_bits_fx( len ) ); +#else corrL = 0; move32(); corrR = 0; @@ -2191,6 +2234,7 @@ static void Get_corr_n_fx( ener_side = EPSILON_FX; move32(); guard_bits = find_guarded_bits_fx( len ); +#endif /*----------------------------------------------------------------* * Find the normalized correlation between: left/mono and right/mono based @@ -2198,6 +2242,22 @@ static void Get_corr_n_fx( IF( tdm_SM_calc_flag ) { +#ifdef FIX_818_COMPLEXITY_IMPROV + FOR( i = 0; i < len; i++ ) + { + mono_i = round_fx( L_msu( L_mult( L[i], ONE_IN_Q14 ), R[i], ONE_IN_Q14 ) ); // q_in + W_corrL = W_mac0_16_16( W_corrL, abs_s( L[i] ), abs_s( mono_i ) ); // (q_in + q_in ) + W_corrR = W_mac0_16_16( W_corrR, abs_s( R[i] ), abs_s( mono_i ) ); // (q_in + q_in ) + W_ener = W_mac0_16_16( W_ener, mono_i, mono_i ); // (q_in + q_in ) + side_i = round_fx( L_mac( L_mult( L[i], ONE_IN_Q14 ), R[i], ONE_IN_Q14 ) ); // q_in + W_ener_side = W_mac0_16_16( W_ener_side, side_i, side_i ); // (q_in + q_in ) + } + /* Scaling back to the original proposal */ + corrL = W_extract_h( W_shl( W_corrL, guard_bits ) ); + corrR = W_extract_h( W_shl( W_corrR, guard_bits ) ); + ener = W_extract_h( W_shl( W_ener, guard_bits ) ); + ener_side = W_extract_h( W_shl( W_ener_side, guard_bits ) ); +#else FOR( i = 0; i < len; i++ ) { mono_i = sub( shr( L[i], Q1 ), shr( R[i], Q1 ) ); // q_in @@ -2207,9 +2267,26 @@ static void Get_corr_n_fx( side_i = add( shr( L[i], Q1 ), shr( R[i], Q1 ) ); // q_in ener_side = L_add( ener_side, L_shr( L_mult0( side_i, side_i ), guard_bits ) ); // (q_in + q_in - guard_bits) } +#endif } ELSE { +#ifdef FIX_818_COMPLEXITY_IMPROV + FOR( i = 0; i < len; i++ ) + { + mono_i = round_fx( L_mac( L_mult( L[i], ONE_IN_Q14 ), R[i], ONE_IN_Q14 ) ); // q_in + W_corrL = W_mac0_16_16( W_corrL, L[i], mono_i ); // (q_in + q_in ) + W_corrR = W_mac0_16_16( W_corrR, R[i], mono_i ); // (q_in + q_in ) + W_ener = W_mac0_16_16( W_ener, mono_i, mono_i ); // (q_in + q_in ) + side_i = round_fx( L_msu( L_mult( L[i], ONE_IN_Q14 ), R[i], ONE_IN_Q14 ) ); // q_in + W_ener_side = W_mac0_16_16( W_ener_side, side_i, side_i ); // (q_in + q_in ) + } + /* Scaling back to the original proposal */ + corrL = W_extract_h( W_shl( W_corrL, guard_bits ) ); + corrR = W_extract_h( W_shl( W_corrR, guard_bits ) ); + ener = W_extract_h( W_shl( W_ener, guard_bits ) ); + ener_side = W_extract_h( W_shl( W_ener_side, guard_bits ) ); +#else FOR( i = 0; i < len; i++ ) { mono_i = add( shr( L[i], Q1 ), shr( R[i], Q1 ) ); // q_in @@ -2219,6 +2296,7 @@ static void Get_corr_n_fx( side_i = sub( shr( L[i], Q1 ), shr( R[i], Q1 ) ); // q_in ener_side = L_add( ener_side, L_shr( L_mult0( side_i, side_i ), guard_bits ) ); // (q_in + q_in - guard_bits) } +#endif } *ic_Lm = BASOP_Util_Divide3232_Scale_cadence( corrL, ener, &exp_diff ); // (Q31 - exp_diff) -- GitLab From a88b495c34a6c0c9d060fa8257de4c1e2b49b65c Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 24 Jul 2024 21:52:52 +0530 Subject: [PATCH 103/110] Encoder functions converted to fixed point [x] Converted apply_MCT_enc and its sub-functions in ivas_mct_enc_mct.c [x] Removed redundant flags from TCX_ENC_DATA [x] igf_enc.c functions converted to fixed point [x] Encoder related functions in lsf_tools converted to fixed point --- lib_com/bitstream.c | 51 +- lib_com/cnst.h | 2 + lib_com/codec_tcx_common_flt.c | 2 +- lib_com/enh64.c | 2 +- lib_com/enh64.h | 2 - lib_com/ivas_prot.h | 23 +- lib_com/ivas_prot_fx.h | 30 + lib_com/lsf_tools.c | 52 ++ lib_com/prot.h | 80 +- lib_com/prot_fx.h | 40 + lib_com/tools.c | 70 +- lib_enc/arith_coder_enc.c | 30 +- lib_enc/arith_coder_enc_fx.c | 2 +- lib_enc/bw_detect_fx.c | 56 +- lib_enc/cod_tcx.c | 6 +- lib_enc/cod_tcx_fx.c | 18 +- lib_enc/core_enc_2div_fx.c | 8 +- lib_enc/core_enc_init.c | 7 +- lib_enc/core_enc_init_fx.c | 2 +- lib_enc/core_enc_ol_fx.c | 4 +- lib_enc/core_enc_reconf.c | 4 +- lib_enc/core_enc_reconf_fx.c | 4 +- lib_enc/ext_sig_ana_fx.c | 4 +- lib_enc/fd_cng_enc.c | 29 +- lib_enc/igf_enc.c | 970 ++++++++++++++++++++++- lib_enc/igf_enc_fx.c | 28 +- lib_enc/init_enc.c | 5 + lib_enc/ivas_mct_core_enc.c | 538 ++++++++++++- lib_enc/ivas_mct_enc.c | 162 +++- lib_enc/ivas_mct_enc_mct.c | 1124 ++++++++++++++++++++++++--- lib_enc/ivas_stat_enc.h | 8 + lib_enc/ivas_stereo_mdct_core_enc.c | 39 +- lib_enc/ivas_stereo_switching_enc.c | 6 + lib_enc/prot_fx_enc.h | 18 +- lib_enc/stat_enc.h | 20 +- lib_enc/tcx_utils_enc.c | 105 ++- lib_enc/tcx_utils_enc_fx.c | 2 +- 37 files changed, 3303 insertions(+), 250 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 9f9159a34..975dd3293 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -1571,6 +1571,8 @@ ivas_error push_indice( /* updates */ hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); + move16(); + move16(); return error; } @@ -1632,7 +1634,54 @@ ivas_error push_indice( * * Push a new indice into the buffer at the next position *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error push_next_indice( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + UWord16 value, /* i : value of the quantized indice */ + Word16 nb_bits /* i : number of bits used to quantize the indice */ +) +{ + Word16 prev_id; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + /* check the limits of the list of indices */ + IF( ( error = check_ind_list_limits( hBstr ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* get the id of the previous indice -> it will be re-used */ + IF( hBstr->nb_ind_tot > 0 ) + { + prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; + } + ELSE + { + prev_id = 0; + } + move16(); + + /* store the values in the list */ + hBstr->ind_list[hBstr->nb_ind_tot].id = prev_id; + hBstr->ind_list[hBstr->nb_ind_tot].value = value; + hBstr->ind_list[hBstr->nb_ind_tot].nb_bits = nb_bits; + move16(); + move16(); + move16(); + + /* updates */ + hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); + hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); + move16(); + move16(); + + return error; +} +#else ivas_error push_next_indice( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ uint16_t value, /* i : value of the quantized indice */ @@ -1672,7 +1721,7 @@ ivas_error push_next_indice( return error; } - +#endif /*-------------------------------------------------------------------* * push_next_bits() diff --git a/lib_com/cnst.h b/lib_com/cnst.h index f1ce84dde..53b1d4723 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -156,6 +156,8 @@ #define RANDOM_INITSEED 21845 /* Seed for random generators */ #ifndef FLT_MIN #define FLT_MIN ( 1.175494351e-38F ) +#define FLT_MIN_10_EXP (-37) // min decimal exponent +#define FLT_MIN_EXP (-125) // min binary exponent #endif #ifndef FLT_MAX #define FLT_MAX ( 3.402823466e+38F ) diff --git a/lib_com/codec_tcx_common_flt.c b/lib_com/codec_tcx_common_flt.c index 12e7d8099..a9314e871 100644 --- a/lib_com/codec_tcx_common_flt.c +++ b/lib_com/codec_tcx_common_flt.c @@ -145,7 +145,7 @@ void tcxInvertWindowGrouping_flt( float xn_buf[], float spectrum[], const int16_t L_frame, - const int16_t fUseTns, + const int8_t fUseTns, const int16_t last_core, const int16_t index, const int16_t frame_cnt, diff --git a/lib_com/enh64.c b/lib_com/enh64.c index 66068baba..b59a9ef6c 100644 --- a/lib_com/enh64.c +++ b/lib_com/enh64.c @@ -1062,7 +1062,6 @@ Word64 W_msu_16_16( Word64 L64_var1, Word16 var2, Word16 var3 ) return L64_var_out; } -/* Below BASOP is not part of STL 2023 library, might be proposed in next update */ /*________________________________________________________________________________________________ | | | Function Name : W_mac_32_32 | @@ -1112,6 +1111,7 @@ Word64 W_mac_32_32( Word64 L64_var1, Word32 L_var2, Word32 L_var3 ) return L64_var_out; } + /*___________________________________________________________________________ | | | Function Name : W_shl_sat_l | diff --git a/lib_com/enh64.h b/lib_com/enh64.h index 8abfd0e80..efc58e83e 100644 --- a/lib_com/enh64.h +++ b/lib_com/enh64.h @@ -36,8 +36,6 @@ Word64 W_msu0_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ); Word64 W_mult_16_16( Word16 var1, Word16 var2 ); Word64 W_mac_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ); Word64 W_msu_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ); - -/* BASOP W_mac_32_32 is not part of STL 2023 library, might be proposed in next update */ Word64 W_mac_32_32( Word64 L64_acc, Word32 var1, Word32 var2 ); Word64 W_deposit32_l( Word32 L_var1 ); diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 5c0c6a91f..80cdef0de 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -45,6 +45,10 @@ #include "ivas_stat_com.h" #include "ivas_error_utils.h" +#ifdef IVAS_FLOAT_FIXED +#define IVAS_FLOAT_FIXED_TO_BE_REMOVED +#endif // IVAS_FLOAT_FIXED + /* clang-format off */ /*----------------------------------------------------------------------------------* @@ -3278,7 +3282,7 @@ void ComputeSpectrumNoiseMeasure( const int16_t L_frame, const int16_t startLine, const int16_t resetMemory, - int16_t *noiseFlags, + int8_t *noiseFlags, const int16_t lowpassLine ); @@ -3962,6 +3966,23 @@ void getChannelEnergies( float nrg[MCT_MAX_CHANNELS], /* o : energies */ const int16_t nchan /* i : number of channels */ ); +#ifdef IVAS_FLOAT_FIXED +void mctStereoIGF_enc_fx( + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ + Word32 *orig_spectrum_fx[MCT_MAX_CHANNELS][2], /* i : MDCT spectrum for ITF */ + Word32 powerSpec_fx[MCT_MAX_CHANNELS][L_FRAME48k], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate*/ + Word32 *powerSpecMsInv_fx[MCT_MAX_CHANNELS][NB_DIV], /* i : same as above but for inverse spect.*/ + Word32 *inv_spectrum_fx[MCT_MAX_CHANNELS][NB_DIV], /* i : inverse spectrum */ +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED + float *orig_spectrum[MCT_MAX_CHANNELS][2], /* i : MDCT spectrum for ITF */ + float powerSpec[MCT_MAX_CHANNELS][L_FRAME48k], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate*/ + float *powerSpecMsInv[MCT_MAX_CHANNELS][NB_DIV], /* i : same as above but for inverse spect.*/ + float *inv_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i : inverse spectrum */ +#endif + const Word16 sp_aud_decision0[MCT_MAX_CHANNELS] /* i : speech audio decision */ +); +#endif // IVAS_FLOAT_FIXED void mctStereoIGF_enc( MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 9ea7a8264..8ed4fd451 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -2516,6 +2516,36 @@ void stereo_coder_tcx_fx( Word32 *inv_mdst_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ const Word16 mct_on, /* i : flag mct block (1) or stereo (0) */ Word16 q_spec ); + +// bw_detect_fx.c +Word16 set_bw_mct_fx( + CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE encoder structures */ + const Word16 nCPE /* i : number of CPEs */ +); + + +// ivas_mct_enc_mct.c +void write_mct_bitstream_fx( + Encoder_State **sts, /* i/o: encoder state structure */ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + const Word16 nchan /* i : number of channels */ +); + +void getChannelEnergies_fx( + Encoder_State **sts, /* i/o: Encoder state structure */ + Word32 nrg[MCT_MAX_CHANNELS], /* o : buffer with energies for each channel */ + Word16 nrg_e[MCT_MAX_CHANNELS], /* o : exponents of energies for each channel */ + const Word16 nchan /* i : number of channels */ +); + +void apply_MCT_enc_fx( + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ + Word32 *mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: MDST spectrum */ + Word32 *inv_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse spectrum */ + Word32 *inv_mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ + const Word16 nchan /* i : number of channels */ +); #endif void ivas_spar_config_fx( diff --git a/lib_com/lsf_tools.c b/lib_com/lsf_tools.c index ddce7c199..f13362be5 100644 --- a/lib_com/lsf_tools.c +++ b/lib_com/lsf_tools.c @@ -2828,6 +2828,58 @@ void extend_dctN_input( return; } +#ifdef IVAS_FLOAT_FIXED +void extend_dctN_input_fx( + const Word32 *input, /* i : input in fdcng domain -> Q */ + const Word32 *dct_input, /* i : input in dctN(fdcng) domain -> Q */ + const Word16 in_dim, /* i : in_dim == N */ + Word32 *ext_sig, /* o : extended output in fdcng domain Q */ + const Word16 out_dim, /* i : output total dim */ + Word32 *matrix, /* i : idct synthesis matrix N rows, n_cols columns -> Q31*/ + const Word16 n_cols, /* i : number of columns == DCT truncation length */ + const DCTTYPE dcttype /* i : matrix operation type */ +) +{ + Word16 i, j, i_rev; + const Word32( *ptr )[FDCNG_VQ_DCT_MAXTRUNC] = (void *) matrix; + + /* stored format is an IDCT_Nx(FDCNG_VQ_DCT_MAXTRUNC) matrix */ + assert( in_dim < FDCNG_VQ_MAX_LEN ); + assert( out_dim <= FDCNG_VQ_MAX_LEN ); + assert( out_dim > in_dim ); + assert( n_cols == FDCNG_VQ_DCT_MAXTRUNC ); /* for *ptr[MAX_TRUNC] adressing*/ + assert( ( dcttype & 1 ) != 0 ); /* idct tables always in use for this basis vector extension */ + + Copy32( input, ext_sig, in_dim ); /* copy initial part, i.e. only last/tail parts are extended */ + set32_fx( &( ext_sig[in_dim] ), 0, out_dim - in_dim ); + + i_rev = in_dim; /*ptr init*/ + move16(); + + FOR( i = in_dim; i < out_dim; i++ ) + { /* for each extension sample */ + /* i = 21 22 23; + i_rev = 20 19 18; for odd dctII reflect basis vector + */ + i_rev = sub( i_rev, 1 ); + + FOR( j = 0; j < n_cols; j++ ) /* for each available DCT coeff */ + { + /* DCTcoeff * reflected basis vector */ +#define WMC_TOOL_SKIP + /* pure ptr MAC operations */ + ext_sig[i] = L_add( ext_sig[i], Mpy_32_32( dct_input[j], ptr[i_rev][j] ) ); /* sum up scaled and extended basis vector */ + move32(); + // Q31 + Q - Q31 -> Q + MAC( 1 ); +#undef WMC_TOOL_SKIP + } + } + + return; +} + +#endif /*-------------------------------------------------------------------* * create_IDCT_N_Matrix() diff --git a/lib_com/prot.h b/lib_com/prot.h index 1dbf548a6..a234bdbd9 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -475,17 +475,33 @@ ivas_error push_indice( int16_t nb_bits /* i : number of bits used to quantize the indice */ ); +#ifdef IVAS_FLOAT_FIXED +ivas_error push_next_indice( + BSTR_ENC_HANDLE hBstr, + UWord16 value, /* i : value of the quantized indice */ + Word16 nb_bits /* i : number of bits used to quantize the indice */ +); +#else ivas_error push_next_indice( BSTR_ENC_HANDLE hBstr, uint16_t value, /* i : value of the quantized indice */ int16_t nb_bits /* i : number of bits used to quantize the indice */ ); +#endif // IVAS_FLOAT_FIXED +#ifdef IVAS_FLOAT_FIXED +ivas_error push_next_bits( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const UWord16 bits[], /* i : bit buffer to pack, sequence of single bits */ + const Word16 nb_bits /* i : number of bits to pack */ +); +#else ivas_error push_next_bits( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const uint16_t bits[], /* i : bit buffer to pack, sequence of single bits */ const int16_t nb_bits /* i : number of bits to pack */ ); +#endif // IVAS_FLOAT_FIXED /*! r: maximum number of indices */ int16_t get_ivas_max_num_indices( @@ -7244,7 +7260,7 @@ void TNSAnalysis( TRAN_DET_HANDLE hTranDet, /* i : handle transient detection */ const float ltp_gain, /* i : ltp gain */ STnsData *pTnsData, /* o : TNS data */ - int16_t *pfUseTns, /* o : Flag indicating if TNS is used */ + int8_t *pfUseTns, /* o : Flag indicating if TNS is used */ float *predictionGain /* o : TNS prediction gain */ ); @@ -7262,7 +7278,7 @@ void ShapeSpectrum( const int16_t L_frame_glob, /* i : frame length */ int16_t L_spec, /* i : length of the spectrum */ float spectrum[], /* i/o: MDCT spectrum */ - const int16_t fUseTns, /* i : Flag indicating if TNS is used */ + const int8_t fUseTns, /* i : Flag indicating if TNS is used */ Encoder_State *st, /* i/o: encoder state structure */ float *scf /* i : scale factors */ ); @@ -7430,6 +7446,27 @@ void ProcessIGF( const int16_t sp_aud_decision0, /* i : first stage switching decision */ const int16_t vad_hover_flag /* i : VAD hangover flag */ ); +#ifdef IVAS_FLOAT_FIXED +void ProcessStereoIGF_fx( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, + Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ + int16_t ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ +#if 1 + Word32 *pITFMDCTSpectrum_fx[CPE_CHANNELS][NB_DIV], /* i : MDCT spectrum fir ITF */ + Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ +#endif + float *pITFMDCTSpectrum[CPE_CHANNELS][NB_DIV], /* i : MDCT spectrum fir ITF */ + float *pPowerSpectrum[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + float *pPowerSpectrumMsInv[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ + float *inv_spectrum[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ + const int16_t frameno, /* i : flag indicating index of current subfr. */ + const int16_t sp_aud_decision0, /* i : sp_aud_decision0 */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ +); +#endif // IVAS_FLOAT_FIXED void ProcessStereoIGF( STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, @@ -7514,12 +7551,12 @@ float SQ_gain_estimate( void tcx_scalar_quantization( - float *x, /* i : input coefficients */ - int16_t *xq, /* o : quantized coefficients */ - const int16_t L_frame, /* i : frame length */ - const float gain, /* i : quantization gain */ - const float offset, /* i : rounding offset (deadzone) */ - int16_t *memQuantZeros, /* o : coefficients set to 0 */ + float *x, /* i : input coefficients */ + int16_t *xq, /* o : quantized coefficients */ + const int16_t L_frame, /* i : frame length */ + const float gain, /* i : quantization gain */ + const float offset, /* i : rounding offset (deadzone) */ + int8_t *memQuantZeros, /* o : coefficients set to 0 */ const int16_t tcxonly ); int16_t tcx_scalar_quantization_rateloop( @@ -7528,7 +7565,7 @@ int16_t tcx_scalar_quantization_rateloop( const int16_t L_frame, /* i : frame length */ float *gain, /* i/o: quantization gain */ float offset, /* i : rounding offset (deadzone) */ - int16_t *memQuantZeros, /* o : coefficients set to 0 */ + int8_t *memQuantZeros, /* o : coefficients set to 0 */ int16_t *lastnz_out, /* i/o: last nonzero coeff index */ const int16_t target, /* i : target number of bits */ int16_t *nEncoded, /* o : number of encoded coeff */ @@ -9483,7 +9520,7 @@ void tcxInvertWindowGrouping_flt( float xn_buf[], float spectrum[], const int16_t L_frame, - const int16_t fUseTns, + const int8_t fUseTns, const int16_t last_core, const int16_t index, const int16_t frame_cnt, @@ -9964,10 +10001,31 @@ void IGFEncApplyMono( float *pMDCTSpectrum, /* i/o: MDCT spectrum */ float *pPowerSpectrum, /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ const int16_t isTCX20, /* i : flag indicating if the input is TCX20 or TCX10/2xTCX5 */ - const int16_t isTNSActive, /* i : flag indicating if the TNS is active */ + const int8_t isTNSActive, /* i : flag indicating if the TNS is active */ const int16_t sp_aud_decision0, /* i : first stage switching decision */ const int16_t vad_hover_flag /* i : VAD hangover flag */ ); +#ifdef IVAS_FLOAT_FIXED +void IGFEncApplyStereo_fx( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ + int16_t ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ + const IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS], /* i : instance handle of IGF Encoder */ + const int16_t igfGridIdx, /* i : IGF grid index */ + Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ + Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ +#if 1 + float *pPowerSpectrum[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + float *pPowerSpectrumMsInv[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ + float *inv_spectrum[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ +#endif + const int16_t frameno, /* i : flag indicating index of current subfr. */ + const int16_t sp_aud_decision0, /* i : sp_aud_decision0 */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ +); +#endif // IVAS_FLOAT_FIXED void IGFEncApplyStereo( STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index b3e016846..b51d561b0 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -5650,6 +5650,15 @@ Word32 dotp_fixed_o( const Word16 n, /* i : vector length */ const Word16 log_len, /* i : max factor added to result q after dot product (equal to log2(n)) */ Word16 *res_q ); + +Word32 dotp_fixed_32( + const Word32 x[], /* i : vector x[] */ + const Word32 y[], /* i : vector y[] */ + const Word16 n, /* i : vector length */ + const Word16 log_len, /* i : max factor added to result q after dot product (equal to log2(n)) */ + Word16 *res_q /*stores resultant Q*/ +); + #ifdef IVAS_FLOAT_FIXED Word32 dotp_fixed_guarded( const Word32 x[], /* i : vector x[] */ @@ -9877,6 +9886,17 @@ void dctT2_N_apply_matrix_fx( const DCTTYPE dcttype /* i : matrix operation type */ ); +void extend_dctN_input_fx( + const Word32 *input, /* i : input in fdcng domain */ + const Word32 *dct_input, /* i : input in dctN(fdcng) domain */ + const Word16 in_dim, /* i : in_dim == N */ + Word32 *ext_sig, /* o : extended output in fdcng domain */ + const Word16 out_dim, /* i : output total dim */ + Word32 *matrix, /* i : idct synthesis matrix N rows, n_cols columns */ + const Word16 n_cols, /* i : number of columns == DCT truncation length */ + const DCTTYPE dcttype /* i : matrix operation type */ +); + Word32 sum2_f_32_fx( const Word32 *vec, /* i : input vector */ const int16_t lvec, /* i : length of input vector */ @@ -10080,4 +10100,24 @@ void swb_pre_proc_ivas_fx( float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : imag buffer */ CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ ); + +// tools.c +Word32 sum2_f_32_fx( /* o : Q(2x - 31 - gb) */ + const Word32 *vec, /* i : input vector, Qx */ + const Word16 lvec, /* i : length of input vector */ + Word16 gb /* i : guard bits */ +); + +Word32 sum2_32_exp_fx( + const Word32 *vec, /* i : input vector, Qx */ + const Word16 lvec, /* i : length of input vector */ + Word16 *exp, /* i/o: exponent of vector */ + Word16 gb /* i : guard bits */ +); + +Word32 sum2_32_fx( + const Word32 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ + Word16 *e ); + #endif diff --git a/lib_com/tools.c b/lib_com/tools.c index a2912019d..dc2ee58fb 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -231,10 +231,41 @@ float sum2_f( } #ifdef IVAS_FLOAT_FIXED -Word32 sum2_f_32_fx( - const Word32 *vec, /* i : input vector */ - const Word16 lvec, /* i : length of input vector */ - Word16 gb ) +Word32 sum2_32_exp_fx( + const Word32 *vec, /* i : input vector, Qx */ + const Word16 lvec, /* i : length of input vector */ + Word16 *exp, /* i/o: exponent of vector */ + Word16 gb /* i : guard bits */ +) +{ + Word16 i, s; + Word64 W_tmp; + + W_tmp = 0; + Word64 var_a = 0; + move64(); + move64(); + FOR( i = 0; i < lvec; i++ ) + { + var_a = W_mult0_32_32( vec[i], vec[i] ); // 2x + W_tmp = W_add( W_tmp, W_shr( var_a, gb ) ); // 2x-gb + } + + s = W_norm( W_tmp ); + W_tmp = W_shl( W_tmp, s ); // 2x - gb + s + + //*exp = 31 - (2*(31 - *exp) - gb + s) + 32; + *exp = add( sub( add( shl( *exp, 1 ), gb ), s ), 1 ); + move16(); + + return W_extract_h( W_tmp ); +} + +Word32 sum2_f_32_fx( /* o : Q(2x - 31 - gb) */ + const Word32 *vec, /* i : input vector, Qx */ + const Word16 lvec, /* i : length of input vector */ + Word16 gb /* i : guard bits */ +) { Word16 i; Word32 tmp; @@ -1174,6 +1205,37 @@ Word32 dotp_fixed_o( } return W_extract_l( suma ); } + +Word32 dotp_fixed_32( + const Word32 x[], /* i : vector x[] */ + const Word32 y[], /* i : vector y[] */ + const Word16 n, /* i : vector length */ + const Word16 log_len, /* i : max factor added to result q after dot product (equal to log2(n)) */ + Word16 *res_q /*stores resultant Q*/ +) +{ + Word16 i; + Word64 suma; /*resultant q= q(x)+q(y)-9-x such that q<=31*/ + + suma = W_shr( W_mult_32_32( x[0], y[0] ), log_len ); + + FOR( i = 1; i < n; i++ ) + { + suma = W_add( suma, W_shr( W_mult_32_32( x[i], y[i] ), log_len ) ); + } + *res_q = add( *res_q, add( sub( *res_q, log_len ), 1 ) ); + move16(); + test(); + test(); + WHILE( GT_64( suma, MAX_32 ) || LT_64( suma, MIN_32 ) || GT_16( *res_q, 31 ) ) + { + suma = W_shr( suma, 1 ); + *res_q = sub( *res_q, 1 ); + move16(); + } + return W_extract_l( suma ); +} + /*---------------------------------------------------------------------* * inv_sqrt() * diff --git a/lib_enc/arith_coder_enc.c b/lib_enc/arith_coder_enc.c index f531d9ed0..3b5c8dea9 100644 --- a/lib_enc/arith_coder_enc.c +++ b/lib_enc/arith_coder_enc.c @@ -248,11 +248,11 @@ static float tcx_arith_find_max_scale( /*! r: index of highest freq. nonzero line (-1 if all zeros) */ static int16_t tcx_arith_find_kMax( - const float abs_spectrum[], /* i : absolute MDCT coefficients */ - const int16_t L_frame, /* i : number of spectral lines */ - const float scale, /* i : scalar quantizer scale */ - const float deadzone, /* i : deadzone (0.5f = no deadzone) */ - const int16_t deadzone_flags[] /* i : line-wise deadzone control */ + const float abs_spectrum[], /* i : absolute MDCT coefficients */ + const int16_t L_frame, /* i : number of spectral lines */ + const float scale, /* i : scalar quantizer scale */ + const float deadzone, /* i : deadzone (0.5f = no deadzone) */ + const int8_t deadzone_flags[] /* i : line-wise deadzone control */ ) { int16_t kMax; @@ -275,15 +275,15 @@ static int16_t tcx_arith_find_kMax( /*! r: best scale */ static float tcx_arith_rateloop( - const float abs_spectrum[], /* i : absolute MDCT coefficients */ - const int16_t L_frame, /* i : number of spectral lines */ - const Word16 envelope[], /* i : scaled envelope (Q15-e) */ - const Word16 envelope_e, /* i : scaled envelope exponent (Q0) */ - const Word16 exps[], /* i : expfp_evs(-(integer)envelope[]/2) */ - const int16_t target_bits, /* i : target bit budget */ - const float deadzone, /* i : deadzone (0.5f = no deadzone) */ - const int16_t deadzone_flags[], /* i : line-wise deadzone control */ - float *target_bits_fac /* i/o: scale estimator compensation */ + const float abs_spectrum[], /* i : absolute MDCT coefficients */ + const int16_t L_frame, /* i : number of spectral lines */ + const Word16 envelope[], /* i : scaled envelope (Q15-e) */ + const Word16 envelope_e, /* i : scaled envelope exponent (Q0) */ + const Word16 exps[], /* i : expfp_evs(-(integer)envelope[]/2) */ + const int16_t target_bits, /* i : target bit budget */ + const float deadzone, /* i : deadzone (0.5f = no deadzone) */ + const int8_t deadzone_flags[], /* i : line-wise deadzone control */ + float *target_bits_fac /* i/o: scale estimator compensation */ ) { int16_t k, idx, kMax, q; @@ -594,7 +594,7 @@ void tcx_arith_encode_envelope( float scale; int16_t k, kMax; float deadzone; - const int16_t *deadzone_flags; + const int8_t *deadzone_flags; float gamma_w, gamma_uw; int16_t hm_bits; diff --git a/lib_enc/arith_coder_enc_fx.c b/lib_enc/arith_coder_enc_fx.c index ce9f146d8..6b137f31e 100644 --- a/lib_enc/arith_coder_enc_fx.c +++ b/lib_enc/arith_coder_enc_fx.c @@ -715,7 +715,7 @@ void tcx_arith_encode_envelope_fx( hTcxCfg = st->hTcxCfg; deadzone = hTcxCfg->sq_rounding; move16(); - deadzone_flags = hTcxEnc->memQuantZeros_fx; + deadzone_flags = hTcxEnc->memQuantZeros; *signaling_bits = 0; move16(); diff --git a/lib_enc/bw_detect_fx.c b/lib_enc/bw_detect_fx.c index 9660075e6..3cc6784de 100644 --- a/lib_enc/bw_detect_fx.c +++ b/lib_enc/bw_detect_fx.c @@ -5,13 +5,13 @@ #include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ -//#include "prot_fx.h" /* Function prototypes */ #include "rom_enc.h" /* Encoder static table prototypes */ #include "rom_com.h" #include "basop_util.h" #include "ivas_cnst.h" -#include "prot_fx.h" /* Function prototypes */ -#include "prot_fx_enc.h" /* Function prototypes */ +#include "prot_fx.h" /* Function prototypes */ +#include "ivas_prot_fx.h" /* Function prototypes */ +#include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* * Local constants @@ -1067,7 +1067,7 @@ void set_bw_stereo( return; } - +#endif /*-------------------------------------------------------------------* * set_bw_mct() * @@ -1075,54 +1075,58 @@ void set_bw_stereo( *-------------------------------------------------------------------*/ /*! r: flag indicating whether the coded BW has changed */ -int16_t set_bw_mct( +Word16 set_bw_mct_fx( CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE encoder structures */ - const int16_t nCPE /* i : number of CPEs */ + const Word16 nCPE /* i : number of CPEs */ ) { - Encoder_State *sts[MCT_MAX_CHANNELS]; - int16_t ch, cpe_id; - int16_t mct_bwidth, last_mct_bwidth, bw_changed; + Encoder_State *st; + Word16 ch, cpe_id; + Word16 mct_bwidth, last_mct_bwidth, bw_changed; mct_bwidth = WB; /* minimum coded audio band-width */ last_mct_bwidth = hCPE[0]->hCoreCoder[0]->last_bwidth; /* supposes that LFE is not in the first channel */ + move16(); + move16(); - for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) { - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - sts[ch] = hCPE[cpe_id]->hCoreCoder[ch]; - if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + st = hCPE[cpe_id]->hCoreCoder[ch]; + IF( EQ_32( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { - continue; + CONTINUE; } - mct_bwidth = max( mct_bwidth, sts[ch]->input_bwidth ); + mct_bwidth = s_max( mct_bwidth, st->input_bwidth ); } } - for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + + FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) { - if ( hCPE[cpe_id]->element_brate > BWD_MAX_BRATE_WIDER_BW_MDCT ) + IF( GT_32( hCPE[cpe_id]->element_brate, BWD_MAX_BRATE_WIDER_BW_MDCT ) ) { - mct_bwidth = max( mct_bwidth, hCPE[cpe_id]->hCoreCoder[0]->max_bwidth ); + mct_bwidth = s_max( mct_bwidth, hCPE[cpe_id]->hCoreCoder[0]->max_bwidth ); } } + bw_changed = 0; - if ( mct_bwidth != last_mct_bwidth ) + move16(); + IF( NE_16( mct_bwidth, last_mct_bwidth ) ) { bw_changed = 1; + move16(); - for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) { - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - sts[ch] = hCPE[cpe_id]->hCoreCoder[ch]; - sts[ch]->bwidth = mct_bwidth; + st = hCPE[cpe_id]->hCoreCoder[ch]; + st->bwidth = mct_bwidth; + move16(); } } } - return bw_changed; } - -#endif diff --git a/lib_enc/cod_tcx.c b/lib_enc/cod_tcx.c index 96acb8f40..77da3cd29 100644 --- a/lib_enc/cod_tcx.c +++ b/lib_enc/cod_tcx.c @@ -580,7 +580,7 @@ void TNSAnalysis( TRAN_DET_HANDLE hTranDet, /* i : handle transient detection */ const float ltp_gain, /* i : ltp gain */ STnsData *pTnsData, /* o : TNS data */ - int16_t *pfUseTns, /* o : Flag indicating if TNS is used */ + int8_t *pfUseTns, /* o : Flag indicating if TNS is used */ float *predictionGain /* o : TNS prediction gain */ ) { @@ -615,7 +615,7 @@ void TNSAnalysis( } } - *pfUseTns = DetectTnsFilt( hTcxCfg->pCurrentTnsConfig, spectrum, hTranDet, transform_type != TCX_20, ltp_gain, pTnsData, predictionGain ); + *pfUseTns = (Word8) DetectTnsFilt( hTcxCfg->pCurrentTnsConfig, spectrum, hTranDet, transform_type != TCX_20, ltp_gain, pTnsData, predictionGain ); /* If TNS should be used then get the residual after applying it inplace in the spectrum */ @@ -661,7 +661,7 @@ void ShapeSpectrum( const int16_t L_frame_glob, /* i : frame length */ int16_t L_spec, /* i : length of the spectrum */ float spectrum[], /* i/o: MDCT spectrum */ - const int16_t fUseTns, /* i : Flag indicating if TNS is used */ + const int8_t fUseTns, /* i : Flag indicating if TNS is used */ Encoder_State *st, /* i/o: encoder state structure */ float *scf /* i : scale factors */ ) diff --git a/lib_enc/cod_tcx_fx.c b/lib_enc/cod_tcx_fx.c index 0b74d6de4..0a747b477 100644 --- a/lib_enc/cod_tcx_fx.c +++ b/lib_enc/cod_tcx_fx.c @@ -1406,7 +1406,7 @@ void QuantizeSpectrum_fx( L_spec, sqGain, sqGain_e, hTcxCfg->sq_rounding, - hTcxEnc->memQuantZeros_fx, + hTcxEnc->memQuantZeros, tcxonly ); /* Estimate original bitrate */ @@ -1500,7 +1500,7 @@ void QuantizeSpectrum_fx( L_spec, sqGain, sqGain_e, hTcxCfg->sq_rounding, - hTcxEnc->memQuantZeros_fx, + hTcxEnc->memQuantZeros, tcxonly ); /* Estimate bitrate */ @@ -1566,7 +1566,7 @@ void QuantizeSpectrum_fx( L_spec, &sqGain, &sqGain_e, hTcxCfg->sq_rounding, - hTcxEnc->memQuantZeros_fx, + hTcxEnc->memQuantZeros, prm_lastnz, /* lastnz */ sqTargetBits, &nEncoded, @@ -1698,7 +1698,7 @@ void QuantizeSpectrum_fx( L_spec, sqGain, sqGain_e, hTcxCfg->sq_rounding, - hTcxEnc->memQuantZeros_fx, + hTcxEnc->memQuantZeros, tcxonly ); move16(); @@ -2885,25 +2885,25 @@ void coder_tcx_fx( test(); SetTnsConfig( hTcxCfg, sub( L_frame_glob, st->L_frame ) == 0, st->last_core == 0 ); - TNSAnalysis_fx( hTcxCfg, L_frame, L_spec, TCX_20, st->last_core == 0, spectrum, hTcxEnc->tnsData, hTcxEnc->fUseTns_fx, &st->hIGFEnc->tns_predictionGain ); + TNSAnalysis_fx( hTcxCfg, L_frame, L_spec, TCX_20, st->last_core == 0, spectrum, hTcxEnc->tnsData, hTcxEnc->fUseTns, &st->hIGFEnc->tns_predictionGain ); } ELSE { - hTcxEnc->fUseTns_fx[0] = hTcxEnc->fUseTns_fx[1] = 0; + hTcxEnc->fUseTns[0] = hTcxEnc->fUseTns[1] = 0; move16(); move16(); } IF( st->igf ) { - ProcessIGF_fx( st->hIGFEnc, st, spectrum, spectrum_e, powerSpec, &powerSpec_e, 1, hTcxEnc->fUseTns_fx[0], ( st->last_core == ACELP_CORE ), 0 ); + ProcessIGF_fx( st->hIGFEnc, st, spectrum, spectrum_e, powerSpec, &powerSpec_e, 1, hTcxEnc->fUseTns[0], ( st->last_core == ACELP_CORE ), 0 ); } ShapeSpectrum_fx( hTcxCfg, A, gainlpc, gainlpc_e, L_frame_glob, L_spec, spectrum, - hTcxEnc->fUseTns_fx[0], + hTcxEnc->fUseTns[0], st ); if ( st->igf ) { @@ -2926,7 +2926,7 @@ void coder_tcx_fx( tcxonly, spectrum, spectrum_e, hTcxEnc->tnsData, - hTcxEnc->fUseTns_fx[0], + hTcxEnc->fUseTns[0], tnsSize, prm, n, diff --git a/lib_enc/core_enc_2div_fx.c b/lib_enc/core_enc_2div_fx.c index f0527f0eb..151561b09 100644 --- a/lib_enc/core_enc_2div_fx.c +++ b/lib_enc/core_enc_2div_fx.c @@ -178,7 +178,7 @@ void core_encode_twodiv_fx( shr( st->L_frame, 1 ), shr( st->hTcxCfg->tcx_coded_lines, 1 ), spectrum[n], - hTcxEnc->fUseTns_fx[n], + hTcxEnc->fUseTns[n], st ); st->last_core = st->core; @@ -238,7 +238,7 @@ void core_encode_twodiv_fx( spectrum[n], &spectrum_e[n], hTcxEnc->tnsData + n, - hTcxEnc->fUseTns_fx[n], + hTcxEnc->fUseTns[n], tnsSize[n], param_core + n * NPRM_DIV, n, @@ -274,7 +274,7 @@ void core_encode_twodiv_fx( st->L_frame, st->hTcxCfg->tcx_coded_lines, spectrum[0], - hTcxEnc->fUseTns_fx[0], + hTcxEnc->fUseTns[0], st ); /*_DIFF_FLOAT_FIX_ -> The line below is present in float */ @@ -314,7 +314,7 @@ void core_encode_twodiv_fx( spectrum[0], &spectrum_e[0], &hTcxEnc->tnsData[0], - hTcxEnc->fUseTns_fx[0], + hTcxEnc->fUseTns[0], tnsSize[0], param_core, 0, diff --git a/lib_enc/core_enc_init.c b/lib_enc/core_enc_init.c index e84ed8f3a..855ff8e89 100644 --- a/lib_enc/core_enc_init.c +++ b/lib_enc/core_enc_init.c @@ -255,6 +255,11 @@ static void init_tcx( TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; /* Share the memories for 2xTCX10/4xTCX5 and for TCX20 */ +#if 1 + hTcxEnc->spectrum_fx[0] = hTcxEnc->spectrum_long_fx; + hTcxEnc->spectrum_fx[1] = hTcxEnc->spectrum_long_fx + N_TCX10_MAX; +#endif + hTcxEnc->spectrum[0] = hTcxEnc->spectrum_long; hTcxEnc->spectrum[1] = hTcxEnc->spectrum_long + N_TCX10_MAX; #ifdef IVAS_FLOAT_FIXED @@ -271,7 +276,7 @@ static void init_tcx( hTcxEnc->noiseLevelMemory_cnt = 0; set_f( hTcxEnc->ltpGainMemory, 0.0f, N_LTP_GAIN_MEMS ); - set_s( hTcxEnc->memQuantZeros, 0, L_FRAME_PLUS ); + set_c( hTcxEnc->memQuantZeros, 0, L_FRAME_PLUS ); /* TCX-LTP */ hTcxEnc->tcxltp = getTcxLtp( st->sr_core ); diff --git a/lib_enc/core_enc_init_fx.c b/lib_enc/core_enc_init_fx.c index b3b305673..dba3ce835 100644 --- a/lib_enc/core_enc_init_fx.c +++ b/lib_enc/core_enc_init_fx.c @@ -340,7 +340,7 @@ static void init_tcx_fx( FOR( i = 0; i < L_FRAME_PLUS; i++ ) { - hTcxEnc->memQuantZeros_fx[i] = 0; + hTcxEnc->memQuantZeros[i] = 0; move16(); } diff --git a/lib_enc/core_enc_ol_fx.c b/lib_enc/core_enc_ol_fx.c index 4fe990ccb..9957ccdef 100644 --- a/lib_enc/core_enc_ol_fx.c +++ b/lib_enc/core_enc_ol_fx.c @@ -659,7 +659,7 @@ void core_encode_openloop_fx( && ( EQ_16( hTcxEnc->tcxltp_pitch_int, hRF->rf_tcxltp_pitch_int_past ) ) /*&& (st->tcxltp_pitch_int == st->rf_tcxltp_pitch_int_past)*/ && ( hRF->rf_last_tns_active == 0 ) /*!st->rf_last_tns_active*/ && ( hRF->rf_second_last_tns_active == 0 ) /*!st->rf_second_last_tns_active*/ - && ( ( st->hTcxCfg->fIsTNSAllowed & hTcxEnc->fUseTns_fx[0] ) == 0 ) /*!(st->hTcxCfg->fIsTNSAllowed & st->fUseTns[0])*/ + && ( ( st->hTcxCfg->fIsTNSAllowed & hTcxEnc->fUseTns[0] ) == 0 ) /*!(st->hTcxCfg->fIsTNSAllowed & st->fUseTns[0])*/ ) { rf_PLC_Mode = 1; @@ -698,7 +698,7 @@ void core_encode_openloop_fx( move16(); hRF->rf_second_last_tns_active = hRF->rf_last_tns_active; move16(); - hRF->rf_last_tns_active = ( st->hTcxCfg->fIsTNSAllowed & hTcxEnc->fUseTns_fx[0] ); + hRF->rf_last_tns_active = ( st->hTcxCfg->fIsTNSAllowed & hTcxEnc->fUseTns[0] ); move16(); hRF->rf_second_last_core = st->last_core; move16(); diff --git a/lib_enc/core_enc_reconf.c b/lib_enc/core_enc_reconf.c index 7eab3e742..67238f036 100644 --- a/lib_enc/core_enc_reconf.c +++ b/lib_enc/core_enc_reconf.c @@ -223,13 +223,13 @@ void core_coder_reconfig( if ( st->total_brate < ACELP_24k40 && ( ( st->total_brate > last_total_brate ) || ( st->last_codec_mode == MODE1 ) ) ) { /* low-freq memQuantZeros must be reset partially if bitrate increased */ - set_s( hTcxEnc->memQuantZeros, 0, hTcxEnc->nmStartLine ); + set_c( hTcxEnc->memQuantZeros, 0, hTcxEnc->nmStartLine ); } else { if ( st->total_brate >= ACELP_24k40 && st->total_brate <= ACELP_32k && last_total_brate >= ACELP_13k20 && last_total_brate < ACELP_24k40 ) { - set_s( hTcxEnc->memQuantZeros, 0, st->L_frame ); + set_c( hTcxEnc->memQuantZeros, 0, st->L_frame ); } } } diff --git a/lib_enc/core_enc_reconf_fx.c b/lib_enc/core_enc_reconf_fx.c index b66703f88..c4e4b16cd 100644 --- a/lib_enc/core_enc_reconf_fx.c +++ b/lib_enc/core_enc_reconf_fx.c @@ -310,7 +310,7 @@ void core_coder_reconfig_fx( /* low-freq memQuantZeros_fx must be reset partially if bitrate increased */ FOR( i = 0; i < hTcxEnc->nmStartLine; i++ ) { - hTcxEnc->memQuantZeros_fx[i] = 0; + hTcxEnc->memQuantZeros[i] = 0; move16(); } } @@ -318,7 +318,7 @@ void core_coder_reconfig_fx( { FOR( i = 0; i < st->L_frame; i++ ) /* memQuantZeros_fx won't be updated */ { - hTcxEnc->memQuantZeros_fx[i] = 0; + hTcxEnc->memQuantZeros[i] = 0; move16(); } } diff --git a/lib_enc/ext_sig_ana_fx.c b/lib_enc/ext_sig_ana_fx.c index f4c60b16f..e8db91a74 100644 --- a/lib_enc/ext_sig_ana_fx.c +++ b/lib_enc/ext_sig_ana_fx.c @@ -560,7 +560,7 @@ void core_signal_analysis_high_bitrate_fx( TNSAnalysis_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], ( frameno == 0 ) && ( st->last_core == ACELP_CORE ), - spectrum[frameno], &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns_fx[frameno], NULL ); + spectrum[frameno], &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL ); #ifdef IVAS_CODE IF( st->hTcxCfg->fIsTNSAllowed ) #endif @@ -607,7 +607,7 @@ void core_signal_analysis_high_bitrate_fx( } IF( st->igf ) { - ProcessIGF_fx( st->hIGFEnc, st, spectrum[frameno], &( spectrum_e[frameno] ), powerSpec, &powerSpec_e, transform_type[frameno] == TCX_20, hTcxEnc->fUseTns_fx[frameno], ( st->last_core == ACELP_CORE ), frameno ); + ProcessIGF_fx( st->hIGFEnc, st, spectrum[frameno], &( spectrum_e[frameno] ), powerSpec, &powerSpec_e, transform_type[frameno] == TCX_20, hTcxEnc->fUseTns[frameno], ( st->last_core == ACELP_CORE ), frameno ); } /* Copy memory */ diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index 38803594f..b71282946 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -46,7 +46,7 @@ #include "ivas_prot_fx.h" #include "stat_enc.h" #include "wmc_auto.h" - +#include "ivas_prot_fx.h" /*-------------------------------------------------------------------* * createFdCngEnc() * @@ -522,6 +522,16 @@ void FdCng_encodeSID( N = hFdCngEnc->npartDec; invTrfMatrix = (float *) tmpRAM; /* dynamically filled */ + +#ifdef IVAS_FLOAT_FIXED + Word32 *invTrfMatrix_fx; + Word32 tmpRAM_fx[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; + Word32 v_fx[32]; + invTrfMatrix_fx = (Word32 *) tmpRAM_fx; + Word32 dct_target_fx[FDCNG_VQ_DCT_MAXTRUNC]; + Word32 tot_sig_ext_fx[FDCNG_VQ_MAX_LEN]; +#endif + set_zero( v, FDCNG_VQ_MAX_LEN ); /* Convert to LOG */ @@ -559,10 +569,24 @@ void FdCng_encodeSID( { create_IDCT_N_Matrix( invTrfMatrix, N, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); /* truncated DCT21 analysis */ + +#ifdef IVAS_FLOAT_FIXED + Word16 Q = 24; + move16(); + create_IDCT_N_Matrix_fx( invTrfMatrix_fx, N, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM_fx ) / ( sizeof( Word32 ) ) ); // Q31 +#endif + dctT2_N_apply_matrix( (const float *) v, dct_target, FDCNG_VQ_DCT_MAXTRUNC, N, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX ); /* truncated IDCT21 extension to 24 bands */ - extend_dctN_input( v, dct_target, N, tot_sig_ext, FDCNG_VQ_MAX_LEN, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); +#ifdef IVAS_FLOAT_FIXED + floatToFixed_arr32( v, v_fx, Q, N ); + floatToFixed_arr32( dct_target, dct_target_fx, Q, FDCNG_VQ_DCT_MAXTRUNC ); + extend_dctN_input_fx( v_fx, dct_target_fx, N, tot_sig_ext_fx, FDCNG_VQ_MAX_LEN, invTrfMatrix_fx, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); + fixedToFloat_arrL( tot_sig_ext_fx, tot_sig_ext, Q, N ); +#else + extend_dctN_input( v, dct_target, N, tot_sig_ext, FDCNG_VQ_MAX_LEN, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); +#endif mvr2r( tot_sig_ext, v, FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ stage #1 */ } create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); @@ -1321,6 +1345,7 @@ void FdCngEncodeDiracMDCTStereoSID( /* truncated DCT 21 analysis */ dctT2_N_apply_matrix( (const float *) ms_ptr[0], dct_target, FDCNG_VQ_DCT_MAXTRUNC, N[0], invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX ); /* truncated IDCT21 extension to 24 synthesis */ + extend_dctN_input( ms_ptr[0], dct_target, N[0], tot_sig_ext, FDCNG_VQ_MAX_LEN, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); /* use 18 basis vectors*/ mvr2r( tot_sig_ext, ms_ptr[0], FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ stage #1 */ diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index 230df0248..b1429313f 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -43,14 +43,37 @@ #include "cnst.h" #include "stat_enc.h" #include "wmc_auto.h" +#ifdef IVAS_FLOAT_FIXED +#include "prot_fx_enc.h" +#include "prot_fx.h" +#endif // IVAS_FLOAT_FIXED +#define INV_Log2_10_Q15 9864 /*1/log2(10) in Q15*/ +#define INV_Log2_e_Q15 22713 /*1/log2(e) in Q15*/ /*-------------------------------------------------------------------* * IGF_write_bit() * * write single bit to stream *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static void IGF_write_bit( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 *bitCount, /* i/o: bit counter */ + const Word16 value /* i : value */ +) +{ + IF( hBstr ) + { + push_next_indice( hBstr, value, 1 ); + } + ( *bitCount ) = add( ( *bitCount ), 1 ); + move16(); + + return; +} +#else static void IGF_write_bit( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ int16_t *bitCount, /* i/o: bit counter */ @@ -67,13 +90,36 @@ static void IGF_write_bit( return; } +#endif /*-------------------------------------------------------------------* * IGF_write_bits() * * write bits to stream *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static void IGF_write_bits( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + Word16 *bitCount, /* i/o: bit counter */ + const Word16 value, /* i/o: value */ + Word16 bits /* i : number of bits */ +) +{ + WHILE( bits-- ) + { + IF( s_and( value, shl( 1, bits ) ) == 0 ) + { + IGF_write_bit( hBstr, bitCount, 0 ); + } + ELSE + { + IGF_write_bit( hBstr, bitCount, 1 ); + } + } + return; +} +#else static void IGF_write_bits( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ int16_t *bitCount, /* i/o: bit counter */ @@ -88,6 +134,7 @@ static void IGF_write_bits( return; } +#endif // IVAS_FLOAT_FIXED /*-------------------------------------------------------------------* @@ -97,6 +144,70 @@ static void IGF_write_bits( *-------------------------------------------------------------------*/ /*! r: crest factor */ +#if 0 +#ifdef IVAS_FLOAT_FIXED +static Word16 IGF_getCrest_new_fx( + const Word16 *logSpec, /* i : power spectrum */ + const Word16 start, /* i : start subband index */ + const Word16 stop, /* i : stop subband index */ + Word16 *crest_exp /*Stores the exponent of the result(return value)*/ +) +{ + Word16 i; + Word16 x; + Word32 x_eff; + Word16 x_max; + Word16 exp; + Word16 temp; + Word16 temp_e; + Word16 crest; /*1.0f in Q15*/ + x_eff = 0; + x_max = 0; + exp = 0; + temp = 0; + temp_e; + crest = 32767; /*1.0f in Q15*/ + move32(); + move16(); + move16(); + move16(); + move16(); + + FOR( i = start; i < stop; i++ ) + { + x = logSpec[i]; + move16(); + x_eff = L_add( x_eff, L_mult0( x, x ) ); + + IF( GT_16( x, x_max ) ) + { + x_max = x; + move16(); + } + } + + x_eff = BASOP_Util_Divide3216_Scale( x_eff, sub( stop, start ), &temp_e ); + temp_e = add( temp_e, 16 ); /*exp += 31 - 15 + 16(because x_eff is word32)*/ + temp = Sqrt16( extract_l( x_eff ), &temp_e ); + + IF( x_eff > 0 && x_max > 0 ) + { + temp = BASOP_Util_Divide1616_Scale( x_max, temp, &exp ); + exp = add( exp, sub( 15, temp_e ) ); + IF( exp < 0 ) + { + temp = shl( temp, exp ); + exp = 0; + move16(); + } + crest = s_max( shl_sat( 1, sub( 15, exp ) ), temp ); + } + *crest_exp = exp; + move16(); + return crest; +} +#endif +#endif static float IGF_getCrest_new( const int16_t *logSpec, /* i : power spectrum */ const int16_t start, /* i : start subband index */ @@ -138,6 +249,64 @@ static float IGF_getCrest_new( *-------------------------------------------------------------------*/ /*! r: SFM value */ +/* Q for the returned sfm value is 15 */ +#if 0 +#ifdef IVAS_FLOAT_FIXED +static Word16 IGF_getSFM_new_fx( + const Word32 *powerSpectrum, /* i : power spectrum */ + const Word16 *logSpec, /* i : log of power spectrum */ + const Word16 start, /* i : start subband index */ + const Word16 stop, /* i : stop subband index */ + Word16 e_ps /*Stores exp related to power spectrum*/ +) +{ + Word16 n; + Word16 i; + Word16 num; + Word32 denom; + Word16 numf; + Word32 tmp; + Word16 sfm; + Word16 sfm_e; + Word16 denom_e; + Word16 numf_e; /*stores exponent for numf*/ + Word16 tmp_e; + + num = 0; + denom = 1; + denom_e = 31; + sfm = 1; + move16(); + move32(); + move16(); + move16(); + + FOR( i = start; i < stop; i++ ) + { + tmp = powerSpectrum[i]; + n = logSpec[i /*-start*/]; + move32(); + move16(); + num = add( num, n ); + denom = BASOP_Util_Add_Mant32Exp( tmp, e_ps, denom, denom_e, &denom_e ); + } + + numf = BASOP_Util_Divide1616_Scale( num, sub( stop, start ), &numf_e ); + denom = BASOP_Util_Divide3216_Scale( denom, sub( stop, start ), &tmp_e ); + denom_e = add( add( denom_e, tmp_e ), 1 ); /*denom_e+tmp_e-15 +16(because type of denom is word32)*/ + + IF( denom != 0 ) + { + tmp = BASOP_util_Pow2( L_add( numf, shl( 1, sub( 14, numf_e ) ) ), add(16 , numf_e), &tmp_e ); + sfm = BASOP_Util_Divide3232_Scale( tmp, denom, &sfm_e); + sfm_e = add(sfm_e, sub( tmp_e, denom_e ) ); + sfm = shl_sat( extract_l( L_min( sfm, L_shl( 1, 15 - sfm_e ) ) ), sfm_e ); + } + + return sfm; +} +#endif +#endif static float IGF_getSFM_new( const float *powerSpectrum, /* i : power spectrum */ const int16_t *logSpec, /* i : log of power spectrum */ @@ -184,6 +353,64 @@ static float IGF_getSFM_new( *-------------------------------------------------------------------*/ /*! r: spectral tilt value */ +#if 0 +#ifdef IVAS_FLOAT_FIXED +static Word16 IGF_getTilt_fx( + const Word32 *powerSpectrum, /* i : energies */ + const Word16 start, /* i : start subband index */ + const Word16 stop, /* i : stop subband index */ + Word16 q_powerSpectrum, /*Stores q reated to powerSpectrum*/ + Word16 *slope_e /*stores the exponent of returned slope value*/ +) +{ + Word16 i; + Word16 x; + Word16 width; + Word32 y; + Word32 mean_x, mean_y, mean_xy, mean_x2; + Word32 max_mean_x_e; + Word16 mean_x_e, mean_y_e, mean_xy_e, mean_x2_e; + Word16 slope; + Word16 slope_e; + + x = 1; + mean_x = mean_y = mean_xy = mean_x2 = 0; + move16(); + move32(); + move32(); + move32(); + move32(); + + width = sub( stop, start ); + for ( i = start; i < stop; i++ ) + { + mean_x = L_add( mean_x, x ); /*Q0*/ + mean_x2 = L_add( mean_x2, L_mult0( x, x ) ); /*Q0*/ + y = imult3216( Mult_32_16( L_add( BASOP_Util_Log2( L_max( L_shl( 1, q_powerSpectrum ), powerSpectrum[i] ) ), L_shl( sub( 31, q_powerSpectrum ), Q25 ) ) /*Q25*/, INV_Log2_10_Q15 ) /*Q25*/, 20 ); /*Q25*/ + mean_y = L_add( mean_y, y ); /*Q25*/ + mean_xy = L_add( mean_xy, Mult_32_16( y, x ) ); /*Q25+0-Q15=>Q10*/ + + x = add( x, 1 ); /*Q0*/ + } + mean_y = BASOP_Util_Divide3216_Scale( mean_y, width, &mean_y_e ); + mean_y_e = add( mean_y_e, -9 ) /*6 -15*/; + mean_x = BASOP_Util_Divide3216_Scale( mean_x, width, &mean_x_e ); + mean_x_e = add( mean_x_e, 16 ) /*31 -15*/; + mean_xy = BASOP_Util_Divide3216_Scale( mean_xy, width, mean_xy_e ); + mean_xy_e = add( mean_xy_e, 6 ) /*21 -15*/; + mean_x2 = BASOP_Util_Divide3216_Scale( mean_x2, width, mean_x2_e ); + mean_x2_e = add( mean_x2_e, 16 ) /*31 -15*/; + max_mean_x_e = s_max( mean_x_e, s_max( mean_xy_e, mean_x2_e ) ); + mean_x = shr( mean_x, sub( mean_x_e, max_mean_x_e ) ); /*mean_x_e=max_mean_x_e*/ + mean_xy = shr( mean_xy, sub( mean_xy_e, max_mean_x_e ) ); /*mean_xy_e=max_mean_x_e*/ + mean_x2 = shr( mean_x2, sub( mean_x2_e, max_mean_x_e ) ); /*mean_x2_e=mean_x2_e*/ + slope = BASOP_Util_Divide3232_Scale( L_mult0( extract_l( L_sub( mean_xy, mean_x ) ), extract_l( mean_y ) ) /*max_mean_x_e+mean_y_e*/, L_mult0( extract_l( L_sub( mean_x2, mean_x ) ), extract_l( mean_x ) ) /*2*max_mean_x_e*/, slope_e ); /*q_powerSpectrum-15*/ + *slope_e = add( *slope_e, sub( mean_y_e, max_mean_x_e ) ); + move16(); + return slope; +} +#endif +#endif static float IGF_getTilt( const float *powerSpectrum, /* i : energies */ const int16_t start, /* i : start subband index */ @@ -228,6 +455,90 @@ static float IGF_getTilt( *-------------------------------------------------------------------*/ /*! r: spectral tilt value */ +#ifdef IVAS_FLOAT_FIXED +/* Returns value with exponent as 9 and Q as 22*/ +static Word32 IGF_getTNR_fx( + const Word32 *powerSpectrum, /* i : energies */ + const Word16 start, /* i : start subband index */ + const Word16 stop, /* i : stop subband index */ + const Word16 adap, /* i : SFB width adaptation */ + Word16 e_ps, /*Stores exponent for powerSpectrum*/ + Word16 e_adap /*Stores exponent for adap*/ +) +{ + Word16 i; + Word16 width; + Word32 avg; + Word32 tonal; + Word16 tonal_e; /* holds exp for tonal*/ + Word32 noise; + Word16 noise_e; /* holds exp for noise*/ + Word32 tonalToNoise; + Word32 rootSpec[300]; + Word16 rootSpec_e[300]; /*rootSpec_e[i] holds exp for rootSpec[i]*/ + Word16 avg_e; /* holds exp for avg*/ + Word16 tmp_e; + avg = 0; + tonal = 0; + noise = EPSILON_FX; + tonal_e = 0; + noise_e = 0; + avg_e = 0; + tmp_e = 0; + move32(); + move32(); + move32(); + move16(); + move16(); + move16(); + move16(); + + set32_fx( rootSpec, 0, 300 ); + set16_fx( rootSpec_e, 0, 300 ); + + width = sub( stop, start ); + FOR( i = start; i < stop; i++ ) + { + rootSpec_e[sub( i, start )] = e_ps; + move16(); + rootSpec[sub( i, start )] = Sqrt32( powerSpectrum[i], &rootSpec_e[sub( i, start )] ); /*rootSpec[i - start] = sqrtf( powerSpectrum[i] );*/ + move32(); + avg = BASOP_Util_Add_Mant32Exp( avg, avg_e, rootSpec[sub( i, start )], rootSpec_e[sub( i, start )], &avg_e ); /*avg += rootSpec[i - start];resultant exponent is avg_e*/ + } + avg = BASOP_Util_Divide3216_Scale( avg, width, &tmp_e ); /*avg /= width;*/ + avg_e = add( 16, sub( add( avg_e, tmp_e ), 15 ) ); + + FOR( i = start; i < stop; i++ ) + { + Word16 normSpec_e; /*stores resultant exponent for normSpec*/ + Word16 normSpec = BASOP_Util_Divide3232_Scale( rootSpec[sub( i, start )], avg, &normSpec_e ); /*rootSpec[i - start] / avg;*/ + normSpec_e = add( normSpec_e, sub( rootSpec_e[sub( i, start )], avg_e ) ); + IF( GT_32( normSpec, L_add( L_shl( 1, sub( 15, normSpec_e ) ), L_shl( adap, sub( e_adap, normSpec_e ) ) ) ) ) + { + tonal = BASOP_Util_Add_Mant32Exp( tonal, tonal_e, rootSpec[sub( i, start )], rootSpec_e[sub( i, start )], &tonal_e ); /*tonal += rootSpec[i - start];*/ + } + ELSE IF( LT_32( normSpec, L_shl( 1, sub( 15, normSpec_e ) ) ) ) + { + noise = BASOP_Util_Add_Mant32Exp( noise, noise_e, rootSpec[sub( i, start )], rootSpec_e[sub( i, start )], &noise_e ); /*noise += rootSpec[i - start];*/ + } + } + + /*tonalToNoise=20.f * log10f( max( 1e-018f, tonal / noise ) )*/ + Word16 temp = BASOP_Util_Divide3232_Scale( tonal, noise, &tmp_e ); /*tonal / noise*/ + tmp_e = add( tmp_e, sub( tonal_e, noise_e ) ); + IF( GE_16( temp, 1 ) ) + { + tonalToNoise = L_shr( imult3216( Mult_32_16( L_add( BASOP_Util_Log2( temp ), L_shl( add( 16, tmp_e ), Q25 ) ) /*Q25*/, INV_Log2_10_Q15 ) /*25+15-15*/, 20 ) /*25*/, 3 ); /*Q22*/ + } + ELSE + { + tonalToNoise = -1509949440; /*-360.f Q22*/ + move32(); + } + + return tonalToNoise; +} +#endif // IVAS_FLOAT_FIXED static float IGF_getTNR( const float *powerSpectrum, /* i : energies */ const int16_t start, /* i : start subband index */ @@ -279,7 +590,7 @@ static float IGF_getTNR( *-------------------------------------------------------------------*/ /*! r: crest factor */ -static float IGF_getCrest( +static float IGF_getCrest_ivas( const float *powerSpectrum, /* i : power spectrum */ const int16_t start, /* i : start subband index */ const int16_t stop /* i : stop subband index */ @@ -320,7 +631,7 @@ static float IGF_getCrest( *-------------------------------------------------------------------*/ /*! r: SFM value */ -static float IGF_getSFM( +static float IGF_getSFM_ivas( const float *powerSpectrum, /* i : energies */ const int16_t start, /* i : start subband index */ const int16_t stop /* i : stop subband index */ @@ -595,11 +906,485 @@ static void IGF_CalculateEnvelope( /*-------------------------------------------------------------------* - * IGF_CalculateStereoEnvelope() + * IGF_CalculateStereoEnvelope_fx() * * envelope estimation + *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static void IGF_CalculateStereoEnvelope_fx( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ + const Word32 *pMDCTSpectrum_fx, /* i : MDCT spectrum */ + Word16 pMDCTSpectrum_e, /* i : exponent for pMDCTSpectrum_fx */ + const Word32 *pMDCTSpectrumMsInv_fx, /* i : MDCT spectrum */ + Word16 pMDCTSpectrumMsInv_e, /* i : expontent for pMDCTSpectrumMsInv_fx */ + const Word32 *pPowerSpectrum_fx, /* i : MDCT^2 + MDST^2 spectrum, or estimate */ + Word16 pPowerSpectrum_e, /* i : exponent for pPowerSpectrum_fx */ + const Word32 *pPowerSpectrumMsInv_fx, /* i : inverse power spectrum */ + Word16 pPowerSpectrumMsInv_e, /* i : exponent for pPowerSpectrumMsInv_fx */ + const Word16 igfGridIdx, /* i : IGF grid index */ + const Word16 coreMsMask[N_MAX], /* i : line wise ms Mask */ + const Word16 isTransient, /* i : flag indicating if transient is detected */ + const Word16 last_core_acelp /* i : indicator if last frame was ACELP core */ +) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + Word16 *swb_offset; + Word16 sfb; /* this is the actual scalefactor band */ + Word16 width; /* this is width in subbands of the actual scalefactor band */ + Word16 tile_idx; + Word16 strt_cpy; + Word32 gain_fx; /* the gain which has to be applied to the source tile to get the destination energy */ + Word16 sb; + Word16 sfbEnergyR_fx; + Word32 sfbEnergyC_fx; /* the energy of the destination region of the tile */ + Word32 sfbEnergyTileR_fx; + Word32 sfbEnergyTileC_fx; /* the energy of the destination region of the tile */ + Word16 tmp, x, y; + Word16 mean_x_fx, mean_y_fx; + Word32 mean_xy_fx, mean_x2_fx; + Word16 slope_fx; + Word16 tmp_tb_fx; + Word16 tmp_sb_fx; + Word16 sfbCnt; + Word32 tileSrcSpec_fx[MAX_IGF_SFB_LEN]; + Word16 sfm; + Word16 crest; + Word16 temp; + Word16 mean_x_e, mean_y_e; /*Stores exponent for mean_x and mean_y respectively*/ + Word16 mean_xy_e, mean_x2_e; /*stores exponent for mean_xy and mean_x2 respectively*/ + Word16 tileSrcSpec_e; /*Exponent for tileSrcSpec_fx*/ + Word16 sfbEnergyTileR_e; /*Exponent for sfbEnergyTileR_fx*/ + Word16 sfbEnergyTileC_e; /*Exponent for sfbEnergyTileC_fx*/ + Word16 sfbEnergyC_e; /*Exponent for sfbEnergyC_fx*/ + Word16 gain_e; /*exponent for gain_fx*/ + Word16 crest_exp; /*stores exponent for output from crest*/ + Word16 sfm_exp; /*stores exponent for ouput from sfm*/ + Word16 tmp_tb_e; /*Stores exponent for tmp_tb_fx*/ + Word16 tmp_sb_e; /*stores exponent for tmp_sb_fx*/ + Word16 slope_e; /*stores exponent for slope_fx*/ + Word16 sfbEnergyR_e; /*stores exponent for sfbEnergyR*/ + Word16 tmp_e; + + hPrivateData = &hIGFEnc->igfData; + hGrid = &hPrivateData->igfInfo.grid[(Word16) igfGridIdx]; + swb_offset = hGrid->swb_offset; + move16(); + + IF( NE_16( igfGridIdx, IGF_GRID_LB_NORM ) ) + { + FOR( sfbCnt = 0; sfbCnt < sub( hGrid->sfbWrap[hGrid->nTiles], hGrid->sfbWrap[0] ); sfbCnt++ ) + { + /* reset filter */ + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfbCnt] = 0; /* Exponent is hPrivateData->sfb_tb_e*/ + hPrivateData->prevSFM_IIR_SFB_TB_fx[sfbCnt] = 0; /* Exponent is hPrivateData->sfb_tb_e*/ + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfbCnt] = 0; /* Exponent is hPrivateData->sfb_sb_e*/ + hPrivateData->prevSFM_IIR_SFB_SB_fx[sfbCnt] = 0; /* Exponent is hPrivateData->sfb_sb_e*/ + hPrivateData->sfb_sb_e[sfbCnt] = 0; + hPrivateData->sfb_tb_e[sfbCnt] = 0; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + } + } + + IF( pPowerSpectrum_fx ) + { + FOR( sb = hGrid->sbWrap[0]; sb < swb_offset[hGrid->sfbWrap[hGrid->nTiles]]; sb++ ) + { + /*hPrivateData->logSpec[sb] = max( 0, (int16_t) ( logf( max( FLT_MIN, pPowerSpectrum[sb] ) ) * INV_LOG_2 ) );*/ + IF( LE_32( 1, pPowerSpectrum_fx[sb] ) ) + { + hPrivateData->logSpec[sb] = s_max( 0, (Word16) L_shr( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( pPowerSpectrum_e, Q25 ) ), 25 ) ); + } + ELSE + { + hPrivateData->logSpec[sb] = 0; /*max(0,-126) is always 0*/ + } + move16(); + } + } + FOR( tile_idx = 0; tile_idx < hGrid->nTiles; tile_idx++ ) + { + strt_cpy = hGrid->sbWrap[tile_idx]; + move16(); + + FOR( sfb = hGrid->sfbWrap[tile_idx]; sfb < hGrid->sfbWrap[tile_idx + 1]; sfb++ ) + { + width = sub( swb_offset[sfb + 1], swb_offset[sfb] ); + sfbEnergyTileR_fx = EPSILON_FX; + sfbEnergyTileC_fx = EPSILON_FX; + sfbEnergyC_fx = EPSILON_FX; + sfbEnergyTileR_e = 0; + sfbEnergyTileC_e = 0; + sfbEnergyC_e = 0; + move16(); + move16(); + move16(); + move32(); + move32(); + move32(); + IF( pPowerSpectrum_fx ) + { + tmp = strt_cpy; + move16(); + + FOR( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ ) + { + IF( NE_16( coreMsMask[sb], coreMsMask[strt_cpy] ) ) + { + sfbEnergyC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyC_fx, sfbEnergyC_e, pPowerSpectrum_fx[sb], pPowerSpectrum_e, &sfbEnergyC_e ); /*resultant exponent is stored in sfbEnergyC_e*/ + sfbEnergyTileR_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR_fx, sfbEnergyTileR_e, Mult_32_32( pMDCTSpectrumMsInv_fx[strt_cpy], pMDCTSpectrumMsInv_fx[strt_cpy] ), shl( pMDCTSpectrumMsInv_e, 1 ), &sfbEnergyTileR_e ); /*resultant exponent is stored in sfbEnergyTileR_e*/ + sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrumMsInv_fx[strt_cpy], pPowerSpectrumMsInv_e, &sfbEnergyTileC_e ); /*resultant exponent is stored in sfbEnergyTileC_e*/ + tileSrcSpec_fx[sub( strt_cpy, tmp )] = pPowerSpectrumMsInv_fx[strt_cpy]; /*resultant exponent is stored in tileSrcSpec_e*/ + tileSrcSpec_e = pPowerSpectrumMsInv_e; + } + ELSE + { + sfbEnergyC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyC_fx, sfbEnergyC_e, pPowerSpectrum_fx[sb], pPowerSpectrum_e, &sfbEnergyC_e ); /*resultant exponent is stored in sfbEnergyC_e*/ + sfbEnergyTileR_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR_fx, sfbEnergyTileR_e, Mult_32_32( pMDCTSpectrum_fx[strt_cpy], pMDCTSpectrum_fx[strt_cpy] ), shl( pMDCTSpectrum_e, 1 ), &sfbEnergyTileR_e ); /*resultant exponent is stored in sfbEnergyTileR_e*/ + sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrum_fx[strt_cpy], pPowerSpectrum_e, &sfbEnergyTileC_e ); /*resultant exponent is stored in sfbEnergyTileC_e*/ + tileSrcSpec_fx[sub( strt_cpy, tmp )] = pPowerSpectrum_fx[strt_cpy]; /*resultant exponent is stored in tileSrcSpec_e*/ + tileSrcSpec_e = pPowerSpectrum_e; + } + move32(); + strt_cpy = add( strt_cpy, 1 ); + } + + sfbEnergyTileR_fx = BASOP_Util_Divide3216_Scale( sfbEnergyTileR_fx, width, &tmp_e ); + sfbEnergyTileR_e = sub( add( sfbEnergyTileR_e, tmp_e ), 15 ); /*stores the resultant exponent for sfbEnergyTileR_fx*/ + + /*gain = (float) ( sfbEnergyTileR * ( sfbEnergyC / sfbEnergyTileC ) );*/ + temp = BASOP_Util_Divide3232_Scale( sfbEnergyC_fx, L_add( sfbEnergyTileC_fx, EPSILON_FX ), &tmp_e ); + gain_e = add( tmp_e, sub( sfbEnergyC_e, sfbEnergyTileC_e ) ); + gain_fx = Mult_32_16( sfbEnergyTileR_fx, temp ); + gain_e = add( 16, add( gain_e, sfbEnergyTileR_e ) ); /*stores the resultant exponent for gain_fx*/ + + IF( !isTransient ) + { + Word16 diffSFM_fx; + Word16 diffSFM_e; + Word16 shiftedSFM_fx; + Word16 shiftedSFM_e; /*stores the resultant exponent for shiftedSFM_fx*/ + shiftedSFM_fx = 0; + shiftedSFM_e = 0; + move16(); + move16(); + + // tmp_tb = IGF_getSFM_ivas(pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1]) / IGF_getCrest_ivas(pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1]); + sfm = IGF_getSFM( &sfm_exp, pPowerSpectrum_fx, &pPowerSpectrum_e, swb_offset[sfb], swb_offset[sfb + 1] ); + crest = IGF_getCrest( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, swb_offset[sfb], swb_offset[sfb + 1] ); + tmp_tb_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e ); + tmp_tb_e = add( tmp_e, sub( sfm_exp, crest_exp ) ); /*stores the resultant exponent for tmp_tb_fx*/ + + // tmp_sb = IGF_getSFM_ivas(tileSrcSpec, 0, strt_cpy - tmp) / IGF_getCrest_ivas(tileSrcSpec, 0, strt_cpy - tmp); + sfm = IGF_getSFM( &sfm_exp, tileSrcSpec_fx, &tileSrcSpec_e, 0, sub( strt_cpy, tmp ) ); + crest = IGF_getCrest( &crest_exp, tileSrcSpec_fx, tileSrcSpec_e, 0, sub( strt_cpy, tmp ) ); + tmp_sb_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e ); + tmp_sb_e = add( tmp_e, sub( sfm_exp, crest_exp ) ); /*stores the resultant exponent for tmp_sb_fx*/ + + IF( last_core_acelp || hPrivateData->wasTransient ) + { + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = tmp_tb_fx; /*Exponent for hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] and hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] values stored in hPrivateData->sfb_tb_e[sfb] */ + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = tmp_sb_fx; /*Exponent for hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] and hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] values stored in hPrivateData->sfb_sb_e[sfb]*/ + hPrivateData->sfb_tb_e[sfb] = tmp_tb_e; + hPrivateData->sfb_sb_e[sfb] = tmp_sb_e; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + } + ELSE + { + /* Purpose of this block: + -to make the exponent of hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] and hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] equal to that of tmp_tb_fx + -to make the exponent of hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] and hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] equal to that of tmp_sb_fx + */ + Word16 diff_sb_e; /*stores the difference of exponents for sb*/ + Word16 diff_tb_e; /*stores the difference of exponents for tb*/ + diff_sb_e = sub( tmp_sb_e, hPrivateData->sfb_sb_e[sfb] ); + diff_tb_e = sub( tmp_tb_e, hPrivateData->sfb_tb_e[sfb] ); + IF( LE_16( tmp_tb_e, hPrivateData->sfb_tb_e[sfb] ) ) + { + tmp_tb_fx = shl( tmp_tb_fx, diff_tb_e ); + tmp_tb_e = hPrivateData->sfb_tb_e[sfb]; + move16(); + } + ELSE + { + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = shr( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], diff_tb_e ); + hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = shr( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], diff_tb_e ); + hPrivateData->sfb_tb_e[sfb] = tmp_tb_e; + move16(); + move16(); + move16(); + } + IF( LE_16( tmp_sb_e, hPrivateData->sfb_sb_e[sfb] ) ) + { + tmp_sb_fx = shl( tmp_sb_fx, diff_sb_e ); + tmp_sb_e = hPrivateData->sfb_sb_e[sfb]; + move16(); + } + ELSE + { + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = shr( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], diff_sb_e ); + hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = shr( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], diff_sb_e ); + hPrivateData->sfb_sb_e[sfb] = tmp_sb_e; + move16(); + move16(); + move16(); + } + } + tmp_tb_fx = shr( tmp_tb_fx, 2 ); /*taking 2 guard bits so it's exponent tmp_sb_e=+2*/ + tmp_sb_fx = shr( tmp_sb_fx, 2 ); /*taking 2 guard bits so it's exponent tmp_tb_e=+2 */ + tmp_sb_e = add( tmp_sb_e, 2 ); + tmp_tb_e = add( tmp_tb_e, 2 ); + hPrivateData->SFM_tb_fx[sfb] = add( tmp_tb_fx, add( shr( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], 2 ), shr( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], 3 ) ) ); + hPrivateData->SFM_tb_fx[sfb] = extract_l( L_min( L_shl( 22118 /*2.7f Q13*/, sub( 2, tmp_tb_e ) ), hPrivateData->SFM_tb_fx[sfb] ) ); /* resultant exponent stored in hPrivateData->sfb_sb_e[sfb]*/ + hPrivateData->SFM_sb_fx[sfb] = add( tmp_sb_fx, add( shr( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], 2 ), shr( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], 3 ) ) ); + hPrivateData->SFM_sb_fx[sfb] = extract_l( L_min( L_shl( 22118 /*2.7f Q13*/, sub( 2, tmp_sb_e ) ), hPrivateData->SFM_sb_fx[sfb] ) ); /*resultant exponent stores in hPrivateData->sfb_tb_e[sfb]*/ + hPrivateData->sfb_sb_e[sfb] = tmp_sb_e; + hPrivateData->sfb_tb_e[sfb] = tmp_tb_e; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + + diffSFM_e = BASOP_Util_Add_MantExp( hPrivateData->SFM_sb_fx[sfb], tmp_sb_e, negate( hPrivateData->SFM_tb_fx[sfb] ), tmp_tb_e, &diffSFM_fx ); /*stores the resultant exponent for diffSFM_fx*/ + + UNUSED_PARAM( diffSFM_e ); + + IF( diffSFM_fx > 0 && LT_32( hPrivateData->SFM_tb_fx[sfb], L_shr( 3277 /*0.1 Q15*/, tmp_tb_e ) ) ) /* check whether target SFB is more tonal than source SFB */ + { + Word16 currDampingFactor_fx, dampingFactor_fx, alpha_fx; + Word16 threshold_e, threshold_fx, alpha_e, currDampingFactor_e, dampingFactor_e; + /* calculate spectral tilt to detect sudden drops (or increases) in energy in the current SFB */ + x = 1; + mean_x_fx = mean_y_fx = 0; + mean_xy_fx = mean_x2_fx = 0; + mean_x_e = mean_y_e = 15; + mean_xy_e = mean_x2_e = 31; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + FOR( sb = swb_offset[sfb]; sb < swb_offset[sfb + 1]; sb++ ) + { + mean_x_fx = add( mean_x_fx, x ); /*Q0*/ + mean_x2_fx = L_add( mean_x2_fx, L_mult0( x, x ) ); /*Q0*/ + + /*y = 20 * (int16_t) log10f( max( 1e-018f, pPowerSpectrum[sb] ) );*/ + IF( LT_32( pPowerSpectrum_fx[sb], 1 ) ) + { + y = 20 * ( -18 ); + } + ELSE + { + y = imult1616( 20, extract_l( L_shr( Mult_32_16( ( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( pPowerSpectrum_e, Q25 ) ) ), INV_Log2_10_Q15 ), 25 ) ) ); /*Q0*/ + } + mean_y_fx = add( mean_y_fx, y ); /*Q0*/ + mean_xy_fx = L_add( mean_xy_fx, L_mult0( y, x ) ); /*Q0*/ + + x = add( x, 1 ); + } + mean_y_fx = BASOP_Util_Divide1616_Scale( mean_y_fx, width, &tmp_e ); /* resultant exp stores in mean_y_e*/ + mean_y_e = add( mean_y_e, sub( tmp_e, 15 ) ); + mean_x_fx = BASOP_Util_Divide1616_Scale( mean_x_fx, width, &tmp_e ); /* resultant exp stores in mean_x_e*/ + mean_x_e = add( mean_x_e, sub( tmp_e, 15 ) ); + mean_xy_fx = BASOP_Util_Divide3216_Scale( mean_xy_fx, width, &tmp_e ); /* resultant exp stores in mean_xy_e*/ + mean_xy_e = add( mean_xy_e, sub( tmp_e, 15 ) ); + mean_x2_fx = BASOP_Util_Divide3216_Scale( mean_x2_fx, width, &tmp_e ); /* resultant exp stores in mean_x2_e*/ + mean_x2_e = add( mean_x2_e, sub( tmp_e, 15 ) ); + + /*slope = ( mean_xy - mean_x * mean_y ) / ( mean_x2 - mean_x * mean_x );*/ + slope_fx = BASOP_Util_Divide3232_Scale( ( L_sub( mean_xy_fx, L_shl( mult( mean_x_fx, mean_y_fx ), sub( add( mean_x_e, mean_y_e ), mean_xy_e ) ) ) ), ( L_sub( mean_x2_fx, L_shl( mult( mean_x_fx, mean_x_fx ), sub( add( mean_x_e, mean_x_e ), mean_x2_e ) ) ) ), &slope_e ); + slope_e = add( slope_e, sub( mean_xy_e, mean_x2_e ) ); /*stores resultant exponent for slope_fx*/ + + /* determine whether strong tilt is due to a step in the spectrum (e.g. band limitation, no damping) + or a tonal component close the band border (apply damping) by calculating SFM for a shift of 1/2 SFB width*/ + threshold_fx = BASOP_Util_Divide1616_Scale( 60, width, &threshold_e ); /*stores resultant exponent for threshold_fx*/ + + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( slope_fx, add( slope_e, 16 ), negate( threshold_fx ), add( threshold_e, 16 ) ), -1 ) ) + { + Word16 shift = shr( width, 1 ); + // shiftedSFM = IGF_getSFM_ivas( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ) / IGF_getCrest_ivas( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ); + sfm = IGF_getSFM( &sfm_exp, pPowerSpectrum_fx, &pPowerSpectrum_e, sub( swb_offset[sfb], shift ), sub( swb_offset[sfb + 1], shift ) ); + crest = IGF_getCrest( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, sub( swb_offset[sfb], shift ), sub( swb_offset[sfb + 1], shift ) ); + shiftedSFM_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e ); + } + ELSE IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( slope_fx, add( slope_e, 16 ), threshold_fx, add( threshold_e, 16 ) ), 1 ) && ( NE_16( sfb, sub( hGrid->sfbWrap[hGrid->nTiles], 1 ) ) ) ) + { + Word16 shift; + shift = shr( width, 1 ); + // shiftedSFM = IGF_getSFM_ivas( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ) / IGF_getCrest_ivas( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ); + sfm = IGF_getSFM( &sfm_exp, pPowerSpectrum_fx, &pPowerSpectrum_e, add( swb_offset[sfb], shift ), add( swb_offset[sfb + 1], shift ) ); + crest = IGF_getCrest( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, add( swb_offset[sfb], shift ), add( swb_offset[sfb + 1], shift ) ); + shiftedSFM_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e ); + } + shiftedSFM_e = add( shiftedSFM_e, sub( sfm_exp, crest_exp ) ); /* stores resultant exponent for shiftedSFM_fx*/ + + // alpha = min( 320.f / (float) swb_offset[sfb + 1], 1.25f ); + temp = BASOP_Util_Divide1616_Scale( 320, swb_offset[sfb + 1], &alpha_e ); + alpha_fx = extract_l( L_min( temp, L_shl( 20480 /*1.25 Q14*/, sub( 1, alpha_e ) ) ) ); /* exponent is alpha_e*/ + temp = BASOP_Util_Divide1616_Scale( hPrivateData->SFM_tb_fx[sfb], hPrivateData->SFM_sb_fx[sfb], &tmp_e ); + tmp_e = add( tmp_e, sub( hPrivateData->sfb_tb_e[sfb], hPrivateData->sfb_sb_e[sfb] ) ); /* stores resultant exponent for temp */ + + // currDampingFactor = expf( alpha * logf( hPrivateData->SFM_tb[sfb] / hPrivateData->SFM_sb[sfb] ) ); + currDampingFactor_fx = round_fx( BASOP_util_Pow2( Mpy_32_16_1( L_add( BASOP_Util_Log2( temp ), L_shl( add( 16, tmp_e ), 25 ) ), alpha_fx ), add( alpha_e, 6 ), &currDampingFactor_e ) ); /*exp is currDampingFactor_e*/ + + IF( GT_32( shiftedSFM_fx, L_shl( 1311 /*0.04f Q15*/, negate( shiftedSFM_e ) ) ) ) + { + currDampingFactor_fx = 32767; /*1.f Q15*/ + currDampingFactor_e = 0; + move16(); + move16(); + } + + IF( last_core_acelp || hPrivateData->wasTransient || EQ_32( hPrivateData->prevDampingFactor_IIR_fx[sfb], L_shl( -1, sub( 15, hPrivateData->prevDampingFactor_IIR_e[sfb] ) ) ) ) + { + hPrivateData->prevDampingFactor_IIR_fx[sfb] = s_max( currDampingFactor_fx, shr( 3277 /*0.1f * 32767*/, currDampingFactor_e ) ); /*resultant exponent stored in hPrivateData->prevDampingFactor_IIR_e[sfb]*/ + hPrivateData->prevDampingFactor_IIR_e[sfb] = currDampingFactor_e; + move16(); + move16(); + } + + { + Word32 tonalToNoise; + Word16 adap; + Word16 adap_e; /*stores exp for adap*/ + Word16 tonalToNoise_e; /*stores exponent for tonalToNoise*/ + tonalToNoise_e = 9; /*stores exponent for tonalToNoise*/ + move16(); + adap = BASOP_Util_Divide1616_Scale( width, 30, &adap_e ); + tonalToNoise = IGF_getTNR_fx( pPowerSpectrum_fx, swb_offset[sfb], swb_offset[sfb + 1], adap, pPowerSpectrum_e, adap_e ); /*Q22*/ + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( tonalToNoise, tonalToNoise_e, L_add( L_shl( 10, sub( 15, adap_e ) ), adap ), add( 16, adap_e ) ), -1 ) ) + { + // currDampingFactor += 0.1f * ( ( 10 + adap ) - tonalToNoise ); + Word32 temp2 = BASOP_Util_Add_Mant32Exp( L_add( L_shl( 10, sub( 15, adap_e ) ) /*exp:adap_e*/, adap ), add( adap_e, 16 ), L_negate( tonalToNoise ), tonalToNoise_e, &tmp_e ); /* resultant exp is tmp_e*/ + currDampingFactor_e = BASOP_Util_Add_MantExp( currDampingFactor_fx, currDampingFactor_e, extract_l( Mult_32_32( 3277 /*0.1f Q15*/, temp2 ) ), tmp_e, &currDampingFactor_fx ); /*stores resultant exp for currDampingFactor_fx*/ + } + } + + dampingFactor_e = BASOP_Util_Add_MantExp( currDampingFactor_fx, currDampingFactor_e, hPrivateData->prevDampingFactor_IIR_fx[sfb], hPrivateData->prevDampingFactor_IIR_e[sfb], &dampingFactor_fx ); + dampingFactor_fx = shr( dampingFactor_fx, 1 ); /* resultant exponent is dampingFactor_e*/ + IF( NE_16( BASOP_Util_Cmp_Mant32Exp( dampingFactor_fx, add( dampingFactor_e, 16 ), shr( hPrivateData->prevDampingFactor_IIR_fx[sfb], 1 ), add( hPrivateData->prevDampingFactor_IIR_e[sfb], 16 ) ), -1 ) ) + { + // do nothing + } + ELSE + { + dampingFactor_fx = shr( hPrivateData->prevDampingFactor_IIR_fx[sfb], 1 ); /* resultant exponent is hPrivateData->prevDampingFactor_IIR_e[sfb]*/ + dampingFactor_e = hPrivateData->prevDampingFactor_IIR_e[sfb]; + move16(); + } + IF( dampingFactor_e < 0 ) + { + dampingFactor_fx = shl( dampingFactor_fx, dampingFactor_e ); + dampingFactor_e = 0; + move16(); + } + gain_fx = Mult_32_16( gain_fx, shl_sat( extract_l( L_min( L_add( dampingFactor_fx, Mult_32_16( L_shl( hPrivateData->dampingFactorSmoothing[sfb], sub( 15, dampingFactor_e ) ) /*Q:15-dampingFactor_e*/, 3277 /*0.1f Q15*/ ) /*Q:15-dampingFactor_e*/ ), shl_sat( 1, sub( 15, dampingFactor_e ) ) ) ), dampingFactor_e ) /*Q15*/ ); + + hPrivateData->prevDampingFactor_IIR_fx[sfb] = dampingFactor_fx; + hPrivateData->prevDampingFactor_IIR_e[sfb] = dampingFactor_e; + move16(); + move16(); + if ( hPrivateData->dampingFactorSmoothing[sfb] > 0 ) + { + hPrivateData->dampingFactorSmoothing[sfb] = sub( hPrivateData->dampingFactorSmoothing[sfb], 1 ); + move16(); + } + } + ELSE + { + hPrivateData->prevDampingFactor_IIR_fx[sfb] = -( 1 << 15 ); /* resultant exp which is 0 stores in hPrivateData->prevDampingFactor_IIR_e[sfb]*/ + hPrivateData->prevDampingFactor_IIR_e[sfb] = 0; + hPrivateData->dampingFactorSmoothing[sfb] = 1; + move16(); + move16(); + move16(); + } + + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = tmp_tb_fx; + hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = hPrivateData->SFM_tb_fx[sfb]; + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = tmp_sb_fx; + hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = hPrivateData->SFM_sb_fx[sfb]; + move16(); + move16(); + move16(); + move16(); + } + ELSE + { + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = 0; + hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = 0; + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = 0; + hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = 0; + + hPrivateData->dampingFactorSmoothing[sfb] = 2; + move16(); + move16(); + move16(); + move16(); + move16(); + } + } + ELSE + { + sfbEnergyR_fx = add_sat( EPSILON_FX, BASOP_Util_Divide3216_Scale( sum2_f_32_fx( pMDCTSpectrum_fx + swb_offset[sfb], width, 3 ) /*exp: 2 * pMDCTSpectrum_e + 3*/, width, &sfbEnergyR_e ) ); + sfbEnergyR_e = add( sfbEnergyR_e, add( shl( pMDCTSpectrum_e, 1 ), /*+3 - 15=>-12*/ -12 ) ); /* stores resultant exponent for sfbEnergyR_fx*/ + gain_fx = sfbEnergyR_fx; /*resultant exponent stored in gain_e=sfbEnergyR_e*/ + gain_e = add( sfbEnergyR_e, 16 ); /* because gain_fx is word32;only after adding 16 q of gain_fx is 15-sfbEnergyR_e*/ + + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = 0; + hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = 0; + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = 0; + hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = 0; + move16(); + move16(); + move16(); + move16(); + } + /*gain=0.5f+log2f(gain)*2+16 becuase 2.885390081777927f=2*1/loge(2) so 2*1/loge(2)*loge(x) can be written as 2*log2(x)*/ + gain_fx = L_add( ONE_IN_Q23, L_add( L_add( BASOP_Util_Log2( gain_fx ), L_shl( gain_e, Q25 ) ), L_shl( 16, Q24 ) ) ); /*Q24*/ + IF( !isTransient && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) ) + { + gain_fx = L_add( gain_fx, ONE_IN_Q22 ); /* better preservation of original HF band energy */ + } + IF( !isTransient && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_64000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_64000_CPE ) ) ) + { + gain_fx = L_add( gain_fx, ONE_IN_Q21 ); + } + gain_fx = L_min( gain_fx, 91 << Q24 ); /* 13+15+63, see arithcode encode residual */ + gain_fx = L_max( gain_fx, 0 ); + gain_e = 7; /* stores exponent for gain_fx*/ + move16(); + hPrivateData->igfScfQuantized[sfb] = (Word16) ( L_shr( gain_fx, 24 ) ); /*Q0*/ + } + } + + return; +} +#endif +/*-------------------------------------------------------------------* + * IGF_CalculateStereoEnvelope() + * + * envelope estimation + *-------------------------------------------------------------------*/ static void IGF_CalculateStereoEnvelope( const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ const float *pMDCTSpectrum, /* i : MDCT spectrum */ @@ -699,8 +1484,8 @@ static void IGF_CalculateStereoEnvelope( float diffSFM; float shiftedSFM = 0.f; - tmp_tb = IGF_getSFM( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1] ) / IGF_getCrest( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1] ); - tmp_sb = IGF_getSFM( tileSrcSpec, 0, strt_cpy - tmp ) / IGF_getCrest( tileSrcSpec, 0, strt_cpy - tmp ); + tmp_tb = IGF_getSFM_ivas( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1] ) / IGF_getCrest_ivas( pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1] ); + tmp_sb = IGF_getSFM_ivas( tileSrcSpec, 0, strt_cpy - tmp ) / IGF_getCrest_ivas( tileSrcSpec, 0, strt_cpy - tmp ); if ( last_core_acelp || hPrivateData->wasTransient ) { @@ -744,12 +1529,12 @@ static void IGF_CalculateStereoEnvelope( if ( slope < -threshold ) { int16_t shift = width >> 1; - shiftedSFM = IGF_getSFM( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ) / IGF_getCrest( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ); + shiftedSFM = IGF_getSFM_ivas( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ) / IGF_getCrest_ivas( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ); } else if ( ( slope > 1.f * threshold ) && ( sfb != hGrid->sfbWrap[hGrid->nTiles] - 1 ) ) { int16_t shift = width >> 1; - shiftedSFM = IGF_getSFM( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ) / IGF_getCrest( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ); + shiftedSFM = IGF_getSFM_ivas( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ) / IGF_getCrest_ivas( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ); } alpha = min( 320.f / (float) swb_offset[sfb + 1], 1.25f ); @@ -1056,7 +1841,7 @@ static void IGF_Whitening( const int16_t igfGridIdx, /* i : Q0 | IGF grid index */ const int16_t isTransient, /* i : Q0 | flag indicating if transient is detected */ const int16_t last_core_acelp, /* i : Q0 | indicator if last frame was ACELP core */ - const int16_t isTNSActive, /* i : Q0 | indicator if TNS is active */ + const int8_t isTNSActive, /* i : Q0 | indicator if TNS is active */ const int16_t sp_aud_decision0, /* i : Q0 | first stage classifier decision */ const int32_t brate, /* i : Q0 | bitrate */ const int16_t element_mode /* i : Q0 | element mode */ @@ -1567,7 +2352,7 @@ static int16_t IGF_WriteFlatteningTrigger( * updates the start/stop frequency of IGF according to igfGridIdx *-------------------------------------------------------------------*/ -static void IGF_UpdateInfo( +static void IGF_UpdateInfo_ivas( const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ const int16_t igfGridIdx /* i : IGF grid index */ ) @@ -1864,7 +2649,7 @@ void IGFEncApplyMono( float *pMDCTSpectrum, /* i/o: MDCT spectrum */ float *pPowerSpectrum, /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ const int16_t isTCX20, /* i : flag indicating if the input is TCX20 or TCX10/2xTCX5 */ - const int16_t isTNSActive, /* i : flag indicating if the TNS is active */ + const int8_t isTNSActive, /* i : flag indicating if the TNS is active */ const int16_t sp_aud_decision0, /* i : first stage switching decision */ const int16_t vad_hover_flag /* i : VAD hangover flag */ ) @@ -1877,7 +2662,7 @@ void IGFEncApplyMono( pPowerSpectrumParameter = !isTNSActive && isTCX20 ? pPowerSpectrum : NULL; - IGF_UpdateInfo( st->hIGFEnc, igfGridIdx ); + IGF_UpdateInfo_ivas( st->hIGFEnc, igfGridIdx ); if ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) { @@ -1902,6 +2687,165 @@ void IGFEncApplyMono( * * apply the IGF encoder, main encoder interface *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void IGFEncApplyStereo_fx( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ + Word16 ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ + const IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS], /* i : instance handle of IGF Encoder */ + const Word16 igfGridIdx, /* i : IGF grid index */ + Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ + Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ +#if 1 + float *pPowerSpectrum[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + float *pPowerSpectrumMsInv[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ + float *inv_spectrum[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ +#endif + const Word16 frameno, /* i : flag indicating index of current subfr. */ + const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 mct_on /* i : flag mct block (1) or stereo (0) */ +) +{ + UNUSED_PARAM( pPowerSpectrum_fx ); + UNUSED_PARAM( pPowerSpectrumMsInv_fx ); +#if 1 + float *pPowerSpectrumParameter[NB_DIV]; /* If it is NULL it informs a function that specific handling is needed */ + float *pPowerSpectrumParameterMsInv[NB_DIV]; +#endif + Word16 inv_spectrum_e = 0; + Word16 pPowerSpectrumParameterMsInv_e = 0; + Word16 pPowerSpectrumParameter_e = 0; + Word32 *pPowerSpectrumParameter_fx[NB_DIV]; /* If it is NULL it informs a function that specific handling is needed */ + Word32 *pPowerSpectrumParameterMsInv_fx[NB_DIV]; + Word16 coreMsMask[N_MAX]; + Word16 sfb, ch, last_core_acelp; + STEREO_MDCT_BAND_PARAMETERS *sfbConf; + + /* assumptions: stereo filling was already done on the flattened spectra + * IGF region is always coded M/S, never L/R (to be done in the encoder) + * for residual bands with stereo filling infoTcxNoise is set to zero + * both channels have the same IGF configuration + */ + + /* sanity checks: check if both channels have the same configuration...*/ + assert( ( sts[0]->core == sts[1]->core ) ); + + /* initialization */ + IF( EQ_16( sts[0]->core, TCX_20_CORE ) ) + { + sfbConf = &hStereoMdct->stbParamsTCX20; + } + ELSE + { + sfbConf = &hStereoMdct->stbParamsTCX10; + } + IF( EQ_16( sts[0]->last_core, ACELP_CORE ) ) + { + sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; + } + + /* create line wise ms mask for the core bands */ + set16_fx( coreMsMask, 0, N_MAX ); + FOR( sfb = 0; sfb < sfbConf->sfbCnt; sfb++ ) + { + set16_fx( &coreMsMask[sfbConf->sfbOffset[sfb]], ms_mask[frameno][sfb], sub( sfbConf->sfbOffset[sfb + 1], sfbConf->sfbOffset[sfb] ) ); + } + + test(); + test(); + IF( EQ_16( sts[0]->core, TCX_20_CORE ) && !sts[0]->hTcxEnc->fUseTns[frameno] && !sts[1]->hTcxEnc->fUseTns[frameno] ) + { +#if 1 + pPowerSpectrumParameter[0] = &pPowerSpectrum[0][0]; + pPowerSpectrumParameter[1] = &pPowerSpectrum[1][0]; + pPowerSpectrumParameterMsInv[0] = pPowerSpectrumMsInv[0][0]; + pPowerSpectrumParameterMsInv[1] = pPowerSpectrumMsInv[1][0]; +#endif + pPowerSpectrumParameter_fx[0] = &pPowerSpectrum_fx[0][0]; + pPowerSpectrumParameter_fx[1] = &pPowerSpectrum_fx[1][0]; + pPowerSpectrumParameterMsInv_fx[0] = pPowerSpectrumMsInv_fx[0][0]; + pPowerSpectrumParameterMsInv_fx[1] = pPowerSpectrumMsInv_fx[1][0]; + } + ELSE + { +#if 1 + pPowerSpectrumParameter[0] = NULL; + pPowerSpectrumParameter[1] = NULL; + pPowerSpectrumParameterMsInv[0] = NULL; + pPowerSpectrumParameterMsInv[1] = NULL; +#endif + pPowerSpectrumParameter_fx[0] = NULL; + pPowerSpectrumParameter_fx[1] = NULL; + pPowerSpectrumParameterMsInv_fx[0] = NULL; + pPowerSpectrumParameterMsInv_fx[1] = NULL; + } + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + last_core_acelp = (Word16) EQ_16( sts[ch]->last_core, ACELP_CORE ); + + IGF_UpdateInfo( hIGFEnc[ch], igfGridIdx ); +#if 1 /*************************************flt to fix conversion****************************************************/ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + Word16 *swb_offset; + hPrivateData = &hIGFEnc[ch]->igfData; + hGrid = &hPrivateData->igfInfo.grid[(Word16) igfGridIdx]; + swb_offset = hGrid->swb_offset; + f2me_buf( sts[ch]->hTcxEnc->spectrum[frameno], sts[ch]->hTcxEnc->spectrum_fx[frameno], &sts[ch]->hTcxEnc->spectrum_e[frameno], swb_offset[hGrid->sfbWrap[hGrid->nTiles]] ); + IF( pPowerSpectrumParameter[ch] ) + f2me_buf( pPowerSpectrumParameter[ch], pPowerSpectrumParameter_fx[ch], &pPowerSpectrumParameter_e, swb_offset[hGrid->sfbWrap[hGrid->nTiles]] ); + f2me_buf( inv_spectrum[ch][frameno], inv_spectrum_fx[ch][frameno], &inv_spectrum_e, swb_offset[hGrid->sfbWrap[hGrid->nTiles]] ); + IF( pPowerSpectrumParameterMsInv[ch] ) + f2me_buf( pPowerSpectrumParameterMsInv[ch], pPowerSpectrumParameterMsInv_fx[ch], &pPowerSpectrumParameterMsInv_e, swb_offset[hGrid->sfbWrap[hGrid->nTiles]] ); + float max_sb = 0; + float max_tb = 0; + Word16 max_sb_fx = 0; + Word16 max_tb_fx = 0; + for ( sfb = 0; sfb < 23; sfb++ ) + { + f2me_16( hPrivateData->prevDampingFactor_IIR[sfb], &hPrivateData->prevDampingFactor_IIR_fx[sfb], &hPrivateData->prevDampingFactor_IIR_e[sfb] ); + max_tb = max( fabsf( hPrivateData->prevSFM_FIR_SFB_TB[sfb] ), max_tb ); + max_tb = max( fabsf( hPrivateData->prevSFM_IIR_SFB_TB[sfb] ), max_tb ); + max_tb = max( fabsf( hPrivateData->SFM_tb[sfb] ), max_tb ); + max_sb = max( fabsf( hPrivateData->SFM_sb[sfb] ), max_sb ); + max_sb = max( fabsf( hPrivateData->prevSFM_FIR_SFB_SB[sfb] ), max_sb ); + max_sb = max( fabsf( hPrivateData->prevSFM_IIR_SFB_SB[sfb] ), max_sb ); + f2me_16( max_tb, &max_tb_fx, &hPrivateData->sfb_tb_e[sfb] ); + f2me_16( max_sb, &max_sb_fx, &hPrivateData->sfb_sb_e[sfb] ); + if ( sub( 15, hPrivateData->sfb_tb_e[sfb] ) < 0 || sub( 15, hPrivateData->sfb_sb_e[sfb] ) < 0 ) + continue; + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = float_to_fix16( hPrivateData->prevSFM_FIR_SFB_TB[sfb], sub( 15, hPrivateData->sfb_tb_e[sfb] ) ); + hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = float_to_fix16( hPrivateData->prevSFM_IIR_SFB_TB[sfb], sub( 15, hPrivateData->sfb_tb_e[sfb] ) ); + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = float_to_fix16( hPrivateData->prevSFM_FIR_SFB_SB[sfb], sub( 15, hPrivateData->sfb_sb_e[sfb] ) ); + hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = float_to_fix16( hPrivateData->prevSFM_IIR_SFB_SB[sfb], sub( 15, hPrivateData->sfb_sb_e[sfb] ) ); + } +#endif /**********************************flt to fix ends here*******************************************************/ + IGF_CalculateStereoEnvelope_fx( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum_fx[frameno], sts[ch]->hTcxEnc->spectrum_e[frameno], inv_spectrum_fx[ch][frameno], inv_spectrum_e, pPowerSpectrumParameter_fx[ch], pPowerSpectrumParameter_e, pPowerSpectrumParameterMsInv_fx[ch], pPowerSpectrumParameterMsInv_e, igfGridIdx, coreMsMask, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp ); +#if 1 /*************************************fix to flt conversion****************************************************/ + for ( sfb = 0; sfb < 23; sfb++ ) + { + hPrivateData->prevSFM_FIR_SFB_TB[sfb] = me2f_16( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], hPrivateData->sfb_tb_e[sfb] ); + hPrivateData->prevSFM_IIR_SFB_TB[sfb] = me2f_16( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], hPrivateData->sfb_tb_e[sfb] ); + hPrivateData->prevSFM_FIR_SFB_SB[sfb] = me2f_16( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], hPrivateData->sfb_sb_e[sfb] ); + hPrivateData->prevSFM_IIR_SFB_SB[sfb] = me2f_16( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], hPrivateData->sfb_sb_e[sfb] ); + hPrivateData->SFM_tb[sfb] = me2f_16( hPrivateData->SFM_tb_fx[sfb], hPrivateData->sfb_tb_e[sfb] ); + hPrivateData->SFM_sb[sfb] = me2f_16( hPrivateData->SFM_sb_fx[sfb], hPrivateData->sfb_sb_e[sfb] ); + hPrivateData->prevDampingFactor_IIR[sfb] = me2f_16( hPrivateData->prevDampingFactor_IIR_fx[sfb], hPrivateData->prevDampingFactor_IIR_e[sfb] ); + } +#endif /**********************************fix to flt ends here*******************************************************/ + + pPowerSpectrumParameter[ch] = sts[ch]->core == TCX_20_CORE ? pPowerSpectrum[ch] : NULL; + + IGF_Whitening( hIGFEnc[ch], pPowerSpectrumParameter[ch], igfGridIdx, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, ( sts[0]->hTcxEnc->fUseTns[frameno] || sts[1]->hTcxEnc->fUseTns[frameno] ), sp_aud_decision0, element_brate, sts[ch]->element_mode ); + + IGF_ErodeSpectrum( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum[frameno], pPowerSpectrumParameter[ch], igfGridIdx, mct_on ); + } + + return; +} +#endif // IVAS_FLOAT_FIXED void IGFEncApplyStereo( STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ @@ -1966,7 +2910,7 @@ void IGFEncApplyStereo( { last_core_acelp = ( sts[ch]->last_core == ACELP_CORE ); - IGF_UpdateInfo( hIGFEnc[ch], igfGridIdx ); + IGF_UpdateInfo_ivas( hIGFEnc[ch], igfGridIdx ); IGF_CalculateStereoEnvelope( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum[frameno], inv_spectrum[ch][frameno], pPowerSpectrumParameter[ch], pPowerSpectrumParameterMsInv[ch], igfGridIdx, coreMsMask, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp ); @@ -1993,7 +2937,7 @@ void IGFSaveSpectrumForITF( const float *pITFSpectrum /* i : MDCT spectrum */ ) { - IGF_UpdateInfo( hIGFEnc, igfGridIdx ); + IGF_UpdateInfo_ivas( hIGFEnc, igfGridIdx ); mvr2r( pITFSpectrum + IGF_START_MN, hIGFEnc->spec_be_igf_flt, hIGFEnc->infoStopLine - IGF_START_MN ); diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index 1bcb7698f..184f9e9ee 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -565,12 +565,12 @@ static void IGF_ErodeSpectrum( Word16 *highPassEner_exp, /**< ou /**********************************************************************/ /* crest factor calculation **************************************************************************/ -static Word16 IGF_getCrest( /**< out: Q15| crest factor */ - Word16 *crest_exp, /**< out: | exponent of crest factor */ - const Word32 *powerSpectrum, /**< in: Q31 | power spectrum */ - const Word16 powerSpectrum_exp, /**< in: | exponent of power spectrum */ - const Word16 start, /**< in: Q0 | start subband index */ - const Word16 stop /**< in: Q0 | stop subband index */ +Word16 IGF_getCrest( /**< out: Q15| crest factor */ + Word16 *crest_exp, /**< out: | exponent of crest factor */ + const Word32 *powerSpectrum, /**< in: Q31 | power spectrum */ + const Word16 powerSpectrum_exp, /**< in: | exponent of power spectrum */ + const Word16 start, /**< in: Q0 | start subband index */ + const Word16 stop /**< in: Q0 | stop subband index */ ) { Word16 i; @@ -654,12 +654,12 @@ static Word16 IGF_getCrest( /**< ou /************************************************************************* calculates spectral flatness measurment **************************************************************************/ -static Word16 IGF_getSFM( /**< out: Q15| SFM value */ - Word16 *SFM_exp, /**< out: | exponent of SFM Factor */ - const Word32 *energy, /**< in: Q31| energies */ - const Word16 *energy_exp, /**< in: | exponent of energies */ - const Word16 start, /**< in: Q0 | start subband index */ - const Word16 stop /**< in: Q0 | stop subband index */ +Word16 IGF_getSFM( /**< out: Q15| SFM value */ + Word16 *SFM_exp, /**< out: | exponent of SFM Factor */ + const Word32 *energy, /**< in: Q31| energies */ + const Word16 *energy_exp, /**< in: | exponent of energies */ + const Word16 start, /**< in: Q0 | start subband index */ + const Word16 stop /**< in: Q0 | stop subband index */ ) { Word16 n, i, s; @@ -1083,8 +1083,8 @@ static void IGF_WriteFlatteningTrigger( /**********************************************************************/ /* updates the start/stop frequency of IGF according to igfGridIdx **************************************************************************/ -static void IGF_UpdateInfo( const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ - const Word16 igfGridIdx /**< in: Q0 | IGF grid index */ +void IGF_UpdateInfo( const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ + const Word16 igfGridIdx /**< in: Q0 | IGF grid index */ ) { IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 56144429e..e24df2607 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -803,6 +803,11 @@ ivas_error init_encoder( } /* Share the memories for 2xTCX10/4xTCX5 and for TCX20 */ +#ifdef IVAS_FLOAT_FIXED + st->hTcxEnc->spectrum_fx[0] = st->hTcxEnc->spectrum_long_fx; + st->hTcxEnc->spectrum_fx[1] = st->hTcxEnc->spectrum_long_fx + N_TCX10_MAX; +#endif // IVAS_FLOAT_FIXED + st->hTcxEnc->spectrum[0] = st->hTcxEnc->spectrum_long; st->hTcxEnc->spectrum[1] = st->hTcxEnc->spectrum_long + N_TCX10_MAX; #ifdef IVAS_FLOAT_FIXED diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c index 6482d11de..5c7b481e5 100644 --- a/lib_enc/ivas_mct_core_enc.c +++ b/lib_enc/ivas_mct_core_enc.c @@ -39,7 +39,9 @@ #include "rom_com.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED +#include "prot_fx.h" #include "ivas_prot_fx.h" +#include "prot_fx.h" #endif @@ -178,7 +180,7 @@ static void AdjustChannelRatios( * * joint mct encoding *-------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void ivas_mct_core_enc( const IVAS_FORMAT ivas_format, /* i : IVAS format */ MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ @@ -190,6 +192,15 @@ void ivas_mct_core_enc( const int16_t sba_order /* i : Ambisonic (SBA) order */ ) { +#ifdef IVAS_FLOAT_FIXED + Word32 *orig_spectrum_fx[MCT_MAX_CHANNELS][2]; /* Pointers to MDCT output for a short block (L/R) */ + Word32 powerSpec_fx[MCT_MAX_CHANNELS][L_FRAME48k]; + Word32 powerSpecMsInv_long_fx[MCT_MAX_CHANNELS][L_FRAME48k]; /* MS inv power spectrum, also inverse MDST spectrum */ + Word32 *powerSpecMsInv_fx[MCT_MAX_CHANNELS][2]; + Word32 *inv_mdst_spectrum_fx[MCT_MAX_CHANNELS][2]; + Word32 *inv_spectrum_fx[MCT_MAX_CHANNELS][2]; + Word32 inv_spectrum_long_fx[MCT_MAX_CHANNELS][L_FRAME48k]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ +#endif // IVAS_FLOAT_FIXED int16_t ch, ch_core, nSubframes, L_subframeTCX; int16_t i, cpe_id, n, nAvailBits; int16_t nCPE; @@ -228,6 +239,13 @@ void ivas_mct_core_enc( for ( ch = 0; ch < nChannels; ch++ ) { +#ifdef IVAS_FLOAT_FIXED + inv_mdst_spectrum_fx[ch][0] = powerSpecMsInv_fx[ch][0] = powerSpecMsInv_long_fx[ch]; + inv_mdst_spectrum_fx[ch][1] = powerSpecMsInv_fx[ch][1] = powerSpecMsInv_long_fx[ch] + N_TCX10_MAX; + inv_spectrum_fx[ch][0] = inv_spectrum_long_fx[ch]; + inv_spectrum_fx[ch][1] = inv_spectrum_long_fx[ch] + N_TCX10_MAX; + UNUSED_PARAM( inv_mdst_spectrum_fx ); +#endif inv_mdst_spectrum[ch][0] = powerSpecMsInv[ch][0] = powerSpecMsInv_long[ch]; inv_mdst_spectrum[ch][1] = powerSpecMsInv[ch][1] = powerSpecMsInv_long[ch] + N_TCX10_MAX; inv_spectrum[ch][0] = inv_spectrum_long[ch]; @@ -245,8 +263,14 @@ void ivas_mct_core_enc( continue; } +#ifdef IVAS_FLOAT_FIXED + orig_spectrum_fx[i][0] = hMCT->p_orig_spectrum_long_fx[cpe_id][ch]; + orig_spectrum_fx[i][1] = hMCT->p_orig_spectrum_long_fx[cpe_id][ch] + N_TCX10_MAX; +#endif // IVAS_FLOAT_FIXED + mdst_spectrum[i][0] = hMCT->p_mdst_spectrum_long[cpe_id][ch]; mdst_spectrum[i][1] = hMCT->p_mdst_spectrum_long[cpe_id][ch] + N_TCX10_MAX; + orig_spectrum[i][0] = hMCT->p_orig_spectrum_long[cpe_id][ch]; orig_spectrum[i][1] = hMCT->p_orig_spectrum_long[cpe_id][ch] + N_TCX10_MAX; @@ -267,28 +291,16 @@ void ivas_mct_core_enc( if ( switch_bw ) { -#ifndef IVAS_FLOAT_FIXED initMdctStereoEncData( hMCT->hBlockData[ch]->hStereoMdct, ivas_format, sts[ch_core]->element_mode, sts[ch_core]->element_brate, sts[ch_core]->bwidth, sts[ch_core]->igf, sts[ch_core]->hIGFEnc->igfData.igfInfo.grid, 0 ); -#else - initMdctStereoEncData_fx( hMCT->hBlockData[ch]->hStereoMdct, ivas_format, sts[ch_core]->element_mode, sts[ch_core]->element_brate, sts[ch_core]->bwidth, - sts[ch_core]->igf, sts[ch_core]->hIGFEnc->igfData.igfInfo.grid, 0 ); -#endif } if ( sts[ch_core]->igf ) { -#ifndef IVAS_FLOAT_FIXED /* calculate the igf start band from the igf start line */ stereo_mdct_init_igf_start_band( &hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX20, 1.0f, sts[ch_core]->bwidth, sts[ch_core]->total_brate ); stereo_mdct_init_igf_start_band( &hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX10, 0.5f, sts[ch_core]->bwidth, sts[ch_core]->total_brate ); -#else - /* calculate the igf start band from the igf start line */ - stereo_mdct_init_igf_start_band_fx( &hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX20, 16384 /* 1.0f in Q14 */, sts[ch_core]->bwidth, sts[ch_core]->total_brate ); - - stereo_mdct_init_igf_start_band_fx( &hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX10, 8192 /* 0.5f in Q14 */, sts[ch_core]->bwidth, sts[ch_core]->total_brate ); -#endif } else { @@ -416,7 +428,11 @@ void ivas_mct_core_enc( { if ( hMCT->currBlockDataCnt > 0 ) { +#ifdef IVAS_FLOAT_FIXED + mctStereoIGF_enc_fx( hMCT, sts, orig_spectrum_fx, powerSpec_fx, powerSpecMsInv_fx, inv_spectrum_fx, orig_spectrum, powerSpec, powerSpecMsInv, inv_spectrum, sp_aud_decision0 ); +#else mctStereoIGF_enc( hMCT, sts, orig_spectrum, powerSpec, powerSpecMsInv, inv_spectrum, sp_aud_decision0 ); +#endif // IVAS_FLOAT_FIXED } else { @@ -559,3 +575,499 @@ void ivas_mct_core_enc( return; } +#else +void ivas_mct_core_enc( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE encoder structures */ + const Word16 nChannels, /* i : number of channels to be coded */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 switch_bw, /* i : flag bandwidth switch occurance */ + const Word16 lfe_bits, /* i : bits spent for LFE */ + const Word16 sba_order /* i : Ambisonic (SBA) order */ +) +{ + Word16 ch, ch_core, nSubframes, L_subframeTCX; + Word16 i, cpe_id, n, nAvailBits; + Word16 nCPE; + float *orig_spectrum[MCT_MAX_CHANNELS][2]; /* Pointers to MDCT output for a short block (L/R) */ + float powerSpec[MCT_MAX_CHANNELS][L_FRAME48k]; + float powerSpecMsInv_long[MCT_MAX_CHANNELS][L_FRAME48k]; /* MS inv power spectrum, also inverse MDST spectrum */ + float *powerSpecMsInv[MCT_MAX_CHANNELS][2]; + float *inv_mdst_spectrum[MCT_MAX_CHANNELS][2]; + float *inv_spectrum[MCT_MAX_CHANNELS][2]; + float *mdst_spectrum[MCT_MAX_CHANNELS][2] = { NULL }; + float inv_spectrum_long[MCT_MAX_CHANNELS][L_FRAME48k]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ +#if 0 + Word32 *orig_spectrum_fx[MCT_MAX_CHANNELS][2]; /* Pointers to MDCT output for a short block (L/R) */ + Word32 powerSpec_fx[MCT_MAX_CHANNELS][L_FRAME48k]; + Word32 mdst_fx; +#endif + Word32 powerSpecMsInv_long_fx[MCT_MAX_CHANNELS][L_FRAME48k]; /* MS inv power spectrum, also inverse MDST spectrum */ + Word32 *powerSpecMsInv_fx[MCT_MAX_CHANNELS][2]; + Word32 *inv_mdst_spectrum_fx[MCT_MAX_CHANNELS][2]; + Word32 *inv_spectrum_fx[MCT_MAX_CHANNELS][2]; + Word32 *mdst_spectrum_fx[MCT_MAX_CHANNELS][2] = { NULL }; + Word32 inv_spectrum_long_fx[MCT_MAX_CHANNELS][L_FRAME48k]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ + Word16 total_side_bits; + Word16 chBitRatios[MCT_MAX_CHANNELS]; + Encoder_State *sts[MCT_MAX_CHANNELS]; + Encoder_State *st; + Word16 sp_aud_decision0[MCT_MAX_CHANNELS]; + BSTR_ENC_HANDLE hBstr; + float mdst; + + + push_wmops( "mct_encoding" ); + + /*--------------------------------------------------------------* + * Initialization + *---------------------------------------------------------------*/ + + total_side_bits = 0; + move16(); + + nCPE = shr( nChannels, 1 ); // nChannels / CPE_CHANNELS + + /*in case of odd number of channels*/ + if ( NE_16( ( nCPE * CPE_CHANNELS ), nChannels ) ) + { + nCPE = add( nCPE, 1 ); + } + + FOR( ch = 0; ch < nChannels; ch++ ) + { +#if 1 // Float initialization to be removed + inv_mdst_spectrum[ch][0] = powerSpecMsInv[ch][0] = powerSpecMsInv_long[ch]; + inv_mdst_spectrum[ch][1] = powerSpecMsInv[ch][1] = powerSpecMsInv_long[ch] + N_TCX10_MAX; + inv_spectrum[ch][0] = inv_spectrum_long[ch]; + inv_spectrum[ch][1] = inv_spectrum_long[ch] + N_TCX10_MAX; +#endif + + inv_mdst_spectrum_fx[ch][0] = powerSpecMsInv_fx[ch][0] = powerSpecMsInv_long_fx[ch]; + inv_mdst_spectrum_fx[ch][1] = powerSpecMsInv_fx[ch][1] = powerSpecMsInv_long_fx[ch] + N_TCX10_MAX; + inv_spectrum_fx[ch][0] = inv_spectrum_long_fx[ch]; + inv_spectrum_fx[ch][1] = inv_spectrum_long_fx[ch] + N_TCX10_MAX; + } + + FOR( ( cpe_id = 0, i = 0 ); cpe_id < nCPE; cpe_id++ ) + { + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + sts[i] = hCPE[cpe_id]->hCoreCoder[ch]; + IF( EQ_32( hCPE[cpe_id]->hCoreCoder[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) + { + i = add( i, 1 ); + CONTINUE; + } +#if 1 // Float initialization to be removed + mdst_spectrum[i][0] = hMCT->p_mdst_spectrum_long[cpe_id][ch]; + mdst_spectrum[i][1] = hMCT->p_mdst_spectrum_long[cpe_id][ch] + N_TCX10_MAX; + orig_spectrum[i][0] = hMCT->p_orig_spectrum_long[cpe_id][ch]; + orig_spectrum[i][1] = hMCT->p_orig_spectrum_long[cpe_id][ch] + N_TCX10_MAX; +#endif + mdst_spectrum_fx[i][0] = hMCT->p_mdst_spectrum_long_fx[cpe_id][ch]; + mdst_spectrum_fx[i][1] = hMCT->p_mdst_spectrum_long_fx[cpe_id][ch] + N_TCX10_MAX; +#if 0 + orig_spectrum_fx[i][0] = hMCT->p_orig_spectrum_long_fx[cpe_id][ch]; + orig_spectrum_fx[i][1] = hMCT->p_orig_spectrum_long_fx[cpe_id][ch] + N_TCX10_MAX; +#endif + + sp_aud_decision0[i] = hCPE[cpe_id]->hCoreCoder[0]->sp_aud_decision0; + move16(); + + sts[i]->hTcxEnc->tns_ms_flag[0] = 0; + sts[i]->hTcxEnc->tns_ms_flag[1] = 0; + move16(); + move16(); + + i = add( i, 1 ); + } + } + + hBstr = sts[0]->hBstr; + + FOR( ch = 0; ch < shr( hMCT->nchan_out_woLFE, 1 ); ch++ ) + { + ch_core = imult1616( ch, CPE_CHANNELS ); + + IF( switch_bw ) + { + initMdctStereoEncData_fx( hMCT->hBlockData[ch]->hStereoMdct, ivas_format, sts[ch_core]->element_mode, sts[ch_core]->element_brate, sts[ch_core]->bwidth, + sts[ch_core]->igf, sts[ch_core]->hIGFEnc->igfData.igfInfo.grid, 0 ); + } + + IF( sts[ch_core]->igf ) + { + /* calculate the igf start band from the igf start line */ + stereo_mdct_init_igf_start_band_fx( &hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX20, 16384 /* 1.0f in Q14 */, sts[ch_core]->bwidth, sts[ch_core]->total_brate ); + + stereo_mdct_init_igf_start_band_fx( &hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX10, 8192 /* 0.5f in Q14 */, sts[ch_core]->bwidth, sts[ch_core]->total_brate ); + } + ELSE + { + hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX20.sfbIgfStart = -1; + hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX10.sfbIgfStart = -1; + hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX10.nBandsStereoCore = hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX10.sfbCnt; + hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX20.nBandsStereoCore = hMCT->hBlockData[ch]->hStereoMdct->stbParamsTCX20.sfbCnt; + move16(); + move16(); + move16(); + move16(); + } + } + + FOR( ch = 0; ch < nChannels; ch++ ) + { + st = sts[ch]; + + IF( EQ_32( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) + { + CONTINUE; + } + + IF( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) ) + { + nSubframes = 1; + move16(); + } + ELSE + { + nSubframes = NB_DIV; + move16(); + } + + FOR( n = 0; n < nSubframes; n++ ) + { + st->side_bits_frame_channel = add( st->side_bits_frame_channel, NBITS_TCX_GAIN + NOISE_FILL_RANGES * NBITS_NOISE_FILL_LEVEL ); + move16(); + } + + /* Add estimated stereo bits */ + st->side_bits_frame_channel = add( st->side_bits_frame_channel, NBBITS_MCT_RATIO ); + move16(); + } + + /*--------------------------------------------------------------* + * MCT algorithm + *---------------------------------------------------------------*/ + +#if 1 // Float to Fixed, to be removed + Word16 q_spec = Q31; + Word16 length; + + FOR( ch = 0; ch < nChannels; ch++ ) + { + length = sts[ch]->hTcxEnc->L_frameTCX / ( ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); + IF( sts[ch]->last_core == ACELP_CORE ) + { + length += length / 4; + } + FOR( Word16 k = 0; k <= ( ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) + { + if ( sts[ch]->hTcxEnc->spectrum[0] ) + { + q_spec = s_min( q_spec, Q_factor_arrL( sts[ch]->hTcxEnc->spectrum[k], length ) - 1 ); + } + IF( mdst_spectrum[ch][0] ) + { + q_spec = s_min( q_spec, Q_factor_arrL( mdst_spectrum[ch][k], length ) - 1 ); + } + } + } + + FOR( ch = 0; ch < nChannels; ch++ ) + { + length = sts[ch]->hTcxEnc->L_frameTCX / ( ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); + IF( sts[ch]->last_core == ACELP_CORE ) + { + length += length / 4; + } + FOR( Word16 k = 0; k <= ( ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) + { + if ( sts[ch]->hTcxEnc->spectrum[0] ) + { + floatToFixed_arrL32( sts[ch]->hTcxEnc->spectrum[k], sts[ch]->hTcxEnc->spectrum_fx[k], q_spec, length ); + sts[ch]->hTcxEnc->spectrum_e[k] = sub( Q31, q_spec ); + } + if ( mdst_spectrum[ch][0] ) + { + floatToFixed_arrL32( mdst_spectrum[ch][k], mdst_spectrum_fx[ch][k], q_spec, length ); + } + } + } +#endif // 1 + + apply_MCT_enc_fx( hMCT, sts, mdst_spectrum_fx, inv_spectrum_fx, inv_mdst_spectrum_fx, nChannels ); + +#if 1 // Fixed to Float, to be removed + FOR( ch = 0; ch < nChannels; ch++ ) + { + if ( sts[ch]->hTcxEnc->spectrum[0] ) + { + q_spec = 31 - sts[ch]->hTcxEnc->spectrum_e[0]; + } + length = sts[ch]->hTcxEnc->L_frameTCX / ( ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); + IF( sts[ch]->last_core == ACELP_CORE ) + { + length += length / 4; + } + FOR( Word16 k = 0; k <= ( ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) + { + if ( sts[ch]->hTcxEnc->spectrum[0] ) + { + fixedToFloat_arrL32( sts[ch]->hTcxEnc->spectrum_fx[k], sts[ch]->hTcxEnc->spectrum[k], q_spec, length ); + fixedToFloat_arrL32( inv_spectrum_fx[ch][k], inv_spectrum[ch][k], q_spec, length ); + } + if ( mdst_spectrum[ch][0] ) + { + fixedToFloat_arrL32( inv_mdst_spectrum_fx[ch][k], inv_mdst_spectrum[ch][k], q_spec, length ); + fixedToFloat_arrL32( mdst_spectrum_fx[ch][k], mdst_spectrum[ch][k], q_spec, length ); + } + } + } +#endif // 1 + + /*--------------------------------------------------------------* + * Power spectrum calculation for Noise Estimation + *---------------------------------------------------------------*/ + + for ( ch = 0; ch < nChannels; ch++ ) + { + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + nSubframes = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + L_subframeTCX = sts[ch]->hTcxEnc->L_frameTCX / nSubframes; + /* in MCT only relevant for bitrate switching from non-MCT bitrates */ + if ( sts[ch]->last_core == ACELP_CORE ) + { + L_subframeTCX += L_subframeTCX / 4; + } + + for ( n = 0; n < nSubframes; n++ ) + { + if ( sts[ch]->hTcxEnc->tns_ms_flag[n] ) + { + /* power spectrum: MDCT^2 + MDST^2 */ + for ( i = 0; i < L_subframeTCX; i++ ) + { + powerSpec[ch][i + n * L_subframeTCX] = mdst_spectrum[ch][n][i] * mdst_spectrum[ch][n][i] + sts[ch]->hTcxEnc->spectrum[n][i] * sts[ch]->hTcxEnc->spectrum[n][i]; + powerSpecMsInv[ch][n][i] = inv_mdst_spectrum[ch][n][i] * inv_mdst_spectrum[ch][n][i] + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; + } + } + else + { + if ( hMCT->currBlockDataCnt > 0 ) + { + /* power spectrum: MDCT^2 + MDST^2 */ + powerSpecMsInv[ch][n][0] = inv_spectrum[ch][n][0] * inv_spectrum[ch][n][0]; + + for ( i = 1; i < L_subframeTCX - 1; i++ ) + { + mdst = ( inv_spectrum[ch][n][i + 1] - inv_spectrum[ch][n][i - 1] ); /* An MDST estimate */ + powerSpecMsInv[ch][n][i] = mdst * mdst + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; + } + + powerSpecMsInv[ch][n][L_subframeTCX - 1] = inv_spectrum[ch][n][L_subframeTCX - 1] * inv_spectrum[ch][n][L_subframeTCX - 1]; + } + + /* power spectrum: MDCT^2 + MDST^2 */ + powerSpec[ch][n * L_subframeTCX] = sts[ch]->hTcxEnc->spectrum[n][0] * sts[ch]->hTcxEnc->spectrum[n][0]; + + for ( i = 1; i < L_subframeTCX - 1; i++ ) + { + mdst = ( sts[ch]->hTcxEnc->spectrum[n][i + 1] - sts[ch]->hTcxEnc->spectrum[n][i - 1] ); /* An MDST estimate */ + powerSpec[ch][i + n * L_subframeTCX] = mdst * mdst + sts[ch]->hTcxEnc->spectrum[n][i] * sts[ch]->hTcxEnc->spectrum[n][i]; + } + powerSpec[ch][L_subframeTCX - 1 + n * L_subframeTCX] = sts[ch]->hTcxEnc->spectrum[n][L_subframeTCX - 1] * sts[ch]->hTcxEnc->spectrum[n][L_subframeTCX - 1]; + } + } + } + + for ( ch = 0; ch < nChannels; ch++ ) + { + st = sts[ch]; + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + L_subframeTCX = st->hTcxEnc->L_frameTCX / nSubframes; + /* in MCT only relevant for bitrate switching from non-MCT bitrates */ + if ( st->last_core == ACELP_CORE ) + { + L_subframeTCX += L_subframeTCX / 4; + } + + if ( ( st->hTcxEnc->tcxMode == TCX_20 ) && ( st->total_brate < HQ_96k || st->igf ) ) + { + /*-----------------------------------------------------------* + * Compute noise-measure flags for spectrum filling * + * and quantization (0: tonal, 1: noise-like). * + * Detect low pass if present. * + *-----------------------------------------------------------*/ + + ComputeSpectrumNoiseMeasure( powerSpec[ch], st->hTcxEnc->L_frameTCX, st->hTcxEnc->nmStartLine, ( st->L_frame * st->last_sr_core != st->L_frame_past * st->sr_core ) || ( st->last_core != TCX_20_CORE ), st->hTcxEnc->memQuantZeros, st->hTcxEnc->L_frameTCX ); + } + + st->hTcxEnc->measuredBwRatio_flt = 1.f; /* No bandwidth limit for the noise filling */ + } + + if ( sts[0]->igf ) + { + if ( hMCT->currBlockDataCnt > 0 ) + { + mctStereoIGF_enc( hMCT, sts, orig_spectrum, powerSpec, powerSpecMsInv, inv_spectrum, sp_aud_decision0 ); + } + else + { + for ( ch = 0; ch < nChannels; ch++ ) + { + st = sts[ch]; + + /* update the pointer to the buffer of indices of the second channel */ + if ( ch > 0 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } + if ( + sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + L_subframeTCX = st->hTcxEnc->L_frameTCX / nSubframes; + + if ( st->igf ) + { + for ( n = 0; n < nSubframes; n++ ) + { + ProcessIGF( st, st->hTcxEnc->spectrum[n], orig_spectrum[ch][n], &powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); + } + } + } + } + + /*write IGF data to bitstream*/ + for ( ch = 0; ch < nChannels; ch++ ) + { + st = sts[ch]; + if ( + sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + enc_prm_igf_mdct( st, hBstr ); + } + } + + /* correct side bits per channel*/ + for ( ch = 0; ch < nChannels; ch++ ) + { + st = sts[ch]; + + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + + st->side_bits_frame_channel -= NBBITS_MCT_RATIO; /* Subtract estimated stereo bits */ + total_side_bits += st->side_bits_frame_channel; + } + + /*--------------------------------------------------------------* + * Bitrate distribution among channels and MCT bitstream writing + *---------------------------------------------------------------*/ +#if 1 // Float to fixed conversion, to be removed + FOR( Word16 pair = hMCT->currBlockDataCnt - 1; pair >= 0; pair-- ) + { + IF( hMCT->hBlockData[pair]->hStereoMdct->hItd ) + { + hMCT->hBlockData[pair]->hStereoMdct->hItd->itd_fx[1] = float_to_fix( hMCT->hBlockData[pair]->hStereoMdct->hItd->itd[1], Q23 ); + } + } +#endif + write_mct_bitstream_fx( sts, hMCT, nChannels ); + + FindChannelRatio( sts, chBitRatios, nChannels ); + + nAvailBits = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - NBITS_BWIDTH - hMCT->nBitsMCT - lfe_bits ); + + + /* subtract IVAS format signaling bits */ + if ( ivas_format == MC_FORMAT ) + { + nAvailBits -= IVAS_FORMAT_SIGNALING_NBITS; + nAvailBits -= MC_LS_SETUP_BITS; + } + else if ( ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT ) + { + nAvailBits -= IVAS_FORMAT_SIGNALING_NBITS_EXTENDED; + nAvailBits -= SBA_ORDER_BITS + SBA_PLANAR_BITS; + if ( ivas_format == SBA_ISM_FORMAT && nChannels > 4 ) + { + nAvailBits -= IVAS_COMBINED_FORMAT_SIGNALLING_BITS; + } + } + + for ( cpe_id = 0, i = 0; cpe_id < nCPE; cpe_id++ ) + { + if ( hCPE[cpe_id]->hMetaData != NULL ) + { + nAvailBits -= hCPE[cpe_id]->hMetaData->nb_bits_tot; + } + } + + /*substract bits needed for the bitrate ratios */ + for ( ch = 0; ch < nChannels; ch++ ) + { + if ( + sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + nAvailBits -= NBBITS_MCT_RATIO; + } + nAvailBits -= total_side_bits + hMCT->nchan_out_woLFE; /* if MC 1 extra bit that was initially send to signal LFE_off */ + + + if ( hMCT->hbr_mct ) + { + assert( ivas_total_brate >= IVAS_256k ); + AdjustChannelRatios( chBitRatios, nChannels, ivas_total_brate, nAvailBits, sba_order ); + } + + for ( ch = 0; ch < nChannels; ch++ ) + { + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + + push_next_indice( hBstr, chBitRatios[ch], NBBITS_MCT_RATIO ); + } + + /*distribute bits amongst channels*/ + splitAvailableBitsMCT( (void **) sts, nAvailBits, chBitRatios, ENC, nChannels ); + + for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = hCPE[cpe_id]->hCoreCoder[ch]; + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + st->total_brate = ( st->bits_frame_channel + st->side_bits_frame_channel ) * FRAMES_PER_SEC; + } + } + + + pop_wmops(); + + return; +} +#endif diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index e0e9d5cbc..89515091f 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -40,6 +40,7 @@ #include "ivas_prot.h" #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED +#include "prot_fx.h" #include "ivas_prot_fx.h" #endif @@ -79,6 +80,14 @@ static void set_mct_enc_params( { set_f( hMCT->lastxCorrMatrix[n], 0, MCT_MAX_CHANNELS ); } +#ifdef IVAS_FLOAT_FIXED + FOR( n = 0; n < MCT_MAX_CHANNELS; n++ ) + { + set32_fx( hMCT->lastxCorrMatrix_fx[n], 0, MCT_MAX_CHANNELS ); + } + hMCT->lastxCorrMatrix_e = 0; + move16(); +#endif } hMCT->hbr_mct = 0; @@ -157,7 +166,7 @@ static void map_input_to_cpe_channels( * * Multi-Channel Coding Tool (MCT) encoding routine *-------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED ivas_error ivas_mct_enc( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ float *data[MCT_MAX_CHANNELS], /* i : input signal buffers */ @@ -169,6 +178,9 @@ ivas_error ivas_mct_enc( MCT_ENC_HANDLE hMCT; CPE_ENC_HANDLE hCPE; float mdst_spectrum_long[MCT_MAX_BLOCKS][CPE_CHANNELS][L_FRAME48k]; +#ifdef IVAS_FLOAT_FIXED + Word32 orig_spectrum_long_fx[MCT_MAX_BLOCKS][CPE_CHANNELS][L_FRAME48k]; +#endif // IVAS_FLOAT_FIXED float orig_spectrum_long[MCT_MAX_BLOCKS][CPE_CHANNELS][L_FRAME48k]; int16_t switch_bw; IVAS_FORMAT ivas_format; @@ -196,6 +208,9 @@ ivas_error ivas_mct_enc( { hCPE = st_ivas->hCPE[cpe_id]; hMCT->p_mdst_spectrum_long[cpe_id][n] = mdst_spectrum_long[cpe_id][n]; +#ifdef IVAS_FLOAT_FIXED + hMCT->p_orig_spectrum_long_fx[cpe_id][n] = orig_spectrum_long_fx[cpe_id][n]; +#endif // IVAS_FLOAT_FIXED hMCT->p_orig_spectrum_long[cpe_id][n] = orig_spectrum_long[cpe_id][n]; hCPE->hCoreCoder[n]->input_bwidth = hCPE->hCoreCoder[n]->last_input_bwidth; /* updated in BWD */ hCPE->hCoreCoder[n]->bwidth = hCPE->hCoreCoder[n]->last_bwidth; /* updated in BWD */ @@ -224,11 +239,7 @@ ivas_error ivas_mct_enc( for ( n = 0; n < (int16_t) ( hMCT->nchan_out_woLFE * 0.5 ); n++ ) { -#ifndef IVAS_FLOAT_FIXED initMdctStereoEncData( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, max_bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->igf ? st_ivas->hCPE[0]->hCoreCoder[0]->hIGFEnc->igfData.igfInfo.grid : NULL, 0 ); -#else - initMdctStereoEncData_fx( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, max_bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->igf ? st_ivas->hCPE[0]->hCoreCoder[0]->hIGFEnc->igfData.igfInfo.grid : NULL, 0 ); -#endif } } @@ -275,7 +286,148 @@ ivas_error ivas_mct_enc( pop_wmops(); return error; } +#else +ivas_error ivas_mct_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ + float *data[MCT_MAX_CHANNELS], /* i : input signal buffers */ + const Word16 input_frame, /* i : input frame length per channel */ + const Word16 nb_bits_metadata /* i : number of metadata bits */ +) +{ + Word16 n, cpe_id; + MCT_ENC_HANDLE hMCT; + CPE_ENC_HANDLE hCPE; + float mdst_spectrum_long[MCT_MAX_BLOCKS][CPE_CHANNELS][L_FRAME48k]; + float orig_spectrum_long[MCT_MAX_BLOCKS][CPE_CHANNELS][L_FRAME48k]; + Word32 mdst_spectrum_long_fx[MCT_MAX_BLOCKS][CPE_CHANNELS][L_FRAME48k]; + Word32 orig_spectrum_long_fx[MCT_MAX_BLOCKS][CPE_CHANNELS][L_FRAME48k]; + Word16 switch_bw; + IVAS_FORMAT ivas_format; + Word16 max_bwidth; + Word32 ivas_total_brate; + ivas_error error; + float *pdata[MAX_INPUT_CHANNELS]; + + error = IVAS_ERR_OK; + move32(); + + push_wmops( "ivas_mct_enc" ); + + /* Initialization */ + hMCT = st_ivas->hMCT; + hMCT->hBstr = st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; /* pointer to write MCT side bits */ + + ivas_format = st_ivas->hEncoderConfig->ivas_format; + max_bwidth = st_ivas->hEncoderConfig->max_bwidth; + ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; + move32(); + move16(); + move32(); + + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + hCPE = st_ivas->hCPE[cpe_id]; +#if 1 // float initialization to be removed + hMCT->p_mdst_spectrum_long[cpe_id][n] = mdst_spectrum_long[cpe_id][n]; + hMCT->p_orig_spectrum_long[cpe_id][n] = orig_spectrum_long[cpe_id][n]; +#endif + + hMCT->p_mdst_spectrum_long_fx[cpe_id][n] = mdst_spectrum_long_fx[cpe_id][n]; + hMCT->p_orig_spectrum_long_fx[cpe_id][n] = orig_spectrum_long_fx[cpe_id][n]; + + hCPE->hCoreCoder[n]->input_bwidth = hCPE->hCoreCoder[n]->last_input_bwidth; /* updated in BWD */ + hCPE->hCoreCoder[n]->bwidth = hCPE->hCoreCoder[n]->last_bwidth; /* updated in BWD */ + move16(); + move16(); + /* reset channel mode from previous state*/ + IF( ( hCPE->cpe_id * CPE_CHANNELS + n ) >= hMCT->nchan_out_woLFE ) + { + hCPE->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + move32(); + } + ELSE + { + hCPE->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + move32(); + } + } + } + /* reconfiguration in case of bitrate switching */ + IF( NE_32( ivas_total_brate, st_ivas->hEncoderConfig->last_ivas_total_brate ) ) + { + Word32 cp_bitrate; + // cp_bitrate = ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS; + cp_bitrate = L_shl( L_deposit_l( div_l( ivas_total_brate, hMCT->nchan_out_woLFE ) ), 2 ); // a/b => div_l(a, b/2) or (2 * div_l(a, b)) + + IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + // cp_bitrate = ivas_total_brate / st_ivas->nchan_transport * CPE_CHANNELS; + cp_bitrate = L_shl( L_deposit_l( div_l( ivas_total_brate, st_ivas->nchan_transport ) ), 2 ); // a/b => div_l(a, b/2) or (2 * div_l(a, b)) + } + + IF( st_ivas->hCPE[0]->hCoreCoder[0]->igf ) + { + FOR( n = 0; n < shr( hMCT->nchan_out_woLFE, 1 ); n++ ) + { + initMdctStereoEncData_fx( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, max_bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFEnc->igfData.igfInfo.grid, 0 ); + } + } + ELSE + { + FOR( n = 0; n < shr( hMCT->nchan_out_woLFE, 1 ); n++ ) + { + initMdctStereoEncData_fx( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, max_bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, NULL, 0 ); + } + } + } + + /* set coded audio band-width */ + switch_bw = set_bw_mct_fx( st_ivas->hCPE, st_ivas->nCPE ); + + /*for MC and MCT remove pointer to LFE input that has been processed separately */ + map_input_to_cpe_channels( st_ivas, pdata, data ); + + /* pre-processing */ + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + IF( ( error = ivas_cpe_enc( st_ivas, cpe_id, pdata[cpe_id * CPE_CHANNELS], pdata[cpe_id * CPE_CHANNELS + 1], input_frame, nb_bits_metadata ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* joint MCT encoding */ + ivas_mct_core_enc( ivas_format, hMCT, st_ivas->hCPE, hMCT->nchan_out_woLFE, ivas_total_brate, switch_bw, ( ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) ? (int16_t) st_ivas->hLFE->lfe_bits : 0, st_ivas->hEncoderConfig->sba_order ); + + /* Spectrum quantization and coding */ + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + hCPE = st_ivas->hCPE[cpe_id]; + + if ( cpe_id > 0 ) + { + hCPE->hCoreCoder[0]->hBstr->ind_list = st_ivas->hCPE[cpe_id - 1]->hCoreCoder[1]->hBstr->ind_list + st_ivas->hCPE[cpe_id - 1]->hCoreCoder[1]->hBstr->nb_ind_tot; + } + + ivas_mdct_quant_coder( hCPE, hMCT->tnsBits[cpe_id], hMCT->tnsSize[cpe_id], hMCT->p_param[cpe_id], 1 ); + + /* update input samples buffer (as done in ivas_cpe_enc() for other than MCT coding) */ + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + mvr2r( hCPE->hCoreCoder[n]->input, hCPE->hCoreCoder[n]->old_input_signal, input_frame ); + + /* common encoder updates */ + updt_enc_common( hCPE->hCoreCoder[n] ); + } + } + + pop_wmops(); + return error; +} +#endif /*------------------------------------------------------------------------- * create_mct_enc() diff --git a/lib_enc/ivas_mct_enc_mct.c b/lib_enc/ivas_mct_enc_mct.c index d3628b7e1..0a4659182 100644 --- a/lib_enc/ivas_mct_enc_mct.c +++ b/lib_enc/ivas_mct_enc_mct.c @@ -46,8 +46,10 @@ * Local constants *---------------------------------------------------------------*/ -#define SPAR_CORR_THRES 0.9f -#define DEFAULT_CORR_THRES 0.3f +#define SPAR_CORR_THRES 0.9f +#define DEFAULT_CORR_THRES 0.3f +#define SPAR_CORR_THRES_Q31 1932735283 +#define DEFAULT_CORR_THRES_Q31 644245094 /*------------------------------------------------------------------------- * getChannelEnergies() @@ -85,6 +87,64 @@ void getChannelEnergies( return; } +#ifdef IVAS_FLOAT_FIXED +void getChannelEnergies_fx( + Encoder_State **sts, /* i/o: Encoder state structure */ + Word32 nrg[MCT_MAX_CHANNELS], /* o : buffer with energies for each channel */ + Word16 nrg_e[MCT_MAX_CHANNELS], /* o : exponents of energies for each channel */ + const Word16 nchan /* i : number of channels */ +) +{ + Word16 ch, n, gb, sum2_e; + Word32 sum2; + Word16 nSubframes, L_subframe; + Encoder_State *st; + + /* Calculate energies per channel */ + FOR( ch = 0; ch < nchan; ch++ ) + { + st = sts[ch]; + IF( NE_32( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) + { + IF( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) ) + { + nSubframes = 1; + move16(); + L_subframe = st->hTcxEnc->L_frameTCX; + move16(); + } + ELSE + { + nSubframes = NB_DIV; + move16(); + L_subframe = shr( st->hTcxEnc->L_frameTCX, 1 ); + } + + gb = find_guarded_bits_fx( (Word32) L_subframe ); + + sum2_e = st->hTcxEnc->spectrum_e[0]; + move16(); + nrg[ch] = 0; + move32(); + FOR( n = 0; n < nSubframes; n++ ) + { + sum2 = sum2_32_exp_fx( st->hTcxEnc->spectrum_fx[n], L_subframe, &sum2_e, gb ); + + nrg[ch] = BASOP_Util_Add_Mant32Exp( nrg[ch], nrg_e[ch], sum2, sum2_e, &nrg_e[ch] ); + move32(); + + sum2_e = st->hTcxEnc->spectrum_e[0]; + move16(); + } + + nrg[ch] = Sqrt32( nrg[ch], &nrg_e[ch] ); + move32(); + } + } + + return; +} +#endif /*------------------------------------------------------------------------- @@ -92,7 +152,7 @@ void getChannelEnergies( * * find channel pair with highest cross-correlation *-------------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED static void getNextBestCorrelation( float xCorrMatrix[][MCT_MAX_CHANNELS], /* i : cross-correlation matrix */ int16_t *_ch1, /* o : first channel of selected channel-pair */ @@ -145,6 +205,69 @@ static void getNextBestCorrelation( return; } +#else +static void getNextBestCorrelation_fx( + Word32 xCorrMatrix[][MCT_MAX_CHANNELS], /* i : cross-correlation matrix, Qx */ + Word16 *_ch1, /* o : first channel of selected channel-pair */ + Word16 *_ch2, /* o : second channel of selected channel-pair, Qx */ + Word32 *max_corr, /* o : normalized cross correlation value of selected channel pair */ + const Word16 sortInd, + const Word16 nChannels ) +{ + Word32 tmp_corrVals[( MCT_MAX_CHANNELS * ( MCT_MAX_CHANNELS - 1 ) ) / 2]; + Word16 tmp_org[( MCT_MAX_CHANNELS * ( MCT_MAX_CHANNELS - 1 ) ) / 2]; + Word16 i, tmp_idx; + Word16 ch1, ch2; + + set32_fx( tmp_corrVals, 0, ( MCT_MAX_CHANNELS * ( MCT_MAX_CHANNELS - 1 ) ) / 2 ); + + /* first sort correlation matrix */ + i = 0; + move16(); + FOR( ch1 = 0; ch1 < nChannels; ch1++ ) + { + FOR( ch2 = ch1 + 1; ch2 < nChannels; ch2++ ) + { + IF( L_abs( xCorrMatrix[ch1][ch2] ) > 0 ) + { + assert( i < ( MCT_MAX_CHANNELS * ( MCT_MAX_CHANNELS - 1 ) ) / 2 ); + tmp_corrVals[i] = L_abs( xCorrMatrix[ch1][ch2] ); + move32(); + i = add( i, 1 ); + } + } + } + + tmp_idx = sub( shr( imult1616( nChannels, sub( nChannels, 1 ) ), 1 ), 1 ); + + /* sort values */ + v_sort_ind_fixed( tmp_corrVals, tmp_org, add( tmp_idx, 1 ) ); + + /* get max, or 2nd max and so on depending on sortInd value */ + *max_corr = tmp_corrVals[sub( tmp_idx, sortInd )]; + move32(); + + /*find channel pair for this max_corr*/ + FOR( ch1 = 0; ch1 < nChannels; ch1++ ) + { + FOR( ch2 = ch1 + 1; ch2 < nChannels; ch2++ ) + { + IF( EQ_32( L_abs( xCorrMatrix[ch1][ch2] ), *max_corr ) ) + { + *_ch1 = ch1; + *_ch2 = ch2; + *max_corr = xCorrMatrix[ch1][ch2]; /* assign to max_corr its actual value */ + move16(); + move16(); + move32(); + BREAK; + } + } + } + + return; +} +#endif /*-----------------------------------------------------------------------* @@ -153,7 +276,7 @@ static void getNextBestCorrelation( * calculates the cross correlation matrix for all active * channels *-----------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED static void getCorrelationMatrix( Encoder_State **sts, /* i : core coder handle */ MCT_ENC_HANDLE hMCT, /* i : MCT handle */ @@ -206,6 +329,125 @@ static void getCorrelationMatrix( return; } +#else +static void getCorrelationMatrix_fx( + Encoder_State **sts, /* i : core coder handle */ + MCT_ENC_HANDLE hMCT, /* i : MCT handle */ + Word32 xCorrMatrix[MCT_MAX_CHANNELS][MCT_MAX_CHANNELS], /* o : cross-correlation matrix, exponent: xCorrMatrix_e */ + Word16 *xCorrMatrix_e /* o : exponent of cross-correlation matrix */ +) +{ + Word16 ch1, ch2, n, nchan, res_q, s, max_e; + Word16 xCorrMatrix_exp[MCT_MAX_CHANNELS][MCT_MAX_CHANNELS]; + Word32 L_tmp; + Word64 W_tmp; + + nchan = hMCT->nchan_out_woLFE; + move16(); + + /* correlation */ + FOR( ch1 = 0; ch1 < nchan; ch1++ ) + { + FOR( ch2 = ch1; ch2 < nchan; ch2++ ) + { + xCorrMatrix[ch1][ch2] = 0; + move32(); + xCorrMatrix_exp[ch1][ch2] = 0; + move16(); + + test(); + test(); + IF( EQ_16( sts[ch1]->core, sts[ch2]->core ) && NE_32( sts[ch1]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) && + NE_32( sts[ch2]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) + { + Word16 nSubframes; + Word16 L_subframe; + IF( EQ_16( sts[ch1]->core, TCX_20 ) ) + { + nSubframes = 1; + move16(); + L_subframe = sts[ch1]->hTcxEnc->L_frameTCX; + move16(); + } + ELSE + { + nSubframes = NB_DIV; + move16(); + L_subframe = shr( sts[ch1]->hTcxEnc->L_frameTCX, 1 ); + } + + FOR( n = 0; n < nSubframes; n++ ) + { + res_q = sub( 31, sts[0]->hTcxEnc->spectrum_e[0] ); + L_tmp = dotp_fixed_32( sts[ch1]->hTcxEnc->spectrum_fx[n], sts[ch2]->hTcxEnc->spectrum_fx[n], L_subframe, 1 /*find_guarded_bits_fx( L_subframe )*/, &res_q ); + + xCorrMatrix[ch1][ch2] = BASOP_Util_Add_Mant32Exp( xCorrMatrix[ch1][ch2], xCorrMatrix_exp[ch1][ch2], L_tmp, sub( 31, res_q ), &xCorrMatrix_exp[ch1][ch2] ); + move32(); + } + } + } + } + + /* normalize */ + FOR( ch1 = 0; ch1 < nchan; ch1++ ) + { + FOR( ch2 = ch1 + 1; ch2 < nchan; ch2++ ) + { + // tmp = sqrtf( xCorrMatrix[ch1][ch1] * xCorrMatrix[ch2][ch2] ); + W_tmp = W_mult0_32_32( xCorrMatrix[ch1][ch1], xCorrMatrix[ch2][ch2] ); + s = W_norm( W_tmp ); + L_tmp = W_extract_h( W_shl( W_tmp, s ) ); + + s = sub( add( s, 30 ), add( xCorrMatrix_exp[ch1][ch1], xCorrMatrix_exp[ch2][ch2] ) ); // s = s + ( 31 - xCorrMatrix_exp[ch1][ch1] ) + ( 31 - xCorrMatrix_exp[ch2][ch2] ) - 32; + s = sub( 31, s ); + L_tmp = Sqrt32( L_tmp, &s ); + + IF( L_tmp > 0 ) + { + // xCorrMatrix[ch1][ch2] /= tmp; + xCorrMatrix[ch1][ch2] = L_deposit_h( BASOP_Util_Divide3232_Scale( xCorrMatrix[ch1][ch2], L_tmp, &res_q ) ); + xCorrMatrix_exp[ch1][ch2] = add( res_q, sub( xCorrMatrix_exp[ch1][ch2], s ) ); + move32(); + move16(); + } + ELSE + { + xCorrMatrix[ch1][ch2] = 0; + xCorrMatrix_exp[ch1][ch2] = 0; + move32(); + move16(); + } + } + } + + /* Aligning the variable exponents for each element to a common exponent */ + s = 31; + *xCorrMatrix_e = 0; + move16(); + move16(); + + FOR( ch1 = 0; ch1 < nchan - 1; ch1++ ) + { + s = s_min( s, getScaleFactor32( &xCorrMatrix[ch1][ch1 + 1], sub( nchan, add( ch1, 1 ) ) ) ); + maximum_s( &xCorrMatrix_exp[ch1][ch1 + 1], sub( nchan, add( ch1, 1 ) ), &max_e ); + *xCorrMatrix_e = s_max( *xCorrMatrix_e, max_e ); + move16(); + } + + FOR( ch1 = 0; ch1 < nchan; ch1++ ) + { + FOR( ch2 = ch1 + 1; ch2 < nchan; ch2++ ) + { + xCorrMatrix[ch1][ch2] = L_shl_sat( xCorrMatrix[ch1][ch2], add( s, sub( xCorrMatrix_exp[ch1][ch2], *xCorrMatrix_e ) ) ); + move32(); + } + } + *xCorrMatrix_e = sub( *xCorrMatrix_e, s ); + move16(); + + return; +} +#endif /*-----------------------------------------------------------------* @@ -213,7 +455,7 @@ static void getCorrelationMatrix( * * searches for the best correlated channel pair *------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED static void getBestCorrelation( MCT_ENC_HANDLE hMCT, /* i : MCT handle */ int16_t *_ch1, /* o : first channel of selected channel-pair */ @@ -243,13 +485,50 @@ static void getBestCorrelation( return; } +#else +static void getBestCorrelation_fx( + MCT_ENC_HANDLE hMCT, /* i : MCT handle */ + Word16 *_ch1, /* o : first channel of selected channel-pair, Q0 */ + Word16 *_ch2, /* o : second channel of selected channel-pair, Q0 */ + Word32 *max_corr, /* o : normalized cross correlation value of selected channel pair, Qx */ + Word32 xCorrMatrix[MCT_MAX_CHANNELS][MCT_MAX_CHANNELS] ) /* i : cross-correlation matrix, Qx */ +{ + Word16 ch1, ch2; + + *_ch1 = -1; + *_ch2 = -1; + *max_corr = 0; + move16(); + move16(); + move32(); + + FOR( ch1 = 0; ch1 < ( hMCT->nchan_out_woLFE ); ch1++ ) + { + FOR( ch2 = ch1 + 1; ch2 < ( hMCT->nchan_out_woLFE ); ch2++ ) + { + IF( LT_32( L_abs( *max_corr ), L_abs( xCorrMatrix[ch1][ch2] ) ) ) + { + *max_corr = xCorrMatrix[ch1][ch2]; + move32(); + + *_ch1 = ch1; + *_ch2 = ch2; + move16(); + move16(); + } + } + } + + return; +} +#endif /*----------------------------------------------------------------------* * getBlockValues() * stereo processing for the channels of current block *----------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED static void getBlockValues( Encoder_State **sts, /* i/o: core coder handle */ const int16_t ch1, /* i : first channel of channel-pair */ @@ -282,79 +561,65 @@ static void getBlockValues( p_st[0] = sts[ch1]; p_st[1] = sts[ch2]; -#ifndef IVAS_FLOAT_FIXED stereo_coder_tcx( hBlock->hStereoMdct, p_st, hBlock->mask, p_mdst_spectrum, p_inv_spectrum, p_inv_mdst_spectrum, 1 ); -#else -#if 1 - Word16 k; - Word32 *p_inv_spectrum_fx[2][2]; - Word16 q_spec = Q31; - Word16 length; - Word32 *p_inv_mdst_spectrum_fx[2][2]; - Word32 *p_mdst_spectrum_fx[2][2]; - FOR( Word16 ch = 0; ch < CPE_CHANNELS; ch++ ) - { - length = p_st[ch]->hTcxEnc->L_frameTCX / ( ( p_st[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); - IF( p_st[ch]->last_core == ACELP_CORE ) - { - length += length / 4; - } - FOR( k = 0; k <= ( ( p_st[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) - { - p_inv_spectrum_fx[ch][k] = (Word32 *) malloc( sizeof( Word32 ) * length ); - p_inv_mdst_spectrum_fx[ch][k] = (Word32 *) malloc( sizeof( Word32 ) * length ); - p_mdst_spectrum_fx[ch][k] = (Word32 *) malloc( sizeof( Word32 ) * length ); - q_spec = s_min( q_spec, Q_factor_arrL( p_st[ch]->hTcxEnc->spectrum[k], length ) - 1 ); - q_spec = s_min( q_spec, Q_factor_arrL( p_mdst_spectrum[ch][k], length ) - 1 ); - } - } - FOR( Word16 ch = 0; ch < CPE_CHANNELS; ch++ ) + if ( ( sts[ch1]->core == TCX_20_CORE && hBlock->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO ) || ( sts[ch1]->core == TCX_10_CORE && hBlock->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO && hBlock->hStereoMdct->mdct_stereo_mode[1] == SMDCT_DUAL_MONO ) ) { - length = p_st[ch]->hTcxEnc->L_frameTCX / ( ( p_st[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); - IF( p_st[ch]->last_core == ACELP_CORE ) - { - length += length / 4; - } - FOR( k = 0; k <= ( ( p_st[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) - { - floatToFixed_arrL32( p_st[ch]->hTcxEnc->spectrum[k], p_st[ch]->hTcxEnc->spectrum_fx[k], q_spec, length ); - p_st[ch]->hTcxEnc->spectrum_e[k] = sub( Q31, q_spec ); - floatToFixed_arrL32( p_mdst_spectrum[ch][k], p_mdst_spectrum_fx[ch][k], q_spec, length ); - } + hBlock->isActive = 0; } -#endif - stereo_coder_tcx_fx( hBlock->hStereoMdct, p_st, hBlock->mask, p_mdst_spectrum_fx, p_inv_spectrum_fx, p_inv_mdst_spectrum_fx, 1, q_spec ); -#if 1 - FOR( Word16 ch = 0; ch < CPE_CHANNELS; ch++ ) + return; +} +#else +static void getBlockValues_fx( + Encoder_State **sts, /* i/o: core coder handle */ + const Word16 ch1, /* i : first channel of channel-pair */ + const Word16 ch2, /* i : second channel of channel-pair */ + MCT_BLOCK_DATA *hBlock, /* i : stereo block handle */ + Word32 *mdst_spectrum[MCT_MAX_CHANNELS][2], /* i/o: MDST spectrum, Q = q_spec */ + Word32 *inv_spectrum[MCT_MAX_CHANNELS][2], /* i/o: inverse spectrum, Q = q_spec */ + Word32 *inv_mdst_spectrum[MCT_MAX_CHANNELS][2], /* i/o: invers MDST spectrum, Q = q_spec */ + Word16 q_spec /* i : common Q factor of the above spectrum buffers */ +) +{ + Word16 n; + Word32 *p_mdst_spectrum[2][2]; + Word32 *p_inv_spectrum[2][2]; + Word32 *p_inv_mdst_spectrum[2][2]; + Encoder_State *p_st[2]; + + /* init return values: */ + hBlock->isActive = 1; + move16(); + + /* map vectors to current block channels */ + FOR( n = 0; n < 2; n++ ) { - length = p_st[ch]->hTcxEnc->L_frameTCX / ( ( p_st[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); - IF( p_st[ch]->last_core == ACELP_CORE ) - { - length += length / 4; - } - FOR( k = 0; k <= ( ( p_st[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) - { - fixedToFloat_arrL32( p_st[ch]->hTcxEnc->spectrum_fx[k], p_st[ch]->hTcxEnc->spectrum[k], q_spec, length ); - fixedToFloat_arrL32( p_inv_spectrum_fx[ch][k], p_inv_spectrum[ch][k], q_spec, length ); - fixedToFloat_arrL32( p_inv_mdst_spectrum_fx[ch][k], p_inv_mdst_spectrum[ch][k], q_spec, length ); - fixedToFloat_arrL32( p_mdst_spectrum_fx[ch][k], p_mdst_spectrum[ch][k], q_spec, length ); - free( p_inv_spectrum_fx[ch][k] ); - free( p_inv_mdst_spectrum_fx[ch][k] ); - free( p_mdst_spectrum_fx[ch][k] ); - } + p_mdst_spectrum[0][n] = mdst_spectrum[ch1][n]; + p_mdst_spectrum[1][n] = mdst_spectrum[ch2][n]; + p_inv_spectrum[0][n] = inv_spectrum[ch1][n]; + p_inv_spectrum[1][n] = inv_spectrum[ch2][n]; + p_inv_mdst_spectrum[0][n] = inv_mdst_spectrum[ch1][n]; + p_inv_mdst_spectrum[1][n] = inv_mdst_spectrum[ch2][n]; } -#endif -#endif + p_st[0] = sts[ch1]; + p_st[1] = sts[ch2]; - if ( ( sts[ch1]->core == TCX_20_CORE && hBlock->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO ) || ( sts[ch1]->core == TCX_10_CORE && hBlock->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO && hBlock->hStereoMdct->mdct_stereo_mode[1] == SMDCT_DUAL_MONO ) ) + stereo_coder_tcx_fx( hBlock->hStereoMdct, p_st, hBlock->mask, p_mdst_spectrum, p_inv_spectrum, p_inv_mdst_spectrum, 1, q_spec ); + + test(); + test(); + test(); + test(); + if ( ( EQ_16( sts[ch1]->core, TCX_20_CORE ) && hBlock->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO ) || ( EQ_16( sts[ch1]->core, TCX_10_CORE ) && hBlock->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO && hBlock->hStereoMdct->mdct_stereo_mode[1] == SMDCT_DUAL_MONO ) ) { hBlock->isActive = 0; + move16(); } return; } +#endif /*-------------------------------------------------------------------* @@ -363,7 +628,7 @@ static void getBlockValues( * updates the cross correlation matrix with modified spectra after * stereo block processing *-------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED static void updateCorrelationMatrix( Encoder_State **sts, MCT_ENC_HANDLE hMCT, @@ -396,13 +661,64 @@ static void updateCorrelationMatrix( return; } +#else +static void updateCorrelationMatrix_fx( + Encoder_State **sts, + MCT_ENC_HANDLE hMCT, + const Word16 _ch1, + const Word16 _ch2, + Word32 xCorrMatrix[MCT_MAX_CHANNELS][MCT_MAX_CHANNELS] // Qx +) +{ + Word16 ch1, ch2, n; + + /* correlation: */ + FOR( ch1 = 0; ch1 < ( hMCT->nchan_out_woLFE ); ch1++ ) + { + FOR( ch2 = ch1; ch2 < ( hMCT->nchan_out_woLFE ); ch2++ ) + { + test(); + test(); + IF( EQ_16( sts[ch1]->core, sts[ch2]->core ) && NE_32( sts[ch1]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) && + NE_32( sts[ch2]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) + { + Word16 nSubframes; + IF( EQ_16( sts[ch1]->core, TCX_20 ) ) + { + nSubframes = 1; + move16(); + } + ELSE + { + nSubframes = NB_DIV; + move16(); + } + + test(); + test(); + test(); + IF( EQ_16( ch1, _ch1 ) || EQ_16( ch2, _ch2 ) || EQ_16( ch1, _ch2 ) || EQ_16( ch2, _ch1 ) ) + { + FOR( n = 0; n < nSubframes; n++ ) + { + xCorrMatrix[ch1][ch2] = 0; /*disable combinations with channels already processed */ + move32(); + } + } + } + } + } + + return; +} +#endif /*----------------------------------------------------------* * channelPairToIndex() * get the index of each channel pair *----------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED static int16_t channelPairToIndex( const int16_t chIdx1, const int16_t chIdx2, @@ -430,13 +746,43 @@ static int16_t channelPairToIndex( return -1; } +#else +static Word16 channelPairToIndex_fx( + const Word16 chIdx1, + const Word16 chIdx2, + const Word16 nChannels ) +{ + Word16 ch1, ch2; + Word16 pairIdx; + + pairIdx = 0; + move16(); + + FOR( ch2 = 1; ch2 < nChannels; ch2++ ) + { + FOR( ch1 = 0; ch1 < ch2; ch1++ ) + { + test(); + IF( EQ_16( ch1, chIdx1 ) && EQ_16( ch2, chIdx2 ) ) + { + return pairIdx; + } + ELSE + { + pairIdx = add( pairIdx, 1 ); + } + } + } + return -1; +} +#endif /*--------------------------------------------------------------------* * getGlobalILD() * get broadband ILD to mean energy and normalize channels with ratio *--------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED static void getGlobalILD( Encoder_State **sts, MCT_ENC_HANDLE hMCT, @@ -498,30 +844,147 @@ static void getGlobalILD( return; } +#else +static void getGlobalILD_fx( + Encoder_State **sts, + MCT_ENC_HANDLE hMCT, + Word32 *mdst_spectrum[MCT_MAX_CHANNELS][2], // Exponent is same as spectrum_fx i.e. spectrum_e + const Word16 nchan ) +{ + Word16 k, ch, nSubframes, L_subframe; + Word32 nrg[MCT_MAX_CHANNELS]; + Word16 nrg_e[MCT_MAX_CHANNELS]; + Word16 ratio_fx, qratio; + Word32 meanE = 0; + Word32 L_tmp; + Word16 cnt = 0, meanE_e = 0, L_tmp_e; + move32(); + move16(); + move16(); + /*Initializations*/ + set16_fx( hMCT->lowE_ch, 0, nchan ); -/*--------------------------------------------------------------------* - * apply_MCT_enc() - * - * apply MCT algorithm to input channels - *--------------------------------------------------------------------*/ + getChannelEnergies_fx( sts, nrg, nrg_e, nchan ); -void apply_MCT_enc( - MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ - Encoder_State **sts, /* i/o: encoder state structure */ - float *mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: MDST spectrum */ - float *inv_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse spectrum */ - float *inv_mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ - const int16_t nchan /* i : number of channels */ -) -{ - int16_t ch, k, ch1, ch2, nSubframes, L_subframeTCX; - float max_corr, qratio; - int16_t forceKeepTree, pair; - float sumCorrDiff, thr; - float xCorrMatrix[MCT_MAX_CHANNELS][MCT_MAX_CHANNELS]; - int16_t currBlockDataCnt; - int16_t cpEle[MCT_MAX_CHANNELS]; + /*calculate total energy without LFE*/ + FOR( ch = 0; ch < nchan; ch++ ) + { + IF( NE_32( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) + { + meanE = BASOP_Util_Add_Mant32Exp( meanE, meanE_e, nrg[ch], nrg_e[ch], &meanE_e ); + cnt = add( cnt, 1 ); + } + } + + /*calculate mean energy*/ + assert( cnt >= 2 ); + L_tmp = BASOP_Util_Divide3216_Scale( meanE, cnt, &L_tmp_e ); + L_tmp_e = add( L_tmp_e, sub( meanE_e, 15 ) ); + + // meanE = max( meanE / cnt, EPSILON ); + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( L_tmp, L_tmp_e, EPSILON_FX_M, EPSILON_FX_E ), 1 ) ) + { + meanE = L_deposit_h( (Word16) L_tmp ); + meanE_e = L_tmp_e; + move32(); + move16(); + } + ELSE + { + meanE = EPSILON_FX_M; + meanE_e = EPSILON_FX_E; + move32(); + move16(); + } + + FOR( ch = 0; ch < nchan; ch++ ) + { + IF( NE_32( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) + { + IF( EQ_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) + { + nSubframes = 1; + move16(); + L_subframe = sts[ch]->hTcxEnc->L_frameTCX; + move16(); + } + ELSE + { + nSubframes = NB_DIV; + move16(); + L_subframe = shr( sts[ch]->hTcxEnc->L_frameTCX, 1 ); + } + + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( nrg[ch], nrg_e[ch], meanE, meanE_e ), 1 ) ) /*change it to meanE if final solution*/ + { + // ratio_fx = meanE / nrg[ch]; + ratio_fx = BASOP_Util_Divide3232_Scale( meanE, nrg[ch], &L_tmp_e ); + L_tmp_e = add( L_tmp_e, sub( meanE_e, nrg_e[ch] ) ); + ratio_fx = shl_sat( ratio_fx, L_tmp_e ); + + hMCT->mc_global_ild[ch] = s_max( 1, s_min( SMDCT_ILD_RANGE - 1, mult_r( SMDCT_ILD_RANGE, ratio_fx ) ) ); + move16(); + + qratio = div_l( L_shl( hMCT->mc_global_ild[ch], 11 ), SMDCT_ILD_RANGE / 2 ); // Q11 + } + ELSE + { + // ratio_fx = nrg[ch] / meanE; + ratio_fx = BASOP_Util_Divide3232_Scale( nrg[ch], meanE, &L_tmp_e ); + L_tmp_e = add( L_tmp_e, sub( nrg_e[ch], meanE_e ) ); + ratio_fx = shl_sat( ratio_fx, L_tmp_e ); + + hMCT->lowE_ch[ch] = 1; + move16(); + + hMCT->mc_global_ild[ch] = s_max( 1, s_min( SMDCT_ILD_RANGE - 1, mult_r( SMDCT_ILD_RANGE, ratio_fx ) ) ); + move16(); + + qratio = shl_sat( div_l( ( (Word32) SMDCT_ILD_RANGE << 11 ), hMCT->mc_global_ild[ch] ), 1 ); // Q11 + } + + FOR( k = 0; k < nSubframes; k++ ) + { + sts[ch]->hTcxEnc->spectrum_e[k] = add( sts[ch]->hTcxEnc->spectrum_e[k], 4 ); // Updating exponent of spectrum as q_ratio is in Q11 + } + + FOR( k = 0; k < nSubframes; k++ ) + { + v_multc_fixed( sts[ch]->hTcxEnc->spectrum_fx[k], L_deposit_h( qratio ), sts[ch]->hTcxEnc->spectrum_fx[k], L_subframe ); + v_multc_fixed( mdst_spectrum[ch][k], L_deposit_h( qratio ), mdst_spectrum[ch][k], L_subframe ); + } + } + } + + + return; +} +#endif + + +/*--------------------------------------------------------------------* + * apply_MCT_enc() + * + * apply MCT algorithm to input channels + *--------------------------------------------------------------------*/ +#ifndef IVAS_FLOAT_FIXED +void apply_MCT_enc( + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ + float *mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: MDST spectrum */ + float *inv_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse spectrum */ + float *inv_mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ + const int16_t nchan /* i : number of channels */ +) +{ + int16_t ch, k, ch1, ch2, nSubframes, L_subframeTCX; + float max_corr, qratio; + int16_t forceKeepTree, pair; + float sumCorrDiff, thr; + float xCorrMatrix[MCT_MAX_CHANNELS][MCT_MAX_CHANNELS]; + int16_t currBlockDataCnt; + int16_t cpEle[MCT_MAX_CHANNELS]; int16_t inactiveBlockDetected; int16_t tmp_ch1, tmp_ch2; float tmp_max_corr; @@ -722,14 +1185,291 @@ void apply_MCT_enc( return; } +#else +void apply_MCT_enc_fx( + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ + Word32 *mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: MDST spectrum */ + Word32 *inv_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse spectrum */ + Word32 *inv_mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ + const Word16 nchan /* i : number of channels */ +) +{ + Word16 ch, k, ch1, ch2, nSubframes, L_subframeTCX; + Word32 max_corr; + Word16 forceKeepTree, pair, qratio; + Word32 sumCorrDiff, thr; + Word32 xCorrMatrix[MCT_MAX_CHANNELS][MCT_MAX_CHANNELS]; + Word16 currBlockDataCnt; + Word16 cpEle[MCT_MAX_CHANNELS]; + Word16 inactiveBlockDetected; + Word16 tmp_ch1, tmp_ch2, tmp; + Word32 tmp_max_corr, L_tmp; + Word16 count_active_ch = 0; + Word16 xCorrMatrix_e = 0, sumCorrDiff_e = 0, L_tmp_e; + move16(); + move16(); + move16(); + + push_wmops( "mct_core_enc_mct" ); + + forceKeepTree = 1; + inactiveBlockDetected = 0; + move16(); + move16(); + set16_fx( cpEle, 0, MCT_MAX_CHANNELS ); + /*Determine active channels*/ + FOR( ch = 0; ch < nchan; ch++ ) + { + IF( NE_32( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) + { + count_active_ch = add( count_active_ch, 1 ); + } + ELSE + { + hMCT->mc_global_ild[ch] = 0; + move16(); + } + } + + /*there should be at least one cp*/ + IF( GE_16( count_active_ch, CPE_CHANNELS ) ) + { + /*Normalize energies with global ILD*/ + getGlobalILD_fx( sts, hMCT, mdst_spectrum, nchan ); + getCorrelationMatrix_fx( sts, hMCT, xCorrMatrix, &xCorrMatrix_e ); + + /*check if previous tree should be kept*/ + sumCorrDiff = 0; + move32(); + // thr = 0.15f * (float) ( count_active_ch ) * ( count_active_ch - 1 ) / 2.0f; + thr = Mpy_32_16_1( 161061274, imult1616( count_active_ch, sub( count_active_ch, 1 ) ) ); /* Q16 */ /* 161061274 = 0.15 / 2 in Q31 */ + + FOR( ch2 = 1; ch2 < nchan; ch2++ ) + { + FOR( ch1 = 0; ch1 < ch2; ch1++ ) + { + test(); + IF( NE_32( sts[ch1]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) && + NE_32( sts[ch2]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) + { + L_tmp = L_abs( BASOP_Util_Add_Mant32Exp( hMCT->lastxCorrMatrix_fx[ch1][ch2], hMCT->lastxCorrMatrix_e, L_negate( xCorrMatrix[ch1][ch2] ), xCorrMatrix_e, &L_tmp_e ) ); + sumCorrDiff = BASOP_Util_Add_Mant32Exp( sumCorrDiff, sumCorrDiff_e, L_tmp, L_tmp_e, &sumCorrDiff_e ); + } + } + } + + if ( EQ_16( BASOP_Util_Cmp_Mant32Exp( sumCorrDiff, sumCorrDiff_e, thr, 15 ), 1 ) ) + { + forceKeepTree = 0; + move16(); + } + + /* check if keepTree is applied on unallowed blocks (e.g. channel pairs with different cores) */ + IF( forceKeepTree ) + { + IF( !hMCT->currBlockDataCnt ) + { + forceKeepTree = 0; + move16(); + } + ELSE + { + FOR( pair = 0; pair < hMCT->currBlockDataCnt; pair++ ) + { + if ( xCorrMatrix[hMCT->hBlockData[pair]->ch1][hMCT->hBlockData[pair]->ch2] == 0 ) + { + forceKeepTree = 0; + move16(); + } + } + } + } + + /*save initial correlation matrix for next frame*/ + FOR( ch1 = 0; ch1 < nchan; ch1++ ) + { + FOR( ch2 = ch1; ch2 < nchan; ch2++ ) + { + hMCT->lastxCorrMatrix_fx[ch1][ch2] = xCorrMatrix[ch1][ch2]; + move32(); + } + } + hMCT->lastxCorrMatrix_e = xCorrMatrix_e; + move16(); + move16(); + currBlockDataCnt = 0; + WHILE( LT_16( currBlockDataCnt, hMCT->nchan_out_woLFE ) ) + { + /* find best fitting channel pair: */ + ch1 = -1; + ch2 = -1; + max_corr = 0; + move16(); + move16(); + move32(); + + IF( !forceKeepTree ) + { + getNextBestCorrelation_fx( xCorrMatrix, &ch1, &ch2, &max_corr, inactiveBlockDetected, nchan ); + } + ELSE + { + getBestCorrelation_fx( hMCT, &tmp_ch1, &tmp_ch2, &tmp_max_corr, xCorrMatrix ); + + IF( EQ_16( currBlockDataCnt, hMCT->currBlockDataCnt ) ) + { + BREAK; + } + ELSE + { + ch1 = hMCT->hBlockData[currBlockDataCnt]->ch1; + ch2 = hMCT->hBlockData[currBlockDataCnt]->ch2; + move16(); + move16(); + + /*don't allow forcing of channel-pair if their correlation is under the threshold*/ + max_corr = xCorrMatrix[ch1][ch2]; + move32(); + + tmp = BASOP_Util_Cmp_Mant32Exp( L_abs( max_corr ), xCorrMatrix_e, DEFAULT_CORR_THRES_Q31 /* 0.3 in Q31 */, 0 ); + test(); + IF( EQ_16( tmp, -1 ) || tmp == 0 ) + { + ch1 = tmp_ch1; + ch2 = tmp_ch2; + max_corr = tmp_max_corr; + forceKeepTree = 0; + move16(); + move16(); + move32(); + move16(); + } + } + } + + test(); + test(); + test(); + IF( ( EQ_16( BASOP_Util_Cmp_Mant32Exp( L_abs( max_corr ), xCorrMatrix_e, DEFAULT_CORR_THRES_Q31, 0 ), 1 ) && !hMCT->hbr_mct ) || ( EQ_16( BASOP_Util_Cmp_Mant32Exp( L_abs( max_corr ), xCorrMatrix_e, SPAR_CORR_THRES_Q31, 0 ), 1 ) && hMCT->hbr_mct ) ) + { + IF( !forceKeepTree ) + { + /*save channel pair*/ + hMCT->hBlockData[currBlockDataCnt]->ch1 = ch1; + hMCT->hBlockData[currBlockDataCnt]->ch2 = ch2; + move16(); + move16(); + } + + /* calculate all related values: */ + assert( sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ); + + getBlockValues_fx( sts, ch1, ch2, hMCT->hBlockData[currBlockDataCnt], mdst_spectrum, inv_spectrum, inv_mdst_spectrum, sub( 31, sts[0]->hTcxEnc->spectrum_e[0] ) ); + + IF( hMCT->hBlockData[currBlockDataCnt]->isActive == 0 ) + { + inactiveBlockDetected = add( inactiveBlockDetected, 1 ); + IF( GT_16( inactiveBlockDetected, shr( hMCT->nchan_out_woLFE, 1 ) ) ) + { + BREAK; + } + forceKeepTree = 0; + move16(); + + CONTINUE; /* skip inactive blocks where stereo mode is dual-mono */ + } + + updateCorrelationMatrix_fx( sts, hMCT, ch1, ch2, xCorrMatrix ); + cpEle[ch1] = 1; + cpEle[ch2] = 1; + move16(); + move16(); + + currBlockDataCnt = add( currBlockDataCnt, 1 ); + } + ELSE + { + BREAK; + } + } + + /*save number of blocks for next frame*/ + hMCT->currBlockDataCnt = currBlockDataCnt; + move16(); + + FOR( ch = 0; ch < nchan; ch++ ) + { + IF( NE_32( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) + { + test(); + IF( ( !cpEle[ch] ) || hMCT->currBlockDataCnt == 0 ) + { + IF( EQ_16( sts[ch]->core, TCX_20_CORE ) ) + { + nSubframes = 1; + move16(); + L_subframeTCX = sts[ch]->hTcxEnc->L_frameTCX; + move16(); + } + ELSE + { + nSubframes = NB_DIV; + move16(); + L_subframeTCX = shr( sts[ch]->hTcxEnc->L_frameTCX, 1 ); + } + + IF( hMCT->lowE_ch[ch] ) + { + // qratio = (float) hMCT->mc_global_ild[ch] / SMDCT_ILD_RANGE; + qratio = div_l( L_shl( hMCT->mc_global_ild[ch], 11 ), SMDCT_ILD_RANGE / 2 ); // Q11 + } + ELSE + { + // qratio = (float) SMDCT_ILD_RANGE / hMCT->mc_global_ild[ch]; + qratio = shl_sat( div_l( ( (Word32) SMDCT_ILD_RANGE << 11 ), hMCT->mc_global_ild[ch] ), 1 ); // Q11 + } + + FOR( k = 0; k < nSubframes; k++ ) + { + v_multc_fixed( sts[ch]->hTcxEnc->spectrum_fx[k], L_deposit_h( qratio ), sts[ch]->hTcxEnc->spectrum_fx[k], L_subframeTCX ); + v_multc_fixed( mdst_spectrum[ch][k], L_deposit_h( qratio ), mdst_spectrum[ch][k], L_subframeTCX ); + set32_fx( inv_spectrum[ch][k], 0, L_subframeTCX ); + } + sts[ch]->hTcxEnc->spectrum_e[1] = add( sts[ch]->hTcxEnc->spectrum_e[0], 4 ); + sts[ch]->hTcxEnc->spectrum_e[0] = add( sts[ch]->hTcxEnc->spectrum_e[0], 4 ); + hMCT->mc_global_ild[ch] = 0; + move16(); + move16(); + move16(); + } + } + } + } + ELSE + { + hMCT->currBlockDataCnt = 0; + move16(); + FOR( ch = 0; ch < nchan; ch++ ) + { + hMCT->mc_global_ild[ch] = 0; + move16(); + } + } + + pop_wmops(); + + return; +} +#endif /*--------------------------------------------------------------------* * write_mct_bitstream() * * write mct metadata to bitstream *--------------------------------------------------------------------*/ - +#ifndef IVAS_FLOAT_FIXED void write_mct_bitstream( Encoder_State **sts, /* i/o: encoder state structure */ MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ @@ -781,10 +1521,6 @@ void write_mct_bitstream( p_st[1] = sts[hBlock->ch2]; /*then business as usual for each block pair */ -#ifdef IVAS_FLOAT_FIXED - IF( hMCT->hBlockData[pair]->hStereoMdct->hItd ) - hMCT->hBlockData[pair]->hStereoMdct->hItd->itd_fx[1] = float_to_fix( hMCT->hBlockData[pair]->hStereoMdct->hItd->itd[1], Q23 ); -#endif write_stereo_to_bitstream( hMCT->hBlockData[pair]->hStereoMdct, p_st, hBlock->mask, 1, hBstr ); } @@ -792,14 +1528,214 @@ void write_mct_bitstream( return; } +#else +void write_mct_bitstream_fx( + Encoder_State **sts, /* i/o: encoder state structure */ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + const Word16 nchan /* i : number of channels */ +) +{ + Word16 pair, ch; + Word16 channelPairIndex; + Word16 nbits_start; + MCT_BLOCK_DATA_HANDLE hBlock; + Encoder_State *p_st[2]; + BSTR_ENC_HANDLE hBstr = sts[0]->hBstr; + + nbits_start = hBstr->nb_bits_tot; + move16(); + + push_next_indice( hBstr, hMCT->currBlockDataCnt, MCT_NUM_BLOCK_DATA_BITS ); + + /* first write core info and overlap mode for all channels */ + FOR( ch = 0; ch < nchan; ch++ ) + { + test(); + IF( hMCT->currBlockDataCnt && NE_32( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) + { + push_next_indice( hBstr, hMCT->mc_global_ild[ch], SMDCT_GLOBAL_ILD_BITS ); + } + } + + IF( hMCT->currBlockDataCnt ) + { + FOR( ch = 0; ch < nchan; ch++ ) + { + IF( NE_32( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) + { + push_next_indice( hBstr, hMCT->lowE_ch[ch], 1 ); + } + } + } + + /* Do for each stereo block */ + FOR( pair = hMCT->currBlockDataCnt - 1; pair >= 0; pair-- ) + { + hBlock = hMCT->hBlockData[pair]; + + /*calculate channel pair index and write it to BS*/ + channelPairIndex = channelPairToIndex_fx( hBlock->ch1, hBlock->ch2, nchan ); + push_next_indice( hBstr, channelPairIndex, hMCT->bitsChannelPairIndex ); + + /*point to encoder states of actual channels to write block pair bits*/ + p_st[0] = sts[hBlock->ch1]; + p_st[1] = sts[hBlock->ch2]; + + /*then business as usual for each block pair */ + write_stereo_to_bitstream( hMCT->hBlockData[pair]->hStereoMdct, p_st, hBlock->mask, 1, hBstr ); + } + + hMCT->nBitsMCT = sub( hBstr->nb_bits_tot, nbits_start ); + move16(); + return; +} +#endif /*--------------------------------------------------------------------* * mctStereoIGF_enc() * * IGF analysis of channels after MCT processing *--------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void mctStereoIGF_enc_fx( + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ +#ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED + Word32 *orig_spectrum_fx[MCT_MAX_CHANNELS][2], /* i : MDCT spectrum for ITF */ + Word32 powerSpec_fx[MCT_MAX_CHANNELS][L_FRAME48k], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate*/ + Word32 *powerSpecMsInv_fx[MCT_MAX_CHANNELS][NB_DIV], /* i : same as above but for inverse spect.*/ + Word32 *inv_spectrum_fx[MCT_MAX_CHANNELS][NB_DIV], /* i : inverse spectrum */ +#endif // IVAS_FLOAT_FIXED + float *orig_spectrum[MCT_MAX_CHANNELS][2], /* i : MDCT spectrum for ITF */ + float powerSpec[MCT_MAX_CHANNELS][L_FRAME48k], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate*/ + float *powerSpecMsInv[MCT_MAX_CHANNELS][NB_DIV], /* i : same as above but for inverse spect.*/ + float *inv_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i : inverse spectrum */ + const Word16 sp_aud_decision0[MCT_MAX_CHANNELS] /* i : speech audio decision */ +) +{ +#ifdef IVAS_FLOAT_FIXED + Word32 *p_powerSpecMsInv_fx[CPE_CHANNELS][NB_DIV]; + Word32 *p_inv_spectrum_fx[CPE_CHANNELS][NB_DIV]; + Word32 *p_orig_spectrum_fx[CPE_CHANNELS][NB_DIV]; + Word32 *p_powerSpec_fx[NB_DIV]; +#endif // IVAS_FLOAT_FIXED + + UNUSED_PARAM( powerSpec_fx ); + int16_t b, nSubframes, L_subframeTCX; + int16_t p_ch[2], n, ch, ch1, ch2; + Encoder_State *p_st[NB_DIV]; + Encoder_State *st; + float *p_powerSpecMsInv[CPE_CHANNELS][NB_DIV]; + float *p_inv_spectrum[CPE_CHANNELS][NB_DIV]; + float *p_orig_spectrum[CPE_CHANNELS][NB_DIV]; + float *p_powerSpec[NB_DIV]; + int16_t singleChEle[MCT_MAX_CHANNELS]; + + L_subframeTCX = 0; /* to avoid compilation warning */ + set_s( singleChEle, 1, hMCT->nchan_out_woLFE ); + for ( b = 0; b < hMCT->currBlockDataCnt; b++ ) + { + ch1 = hMCT->hBlockData[b]->ch1; + ch2 = hMCT->hBlockData[b]->ch2; + + p_ch[0] = ch1; + p_ch[1] = ch2; + + singleChEle[hMCT->hBlockData[b]->ch1] = 0; + singleChEle[hMCT->hBlockData[b]->ch2] = 0; + + /* point to encoder states of actual channels to write block pair bits */ + p_st[0] = sts[ch1]; + p_st[1] = sts[ch2]; + + if ( ch1 > 0 ) + { + sts[ch1]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } + + if ( ch2 > 0 ) + { + sts[ch2]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } + +#if 1 + p_powerSpec_fx[0] = powerSpec_fx[ch1]; + p_powerSpec_fx[1] = powerSpec_fx[ch2]; +#endif + p_powerSpec[0] = powerSpec[ch1]; + p_powerSpec[1] = powerSpec[ch2]; + + /* Band-wise M/S for MDST */ + nSubframes = p_st[0]->hTcxEnc->tcxMode == TCX_20 ? 1 : NB_DIV; + for ( n = 0; n < nSubframes; n++ ) + { +#if 1 + p_orig_spectrum[0][n] = orig_spectrum[ch1][n]; + p_orig_spectrum[1][n] = orig_spectrum[ch2][n]; + p_powerSpecMsInv[0][n] = powerSpecMsInv[ch1][n]; + p_powerSpecMsInv[1][n] = powerSpecMsInv[ch2][n]; + p_inv_spectrum[0][n] = inv_spectrum[ch1][n]; + p_inv_spectrum[1][n] = inv_spectrum[ch2][n]; +#endif + p_orig_spectrum_fx[0][n] = orig_spectrum_fx[ch1][n]; + p_orig_spectrum_fx[1][n] = orig_spectrum_fx[ch2][n]; + p_powerSpecMsInv_fx[0][n] = powerSpecMsInv_fx[ch1][n]; + p_powerSpecMsInv_fx[1][n] = powerSpecMsInv_fx[ch2][n]; + p_inv_spectrum_fx[0][n] = inv_spectrum_fx[ch1][n]; + p_inv_spectrum_fx[1][n] = inv_spectrum_fx[ch2][n]; + if ( hMCT->hBlockData[b]->hStereoMdct->mdct_stereo_mode[n] != hMCT->hBlockData[b]->hStereoMdct->IGFStereoMode[n] || + hMCT->hBlockData[b]->hStereoMdct->mdct_stereo_mode[n] == SMDCT_BW_MS ) + { + ProcessStereoIGF_fx( hMCT->hBlockData[b]->hStereoMdct, p_st, hMCT->hBlockData[b]->mask, p_orig_spectrum_fx, p_powerSpec_fx, p_powerSpecMsInv_fx, p_inv_spectrum_fx, p_orig_spectrum, p_powerSpec, p_powerSpecMsInv, p_inv_spectrum, n, sp_aud_decision0[ch1], p_st[0]->total_brate, 1 ); + } + else + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = p_st[ch]; + + L_subframeTCX = st->hTcxEnc->L_frameTCX / nSubframes; + + ProcessIGF( st, st->hTcxEnc->spectrum[n], (float *) orig_spectrum[p_ch[ch]][n], &powerSpec[p_ch[ch]][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch1], 0 ); + } + } + } + } + + /* channel elements that are coded separately detected */ + if ( sum_s( singleChEle, ( hMCT->nchan_out_woLFE ) ) != 0 ) + { + for ( ch = 0; ch < ( hMCT->nchan_out_woLFE ); ch++ ) + { + if ( singleChEle[ch] ) + { + st = sts[ch]; + + if ( + st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + + if ( ch > 0 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } + + nSubframes = st->hTcxEnc->tcxMode == TCX_20 ? 1 : NB_DIV; + for ( n = 0; n < nSubframes; n++ ) + { + ProcessIGF( st, st->hTcxEnc->spectrum[n], (float *) orig_spectrum[ch][n], &powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); + } + } + } + } + + return; +} +#endif void mctStereoIGF_enc( MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ Encoder_State **sts, /* i/o: encoder state structure */ diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index c778a3071..668dc5a26 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -1278,12 +1278,20 @@ typedef struct mct_enc_data_structure MCT_BLOCK_DATA_HANDLE hBlockData[MCT_MAX_BLOCKS]; float lastxCorrMatrix[MCT_MAX_CHANNELS][MCT_MAX_CHANNELS]; +#ifdef IVAS_FLOAT_FIXED + Word32 lastxCorrMatrix_fx[MCT_MAX_CHANNELS][MCT_MAX_CHANNELS]; + Word16 lastxCorrMatrix_e; +#endif int16_t lowE_ch[MCT_MAX_CHANNELS]; uint16_t mc_global_ild[MCT_MAX_CHANNELS]; int16_t nBitsMCT; /* number of bits spent on mct side info */ /* pointers to local buffers */ float *p_mdst_spectrum_long[MCT_MAX_BLOCKS][CPE_CHANNELS]; float *p_orig_spectrum_long[MCT_MAX_BLOCKS][CPE_CHANNELS]; +#ifdef IVAS_FLOAT_FIXED + Word32 *p_mdst_spectrum_long_fx[MCT_MAX_BLOCKS][CPE_CHANNELS]; + Word32 *p_orig_spectrum_long_fx[MCT_MAX_BLOCKS][CPE_CHANNELS]; +#endif int16_t tnsBits[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; /* number of tns bits in the frame */ int16_t tnsSize[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; /* number of tns parameters put into prm */ int16_t p_param[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV]; diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index 86715a6ce..93630057c 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -122,6 +122,18 @@ void stereo_mdct_core_enc( float pitch_buf[CPE_CHANNELS][NB_SUBFR16k] /* o : floating pitch for each subframe */ ) { +#ifdef IVAS_FLOAT_FIXED + Word32 *p_orig_spectrum_long_fx[CPE_CHANNELS], orig_spectrum_long_fx[CPE_CHANNELS][N_MAX]; /* MDCT output (L/R). */ + Word32 *orig_spectrum_fx[CPE_CHANNELS][NB_DIV]; /* Pointers to MDCT output for a short block (L/R) */ + Word32 powerSpec_fx[CPE_CHANNELS][N_MAX]; + Word32 *p_powerSpec_fx[CPE_CHANNELS]; + Word32 powerSpecMsInv_long_fx[CPE_CHANNELS][N_MAX]; /* MS inv power spectrum, also inverse MDST spectrum */ + Word32 *powerSpecMsInv_fx[CPE_CHANNELS][NB_DIV]; + Word32 quantized_spectrum_long_fx[CPE_CHANNELS][N_MAX]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ + Word32 *quantized_spectrum_fx[CPE_CHANNELS][NB_DIV]; + Word32 *inv_mdst_spectrum_fx[CPE_CHANNELS][NB_DIV]; + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV]; +#endif int16_t i, ch, nSubframes, L_subframeTCX; int16_t n, nAvailBits; int16_t tnsSize[CPE_CHANNELS][NB_DIV]; /* number of tns parameters put into prm */ @@ -156,6 +168,10 @@ void stereo_mdct_core_enc( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { +#ifdef IVAS_FLOAT_FIXED + p_orig_spectrum_long_fx[ch] = orig_spectrum_long_fx[ch]; + UNUSED_PARAM( p_orig_spectrum_long_fx ); +#endif // IVAS_FLOAT_FIXED p_mdst_spectrum_long[ch] = mdst_spectrum_long[ch]; p_orig_spectrum_long[ch] = orig_spectrum_long[ch]; } @@ -214,6 +230,17 @@ void stereo_mdct_core_enc( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { +#ifdef IVAS_FLOAT_FIXED + orig_spectrum_fx[ch][0] = orig_spectrum_long_fx[ch]; + orig_spectrum_fx[ch][1] = orig_spectrum_long_fx[ch] + N_TCX10_MAX; + inv_mdst_spectrum_fx[ch][0] = powerSpecMsInv_fx[ch][0] = powerSpecMsInv_long_fx[ch]; + inv_mdst_spectrum_fx[ch][1] = powerSpecMsInv_fx[ch][1] = powerSpecMsInv_long_fx[ch] + N_TCX10_MAX; + quantized_spectrum_fx[ch][0] = quantized_spectrum_long_fx[ch]; + quantized_spectrum_fx[ch][1] = quantized_spectrum_long_fx[ch] + N_TCX10_MAX; + inv_spectrum_fx[ch][0] = quantized_spectrum_fx[ch][0]; + inv_spectrum_fx[ch][1] = quantized_spectrum_fx[ch][1]; + UNUSED_PARAM( inv_mdst_spectrum_fx ); +#endif // IVAS_FLOAT_FIXED orig_spectrum[ch][0] = orig_spectrum_long[ch]; orig_spectrum[ch][1] = orig_spectrum_long[ch] + N_TCX10_MAX; quantized_spectrum[ch][0] = quantized_spectrum_long[ch]; @@ -264,10 +291,8 @@ void stereo_mdct_core_enc( #else #if 1 Word16 k; - Word32 *inv_spectrum_fx[2][2]; Word16 q_spec = Q31; Word16 length; - Word32 *inv_mdst_spectrum_fx[2][2]; Word32 *mdst_spectrum_fx[2][2]; FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { @@ -278,8 +303,6 @@ void stereo_mdct_core_enc( } FOR( k = 0; k <= ( ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) { - inv_spectrum_fx[ch][k] = (Word32 *) malloc( sizeof( Word32 ) * length ); - inv_mdst_spectrum_fx[ch][k] = (Word32 *) malloc( sizeof( Word32 ) * length ); mdst_spectrum_fx[ch][k] = (Word32 *) malloc( sizeof( Word32 ) * length ); q_spec = s_min( q_spec, Q_factor_arrL( sts[ch]->hTcxEnc->spectrum[k], length ) - 1 ); q_spec = s_min( q_spec, Q_factor_arrL( mdst_spectrum[ch][k], length ) - 1 ); @@ -317,8 +340,6 @@ void stereo_mdct_core_enc( fixedToFloat_arrL32( inv_spectrum_fx[ch][k], inv_spectrum[ch][k], q_spec, length ); fixedToFloat_arrL32( inv_mdst_spectrum_fx[ch][k], inv_mdst_spectrum[ch][k], q_spec, length ); fixedToFloat_arrL32( mdst_spectrum_fx[ch][k], mdst_spectrum[ch][k], q_spec, length ); - free( inv_spectrum_fx[ch][k] ); - free( inv_mdst_spectrum_fx[ch][k] ); free( mdst_spectrum_fx[ch][k] ); } } @@ -417,7 +438,13 @@ void stereo_mdct_core_enc( { p_powerSpec[0] = powerSpec[0]; p_powerSpec[1] = powerSpec[1]; +#ifdef IVAS_FLOAT_FIXED + p_powerSpec_fx[0] = powerSpec_fx[0]; + p_powerSpec_fx[1] = powerSpec_fx[1]; + ProcessStereoIGF_fx( hStereoMdct, sts, ms_mask, orig_spectrum_fx, p_powerSpec_fx, powerSpecMsInv_fx, inv_spectrum_fx, orig_spectrum, p_powerSpec, powerSpecMsInv, inv_spectrum, n, hCPE->hCoreCoder[0]->sp_aud_decision0, hCPE->hCoreCoder[0]->element_brate, 0 ); +#else ProcessStereoIGF( hStereoMdct, sts, ms_mask, orig_spectrum, p_powerSpec, powerSpecMsInv, inv_spectrum, n, hCPE->hCoreCoder[0]->sp_aud_decision0, hCPE->hCoreCoder[0]->element_brate, 0 ); +#endif // IVAS_FLOAT_FIXED } else { diff --git a/lib_enc/ivas_stereo_switching_enc.c b/lib_enc/ivas_stereo_switching_enc.c index 1a333aaf7..165db27f9 100644 --- a/lib_enc/ivas_stereo_switching_enc.c +++ b/lib_enc/ivas_stereo_switching_enc.c @@ -511,6 +511,12 @@ ivas_error stereo_memory_enc( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxEnc\n" ) ); } + +#ifdef IVAS_FLOAT_FIXED + st->hTcxEnc->spectrum_fx[0] = st->hTcxEnc->spectrum_long_fx; + st->hTcxEnc->spectrum_fx[1] = st->hTcxEnc->spectrum_long_fx + N_TCX10_MAX; +#endif // IVAS_FLOAT_FIXED + st->hTcxEnc->spectrum[0] = st->hTcxEnc->spectrum_long; st->hTcxEnc->spectrum[1] = st->hTcxEnc->spectrum_long + N_TCX10_MAX; #ifdef IVAS_FLOAT_FIXED diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 1e9121daa..e414f2f04 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -2120,7 +2120,23 @@ void qlpc_avq_fx( void stereo_tcx_init_enc_fx( Encoder_State *st /* i/o: encoder state structure */ ); - +void IGF_UpdateInfo( const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ + const Word16 igfGridIdx /**< in: Q0 | IGF grid index */ +); +Word16 IGF_getCrest( /**< out: Q15| crest factor */ + Word16 *crest_exp, /**< out: | exponent of crest factor */ + const Word32 *powerSpectrum, /**< in: Q31 | power spectrum */ + const Word16 powerSpectrum_exp, /**< in: | exponent of power spectrum */ + const Word16 start, /**< in: Q0 | start subband index */ + const Word16 stop /**< in: Q0 | stop subband index */ +); +Word16 IGF_getSFM( /**< out: Q15| SFM value */ + Word16 *SFM_exp, /**< out: | exponent of SFM Factor */ + const Word32 *energy, /**< in: Q31| energies */ + const Word16 *energy_exp, /**< in: | exponent of energies */ + const Word16 start, /**< in: Q0 | start subband index */ + const Word16 stop /**< in: Q0 | stop subband index */ +); /* IGFEnc.c */ void IGFEncApplyMono_fx( const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ const Word16 igfGridIdx, /**< in: Q0 | IGF grid index */ diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 5c029a808..335b3061a 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -678,6 +678,18 @@ typedef struct igf_enc_private_data_struct IGF_INFO igfInfo; int16_t igfScfQuantized[IGF_MAX_SFB]; IGFSCFENC_INSTANCE hIGFSCFArithEnc; +#ifdef IVAS_FLOAT_FIXED + Word16 prevSFM_FIR_SFB_TB_fx[IGF_MAX_SFB]; + Word16 sfb_sb_e[IGF_MAX_SFB]; + Word16 sfb_tb_e[IGF_MAX_SFB]; + Word16 prevSFM_IIR_SFB_TB_fx[IGF_MAX_SFB]; + Word16 prevSFM_FIR_SFB_SB_fx[IGF_MAX_SFB]; + Word16 prevSFM_IIR_SFB_SB_fx[IGF_MAX_SFB]; + Word16 SFM_tb_fx[IGF_MAX_SFB]; + Word16 SFM_sb_fx[IGF_MAX_SFB]; + Word16 prevDampingFactor_IIR_fx[IGF_MAX_SFB]; + Word16 prevDampingFactor_IIR_e[IGF_MAX_SFB]; +#endif // IVAS_FLOAT_FIXED float prevSFM_FIR_SFB_TB[IGF_MAX_SFB]; float prevSFM_IIR_SFB_TB[IGF_MAX_SFB]; @@ -1595,12 +1607,12 @@ typedef struct tcx_enc_structure int16_t noiseLevelMemory_cnt; /* counter of consecutive low TCX noise levels */ float ltpGainMemory[N_LTP_GAIN_MEMS]; /* for smoothing noiseTransWidth */ STnsData tnsData[2]; - int16_t fUseTns[2]; - Word8 fUseTns_fx[2]; + // int16_t fUseTns[2]; + Word8 fUseTns[2]; int16_t bTnsOnWhithenedSpectra[2]; - int16_t memQuantZeros[L_FRAME_PLUS]; /* Quantization deadzone flags */ - Word8 memQuantZeros_fx[L_FRAME_PLUS]; + // int16_t memQuantZeros[L_FRAME_PLUS]; /* Quantization deadzone flags */ + Word8 memQuantZeros[L_FRAME_PLUS]; /* Quantization deadzone flags */ float *speech_TCX_flt; float *new_speech_TCX_flt; diff --git a/lib_enc/tcx_utils_enc.c b/lib_enc/tcx_utils_enc.c index 4f14866c8..5c314cd79 100644 --- a/lib_enc/tcx_utils_enc.c +++ b/lib_enc/tcx_utils_enc.c @@ -57,7 +57,7 @@ void ComputeSpectrumNoiseMeasure( const int16_t L_frame, const int16_t startLine, const int16_t resetMemory, - int16_t *noiseFlags, + int8_t *noiseFlags, const int16_t lowpassLine ) { int16_t i, lastTone; @@ -567,12 +567,12 @@ float SQ_gain_estimate( *---------------------------------------------------------------------*/ void tcx_scalar_quantization( - float *x, /* i : input coefficients */ - int16_t *xq, /* o : quantized coefficients */ - const int16_t L_frame, /* i : frame length */ - const float gain, /* i : quantization gain */ - const float offset, /* i : rounding offset (deadzone) */ - int16_t *memQuantZeros, /* o : coefficients set to 0 */ + float *x, /* i : input coefficients */ + int16_t *xq, /* o : quantized coefficients */ + const int16_t L_frame, /* i : frame length */ + const float gain, /* i : quantization gain */ + const float offset, /* i : rounding offset (deadzone) */ + int8_t *memQuantZeros, /* o : coefficients set to 0 */ const int16_t tcxonly ) { int16_t i; @@ -710,7 +710,7 @@ int16_t tcx_scalar_quantization_rateloop( const int16_t L_frame, /* i : frame length */ float *gain, /* i/o: quantization gain */ float offset, /* i : rounding offset (deadzone) */ - int16_t *memQuantZeros, /* o : coefficients set to 0 */ + int8_t *memQuantZeros, /* o : coefficients set to 0 */ int16_t *lastnz_out, /* i/o: last nonzero coeff index */ const int16_t target, /* i : target number of bits */ int16_t *nEncoded, /* o : number of encoded coeff */ @@ -1583,6 +1583,95 @@ void ProcessIGF( * * *---------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ProcessStereoIGF_fx( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, + Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ + int16_t ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ +#if 1 + Word32 *pITFMDCTSpectrum_fx[CPE_CHANNELS][NB_DIV], /* i : MDCT spectrum fir ITF */ + Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ +#endif + float *pITFMDCTSpectrum[CPE_CHANNELS][NB_DIV], /* i : MDCT spectrum fir ITF */ + float *pPowerSpectrum[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + float *pPowerSpectrumMsInv[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ + float *inv_spectrum[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ + const int16_t frameno, /* i : flag indicating index of current subfr. */ + const int16_t sp_aud_decision0, /* i : sp_aud_decision0 */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ +) +{ + UNUSED_PARAM( pITFMDCTSpectrum_fx ); + int16_t ch, igfGridIdx, isIndepFlag, bsBits, pBsStart, curr_order; + float predictionGain; + float A[ITF_MAX_FILTER_ORDER + 1]; + IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS]; + BSTR_ENC_HANDLE hBstr; + + hIGFEnc[0] = sts[0]->hIGFEnc; + hIGFEnc[1] = sts[1]->hIGFEnc; + + isIndepFlag = 1; + + if ( sts[0]->last_core == ACELP_CORE && sts[0]->core == TCX_20_CORE ) + { + igfGridIdx = IGF_GRID_LB_TRAN; + } + else if ( sts[0]->core == TCX_20_CORE ) + { + igfGridIdx = IGF_GRID_LB_NORM; + } + else + { + /* It is short block */ + igfGridIdx = IGF_GRID_LB_SHORT; + if ( frameno == 1 ) + { + isIndepFlag = 0; + } + } + + IGFSaveSpectrumForITF( hIGFEnc[0], igfGridIdx, pITFMDCTSpectrum[0][frameno] ); + + IGFSaveSpectrumForITF( hIGFEnc[1], igfGridIdx, pITFMDCTSpectrum[1][frameno] ); + + IGFEncApplyStereo_fx( hStereoMdct, ms_mask, hIGFEnc, igfGridIdx, sts, pPowerSpectrum_fx, pPowerSpectrumMsInv_fx, inv_spectrum_fx, pPowerSpectrum, pPowerSpectrumMsInv, inv_spectrum, frameno, sp_aud_decision0, element_brate, mct_on ); + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + curr_order = 0; + + ITF_Detect( hIGFEnc[ch]->spec_be_igf_flt, hIGFEnc[ch]->infoStartLine, hIGFEnc[ch]->infoStopLine, 8 /*maxOrder*/, A, &predictionGain, &curr_order ); + + hIGFEnc[ch]->flatteningTrigger = hIGFEnc[ch]->tns_predictionGain_flt < 1.15 && predictionGain < 1.15; + + hIGFEnc[ch]->infoTotalBitsPerFrameWritten = 0; + + if ( sts[ch]->core == TCX_20_CORE ) + { + IGFEncWriteBitstream( hIGFEnc[ch], NULL, &hIGFEnc[ch]->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); + } + else + { + hBstr = sts[ch]->hBstr; + pBsStart = hBstr->nb_ind_tot; + if ( ch > 0 ) + { + hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } + IGFEncWriteBitstream( hIGFEnc[ch], hBstr, &hIGFEnc[ch]->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); + + bsBits = hBstr->nb_ind_tot - pBsStart; + IGFEncConcatenateBitstream( hIGFEnc[ch], bsBits, hBstr ); + } + } + + return; +} +#endif void ProcessStereoIGF( STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index 1ef5f0463..dc6dc6b7e 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -294,7 +294,7 @@ void AnalyzePowerSpectrum_fx( L_frameTCX, divide3216( L_mult( hTcxEnc->nmStartLine, L_frame ), st->L_frame ), tmp8, - hTcxEnc->memQuantZeros_fx, + hTcxEnc->memQuantZeros, lowpassLine ); IF( LE_32( st->total_brate, ACELP_24k40 ) ) -- GitLab From f346788784326713a1a6f08ab9ef6a838fcd1bf7 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 25 Jul 2024 10:00:34 +0530 Subject: [PATCH 104/110] Revert LSF tools changes --- lib_com/lsf_tools.c | 52 -------------------------------------------- lib_com/prot_fx.h | 11 ---------- lib_enc/fd_cng_enc.c | 29 ++---------------------- 3 files changed, 2 insertions(+), 90 deletions(-) diff --git a/lib_com/lsf_tools.c b/lib_com/lsf_tools.c index f13362be5..ddce7c199 100644 --- a/lib_com/lsf_tools.c +++ b/lib_com/lsf_tools.c @@ -2828,58 +2828,6 @@ void extend_dctN_input( return; } -#ifdef IVAS_FLOAT_FIXED -void extend_dctN_input_fx( - const Word32 *input, /* i : input in fdcng domain -> Q */ - const Word32 *dct_input, /* i : input in dctN(fdcng) domain -> Q */ - const Word16 in_dim, /* i : in_dim == N */ - Word32 *ext_sig, /* o : extended output in fdcng domain Q */ - const Word16 out_dim, /* i : output total dim */ - Word32 *matrix, /* i : idct synthesis matrix N rows, n_cols columns -> Q31*/ - const Word16 n_cols, /* i : number of columns == DCT truncation length */ - const DCTTYPE dcttype /* i : matrix operation type */ -) -{ - Word16 i, j, i_rev; - const Word32( *ptr )[FDCNG_VQ_DCT_MAXTRUNC] = (void *) matrix; - - /* stored format is an IDCT_Nx(FDCNG_VQ_DCT_MAXTRUNC) matrix */ - assert( in_dim < FDCNG_VQ_MAX_LEN ); - assert( out_dim <= FDCNG_VQ_MAX_LEN ); - assert( out_dim > in_dim ); - assert( n_cols == FDCNG_VQ_DCT_MAXTRUNC ); /* for *ptr[MAX_TRUNC] adressing*/ - assert( ( dcttype & 1 ) != 0 ); /* idct tables always in use for this basis vector extension */ - - Copy32( input, ext_sig, in_dim ); /* copy initial part, i.e. only last/tail parts are extended */ - set32_fx( &( ext_sig[in_dim] ), 0, out_dim - in_dim ); - - i_rev = in_dim; /*ptr init*/ - move16(); - - FOR( i = in_dim; i < out_dim; i++ ) - { /* for each extension sample */ - /* i = 21 22 23; - i_rev = 20 19 18; for odd dctII reflect basis vector - */ - i_rev = sub( i_rev, 1 ); - - FOR( j = 0; j < n_cols; j++ ) /* for each available DCT coeff */ - { - /* DCTcoeff * reflected basis vector */ -#define WMC_TOOL_SKIP - /* pure ptr MAC operations */ - ext_sig[i] = L_add( ext_sig[i], Mpy_32_32( dct_input[j], ptr[i_rev][j] ) ); /* sum up scaled and extended basis vector */ - move32(); - // Q31 + Q - Q31 -> Q - MAC( 1 ); -#undef WMC_TOOL_SKIP - } - } - - return; -} - -#endif /*-------------------------------------------------------------------* * create_IDCT_N_Matrix() diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index b51d561b0..e2b548441 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -9886,17 +9886,6 @@ void dctT2_N_apply_matrix_fx( const DCTTYPE dcttype /* i : matrix operation type */ ); -void extend_dctN_input_fx( - const Word32 *input, /* i : input in fdcng domain */ - const Word32 *dct_input, /* i : input in dctN(fdcng) domain */ - const Word16 in_dim, /* i : in_dim == N */ - Word32 *ext_sig, /* o : extended output in fdcng domain */ - const Word16 out_dim, /* i : output total dim */ - Word32 *matrix, /* i : idct synthesis matrix N rows, n_cols columns */ - const Word16 n_cols, /* i : number of columns == DCT truncation length */ - const DCTTYPE dcttype /* i : matrix operation type */ -); - Word32 sum2_f_32_fx( const Word32 *vec, /* i : input vector */ const int16_t lvec, /* i : length of input vector */ diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index b71282946..38803594f 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -46,7 +46,7 @@ #include "ivas_prot_fx.h" #include "stat_enc.h" #include "wmc_auto.h" -#include "ivas_prot_fx.h" + /*-------------------------------------------------------------------* * createFdCngEnc() * @@ -522,16 +522,6 @@ void FdCng_encodeSID( N = hFdCngEnc->npartDec; invTrfMatrix = (float *) tmpRAM; /* dynamically filled */ - -#ifdef IVAS_FLOAT_FIXED - Word32 *invTrfMatrix_fx; - Word32 tmpRAM_fx[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; - Word32 v_fx[32]; - invTrfMatrix_fx = (Word32 *) tmpRAM_fx; - Word32 dct_target_fx[FDCNG_VQ_DCT_MAXTRUNC]; - Word32 tot_sig_ext_fx[FDCNG_VQ_MAX_LEN]; -#endif - set_zero( v, FDCNG_VQ_MAX_LEN ); /* Convert to LOG */ @@ -569,24 +559,10 @@ void FdCng_encodeSID( { create_IDCT_N_Matrix( invTrfMatrix, N, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); /* truncated DCT21 analysis */ - -#ifdef IVAS_FLOAT_FIXED - Word16 Q = 24; - move16(); - create_IDCT_N_Matrix_fx( invTrfMatrix_fx, N, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM_fx ) / ( sizeof( Word32 ) ) ); // Q31 -#endif - dctT2_N_apply_matrix( (const float *) v, dct_target, FDCNG_VQ_DCT_MAXTRUNC, N, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX ); /* truncated IDCT21 extension to 24 bands */ - -#ifdef IVAS_FLOAT_FIXED - floatToFixed_arr32( v, v_fx, Q, N ); - floatToFixed_arr32( dct_target, dct_target_fx, Q, FDCNG_VQ_DCT_MAXTRUNC ); - extend_dctN_input_fx( v_fx, dct_target_fx, N, tot_sig_ext_fx, FDCNG_VQ_MAX_LEN, invTrfMatrix_fx, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); - fixedToFloat_arrL( tot_sig_ext_fx, tot_sig_ext, Q, N ); -#else extend_dctN_input( v, dct_target, N, tot_sig_ext, FDCNG_VQ_MAX_LEN, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); -#endif + mvr2r( tot_sig_ext, v, FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ stage #1 */ } create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); @@ -1345,7 +1321,6 @@ void FdCngEncodeDiracMDCTStereoSID( /* truncated DCT 21 analysis */ dctT2_N_apply_matrix( (const float *) ms_ptr[0], dct_target, FDCNG_VQ_DCT_MAXTRUNC, N[0], invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX ); /* truncated IDCT21 extension to 24 synthesis */ - extend_dctN_input( ms_ptr[0], dct_target, N[0], tot_sig_ext, FDCNG_VQ_MAX_LEN, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); /* use 18 basis vectors*/ mvr2r( tot_sig_ext, ms_ptr[0], FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ stage #1 */ -- GitLab From ed402def6cdc15d0677209c43be8e1216f958b3b Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 25 Jul 2024 19:21:22 +0530 Subject: [PATCH 105/110] Fix for 3GPP issue 790 [x] [3GPP-Issue #790] Fixes improper output with floating point IVAS decoder for 10dB test_sba_plc_system[1-32-PLperc40mblen50-stvFOA-0-32000] test case [x] Corresponding float changes taken through MR!453: https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/merge_requests/453 --- lib_com/options.h | 1 + lib_dec/swb_tbe_dec.c | 18 ++++++++++++++++ lib_dec/swb_tbe_dec_fx.c | 44 ++++++++++++++++++++++++++++++++++++++++ lib_enc/swb_tbe_enc.c | 18 ++++++++++++++++ lib_enc/swb_tbe_enc_fx.c | 24 +++++++++++++++++++++- 5 files changed, 104 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index c40293951..d56b99de4 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -78,6 +78,7 @@ #define NONBE_FIX_1096_NAN_VALUES_IN_DIRAC_TO_STEREO /* FhG: avoid sidegain DFT-Stereo param to be larger than 1 when converting from Dirac parameters */ #define NON_BE_1055_RESET_LP_MEMORIES /* VA: issue 1055: Correctly reset LP filter MA and AR memories in bitrate switching */ #define NON_BE_FIX_1137_GSC_IVAS_FXFLT_DECODING /* VA: Add fix point bit allocation for special GSC mode such that float and fixed point have the same final bit allocation */ +#define NONBE_FIX_1132_THRESHOLD_POW_IN_SWB_TBE /* VA: issue 1132: prevent division by extremely low energy value in SWB TBE */ /* #################### End FIXES switches ############################ */ diff --git a/lib_dec/swb_tbe_dec.c b/lib_dec/swb_tbe_dec.c index 870b656fa..bf05a9b2b 100644 --- a/lib_dec/swb_tbe_dec.c +++ b/lib_dec/swb_tbe_dec.c @@ -337,6 +337,15 @@ void wb_tbe_dec( prev_pow = sum2_f( shaped_wb_excitation, L_SHB_LAHEAD / 4 ); curr_pow = sum2_f( shaped_wb_excitation + L_SHB_LAHEAD / 4, L_SHB_LAHEAD / 4 ); +#ifdef NONBE_FIX_1132_THRESHOLD_POW_IN_SWB_TBE + if ( st->element_mode > EVS_MONO ) + { + /* prevent too low values of energy */ + prev_pow = max( 0.00001f, prev_pow ); + curr_pow = max( 0.00001f, curr_pow ); + } +#endif + if ( voice_factors[0] > 0.75f ) { curr_pow *= 0.25; @@ -3448,6 +3457,15 @@ void swb_tbe_dec( prev_pow = sum2_f( shaped_shb_excitation, L_SHB_LAHEAD + 10 ); curr_pow = sum2_f( shaped_shb_excitation + L_SHB_LAHEAD + 10, L_SHB_LAHEAD + 10 ); +#ifdef NONBE_FIX_1132_THRESHOLD_POW_IN_SWB_TBE + if ( st->element_mode > EVS_MONO ) + { + /* prevent too low values of energy */ + prev_pow = max( 0.00001f, prev_pow ); + curr_pow = max( 0.00001f, curr_pow ); + } +#endif + if ( voice_factors[0] > 0.75f ) { curr_pow *= 0.25; diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 330156ce0..b986d136b 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -908,6 +908,17 @@ void ivas_wb_tbe_dec_fx( prev_pow = 0; move32(); +#ifdef NONBE_FIX_1132_THRESHOLD_POW_IN_SWB_TBE + IF( st_fx->element_mode > EVS_MONO ) + { + tmp = sub( shl( sub( st_fx->prev_Q_bwe_exc, 16 ), 1 ), 31 + 16 ); +#ifdef BASOP_NOGLOB + prev_pow = L_shl_sat( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/ +#else + prev_pow = L_shl( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/ +#endif + } +#endif FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ ) { prev_pow = L_mac0( prev_pow, hBWE_TD->state_syn_shbexc_fx[i], hBWE_TD->state_syn_shbexc_fx[i] ); /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/ @@ -933,6 +944,17 @@ void ivas_wb_tbe_dec_fx( curr_pow = 0; move32(); +#ifdef NONBE_FIX_1132_THRESHOLD_POW_IN_SWB_TBE + IF( st_fx->element_mode > EVS_MONO ) + { + tmp = sub( shl( Q_bwe_exc_ext, 1 ), 31 + 16 ); +#ifdef BASOP_NOGLOB + curr_pow = L_shl_sat( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(2*(Q_bwe_exc_ext))*/ +#else + curr_pow = L_shl( 1407374848l /*0.00001f Q47*/, tmp ); /* 2*(Q_bwe_exc_ext) */ +#endif + } +#endif FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ ) { curr_pow = L_mac0( curr_pow, shaped_wb_excitation[i + L_SHB_LAHEAD / 4], shaped_wb_excitation[i + L_SHB_LAHEAD / 4] ); /* Q(2*Q_bwe_exc_ext) */ @@ -1554,6 +1576,17 @@ void wb_tbe_dec_fx( prev_pow = 0; move32(); +#ifdef NONBE_FIX_1132_THRESHOLD_POW_IN_SWB_TBE + IF( st_fx->element_mode > EVS_MONO ) + { + tmp = sub( shl( sub( st_fx->prev_Q_bwe_exc, 16 ), 1 ), 31 + 16 ); +#ifdef BASOP_NOGLOB + prev_pow = L_shl_sat( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/ +#else + prev_pow = L_shl( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/ +#endif + } +#endif FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ ) { #ifdef BASOP_NOGLOB @@ -1588,6 +1621,17 @@ void wb_tbe_dec_fx( curr_pow = 0; move32(); +#ifdef NONBE_FIX_1132_THRESHOLD_POW_IN_SWB_TBE + IF( st_fx->element_mode > EVS_MONO ) + { + tmp = sub( shl( Q_bwe_exc_ext, 1 ), 31 + 16 ); +#ifdef BASOP_NOGLOB + curr_pow = L_shl_sat( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(2*(Q_bwe_exc_ext))*/ +#else + curr_pow = L_shl( 1407374848l /*0.00001f Q47*/, tmp ); /* 2*(Q_bwe_exc_ext) */ +#endif + } +#endif FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ ) { #ifdef BASOP_NOGLOB diff --git a/lib_enc/swb_tbe_enc.c b/lib_enc/swb_tbe_enc.c index 943fe458b..608d96d19 100644 --- a/lib_enc/swb_tbe_enc.c +++ b/lib_enc/swb_tbe_enc.c @@ -373,6 +373,15 @@ void wb_tbe_enc( prev_pow = sum2_f( shaped_wb_excitation, L_SHB_LAHEAD / 4 ); curr_pow = sum2_f( shaped_wb_excitation + L_SHB_LAHEAD / 4, L_SHB_LAHEAD / 4 ); +#ifdef NONBE_FIX_1132_THRESHOLD_POW_IN_SWB_TBE + if ( st->element_mode > EVS_MONO ) + { + /* prevent too low values of energy */ + prev_pow = max( 0.00001f, prev_pow ); + curr_pow = max( 0.00001f, curr_pow ); + } +#endif + if ( voice_factors[0] > 0.75f ) { curr_pow = (float) ( curr_pow * 0.25 ); @@ -1050,6 +1059,15 @@ void swb_tbe_enc( prev_pow = sum2_f( shaped_shb_excitation, L_SHB_LAHEAD + 10 ); curr_pow = sum2_f( shaped_shb_excitation + L_SHB_LAHEAD + 10, L_SHB_LAHEAD + 10 ); +#ifdef NONBE_FIX_1132_THRESHOLD_POW_IN_SWB_TBE + if ( st->element_mode > EVS_MONO ) + { + /* prevent too low values of energy */ + prev_pow = max( 0.00001f, prev_pow ); + curr_pow = max( 0.00001f, curr_pow ); + } +#endif + if ( voice_factors[0] > 0.75f ) { curr_pow = (float) ( curr_pow * 0.25 ); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index c86d5c97c..5eb1d275a 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -843,7 +843,18 @@ void wb_tbe_enc_fx( } prev_pow = 0; - move16(); + move32(); +#ifdef NONBE_FIX_1132_THRESHOLD_POW_IN_SWB_TBE + IF( st_fx->element_mode > EVS_MONO ) + { + tmp = sub( shl( sub( st_fx->prev_Q_bwe_exc, 16 ), 1 ), 31 + 16 ); +#ifdef BASOP_NOGLOB + prev_pow = L_shl_sat( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/ +#else + prev_pow = L_shl( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/ +#endif + } +#endif FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ ) { prev_pow = L_mac0( prev_pow, hBWE_TD->state_syn_shbexc_fx[i], hBWE_TD->state_syn_shbexc_fx[i] ); /* Q(2*st_fx->prev_Q_bwe_exc) */ @@ -871,6 +882,17 @@ void wb_tbe_enc_fx( curr_pow = 0; move16(); +#ifdef NONBE_FIX_1132_THRESHOLD_POW_IN_SWB_TBE + IF( st_fx->element_mode > EVS_MONO ) + { + tmp = sub( shl( Q_bwe_exc_ext, 1 ), 31 + 16 ); +#ifdef BASOP_NOGLOB + curr_pow = L_shl_sat( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(2*(Q_bwe_exc_ext))*/ +#else + curr_pow = L_shl( 1407374848l /*0.00001f Q47*/, tmp ); /* 2*(Q_bwe_exc_ext) */ +#endif + } +#endif FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ ) { curr_pow = L_mac0( curr_pow, shaped_wb_excitation[i + L_SHB_LAHEAD / 4], shaped_wb_excitation[i + L_SHB_LAHEAD / 4] ); /* Q(2*Q_bwe_exc_ext) */ -- GitLab From 0b3e8504945e6227c44833c4116e7e7dfa2d314a Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 25 Jul 2024 19:51:56 +0530 Subject: [PATCH 106/110] [3GPP-Issue #807] Fixes LTV Encoding crash issue observed for MASA DTX bitrate switching case --- lib_com/options.h | 1 + lib_dec/acelp_core_dec.c | 4 ++++ lib_dec/acelp_core_dec_fx.c | 4 ++++ lib_dec/acelp_core_dec_ivas_fx.c | 5 +++++ lib_enc/acelp_core_enc.c | 20 ++++++++++++++++++++ lib_enc/acelp_core_enc_fx.c | 5 +++++ 6 files changed, 39 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index d56b99de4..b9d043c2c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -79,6 +79,7 @@ #define NON_BE_1055_RESET_LP_MEMORIES /* VA: issue 1055: Correctly reset LP filter MA and AR memories in bitrate switching */ #define NON_BE_FIX_1137_GSC_IVAS_FXFLT_DECODING /* VA: Add fix point bit allocation for special GSC mode such that float and fixed point have the same final bit allocation */ #define NONBE_FIX_1132_THRESHOLD_POW_IN_SWB_TBE /* VA: issue 1132: prevent division by extremely low energy value in SWB TBE */ +#define NON_BE_FIX_807_MASA_DTX_BRSW /* Nokia: adds fix to check existence of DTX encoder for secondary channel in TD mode */ /* #################### End FIXES switches ############################ */ diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c index 61ff0b8c3..75c61452a 100644 --- a/lib_dec/acelp_core_dec.c +++ b/lib_dec/acelp_core_dec.c @@ -232,7 +232,11 @@ ivas_error acelp_core_dec( st->hGSCDec->Last_frame_ener = (float) MAX_32; } +#ifdef NON_BE_FIX_807_MASA_DTX_BRSW + if ( st->hFdCngDec != NULL && ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) && ( st->last_core_brate == SID_2k40 || st->last_core_brate == FRAME_NO_DATA ) ) +#else if ( ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) && ( st->last_core_brate == SID_2k40 || st->last_core_brate == FRAME_NO_DATA ) ) +#endif { set_zero( st->hFdCngDec->hFdCngCom->olapBufferSynth2_flt, FFTLEN ); set_zero( hStereoCng->olapBufferSynth22, FFTLEN ); diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index 7fb5ff3bc..c0c0777e4 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -264,7 +264,11 @@ ivas_error acelp_core_dec_fx( move32(); } #ifdef IVAS_CODE +#ifdef NON_BE_FIX_807_MASA_DTX_BRSW + if ( st->hFdCngDec != NULL && ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) && ( st->last_core_brate == SID_2k40 || st->last_core_brate == FRAME_NO_DATA ) ) +#else if ( ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) && ( st->last_core_brate == SID_2k40 || st->last_core_brate == FRAME_NO_DATA ) ) +#endif { set_zero( st->hFdCngDec->hFdCngCom->olapBufferSynth2, FFTLEN ); set_zero( hStereoCng->olapBufferSynth22, FFTLEN ); diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index 62d6dc171..77c92e202 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -284,7 +284,12 @@ ivas_error acelp_core_dec_ivas_fx( test(); test(); test(); +#ifdef NON_BE_FIX_807_MASA_DTX_BRSW + test(); + IF( st->hFdCngDec != NULL && ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) && ( EQ_32( st->last_core_brate, SID_2k40 ) || st->last_core_brate == FRAME_NO_DATA ) ) +#else IF( ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) && ( EQ_32( st->last_core_brate, SID_2k40 ) || st->last_core_brate == FRAME_NO_DATA ) ) +#endif { set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, FFTLEN ); set16_fx( hStereoCng->olapBufferSynth22_fx, 0, FFTLEN ); diff --git a/lib_enc/acelp_core_enc.c b/lib_enc/acelp_core_enc.c index 6b95f3abf..fc418f652 100644 --- a/lib_enc/acelp_core_enc.c +++ b/lib_enc/acelp_core_enc.c @@ -414,7 +414,11 @@ ivas_error acelp_core_enc( * After inactive period, use the most up-to-date ISPs *-----------------------------------------------------------------*/ +#ifdef NON_BE_FIX_807_MASA_DTX_BRSW + if (st->hDtxEnc != NULL && (st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_2k40)) +#else if ( st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_2k40 ) +#endif { mvr2r( st->hDtxEnc->lspCNG, st->lsp_old, M ); lsp2lsf( st->hDtxEnc->lspCNG, st->lsf_old, M, int_fs ); @@ -748,7 +752,11 @@ ivas_error acelp_core_enc( #if 0 floatToFixed_arr(st->lsp_old, st->lsp_old_fx, 15, M); +#ifdef NON_BE_FIX_807_MASA_DTX_BRSW + IF (st->hDtxEnc != NULL && (st->last_core_brate == FRAME_NO_DATA || EQ_32(st->last_core_brate, SID_2k40))) +#else IF(EQ_32(st->last_core_brate, FRAME_NO_DATA) || EQ_32(st->last_core_brate, SID_2k40)) +#endif { Copy(st->hDtxEnc->lspCNG_fx, st->lsp_old_fx, M); lsp2lsf_fx(st->hDtxEnc->lspCNG_fx, st->lsf_old_fx, M, int_fs); @@ -756,8 +764,12 @@ ivas_error acelp_core_enc( for (int i = 0; i < M; i++) { st->lsf_old[i] = st->lsf_old_fx[i] / 2.56; } +#else +#ifdef NON_BE_FIX_807_MASA_DTX_BRSW + if (st->hDtxEnc != NULL && (st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_2k40)) #else if ( st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_2k40 ) +#endif { mvr2r( st->hDtxEnc->lspCNG, st->lsp_old, M ); lsp2lsf( st->hDtxEnc->lspCNG, st->lsf_old, M, int_fs ); @@ -1164,7 +1176,11 @@ ivas_error acelp_core_enc( * After inactive period, use the most up-to-date ISPs *-----------------------------------------------------------------*/ +#ifdef NON_BE_FIX_807_MASA_DTX_BRSW + if ( st->hDtxEnc != NULL && ( st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_2k40 ) ) +#else if ( st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_2k40 ) +#endif { mvr2r( st->hDtxEnc->lspCNG, st->lsp_old, M ); lsp2lsf( st->hDtxEnc->lspCNG, st->lsf_old, M, int_fs ); @@ -1838,7 +1854,11 @@ ivas_error acelp_core_enc( * After inactive period, use the most up-to-date ISPs *-----------------------------------------------------------------*/ +#ifdef NON_BE_FIX_807_MASA_DTX_BRSW + if ( st->hDtxEnc != NULL && ( st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_2k40 ) ) +#else if ( st->last_core_brate == FRAME_NO_DATA || st->last_core_brate == SID_2k40 ) +#endif { mvr2r( st->hDtxEnc->lspCNG, st->lsp_old, M ); lsp2lsf( st->hDtxEnc->lspCNG, st->lsf_old, M, int_fs ); diff --git a/lib_enc/acelp_core_enc_fx.c b/lib_enc/acelp_core_enc_fx.c index def676aa0..a21f4adbb 100644 --- a/lib_enc/acelp_core_enc_fx.c +++ b/lib_enc/acelp_core_enc_fx.c @@ -405,7 +405,12 @@ ivas_error acelp_core_enc_fx( *-----------------------------------------------------------------*/ test(); +#ifdef NON_BE_FIX_807_MASA_DTX_BRSW + test(); + IF( st_fx->hDtxEnc != NULL && ( st_fx->last_core_brate == FRAME_NO_DATA || EQ_32( st_fx->last_core_brate, SID_2k40 ) ) ) +#else IF( EQ_32( st_fx->last_core_brate, FRAME_NO_DATA ) || EQ_32( st_fx->last_core_brate, SID_2k40 ) ) +#endif { Copy( hDtxEnc->lspCNG_fx, st_fx->lsp_old_fx, M ); -- GitLab From 9b3ca0a226f3012a4e66fb1903876d31f5aa7c0c Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 25 Jul 2024 20:30:56 +0530 Subject: [PATCH 107/110] Fix for high MLD cases for MASA format [x] Scaling corrected in ivas_dirac_dec_compute_diffuse_proto. --- lib_rend/ivas_dirac_rend.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_dirac_rend.c b/lib_rend/ivas_dirac_rend.c index cc3f78a2d..f70fec75b 100644 --- a/lib_rend/ivas_dirac_rend.c +++ b/lib_rend/ivas_dirac_rend.c @@ -4277,7 +4277,7 @@ void ivas_dirac_dec_compute_diffuse_proto_fx( Scale_sig32( h_dirac_output_synthesis_state->proto_diffuse_buffer_f_fx, diffuse_start, sub( old_diff_e, new_diff_e ) ); #ifdef MSAN_FIX Scale_sig32( h_dirac_output_synthesis_state->proto_diffuse_buffer_f_fx + diffuse_start, - sub( 2 * num_freq_bands_diff * hDirACRend->hOutSetup.nchan_out_woLFE, diffuse_start ), sub( diff_e, new_diff_e ) ); + i_mult( shl( num_freq_bands_diff, 1 ), hDirACRend->hOutSetup.nchan_out_woLFE ), sub( diff_e, new_diff_e ) ); #else Scale_sig32( h_dirac_output_synthesis_state->proto_diffuse_buffer_f_fx + diffuse_start, sub( h_dirac_output_synthesis_state->proto_diffuse_buffer_f_len, diffuse_start ), sub( diff_e, new_diff_e ) ); -- GitLab From 278b2ce6e99fe16da4d6558c7e22363f92c5ffb0 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 25 Jul 2024 21:00:40 +0530 Subject: [PATCH 108/110] Fix for 3GPP issue 809 - Significant spectral distortion in MC 160kbps test [x] Bug fix made in ps_pred_process_sf function --- lib_dec/ivas_mc_paramupmix_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index 246e81643..240dae544 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -685,7 +685,7 @@ static void ps_pred_process_sf( res_a = L_shl_sat( Mpy_32_32( alpha_smp_fx, vmim_fx ), Q31 - Q28 ); res_b = L_shl_sat( Mpy_32_32( beta_smp_fx, vsim_fx ), Q31 - Q28 ); - qmf_side_re_fx[ismp][iqmf] = L_add_sat( res_a, res_b ); + qmf_side_im_fx[ismp][iqmf] = L_add_sat( res_a, res_b ); ismp = add( ismp, 1 ); } -- GitLab From 6f4f3f4ee53dac00b66f22932f16bc35d0bf38fc Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 26 Jul 2024 16:14:26 +0530 Subject: [PATCH 109/110] Conversions related to IGFEncApplyStereo added [x] Cleaned up IGFEncApplyStereo_fx [x] Converted IGF_Whitening_ivas_fx --- lib_com/prot.h | 42 --- lib_com/prot_fx.h | 36 +++ lib_enc/igf_enc.c | 609 ++++++++++++++++++++++++++++++++-------- lib_enc/igf_enc_fx.c | 12 +- lib_enc/init_enc.c | 4 - lib_enc/prot_fx_enc.h | 7 + lib_enc/stat_enc.h | 5 +- lib_enc/tcx_utils_enc.c | 82 +++++- 8 files changed, 630 insertions(+), 167 deletions(-) diff --git a/lib_com/prot.h b/lib_com/prot.h index a234bdbd9..12828f0dd 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -7446,27 +7446,6 @@ void ProcessIGF( const int16_t sp_aud_decision0, /* i : first stage switching decision */ const int16_t vad_hover_flag /* i : VAD hangover flag */ ); -#ifdef IVAS_FLOAT_FIXED -void ProcessStereoIGF_fx( - STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, - Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ - int16_t ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ -#if 1 - Word32 *pITFMDCTSpectrum_fx[CPE_CHANNELS][NB_DIV], /* i : MDCT spectrum fir ITF */ - Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ - Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ -#endif - float *pITFMDCTSpectrum[CPE_CHANNELS][NB_DIV], /* i : MDCT spectrum fir ITF */ - float *pPowerSpectrum[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - float *pPowerSpectrumMsInv[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ - float *inv_spectrum[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ - const int16_t frameno, /* i : flag indicating index of current subfr. */ - const int16_t sp_aud_decision0, /* i : sp_aud_decision0 */ - const int32_t element_brate, /* i : element bitrate */ - const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ -); -#endif // IVAS_FLOAT_FIXED void ProcessStereoIGF( STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, @@ -10005,27 +9984,6 @@ void IGFEncApplyMono( const int16_t sp_aud_decision0, /* i : first stage switching decision */ const int16_t vad_hover_flag /* i : VAD hangover flag */ ); -#ifdef IVAS_FLOAT_FIXED -void IGFEncApplyStereo_fx( - STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ - int16_t ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ - const IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS], /* i : instance handle of IGF Encoder */ - const int16_t igfGridIdx, /* i : IGF grid index */ - Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ - Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ - Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ -#if 1 - float *pPowerSpectrum[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - float *pPowerSpectrumMsInv[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ - float *inv_spectrum[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ -#endif - const int16_t frameno, /* i : flag indicating index of current subfr. */ - const int16_t sp_aud_decision0, /* i : sp_aud_decision0 */ - const int32_t element_brate, /* i : element bitrate */ - const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ -); -#endif // IVAS_FLOAT_FIXED void IGFEncApplyStereo( STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index e2b548441..0d62a9f29 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -10108,5 +10108,41 @@ Word32 sum2_32_fx( const Word32 *vec, /* i : input vector */ const Word16 lvec, /* i : length of input vector */ Word16 *e ); +#ifdef IVAS_FLOAT_FIXED +void ProcessStereoIGF_fx( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, + Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ + int16_t ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ +#if 1 + Word32 *pITFMDCTSpectrum_fx[CPE_CHANNELS][NB_DIV], /* i : MDCT spectrum fir ITF */ + Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ +#endif + float *pITFMDCTSpectrum[CPE_CHANNELS][NB_DIV], /* i : MDCT spectrum fir ITF */ + float *pPowerSpectrum[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + float *pPowerSpectrumMsInv[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ + float *inv_spectrum[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ + const int16_t frameno, /* i : flag indicating index of current subfr. */ + const int16_t sp_aud_decision0, /* i : sp_aud_decision0 */ + const int32_t element_brate, /* i : element bitrate */ + const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ +); +void IGFEncApplyStereo_fx( + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ + Word16 ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ + const IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS], /* i : instance handle of IGF Encoder */ + const Word16 igfGridIdx, /* i : IGF grid index */ + Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ + Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ + const Word16 frameno, /* i : flag indicating index of current subfr. */ + const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 mct_on /* i : flag mct block (1) or stereo (0) */ +); + +#endif // IVAS_FLOAT_FIXED #endif diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index b1429313f..dcc61747d 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -144,7 +144,6 @@ static void IGF_write_bits( *-------------------------------------------------------------------*/ /*! r: crest factor */ -#if 0 #ifdef IVAS_FLOAT_FIXED static Word16 IGF_getCrest_new_fx( const Word16 *logSpec, /* i : power spectrum */ @@ -165,7 +164,6 @@ static Word16 IGF_getCrest_new_fx( x_max = 0; exp = 0; temp = 0; - temp_e; crest = 32767; /*1.0f in Q15*/ move32(); move16(); @@ -207,7 +205,6 @@ static Word16 IGF_getCrest_new_fx( return crest; } #endif -#endif static float IGF_getCrest_new( const int16_t *logSpec, /* i : power spectrum */ const int16_t start, /* i : start subband index */ @@ -249,8 +246,6 @@ static float IGF_getCrest_new( *-------------------------------------------------------------------*/ /*! r: SFM value */ -/* Q for the returned sfm value is 15 */ -#if 0 #ifdef IVAS_FLOAT_FIXED static Word16 IGF_getSFM_new_fx( const Word32 *powerSpectrum, /* i : power spectrum */ @@ -297,16 +292,15 @@ static Word16 IGF_getSFM_new_fx( IF( denom != 0 ) { - tmp = BASOP_util_Pow2( L_add( numf, shl( 1, sub( 14, numf_e ) ) ), add(16 , numf_e), &tmp_e ); - sfm = BASOP_Util_Divide3232_Scale( tmp, denom, &sfm_e); - sfm_e = add(sfm_e, sub( tmp_e, denom_e ) ); + tmp = BASOP_util_Pow2( L_add( numf, shl_sat( 1, sub( 14, numf_e ) ) ), 16 + numf_e, &tmp_e ); + sfm = BASOP_Util_Divide3232_Scale( tmp, denom, &sfm_e ); + sfm_e = add( sfm_e, sub( tmp_e, denom_e ) ); sfm = shl_sat( extract_l( L_min( sfm, L_shl( 1, 15 - sfm_e ) ) ), sfm_e ); } return sfm; } #endif -#endif static float IGF_getSFM_new( const float *powerSpectrum, /* i : power spectrum */ const int16_t *logSpec, /* i : log of power spectrum */ @@ -1031,6 +1025,9 @@ static void IGF_CalculateStereoEnvelope_fx( move32(); IF( pPowerSpectrum_fx ) { + Word16 final_exp; + Word16 norm_exp; + Word32 scaled_value; tmp = strt_cpy; move16(); @@ -1038,18 +1035,24 @@ static void IGF_CalculateStereoEnvelope_fx( { IF( NE_16( coreMsMask[sb], coreMsMask[strt_cpy] ) ) { - sfbEnergyC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyC_fx, sfbEnergyC_e, pPowerSpectrum_fx[sb], pPowerSpectrum_e, &sfbEnergyC_e ); /*resultant exponent is stored in sfbEnergyC_e*/ - sfbEnergyTileR_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR_fx, sfbEnergyTileR_e, Mult_32_32( pMDCTSpectrumMsInv_fx[strt_cpy], pMDCTSpectrumMsInv_fx[strt_cpy] ), shl( pMDCTSpectrumMsInv_e, 1 ), &sfbEnergyTileR_e ); /*resultant exponent is stored in sfbEnergyTileR_e*/ - sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrumMsInv_fx[strt_cpy], pPowerSpectrumMsInv_e, &sfbEnergyTileC_e ); /*resultant exponent is stored in sfbEnergyTileC_e*/ - tileSrcSpec_fx[sub( strt_cpy, tmp )] = pPowerSpectrumMsInv_fx[strt_cpy]; /*resultant exponent is stored in tileSrcSpec_e*/ + sfbEnergyC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyC_fx, sfbEnergyC_e, pPowerSpectrum_fx[sb], pPowerSpectrum_e, &sfbEnergyC_e ); /*resultant exponent is stored in sfbEnergyC_e*/ + norm_exp = norm_l( pMDCTSpectrumMsInv_fx[strt_cpy] ); + final_exp = sub( pMDCTSpectrumMsInv_e, norm_exp ); + scaled_value = L_shl( pMDCTSpectrumMsInv_fx[strt_cpy], norm_exp ); + sfbEnergyTileR_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR_fx, sfbEnergyTileR_e, Mult_32_32( scaled_value, scaled_value ), shl( final_exp, 1 ), &sfbEnergyTileR_e ); /*resultant exponent is stored in sfbEnergyTileR_e*/ + sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrumMsInv_fx[strt_cpy], pPowerSpectrumMsInv_e, &sfbEnergyTileC_e ); /*resultant exponent is stored in sfbEnergyTileC_e*/ + tileSrcSpec_fx[sub( strt_cpy, tmp )] = pPowerSpectrumMsInv_fx[strt_cpy]; /*resultant exponent is stored in tileSrcSpec_e*/ tileSrcSpec_e = pPowerSpectrumMsInv_e; } ELSE { - sfbEnergyC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyC_fx, sfbEnergyC_e, pPowerSpectrum_fx[sb], pPowerSpectrum_e, &sfbEnergyC_e ); /*resultant exponent is stored in sfbEnergyC_e*/ - sfbEnergyTileR_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR_fx, sfbEnergyTileR_e, Mult_32_32( pMDCTSpectrum_fx[strt_cpy], pMDCTSpectrum_fx[strt_cpy] ), shl( pMDCTSpectrum_e, 1 ), &sfbEnergyTileR_e ); /*resultant exponent is stored in sfbEnergyTileR_e*/ - sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrum_fx[strt_cpy], pPowerSpectrum_e, &sfbEnergyTileC_e ); /*resultant exponent is stored in sfbEnergyTileC_e*/ - tileSrcSpec_fx[sub( strt_cpy, tmp )] = pPowerSpectrum_fx[strt_cpy]; /*resultant exponent is stored in tileSrcSpec_e*/ + sfbEnergyC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyC_fx, sfbEnergyC_e, pPowerSpectrum_fx[sb], pPowerSpectrum_e, &sfbEnergyC_e ); /*resultant exponent is stored in sfbEnergyC_e*/ + norm_exp = norm_l( pMDCTSpectrum_fx[strt_cpy] ); + final_exp = sub( pMDCTSpectrum_e, norm_exp ); + scaled_value = L_shl( pMDCTSpectrum_fx[strt_cpy], norm_exp ); + sfbEnergyTileR_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR_fx, sfbEnergyTileR_e, Mult_32_32( scaled_value, scaled_value ), shl( final_exp, 1 ), &sfbEnergyTileR_e ); /*resultant exponent is stored in sfbEnergyTileR_e*/ + sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrum_fx[strt_cpy], pPowerSpectrum_e, &sfbEnergyTileC_e ); /*resultant exponent is stored in sfbEnergyTileC_e*/ + tileSrcSpec_fx[sub( strt_cpy, tmp )] = pPowerSpectrum_fx[strt_cpy]; /*resultant exponent is stored in tileSrcSpec_e*/ tileSrcSpec_e = pPowerSpectrum_e; } move32(); @@ -1345,10 +1348,11 @@ static void IGF_CalculateStereoEnvelope_fx( } ELSE { - sfbEnergyR_fx = add_sat( EPSILON_FX, BASOP_Util_Divide3216_Scale( sum2_f_32_fx( pMDCTSpectrum_fx + swb_offset[sfb], width, 3 ) /*exp: 2 * pMDCTSpectrum_e + 3*/, width, &sfbEnergyR_e ) ); - sfbEnergyR_e = add( sfbEnergyR_e, add( shl( pMDCTSpectrum_e, 1 ), /*+3 - 15=>-12*/ -12 ) ); /* stores resultant exponent for sfbEnergyR_fx*/ - gain_fx = sfbEnergyR_fx; /*resultant exponent stored in gain_e=sfbEnergyR_e*/ - gain_e = add( sfbEnergyR_e, 16 ); /* because gain_fx is word32;only after adding 16 q of gain_fx is 15-sfbEnergyR_e*/ + tmp_e = pMDCTSpectrum_e; + sfbEnergyR_fx = add_sat( EPSILON_FX, BASOP_Util_Divide3216_Scale( sum2_32_fx( pMDCTSpectrum_fx + swb_offset[sfb], width, &tmp_e ) /*exp: tmp_e*/, width, &sfbEnergyR_e ) ); + sfbEnergyR_e = add( sfbEnergyR_e, add( tmp_e, -15 ) ); /* stores resultant exponent for sfbEnergyR_fx*/ + gain_fx = sfbEnergyR_fx; /*resultant exponent stored in gain_e=sfbEnergyR_e*/ + gain_e = add( sfbEnergyR_e, 16 ); /* because gain_fx is word32;only after adding 16 q of gain_fx is 15-sfbEnergyR_e*/ hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = 0; hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = 0; @@ -1360,20 +1364,20 @@ static void IGF_CalculateStereoEnvelope_fx( move16(); } /*gain=0.5f+log2f(gain)*2+16 becuase 2.885390081777927f=2*1/loge(2) so 2*1/loge(2)*loge(x) can be written as 2*log2(x)*/ - gain_fx = L_add( ONE_IN_Q23, L_add( L_add( BASOP_Util_Log2( gain_fx ), L_shl( gain_e, Q25 ) ), L_shl( 16, Q24 ) ) ); /*Q24*/ + gain_fx = L_add( ONE_IN_Q22, L_add( L_add( L_shr( BASOP_Util_Log2( gain_fx ), 1 ), L_shl( gain_e, Q24 ) ), L_shl( 16, Q23 ) ) ); /*Q23*/ IF( !isTransient && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) ) { - gain_fx = L_add( gain_fx, ONE_IN_Q22 ); /* better preservation of original HF band energy */ + gain_fx = L_add( gain_fx, ONE_IN_Q21 ); /* better preservation of original HF band energy */ } IF( !isTransient && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_64000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_64000_CPE ) ) ) { - gain_fx = L_add( gain_fx, ONE_IN_Q21 ); + gain_fx = L_add( gain_fx, ONE_IN_Q20 ); } - gain_fx = L_min( gain_fx, 91 << Q24 ); /* 13+15+63, see arithcode encode residual */ + gain_fx = L_min( gain_fx, 91 << Q23 ); /* 13+15+63, see arithcode encode residual */ gain_fx = L_max( gain_fx, 0 ); - gain_e = 7; /* stores exponent for gain_fx*/ + gain_e = 8; /* stores exponent for gain_fx*/ move16(); - hPrivateData->igfScfQuantized[sfb] = (Word16) ( L_shr( gain_fx, 24 ) ); /*Q0*/ + hPrivateData->igfScfQuantized[sfb] = (Word16) ( L_shr( gain_fx, 23 ) ); /*Q0*/ } } @@ -1705,7 +1709,7 @@ static int16_t IGF_WriteEnvelope( *-------------------------------------------------------------------*/ /*! r: highPassEnergy */ -static float IGF_ErodeSpectrum( +static float IGF_ErodeSpectrum_ivas( const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ float *pSpectrum, /* i/o: MDCT spectrum */ float *pPowerSpectrum, /* i/o: power spectrum */ @@ -1834,6 +1838,453 @@ static float IGF_ErodeSpectrum( * * calculates the IGF whitening levels by SFM and crest *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +static void IGF_Whitening_ivas_fx( + const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : | instance handle of IGF Encoder */ + Word32 *powerSpectrum, /* i : Q31 | MDCT/MDST power spectrum */ + Word16 *powerSpectrum_e, /* i : Q31 | MDCT/MDST power spectrum */ + const Word16 igfGridIdx, /* i : Q0 | IGF grid index */ + const Word16 isTransient, /* i : Q0 | flag indicating if transient is detected */ + const Word16 last_core_acelp, /* i : Q0 | indicator if last frame was ACELP core */ + const Word16 isTNSActive, /* i : Q0 | indicator if TNS is active */ + const Word16 sp_aud_decision0, /* i : Q0 | first stage classifier decision */ + const Word32 brate, /* i : Q0 | bitrate */ + const Word16 element_mode /* i : Q0 | element mode */ +) +{ + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + Word16 p; /*Q0*/ + Word16 tmp; + Word16 tmp_e; + Word16 SFM_src; + Word16 SFM_tar; + Word16 SFM_src_e; + Word16 SFM_tar_e; + Word16 num_Tiles; + Word16 SFM; + Word16 crest_e; + + SFM = -ONE_IN_Q13; /*1.0f Q13*/ + move16(); + + hPrivateData = &hIGFEnc->igfData; + hGrid = &hPrivateData->igfInfo.grid[(Word16) igfGridIdx]; + + IF( NE_16( igfGridIdx, IGF_GRID_LB_NORM ) ) + { + FOR( p = 0; p < hGrid->nTiles; p++ ) + { + /* reset filter */ + hPrivateData->prevSFM_FIR[p] = L_deposit_l( 0 ); + hPrivateData->prevSFM_IIR[p] = 0; + move16(); + + /* preset values: */ + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; + move16(); + } + } + + FOR( p = 0; p < IGF_MAX_TILES; p++ ) + { + /* update prev data: */ + hPrivateData->igfPrevWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p]; + /* preset values: */ + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; + move16(); + move16(); + } + + test(); + IF( !( isTransient || hPrivateData->wasTransient ) ) + { + IF( powerSpectrum ) + { + FOR( p = 0; p < hGrid->nTiles; p++ ) + { + Word16 sb; + + IF( isTNSActive ) + { + FOR( sb = hGrid->tile[p]; sb < hGrid->tile[p + 1]; sb++ ) + { + IF( LT_32( powerSpectrum[sb], 1 ) ) + hPrivateData->logSpec[sb] = 0; /* max(0,FLT_MIN_EXP )*/ + ELSE + hPrivateData->logSpec[sb] = extract_l( L_max( 0, L_shr( L_add( BASOP_Util_Log2( powerSpectrum[sb] ), L_shl( *powerSpectrum_e, Q25 ) ), Q25 ) ) ); + move16(); + } + } + + /* if current tile contains only a single SFB, reuse already computed SFM values */ + test(); + IF( GT_16( element_mode, EVS_MONO ) && EQ_16( sub( hGrid->sfbWrap[p + 1], hGrid->sfbWrap[p] ), 1 ) ) + { + tmp = hPrivateData->SFM_tb_fx[p]; + tmp_e = hPrivateData->sfb_tb_e[p]; + move16(); + move16(); + } + ELSE + { + tmp = BASOP_Util_Divide1616_Scale( IGF_getSFM_new_fx( powerSpectrum, hPrivateData->logSpec, hGrid->tile[p], hGrid->tile[p + 1], *powerSpectrum_e ), IGF_getCrest_new_fx( hPrivateData->logSpec, hGrid->tile[p], hGrid->tile[p + 1], &crest_e ), &tmp_e ); + tmp_e = sub( tmp_e, crest_e ); + } + + test(); + IF( last_core_acelp || hPrivateData->wasTransient ) + { + hPrivateData->prevSFM_FIR[p] = L_shl( tmp, add( 1, tmp_e ) ); /*16-(15-exp)=>15Q16*/ + hPrivateData->prevSFM_IIR[p] = shl( tmp, sub( tmp_e, 2 ) ); /*13-(15-exp)=>2Q13*/ + move32(); + move16(); + } + + test(); + IF( LE_32( brate, IVAS_48k ) && EQ_16( element_mode, IVAS_CPE_MDCT ) ) + { + Word16 temp; + num_Tiles = 0; + SFM_src = 0; + SFM_tar = 0; + SFM_src_e = 0; + SFM_tar_e = 0; + move16(); + move16(); + move16(); + move16(); + move16(); + + FOR( sb = hGrid->sfbWrap[p]; sb < hGrid->sfbWrap[p + 1]; sb++ ) + { + num_Tiles = add( num_Tiles, 1 ); + SFM_src_e = BASOP_Util_Add_MantExp( hPrivateData->SFM_sb_fx[sb], hPrivateData->sfb_sb_e[sb], SFM_src, SFM_src_e, &SFM_src ); + SFM_tar_e = BASOP_Util_Add_MantExp( hPrivateData->SFM_tb_fx[sb], hPrivateData->sfb_tb_e[sb], SFM_tar, SFM_tar_e, &SFM_tar ); + } + + /* compute the average */ + SFM_src = shr( BASOP_Util_Divide1616_Scale( SFM_src, num_Tiles, &temp ), 2 ); + SFM_src_e = add( SFM_src_e, sub( temp, 13 ) ); /*temp-15+2:because right shifted by 2 which are the guard bits*/ + SFM_tar = shr( BASOP_Util_Divide1616_Scale( SFM_tar, num_Tiles, &temp ), 2 ); + SFM_tar_e = add( SFM_tar_e, sub( temp, 13 ) ); /*temp-15+2:because right shifted by 2 which are the guard bits*/ + + IF( LT_16( SFM_tar_e, SFM_src_e ) ) + { + SFM_tar = shl( SFM_tar, sub( SFM_tar_e, SFM_src_e ) ); /*making the q for SFM_tar and SFM_src equal with 2 as guard bits*/ + SFM_tar_e = SFM_src_e; + } + ELSE + { + SFM_src = shr( SFM_src, sub( SFM_tar_e, SFM_src_e ) ); /*making the q for SFM_tar and SFM_src equal with 2 as guard bits*/ + SFM_src_e = SFM_tar_e; + } + move16(); + + test(); + test(); + IF( ( p > 0 ) && ( EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_SWB_48000_CPE ) || EQ_16( hPrivateData->igfInfo.bitRateIndex, IGF_BITRATE_FB_48000_CPE ) ) ) + { + test(); + if ( EQ_16( p, 1 ) && EQ_16( abs_s( sub( hPrivateData->igfCurrWhiteningLevel[0], hPrivateData->igfCurrWhiteningLevel[1] ) ), 2 ) ) /* OFF vs. STRONG */ + { + hPrivateData->igfCurrWhiteningLevel[0] = IGF_WHITENING_MID; + move16(); + } + hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p - 1]; + move16(); + } + ELSE IF( sp_aud_decision0 ) + { + /* Music */ + /* whitening Off: when tonality of target is more than source or tonality of target is close to that of source */ + test(); + if ( LE_16( SFM_tar, SFM_src ) || LE_32( SFM_tar, L_add( SFM_src, L_shl( 1, sub( 14, SFM_src_e /*0.5 with exponent SFM_src_e*/ ) ) ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; + move16(); + } + + /* whitening mid: */ + test(); + if ( GT_32( SFM_tar, L_add( SFM_src, L_shl( 1, sub( 14, SFM_src_e /*0.5 with exponent SFM_src_e*/ ) ) ) ) && LE_32( SFM_tar, L_add( SFM_src, L_shl( 5, sub( 13, SFM_src_e ) ) /*1.25 with exponent SFM_src_e*/ ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID; + move16(); + } + + /* whitening strong */ + if ( GT_32( SFM_tar, L_add( SFM_src, L_shl( 5, sub( 13, SFM_src_e ) ) /*1.25 with exponent SFM_src_e*/ ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG; + move16(); + } + } + ELSE + { + /* Speech */ + /* whitening Off: when tonality of target is more than source or tonality of target is close to that of source */ + test(); + if ( LE_16( SFM_tar, SFM_src ) || LE_32( SFM_tar, L_add( SFM_src, L_shr( 3277 /*0.1 Q15*/, SFM_src_e ) ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; + move16(); + } + + /* whitening mid: */ + test(); + if ( GT_32( SFM_tar, L_add( SFM_src, L_shr( 3277 /*0.1 Q15*/, SFM_src_e ) ) ) && LE_32( SFM_tar, L_add( SFM_src, L_shl( 1, sub( 14, SFM_src_e /*0.5 with exponent SFM_src_e*/ ) ) ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID; + move16(); + } + + /* whitening strong */ + if ( GT_32( SFM_tar, L_add( SFM_src, L_shl( 1, sub( 14, SFM_src_e /*0.5 with exponent SFM_src_e*/ ) ) ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG; + move16(); + } + } + + SFM = shl( SFM_tar, sub( SFM_tar_e, 2 ) ); /*2Q13*/ + } + ELSE + { + test(); + IF( GT_16( element_mode, EVS_MONO ) && EQ_16( sub( hGrid->sfbWrap[p + 1], hGrid->sfbWrap[p] ), 1 ) ) + { + SFM = shl( tmp, sub( tmp_e, 2 ) ); /*2Q13*/ + } + ELSE + { + Word32 temp; + temp = L_add( L_shl( tmp, sub( tmp_e, 2 ) ), L_add( L_shr( hPrivateData->prevSFM_FIR[p], 3 ), L_shr( hPrivateData->prevSFM_IIR[p], 1 ) ) ); + SFM = extract_l( L_min( 22118 /*2.7*/, temp ) ); /*2Q13*/ + } + hPrivateData->prevSFM_FIR[p] = L_shl( tmp, add( 1, tmp_e ) ); /*15Q16*/ + hPrivateData->prevSFM_IIR[p] = SFM; + move32(); + move16(); + + IF( GT_16( SFM, hGrid->whiteningThreshold[1][p] ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_STRONG; + move16(); + } + ELSE IF( GT_16( SFM, hGrid->whiteningThreshold[0][p] ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID; + move16(); + } + ELSE + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_OFF; + move16(); + } + } + + IF( GT_16( element_mode, EVS_MONO ) ) + { + IF( last_core_acelp ) /* reset */ + { + set16_fx( hPrivateData->igfPastSFM_fx[p], -ONE_IN_Q13, IGF_PAST_SFM_LEN ); + hPrivateData->igfWhiteningHangoverCnt[p] = 2; + move16(); + } + ELSE + { + test(); + test(); + test(); + test(); + /* check whether change in whitening level should be allowed or not (if SFM is inside a certain margin around thresholds) */ + IF( NE_16( hPrivateData->igfCurrWhiteningLevel[p], hPrivateData->igfPrevWhiteningLevel[p] ) && + ( ( GT_32( SFM, L_sub( hGrid->whiteningThreshold[0][p], 1229 /*0.15f Q13*/ ) ) && LT_32( SFM, L_add( hGrid->whiteningThreshold[0][p], 1229 ) ) ) || + ( GT_32( SFM, L_sub( hGrid->whiteningThreshold[1][p], 1229 ) ) && LT_32( SFM, L_add( hGrid->whiteningThreshold[1][p], 1229 ) ) ) ) ) + { + Word16 mean_past_SFM; + Word16 mean_past_SFM_e; + Word16 countable; + Word16 i; + mean_past_SFM = 0; + mean_past_SFM_e = 0; + countable = 0; + move16(); + move16(); + move16(); + + /* compute mean of last (available) SFM values */ + FOR( i = 0; i < IGF_PAST_SFM_LEN; i++ ) + { + IF( hPrivateData->igfPastSFM_fx[p][i] >= 0 ) + { + mean_past_SFM_e = BASOP_Util_Add_MantExp( mean_past_SFM, mean_past_SFM_e, hPrivateData->igfPastSFM_fx[p][i], 2, &mean_past_SFM ); + countable = add( countable, 1 ); + } + } + IF( countable ) + { + Word16 temp; + mean_past_SFM = BASOP_Util_Divide1616_Scale( mean_past_SFM, countable, &temp ); + mean_past_SFM_e = add( mean_past_SFM_e, sub( temp, 15 ) ); + mean_past_SFM = shl( mean_past_SFM, sub( mean_past_SFM_e, 2 ) ); /*mean_past_SFM_e=2*/ + /* deny change in whitening level for small deviations from mean SFM */ + if ( LT_16( abs_s( sub( SFM, mean_past_SFM ) ), 1638 ) /*0.2 in Q13*/ ) + { + hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfPrevWhiteningLevel[p]; + move16(); + } + } + } + } + + hPrivateData->igfPastSFM_fx[p][hPrivateData->igfPastSFM_pos] = SFM; /*2Q13*/ + move16(); + } + } + + SWITCH( hPrivateData->igfInfo.bitRateIndex ) + { + case IGF_BITRATE_WB_9600: + case IGF_BITRATE_RF_WB_13200: + case IGF_BITRATE_WB_13200_CPE: + case IGF_BITRATE_WB_16400_CPE: + case IGF_BITRATE_RF_SWB_13200: + case IGF_BITRATE_SWB_9600: + case IGF_BITRATE_SWB_13200_CPE: + case IGF_BITRATE_SWB_16400: + case IGF_BITRATE_SWB_24400: + case IGF_BITRATE_SWB_24400_CPE: + case IGF_BITRATE_SWB_32000_CPE: + case IGF_BITRATE_SWB_32000: + case IGF_BITRATE_FB_16400: + case IGF_BITRATE_FB_24400: + case IGF_BITRATE_FB_24400_CPE: + case IGF_BITRATE_FB_32000_CPE: + case IGF_BITRATE_FB_32000: + hPrivateData->igfCurrWhiteningLevel[hGrid->nTiles - 1] = hPrivateData->igfCurrWhiteningLevel[hGrid->nTiles - 2]; + move16(); + break; + default: + break; + } + } + ELSE + { + FOR( p = 0; p < hGrid->nTiles; p++ ) + { + hPrivateData->igfCurrWhiteningLevel[p] = IGF_WHITENING_MID; + move16(); + } + } + } + ELSE + { + /* reset filter */ + FOR( p = 0; p < IGF_MAX_TILES; p++ ) + { + hPrivateData->prevSFM_FIR[p] = L_deposit_l( 0 ); + hPrivateData->prevSFM_IIR[p] = 0; + move32(); + move16(); + } + } + + IF( GT_16( element_mode, EVS_MONO ) ) + { + IF( EQ_16( SFM, -ONE_IN_Q13 /*1.0f 2Q13*/ ) ) /* reset */ + { + FOR( p = 0; p < hGrid->nTiles; p++ ) + { + set16_fx( hPrivateData->igfPastSFM_fx[p], -ONE_IN_Q13, IGF_PAST_SFM_LEN ); + hPrivateData->igfWhiteningHangoverCnt[p] = 2; + move16(); + } + } + + /* vibrato handling */ + FOR( p = 0; p < hGrid->nTiles; p = p + 2 ) + { + test(); + test(); + test(); + IF( ( EQ_16( hPrivateData->igfPrevWhiteningLevel[p], IGF_WHITENING_OFF ) && NE_16( hPrivateData->igfCurrWhiteningLevel[p], IGF_WHITENING_OFF ) ) || + ( EQ_16( hPrivateData->igfPrevWhiteningLevel[p + 1], IGF_WHITENING_OFF ) && NE_16( hPrivateData->igfCurrWhiteningLevel[p + 1], IGF_WHITENING_OFF ) ) ) + { + Word16 i; + Word16 pastSfm_a[4], pastSfm_b[4]; + Word16 pastSfmDiffSum_a, pastSfmDiffSum_b; + + FOR( i = 0; i < 4; i++ ) + { + pastSfm_a[i] = hPrivateData->igfPastSFM_fx[p][add( hPrivateData->igfPastSFM_pos, sub( 4, i ) ) % IGF_PAST_SFM_LEN]; + pastSfm_b[i] = hPrivateData->igfPastSFM_fx[p + 1][add( hPrivateData->igfPastSFM_pos, sub( 4, i ) ) % IGF_PAST_SFM_LEN]; + move16(); + move16(); + } + pastSfmDiffSum_a = pastSfmDiffSum_b = 0; + move16(); + move16(); + FOR( i = 0; i < 3; i++ ) + { + IF( NE_16( pastSfm_a[i + 1], -ONE_IN_Q13 ) ) + { + pastSfmDiffSum_a = add( pastSfmDiffSum_a, sub( pastSfm_a[i], pastSfm_a[i + 1] ) ); + pastSfmDiffSum_b = add( pastSfmDiffSum_b, sub( pastSfm_b[i], pastSfm_b[i + 1] ) ); + } + ELSE + { + break; + } + } + + /* if tonality oscillates between two tiles, turn whitening off in both */ + IF( ( ( pastSfmDiffSum_a > 0 && pastSfmDiffSum_b < 0 ) || + ( pastSfmDiffSum_a < 0 && pastSfmDiffSum_b > 0 ) ) && + ( GT_16( abs_s( sub( pastSfmDiffSum_a, pastSfmDiffSum_b ) ), ONE_IN_Q13 ) ) ) + { + hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfCurrWhiteningLevel[p + 1] = IGF_WHITENING_OFF; + move16(); + move16(); + } + } + } + + /* hangover */ + FOR( p = 0; p < hGrid->nTiles; p++ ) + { + IF( NE_16( hPrivateData->igfCurrWhiteningLevel[p], hPrivateData->igfPrevWhiteningLevel[p] ) ) + { + hPrivateData->igfWhiteningHangoverCnt[p] = add( hPrivateData->igfWhiteningHangoverCnt[p], 1 ); + IF( EQ_16( hPrivateData->igfWhiteningHangoverCnt[p], 3 ) ) + { + hPrivateData->igfWhiteningHangoverCnt[p] = 0; + } + ELSE + { + hPrivateData->igfCurrWhiteningLevel[p] = hPrivateData->igfPrevWhiteningLevel[p]; + } + move16(); + move16(); + } + ELSE + { + hPrivateData->igfWhiteningHangoverCnt[p] = 0; + move16(); + } + } + + hPrivateData->igfPastSFM_pos = add( hPrivateData->igfPastSFM_pos, 1 ) % IGF_PAST_SFM_LEN; + move16(); + } + + hPrivateData->wasTransient = isTransient; + move16(); + + return; +} +#endif // IVAS_FLOAT_FIXED static void IGF_Whitening( const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : | instance handle of IGF Encoder */ @@ -2676,7 +3127,7 @@ void IGFEncApplyMono( IGF_Whitening( st->hIGFEnc, pPowerSpectrumParameter, igfGridIdx, st->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, isTNSActive, sp_aud_decision0, ( st->element_mode == IVAS_CPE_MDCT ? st->element_brate : st->total_brate ), st->element_mode ); - IGF_ErodeSpectrum( st->hIGFEnc, pMDCTSpectrum, pPowerSpectrumParameter, igfGridIdx, 0 ); + IGF_ErodeSpectrum_ivas( st->hIGFEnc, pMDCTSpectrum, pPowerSpectrumParameter, igfGridIdx, 0 ); return; } @@ -2697,26 +3148,14 @@ void IGFEncApplyStereo_fx( Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ -#if 1 - float *pPowerSpectrum[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - float *pPowerSpectrumMsInv[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ - float *inv_spectrum[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ -#endif - const Word16 frameno, /* i : flag indicating index of current subfr. */ - const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ - const Word32 element_brate, /* i : element bitrate */ - const Word16 mct_on /* i : flag mct block (1) or stereo (0) */ + const Word16 frameno, /* i : flag indicating index of current subfr. */ + const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 mct_on /* i : flag mct block (1) or stereo (0) */ ) { - UNUSED_PARAM( pPowerSpectrum_fx ); - UNUSED_PARAM( pPowerSpectrumMsInv_fx ); -#if 1 - float *pPowerSpectrumParameter[NB_DIV]; /* If it is NULL it informs a function that specific handling is needed */ - float *pPowerSpectrumParameterMsInv[NB_DIV]; -#endif - Word16 inv_spectrum_e = 0; - Word16 pPowerSpectrumParameterMsInv_e = 0; - Word16 pPowerSpectrumParameter_e = 0; + UNUSED_PARAM( mct_on ); + Word16 highPassEner_exp; Word32 *pPowerSpectrumParameter_fx[NB_DIV]; /* If it is NULL it informs a function that specific handling is needed */ Word32 *pPowerSpectrumParameterMsInv_fx[NB_DIV]; Word16 coreMsMask[N_MAX]; @@ -2741,7 +3180,7 @@ void IGFEncApplyStereo_fx( { sfbConf = &hStereoMdct->stbParamsTCX10; } - IF( EQ_16( sts[0]->last_core, ACELP_CORE ) ) + if ( EQ_16( sts[0]->last_core, ACELP_CORE ) ) { sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; } @@ -2757,12 +3196,6 @@ void IGFEncApplyStereo_fx( test(); IF( EQ_16( sts[0]->core, TCX_20_CORE ) && !sts[0]->hTcxEnc->fUseTns[frameno] && !sts[1]->hTcxEnc->fUseTns[frameno] ) { -#if 1 - pPowerSpectrumParameter[0] = &pPowerSpectrum[0][0]; - pPowerSpectrumParameter[1] = &pPowerSpectrum[1][0]; - pPowerSpectrumParameterMsInv[0] = pPowerSpectrumMsInv[0][0]; - pPowerSpectrumParameterMsInv[1] = pPowerSpectrumMsInv[1][0]; -#endif pPowerSpectrumParameter_fx[0] = &pPowerSpectrum_fx[0][0]; pPowerSpectrumParameter_fx[1] = &pPowerSpectrum_fx[1][0]; pPowerSpectrumParameterMsInv_fx[0] = pPowerSpectrumMsInv_fx[0][0]; @@ -2770,12 +3203,6 @@ void IGFEncApplyStereo_fx( } ELSE { -#if 1 - pPowerSpectrumParameter[0] = NULL; - pPowerSpectrumParameter[1] = NULL; - pPowerSpectrumParameterMsInv[0] = NULL; - pPowerSpectrumParameterMsInv[1] = NULL; -#endif pPowerSpectrumParameter_fx[0] = NULL; pPowerSpectrumParameter_fx[1] = NULL; pPowerSpectrumParameterMsInv_fx[0] = NULL; @@ -2783,66 +3210,24 @@ void IGFEncApplyStereo_fx( } FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - last_core_acelp = (Word16) EQ_16( sts[ch]->last_core, ACELP_CORE ); + last_core_acelp = extract_l( EQ_16( sts[ch]->last_core, ACELP_CORE ) ); IGF_UpdateInfo( hIGFEnc[ch], igfGridIdx ); -#if 1 /*************************************flt to fix conversion****************************************************/ - IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; - H_IGF_GRID hGrid; - Word16 *swb_offset; - hPrivateData = &hIGFEnc[ch]->igfData; - hGrid = &hPrivateData->igfInfo.grid[(Word16) igfGridIdx]; - swb_offset = hGrid->swb_offset; - f2me_buf( sts[ch]->hTcxEnc->spectrum[frameno], sts[ch]->hTcxEnc->spectrum_fx[frameno], &sts[ch]->hTcxEnc->spectrum_e[frameno], swb_offset[hGrid->sfbWrap[hGrid->nTiles]] ); - IF( pPowerSpectrumParameter[ch] ) - f2me_buf( pPowerSpectrumParameter[ch], pPowerSpectrumParameter_fx[ch], &pPowerSpectrumParameter_e, swb_offset[hGrid->sfbWrap[hGrid->nTiles]] ); - f2me_buf( inv_spectrum[ch][frameno], inv_spectrum_fx[ch][frameno], &inv_spectrum_e, swb_offset[hGrid->sfbWrap[hGrid->nTiles]] ); - IF( pPowerSpectrumParameterMsInv[ch] ) - f2me_buf( pPowerSpectrumParameterMsInv[ch], pPowerSpectrumParameterMsInv_fx[ch], &pPowerSpectrumParameterMsInv_e, swb_offset[hGrid->sfbWrap[hGrid->nTiles]] ); - float max_sb = 0; - float max_tb = 0; - Word16 max_sb_fx = 0; - Word16 max_tb_fx = 0; - for ( sfb = 0; sfb < 23; sfb++ ) + IGF_CalculateStereoEnvelope_fx( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum_fx[frameno], sts[ch]->hTcxEnc->spectrum_e[frameno], inv_spectrum_fx[ch][frameno], sts[ch]->hTcxEnc->spectrum_e[frameno], pPowerSpectrumParameter_fx[ch], sts[ch]->hTcxEnc->spectrum_e[frameno], pPowerSpectrumParameterMsInv_fx[ch], sts[ch]->hTcxEnc->spectrum_e[frameno], igfGridIdx, coreMsMask, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp ); + + IF( EQ_16( sts[ch]->core, TCX_20_CORE ) ) { - f2me_16( hPrivateData->prevDampingFactor_IIR[sfb], &hPrivateData->prevDampingFactor_IIR_fx[sfb], &hPrivateData->prevDampingFactor_IIR_e[sfb] ); - max_tb = max( fabsf( hPrivateData->prevSFM_FIR_SFB_TB[sfb] ), max_tb ); - max_tb = max( fabsf( hPrivateData->prevSFM_IIR_SFB_TB[sfb] ), max_tb ); - max_tb = max( fabsf( hPrivateData->SFM_tb[sfb] ), max_tb ); - max_sb = max( fabsf( hPrivateData->SFM_sb[sfb] ), max_sb ); - max_sb = max( fabsf( hPrivateData->prevSFM_FIR_SFB_SB[sfb] ), max_sb ); - max_sb = max( fabsf( hPrivateData->prevSFM_IIR_SFB_SB[sfb] ), max_sb ); - f2me_16( max_tb, &max_tb_fx, &hPrivateData->sfb_tb_e[sfb] ); - f2me_16( max_sb, &max_sb_fx, &hPrivateData->sfb_sb_e[sfb] ); - if ( sub( 15, hPrivateData->sfb_tb_e[sfb] ) < 0 || sub( 15, hPrivateData->sfb_sb_e[sfb] ) < 0 ) - continue; - hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = float_to_fix16( hPrivateData->prevSFM_FIR_SFB_TB[sfb], sub( 15, hPrivateData->sfb_tb_e[sfb] ) ); - hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = float_to_fix16( hPrivateData->prevSFM_IIR_SFB_TB[sfb], sub( 15, hPrivateData->sfb_tb_e[sfb] ) ); - hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = float_to_fix16( hPrivateData->prevSFM_FIR_SFB_SB[sfb], sub( 15, hPrivateData->sfb_sb_e[sfb] ) ); - hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = float_to_fix16( hPrivateData->prevSFM_IIR_SFB_SB[sfb], sub( 15, hPrivateData->sfb_sb_e[sfb] ) ); + pPowerSpectrumParameter_fx[ch] = pPowerSpectrum_fx[ch]; } -#endif /**********************************flt to fix ends here*******************************************************/ - IGF_CalculateStereoEnvelope_fx( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum_fx[frameno], sts[ch]->hTcxEnc->spectrum_e[frameno], inv_spectrum_fx[ch][frameno], inv_spectrum_e, pPowerSpectrumParameter_fx[ch], pPowerSpectrumParameter_e, pPowerSpectrumParameterMsInv_fx[ch], pPowerSpectrumParameterMsInv_e, igfGridIdx, coreMsMask, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp ); -#if 1 /*************************************fix to flt conversion****************************************************/ - for ( sfb = 0; sfb < 23; sfb++ ) + ELSE { - hPrivateData->prevSFM_FIR_SFB_TB[sfb] = me2f_16( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], hPrivateData->sfb_tb_e[sfb] ); - hPrivateData->prevSFM_IIR_SFB_TB[sfb] = me2f_16( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], hPrivateData->sfb_tb_e[sfb] ); - hPrivateData->prevSFM_FIR_SFB_SB[sfb] = me2f_16( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], hPrivateData->sfb_sb_e[sfb] ); - hPrivateData->prevSFM_IIR_SFB_SB[sfb] = me2f_16( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], hPrivateData->sfb_sb_e[sfb] ); - hPrivateData->SFM_tb[sfb] = me2f_16( hPrivateData->SFM_tb_fx[sfb], hPrivateData->sfb_tb_e[sfb] ); - hPrivateData->SFM_sb[sfb] = me2f_16( hPrivateData->SFM_sb_fx[sfb], hPrivateData->sfb_sb_e[sfb] ); - hPrivateData->prevDampingFactor_IIR[sfb] = me2f_16( hPrivateData->prevDampingFactor_IIR_fx[sfb], hPrivateData->prevDampingFactor_IIR_e[sfb] ); + pPowerSpectrumParameter_fx[ch] = NULL; } -#endif /**********************************fix to flt ends here*******************************************************/ - pPowerSpectrumParameter[ch] = sts[ch]->core == TCX_20_CORE ? pPowerSpectrum[ch] : NULL; - - IGF_Whitening( hIGFEnc[ch], pPowerSpectrumParameter[ch], igfGridIdx, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, ( sts[0]->hTcxEnc->fUseTns[frameno] || sts[1]->hTcxEnc->fUseTns[frameno] ), sp_aud_decision0, element_brate, sts[ch]->element_mode ); + IGF_Whitening_ivas_fx( hIGFEnc[ch], pPowerSpectrumParameter_fx[ch], &sts[ch]->hTcxEnc->spectrum_e[frameno], igfGridIdx, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, ( sts[0]->hTcxEnc->fUseTns[frameno] || sts[1]->hTcxEnc->fUseTns[frameno] ), sp_aud_decision0, element_brate, sts[ch]->element_mode ); - IGF_ErodeSpectrum( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum[frameno], pPowerSpectrumParameter[ch], igfGridIdx, mct_on ); + IGF_ErodeSpectrum( &highPassEner_exp, hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum_fx[frameno], pPowerSpectrumParameter_fx[ch], sts[ch]->hTcxEnc->spectrum_e[frameno], igfGridIdx ); } - return; } #endif // IVAS_FLOAT_FIXED @@ -2918,7 +3303,7 @@ void IGFEncApplyStereo( IGF_Whitening( hIGFEnc[ch], pPowerSpectrumParameter[ch], igfGridIdx, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, ( sts[0]->hTcxEnc->fUseTns[frameno] || sts[1]->hTcxEnc->fUseTns[frameno] ), sp_aud_decision0, element_brate, sts[ch]->element_mode ); - IGF_ErodeSpectrum( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum[frameno], pPowerSpectrumParameter[ch], igfGridIdx, mct_on ); + IGF_ErodeSpectrum_ivas( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum[frameno], pPowerSpectrumParameter[ch], igfGridIdx, mct_on ); } return; diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index 184f9e9ee..b179794af 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -365,12 +365,12 @@ static void IGF_WriteEnvelope( /**< ou /**********************************************************************/ /* identifies significant spectral content **************************************************************************/ -static void IGF_ErodeSpectrum( Word16 *highPassEner_exp, /**< out: | exponent of highPassEner */ - const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ - Word32 *pSpectrum, /**< in/out: | MDCT spectrum */ - Word32 *pPowerSpectrum, /**< in/out: | power spectrum */ - Word16 pPowerSpectrum_exp, /**< in: | exponent of power spectrum */ - const Word16 igfGridIdx /**< in: Q0 | IGF grid index */ +void IGF_ErodeSpectrum( Word16 *highPassEner_exp, /**< out: | exponent of highPassEner */ + const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ + Word32 *pSpectrum, /**< in/out: | MDCT spectrum */ + Word32 *pPowerSpectrum, /**< in/out: | power spectrum */ + Word16 pPowerSpectrum_exp, /**< in: | exponent of power spectrum */ + const Word16 igfGridIdx /**< in: Q0 | IGF grid index */ ) { IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index e24df2607..3a9cf28d4 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -810,10 +810,6 @@ ivas_error init_encoder( st->hTcxEnc->spectrum[0] = st->hTcxEnc->spectrum_long; st->hTcxEnc->spectrum[1] = st->hTcxEnc->spectrum_long + N_TCX10_MAX; -#ifdef IVAS_FLOAT_FIXED - st->hTcxEnc->spectrum_fx[0] = st->hTcxEnc->spectrum_long_fx; - st->hTcxEnc->spectrum_fx[1] = st->hTcxEnc->spectrum_long_fx + N_TCX10_MAX; -#endif set_f( st->hTcxEnc->old_out, 0, L_FRAME32k ); diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index e414f2f04..fec37122b 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -2138,6 +2138,13 @@ Word16 IGF_getSFM( /**< out: Q15| SFM value const Word16 stop /**< in: Q0 | stop subband index */ ); /* IGFEnc.c */ +void IGF_ErodeSpectrum( Word16 *highPassEner_exp, /**< out: | exponent of highPassEner */ + const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ + Word32 *pSpectrum, /**< in/out: | MDCT spectrum */ + Word32 *pPowerSpectrum, /**< in/out: | power spectrum */ + Word16 pPowerSpectrum_exp, /**< in: | exponent of power spectrum */ + const Word16 igfGridIdx /**< in: Q0 | IGF grid index */ +); void IGFEncApplyMono_fx( const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ const Word16 igfGridIdx, /**< in: Q0 | IGF grid index */ Encoder_State *st, /**< in: | Encoder state */ diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 335b3061a..9b95d1143 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -689,7 +689,8 @@ typedef struct igf_enc_private_data_struct Word16 SFM_sb_fx[IGF_MAX_SFB]; Word16 prevDampingFactor_IIR_fx[IGF_MAX_SFB]; Word16 prevDampingFactor_IIR_e[IGF_MAX_SFB]; -#endif // IVAS_FLOAT_FIXED + Word16 igfPastSFM_fx[IGF_MAX_TILES][IGF_PAST_SFM_LEN]; /*2Q13*/ +#endif // IVAS_FLOAT_FIXED float prevSFM_FIR_SFB_TB[IGF_MAX_SFB]; float prevSFM_IIR_SFB_TB[IGF_MAX_SFB]; @@ -711,7 +712,7 @@ typedef struct igf_enc_private_data_struct float prevSFM_FIR_flt[IGF_MAX_TILES]; float prevSFM_IIR_flt[IGF_MAX_TILES]; Word32 prevSFM_FIR[IGF_MAX_TILES]; /* 15Q16 */ - Word16 prevSFM_IIR[IGF_MAX_TILES]; + Word16 prevSFM_IIR[IGF_MAX_TILES]; /* 2Q13 */ int16_t wasTransient; UWord8 igfBitstream[IGF_BITBUFSIZE / 8]; diff --git a/lib_enc/tcx_utils_enc.c b/lib_enc/tcx_utils_enc.c index 5c314cd79..5d844ba5b 100644 --- a/lib_enc/tcx_utils_enc.c +++ b/lib_enc/tcx_utils_enc.c @@ -1638,7 +1638,87 @@ void ProcessStereoIGF_fx( IGFSaveSpectrumForITF( hIGFEnc[1], igfGridIdx, pITFMDCTSpectrum[1][frameno] ); - IGFEncApplyStereo_fx( hStereoMdct, ms_mask, hIGFEnc, igfGridIdx, sts, pPowerSpectrum_fx, pPowerSpectrumMsInv_fx, inv_spectrum_fx, pPowerSpectrum, pPowerSpectrumMsInv, inv_spectrum, frameno, sp_aud_decision0, element_brate, mct_on ); +#if 1 /*************************************flt to fix conversion****************************************************/ + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + Word16 *swb_offset; + hPrivateData = &hIGFEnc[ch]->igfData; + hGrid = &hPrivateData->igfInfo.grid[(Word16) igfGridIdx]; + swb_offset = hGrid->swb_offset; + sts[ch]->hTcxEnc->spectrum_e[frameno] = 31 - Q_factor_arrL( sts[ch]->hTcxEnc->spectrum[frameno], hGrid->infoGranuleLen ); + sts[ch]->hTcxEnc->spectrum_e[frameno] = s_max( sts[ch]->hTcxEnc->spectrum_e[frameno], 31 - Q_factor_arrL( &pPowerSpectrum[ch][0], hGrid->infoGranuleLen ) ); + sts[ch]->hTcxEnc->spectrum_e[frameno] = s_max( sts[ch]->hTcxEnc->spectrum_e[frameno], 31 - Q_factor_arrL( inv_spectrum[ch][frameno], swb_offset[hGrid->sfbWrap[hGrid->nTiles]] ) ); + sts[ch]->hTcxEnc->spectrum_e[frameno] = s_max( sts[ch]->hTcxEnc->spectrum_e[frameno], 31 - Q_factor_arrL( pPowerSpectrumMsInv[ch][0], swb_offset[hGrid->sfbWrap[hGrid->nTiles]] ) ); + floatToFixed_arr32( sts[ch]->hTcxEnc->spectrum[frameno], sts[ch]->hTcxEnc->spectrum_fx[frameno], 31 - sts[ch]->hTcxEnc->spectrum_e[frameno], hGrid->infoGranuleLen ); + floatToFixed_arr32( &pPowerSpectrum[ch][0], &pPowerSpectrum_fx[ch][0], 31 - sts[ch]->hTcxEnc->spectrum_e[frameno], hGrid->infoGranuleLen ); + floatToFixed_arr32( inv_spectrum[ch][frameno], inv_spectrum_fx[ch][frameno], 31 - sts[ch]->hTcxEnc->spectrum_e[frameno], swb_offset[hGrid->sfbWrap[hGrid->nTiles]] ); + floatToFixed_arr32( pPowerSpectrumMsInv[ch][0], pPowerSpectrumMsInv_fx[ch][0], 31 - sts[ch]->hTcxEnc->spectrum_e[frameno], swb_offset[hGrid->sfbWrap[hGrid->nTiles]] ); + float max_sb = 0; + float max_tb = 0; + Word16 max_sb_fx = 0; + Word16 max_tb_fx = 0; + for ( Word16 sfb = 0; sfb < 23; sfb++ ) + { + f2me_16( hPrivateData->prevDampingFactor_IIR[sfb], &hPrivateData->prevDampingFactor_IIR_fx[sfb], &hPrivateData->prevDampingFactor_IIR_e[sfb] ); + max_tb = max( fabsf( hPrivateData->prevSFM_FIR_SFB_TB[sfb] ), max_tb ); + max_tb = max( fabsf( hPrivateData->prevSFM_IIR_SFB_TB[sfb] ), max_tb ); + max_tb = max( fabsf( hPrivateData->SFM_tb[sfb] ), max_tb ); + max_sb = max( fabsf( hPrivateData->SFM_sb[sfb] ), max_sb ); + max_sb = max( fabsf( hPrivateData->prevSFM_FIR_SFB_SB[sfb] ), max_sb ); + max_sb = max( fabsf( hPrivateData->prevSFM_IIR_SFB_SB[sfb] ), max_sb ); + f2me_16( max_tb, &max_tb_fx, &hPrivateData->sfb_tb_e[sfb] ); + f2me_16( max_sb, &max_sb_fx, &hPrivateData->sfb_sb_e[sfb] ); + hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb] = float_to_fix16( hPrivateData->prevSFM_FIR_SFB_TB[sfb], sub( 15, hPrivateData->sfb_tb_e[sfb] ) ); + hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb] = float_to_fix16( hPrivateData->prevSFM_IIR_SFB_TB[sfb], sub( 15, hPrivateData->sfb_tb_e[sfb] ) ); + hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb] = float_to_fix16( hPrivateData->prevSFM_FIR_SFB_SB[sfb], sub( 15, hPrivateData->sfb_sb_e[sfb] ) ); + hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb] = float_to_fix16( hPrivateData->prevSFM_IIR_SFB_SB[sfb], sub( 15, hPrivateData->sfb_sb_e[sfb] ) ); + hPrivateData->SFM_tb_fx[sfb] = float_to_fix16( hPrivateData->SFM_tb[sfb], sub( 15, hPrivateData->sfb_tb_e[sfb] ) ); + hPrivateData->SFM_sb_fx[sfb] = float_to_fix16( hPrivateData->SFM_sb[sfb], sub( 15, hPrivateData->sfb_sb_e[sfb] ) ); + } + for ( int i = 0; i < IGF_MAX_TILES; i++ ) + { + hPrivateData->prevSFM_FIR[i] = float_to_fix( hPrivateData->prevSFM_FIR_flt[i], 16 ); /*15Q16*/ + hPrivateData->prevSFM_IIR[i] = float_to_fix16( hPrivateData->prevSFM_IIR_flt[i], 13 ); /*2Q13*/ + for ( int j = 0; j < IGF_PAST_SFM_LEN; j++ ) + { + hPrivateData->igfPastSFM_fx[i][j] = float_to_fix16( hPrivateData->igfPastSFM[i][j], 13 ); + } + } + } +#endif /**********************************flt to fix ends here*******************************************************/ + IGFEncApplyStereo_fx( hStereoMdct, ms_mask, hIGFEnc, igfGridIdx, sts, pPowerSpectrum_fx, pPowerSpectrumMsInv_fx, inv_spectrum_fx, frameno, sp_aud_decision0, element_brate, mct_on ); +#if 1 /*************************************fix to flt conversion****************************************************/ + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; + H_IGF_GRID hGrid; + hPrivateData = &hIGFEnc[ch]->igfData; + hGrid = &hPrivateData->igfInfo.grid[(Word16) igfGridIdx]; + me2f_buf( sts[ch]->hTcxEnc->spectrum_fx[frameno], sts[ch]->hTcxEnc->spectrum_e[frameno], sts[ch]->hTcxEnc->spectrum[frameno], hGrid->infoGranuleLen ); + me2f_buf( &pPowerSpectrum_fx[ch][0], sts[ch]->hTcxEnc->spectrum_e[frameno], &pPowerSpectrum[ch][0], hGrid->infoGranuleLen ); + for ( Word16 sfb = 0; sfb < 23; sfb++ ) + { + hPrivateData->prevSFM_FIR_SFB_TB[sfb] = me2f_16( hPrivateData->prevSFM_FIR_SFB_TB_fx[sfb], hPrivateData->sfb_tb_e[sfb] ); + hPrivateData->prevSFM_IIR_SFB_TB[sfb] = me2f_16( hPrivateData->prevSFM_IIR_SFB_TB_fx[sfb], hPrivateData->sfb_tb_e[sfb] ); + hPrivateData->prevSFM_FIR_SFB_SB[sfb] = me2f_16( hPrivateData->prevSFM_FIR_SFB_SB_fx[sfb], hPrivateData->sfb_sb_e[sfb] ); + hPrivateData->prevSFM_IIR_SFB_SB[sfb] = me2f_16( hPrivateData->prevSFM_IIR_SFB_SB_fx[sfb], hPrivateData->sfb_sb_e[sfb] ); + hPrivateData->SFM_tb[sfb] = me2f_16( hPrivateData->SFM_tb_fx[sfb], hPrivateData->sfb_tb_e[sfb] ); + hPrivateData->SFM_sb[sfb] = me2f_16( hPrivateData->SFM_sb_fx[sfb], hPrivateData->sfb_sb_e[sfb] ); + hPrivateData->prevDampingFactor_IIR[sfb] = me2f_16( hPrivateData->prevDampingFactor_IIR_fx[sfb], hPrivateData->prevDampingFactor_IIR_e[sfb] ); + } + for ( int i = 0; i < IGF_MAX_TILES; i++ ) + { + hPrivateData->prevSFM_FIR_flt[i] = fixedToFloat( hPrivateData->prevSFM_FIR[i], 16 ); /*15Q16*/ + hPrivateData->prevSFM_IIR_flt[i] = fixedToFloat( hPrivateData->prevSFM_IIR[i], 13 ); /*2Q13*/ + for ( int j = 0; j < IGF_PAST_SFM_LEN; j++ ) + { + hPrivateData->igfPastSFM[i][j] = fixedToFloat( hPrivateData->igfPastSFM_fx[i][j], 13 ); + } + } + } +#endif /**********************************fix to flt ends here*******************************************************/ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { -- GitLab From 0b6cb9e5b245544fe06820fb0d5193cf276413a1 Mon Sep 17 00:00:00 2001 From: Nishant S Kulgod <100793@ittiam.com> Date: Tue, 30 Jul 2024 14:17:54 +0530 Subject: [PATCH 110/110] ComputeSpectrumNoiseMeasure_fx conversion + msan fixes + wmops optimization --- lib_com/enh64.c | 1 + lib_com/enh64.h | 1 + lib_com/fd_cng_com_fx.c | 16 ++ lib_com/modif_fs.c | 48 ++++ lib_com/options.h | 1 + lib_dec/acelp_core_dec_ivas_fx.c | 19 +- lib_dec/bass_psfilter.c | 15 ++ lib_dec/fd_cng_dec_fx.c | 21 +- lib_dec/ivas_sba_rendering_internal.c | 12 + lib_enc/ivas_mct_core_enc.c | 311 +++++++++++++++++--------- lib_enc/ivas_mct_enc.c | 61 +++++ lib_enc/ivas_mct_enc_mct.c | 3 +- lib_enc/ivas_stereo_classifier.c | 1 + lib_enc/ivas_stereo_dft_enc_itd.c | 1 + lib_enc/ivas_stereo_td_analysis.c | 9 +- 15 files changed, 404 insertions(+), 116 deletions(-) diff --git a/lib_com/enh64.c b/lib_com/enh64.c index b59a9ef6c..dda2d451b 100644 --- a/lib_com/enh64.c +++ b/lib_com/enh64.c @@ -1062,6 +1062,7 @@ Word64 W_msu_16_16( Word64 L64_var1, Word16 var2, Word16 var3 ) return L64_var_out; } +/* Below BASOP is not part of STL 2023 library, might be proposed in next update */ /*________________________________________________________________________________________________ | | | Function Name : W_mac_32_32 | diff --git a/lib_com/enh64.h b/lib_com/enh64.h index efc58e83e..8aed870a6 100644 --- a/lib_com/enh64.h +++ b/lib_com/enh64.h @@ -36,6 +36,7 @@ Word64 W_msu0_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ); Word64 W_mult_16_16( Word16 var1, Word16 var2 ); Word64 W_mac_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ); Word64 W_msu_16_16( Word64 L64_acc, Word16 var1, Word16 var2 ); +/* BASOP W_mac_32_32 is not part of STL 2023 library, might be proposed in next update */ Word64 W_mac_32_32( Word64 L64_acc, Word32 var1, Word32 var2 ); Word64 W_deposit32_l( Word32 L_var1 ); diff --git a/lib_com/fd_cng_com_fx.c b/lib_com/fd_cng_com_fx.c index f439bbe28..a42a85a15 100644 --- a/lib_com/fd_cng_com_fx.c +++ b/lib_com/fd_cng_com_fx.c @@ -1360,8 +1360,12 @@ void minimum_statistics_fx( scalar16 = shl( scalar16, s3 ); scalar16 = s_max( scalar16, MSALPHACORMAX ); +#ifdef IVAS_ENH32_CADENCE_CHANGES + hFdCngCom->msAlphaCor[cnt] = Madd_32_16( L_mult( scalar16, msAlphaCorAlpha2 ), hFdCngCom->msAlphaCor[cnt], msAlphaCorAlpha ); +#else hFdCngCom->msAlphaCor[cnt] = L_add( Mpy_32_16_1( hFdCngCom->msAlphaCor[cnt], msAlphaCorAlpha ), L_mult( scalar16, msAlphaCorAlpha2 ) ); +#endif move32(); } @@ -1447,8 +1451,12 @@ void minimum_statistics_fx( } /* Compute the PSD (smoothed periodogram) in each band */ +#ifdef IVAS_ENH32_CADENCE_CHANGES + msPsd[j] = round_fx( Madd_32_16( Mpy_32_16_1( msAlpha[j], msPsd[j] ), L_sub( 2147483647l /*1.0 Q31*/, msAlpha[j] ), msPeriodog[j] ) ); +#else msPsd[j] = round_fx( L_add( Mpy_32_16_1( msAlpha[j], msPsd[j] ), Mpy_32_16_1( L_sub( 2147483647l /*1.0 Q31*/, msAlpha[j] ), msPeriodog[j] ) ) ); +#endif move16(); } msPsdSum[cnt] = dotp_s_fx( msPsd + start, psize + start, current_len, CNG_HS ); @@ -1527,13 +1535,21 @@ void minimum_statistics_fx( /* Compute bias correction Bmin */ tmp0 = Mpy_32_16_1( scalar, QeqInv ); +#ifdef IVAS_ENH32_CADENCE_CHANGES + tmp1 = L_msu( 1073741824l /*0.5 Q31*/, msM_win, QeqInv ); +#else tmp1 = L_sub( 1073741824l /*0.5 Q31*/, L_mult( msM_win, QeqInv ) ); +#endif tmp16 = BASOP_Util_Divide3232_uu_1616_Scale( tmp0, tmp1, &s ); msBminWin[j] = L_add( 134217728l /*1.0 Q27*/, L_shl( L_deposit_h( tmp16 ), add( s, 7 - 4 ) ) ); move32(); tmp0 = Mpy_32_16_1( scalar2, QeqInv ); +#ifdef IVAS_ENH32_CADENCE_CHANGES + tmp1 = L_msu( 1073741824l /*0.5 Q31*/, msM_subwin, QeqInv ); +#else tmp1 = L_sub( 1073741824l /*0.5 Q31*/, L_mult( msM_subwin, QeqInv ) ); +#endif tmp16 = BASOP_Util_Divide3232_uu_1616_Scale( tmp0, tmp1, &s ); msBminSubWin[j] = L_add( 134217728l /*1.0 Q27*/, L_shl( L_deposit_h( tmp16 ), s ) ); move32(); diff --git a/lib_com/modif_fs.c b/lib_com/modif_fs.c index 67593def4..73a08dd32 100644 --- a/lib_com/modif_fs.c +++ b/lib_com/modif_fs.c @@ -537,6 +537,53 @@ void Interpolate_allpass_steep_32( int16_t n, k; Word32 temp_fx[ALLPASSSECTIONS_STEEP - 1]; +#ifdef IVAS_ENH32_CADENCE_CHANGES + /* upper allpass filter chain */ + FOR( k = 0; k < N; k++ ) + { + temp_fx[0] = Madd_32_16( mem_fx[0], in_fx[k], AP2_STEEP_FX[0] ); + move32(); + mem_fx[0] = Msub_32_16( in_fx[k], temp_fx[0], AP2_STEEP_FX[0] ); + move32(); + + /* for better performance, unroll this loop */ + FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) + { + temp_fx[n] = Madd_32_16( mem_fx[n], temp_fx[n - 1], AP2_STEEP_FX[n] ); + move32(); + mem_fx[n] = Msub_32_16( temp_fx[n - 1], temp_fx[n], AP2_STEEP_FX[n] ); + move32(); + } + + out_fx[2 * k + 1] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP - 1], temp_fx[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); + move32(); + mem_fx[ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp_fx[ALLPASSSECTIONS_STEEP - 2], out_fx[2 * k + 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); + move32(); + } + + /* lower allpass filter chain */ + FOR( k = 0; k < N; k++ ) + { + temp_fx[0] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP], in_fx[k], AP1_STEEP_FX[0] ); + move32(); + mem_fx[ALLPASSSECTIONS_STEEP] = Msub_32_16( in_fx[k], temp_fx[0], AP1_STEEP_FX[0] ); + move32(); + + /* for better performance, unroll this loop */ + FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) + { + temp_fx[n] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP + n], temp_fx[n - 1], AP1_STEEP_FX[n] ); + move32(); + mem_fx[ALLPASSSECTIONS_STEEP + n] = Msub_32_16( temp_fx[n - 1], temp_fx[n], AP1_STEEP_FX[n] ); + move32(); + } + + out_fx[2 * k] = Madd_32_16( mem_fx[2 * ALLPASSSECTIONS_STEEP - 1], temp_fx[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); + move32(); + mem_fx[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp_fx[ALLPASSSECTIONS_STEEP - 2], out_fx[2 * k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); + move32(); + } +#else /* upper allpass filter chain */ FOR( k = 0; k < N; k++ ) { @@ -582,6 +629,7 @@ void Interpolate_allpass_steep_32( mem_fx[2 * ALLPASSSECTIONS_STEEP - 1] = L_sub( temp_fx[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( out_fx[2 * k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); move32(); } +#endif return; } diff --git a/lib_com/options.h b/lib_com/options.h index b9d043c2c..be93e6a44 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -95,6 +95,7 @@ #define FIX_785_REMOVE_DEAD_CODE /* VA: issue 785: remove dead code */ #define FIX_852_FIX_HANDLE_DEREF /* VA: issue 852: Fix missing handle dereferencing of hIsmMetadaData in ivas_ism_metadata_close() */ #define FIX_901_PARAMMC_DEAD_CODE /* FhG: issue 901: remove dead ParamMC code */ +#define IVAS_ENH32_CADENCE_CHANGES /* #################### End BE switches ################################## */ diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index 77c92e202..270b9a5bc 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -176,13 +176,21 @@ ivas_error acelp_core_dec_ivas_fx( FdCng_decodeSID_ivas_fx( st ); rescale_fdCngDec( st->hFdCngDec, sub( old_NoiseEstExp, st->hFdCngDec->hFdCngCom->sidNoiseEstExp ) ); } +#ifdef IVAS_ENH32_CADENCE_CHANGES + FOR( i = 0; i < NPART; i++ ) + { + st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = Madd_32_32( Mpy_32_32( STEREO_DFT_FD_FILT_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] ), + STEREO_DFT_FD_FILT_COMP_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEst[i] ); + move32(); + } +#else FOR( i = 0; i < NPART; i++ ) { st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = L_add( Mpy_32_32( STEREO_DFT_FD_FILT_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] ), Mpy_32_32( STEREO_DFT_FD_FILT_COMP_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEst[i] ) ); move32(); } - +#endif ApplyFdCng_ivas_fx( NULL, 0, NULL, 0, NULL, NULL, NULL, st, 0, 0 ); IF( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp < 0 ) @@ -673,12 +681,21 @@ ivas_error acelp_core_dec_ivas_fx( { assert( nchan_out == 1 ); +#ifdef IVAS_ENH32_CADENCE_CHANGES + FOR( i = 0; i < NPART; i++ ) + { + st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = Madd_32_32( Mpy_32_32( STEREO_DFT_FD_FILT_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] ), + STEREO_DFT_FD_FILT_COMP_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEst[i] ); + move32(); + } +#else FOR( i = 0; i < NPART; i++ ) { st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = L_add( Mpy_32_32( STEREO_DFT_FD_FILT_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] ), Mpy_32_32( STEREO_DFT_FD_FILT_COMP_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEst[i] ) ); move32(); } +#endif Word16 new_sidNoiseEstExp = 31 - Q4; move16(); Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, new_sidNoiseEstExp ) ); diff --git a/lib_dec/bass_psfilter.c b/lib_dec/bass_psfilter.c index c33edf96c..63e304417 100644 --- a/lib_dec/bass_psfilter.c +++ b/lib_dec/bass_psfilter.c @@ -571,6 +571,20 @@ void addBassPostFilter_ivas_fx( cldfbAnalysis_ivas_fx( harm_timeIn_fx, tmp_R_fx, tmp_I_fx, samplesToProcess, cldfb ); +#ifdef IVAS_ENH32_CADENCE_CHANGES + /* now do the subtraction */ + FOR( i = 0; i < nColToProcess; i++ ) + { + /* loop over low frequency bands */ + FOR( b = 0; b < maxBand; b++ ) + { + rAnalysis_fx[i][b] = Msub_32_32( rAnalysis_fx[i][b], tmp_R_fx[i][b], weights_fx[b] ); // Qx - 6 + move32(); + iAnalysis_fx[i][b] = Msub_32_32( iAnalysis_fx[i][b], tmp_I_fx[i][b], weights_fx[b] ); // Qx - 6 + move32(); + } + } +#else /* now do the subtraction */ FOR( i = 0; i < nColToProcess; i++ ) { @@ -583,6 +597,7 @@ void addBassPostFilter_ivas_fx( move32(); } } +#endif return; } diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index df0da5137..4e93acdfb 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -2679,8 +2679,11 @@ void perform_noise_estimation_dec_ivas_fx( { temp = L_shr( temp, sub( hFdCngDec->msPeriodog_ST_exp, hFdCngDec->hFdCngCom->periodog_exp ) ); } - +#ifdef IVAS_ENH32_CADENCE_CHANGES + hFdCngDec->msPeriodog_ST_fx[p] = Madd_32_16( Mpy_32_16_1( hFdCngDec->msPeriodog_ST_fx[p], ST_PERIODOG_FACT_Q15 ), temp, sub( MAX_16, ST_PERIODOG_FACT_Q15 ) ); +#else hFdCngDec->msPeriodog_ST_fx[p] = L_add( Mpy_32_16_1( hFdCngDec->msPeriodog_ST_fx[p], ST_PERIODOG_FACT_Q15 ), Mpy_32_16_1( temp, sub( MAX_16, ST_PERIODOG_FACT_Q15 ) ) ); +#endif move32(); } } @@ -2761,7 +2764,11 @@ void perform_noise_estimation_dec_ivas_fx( temp = msPeriodog[p]; move32(); temp = L_shr( temp, sub( hFdCngDec->msNoiseEst_exp, hFdCngDec->msPeriodog_exp ) ); +#ifdef IVAS_ENH32_CADENCE_CHANGES + msNoiseEst[p] = Madd_32_16( Mpy_32_16_1( msNoiseEst[p], sub( shl_sat( 1, sub( 15, e ) ), alpha ) ), temp, alpha ); +#else msNoiseEst[p] = L_add( Mpy_32_16_1( msNoiseEst[p], sub( shl_sat( 1, sub( 15, e ) ), alpha ) ), Mpy_32_16_1( temp, alpha ) ); +#endif move32(); } } @@ -2832,7 +2839,11 @@ void perform_noise_estimation_dec_ivas_fx( L_tmp = L_shr( msPeriodog[p], sub( sub( 31, hFdCngDec->hFdCngCom->periodog_exp ), 4 ) ); IF( LT_32( L_tmp, msNoiseEst[p] ) ) { +#ifdef IVAS_ENH32_CADENCE_CHANGES + msNoiseEst[p] = Madd_32_16( Mpy_32_16_1( msNoiseEst[p], wght ), L_tmp, (Word16) L_sub( shr( MAX_16, sub( 15, scale ) ), wght ) ); +#else msNoiseEst[p] = L_add( Mpy_32_16_1( msNoiseEst[p], wght ), Mpy_32_16_1( L_tmp, (Word16) L_sub( shr( MAX_16, sub( 15, scale ) ), wght ) ) ); +#endif move32(); temp_q_msNoiseEst[p] = sub( add( hFdCngDec->msNoiseEst_exp, scale ), 15 ); move16(); @@ -2855,7 +2866,11 @@ void perform_noise_estimation_dec_ivas_fx( L_tmp = L_shr( hFdCngDec->msPeriodog_ST_fx[p], sub( hFdCngDec->msNoiseEst_exp, hFdCngDec->msPeriodog_ST_exp ) ); IF( LT_32( L_tmp, msNoiseEst[p] ) ) { +#ifdef IVAS_ENH32_CADENCE_CHANGES + msNoiseEst[p] = Madd_32_16( Mpy_32_16_1( msNoiseEst[p], CNA_ACT_DN_FACT_Q15 ), L_tmp, ONE_IN_Q15 - CNA_ACT_DN_FACT_Q15 ); +#else msNoiseEst[p] = L_add( Mpy_32_16_1( msNoiseEst[p], CNA_ACT_DN_FACT_Q15 ), Mpy_32_16_1( L_tmp, ONE_IN_Q15 - CNA_ACT_DN_FACT_Q15 ) ); +#endif move32(); } } @@ -2922,7 +2937,11 @@ void perform_noise_estimation_dec_ivas_fx( *ptr_per = 0; move32(); } +#ifdef IVAS_ENH32_CADENCE_CHANGES + *ptr_per = Madd_32_16( ( *ptr_per ), temp, sub( MAX_16, alpha ) ); +#else *ptr_per = L_add( ( *ptr_per ), Mpy_32_16_1( temp, sub( MAX_16, alpha ) ) ); +#endif ptr_per++; } diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index 5a2ee5c77..b30b8533c 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -655,6 +655,17 @@ void ivas_ism2sba_sf_fx( move32(); prev_gain_fx = hIsmRendererData->prev_gains_fx[i][j]; move32(); +#ifdef IVAS_ENH32_CADENCE_CHANGES + FOR( k = 0; k < n_samples_to_render; k++ ) + { + g1_fx = sub( 32767, *g2_fx ); + *( out_fx ) = Madd_32_32( *( out_fx ), Madd_32_16( Mult_32_16( gain_fx, ( *( g2_fx ) ) ), prev_gain_fx, g1_fx ), ( *( tc_fx ) ) ); /*Q_buffer_in + 29 - 31*/ + move32(); + g2_fx++; + tc_fx++; + out_fx++; + } +#else FOR( k = 0; k < n_samples_to_render; k++ ) { g1_fx = sub( 32767, *g2_fx ); @@ -664,6 +675,7 @@ void ivas_ism2sba_sf_fx( tc_fx++; out_fx++; } +#endif } } FOR( j = 0; j < sba_num_chans; j++ ) diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c index 5c7b481e5..ba7241532 100644 --- a/lib_enc/ivas_mct_core_enc.c +++ b/lib_enc/ivas_mct_core_enc.c @@ -40,6 +40,7 @@ #include "wmc_auto.h" #ifdef IVAS_FLOAT_FIXED #include "prot_fx.h" +#include "prot_fx_enc.h" #include "ivas_prot_fx.h" #include "prot_fx.h" #endif @@ -597,12 +598,12 @@ void ivas_mct_core_enc( float *inv_mdst_spectrum[MCT_MAX_CHANNELS][2]; float *inv_spectrum[MCT_MAX_CHANNELS][2]; float *mdst_spectrum[MCT_MAX_CHANNELS][2] = { NULL }; - float inv_spectrum_long[MCT_MAX_CHANNELS][L_FRAME48k]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ + float inv_spectrum_long[MCT_MAX_CHANNELS][L_FRAME48k]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ #if 0 Word32 *orig_spectrum_fx[MCT_MAX_CHANNELS][2]; /* Pointers to MDCT output for a short block (L/R) */ +#endif Word32 powerSpec_fx[MCT_MAX_CHANNELS][L_FRAME48k]; Word32 mdst_fx; -#endif Word32 powerSpecMsInv_long_fx[MCT_MAX_CHANNELS][L_FRAME48k]; /* MS inv power spectrum, also inverse MDST spectrum */ Word32 *powerSpecMsInv_fx[MCT_MAX_CHANNELS][2]; Word32 *inv_mdst_spectrum_fx[MCT_MAX_CHANNELS][2]; @@ -611,12 +612,13 @@ void ivas_mct_core_enc( Word32 inv_spectrum_long_fx[MCT_MAX_CHANNELS][L_FRAME48k]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ Word16 total_side_bits; Word16 chBitRatios[MCT_MAX_CHANNELS]; + Word16 q_powSpec[MCT_MAX_CHANNELS], q_spec, tmp_s; + Word16 tmp_q_powSpec[L_FRAME48k], tmp_q_powSpecInv[L_FRAME48k], *tmp_q_psi[2]; + Word64 W_tmp; Encoder_State *sts[MCT_MAX_CHANNELS]; Encoder_State *st; Word16 sp_aud_decision0[MCT_MAX_CHANNELS]; BSTR_ENC_HANDLE hBstr; - float mdst; - push_wmops( "mct_encoding" ); @@ -644,12 +646,22 @@ void ivas_mct_core_enc( inv_spectrum[ch][1] = inv_spectrum_long[ch] + N_TCX10_MAX; #endif + set32_fx( inv_spectrum_long_fx[ch], 0, L_FRAME48k ); + set32_fx( powerSpec_fx[ch], 0, L_FRAME48k ); + set32_fx( powerSpecMsInv_long_fx[ch], 0, L_FRAME48k ); + inv_mdst_spectrum_fx[ch][0] = powerSpecMsInv_fx[ch][0] = powerSpecMsInv_long_fx[ch]; inv_mdst_spectrum_fx[ch][1] = powerSpecMsInv_fx[ch][1] = powerSpecMsInv_long_fx[ch] + N_TCX10_MAX; inv_spectrum_fx[ch][0] = inv_spectrum_long_fx[ch]; inv_spectrum_fx[ch][1] = inv_spectrum_long_fx[ch] + N_TCX10_MAX; } + set16_fx( tmp_q_powSpecInv, 63, L_FRAME48k ); + set16_fx( tmp_q_powSpec, 63, L_FRAME48k ); + + tmp_q_psi[0] = tmp_q_powSpecInv; + tmp_q_psi[1] = &tmp_q_powSpecInv[N_TCX10_MAX]; + FOR( ( cpe_id = 0, i = 0 ); cpe_id < nCPE; cpe_id++ ) { FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -752,156 +764,195 @@ void ivas_mct_core_enc( * MCT algorithm *---------------------------------------------------------------*/ -#if 1 // Float to Fixed, to be removed - Word16 q_spec = Q31; - Word16 length; - - FOR( ch = 0; ch < nChannels; ch++ ) - { - length = sts[ch]->hTcxEnc->L_frameTCX / ( ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); - IF( sts[ch]->last_core == ACELP_CORE ) - { - length += length / 4; - } - FOR( Word16 k = 0; k <= ( ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) - { - if ( sts[ch]->hTcxEnc->spectrum[0] ) - { - q_spec = s_min( q_spec, Q_factor_arrL( sts[ch]->hTcxEnc->spectrum[k], length ) - 1 ); - } - IF( mdst_spectrum[ch][0] ) - { - q_spec = s_min( q_spec, Q_factor_arrL( mdst_spectrum[ch][k], length ) - 1 ); - } - } - } - - FOR( ch = 0; ch < nChannels; ch++ ) - { - length = sts[ch]->hTcxEnc->L_frameTCX / ( ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); - IF( sts[ch]->last_core == ACELP_CORE ) - { - length += length / 4; - } - FOR( Word16 k = 0; k <= ( ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) - { - if ( sts[ch]->hTcxEnc->spectrum[0] ) - { - floatToFixed_arrL32( sts[ch]->hTcxEnc->spectrum[k], sts[ch]->hTcxEnc->spectrum_fx[k], q_spec, length ); - sts[ch]->hTcxEnc->spectrum_e[k] = sub( Q31, q_spec ); - } - if ( mdst_spectrum[ch][0] ) - { - floatToFixed_arrL32( mdst_spectrum[ch][k], mdst_spectrum_fx[ch][k], q_spec, length ); - } - } - } -#endif // 1 - apply_MCT_enc_fx( hMCT, sts, mdst_spectrum_fx, inv_spectrum_fx, inv_mdst_spectrum_fx, nChannels ); -#if 1 // Fixed to Float, to be removed + /*--------------------------------------------------------------* + * Power spectrum calculation for Noise Estimation + *---------------------------------------------------------------*/ FOR( ch = 0; ch < nChannels; ch++ ) { - if ( sts[ch]->hTcxEnc->spectrum[0] ) + IF( EQ_32( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { - q_spec = 31 - sts[ch]->hTcxEnc->spectrum_e[0]; + CONTINUE; } - length = sts[ch]->hTcxEnc->L_frameTCX / ( ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); - IF( sts[ch]->last_core == ACELP_CORE ) + IF( EQ_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) { - length += length / 4; + nSubframes = 1; + L_subframeTCX = sts[ch]->hTcxEnc->L_frameTCX; + move16(); + move16(); } - FOR( Word16 k = 0; k <= ( ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) + ELSE { - if ( sts[ch]->hTcxEnc->spectrum[0] ) - { - fixedToFloat_arrL32( sts[ch]->hTcxEnc->spectrum_fx[k], sts[ch]->hTcxEnc->spectrum[k], q_spec, length ); - fixedToFloat_arrL32( inv_spectrum_fx[ch][k], inv_spectrum[ch][k], q_spec, length ); - } - if ( mdst_spectrum[ch][0] ) - { - fixedToFloat_arrL32( inv_mdst_spectrum_fx[ch][k], inv_mdst_spectrum[ch][k], q_spec, length ); - fixedToFloat_arrL32( mdst_spectrum_fx[ch][k], mdst_spectrum[ch][k], q_spec, length ); - } + nSubframes = NB_DIV; + move16(); + L_subframeTCX = shr( sts[ch]->hTcxEnc->L_frameTCX, 1 ); } - } -#endif // 1 - - /*--------------------------------------------------------------* - * Power spectrum calculation for Noise Estimation - *---------------------------------------------------------------*/ - for ( ch = 0; ch < nChannels; ch++ ) - { - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) - { - continue; - } - nSubframes = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - L_subframeTCX = sts[ch]->hTcxEnc->L_frameTCX / nSubframes; /* in MCT only relevant for bitrate switching from non-MCT bitrates */ - if ( sts[ch]->last_core == ACELP_CORE ) + IF( EQ_16( sts[ch]->last_core, ACELP_CORE ) ) { - L_subframeTCX += L_subframeTCX / 4; + L_subframeTCX = add( L_subframeTCX, shr( L_subframeTCX, 2 ) ); } - for ( n = 0; n < nSubframes; n++ ) + FOR( n = 0; n < nSubframes; n++ ) { - if ( sts[ch]->hTcxEnc->tns_ms_flag[n] ) + q_spec = sub( 31, sts[ch]->hTcxEnc->spectrum_e[0] ); + + IF( sts[ch]->hTcxEnc->tns_ms_flag[n] ) { /* power spectrum: MDCT^2 + MDST^2 */ - for ( i = 0; i < L_subframeTCX; i++ ) + FOR( i = 0; i < L_subframeTCX; i++ ) { - powerSpec[ch][i + n * L_subframeTCX] = mdst_spectrum[ch][n][i] * mdst_spectrum[ch][n][i] + sts[ch]->hTcxEnc->spectrum[n][i] * sts[ch]->hTcxEnc->spectrum[n][i]; - powerSpecMsInv[ch][n][i] = inv_mdst_spectrum[ch][n][i] * inv_mdst_spectrum[ch][n][i] + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; + W_tmp = W_mac_32_32( W_mult_32_32( mdst_spectrum_fx[ch][n][i], mdst_spectrum_fx[ch][n][i] ), sts[ch]->hTcxEnc->spectrum_fx[n][i], sts[ch]->hTcxEnc->spectrum_fx[n][i] ); + tmp_s = sub( W_norm( W_tmp ), 1 ); + W_tmp = W_shl( W_tmp, tmp_s ); + powerSpec_fx[ch][add( i, imult1616( n, L_subframeTCX ) )] = W_extract_h( W_tmp ); + tmp_q_powSpec[add( i, imult1616( n, L_subframeTCX ) )] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + move32(); + move16(); + + W_tmp = W_mac_32_32( W_mult_32_32( inv_mdst_spectrum_fx[ch][n][i], inv_mdst_spectrum_fx[ch][n][i] ), inv_spectrum_fx[ch][n][i], inv_spectrum_fx[ch][n][i] ); + tmp_s = sub( W_norm( W_tmp ), 1 ); + W_tmp = W_shl( W_tmp, tmp_s ); + powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_tmp ); + tmp_q_psi[n][i] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + move32(); + move16(); } } - else + ELSE { - if ( hMCT->currBlockDataCnt > 0 ) + IF( hMCT->currBlockDataCnt > 0 ) { /* power spectrum: MDCT^2 + MDST^2 */ - powerSpecMsInv[ch][n][0] = inv_spectrum[ch][n][0] * inv_spectrum[ch][n][0]; - - for ( i = 1; i < L_subframeTCX - 1; i++ ) + W_tmp = W_mult_32_32( inv_spectrum_fx[ch][n][0], inv_spectrum_fx[ch][n][0] ); + tmp_s = sub( W_norm( W_tmp ), 1 ); + W_tmp = W_shl( W_tmp, tmp_s ); + powerSpecMsInv_fx[ch][n][0] = W_extract_h( W_tmp ); + tmp_q_psi[n][0] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + move32(); + move16(); + + FOR( i = 1; i < L_subframeTCX - 1; i++ ) { - mdst = ( inv_spectrum[ch][n][i + 1] - inv_spectrum[ch][n][i - 1] ); /* An MDST estimate */ - powerSpecMsInv[ch][n][i] = mdst * mdst + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; + mdst_fx = L_sub( inv_spectrum_fx[ch][n][i + 1], inv_spectrum_fx[ch][n][i - 1] ); /* An MDST estimate */ + + W_tmp = W_mac_32_32( W_mult_32_32( mdst_fx, mdst_fx ), inv_spectrum_fx[ch][n][i], inv_spectrum_fx[ch][n][i] ); + tmp_s = sub( W_norm( W_tmp ), 1 ); + W_tmp = W_shl( W_tmp, tmp_s ); + powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_tmp ); + tmp_q_psi[n][i] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + move32(); + move16(); } - powerSpecMsInv[ch][n][L_subframeTCX - 1] = inv_spectrum[ch][n][L_subframeTCX - 1] * inv_spectrum[ch][n][L_subframeTCX - 1]; + W_tmp = W_mult_32_32( inv_spectrum_fx[ch][n][L_subframeTCX - 1], inv_spectrum_fx[ch][n][L_subframeTCX - 1] ); + tmp_s = sub( W_norm( W_tmp ), 1 ); + W_tmp = W_shl( W_tmp, tmp_s ); + powerSpecMsInv_fx[ch][n][L_subframeTCX - 1] = W_extract_h( W_tmp ); + tmp_q_psi[n][L_subframeTCX - 1] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + move32(); + move16(); } /* power spectrum: MDCT^2 + MDST^2 */ - powerSpec[ch][n * L_subframeTCX] = sts[ch]->hTcxEnc->spectrum[n][0] * sts[ch]->hTcxEnc->spectrum[n][0]; + W_tmp = W_mult_32_32( sts[ch]->hTcxEnc->spectrum_fx[n][0], sts[ch]->hTcxEnc->spectrum_fx[n][0] ); + tmp_s = sub( W_norm( W_tmp ), 1 ); + W_tmp = W_shl( W_tmp, tmp_s ); + powerSpec_fx[ch][n * L_subframeTCX] = W_extract_h( W_tmp ); + tmp_q_powSpec[n * L_subframeTCX] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + move32(); + move16(); + + FOR( i = 1; i < L_subframeTCX - 1; i++ ) + { + mdst_fx = L_sub( sts[ch]->hTcxEnc->spectrum_fx[n][i + 1], sts[ch]->hTcxEnc->spectrum_fx[n][i - 1] ); /* An MDST estimate */ + + W_tmp = W_mac_32_32( W_mult_32_32( mdst_fx, mdst_fx ), sts[ch]->hTcxEnc->spectrum_fx[n][i], sts[ch]->hTcxEnc->spectrum_fx[n][i] ); + tmp_s = sub( W_norm( W_tmp ), 1 ); + W_tmp = W_shl( W_tmp, tmp_s ); + powerSpec_fx[ch][add( i, imult1616( n, L_subframeTCX ) )] = W_extract_h( W_tmp ); + tmp_q_powSpec[add( i, imult1616( n, L_subframeTCX ) )] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + move32(); + move16(); + } - for ( i = 1; i < L_subframeTCX - 1; i++ ) + W_tmp = W_mult_32_32( sts[ch]->hTcxEnc->spectrum_fx[n][L_subframeTCX - 1], sts[ch]->hTcxEnc->spectrum_fx[n][L_subframeTCX - 1] ); + tmp_s = sub( W_norm( W_tmp ), 1 ); + W_tmp = W_shl( W_tmp, tmp_s ); + powerSpec_fx[ch][add( sub( L_subframeTCX, 1 ), imult1616( n, L_subframeTCX ) )] = W_extract_h( W_tmp ); + tmp_q_powSpec[add( sub( L_subframeTCX, 1 ), imult1616( n, L_subframeTCX ) )] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + move32(); + move16(); + } + } + + /* Aligning the Q-factors */ + { + /* NOTE: This logic has been added because using a constant headroom while computing `powSpec` and `powSpecMsInv` leads to significant precision loss, which results in poor quality. */ + FOR( i = 0; i < L_FRAME48k; i++ ) + { + if ( powerSpec_fx[ch][i] == 0 ) { - mdst = ( sts[ch]->hTcxEnc->spectrum[n][i + 1] - sts[ch]->hTcxEnc->spectrum[n][i - 1] ); /* An MDST estimate */ - powerSpec[ch][i + n * L_subframeTCX] = mdst * mdst + sts[ch]->hTcxEnc->spectrum[n][i] * sts[ch]->hTcxEnc->spectrum[n][i]; + tmp_q_powSpec[i] = 63; + move16(); + } + if ( powerSpecMsInv_fx[ch][0][i] == 0 ) + { + tmp_q_powSpecInv[i] = 63; + move16(); + } + } + minimum_s( tmp_q_powSpec, L_FRAME48k, &q_powSpec[ch] ); + minimum_s( tmp_q_powSpecInv, L_FRAME48k, &tmp_s ); + q_powSpec[ch] = s_min( q_powSpec[ch], tmp_s ); + move16(); + + FOR( n = 0; n < nSubframes; n++ ) + { + FOR( i = 0; i < L_subframeTCX; i++ ) + { + powerSpecMsInv_fx[ch][n][i] = L_shr( powerSpecMsInv_fx[ch][n][i], sub( tmp_q_psi[n][i], q_powSpec[ch] ) ); + powerSpec_fx[ch][add( i, imult1616( n, L_subframeTCX ) )] = L_shr( powerSpec_fx[ch][add( i, imult1616( n, L_subframeTCX ) )], sub( tmp_q_powSpec[i], q_powSpec[ch] ) ); + move32(); + move32(); } - powerSpec[ch][L_subframeTCX - 1 + n * L_subframeTCX] = sts[ch]->hTcxEnc->spectrum[n][L_subframeTCX - 1] * sts[ch]->hTcxEnc->spectrum[n][L_subframeTCX - 1]; } } } - for ( ch = 0; ch < nChannels; ch++ ) + FOR( ch = 0; ch < nChannels; ch++ ) { st = sts[ch]; - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + IF( EQ_32( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { - continue; + CONTINUE; } - nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - L_subframeTCX = st->hTcxEnc->L_frameTCX / nSubframes; + + IF( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) ) + { + nSubframes = 1; + move16(); + L_subframeTCX = st->hTcxEnc->L_frameTCX; + move16(); + } + ELSE + { + nSubframes = NB_DIV; + move16(); + L_subframeTCX = shr( st->hTcxEnc->L_frameTCX, 1 ); + } + /* in MCT only relevant for bitrate switching from non-MCT bitrates */ - if ( st->last_core == ACELP_CORE ) + IF( st->last_core == ACELP_CORE ) { - L_subframeTCX += L_subframeTCX / 4; + L_subframeTCX = add( L_subframeTCX, shr( L_subframeTCX, 2 ) ); } - if ( ( st->hTcxEnc->tcxMode == TCX_20 ) && ( st->total_brate < HQ_96k || st->igf ) ) + test(); + test(); + IF( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) && ( LT_32( st->total_brate, HQ_96k ) || st->igf ) ) { /*-----------------------------------------------------------* * Compute noise-measure flags for spectrum filling * @@ -909,12 +960,50 @@ void ivas_mct_core_enc( * Detect low pass if present. * *-----------------------------------------------------------*/ - ComputeSpectrumNoiseMeasure( powerSpec[ch], st->hTcxEnc->L_frameTCX, st->hTcxEnc->nmStartLine, ( st->L_frame * st->last_sr_core != st->L_frame_past * st->sr_core ) || ( st->last_core != TCX_20_CORE ), st->hTcxEnc->memQuantZeros, st->hTcxEnc->L_frameTCX ); + test(); + ComputeSpectrumNoiseMeasure_fx( powerSpec_fx[ch], st->hTcxEnc->L_frameTCX, st->hTcxEnc->nmStartLine, NE_32( imult3216( st->last_sr_core, st->L_frame ), imult3216( st->sr_core, st->L_frame_past ) ) || NE_16( st->last_core, TCX_20_CORE ), st->hTcxEnc->memQuantZeros, st->hTcxEnc->L_frameTCX ); } - st->hTcxEnc->measuredBwRatio_flt = 1.f; /* No bandwidth limit for the noise filling */ +#if 1 // Float initialization to be removed + st->hTcxEnc->measuredBwRatio_flt = 1.f; /* No bandwidth limit for the noise filling */ +#endif + st->hTcxEnc->measuredBwRatio = ONE_IN_Q14; /* No bandwidth limit for the noise filling, Q14 */ } +#if 1 // Fixed to float conversions, to be removed + Word16 length; + q_spec = 31; + move16(); + for ( ch = 0; ch < nChannels; ch++ ) + { + if ( sts[ch]->hTcxEnc->spectrum[0] ) + { + q_spec = 31 - sts[ch]->hTcxEnc->spectrum_e[0]; + } + length = sts[ch]->hTcxEnc->L_frameTCX / ( ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); + if ( sts[ch]->last_core == ACELP_CORE ) + { + length += length / 4; + } + for ( Word16 k = 0; k <= ( ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) + { + if ( sts[ch]->hTcxEnc->spectrum[0] ) + { + fixedToFloat_arrL32( sts[ch]->hTcxEnc->spectrum_fx[k], sts[ch]->hTcxEnc->spectrum[k], q_spec, length ); + fixedToFloat_arrL32( inv_spectrum_fx[ch][k], inv_spectrum[ch][k], q_spec, length ); + } + if ( mdst_spectrum[ch][0] ) + { + fixedToFloat_arrL32( inv_mdst_spectrum_fx[ch][k], inv_mdst_spectrum[ch][k], q_spec, length ); + fixedToFloat_arrL32( mdst_spectrum_fx[ch][k], mdst_spectrum[ch][k], q_spec, length ); + } + } + + fixedToFloat_arrL( powerSpecMsInv_fx[ch][0], powerSpecMsInv[ch][0], q_powSpec[ch], L_FRAME48k ); + fixedToFloat_arrL( powerSpec_fx[ch], powerSpec[ch], q_powSpec[ch], sts[ch]->hTcxEnc->L_frameTCX ); + } +#endif // 1 + if ( sts[0]->igf ) { if ( hMCT->currBlockDataCnt > 0 ) diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index 89515091f..0fac502c1 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -399,6 +399,67 @@ ivas_error ivas_mct_enc( } } +#if 1 // Float to Fixed, to be removed + Word16 q_spec = Q31; + Word16 length, ch, nCPE; + nCPE = ( hMCT->nchan_out_woLFE % 2 ) == 0 ? ( hMCT->nchan_out_woLFE / 2 ) : ( hMCT->nchan_out_woLFE / 2 ) + 1; + + for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + if ( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + length = st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX / ( ( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); + if ( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->last_core == ACELP_CORE ) + { + length += length / 4; + } + for ( Word16 k = 0; k <= ( ( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) + { + if ( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum[0] ) + { + q_spec = s_min( q_spec, Q_factor_arrL( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum[k], length ) - 1 ); + } + if ( hMCT->p_mdst_spectrum_long[cpe_id][ch] ) + { + q_spec = s_min( q_spec, Q_factor_arrL( &hMCT->p_mdst_spectrum_long[cpe_id][ch][k * N_TCX10_MAX], length ) - 1 ); + } + } + } + } + + for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + // if ( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + //{ + // continue; + // } + length = st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX / ( ( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV ); + if ( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->last_core == ACELP_CORE ) + { + length += length / 4; + } + for ( Word16 k = 0; k <= ( ( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) + { + if ( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum[0] ) + { + floatToFixed_arrL32( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum[k], st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum_fx[k], q_spec, length ); + st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum_e[k] = sub( Q31, q_spec ); + } + if ( hMCT->p_mdst_spectrum_long[cpe_id][ch] ) + { + floatToFixed_arrL32( &hMCT->p_mdst_spectrum_long[cpe_id][ch][k * N_TCX10_MAX], &hMCT->p_mdst_spectrum_long_fx[cpe_id][ch][k * N_TCX10_MAX], q_spec, length ); + } + } + } + } +#endif // 1 + /* joint MCT encoding */ ivas_mct_core_enc( ivas_format, hMCT, st_ivas->hCPE, hMCT->nchan_out_woLFE, ivas_total_brate, switch_bw, ( ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) ? (int16_t) st_ivas->hLFE->lfe_bits : 0, st_ivas->hEncoderConfig->sba_order ); diff --git a/lib_enc/ivas_mct_enc_mct.c b/lib_enc/ivas_mct_enc_mct.c index 0a4659182..066f7a557 100644 --- a/lib_enc/ivas_mct_enc_mct.c +++ b/lib_enc/ivas_mct_enc_mct.c @@ -379,8 +379,7 @@ static void getCorrelationMatrix_fx( FOR( n = 0; n < nSubframes; n++ ) { res_q = sub( 31, sts[0]->hTcxEnc->spectrum_e[0] ); - L_tmp = dotp_fixed_32( sts[ch1]->hTcxEnc->spectrum_fx[n], sts[ch2]->hTcxEnc->spectrum_fx[n], L_subframe, 1 /*find_guarded_bits_fx( L_subframe )*/, &res_q ); - + L_tmp = dotp_fixed_32( sts[ch1]->hTcxEnc->spectrum_fx[n], sts[ch2]->hTcxEnc->spectrum_fx[n], L_subframe, 1, &res_q ); xCorrMatrix[ch1][ch2] = BASOP_Util_Add_Mant32Exp( xCorrMatrix[ch1][ch2], xCorrMatrix_exp[ch1][ch2], L_tmp, sub( 31, res_q ), &xCorrMatrix_exp[ch1][ch2] ); move32(); } diff --git a/lib_enc/ivas_stereo_classifier.c b/lib_enc/ivas_stereo_classifier.c index 22d07cf28..89525e8ef 100644 --- a/lib_enc/ivas_stereo_classifier.c +++ b/lib_enc/ivas_stereo_classifier.c @@ -969,6 +969,7 @@ void xtalk_classifier_dft( /* raw score */ hStereoClassif->xtalk_score = score; + printf( "%f ", hStereoClassif->xtalk_score ); if ( !hStereoClassif->vad_flag_glob ) { diff --git a/lib_enc/ivas_stereo_dft_enc_itd.c b/lib_enc/ivas_stereo_dft_enc_itd.c index e01e9b5ba..0f4c863a8 100644 --- a/lib_enc/ivas_stereo_dft_enc_itd.c +++ b/lib_enc/ivas_stereo_dft_enc_itd.c @@ -1201,6 +1201,7 @@ void stereo_dft_enc_compute_itd( hItd->itd_cnt = 0; hItd->lp_phat_peak = 0.0f; } + printf( "\n%d %f ", itd, hItd->itd_thres ); { /* stereo Xtalk classifier */ diff --git a/lib_enc/ivas_stereo_td_analysis.c b/lib_enc/ivas_stereo_td_analysis.c index be64a0175..73b03eb18 100644 --- a/lib_enc/ivas_stereo_td_analysis.c +++ b/lib_enc/ivas_stereo_td_analysis.c @@ -579,6 +579,12 @@ int16_t stereo_tdm_ener_analysis( hStereoTD->tdm_last_diff_lt_corr_SM = 0; hStereoTD->tdm_last_ener_lt_R_SM = 0; hStereoTD->tdm_last_ener_lt_L_SM = 0; +#ifdef IVAS_FLOAT_FIXED + hStereoTD->tdm_lt_corr_RM_SM_fx = 167772 /*0.01f Q24*/; + hStereoTD->tdm_lt_corr_LM_SM_fx = 167772 /*0.01f Q24*/; + hStereoTD->tdm_last_ener_lt_R_SM_fx = 0; + hStereoTD->tdm_last_ener_lt_L_SM_fx = 0; +#endif hStereoTD->tdm_noop_mov_flag = 0; hStereoTD->tdm_noop_cnt = 0; @@ -595,7 +601,8 @@ int16_t stereo_tdm_ener_analysis( hStereoTD->tdm_LT_es_em_SM_fx = floatToFixed_32( hStereoTD->tdm_LT_es_em_SM, Q21 ); sts[0]->hNoiseEst->Etot_last_fx = float_to_fix16( sts[0]->hNoiseEst->Etot_last, Q8 ); sts[1]->hNoiseEst->Etot_last_fx = float_to_fix16( sts[1]->hNoiseEst->Etot_last, Q8 ); - + sts[0]->old_corr_fx = float_to_fix16( sts[0]->old_corr, Q15 ); + sts[1]->old_corr_fx = float_to_fix16( sts[1]->old_corr, Q15 ); hStereoTD->q_tdm_last_diff_lt_corr_SM = Q31; hStereoTD->tdm_last_diff_lt_corr_SM_fx = floatToFixed_32( hStereoTD->tdm_last_diff_lt_corr_SM, hStereoTD->q_tdm_last_diff_lt_corr_SM ); #endif -- GitLab